@vlian/framework 1.2.25 → 1.2.38

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 (319) hide show
  1. package/dist/analytics.umd.js +208 -2395
  2. package/dist/analytics.umd.js.map +1 -1
  3. package/dist/core/Test.cjs +2 -2
  4. package/dist/core/Test.cjs.map +1 -1
  5. package/dist/core/Test.js +1 -1
  6. package/dist/core/Test.js.map +1 -1
  7. package/dist/core/config/ConfigLoader.cjs +7 -7
  8. package/dist/core/config/ConfigLoader.cjs.map +1 -1
  9. package/dist/core/config/ConfigLoader.js +1 -1
  10. package/dist/core/config/ConfigLoader.js.map +1 -1
  11. package/dist/core/error/ErrorBoundary.cjs +6 -6
  12. package/dist/core/error/ErrorBoundary.cjs.map +1 -1
  13. package/dist/core/error/ErrorBoundary.d.ts +1 -1
  14. package/dist/core/error/ErrorBoundary.js +2 -2
  15. package/dist/core/error/ErrorBoundary.js.map +1 -1
  16. package/dist/core/error/ErrorHandler.cjs +19 -19
  17. package/dist/core/error/ErrorHandler.cjs.map +1 -1
  18. package/dist/core/error/ErrorHandler.d.ts +2 -2
  19. package/dist/core/error/ErrorHandler.js +2 -2
  20. package/dist/core/error/ErrorHandler.js.map +1 -1
  21. package/dist/core/event/AppEventBus.cjs +5 -5
  22. package/dist/core/event/AppEventBus.cjs.map +1 -1
  23. package/dist/core/event/AppEventBus.js +1 -1
  24. package/dist/core/event/AppEventBus.js.map +1 -1
  25. package/dist/core/initialization/InitializationErrorThrower.cjs.map +1 -1
  26. package/dist/core/initialization/InitializationErrorThrower.js.map +1 -1
  27. package/dist/core/initialization/initialization.cjs +3 -3
  28. package/dist/core/initialization/initialization.cjs.map +1 -1
  29. package/dist/core/initialization/initialization.d.ts +1 -1
  30. package/dist/core/initialization/initialization.js +1 -1
  31. package/dist/core/initialization/initialization.js.map +1 -1
  32. package/dist/core/initialization/initializationErrorState.cjs +2 -2
  33. package/dist/core/initialization/initializationErrorState.cjs.map +1 -1
  34. package/dist/core/initialization/initializationErrorState.d.ts +1 -1
  35. package/dist/core/initialization/initializationErrorState.js +1 -1
  36. package/dist/core/initialization/initializationErrorState.js.map +1 -1
  37. package/dist/core/kernel/defaultAdapters.cjs +14 -13
  38. package/dist/core/kernel/defaultAdapters.cjs.map +1 -1
  39. package/dist/core/kernel/defaultAdapters.js +2 -1
  40. package/dist/core/kernel/defaultAdapters.js.map +1 -1
  41. package/dist/core/kernel/types.d.ts +1 -1
  42. package/dist/core/kernel/types.js.map +1 -1
  43. package/dist/core/router/RouterManager.cjs +9 -9
  44. package/dist/core/router/RouterManager.cjs.map +1 -1
  45. package/dist/core/router/RouterManager.js +1 -1
  46. package/dist/core/router/RouterManager.js.map +1 -1
  47. package/dist/core/router/adapter/AdapterManager.cjs +10 -10
  48. package/dist/core/router/adapter/AdapterManager.cjs.map +1 -1
  49. package/dist/core/router/adapter/AdapterManager.js +1 -1
  50. package/dist/core/router/adapter/AdapterManager.js.map +1 -1
  51. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +4 -4
  52. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +1 -1
  53. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +1 -1
  54. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +1 -1
  55. package/dist/core/router/dynamic/DynamicRouteManager.cjs +8 -8
  56. package/dist/core/router/dynamic/DynamicRouteManager.cjs.map +1 -1
  57. package/dist/core/router/dynamic/DynamicRouteManager.js +1 -1
  58. package/dist/core/router/dynamic/DynamicRouteManager.js.map +1 -1
  59. package/dist/core/router/errors/RouterError.cjs +4 -4
  60. package/dist/core/router/errors/RouterError.cjs.map +1 -1
  61. package/dist/core/router/errors/RouterError.d.ts +1 -1
  62. package/dist/core/router/errors/RouterError.js +1 -1
  63. package/dist/core/router/errors/RouterError.js.map +1 -1
  64. package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +8 -8
  65. package/dist/core/router/lifecycle/RouterLifecycleManager.cjs.map +1 -1
  66. package/dist/core/router/lifecycle/RouterLifecycleManager.js +1 -1
  67. package/dist/core/router/lifecycle/RouterLifecycleManager.js.map +1 -1
  68. package/dist/core/router/middleware/RouterMiddlewareManager.cjs +11 -11
  69. package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +1 -1
  70. package/dist/core/router/middleware/RouterMiddlewareManager.js +1 -1
  71. package/dist/core/router/middleware/RouterMiddlewareManager.js.map +1 -1
  72. package/dist/core/router/middleware/auth.cjs +4 -4
  73. package/dist/core/router/middleware/auth.cjs.map +1 -1
  74. package/dist/core/router/middleware/auth.js +1 -1
  75. package/dist/core/router/middleware/auth.js.map +1 -1
  76. package/dist/core/router/monitoring/RouterMonitoring.cjs +2 -2
  77. package/dist/core/router/monitoring/RouterMonitoring.cjs.map +1 -1
  78. package/dist/core/router/monitoring/RouterMonitoring.js +2 -2
  79. package/dist/core/router/monitoring/RouterMonitoring.js.map +1 -1
  80. package/dist/core/router/navigation/RouterNavigation.cjs +7 -7
  81. package/dist/core/router/navigation/RouterNavigation.cjs.map +1 -1
  82. package/dist/core/router/navigation/RouterNavigation.js +1 -1
  83. package/dist/core/router/navigation/RouterNavigation.js.map +1 -1
  84. package/dist/core/router/performance/RouteCache.cjs +7 -7
  85. package/dist/core/router/performance/RouteCache.cjs.map +1 -1
  86. package/dist/core/router/performance/RouteCache.js +1 -1
  87. package/dist/core/router/performance/RouteCache.js.map +1 -1
  88. package/dist/core/router/performance/RoutePreloader.cjs +6 -6
  89. package/dist/core/router/performance/RoutePreloader.cjs.map +1 -1
  90. package/dist/core/router/performance/RoutePreloader.js +1 -1
  91. package/dist/core/router/performance/RoutePreloader.js.map +1 -1
  92. package/dist/core/router/plugin/RouterPluginManager.cjs +8 -8
  93. package/dist/core/router/plugin/RouterPluginManager.cjs.map +1 -1
  94. package/dist/core/router/plugin/RouterPluginManager.js +1 -1
  95. package/dist/core/router/plugin/RouterPluginManager.js.map +1 -1
  96. package/dist/core/router/utils/adapters/react-router/transform.cjs +6 -2
  97. package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
  98. package/dist/core/router/utils/adapters/react-router/transform.js +5 -1
  99. package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
  100. package/dist/core/router/utils/transform.cjs +13 -12
  101. package/dist/core/router/utils/transform.cjs.map +1 -1
  102. package/dist/core/router/utils/transform.js +2 -1
  103. package/dist/core/router/utils/transform.js.map +1 -1
  104. package/dist/core/router/validation/RouterConfigValidator.cjs +2 -2
  105. package/dist/core/router/validation/RouterConfigValidator.cjs.map +1 -1
  106. package/dist/core/router/validation/RouterConfigValidator.js +1 -1
  107. package/dist/core/router/validation/RouterConfigValidator.js.map +1 -1
  108. package/dist/core/router/version/RouteVersionManager.cjs +6 -6
  109. package/dist/core/router/version/RouteVersionManager.cjs.map +1 -1
  110. package/dist/core/router/version/RouteVersionManager.js +1 -1
  111. package/dist/core/router/version/RouteVersionManager.js.map +1 -1
  112. package/dist/core/splash/SplashScreen.cjs +4 -4
  113. package/dist/core/splash/SplashScreen.cjs.map +1 -1
  114. package/dist/core/splash/SplashScreen.js +1 -1
  115. package/dist/core/splash/SplashScreen.js.map +1 -1
  116. package/dist/core/startup/initializeServices.cjs +15 -15
  117. package/dist/core/startup/initializeServices.cjs.map +1 -1
  118. package/dist/core/startup/initializeServices.d.ts +2 -2
  119. package/dist/core/startup/initializeServices.js +3 -3
  120. package/dist/core/startup/initializeServices.js.map +1 -1
  121. package/dist/core/startup/performanceTracker.cjs.map +1 -1
  122. package/dist/core/startup/performanceTracker.d.ts +1 -1
  123. package/dist/core/startup/performanceTracker.js.map +1 -1
  124. package/dist/core/startup/renderApp.cjs +3 -3
  125. package/dist/core/startup/renderApp.cjs.map +1 -1
  126. package/dist/core/startup/renderApp.d.ts +1 -1
  127. package/dist/core/startup/renderApp.js +2 -2
  128. package/dist/core/startup/renderApp.js.map +1 -1
  129. package/dist/core/startup/startApp.cjs +24 -24
  130. package/dist/core/startup/startApp.cjs.map +1 -1
  131. package/dist/core/startup/startApp.js +5 -5
  132. package/dist/core/startup/startApp.js.map +1 -1
  133. package/dist/core/types.d.ts +3 -3
  134. package/dist/core/types.js.map +1 -1
  135. package/dist/index.cjs +15 -2
  136. package/dist/index.cjs.map +1 -1
  137. package/dist/index.d.ts +6 -4
  138. package/dist/index.js +5 -4
  139. package/dist/index.js.map +1 -1
  140. package/dist/index.umd.js +2150 -23125
  141. package/dist/index.umd.js.map +1 -1
  142. package/dist/kernel/constants.cjs +67 -0
  143. package/dist/kernel/constants.cjs.map +1 -0
  144. package/dist/kernel/constants.d.ts +5 -0
  145. package/dist/kernel/constants.js +43 -0
  146. package/dist/kernel/constants.js.map +1 -0
  147. package/dist/kernel/index.cjs +40 -0
  148. package/dist/kernel/index.cjs.map +1 -0
  149. package/dist/kernel/index.d.ts +3 -0
  150. package/dist/kernel/index.js +4 -0
  151. package/dist/kernel/index.js.map +1 -0
  152. package/dist/kernel/kernel.cjs +296 -0
  153. package/dist/kernel/kernel.cjs.map +1 -0
  154. package/dist/kernel/kernel.d.ts +40 -0
  155. package/dist/kernel/kernel.js +272 -0
  156. package/dist/kernel/kernel.js.map +1 -0
  157. package/dist/kernel/manager/cacheManager.cjs +46 -0
  158. package/dist/kernel/manager/cacheManager.cjs.map +1 -0
  159. package/dist/kernel/manager/cacheManager.d.ts +6 -0
  160. package/dist/kernel/manager/cacheManager.js +36 -0
  161. package/dist/kernel/manager/cacheManager.js.map +1 -0
  162. package/dist/kernel/manager/i18nManager.cjs +68 -0
  163. package/dist/kernel/manager/i18nManager.cjs.map +1 -0
  164. package/dist/kernel/manager/i18nManager.d.ts +8 -0
  165. package/dist/kernel/manager/i18nManager.js +58 -0
  166. package/dist/kernel/manager/i18nManager.js.map +1 -0
  167. package/dist/kernel/manager/index.cjs +30 -0
  168. package/dist/kernel/manager/index.cjs.map +1 -0
  169. package/dist/kernel/manager/index.d.ts +4 -0
  170. package/dist/kernel/manager/index.js +6 -0
  171. package/dist/kernel/manager/index.js.map +1 -0
  172. package/dist/kernel/manager/loggerManager.cjs +70 -0
  173. package/dist/kernel/manager/loggerManager.cjs.map +1 -0
  174. package/dist/kernel/manager/loggerManager.d.ts +14 -0
  175. package/dist/kernel/manager/loggerManager.js +60 -0
  176. package/dist/kernel/manager/loggerManager.js.map +1 -0
  177. package/dist/kernel/manager/persistence.cjs +93 -0
  178. package/dist/kernel/manager/persistence.cjs.map +1 -0
  179. package/dist/kernel/manager/persistence.d.ts +3 -0
  180. package/dist/kernel/manager/persistence.js +75 -0
  181. package/dist/kernel/manager/persistence.js.map +1 -0
  182. package/dist/kernel/manager/themeManager.cjs +85 -0
  183. package/dist/kernel/manager/themeManager.cjs.map +1 -0
  184. package/dist/kernel/manager/themeManager.d.ts +9 -0
  185. package/dist/kernel/manager/themeManager.js +75 -0
  186. package/dist/kernel/manager/themeManager.js.map +1 -0
  187. package/dist/kernel/types.cjs +6 -0
  188. package/dist/kernel/types.cjs.map +1 -0
  189. package/dist/kernel/types.d.ts +72 -0
  190. package/dist/kernel/types.js +3 -0
  191. package/dist/kernel/types.js.map +1 -0
  192. package/dist/library/storage/encryption.cjs +12 -13
  193. package/dist/library/storage/encryption.cjs.map +1 -1
  194. package/dist/library/storage/encryption.js +1 -2
  195. package/dist/library/storage/encryption.js.map +1 -1
  196. package/dist/request/adapter.d.ts +1 -0
  197. package/dist/request/core.d.ts +1 -0
  198. package/dist/request/index.d.ts +1 -42
  199. package/dist/request/plugin/csrfPlugin.d.ts +2 -2
  200. package/dist/request/plugin/queue.d.ts +2 -2
  201. package/dist/request/plugin.d.ts +1 -0
  202. package/dist/request/runtime.d.ts +1 -0
  203. package/dist/request/types.d.ts +1 -394
  204. package/dist/request/utils.d.ts +1 -0
  205. package/dist/state.umd.js +1 -1
  206. package/dist/utils/csrf.cjs +13 -152
  207. package/dist/utils/csrf.cjs.map +1 -1
  208. package/dist/utils/csrf.d.ts +1 -72
  209. package/dist/utils/csrf.js +1 -142
  210. package/dist/utils/csrf.js.map +1 -1
  211. package/dist/utils/errors/ErrorCodes.cjs +6 -76
  212. package/dist/utils/errors/ErrorCodes.cjs.map +1 -1
  213. package/dist/utils/errors/ErrorCodes.d.ts +1 -45
  214. package/dist/utils/errors/ErrorCodes.js +1 -84
  215. package/dist/utils/errors/ErrorCodes.js.map +1 -1
  216. package/dist/utils/errors.cjs +53 -326
  217. package/dist/utils/errors.cjs.map +1 -1
  218. package/dist/utils/errors.d.ts +19 -172
  219. package/dist/utils/errors.js +16 -352
  220. package/dist/utils/errors.js.map +1 -1
  221. package/dist/utils/logger.cjs +5 -374
  222. package/dist/utils/logger.cjs.map +1 -1
  223. package/dist/utils/logger.d.ts +2 -189
  224. package/dist/utils/logger.js +1 -379
  225. package/dist/utils/logger.js.map +1 -1
  226. package/dist/utils/logger.types.cjs +3 -12
  227. package/dist/utils/logger.types.cjs.map +1 -1
  228. package/dist/utils/logger.types.d.ts +2 -57
  229. package/dist/utils/logger.types.js +1 -10
  230. package/dist/utils/logger.types.js.map +1 -1
  231. package/dist/utils/monitoring.cjs +11 -302
  232. package/dist/utils/monitoring.cjs.map +1 -1
  233. package/dist/utils/monitoring.d.ts +1 -163
  234. package/dist/utils/monitoring.js +1 -294
  235. package/dist/utils/monitoring.js.map +1 -1
  236. package/dist/utils/performance.cjs +5 -352
  237. package/dist/utils/performance.cjs.map +1 -1
  238. package/dist/utils/performance.d.ts +2 -246
  239. package/dist/utils/performance.js +1 -354
  240. package/dist/utils/performance.js.map +1 -1
  241. package/dist/utils/resourceLoader.cjs +5 -303
  242. package/dist/utils/resourceLoader.cjs.map +1 -1
  243. package/dist/utils/resourceLoader.d.ts +2 -130
  244. package/dist/utils/resourceLoader.js +1 -305
  245. package/dist/utils/resourceLoader.js.map +1 -1
  246. package/dist/utils/runtimeSecurity.cjs +2 -140
  247. package/dist/utils/runtimeSecurity.cjs.map +1 -1
  248. package/dist/utils/runtimeSecurity.d.ts +2 -104
  249. package/dist/utils/runtimeSecurity.js +1 -141
  250. package/dist/utils/runtimeSecurity.js.map +1 -1
  251. package/dist/utils/security.cjs +3 -314
  252. package/dist/utils/security.cjs.map +1 -1
  253. package/dist/utils/security.d.ts +2 -80
  254. package/dist/utils/security.js +1 -311
  255. package/dist/utils/security.js.map +1 -1
  256. package/dist/utils/traceId.cjs +10 -111
  257. package/dist/utils/traceId.cjs.map +1 -1
  258. package/dist/utils/traceId.d.ts +1 -63
  259. package/dist/utils/traceId.js +1 -116
  260. package/dist/utils/traceId.js.map +1 -1
  261. package/dist/utils/validation.cjs +3 -173
  262. package/dist/utils/validation.cjs.map +1 -1
  263. package/dist/utils/validation.d.ts +2 -110
  264. package/dist/utils/validation.js +1 -175
  265. package/dist/utils/validation.js.map +1 -1
  266. package/package.json +15 -24
  267. package/dist/lazy/index.cjs +0 -104
  268. package/dist/lazy/index.cjs.map +0 -1
  269. package/dist/lazy/index.d.ts +0 -19
  270. package/dist/lazy/index.js +0 -24
  271. package/dist/lazy/index.js.map +0 -1
  272. package/dist/request/adapter/RequestAdapter.cjs +0 -78
  273. package/dist/request/adapter/RequestAdapter.cjs.map +0 -1
  274. package/dist/request/adapter/axiosAdapter.cjs +0 -164
  275. package/dist/request/adapter/axiosAdapter.cjs.map +0 -1
  276. package/dist/request/adapter/fetchAdapter.cjs +0 -134
  277. package/dist/request/adapter/fetchAdapter.cjs.map +0 -1
  278. package/dist/request/adapter/index.cjs +0 -80
  279. package/dist/request/adapter/index.cjs.map +0 -1
  280. package/dist/request/adapter/kyAdapter.cjs +0 -191
  281. package/dist/request/adapter/kyAdapter.cjs.map +0 -1
  282. package/dist/request/adapter/undiciAdapter.cjs +0 -213
  283. package/dist/request/adapter/undiciAdapter.cjs.map +0 -1
  284. package/dist/request/core/RequestClient.cjs +0 -558
  285. package/dist/request/core/RequestClient.cjs.map +0 -1
  286. package/dist/request/core/index.cjs +0 -15
  287. package/dist/request/core/index.cjs.map +0 -1
  288. package/dist/request/index.cjs +0 -149
  289. package/dist/request/index.cjs.map +0 -1
  290. package/dist/request/plugin/RequestPlugin.cjs +0 -218
  291. package/dist/request/plugin/RequestPlugin.cjs.map +0 -1
  292. package/dist/request/plugin/cache.cjs +0 -269
  293. package/dist/request/plugin/cache.cjs.map +0 -1
  294. package/dist/request/plugin/csrfPlugin.cjs +0 -40
  295. package/dist/request/plugin/csrfPlugin.cjs.map +0 -1
  296. package/dist/request/plugin/index.cjs +0 -53
  297. package/dist/request/plugin/index.cjs.map +0 -1
  298. package/dist/request/plugin/monitoring.cjs +0 -216
  299. package/dist/request/plugin/monitoring.cjs.map +0 -1
  300. package/dist/request/plugin/queue.cjs +0 -140
  301. package/dist/request/plugin/queue.cjs.map +0 -1
  302. package/dist/request/plugin/retry.cjs +0 -98
  303. package/dist/request/plugin/retry.cjs.map +0 -1
  304. package/dist/request/plugin/validation.cjs +0 -121
  305. package/dist/request/plugin/validation.cjs.map +0 -1
  306. package/dist/request/runtime/RequestContext.cjs +0 -77
  307. package/dist/request/runtime/RequestContext.cjs.map +0 -1
  308. package/dist/request/runtime/index.cjs +0 -32
  309. package/dist/request/runtime/index.cjs.map +0 -1
  310. package/dist/request/types.cjs +0 -112
  311. package/dist/request/types.cjs.map +0 -1
  312. package/dist/request/utils/RequestQueueManager.cjs +0 -168
  313. package/dist/request/utils/RequestQueueManager.cjs.map +0 -1
  314. package/dist/request/utils/dependencyCheck.cjs +0 -237
  315. package/dist/request/utils/dependencyCheck.cjs.map +0 -1
  316. package/dist/request/utils/index.cjs +0 -30
  317. package/dist/request/utils/index.cjs.map +0 -1
  318. package/dist/request.umd.js +0 -5392
  319. package/dist/request.umd.js.map +0 -1
