@vlian/framework 1.2.57 → 1.2.60

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 (685) hide show
  1. package/README.md +15 -3
  2. package/dist/analytics/index.cjs +1 -24
  3. package/dist/analytics/index.js +1 -3
  4. package/dist/analytics.umd.js +8 -208
  5. package/dist/components/LocaleSwitch.cjs +1 -118
  6. package/dist/components/LocaleSwitch.js +1 -103
  7. package/dist/components/ThemeSwitch.cjs +1 -117
  8. package/dist/components/ThemeSwitch.js +1 -102
  9. package/dist/components/index.cjs +1 -22
  10. package/dist/components/index.js +1 -4
  11. package/dist/components/persistence.cjs +1 -60
  12. package/dist/components/persistence.js +1 -39
  13. package/dist/core/Test.cjs +1 -66
  14. package/dist/core/Test.js +1 -15
  15. package/dist/core/app/AppContext.cjs +1 -350
  16. package/dist/core/app/AppContext.js +1 -339
  17. package/dist/core/app/AppContext.types.cjs +1 -6
  18. package/dist/core/app/AppContext.types.js +1 -5
  19. package/dist/core/app/BasicLayout.cjs +1 -124
  20. package/dist/core/app/BasicLayout.js +1 -74
  21. package/dist/core/app/DefaultApp.cjs +1 -152
  22. package/dist/core/app/DefaultApp.js +1 -143
  23. package/dist/core/app/index.cjs +1 -43
  24. package/dist/core/app/index.js +1 -7
  25. package/dist/core/config/AppConfig.cjs +1 -141
  26. package/dist/core/config/AppConfig.js +1 -133
  27. package/dist/core/config/ConfigLoader.cjs +1 -325
  28. package/dist/core/config/ConfigLoader.js +1 -311
  29. package/dist/core/config/ConfigValidator.cjs +2 -135
  30. package/dist/core/config/ConfigValidator.js +2 -121
  31. package/dist/core/config/index.cjs +1 -30
  32. package/dist/core/config/index.js +1 -7
  33. package/dist/core/dev/DevTools.cjs +1 -228
  34. package/dist/core/dev/DevTools.js +1 -210
  35. package/dist/core/error/ErrorBoundary.cjs +1 -403
  36. package/dist/core/error/ErrorBoundary.js +1 -399
  37. package/dist/core/error/ErrorHandler.cjs +1 -277
  38. package/dist/core/error/ErrorHandler.js +1 -261
  39. package/dist/core/error/index.cjs +1 -36
  40. package/dist/core/error/index.js +1 -6
  41. package/dist/core/event/AppEventBus.cjs +1 -446
  42. package/dist/core/event/AppEventBus.js +1 -438
  43. package/dist/core/event/frameworkEvents.cjs +1 -143
  44. package/dist/core/event/frameworkEvents.js +1 -135
  45. package/dist/core/event/hooks.cjs +1 -71
  46. package/dist/core/event/hooks.js +1 -95
  47. package/dist/core/event/index.cjs +1 -43
  48. package/dist/core/event/index.js +1 -10
  49. package/dist/core/event/types.cjs +1 -64
  50. package/dist/core/event/types.js +1 -56
  51. package/dist/core/event/useEventBus.cjs +1 -27
  52. package/dist/core/event/useEventBus.js +1 -39
  53. package/dist/core/index.cjs +1 -142
  54. package/dist/core/index.js +1 -69
  55. package/dist/core/initialization/InitializationErrorThrower.cjs +1 -77
  56. package/dist/core/initialization/InitializationErrorThrower.js +1 -30
  57. package/dist/core/initialization/index.cjs +1 -28
  58. package/dist/core/initialization/index.js +1 -7
  59. package/dist/core/initialization/initialization.cjs +1 -66
  60. package/dist/core/initialization/initialization.js +1 -78
  61. package/dist/core/initialization/initializationErrorState.cjs +1 -68
  62. package/dist/core/initialization/initializationErrorState.js +1 -60
  63. package/dist/core/kernel/defaultAdapters.cjs +1 -186
  64. package/dist/core/kernel/defaultAdapters.js +1 -176
  65. package/dist/core/kernel/errors.cjs +1 -71
  66. package/dist/core/kernel/errors.js +1 -53
  67. package/dist/core/kernel/index.cjs +1 -22
  68. package/dist/core/kernel/index.js +1 -4
  69. package/dist/core/kernel/startKernel.cjs +1 -202
  70. package/dist/core/kernel/startKernel.js +1 -192
  71. package/dist/core/kernel/types.cjs +1 -6
  72. package/dist/core/kernel/types.js +1 -3
  73. package/dist/core/middleware.cjs +1 -75
  74. package/dist/core/middleware.js +1 -61
  75. package/dist/core/plugin/PluginEventBus.cjs +1 -300
  76. package/dist/core/plugin/PluginEventBus.js +1 -286
  77. package/dist/core/plugin/PluginSandbox.cjs +1 -139
  78. package/dist/core/plugin/PluginSandbox.js +1 -125
  79. package/dist/core/plugin.cjs +1 -496
  80. package/dist/core/plugin.js +1 -438
  81. package/dist/core/router/RouterManager.cjs +1 -288
  82. package/dist/core/router/RouterManager.js +1 -272
  83. package/dist/core/router/adapter/AdapterManager.cjs +1 -237
  84. package/dist/core/router/adapter/AdapterManager.js +1 -221
  85. package/dist/core/router/adapter/index.cjs +1 -24
  86. package/dist/core/router/adapter/index.js +1 -7
  87. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +1 -130
  88. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +1 -116
  89. package/dist/core/router/adapter/react-router/index.cjs +1 -22
  90. package/dist/core/router/adapter/react-router/index.js +1 -5
  91. package/dist/core/router/adapter/types.cjs +1 -8
  92. package/dist/core/router/adapter/types.js +1 -7
  93. package/dist/core/router/dev/RouterDevTools.cjs +1 -262
  94. package/dist/core/router/dev/RouterDevTools.js +1 -211
  95. package/dist/core/router/dev/index.cjs +1 -22
  96. package/dist/core/router/dev/index.js +1 -5
  97. package/dist/core/router/dynamic/DynamicRouteManager.cjs +1 -195
  98. package/dist/core/router/dynamic/DynamicRouteManager.js +1 -179
  99. package/dist/core/router/dynamic/index.cjs +1 -22
  100. package/dist/core/router/dynamic/index.js +1 -5
  101. package/dist/core/router/errors/RouterError.cjs +1 -63
  102. package/dist/core/router/errors/RouterError.js +1 -48
  103. package/dist/core/router/errors/index.cjs +1 -22
  104. package/dist/core/router/errors/index.js +1 -5
  105. package/dist/core/router/index.cjs +1 -38
  106. package/dist/core/router/index.js +1 -32
  107. package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +1 -146
  108. package/dist/core/router/lifecycle/RouterLifecycleManager.js +1 -130
  109. package/dist/core/router/lifecycle/index.cjs +1 -22
  110. package/dist/core/router/lifecycle/index.js +1 -5
  111. package/dist/core/router/middleware/RouterMiddlewareManager.cjs +1 -195
  112. package/dist/core/router/middleware/RouterMiddlewareManager.js +1 -179
  113. package/dist/core/router/middleware/auth.cjs +1 -68
  114. package/dist/core/router/middleware/auth.js +1 -63
  115. package/dist/core/router/middleware/index.cjs +1 -24
  116. package/dist/core/router/middleware/index.js +1 -7
  117. package/dist/core/router/middleware/types.cjs +1 -8
  118. package/dist/core/router/middleware/types.js +1 -7
  119. package/dist/core/router/monitoring/RouterMonitoring.cjs +1 -229
  120. package/dist/core/router/monitoring/RouterMonitoring.js +1 -213
  121. package/dist/core/router/monitoring/index.cjs +1 -22
  122. package/dist/core/router/monitoring/index.js +1 -5
  123. package/dist/core/router/navigation/RouterNavigation.cjs +1 -241
  124. package/dist/core/router/navigation/RouterNavigation.js +1 -192
  125. package/dist/core/router/navigation/index.cjs +1 -22
  126. package/dist/core/router/navigation/index.js +1 -5
  127. package/dist/core/router/performance/RouteCache.cjs +1 -307
  128. package/dist/core/router/performance/RouteCache.js +1 -291
  129. package/dist/core/router/performance/RoutePreloader.cjs +1 -294
  130. package/dist/core/router/performance/RoutePreloader.js +1 -277
  131. package/dist/core/router/performance/index.cjs +1 -23
  132. package/dist/core/router/performance/index.js +1 -6
  133. package/dist/core/router/plugin/RouterPluginManager.cjs +1 -264
  134. package/dist/core/router/plugin/RouterPluginManager.js +1 -248
  135. package/dist/core/router/plugin/index.cjs +1 -23
  136. package/dist/core/router/plugin/index.js +1 -6
  137. package/dist/core/router/plugin/types.cjs +1 -41
  138. package/dist/core/router/plugin/types.js +1 -33
  139. package/dist/core/router/types.cjs +1 -6
  140. package/dist/core/router/types.js +1 -5
  141. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs +1 -131
  142. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js +1 -121
  143. package/dist/core/router/utils/adapters/react-router/transform.cjs +1 -252
  144. package/dist/core/router/utils/adapters/react-router/transform.js +1 -242
  145. package/dist/core/router/utils/transform.cjs +1 -782
  146. package/dist/core/router/utils/transform.js +1 -791
  147. package/dist/core/router/validation/RouterConfigValidator.cjs +2 -85
  148. package/dist/core/router/validation/RouterConfigValidator.js +2 -77
  149. package/dist/core/router/validation/index.cjs +1 -23
  150. package/dist/core/router/validation/index.js +1 -6
  151. package/dist/core/router/validation/schema.cjs +1 -161
  152. package/dist/core/router/validation/schema.js +1 -151
  153. package/dist/core/router/version/RouteVersionManager.cjs +1 -207
  154. package/dist/core/router/version/RouteVersionManager.js +1 -191
  155. package/dist/core/router/version/index.cjs +1 -22
  156. package/dist/core/router/version/index.js +1 -5
  157. package/dist/core/splash/SplashScreen.cjs +1 -343
  158. package/dist/core/splash/SplashScreen.js +1 -293
  159. package/dist/core/splash/index.cjs +1 -24
  160. package/dist/core/splash/index.js +1 -6
  161. package/dist/core/splash/splashScreenUtils.cjs +1 -40
  162. package/dist/core/splash/splashScreenUtils.js +1 -30
  163. package/dist/core/startup/AppInstance.cjs +1 -241
  164. package/dist/core/startup/AppInstance.js +1 -226
  165. package/dist/core/startup/environment.cjs +1 -171
  166. package/dist/core/startup/environment.js +1 -154
  167. package/dist/core/startup/index.cjs +1 -25
  168. package/dist/core/startup/index.js +1 -8
  169. package/dist/core/startup/initializeServices.cjs +1 -228
  170. package/dist/core/startup/initializeServices.js +1 -188
  171. package/dist/core/startup/performanceTracker.cjs +1 -181
  172. package/dist/core/startup/performanceTracker.js +1 -167
  173. package/dist/core/startup/renderApp.cjs +1 -316
  174. package/dist/core/startup/renderApp.js +1 -267
  175. package/dist/core/startup/startApp.cjs +1 -319
  176. package/dist/core/startup/startApp.js +1 -315
  177. package/dist/core/types.cjs +1 -6
  178. package/dist/core/types.js +1 -5
  179. package/dist/index.cjs +1 -54
  180. package/dist/index.js +1 -11
  181. package/dist/index.umd.cjs +1 -29
  182. package/dist/index.umd.js +362 -13233
  183. package/dist/kernel/constants.cjs +1 -67
  184. package/dist/kernel/constants.js +1 -43
  185. package/dist/kernel/index.cjs +1 -40
  186. package/dist/kernel/index.js +1 -4
  187. package/dist/kernel/kernel.cjs +1 -297
  188. package/dist/kernel/kernel.js +1 -273
  189. package/dist/kernel/manager/cacheManager.cjs +1 -48
  190. package/dist/kernel/manager/cacheManager.js +1 -38
  191. package/dist/kernel/manager/i18n/I18nManager.cjs +1 -93
  192. package/dist/kernel/manager/i18n/I18nManager.js +1 -83
  193. package/dist/kernel/manager/i18n/i18n.persistence.cjs +1 -62
  194. package/dist/kernel/manager/i18n/i18n.persistence.js +1 -41
  195. package/dist/kernel/manager/i18n/i18n.schema.cjs +1 -88
  196. package/dist/kernel/manager/i18n/i18n.schema.js +1 -64
  197. package/dist/kernel/manager/i18n/index.cjs +1 -13
  198. package/dist/kernel/manager/i18n/index.js +1 -3
  199. package/dist/kernel/manager/i18nManager.cjs +1 -13
  200. package/dist/kernel/manager/i18nManager.js +1 -3
  201. package/dist/kernel/manager/index.cjs +1 -30
  202. package/dist/kernel/manager/index.js +1 -6
  203. package/dist/kernel/manager/logger/LoggerManager.cjs +1 -109
  204. package/dist/kernel/manager/logger/LoggerManager.js +1 -99
  205. package/dist/kernel/manager/logger/index.cjs +1 -13
  206. package/dist/kernel/manager/logger/index.js +1 -3
  207. package/dist/kernel/manager/logger/logger.persistence.cjs +1 -64
  208. package/dist/kernel/manager/logger/logger.persistence.js +1 -43
  209. package/dist/kernel/manager/logger/logger.schema.cjs +1 -76
  210. package/dist/kernel/manager/logger/logger.schema.js +1 -55
  211. package/dist/kernel/manager/loggerManager.cjs +1 -13
  212. package/dist/kernel/manager/loggerManager.js +1 -3
  213. package/dist/kernel/manager/theme/ThemeManager.cjs +1 -86
  214. package/dist/kernel/manager/theme/ThemeManager.js +1 -76
  215. package/dist/kernel/manager/theme/index.cjs +1 -13
  216. package/dist/kernel/manager/theme/index.js +1 -3
  217. package/dist/kernel/manager/theme/theme.dom.cjs +1 -63
  218. package/dist/kernel/manager/theme/theme.dom.js +1 -45
  219. package/dist/kernel/manager/theme/theme.persistence.cjs +1 -59
  220. package/dist/kernel/manager/theme/theme.persistence.js +1 -38
  221. package/dist/kernel/manager/theme/theme.schema.cjs +1 -124
  222. package/dist/kernel/manager/theme/theme.schema.js +1 -97
  223. package/dist/kernel/manager/themeManager.cjs +1 -13
  224. package/dist/kernel/manager/themeManager.js +1 -3
  225. package/dist/kernel/types.cjs +1 -6
  226. package/dist/kernel/types.js +1 -3
  227. package/dist/library/index.cjs +1 -21
  228. package/dist/library/index.js +1 -4
  229. package/dist/library/locale/index.cjs +1 -41
  230. package/dist/library/locale/index.js +1 -12
  231. package/dist/library/locale/langs/en-us/index.cjs +1 -34
  232. package/dist/library/locale/langs/en-us/index.js +1 -24
  233. package/dist/library/locale/langs/zh-cn/index.cjs +1 -34
  234. package/dist/library/locale/langs/zh-cn/index.js +1 -24
  235. package/dist/library/locale/types.cjs +1 -6
  236. package/dist/library/locale/types.js +1 -3
  237. package/dist/library/storage/cache.cjs +1 -245
  238. package/dist/library/storage/cache.js +1 -237
  239. package/dist/library/storage/encryption.cjs +1 -149
  240. package/dist/library/storage/encryption.js +1 -141
  241. package/dist/library/storage/index.cjs +1 -126
  242. package/dist/library/storage/index.js +1 -106
  243. package/dist/state/StateManager.cjs +1 -168
  244. package/dist/state/StateManager.js +1 -160
  245. package/dist/state/adapters/AdapterFactory.cjs +1 -91
  246. package/dist/state/adapters/AdapterFactory.js +1 -85
  247. package/dist/state/adapters/DefaultAdapter.cjs +1 -77
  248. package/dist/state/adapters/DefaultAdapter.js +1 -71
  249. package/dist/state/adapters/ReduxAdapter.cjs +1 -445
  250. package/dist/state/adapters/ReduxAdapter.js +1 -439
  251. package/dist/state/adapters/ZustandAdapter.cjs +1 -71
  252. package/dist/state/adapters/ZustandAdapter.js +1 -70
  253. package/dist/state/adapters/index.cjs +1 -46
  254. package/dist/state/adapters/index.js +1 -9
  255. package/dist/state/adapters/types.cjs +1 -22
  256. package/dist/state/adapters/types.js +1 -5
  257. package/dist/state/core/DerivedStateInstance.cjs +1 -176
  258. package/dist/state/core/DerivedStateInstance.js +1 -173
  259. package/dist/state/core/StateInstance.cjs +1 -172
  260. package/dist/state/core/StateInstance.js +1 -168
  261. package/dist/state/core/StateRegistry.cjs +1 -112
  262. package/dist/state/core/StateRegistry.js +1 -106
  263. package/dist/state/core/StateScope.cjs +1 -139
  264. package/dist/state/core/StateScope.js +1 -133
  265. package/dist/state/core/index.cjs +1 -32
  266. package/dist/state/core/index.js +1 -8
  267. package/dist/state/index.cjs +1 -32
  268. package/dist/state/index.js +1 -12
  269. package/dist/state/types.cjs +1 -14
  270. package/dist/state/types.js +1 -13
  271. package/dist/state.umd.js +22 -1395
  272. package/dist/types.cjs +1 -6
  273. package/dist/types.js +1 -3
  274. package/dist/utils/analytics.cjs +1 -219
  275. package/dist/utils/analytics.js +1 -204
  276. package/dist/utils/configSecurity.cjs +3 -184
  277. package/dist/utils/configSecurity.js +3 -176
  278. package/dist/utils/csrf.cjs +1 -20
  279. package/dist/utils/csrf.js +1 -3
  280. package/dist/utils/errors/ErrorCodes.cjs +1 -27
  281. package/dist/utils/errors/ErrorCodes.js +1 -3
  282. package/dist/utils/errors.cjs +1 -113
  283. package/dist/utils/errors.js +1 -18
  284. package/dist/utils/index.cjs +1 -137
  285. package/dist/utils/index.js +1 -48
  286. package/dist/utils/logger.cjs +1 -27
  287. package/dist/utils/logger.js +1 -3
  288. package/dist/utils/logger.types.cjs +1 -13
  289. package/dist/utils/logger.types.js +1 -3
  290. package/dist/utils/monitoring.cjs +1 -20
  291. package/dist/utils/monitoring.js +1 -3
  292. package/dist/utils/performance.cjs +1 -24
  293. package/dist/utils/performance.js +1 -3
  294. package/dist/utils/resourceLoader.cjs +1 -24
  295. package/dist/utils/resourceLoader.js +1 -3
  296. package/dist/utils/runtimeSecurity.cjs +1 -13
  297. package/dist/utils/runtimeSecurity.js +1 -3
  298. package/dist/utils/security.cjs +1 -21
  299. package/dist/utils/security.js +1 -3
  300. package/dist/utils/traceId.cjs +1 -39
  301. package/dist/utils/traceId.js +1 -3
  302. package/dist/utils/validation.cjs +1 -21
  303. package/dist/utils/validation.js +1 -3
  304. package/package.json +9 -6
  305. package/dist/analytics/index.cjs.map +0 -1
  306. package/dist/analytics/index.js.map +0 -1
  307. package/dist/analytics.umd.js.map +0 -1
  308. package/dist/components/LocaleSwitch.cjs.map +0 -1
  309. package/dist/components/LocaleSwitch.js.map +0 -1
  310. package/dist/components/ThemeSwitch.cjs.map +0 -1
  311. package/dist/components/ThemeSwitch.js.map +0 -1
  312. package/dist/components/index.cjs.map +0 -1
  313. package/dist/components/index.js.map +0 -1
  314. package/dist/components/persistence.cjs.map +0 -1
  315. package/dist/components/persistence.js.map +0 -1
  316. package/dist/core/Test.cjs.map +0 -1
  317. package/dist/core/Test.js.map +0 -1
  318. package/dist/core/app/AppContext.cjs.map +0 -1
  319. package/dist/core/app/AppContext.js.map +0 -1
  320. package/dist/core/app/AppContext.types.cjs.map +0 -1
  321. package/dist/core/app/AppContext.types.js.map +0 -1
  322. package/dist/core/app/BasicLayout.cjs.map +0 -1
  323. package/dist/core/app/BasicLayout.js.map +0 -1
  324. package/dist/core/app/DefaultApp.cjs.map +0 -1
  325. package/dist/core/app/DefaultApp.js.map +0 -1
  326. package/dist/core/app/index.cjs.map +0 -1
  327. package/dist/core/app/index.js.map +0 -1
  328. package/dist/core/config/AppConfig.cjs.map +0 -1
  329. package/dist/core/config/AppConfig.js.map +0 -1
  330. package/dist/core/config/ConfigLoader.cjs.map +0 -1
  331. package/dist/core/config/ConfigLoader.js.map +0 -1
  332. package/dist/core/config/ConfigValidator.cjs.map +0 -1
  333. package/dist/core/config/ConfigValidator.js.map +0 -1
  334. package/dist/core/config/index.cjs.map +0 -1
  335. package/dist/core/config/index.js.map +0 -1
  336. package/dist/core/dev/DevTools.cjs.map +0 -1
  337. package/dist/core/dev/DevTools.js.map +0 -1
  338. package/dist/core/error/ErrorBoundary.cjs.map +0 -1
  339. package/dist/core/error/ErrorBoundary.js.map +0 -1
  340. package/dist/core/error/ErrorHandler.cjs.map +0 -1
  341. package/dist/core/error/ErrorHandler.js.map +0 -1
  342. package/dist/core/error/index.cjs.map +0 -1
  343. package/dist/core/error/index.js.map +0 -1
  344. package/dist/core/event/AppEventBus.cjs.map +0 -1
  345. package/dist/core/event/AppEventBus.js.map +0 -1
  346. package/dist/core/event/frameworkEvents.cjs.map +0 -1
  347. package/dist/core/event/frameworkEvents.js.map +0 -1
  348. package/dist/core/event/hooks.cjs.map +0 -1
  349. package/dist/core/event/hooks.js.map +0 -1
  350. package/dist/core/event/index.cjs.map +0 -1
  351. package/dist/core/event/index.js.map +0 -1
  352. package/dist/core/event/types.cjs.map +0 -1
  353. package/dist/core/event/types.js.map +0 -1
  354. package/dist/core/event/useEventBus.cjs.map +0 -1
  355. package/dist/core/event/useEventBus.js.map +0 -1
  356. package/dist/core/index.cjs.map +0 -1
  357. package/dist/core/index.js.map +0 -1
  358. package/dist/core/initialization/InitializationErrorThrower.cjs.map +0 -1
  359. package/dist/core/initialization/InitializationErrorThrower.js.map +0 -1
  360. package/dist/core/initialization/index.cjs.map +0 -1
  361. package/dist/core/initialization/index.js.map +0 -1
  362. package/dist/core/initialization/initialization.cjs.map +0 -1
  363. package/dist/core/initialization/initialization.js.map +0 -1
  364. package/dist/core/initialization/initializationErrorState.cjs.map +0 -1
  365. package/dist/core/initialization/initializationErrorState.js.map +0 -1
  366. package/dist/core/kernel/defaultAdapters.cjs.map +0 -1
  367. package/dist/core/kernel/defaultAdapters.js.map +0 -1
  368. package/dist/core/kernel/errors.cjs.map +0 -1
  369. package/dist/core/kernel/errors.js.map +0 -1
  370. package/dist/core/kernel/index.cjs.map +0 -1
  371. package/dist/core/kernel/index.js.map +0 -1
  372. package/dist/core/kernel/startKernel.cjs.map +0 -1
  373. package/dist/core/kernel/startKernel.js.map +0 -1
  374. package/dist/core/kernel/types.cjs.map +0 -1
  375. package/dist/core/kernel/types.js.map +0 -1
  376. package/dist/core/middleware.cjs.map +0 -1
  377. package/dist/core/middleware.js.map +0 -1
  378. package/dist/core/plugin/PluginEventBus.cjs.map +0 -1
  379. package/dist/core/plugin/PluginEventBus.js.map +0 -1
  380. package/dist/core/plugin/PluginSandbox.cjs.map +0 -1
  381. package/dist/core/plugin/PluginSandbox.js.map +0 -1
  382. package/dist/core/plugin.cjs.map +0 -1
  383. package/dist/core/plugin.js.map +0 -1
  384. package/dist/core/router/RouterManager.cjs.map +0 -1
  385. package/dist/core/router/RouterManager.js.map +0 -1
  386. package/dist/core/router/adapter/AdapterManager.cjs.map +0 -1
  387. package/dist/core/router/adapter/AdapterManager.js.map +0 -1
  388. package/dist/core/router/adapter/index.cjs.map +0 -1
  389. package/dist/core/router/adapter/index.js.map +0 -1
  390. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +0 -1
  391. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +0 -1
  392. package/dist/core/router/adapter/react-router/index.cjs.map +0 -1
  393. package/dist/core/router/adapter/react-router/index.js.map +0 -1
  394. package/dist/core/router/adapter/types.cjs.map +0 -1
  395. package/dist/core/router/adapter/types.js.map +0 -1
  396. package/dist/core/router/dev/RouterDevTools.cjs.map +0 -1
  397. package/dist/core/router/dev/RouterDevTools.js.map +0 -1
  398. package/dist/core/router/dev/index.cjs.map +0 -1
  399. package/dist/core/router/dev/index.js.map +0 -1
  400. package/dist/core/router/dynamic/DynamicRouteManager.cjs.map +0 -1
  401. package/dist/core/router/dynamic/DynamicRouteManager.js.map +0 -1
  402. package/dist/core/router/dynamic/index.cjs.map +0 -1
  403. package/dist/core/router/dynamic/index.js.map +0 -1
  404. package/dist/core/router/errors/RouterError.cjs.map +0 -1
  405. package/dist/core/router/errors/RouterError.js.map +0 -1
  406. package/dist/core/router/errors/index.cjs.map +0 -1
  407. package/dist/core/router/errors/index.js.map +0 -1
  408. package/dist/core/router/index.cjs.map +0 -1
  409. package/dist/core/router/index.js.map +0 -1
  410. package/dist/core/router/lifecycle/RouterLifecycleManager.cjs.map +0 -1
  411. package/dist/core/router/lifecycle/RouterLifecycleManager.js.map +0 -1
  412. package/dist/core/router/lifecycle/index.cjs.map +0 -1
  413. package/dist/core/router/lifecycle/index.js.map +0 -1
  414. package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +0 -1
  415. package/dist/core/router/middleware/RouterMiddlewareManager.js.map +0 -1
  416. package/dist/core/router/middleware/auth.cjs.map +0 -1
  417. package/dist/core/router/middleware/auth.js.map +0 -1
  418. package/dist/core/router/middleware/index.cjs.map +0 -1
  419. package/dist/core/router/middleware/index.js.map +0 -1
  420. package/dist/core/router/middleware/types.cjs.map +0 -1
  421. package/dist/core/router/middleware/types.js.map +0 -1
  422. package/dist/core/router/monitoring/RouterMonitoring.cjs.map +0 -1
  423. package/dist/core/router/monitoring/RouterMonitoring.js.map +0 -1
  424. package/dist/core/router/monitoring/index.cjs.map +0 -1
  425. package/dist/core/router/monitoring/index.js.map +0 -1
  426. package/dist/core/router/navigation/RouterNavigation.cjs.map +0 -1
  427. package/dist/core/router/navigation/RouterNavigation.js.map +0 -1
  428. package/dist/core/router/navigation/index.cjs.map +0 -1
  429. package/dist/core/router/navigation/index.js.map +0 -1
  430. package/dist/core/router/performance/RouteCache.cjs.map +0 -1
  431. package/dist/core/router/performance/RouteCache.js.map +0 -1
  432. package/dist/core/router/performance/RoutePreloader.cjs.map +0 -1
  433. package/dist/core/router/performance/RoutePreloader.js.map +0 -1
  434. package/dist/core/router/performance/index.cjs.map +0 -1
  435. package/dist/core/router/performance/index.js.map +0 -1
  436. package/dist/core/router/plugin/RouterPluginManager.cjs.map +0 -1
  437. package/dist/core/router/plugin/RouterPluginManager.js.map +0 -1
  438. package/dist/core/router/plugin/index.cjs.map +0 -1
  439. package/dist/core/router/plugin/index.js.map +0 -1
  440. package/dist/core/router/plugin/types.cjs.map +0 -1
  441. package/dist/core/router/plugin/types.js.map +0 -1
  442. package/dist/core/router/types.cjs.map +0 -1
  443. package/dist/core/router/types.js.map +0 -1
  444. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs.map +0 -1
  445. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js.map +0 -1
  446. package/dist/core/router/utils/adapters/react-router/transform.cjs.map +0 -1
  447. package/dist/core/router/utils/adapters/react-router/transform.js.map +0 -1
  448. package/dist/core/router/utils/transform.cjs.map +0 -1
  449. package/dist/core/router/utils/transform.js.map +0 -1
  450. package/dist/core/router/validation/RouterConfigValidator.cjs.map +0 -1
  451. package/dist/core/router/validation/RouterConfigValidator.js.map +0 -1
  452. package/dist/core/router/validation/index.cjs.map +0 -1
  453. package/dist/core/router/validation/index.js.map +0 -1
  454. package/dist/core/router/validation/schema.cjs.map +0 -1
  455. package/dist/core/router/validation/schema.js.map +0 -1
  456. package/dist/core/router/version/RouteVersionManager.cjs.map +0 -1
  457. package/dist/core/router/version/RouteVersionManager.js.map +0 -1
  458. package/dist/core/router/version/index.cjs.map +0 -1
  459. package/dist/core/router/version/index.js.map +0 -1
  460. package/dist/core/splash/SplashScreen.cjs.map +0 -1
  461. package/dist/core/splash/SplashScreen.js.map +0 -1
  462. package/dist/core/splash/index.cjs.map +0 -1
  463. package/dist/core/splash/index.js.map +0 -1
  464. package/dist/core/splash/splashScreenUtils.cjs.map +0 -1
  465. package/dist/core/splash/splashScreenUtils.js.map +0 -1
  466. package/dist/core/startup/AppInstance.cjs.map +0 -1
  467. package/dist/core/startup/AppInstance.js.map +0 -1
  468. package/dist/core/startup/environment.cjs.map +0 -1
  469. package/dist/core/startup/environment.js.map +0 -1
  470. package/dist/core/startup/index.cjs.map +0 -1
  471. package/dist/core/startup/index.js.map +0 -1
  472. package/dist/core/startup/initializeServices.cjs.map +0 -1
  473. package/dist/core/startup/initializeServices.js.map +0 -1
  474. package/dist/core/startup/performanceTracker.cjs.map +0 -1
  475. package/dist/core/startup/performanceTracker.js.map +0 -1
  476. package/dist/core/startup/renderApp.cjs.map +0 -1
  477. package/dist/core/startup/renderApp.js.map +0 -1
  478. package/dist/core/startup/startApp.cjs.map +0 -1
  479. package/dist/core/startup/startApp.js.map +0 -1
  480. package/dist/core/types.cjs.map +0 -1
  481. package/dist/core/types.js.map +0 -1
  482. package/dist/index.cjs.map +0 -1
  483. package/dist/index.js.map +0 -1
  484. package/dist/index.umd.cjs.map +0 -1
  485. package/dist/index.umd.js.map +0 -1
  486. package/dist/kernel/constants.cjs.map +0 -1
  487. package/dist/kernel/constants.js.map +0 -1
  488. package/dist/kernel/index.cjs.map +0 -1
  489. package/dist/kernel/index.js.map +0 -1
  490. package/dist/kernel/kernel.cjs.map +0 -1
  491. package/dist/kernel/kernel.js.map +0 -1
  492. package/dist/kernel/manager/cacheManager.cjs.map +0 -1
  493. package/dist/kernel/manager/cacheManager.js.map +0 -1
  494. package/dist/kernel/manager/i18n/I18nManager.cjs.map +0 -1
  495. package/dist/kernel/manager/i18n/I18nManager.js.map +0 -1
  496. package/dist/kernel/manager/i18n/i18n.persistence.cjs.map +0 -1
  497. package/dist/kernel/manager/i18n/i18n.persistence.js.map +0 -1
  498. package/dist/kernel/manager/i18n/i18n.schema.cjs.map +0 -1
  499. package/dist/kernel/manager/i18n/i18n.schema.js.map +0 -1
  500. package/dist/kernel/manager/i18n/index.cjs.map +0 -1
  501. package/dist/kernel/manager/i18n/index.js.map +0 -1
  502. package/dist/kernel/manager/i18nManager.cjs.map +0 -1
  503. package/dist/kernel/manager/i18nManager.js.map +0 -1
  504. package/dist/kernel/manager/index.cjs.map +0 -1
  505. package/dist/kernel/manager/index.js.map +0 -1
  506. package/dist/kernel/manager/logger/LoggerManager.cjs.map +0 -1
  507. package/dist/kernel/manager/logger/LoggerManager.js.map +0 -1
  508. package/dist/kernel/manager/logger/index.cjs.map +0 -1
  509. package/dist/kernel/manager/logger/index.js.map +0 -1
  510. package/dist/kernel/manager/logger/logger.persistence.cjs.map +0 -1
  511. package/dist/kernel/manager/logger/logger.persistence.js.map +0 -1
  512. package/dist/kernel/manager/logger/logger.schema.cjs.map +0 -1
  513. package/dist/kernel/manager/logger/logger.schema.js.map +0 -1
  514. package/dist/kernel/manager/loggerManager.cjs.map +0 -1
  515. package/dist/kernel/manager/loggerManager.js.map +0 -1
  516. package/dist/kernel/manager/persistence.cjs +0 -78
  517. package/dist/kernel/manager/persistence.cjs.map +0 -1
  518. package/dist/kernel/manager/persistence.d.ts +0 -3
  519. package/dist/kernel/manager/persistence.js +0 -60
  520. package/dist/kernel/manager/persistence.js.map +0 -1
  521. package/dist/kernel/manager/theme/ThemeManager.cjs.map +0 -1
  522. package/dist/kernel/manager/theme/ThemeManager.js.map +0 -1
  523. package/dist/kernel/manager/theme/index.cjs.map +0 -1
  524. package/dist/kernel/manager/theme/index.js.map +0 -1
  525. package/dist/kernel/manager/theme/theme.dom.cjs.map +0 -1
  526. package/dist/kernel/manager/theme/theme.dom.js.map +0 -1
  527. package/dist/kernel/manager/theme/theme.persistence.cjs.map +0 -1
  528. package/dist/kernel/manager/theme/theme.persistence.js.map +0 -1
  529. package/dist/kernel/manager/theme/theme.schema.cjs.map +0 -1
  530. package/dist/kernel/manager/theme/theme.schema.js.map +0 -1
  531. package/dist/kernel/manager/themeManager.cjs.map +0 -1
  532. package/dist/kernel/manager/themeManager.js.map +0 -1
  533. package/dist/kernel/types.cjs.map +0 -1
  534. package/dist/kernel/types.js.map +0 -1
  535. package/dist/library/index.cjs.map +0 -1
  536. package/dist/library/index.js.map +0 -1
  537. package/dist/library/locale/index.cjs.map +0 -1
  538. package/dist/library/locale/index.js.map +0 -1
  539. package/dist/library/locale/langs/en-us/index.cjs.map +0 -1
  540. package/dist/library/locale/langs/en-us/index.js.map +0 -1
  541. package/dist/library/locale/langs/zh-cn/index.cjs.map +0 -1
  542. package/dist/library/locale/langs/zh-cn/index.js.map +0 -1
  543. package/dist/library/locale/types.cjs.map +0 -1
  544. package/dist/library/locale/types.js.map +0 -1
  545. package/dist/library/storage/cache.cjs.map +0 -1
  546. package/dist/library/storage/cache.js.map +0 -1
  547. package/dist/library/storage/encryption.cjs.map +0 -1
  548. package/dist/library/storage/encryption.js.map +0 -1
  549. package/dist/library/storage/index.cjs.map +0 -1
  550. package/dist/library/storage/index.js.map +0 -1
  551. package/dist/request/adapter/RequestAdapter.d.ts +0 -85
  552. package/dist/request/adapter/RequestAdapter.js +0 -70
  553. package/dist/request/adapter/RequestAdapter.js.map +0 -1
  554. package/dist/request/adapter/axiosAdapter.d.ts +0 -10
  555. package/dist/request/adapter/axiosAdapter.js +0 -115
  556. package/dist/request/adapter/axiosAdapter.js.map +0 -1
  557. package/dist/request/adapter/fetchAdapter.d.ts +0 -10
  558. package/dist/request/adapter/fetchAdapter.js +0 -126
  559. package/dist/request/adapter/fetchAdapter.js.map +0 -1
  560. package/dist/request/adapter/index.d.ts +0 -9
  561. package/dist/request/adapter/index.js +0 -14
  562. package/dist/request/adapter/index.js.map +0 -1
  563. package/dist/request/adapter/kyAdapter.d.ts +0 -10
  564. package/dist/request/adapter/kyAdapter.js +0 -142
  565. package/dist/request/adapter/kyAdapter.js.map +0 -1
  566. package/dist/request/adapter/undiciAdapter.d.ts +0 -10
  567. package/dist/request/adapter/undiciAdapter.js +0 -164
  568. package/dist/request/adapter/undiciAdapter.js.map +0 -1
  569. package/dist/request/adapter.d.ts +0 -1
  570. package/dist/request/core/RequestClient.d.ts +0 -134
  571. package/dist/request/core/RequestClient.js +0 -509
  572. package/dist/request/core/RequestClient.js.map +0 -1
  573. package/dist/request/core/index.d.ts +0 -5
  574. package/dist/request/core/index.js +0 -5
  575. package/dist/request/core/index.js.map +0 -1
  576. package/dist/request/core.d.ts +0 -1
  577. package/dist/request/index.d.ts +0 -1
  578. package/dist/request/index.js +0 -50
  579. package/dist/request/index.js.map +0 -1
  580. package/dist/request/plugin/RequestPlugin.d.ts +0 -170
  581. package/dist/request/plugin/RequestPlugin.js +0 -203
  582. package/dist/request/plugin/RequestPlugin.js.map +0 -1
  583. package/dist/request/plugin/cache.d.ts +0 -33
  584. package/dist/request/plugin/cache.js +0 -264
  585. package/dist/request/plugin/cache.js.map +0 -1
  586. package/dist/request/plugin/csrfPlugin.d.ts +0 -21
  587. package/dist/request/plugin/csrfPlugin.js +0 -44
  588. package/dist/request/plugin/csrfPlugin.js.map +0 -1
  589. package/dist/request/plugin/index.d.ts +0 -11
  590. package/dist/request/plugin/index.js +0 -12
  591. package/dist/request/plugin/index.js.map +0 -1
  592. package/dist/request/plugin/monitoring.d.ts +0 -112
  593. package/dist/request/plugin/monitoring.js +0 -205
  594. package/dist/request/plugin/monitoring.js.map +0 -1
  595. package/dist/request/plugin/queue.d.ts +0 -91
  596. package/dist/request/plugin/queue.js +0 -156
  597. package/dist/request/plugin/queue.js.map +0 -1
  598. package/dist/request/plugin/retry.d.ts +0 -34
  599. package/dist/request/plugin/retry.js +0 -93
  600. package/dist/request/plugin/retry.js.map +0 -1
  601. package/dist/request/plugin/validation.d.ts +0 -26
  602. package/dist/request/plugin/validation.js +0 -116
  603. package/dist/request/plugin/validation.js.map +0 -1
  604. package/dist/request/plugin.d.ts +0 -1
  605. package/dist/request/runtime/RequestContext.d.ts +0 -50
  606. package/dist/request/runtime/RequestContext.js +0 -86
  607. package/dist/request/runtime/RequestContext.js.map +0 -1
  608. package/dist/request/runtime/index.d.ts +0 -4
  609. package/dist/request/runtime/index.js +0 -5
  610. package/dist/request/runtime/index.js.map +0 -1
  611. package/dist/request/runtime.d.ts +0 -1
  612. package/dist/request/types.d.ts +0 -1
  613. package/dist/request/types.js +0 -97
  614. package/dist/request/types.js.map +0 -1
  615. package/dist/request/utils/RequestQueueManager.d.ts +0 -74
  616. package/dist/request/utils/RequestQueueManager.js +0 -160
  617. package/dist/request/utils/RequestQueueManager.js.map +0 -1
  618. package/dist/request/utils/dependencyCheck.d.ts +0 -63
  619. package/dist/request/utils/dependencyCheck.js +0 -192
  620. package/dist/request/utils/dependencyCheck.js.map +0 -1
  621. package/dist/request/utils/index.d.ts +0 -5
  622. package/dist/request/utils/index.js +0 -6
  623. package/dist/request/utils/index.js.map +0 -1
  624. package/dist/request/utils.d.ts +0 -1
  625. package/dist/state/StateManager.cjs.map +0 -1
  626. package/dist/state/StateManager.js.map +0 -1
  627. package/dist/state/adapters/AdapterFactory.cjs.map +0 -1
  628. package/dist/state/adapters/AdapterFactory.js.map +0 -1
  629. package/dist/state/adapters/DefaultAdapter.cjs.map +0 -1
  630. package/dist/state/adapters/DefaultAdapter.js.map +0 -1
  631. package/dist/state/adapters/ReduxAdapter.cjs.map +0 -1
  632. package/dist/state/adapters/ReduxAdapter.js.map +0 -1
  633. package/dist/state/adapters/ZustandAdapter.cjs.map +0 -1
  634. package/dist/state/adapters/ZustandAdapter.js.map +0 -1
  635. package/dist/state/adapters/index.cjs.map +0 -1
  636. package/dist/state/adapters/index.js.map +0 -1
  637. package/dist/state/adapters/types.cjs.map +0 -1
  638. package/dist/state/adapters/types.js.map +0 -1
  639. package/dist/state/core/DerivedStateInstance.cjs.map +0 -1
  640. package/dist/state/core/DerivedStateInstance.js.map +0 -1
  641. package/dist/state/core/StateInstance.cjs.map +0 -1
  642. package/dist/state/core/StateInstance.js.map +0 -1
  643. package/dist/state/core/StateRegistry.cjs.map +0 -1
  644. package/dist/state/core/StateRegistry.js.map +0 -1
  645. package/dist/state/core/StateScope.cjs.map +0 -1
  646. package/dist/state/core/StateScope.js.map +0 -1
  647. package/dist/state/core/index.cjs.map +0 -1
  648. package/dist/state/core/index.js.map +0 -1
  649. package/dist/state/index.cjs.map +0 -1
  650. package/dist/state/index.js.map +0 -1
  651. package/dist/state/types.cjs.map +0 -1
  652. package/dist/state/types.js.map +0 -1
  653. package/dist/state.umd.js.map +0 -1
  654. package/dist/types.cjs.map +0 -1
  655. package/dist/types.js.map +0 -1
  656. package/dist/utils/analytics.cjs.map +0 -1
  657. package/dist/utils/analytics.js.map +0 -1
  658. package/dist/utils/configSecurity.cjs.map +0 -1
  659. package/dist/utils/configSecurity.js.map +0 -1
  660. package/dist/utils/csrf.cjs.map +0 -1
  661. package/dist/utils/csrf.js.map +0 -1
  662. package/dist/utils/errors/ErrorCodes.cjs.map +0 -1
  663. package/dist/utils/errors/ErrorCodes.js.map +0 -1
  664. package/dist/utils/errors.cjs.map +0 -1
  665. package/dist/utils/errors.js.map +0 -1
  666. package/dist/utils/index.cjs.map +0 -1
  667. package/dist/utils/index.js.map +0 -1
  668. package/dist/utils/logger.cjs.map +0 -1
  669. package/dist/utils/logger.js.map +0 -1
  670. package/dist/utils/logger.types.cjs.map +0 -1
  671. package/dist/utils/logger.types.js.map +0 -1
  672. package/dist/utils/monitoring.cjs.map +0 -1
  673. package/dist/utils/monitoring.js.map +0 -1
  674. package/dist/utils/performance.cjs.map +0 -1
  675. package/dist/utils/performance.js.map +0 -1
  676. package/dist/utils/resourceLoader.cjs.map +0 -1
  677. package/dist/utils/resourceLoader.js.map +0 -1
  678. package/dist/utils/runtimeSecurity.cjs.map +0 -1
  679. package/dist/utils/runtimeSecurity.js.map +0 -1
  680. package/dist/utils/security.cjs.map +0 -1
  681. package/dist/utils/security.js.map +0 -1
  682. package/dist/utils/traceId.cjs.map +0 -1
  683. package/dist/utils/traceId.js.map +0 -1
  684. package/dist/utils/validation.cjs.map +0 -1
  685. package/dist/utils/validation.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/AppConfig.ts"],"sourcesContent":["import type { LangType } from '../../library/locale/types';\nimport type { InitializationContext } from '../initialization';\nimport type { AppConfig, ThemeConfig } from '../app';\nimport type { UIProviderConfig } from '../types';\n\n/**\n * 应用配置单例\n * \n * 用于在非 React 代码中访问全局配置\n */\nclass AppConfigManager {\n private static instance: AppConfigManager | null = null;\n\n private _config: AppConfig;\n\n /**\n * 私有构造函数,防止外部直接实例化\n */\n private constructor() {\n this._config = {\n theme: { mode: 'light' },\n locale: 'zh-CN',\n };\n }\n\n /**\n * 获取单例实例\n * \n * @returns 单例实例\n */\n public static getInstance(): AppConfigManager {\n if (!AppConfigManager.instance) {\n AppConfigManager.instance = new AppConfigManager();\n }\n return AppConfigManager.instance;\n }\n\n /**\n * 初始化配置\n * \n * @param config - 应用配置\n */\n public initialize(config: Partial<AppConfig>): void {\n this._config = {\n theme: config.theme || { mode: 'light' },\n locale: config.locale || 'zh-CN',\n antdConfig: config.antdConfig,\n initializationContext: config.initializationContext,\n };\n }\n\n /**\n * 获取完整配置\n * \n * @returns 应用配置\n */\n public getConfig(): AppConfig {\n return { ...this._config };\n }\n\n /**\n * 获取主题配置\n * \n * @returns 主题配置\n */\n public getTheme(): ThemeConfig {\n return { ...this._config.theme };\n }\n\n /**\n * 更新主题配置\n * \n * @param theme - 主题配置或更新函数\n */\n public setTheme(theme: ThemeConfig | ((prev: ThemeConfig) => ThemeConfig)): void {\n if (typeof theme === 'function') {\n this._config.theme = theme(this._config.theme);\n } else {\n this._config.theme = { ...theme };\n }\n }\n\n /**\n * 获取当前语言\n * \n * @returns 当前语言\n */\n public getLocale(): LangType {\n return this._config.locale;\n }\n\n /**\n * 更新语言\n * \n * @param locale - 语言类型\n */\n public setLocale(locale: LangType): void {\n this._config.locale = locale;\n }\n\n /**\n * 获取 Ant Design 配置\n * \n * @returns Ant Design 配置\n */\n public getAntdConfig(): UIProviderConfig | undefined {\n return this._config.antdConfig;\n }\n\n /**\n * 更新 Ant Design 配置\n * \n * @param config - Ant Design 配置\n */\n public setAntdConfig(config: UIProviderConfig | undefined): void {\n this._config.antdConfig = config;\n }\n\n /**\n * 获取初始化上下文\n * \n * @returns 初始化上下文\n */\n public getInitializationContext(): InitializationContext | undefined {\n return this._config.initializationContext;\n }\n\n /**\n * 更新初始化上下文\n * \n * @param context - 初始化上下文\n */\n public setInitializationContext(context: InitializationContext | undefined): void {\n this._config.initializationContext = context;\n }\n}\n\n/**\n * 应用配置单例实例\n */\nexport const appConfig = AppConfigManager.getInstance();\n"],"names":["appConfig","AppConfigManager","getInstance","instance","initialize","config","_config","theme","mode","locale","antdConfig","initializationContext","getConfig","getTheme","setTheme","getLocale","setLocale","getAntdConfig","setAntdConfig","getInitializationContext","setInitializationContext","context"],"mappings":";;;;+BA4IaA;;;eAAAA;;;;;;;;;;;;;;;;AAvIb;;;;CAIC,GACD,IAAA,AAAMC,mBAAN,MAAMA;IAeF;;;;KAIC,GACD,OAAcC,cAAgC;QAC1C,IAAI,CAACD,iBAAiBE,QAAQ,EAAE;YAC5BF,iBAAiBE,QAAQ,GAAG,IAAIF;QACpC;QACA,OAAOA,iBAAiBE,QAAQ;IACpC;IAEA;;;;KAIC,GACD,AAAOC,WAAWC,MAA0B,EAAQ;QAChD,IAAI,CAACC,OAAO,GAAG;YACXC,OAAOF,OAAOE,KAAK,IAAI;gBAAEC,MAAM;YAAQ;YACvCC,QAAQJ,OAAOI,MAAM,IAAI;YACzBC,YAAYL,OAAOK,UAAU;YAC7BC,uBAAuBN,OAAOM,qBAAqB;QACvD;IACJ;IAEA;;;;KAIC,GACD,AAAOC,YAAuB;QAC1B,OAAO;YAAE,GAAG,IAAI,CAACN,OAAO;QAAC;IAC7B;IAEA;;;;KAIC,GACD,AAAOO,WAAwB;QAC3B,OAAO;YAAE,GAAG,IAAI,CAACP,OAAO,CAACC,KAAK;QAAC;IACnC;IAEA;;;;KAIC,GACD,AAAOO,SAASP,KAAyD,EAAQ;QAC7E,IAAI,OAAOA,UAAU,YAAY;YAC7B,IAAI,CAACD,OAAO,CAACC,KAAK,GAAGA,MAAM,IAAI,CAACD,OAAO,CAACC,KAAK;QACjD,OAAO;YACH,IAAI,CAACD,OAAO,CAACC,KAAK,GAAG;gBAAE,GAAGA,KAAK;YAAC;QACpC;IACJ;IAEA;;;;KAIC,GACD,AAAOQ,YAAsB;QACzB,OAAO,IAAI,CAACT,OAAO,CAACG,MAAM;IAC9B;IAEA;;;;KAIC,GACD,AAAOO,UAAUP,MAAgB,EAAQ;QACrC,IAAI,CAACH,OAAO,CAACG,MAAM,GAAGA;IAC1B;IAEA;;;;KAIC,GACD,AAAOQ,gBAA8C;QACjD,OAAO,IAAI,CAACX,OAAO,CAACI,UAAU;IAClC;IAEA;;;;KAIC,GACD,AAAOQ,cAAcb,MAAoC,EAAQ;QAC7D,IAAI,CAACC,OAAO,CAACI,UAAU,GAAGL;IAC9B;IAEA;;;;KAIC,GACD,AAAOc,2BAA8D;QACjE,OAAO,IAAI,CAACb,OAAO,CAACK,qBAAqB;IAC7C;IAEA;;;;KAIC,GACD,AAAOS,yBAAyBC,OAA0C,EAAQ;QAC9E,IAAI,CAACf,OAAO,CAACK,qBAAqB,GAAGU;IACzC;IAvHA;;KAEC,GACD,aAAsB;QALtB,uBAAQf,WAAR,KAAA;QAMI,IAAI,CAACA,OAAO,GAAG;YACXC,OAAO;gBAAEC,MAAM;YAAQ;YACvBC,QAAQ;QACZ;IACJ;AAgHJ;AA5HI,iBADER,kBACaE,YAAoC;AAiIhD,MAAMH,YAAYC,iBAAiBC,WAAW"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/AppConfig.ts"],"sourcesContent":["import type { LangType } from '../../library/locale/types';\nimport type { InitializationContext } from '../initialization';\nimport type { AppConfig, ThemeConfig } from '../app';\nimport type { UIProviderConfig } from '../types';\n\n/**\n * 应用配置单例\n * \n * 用于在非 React 代码中访问全局配置\n */\nclass AppConfigManager {\n private static instance: AppConfigManager | null = null;\n\n private _config: AppConfig;\n\n /**\n * 私有构造函数,防止外部直接实例化\n */\n private constructor() {\n this._config = {\n theme: { mode: 'light' },\n locale: 'zh-CN',\n };\n }\n\n /**\n * 获取单例实例\n * \n * @returns 单例实例\n */\n public static getInstance(): AppConfigManager {\n if (!AppConfigManager.instance) {\n AppConfigManager.instance = new AppConfigManager();\n }\n return AppConfigManager.instance;\n }\n\n /**\n * 初始化配置\n * \n * @param config - 应用配置\n */\n public initialize(config: Partial<AppConfig>): void {\n this._config = {\n theme: config.theme || { mode: 'light' },\n locale: config.locale || 'zh-CN',\n antdConfig: config.antdConfig,\n initializationContext: config.initializationContext,\n };\n }\n\n /**\n * 获取完整配置\n * \n * @returns 应用配置\n */\n public getConfig(): AppConfig {\n return { ...this._config };\n }\n\n /**\n * 获取主题配置\n * \n * @returns 主题配置\n */\n public getTheme(): ThemeConfig {\n return { ...this._config.theme };\n }\n\n /**\n * 更新主题配置\n * \n * @param theme - 主题配置或更新函数\n */\n public setTheme(theme: ThemeConfig | ((prev: ThemeConfig) => ThemeConfig)): void {\n if (typeof theme === 'function') {\n this._config.theme = theme(this._config.theme);\n } else {\n this._config.theme = { ...theme };\n }\n }\n\n /**\n * 获取当前语言\n * \n * @returns 当前语言\n */\n public getLocale(): LangType {\n return this._config.locale;\n }\n\n /**\n * 更新语言\n * \n * @param locale - 语言类型\n */\n public setLocale(locale: LangType): void {\n this._config.locale = locale;\n }\n\n /**\n * 获取 Ant Design 配置\n * \n * @returns Ant Design 配置\n */\n public getAntdConfig(): UIProviderConfig | undefined {\n return this._config.antdConfig;\n }\n\n /**\n * 更新 Ant Design 配置\n * \n * @param config - Ant Design 配置\n */\n public setAntdConfig(config: UIProviderConfig | undefined): void {\n this._config.antdConfig = config;\n }\n\n /**\n * 获取初始化上下文\n * \n * @returns 初始化上下文\n */\n public getInitializationContext(): InitializationContext | undefined {\n return this._config.initializationContext;\n }\n\n /**\n * 更新初始化上下文\n * \n * @param context - 初始化上下文\n */\n public setInitializationContext(context: InitializationContext | undefined): void {\n this._config.initializationContext = context;\n }\n}\n\n/**\n * 应用配置单例实例\n */\nexport const appConfig = AppConfigManager.getInstance();\n"],"names":["AppConfigManager","getInstance","instance","initialize","config","_config","theme","mode","locale","antdConfig","initializationContext","getConfig","getTheme","setTheme","getLocale","setLocale","getAntdConfig","setAntdConfig","getInitializationContext","setInitializationContext","context","appConfig"],"mappings":";;;;;;;;;;;;;AAKA;;;;CAIC,GACD,IAAA,AAAMA,mBAAN,MAAMA;IAeF;;;;KAIC,GACD,OAAcC,cAAgC;QAC1C,IAAI,CAACD,iBAAiBE,QAAQ,EAAE;YAC5BF,iBAAiBE,QAAQ,GAAG,IAAIF;QACpC;QACA,OAAOA,iBAAiBE,QAAQ;IACpC;IAEA;;;;KAIC,GACD,AAAOC,WAAWC,MAA0B,EAAQ;QAChD,IAAI,CAACC,OAAO,GAAG;YACXC,OAAOF,OAAOE,KAAK,IAAI;gBAAEC,MAAM;YAAQ;YACvCC,QAAQJ,OAAOI,MAAM,IAAI;YACzBC,YAAYL,OAAOK,UAAU;YAC7BC,uBAAuBN,OAAOM,qBAAqB;QACvD;IACJ;IAEA;;;;KAIC,GACD,AAAOC,YAAuB;QAC1B,OAAO;YAAE,GAAG,IAAI,CAACN,OAAO;QAAC;IAC7B;IAEA;;;;KAIC,GACD,AAAOO,WAAwB;QAC3B,OAAO;YAAE,GAAG,IAAI,CAACP,OAAO,CAACC,KAAK;QAAC;IACnC;IAEA;;;;KAIC,GACD,AAAOO,SAASP,KAAyD,EAAQ;QAC7E,IAAI,OAAOA,UAAU,YAAY;YAC7B,IAAI,CAACD,OAAO,CAACC,KAAK,GAAGA,MAAM,IAAI,CAACD,OAAO,CAACC,KAAK;QACjD,OAAO;YACH,IAAI,CAACD,OAAO,CAACC,KAAK,GAAG;gBAAE,GAAGA,KAAK;YAAC;QACpC;IACJ;IAEA;;;;KAIC,GACD,AAAOQ,YAAsB;QACzB,OAAO,IAAI,CAACT,OAAO,CAACG,MAAM;IAC9B;IAEA;;;;KAIC,GACD,AAAOO,UAAUP,MAAgB,EAAQ;QACrC,IAAI,CAACH,OAAO,CAACG,MAAM,GAAGA;IAC1B;IAEA;;;;KAIC,GACD,AAAOQ,gBAA8C;QACjD,OAAO,IAAI,CAACX,OAAO,CAACI,UAAU;IAClC;IAEA;;;;KAIC,GACD,AAAOQ,cAAcb,MAAoC,EAAQ;QAC7D,IAAI,CAACC,OAAO,CAACI,UAAU,GAAGL;IAC9B;IAEA;;;;KAIC,GACD,AAAOc,2BAA8D;QACjE,OAAO,IAAI,CAACb,OAAO,CAACK,qBAAqB;IAC7C;IAEA;;;;KAIC,GACD,AAAOS,yBAAyBC,OAA0C,EAAQ;QAC9E,IAAI,CAACf,OAAO,CAACK,qBAAqB,GAAGU;IACzC;IAvHA;;KAEC,GACD,aAAsB;QALtB,uBAAQf,WAAR,KAAA;QAMI,IAAI,CAACA,OAAO,GAAG;YACXC,OAAO;gBAAEC,MAAM;YAAQ;YACvBC,QAAQ;QACZ;IACJ;AAgHJ;AA5HI,iBADER,kBACaE,YAAoC;AA8HvD;;CAEC,GACD,OAAO,MAAMmB,YAAYrB,iBAAiBC,WAAW,GAAG"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/ConfigLoader.ts"],"sourcesContent":["/**\n * 配置文件加载模块\n * 支持从JSON/YAML文件加载配置\n * 优化:支持环境变量配置、配置热更新\n */\n\nimport { logger } from '@vlian/logger';\nimport type { StartOptions } from '../types';\n\n/**\n * 配置文件格式\n */\nexport enum ConfigFileFormat {\n JSON = 'json',\n YAML = 'yaml',\n}\n\n/**\n * 配置文件加载选项\n */\nexport interface ConfigFileLoadOptions {\n /**\n * 配置文件路径\n */\n path?: string;\n\n /**\n * 配置文件格式\n */\n format?: ConfigFileFormat;\n\n /**\n * 是否必需(如果为false,文件不存在时不报错)\n */\n required?: boolean;\n\n /**\n * 默认配置(文件不存在时使用)\n */\n defaultConfig?: Partial<StartOptions>;\n}\n\n/**\n * 配置变更监听器\n */\nexport type ConfigChangeListener = (newConfig: Partial<StartOptions>, oldConfig: Partial<StartOptions>) => void;\n\n/**\n * 配置变更通知管理器\n */\nclass ConfigChangeNotifier {\n private listeners: Set<ConfigChangeListener> = new Set();\n\n /**\n * 添加配置变更监听器\n */\n addListener(listener: ConfigChangeListener): () => void {\n this.listeners.add(listener);\n // 返回取消监听的函数\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * 移除配置变更监听器\n */\n removeListener(listener: ConfigChangeListener): void {\n this.listeners.delete(listener);\n }\n\n /**\n * 通知配置变更\n */\n notify(newConfig: Partial<StartOptions>, oldConfig: Partial<StartOptions>): void {\n this.listeners.forEach((listener) => {\n try {\n listener(newConfig, oldConfig);\n } catch (error) {\n logger.warn('配置变更监听器执行失败:', error);\n }\n });\n }\n\n /**\n * 清除所有监听器\n */\n clear(): void {\n this.listeners.clear();\n }\n}\n\n/**\n * 全局配置变更通知器实例\n */\nconst configChangeNotifier = new ConfigChangeNotifier();\n\n/**\n * 配置加载器\n */\nexport class ConfigLoader {\n /**\n * 从JSON文件加载配置\n * \n * @param path - 文件路径\n * @returns 配置对象\n */\n static async loadFromJSON(path: string): Promise<Partial<StartOptions>> {\n try {\n // 在浏览器环境中,需要通过网络请求加载\n if (typeof window !== 'undefined') {\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`无法加载配置文件: ${path} (${response.status})`);\n }\n return await response.json();\n }\n\n // 在Node.js环境中,使用fs模块\n if (typeof require !== 'undefined') {\n const fs = require('fs');\n const content = fs.readFileSync(path, 'utf-8');\n return JSON.parse(content);\n }\n\n throw new Error('不支持的环境:无法加载配置文件');\n } catch (error) {\n logger.error(`加载JSON配置文件失败: ${path}`, error);\n throw error;\n }\n }\n\n /**\n * 从YAML文件加载配置\n * \n * @param path - 文件路径\n * @returns 配置对象\n */\n static async loadFromYAML(path: string): Promise<Partial<StartOptions>> {\n try {\n // 在浏览器环境中,需要通过网络请求加载\n if (typeof window !== 'undefined') {\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`无法加载配置文件: ${path} (${response.status})`);\n }\n const text = await response.text();\n \n // 需要YAML解析库,这里假设有yaml库\n // 如果没有,可以提示用户安装\n if (typeof (window as any).YAML !== 'undefined') {\n return (window as any).YAML.parse(text);\n }\n \n // 降级:尝试作为JSON解析(如果YAML格式简单)\n try {\n return JSON.parse(text);\n } catch {\n throw new Error('需要YAML解析库,请安装 yaml 包');\n }\n }\n\n // 在Node.js环境中,使用fs模块和yaml库\n if (typeof require !== 'undefined') {\n const fs = require('fs');\n const yaml = require('yaml');\n const content = fs.readFileSync(path, 'utf-8');\n return yaml.parse(content);\n }\n\n throw new Error('不支持的环境:无法加载配置文件');\n } catch (error) {\n logger.error(`加载YAML配置文件失败: ${path}`, error);\n throw error;\n }\n }\n\n /**\n * 从文件加载配置\n * \n * @param options - 加载选项\n * @returns 配置对象\n */\n static async loadFromFile(\n options: ConfigFileLoadOptions\n ): Promise<Partial<StartOptions>> {\n const {\n path,\n format = ConfigFileFormat.JSON,\n required = false,\n defaultConfig = {},\n } = options;\n\n if (!path) {\n if (required) {\n throw new Error('配置文件路径未指定');\n }\n return defaultConfig;\n }\n\n try {\n let config: Partial<StartOptions>;\n\n switch (format) {\n case ConfigFileFormat.JSON:\n config = await this.loadFromJSON(path);\n break;\n case ConfigFileFormat.YAML:\n config = await this.loadFromYAML(path);\n break;\n default:\n throw new Error(`不支持的配置文件格式: ${format}`);\n }\n\n logger.info(`成功加载配置文件: ${path}`);\n return config;\n } catch (error) {\n if (required) {\n throw error;\n }\n\n logger.warn(`配置文件加载失败,使用默认配置: ${path}`, error);\n return defaultConfig;\n }\n }\n\n /**\n * 合并配置(深度合并)\n * \n * @param base - 基础配置\n * @param override - 覆盖配置\n * @returns 合并后的配置\n */\n static mergeConfig(\n base: Partial<StartOptions>,\n override: Partial<StartOptions>\n ): Partial<StartOptions> {\n const merged = { ...base };\n\n for (const key in override) {\n if (!Object.prototype.hasOwnProperty.call(override, key)) {\n continue;\n }\n\n const baseValue = (merged as Record<string, unknown>)[key];\n const overrideValue = (override as Record<string, unknown>)[key];\n\n if (\n baseValue &&\n overrideValue &&\n typeof baseValue === 'object' &&\n typeof overrideValue === 'object' &&\n !Array.isArray(baseValue) &&\n !Array.isArray(overrideValue)\n ) {\n // 深度合并对象\n (merged as Record<string, unknown>)[key] = this.mergeConfig(\n baseValue as Partial<StartOptions>,\n overrideValue as Partial<StartOptions>\n );\n } else {\n // 直接覆盖\n (merged as Record<string, unknown>)[key] = overrideValue;\n }\n }\n\n return merged;\n }\n\n /**\n * 从多个源加载并合并配置\n * \n * @param sources - 配置源列表(按优先级从低到高)\n * @returns 合并后的配置\n */\n static async loadFromMultipleSources(\n sources: Array<Partial<StartOptions> | ConfigFileLoadOptions>\n ): Promise<Partial<StartOptions>> {\n let merged: Partial<StartOptions> = {};\n\n for (const source of sources) {\n if ('path' in source && 'format' in source) {\n // 配置文件\n const fileConfig = await this.loadFromFile(source);\n merged = this.mergeConfig(merged, fileConfig);\n } else if (!('path' in source) && !('format' in source)) {\n // 配置对象\n merged = this.mergeConfig(merged, source as Partial<StartOptions>);\n }\n }\n\n return merged;\n }\n\n /**\n * 从环境变量加载配置\n * \n * 支持以下环境变量格式:\n * - FRAMEWORK_LOGGER_LEVEL=DEBUG\n * - FRAMEWORK_SHOW_SPLASH_SCREEN=always\n * - FRAMEWORK_MIN_SPLASH_SCREEN_TIME=1000\n * \n * @param prefix - 环境变量前缀,默认为 'FRAMEWORK_'\n * @returns 配置对象\n */\n static loadFromEnv(prefix: string = 'FRAMEWORK_'): Partial<StartOptions> {\n const config: Partial<StartOptions> = {};\n\n if (typeof process === 'undefined' || !process.env) {\n return config;\n }\n\n // 遍历所有环境变量\n for (const [key, value] of Object.entries(process.env)) {\n if (!key.startsWith(prefix)) {\n continue;\n }\n\n // 移除前缀并转换为驼峰命名\n const configKey = key\n .slice(prefix.length)\n .toLowerCase()\n .split('_')\n .map((part, index) => \n index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)\n )\n .join('');\n\n // 尝试解析值\n let parsedValue: unknown = value;\n if (value === 'true' || value === 'false') {\n parsedValue = value === 'true';\n } else if (!isNaN(Number(value))) {\n parsedValue = Number(value);\n } else if (value?.startsWith('{') || value?.startsWith('[')) {\n try {\n parsedValue = JSON.parse(value);\n } catch {\n // 解析失败,使用原始值\n }\n }\n\n // 设置配置值\n (config as any)[configKey] = parsedValue;\n }\n\n logger.debug('从环境变量加载配置:', config);\n return config;\n }\n\n /**\n * 从多个源加载配置(包括环境变量)\n * \n * 优化:明确优先级,从低到高:\n * 1. 默认配置\n * 2. 配置文件\n * 3. 环境变量\n * 4. 代码配置(通过 sources 参数传入)\n * \n * @param sources - 配置源列表(代码配置,优先级最高)\n * @param defaultConfig - 默认配置(优先级最低)\n * @param includeEnv - 是否包含环境变量,默认为 true\n * @param envPrefix - 环境变量前缀,默认为 'FRAMEWORK_'\n * @returns 合并后的配置\n */\n static async loadFromAllSources(\n sources: Array<Partial<StartOptions> | ConfigFileLoadOptions> = [],\n defaultConfig: Partial<StartOptions> = {},\n includeEnv: boolean = true,\n envPrefix: string = 'FRAMEWORK_'\n ): Promise<Partial<StartOptions>> {\n // 保存旧配置用于变更通知\n const oldConfig: Partial<StartOptions> = { ...defaultConfig };\n\n // 1. 从默认配置开始\n let merged: Partial<StartOptions> = { ...defaultConfig };\n\n // 2. 加载配置文件(优先级高于默认配置)\n const fileConfigs = await this.loadFromMultipleSources(sources.filter(\n (source): source is ConfigFileLoadOptions => \n typeof source === 'object' && 'path' in source\n ));\n merged = this.mergeConfig(merged, fileConfigs);\n\n // 3. 加载环境变量(优先级高于配置文件)\n if (includeEnv) {\n const envConfig = this.loadFromEnv(envPrefix);\n merged = this.mergeConfig(merged, envConfig);\n }\n\n // 4. 合并代码配置(优先级最高)\n const codeConfigs = sources.filter(\n (source): source is Partial<StartOptions> => \n typeof source === 'object' && !('path' in source)\n );\n for (const codeConfig of codeConfigs) {\n merged = this.mergeConfig(merged, codeConfig);\n }\n\n // 通知配置变更\n configChangeNotifier.notify(merged, oldConfig);\n\n return merged;\n }\n\n /**\n * 添加配置变更监听器\n * \n * @param listener - 配置变更监听器\n * @returns 取消监听的函数\n */\n static onConfigChange(listener: ConfigChangeListener): () => void {\n return configChangeNotifier.addListener(listener);\n }\n\n /**\n * 移除配置变更监听器\n */\n static removeConfigChangeListener(listener: ConfigChangeListener): void {\n configChangeNotifier.removeListener(listener);\n }\n}\n"],"names":["ConfigFileFormat","ConfigLoader","ConfigChangeNotifier","addListener","listener","listeners","add","delete","removeListener","notify","newConfig","oldConfig","forEach","error","logger","warn","clear","Set","configChangeNotifier","loadFromJSON","path","window","response","fetch","ok","Error","status","json","require","fs","content","readFileSync","JSON","parse","loadFromYAML","text","YAML","yaml","loadFromFile","options","format","required","defaultConfig","config","info","mergeConfig","base","override","merged","key","Object","prototype","hasOwnProperty","call","baseValue","overrideValue","Array","isArray","loadFromMultipleSources","sources","source","fileConfig","loadFromEnv","prefix","process","env","value","entries","startsWith","configKey","slice","length","toLowerCase","split","map","part","index","charAt","toUpperCase","join","parsedValue","isNaN","Number","debug","loadFromAllSources","includeEnv","envPrefix","fileConfigs","filter","envConfig","codeConfigs","codeConfig","onConfigChange","removeConfigChangeListener"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/ConfigLoader.ts"],"sourcesContent":["/**\n * 配置文件加载模块\n * 支持从JSON/YAML文件加载配置\n * 优化:支持环境变量配置、配置热更新\n */\n\nimport { logger } from '@vlian/logger';\nimport type { StartOptions } from '../types';\n\n/**\n * 配置文件格式\n */\nexport enum ConfigFileFormat {\n JSON = 'json',\n YAML = 'yaml',\n}\n\n/**\n * 配置文件加载选项\n */\nexport interface ConfigFileLoadOptions {\n /**\n * 配置文件路径\n */\n path?: string;\n\n /**\n * 配置文件格式\n */\n format?: ConfigFileFormat;\n\n /**\n * 是否必需(如果为false,文件不存在时不报错)\n */\n required?: boolean;\n\n /**\n * 默认配置(文件不存在时使用)\n */\n defaultConfig?: Partial<StartOptions>;\n}\n\n/**\n * 配置变更监听器\n */\nexport type ConfigChangeListener = (newConfig: Partial<StartOptions>, oldConfig: Partial<StartOptions>) => void;\n\n/**\n * 配置变更通知管理器\n */\nclass ConfigChangeNotifier {\n private listeners: Set<ConfigChangeListener> = new Set();\n\n /**\n * 添加配置变更监听器\n */\n addListener(listener: ConfigChangeListener): () => void {\n this.listeners.add(listener);\n // 返回取消监听的函数\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n /**\n * 移除配置变更监听器\n */\n removeListener(listener: ConfigChangeListener): void {\n this.listeners.delete(listener);\n }\n\n /**\n * 通知配置变更\n */\n notify(newConfig: Partial<StartOptions>, oldConfig: Partial<StartOptions>): void {\n this.listeners.forEach((listener) => {\n try {\n listener(newConfig, oldConfig);\n } catch (error) {\n logger.warn('配置变更监听器执行失败:', error);\n }\n });\n }\n\n /**\n * 清除所有监听器\n */\n clear(): void {\n this.listeners.clear();\n }\n}\n\n/**\n * 全局配置变更通知器实例\n */\nconst configChangeNotifier = new ConfigChangeNotifier();\n\n/**\n * 配置加载器\n */\nexport class ConfigLoader {\n /**\n * 从JSON文件加载配置\n * \n * @param path - 文件路径\n * @returns 配置对象\n */\n static async loadFromJSON(path: string): Promise<Partial<StartOptions>> {\n try {\n // 在浏览器环境中,需要通过网络请求加载\n if (typeof window !== 'undefined') {\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`无法加载配置文件: ${path} (${response.status})`);\n }\n return await response.json();\n }\n\n // 在Node.js环境中,使用fs模块\n if (typeof require !== 'undefined') {\n const fs = require('fs');\n const content = fs.readFileSync(path, 'utf-8');\n return JSON.parse(content);\n }\n\n throw new Error('不支持的环境:无法加载配置文件');\n } catch (error) {\n logger.error(`加载JSON配置文件失败: ${path}`, error);\n throw error;\n }\n }\n\n /**\n * 从YAML文件加载配置\n * \n * @param path - 文件路径\n * @returns 配置对象\n */\n static async loadFromYAML(path: string): Promise<Partial<StartOptions>> {\n try {\n // 在浏览器环境中,需要通过网络请求加载\n if (typeof window !== 'undefined') {\n const response = await fetch(path);\n if (!response.ok) {\n throw new Error(`无法加载配置文件: ${path} (${response.status})`);\n }\n const text = await response.text();\n \n // 需要YAML解析库,这里假设有yaml库\n // 如果没有,可以提示用户安装\n if (typeof (window as any).YAML !== 'undefined') {\n return (window as any).YAML.parse(text);\n }\n \n // 降级:尝试作为JSON解析(如果YAML格式简单)\n try {\n return JSON.parse(text);\n } catch {\n throw new Error('需要YAML解析库,请安装 yaml 包');\n }\n }\n\n // 在Node.js环境中,使用fs模块和yaml库\n if (typeof require !== 'undefined') {\n const fs = require('fs');\n const yaml = require('yaml');\n const content = fs.readFileSync(path, 'utf-8');\n return yaml.parse(content);\n }\n\n throw new Error('不支持的环境:无法加载配置文件');\n } catch (error) {\n logger.error(`加载YAML配置文件失败: ${path}`, error);\n throw error;\n }\n }\n\n /**\n * 从文件加载配置\n * \n * @param options - 加载选项\n * @returns 配置对象\n */\n static async loadFromFile(\n options: ConfigFileLoadOptions\n ): Promise<Partial<StartOptions>> {\n const {\n path,\n format = ConfigFileFormat.JSON,\n required = false,\n defaultConfig = {},\n } = options;\n\n if (!path) {\n if (required) {\n throw new Error('配置文件路径未指定');\n }\n return defaultConfig;\n }\n\n try {\n let config: Partial<StartOptions>;\n\n switch (format) {\n case ConfigFileFormat.JSON:\n config = await this.loadFromJSON(path);\n break;\n case ConfigFileFormat.YAML:\n config = await this.loadFromYAML(path);\n break;\n default:\n throw new Error(`不支持的配置文件格式: ${format}`);\n }\n\n logger.info(`成功加载配置文件: ${path}`);\n return config;\n } catch (error) {\n if (required) {\n throw error;\n }\n\n logger.warn(`配置文件加载失败,使用默认配置: ${path}`, error);\n return defaultConfig;\n }\n }\n\n /**\n * 合并配置(深度合并)\n * \n * @param base - 基础配置\n * @param override - 覆盖配置\n * @returns 合并后的配置\n */\n static mergeConfig(\n base: Partial<StartOptions>,\n override: Partial<StartOptions>\n ): Partial<StartOptions> {\n const merged = { ...base };\n\n for (const key in override) {\n if (!Object.prototype.hasOwnProperty.call(override, key)) {\n continue;\n }\n\n const baseValue = (merged as Record<string, unknown>)[key];\n const overrideValue = (override as Record<string, unknown>)[key];\n\n if (\n baseValue &&\n overrideValue &&\n typeof baseValue === 'object' &&\n typeof overrideValue === 'object' &&\n !Array.isArray(baseValue) &&\n !Array.isArray(overrideValue)\n ) {\n // 深度合并对象\n (merged as Record<string, unknown>)[key] = this.mergeConfig(\n baseValue as Partial<StartOptions>,\n overrideValue as Partial<StartOptions>\n );\n } else {\n // 直接覆盖\n (merged as Record<string, unknown>)[key] = overrideValue;\n }\n }\n\n return merged;\n }\n\n /**\n * 从多个源加载并合并配置\n * \n * @param sources - 配置源列表(按优先级从低到高)\n * @returns 合并后的配置\n */\n static async loadFromMultipleSources(\n sources: Array<Partial<StartOptions> | ConfigFileLoadOptions>\n ): Promise<Partial<StartOptions>> {\n let merged: Partial<StartOptions> = {};\n\n for (const source of sources) {\n if ('path' in source && 'format' in source) {\n // 配置文件\n const fileConfig = await this.loadFromFile(source);\n merged = this.mergeConfig(merged, fileConfig);\n } else if (!('path' in source) && !('format' in source)) {\n // 配置对象\n merged = this.mergeConfig(merged, source as Partial<StartOptions>);\n }\n }\n\n return merged;\n }\n\n /**\n * 从环境变量加载配置\n * \n * 支持以下环境变量格式:\n * - FRAMEWORK_LOGGER_LEVEL=DEBUG\n * - FRAMEWORK_SHOW_SPLASH_SCREEN=always\n * - FRAMEWORK_MIN_SPLASH_SCREEN_TIME=1000\n * \n * @param prefix - 环境变量前缀,默认为 'FRAMEWORK_'\n * @returns 配置对象\n */\n static loadFromEnv(prefix: string = 'FRAMEWORK_'): Partial<StartOptions> {\n const config: Partial<StartOptions> = {};\n\n if (typeof process === 'undefined' || !process.env) {\n return config;\n }\n\n // 遍历所有环境变量\n for (const [key, value] of Object.entries(process.env)) {\n if (!key.startsWith(prefix)) {\n continue;\n }\n\n // 移除前缀并转换为驼峰命名\n const configKey = key\n .slice(prefix.length)\n .toLowerCase()\n .split('_')\n .map((part, index) => \n index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)\n )\n .join('');\n\n // 尝试解析值\n let parsedValue: unknown = value;\n if (value === 'true' || value === 'false') {\n parsedValue = value === 'true';\n } else if (!isNaN(Number(value))) {\n parsedValue = Number(value);\n } else if (value?.startsWith('{') || value?.startsWith('[')) {\n try {\n parsedValue = JSON.parse(value);\n } catch {\n // 解析失败,使用原始值\n }\n }\n\n // 设置配置值\n (config as any)[configKey] = parsedValue;\n }\n\n logger.debug('从环境变量加载配置:', config);\n return config;\n }\n\n /**\n * 从多个源加载配置(包括环境变量)\n * \n * 优化:明确优先级,从低到高:\n * 1. 默认配置\n * 2. 配置文件\n * 3. 环境变量\n * 4. 代码配置(通过 sources 参数传入)\n * \n * @param sources - 配置源列表(代码配置,优先级最高)\n * @param defaultConfig - 默认配置(优先级最低)\n * @param includeEnv - 是否包含环境变量,默认为 true\n * @param envPrefix - 环境变量前缀,默认为 'FRAMEWORK_'\n * @returns 合并后的配置\n */\n static async loadFromAllSources(\n sources: Array<Partial<StartOptions> | ConfigFileLoadOptions> = [],\n defaultConfig: Partial<StartOptions> = {},\n includeEnv: boolean = true,\n envPrefix: string = 'FRAMEWORK_'\n ): Promise<Partial<StartOptions>> {\n // 保存旧配置用于变更通知\n const oldConfig: Partial<StartOptions> = { ...defaultConfig };\n\n // 1. 从默认配置开始\n let merged: Partial<StartOptions> = { ...defaultConfig };\n\n // 2. 加载配置文件(优先级高于默认配置)\n const fileConfigs = await this.loadFromMultipleSources(sources.filter(\n (source): source is ConfigFileLoadOptions => \n typeof source === 'object' && 'path' in source\n ));\n merged = this.mergeConfig(merged, fileConfigs);\n\n // 3. 加载环境变量(优先级高于配置文件)\n if (includeEnv) {\n const envConfig = this.loadFromEnv(envPrefix);\n merged = this.mergeConfig(merged, envConfig);\n }\n\n // 4. 合并代码配置(优先级最高)\n const codeConfigs = sources.filter(\n (source): source is Partial<StartOptions> => \n typeof source === 'object' && !('path' in source)\n );\n for (const codeConfig of codeConfigs) {\n merged = this.mergeConfig(merged, codeConfig);\n }\n\n // 通知配置变更\n configChangeNotifier.notify(merged, oldConfig);\n\n return merged;\n }\n\n /**\n * 添加配置变更监听器\n * \n * @param listener - 配置变更监听器\n * @returns 取消监听的函数\n */\n static onConfigChange(listener: ConfigChangeListener): () => void {\n return configChangeNotifier.addListener(listener);\n }\n\n /**\n * 移除配置变更监听器\n */\n static removeConfigChangeListener(listener: ConfigChangeListener): void {\n configChangeNotifier.removeListener(listener);\n }\n}\n"],"names":["logger","ConfigFileFormat","ConfigChangeNotifier","addListener","listener","listeners","add","delete","removeListener","notify","newConfig","oldConfig","forEach","error","warn","clear","Set","configChangeNotifier","ConfigLoader","loadFromJSON","path","window","response","fetch","ok","Error","status","json","require","fs","content","readFileSync","JSON","parse","loadFromYAML","text","YAML","yaml","loadFromFile","options","format","required","defaultConfig","config","info","mergeConfig","base","override","merged","key","Object","prototype","hasOwnProperty","call","baseValue","overrideValue","Array","isArray","loadFromMultipleSources","sources","source","fileConfig","loadFromEnv","prefix","process","env","value","entries","startsWith","configKey","slice","length","toLowerCase","split","map","part","index","charAt","toUpperCase","join","parsedValue","isNaN","Number","debug","loadFromAllSources","includeEnv","envPrefix","fileConfigs","filter","envConfig","codeConfigs","codeConfig","onConfigChange","removeConfigChangeListener"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/ConfigValidator.ts"],"sourcesContent":["/**\n * 配置验证模块\n * 使用Zod进行配置验证\n */\n\nimport { z } from 'zod';\n\n/**\n * 配置验证错误\n */\nexport class ConfigValidationError extends Error {\n constructor(\n message: string,\n public readonly errors: z.ZodError\n ) {\n super(message);\n this.name = 'ConfigValidationError';\n }\n}\n\n/**\n * 配置验证器\n */\nexport class ConfigValidator {\n /**\n * 验证配置\n * \n * @param config - 要验证的配置\n * @param schema - Zod模式\n * @returns 验证后的配置\n * @throws ConfigValidationError 如果配置验证失败\n */\n static validate<T>(\n config: unknown,\n schema: z.ZodSchema<T>\n ): T {\n const result = schema.safeParse(config);\n\n if (!result.success) {\n throw new ConfigValidationError(\n '配置验证失败',\n result.error\n );\n }\n\n return result.data;\n }\n\n /**\n * 安全验证配置(不抛出异常)\n * \n * @param config - 要验证的配置\n * @param schema - Zod模式\n * @returns 验证结果\n */\n static safeValidate<T>(\n config: unknown,\n schema: z.ZodSchema<T>\n ): { success: true; data: T } | { success: false; error: z.ZodError } {\n const result = schema.safeParse(config);\n\n if (result.success) {\n return { success: true, data: result.data };\n }\n\n return { success: false, error: result.error };\n }\n\n /**\n * 创建StartOptions的部分验证模式\n * 注意:这是一个基础模式,可以根据需要扩展\n */\n static createStartOptionsSchema() {\n return z.object({\n loggerLevel: z.enum(['DEBUG', 'INFO', 'WARN', 'ERROR']).optional(),\n showSplashScreen: z.enum(['auto', 'always', 'never', 'first-time-only']).optional(),\n minSplashScreenTime: z.number().positive().optional(),\n security: z.object({\n enableXSSProtection: z.boolean().optional(),\n validateConfig: z.boolean().optional(),\n sanitizeUserInput: z.boolean().optional(),\n csp: z.object({\n defaultSrc: z.array(z.string()).optional(),\n scriptSrc: z.array(z.string()).optional(),\n styleSrc: z.array(z.string()).optional(),\n imgSrc: z.array(z.string()).optional(),\n connectSrc: z.array(z.string()).optional(),\n fontSrc: z.array(z.string()).optional(),\n frameSrc: z.array(z.string()).optional(),\n allowUnsafeInline: z.boolean().optional(),\n allowUnsafeEval: z.boolean().optional(),\n }).optional(),\n }).optional(),\n }).passthrough(); // passthrough允许其他字段通过\n }\n\n /**\n * 验证配置并提供友好的错误信息\n * \n * @param config - 要验证的配置\n * @param schema - Zod模式\n * @returns 验证后的配置\n * @throws ConfigValidationError 如果配置验证失败,包含详细的错误信息\n */\n static validateWithFriendlyErrors<T>(\n config: unknown,\n schema: z.ZodSchema<T>\n ): T {\n const result = schema.safeParse(config);\n\n if (!result.success) {\n // 构建友好的错误信息\n // 注意:ZodError 使用 issues 属性,不是 errors\n const errorMessages = result.error.issues.map((issue: z.ZodIssue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : 'root';\n return `配置项 \"${path}\": ${issue.message}`;\n });\n\n const friendlyMessage = `配置验证失败:\\n${errorMessages.join('\\n')}`;\n\n throw new ConfigValidationError(friendlyMessage, result.error);\n }\n\n return result.data;\n }\n}\n"],"names":["ConfigValidationError","ConfigValidator","Error","message","errors","name","validate","config","schema","result","safeParse","success","error","data","safeValidate","createStartOptionsSchema","z","object","loggerLevel","enum","optional","showSplashScreen","minSplashScreenTime","number","positive","security","enableXSSProtection","boolean","validateConfig","sanitizeUserInput","csp","defaultSrc","array","string","scriptSrc","styleSrc","imgSrc","connectSrc","fontSrc","frameSrc","allowUnsafeInline","allowUnsafeEval","passthrough","validateWithFriendlyErrors","errorMessages","issues","map","issue","path","length","join","friendlyMessage"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/ConfigValidator.ts"],"sourcesContent":["/**\n * 配置验证模块\n * 使用Zod进行配置验证\n */\n\nimport { z } from 'zod';\n\n/**\n * 配置验证错误\n */\nexport class ConfigValidationError extends Error {\n constructor(\n message: string,\n public readonly errors: z.ZodError\n ) {\n super(message);\n this.name = 'ConfigValidationError';\n }\n}\n\n/**\n * 配置验证器\n */\nexport class ConfigValidator {\n /**\n * 验证配置\n * \n * @param config - 要验证的配置\n * @param schema - Zod模式\n * @returns 验证后的配置\n * @throws ConfigValidationError 如果配置验证失败\n */\n static validate<T>(\n config: unknown,\n schema: z.ZodSchema<T>\n ): T {\n const result = schema.safeParse(config);\n\n if (!result.success) {\n throw new ConfigValidationError(\n '配置验证失败',\n result.error\n );\n }\n\n return result.data;\n }\n\n /**\n * 安全验证配置(不抛出异常)\n * \n * @param config - 要验证的配置\n * @param schema - Zod模式\n * @returns 验证结果\n */\n static safeValidate<T>(\n config: unknown,\n schema: z.ZodSchema<T>\n ): { success: true; data: T } | { success: false; error: z.ZodError } {\n const result = schema.safeParse(config);\n\n if (result.success) {\n return { success: true, data: result.data };\n }\n\n return { success: false, error: result.error };\n }\n\n /**\n * 创建StartOptions的部分验证模式\n * 注意:这是一个基础模式,可以根据需要扩展\n */\n static createStartOptionsSchema() {\n return z.object({\n loggerLevel: z.enum(['DEBUG', 'INFO', 'WARN', 'ERROR']).optional(),\n showSplashScreen: z.enum(['auto', 'always', 'never', 'first-time-only']).optional(),\n minSplashScreenTime: z.number().positive().optional(),\n security: z.object({\n enableXSSProtection: z.boolean().optional(),\n validateConfig: z.boolean().optional(),\n sanitizeUserInput: z.boolean().optional(),\n csp: z.object({\n defaultSrc: z.array(z.string()).optional(),\n scriptSrc: z.array(z.string()).optional(),\n styleSrc: z.array(z.string()).optional(),\n imgSrc: z.array(z.string()).optional(),\n connectSrc: z.array(z.string()).optional(),\n fontSrc: z.array(z.string()).optional(),\n frameSrc: z.array(z.string()).optional(),\n allowUnsafeInline: z.boolean().optional(),\n allowUnsafeEval: z.boolean().optional(),\n }).optional(),\n }).optional(),\n }).passthrough(); // passthrough允许其他字段通过\n }\n\n /**\n * 验证配置并提供友好的错误信息\n * \n * @param config - 要验证的配置\n * @param schema - Zod模式\n * @returns 验证后的配置\n * @throws ConfigValidationError 如果配置验证失败,包含详细的错误信息\n */\n static validateWithFriendlyErrors<T>(\n config: unknown,\n schema: z.ZodSchema<T>\n ): T {\n const result = schema.safeParse(config);\n\n if (!result.success) {\n // 构建友好的错误信息\n // 注意:ZodError 使用 issues 属性,不是 errors\n const errorMessages = result.error.issues.map((issue: z.ZodIssue) => {\n const path = issue.path.length > 0 ? issue.path.join('.') : 'root';\n return `配置项 \"${path}\": ${issue.message}`;\n });\n\n const friendlyMessage = `配置验证失败:\\n${errorMessages.join('\\n')}`;\n\n throw new ConfigValidationError(friendlyMessage, result.error);\n }\n\n return result.data;\n }\n}\n"],"names":["z","ConfigValidationError","Error","message","errors","name","ConfigValidator","validate","config","schema","result","safeParse","success","error","data","safeValidate","createStartOptionsSchema","object","loggerLevel","enum","optional","showSplashScreen","minSplashScreenTime","number","positive","security","enableXSSProtection","boolean","validateConfig","sanitizeUserInput","csp","defaultSrc","array","string","scriptSrc","styleSrc","imgSrc","connectSrc","fontSrc","frameSrc","allowUnsafeInline","allowUnsafeEval","passthrough","validateWithFriendlyErrors","errorMessages","issues","map","issue","path","length","join","friendlyMessage"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/index.ts"],"sourcesContent":["/**\n * 配置模块统一导出\n */\n\nexport * from './ConfigValidator';\nexport * from './ConfigLoader';\nexport { appConfig } from './AppConfig';"],"names":["appConfig"],"mappings":"AAAA;;CAEC;;;;+BAIQA;;;eAAAA,oBAAS;;;qBAFJ;qBACA;2BACY"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/config/index.ts"],"sourcesContent":["/**\n * 配置模块统一导出\n */\n\nexport * from './ConfigValidator';\nexport * from './ConfigLoader';\nexport { appConfig } from './AppConfig';"],"names":["appConfig"],"mappings":"AAAA;;CAEC,GAED,cAAc,oBAAoB;AAClC,cAAc,iBAAiB;AAC/B,SAASA,SAAS,QAAQ,cAAc"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/dev/DevTools.tsx"],"sourcesContent":["/**\n * 开发工具模块(无 UI 框架依赖)\n */\n\nimport { useState, useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport type { AppInstance } from '../startup/AppInstance';\nimport { useStateManager } from '../app';\n\nexport interface DevToolsProps {\n appInstance: AppInstance;\n visible?: boolean;\n onClose?: () => void;\n}\n\nfunction toPrettyJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function DevTools({ appInstance, visible, onClose }: DevToolsProps): ReactNode {\n const [performanceMetrics, setPerformanceMetrics] = useState<Record<string, number>>({});\n const stateManager = useStateManager();\n\n useEffect(() => {\n if (!visible) {\n return;\n }\n const tracker = appInstance.getPerformanceTracker();\n if (!tracker) {\n return;\n }\n const metrics = tracker.getMetrics();\n setPerformanceMetrics({\n serviceInitDuration: metrics.serviceInitDuration || 0,\n initializationDuration: metrics.initializationDuration || 0,\n firstRenderDuration: metrics.firstRenderDuration || 0,\n totalStartupDuration: metrics.totalStartupDuration || 0,\n fcp: metrics.fcp || 0,\n lcp: metrics.lcp || 0,\n fid: metrics.fid || 0,\n cls: metrics.cls || 0,\n });\n }, [visible, appInstance]);\n\n if (!visible) {\n return null;\n }\n\n const options = appInstance.getOptions();\n const allStates = (stateManager as any)?.getAllStates?.() || [];\n\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n right: 0,\n width: 'min(680px, 95vw)',\n height: '100vh',\n zIndex: 9999,\n background: '#fff',\n borderLeft: '1px solid #d9e2ec',\n padding: 16,\n overflowY: 'auto',\n boxShadow: '-8px 0 20px rgba(0, 0, 0, 0.08)',\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <h3 style={{ margin: 0 }}>DevTools</h3>\n <button onClick={onClose} style={{ border: 'none', background: 'transparent', cursor: 'pointer' }}>\n 关闭\n </button>\n </div>\n\n <section style={{ marginTop: 12 }}>\n <h4>实例</h4>\n <div>id: {appInstance.id}</div>\n <div>initialized: {String(appInstance.isInitialized())}</div>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>性能</h4>\n <pre style={{ background: '#f7fafc', padding: 10, borderRadius: 8 }}>{toPrettyJson(performanceMetrics)}</pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>状态管理</h4>\n <div>stateCount: {allStates.length}</div>\n <pre style={{ background: '#f7fafc', padding: 10, borderRadius: 8 }}>{toPrettyJson(allStates.slice(0, 10))}</pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>配置</h4>\n <pre style={{ background: '#f7fafc', padding: 10, borderRadius: 8, whiteSpace: 'pre-wrap' }}>{toPrettyJson(options)}</pre>\n </section>\n </div>\n );\n}\n\nexport interface DevToolsTriggerProps {\n appInstance: AppInstance;\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n}\n\nfunction resolvePosition(position: DevToolsTriggerProps['position']): React.CSSProperties {\n const style: React.CSSProperties = { position: 'fixed', zIndex: 9998 };\n const pos = position || 'bottom-right';\n\n if (pos.includes('bottom')) style.bottom = 16;\n if (pos.includes('top')) style.top = 16;\n if (pos.includes('right')) style.right = 16;\n if (pos.includes('left')) style.left = 16;\n\n return style;\n}\n\nexport function DevToolsTrigger({ appInstance, position = 'bottom-right' }: DevToolsTriggerProps): ReactNode {\n const [visible, setVisible] = useState(false);\n\n if (process.env.NODE_ENV !== 'development') {\n return null;\n }\n\n return (\n <>\n <button\n onClick={() => setVisible(true)}\n style={{\n ...resolvePosition(position),\n border: 'none',\n background: '#2f80ed',\n color: '#fff',\n borderRadius: 999,\n padding: '8px 14px',\n cursor: 'pointer',\n }}\n >\n DevTools\n </button>\n <DevTools appInstance={appInstance} visible={visible} onClose={() => setVisible(false)} />\n </>\n );\n}\n"],"names":["DevTools","DevToolsTrigger","toPrettyJson","value","JSON","stringify","String","appInstance","visible","onClose","performanceMetrics","setPerformanceMetrics","useState","stateManager","useStateManager","useEffect","tracker","getPerformanceTracker","metrics","getMetrics","serviceInitDuration","initializationDuration","firstRenderDuration","totalStartupDuration","fcp","lcp","fid","cls","options","getOptions","allStates","getAllStates","div","style","position","top","right","width","height","zIndex","background","borderLeft","padding","overflowY","boxShadow","display","justifyContent","alignItems","h3","margin","button","onClick","border","cursor","section","marginTop","h4","id","isInitialized","pre","borderRadius","length","slice","whiteSpace","resolvePosition","pos","includes","bottom","left","setVisible","process","env","NODE_ENV","color"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/dev/DevTools.tsx"],"sourcesContent":["/**\n * 开发工具模块(无 UI 框架依赖)\n */\n\nimport { useState, useEffect } from 'react';\nimport type { ReactNode } from 'react';\nimport type { AppInstance } from '../startup/AppInstance';\nimport { useStateManager } from '../app';\n\nexport interface DevToolsProps {\n appInstance: AppInstance;\n visible?: boolean;\n onClose?: () => void;\n}\n\nfunction toPrettyJson(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function DevTools({ appInstance, visible, onClose }: DevToolsProps): ReactNode {\n const [performanceMetrics, setPerformanceMetrics] = useState<Record<string, number>>({});\n const stateManager = useStateManager();\n\n useEffect(() => {\n if (!visible) {\n return;\n }\n const tracker = appInstance.getPerformanceTracker();\n if (!tracker) {\n return;\n }\n const metrics = tracker.getMetrics();\n setPerformanceMetrics({\n serviceInitDuration: metrics.serviceInitDuration || 0,\n initializationDuration: metrics.initializationDuration || 0,\n firstRenderDuration: metrics.firstRenderDuration || 0,\n totalStartupDuration: metrics.totalStartupDuration || 0,\n fcp: metrics.fcp || 0,\n lcp: metrics.lcp || 0,\n fid: metrics.fid || 0,\n cls: metrics.cls || 0,\n });\n }, [visible, appInstance]);\n\n if (!visible) {\n return null;\n }\n\n const options = appInstance.getOptions();\n const allStates = (stateManager as any)?.getAllStates?.() || [];\n\n return (\n <div\n style={{\n position: 'fixed',\n top: 0,\n right: 0,\n width: 'min(680px, 95vw)',\n height: '100vh',\n zIndex: 9999,\n background: '#fff',\n borderLeft: '1px solid #d9e2ec',\n padding: 16,\n overflowY: 'auto',\n boxShadow: '-8px 0 20px rgba(0, 0, 0, 0.08)',\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <h3 style={{ margin: 0 }}>DevTools</h3>\n <button onClick={onClose} style={{ border: 'none', background: 'transparent', cursor: 'pointer' }}>\n 关闭\n </button>\n </div>\n\n <section style={{ marginTop: 12 }}>\n <h4>实例</h4>\n <div>id: {appInstance.id}</div>\n <div>initialized: {String(appInstance.isInitialized())}</div>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>性能</h4>\n <pre style={{ background: '#f7fafc', padding: 10, borderRadius: 8 }}>{toPrettyJson(performanceMetrics)}</pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>状态管理</h4>\n <div>stateCount: {allStates.length}</div>\n <pre style={{ background: '#f7fafc', padding: 10, borderRadius: 8 }}>{toPrettyJson(allStates.slice(0, 10))}</pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>配置</h4>\n <pre style={{ background: '#f7fafc', padding: 10, borderRadius: 8, whiteSpace: 'pre-wrap' }}>{toPrettyJson(options)}</pre>\n </section>\n </div>\n );\n}\n\nexport interface DevToolsTriggerProps {\n appInstance: AppInstance;\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n}\n\nfunction resolvePosition(position: DevToolsTriggerProps['position']): React.CSSProperties {\n const style: React.CSSProperties = { position: 'fixed', zIndex: 9998 };\n const pos = position || 'bottom-right';\n\n if (pos.includes('bottom')) style.bottom = 16;\n if (pos.includes('top')) style.top = 16;\n if (pos.includes('right')) style.right = 16;\n if (pos.includes('left')) style.left = 16;\n\n return style;\n}\n\nexport function DevToolsTrigger({ appInstance, position = 'bottom-right' }: DevToolsTriggerProps): ReactNode {\n const [visible, setVisible] = useState(false);\n\n if (process.env.NODE_ENV !== 'development') {\n return null;\n }\n\n return (\n <>\n <button\n onClick={() => setVisible(true)}\n style={{\n ...resolvePosition(position),\n border: 'none',\n background: '#2f80ed',\n color: '#fff',\n borderRadius: 999,\n padding: '8px 14px',\n cursor: 'pointer',\n }}\n >\n DevTools\n </button>\n <DevTools appInstance={appInstance} visible={visible} onClose={() => setVisible(false)} />\n </>\n );\n}\n"],"names":["useState","useEffect","useStateManager","toPrettyJson","value","JSON","stringify","String","DevTools","appInstance","visible","onClose","performanceMetrics","setPerformanceMetrics","stateManager","tracker","getPerformanceTracker","metrics","getMetrics","serviceInitDuration","initializationDuration","firstRenderDuration","totalStartupDuration","fcp","lcp","fid","cls","options","getOptions","allStates","getAllStates","div","style","position","top","right","width","height","zIndex","background","borderLeft","padding","overflowY","boxShadow","display","justifyContent","alignItems","h3","margin","button","onClick","border","cursor","section","marginTop","h4","id","isInitialized","pre","borderRadius","length","slice","whiteSpace","resolvePosition","pos","includes","bottom","left","DevToolsTrigger","setVisible","process","env","NODE_ENV","color"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/error/ErrorBoundary.tsx"],"sourcesContent":["import React, { type ReactNode, type ErrorInfo, useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { ErrorBoundary as ReactErrorBoundary } from 'react-error-boundary';\nimport { logger } from '@vlian/logger';\nimport { errorUtils } from '@vlian/utils';\nimport type { FrameworkError } from '@vlian/utils';\nimport { initializationErrorState } from '../initialization';\nimport { getDefaultErrorHandler } from './ErrorHandler';\n\n/**\n * 错误边界组件属性\n */\nexport interface ErrorBoundaryProps {\n /**\n * 子组件\n */\n children: ReactNode;\n /**\n * 错误回退 UI(函数形式)\n * \n * 如果不提供,将使用默认错误 UI(框架内置实现,居中显示)。\n * 如果提供,将使用自定义的错误 UI。\n * \n * @param error - 标准化后的框架错误对象\n * @param resetError - 重置错误边界的函数,调用后可以尝试重新渲染子组件\n * @returns 错误 UI 的 React 节点\n * \n * @example\n * ```tsx\n * <ErrorBoundary\n * fallback={(error, reset) => (\n * <div>\n * <h2>自定义错误标题</h2>\n * <p>{error.message}</p>\n * <button onClick={reset}>重试</button>\n * </div>\n * )}\n * >\n * <App />\n * </ErrorBoundary>\n * ```\n */\n fallback?: (error: FrameworkError, resetError: () => void) => ReactNode;\n /**\n * 错误回调\n */\n onError?: (error: FrameworkError, errorInfo: ErrorInfo) => void;\n /**\n * 是否在控制台显示错误\n */\n showInConsole?: boolean;\n /**\n * 重置键数组,当这些值变化时自动重置错误边界\n */\n resetKeys?: Array<string | number>;\n /**\n * 重置错误时的回调\n */\n onReset?: () => void;\n /**\n * 重置键变化时的回调\n */\n onResetKeysChange?: (prevKeys: Array<string | number> | undefined, nextKeys: Array<string | number> | undefined) => void;\n}\n\n/**\n * 错误边界组件\n * \n * 基于 react-error-boundary 实现,集成了框架的错误处理系统\n * 用于捕获 React 组件树中的错误,防止整个应用崩溃\n * \n * 默认使用框架内置错误 UI,居中显示。\n * 可以通过 fallback 属性自定义错误 UI。\n * \n * @example\n * ```tsx\n * // 使用默认错误 UI(推荐)\n * <ErrorBoundary>\n * <App />\n * </ErrorBoundary>\n * \n * // 自定义错误 UI\n * <ErrorBoundary\n * fallback={(error, reset) => (\n * <div>\n * <h1>出错了</h1>\n * <p>{error.message}</p>\n * <button onClick={reset}>重试</button>\n * </div>\n * )}\n * >\n * <App />\n * </ErrorBoundary>\n * ```\n */\nexport function ErrorBoundary({\n children,\n fallback,\n onError,\n showInConsole = true,\n resetKeys,\n onReset,\n onResetKeysChange,\n}: ErrorBoundaryProps): ReactNode {\n // 使用 ref 存储重试计数,在多次错误之间保持状态\n const retryCountRef = useRef<number>(0);\n\n // 优化:使用统一的错误处理器\n const errorHandler = useMemo(() => getDefaultErrorHandler(), []);\n\n // 处理错误,将标准 Error 转换为 FrameworkError\n const handleError = useCallback(async (error: Error, errorInfo: { componentStack?: string | null }): Promise<void> => {\n const normalizedError = errorUtils.normalizeError(error);\n\n // 将 react-error-boundary 的 errorInfo 转换为 React 的 ErrorInfo 格式\n const reactErrorInfo: ErrorInfo = {\n componentStack: errorInfo.componentStack || '',\n };\n\n // 使用统一的错误处理器处理错误\n const handleResult = await errorHandler.handleError(normalizedError, {\n componentStack: reactErrorInfo.componentStack,\n source: 'ErrorBoundary',\n });\n\n // 如果错误处理器没有处理错误,使用默认处理\n if (!handleResult.handled) {\n logger.error('错误边界捕获到错误:', {\n error: normalizedError.toJSON(),\n errorInfo: {\n componentStack: reactErrorInfo.componentStack,\n },\n });\n }\n\n // 调用错误回调\n if (onError) {\n onError(normalizedError, reactErrorInfo);\n }\n\n // 在控制台显示错误(如果配置了)\n if (showInConsole) {\n console.error('错误边界捕获到错误:', normalizedError);\n console.error('错误信息:', reactErrorInfo);\n }\n }, [errorHandler, onError, showInConsole]);\n\n // 处理重置\n const handleReset = (): void => {\n // 清除初始化错误状态\n initializationErrorState.clearError();\n // 调用用户提供的重置回调\n if (onReset) {\n onReset();\n }\n };\n\n // 默认 fallback UI(使用无框架 HTML 组件)\n // 使用内部组件来管理重试计数状态,使用 React.memo 优化性能\n const DefaultFallbackComponent = React.memo(({ error, resetErrorBoundary }: { error: Error; resetErrorBoundary: () => void }): ReactNode => {\n const normalizedError = errorUtils.normalizeError(error);\n const [retryCount, setRetryCount] = useState<number>(retryCountRef.current);\n const [showDetails, setShowDetails] = useState(false);\n\n // 同步 ref 的值到 state,确保组件重新创建时能读取到最新的重试计数\n useEffect(() => {\n setRetryCount(retryCountRef.current);\n }, []);\n\n const handleRetry = useCallback((): void => {\n // 增加重试计数\n const newCount = retryCount + 1;\n retryCountRef.current = newCount;\n setRetryCount(newCount);\n \n // 执行重置\n handleReset();\n resetErrorBoundary();\n }, [retryCount, resetErrorBoundary]);\n\n const handleReload = useCallback((): void => {\n // 刷新页面\n window.location.reload();\n }, []);\n\n // 构建用户友好的错误提示\n const userFriendlyMessage = useMemo(() => {\n // 根据错误类型提供不同的提示\n if (normalizedError.code === 'NETWORK_ERROR') {\n return '网络连接失败,请检查您的网络设置后再尝试';\n }\n if (normalizedError.code === 'TIMEOUT_ERROR') {\n return '请求超时,请稍后再尝试';\n }\n if (normalizedError.code === 'VALIDATION_ERROR') {\n return '数据验证失败,请检查输入内容';\n }\n // 默认提示\n return '应用运行时发生了错误,请稍后再尝试';\n }, [normalizedError.code]);\n\n // 构建按钮数组\n const extraButtons = useMemo(() => {\n const buttons = [\n <button\n key=\"retry\"\n onClick={handleRetry}\n aria-label=\"重试加载应用\"\n style={{\n border: 'none',\n background: 'var(--app-primary-color, #2f80ed)',\n color: '#fff',\n borderRadius: 6,\n padding: '8px 14px',\n cursor: 'pointer',\n }}\n >\n 重试\n </button>,\n <button\n key=\"details\"\n onClick={() => setShowDetails(!showDetails)}\n aria-label={showDetails ? '隐藏错误详情' : '显示错误详情'}\n style={{\n border: '1px solid #cfd7df',\n background: '#fff',\n color: '#1f2933',\n borderRadius: 6,\n padding: '8px 14px',\n cursor: 'pointer',\n }}\n >\n {showDetails ? '隐藏详情' : '查看详情'}\n </button>,\n ];\n\n // 如果重试次数 >= 1,添加刷新页面按钮(提前显示)\n if (retryCount >= 1) {\n buttons.push(\n <button\n key=\"reload\"\n onClick={handleReload}\n aria-label=\"刷新页面\"\n style={{\n border: '1px solid #cfd7df',\n background: '#fff',\n color: '#1f2933',\n borderRadius: 6,\n padding: '8px 14px',\n cursor: 'pointer',\n }}\n >\n 刷新页面\n </button>\n );\n }\n\n return buttons;\n }, [retryCount, handleRetry, handleReload, showDetails]);\n\n return (\n <div\n role=\"alert\"\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n padding: '24px',\n }}\n >\n <div\n style={{\n maxWidth: 580,\n width: '100%',\n textAlign: 'center',\n border: '1px solid #dde5ec',\n borderRadius: 10,\n padding: 24,\n background: '#fff',\n }}\n >\n <div style={{ fontSize: 40, lineHeight: '44px' }}>⚠️</div>\n <h2 style={{ margin: '8px 0 4px' }}>出错了</h2>\n <p style={{ marginTop: 0, color: '#52606d' }}>{userFriendlyMessage}</p>\n <div style={{ display: 'flex', gap: 8, justifyContent: 'center', flexWrap: 'wrap' }}>\n {extraButtons}\n </div>\n </div>\n {showDetails && (\n <div\n style={{\n marginTop: 24,\n padding: 16,\n backgroundColor: '#f5f5f5',\n borderRadius: 4,\n maxWidth: 800,\n width: '100%',\n maxHeight: 400,\n overflow: 'auto',\n }}\n >\n <div style={{ marginBottom: 8, fontWeight: 'bold' }}>错误详情:</div>\n <div style={{ fontFamily: 'monospace', fontSize: 12 }}>\n <div><strong>错误类型:</strong>{normalizedError.name}</div>\n <div><strong>错误代码:</strong>{normalizedError.code}</div>\n <div><strong>错误信息:</strong>{normalizedError.message}</div>\n {normalizedError.stack && (\n <div style={{ marginTop: 8 }}>\n <strong>堆栈信息:</strong>\n <pre style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {normalizedError.stack}\n </pre>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n });\n \n DefaultFallbackComponent.displayName = 'DefaultFallbackComponent';\n\n const defaultFallback = ({ error, resetErrorBoundary }: { error: Error; resetErrorBoundary: () => void }): ReactNode => {\n return <DefaultFallbackComponent error={error} resetErrorBoundary={resetErrorBoundary} />;\n };\n\n // 如果提供了自定义 fallback,使用自定义的\n const fallbackRender = fallback\n ? ({ error, resetErrorBoundary }: { error: Error; resetErrorBoundary: () => void }): ReactNode => {\n const normalizedError = errorUtils.normalizeError(error);\n return fallback(normalizedError, () => {\n handleReset();\n resetErrorBoundary();\n });\n }\n : defaultFallback;\n\n // 处理重置时清除重试计数\n const handleResetWithCount = (): void => {\n retryCountRef.current = 0;\n handleReset();\n };\n\n // 处理 resetKeys 变化时清除重试计数\n const handleResetKeysChange = (\n prevKeys: Array<string | number> | undefined,\n nextKeys: Array<string | number> | undefined\n ): void => {\n retryCountRef.current = 0;\n if (onResetKeysChange) {\n onResetKeysChange(prevKeys, nextKeys);\n }\n };\n\n // 构建 react-error-boundary 的 props\n const errorBoundaryProps = {\n fallbackRender,\n onError: handleError,\n onReset: handleResetWithCount,\n resetKeys,\n onResetKeysChange: handleResetKeysChange,\n } as any;\n\n return (\n <ReactErrorBoundary {...errorBoundaryProps}>\n {children}\n </ReactErrorBoundary>\n );\n}\n\n/**\n * 带错误边界的 HOC\n */\nexport function withErrorBoundary<P extends object>(\n Component: React.ComponentType<P>,\n errorBoundaryProps?: Omit<ErrorBoundaryProps, 'children'>\n): React.ComponentType<P> {\n const WrappedComponent = (props: P) => {\n return (\n <ErrorBoundary {...errorBoundaryProps}>\n <Component {...props} />\n </ErrorBoundary>\n );\n };\n\n WrappedComponent.displayName = `withErrorBoundary(${Component.displayName || Component.name || 'Component'})`;\n\n return WrappedComponent;\n}\n\n/**\n * 使用错误处理器的 Hook\n * \n * 用于在函数组件中处理异步错误\n * \n * 注意:这个 Hook 需要配合 ErrorBoundary 使用。当调用返回的错误处理函数时,\n * 错误会被设置到初始化错误状态,然后通过 InitializationErrorThrower 组件抛出。\n * \n * @example\n * ```tsx\n * import { useErrorHandler } from '@vlian/framework';\n * \n * function MyComponent() {\n * const handleError = useErrorHandler();\n * \n * useEffect(() => {\n * async function fetchData() {\n * try {\n * await someAsyncOperation();\n * } catch (error) {\n * handleError(error);\n * }\n * }\n * fetchData();\n * }, [handleError]);\n * }\n * ```\n */\nexport function useErrorHandler(): (error: unknown) => void {\n return (error: unknown) => {\n // 将错误设置到初始化错误状态\n // InitializationErrorThrower 组件会检测到错误并抛出,让 ErrorBoundary 捕获\n initializationErrorState.setError(error);\n };\n}\n"],"names":["ErrorBoundary","useErrorHandler","withErrorBoundary","children","fallback","onError","showInConsole","resetKeys","onReset","onResetKeysChange","retryCountRef","useRef","errorHandler","useMemo","getDefaultErrorHandler","handleError","useCallback","error","errorInfo","normalizedError","errorUtils","normalizeError","reactErrorInfo","componentStack","handleResult","source","handled","logger","toJSON","console","handleReset","initializationErrorState","clearError","DefaultFallbackComponent","React","memo","resetErrorBoundary","retryCount","setRetryCount","useState","current","showDetails","setShowDetails","useEffect","handleRetry","newCount","handleReload","window","location","reload","userFriendlyMessage","code","extraButtons","buttons","button","onClick","aria-label","style","border","background","color","borderRadius","padding","cursor","push","div","role","aria-live","aria-atomic","display","flexDirection","alignItems","justifyContent","minHeight","maxWidth","width","textAlign","fontSize","lineHeight","h2","margin","p","marginTop","gap","flexWrap","backgroundColor","maxHeight","overflow","marginBottom","fontWeight","fontFamily","strong","name","message","stack","pre","whiteSpace","wordBreak","displayName","defaultFallback","fallbackRender","handleResetWithCount","handleResetKeysChange","prevKeys","nextKeys","errorBoundaryProps","ReactErrorBoundary","Component","WrappedComponent","props","setError"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/error/ErrorBoundary.tsx"],"sourcesContent":["import React, { type ReactNode, type ErrorInfo, useState, useRef, useEffect, useCallback, useMemo } from 'react';\nimport { ErrorBoundary as ReactErrorBoundary } from 'react-error-boundary';\nimport { logger } from '@vlian/logger';\nimport { errorUtils } from '@vlian/utils';\nimport type { FrameworkError } from '@vlian/utils';\nimport { initializationErrorState } from '../initialization';\nimport { getDefaultErrorHandler } from './ErrorHandler';\n\n/**\n * 错误边界组件属性\n */\nexport interface ErrorBoundaryProps {\n /**\n * 子组件\n */\n children: ReactNode;\n /**\n * 错误回退 UI(函数形式)\n * \n * 如果不提供,将使用默认错误 UI(框架内置实现,居中显示)。\n * 如果提供,将使用自定义的错误 UI。\n * \n * @param error - 标准化后的框架错误对象\n * @param resetError - 重置错误边界的函数,调用后可以尝试重新渲染子组件\n * @returns 错误 UI 的 React 节点\n * \n * @example\n * ```tsx\n * <ErrorBoundary\n * fallback={(error, reset) => (\n * <div>\n * <h2>自定义错误标题</h2>\n * <p>{error.message}</p>\n * <button onClick={reset}>重试</button>\n * </div>\n * )}\n * >\n * <App />\n * </ErrorBoundary>\n * ```\n */\n fallback?: (error: FrameworkError, resetError: () => void) => ReactNode;\n /**\n * 错误回调\n */\n onError?: (error: FrameworkError, errorInfo: ErrorInfo) => void;\n /**\n * 是否在控制台显示错误\n */\n showInConsole?: boolean;\n /**\n * 重置键数组,当这些值变化时自动重置错误边界\n */\n resetKeys?: Array<string | number>;\n /**\n * 重置错误时的回调\n */\n onReset?: () => void;\n /**\n * 重置键变化时的回调\n */\n onResetKeysChange?: (prevKeys: Array<string | number> | undefined, nextKeys: Array<string | number> | undefined) => void;\n}\n\n/**\n * 错误边界组件\n * \n * 基于 react-error-boundary 实现,集成了框架的错误处理系统\n * 用于捕获 React 组件树中的错误,防止整个应用崩溃\n * \n * 默认使用框架内置错误 UI,居中显示。\n * 可以通过 fallback 属性自定义错误 UI。\n * \n * @example\n * ```tsx\n * // 使用默认错误 UI(推荐)\n * <ErrorBoundary>\n * <App />\n * </ErrorBoundary>\n * \n * // 自定义错误 UI\n * <ErrorBoundary\n * fallback={(error, reset) => (\n * <div>\n * <h1>出错了</h1>\n * <p>{error.message}</p>\n * <button onClick={reset}>重试</button>\n * </div>\n * )}\n * >\n * <App />\n * </ErrorBoundary>\n * ```\n */\nexport function ErrorBoundary({\n children,\n fallback,\n onError,\n showInConsole = true,\n resetKeys,\n onReset,\n onResetKeysChange,\n}: ErrorBoundaryProps): ReactNode {\n // 使用 ref 存储重试计数,在多次错误之间保持状态\n const retryCountRef = useRef<number>(0);\n\n // 优化:使用统一的错误处理器\n const errorHandler = useMemo(() => getDefaultErrorHandler(), []);\n\n // 处理错误,将标准 Error 转换为 FrameworkError\n const handleError = useCallback(async (error: Error, errorInfo: { componentStack?: string | null }): Promise<void> => {\n const normalizedError = errorUtils.normalizeError(error);\n\n // 将 react-error-boundary 的 errorInfo 转换为 React 的 ErrorInfo 格式\n const reactErrorInfo: ErrorInfo = {\n componentStack: errorInfo.componentStack || '',\n };\n\n // 使用统一的错误处理器处理错误\n const handleResult = await errorHandler.handleError(normalizedError, {\n componentStack: reactErrorInfo.componentStack,\n source: 'ErrorBoundary',\n });\n\n // 如果错误处理器没有处理错误,使用默认处理\n if (!handleResult.handled) {\n logger.error('错误边界捕获到错误:', {\n error: normalizedError.toJSON(),\n errorInfo: {\n componentStack: reactErrorInfo.componentStack,\n },\n });\n }\n\n // 调用错误回调\n if (onError) {\n onError(normalizedError, reactErrorInfo);\n }\n\n // 在控制台显示错误(如果配置了)\n if (showInConsole) {\n console.error('错误边界捕获到错误:', normalizedError);\n console.error('错误信息:', reactErrorInfo);\n }\n }, [errorHandler, onError, showInConsole]);\n\n // 处理重置\n const handleReset = (): void => {\n // 清除初始化错误状态\n initializationErrorState.clearError();\n // 调用用户提供的重置回调\n if (onReset) {\n onReset();\n }\n };\n\n // 默认 fallback UI(使用无框架 HTML 组件)\n // 使用内部组件来管理重试计数状态,使用 React.memo 优化性能\n const DefaultFallbackComponent = React.memo(({ error, resetErrorBoundary }: { error: Error; resetErrorBoundary: () => void }): ReactNode => {\n const normalizedError = errorUtils.normalizeError(error);\n const [retryCount, setRetryCount] = useState<number>(retryCountRef.current);\n const [showDetails, setShowDetails] = useState(false);\n\n // 同步 ref 的值到 state,确保组件重新创建时能读取到最新的重试计数\n useEffect(() => {\n setRetryCount(retryCountRef.current);\n }, []);\n\n const handleRetry = useCallback((): void => {\n // 增加重试计数\n const newCount = retryCount + 1;\n retryCountRef.current = newCount;\n setRetryCount(newCount);\n \n // 执行重置\n handleReset();\n resetErrorBoundary();\n }, [retryCount, resetErrorBoundary]);\n\n const handleReload = useCallback((): void => {\n // 刷新页面\n window.location.reload();\n }, []);\n\n // 构建用户友好的错误提示\n const userFriendlyMessage = useMemo(() => {\n // 根据错误类型提供不同的提示\n if (normalizedError.code === 'NETWORK_ERROR') {\n return '网络连接失败,请检查您的网络设置后再尝试';\n }\n if (normalizedError.code === 'TIMEOUT_ERROR') {\n return '请求超时,请稍后再尝试';\n }\n if (normalizedError.code === 'VALIDATION_ERROR') {\n return '数据验证失败,请检查输入内容';\n }\n // 默认提示\n return '应用运行时发生了错误,请稍后再尝试';\n }, [normalizedError.code]);\n\n // 构建按钮数组\n const extraButtons = useMemo(() => {\n const buttons = [\n <button\n key=\"retry\"\n onClick={handleRetry}\n aria-label=\"重试加载应用\"\n style={{\n border: 'none',\n background: 'var(--app-primary-color, #2f80ed)',\n color: '#fff',\n borderRadius: 6,\n padding: '8px 14px',\n cursor: 'pointer',\n }}\n >\n 重试\n </button>,\n <button\n key=\"details\"\n onClick={() => setShowDetails(!showDetails)}\n aria-label={showDetails ? '隐藏错误详情' : '显示错误详情'}\n style={{\n border: '1px solid #cfd7df',\n background: '#fff',\n color: '#1f2933',\n borderRadius: 6,\n padding: '8px 14px',\n cursor: 'pointer',\n }}\n >\n {showDetails ? '隐藏详情' : '查看详情'}\n </button>,\n ];\n\n // 如果重试次数 >= 1,添加刷新页面按钮(提前显示)\n if (retryCount >= 1) {\n buttons.push(\n <button\n key=\"reload\"\n onClick={handleReload}\n aria-label=\"刷新页面\"\n style={{\n border: '1px solid #cfd7df',\n background: '#fff',\n color: '#1f2933',\n borderRadius: 6,\n padding: '8px 14px',\n cursor: 'pointer',\n }}\n >\n 刷新页面\n </button>\n );\n }\n\n return buttons;\n }, [retryCount, handleRetry, handleReload, showDetails]);\n\n return (\n <div\n role=\"alert\"\n aria-live=\"assertive\"\n aria-atomic=\"true\"\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '100vh',\n padding: '24px',\n }}\n >\n <div\n style={{\n maxWidth: 580,\n width: '100%',\n textAlign: 'center',\n border: '1px solid #dde5ec',\n borderRadius: 10,\n padding: 24,\n background: '#fff',\n }}\n >\n <div style={{ fontSize: 40, lineHeight: '44px' }}>⚠️</div>\n <h2 style={{ margin: '8px 0 4px' }}>出错了</h2>\n <p style={{ marginTop: 0, color: '#52606d' }}>{userFriendlyMessage}</p>\n <div style={{ display: 'flex', gap: 8, justifyContent: 'center', flexWrap: 'wrap' }}>\n {extraButtons}\n </div>\n </div>\n {showDetails && (\n <div\n style={{\n marginTop: 24,\n padding: 16,\n backgroundColor: '#f5f5f5',\n borderRadius: 4,\n maxWidth: 800,\n width: '100%',\n maxHeight: 400,\n overflow: 'auto',\n }}\n >\n <div style={{ marginBottom: 8, fontWeight: 'bold' }}>错误详情:</div>\n <div style={{ fontFamily: 'monospace', fontSize: 12 }}>\n <div><strong>错误类型:</strong>{normalizedError.name}</div>\n <div><strong>错误代码:</strong>{normalizedError.code}</div>\n <div><strong>错误信息:</strong>{normalizedError.message}</div>\n {normalizedError.stack && (\n <div style={{ marginTop: 8 }}>\n <strong>堆栈信息:</strong>\n <pre style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {normalizedError.stack}\n </pre>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n });\n \n DefaultFallbackComponent.displayName = 'DefaultFallbackComponent';\n\n const defaultFallback = ({ error, resetErrorBoundary }: { error: Error; resetErrorBoundary: () => void }): ReactNode => {\n return <DefaultFallbackComponent error={error} resetErrorBoundary={resetErrorBoundary} />;\n };\n\n // 如果提供了自定义 fallback,使用自定义的\n const fallbackRender = fallback\n ? ({ error, resetErrorBoundary }: { error: Error; resetErrorBoundary: () => void }): ReactNode => {\n const normalizedError = errorUtils.normalizeError(error);\n return fallback(normalizedError, () => {\n handleReset();\n resetErrorBoundary();\n });\n }\n : defaultFallback;\n\n // 处理重置时清除重试计数\n const handleResetWithCount = (): void => {\n retryCountRef.current = 0;\n handleReset();\n };\n\n // 处理 resetKeys 变化时清除重试计数\n const handleResetKeysChange = (\n prevKeys: Array<string | number> | undefined,\n nextKeys: Array<string | number> | undefined\n ): void => {\n retryCountRef.current = 0;\n if (onResetKeysChange) {\n onResetKeysChange(prevKeys, nextKeys);\n }\n };\n\n // 构建 react-error-boundary 的 props\n const errorBoundaryProps = {\n fallbackRender,\n onError: handleError,\n onReset: handleResetWithCount,\n resetKeys,\n onResetKeysChange: handleResetKeysChange,\n } as any;\n\n return (\n <ReactErrorBoundary {...errorBoundaryProps}>\n {children}\n </ReactErrorBoundary>\n );\n}\n\n/**\n * 带错误边界的 HOC\n */\nexport function withErrorBoundary<P extends object>(\n Component: React.ComponentType<P>,\n errorBoundaryProps?: Omit<ErrorBoundaryProps, 'children'>\n): React.ComponentType<P> {\n const WrappedComponent = (props: P) => {\n return (\n <ErrorBoundary {...errorBoundaryProps}>\n <Component {...props} />\n </ErrorBoundary>\n );\n };\n\n WrappedComponent.displayName = `withErrorBoundary(${Component.displayName || Component.name || 'Component'})`;\n\n return WrappedComponent;\n}\n\n/**\n * 使用错误处理器的 Hook\n * \n * 用于在函数组件中处理异步错误\n * \n * 注意:这个 Hook 需要配合 ErrorBoundary 使用。当调用返回的错误处理函数时,\n * 错误会被设置到初始化错误状态,然后通过 InitializationErrorThrower 组件抛出。\n * \n * @example\n * ```tsx\n * import { useErrorHandler } from '@vlian/framework';\n * \n * function MyComponent() {\n * const handleError = useErrorHandler();\n * \n * useEffect(() => {\n * async function fetchData() {\n * try {\n * await someAsyncOperation();\n * } catch (error) {\n * handleError(error);\n * }\n * }\n * fetchData();\n * }, [handleError]);\n * }\n * ```\n */\nexport function useErrorHandler(): (error: unknown) => void {\n return (error: unknown) => {\n // 将错误设置到初始化错误状态\n // InitializationErrorThrower 组件会检测到错误并抛出,让 ErrorBoundary 捕获\n initializationErrorState.setError(error);\n };\n}\n"],"names":["React","useState","useRef","useEffect","useCallback","useMemo","ErrorBoundary","ReactErrorBoundary","logger","errorUtils","initializationErrorState","getDefaultErrorHandler","children","fallback","onError","showInConsole","resetKeys","onReset","onResetKeysChange","retryCountRef","errorHandler","handleError","error","errorInfo","normalizedError","normalizeError","reactErrorInfo","componentStack","handleResult","source","handled","toJSON","console","handleReset","clearError","DefaultFallbackComponent","memo","resetErrorBoundary","retryCount","setRetryCount","current","showDetails","setShowDetails","handleRetry","newCount","handleReload","window","location","reload","userFriendlyMessage","code","extraButtons","buttons","button","onClick","aria-label","style","border","background","color","borderRadius","padding","cursor","push","div","role","aria-live","aria-atomic","display","flexDirection","alignItems","justifyContent","minHeight","maxWidth","width","textAlign","fontSize","lineHeight","h2","margin","p","marginTop","gap","flexWrap","backgroundColor","maxHeight","overflow","marginBottom","fontWeight","fontFamily","strong","name","message","stack","pre","whiteSpace","wordBreak","displayName","defaultFallback","fallbackRender","handleResetWithCount","handleResetKeysChange","prevKeys","nextKeys","errorBoundaryProps","withErrorBoundary","Component","WrappedComponent","props","useErrorHandler","setError"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/error/ErrorHandler.ts"],"sourcesContent":["/**\n * 统一错误处理器\n * \n * 优化:\n * 1. 统一错误处理策略:记录、上报、恢复、降级\n * 2. 错误分类:致命、可恢复、警告\n * 3. 错误恢复机制:自动重试、降级方案\n */\n\nimport { logger } from '@vlian/logger';\nimport { errorUtils, ErrorSeverity, ErrorType, FrameworkError } from '@vlian/utils';\nimport type { MonitoringService } from '@vlian/monitoring';\n\n/**\n * 错误处理策略\n */\nexport enum ErrorHandlingStrategy {\n /**\n * 记录错误(日志)\n */\n LOG = 'LOG',\n /**\n * 上报错误(监控服务)\n */\n REPORT = 'REPORT',\n /**\n * 尝试恢复错误\n */\n RECOVER = 'RECOVER',\n /**\n * 降级处理\n */\n FALLBACK = 'FALLBACK',\n /**\n * 忽略错误\n */\n IGNORE = 'IGNORE',\n}\n\n/**\n * 错误恢复选项\n */\nexport interface ErrorRecoveryOptions {\n /**\n * 最大重试次数\n * @default 3\n */\n maxRetries?: number;\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n /**\n * 是否启用指数退避\n * @default true\n */\n exponentialBackoff?: boolean;\n /**\n * 重试条件函数\n */\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n /**\n * 降级方案函数\n */\n fallback?: () => Promise<unknown> | unknown;\n}\n\n/**\n * 错误处理配置\n */\nexport interface ErrorHandlerConfig {\n /**\n * 监控服务实例(可选)\n */\n monitoring?: MonitoringService;\n /**\n * 默认错误处理策略\n * @default [ErrorHandlingStrategy.LOG, ErrorHandlingStrategy.REPORT]\n */\n defaultStrategies?: ErrorHandlingStrategy[];\n /**\n * 错误严重程度对应的处理策略\n */\n severityStrategies?: Partial<Record<ErrorSeverity, ErrorHandlingStrategy[]>>;\n /**\n * 错误类型对应的处理策略\n */\n typeStrategies?: Partial<Record<ErrorType, ErrorHandlingStrategy[]>>;\n /**\n * 错误恢复选项\n */\n recoveryOptions?: ErrorRecoveryOptions;\n /**\n * 是否在开发环境显示详细错误信息\n * @default true\n */\n showDetailedErrorsInDev?: boolean;\n}\n\n/**\n * 错误处理结果\n */\nexport interface ErrorHandleResult {\n /**\n * 是否已处理\n */\n handled: boolean;\n /**\n * 是否可恢复\n */\n recoverable: boolean;\n /**\n * 恢复后的结果(如果已恢复)\n */\n recoveredValue?: unknown;\n /**\n * 使用的处理策略\n */\n strategies: ErrorHandlingStrategy[];\n /**\n * 错误信息\n */\n error: FrameworkError;\n}\n\n/**\n * 统一错误处理器\n */\nexport class ErrorHandler {\n private config: Omit<Required<ErrorHandlerConfig>, 'monitoring'>;\n private monitoring?: MonitoringService;\n\n constructor(config: ErrorHandlerConfig = {}) {\n this.monitoring = config.monitoring;\n this.config = {\n defaultStrategies: config.defaultStrategies ?? [\n ErrorHandlingStrategy.LOG,\n ErrorHandlingStrategy.REPORT,\n ],\n severityStrategies: config.severityStrategies ?? {},\n typeStrategies: config.typeStrategies ?? {},\n recoveryOptions: config.recoveryOptions ?? {},\n showDetailedErrorsInDev: config.showDetailedErrorsInDev ?? true,\n };\n }\n\n /**\n * 设置监控服务\n */\n setMonitoring(monitoring: MonitoringService): void {\n this.monitoring = monitoring;\n }\n\n /**\n * 处理错误\n * \n * @param error - 错误对象\n * @param context - 错误上下文\n * @returns 错误处理结果\n */\n async handleError(\n error: unknown,\n context?: Record<string, unknown>\n ): Promise<ErrorHandleResult> {\n // 标准化错误对象\n const normalizedError = errorUtils.normalizeError(error);\n \n // 创建包含上下文信息的错误对象(由于 context 是只读的,需要创建新对象)\n const errorWithContext: FrameworkError = context\n ? new FrameworkError(\n normalizedError.message,\n normalizedError.type,\n normalizedError.severity,\n {\n code: normalizedError.code,\n originalError: normalizedError.originalError,\n context: {\n ...normalizedError.context,\n ...context,\n },\n recoverable: normalizedError.recoverable,\n }\n )\n : normalizedError;\n\n // 确定处理策略\n const strategies = this.determineStrategies(errorWithContext);\n \n // 执行处理策略\n const handled = await this.executeStrategies(errorWithContext, strategies);\n\n // 尝试恢复错误\n let recoveredValue: unknown | undefined;\n let recoverable = false;\n if (handled && errorWithContext.recoverable && this.config.recoveryOptions) {\n const recoveryResult = await this.attemptRecovery(errorWithContext);\n recoverable = recoveryResult.recoverable;\n recoveredValue = recoveryResult.value;\n }\n\n return {\n handled,\n recoverable,\n recoveredValue,\n strategies,\n error: errorWithContext,\n };\n }\n\n /**\n * 确定错误处理策略\n */\n private determineStrategies(error: FrameworkError): ErrorHandlingStrategy[] {\n // 1. 检查错误类型对应的策略\n if (this.config.typeStrategies[error.type]) {\n return this.config.typeStrategies[error.type]!;\n }\n\n // 2. 检查错误严重程度对应的策略\n if (this.config.severityStrategies[error.severity]) {\n return this.config.severityStrategies[error.severity]!;\n }\n\n // 3. 使用默认策略\n return this.config.defaultStrategies;\n }\n\n /**\n * 执行处理策略\n */\n private async executeStrategies(\n error: FrameworkError,\n strategies: ErrorHandlingStrategy[]\n ): Promise<boolean> {\n let handled = false;\n\n for (const strategy of strategies) {\n try {\n switch (strategy) {\n case ErrorHandlingStrategy.LOG:\n this.logError(error);\n handled = true;\n break;\n\n case ErrorHandlingStrategy.REPORT:\n await this.reportError(error);\n handled = true;\n break;\n\n case ErrorHandlingStrategy.RECOVER:\n // 恢复策略在 handleError 中统一处理\n handled = true;\n break;\n\n case ErrorHandlingStrategy.FALLBACK:\n // 降级策略在 attemptRecovery 中处理\n handled = true;\n break;\n\n case ErrorHandlingStrategy.IGNORE:\n // 忽略错误,不做任何处理\n handled = true;\n break;\n }\n } catch (strategyError) {\n logger.warn(`错误处理策略 ${strategy} 执行失败:`, strategyError);\n }\n }\n\n return handled;\n }\n\n /**\n * 记录错误\n */\n private logError(error: FrameworkError): void {\n const errorInfo = errorUtils.extractErrorInfo(error);\n \n // 根据错误严重程度选择日志级别\n switch (error.severity) {\n case ErrorSeverity.CRITICAL:\n case ErrorSeverity.HIGH:\n logger.error('错误:', errorInfo);\n break;\n case ErrorSeverity.MEDIUM:\n logger.warn('警告:', errorInfo);\n break;\n case ErrorSeverity.LOW:\n logger.info('信息:', errorInfo);\n break;\n }\n\n // 开发环境显示详细错误信息\n if (this.config.showDetailedErrorsInDev && process.env.NODE_ENV === 'development') {\n const detailedError = errorUtils.formatErrorForDev(error);\n console.error(detailedError);\n }\n }\n\n /**\n * 上报错误\n */\n private async reportError(error: FrameworkError): Promise<void> {\n if (!this.monitoring) {\n logger.debug('监控服务未配置,跳过错误上报');\n return;\n }\n\n try {\n this.monitoring.captureError(error, {\n severity: error.severity,\n type: error.type,\n code: error.code,\n context: error.context,\n });\n } catch (reportError) {\n logger.warn('错误上报失败:', reportError);\n }\n }\n\n /**\n * 尝试恢复错误\n */\n private async attemptRecovery(\n error: FrameworkError\n ): Promise<{ recoverable: boolean; value?: unknown }> {\n const options = this.config.recoveryOptions;\n if (!options) {\n return { recoverable: false };\n }\n\n const maxRetries = options.maxRetries ?? 3;\n const retryDelay = options.retryDelay ?? 1000;\n const exponentialBackoff = options.exponentialBackoff ?? true;\n const shouldRetry = options.shouldRetry ?? (() => true);\n\n // 如果有降级方案,先尝试降级\n if (options.fallback) {\n try {\n const fallbackValue = await Promise.resolve(options.fallback());\n logger.info('错误已通过降级方案恢复');\n return { recoverable: true, value: fallbackValue };\n } catch (fallbackError) {\n logger.warn('降级方案执行失败:', fallbackError);\n }\n }\n\n // 尝试重试(如果错误可恢复且满足重试条件)\n if (error.recoverable && shouldRetry(error, 0)) {\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n if (!shouldRetry(error, attempt)) {\n break;\n }\n\n const delay = exponentialBackoff\n ? retryDelay * Math.pow(2, attempt)\n : retryDelay;\n\n logger.debug(`错误恢复重试 ${attempt + 1}/${maxRetries},${delay}ms 后重试...`);\n\n await new Promise(resolve => setTimeout(resolve, delay));\n\n // 这里应该调用原始操作的重试逻辑\n // 由于错误处理器不知道原始操作,这里只返回可恢复状态\n // 实际的重试应该在调用方实现\n }\n }\n\n return { recoverable: error.recoverable };\n }\n\n /**\n * 创建错误处理器的便捷方法\n */\n static create(config?: ErrorHandlerConfig): ErrorHandler {\n return new ErrorHandler(config);\n }\n}\n\n/**\n * 默认错误处理器实例(单例)\n */\nlet defaultErrorHandler: ErrorHandler | null = null;\n\n/**\n * 获取默认错误处理器\n */\nexport function getDefaultErrorHandler(): ErrorHandler {\n if (!defaultErrorHandler) {\n defaultErrorHandler = new ErrorHandler();\n }\n return defaultErrorHandler;\n}\n\n/**\n * 设置默认错误处理器\n */\nexport function setDefaultErrorHandler(handler: ErrorHandler): void {\n defaultErrorHandler = handler;\n}\n"],"names":["ErrorHandler","ErrorHandlingStrategy","getDefaultErrorHandler","setDefaultErrorHandler","setMonitoring","monitoring","handleError","error","context","normalizedError","errorUtils","normalizeError","errorWithContext","FrameworkError","message","type","severity","code","originalError","recoverable","strategies","determineStrategies","handled","executeStrategies","recoveredValue","config","recoveryOptions","recoveryResult","attemptRecovery","value","typeStrategies","severityStrategies","defaultStrategies","strategy","logError","reportError","strategyError","logger","warn","errorInfo","extractErrorInfo","ErrorSeverity","CRITICAL","HIGH","MEDIUM","LOW","info","showDetailedErrorsInDev","process","env","NODE_ENV","detailedError","formatErrorForDev","console","debug","captureError","options","maxRetries","retryDelay","exponentialBackoff","shouldRetry","fallback","fallbackValue","Promise","resolve","fallbackError","attempt","delay","Math","pow","setTimeout","create","defaultErrorHandler","handler"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/error/ErrorHandler.ts"],"sourcesContent":["/**\n * 统一错误处理器\n * \n * 优化:\n * 1. 统一错误处理策略:记录、上报、恢复、降级\n * 2. 错误分类:致命、可恢复、警告\n * 3. 错误恢复机制:自动重试、降级方案\n */\n\nimport { logger } from '@vlian/logger';\nimport { errorUtils, ErrorSeverity, ErrorType, FrameworkError } from '@vlian/utils';\nimport type { MonitoringService } from '@vlian/monitoring';\n\n/**\n * 错误处理策略\n */\nexport enum ErrorHandlingStrategy {\n /**\n * 记录错误(日志)\n */\n LOG = 'LOG',\n /**\n * 上报错误(监控服务)\n */\n REPORT = 'REPORT',\n /**\n * 尝试恢复错误\n */\n RECOVER = 'RECOVER',\n /**\n * 降级处理\n */\n FALLBACK = 'FALLBACK',\n /**\n * 忽略错误\n */\n IGNORE = 'IGNORE',\n}\n\n/**\n * 错误恢复选项\n */\nexport interface ErrorRecoveryOptions {\n /**\n * 最大重试次数\n * @default 3\n */\n maxRetries?: number;\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n /**\n * 是否启用指数退避\n * @default true\n */\n exponentialBackoff?: boolean;\n /**\n * 重试条件函数\n */\n shouldRetry?: (error: unknown, attempt: number) => boolean;\n /**\n * 降级方案函数\n */\n fallback?: () => Promise<unknown> | unknown;\n}\n\n/**\n * 错误处理配置\n */\nexport interface ErrorHandlerConfig {\n /**\n * 监控服务实例(可选)\n */\n monitoring?: MonitoringService;\n /**\n * 默认错误处理策略\n * @default [ErrorHandlingStrategy.LOG, ErrorHandlingStrategy.REPORT]\n */\n defaultStrategies?: ErrorHandlingStrategy[];\n /**\n * 错误严重程度对应的处理策略\n */\n severityStrategies?: Partial<Record<ErrorSeverity, ErrorHandlingStrategy[]>>;\n /**\n * 错误类型对应的处理策略\n */\n typeStrategies?: Partial<Record<ErrorType, ErrorHandlingStrategy[]>>;\n /**\n * 错误恢复选项\n */\n recoveryOptions?: ErrorRecoveryOptions;\n /**\n * 是否在开发环境显示详细错误信息\n * @default true\n */\n showDetailedErrorsInDev?: boolean;\n}\n\n/**\n * 错误处理结果\n */\nexport interface ErrorHandleResult {\n /**\n * 是否已处理\n */\n handled: boolean;\n /**\n * 是否可恢复\n */\n recoverable: boolean;\n /**\n * 恢复后的结果(如果已恢复)\n */\n recoveredValue?: unknown;\n /**\n * 使用的处理策略\n */\n strategies: ErrorHandlingStrategy[];\n /**\n * 错误信息\n */\n error: FrameworkError;\n}\n\n/**\n * 统一错误处理器\n */\nexport class ErrorHandler {\n private config: Omit<Required<ErrorHandlerConfig>, 'monitoring'>;\n private monitoring?: MonitoringService;\n\n constructor(config: ErrorHandlerConfig = {}) {\n this.monitoring = config.monitoring;\n this.config = {\n defaultStrategies: config.defaultStrategies ?? [\n ErrorHandlingStrategy.LOG,\n ErrorHandlingStrategy.REPORT,\n ],\n severityStrategies: config.severityStrategies ?? {},\n typeStrategies: config.typeStrategies ?? {},\n recoveryOptions: config.recoveryOptions ?? {},\n showDetailedErrorsInDev: config.showDetailedErrorsInDev ?? true,\n };\n }\n\n /**\n * 设置监控服务\n */\n setMonitoring(monitoring: MonitoringService): void {\n this.monitoring = monitoring;\n }\n\n /**\n * 处理错误\n * \n * @param error - 错误对象\n * @param context - 错误上下文\n * @returns 错误处理结果\n */\n async handleError(\n error: unknown,\n context?: Record<string, unknown>\n ): Promise<ErrorHandleResult> {\n // 标准化错误对象\n const normalizedError = errorUtils.normalizeError(error);\n \n // 创建包含上下文信息的错误对象(由于 context 是只读的,需要创建新对象)\n const errorWithContext: FrameworkError = context\n ? new FrameworkError(\n normalizedError.message,\n normalizedError.type,\n normalizedError.severity,\n {\n code: normalizedError.code,\n originalError: normalizedError.originalError,\n context: {\n ...normalizedError.context,\n ...context,\n },\n recoverable: normalizedError.recoverable,\n }\n )\n : normalizedError;\n\n // 确定处理策略\n const strategies = this.determineStrategies(errorWithContext);\n \n // 执行处理策略\n const handled = await this.executeStrategies(errorWithContext, strategies);\n\n // 尝试恢复错误\n let recoveredValue: unknown | undefined;\n let recoverable = false;\n if (handled && errorWithContext.recoverable && this.config.recoveryOptions) {\n const recoveryResult = await this.attemptRecovery(errorWithContext);\n recoverable = recoveryResult.recoverable;\n recoveredValue = recoveryResult.value;\n }\n\n return {\n handled,\n recoverable,\n recoveredValue,\n strategies,\n error: errorWithContext,\n };\n }\n\n /**\n * 确定错误处理策略\n */\n private determineStrategies(error: FrameworkError): ErrorHandlingStrategy[] {\n // 1. 检查错误类型对应的策略\n if (this.config.typeStrategies[error.type]) {\n return this.config.typeStrategies[error.type]!;\n }\n\n // 2. 检查错误严重程度对应的策略\n if (this.config.severityStrategies[error.severity]) {\n return this.config.severityStrategies[error.severity]!;\n }\n\n // 3. 使用默认策略\n return this.config.defaultStrategies;\n }\n\n /**\n * 执行处理策略\n */\n private async executeStrategies(\n error: FrameworkError,\n strategies: ErrorHandlingStrategy[]\n ): Promise<boolean> {\n let handled = false;\n\n for (const strategy of strategies) {\n try {\n switch (strategy) {\n case ErrorHandlingStrategy.LOG:\n this.logError(error);\n handled = true;\n break;\n\n case ErrorHandlingStrategy.REPORT:\n await this.reportError(error);\n handled = true;\n break;\n\n case ErrorHandlingStrategy.RECOVER:\n // 恢复策略在 handleError 中统一处理\n handled = true;\n break;\n\n case ErrorHandlingStrategy.FALLBACK:\n // 降级策略在 attemptRecovery 中处理\n handled = true;\n break;\n\n case ErrorHandlingStrategy.IGNORE:\n // 忽略错误,不做任何处理\n handled = true;\n break;\n }\n } catch (strategyError) {\n logger.warn(`错误处理策略 ${strategy} 执行失败:`, strategyError);\n }\n }\n\n return handled;\n }\n\n /**\n * 记录错误\n */\n private logError(error: FrameworkError): void {\n const errorInfo = errorUtils.extractErrorInfo(error);\n \n // 根据错误严重程度选择日志级别\n switch (error.severity) {\n case ErrorSeverity.CRITICAL:\n case ErrorSeverity.HIGH:\n logger.error('错误:', errorInfo);\n break;\n case ErrorSeverity.MEDIUM:\n logger.warn('警告:', errorInfo);\n break;\n case ErrorSeverity.LOW:\n logger.info('信息:', errorInfo);\n break;\n }\n\n // 开发环境显示详细错误信息\n if (this.config.showDetailedErrorsInDev && process.env.NODE_ENV === 'development') {\n const detailedError = errorUtils.formatErrorForDev(error);\n console.error(detailedError);\n }\n }\n\n /**\n * 上报错误\n */\n private async reportError(error: FrameworkError): Promise<void> {\n if (!this.monitoring) {\n logger.debug('监控服务未配置,跳过错误上报');\n return;\n }\n\n try {\n this.monitoring.captureError(error, {\n severity: error.severity,\n type: error.type,\n code: error.code,\n context: error.context,\n });\n } catch (reportError) {\n logger.warn('错误上报失败:', reportError);\n }\n }\n\n /**\n * 尝试恢复错误\n */\n private async attemptRecovery(\n error: FrameworkError\n ): Promise<{ recoverable: boolean; value?: unknown }> {\n const options = this.config.recoveryOptions;\n if (!options) {\n return { recoverable: false };\n }\n\n const maxRetries = options.maxRetries ?? 3;\n const retryDelay = options.retryDelay ?? 1000;\n const exponentialBackoff = options.exponentialBackoff ?? true;\n const shouldRetry = options.shouldRetry ?? (() => true);\n\n // 如果有降级方案,先尝试降级\n if (options.fallback) {\n try {\n const fallbackValue = await Promise.resolve(options.fallback());\n logger.info('错误已通过降级方案恢复');\n return { recoverable: true, value: fallbackValue };\n } catch (fallbackError) {\n logger.warn('降级方案执行失败:', fallbackError);\n }\n }\n\n // 尝试重试(如果错误可恢复且满足重试条件)\n if (error.recoverable && shouldRetry(error, 0)) {\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n if (!shouldRetry(error, attempt)) {\n break;\n }\n\n const delay = exponentialBackoff\n ? retryDelay * Math.pow(2, attempt)\n : retryDelay;\n\n logger.debug(`错误恢复重试 ${attempt + 1}/${maxRetries},${delay}ms 后重试...`);\n\n await new Promise(resolve => setTimeout(resolve, delay));\n\n // 这里应该调用原始操作的重试逻辑\n // 由于错误处理器不知道原始操作,这里只返回可恢复状态\n // 实际的重试应该在调用方实现\n }\n }\n\n return { recoverable: error.recoverable };\n }\n\n /**\n * 创建错误处理器的便捷方法\n */\n static create(config?: ErrorHandlerConfig): ErrorHandler {\n return new ErrorHandler(config);\n }\n}\n\n/**\n * 默认错误处理器实例(单例)\n */\nlet defaultErrorHandler: ErrorHandler | null = null;\n\n/**\n * 获取默认错误处理器\n */\nexport function getDefaultErrorHandler(): ErrorHandler {\n if (!defaultErrorHandler) {\n defaultErrorHandler = new ErrorHandler();\n }\n return defaultErrorHandler;\n}\n\n/**\n * 设置默认错误处理器\n */\nexport function setDefaultErrorHandler(handler: ErrorHandler): void {\n defaultErrorHandler = handler;\n}\n"],"names":["logger","errorUtils","ErrorSeverity","FrameworkError","ErrorHandlingStrategy","ErrorHandler","setMonitoring","monitoring","handleError","error","context","normalizedError","normalizeError","errorWithContext","message","type","severity","code","originalError","recoverable","strategies","determineStrategies","handled","executeStrategies","recoveredValue","config","recoveryOptions","recoveryResult","attemptRecovery","value","typeStrategies","severityStrategies","defaultStrategies","strategy","logError","reportError","strategyError","warn","errorInfo","extractErrorInfo","CRITICAL","HIGH","MEDIUM","LOW","info","showDetailedErrorsInDev","process","env","NODE_ENV","detailedError","formatErrorForDev","console","debug","captureError","options","maxRetries","retryDelay","exponentialBackoff","shouldRetry","fallback","fallbackValue","Promise","resolve","fallbackError","attempt","delay","Math","pow","setTimeout","create","defaultErrorHandler","getDefaultErrorHandler","setDefaultErrorHandler","handler"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/error/index.ts"],"sourcesContent":["/**\n * 错误处理模块统一导出\n */\n\nexport { ErrorBoundary, withErrorBoundary, useErrorHandler } from './ErrorBoundary';\nexport type { ErrorBoundaryProps } from './ErrorBoundary';\nexport { ErrorHandler, getDefaultErrorHandler, setDefaultErrorHandler } from './ErrorHandler';\nexport type {\n ErrorHandlingStrategy,\n ErrorHandlerConfig,\n ErrorHandleResult,\n ErrorRecoveryOptions,\n} from './ErrorHandler';"],"names":["ErrorBoundary","ErrorHandler","getDefaultErrorHandler","setDefaultErrorHandler","useErrorHandler","withErrorBoundary"],"mappings":"AAAA;;CAEC;;;;;;;;;;;QAEQA;eAAAA,4BAAa;;QAEbC;eAAAA,0BAAY;;QAAEC;eAAAA,oCAAsB;;QAAEC;eAAAA,oCAAsB;;QAF1BC;eAAAA,8BAAe;;QAAlCC;eAAAA,gCAAiB;;;+BAAyB;8BAEW"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/error/index.ts"],"sourcesContent":["/**\n * 错误处理模块统一导出\n */\n\nexport { ErrorBoundary, withErrorBoundary, useErrorHandler } from './ErrorBoundary';\nexport type { ErrorBoundaryProps } from './ErrorBoundary';\nexport { ErrorHandler, getDefaultErrorHandler, setDefaultErrorHandler } from './ErrorHandler';\nexport type {\n ErrorHandlingStrategy,\n ErrorHandlerConfig,\n ErrorHandleResult,\n ErrorRecoveryOptions,\n} from './ErrorHandler';"],"names":["ErrorBoundary","withErrorBoundary","useErrorHandler","ErrorHandler","getDefaultErrorHandler","setDefaultErrorHandler"],"mappings":"AAAA;;CAEC,GAED,SAASA,aAAa,EAAEC,iBAAiB,EAAEC,eAAe,QAAQ,kBAAkB;AAEpF,SAASC,YAAY,EAAEC,sBAAsB,EAAEC,sBAAsB,QAAQ,iBAAiB"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/event/AppEventBus.ts"],"sourcesContent":["/**\n * 应用级事件总线\n * 提供高性能、类型安全、可观测的事件通信能力\n */\n\nimport { logger } from '@vlian/logger';\nimport type {\n EventListener,\n EventMetadata,\n EventWrapper,\n EventMiddleware,\n EventListenerOptions,\n AppEventBusConfig,\n EventStats,\n} from './types';\n\n/**\n * 带选项的监听器\n */\ninterface ListenerWithOptions {\n listener: EventListener;\n options: Required<EventListenerOptions>;\n id: symbol;\n}\n\n/**\n * 事件历史记录\n */\ninterface EventHistoryRecord {\n event: string;\n data: unknown;\n metadata: EventMetadata;\n executionTime?: number;\n}\n\n/**\n * 应用事件总线\n */\nexport class AppEventBus {\n /**\n * 事件监听器映射表\n * 使用 Map + Set 结构提高性能\n */\n private listeners: Map<string, Set<ListenerWithOptions>> = new Map();\n \n /**\n * 事件历史记录\n */\n private eventHistory: EventHistoryRecord[] = [];\n \n /**\n * 事件中间件列表\n */\n private middlewares: EventMiddleware[] = [];\n \n /**\n * 事件统计信息\n */\n private stats: Map<string, EventStats> = new Map();\n \n /**\n * 配置\n */\n private config: Required<AppEventBusConfig>;\n \n /**\n * 事件计数器(用于生成唯一事件ID)\n */\n private eventCounter: number = 0;\n \n /**\n * 监听器ID计数器\n */\n private listenerIdCounter: number = 0;\n\n constructor(config: AppEventBusConfig = {}) {\n this.config = {\n enableTracking: config.enableTracking ?? (process.env.NODE_ENV === 'development'),\n maxHistorySize: config.maxHistorySize ?? 100,\n enableValidation: config.enableValidation ?? false,\n validator: config.validator ?? (() => true),\n enablePerformanceMonitoring: config.enablePerformanceMonitoring ?? (process.env.NODE_ENV === 'development'),\n namespacePrefix: config.namespacePrefix ?? '',\n instanceId: config.instanceId,\n enableSecurityMode: config.enableSecurityMode ?? false,\n allowedSources: config.allowedSources ?? [],\n } as Required<AppEventBusConfig>;\n }\n\n /**\n * 订阅事件\n * \n * @param event - 事件名称\n * @param listener - 事件监听器\n * @param options - 监听器选项\n * @returns 取消订阅函数\n * \n * @example\n * ```typescript\n * const unsubscribe = eventBus.on('user:login', (data, metadata) => {\n * console.log('用户登录:', data);\n * });\n * \n * // 取消订阅\n * unsubscribe();\n * ```\n */\n on<T = unknown>(\n event: string,\n listener: EventListener<T>,\n options: EventListenerOptions = {}\n ): () => void {\n const fullEventName = this.getFullEventName(event);\n const listenerId = Symbol(`listener_${++this.listenerIdCounter}`);\n \n const listenerWithOptions: ListenerWithOptions = {\n listener: listener as EventListener,\n options: {\n priority: options.priority ?? 100,\n once: options.once ?? false,\n namespace: options.namespace ?? this.config.namespacePrefix,\n async: options.async ?? true,\n },\n id: listenerId,\n };\n\n if (!this.listeners.has(fullEventName)) {\n this.listeners.set(fullEventName, new Set());\n }\n\n const listeners = this.listeners.get(fullEventName)!;\n listeners.add(listenerWithOptions);\n\n // 按优先级排序(数字越小优先级越高)\n const sortedListeners = Array.from(listeners).sort(\n (a, b) => a.options.priority - b.options.priority\n );\n this.listeners.set(fullEventName, new Set(sortedListeners));\n\n // 返回取消订阅函数\n return () => {\n const currentListeners = this.listeners.get(fullEventName);\n if (currentListeners) {\n currentListeners.delete(listenerWithOptions);\n if (currentListeners.size === 0) {\n this.listeners.delete(fullEventName);\n }\n }\n };\n }\n\n /**\n * 取消订阅事件\n * \n * @param event - 事件名称\n * @param listener - 事件监听器(可选,不提供则取消该事件的所有监听器)\n */\n off<T = unknown>(event: string, listener?: EventListener<T>): void {\n const fullEventName = this.getFullEventName(event);\n const listeners = this.listeners.get(fullEventName);\n \n if (!listeners) {\n return;\n }\n\n if (listener) {\n // 移除指定的监听器\n for (const item of listeners) {\n if (item.listener === listener) {\n listeners.delete(item);\n break;\n }\n }\n } else {\n // 移除所有监听器\n listeners.clear();\n }\n\n if (listeners.size === 0) {\n this.listeners.delete(fullEventName);\n }\n }\n\n /**\n * 一次性订阅事件\n * \n * @param event - 事件名称\n * @param listener - 事件监听器\n * @param options - 监听器选项\n */\n once<T = unknown>(\n event: string,\n listener: EventListener<T>,\n options?: Omit<EventListenerOptions, 'once'>\n ): () => void {\n return this.on(event, listener, { ...options, once: true });\n }\n\n /**\n * 发布事件\n * \n * @param event - 事件名称\n * @param data - 事件数据\n * @param metadata - 事件元数据(可选)\n * \n * @example\n * ```typescript\n * await eventBus.emit('user:login', {\n * userId: '123',\n * username: 'john',\n * });\n * ```\n */\n async emit<T = unknown>(\n event: string,\n data?: T,\n metadata?: Partial<EventMetadata>\n ): Promise<void> {\n const fullEventName = this.getFullEventName(event);\n const startTime = this.config.enablePerformanceMonitoring ? performance.now() : 0;\n\n // 事件验证\n if (this.config.enableValidation && !this.config.validator(fullEventName, data)) {\n logger.warn(`事件 ${fullEventName} 验证失败,已忽略`);\n return;\n }\n\n // 安全检查\n if (this.config.enableSecurityMode && metadata?.source) {\n if (!this.config.allowedSources.includes(metadata.source)) {\n logger.warn(`事件 ${fullEventName} 的来源 ${metadata.source} 不在白名单中,已忽略`);\n return;\n }\n }\n\n // 构建事件元数据\n const eventMetadata: EventMetadata = {\n source: metadata?.source,\n timestamp: metadata?.timestamp ?? Date.now(),\n eventId: metadata?.eventId ?? `event_${++this.eventCounter}`,\n priority: metadata?.priority ?? 0,\n instanceId: metadata?.instanceId ?? this.config.instanceId,\n namespace: metadata?.namespace ?? this.config.namespacePrefix,\n ...metadata,\n };\n\n // 创建事件包装器\n const eventWrapper: EventWrapper<T> = {\n data: data as T,\n metadata: eventMetadata,\n };\n\n // 执行中间件(中间件可以阻止事件传播)\n if (this.middlewares.length > 0) {\n let middlewareIndex = 0;\n let nextCalled = false;\n \n const executeMiddleware = async (): Promise<void> => {\n if (middlewareIndex < this.middlewares.length) {\n nextCalled = false;\n const currentIndex = middlewareIndex;\n const middleware = this.middlewares[middlewareIndex++];\n \n const next = async () => {\n nextCalled = true;\n if (currentIndex < this.middlewares.length - 1) {\n await executeMiddleware();\n }\n };\n \n await Promise.resolve(middleware(fullEventName, data, eventMetadata, next));\n \n // 如果中间件没有调用 next(),阻止事件传播\n if (!nextCalled) {\n return;\n }\n }\n };\n \n await executeMiddleware();\n \n // 如果最后一个中间件没有调用 next(),阻止事件传播\n if (!nextCalled && this.middlewares.length > 0) {\n return;\n }\n }\n\n // 获取监听器\n const listeners = this.listeners.get(fullEventName);\n \n // 记录事件历史(无论是否有监听器)\n if (this.config.enableTracking) {\n const executionTime = this.config.enablePerformanceMonitoring\n ? performance.now() - startTime\n : undefined;\n this.recordEventHistory(fullEventName, data, eventMetadata, executionTime);\n }\n \n if (!listeners || listeners.size === 0) {\n // 更新统计(即使没有监听器也记录)\n this.updateStats(fullEventName, 0);\n return;\n }\n\n // 执行监听器\n const executionPromises: Promise<void>[] = [];\n const listenersToRemove: ListenerWithOptions[] = [];\n\n for (const listenerWithOptions of listeners) {\n const executeListener = async () => {\n try {\n if (listenerWithOptions.options.async) {\n await Promise.resolve(\n listenerWithOptions.listener(eventWrapper.data, eventWrapper.metadata)\n );\n } else {\n listenerWithOptions.listener(eventWrapper.data, eventWrapper.metadata);\n }\n\n // 如果是一次性监听器,标记为待移除\n if (listenerWithOptions.options.once) {\n listenersToRemove.push(listenerWithOptions);\n }\n } catch (error) {\n logger.error(`事件 ${fullEventName} 的监听器执行失败:`, error);\n }\n };\n\n executionPromises.push(executeListener());\n }\n\n // 等待所有监听器执行完成\n await Promise.allSettled(executionPromises);\n\n // 移除一次性监听器\n for (const listenerToRemove of listenersToRemove) {\n listeners.delete(listenerToRemove);\n }\n\n if (listeners.size === 0) {\n this.listeners.delete(fullEventName);\n }\n\n // 更新统计信息\n const executionTime = this.config.enablePerformanceMonitoring\n ? performance.now() - startTime\n : 0;\n this.updateStats(fullEventName, executionTime, listeners.size);\n }\n\n /**\n * 同步发布事件(不等待异步监听器完成)\n * \n * @param event - 事件名称\n * @param data - 事件数据\n * @param metadata - 事件元数据(可选)\n */\n emitSync<T = unknown>(\n event: string,\n data?: T,\n metadata?: Partial<EventMetadata>\n ): void {\n // 同步执行 emit,但不等待 Promise 完成\n this.emit(event, data, metadata).catch((error) => {\n logger.error(`同步发布事件 ${event} 失败:`, error);\n });\n }\n\n /**\n * 注册事件中间件\n * \n * @param middleware - 中间件函数\n * @returns 取消注册函数\n * \n * @example\n * ```typescript\n * const unsubscribe = eventBus.use((event, data, metadata, next) => {\n * console.log('事件触发:', event);\n * return next();\n * });\n * ```\n */\n use(middleware: EventMiddleware): () => void {\n this.middlewares.push(middleware);\n \n return () => {\n const index = this.middlewares.indexOf(middleware);\n if (index > -1) {\n this.middlewares.splice(index, 1);\n }\n };\n }\n\n /**\n * 清空所有事件监听器\n */\n clear(): void {\n this.listeners.clear();\n }\n\n /**\n * 清空事件历史记录\n */\n clearHistory(): void {\n this.eventHistory = [];\n }\n\n /**\n * 获取事件监听器数量\n * \n * @param event - 事件名称(可选,不提供则返回所有事件的监听器总数)\n */\n listenerCount(event?: string): number {\n if (event) {\n const fullEventName = this.getFullEventName(event);\n return this.listeners.get(fullEventName)?.size || 0;\n }\n\n let count = 0;\n for (const listeners of this.listeners.values()) {\n count += listeners.size;\n }\n return count;\n }\n\n /**\n * 获取所有事件名称\n */\n eventNames(): string[] {\n return Array.from(this.listeners.keys());\n }\n\n /**\n * 获取事件历史记录\n * \n * @param event - 事件名称(可选,如果提供则只返回该事件的历史)\n * @param limit - 限制返回的记录数\n */\n getEventHistory(event?: string, limit?: number): EventHistoryRecord[] {\n if (!this.config.enableTracking) {\n return [];\n }\n\n let history = this.eventHistory;\n if (event) {\n const fullEventName = this.getFullEventName(event);\n history = history.filter((h) => h.event === fullEventName);\n }\n\n if (limit) {\n history = history.slice(-limit);\n }\n\n return [...history];\n }\n\n /**\n * 获取事件统计信息\n * \n * @param event - 事件名称(可选,不提供则返回所有事件的统计)\n */\n getStats(event?: string): EventStats | Map<string, EventStats> {\n if (event) {\n const fullEventName = this.getFullEventName(event);\n return this.stats.get(fullEventName) || {\n event: fullEventName,\n count: 0,\n avgExecutionTime: 0,\n listenerCount: 0,\n lastTriggered: 0,\n };\n }\n\n return new Map(this.stats);\n }\n\n /**\n * 获取配置\n */\n getConfig(): AppEventBusConfig {\n return { ...this.config };\n }\n\n /**\n * 更新配置\n */\n updateConfig(config: Partial<AppEventBusConfig>): void {\n this.config = {\n ...this.config,\n ...config,\n };\n }\n\n /**\n * 销毁事件总线(清理所有资源)\n */\n destroy(): void {\n this.clear();\n this.clearHistory();\n this.middlewares = [];\n this.stats.clear();\n }\n\n /**\n * 获取完整事件名称(包含命名空间前缀)\n */\n private getFullEventName(event: string): string {\n if (this.config.namespacePrefix) {\n return `${this.config.namespacePrefix}${event}`;\n }\n return event;\n }\n\n /**\n * 记录事件历史\n */\n private recordEventHistory(\n event: string,\n data: unknown,\n metadata: EventMetadata,\n executionTime?: number\n ): void {\n this.eventHistory.push({\n event,\n data,\n metadata,\n executionTime,\n });\n\n // 限制历史记录大小\n if (this.eventHistory.length > this.config.maxHistorySize) {\n this.eventHistory.shift();\n }\n }\n\n /**\n * 更新统计信息\n */\n private updateStats(\n event: string,\n executionTime: number,\n listenerCount: number = 0\n ): void {\n if (!this.config.enablePerformanceMonitoring) {\n return;\n }\n\n const existingStats = this.stats.get(event);\n if (existingStats) {\n const totalTime = existingStats.avgExecutionTime * existingStats.count + executionTime;\n const newCount = existingStats.count + 1;\n \n this.stats.set(event, {\n ...existingStats,\n count: newCount,\n avgExecutionTime: totalTime / newCount,\n listenerCount,\n lastTriggered: Date.now(),\n });\n } else {\n this.stats.set(event, {\n event,\n count: 1,\n avgExecutionTime: executionTime,\n listenerCount,\n lastTriggered: Date.now(),\n });\n }\n }\n}\n"],"names":["AppEventBus","on","event","listener","options","fullEventName","getFullEventName","listenerId","Symbol","listenerIdCounter","listenerWithOptions","priority","once","namespace","config","namespacePrefix","async","id","listeners","has","set","Set","get","add","sortedListeners","Array","from","sort","a","b","currentListeners","delete","size","off","item","clear","emit","data","metadata","startTime","enablePerformanceMonitoring","performance","now","enableValidation","validator","logger","warn","enableSecurityMode","source","allowedSources","includes","eventMetadata","timestamp","Date","eventId","eventCounter","instanceId","eventWrapper","middlewares","length","middlewareIndex","nextCalled","executeMiddleware","currentIndex","middleware","next","Promise","resolve","enableTracking","executionTime","undefined","recordEventHistory","updateStats","executionPromises","listenersToRemove","executeListener","push","error","allSettled","listenerToRemove","emitSync","catch","use","index","indexOf","splice","clearHistory","eventHistory","listenerCount","count","values","eventNames","keys","getEventHistory","limit","history","filter","h","slice","getStats","stats","avgExecutionTime","lastTriggered","Map","getConfig","updateConfig","destroy","maxHistorySize","shift","existingStats","totalTime","newCount","process","env","NODE_ENV"],"mappings":"AAAA;;;CAGC;;;;+BAmCYA;;;eAAAA;;;wBAjCU;;;;;;;;;;;;;;AAiChB,IAAA,AAAMA,cAAN,MAAMA;IAmDX;;;;;;;;;;;;;;;;;GAiBC,GACDC,GACEC,KAAa,EACbC,QAA0B,EAC1BC,UAAgC,CAAC,CAAC,EACtB;QACZ,MAAMC,gBAAgB,IAAI,CAACC,gBAAgB,CAACJ;QAC5C,MAAMK,aAAaC,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,CAACC,iBAAiB,EAAE;QAEhE,MAAMC,sBAA2C;YAC/CP,UAAUA;YACVC,SAAS;gBACPO,UAAUP,QAAQO,QAAQ,IAAI;gBAC9BC,MAAMR,QAAQQ,IAAI,IAAI;gBACtBC,WAAWT,QAAQS,SAAS,IAAI,IAAI,CAACC,MAAM,CAACC,eAAe;gBAC3DC,OAAOZ,QAAQY,KAAK,IAAI;YAC1B;YACAC,IAAIV;QACN;QAEA,IAAI,CAAC,IAAI,CAACW,SAAS,CAACC,GAAG,CAACd,gBAAgB;YACtC,IAAI,CAACa,SAAS,CAACE,GAAG,CAACf,eAAe,IAAIgB;QACxC;QAEA,MAAMH,YAAY,IAAI,CAACA,SAAS,CAACI,GAAG,CAACjB;QACrCa,UAAUK,GAAG,CAACb;QAEd,oBAAoB;QACpB,MAAMc,kBAAkBC,MAAMC,IAAI,CAACR,WAAWS,IAAI,CAChD,CAACC,GAAGC,IAAMD,EAAExB,OAAO,CAACO,QAAQ,GAAGkB,EAAEzB,OAAO,CAACO,QAAQ;QAEnD,IAAI,CAACO,SAAS,CAACE,GAAG,CAACf,eAAe,IAAIgB,IAAIG;QAE1C,WAAW;QACX,OAAO;YACL,MAAMM,mBAAmB,IAAI,CAACZ,SAAS,CAACI,GAAG,CAACjB;YAC5C,IAAIyB,kBAAkB;gBACpBA,iBAAiBC,MAAM,CAACrB;gBACxB,IAAIoB,iBAAiBE,IAAI,KAAK,GAAG;oBAC/B,IAAI,CAACd,SAAS,CAACa,MAAM,CAAC1B;gBACxB;YACF;QACF;IACF;IAEA;;;;;GAKC,GACD4B,IAAiB/B,KAAa,EAAEC,QAA2B,EAAQ;QACjE,MAAME,gBAAgB,IAAI,CAACC,gBAAgB,CAACJ;QAC5C,MAAMgB,YAAY,IAAI,CAACA,SAAS,CAACI,GAAG,CAACjB;QAErC,IAAI,CAACa,WAAW;YACd;QACF;QAEA,IAAIf,UAAU;YACZ,WAAW;YACX,KAAK,MAAM+B,QAAQhB,UAAW;gBAC5B,IAAIgB,KAAK/B,QAAQ,KAAKA,UAAU;oBAC9Be,UAAUa,MAAM,CAACG;oBACjB;gBACF;YACF;QACF,OAAO;YACL,UAAU;YACVhB,UAAUiB,KAAK;QACjB;QAEA,IAAIjB,UAAUc,IAAI,KAAK,GAAG;YACxB,IAAI,CAACd,SAAS,CAACa,MAAM,CAAC1B;QACxB;IACF;IAEA;;;;;;GAMC,GACDO,KACEV,KAAa,EACbC,QAA0B,EAC1BC,OAA4C,EAChC;QACZ,OAAO,IAAI,CAACH,EAAE,CAACC,OAAOC,UAAU;YAAE,GAAGC,OAAO;YAAEQ,MAAM;QAAK;IAC3D;IAEA;;;;;;;;;;;;;;GAcC,GACD,MAAMwB,KACJlC,KAAa,EACbmC,IAAQ,EACRC,QAAiC,EAClB;QACf,MAAMjC,gBAAgB,IAAI,CAACC,gBAAgB,CAACJ;QAC5C,MAAMqC,YAAY,IAAI,CAACzB,MAAM,CAAC0B,2BAA2B,GAAGC,YAAYC,GAAG,KAAK;QAEhF,OAAO;QACP,IAAI,IAAI,CAAC5B,MAAM,CAAC6B,gBAAgB,IAAI,CAAC,IAAI,CAAC7B,MAAM,CAAC8B,SAAS,CAACvC,eAAegC,OAAO;YAC/EQ,cAAM,CAACC,IAAI,CAAC,CAAC,GAAG,EAAEzC,cAAc,SAAS,CAAC;YAC1C;QACF;QAEA,OAAO;QACP,IAAI,IAAI,CAACS,MAAM,CAACiC,kBAAkB,IAAIT,UAAUU,QAAQ;YACtD,IAAI,CAAC,IAAI,CAAClC,MAAM,CAACmC,cAAc,CAACC,QAAQ,CAACZ,SAASU,MAAM,GAAG;gBACzDH,cAAM,CAACC,IAAI,CAAC,CAAC,GAAG,EAAEzC,cAAc,KAAK,EAAEiC,SAASU,MAAM,CAAC,WAAW,CAAC;gBACnE;YACF;QACF;QAEA,UAAU;QACV,MAAMG,gBAA+B;YACnCH,QAAQV,UAAUU;YAClBI,WAAWd,UAAUc,aAAaC,KAAKX,GAAG;YAC1CY,SAAShB,UAAUgB,WAAW,CAAC,MAAM,EAAE,EAAE,IAAI,CAACC,YAAY,EAAE;YAC5D5C,UAAU2B,UAAU3B,YAAY;YAChC6C,YAAYlB,UAAUkB,cAAc,IAAI,CAAC1C,MAAM,CAAC0C,UAAU;YAC1D3C,WAAWyB,UAAUzB,aAAa,IAAI,CAACC,MAAM,CAACC,eAAe;YAC7D,GAAGuB,QAAQ;QACb;QAEA,UAAU;QACV,MAAMmB,eAAgC;YACpCpB,MAAMA;YACNC,UAAUa;QACZ;QAEA,qBAAqB;QACrB,IAAI,IAAI,CAACO,WAAW,CAACC,MAAM,GAAG,GAAG;YAC/B,IAAIC,kBAAkB;YACtB,IAAIC,aAAa;YAEjB,MAAMC,oBAAoB;gBACxB,IAAIF,kBAAkB,IAAI,CAACF,WAAW,CAACC,MAAM,EAAE;oBAC7CE,aAAa;oBACb,MAAME,eAAeH;oBACrB,MAAMI,aAAa,IAAI,CAACN,WAAW,CAACE,kBAAkB;oBAEtD,MAAMK,OAAO;wBACXJ,aAAa;wBACb,IAAIE,eAAe,IAAI,CAACL,WAAW,CAACC,MAAM,GAAG,GAAG;4BAC9C,MAAMG;wBACR;oBACF;oBAEA,MAAMI,QAAQC,OAAO,CAACH,WAAW3D,eAAegC,MAAMc,eAAec;oBAErE,0BAA0B;oBAC1B,IAAI,CAACJ,YAAY;wBACf;oBACF;gBACF;YACF;YAEA,MAAMC;YAEN,8BAA8B;YAC9B,IAAI,CAACD,cAAc,IAAI,CAACH,WAAW,CAACC,MAAM,GAAG,GAAG;gBAC9C;YACF;QACF;QAEA,QAAQ;QACR,MAAMzC,YAAY,IAAI,CAACA,SAAS,CAACI,GAAG,CAACjB;QAErC,mBAAmB;QACnB,IAAI,IAAI,CAACS,MAAM,CAACsD,cAAc,EAAE;YAC9B,MAAMC,gBAAgB,IAAI,CAACvD,MAAM,CAAC0B,2BAA2B,GACzDC,YAAYC,GAAG,KAAKH,YACpB+B;YACJ,IAAI,CAACC,kBAAkB,CAAClE,eAAegC,MAAMc,eAAekB;QAC9D;QAEA,IAAI,CAACnD,aAAaA,UAAUc,IAAI,KAAK,GAAG;YACtC,mBAAmB;YACnB,IAAI,CAACwC,WAAW,CAACnE,eAAe;YAChC;QACF;QAEA,QAAQ;QACR,MAAMoE,oBAAqC,EAAE;QAC7C,MAAMC,oBAA2C,EAAE;QAEnD,KAAK,MAAMhE,uBAAuBQ,UAAW;YAC3C,MAAMyD,kBAAkB;gBACtB,IAAI;oBACF,IAAIjE,oBAAoBN,OAAO,CAACY,KAAK,EAAE;wBACrC,MAAMkD,QAAQC,OAAO,CACnBzD,oBAAoBP,QAAQ,CAACsD,aAAapB,IAAI,EAAEoB,aAAanB,QAAQ;oBAEzE,OAAO;wBACL5B,oBAAoBP,QAAQ,CAACsD,aAAapB,IAAI,EAAEoB,aAAanB,QAAQ;oBACvE;oBAEA,mBAAmB;oBACnB,IAAI5B,oBAAoBN,OAAO,CAACQ,IAAI,EAAE;wBACpC8D,kBAAkBE,IAAI,CAAClE;oBACzB;gBACF,EAAE,OAAOmE,OAAO;oBACdhC,cAAM,CAACgC,KAAK,CAAC,CAAC,GAAG,EAAExE,cAAc,UAAU,CAAC,EAAEwE;gBAChD;YACF;YAEAJ,kBAAkBG,IAAI,CAACD;QACzB;QAEA,cAAc;QACd,MAAMT,QAAQY,UAAU,CAACL;QAEzB,WAAW;QACX,KAAK,MAAMM,oBAAoBL,kBAAmB;YAChDxD,UAAUa,MAAM,CAACgD;QACnB;QAEA,IAAI7D,UAAUc,IAAI,KAAK,GAAG;YACxB,IAAI,CAACd,SAAS,CAACa,MAAM,CAAC1B;QACxB;QAEA,SAAS;QACT,MAAMgE,gBAAgB,IAAI,CAACvD,MAAM,CAAC0B,2BAA2B,GACzDC,YAAYC,GAAG,KAAKH,YACpB;QACJ,IAAI,CAACiC,WAAW,CAACnE,eAAegE,eAAenD,UAAUc,IAAI;IAC/D;IAEA;;;;;;GAMC,GACDgD,SACE9E,KAAa,EACbmC,IAAQ,EACRC,QAAiC,EAC3B;QACN,4BAA4B;QAC5B,IAAI,CAACF,IAAI,CAAClC,OAAOmC,MAAMC,UAAU2C,KAAK,CAAC,CAACJ;YACtChC,cAAM,CAACgC,KAAK,CAAC,CAAC,OAAO,EAAE3E,MAAM,IAAI,CAAC,EAAE2E;QACtC;IACF;IAEA;;;;;;;;;;;;;GAaC,GACDK,IAAIlB,UAA2B,EAAc;QAC3C,IAAI,CAACN,WAAW,CAACkB,IAAI,CAACZ;QAEtB,OAAO;YACL,MAAMmB,QAAQ,IAAI,CAACzB,WAAW,CAAC0B,OAAO,CAACpB;YACvC,IAAImB,QAAQ,CAAC,GAAG;gBACd,IAAI,CAACzB,WAAW,CAAC2B,MAAM,CAACF,OAAO;YACjC;QACF;IACF;IAEA;;GAEC,GACDhD,QAAc;QACZ,IAAI,CAACjB,SAAS,CAACiB,KAAK;IACtB;IAEA;;GAEC,GACDmD,eAAqB;QACnB,IAAI,CAACC,YAAY,GAAG,EAAE;IACxB;IAEA;;;;GAIC,GACDC,cAActF,KAAc,EAAU;QACpC,IAAIA,OAAO;YACT,MAAMG,gBAAgB,IAAI,CAACC,gBAAgB,CAACJ;YAC5C,OAAO,IAAI,CAACgB,SAAS,CAACI,GAAG,CAACjB,gBAAgB2B,QAAQ;QACpD;QAEA,IAAIyD,QAAQ;QACZ,KAAK,MAAMvE,aAAa,IAAI,CAACA,SAAS,CAACwE,MAAM,GAAI;YAC/CD,SAASvE,UAAUc,IAAI;QACzB;QACA,OAAOyD;IACT;IAEA;;GAEC,GACDE,aAAuB;QACrB,OAAOlE,MAAMC,IAAI,CAAC,IAAI,CAACR,SAAS,CAAC0E,IAAI;IACvC;IAEA;;;;;GAKC,GACDC,gBAAgB3F,KAAc,EAAE4F,KAAc,EAAwB;QACpE,IAAI,CAAC,IAAI,CAAChF,MAAM,CAACsD,cAAc,EAAE;YAC/B,OAAO,EAAE;QACX;QAEA,IAAI2B,UAAU,IAAI,CAACR,YAAY;QAC/B,IAAIrF,OAAO;YACT,MAAMG,gBAAgB,IAAI,CAACC,gBAAgB,CAACJ;YAC5C6F,UAAUA,QAAQC,MAAM,CAAC,CAACC,IAAMA,EAAE/F,KAAK,KAAKG;QAC9C;QAEA,IAAIyF,OAAO;YACTC,UAAUA,QAAQG,KAAK,CAAC,CAACJ;QAC3B;QAEA,OAAO;eAAIC;SAAQ;IACrB;IAEA;;;;GAIC,GACDI,SAASjG,KAAc,EAAwC;QAC7D,IAAIA,OAAO;YACT,MAAMG,gBAAgB,IAAI,CAACC,gBAAgB,CAACJ;YAC5C,OAAO,IAAI,CAACkG,KAAK,CAAC9E,GAAG,CAACjB,kBAAkB;gBACtCH,OAAOG;gBACPoF,OAAO;gBACPY,kBAAkB;gBAClBb,eAAe;gBACfc,eAAe;YACjB;QACF;QAEA,OAAO,IAAIC,IAAI,IAAI,CAACH,KAAK;IAC3B;IAEA;;GAEC,GACDI,YAA+B;QAC7B,OAAO;YAAE,GAAG,IAAI,CAAC1F,MAAM;QAAC;IAC1B;IAEA;;GAEC,GACD2F,aAAa3F,MAAkC,EAAQ;QACrD,IAAI,CAACA,MAAM,GAAG;YACZ,GAAG,IAAI,CAACA,MAAM;YACd,GAAGA,MAAM;QACX;IACF;IAEA;;GAEC,GACD4F,UAAgB;QACd,IAAI,CAACvE,KAAK;QACV,IAAI,CAACmD,YAAY;QACjB,IAAI,CAAC5B,WAAW,GAAG,EAAE;QACrB,IAAI,CAAC0C,KAAK,CAACjE,KAAK;IAClB;IAEA;;GAEC,GACD,AAAQ7B,iBAAiBJ,KAAa,EAAU;QAC9C,IAAI,IAAI,CAACY,MAAM,CAACC,eAAe,EAAE;YAC/B,OAAO,GAAG,IAAI,CAACD,MAAM,CAACC,eAAe,GAAGb,OAAO;QACjD;QACA,OAAOA;IACT;IAEA;;GAEC,GACD,AAAQqE,mBACNrE,KAAa,EACbmC,IAAa,EACbC,QAAuB,EACvB+B,aAAsB,EAChB;QACN,IAAI,CAACkB,YAAY,CAACX,IAAI,CAAC;YACrB1E;YACAmC;YACAC;YACA+B;QACF;QAEA,WAAW;QACX,IAAI,IAAI,CAACkB,YAAY,CAAC5B,MAAM,GAAG,IAAI,CAAC7C,MAAM,CAAC6F,cAAc,EAAE;YACzD,IAAI,CAACpB,YAAY,CAACqB,KAAK;QACzB;IACF;IAEA;;GAEC,GACD,AAAQpC,YACNtE,KAAa,EACbmE,aAAqB,EACrBmB,gBAAwB,CAAC,EACnB;QACN,IAAI,CAAC,IAAI,CAAC1E,MAAM,CAAC0B,2BAA2B,EAAE;YAC5C;QACF;QAEA,MAAMqE,gBAAgB,IAAI,CAACT,KAAK,CAAC9E,GAAG,CAACpB;QACrC,IAAI2G,eAAe;YACjB,MAAMC,YAAYD,cAAcR,gBAAgB,GAAGQ,cAAcpB,KAAK,GAAGpB;YACzE,MAAM0C,WAAWF,cAAcpB,KAAK,GAAG;YAEvC,IAAI,CAACW,KAAK,CAAChF,GAAG,CAAClB,OAAO;gBACpB,GAAG2G,aAAa;gBAChBpB,OAAOsB;gBACPV,kBAAkBS,YAAYC;gBAC9BvB;gBACAc,eAAejD,KAAKX,GAAG;YACzB;QACF,OAAO;YACL,IAAI,CAAC0D,KAAK,CAAChF,GAAG,CAAClB,OAAO;gBACpBA;gBACAuF,OAAO;gBACPY,kBAAkBhC;gBAClBmB;gBACAc,eAAejD,KAAKX,GAAG;YACzB;QACF;IACF;IA7eA,YAAY5B,SAA4B,CAAC,CAAC,CAAE;QApC5C;;;GAGC,GACD,uBAAQI,aAAmD,IAAIqF;QAE/D;;GAEC,GACD,uBAAQhB,gBAAqC,EAAE;QAE/C;;GAEC,GACD,uBAAQ7B,eAAiC,EAAE;QAE3C;;GAEC,GACD,uBAAQ0C,SAAiC,IAAIG;QAE7C;;GAEC,GACD,uBAAQzF,UAAR,KAAA;QAEA;;GAEC,GACD,uBAAQyC,gBAAuB;QAE/B;;GAEC,GACD,uBAAQ9C,qBAA4B;QAGlC,IAAI,CAACK,MAAM,GAAG;YACZsD,gBAAgBtD,OAAOsD,cAAc,IAAK4C,QAAQC,GAAG,CAACC,QAAQ,KAAK;YACnEP,gBAAgB7F,OAAO6F,cAAc,IAAI;YACzChE,kBAAkB7B,OAAO6B,gBAAgB,IAAI;YAC7CC,WAAW9B,OAAO8B,SAAS,IAAK,CAAA,IAAM,IAAG;YACzCJ,6BAA6B1B,OAAO0B,2BAA2B,IAAKwE,QAAQC,GAAG,CAACC,QAAQ,KAAK;YAC7FnG,iBAAiBD,OAAOC,eAAe,IAAI;YAC3CyC,YAAY1C,OAAO0C,UAAU;YAC7BT,oBAAoBjC,OAAOiC,kBAAkB,IAAI;YACjDE,gBAAgBnC,OAAOmC,cAAc,IAAI,EAAE;QAC7C;IACF;AAkeF"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/event/AppEventBus.ts"],"sourcesContent":["/**\n * 应用级事件总线\n * 提供高性能、类型安全、可观测的事件通信能力\n */\n\nimport { logger } from '@vlian/logger';\nimport type {\n EventListener,\n EventMetadata,\n EventWrapper,\n EventMiddleware,\n EventListenerOptions,\n AppEventBusConfig,\n EventStats,\n} from './types';\n\n/**\n * 带选项的监听器\n */\ninterface ListenerWithOptions {\n listener: EventListener;\n options: Required<EventListenerOptions>;\n id: symbol;\n}\n\n/**\n * 事件历史记录\n */\ninterface EventHistoryRecord {\n event: string;\n data: unknown;\n metadata: EventMetadata;\n executionTime?: number;\n}\n\n/**\n * 应用事件总线\n */\nexport class AppEventBus {\n /**\n * 事件监听器映射表\n * 使用 Map + Set 结构提高性能\n */\n private listeners: Map<string, Set<ListenerWithOptions>> = new Map();\n \n /**\n * 事件历史记录\n */\n private eventHistory: EventHistoryRecord[] = [];\n \n /**\n * 事件中间件列表\n */\n private middlewares: EventMiddleware[] = [];\n \n /**\n * 事件统计信息\n */\n private stats: Map<string, EventStats> = new Map();\n \n /**\n * 配置\n */\n private config: Required<AppEventBusConfig>;\n \n /**\n * 事件计数器(用于生成唯一事件ID)\n */\n private eventCounter: number = 0;\n \n /**\n * 监听器ID计数器\n */\n private listenerIdCounter: number = 0;\n\n constructor(config: AppEventBusConfig = {}) {\n this.config = {\n enableTracking: config.enableTracking ?? (process.env.NODE_ENV === 'development'),\n maxHistorySize: config.maxHistorySize ?? 100,\n enableValidation: config.enableValidation ?? false,\n validator: config.validator ?? (() => true),\n enablePerformanceMonitoring: config.enablePerformanceMonitoring ?? (process.env.NODE_ENV === 'development'),\n namespacePrefix: config.namespacePrefix ?? '',\n instanceId: config.instanceId,\n enableSecurityMode: config.enableSecurityMode ?? false,\n allowedSources: config.allowedSources ?? [],\n } as Required<AppEventBusConfig>;\n }\n\n /**\n * 订阅事件\n * \n * @param event - 事件名称\n * @param listener - 事件监听器\n * @param options - 监听器选项\n * @returns 取消订阅函数\n * \n * @example\n * ```typescript\n * const unsubscribe = eventBus.on('user:login', (data, metadata) => {\n * console.log('用户登录:', data);\n * });\n * \n * // 取消订阅\n * unsubscribe();\n * ```\n */\n on<T = unknown>(\n event: string,\n listener: EventListener<T>,\n options: EventListenerOptions = {}\n ): () => void {\n const fullEventName = this.getFullEventName(event);\n const listenerId = Symbol(`listener_${++this.listenerIdCounter}`);\n \n const listenerWithOptions: ListenerWithOptions = {\n listener: listener as EventListener,\n options: {\n priority: options.priority ?? 100,\n once: options.once ?? false,\n namespace: options.namespace ?? this.config.namespacePrefix,\n async: options.async ?? true,\n },\n id: listenerId,\n };\n\n if (!this.listeners.has(fullEventName)) {\n this.listeners.set(fullEventName, new Set());\n }\n\n const listeners = this.listeners.get(fullEventName)!;\n listeners.add(listenerWithOptions);\n\n // 按优先级排序(数字越小优先级越高)\n const sortedListeners = Array.from(listeners).sort(\n (a, b) => a.options.priority - b.options.priority\n );\n this.listeners.set(fullEventName, new Set(sortedListeners));\n\n // 返回取消订阅函数\n return () => {\n const currentListeners = this.listeners.get(fullEventName);\n if (currentListeners) {\n currentListeners.delete(listenerWithOptions);\n if (currentListeners.size === 0) {\n this.listeners.delete(fullEventName);\n }\n }\n };\n }\n\n /**\n * 取消订阅事件\n * \n * @param event - 事件名称\n * @param listener - 事件监听器(可选,不提供则取消该事件的所有监听器)\n */\n off<T = unknown>(event: string, listener?: EventListener<T>): void {\n const fullEventName = this.getFullEventName(event);\n const listeners = this.listeners.get(fullEventName);\n \n if (!listeners) {\n return;\n }\n\n if (listener) {\n // 移除指定的监听器\n for (const item of listeners) {\n if (item.listener === listener) {\n listeners.delete(item);\n break;\n }\n }\n } else {\n // 移除所有监听器\n listeners.clear();\n }\n\n if (listeners.size === 0) {\n this.listeners.delete(fullEventName);\n }\n }\n\n /**\n * 一次性订阅事件\n * \n * @param event - 事件名称\n * @param listener - 事件监听器\n * @param options - 监听器选项\n */\n once<T = unknown>(\n event: string,\n listener: EventListener<T>,\n options?: Omit<EventListenerOptions, 'once'>\n ): () => void {\n return this.on(event, listener, { ...options, once: true });\n }\n\n /**\n * 发布事件\n * \n * @param event - 事件名称\n * @param data - 事件数据\n * @param metadata - 事件元数据(可选)\n * \n * @example\n * ```typescript\n * await eventBus.emit('user:login', {\n * userId: '123',\n * username: 'john',\n * });\n * ```\n */\n async emit<T = unknown>(\n event: string,\n data?: T,\n metadata?: Partial<EventMetadata>\n ): Promise<void> {\n const fullEventName = this.getFullEventName(event);\n const startTime = this.config.enablePerformanceMonitoring ? performance.now() : 0;\n\n // 事件验证\n if (this.config.enableValidation && !this.config.validator(fullEventName, data)) {\n logger.warn(`事件 ${fullEventName} 验证失败,已忽略`);\n return;\n }\n\n // 安全检查\n if (this.config.enableSecurityMode && metadata?.source) {\n if (!this.config.allowedSources.includes(metadata.source)) {\n logger.warn(`事件 ${fullEventName} 的来源 ${metadata.source} 不在白名单中,已忽略`);\n return;\n }\n }\n\n // 构建事件元数据\n const eventMetadata: EventMetadata = {\n source: metadata?.source,\n timestamp: metadata?.timestamp ?? Date.now(),\n eventId: metadata?.eventId ?? `event_${++this.eventCounter}`,\n priority: metadata?.priority ?? 0,\n instanceId: metadata?.instanceId ?? this.config.instanceId,\n namespace: metadata?.namespace ?? this.config.namespacePrefix,\n ...metadata,\n };\n\n // 创建事件包装器\n const eventWrapper: EventWrapper<T> = {\n data: data as T,\n metadata: eventMetadata,\n };\n\n // 执行中间件(中间件可以阻止事件传播)\n if (this.middlewares.length > 0) {\n let middlewareIndex = 0;\n let nextCalled = false;\n \n const executeMiddleware = async (): Promise<void> => {\n if (middlewareIndex < this.middlewares.length) {\n nextCalled = false;\n const currentIndex = middlewareIndex;\n const middleware = this.middlewares[middlewareIndex++];\n \n const next = async () => {\n nextCalled = true;\n if (currentIndex < this.middlewares.length - 1) {\n await executeMiddleware();\n }\n };\n \n await Promise.resolve(middleware(fullEventName, data, eventMetadata, next));\n \n // 如果中间件没有调用 next(),阻止事件传播\n if (!nextCalled) {\n return;\n }\n }\n };\n \n await executeMiddleware();\n \n // 如果最后一个中间件没有调用 next(),阻止事件传播\n if (!nextCalled && this.middlewares.length > 0) {\n return;\n }\n }\n\n // 获取监听器\n const listeners = this.listeners.get(fullEventName);\n \n // 记录事件历史(无论是否有监听器)\n if (this.config.enableTracking) {\n const executionTime = this.config.enablePerformanceMonitoring\n ? performance.now() - startTime\n : undefined;\n this.recordEventHistory(fullEventName, data, eventMetadata, executionTime);\n }\n \n if (!listeners || listeners.size === 0) {\n // 更新统计(即使没有监听器也记录)\n this.updateStats(fullEventName, 0);\n return;\n }\n\n // 执行监听器\n const executionPromises: Promise<void>[] = [];\n const listenersToRemove: ListenerWithOptions[] = [];\n\n for (const listenerWithOptions of listeners) {\n const executeListener = async () => {\n try {\n if (listenerWithOptions.options.async) {\n await Promise.resolve(\n listenerWithOptions.listener(eventWrapper.data, eventWrapper.metadata)\n );\n } else {\n listenerWithOptions.listener(eventWrapper.data, eventWrapper.metadata);\n }\n\n // 如果是一次性监听器,标记为待移除\n if (listenerWithOptions.options.once) {\n listenersToRemove.push(listenerWithOptions);\n }\n } catch (error) {\n logger.error(`事件 ${fullEventName} 的监听器执行失败:`, error);\n }\n };\n\n executionPromises.push(executeListener());\n }\n\n // 等待所有监听器执行完成\n await Promise.allSettled(executionPromises);\n\n // 移除一次性监听器\n for (const listenerToRemove of listenersToRemove) {\n listeners.delete(listenerToRemove);\n }\n\n if (listeners.size === 0) {\n this.listeners.delete(fullEventName);\n }\n\n // 更新统计信息\n const executionTime = this.config.enablePerformanceMonitoring\n ? performance.now() - startTime\n : 0;\n this.updateStats(fullEventName, executionTime, listeners.size);\n }\n\n /**\n * 同步发布事件(不等待异步监听器完成)\n * \n * @param event - 事件名称\n * @param data - 事件数据\n * @param metadata - 事件元数据(可选)\n */\n emitSync<T = unknown>(\n event: string,\n data?: T,\n metadata?: Partial<EventMetadata>\n ): void {\n // 同步执行 emit,但不等待 Promise 完成\n this.emit(event, data, metadata).catch((error) => {\n logger.error(`同步发布事件 ${event} 失败:`, error);\n });\n }\n\n /**\n * 注册事件中间件\n * \n * @param middleware - 中间件函数\n * @returns 取消注册函数\n * \n * @example\n * ```typescript\n * const unsubscribe = eventBus.use((event, data, metadata, next) => {\n * console.log('事件触发:', event);\n * return next();\n * });\n * ```\n */\n use(middleware: EventMiddleware): () => void {\n this.middlewares.push(middleware);\n \n return () => {\n const index = this.middlewares.indexOf(middleware);\n if (index > -1) {\n this.middlewares.splice(index, 1);\n }\n };\n }\n\n /**\n * 清空所有事件监听器\n */\n clear(): void {\n this.listeners.clear();\n }\n\n /**\n * 清空事件历史记录\n */\n clearHistory(): void {\n this.eventHistory = [];\n }\n\n /**\n * 获取事件监听器数量\n * \n * @param event - 事件名称(可选,不提供则返回所有事件的监听器总数)\n */\n listenerCount(event?: string): number {\n if (event) {\n const fullEventName = this.getFullEventName(event);\n return this.listeners.get(fullEventName)?.size || 0;\n }\n\n let count = 0;\n for (const listeners of this.listeners.values()) {\n count += listeners.size;\n }\n return count;\n }\n\n /**\n * 获取所有事件名称\n */\n eventNames(): string[] {\n return Array.from(this.listeners.keys());\n }\n\n /**\n * 获取事件历史记录\n * \n * @param event - 事件名称(可选,如果提供则只返回该事件的历史)\n * @param limit - 限制返回的记录数\n */\n getEventHistory(event?: string, limit?: number): EventHistoryRecord[] {\n if (!this.config.enableTracking) {\n return [];\n }\n\n let history = this.eventHistory;\n if (event) {\n const fullEventName = this.getFullEventName(event);\n history = history.filter((h) => h.event === fullEventName);\n }\n\n if (limit) {\n history = history.slice(-limit);\n }\n\n return [...history];\n }\n\n /**\n * 获取事件统计信息\n * \n * @param event - 事件名称(可选,不提供则返回所有事件的统计)\n */\n getStats(event?: string): EventStats | Map<string, EventStats> {\n if (event) {\n const fullEventName = this.getFullEventName(event);\n return this.stats.get(fullEventName) || {\n event: fullEventName,\n count: 0,\n avgExecutionTime: 0,\n listenerCount: 0,\n lastTriggered: 0,\n };\n }\n\n return new Map(this.stats);\n }\n\n /**\n * 获取配置\n */\n getConfig(): AppEventBusConfig {\n return { ...this.config };\n }\n\n /**\n * 更新配置\n */\n updateConfig(config: Partial<AppEventBusConfig>): void {\n this.config = {\n ...this.config,\n ...config,\n };\n }\n\n /**\n * 销毁事件总线(清理所有资源)\n */\n destroy(): void {\n this.clear();\n this.clearHistory();\n this.middlewares = [];\n this.stats.clear();\n }\n\n /**\n * 获取完整事件名称(包含命名空间前缀)\n */\n private getFullEventName(event: string): string {\n if (this.config.namespacePrefix) {\n return `${this.config.namespacePrefix}${event}`;\n }\n return event;\n }\n\n /**\n * 记录事件历史\n */\n private recordEventHistory(\n event: string,\n data: unknown,\n metadata: EventMetadata,\n executionTime?: number\n ): void {\n this.eventHistory.push({\n event,\n data,\n metadata,\n executionTime,\n });\n\n // 限制历史记录大小\n if (this.eventHistory.length > this.config.maxHistorySize) {\n this.eventHistory.shift();\n }\n }\n\n /**\n * 更新统计信息\n */\n private updateStats(\n event: string,\n executionTime: number,\n listenerCount: number = 0\n ): void {\n if (!this.config.enablePerformanceMonitoring) {\n return;\n }\n\n const existingStats = this.stats.get(event);\n if (existingStats) {\n const totalTime = existingStats.avgExecutionTime * existingStats.count + executionTime;\n const newCount = existingStats.count + 1;\n \n this.stats.set(event, {\n ...existingStats,\n count: newCount,\n avgExecutionTime: totalTime / newCount,\n listenerCount,\n lastTriggered: Date.now(),\n });\n } else {\n this.stats.set(event, {\n event,\n count: 1,\n avgExecutionTime: executionTime,\n listenerCount,\n lastTriggered: Date.now(),\n });\n }\n }\n}\n"],"names":["logger","AppEventBus","on","event","listener","options","fullEventName","getFullEventName","listenerId","Symbol","listenerIdCounter","listenerWithOptions","priority","once","namespace","config","namespacePrefix","async","id","listeners","has","set","Set","get","add","sortedListeners","Array","from","sort","a","b","currentListeners","delete","size","off","item","clear","emit","data","metadata","startTime","enablePerformanceMonitoring","performance","now","enableValidation","validator","warn","enableSecurityMode","source","allowedSources","includes","eventMetadata","timestamp","Date","eventId","eventCounter","instanceId","eventWrapper","middlewares","length","middlewareIndex","nextCalled","executeMiddleware","currentIndex","middleware","next","Promise","resolve","enableTracking","executionTime","undefined","recordEventHistory","updateStats","executionPromises","listenersToRemove","executeListener","push","error","allSettled","listenerToRemove","emitSync","catch","use","index","indexOf","splice","clearHistory","eventHistory","listenerCount","count","values","eventNames","keys","getEventHistory","limit","history","filter","h","slice","getStats","stats","avgExecutionTime","lastTriggered","Map","getConfig","updateConfig","destroy","maxHistorySize","shift","existingStats","totalTime","newCount","process","env","NODE_ENV"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/event/frameworkEvents.ts"],"sourcesContent":["/**\n * 框架生命周期事件集成\n * 自动在框架关键节点触发事件\n */\n\nimport type { AppEventBus } from './AppEventBus';\nimport { FrameworkEventType } from './types';\nimport type { InitializationContext } from '../initialization';\n\n/**\n * 框架事件管理器\n */\nexport class FrameworkEventManager {\n private eventBus: AppEventBus;\n\n constructor(eventBus: AppEventBus) {\n this.eventBus = eventBus;\n }\n\n /**\n * 触发应用启动事件\n */\n emitAppStart(instanceId?: string): void {\n this.eventBus.emitSync(FrameworkEventType.APP_START, { instanceId });\n }\n\n /**\n * 触发应用启动完成事件\n */\n emitAppStarted(instanceId: string, duration: number): void {\n this.eventBus.emitSync(FrameworkEventType.APP_STARTED, {\n instanceId,\n duration,\n });\n }\n\n /**\n * 触发应用初始化开始事件\n */\n emitAppInitStart(instanceId?: string): void {\n this.eventBus.emitSync(FrameworkEventType.APP_INIT_START, { instanceId });\n }\n\n /**\n * 触发应用初始化完成事件\n */\n emitAppInitComplete(\n instanceId: string,\n context: InitializationContext,\n duration: number\n ): void {\n this.eventBus.emitSync(FrameworkEventType.APP_INIT_COMPLETE, {\n instanceId,\n context,\n duration,\n });\n }\n\n /**\n * 触发应用初始化错误事件\n */\n emitAppInitError(instanceId: string, error: Error): void {\n this.eventBus.emitSync(FrameworkEventType.APP_INIT_ERROR, {\n instanceId,\n error,\n });\n }\n\n /**\n * 触发应用渲染开始事件\n */\n emitAppRenderStart(instanceId?: string): void {\n this.eventBus.emitSync(FrameworkEventType.APP_RENDER_START, { instanceId });\n }\n\n /**\n * 触发应用渲染完成事件\n */\n emitAppRenderComplete(instanceId: string, duration: number): void {\n this.eventBus.emitSync(FrameworkEventType.APP_RENDER_COMPLETE, {\n instanceId,\n duration,\n });\n }\n\n /**\n * 触发路由变化事件\n */\n emitRouteChange(\n from: string,\n to: string,\n params?: Record<string, unknown>\n ): void {\n this.eventBus.emitSync(FrameworkEventType.ROUTE_CHANGE, {\n from,\n to,\n params,\n });\n }\n\n /**\n * 触发路由导航开始事件\n */\n emitRouteNavigateStart(to: string, options?: unknown): void {\n this.eventBus.emitSync(FrameworkEventType.ROUTE_NAVIGATE_START, {\n to,\n options,\n });\n }\n\n /**\n * 触发路由导航完成事件\n */\n emitRouteNavigateComplete(to: string, duration: number): void {\n this.eventBus.emitSync(FrameworkEventType.ROUTE_NAVIGATE_COMPLETE, {\n to,\n duration,\n });\n }\n\n /**\n * 触发错误发生事件\n */\n emitErrorOccurred(error: Error, context?: unknown): void {\n this.eventBus.emitSync(FrameworkEventType.ERROR_OCCURRED, {\n error,\n context,\n });\n }\n\n /**\n * 触发实例创建事件\n */\n emitInstanceCreated(instanceId: string): void {\n this.eventBus.emitSync(FrameworkEventType.INSTANCE_CREATED, { instanceId });\n }\n\n /**\n * 触发实例销毁事件\n */\n emitInstanceDestroyed(instanceId: string): void {\n this.eventBus.emitSync(FrameworkEventType.INSTANCE_DESTROYED, {\n instanceId,\n });\n }\n\n /**\n * 触发性能指标更新事件\n */\n emitPerformanceUpdate(metrics: Record<string, number>): void {\n this.eventBus.emitSync(FrameworkEventType.PERFORMANCE_UPDATE, { metrics });\n }\n}\n"],"names":["FrameworkEventManager","emitAppStart","instanceId","eventBus","emitSync","FrameworkEventType","APP_START","emitAppStarted","duration","APP_STARTED","emitAppInitStart","APP_INIT_START","emitAppInitComplete","context","APP_INIT_COMPLETE","emitAppInitError","error","APP_INIT_ERROR","emitAppRenderStart","APP_RENDER_START","emitAppRenderComplete","APP_RENDER_COMPLETE","emitRouteChange","from","to","params","ROUTE_CHANGE","emitRouteNavigateStart","options","ROUTE_NAVIGATE_START","emitRouteNavigateComplete","ROUTE_NAVIGATE_COMPLETE","emitErrorOccurred","ERROR_OCCURRED","emitInstanceCreated","INSTANCE_CREATED","emitInstanceDestroyed","INSTANCE_DESTROYED","emitPerformanceUpdate","metrics","PERFORMANCE_UPDATE"],"mappings":"AAAA;;;CAGC;;;;+BASYA;;;eAAAA;;;uBANsB;;;;;;;;;;;;;;AAM5B,IAAA,AAAMA,wBAAN,MAAMA;IAOX;;GAEC,GACDC,aAAaC,UAAmB,EAAQ;QACtC,IAAI,CAACC,QAAQ,CAACC,QAAQ,CAACC,yBAAkB,CAACC,SAAS,EAAE;YAAEJ;QAAW;IACpE;IAEA;;GAEC,GACDK,eAAeL,UAAkB,EAAEM,QAAgB,EAAQ;QACzD,IAAI,CAACL,QAAQ,CAACC,QAAQ,CAACC,yBAAkB,CAACI,WAAW,EAAE;YACrDP;YACAM;QACF;IACF;IAEA;;GAEC,GACDE,iBAAiBR,UAAmB,EAAQ;QAC1C,IAAI,CAACC,QAAQ,CAACC,QAAQ,CAACC,yBAAkB,CAACM,cAAc,EAAE;YAAET;QAAW;IACzE;IAEA;;GAEC,GACDU,oBACEV,UAAkB,EAClBW,OAA8B,EAC9BL,QAAgB,EACV;QACN,IAAI,CAACL,QAAQ,CAACC,QAAQ,CAACC,yBAAkB,CAACS,iBAAiB,EAAE;YAC3DZ;YACAW;YACAL;QACF;IACF;IAEA;;GAEC,GACDO,iBAAiBb,UAAkB,EAAEc,KAAY,EAAQ;QACvD,IAAI,CAACb,QAAQ,CAACC,QAAQ,CAACC,yBAAkB,CAACY,cAAc,EAAE;YACxDf;YACAc;QACF;IACF;IAEA;;GAEC,GACDE,mBAAmBhB,UAAmB,EAAQ;QAC5C,IAAI,CAACC,QAAQ,CAACC,QAAQ,CAACC,yBAAkB,CAACc,gBAAgB,EAAE;YAAEjB;QAAW;IAC3E;IAEA;;GAEC,GACDkB,sBAAsBlB,UAAkB,EAAEM,QAAgB,EAAQ;QAChE,IAAI,CAACL,QAAQ,CAACC,QAAQ,CAACC,yBAAkB,CAACgB,mBAAmB,EAAE;YAC7DnB;YACAM;QACF;IACF;IAEA;;GAEC,GACDc,gBACEC,IAAY,EACZC,EAAU,EACVC,MAAgC,EAC1B;QACN,IAAI,CAACtB,QAAQ,CAACC,QAAQ,CAACC,yBAAkB,CAACqB,YAAY,EAAE;YACtDH;YACAC;YACAC;QACF;IACF;IAEA;;GAEC,GACDE,uBAAuBH,EAAU,EAAEI,OAAiB,EAAQ;QAC1D,IAAI,CAACzB,QAAQ,CAACC,QAAQ,CAACC,yBAAkB,CAACwB,oBAAoB,EAAE;YAC9DL;YACAI;QACF;IACF;IAEA;;GAEC,GACDE,0BAA0BN,EAAU,EAAEhB,QAAgB,EAAQ;QAC5D,IAAI,CAACL,QAAQ,CAACC,QAAQ,CAACC,yBAAkB,CAAC0B,uBAAuB,EAAE;YACjEP;YACAhB;QACF;IACF;IAEA;;GAEC,GACDwB,kBAAkBhB,KAAY,EAAEH,OAAiB,EAAQ;QACvD,IAAI,CAACV,QAAQ,CAACC,QAAQ,CAACC,yBAAkB,CAAC4B,cAAc,EAAE;YACxDjB;YACAH;QACF;IACF;IAEA;;GAEC,GACDqB,oBAAoBhC,UAAkB,EAAQ;QAC5C,IAAI,CAACC,QAAQ,CAACC,QAAQ,CAACC,yBAAkB,CAAC8B,gBAAgB,EAAE;YAAEjC;QAAW;IAC3E;IAEA;;GAEC,GACDkC,sBAAsBlC,UAAkB,EAAQ;QAC9C,IAAI,CAACC,QAAQ,CAACC,QAAQ,CAACC,yBAAkB,CAACgC,kBAAkB,EAAE;YAC5DnC;QACF;IACF;IAEA;;GAEC,GACDoC,sBAAsBC,OAA+B,EAAQ;QAC3D,IAAI,CAACpC,QAAQ,CAACC,QAAQ,CAACC,yBAAkB,CAACmC,kBAAkB,EAAE;YAAED;QAAQ;IAC1E;IAxIA,YAAYpC,QAAqB,CAAE;QAFnC,uBAAQA,YAAR,KAAA;QAGE,IAAI,CAACA,QAAQ,GAAGA;IAClB;AAuIF"}