@vlian/framework 1.2.1 → 1.2.16

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 (428) hide show
  1. package/dist/analytics/index.cjs +24 -0
  2. package/dist/analytics/index.cjs.map +1 -0
  3. package/dist/analytics/index.d.ts +2 -0
  4. package/dist/analytics/index.js +3 -0
  5. package/dist/analytics/index.js.map +1 -0
  6. package/dist/analytics.umd.js +2406 -0
  7. package/dist/analytics.umd.js.map +1 -0
  8. package/dist/components/LocaleSwitch.cjs +118 -0
  9. package/dist/components/LocaleSwitch.cjs.map +1 -0
  10. package/dist/components/LocaleSwitch.d.ts +21 -0
  11. package/dist/components/LocaleSwitch.js +103 -0
  12. package/dist/components/LocaleSwitch.js.map +1 -0
  13. package/dist/components/ThemeSwitch.cjs +117 -0
  14. package/dist/components/ThemeSwitch.cjs.map +1 -0
  15. package/dist/components/ThemeSwitch.d.ts +20 -0
  16. package/dist/components/ThemeSwitch.js +102 -0
  17. package/dist/components/ThemeSwitch.js.map +1 -0
  18. package/dist/components/index.cjs +16 -0
  19. package/dist/components/index.cjs.map +1 -1
  20. package/dist/components/index.d.ts +5 -2
  21. package/dist/components/index.js +2 -1
  22. package/dist/components/index.js.map +1 -1
  23. package/dist/components/persistence.cjs +60 -0
  24. package/dist/components/persistence.cjs.map +1 -0
  25. package/dist/components/persistence.d.ts +12 -0
  26. package/dist/components/persistence.js +39 -0
  27. package/dist/components/persistence.js.map +1 -0
  28. package/dist/core/Test.d.ts +0 -1
  29. package/dist/core/app/AppContext.cjs +36 -30
  30. package/dist/core/app/AppContext.cjs.map +1 -1
  31. package/dist/core/app/AppContext.d.ts +9 -6
  32. package/dist/core/app/AppContext.js +36 -30
  33. package/dist/core/app/AppContext.js.map +1 -1
  34. package/dist/core/app/AppContext.types.d.ts +9 -10
  35. package/dist/core/app/AppContext.types.js.map +1 -1
  36. package/dist/core/app/BasicLayout.cjs +57 -22
  37. package/dist/core/app/BasicLayout.cjs.map +1 -1
  38. package/dist/core/app/BasicLayout.d.ts +7 -5
  39. package/dist/core/app/BasicLayout.js +57 -22
  40. package/dist/core/app/BasicLayout.js.map +1 -1
  41. package/dist/core/app/DefaultApp.cjs +104 -153
  42. package/dist/core/app/DefaultApp.cjs.map +1 -1
  43. package/dist/core/app/DefaultApp.d.ts +0 -21
  44. package/dist/core/app/DefaultApp.js +104 -153
  45. package/dist/core/app/DefaultApp.js.map +1 -1
  46. package/dist/core/app/index.d.ts +0 -1
  47. package/dist/core/config/AppConfig.cjs.map +1 -1
  48. package/dist/core/config/AppConfig.d.ts +3 -4
  49. package/dist/core/config/AppConfig.js.map +1 -1
  50. package/dist/core/config/ConfigLoader.d.ts +0 -1
  51. package/dist/core/config/ConfigValidator.d.ts +0 -1
  52. package/dist/core/config/index.d.ts +0 -1
  53. package/dist/core/dev/DevTools.cjs +141 -287
  54. package/dist/core/dev/DevTools.cjs.map +1 -1
  55. package/dist/core/dev/DevTools.d.ts +1 -32
  56. package/dist/core/dev/DevTools.js +143 -296
  57. package/dist/core/dev/DevTools.js.map +1 -1
  58. package/dist/core/error/ErrorBoundary.cjs +72 -14
  59. package/dist/core/error/ErrorBoundary.cjs.map +1 -1
  60. package/dist/core/error/ErrorBoundary.d.ts +7 -9
  61. package/dist/core/error/ErrorBoundary.js +73 -15
  62. package/dist/core/error/ErrorBoundary.js.map +1 -1
  63. package/dist/core/error/ErrorHandler.d.ts +0 -1
  64. package/dist/core/error/index.d.ts +0 -1
  65. package/dist/core/event/AppEventBus.d.ts +0 -1
  66. package/dist/core/event/frameworkEvents.d.ts +0 -1
  67. package/dist/core/event/hooks.d.ts +0 -1
  68. package/dist/core/event/index.d.ts +0 -1
  69. package/dist/core/event/types.d.ts +0 -1
  70. package/dist/core/event/useEventBus.d.ts +0 -1
  71. package/dist/core/index.cjs +2 -0
  72. package/dist/core/index.cjs.map +1 -1
  73. package/dist/core/index.d.ts +2 -1
  74. package/dist/core/index.js +2 -0
  75. package/dist/core/index.js.map +1 -1
  76. package/dist/core/initialization/InitializationErrorThrower.d.ts +0 -1
  77. package/dist/core/initialization/index.d.ts +0 -1
  78. package/dist/core/initialization/initialization.d.ts +0 -1
  79. package/dist/core/initialization/initializationErrorState.d.ts +0 -1
  80. package/dist/core/kernel/defaultAdapters.cjs +185 -0
  81. package/dist/core/kernel/defaultAdapters.cjs.map +1 -0
  82. package/dist/core/kernel/defaultAdapters.d.ts +2 -0
  83. package/dist/core/kernel/defaultAdapters.js +175 -0
  84. package/dist/core/kernel/defaultAdapters.js.map +1 -0
  85. package/dist/core/kernel/errors.cjs +71 -0
  86. package/dist/core/kernel/errors.cjs.map +1 -0
  87. package/dist/core/kernel/errors.d.ts +18 -0
  88. package/dist/core/kernel/errors.js +53 -0
  89. package/dist/core/kernel/errors.js.map +1 -0
  90. package/dist/core/kernel/index.cjs +22 -0
  91. package/dist/core/kernel/index.cjs.map +1 -0
  92. package/dist/core/kernel/index.d.ts +3 -0
  93. package/dist/core/kernel/index.js +4 -0
  94. package/dist/core/kernel/index.js.map +1 -0
  95. package/dist/core/kernel/startKernel.cjs +203 -0
  96. package/dist/core/kernel/startKernel.cjs.map +1 -0
  97. package/dist/core/kernel/startKernel.d.ts +2 -0
  98. package/dist/core/kernel/startKernel.js +193 -0
  99. package/dist/core/kernel/startKernel.js.map +1 -0
  100. package/dist/core/kernel/types.cjs +6 -0
  101. package/dist/core/kernel/types.cjs.map +1 -0
  102. package/dist/core/kernel/types.d.ts +114 -0
  103. package/dist/core/kernel/types.js +3 -0
  104. package/dist/core/kernel/types.js.map +1 -0
  105. package/dist/core/middleware.d.ts +0 -1
  106. package/dist/core/plugin/PluginEventBus.d.ts +0 -1
  107. package/dist/core/plugin/PluginSandbox.d.ts +0 -1
  108. package/dist/core/plugin.cjs +1 -1
  109. package/dist/core/plugin.cjs.map +1 -1
  110. package/dist/core/plugin.d.ts +0 -1
  111. package/dist/core/plugin.js +1 -1
  112. package/dist/core/plugin.js.map +1 -1
  113. package/dist/core/router/RouterManager.d.ts +0 -1
  114. package/dist/core/router/adapter/AdapterManager.d.ts +0 -1
  115. package/dist/core/router/adapter/index.d.ts +0 -1
  116. package/dist/core/router/adapter/react-router/ReactRouterAdapter.d.ts +0 -1
  117. package/dist/core/router/adapter/react-router/index.d.ts +0 -1
  118. package/dist/core/router/adapter/types.cjs.map +1 -1
  119. package/dist/core/router/adapter/types.d.ts +1 -2
  120. package/dist/core/router/adapter/types.js.map +1 -1
  121. package/dist/core/router/dev/RouterDevTools.cjs +148 -296
  122. package/dist/core/router/dev/RouterDevTools.cjs.map +1 -1
  123. package/dist/core/router/dev/RouterDevTools.d.ts +1 -6
  124. package/dist/core/router/dev/RouterDevTools.js +149 -301
  125. package/dist/core/router/dev/RouterDevTools.js.map +1 -1
  126. package/dist/core/router/dev/index.d.ts +0 -1
  127. package/dist/core/router/dynamic/DynamicRouteManager.d.ts +0 -1
  128. package/dist/core/router/dynamic/index.d.ts +0 -1
  129. package/dist/core/router/errors/RouterError.d.ts +0 -1
  130. package/dist/core/router/errors/index.d.ts +0 -1
  131. package/dist/core/router/index.d.ts +0 -1
  132. package/dist/core/router/lifecycle/RouterLifecycleManager.d.ts +0 -1
  133. package/dist/core/router/lifecycle/index.d.ts +0 -1
  134. package/dist/core/router/middleware/RouterMiddlewareManager.d.ts +0 -1
  135. package/dist/core/router/middleware/auth.d.ts +0 -1
  136. package/dist/core/router/middleware/index.d.ts +0 -1
  137. package/dist/core/router/middleware/types.d.ts +0 -1
  138. package/dist/core/router/monitoring/RouterMonitoring.d.ts +0 -1
  139. package/dist/core/router/monitoring/index.d.ts +0 -1
  140. package/dist/core/router/navigation/RouterNavigation.d.ts +0 -1
  141. package/dist/core/router/navigation/index.d.ts +0 -1
  142. package/dist/core/router/performance/RouteCache.d.ts +0 -1
  143. package/dist/core/router/performance/RoutePreloader.d.ts +0 -1
  144. package/dist/core/router/performance/index.d.ts +0 -1
  145. package/dist/core/router/plugin/RouterPluginManager.d.ts +0 -1
  146. package/dist/core/router/plugin/index.d.ts +0 -1
  147. package/dist/core/router/plugin/types.d.ts +0 -1
  148. package/dist/core/router/types.d.ts +1 -2
  149. package/dist/core/router/types.js.map +1 -1
  150. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs +90 -103
  151. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs.map +1 -1
  152. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.d.ts +0 -1
  153. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js +91 -104
  154. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js.map +1 -1
  155. package/dist/core/router/utils/adapters/react-router/transform.cjs +13 -4
  156. package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
  157. package/dist/core/router/utils/adapters/react-router/transform.d.ts +0 -1
  158. package/dist/core/router/utils/adapters/react-router/transform.js +13 -4
  159. package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
  160. package/dist/core/router/utils/transform.cjs +1 -1
  161. package/dist/core/router/utils/transform.cjs.map +1 -1
  162. package/dist/core/router/utils/transform.d.ts +0 -1
  163. package/dist/core/router/utils/transform.js +1 -1
  164. package/dist/core/router/utils/transform.js.map +1 -1
  165. package/dist/core/router/validation/RouterConfigValidator.d.ts +0 -1
  166. package/dist/core/router/validation/index.d.ts +0 -1
  167. package/dist/core/router/validation/schema.d.ts +0 -1
  168. package/dist/core/router/version/RouteVersionManager.d.ts +0 -1
  169. package/dist/core/router/version/index.d.ts +0 -1
  170. package/dist/core/splash/SplashScreen.cjs +101 -15
  171. package/dist/core/splash/SplashScreen.cjs.map +1 -1
  172. package/dist/core/splash/SplashScreen.d.ts +0 -1
  173. package/dist/core/splash/SplashScreen.js +101 -15
  174. package/dist/core/splash/SplashScreen.js.map +1 -1
  175. package/dist/core/splash/index.d.ts +0 -1
  176. package/dist/core/splash/splashScreenUtils.d.ts +0 -1
  177. package/dist/core/startup/AppInstance.d.ts +0 -1
  178. package/dist/core/startup/environment.d.ts +0 -1
  179. package/dist/core/startup/index.d.ts +0 -1
  180. package/dist/core/startup/initializeServices.d.ts +0 -1
  181. package/dist/core/startup/performanceTracker.d.ts +0 -1
  182. package/dist/core/startup/renderApp.cjs +12 -10
  183. package/dist/core/startup/renderApp.cjs.map +1 -1
  184. package/dist/core/startup/renderApp.d.ts +0 -1
  185. package/dist/core/startup/renderApp.js +12 -10
  186. package/dist/core/startup/renderApp.js.map +1 -1
  187. package/dist/core/startup/startApp.cjs +118 -13
  188. package/dist/core/startup/startApp.cjs.map +1 -1
  189. package/dist/core/startup/startApp.d.ts +0 -1
  190. package/dist/core/startup/startApp.js +118 -13
  191. package/dist/core/startup/startApp.js.map +1 -1
  192. package/dist/core/types.d.ts +34 -21
  193. package/dist/core/types.js.map +1 -1
  194. package/dist/core/ui-adapter/adapters.cjs +45 -0
  195. package/dist/core/ui-adapter/adapters.cjs.map +1 -0
  196. package/dist/core/ui-adapter/adapters.d.ts +4 -0
  197. package/dist/core/ui-adapter/adapters.js +27 -0
  198. package/dist/core/ui-adapter/adapters.js.map +1 -0
  199. package/dist/core/ui-adapter/index.cjs +21 -0
  200. package/dist/core/ui-adapter/index.cjs.map +1 -0
  201. package/dist/core/ui-adapter/index.d.ts +2 -0
  202. package/dist/core/ui-adapter/index.js +3 -0
  203. package/dist/core/ui-adapter/index.js.map +1 -0
  204. package/dist/core/ui-adapter/types.cjs +6 -0
  205. package/dist/core/ui-adapter/types.cjs.map +1 -0
  206. package/dist/core/ui-adapter/types.d.ts +24 -0
  207. package/dist/core/ui-adapter/types.js +3 -0
  208. package/dist/core/ui-adapter/types.js.map +1 -0
  209. package/dist/index.cjs +1 -0
  210. package/dist/index.cjs.map +1 -1
  211. package/dist/index.d.ts +1 -1
  212. package/dist/index.js +1 -0
  213. package/dist/index.js.map +1 -1
  214. package/dist/index.umd.d.ts +0 -1
  215. package/dist/index.umd.js +7315 -5936
  216. package/dist/index.umd.js.map +1 -1
  217. package/dist/library/index.d.ts +0 -1
  218. package/dist/library/locale/index.d.ts +0 -1
  219. package/dist/library/locale/langs/en-us/index.d.ts +0 -1
  220. package/dist/library/locale/langs/zh-cn/index.d.ts +0 -1
  221. package/dist/library/locale/types.d.ts +0 -1
  222. package/dist/library/storage/cache.d.ts +0 -1
  223. package/dist/library/storage/encryption.d.ts +0 -1
  224. package/dist/library/storage/index.d.ts +0 -1
  225. package/dist/request/adapter/RequestAdapter.d.ts +0 -1
  226. package/dist/request/adapter/axiosAdapter.d.ts +0 -1
  227. package/dist/request/adapter/fetchAdapter.d.ts +0 -1
  228. package/dist/request/adapter/index.d.ts +0 -1
  229. package/dist/request/adapter/kyAdapter.d.ts +0 -1
  230. package/dist/request/adapter/undiciAdapter.d.ts +0 -1
  231. package/dist/request/core/RequestClient.d.ts +0 -1
  232. package/dist/request/core/index.d.ts +0 -1
  233. package/dist/request/index.d.ts +0 -1
  234. package/dist/request/plugin/RequestPlugin.d.ts +0 -1
  235. package/dist/request/plugin/cache.d.ts +0 -1
  236. package/dist/request/plugin/csrfPlugin.d.ts +0 -1
  237. package/dist/request/plugin/index.d.ts +0 -1
  238. package/dist/request/plugin/monitoring.d.ts +0 -1
  239. package/dist/request/plugin/queue.d.ts +0 -1
  240. package/dist/request/plugin/retry.d.ts +0 -1
  241. package/dist/request/plugin/validation.d.ts +0 -1
  242. package/dist/request/runtime/RequestContext.d.ts +0 -1
  243. package/dist/request/runtime/index.d.ts +0 -1
  244. package/dist/request/types.d.ts +0 -1
  245. package/dist/request/utils/RequestQueueManager.d.ts +0 -1
  246. package/dist/request/utils/dependencyCheck.d.ts +0 -1
  247. package/dist/request/utils/index.d.ts +0 -1
  248. package/dist/request.umd.js +5392 -0
  249. package/dist/request.umd.js.map +1 -0
  250. package/dist/state/StateManager.d.ts +0 -1
  251. package/dist/state/adapters/AdapterFactory.d.ts +0 -1
  252. package/dist/state/adapters/DefaultAdapter.d.ts +0 -1
  253. package/dist/state/adapters/ReduxAdapter.d.ts +0 -1
  254. package/dist/state/adapters/ZustandAdapter.d.ts +0 -1
  255. package/dist/state/adapters/index.d.ts +0 -1
  256. package/dist/state/adapters/types.d.ts +0 -1
  257. package/dist/state/core/DerivedStateInstance.d.ts +0 -1
  258. package/dist/state/core/StateInstance.d.ts +0 -1
  259. package/dist/state/core/StateRegistry.d.ts +0 -1
  260. package/dist/state/core/StateScope.d.ts +0 -1
  261. package/dist/state/core/index.d.ts +0 -1
  262. package/dist/state/index.d.ts +0 -1
  263. package/dist/state/types.d.ts +0 -1
  264. package/dist/state.umd.js +1414 -0
  265. package/dist/state.umd.js.map +1 -0
  266. package/dist/types.d.ts +0 -1
  267. package/dist/utils/analytics.d.ts +0 -1
  268. package/dist/utils/configSecurity.d.ts +0 -1
  269. package/dist/utils/csrf.d.ts +0 -1
  270. package/dist/utils/errors/ErrorCodes.d.ts +0 -1
  271. package/dist/utils/errors.cjs +44 -1
  272. package/dist/utils/errors.cjs.map +1 -1
  273. package/dist/utils/errors.d.ts +5 -1
  274. package/dist/utils/errors.js +44 -1
  275. package/dist/utils/errors.js.map +1 -1
  276. package/dist/utils/index.d.ts +0 -1
  277. package/dist/utils/logger.d.ts +0 -1
  278. package/dist/utils/logger.types.d.ts +0 -1
  279. package/dist/utils/monitoring.d.ts +0 -1
  280. package/dist/utils/performance.d.ts +0 -1
  281. package/dist/utils/resourceLoader.d.ts +0 -1
  282. package/dist/utils/runtimeSecurity.d.ts +0 -1
  283. package/dist/utils/security.d.ts +0 -1
  284. package/dist/utils/traceId.d.ts +0 -1
  285. package/dist/utils/validation.d.ts +0 -1
  286. package/package.json +24 -9
  287. package/dist/components/index.d.ts.map +0 -1
  288. package/dist/core/Test.d.ts.map +0 -1
  289. package/dist/core/app/AppContext.d.ts.map +0 -1
  290. package/dist/core/app/AppContext.types.d.ts.map +0 -1
  291. package/dist/core/app/BasicLayout.d.ts.map +0 -1
  292. package/dist/core/app/DefaultApp.d.ts.map +0 -1
  293. package/dist/core/app/index.d.ts.map +0 -1
  294. package/dist/core/config/AppConfig.d.ts.map +0 -1
  295. package/dist/core/config/ConfigLoader.d.ts.map +0 -1
  296. package/dist/core/config/ConfigValidator.d.ts.map +0 -1
  297. package/dist/core/config/index.d.ts.map +0 -1
  298. package/dist/core/dev/DevTools.d.ts.map +0 -1
  299. package/dist/core/error/ErrorBoundary.d.ts.map +0 -1
  300. package/dist/core/error/ErrorHandler.d.ts.map +0 -1
  301. package/dist/core/error/index.d.ts.map +0 -1
  302. package/dist/core/event/AppEventBus.d.ts.map +0 -1
  303. package/dist/core/event/frameworkEvents.d.ts.map +0 -1
  304. package/dist/core/event/hooks.d.ts.map +0 -1
  305. package/dist/core/event/index.d.ts.map +0 -1
  306. package/dist/core/event/types.d.ts.map +0 -1
  307. package/dist/core/event/useEventBus.d.ts.map +0 -1
  308. package/dist/core/index.d.ts.map +0 -1
  309. package/dist/core/initialization/InitializationErrorThrower.d.ts.map +0 -1
  310. package/dist/core/initialization/index.d.ts.map +0 -1
  311. package/dist/core/initialization/initialization.d.ts.map +0 -1
  312. package/dist/core/initialization/initializationErrorState.d.ts.map +0 -1
  313. package/dist/core/middleware.d.ts.map +0 -1
  314. package/dist/core/plugin/PluginEventBus.d.ts.map +0 -1
  315. package/dist/core/plugin/PluginSandbox.d.ts.map +0 -1
  316. package/dist/core/plugin.d.ts.map +0 -1
  317. package/dist/core/router/RouterManager.d.ts.map +0 -1
  318. package/dist/core/router/adapter/AdapterManager.d.ts.map +0 -1
  319. package/dist/core/router/adapter/index.d.ts.map +0 -1
  320. package/dist/core/router/adapter/react-router/ReactRouterAdapter.d.ts.map +0 -1
  321. package/dist/core/router/adapter/react-router/index.d.ts.map +0 -1
  322. package/dist/core/router/adapter/types.d.ts.map +0 -1
  323. package/dist/core/router/dev/RouterDevTools.d.ts.map +0 -1
  324. package/dist/core/router/dev/index.d.ts.map +0 -1
  325. package/dist/core/router/dynamic/DynamicRouteManager.d.ts.map +0 -1
  326. package/dist/core/router/dynamic/index.d.ts.map +0 -1
  327. package/dist/core/router/errors/RouterError.d.ts.map +0 -1
  328. package/dist/core/router/errors/index.d.ts.map +0 -1
  329. package/dist/core/router/index.d.ts.map +0 -1
  330. package/dist/core/router/lifecycle/RouterLifecycleManager.d.ts.map +0 -1
  331. package/dist/core/router/lifecycle/index.d.ts.map +0 -1
  332. package/dist/core/router/middleware/RouterMiddlewareManager.d.ts.map +0 -1
  333. package/dist/core/router/middleware/auth.d.ts.map +0 -1
  334. package/dist/core/router/middleware/index.d.ts.map +0 -1
  335. package/dist/core/router/middleware/types.d.ts.map +0 -1
  336. package/dist/core/router/monitoring/RouterMonitoring.d.ts.map +0 -1
  337. package/dist/core/router/monitoring/index.d.ts.map +0 -1
  338. package/dist/core/router/navigation/RouterNavigation.d.ts.map +0 -1
  339. package/dist/core/router/navigation/index.d.ts.map +0 -1
  340. package/dist/core/router/performance/RouteCache.d.ts.map +0 -1
  341. package/dist/core/router/performance/RoutePreloader.d.ts.map +0 -1
  342. package/dist/core/router/performance/index.d.ts.map +0 -1
  343. package/dist/core/router/plugin/RouterPluginManager.d.ts.map +0 -1
  344. package/dist/core/router/plugin/index.d.ts.map +0 -1
  345. package/dist/core/router/plugin/types.d.ts.map +0 -1
  346. package/dist/core/router/types.d.ts.map +0 -1
  347. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.d.ts.map +0 -1
  348. package/dist/core/router/utils/adapters/react-router/transform.d.ts.map +0 -1
  349. package/dist/core/router/utils/transform.d.ts.map +0 -1
  350. package/dist/core/router/validation/RouterConfigValidator.d.ts.map +0 -1
  351. package/dist/core/router/validation/index.d.ts.map +0 -1
  352. package/dist/core/router/validation/schema.d.ts.map +0 -1
  353. package/dist/core/router/version/RouteVersionManager.d.ts.map +0 -1
  354. package/dist/core/router/version/index.d.ts.map +0 -1
  355. package/dist/core/splash/SplashScreen.d.ts.map +0 -1
  356. package/dist/core/splash/index.d.ts.map +0 -1
  357. package/dist/core/splash/splashScreenUtils.d.ts.map +0 -1
  358. package/dist/core/startup/AppInstance.d.ts.map +0 -1
  359. package/dist/core/startup/environment.d.ts.map +0 -1
  360. package/dist/core/startup/index.d.ts.map +0 -1
  361. package/dist/core/startup/initializeServices.d.ts.map +0 -1
  362. package/dist/core/startup/performanceTracker.d.ts.map +0 -1
  363. package/dist/core/startup/renderApp.d.ts.map +0 -1
  364. package/dist/core/startup/startApp.d.ts.map +0 -1
  365. package/dist/core/types.d.ts.map +0 -1
  366. package/dist/index.d.ts.map +0 -1
  367. package/dist/index.umd.d.ts.map +0 -1
  368. package/dist/library/index.d.ts.map +0 -1
  369. package/dist/library/locale/index.d.ts.map +0 -1
  370. package/dist/library/locale/langs/en-us/index.d.ts.map +0 -1
  371. package/dist/library/locale/langs/zh-cn/index.d.ts.map +0 -1
  372. package/dist/library/locale/types.d.ts.map +0 -1
  373. package/dist/library/storage/cache.d.ts.map +0 -1
  374. package/dist/library/storage/encryption.d.ts.map +0 -1
  375. package/dist/library/storage/index.d.ts.map +0 -1
  376. package/dist/request/adapter/RequestAdapter.d.ts.map +0 -1
  377. package/dist/request/adapter/axiosAdapter.d.ts.map +0 -1
  378. package/dist/request/adapter/fetchAdapter.d.ts.map +0 -1
  379. package/dist/request/adapter/index.d.ts.map +0 -1
  380. package/dist/request/adapter/kyAdapter.d.ts.map +0 -1
  381. package/dist/request/adapter/undiciAdapter.d.ts.map +0 -1
  382. package/dist/request/core/RequestClient.d.ts.map +0 -1
  383. package/dist/request/core/index.d.ts.map +0 -1
  384. package/dist/request/index.d.ts.map +0 -1
  385. package/dist/request/plugin/RequestPlugin.d.ts.map +0 -1
  386. package/dist/request/plugin/cache.d.ts.map +0 -1
  387. package/dist/request/plugin/csrfPlugin.d.ts.map +0 -1
  388. package/dist/request/plugin/index.d.ts.map +0 -1
  389. package/dist/request/plugin/monitoring.d.ts.map +0 -1
  390. package/dist/request/plugin/queue.d.ts.map +0 -1
  391. package/dist/request/plugin/retry.d.ts.map +0 -1
  392. package/dist/request/plugin/validation.d.ts.map +0 -1
  393. package/dist/request/runtime/RequestContext.d.ts.map +0 -1
  394. package/dist/request/runtime/index.d.ts.map +0 -1
  395. package/dist/request/types.d.ts.map +0 -1
  396. package/dist/request/utils/RequestQueueManager.d.ts.map +0 -1
  397. package/dist/request/utils/dependencyCheck.d.ts.map +0 -1
  398. package/dist/request/utils/index.d.ts.map +0 -1
  399. package/dist/state/StateManager.d.ts.map +0 -1
  400. package/dist/state/adapters/AdapterFactory.d.ts.map +0 -1
  401. package/dist/state/adapters/DefaultAdapter.d.ts.map +0 -1
  402. package/dist/state/adapters/ReduxAdapter.d.ts.map +0 -1
  403. package/dist/state/adapters/ZustandAdapter.d.ts.map +0 -1
  404. package/dist/state/adapters/index.d.ts.map +0 -1
  405. package/dist/state/adapters/types.d.ts.map +0 -1
  406. package/dist/state/core/DerivedStateInstance.d.ts.map +0 -1
  407. package/dist/state/core/StateInstance.d.ts.map +0 -1
  408. package/dist/state/core/StateRegistry.d.ts.map +0 -1
  409. package/dist/state/core/StateScope.d.ts.map +0 -1
  410. package/dist/state/core/index.d.ts.map +0 -1
  411. package/dist/state/index.d.ts.map +0 -1
  412. package/dist/state/types.d.ts.map +0 -1
  413. package/dist/types.d.ts.map +0 -1
  414. package/dist/utils/analytics.d.ts.map +0 -1
  415. package/dist/utils/configSecurity.d.ts.map +0 -1
  416. package/dist/utils/csrf.d.ts.map +0 -1
  417. package/dist/utils/errors/ErrorCodes.d.ts.map +0 -1
  418. package/dist/utils/errors.d.ts.map +0 -1
  419. package/dist/utils/index.d.ts.map +0 -1
  420. package/dist/utils/logger.d.ts.map +0 -1
  421. package/dist/utils/logger.types.d.ts.map +0 -1
  422. package/dist/utils/monitoring.d.ts.map +0 -1
  423. package/dist/utils/performance.d.ts.map +0 -1
  424. package/dist/utils/resourceLoader.d.ts.map +0 -1
  425. package/dist/utils/runtimeSecurity.d.ts.map +0 -1
  426. package/dist/utils/security.d.ts.map +0 -1
  427. package/dist/utils/traceId.d.ts.map +0 -1
  428. package/dist/utils/validation.d.ts.map +0 -1