@@ -1,381 +1,3 @@
1
- function _define_property(obj, key, value) {
2
- if (key in obj) {
3
- Object.defineProperty(obj, key, {
4
- value: value,
5
- enumerable: true,
6
- configurable: true,
7
- writable: true
8
- });
9
- } else {
10
- obj[key] = value;
11
- }
12
- return obj;
13
- }
14
- import { LogLevel } from "./logger.types";
15
- import { SecurityUtils } from "./security";
16
- import { getCurrentTraceId } from "./traceId";
17
- /**
18
- * 检测运行环境是否为浏览器
19
- */ const isBrowser = ()=>{
20
- return typeof window !== 'undefined' && typeof window.document !== 'undefined';
21
- };
22
- /**
23
- * ANSI 颜色代码(用于 Node.js 环境)
24
- */ const ANSI_COLORS = {
25
- reset: '\x1b[0m',
26
- bright: '\x1b[1m',
27
- dim: '\x1b[2m',
28
- red: '\x1b[31m',
29
- green: '\x1b[32m',
30
- yellow: '\x1b[33m',
31
- blue: '\x1b[34m',
32
- magenta: '\x1b[35m',
33
- cyan: '\x1b[36m',
34
- white: '\x1b[37m',
35
- bgRed: '\x1b[41m',
36
- bgGreen: '\x1b[42m',
37
- bgYellow: '\x1b[43m',
38
- bgBlue: '\x1b[44m',
39
- bgMagenta: '\x1b[45m',
40
- bgCyan: '\x1b[46m',
41
- bgWhite: '\x1b[47m'
42
- };
43
- /**
44
- * 浏览器控制台样式(用于浏览器环境)
45
- */ const BROWSER_STYLES = {
46
- debug: 'color: #888; font-weight: normal;',
47
- info: 'color: #2196F3; font-weight: normal;',
48
- warn: 'color: #FF9800; font-weight: bold;',
49
- error: 'color: #F44336; font-weight: bold;'
50
- };
51
- /**
52
- * 日志级别对应的颜色配置
53
- */ const LEVEL_COLORS = {
54
- [LogLevel.DEBUG]: {
55
- node: ANSI_COLORS.dim + ANSI_COLORS.white,
56
- browser: BROWSER_STYLES.debug
57
- },
58
- [LogLevel.INFO]: {
59
- node: ANSI_COLORS.cyan,
60
- browser: BROWSER_STYLES.info
61
- },
62
- [LogLevel.WARN]: {
63
- node: ANSI_COLORS.yellow,
64
- browser: BROWSER_STYLES.warn
65
- },
66
- [LogLevel.ERROR]: {
67
- node: ANSI_COLORS.red + ANSI_COLORS.bright,
68
- browser: BROWSER_STYLES.error
69
- },
70
- [LogLevel.NONE]: {
71
- node: '',
72
- browser: ''
73
- }
74
- };
75
- /**
76
- * 日志级别标签
77
- */ const LEVEL_LABELS = {
78
- [LogLevel.DEBUG]: 'DEBUG',
79
- [LogLevel.INFO]: 'INFO',
80
- [LogLevel.WARN]: 'WARN',
81
- [LogLevel.ERROR]: 'ERROR',
82
- [LogLevel.NONE]: ''
83
- };
84
- /**
85
- * 日志格式类型
86
- */ export var LogFormat = /*#__PURE__*/ function(LogFormat) {
87
- /**
88
- * 文本格式(默认)
89
- */ LogFormat["TEXT"] = "text";
90
- /**
91
- * JSON 格式(用于日志聚合)
92
- */ LogFormat["JSON"] = "json";
93
- /**
94
- * 结构化格式(用于分析)
95
- */ LogFormat["STRUCTURED"] = "structured";
96
- return LogFormat;
97
- }({});
98
- /**
99
- * Logger 类
100
- */ let Logger = class Logger {
101
- /**
102
- * 设置日志级别
103
- */ setLevel(level) {
104
- this.level = level;
105
- }
106
- /**
107
- * 获取当前日志级别
108
- */ getLevel() {
109
- return this.level;
110
- }
111
- /**
112
- * 格式化时间戳
113
- */ formatTimestamp() {
114
- const now = new Date();
115
- const year = now.getFullYear();
116
- const month = String(now.getMonth() + 1).padStart(2, '0');
117
- const day = String(now.getDate()).padStart(2, '0');
118
- const hours = String(now.getHours()).padStart(2, '0');
119
- const minutes = String(now.getMinutes()).padStart(2, '0');
120
- const seconds = String(now.getSeconds()).padStart(2, '0');
121
- const milliseconds = String(now.getMilliseconds()).padStart(3, '0');
122
- return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
123
- }
124
- /**
125
- * 构建日志前缀
126
- */ buildPrefix(logLevel) {
127
- const parts = [];
128
- if (this.showTimestamp) {
129
- parts.push(`[${this.formatTimestamp()}]`);
130
- }
131
- if (this.showLevel) {
132
- parts.push(`[${LEVEL_LABELS[logLevel]}]`);
133
- }
134
- // 添加追踪 ID(如果存在)
135
- const traceId = getCurrentTraceId();
136
- if (traceId) {
137
- parts.push(`[Trace:${traceId.substring(0, 8)}]`);
138
- }
139
- if (this.prefix) {
140
- parts.push(`[${this.prefix}]`);
141
- }
142
- return parts.join(' ');
143
- }
144
- /**
145
- * 输出日志(Node.js 环境)
146
- */ logNode(level, ...args) {
147
- if (level < this.level) {
148
- return;
149
- }
150
- const prefix = this.buildPrefix(level);
151
- const colorConfig = LEVEL_COLORS[level];
152
- const reset = this.enableColors ? ANSI_COLORS.reset : '';
153
- if (this.enableColors && colorConfig.node) {
154
- console.log(`${colorConfig.node}${prefix}${reset}`, ...args);
155
- } else {
156
- console.log(prefix, ...args);
157
- }
158
- }
159
- /**
160
- * 输出日志(浏览器环境)
161
- */ logBrowser(level, ...args) {
162
- if (level < this.level) {
163
- return;
164
- }
165
- const prefix = this.buildPrefix(level);
166
- const colorConfig = LEVEL_COLORS[level];
167
- if (this.enableColors && colorConfig.browser) {
168
- console.log(`%c${prefix}`, colorConfig.browser, ...args);
169
- } else {
170
- console.log(prefix, ...args);
171
- }
172
- }
173
- /**
174
- * 脱敏处理
175
- */ sanitizeValue(value) {
176
- if (!this.enableSanitization) {
177
- return value;
178
- }
179
- if (typeof value === 'string') {
180
- // 检查是否包含敏感内容
181
- if (SecurityUtils.containsDangerousContent(value)) {
182
- return SecurityUtils.sanitizeText(value);
183
- }
184
- return value;
185
- }
186
- if (value && typeof value === 'object') {
187
- if (Array.isArray(value)) {
188
- return value.map((item)=>this.sanitizeValue(item));
189
- }
190
- const sanitized = {};
191
- for (const [key, val] of Object.entries(value)){
192
- // 检查是否为敏感字段
193
- if (SecurityUtils.isSensitiveField(key)) {
194
- sanitized[key] = '***';
195
- } else {
196
- sanitized[key] = this.sanitizeValue(val);
197
- }
198
- }
199
- return sanitized;
200
- }
201
- return value;
202
- }
203
- /**
204
- * 处理日志参数(脱敏、过滤等)
205
- */ processLogArgs(...args) {
206
- // 生产环境自动禁用 DEBUG 级别
207
- if (this.isProduction && this.level === LogLevel.DEBUG) {
208
- return [];
209
- }
210
- return args.map((arg)=>this.sanitizeValue(arg));
211
- }
212
- /**
213
- * 设置日志格式
214
- */ setFormat(format) {
215
- this.format = format;
216
- }
217
- /**
218
- * 设置日志上下文
219
- */ setContext(context) {
220
- this.context = {
221
- ...this.context,
222
- ...context
223
- };
224
- }
225
- /**
226
- * 更新日志上下文
227
- */ updateContext(context) {
228
- this.context = {
229
- ...this.context,
230
- ...context
231
- };
232
- }
233
- /**
234
- * 获取日志上下文
235
- */ getContext() {
236
- return {
237
- ...this.context
238
- };
239
- }
240
- /**
241
- * 清除日志上下文
242
- */ clearContext() {
243
- this.context = {};
244
- }
245
- /**
246
- * 注册日志处理器(用于日志聚合)
247
- */ addLogHandler(handler) {
248
- this.logHandlers.push(handler);
249
- return ()=>{
250
- const index = this.logHandlers.indexOf(handler);
251
- if (index > -1) {
252
- this.logHandlers.splice(index, 1);
253
- }
254
- };
255
- }
256
- /**
257
- * 创建结构化日志条目
258
- */ createStructuredEntry(level, message, data) {
259
- const traceId = getCurrentTraceId();
260
- const entry = {
261
- timestamp: new Date().toISOString(),
262
- level,
263
- message,
264
- context: {
265
- ...this.context,
266
- traceId: traceId || this.context.traceId
267
- },
268
- source: this.prefix || 'framework'
269
- };
270
- if (data !== undefined) {
271
- entry.data = this.sanitizeValue(data);
272
- }
273
- // 如果是错误,提取堆栈信息
274
- if (data instanceof Error) {
275
- entry.stack = data.stack;
276
- entry.message = data.message || message;
277
- }
278
- return entry;
279
- }
280
- /**
281
- * 输出结构化日志
282
- */ outputStructured(entry) {
283
- // 调用日志处理器
284
- this.logHandlers.forEach((handler)=>{
285
- try {
286
- handler(entry);
287
- } catch (error) {
288
- // 忽略处理器错误,避免循环
289
- }
290
- });
291
- // 根据格式输出
292
- if (this.format === "json") {
293
- console.log(JSON.stringify(entry));
294
- } else if (this.format === "structured") {
295
- console.log(entry);
296
- } else {
297
- // TEXT 格式使用原有输出方式
298
- const args = entry.data !== undefined ? [
299
- entry.data
300
- ] : [];
301
- if (isBrowser()) {
302
- this.logBrowser(entry.level, entry.message, ...args);
303
- } else {
304
- this.logNode(entry.level, entry.message, ...args);
305
- }
306
- }
307
- }
308
- /**
309
- * 通用日志输出方法
310
- */ log(level, ...args) {
311
- if (level < this.level) {
312
- return;
313
- }
314
- const processedArgs = this.processLogArgs(...args);
315
- // 如果处理后没有参数(被过滤),则不输出
316
- if (processedArgs.length === 0) {
317
- return;
318
- }
319
- // 提取消息和数据
320
- const message = typeof processedArgs[0] === 'string' ? processedArgs[0] : 'Log message';
321
- const data = processedArgs.length > 1 ? processedArgs.slice(1) : typeof processedArgs[0] === 'string' ? undefined : processedArgs[0];
322
- // 创建结构化日志条目
323
- const entry = this.createStructuredEntry(level, message, data);
324
- // 输出日志
325
- this.outputStructured(entry);
326
- }
327
- /**
328
- * 输出 DEBUG 级别日志
329
- */ debug(...args) {
330
- this.log(LogLevel.DEBUG, ...args);
331
- }
332
- /**
333
- * 输出 INFO 级别日志
334
- */ info(...args) {
335
- this.log(LogLevel.INFO, ...args);
336
- }
337
- /**
338
- * 输出 WARN 级别日志
339
- */ warn(...args) {
340
- this.log(LogLevel.WARN, ...args);
341
- }
342
- /**
343
- * 输出 ERROR 级别日志
344
- */ error(...args) {
345
- this.log(LogLevel.ERROR, ...args);
346
- }
347
- constructor(options = {}){
348
- _define_property(this, "level", void 0);
349
- _define_property(this, "enableColors", void 0);
350
- _define_property(this, "showTimestamp", void 0);
351
- _define_property(this, "showLevel", void 0);
352
- _define_property(this, "prefix", void 0);
353
- _define_property(this, "enableSanitization", void 0);
354
- _define_property(this, "isProduction", void 0);
355
- _define_property(this, "format", void 0);
356
- _define_property(this, "context", {});
357
- _define_property(this, "logHandlers", []);
358
- this.level = options.level ?? LogLevel.INFO;
359
- this.enableColors = options.enableColors ?? true;
360
- this.showTimestamp = options.showTimestamp ?? true;
361
- this.showLevel = options.showLevel ?? true;
362
- this.prefix = options.prefix ?? '';
363
- this.enableSanitization = options.enableSanitization ?? true;
364
- this.isProduction = typeof process !== 'undefined' && process.env.NODE_ENV === 'production';
365
- this.format = options.format ?? "text";
366
- this.context = options.context ?? {};
367
- }
368
- };
369
- /**
370
- * 创建 Logger 实例
371
- */ export const createLogger = (options)=>{
372
- return new Logger(options);
373
- };
374
- /**
375
- * 默认 Logger 实例
376
- */ export const logger = createLogger();
377
- /**
378
- * 导出 Logger 类
379
- */ export { Logger };
1
+ export { logger, createLogger, Logger, LogFormat } from "@vlian/logger";
380
2
 
