@vlian/framework 1.2.57 → 1.2.59

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 +0 -2
  3. package/dist/analytics/index.js +1 -3
  4. package/dist/analytics.umd.js +8 -208
  5. package/dist/components/LocaleSwitch.cjs +0 -2
  6. package/dist/components/LocaleSwitch.js +1 -103
  7. package/dist/components/ThemeSwitch.cjs +0 -2
  8. package/dist/components/ThemeSwitch.js +1 -102
  9. package/dist/components/index.cjs +0 -2
  10. package/dist/components/index.js +1 -4
  11. package/dist/components/persistence.cjs +0 -2
  12. package/dist/components/persistence.js +1 -39
  13. package/dist/core/Test.cjs +0 -2
  14. package/dist/core/Test.js +1 -15
  15. package/dist/core/app/AppContext.cjs +0 -2
  16. package/dist/core/app/AppContext.js +1 -339
  17. package/dist/core/app/AppContext.types.cjs +0 -2
  18. package/dist/core/app/AppContext.types.js +1 -5
  19. package/dist/core/app/BasicLayout.cjs +0 -2
  20. package/dist/core/app/BasicLayout.js +1 -74
  21. package/dist/core/app/DefaultApp.cjs +0 -2
  22. package/dist/core/app/DefaultApp.js +1 -143
  23. package/dist/core/app/index.cjs +0 -2
  24. package/dist/core/app/index.js +1 -7
  25. package/dist/core/config/AppConfig.cjs +0 -2
  26. package/dist/core/config/AppConfig.js +1 -133
  27. package/dist/core/config/ConfigLoader.cjs +0 -2
  28. package/dist/core/config/ConfigLoader.js +1 -311
  29. package/dist/core/config/ConfigValidator.cjs +0 -2
  30. package/dist/core/config/ConfigValidator.js +2 -121
  31. package/dist/core/config/index.cjs +0 -2
  32. package/dist/core/config/index.js +1 -7
  33. package/dist/core/dev/DevTools.cjs +0 -2
  34. package/dist/core/dev/DevTools.js +1 -210
  35. package/dist/core/error/ErrorBoundary.cjs +0 -2
  36. package/dist/core/error/ErrorBoundary.js +1 -399
  37. package/dist/core/error/ErrorHandler.cjs +0 -2
  38. package/dist/core/error/ErrorHandler.js +1 -261
  39. package/dist/core/error/index.cjs +0 -2
  40. package/dist/core/error/index.js +1 -6
  41. package/dist/core/event/AppEventBus.cjs +0 -2
  42. package/dist/core/event/AppEventBus.js +1 -438
  43. package/dist/core/event/frameworkEvents.cjs +0 -2
  44. package/dist/core/event/frameworkEvents.js +1 -135
  45. package/dist/core/event/hooks.cjs +0 -2
  46. package/dist/core/event/hooks.js +1 -95
  47. package/dist/core/event/index.cjs +0 -2
  48. package/dist/core/event/index.js +1 -10
  49. package/dist/core/event/types.cjs +0 -2
  50. package/dist/core/event/types.js +1 -56
  51. package/dist/core/event/useEventBus.cjs +0 -2
  52. package/dist/core/event/useEventBus.js +1 -39
  53. package/dist/core/index.cjs +0 -2
  54. package/dist/core/index.js +1 -69
  55. package/dist/core/initialization/InitializationErrorThrower.cjs +0 -2
  56. package/dist/core/initialization/InitializationErrorThrower.js +1 -30
  57. package/dist/core/initialization/index.cjs +0 -2
  58. package/dist/core/initialization/index.js +1 -7
  59. package/dist/core/initialization/initialization.cjs +0 -2
  60. package/dist/core/initialization/initialization.js +1 -78
  61. package/dist/core/initialization/initializationErrorState.cjs +0 -2
  62. package/dist/core/initialization/initializationErrorState.js +1 -60
  63. package/dist/core/kernel/defaultAdapters.cjs +0 -2
  64. package/dist/core/kernel/defaultAdapters.js +1 -176
  65. package/dist/core/kernel/errors.cjs +0 -2
  66. package/dist/core/kernel/errors.js +1 -53
  67. package/dist/core/kernel/index.cjs +0 -2
  68. package/dist/core/kernel/index.js +1 -4
  69. package/dist/core/kernel/startKernel.cjs +0 -2
  70. package/dist/core/kernel/startKernel.js +1 -192
  71. package/dist/core/kernel/types.cjs +0 -2
  72. package/dist/core/kernel/types.js +1 -3
  73. package/dist/core/middleware.cjs +0 -2
  74. package/dist/core/middleware.js +1 -61
  75. package/dist/core/plugin/PluginEventBus.cjs +0 -2
  76. package/dist/core/plugin/PluginEventBus.js +1 -286
  77. package/dist/core/plugin/PluginSandbox.cjs +0 -2
  78. package/dist/core/plugin/PluginSandbox.js +1 -125
  79. package/dist/core/plugin.cjs +0 -2
  80. package/dist/core/plugin.js +1 -438
  81. package/dist/core/router/RouterManager.cjs +0 -2
  82. package/dist/core/router/RouterManager.js +1 -272
  83. package/dist/core/router/adapter/AdapterManager.cjs +0 -2
  84. package/dist/core/router/adapter/AdapterManager.js +1 -221
  85. package/dist/core/router/adapter/index.cjs +0 -2
  86. package/dist/core/router/adapter/index.js +1 -7
  87. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +0 -2
  88. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +1 -116
  89. package/dist/core/router/adapter/react-router/index.cjs +0 -2
  90. package/dist/core/router/adapter/react-router/index.js +1 -5
  91. package/dist/core/router/adapter/types.cjs +0 -2
  92. package/dist/core/router/adapter/types.js +1 -7
  93. package/dist/core/router/dev/RouterDevTools.cjs +0 -2
  94. package/dist/core/router/dev/RouterDevTools.js +1 -211
  95. package/dist/core/router/dev/index.cjs +0 -2
  96. package/dist/core/router/dev/index.js +1 -5
  97. package/dist/core/router/dynamic/DynamicRouteManager.cjs +0 -2
  98. package/dist/core/router/dynamic/DynamicRouteManager.js +1 -179
  99. package/dist/core/router/dynamic/index.cjs +0 -2
  100. package/dist/core/router/dynamic/index.js +1 -5
  101. package/dist/core/router/errors/RouterError.cjs +0 -2
  102. package/dist/core/router/errors/RouterError.js +1 -48
  103. package/dist/core/router/errors/index.cjs +0 -2
  104. package/dist/core/router/errors/index.js +1 -5
  105. package/dist/core/router/index.cjs +0 -2
  106. package/dist/core/router/index.js +1 -32
  107. package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +0 -2
  108. package/dist/core/router/lifecycle/RouterLifecycleManager.js +1 -130
  109. package/dist/core/router/lifecycle/index.cjs +0 -2
  110. package/dist/core/router/lifecycle/index.js +1 -5
  111. package/dist/core/router/middleware/RouterMiddlewareManager.cjs +0 -2
  112. package/dist/core/router/middleware/RouterMiddlewareManager.js +1 -179
  113. package/dist/core/router/middleware/auth.cjs +0 -2
  114. package/dist/core/router/middleware/auth.js +1 -63
  115. package/dist/core/router/middleware/index.cjs +0 -2
  116. package/dist/core/router/middleware/index.js +1 -7
  117. package/dist/core/router/middleware/types.cjs +0 -2
  118. package/dist/core/router/middleware/types.js +1 -7
  119. package/dist/core/router/monitoring/RouterMonitoring.cjs +0 -2
  120. package/dist/core/router/monitoring/RouterMonitoring.js +1 -213
  121. package/dist/core/router/monitoring/index.cjs +0 -2
  122. package/dist/core/router/monitoring/index.js +1 -5
  123. package/dist/core/router/navigation/RouterNavigation.cjs +0 -2
  124. package/dist/core/router/navigation/RouterNavigation.js +1 -192
  125. package/dist/core/router/navigation/index.cjs +0 -2
  126. package/dist/core/router/navigation/index.js +1 -5
  127. package/dist/core/router/performance/RouteCache.cjs +0 -2
  128. package/dist/core/router/performance/RouteCache.js +1 -291
  129. package/dist/core/router/performance/RoutePreloader.cjs +0 -2
  130. package/dist/core/router/performance/RoutePreloader.js +1 -277
  131. package/dist/core/router/performance/index.cjs +0 -2
  132. package/dist/core/router/performance/index.js +1 -6
  133. package/dist/core/router/plugin/RouterPluginManager.cjs +0 -2
  134. package/dist/core/router/plugin/RouterPluginManager.js +1 -248
  135. package/dist/core/router/plugin/index.cjs +0 -2
  136. package/dist/core/router/plugin/index.js +1 -6
  137. package/dist/core/router/plugin/types.cjs +0 -2
  138. package/dist/core/router/plugin/types.js +1 -33
  139. package/dist/core/router/types.cjs +0 -2
  140. package/dist/core/router/types.js +1 -5
  141. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs +0 -2
  142. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js +1 -121
  143. package/dist/core/router/utils/adapters/react-router/transform.cjs +0 -2
  144. package/dist/core/router/utils/adapters/react-router/transform.js +1 -242
  145. package/dist/core/router/utils/transform.cjs +0 -2
  146. package/dist/core/router/utils/transform.js +1 -791
  147. package/dist/core/router/validation/RouterConfigValidator.cjs +0 -2
  148. package/dist/core/router/validation/RouterConfigValidator.js +2 -77
  149. package/dist/core/router/validation/index.cjs +0 -2
  150. package/dist/core/router/validation/index.js +1 -6
  151. package/dist/core/router/validation/schema.cjs +0 -2
  152. package/dist/core/router/validation/schema.js +1 -151
  153. package/dist/core/router/version/RouteVersionManager.cjs +0 -2
  154. package/dist/core/router/version/RouteVersionManager.js +1 -191
  155. package/dist/core/router/version/index.cjs +0 -2
  156. package/dist/core/router/version/index.js +1 -5
  157. package/dist/core/splash/SplashScreen.cjs +0 -2
  158. package/dist/core/splash/SplashScreen.js +1 -293
  159. package/dist/core/splash/index.cjs +0 -2
  160. package/dist/core/splash/index.js +1 -6
  161. package/dist/core/splash/splashScreenUtils.cjs +0 -2
  162. package/dist/core/splash/splashScreenUtils.js +1 -30
  163. package/dist/core/startup/AppInstance.cjs +0 -2
  164. package/dist/core/startup/AppInstance.js +1 -226
  165. package/dist/core/startup/environment.cjs +0 -2
  166. package/dist/core/startup/environment.js +1 -154
  167. package/dist/core/startup/index.cjs +0 -2
  168. package/dist/core/startup/index.js +1 -8
  169. package/dist/core/startup/initializeServices.cjs +0 -2
  170. package/dist/core/startup/initializeServices.js +1 -188
  171. package/dist/core/startup/performanceTracker.cjs +0 -2
  172. package/dist/core/startup/performanceTracker.js +1 -167
  173. package/dist/core/startup/renderApp.cjs +0 -2
  174. package/dist/core/startup/renderApp.js +1 -267
  175. package/dist/core/startup/startApp.cjs +0 -2
  176. package/dist/core/startup/startApp.js +1 -315
  177. package/dist/core/types.cjs +0 -2
  178. package/dist/core/types.js +1 -5
  179. package/dist/index.cjs +0 -2
  180. package/dist/index.js +1 -11
  181. package/dist/index.umd.cjs +0 -2
  182. package/dist/index.umd.js +362 -13233
  183. package/dist/kernel/constants.cjs +0 -2
  184. package/dist/kernel/constants.js +1 -43
  185. package/dist/kernel/index.cjs +0 -2
  186. package/dist/kernel/index.js +1 -4
  187. package/dist/kernel/kernel.cjs +0 -2
  188. package/dist/kernel/kernel.js +1 -273
  189. package/dist/kernel/manager/cacheManager.cjs +0 -2
  190. package/dist/kernel/manager/cacheManager.js +1 -38
  191. package/dist/kernel/manager/i18n/I18nManager.cjs +0 -2
  192. package/dist/kernel/manager/i18n/I18nManager.js +1 -83
  193. package/dist/kernel/manager/i18n/i18n.persistence.cjs +0 -2
  194. package/dist/kernel/manager/i18n/i18n.persistence.js +1 -41
  195. package/dist/kernel/manager/i18n/i18n.schema.cjs +0 -2
  196. package/dist/kernel/manager/i18n/i18n.schema.js +1 -64
  197. package/dist/kernel/manager/i18n/index.cjs +0 -2
  198. package/dist/kernel/manager/i18n/index.js +1 -3
  199. package/dist/kernel/manager/i18nManager.cjs +0 -2
  200. package/dist/kernel/manager/i18nManager.js +1 -3
  201. package/dist/kernel/manager/index.cjs +0 -2
  202. package/dist/kernel/manager/index.js +1 -6
  203. package/dist/kernel/manager/logger/LoggerManager.cjs +0 -2
  204. package/dist/kernel/manager/logger/LoggerManager.js +1 -99
  205. package/dist/kernel/manager/logger/index.cjs +0 -2
  206. package/dist/kernel/manager/logger/index.js +1 -3
  207. package/dist/kernel/manager/logger/logger.persistence.cjs +0 -2
  208. package/dist/kernel/manager/logger/logger.persistence.js +1 -43
  209. package/dist/kernel/manager/logger/logger.schema.cjs +0 -2
  210. package/dist/kernel/manager/logger/logger.schema.js +1 -55
  211. package/dist/kernel/manager/loggerManager.cjs +0 -2
  212. package/dist/kernel/manager/loggerManager.js +1 -3
  213. package/dist/kernel/manager/theme/ThemeManager.cjs +0 -2
  214. package/dist/kernel/manager/theme/ThemeManager.js +1 -76
  215. package/dist/kernel/manager/theme/index.cjs +0 -2
  216. package/dist/kernel/manager/theme/index.js +1 -3
  217. package/dist/kernel/manager/theme/theme.dom.cjs +0 -2
  218. package/dist/kernel/manager/theme/theme.dom.js +1 -45
  219. package/dist/kernel/manager/theme/theme.persistence.cjs +0 -2
  220. package/dist/kernel/manager/theme/theme.persistence.js +1 -38
  221. package/dist/kernel/manager/theme/theme.schema.cjs +0 -2
  222. package/dist/kernel/manager/theme/theme.schema.js +1 -97
  223. package/dist/kernel/manager/themeManager.cjs +0 -2
  224. package/dist/kernel/manager/themeManager.js +1 -3
  225. package/dist/kernel/types.cjs +0 -2
  226. package/dist/kernel/types.js +1 -3
  227. package/dist/library/index.cjs +0 -2
  228. package/dist/library/index.js +1 -4
  229. package/dist/library/locale/index.cjs +0 -2
  230. package/dist/library/locale/index.js +1 -12
  231. package/dist/library/locale/langs/en-us/index.cjs +0 -2
  232. package/dist/library/locale/langs/en-us/index.js +1 -24
  233. package/dist/library/locale/langs/zh-cn/index.cjs +0 -2
  234. package/dist/library/locale/langs/zh-cn/index.js +1 -24
  235. package/dist/library/locale/types.cjs +0 -2
  236. package/dist/library/locale/types.js +1 -3
  237. package/dist/library/storage/cache.cjs +0 -2
  238. package/dist/library/storage/cache.js +1 -237
  239. package/dist/library/storage/encryption.cjs +0 -2
  240. package/dist/library/storage/encryption.js +1 -141
  241. package/dist/library/storage/index.cjs +0 -2
  242. package/dist/library/storage/index.js +1 -106
  243. package/dist/state/StateManager.cjs +0 -2
  244. package/dist/state/StateManager.js +1 -160
  245. package/dist/state/adapters/AdapterFactory.cjs +0 -2
  246. package/dist/state/adapters/AdapterFactory.js +1 -85
  247. package/dist/state/adapters/DefaultAdapter.cjs +0 -2
  248. package/dist/state/adapters/DefaultAdapter.js +1 -71
  249. package/dist/state/adapters/ReduxAdapter.cjs +0 -2
  250. package/dist/state/adapters/ReduxAdapter.js +1 -439
  251. package/dist/state/adapters/ZustandAdapter.cjs +0 -2
  252. package/dist/state/adapters/ZustandAdapter.js +1 -70
  253. package/dist/state/adapters/index.cjs +0 -2
  254. package/dist/state/adapters/index.js +1 -9
  255. package/dist/state/adapters/types.cjs +0 -2
  256. package/dist/state/adapters/types.js +1 -5
  257. package/dist/state/core/DerivedStateInstance.cjs +0 -2
  258. package/dist/state/core/DerivedStateInstance.js +1 -173
  259. package/dist/state/core/StateInstance.cjs +0 -2
  260. package/dist/state/core/StateInstance.js +1 -168
  261. package/dist/state/core/StateRegistry.cjs +0 -2
  262. package/dist/state/core/StateRegistry.js +1 -106
  263. package/dist/state/core/StateScope.cjs +0 -2
  264. package/dist/state/core/StateScope.js +1 -133
  265. package/dist/state/core/index.cjs +0 -2
  266. package/dist/state/core/index.js +1 -8
  267. package/dist/state/index.cjs +0 -2
  268. package/dist/state/index.js +1 -12
  269. package/dist/state/types.cjs +0 -2
  270. package/dist/state/types.js +1 -13
  271. package/dist/state.umd.js +22 -1395
  272. package/dist/types.cjs +0 -2
  273. package/dist/types.js +1 -3
  274. package/dist/utils/analytics.cjs +0 -2
  275. package/dist/utils/analytics.js +1 -204
  276. package/dist/utils/configSecurity.cjs +0 -2
  277. package/dist/utils/configSecurity.js +3 -176
  278. package/dist/utils/csrf.cjs +0 -2
  279. package/dist/utils/csrf.js +1 -3
  280. package/dist/utils/errors/ErrorCodes.cjs +0 -2
  281. package/dist/utils/errors/ErrorCodes.js +1 -3
  282. package/dist/utils/errors.cjs +0 -2
  283. package/dist/utils/errors.js +1 -18
  284. package/dist/utils/index.cjs +0 -2
  285. package/dist/utils/index.js +1 -48
  286. package/dist/utils/logger.cjs +0 -2
  287. package/dist/utils/logger.js +1 -3
  288. package/dist/utils/logger.types.cjs +0 -2
  289. package/dist/utils/logger.types.js +1 -3
  290. package/dist/utils/monitoring.cjs +0 -2
  291. package/dist/utils/monitoring.js +1 -3
  292. package/dist/utils/performance.cjs +0 -2
  293. package/dist/utils/performance.js +1 -3
  294. package/dist/utils/resourceLoader.cjs +0 -2
  295. package/dist/utils/resourceLoader.js +1 -3
  296. package/dist/utils/runtimeSecurity.cjs +0 -2
  297. package/dist/utils/runtimeSecurity.js +1 -3
  298. package/dist/utils/security.cjs +0 -2
  299. package/dist/utils/security.js +1 -3
  300. package/dist/utils/traceId.cjs +0 -2
  301. package/dist/utils/traceId.js +1 -3
  302. package/dist/utils/validation.cjs +0 -2
  303. package/dist/utils/validation.js +1 -3
  304. package/package.json +3 -4
  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/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":"AAAA;;CAEC;;;;;;;;;;;QAqBeA;eAAAA;;QAiGAC;eAAAA;;;;uBApHoB;qBAGJ;AAQhC,SAASC,aAAaC,KAAc;IAClC,IAAI;QACF,OAAOC,KAAKC,SAAS,CAACF,OAAO,MAAM;IACrC,EAAE,OAAM;QACN,OAAOG,OAAOH;IAChB;AACF;AAEO,SAASH,SAAS,EAAEO,WAAW,EAAEC,OAAO,EAAEC,OAAO,EAAiB;IACvE,MAAM,CAACC,oBAAoBC,sBAAsB,GAAGC,IAAAA,eAAQ,EAAyB,CAAC;IACtF,MAAMC,eAAeC,IAAAA,oBAAe;IAEpCC,IAAAA,gBAAS,EAAC;QACR,IAAI,CAACP,SAAS;YACZ;QACF;QACA,MAAMQ,UAAUT,YAAYU,qBAAqB;QACjD,IAAI,CAACD,SAAS;YACZ;QACF;QACA,MAAME,UAAUF,QAAQG,UAAU;QAClCR,sBAAsB;YACpBS,qBAAqBF,QAAQE,mBAAmB,IAAI;YACpDC,wBAAwBH,QAAQG,sBAAsB,IAAI;YAC1DC,qBAAqBJ,QAAQI,mBAAmB,IAAI;YACpDC,sBAAsBL,QAAQK,oBAAoB,IAAI;YACtDC,KAAKN,QAAQM,GAAG,IAAI;YACpBC,KAAKP,QAAQO,GAAG,IAAI;YACpBC,KAAKR,QAAQQ,GAAG,IAAI;YACpBC,KAAKT,QAAQS,GAAG,IAAI;QACtB;IACF,GAAG;QAACnB;QAASD;KAAY;IAEzB,IAAI,CAACC,SAAS;QACZ,OAAO;IACT;IAEA,MAAMoB,UAAUrB,YAAYsB,UAAU;IACtC,MAAMC,YAAY,AAACjB,cAAsBkB,oBAAoB,EAAE;IAE/D,qBACE,sBAACC;QACCC,OAAO;YACLC,UAAU;YACVC,KAAK;YACLC,OAAO;YACPC,OAAO;YACPC,QAAQ;YACRC,QAAQ;YACRC,YAAY;YACZC,YAAY;YACZC,SAAS;YACTC,WAAW;YACXC,WAAW;QACb;;0BAEA,sBAACZ;gBAAIC,OAAO;oBAAEY,SAAS;oBAAQC,gBAAgB;oBAAiBC,YAAY;gBAAS;;kCACnF,qBAACC;wBAAGf,OAAO;4BAAEgB,QAAQ;wBAAE;kCAAG;;kCAC1B,qBAACC;wBAAOC,SAAS1C;wBAASwB,OAAO;4BAAEmB,QAAQ;4BAAQZ,YAAY;4BAAea,QAAQ;wBAAU;kCAAG;;;;0BAKrG,sBAACC;gBAAQrB,OAAO;oBAAEsB,WAAW;gBAAG;;kCAC9B,qBAACC;kCAAG;;kCACJ,sBAACxB;;4BAAI;4BAAKzB,YAAYkD,EAAE;;;kCACxB,sBAACzB;;4BAAI;4BAAc1B,OAAOC,YAAYmD,aAAa;;;;;0BAGrD,sBAACJ;gBAAQrB,OAAO;oBAAEsB,WAAW;gBAAG;;kCAC9B,qBAACC;kCAAG;;kCACJ,qBAACG;wBAAI1B,OAAO;4BAAEO,YAAY;4BAAWE,SAAS;4BAAIkB,cAAc;wBAAE;kCAAI1D,aAAaQ;;;;0BAGrF,sBAAC4C;gBAAQrB,OAAO;oBAAEsB,WAAW;gBAAG;;kCAC9B,qBAACC;kCAAG;;kCACJ,sBAACxB;;4BAAI;4BAAaF,UAAU+B,MAAM;;;kCAClC,qBAACF;wBAAI1B,OAAO;4BAAEO,YAAY;4BAAWE,SAAS;4BAAIkB,cAAc;wBAAE;kCAAI1D,aAAa4B,UAAUgC,KAAK,CAAC,GAAG;;;;0BAGxG,sBAACR;gBAAQrB,OAAO;oBAAEsB,WAAW;gBAAG;;kCAC9B,qBAACC;kCAAG;;kCACJ,qBAACG;wBAAI1B,OAAO;4BAAEO,YAAY;4BAAWE,SAAS;4BAAIkB,cAAc;4BAAGG,YAAY;wBAAW;kCAAI7D,aAAa0B;;;;;;AAInH;AAOA,SAASoC,gBAAgB9B,QAA0C;IACjE,MAAMD,QAA6B;QAAEC,UAAU;QAASK,QAAQ;IAAK;IACrE,MAAM0B,MAAM/B,YAAY;IAExB,IAAI+B,IAAIC,QAAQ,CAAC,WAAWjC,MAAMkC,MAAM,GAAG;IAC3C,IAAIF,IAAIC,QAAQ,CAAC,QAAQjC,MAAME,GAAG,GAAG;IACrC,IAAI8B,IAAIC,QAAQ,CAAC,UAAUjC,MAAMG,KAAK,GAAG;IACzC,IAAI6B,IAAIC,QAAQ,CAAC,SAASjC,MAAMmC,IAAI,GAAG;IAEvC,OAAOnC;AACT;AAEO,SAAShC,gBAAgB,EAAEM,WAAW,EAAE2B,WAAW,cAAc,EAAwB;IAC9F,MAAM,CAAC1B,SAAS6D,WAAW,GAAGzD,IAAAA,eAAQ,EAAC;IAEvC,IAAI0D,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;QAC1C,OAAO;IACT;IAEA,qBACE;;0BACE,qBAACtB;gBACCC,SAAS,IAAMkB,WAAW;gBAC1BpC,OAAO;oBACL,GAAG+B,gBAAgB9B,SAAS;oBAC5BkB,QAAQ;oBACRZ,YAAY;oBACZiC,OAAO;oBACPb,cAAc;oBACdlB,SAAS;oBACTW,QAAQ;gBACV;0BACD;;0BAGD,qBAACrD;gBAASO,aAAaA;gBAAaC,SAASA;gBAASC,SAAS,IAAM4D,WAAW;;;;AAGtF"}