@@ -22,7 +22,6 @@ _export(exports, {
22
22
  const _jsxruntime = require("react/jsx-runtime");
23
23
  const _react = /*#__PURE__*/ _interop_require_wildcard(require("react"));
24
24
  const _reacterrorboundary = require("react-error-boundary");
25
- const _antd = require("antd");
26
25
  const _utils = require("../../utils");
27
26
  const _errors = require("../../utils/errors");
28
27
  const _initialization = require("../initialization");
@@ -117,7 +116,7 @@ function ErrorBoundary({ children, fallback, onError, showInConsole = true, rese
117
116
  onReset();
118
117
  }
119
118
  };
120
- // 默认 fallback UI(使用 antd 组件)
119
+ // 默认 fallback UI(使用无框架 HTML 组件)
121
120
  // 使用内部组件来管理重试计数状态,使用 React.memo 优化性能
122
121
  const DefaultFallbackComponent = /*#__PURE__*/ _react.default.memo(({ error, resetErrorBoundary })=>{
123
122
  const normalizedError = _errors.errorUtils.normalizeError(error);
@@ -147,39 +146,62 @@ function ErrorBoundary({ children, fallback, onError, showInConsole = true, rese
147
146
  const userFriendlyMessage = (0, _react.useMemo)(()=>{
148
147
  // 根据错误类型提供不同的提示
149
148
  if (normalizedError.code === 'NETWORK_ERROR') {
150
- return '网络连接失败,请检查您的网络设置后重试';
149
+ return '网络连接失败,请检查您的网络设置后再尝试';
151
150
  }
152
151
  if (normalizedError.code === 'TIMEOUT_ERROR') {
153
- return '请求超时,请稍后重试';
152
+ return '请求超时,请稍后再尝试';
154
153
  }
155
154
  if (normalizedError.code === 'VALIDATION_ERROR') {
156
155
  return '数据验证失败,请检查输入内容';
157
156
  }
158
157
  // 默认提示
159
- return '应用运行时发生了错误,请稍后重试';
158
+ return '应用运行时发生了错误,请稍后再尝试';
160
159
  }, [
161
160
  normalizedError.code
162
161
  ]);
163
162
  // 构建按钮数组
164
163
  const extraButtons = (0, _react.useMemo)(()=>{
165
164
  const buttons = [
166
- /*#__PURE__*/ (0, _jsxruntime.jsx)(_antd.Button, {
167
- type: "primary",
165
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("button", {
168
166
  onClick: handleRetry,
169
167
  "aria-label": "重试加载应用",
168
+ style: {
169
+ border: 'none',
170
+ background: 'var(--app-primary-color, #2f80ed)',
171
+ color: '#fff',
172
+ borderRadius: 6,
173
+ padding: '8px 14px',
174
+ cursor: 'pointer'
175
+ },
170
176
  children: "重试"
171
177
  }, "retry"),
172
- /*#__PURE__*/ (0, _jsxruntime.jsx)(_antd.Button, {
178
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("button", {
173
179
  onClick: ()=>setShowDetails(!showDetails),
174
180
  "aria-label": showDetails ? '隐藏错误详情' : '显示错误详情',
181
+ style: {
182
+ border: '1px solid #cfd7df',
183
+ background: '#fff',
184
+ color: '#1f2933',
185
+ borderRadius: 6,
186
+ padding: '8px 14px',
187
+ cursor: 'pointer'
188
+ },
175
189
  children: showDetails ? '隐藏详情' : '查看详情'
176
190
  }, "details")
177
191
  ];
178
192
  // 如果重试次数 >= 1,添加刷新页面按钮(提前显示)
179
193
  if (retryCount >= 1) {
180
- buttons.push(/*#__PURE__*/ (0, _jsxruntime.jsx)(_antd.Button, {
194
+ buttons.push(/*#__PURE__*/ (0, _jsxruntime.jsx)("button", {
181
195
  onClick: handleReload,
182
196
  "aria-label": "刷新页面",
197
+ style: {
198
+ border: '1px solid #cfd7df',
199
+ background: '#fff',
200
+ color: '#1f2933',
201
+ borderRadius: 6,
202
+ padding: '8px 14px',
203
+ cursor: 'pointer'
204
+ },
183
205
  children: "刷新页面"
184
206
  }, "reload"));
185
207
  }
@@ -203,11 +225,47 @@ function ErrorBoundary({ children, fallback, onError, showInConsole = true, rese
203
225
  padding: '24px'
204
226
  },
205
227
  children: [
206
- /*#__PURE__*/ (0, _jsxruntime.jsx)(_antd.Result, {
207
- status: "error",
208
- title: "出错了",
209
- subTitle: userFriendlyMessage,
210
- extra: extraButtons
228
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
229
+ style: {
230
+ maxWidth: 580,
231
+ width: '100%',
232
+ textAlign: 'center',
233
+ border: '1px solid #dde5ec',
234
+ borderRadius: 10,
235
+ padding: 24,
236
+ background: '#fff'
237
+ },
238
+ children: [
239
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
240
+ style: {
241
+ fontSize: 40,
242
+ lineHeight: '44px'
243
+ },
244
+ children: "⚠️"
245
+ }),
246
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("h2", {
247
+ style: {
248
+ margin: '8px 0 4px'
249
+ },
250
+ children: "出错了"
251
+ }),
252
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("p", {
253
+ style: {
254
+ marginTop: 0,
255
+ color: '#52606d'
256
+ },
257
+ children: userFriendlyMessage
258
+ }),
259
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
260
+ style: {
261
+ display: 'flex',
262
+ gap: 8,
263
+ justifyContent: 'center',
264
+ flexWrap: 'wrap'
265
+ },
266
+ children: extraButtons
267
+ })
268
+ ]
211
269
  }),
212
270
  showDetails && /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
213
271
  style: {
@@ -1 +1 @@
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 { Result, Button } from 'antd';\nimport { logger } from '../../utils';\nimport { errorUtils } from '../../utils/errors';\nimport type { FrameworkError } from '../../utils/errors';\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(基于 antd 的 Result 组件,居中显示)。\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 * <Result\n * status=\"error\"\n * title=\"自定义错误标题\"\n * subTitle={error.message}\n * extra={<Button onClick={reset}>重试</Button>}\n * />\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 * 默认使用 antd 的 Result 组件显示错误 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(使用 antd 组件)\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 type=\"primary\"\n key=\"retry\"\n onClick={handleRetry}\n aria-label=\"重试加载应用\"\n >\n 重试\n </Button>,\n <Button\n key=\"details\"\n onClick={() => setShowDetails(!showDetails)}\n aria-label={showDetails ? '隐藏错误详情' : '显示错误详情'}\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 >\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 <Result\n status=\"error\"\n title=\"出错了\"\n subTitle={userFriendlyMessage}\n extra={extraButtons}\n />\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","type","onClick","aria-label","push","div","role","aria-live","aria-atomic","style","display","flexDirection","alignItems","justifyContent","minHeight","padding","Result","status","title","subTitle","extra","marginTop","backgroundColor","borderRadius","maxWidth","width","maxHeight","overflow","marginBottom","fontWeight","fontFamily","fontSize","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
+ {"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 '../../utils';\nimport { errorUtils } from '../../utils/errors';\nimport type { FrameworkError } from '../../utils/errors';\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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"}
@@ -11,7 +11,7 @@ export interface ErrorBoundaryProps {
11
11
  /**
12
12
  * 错误回退 UI(函数形式)
13
13
  *
14
- * 如果不提供,将使用默认的错误 UI(基于 antd 的 Result 组件,居中显示)。
14
+ * 如果不提供,将使用默认错误 UI(框架内置实现,居中显示)。
15
15
  * 如果提供,将使用自定义的错误 UI。
16
16
  *
17
17
  * @param error - 标准化后的框架错误对象
@@ -22,12 +22,11 @@ export interface ErrorBoundaryProps {
22
22
  * ```tsx
23
23
  * <ErrorBoundary
24
24
  * fallback={(error, reset) => (
25
- * <Result
26
- * status="error"
27
- * title="自定义错误标题"
28
- * subTitle={error.message}
29
- * extra={<Button onClick={reset}>重试</Button>}
30
- * />
25
+ * <div>
26
+ * <h2>自定义错误标题</h2>
27
+ * <p>{error.message}</p>
28
+ * <button onClick={reset}>重试</button>
29
+ * </div>
31
30
  * )}
32
31
  * >
33
32
  * <App />
@@ -62,7 +61,7 @@ export interface ErrorBoundaryProps {
62
61
  * 基于 react-error-boundary 实现,集成了框架的错误处理系统
63
62
  * 用于捕获 React 组件树中的错误,防止整个应用崩溃
64
63
  *
65
- * 默认使用 antd 的 Result 组件显示错误 UI,居中显示,美观易用。
64
+ * 默认使用框架内置错误 UI,居中显示。
66
65
  * 可以通过 fallback 属性自定义错误 UI。
67
66
  *
68
67
  * @example
@@ -120,4 +119,3 @@ export declare function withErrorBoundary<P extends object>(Component: React.Com
120
119
  * ```
121
120
  */
122
121
  export declare function useErrorHandler(): (error: unknown) => void;
123
- //# sourceMappingURL=ErrorBoundary.d.ts.map
@@ -1,7 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React, { useState, useRef, useEffect, useCallback, useMemo } from "react";
3
3
  import { ErrorBoundary as ReactErrorBoundary } from "react-error-boundary";
4
- import { Result, Button } from "antd";
5
4
  import { logger } from "../../utils";
6
5
  import { errorUtils } from "../../utils/errors";
7
6
  import { initializationErrorState } from "../initialization";
@@ -12,7 +11,7 @@ import { getDefaultErrorHandler } from "./ErrorHandler";
12
11
  * 基于 react-error-boundary 实现,集成了框架的错误处理系统
13
12
  * 用于捕获 React 组件树中的错误,防止整个应用崩溃
14
13
  *
15
- * 默认使用 antd 的 Result 组件显示错误 UI,居中显示,美观易用。
14
+ * 默认使用框架内置错误 UI,居中显示。
16
15
  * 可以通过 fallback 属性自定义错误 UI。
17
16
  *
18
17
  * @example
@@ -84,7 +83,7 @@ import { getDefaultErrorHandler } from "./ErrorHandler";
84
83
  onReset();
85
84
  }
86
85
  };
87
- // 默认 fallback UI(使用 antd 组件)
86
+ // 默认 fallback UI(使用无框架 HTML 组件)
88
87
  // 使用内部组件来管理重试计数状态,使用 React.memo 优化性能
89
88
  const DefaultFallbackComponent = /*#__PURE__*/ React.memo(({ error, resetErrorBoundary })=>{
90
89
  const normalizedError = errorUtils.normalizeError(error);
@@ -114,39 +113,62 @@ import { getDefaultErrorHandler } from "./ErrorHandler";
114
113
  const userFriendlyMessage = useMemo(()=>{
115
114
  // 根据错误类型提供不同的提示
116
115
  if (normalizedError.code === 'NETWORK_ERROR') {
117
- return '网络连接失败,请检查您的网络设置后重试';
116
+ return '网络连接失败,请检查您的网络设置后再尝试';
118
117
  }
119
118
  if (normalizedError.code === 'TIMEOUT_ERROR') {
120
- return '请求超时,请稍后重试';
119
+ return '请求超时,请稍后再尝试';
121
120
  }
122
121
  if (normalizedError.code === 'VALIDATION_ERROR') {
123
122
  return '数据验证失败,请检查输入内容';
124
123
  }
125
124
  // 默认提示
126
- return '应用运行时发生了错误,请稍后重试';
125
+ return '应用运行时发生了错误,请稍后再尝试';
127
126
  }, [
128
127
  normalizedError.code
129
128
  ]);
130
129
  // 构建按钮数组
131
130
  const extraButtons = useMemo(()=>{
132
131
  const buttons = [
133
- /*#__PURE__*/ _jsx(Button, {
134
- type: "primary",
132
+ /*#__PURE__*/ _jsx("button", {
135
133
  onClick: handleRetry,
136
134
  "aria-label": "重试加载应用",
135
+ style: {
136
+ border: 'none',
137
+ background: 'var(--app-primary-color, #2f80ed)',
138
+ color: '#fff',
139
+ borderRadius: 6,
140
+ padding: '8px 14px',
141
+ cursor: 'pointer'
142
+ },
137
143
  children: "重试"
138
144
  }, "retry"),
139
- /*#__PURE__*/ _jsx(Button, {
145
+ /*#__PURE__*/ _jsx("button", {
140
146
  onClick: ()=>setShowDetails(!showDetails),
141
147
  "aria-label": showDetails ? '隐藏错误详情' : '显示错误详情',
148
+ style: {
149
+ border: '1px solid #cfd7df',
150
+ background: '#fff',
151
+ color: '#1f2933',
152
+ borderRadius: 6,
153
+ padding: '8px 14px',
154
+ cursor: 'pointer'
155
+ },
142
156
  children: showDetails ? '隐藏详情' : '查看详情'
143
157
  }, "details")
144
158
  ];
145
159
  // 如果重试次数 >= 1,添加刷新页面按钮(提前显示)
146
160
  if (retryCount >= 1) {
147
- buttons.push(/*#__PURE__*/ _jsx(Button, {
161
+ buttons.push(/*#__PURE__*/ _jsx("button", {
148
162
  onClick: handleReload,
149
163
  "aria-label": "刷新页面",
164
+ style: {
165
+ border: '1px solid #cfd7df',
166
+ background: '#fff',
167
+ color: '#1f2933',
168
+ borderRadius: 6,
169
+ padding: '8px 14px',
170
+ cursor: 'pointer'
171
+ },
150
172
  children: "刷新页面"
151
173
  }, "reload"));
152
174
  }
@@ -170,11 +192,47 @@ import { getDefaultErrorHandler } from "./ErrorHandler";
170
192
  padding: '24px'
171
193
  },
172
194
  children: [
173
- /*#__PURE__*/ _jsx(Result, {
174
- status: "error",
175
- title: "出错了",
176
- subTitle: userFriendlyMessage,
177
- extra: extraButtons
195
+ /*#__PURE__*/ _jsxs("div", {
196
+ style: {
197
+ maxWidth: 580,
198
+ width: '100%',
199
+ textAlign: 'center',
200
+ border: '1px solid #dde5ec',
201
+ borderRadius: 10,
202
+ padding: 24,
203
+ background: '#fff'
204
+ },
205
+ children: [
206
+ /*#__PURE__*/ _jsx("div", {
207
+ style: {
208
+ fontSize: 40,
209
+ lineHeight: '44px'
210
+ },
211
+ children: "⚠️"
212
+ }),
213
+ /*#__PURE__*/ _jsx("h2", {
214
+ style: {
215
+ margin: '8px 0 4px'
216
+ },
217
+ children: "出错了"
218
+ }),
219
+ /*#__PURE__*/ _jsx("p", {
220
+ style: {
221
+ marginTop: 0,
222
+ color: '#52606d'
223
+ },
224
+ children: userFriendlyMessage
225
+ }),
226
+ /*#__PURE__*/ _jsx("div", {
227
+ style: {
228
+ display: 'flex',
229
+ gap: 8,
230
+ justifyContent: 'center',
231
+ flexWrap: 'wrap'
232
+ },
233
+ children: extraButtons
234
+ })
235
+ ]
178
236
  }),
179
237
  showDetails && /*#__PURE__*/ _jsxs("div", {
180
238
  style: {
@@ -1 +1 @@
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 { Result, Button } from 'antd';\nimport { logger } from '../../utils';\nimport { errorUtils } from '../../utils/errors';\nimport type { FrameworkError } from '../../utils/errors';\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(基于 antd 的 Result 组件,居中显示)。\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 * <Result\n * status=\"error\"\n * title=\"自定义错误标题\"\n * subTitle={error.message}\n * extra={<Button onClick={reset}>重试</Button>}\n * />\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 * 默认使用 antd 的 Result 组件显示错误 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(使用 antd 组件)\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 type=\"primary\"\n key=\"retry\"\n onClick={handleRetry}\n aria-label=\"重试加载应用\"\n >\n 重试\n </Button>,\n <Button\n key=\"details\"\n onClick={() => setShowDetails(!showDetails)}\n aria-label={showDetails ? '隐藏错误详情' : '显示错误详情'}\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 >\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 <Result\n status=\"error\"\n title=\"出错了\"\n subTitle={userFriendlyMessage}\n extra={extraButtons}\n />\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","Result","Button","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","type","onClick","aria-label","push","div","role","aria-live","aria-atomic","style","display","flexDirection","alignItems","justifyContent","minHeight","padding","status","title","subTitle","extra","marginTop","backgroundColor","borderRadius","maxWidth","width","maxHeight","overflow","marginBottom","fontWeight","fontFamily","fontSize","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
+ {"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 '../../utils';\nimport { errorUtils } from '../../utils/errors';\nimport type { FrameworkError } from '../../utils/errors';\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":";AAAA,OAAOA,SAAyCC,QAAQ,EAAEC,MAAM,EAAEC,SAAS,EAAEC,WAAW,EAAEC,OAAO,QAAQ,QAAQ;AACjH,SAASC,iBAAiBC,kBAAkB,QAAQ,uBAAuB;AAC3E,SAASC,MAAM,QAAQ,cAAc;AACrC,SAASC,UAAU,QAAQ,qBAAqB;AAEhD,SAASC,wBAAwB,QAAQ,oBAAoB;AAC7D,SAASC,sBAAsB,QAAQ,iBAAiB;AA0DxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BC,GACD,OAAO,SAASL,cAAc,EAC5BM,QAAQ,EACRC,QAAQ,EACRC,OAAO,EACPC,gBAAgB,IAAI,EACpBC,SAAS,EACTC,OAAO,EACPC,iBAAiB,EACE;IACnB,4BAA4B;IAC5B,MAAMC,gBAAgBjB,OAAe;IAErC,gBAAgB;IAChB,MAAMkB,eAAef,QAAQ,IAAMM,0BAA0B,EAAE;IAE/D,oCAAoC;IACpC,MAAMU,cAAcjB,YAAY,OAAOkB,OAAcC;QACnD,MAAMC,kBAAkBf,WAAWgB,cAAc,CAACH;QAElD,8DAA8D;QAC9D,MAAMI,iBAA4B;YAChCC,gBAAgBJ,UAAUI,cAAc,IAAI;QAC9C;QAEA,iBAAiB;QACjB,MAAMC,eAAe,MAAMR,aAAaC,WAAW,CAACG,iBAAiB;YACnEG,gBAAgBD,eAAeC,cAAc;YAC7CE,QAAQ;QACV;QAEA,uBAAuB;QACvB,IAAI,CAACD,aAAaE,OAAO,EAAE;YACzBtB,OAAOc,KAAK,CAAC,cAAc;gBACzBA,OAAOE,gBAAgBO,MAAM;gBAC7BR,WAAW;oBACTI,gBAAgBD,eAAeC,cAAc;gBAC/C;YACF;QACF;QAEA,SAAS;QACT,IAAIb,SAAS;YACXA,QAAQU,iBAAiBE;QAC3B;QAEA,kBAAkB;QAClB,IAAIX,eAAe;YACjBiB,QAAQV,KAAK,CAAC,cAAcE;YAC5BQ,QAAQV,KAAK,CAAC,SAASI;QACzB;IACF,GAAG;QAACN;QAAcN;QAASC;KAAc;IAEzC,OAAO;IACP,MAAMkB,cAAc;QAClB,YAAY;QACZvB,yBAAyBwB,UAAU;QACnC,cAAc;QACd,IAAIjB,SAAS;YACXA;QACF;IACF;IAEA,gCAAgC;IAChC,qCAAqC;IACrC,MAAMkB,yCAA2BnC,MAAMoC,IAAI,CAAC,CAAC,EAAEd,KAAK,EAAEe,kBAAkB,EAAoD;QAC1H,MAAMb,kBAAkBf,WAAWgB,cAAc,CAACH;QAClD,MAAM,CAACgB,YAAYC,cAAc,GAAGtC,SAAiBkB,cAAcqB,OAAO;QAC1E,MAAM,CAACC,aAAaC,eAAe,GAAGzC,SAAS;QAE/C,wCAAwC;QACxCE,UAAU;YACRoC,cAAcpB,cAAcqB,OAAO;QACrC,GAAG,EAAE;QAEL,MAAMG,cAAcvC,YAAY;YAC9B,SAAS;YACT,MAAMwC,WAAWN,aAAa;YAC9BnB,cAAcqB,OAAO,GAAGI;YACxBL,cAAcK;YAEd,OAAO;YACPX;YACAI;QACF,GAAG;YAACC;YAAYD;SAAmB;QAEnC,MAAMQ,eAAezC,YAAY;YAC/B,OAAO;YACP0C,OAAOC,QAAQ,CAACC,MAAM;QACxB,GAAG,EAAE;QAEL,cAAc;QACd,MAAMC,sBAAsB5C,QAAQ;YAClC,gBAAgB;YAChB,IAAImB,gBAAgB0B,IAAI,KAAK,iBAAiB;gBAC5C,OAAO;YACT;YACA,IAAI1B,gBAAgB0B,IAAI,KAAK,iBAAiB;gBAC5C,OAAO;YACT;YACA,IAAI1B,gBAAgB0B,IAAI,KAAK,oBAAoB;gBAC/C,OAAO;YACT;YACA,OAAO;YACP,OAAO;QACT,GAAG;YAAC1B,gBAAgB0B,IAAI;SAAC;QAEzB,SAAS;QACT,MAAMC,eAAe9C,QAAQ;YAC3B,MAAM+C,UAAU;8BACd,KAACC;oBAECC,SAASX;oBACTY,cAAW;oBACXC,OAAO;wBACLC,QAAQ;wBACRC,YAAY;wBACZC,OAAO;wBACPC,cAAc;wBACdC,SAAS;wBACTC,QAAQ;oBACV;8BACD;mBAXK;8BAcN,KAACT;oBAECC,SAAS,IAAMZ,eAAe,CAACD;oBAC/Bc,cAAYd,cAAc,WAAW;oBACrCe,OAAO;wBACLC,QAAQ;wBACRC,YAAY;wBACZC,OAAO;wBACPC,cAAc;wBACdC,SAAS;wBACTC,QAAQ;oBACV;8BAECrB,cAAc,SAAS;mBAZpB;aAcP;YAED,6BAA6B;YAC7B,IAAIH,cAAc,GAAG;gBACnBc,QAAQW,IAAI,eACV,KAACV;oBAECC,SAAST;oBACTU,cAAW;oBACXC,OAAO;wBACLC,QAAQ;wBACRC,YAAY;wBACZC,OAAO;wBACPC,cAAc;wBACdC,SAAS;wBACTC,QAAQ;oBACV;8BACD;mBAXK;YAeV;YAEA,OAAOV;QACT,GAAG;YAACd;YAAYK;YAAaE;YAAcJ;SAAY;QAEvD,qBACE,MAACuB;YACCC,MAAK;YACLC,aAAU;YACVC,eAAY;YACZX,OAAO;gBACLY,SAAS;gBACTC,eAAe;gBACfC,YAAY;gBACZC,gBAAgB;gBAChBC,WAAW;gBACXX,SAAS;YACX;;8BAEA,MAACG;oBACCR,OAAO;wBACLiB,UAAU;wBACVC,OAAO;wBACPC,WAAW;wBACXlB,QAAQ;wBACRG,cAAc;wBACdC,SAAS;wBACTH,YAAY;oBACd;;sCAEA,KAACM;4BAAIR,OAAO;gCAAEoB,UAAU;gCAAIC,YAAY;4BAAO;sCAAG;;sCAClD,KAACC;4BAAGtB,OAAO;gCAAEuB,QAAQ;4BAAY;sCAAG;;sCACpC,KAACC;4BAAExB,OAAO;gCAAEyB,WAAW;gCAAGtB,OAAO;4BAAU;sCAAIV;;sCAC/C,KAACe;4BAAIR,OAAO;gCAAEY,SAAS;gCAAQc,KAAK;gCAAGX,gBAAgB;gCAAUY,UAAU;4BAAO;sCAC/EhC;;;;gBAGJV,6BACC,MAACuB;oBACCR,OAAO;wBACLyB,WAAW;wBACXpB,SAAS;wBACTuB,iBAAiB;wBACjBxB,cAAc;wBACda,UAAU;wBACVC,OAAO;wBACPW,WAAW;wBACXC,UAAU;oBACZ;;sCAEA,KAACtB;4BAAIR,OAAO;gCAAE+B,cAAc;gCAAGC,YAAY;4BAAO;sCAAG;;sCACrD,MAACxB;4BAAIR,OAAO;gCAAEiC,YAAY;gCAAab,UAAU;4BAAG;;8CAClD,MAACZ;;sDAAI,KAAC0B;sDAAO;;wCAAelE,gBAAgBmE,IAAI;;;8CAChD,MAAC3B;;sDAAI,KAAC0B;sDAAO;;wCAAelE,gBAAgB0B,IAAI;;;8CAChD,MAACc;;sDAAI,KAAC0B;sDAAO;;wCAAelE,gBAAgBoE,OAAO;;;gCAClDpE,gBAAgBqE,KAAK,kBACpB,MAAC7B;oCAAIR,OAAO;wCAAEyB,WAAW;oCAAE;;sDACzB,KAACS;sDAAO;;sDACR,KAACI;4CAAItC,OAAO;gDAAEuC,YAAY;gDAAYC,WAAW;4CAAa;sDAC3DxE,gBAAgBqE,KAAK;;;;;;;;;;IASxC;IAEA1D,yBAAyB8D,WAAW,GAAG;IAEvC,MAAMC,kBAAkB,CAAC,EAAE5E,KAAK,EAAEe,kBAAkB,EAAoD;QACtG,qBAAO,KAACF;YAAyBb,OAAOA;YAAOe,oBAAoBA;;IACrE;IAEA,2BAA2B;IAC3B,MAAM8D,iBAAiBtF,WACnB,CAAC,EAAES,KAAK,EAAEe,kBAAkB,EAAoD;QAC9E,MAAMb,kBAAkBf,WAAWgB,cAAc,CAACH;QAClD,OAAOT,SAASW,iBAAiB;YAC/BS;YACAI;QACF;IACF,IACA6D;IAEJ,cAAc;IACd,MAAME,uBAAuB;QAC3BjF,cAAcqB,OAAO,GAAG;QACxBP;IACF;IAEA,yBAAyB;IACzB,MAAMoE,wBAAwB,CAC5BC,UACAC;QAEApF,cAAcqB,OAAO,GAAG;QACxB,IAAItB,mBAAmB;YACrBA,kBAAkBoF,UAAUC;QAC9B;IACF;IAEA,kCAAkC;IAClC,MAAMC,qBAAqB;QACzBL;QACArF,SAASO;QACTJ,SAASmF;QACTpF;QACAE,mBAAmBmF;IACrB;IAEA,qBACE,KAAC9F;QAAoB,GAAGiG,kBAAkB;kBACvC5F;;AAGP;AAEA;;CAEC,GACD,OAAO,SAAS6F,kBACdC,SAAiC,EACjCF,kBAAyD;IAEzD,MAAMG,mBAAmB,CAACC;QACxB,qBACE,KAACtG;YAAe,GAAGkG,kBAAkB;sBACnC,cAAA,KAACE;gBAAW,GAAGE,KAAK;;;IAG1B;IAEAD,iBAAiBV,WAAW,GAAG,CAAC,kBAAkB,EAAES,UAAUT,WAAW,IAAIS,UAAUf,IAAI,IAAI,YAAY,CAAC,CAAC;IAE7G,OAAOgB;AACT;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,OAAO,SAASE;IACd,OAAO,CAACvF;QACN,gBAAgB;QAChB,4DAA4D;QAC5DZ,yBAAyBoG,QAAQ,CAACxF;IACpC;AACF"}
@@ -169,4 +169,3 @@ export declare function getDefaultErrorHandler(): ErrorHandler;
169
169
  * 设置默认错误处理器
170
170
  */
171
171
  export declare function setDefaultErrorHandler(handler: ErrorHandler): void;
172
- //# sourceMappingURL=ErrorHandler.d.ts.map
@@ -5,4 +5,3 @@ export { ErrorBoundary, withErrorBoundary, useErrorHandler } from './ErrorBounda
5
5
  export type { ErrorBoundaryProps } from './ErrorBoundary';
6
6
  export { ErrorHandler, getDefaultErrorHandler, setDefaultErrorHandler } from './ErrorHandler';
7
7
  export type { ErrorHandlingStrategy, ErrorHandlerConfig, ErrorHandleResult, ErrorRecoveryOptions, } from './ErrorHandler';
8
- //# sourceMappingURL=index.d.ts.map
@@ -176,4 +176,3 @@ export declare class AppEventBus {
176
176
  private updateStats;
177
177
  }
178
178
  export {};
179
- //# sourceMappingURL=AppEventBus.d.ts.map
@@ -67,4 +67,3 @@ export declare class FrameworkEventManager {
67
67
  */
68
68
  emitPerformanceUpdate(metrics: Record<string, number>): void;
69
69
  }
70
- //# sourceMappingURL=frameworkEvents.d.ts.map
@@ -55,4 +55,3 @@ export declare function useAppEventOnce<T = unknown>(eventBus: AppEventBus, even
55
55
  * ```
56
56
  */
57
57
  export declare function useAppEventEmitter(eventBus: AppEventBus): <T = unknown>(event: string, data?: T, metadata?: Partial<import("./types").EventMetadata>) => Promise<void>;
58
- //# sourceMappingURL=hooks.d.ts.map
@@ -8,4 +8,3 @@ export { useAppEvent, useAppEventOnce, useAppEventEmitter, } from './hooks';
8
8
  export { useEventBus } from './useEventBus';
9
9
  export type { EventListener, EventMetadata, EventWrapper, EventMiddleware, EventListenerOptions, AppEventBusConfig, EventStats, FrameworkEventData, } from './types';
10
10
  export { FrameworkEventType } from './types';
11
- //# sourceMappingURL=index.d.ts.map
@@ -267,4 +267,3 @@ export interface FrameworkEventData {
267
267
  metrics: Record<string, number>;
268
268
  };
269
269
  }
270
- //# sourceMappingURL=types.d.ts.map
@@ -26,4 +26,3 @@ import type { AppEventBus } from './AppEventBus';
26
26
  * ```
27
27
  */
28
28
  export declare function useEventBus(): AppEventBus;
29
- //# sourceMappingURL=useEventBus.d.ts.map
@@ -83,6 +83,8 @@ const _middleware = require("./middleware");
83
83
  const _plugin = require("./plugin");
84
84
  _export_star(require("./startup"), exports);
85
85
  _export_star(require("./config"), exports);
86
+ _export_star(require("./kernel"), exports);
87
+ _export_star(require("./ui-adapter"), exports);
86
88
  _export_star(require("./router"), exports);
87
89
  _export_star(require("./event"), exports);
88
90
  const _DevTools = require("./dev/DevTools");
@@ -1 +1 @@
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 ConfigStrategy,\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';\n\n// 导出路由相关模块\nexport * from './router';\n\n// 导出事件系统\nexport * from './event';\n\n// 导出开发工具\nexport { DevTools, DevToolsTrigger } from './dev/DevTools';"],"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;;QAebC;eAAAA,6BAAiB;;QAIjBC;eAAAA,qBAAa;;QAfbC;eAAAA,oBAAS;;QAlCTC;eAAAA,kCAAqB;;QAUjBC;eAAAA;;QAmCeC;eAAAA,6BAAiB;;QAIrBC;eAAAA,qBAAa;;QA5CjCC;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;4BAW2B;wBAIR;qBAmB/B;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
+ {"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 ConfigStrategy,\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';\nexport * from './ui-adapter';\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;;QA2DbC;eAAAA,kBAAQ;;QAAEC;eAAAA,yBAAe;;QAlDzBC;eAAAA,oBAAa;;QAebC;eAAAA,6BAAiB;;QAIjBC;eAAAA,qBAAa;;QAfbC;eAAAA,oBAAS;;QAlCTC;eAAAA,kCAAqB;;QAUjBC;eAAAA;;QAmCeC;eAAAA,6BAAiB;;QAIrBC;eAAAA,qBAAa;;QA5CjCC;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;4BAW2B;wBAIR;qBAmB/B;qBACA;qBACA;qBACA;qBAGA;qBAGA;0BAG4B;;;;;;;;;;;;;;AAnH1C;;;;;;;;;;;;;;;;;;;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"}