381
3
  //# sourceMappingURL=logger.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/logger.ts"],"sourcesContent":["import type { LoggerOptions } from './logger.types';\nimport { LogLevel } from './logger.types';\nimport { SecurityUtils } from './security';\nimport { getCurrentTraceId } from './traceId';\n\n/**\n * 检测运行环境是否为浏览器\n */\nconst isBrowser = (): boolean => {\n return typeof window !== 'undefined' && typeof window.document !== 'undefined';\n};\n\n/**\n * ANSI 颜色代码(用于 Node.js 环境)\n */\nconst ANSI_COLORS = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n bgRed: '\\x1b[41m',\n bgGreen: '\\x1b[42m',\n bgYellow: '\\x1b[43m',\n bgBlue: '\\x1b[44m',\n bgMagenta: '\\x1b[45m',\n bgCyan: '\\x1b[46m',\n bgWhite: '\\x1b[47m',\n} as const;\n\n/**\n * 浏览器控制台样式(用于浏览器环境)\n */\nconst BROWSER_STYLES = {\n debug: 'color: #888; font-weight: normal;',\n info: 'color: #2196F3; font-weight: normal;',\n warn: 'color: #FF9800; font-weight: bold;',\n error: 'color: #F44336; font-weight: bold;',\n} as const;\n\n/**\n * 日志级别对应的颜色配置\n */\nconst LEVEL_COLORS: Record<LogLevel, { node: string; browser: string }> = {\n [LogLevel.DEBUG]: {\n node: ANSI_COLORS.dim + ANSI_COLORS.white,\n browser: BROWSER_STYLES.debug,\n },\n [LogLevel.INFO]: {\n node: ANSI_COLORS.cyan,\n browser: BROWSER_STYLES.info,\n },\n [LogLevel.WARN]: {\n node: ANSI_COLORS.yellow,\n browser: BROWSER_STYLES.warn,\n },\n [LogLevel.ERROR]: {\n node: ANSI_COLORS.red + ANSI_COLORS.bright,\n browser: BROWSER_STYLES.error,\n },\n [LogLevel.NONE]: {\n node: '',\n browser: '',\n },\n};\n\n/**\n * 日志级别标签\n */\nconst LEVEL_LABELS: Record<LogLevel, string> = {\n [LogLevel.DEBUG]: 'DEBUG',\n [LogLevel.INFO]: 'INFO',\n [LogLevel.WARN]: 'WARN',\n [LogLevel.ERROR]: 'ERROR',\n [LogLevel.NONE]: '',\n};\n\n/**\n * 日志格式类型\n */\nexport enum LogFormat {\n /**\n * 文本格式(默认)\n */\n TEXT = 'text',\n /**\n * JSON 格式(用于日志聚合)\n */\n JSON = 'json',\n /**\n * 结构化格式(用于分析)\n */\n STRUCTURED = 'structured',\n}\n\n/**\n * 日志上下文\n */\nexport interface LogContext {\n /**\n * 追踪 ID\n */\n traceId?: string;\n /**\n * 用户 ID\n */\n userId?: string;\n /**\n * 会话 ID\n */\n sessionId?: string;\n /**\n * 请求 ID\n */\n requestId?: string;\n /**\n * 自定义上下文\n */\n [key: string]: unknown;\n}\n\n/**\n * 结构化日志条目\n */\nexport interface StructuredLogEntry {\n /**\n * 时间戳\n */\n timestamp: string;\n /**\n * 日志级别\n */\n level: LogLevel;\n /**\n * 日志消息\n */\n message: string;\n /**\n * 日志数据\n */\n data?: unknown;\n /**\n * 日志上下文\n */\n context?: LogContext;\n /**\n * 日志来源\n */\n source?: string;\n /**\n * 错误堆栈(如果是错误日志)\n */\n stack?: string;\n}\n\n/**\n * Logger 类\n */\nclass Logger {\n private level: LogLevel;\n private enableColors: boolean;\n private showTimestamp: boolean;\n private showLevel: boolean;\n private prefix: string;\n private enableSanitization: boolean;\n private isProduction: boolean;\n private format: LogFormat;\n private context: LogContext = {};\n private logHandlers: Array<(entry: StructuredLogEntry) => void> = [];\n\n constructor(options: LoggerOptions = {}) {\n this.level = options.level ?? LogLevel.INFO;\n this.enableColors = options.enableColors ?? true;\n this.showTimestamp = options.showTimestamp ?? true;\n this.showLevel = options.showLevel ?? true;\n this.prefix = options.prefix ?? '';\n this.enableSanitization = options.enableSanitization ?? true;\n this.isProduction = typeof process !== 'undefined' && process.env.NODE_ENV === 'production';\n this.format = (options as any).format ?? LogFormat.TEXT;\n this.context = (options as any).context ?? {};\n }\n\n /**\n * 设置日志级别\n */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n /**\n * 获取当前日志级别\n */\n getLevel(): LogLevel {\n return this.level;\n }\n\n /**\n * 格式化时间戳\n */\n private formatTimestamp(): string {\n const now = new Date();\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n const hours = String(now.getHours()).padStart(2, '0');\n const minutes = String(now.getMinutes()).padStart(2, '0');\n const seconds = String(now.getSeconds()).padStart(2, '0');\n const milliseconds = String(now.getMilliseconds()).padStart(3, '0');\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;\n }\n\n /**\n * 构建日志前缀\n */\n private buildPrefix(logLevel: LogLevel): string {\n const parts: string[] = [];\n\n if (this.showTimestamp) {\n parts.push(`[${this.formatTimestamp()}]`);\n }\n\n if (this.showLevel) {\n parts.push(`[${LEVEL_LABELS[logLevel]}]`);\n }\n\n // 添加追踪 ID(如果存在)\n const traceId = getCurrentTraceId();\n if (traceId) {\n parts.push(`[Trace:${traceId.substring(0, 8)}]`);\n }\n\n if (this.prefix) {\n parts.push(`[${this.prefix}]`);\n }\n\n return parts.join(' ');\n }\n\n /**\n * 输出日志(Node.js 环境)\n */\n private logNode(level: LogLevel, ...args: unknown[]): void {\n if (level < this.level) {\n return;\n }\n\n const prefix = this.buildPrefix(level);\n const colorConfig = LEVEL_COLORS[level];\n const reset = this.enableColors ? ANSI_COLORS.reset : '';\n\n if (this.enableColors && colorConfig.node) {\n console.log(`${colorConfig.node}${prefix}${reset}`, ...args);\n } else {\n console.log(prefix, ...args);\n }\n }\n\n /**\n * 输出日志(浏览器环境)\n */\n private logBrowser(level: LogLevel, ...args: unknown[]): void {\n if (level < this.level) {\n return;\n }\n\n const prefix = this.buildPrefix(level);\n const colorConfig = LEVEL_COLORS[level];\n\n if (this.enableColors && colorConfig.browser) {\n console.log(`%c${prefix}`, colorConfig.browser, ...args);\n } else {\n console.log(prefix, ...args);\n }\n }\n\n /**\n * 脱敏处理\n */\n private sanitizeValue(value: unknown): unknown {\n if (!this.enableSanitization) {\n return value;\n }\n\n if (typeof value === 'string') {\n // 检查是否包含敏感内容\n if (SecurityUtils.containsDangerousContent(value)) {\n return SecurityUtils.sanitizeText(value);\n }\n return value;\n }\n\n if (value && typeof value === 'object') {\n if (Array.isArray(value)) {\n return value.map((item) => this.sanitizeValue(item));\n }\n\n const sanitized: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n // 检查是否为敏感字段\n if (SecurityUtils.isSensitiveField(key)) {\n sanitized[key] = '***';\n } else {\n sanitized[key] = this.sanitizeValue(val);\n }\n }\n return sanitized;\n }\n\n return value;\n }\n\n /**\n * 处理日志参数(脱敏、过滤等)\n */\n private processLogArgs(...args: unknown[]): unknown[] {\n // 生产环境自动禁用 DEBUG 级别\n if (this.isProduction && this.level === LogLevel.DEBUG) {\n return [];\n }\n\n return args.map((arg) => this.sanitizeValue(arg));\n }\n\n /**\n * 设置日志格式\n */\n setFormat(format: LogFormat): void {\n this.format = format;\n }\n\n /**\n * 设置日志上下文\n */\n setContext(context: LogContext): void {\n this.context = { ...this.context, ...context };\n }\n\n /**\n * 更新日志上下文\n */\n updateContext(context: Partial<LogContext>): void {\n this.context = { ...this.context, ...context };\n }\n\n /**\n * 获取日志上下文\n */\n getContext(): LogContext {\n return { ...this.context };\n }\n\n /**\n * 清除日志上下文\n */\n clearContext(): void {\n this.context = {};\n }\n\n /**\n * 注册日志处理器(用于日志聚合)\n */\n addLogHandler(handler: (entry: StructuredLogEntry) => void): () => void {\n this.logHandlers.push(handler);\n return () => {\n const index = this.logHandlers.indexOf(handler);\n if (index > -1) {\n this.logHandlers.splice(index, 1);\n }\n };\n }\n\n /**\n * 创建结构化日志条目\n */\n private createStructuredEntry(\n level: LogLevel,\n message: string,\n data?: unknown\n ): StructuredLogEntry {\n const traceId = getCurrentTraceId();\n const entry: StructuredLogEntry = {\n timestamp: new Date().toISOString(),\n level,\n message,\n context: {\n ...this.context,\n traceId: traceId || this.context.traceId,\n },\n source: this.prefix || 'framework',\n };\n\n if (data !== undefined) {\n entry.data = this.sanitizeValue(data);\n }\n\n // 如果是错误,提取堆栈信息\n if (data instanceof Error) {\n entry.stack = data.stack;\n entry.message = data.message || message;\n }\n\n return entry;\n }\n\n /**\n * 输出结构化日志\n */\n private outputStructured(entry: StructuredLogEntry): void {\n // 调用日志处理器\n this.logHandlers.forEach((handler) => {\n try {\n handler(entry);\n } catch (error) {\n // 忽略处理器错误,避免循环\n }\n });\n\n // 根据格式输出\n if (this.format === LogFormat.JSON) {\n console.log(JSON.stringify(entry));\n } else if (this.format === LogFormat.STRUCTURED) {\n console.log(entry);\n } else {\n // TEXT 格式使用原有输出方式\n const args = entry.data !== undefined ? [entry.data] : [];\n if (isBrowser()) {\n this.logBrowser(entry.level, entry.message, ...args);\n } else {\n this.logNode(entry.level, entry.message, ...args);\n }\n }\n }\n\n /**\n * 通用日志输出方法\n */\n private log(level: LogLevel, ...args: unknown[]): void {\n if (level < this.level) {\n return;\n }\n\n const processedArgs = this.processLogArgs(...args);\n \n // 如果处理后没有参数(被过滤),则不输出\n if (processedArgs.length === 0) {\n return;\n }\n\n // 提取消息和数据\n const message = typeof processedArgs[0] === 'string' \n ? processedArgs[0] \n : 'Log message';\n const data = processedArgs.length > 1 \n ? processedArgs.slice(1) \n : (typeof processedArgs[0] === 'string' ? undefined : processedArgs[0]);\n\n // 创建结构化日志条目\n const entry = this.createStructuredEntry(level, message, data);\n\n // 输出日志\n this.outputStructured(entry);\n }\n\n /**\n * 输出 DEBUG 级别日志\n */\n debug(...args: unknown[]): void {\n this.log(LogLevel.DEBUG, ...args);\n }\n\n /**\n * 输出 INFO 级别日志\n */\n info(...args: unknown[]): void {\n this.log(LogLevel.INFO, ...args);\n }\n\n /**\n * 输出 WARN 级别日志\n */\n warn(...args: unknown[]): void {\n this.log(LogLevel.WARN, ...args);\n }\n\n /**\n * 输出 ERROR 级别日志\n */\n error(...args: unknown[]): void {\n this.log(LogLevel.ERROR, ...args);\n }\n}\n\n/**\n * 创建 Logger 实例\n */\nexport const createLogger = (options?: LoggerOptions): Logger => {\n return new Logger(options);\n};\n\n/**\n * 默认 Logger 实例\n */\nexport const logger = createLogger();\n\n/**\n * 导出 Logger 类\n */\nexport { Logger };\n"],"names":["LogLevel","SecurityUtils","getCurrentTraceId","isBrowser","window","document","ANSI_COLORS","reset","bright","dim","red","green","yellow","blue","magenta","cyan","white","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite","BROWSER_STYLES","debug","info","warn","error","LEVEL_COLORS","DEBUG","node","browser","INFO","WARN","ERROR","NONE","LEVEL_LABELS","LogFormat","Logger","setLevel","level","getLevel","formatTimestamp","now","Date","year","getFullYear","month","String","getMonth","padStart","day","getDate","hours","getHours","minutes","getMinutes","seconds","getSeconds","milliseconds","getMilliseconds","buildPrefix","logLevel","parts","showTimestamp","push","showLevel","traceId","substring","prefix","join","logNode","args","colorConfig","enableColors","console","log","logBrowser","sanitizeValue","value","enableSanitization","containsDangerousContent","sanitizeText","Array","isArray","map","item","sanitized","key","val","Object","entries","isSensitiveField","processLogArgs","isProduction","arg","setFormat","format","setContext","context","updateContext","getContext","clearContext","addLogHandler","handler","logHandlers","index","indexOf","splice","createStructuredEntry","message","data","entry","timestamp","toISOString","source","undefined","Error","stack","outputStructured","forEach","JSON","stringify","processedArgs","length","slice","options","process","env","NODE_ENV","createLogger","logger"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utils/logger.ts"],"sourcesContent":["export { logger, createLogger, Logger, LogFormat } from '@vlian/logger';\nexport type { LogContext, StructuredLogEntry } from '@vlian/logger';\n"],"names":["logger","createLogger","Logger","LogFormat"],"mappings":"AAAA,SAASA,MAAM,EAAEC,YAAY,EAAEC,MAAM,EAAEC,SAAS,QAAQ,gBAAgB"}