@@ -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":";;;;;;;;;;;;;AAAA;;;;;;;CAOC,GAED,SAASA,MAAM,QAAQ,gBAAgB;AACvC,SAASC,UAAU,EAAEC,aAAa,EAAaC,cAAc,QAAQ,eAAe;AAGpF;;CAEC,GACD,OAAO,IAAA,AAAKC,+CAAAA;IACV;;GAEC;IAED;;GAEC;IAED;;GAEC;IAED;;GAEC;IAED;;GAEC;WAnBSA;MAqBX;AAyFD;;CAEC,GACD,OAAO,MAAMC;IAkBX;;GAEC,GACDC,cAAcC,UAA6B,EAAQ;QACjD,IAAI,CAACA,UAAU,GAAGA;IACpB;IAEA;;;;;;GAMC,GACD,MAAMC,YACJC,KAAc,EACdC,OAAiC,EACL;QAC5B,UAAU;QACV,MAAMC,kBAAkBV,WAAWW,cAAc,CAACH;QAElD,0CAA0C;QAC1C,MAAMI,mBAAmCH,UACrC,IAAIP,eACFQ,gBAAgBG,OAAO,EACvBH,gBAAgBI,IAAI,EACpBJ,gBAAgBK,QAAQ,EACxB;YACEC,MAAMN,gBAAgBM,IAAI;YAC1BC,eAAeP,gBAAgBO,aAAa;YAC5CR,SAAS;gBACP,GAAGC,gBAAgBD,OAAO;gBAC1B,GAAGA,OAAO;YACZ;YACAS,aAAaR,gBAAgBQ,WAAW;QAC1C,KAEFR;QAEJ,SAAS;QACT,MAAMS,aAAa,IAAI,CAACC,mBAAmB,CAACR;QAE5C,SAAS;QACT,MAAMS,UAAU,MAAM,IAAI,CAACC,iBAAiB,CAACV,kBAAkBO;QAE/D,SAAS;QACT,IAAII;QACJ,IAAIL,cAAc;QAClB,IAAIG,WAAWT,iBAAiBM,WAAW,IAAI,IAAI,CAACM,MAAM,CAACC,eAAe,EAAE;YAC1E,MAAMC,iBAAiB,MAAM,IAAI,CAACC,eAAe,CAACf;YAClDM,cAAcQ,eAAeR,WAAW;YACxCK,iBAAiBG,eAAeE,KAAK;QACvC;QAEA,OAAO;YACLP;YACAH;YACAK;YACAJ;YACAX,OAAOI;QACT;IACF;IAEA;;GAEC,GACD,AAAQQ,oBAAoBZ,KAAqB,EAA2B;QAC1E,iBAAiB;QACjB,IAAI,IAAI,CAACgB,MAAM,CAACK,cAAc,CAACrB,MAAMM,IAAI,CAAC,EAAE;YAC1C,OAAO,IAAI,CAACU,MAAM,CAACK,cAAc,CAACrB,MAAMM,IAAI,CAAC;QAC/C;QAEA,mBAAmB;QACnB,IAAI,IAAI,CAACU,MAAM,CAACM,kBAAkB,CAACtB,MAAMO,QAAQ,CAAC,EAAE;YAClD,OAAO,IAAI,CAACS,MAAM,CAACM,kBAAkB,CAACtB,MAAMO,QAAQ,CAAC;QACvD;QAEA,YAAY;QACZ,OAAO,IAAI,CAACS,MAAM,CAACO,iBAAiB;IACtC;IAEA;;GAEC,GACD,MAAcT,kBACZd,KAAqB,EACrBW,UAAmC,EACjB;QAClB,IAAIE,UAAU;QAEd,KAAK,MAAMW,YAAYb,WAAY;YACjC,IAAI;gBACF,OAAQa;oBACN;wBACE,IAAI,CAACC,QAAQ,CAACzB;wBACda,UAAU;wBACV;oBAEF;wBACE,MAAM,IAAI,CAACa,WAAW,CAAC1B;wBACvBa,UAAU;wBACV;oBAEF;wBACE,0BAA0B;wBAC1BA,UAAU;wBACV;oBAEF;wBACE,4BAA4B;wBAC5BA,UAAU;wBACV;oBAEF;wBACE,cAAc;wBACdA,UAAU;wBACV;gBACJ;YACF,EAAE,OAAOc,eAAe;gBACtBpC,OAAOqC,IAAI,CAAC,CAAC,OAAO,EAAEJ,SAAS,MAAM,CAAC,EAAEG;YAC1C;QACF;QAEA,OAAOd;IACT;IAEA;;GAEC,GACD,AAAQY,SAASzB,KAAqB,EAAQ;QAC5C,MAAM6B,YAAYrC,WAAWsC,gBAAgB,CAAC9B;QAE9C,iBAAiB;QACjB,OAAQA,MAAMO,QAAQ;YACpB,KAAKd,cAAcsC,QAAQ;YAC3B,KAAKtC,cAAcuC,IAAI;gBACrBzC,OAAOS,KAAK,CAAC,OAAO6B;gBACpB;YACF,KAAKpC,cAAcwC,MAAM;gBACvB1C,OAAOqC,IAAI,CAAC,OAAOC;gBACnB;YACF,KAAKpC,cAAcyC,GAAG;gBACpB3C,OAAO4C,IAAI,CAAC,OAAON;gBACnB;QACJ;QAEA,eAAe;QACf,IAAI,IAAI,CAACb,MAAM,CAACoB,uBAAuB,IAAIC,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;YACjF,MAAMC,gBAAgBhD,WAAWiD,iBAAiB,CAACzC;YACnD0C,QAAQ1C,KAAK,CAACwC;QAChB;IACF;IAEA;;GAEC,GACD,MAAcd,YAAY1B,KAAqB,EAAiB;QAC9D,IAAI,CAAC,IAAI,CAACF,UAAU,EAAE;YACpBP,OAAOoD,KAAK,CAAC;YACb;QACF;QAEA,IAAI;YACF,IAAI,CAAC7C,UAAU,CAAC8C,YAAY,CAAC5C,OAAO;gBAClCO,UAAUP,MAAMO,QAAQ;gBACxBD,MAAMN,MAAMM,IAAI;gBAChBE,MAAMR,MAAMQ,IAAI;gBAChBP,SAASD,MAAMC,OAAO;YACxB;QACF,EAAE,OAAOyB,aAAa;YACpBnC,OAAOqC,IAAI,CAAC,WAAWF;QACzB;IACF;IAEA;;GAEC,GACD,MAAcP,gBACZnB,KAAqB,EAC+B;QACpD,MAAM6C,UAAU,IAAI,CAAC7B,MAAM,CAACC,eAAe;QAC3C,IAAI,CAAC4B,SAAS;YACZ,OAAO;gBAAEnC,aAAa;YAAM;QAC9B;QAEA,MAAMoC,aAAaD,QAAQC,UAAU,IAAI;QACzC,MAAMC,aAAaF,QAAQE,UAAU,IAAI;QACzC,MAAMC,qBAAqBH,QAAQG,kBAAkB,IAAI;QACzD,MAAMC,cAAcJ,QAAQI,WAAW,IAAK,CAAA,IAAM,IAAG;QAErD,gBAAgB;QAChB,IAAIJ,QAAQK,QAAQ,EAAE;YACpB,IAAI;gBACF,MAAMC,gBAAgB,MAAMC,QAAQC,OAAO,CAACR,QAAQK,QAAQ;gBAC5D3D,OAAO4C,IAAI,CAAC;gBACZ,OAAO;oBAAEzB,aAAa;oBAAMU,OAAO+B;gBAAc;YACnD,EAAE,OAAOG,eAAe;gBACtB/D,OAAOqC,IAAI,CAAC,aAAa0B;YAC3B;QACF;QAEA,uBAAuB;QACvB,IAAItD,MAAMU,WAAW,IAAIuC,YAAYjD,OAAO,IAAI;YAC9C,IAAK,IAAIuD,UAAU,GAAGA,UAAUT,YAAYS,UAAW;gBACrD,IAAI,CAACN,YAAYjD,OAAOuD,UAAU;oBAChC;gBACF;gBAEA,MAAMC,QAAQR,qBACVD,aAAaU,KAAKC,GAAG,CAAC,GAAGH,WACzBR;gBAEJxD,OAAOoD,KAAK,CAAC,CAAC,OAAO,EAAEY,UAAU,EAAE,CAAC,EAAET,WAAW,CAAC,EAAEU,MAAM,SAAS,CAAC;gBAEpE,MAAM,IAAIJ,QAAQC,CAAAA,UAAWM,WAAWN,SAASG;YAEjD,kBAAkB;YAClB,4BAA4B;YAC5B,gBAAgB;YAClB;QACF;QAEA,OAAO;YAAE9C,aAAaV,MAAMU,WAAW;QAAC;IAC1C;IAEA;;GAEC,GACD,OAAOkD,OAAO5C,MAA2B,EAAgB;QACvD,OAAO,IAAIpB,aAAaoB;IAC1B;IApPA,YAAYA,SAA6B,CAAC,CAAC,CAAE;QAH7C,uBAAQA,UAAR,KAAA;QACA,uBAAQlB,cAAR,KAAA;QAGE,IAAI,CAACA,UAAU,GAAGkB,OAAOlB,UAAU;QACnC,IAAI,CAACkB,MAAM,GAAG;YACZO,mBAAmBP,OAAOO,iBAAiB,IAAI;;;aAG9C;YACDD,oBAAoBN,OAAOM,kBAAkB,IAAI,CAAC;YAClDD,gBAAgBL,OAAOK,cAAc,IAAI,CAAC;YAC1CJ,iBAAiBD,OAAOC,eAAe,IAAI,CAAC;YAC5CmB,yBAAyBpB,OAAOoB,uBAAuB,IAAI;QAC7D;IACF;AAyOF;AAEA;;CAEC,GACD,IAAIyB,sBAA2C;AAE/C;;CAEC,GACD,OAAO,SAASC;IACd,IAAI,CAACD,qBAAqB;QACxBA,sBAAsB,IAAIjE;IAC5B;IACA,OAAOiE;AACT;AAEA;;CAEC,GACD,OAAO,SAASE,uBAAuBC,OAAqB;IAC1DH,sBAAsBG;AACxB"}
@@ -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":"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"}
@@ -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"}
@@ -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":["FrameworkEventType","FrameworkEventManager","emitAppStart","instanceId","eventBus","emitSync","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;;;;;;;;;;;;;AAGD,SAASA,kBAAkB,QAAQ,UAAU;AAG7C;;CAEC,GACD,OAAO,MAAMC;IAOX;;GAEC,GACDC,aAAaC,UAAmB,EAAQ;QACtC,IAAI,CAACC,QAAQ,CAACC,QAAQ,CAACL,mBAAmBM,SAAS,EAAE;YAAEH;QAAW;IACpE;IAEA;;GAEC,GACDI,eAAeJ,UAAkB,EAAEK,QAAgB,EAAQ;QACzD,IAAI,CAACJ,QAAQ,CAACC,QAAQ,CAACL,mBAAmBS,WAAW,EAAE;YACrDN;YACAK;QACF;IACF;IAEA;;GAEC,GACDE,iBAAiBP,UAAmB,EAAQ;QAC1C,IAAI,CAACC,QAAQ,CAACC,QAAQ,CAACL,mBAAmBW,cAAc,EAAE;YAAER;QAAW;IACzE;IAEA;;GAEC,GACDS,oBACET,UAAkB,EAClBU,OAA8B,EAC9BL,QAAgB,EACV;QACN,IAAI,CAACJ,QAAQ,CAACC,QAAQ,CAACL,mBAAmBc,iBAAiB,EAAE;YAC3DX;YACAU;YACAL;QACF;IACF;IAEA;;GAEC,GACDO,iBAAiBZ,UAAkB,EAAEa,KAAY,EAAQ;QACvD,IAAI,CAACZ,QAAQ,CAACC,QAAQ,CAACL,mBAAmBiB,cAAc,EAAE;YACxDd;YACAa;QACF;IACF;IAEA;;GAEC,GACDE,mBAAmBf,UAAmB,EAAQ;QAC5C,IAAI,CAACC,QAAQ,CAACC,QAAQ,CAACL,mBAAmBmB,gBAAgB,EAAE;YAAEhB;QAAW;IAC3E;IAEA;;GAEC,GACDiB,sBAAsBjB,UAAkB,EAAEK,QAAgB,EAAQ;QAChE,IAAI,CAACJ,QAAQ,CAACC,QAAQ,CAACL,mBAAmBqB,mBAAmB,EAAE;YAC7DlB;YACAK;QACF;IACF;IAEA;;GAEC,GACDc,gBACEC,IAAY,EACZC,EAAU,EACVC,MAAgC,EAC1B;QACN,IAAI,CAACrB,QAAQ,CAACC,QAAQ,CAACL,mBAAmB0B,YAAY,EAAE;YACtDH;YACAC;YACAC;QACF;IACF;IAEA;;GAEC,GACDE,uBAAuBH,EAAU,EAAEI,OAAiB,EAAQ;QAC1D,IAAI,CAACxB,QAAQ,CAACC,QAAQ,CAACL,mBAAmB6B,oBAAoB,EAAE;YAC9DL;YACAI;QACF;IACF;IAEA;;GAEC,GACDE,0BAA0BN,EAAU,EAAEhB,QAAgB,EAAQ;QAC5D,IAAI,CAACJ,QAAQ,CAACC,QAAQ,CAACL,mBAAmB+B,uBAAuB,EAAE;YACjEP;YACAhB;QACF;IACF;IAEA;;GAEC,GACDwB,kBAAkBhB,KAAY,EAAEH,OAAiB,EAAQ;QACvD,IAAI,CAACT,QAAQ,CAACC,QAAQ,CAACL,mBAAmBiC,cAAc,EAAE;YACxDjB;YACAH;QACF;IACF;IAEA;;GAEC,GACDqB,oBAAoB/B,UAAkB,EAAQ;QAC5C,IAAI,CAACC,QAAQ,CAACC,QAAQ,CAACL,mBAAmBmC,gBAAgB,EAAE;YAAEhC;QAAW;IAC3E;IAEA;;GAEC,GACDiC,sBAAsBjC,UAAkB,EAAQ;QAC9C,IAAI,CAACC,QAAQ,CAACC,QAAQ,CAACL,mBAAmBqC,kBAAkB,EAAE;YAC5DlC;QACF;IACF;IAEA;;GAEC,GACDmC,sBAAsBC,OAA+B,EAAQ;QAC3D,IAAI,CAACnC,QAAQ,CAACC,QAAQ,CAACL,mBAAmBwC,kBAAkB,EAAE;YAAED;QAAQ;IAC1E;IAxIA,YAAYnC,QAAqB,CAAE;QAFnC,uBAAQA,YAAR,KAAA;QAGE,IAAI,CAACA,QAAQ,GAAGA;IAClB;AAuIF"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/event/hooks.ts"],"sourcesContent":["/**\n * React Hooks 支持\n * 提供便捷的 React 组件事件订阅能力\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport type { EventListener, EventListenerOptions } from './types';\nimport type { AppEventBus } from './AppEventBus';\n\n/**\n * 使用事件总线的 Hook\n * \n * @param eventBus - 事件总线实例\n * @param event - 事件名称\n * @param listener - 事件监听器\n * @param options - 监听器选项\n * \n * @example\n * ```tsx\n * import { useAppEventBus } from '@vlian/framework';\n * \n * function MyComponent() {\n * useAppEvent('user:login', (data, metadata) => {\n * console.log('用户登录:', data);\n * });\n * \n * return <div>My Component</div>;\n * }\n * ```\n */\nexport function useAppEvent<T = unknown>(\n eventBus: AppEventBus,\n event: string,\n listener: EventListener<T>,\n options?: EventListenerOptions\n): void {\n // 使用 ref 保存最新的 listener,避免重复订阅\n const listenerRef = useRef<EventListener<T>>(listener);\n listenerRef.current = listener;\n\n // 使用 ref 保存 options\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useEffect(() => {\n // 创建包装的监听器,使用最新的 listener\n const wrappedListener: EventListener<T> = (data, metadata) => {\n return listenerRef.current(data, metadata);\n };\n\n // 订阅事件\n const unsubscribe = eventBus.on(event, wrappedListener, optionsRef.current);\n\n // 清理函数:取消订阅\n return unsubscribe;\n }, [eventBus, event]); // 只在 eventBus 或 event 变化时重新订阅\n}\n\n/**\n * 一次性事件订阅 Hook\n * \n * @param eventBus - 事件总线实例\n * @param event - 事件名称\n * @param listener - 事件监听器\n * @param options - 监听器选项\n */\nexport function useAppEventOnce<T = unknown>(\n eventBus: AppEventBus,\n event: string,\n listener: EventListener<T>,\n options?: Omit<EventListenerOptions, 'once'>\n): void {\n const listenerRef = useRef<EventListener<T>>(listener);\n listenerRef.current = listener;\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useEffect(() => {\n const wrappedListener: EventListener<T> = (data, metadata) => {\n return listenerRef.current(data, metadata);\n };\n\n const unsubscribe = eventBus.once(event, wrappedListener, optionsRef.current);\n\n return unsubscribe;\n }, [eventBus, event]);\n}\n\n/**\n * 创建事件发射器 Hook\n * \n * @param eventBus - 事件总线实例\n * @returns 事件发射函数\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const emit = useAppEventEmitter(eventBus);\n * \n * const handleClick = () => {\n * emit('button:click', { buttonId: 'submit' });\n * };\n * \n * return <button onClick={handleClick}>Click</button>;\n * }\n * ```\n */\nexport function useAppEventEmitter(eventBus: AppEventBus) {\n return useCallback(\n <T = unknown>(\n event: string,\n data?: T,\n metadata?: Partial<import('./types').EventMetadata>\n ) => {\n return eventBus.emit(event, data, metadata);\n },\n [eventBus]\n );\n}\n"],"names":["useAppEvent","useAppEventEmitter","useAppEventOnce","eventBus","event","listener","options","listenerRef","useRef","current","optionsRef","useEffect","wrappedListener","data","metadata","unsubscribe","on","once","useCallback","emit"],"mappings":"AAAA;;;CAGC;;;;;;;;;;;QA2BeA;eAAAA;;QA8EAC;eAAAA;;QA1CAC;eAAAA;;;uBA7D+B;AAyBxC,SAASF,YACdG,QAAqB,EACrBC,KAAa,EACbC,QAA0B,EAC1BC,OAA8B;IAE9B,+BAA+B;IAC/B,MAAMC,cAAcC,IAAAA,aAAM,EAAmBH;IAC7CE,YAAYE,OAAO,GAAGJ;IAEtB,oBAAoB;IACpB,MAAMK,aAAaF,IAAAA,aAAM,EAACF;IAC1BI,WAAWD,OAAO,GAAGH;IAErBK,IAAAA,gBAAS,EAAC;QACR,0BAA0B;QAC1B,MAAMC,kBAAoC,CAACC,MAAMC;YAC/C,OAAOP,YAAYE,OAAO,CAACI,MAAMC;QACnC;QAEA,OAAO;QACP,MAAMC,cAAcZ,SAASa,EAAE,CAACZ,OAAOQ,iBAAiBF,WAAWD,OAAO;QAE1E,YAAY;QACZ,OAAOM;IACT,GAAG;QAACZ;QAAUC;KAAM,GAAG,8BAA8B;AACvD;AAUO,SAASF,gBACdC,QAAqB,EACrBC,KAAa,EACbC,QAA0B,EAC1BC,OAA4C;IAE5C,MAAMC,cAAcC,IAAAA,aAAM,EAAmBH;IAC7CE,YAAYE,OAAO,GAAGJ;IAEtB,MAAMK,aAAaF,IAAAA,aAAM,EAACF;IAC1BI,WAAWD,OAAO,GAAGH;IAErBK,IAAAA,gBAAS,EAAC;QACR,MAAMC,kBAAoC,CAACC,MAAMC;YAC/C,OAAOP,YAAYE,OAAO,CAACI,MAAMC;QACnC;QAEA,MAAMC,cAAcZ,SAASc,IAAI,CAACb,OAAOQ,iBAAiBF,WAAWD,OAAO;QAE5E,OAAOM;IACT,GAAG;QAACZ;QAAUC;KAAM;AACtB;AAqBO,SAASH,mBAAmBE,QAAqB;IACtD,OAAOe,IAAAA,kBAAW,EAChB,CACEd,OACAS,MACAC;QAEA,OAAOX,SAASgB,IAAI,CAACf,OAAOS,MAAMC;IACpC,GACA;QAACX;KAAS;AAEd"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/event/hooks.ts"],"sourcesContent":["/**\n * React Hooks 支持\n * 提供便捷的 React 组件事件订阅能力\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport type { EventListener, EventListenerOptions } from './types';\nimport type { AppEventBus } from './AppEventBus';\n\n/**\n * 使用事件总线的 Hook\n * \n * @param eventBus - 事件总线实例\n * @param event - 事件名称\n * @param listener - 事件监听器\n * @param options - 监听器选项\n * \n * @example\n * ```tsx\n * import { useAppEventBus } from '@vlian/framework';\n * \n * function MyComponent() {\n * useAppEvent('user:login', (data, metadata) => {\n * console.log('用户登录:', data);\n * });\n * \n * return <div>My Component</div>;\n * }\n * ```\n */\nexport function useAppEvent<T = unknown>(\n eventBus: AppEventBus,\n event: string,\n listener: EventListener<T>,\n options?: EventListenerOptions\n): void {\n // 使用 ref 保存最新的 listener,避免重复订阅\n const listenerRef = useRef<EventListener<T>>(listener);\n listenerRef.current = listener;\n\n // 使用 ref 保存 options\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useEffect(() => {\n // 创建包装的监听器,使用最新的 listener\n const wrappedListener: EventListener<T> = (data, metadata) => {\n return listenerRef.current(data, metadata);\n };\n\n // 订阅事件\n const unsubscribe = eventBus.on(event, wrappedListener, optionsRef.current);\n\n // 清理函数:取消订阅\n return unsubscribe;\n }, [eventBus, event]); // 只在 eventBus 或 event 变化时重新订阅\n}\n\n/**\n * 一次性事件订阅 Hook\n * \n * @param eventBus - 事件总线实例\n * @param event - 事件名称\n * @param listener - 事件监听器\n * @param options - 监听器选项\n */\nexport function useAppEventOnce<T = unknown>(\n eventBus: AppEventBus,\n event: string,\n listener: EventListener<T>,\n options?: Omit<EventListenerOptions, 'once'>\n): void {\n const listenerRef = useRef<EventListener<T>>(listener);\n listenerRef.current = listener;\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n useEffect(() => {\n const wrappedListener: EventListener<T> = (data, metadata) => {\n return listenerRef.current(data, metadata);\n };\n\n const unsubscribe = eventBus.once(event, wrappedListener, optionsRef.current);\n\n return unsubscribe;\n }, [eventBus, event]);\n}\n\n/**\n * 创建事件发射器 Hook\n * \n * @param eventBus - 事件总线实例\n * @returns 事件发射函数\n * \n * @example\n * ```tsx\n * function MyComponent() {\n * const emit = useAppEventEmitter(eventBus);\n * \n * const handleClick = () => {\n * emit('button:click', { buttonId: 'submit' });\n * };\n * \n * return <button onClick={handleClick}>Click</button>;\n * }\n * ```\n */\nexport function useAppEventEmitter(eventBus: AppEventBus) {\n return useCallback(\n <T = unknown>(\n event: string,\n data?: T,\n metadata?: Partial<import('./types').EventMetadata>\n ) => {\n return eventBus.emit(event, data, metadata);\n },\n [eventBus]\n );\n}\n"],"names":["useEffect","useRef","useCallback","useAppEvent","eventBus","event","listener","options","listenerRef","current","optionsRef","wrappedListener","data","metadata","unsubscribe","on","useAppEventOnce","once","useAppEventEmitter","emit"],"mappings":"AAAA;;;CAGC,GAED,SAASA,SAAS,EAAEC,MAAM,EAAEC,WAAW,QAAQ,QAAQ;AAIvD;;;;;;;;;;;;;;;;;;;;CAoBC,GACD,OAAO,SAASC,YACdC,QAAqB,EACrBC,KAAa,EACbC,QAA0B,EAC1BC,OAA8B;IAE9B,+BAA+B;IAC/B,MAAMC,cAAcP,OAAyBK;IAC7CE,YAAYC,OAAO,GAAGH;IAEtB,oBAAoB;IACpB,MAAMI,aAAaT,OAAOM;IAC1BG,WAAWD,OAAO,GAAGF;IAErBP,UAAU;QACR,0BAA0B;QAC1B,MAAMW,kBAAoC,CAACC,MAAMC;YAC/C,OAAOL,YAAYC,OAAO,CAACG,MAAMC;QACnC;QAEA,OAAO;QACP,MAAMC,cAAcV,SAASW,EAAE,CAACV,OAAOM,iBAAiBD,WAAWD,OAAO;QAE1E,YAAY;QACZ,OAAOK;IACT,GAAG;QAACV;QAAUC;KAAM,GAAG,8BAA8B;AACvD;AAEA;;;;;;;CAOC,GACD,OAAO,SAASW,gBACdZ,QAAqB,EACrBC,KAAa,EACbC,QAA0B,EAC1BC,OAA4C;IAE5C,MAAMC,cAAcP,OAAyBK;IAC7CE,YAAYC,OAAO,GAAGH;IAEtB,MAAMI,aAAaT,OAAOM;IAC1BG,WAAWD,OAAO,GAAGF;IAErBP,UAAU;QACR,MAAMW,kBAAoC,CAACC,MAAMC;YAC/C,OAAOL,YAAYC,OAAO,CAACG,MAAMC;QACnC;QAEA,MAAMC,cAAcV,SAASa,IAAI,CAACZ,OAAOM,iBAAiBD,WAAWD,OAAO;QAE5E,OAAOK;IACT,GAAG;QAACV;QAAUC;KAAM;AACtB;AAEA;;;;;;;;;;;;;;;;;;CAkBC,GACD,OAAO,SAASa,mBAAmBd,QAAqB;IACtD,OAAOF,YACL,CACEG,OACAO,MACAC;QAEA,OAAOT,SAASe,IAAI,CAACd,OAAOO,MAAMC;IACpC,GACA;QAACT;KAAS;AAEd"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/event/index.ts"],"sourcesContent":["/**\n * 应用级事件系统\n * 提供高性能、类型安全、可观测的事件通信能力\n */\n\nexport { AppEventBus } from './AppEventBus';\nexport { FrameworkEventManager } from './frameworkEvents';\nexport {\n useAppEvent,\n useAppEventOnce,\n useAppEventEmitter,\n} from './hooks';\n\nexport { useEventBus } from './useEventBus';\n\nexport type {\n EventListener,\n EventMetadata,\n EventWrapper,\n EventMiddleware,\n EventListenerOptions,\n AppEventBusConfig,\n EventStats,\n FrameworkEventData,\n} from './types';\n\nexport { FrameworkEventType } from './types';\n"],"names":["AppEventBus","FrameworkEventManager","FrameworkEventType","useAppEvent","useAppEventEmitter","useAppEventOnce","useEventBus"],"mappings":"AAAA;;;CAGC;;;;;;;;;;;QAEQA;eAAAA,wBAAW;;QACXC;eAAAA,sCAAqB;;QAoBrBC;eAAAA,yBAAkB;;QAlBzBC;eAAAA,kBAAW;;QAEXC;eAAAA,yBAAkB;;QADlBC;eAAAA,sBAAe;;QAIRC;eAAAA,wBAAW;;;6BARQ;iCACU;uBAK/B;6BAEqB;uBAaO"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/event/index.ts"],"sourcesContent":["/**\n * 应用级事件系统\n * 提供高性能、类型安全、可观测的事件通信能力\n */\n\nexport { AppEventBus } from './AppEventBus';\nexport { FrameworkEventManager } from './frameworkEvents';\nexport {\n useAppEvent,\n useAppEventOnce,\n useAppEventEmitter,\n} from './hooks';\n\nexport { useEventBus } from './useEventBus';\n\nexport type {\n EventListener,\n EventMetadata,\n EventWrapper,\n EventMiddleware,\n EventListenerOptions,\n AppEventBusConfig,\n EventStats,\n FrameworkEventData,\n} from './types';\n\nexport { FrameworkEventType } from './types';\n"],"names":["AppEventBus","FrameworkEventManager","useAppEvent","useAppEventOnce","useAppEventEmitter","useEventBus","FrameworkEventType"],"mappings":"AAAA;;;CAGC,GAED,SAASA,WAAW,QAAQ,gBAAgB;AAC5C,SAASC,qBAAqB,QAAQ,oBAAoB;AAC1D,SACEC,WAAW,EACXC,eAAe,EACfC,kBAAkB,QACb,UAAU;AAEjB,SAASC,WAAW,QAAQ,gBAAgB;AAa5C,SAASC,kBAAkB,QAAQ,UAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/event/types.ts"],"sourcesContent":["/**\n * 应用级事件系统类型定义\n * 提供类型安全的事件通信能力\n */\n\n/**\n * 事件监听器类型\n * \n * @template T - 事件数据类型\n */\nexport type EventListener<T = unknown> = (data: T, metadata: EventMetadata) => void | Promise<void>;\n\n/**\n * 事件元数据\n */\nexport interface EventMetadata {\n /**\n * 事件来源(模块/组件名称)\n */\n source?: string;\n \n /**\n * 事件时间戳\n */\n timestamp: number;\n \n /**\n * 事件ID(用于追踪)\n */\n eventId: string;\n \n /**\n * 事件优先级(数字越小优先级越高)\n */\n priority?: number;\n \n /**\n * 应用实例ID(多实例场景)\n */\n instanceId?: string;\n \n /**\n * 事件命名空间(用于作用域隔离)\n */\n namespace?: string;\n \n /**\n * 自定义元数据\n */\n [key: string]: unknown;\n}\n\n/**\n * 事件包装器\n * \n * @template T - 事件数据类型\n */\nexport interface EventWrapper<T = unknown> {\n /**\n * 事件数据\n */\n data: T;\n \n /**\n * 事件元数据\n */\n metadata: EventMetadata;\n}\n\n/**\n * 事件中间件函数类型\n * \n * @template T - 事件数据类型\n */\nexport type EventMiddleware<T = unknown> = (\n event: string,\n data: T,\n metadata: EventMetadata,\n next: () => Promise<void>\n) => Promise<void> | void;\n\n/**\n * 事件监听器选项\n */\nexport interface EventListenerOptions {\n /**\n * 监听器优先级(数字越小优先级越高)\n */\n priority?: number;\n \n /**\n * 是否只执行一次\n */\n once?: boolean;\n \n /**\n * 事件命名空间(用于作用域隔离)\n */\n namespace?: string;\n \n /**\n * 是否异步执行\n */\n async?: boolean;\n}\n\n/**\n * 事件总线配置\n */\nexport interface AppEventBusConfig {\n /**\n * 是否启用事件追踪\n */\n enableTracking?: boolean;\n \n /**\n * 最大事件历史记录数\n */\n maxHistorySize?: number;\n \n /**\n * 是否启用事件验证\n */\n enableValidation?: boolean;\n \n /**\n * 事件验证函数\n */\n validator?: (event: string, data: unknown) => boolean;\n \n /**\n * 是否启用性能监控\n */\n enablePerformanceMonitoring?: boolean;\n \n /**\n * 事件命名空间前缀(用于多实例隔离)\n */\n namespacePrefix?: string;\n \n /**\n * 应用实例ID(多实例场景)\n */\n instanceId?: string;\n \n /**\n * 是否启用安全模式(限制事件来源)\n */\n enableSecurityMode?: boolean;\n \n /**\n * 允许的事件来源白名单(安全模式)\n */\n allowedSources?: string[];\n}\n\n/**\n * 事件统计信息\n */\nexport interface EventStats {\n /**\n * 事件名称\n */\n event: string;\n \n /**\n * 触发次数\n */\n count: number;\n \n /**\n * 平均执行时间(毫秒)\n */\n avgExecutionTime: number;\n \n /**\n * 监听器数量\n */\n listenerCount: number;\n \n /**\n * 最后触发时间\n */\n lastTriggered: number;\n}\n\n/**\n * 框架内置事件类型\n */\nexport enum FrameworkEventType {\n /**\n * 应用启动开始\n */\n APP_START = 'framework:app:start',\n \n /**\n * 应用启动完成\n */\n APP_STARTED = 'framework:app:started',\n \n /**\n * 应用初始化开始\n */\n APP_INIT_START = 'framework:app:init:start',\n \n /**\n * 应用初始化完成\n */\n APP_INIT_COMPLETE = 'framework:app:init:complete',\n \n /**\n * 应用初始化失败\n */\n APP_INIT_ERROR = 'framework:app:init:error',\n \n /**\n * 应用渲染开始\n */\n APP_RENDER_START = 'framework:app:render:start',\n \n /**\n * 应用渲染完成\n */\n APP_RENDER_COMPLETE = 'framework:app:render:complete',\n \n /**\n * 路由变化\n */\n ROUTE_CHANGE = 'framework:route:change',\n \n /**\n * 路由导航开始\n */\n ROUTE_NAVIGATE_START = 'framework:route:navigate:start',\n \n /**\n * 路由导航完成\n */\n ROUTE_NAVIGATE_COMPLETE = 'framework:route:navigate:complete',\n \n /**\n * 错误发生\n */\n ERROR_OCCURRED = 'framework:error:occurred',\n \n /**\n * 实例创建\n */\n INSTANCE_CREATED = 'framework:instance:created',\n \n /**\n * 实例销毁\n */\n INSTANCE_DESTROYED = 'framework:instance:destroyed',\n \n /**\n * 性能指标更新\n */\n PERFORMANCE_UPDATE = 'framework:performance:update',\n}\n\n/**\n * 框架事件数据类型定义\n */\nexport interface FrameworkEventData {\n [FrameworkEventType.APP_START]: { instanceId?: string };\n [FrameworkEventType.APP_STARTED]: { instanceId?: string; duration: number };\n [FrameworkEventType.APP_INIT_START]: { instanceId?: string };\n [FrameworkEventType.APP_INIT_COMPLETE]: { instanceId?: string; context: unknown; duration: number };\n [FrameworkEventType.APP_INIT_ERROR]: { instanceId?: string; error: Error };\n [FrameworkEventType.APP_RENDER_START]: { instanceId?: string };\n [FrameworkEventType.APP_RENDER_COMPLETE]: { instanceId?: string; duration: number };\n [FrameworkEventType.ROUTE_CHANGE]: { from: string; to: string; params?: Record<string, unknown> };\n [FrameworkEventType.ROUTE_NAVIGATE_START]: { to: string; options?: unknown };\n [FrameworkEventType.ROUTE_NAVIGATE_COMPLETE]: { to: string; duration: number };\n [FrameworkEventType.ERROR_OCCURRED]: { error: Error; context?: unknown };\n [FrameworkEventType.INSTANCE_CREATED]: { instanceId: string };\n [FrameworkEventType.INSTANCE_DESTROYED]: { instanceId: string };\n [FrameworkEventType.PERFORMANCE_UPDATE]: { metrics: Record<string, number> };\n}\n"],"names":["FrameworkEventType"],"mappings":"AAAA;;;CAGC,GAED;;;;CAIC;;;;+BAoLWA;;;eAAAA;;;AAAL,IAAA,AAAKA,4CAAAA;IACV;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;WApESA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/event/types.ts"],"sourcesContent":["/**\n * 应用级事件系统类型定义\n * 提供类型安全的事件通信能力\n */\n\n/**\n * 事件监听器类型\n * \n * @template T - 事件数据类型\n */\nexport type EventListener<T = unknown> = (data: T, metadata: EventMetadata) => void | Promise<void>;\n\n/**\n * 事件元数据\n */\nexport interface EventMetadata {\n /**\n * 事件来源(模块/组件名称)\n */\n source?: string;\n \n /**\n * 事件时间戳\n */\n timestamp: number;\n \n /**\n * 事件ID(用于追踪)\n */\n eventId: string;\n \n /**\n * 事件优先级(数字越小优先级越高)\n */\n priority?: number;\n \n /**\n * 应用实例ID(多实例场景)\n */\n instanceId?: string;\n \n /**\n * 事件命名空间(用于作用域隔离)\n */\n namespace?: string;\n \n /**\n * 自定义元数据\n */\n [key: string]: unknown;\n}\n\n/**\n * 事件包装器\n * \n * @template T - 事件数据类型\n */\nexport interface EventWrapper<T = unknown> {\n /**\n * 事件数据\n */\n data: T;\n \n /**\n * 事件元数据\n */\n metadata: EventMetadata;\n}\n\n/**\n * 事件中间件函数类型\n * \n * @template T - 事件数据类型\n */\nexport type EventMiddleware<T = unknown> = (\n event: string,\n data: T,\n metadata: EventMetadata,\n next: () => Promise<void>\n) => Promise<void> | void;\n\n/**\n * 事件监听器选项\n */\nexport interface EventListenerOptions {\n /**\n * 监听器优先级(数字越小优先级越高)\n */\n priority?: number;\n \n /**\n * 是否只执行一次\n */\n once?: boolean;\n \n /**\n * 事件命名空间(用于作用域隔离)\n */\n namespace?: string;\n \n /**\n * 是否异步执行\n */\n async?: boolean;\n}\n\n/**\n * 事件总线配置\n */\nexport interface AppEventBusConfig {\n /**\n * 是否启用事件追踪\n */\n enableTracking?: boolean;\n \n /**\n * 最大事件历史记录数\n */\n maxHistorySize?: number;\n \n /**\n * 是否启用事件验证\n */\n enableValidation?: boolean;\n \n /**\n * 事件验证函数\n */\n validator?: (event: string, data: unknown) => boolean;\n \n /**\n * 是否启用性能监控\n */\n enablePerformanceMonitoring?: boolean;\n \n /**\n * 事件命名空间前缀(用于多实例隔离)\n */\n namespacePrefix?: string;\n \n /**\n * 应用实例ID(多实例场景)\n */\n instanceId?: string;\n \n /**\n * 是否启用安全模式(限制事件来源)\n */\n enableSecurityMode?: boolean;\n \n /**\n * 允许的事件来源白名单(安全模式)\n */\n allowedSources?: string[];\n}\n\n/**\n * 事件统计信息\n */\nexport interface EventStats {\n /**\n * 事件名称\n */\n event: string;\n \n /**\n * 触发次数\n */\n count: number;\n \n /**\n * 平均执行时间(毫秒)\n */\n avgExecutionTime: number;\n \n /**\n * 监听器数量\n */\n listenerCount: number;\n \n /**\n * 最后触发时间\n */\n lastTriggered: number;\n}\n\n/**\n * 框架内置事件类型\n */\nexport enum FrameworkEventType {\n /**\n * 应用启动开始\n */\n APP_START = 'framework:app:start',\n \n /**\n * 应用启动完成\n */\n APP_STARTED = 'framework:app:started',\n \n /**\n * 应用初始化开始\n */\n APP_INIT_START = 'framework:app:init:start',\n \n /**\n * 应用初始化完成\n */\n APP_INIT_COMPLETE = 'framework:app:init:complete',\n \n /**\n * 应用初始化失败\n */\n APP_INIT_ERROR = 'framework:app:init:error',\n \n /**\n * 应用渲染开始\n */\n APP_RENDER_START = 'framework:app:render:start',\n \n /**\n * 应用渲染完成\n */\n APP_RENDER_COMPLETE = 'framework:app:render:complete',\n \n /**\n * 路由变化\n */\n ROUTE_CHANGE = 'framework:route:change',\n \n /**\n * 路由导航开始\n */\n ROUTE_NAVIGATE_START = 'framework:route:navigate:start',\n \n /**\n * 路由导航完成\n */\n ROUTE_NAVIGATE_COMPLETE = 'framework:route:navigate:complete',\n \n /**\n * 错误发生\n */\n ERROR_OCCURRED = 'framework:error:occurred',\n \n /**\n * 实例创建\n */\n INSTANCE_CREATED = 'framework:instance:created',\n \n /**\n * 实例销毁\n */\n INSTANCE_DESTROYED = 'framework:instance:destroyed',\n \n /**\n * 性能指标更新\n */\n PERFORMANCE_UPDATE = 'framework:performance:update',\n}\n\n/**\n * 框架事件数据类型定义\n */\nexport interface FrameworkEventData {\n [FrameworkEventType.APP_START]: { instanceId?: string };\n [FrameworkEventType.APP_STARTED]: { instanceId?: string; duration: number };\n [FrameworkEventType.APP_INIT_START]: { instanceId?: string };\n [FrameworkEventType.APP_INIT_COMPLETE]: { instanceId?: string; context: unknown; duration: number };\n [FrameworkEventType.APP_INIT_ERROR]: { instanceId?: string; error: Error };\n [FrameworkEventType.APP_RENDER_START]: { instanceId?: string };\n [FrameworkEventType.APP_RENDER_COMPLETE]: { instanceId?: string; duration: number };\n [FrameworkEventType.ROUTE_CHANGE]: { from: string; to: string; params?: Record<string, unknown> };\n [FrameworkEventType.ROUTE_NAVIGATE_START]: { to: string; options?: unknown };\n [FrameworkEventType.ROUTE_NAVIGATE_COMPLETE]: { to: string; duration: number };\n [FrameworkEventType.ERROR_OCCURRED]: { error: Error; context?: unknown };\n [FrameworkEventType.INSTANCE_CREATED]: { instanceId: string };\n [FrameworkEventType.INSTANCE_DESTROYED]: { instanceId: string };\n [FrameworkEventType.PERFORMANCE_UPDATE]: { metrics: Record<string, number> };\n}\n"],"names":["FrameworkEventType"],"mappings":"AAAA;;;CAGC,GAED;;;;CAIC,GAiLD;;CAEC,GACD,OAAO,IAAA,AAAKA,4CAAAA;IACV;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;WApESA;MAsEX"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/event/useEventBus.ts"],"sourcesContent":["/**\n * 便捷的 Hook:获取当前应用实例的事件总线\n */\n\nimport { getAppInstanceManager } from '../startup/AppInstance';\nimport type { AppEventBus } from './AppEventBus';\n\n/**\n * 获取当前应用实例的事件总线\n * \n * @returns 事件总线实例\n * \n * @example\n * ```tsx\n * import { useEventBus } from '@vlian/framework';\n * \n * function MyComponent() {\n * const eventBus = useEventBus();\n * \n * useEffect(() => {\n * const unsubscribe = eventBus.on('user:login', (data) => {\n * console.log('用户登录:', data);\n * });\n * return unsubscribe;\n * }, [eventBus]);\n * \n * return <div>My Component</div>;\n * }\n * ```\n */\nexport function useEventBus(): AppEventBus {\n const instanceManager = getAppInstanceManager();\n const instance = instanceManager.getInstance();\n \n if (!instance) {\n throw new Error('应用实例未找到');\n }\n \n const eventBus = instance.getEventBus();\n \n if (!eventBus) {\n throw new Error('事件总线未初始化');\n }\n \n return eventBus;\n}\n"],"names":["useEventBus","instanceManager","getAppInstanceManager","instance","getInstance","Error","eventBus","getEventBus"],"mappings":"AAAA;;CAEC;;;;+BA4BeA;;;eAAAA;;;6BA1BsB;AA0B/B,SAASA;IACd,MAAMC,kBAAkBC,IAAAA,kCAAqB;IAC7C,MAAMC,WAAWF,gBAAgBG,WAAW;IAE5C,IAAI,CAACD,UAAU;QACb,MAAM,IAAIE,MAAM;IAClB;IAEA,MAAMC,WAAWH,SAASI,WAAW;IAErC,IAAI,CAACD,UAAU;QACb,MAAM,IAAID,MAAM;IAClB;IAEA,OAAOC;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/event/useEventBus.ts"],"sourcesContent":["/**\n * 便捷的 Hook:获取当前应用实例的事件总线\n */\n\nimport { getAppInstanceManager } from '../startup/AppInstance';\nimport type { AppEventBus } from './AppEventBus';\n\n/**\n * 获取当前应用实例的事件总线\n * \n * @returns 事件总线实例\n * \n * @example\n * ```tsx\n * import { useEventBus } from '@vlian/framework';\n * \n * function MyComponent() {\n * const eventBus = useEventBus();\n * \n * useEffect(() => {\n * const unsubscribe = eventBus.on('user:login', (data) => {\n * console.log('用户登录:', data);\n * });\n * return unsubscribe;\n * }, [eventBus]);\n * \n * return <div>My Component</div>;\n * }\n * ```\n */\nexport function useEventBus(): AppEventBus {\n const instanceManager = getAppInstanceManager();\n const instance = instanceManager.getInstance();\n \n if (!instance) {\n throw new Error('应用实例未找到');\n }\n \n const eventBus = instance.getEventBus();\n \n if (!eventBus) {\n throw new Error('事件总线未初始化');\n }\n \n return eventBus;\n}\n"],"names":["getAppInstanceManager","useEventBus","instanceManager","instance","getInstance","Error","eventBus","getEventBus"],"mappings":"AAAA;;CAEC,GAED,SAASA,qBAAqB,QAAQ,yBAAyB;AAG/D;;;;;;;;;;;;;;;;;;;;;;CAsBC,GACD,OAAO,SAASC;IACd,MAAMC,kBAAkBF;IACxB,MAAMG,WAAWD,gBAAgBE,WAAW;IAE5C,IAAI,CAACD,UAAU;QACb,MAAM,IAAIE,MAAM;IAClB;IAEA,MAAMC,WAAWH,SAASI,WAAW;IAErC,IAAI,CAACD,UAAU;QACb,MAAM,IAAID,MAAM;IAClB;IAEA,OAAOC;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/core/index.tsx"],"sourcesContent":["import type { StartOptions } from \"./types\";\nimport { storage } from '../library';\nimport { StateManager } from '../state';\nimport { startApp } from './startup/startApp';\nimport { getAppInstanceManager } from './startup/AppInstance';\n\n\n/**\n * 启动框架\n * \n * @param options - 启动配置选项\n * @returns Promise<void>\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * loggerLevel: LogLevel.DEBUG,\n * lifecycle: {\n * beforeInitialization: async () => {\n * console.log('初始化前执行');\n * },\n * },\n * });\n * ```\n */\n/**\n * 启动框架(向后兼容的API)\n * \n * @param options - 启动配置选项\n * @returns Promise<void>\n * \n * @deprecated 建议使用 startApp 函数,支持多实例\n */\nconst start = async (options: StartOptions = {}): Promise<void> => {\n // 使用新的启动函数,保持向后兼容\n await startApp(options);\n};\n\n// 导出新的启动函数\nexport { startApp } from './startup/startApp';\nexport { getAppInstanceManager } from './startup/AppInstance';\nexport type { AppInstance } from './startup/AppInstance';\n\n// 导出向后兼容的start函数\nexport {\n start,\n storage,\n};\n\n// 导出getStateManager(向后兼容)\nexport const getStateManager = (): StateManager | null => {\n const instanceManager = getAppInstanceManager();\n const instance = instanceManager.getInstance();\n if (instance) {\n return instance.getServices().stateManager;\n }\n return null;\n};\n\n// 导出应用上下文相关功能\nexport {\n AppContextProvider,\n useAppContext,\n useTheme,\n useLocale,\n useConfig,\n useStateManager,\n} from './app';\n\n// 导出错误边界\nexport { ErrorBoundary, withErrorBoundary, useErrorHandler } from './error';\nexport type { ErrorBoundaryProps } from './error';\n\n// 导出应用配置单例\nexport { appConfig } from './config/AppConfig';\n\n// 导出初始化相关类型\nexport type {\n InitializationContext,\n InitializationOptions,\n ProgressCallback,\n} from './initialization';\n\n// 导出中间件\nexport { MiddlewareManager, middlewareManager } from './middleware';\nexport type { Middleware } from './middleware';\n\n// 导出插件\nexport { PluginManager, pluginManager } from './plugin';\nexport type { Plugin } from './plugin';\n\n// 导出应用上下文相关类型\nexport type {\n AppContextValue,\n ThemeContextValue,\n LocaleContextValue,\n ConfigContextValue,\n StateManagerContextValue,\n ThemeConfig,\n AppConfig,\n AppContextProviderProps,\n} from './app';\n\n// 导出启动配置相关类型\nexport type { StartOptions, ManagerLifecycle, SplashScreenCustomProps } from './types';\n\n// 导出启动相关模块\nexport * from './startup';\nexport * from './config';\nexport * from './kernel';\n\n// 导出路由相关模块\nexport * from './router';\n\n// 导出事件系统\nexport * from './event';\n\n// 导出开发工具\nexport { DevTools, DevToolsTrigger } from './dev/DevTools';\n"],"names":["AppContextProvider","DevTools","DevToolsTrigger","ErrorBoundary","MiddlewareManager","PluginManager","appConfig","getAppInstanceManager","getStateManager","middlewareManager","pluginManager","start","startApp","storage","useAppContext","useConfig","useErrorHandler","useLocale","useStateManager","useTheme","withErrorBoundary","options","instanceManager","instance","getInstance","getServices","stateManager"],"mappings":";;;;;;;;;;;QA+DIA;eAAAA,uBAAkB;;QAyDbC;eAAAA,kBAAQ;;QAAEC;eAAAA,yBAAe;;QAhDzBC;eAAAA,oBAAa;;QAcbC;eAAAA,6BAAiB;;QAIjBC;eAAAA,qBAAa;;QAdbC;eAAAA,oBAAS;;QAlCTC;eAAAA,kCAAqB;;QAUjBC;eAAAA;;QAkCeC;eAAAA,6BAAiB;;QAIrBC;eAAAA,qBAAa;;QA3CjCC;eAAAA;;QANKC;eAAAA,kBAAQ;;QAObC;eAAAA,gBAAO;;QAgBPC;eAAAA,kBAAa;;QAGbC;eAAAA,cAAS;;QAK8BC;eAAAA,sBAAe;;QANtDC;eAAAA,cAAS;;QAETC;eAAAA,oBAAe;;QAHfC;eAAAA,aAAQ;;QAOYC;eAAAA,wBAAiB;;;yBAvEjB;0BAEC;6BACa;qBAiE/B;uBAG2D;2BAIxC;4BAU2B;wBAIR;qBAmB/B;qBACA;qBACA;qBAGA;qBAGA;0BAG4B;;;;;;;;;;;;;;AAjH1C;;;;;;;;;;;;;;;;;;;CAmBC,GACD;;;;;;;CAOC,GACD,MAAMT,QAAQ,OAAOU,UAAwB,CAAC,CAAC;IAC3C,kBAAkB;IAClB,MAAMT,IAAAA,kBAAQ,EAACS;AACnB;AAcO,MAAMb,kBAAkB;IAC3B,MAAMc,kBAAkBf,IAAAA,kCAAqB;IAC7C,MAAMgB,WAAWD,gBAAgBE,WAAW;IAC5C,IAAID,UAAU;QACV,OAAOA,SAASE,WAAW,GAAGC,YAAY;IAC9C;IACA,OAAO;AACX"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/core/index.tsx"],"sourcesContent":["import type { StartOptions } from \"./types\";\nimport { storage } from '../library';\nimport { StateManager } from '../state';\nimport { startApp } from './startup/startApp';\nimport { getAppInstanceManager } from './startup/AppInstance';\n\n\n/**\n * 启动框架\n * \n * @param options - 启动配置选项\n * @returns Promise<void>\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * loggerLevel: LogLevel.DEBUG,\n * lifecycle: {\n * beforeInitialization: async () => {\n * console.log('初始化前执行');\n * },\n * },\n * });\n * ```\n */\n/**\n * 启动框架(向后兼容的API)\n * \n * @param options - 启动配置选项\n * @returns Promise<void>\n * \n * @deprecated 建议使用 startApp 函数,支持多实例\n */\nconst start = async (options: StartOptions = {}): Promise<void> => {\n // 使用新的启动函数,保持向后兼容\n await startApp(options);\n};\n\n// 导出新的启动函数\nexport { startApp } from './startup/startApp';\nexport { getAppInstanceManager } from './startup/AppInstance';\nexport type { AppInstance } from './startup/AppInstance';\n\n// 导出向后兼容的start函数\nexport {\n start,\n storage,\n};\n\n// 导出getStateManager(向后兼容)\nexport const getStateManager = (): StateManager | null => {\n const instanceManager = getAppInstanceManager();\n const instance = instanceManager.getInstance();\n if (instance) {\n return instance.getServices().stateManager;\n }\n return null;\n};\n\n// 导出应用上下文相关功能\nexport {\n AppContextProvider,\n useAppContext,\n useTheme,\n useLocale,\n useConfig,\n useStateManager,\n} from './app';\n\n// 导出错误边界\nexport { ErrorBoundary, withErrorBoundary, useErrorHandler } from './error';\nexport type { ErrorBoundaryProps } from './error';\n\n// 导出应用配置单例\nexport { appConfig } from './config/AppConfig';\n\n// 导出初始化相关类型\nexport type {\n InitializationContext,\n InitializationOptions,\n ProgressCallback,\n} from './initialization';\n\n// 导出中间件\nexport { MiddlewareManager, middlewareManager } from './middleware';\nexport type { Middleware } from './middleware';\n\n// 导出插件\nexport { PluginManager, pluginManager } from './plugin';\nexport type { Plugin } from './plugin';\n\n// 导出应用上下文相关类型\nexport type {\n AppContextValue,\n ThemeContextValue,\n LocaleContextValue,\n ConfigContextValue,\n StateManagerContextValue,\n ThemeConfig,\n AppConfig,\n AppContextProviderProps,\n} from './app';\n\n// 导出启动配置相关类型\nexport type { StartOptions, ManagerLifecycle, SplashScreenCustomProps } from './types';\n\n// 导出启动相关模块\nexport * from './startup';\nexport * from './config';\nexport * from './kernel';\n\n// 导出路由相关模块\nexport * from './router';\n\n// 导出事件系统\nexport * from './event';\n\n// 导出开发工具\nexport { DevTools, DevToolsTrigger } from './dev/DevTools';\n"],"names":["storage","startApp","getAppInstanceManager","start","options","getStateManager","instanceManager","instance","getInstance","getServices","stateManager","AppContextProvider","useAppContext","useTheme","useLocale","useConfig","useStateManager","ErrorBoundary","withErrorBoundary","useErrorHandler","appConfig","MiddlewareManager","middlewareManager","PluginManager","pluginManager","DevTools","DevToolsTrigger"],"mappings":"AACA,SAASA,OAAO,QAAQ,aAAa;AAErC,SAASC,QAAQ,QAAQ,qBAAqB;AAC9C,SAASC,qBAAqB,QAAQ,wBAAwB;AAG9D;;;;;;;;;;;;;;;;;;;CAmBC,GACD;;;;;;;CAOC,GACD,MAAMC,QAAQ,OAAOC,UAAwB,CAAC,CAAC;IAC3C,kBAAkB;IAClB,MAAMH,SAASG;AACnB;AAEA,WAAW;AACX,SAASH,QAAQ,QAAQ,qBAAqB;AAC9C,SAASC,qBAAqB,QAAQ,wBAAwB;AAG9D,iBAAiB;AACjB,SACIC,KAAK,EACLH,OAAO,GACT;AAEF,0BAA0B;AAC1B,OAAO,MAAMK,kBAAkB;IAC3B,MAAMC,kBAAkBJ;IACxB,MAAMK,WAAWD,gBAAgBE,WAAW;IAC5C,IAAID,UAAU;QACV,OAAOA,SAASE,WAAW,GAAGC,YAAY;IAC9C;IACA,OAAO;AACX,EAAE;AAEF,cAAc;AACd,SACIC,kBAAkB,EAClBC,aAAa,EACbC,QAAQ,EACRC,SAAS,EACTC,SAAS,EACTC,eAAe,QACZ,QAAQ;AAEf,SAAS;AACT,SAASC,aAAa,EAAEC,iBAAiB,EAAEC,eAAe,QAAQ,UAAU;AAG5E,WAAW;AACX,SAASC,SAAS,QAAQ,qBAAqB;AAS/C,QAAQ;AACR,SAASC,iBAAiB,EAAEC,iBAAiB,QAAQ,eAAe;AAGpE,OAAO;AACP,SAASC,aAAa,EAAEC,aAAa,QAAQ,WAAW;AAkBxD,WAAW;AACX,cAAc,YAAY;AAC1B,cAAc,WAAW;AACzB,cAAc,WAAW;AAEzB,WAAW;AACX,cAAc,WAAW;AAEzB,SAAS;AACT,cAAc,UAAU;AAExB,SAAS;AACT,SAASC,QAAQ,EAAEC,eAAe,QAAQ,iBAAiB"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/initialization/InitializationErrorThrower.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { initializationErrorState } from './initializationErrorState';\nimport type { FrameworkError } from '@vlian/utils';\n\n/**\n * 初始化错误抛出组件\n * \n * 当检测到初始化错误时,主动抛出错误给 ErrorBoundary 捕获\n */\nexport const InitializationErrorThrower: React.FC = () => {\n const [error, setError] = useState<FrameworkError | null>(null);\n\n useEffect(() => {\n // 检查初始错误\n const currentError = initializationErrorState.getError();\n if (currentError) {\n setError(currentError);\n return;\n }\n\n // 订阅错误变化\n const unsubscribe = initializationErrorState.subscribe(() => {\n const newError = initializationErrorState.getError();\n setError(newError);\n });\n\n return unsubscribe;\n }, []);\n\n // 如果有错误,抛出错误给 ErrorBoundary\n if (error) {\n throw error;\n }\n\n return null;\n};\n"],"names":["InitializationErrorThrower","error","setError","useState","useEffect","currentError","initializationErrorState","getError","unsubscribe","subscribe","newError"],"mappings":";;;;+BASaA;;;eAAAA;;;+DAT8B;0CACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQlC,MAAMA,6BAAuC;IAClD,MAAM,CAACC,OAAOC,SAAS,GAAGC,IAAAA,eAAQ,EAAwB;IAE1DC,IAAAA,gBAAS,EAAC;QACR,SAAS;QACT,MAAMC,eAAeC,kDAAwB,CAACC,QAAQ;QACtD,IAAIF,cAAc;YAChBH,SAASG;YACT;QACF;QAEA,SAAS;QACT,MAAMG,cAAcF,kDAAwB,CAACG,SAAS,CAAC;YACrD,MAAMC,WAAWJ,kDAAwB,CAACC,QAAQ;YAClDL,SAASQ;QACX;QAEA,OAAOF;IACT,GAAG,EAAE;IAEL,4BAA4B;IAC5B,IAAIP,OAAO;QACT,MAAMA;IACR;IAEA,OAAO;AACT"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/initialization/InitializationErrorThrower.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { initializationErrorState } from './initializationErrorState';\nimport type { FrameworkError } from '@vlian/utils';\n\n/**\n * 初始化错误抛出组件\n * \n * 当检测到初始化错误时,主动抛出错误给 ErrorBoundary 捕获\n */\nexport const InitializationErrorThrower: React.FC = () => {\n const [error, setError] = useState<FrameworkError | null>(null);\n\n useEffect(() => {\n // 检查初始错误\n const currentError = initializationErrorState.getError();\n if (currentError) {\n setError(currentError);\n return;\n }\n\n // 订阅错误变化\n const unsubscribe = initializationErrorState.subscribe(() => {\n const newError = initializationErrorState.getError();\n setError(newError);\n });\n\n return unsubscribe;\n }, []);\n\n // 如果有错误,抛出错误给 ErrorBoundary\n if (error) {\n throw error;\n }\n\n return null;\n};\n"],"names":["React","useEffect","useState","initializationErrorState","InitializationErrorThrower","error","setError","currentError","getError","unsubscribe","subscribe","newError"],"mappings":"AAAA,OAAOA,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAQ;AACnD,SAASC,wBAAwB,QAAQ,6BAA6B;AAGtE;;;;CAIC,GACD,OAAO,MAAMC,6BAAuC;IAClD,MAAM,CAACC,OAAOC,SAAS,GAAGJ,SAAgC;IAE1DD,UAAU;QACR,SAAS;QACT,MAAMM,eAAeJ,yBAAyBK,QAAQ;QACtD,IAAID,cAAc;YAChBD,SAASC;YACT;QACF;QAEA,SAAS;QACT,MAAME,cAAcN,yBAAyBO,SAAS,CAAC;YACrD,MAAMC,WAAWR,yBAAyBK,QAAQ;YAClDF,SAASK;QACX;QAEA,OAAOF;IACT,GAAG,EAAE;IAEL,4BAA4B;IAC5B,IAAIJ,OAAO;QACT,MAAMA;IACR;IAEA,OAAO;AACT,EAAE"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/initialization/index.ts"],"sourcesContent":["/**\n * 初始化模块统一导出\n */\n\nexport { initialization } from './initialization';\nexport type {\n InitializationContext,\n InitializationOptions,\n ProgressCallback,\n} from './initialization';\nexport { InitializationErrorThrower } from './InitializationErrorThrower';\nexport { initializationErrorState } from './initializationErrorState';\n"],"names":["InitializationErrorThrower","initialization","initializationErrorState"],"mappings":"AAAA;;CAEC;;;;;;;;;;;QAQQA;eAAAA,sDAA0B;;QAN1BC;eAAAA,8BAAc;;QAOdC;eAAAA,kDAAwB;;;gCAPF;4CAMY;0CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/core/initialization/index.ts"],"sourcesContent":["/**\n * 初始化模块统一导出\n */\n\nexport { initialization } from './initialization';\nexport type {\n InitializationContext,\n InitializationOptions,\n ProgressCallback,\n} from './initialization';\nexport { InitializationErrorThrower } from './InitializationErrorThrower';\nexport { initializationErrorState } from './initializationErrorState';\n"],"names":["initialization","InitializationErrorThrower","initializationErrorState"],"mappings":"AAAA;;CAEC,GAED,SAASA,cAAc,QAAQ,mBAAmB;AAMlD,SAASC,0BAA0B,QAAQ,+BAA+B;AAC1E,SAASC,wBAAwB,QAAQ,6BAA6B"}