@@ -1,22 +1,13 @@
1
- /**
2
- * 日志级别枚举
3
- */ "use strict";
1
+ "use strict";
4
2
  Object.defineProperty(exports, "__esModule", {
5
3
  value: true
6
4
  });
7
5
  Object.defineProperty(exports, "LogLevel", {
8
6
  enumerable: true,
9
7
  get: function() {
10
- return LogLevel;
8
+ return _logger.LogLevel;
11
9
  }
12
10
  });
13
- var LogLevel = /*#__PURE__*/ function(LogLevel) {
14
- LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
15
- LogLevel[LogLevel["INFO"] = 1] = "INFO";
16
- LogLevel[LogLevel["WARN"] = 2] = "WARN";
17
- LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
18
- LogLevel[LogLevel["NONE"] = 4] = "NONE";
19
- return LogLevel;
20
- }({});
11
+ const _logger = require("@vlian/logger");
21
12
 
22
13
  //# sourceMappingURL=logger.types.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/logger.types.ts"],"sourcesContent":["/**\n * 日志级别枚举\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n NONE = 4,\n}\n\n/**\n * 日志配置选项\n */\nexport interface LoggerOptions {\n /**\n * 日志级别,低于此级别的日志将不会输出\n * @default LogLevel.INFO\n */\n level?: LogLevel;\n\n /**\n * 是否启用彩色输出\n * @default true\n */\n enableColors?: boolean;\n\n /**\n * 是否显示时间戳\n * @default true\n */\n showTimestamp?: boolean;\n\n /**\n * 是否显示日志级别标签\n * @default true\n */\n showLevel?: boolean;\n\n /**\n * 自定义前缀\n */\n prefix?: string;\n\n /**\n * 是否启用日志脱敏\n * @default true\n */\n enableSanitization?: boolean;\n}\n\n/**\n * 颜色配置\n */\nexport interface ColorConfig {\n /**\n * 前景色(文字颜色)\n */\n foreground?: string;\n\n /**\n * 背景色\n */\n background?: string;\n}\n"],"names":["LogLevel"],"mappings":"AAAA;;CAEC;;;;+BACWA;;;eAAAA;;;AAAL,IAAA,AAAKA,kCAAAA;;;;;;WAAAA"}
1
+ {"version":3,"sources":["../../src/utils/logger.types.ts"],"sourcesContent":["export { LogLevel } from '@vlian/logger';\nexport type { LoggerOptions, ColorConfig } from '@vlian/logger';\n"],"names":["LogLevel"],"mappings":";;;;+BAASA;;;eAAAA,gBAAQ;;;wBAAQ"}
@@ -1,57 +1,2 @@
1
- /**
2
- * 日志级别枚举
3
- */
4
- export declare enum LogLevel {
5
- DEBUG = 0,
6
- INFO = 1,
7
- WARN = 2,
8
- ERROR = 3,
9
- NONE = 4
10
- }
11
- /**
12
- * 日志配置选项
13
- */
14
- export interface LoggerOptions {
15
- /**
16
- * 日志级别,低于此级别的日志将不会输出
17
- * @default LogLevel.INFO
18
- */
19
- level?: LogLevel;
20
- /**
21
- * 是否启用彩色输出
22
- * @default true
23
- */
24
- enableColors?: boolean;
25
- /**
26
- * 是否显示时间戳
27
- * @default true
28
- */
29
- showTimestamp?: boolean;
30
- /**
31
- * 是否显示日志级别标签
32
- * @default true
33
- */
34
- showLevel?: boolean;
35
- /**
36
- * 自定义前缀
37
- */
38
- prefix?: string;
39
- /**
40
- * 是否启用日志脱敏
41
- * @default true
42
- */
43
- enableSanitization?: boolean;
44
- }
45
- /**
46
- * 颜色配置
47
- */
48
- export interface ColorConfig {
49
- /**
50
- * 前景色(文字颜色)
51
- */
52
- foreground?: string;
53
- /**
54
- * 背景色
55
- */
56
- background?: string;
57
- }
1
+ export { LogLevel } from '@vlian/logger';
2
+ export type { LoggerOptions, ColorConfig } from '@vlian/logger';
@@ -1,12 +1,3 @@
1
- /**
2
- * 日志级别枚举
3
- */ export var LogLevel = /*#__PURE__*/ function(LogLevel) {
4
- LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
5
- LogLevel[LogLevel["INFO"] = 1] = "INFO";
6
- LogLevel[LogLevel["WARN"] = 2] = "WARN";
7
- LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
8
- LogLevel[LogLevel["NONE"] = 4] = "NONE";
9
- return LogLevel;
10
- }({});
1
+ export { LogLevel } from "@vlian/logger";
11
2
 
12
3
  //# sourceMappingURL=logger.types.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/logger.types.ts"],"sourcesContent":["/**\n * 日志级别枚举\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n NONE = 4,\n}\n\n/**\n * 日志配置选项\n */\nexport interface LoggerOptions {\n /**\n * 日志级别,低于此级别的日志将不会输出\n * @default LogLevel.INFO\n */\n level?: LogLevel;\n\n /**\n * 是否启用彩色输出\n * @default true\n */\n enableColors?: boolean;\n\n /**\n * 是否显示时间戳\n * @default true\n */\n showTimestamp?: boolean;\n\n /**\n * 是否显示日志级别标签\n * @default true\n */\n showLevel?: boolean;\n\n /**\n * 自定义前缀\n */\n prefix?: string;\n\n /**\n * 是否启用日志脱敏\n * @default true\n */\n enableSanitization?: boolean;\n}\n\n/**\n * 颜色配置\n */\nexport interface ColorConfig {\n /**\n * 前景色(文字颜色)\n */\n foreground?: string;\n\n /**\n * 背景色\n */\n background?: string;\n}\n"],"names":["LogLevel"],"mappings":"AAAA;;CAEC,GACD,OAAO,IAAA,AAAKA,kCAAAA;;;;;;WAAAA;MAMX"}
1
+ {"version":3,"sources":["../../src/utils/logger.types.ts"],"sourcesContent":["export { LogLevel } from '@vlian/logger';\nexport type { LoggerOptions, ColorConfig } from '@vlian/logger';\n"],"names":["LogLevel"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,gBAAgB"}