@vlian/framework 1.2.61 → 1.2.63

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 (268) hide show
  1. package/dist/analytics.umd.js +1 -1
  2. package/dist/components/index.cjs +1 -1
  3. package/dist/components/index.d.ts +0 -4
  4. package/dist/components/index.js +1 -1
  5. package/dist/index.cjs +1 -1
  6. package/dist/index.d.ts +0 -1
  7. package/dist/index.js +1 -1
  8. package/dist/index.umd.js +31 -246
  9. package/dist/kernel/types.d.ts +46 -3
  10. package/dist/state.umd.js +1 -1
  11. package/package.json +21 -16
  12. package/dist/components/LocaleSwitch.cjs +0 -1
  13. package/dist/components/LocaleSwitch.d.ts +0 -21
  14. package/dist/components/LocaleSwitch.js +0 -1
  15. package/dist/components/ThemeSwitch.cjs +0 -1
  16. package/dist/components/ThemeSwitch.d.ts +0 -20
  17. package/dist/components/ThemeSwitch.js +0 -1
  18. package/dist/core/Test.cjs +0 -1
  19. package/dist/core/Test.d.ts +0 -5
  20. package/dist/core/Test.js +0 -1
  21. package/dist/core/app/AppContext.cjs +0 -1
  22. package/dist/core/app/AppContext.d.ts +0 -113
  23. package/dist/core/app/AppContext.js +0 -1
  24. package/dist/core/app/AppContext.types.cjs +0 -1
  25. package/dist/core/app/AppContext.types.d.ts +0 -146
  26. package/dist/core/app/AppContext.types.js +0 -1
  27. package/dist/core/app/BasicLayout.cjs +0 -1
  28. package/dist/core/app/BasicLayout.d.ts +0 -15
  29. package/dist/core/app/BasicLayout.js +0 -1
  30. package/dist/core/app/DefaultApp.cjs +0 -1
  31. package/dist/core/app/DefaultApp.d.ts +0 -10
  32. package/dist/core/app/DefaultApp.js +0 -1
  33. package/dist/core/app/index.cjs +0 -1
  34. package/dist/core/app/index.d.ts +0 -8
  35. package/dist/core/app/index.js +0 -1
  36. package/dist/core/config/AppConfig.cjs +0 -1
  37. package/dist/core/config/AppConfig.d.ts +0 -88
  38. package/dist/core/config/AppConfig.js +0 -1
  39. package/dist/core/config/ConfigLoader.cjs +0 -1
  40. package/dist/core/config/ConfigLoader.d.ts +0 -118
  41. package/dist/core/config/ConfigLoader.js +0 -1
  42. package/dist/core/config/ConfigValidator.cjs +0 -2
  43. package/dist/core/config/ConfigValidator.d.ts +0 -84
  44. package/dist/core/config/ConfigValidator.js +0 -2
  45. package/dist/core/config/index.cjs +0 -1
  46. package/dist/core/config/index.d.ts +0 -6
  47. package/dist/core/config/index.js +0 -1
  48. package/dist/core/dev/DevTools.cjs +0 -1
  49. package/dist/core/dev/DevTools.d.ts +0 -16
  50. package/dist/core/dev/DevTools.js +0 -1
  51. package/dist/core/error/ErrorBoundary.cjs +0 -1
  52. package/dist/core/error/ErrorBoundary.d.ts +0 -121
  53. package/dist/core/error/ErrorBoundary.js +0 -1
  54. package/dist/core/error/ErrorHandler.cjs +0 -1
  55. package/dist/core/error/ErrorHandler.d.ts +0 -171
  56. package/dist/core/error/ErrorHandler.js +0 -1
  57. package/dist/core/error/index.cjs +0 -1
  58. package/dist/core/error/index.d.ts +0 -7
  59. package/dist/core/error/index.js +0 -1
  60. package/dist/core/event/AppEventBus.cjs +0 -1
  61. package/dist/core/event/AppEventBus.d.ts +0 -178
  62. package/dist/core/event/AppEventBus.js +0 -1
  63. package/dist/core/event/frameworkEvents.cjs +0 -1
  64. package/dist/core/event/frameworkEvents.d.ts +0 -69
  65. package/dist/core/event/frameworkEvents.js +0 -1
  66. package/dist/core/event/hooks.cjs +0 -1
  67. package/dist/core/event/hooks.d.ts +0 -57
  68. package/dist/core/event/hooks.js +0 -1
  69. package/dist/core/event/index.cjs +0 -1
  70. package/dist/core/event/index.d.ts +0 -10
  71. package/dist/core/event/index.js +0 -1
  72. package/dist/core/event/types.cjs +0 -1
  73. package/dist/core/event/types.d.ts +0 -269
  74. package/dist/core/event/types.js +0 -1
  75. package/dist/core/event/useEventBus.cjs +0 -1
  76. package/dist/core/event/useEventBus.d.ts +0 -28
  77. package/dist/core/event/useEventBus.js +0 -1
  78. package/dist/core/index.cjs +0 -1
  79. package/dist/core/index.d.ts +0 -54
  80. package/dist/core/index.js +0 -1
  81. package/dist/core/initialization/InitializationErrorThrower.cjs +0 -1
  82. package/dist/core/initialization/InitializationErrorThrower.d.ts +0 -7
  83. package/dist/core/initialization/InitializationErrorThrower.js +0 -1
  84. package/dist/core/initialization/index.cjs +0 -1
  85. package/dist/core/initialization/index.d.ts +0 -7
  86. package/dist/core/initialization/index.js +0 -1
  87. package/dist/core/initialization/initialization.cjs +0 -1
  88. package/dist/core/initialization/initialization.d.ts +0 -69
  89. package/dist/core/initialization/initialization.js +0 -1
  90. package/dist/core/initialization/initializationErrorState.cjs +0 -1
  91. package/dist/core/initialization/initializationErrorState.d.ts +0 -35
  92. package/dist/core/initialization/initializationErrorState.js +0 -1
  93. package/dist/core/kernel/defaultAdapters.cjs +0 -1
  94. package/dist/core/kernel/defaultAdapters.d.ts +0 -2
  95. package/dist/core/kernel/defaultAdapters.js +0 -1
  96. package/dist/core/kernel/errors.cjs +0 -1
  97. package/dist/core/kernel/errors.d.ts +0 -18
  98. package/dist/core/kernel/errors.js +0 -1
  99. package/dist/core/kernel/index.cjs +0 -1
  100. package/dist/core/kernel/index.d.ts +0 -3
  101. package/dist/core/kernel/index.js +0 -1
  102. package/dist/core/kernel/startKernel.cjs +0 -1
  103. package/dist/core/kernel/startKernel.d.ts +0 -2
  104. package/dist/core/kernel/startKernel.js +0 -1
  105. package/dist/core/kernel/types.cjs +0 -1
  106. package/dist/core/kernel/types.d.ts +0 -114
  107. package/dist/core/kernel/types.js +0 -1
  108. package/dist/core/middleware.cjs +0 -1
  109. package/dist/core/middleware.d.ts +0 -36
  110. package/dist/core/middleware.js +0 -1
  111. package/dist/core/plugin/PluginEventBus.cjs +0 -1
  112. package/dist/core/plugin/PluginEventBus.d.ts +0 -169
  113. package/dist/core/plugin/PluginEventBus.js +0 -1
  114. package/dist/core/plugin/PluginSandbox.cjs +0 -1
  115. package/dist/core/plugin/PluginSandbox.d.ts +0 -101
  116. package/dist/core/plugin/PluginSandbox.js +0 -1
  117. package/dist/core/plugin.cjs +0 -1
  118. package/dist/core/plugin.d.ts +0 -224
  119. package/dist/core/plugin.js +0 -1
  120. package/dist/core/router/RouterManager.cjs +0 -1
  121. package/dist/core/router/RouterManager.d.ts +0 -87
  122. package/dist/core/router/RouterManager.js +0 -1
  123. package/dist/core/router/adapter/AdapterManager.cjs +0 -1
  124. package/dist/core/router/adapter/AdapterManager.d.ts +0 -94
  125. package/dist/core/router/adapter/AdapterManager.js +0 -1
  126. package/dist/core/router/adapter/index.cjs +0 -1
  127. package/dist/core/router/adapter/index.d.ts +0 -6
  128. package/dist/core/router/adapter/index.js +0 -1
  129. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +0 -1
  130. package/dist/core/router/adapter/react-router/ReactRouterAdapter.d.ts +0 -43
  131. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +0 -1
  132. package/dist/core/router/adapter/react-router/index.cjs +0 -1
  133. package/dist/core/router/adapter/react-router/index.d.ts +0 -4
  134. package/dist/core/router/adapter/react-router/index.js +0 -1
  135. package/dist/core/router/adapter/types.cjs +0 -1
  136. package/dist/core/router/adapter/types.d.ts +0 -111
  137. package/dist/core/router/adapter/types.js +0 -1
  138. package/dist/core/router/dev/RouterDevTools.cjs +0 -1
  139. package/dist/core/router/dev/RouterDevTools.d.ts +0 -5
  140. package/dist/core/router/dev/RouterDevTools.js +0 -1
  141. package/dist/core/router/dev/index.cjs +0 -1
  142. package/dist/core/router/dev/index.d.ts +0 -4
  143. package/dist/core/router/dev/index.js +0 -1
  144. package/dist/core/router/dynamic/DynamicRouteManager.cjs +0 -1
  145. package/dist/core/router/dynamic/DynamicRouteManager.d.ts +0 -71
  146. package/dist/core/router/dynamic/DynamicRouteManager.js +0 -1
  147. package/dist/core/router/dynamic/index.cjs +0 -1
  148. package/dist/core/router/dynamic/index.d.ts +0 -4
  149. package/dist/core/router/dynamic/index.js +0 -1
  150. package/dist/core/router/errors/RouterError.cjs +0 -1
  151. package/dist/core/router/errors/RouterError.d.ts +0 -48
  152. package/dist/core/router/errors/RouterError.js +0 -1
  153. package/dist/core/router/errors/index.cjs +0 -1
  154. package/dist/core/router/errors/index.d.ts +0 -4
  155. package/dist/core/router/errors/index.js +0 -1
  156. package/dist/core/router/index.cjs +0 -1
  157. package/dist/core/router/index.d.ts +0 -16
  158. package/dist/core/router/index.js +0 -1
  159. package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +0 -1
  160. package/dist/core/router/lifecycle/RouterLifecycleManager.d.ts +0 -56
  161. package/dist/core/router/lifecycle/RouterLifecycleManager.js +0 -1
  162. package/dist/core/router/lifecycle/index.cjs +0 -1
  163. package/dist/core/router/lifecycle/index.d.ts +0 -4
  164. package/dist/core/router/lifecycle/index.js +0 -1
  165. package/dist/core/router/middleware/RouterMiddlewareManager.cjs +0 -1
  166. package/dist/core/router/middleware/RouterMiddlewareManager.d.ts +0 -61
  167. package/dist/core/router/middleware/RouterMiddlewareManager.js +0 -1
  168. package/dist/core/router/middleware/auth.cjs +0 -1
  169. package/dist/core/router/middleware/auth.d.ts +0 -54
  170. package/dist/core/router/middleware/auth.js +0 -1
  171. package/dist/core/router/middleware/index.cjs +0 -1
  172. package/dist/core/router/middleware/index.d.ts +0 -6
  173. package/dist/core/router/middleware/index.js +0 -1
  174. package/dist/core/router/middleware/types.cjs +0 -1
  175. package/dist/core/router/middleware/types.d.ts +0 -82
  176. package/dist/core/router/middleware/types.js +0 -1
  177. package/dist/core/router/monitoring/RouterMonitoring.cjs +0 -1
  178. package/dist/core/router/monitoring/RouterMonitoring.d.ts +0 -134
  179. package/dist/core/router/monitoring/RouterMonitoring.js +0 -1
  180. package/dist/core/router/monitoring/index.cjs +0 -1
  181. package/dist/core/router/monitoring/index.d.ts +0 -4
  182. package/dist/core/router/monitoring/index.js +0 -1
  183. package/dist/core/router/navigation/RouterNavigation.cjs +0 -1
  184. package/dist/core/router/navigation/RouterNavigation.d.ts +0 -43
  185. package/dist/core/router/navigation/RouterNavigation.js +0 -1
  186. package/dist/core/router/navigation/index.cjs +0 -1
  187. package/dist/core/router/navigation/index.d.ts +0 -4
  188. package/dist/core/router/navigation/index.js +0 -1
  189. package/dist/core/router/performance/RouteCache.cjs +0 -1
  190. package/dist/core/router/performance/RouteCache.d.ts +0 -113
  191. package/dist/core/router/performance/RouteCache.js +0 -1
  192. package/dist/core/router/performance/RoutePreloader.cjs +0 -1
  193. package/dist/core/router/performance/RoutePreloader.d.ts +0 -111
  194. package/dist/core/router/performance/RoutePreloader.js +0 -1
  195. package/dist/core/router/performance/index.cjs +0 -1
  196. package/dist/core/router/performance/index.d.ts +0 -5
  197. package/dist/core/router/performance/index.js +0 -1
  198. package/dist/core/router/plugin/RouterPluginManager.cjs +0 -1
  199. package/dist/core/router/plugin/RouterPluginManager.d.ts +0 -74
  200. package/dist/core/router/plugin/RouterPluginManager.js +0 -1
  201. package/dist/core/router/plugin/index.cjs +0 -1
  202. package/dist/core/router/plugin/index.d.ts +0 -5
  203. package/dist/core/router/plugin/index.js +0 -1
  204. package/dist/core/router/plugin/types.cjs +0 -1
  205. package/dist/core/router/plugin/types.d.ts +0 -153
  206. package/dist/core/router/plugin/types.js +0 -1
  207. package/dist/core/router/types.cjs +0 -1
  208. package/dist/core/router/types.d.ts +0 -464
  209. package/dist/core/router/types.js +0 -1
  210. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.cjs +0 -1
  211. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.d.ts +0 -2
  212. package/dist/core/router/utils/adapters/react-router/RouteErrorBoundary.js +0 -1
  213. package/dist/core/router/utils/adapters/react-router/transform.cjs +0 -1
  214. package/dist/core/router/utils/adapters/react-router/transform.d.ts +0 -5
  215. package/dist/core/router/utils/adapters/react-router/transform.js +0 -1
  216. package/dist/core/router/utils/transform.cjs +0 -1
  217. package/dist/core/router/utils/transform.d.ts +0 -348
  218. package/dist/core/router/utils/transform.js +0 -1
  219. package/dist/core/router/validation/RouterConfigValidator.cjs +0 -2
  220. package/dist/core/router/validation/RouterConfigValidator.d.ts +0 -121
  221. package/dist/core/router/validation/RouterConfigValidator.js +0 -2
  222. package/dist/core/router/validation/index.cjs +0 -1
  223. package/dist/core/router/validation/index.d.ts +0 -5
  224. package/dist/core/router/validation/index.js +0 -1
  225. package/dist/core/router/validation/schema.cjs +0 -1
  226. package/dist/core/router/validation/schema.d.ts +0 -180
  227. package/dist/core/router/validation/schema.js +0 -1
  228. package/dist/core/router/version/RouteVersionManager.cjs +0 -1
  229. package/dist/core/router/version/RouteVersionManager.d.ts +0 -124
  230. package/dist/core/router/version/RouteVersionManager.js +0 -1
  231. package/dist/core/router/version/index.cjs +0 -1
  232. package/dist/core/router/version/index.d.ts +0 -4
  233. package/dist/core/router/version/index.js +0 -1
  234. package/dist/core/splash/SplashScreen.cjs +0 -1
  235. package/dist/core/splash/SplashScreen.d.ts +0 -14
  236. package/dist/core/splash/SplashScreen.js +0 -1
  237. package/dist/core/splash/index.cjs +0 -1
  238. package/dist/core/splash/index.d.ts +0 -5
  239. package/dist/core/splash/index.js +0 -1
  240. package/dist/core/splash/splashScreenUtils.cjs +0 -1
  241. package/dist/core/splash/splashScreenUtils.d.ts +0 -7
  242. package/dist/core/splash/splashScreenUtils.js +0 -1
  243. package/dist/core/startup/AppInstance.cjs +0 -1
  244. package/dist/core/startup/AppInstance.d.ts +0 -138
  245. package/dist/core/startup/AppInstance.js +0 -1
  246. package/dist/core/startup/environment.cjs +0 -1
  247. package/dist/core/startup/environment.d.ts +0 -87
  248. package/dist/core/startup/environment.js +0 -1
  249. package/dist/core/startup/index.cjs +0 -1
  250. package/dist/core/startup/index.d.ts +0 -7
  251. package/dist/core/startup/index.js +0 -1
  252. package/dist/core/startup/initializeServices.cjs +0 -1
  253. package/dist/core/startup/initializeServices.d.ts +0 -68
  254. package/dist/core/startup/initializeServices.js +0 -1
  255. package/dist/core/startup/performanceTracker.cjs +0 -1
  256. package/dist/core/startup/performanceTracker.d.ts +0 -104
  257. package/dist/core/startup/performanceTracker.js +0 -1
  258. package/dist/core/startup/renderApp.cjs +0 -1
  259. package/dist/core/startup/renderApp.d.ts +0 -70
  260. package/dist/core/startup/renderApp.js +0 -1
  261. package/dist/core/startup/startApp.cjs +0 -1
  262. package/dist/core/startup/startApp.d.ts +0 -14
  263. package/dist/core/startup/startApp.js +0 -1
  264. package/dist/core/types.cjs +0 -1
  265. package/dist/core/types.d.ts +0 -501
  266. package/dist/core/types.js +0 -1
  267. package/dist/index.umd.cjs +0 -1
  268. package/dist/index.umd.d.ts +0 -7
@@ -1,88 +0,0 @@
1
- import type { LangType } from '../../library/locale/types';
2
- import type { InitializationContext } from '../initialization';
3
- import type { AppConfig, ThemeConfig } from '../app';
4
- import type { UIProviderConfig } from '../types';
5
- /**
6
- * 应用配置单例
7
- *
8
- * 用于在非 React 代码中访问全局配置
9
- */
10
- declare class AppConfigManager {
11
- private static instance;
12
- private _config;
13
- /**
14
- * 私有构造函数,防止外部直接实例化
15
- */
16
- private constructor();
17
- /**
18
- * 获取单例实例
19
- *
20
- * @returns 单例实例
21
- */
22
- static getInstance(): AppConfigManager;
23
- /**
24
- * 初始化配置
25
- *
26
- * @param config - 应用配置
27
- */
28
- initialize(config: Partial<AppConfig>): void;
29
- /**
30
- * 获取完整配置
31
- *
32
- * @returns 应用配置
33
- */
34
- getConfig(): AppConfig;
35
- /**
36
- * 获取主题配置
37
- *
38
- * @returns 主题配置
39
- */
40
- getTheme(): ThemeConfig;
41
- /**
42
- * 更新主题配置
43
- *
44
- * @param theme - 主题配置或更新函数
45
- */
46
- setTheme(theme: ThemeConfig | ((prev: ThemeConfig) => ThemeConfig)): void;
47
- /**
48
- * 获取当前语言
49
- *
50
- * @returns 当前语言
51
- */
52
- getLocale(): LangType;
53
- /**
54
- * 更新语言
55
- *
56
- * @param locale - 语言类型
57
- */
58
- setLocale(locale: LangType): void;
59
- /**
60
- * 获取 Ant Design 配置
61
- *
62
- * @returns Ant Design 配置
63
- */
64
- getAntdConfig(): UIProviderConfig | undefined;
65
- /**
66
- * 更新 Ant Design 配置
67
- *
68
- * @param config - Ant Design 配置
69
- */
70
- setAntdConfig(config: UIProviderConfig | undefined): void;
71
- /**
72
- * 获取初始化上下文
73
- *
74
- * @returns 初始化上下文
75
- */
76
- getInitializationContext(): InitializationContext | undefined;
77
- /**
78
- * 更新初始化上下文
79
- *
80
- * @param context - 初始化上下文
81
- */
82
- setInitializationContext(context: InitializationContext | undefined): void;
83
- }
84
- /**
85
- * 应用配置单例实例
86
- */
87
- export declare const appConfig: AppConfigManager;
88
- export {};
@@ -1 +0,0 @@
1
- function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let AppConfigManager=class AppConfigManager{static getInstance(){if(!AppConfigManager.instance){AppConfigManager.instance=new AppConfigManager}return AppConfigManager.instance}initialize(config){this._config={theme:config.theme||{mode:"light"},locale:config.locale||"zh-CN",antdConfig:config.antdConfig,initializationContext:config.initializationContext}}getConfig(){return{...this._config}}getTheme(){return{...this._config.theme}}setTheme(theme){if(typeof theme==="function"){this._config.theme=theme(this._config.theme)}else{this._config.theme={...theme}}}getLocale(){return this._config.locale}setLocale(locale){this._config.locale=locale}getAntdConfig(){return this._config.antdConfig}setAntdConfig(config){this._config.antdConfig=config}getInitializationContext(){return this._config.initializationContext}setInitializationContext(context){this._config.initializationContext=context}constructor(){_define_property(this,"_config",void 0);this._config={theme:{mode:"light"},locale:"zh-CN"}}};_define_property(AppConfigManager,"instance",null);export const appConfig=AppConfigManager.getInstance();
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get ConfigFileFormat(){return ConfigFileFormat},get ConfigLoader(){return ConfigLoader}});const _logger=require("@vlian/logger");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}var ConfigFileFormat=/*#__PURE__*/function(ConfigFileFormat){ConfigFileFormat["JSON"]="json";ConfigFileFormat["YAML"]="yaml";return ConfigFileFormat}({});let ConfigChangeNotifier=class ConfigChangeNotifier{addListener(listener){this.listeners.add(listener);return()=>{this.listeners.delete(listener)}}removeListener(listener){this.listeners.delete(listener)}notify(newConfig,oldConfig){this.listeners.forEach(listener=>{try{listener(newConfig,oldConfig)}catch(error){_logger.logger.warn("配置变更监听器执行失败:",error)}})}clear(){this.listeners.clear()}constructor(){_define_property(this,"listeners",new Set)}};const configChangeNotifier=new ConfigChangeNotifier;let ConfigLoader=class ConfigLoader{static async loadFromJSON(path){try{if(typeof window!=="undefined"){const response=await fetch(path);if(!response.ok){throw new Error(`无法加载配置文件: ${path} (${response.status})`)}return await response.json()}if(typeof require!=="undefined"){const fs=require("fs");const content=fs.readFileSync(path,"utf-8");return JSON.parse(content)}throw new Error("不支持的环境:无法加载配置文件")}catch(error){_logger.logger.error(`加载JSON配置文件失败: ${path}`,error);throw error}}static async loadFromYAML(path){try{if(typeof window!=="undefined"){const response=await fetch(path);if(!response.ok){throw new Error(`无法加载配置文件: ${path} (${response.status})`)}const text=await response.text();if(typeof window.YAML!=="undefined"){return window.YAML.parse(text)}try{return JSON.parse(text)}catch{throw new Error("需要YAML解析库,请安装 yaml 包")}}if(typeof require!=="undefined"){const fs=require("fs");const yaml=require("yaml");const content=fs.readFileSync(path,"utf-8");return yaml.parse(content)}throw new Error("不支持的环境:无法加载配置文件")}catch(error){_logger.logger.error(`加载YAML配置文件失败: ${path}`,error);throw error}}static async loadFromFile(options){const{path,format="json",required=false,defaultConfig={}}=options;if(!path){if(required){throw new Error("配置文件路径未指定")}return defaultConfig}try{let config;switch(format){case"json":config=await this.loadFromJSON(path);break;case"yaml":config=await this.loadFromYAML(path);break;default:throw new Error(`不支持的配置文件格式: ${format}`)}_logger.logger.info(`成功加载配置文件: ${path}`);return config}catch(error){if(required){throw error}_logger.logger.warn(`配置文件加载失败,使用默认配置: ${path}`,error);return defaultConfig}}static mergeConfig(base,override){const merged={...base};for(const key in override){if(!Object.prototype.hasOwnProperty.call(override,key)){continue}const baseValue=merged[key];const overrideValue=override[key];if(baseValue&&overrideValue&&typeof baseValue==="object"&&typeof overrideValue==="object"&&!Array.isArray(baseValue)&&!Array.isArray(overrideValue)){merged[key]=this.mergeConfig(baseValue,overrideValue)}else{merged[key]=overrideValue}}return merged}static async loadFromMultipleSources(sources){let merged={};for(const source of sources){if("path"in source&&"format"in source){const fileConfig=await this.loadFromFile(source);merged=this.mergeConfig(merged,fileConfig)}else if(!("path"in source)&&!("format"in source)){merged=this.mergeConfig(merged,source)}}return merged}static loadFromEnv(prefix="FRAMEWORK_"){const config={};if(typeof process==="undefined"||!process.env){return config}for(const[key,value]of Object.entries(process.env)){if(!key.startsWith(prefix)){continue}const configKey=key.slice(prefix.length).toLowerCase().split("_").map((part,index)=>index===0?part:part.charAt(0).toUpperCase()+part.slice(1)).join("");let parsedValue=value;if(value==="true"||value==="false"){parsedValue=value==="true"}else if(!isNaN(Number(value))){parsedValue=Number(value)}else if(value?.startsWith("{")||value?.startsWith("[")){try{parsedValue=JSON.parse(value)}catch{}}config[configKey]=parsedValue}_logger.logger.debug("从环境变量加载配置:",config);return config}static async loadFromAllSources(sources=[],defaultConfig={},includeEnv=true,envPrefix="FRAMEWORK_"){const oldConfig={...defaultConfig};let merged={...defaultConfig};const fileConfigs=await this.loadFromMultipleSources(sources.filter(source=>typeof source==="object"&&"path"in source));merged=this.mergeConfig(merged,fileConfigs);if(includeEnv){const envConfig=this.loadFromEnv(envPrefix);merged=this.mergeConfig(merged,envConfig)}const codeConfigs=sources.filter(source=>typeof source==="object"&&!("path"in source));for(const codeConfig of codeConfigs){merged=this.mergeConfig(merged,codeConfig)}configChangeNotifier.notify(merged,oldConfig);return merged}static onConfigChange(listener){return configChangeNotifier.addListener(listener)}static removeConfigChangeListener(listener){configChangeNotifier.removeListener(listener)}};
@@ -1,118 +0,0 @@
1
- /**
2
- * 配置文件加载模块
3
- * 支持从JSON/YAML文件加载配置
4
- * 优化:支持环境变量配置、配置热更新
5
- */
6
- import type { StartOptions } from '../types';
7
- /**
8
- * 配置文件格式
9
- */
10
- export declare enum ConfigFileFormat {
11
- JSON = "json",
12
- YAML = "yaml"
13
- }
14
- /**
15
- * 配置文件加载选项
16
- */
17
- export interface ConfigFileLoadOptions {
18
- /**
19
- * 配置文件路径
20
- */
21
- path?: string;
22
- /**
23
- * 配置文件格式
24
- */
25
- format?: ConfigFileFormat;
26
- /**
27
- * 是否必需(如果为false,文件不存在时不报错)
28
- */
29
- required?: boolean;
30
- /**
31
- * 默认配置(文件不存在时使用)
32
- */
33
- defaultConfig?: Partial<StartOptions>;
34
- }
35
- /**
36
- * 配置变更监听器
37
- */
38
- export type ConfigChangeListener = (newConfig: Partial<StartOptions>, oldConfig: Partial<StartOptions>) => void;
39
- /**
40
- * 配置加载器
41
- */
42
- export declare class ConfigLoader {
43
- /**
44
- * 从JSON文件加载配置
45
- *
46
- * @param path - 文件路径
47
- * @returns 配置对象
48
- */
49
- static loadFromJSON(path: string): Promise<Partial<StartOptions>>;
50
- /**
51
- * 从YAML文件加载配置
52
- *
53
- * @param path - 文件路径
54
- * @returns 配置对象
55
- */
56
- static loadFromYAML(path: string): Promise<Partial<StartOptions>>;
57
- /**
58
- * 从文件加载配置
59
- *
60
- * @param options - 加载选项
61
- * @returns 配置对象
62
- */
63
- static loadFromFile(options: ConfigFileLoadOptions): Promise<Partial<StartOptions>>;
64
- /**
65
- * 合并配置(深度合并)
66
- *
67
- * @param base - 基础配置
68
- * @param override - 覆盖配置
69
- * @returns 合并后的配置
70
- */
71
- static mergeConfig(base: Partial<StartOptions>, override: Partial<StartOptions>): Partial<StartOptions>;
72
- /**
73
- * 从多个源加载并合并配置
74
- *
75
- * @param sources - 配置源列表(按优先级从低到高)
76
- * @returns 合并后的配置
77
- */
78
- static loadFromMultipleSources(sources: Array<Partial<StartOptions> | ConfigFileLoadOptions>): Promise<Partial<StartOptions>>;
79
- /**
80
- * 从环境变量加载配置
81
- *
82
- * 支持以下环境变量格式:
83
- * - FRAMEWORK_LOGGER_LEVEL=DEBUG
84
- * - FRAMEWORK_SHOW_SPLASH_SCREEN=always
85
- * - FRAMEWORK_MIN_SPLASH_SCREEN_TIME=1000
86
- *
87
- * @param prefix - 环境变量前缀,默认为 'FRAMEWORK_'
88
- * @returns 配置对象
89
- */
90
- static loadFromEnv(prefix?: string): Partial<StartOptions>;
91
- /**
92
- * 从多个源加载配置(包括环境变量)
93
- *
94
- * 优化:明确优先级,从低到高:
95
- * 1. 默认配置
96
- * 2. 配置文件
97
- * 3. 环境变量
98
- * 4. 代码配置(通过 sources 参数传入)
99
- *
100
- * @param sources - 配置源列表(代码配置,优先级最高)
101
- * @param defaultConfig - 默认配置(优先级最低)
102
- * @param includeEnv - 是否包含环境变量,默认为 true
103
- * @param envPrefix - 环境变量前缀,默认为 'FRAMEWORK_'
104
- * @returns 合并后的配置
105
- */
106
- static loadFromAllSources(sources?: Array<Partial<StartOptions> | ConfigFileLoadOptions>, defaultConfig?: Partial<StartOptions>, includeEnv?: boolean, envPrefix?: string): Promise<Partial<StartOptions>>;
107
- /**
108
- * 添加配置变更监听器
109
- *
110
- * @param listener - 配置变更监听器
111
- * @returns 取消监听的函数
112
- */
113
- static onConfigChange(listener: ConfigChangeListener): () => void;
114
- /**
115
- * 移除配置变更监听器
116
- */
117
- static removeConfigChangeListener(listener: ConfigChangeListener): void;
118
- }
@@ -1 +0,0 @@
1
- function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}import{logger}from"@vlian/logger";export var ConfigFileFormat=/*#__PURE__*/function(ConfigFileFormat){ConfigFileFormat["JSON"]="json";ConfigFileFormat["YAML"]="yaml";return ConfigFileFormat}({});let ConfigChangeNotifier=class ConfigChangeNotifier{addListener(listener){this.listeners.add(listener);return()=>{this.listeners.delete(listener)}}removeListener(listener){this.listeners.delete(listener)}notify(newConfig,oldConfig){this.listeners.forEach(listener=>{try{listener(newConfig,oldConfig)}catch(error){logger.warn("配置变更监听器执行失败:",error)}})}clear(){this.listeners.clear()}constructor(){_define_property(this,"listeners",new Set)}};const configChangeNotifier=new ConfigChangeNotifier;export class ConfigLoader{static async loadFromJSON(path){try{if(typeof window!=="undefined"){const response=await fetch(path);if(!response.ok){throw new Error(`无法加载配置文件: ${path} (${response.status})`)}return await response.json()}if(typeof require!=="undefined"){const fs=require("fs");const content=fs.readFileSync(path,"utf-8");return JSON.parse(content)}throw new Error("不支持的环境:无法加载配置文件")}catch(error){logger.error(`加载JSON配置文件失败: ${path}`,error);throw error}}static async loadFromYAML(path){try{if(typeof window!=="undefined"){const response=await fetch(path);if(!response.ok){throw new Error(`无法加载配置文件: ${path} (${response.status})`)}const text=await response.text();if(typeof window.YAML!=="undefined"){return window.YAML.parse(text)}try{return JSON.parse(text)}catch{throw new Error("需要YAML解析库,请安装 yaml 包")}}if(typeof require!=="undefined"){const fs=require("fs");const yaml=require("yaml");const content=fs.readFileSync(path,"utf-8");return yaml.parse(content)}throw new Error("不支持的环境:无法加载配置文件")}catch(error){logger.error(`加载YAML配置文件失败: ${path}`,error);throw error}}static async loadFromFile(options){const{path,format="json",required=false,defaultConfig={}}=options;if(!path){if(required){throw new Error("配置文件路径未指定")}return defaultConfig}try{let config;switch(format){case"json":config=await this.loadFromJSON(path);break;case"yaml":config=await this.loadFromYAML(path);break;default:throw new Error(`不支持的配置文件格式: ${format}`)}logger.info(`成功加载配置文件: ${path}`);return config}catch(error){if(required){throw error}logger.warn(`配置文件加载失败,使用默认配置: ${path}`,error);return defaultConfig}}static mergeConfig(base,override){const merged={...base};for(const key in override){if(!Object.prototype.hasOwnProperty.call(override,key)){continue}const baseValue=merged[key];const overrideValue=override[key];if(baseValue&&overrideValue&&typeof baseValue==="object"&&typeof overrideValue==="object"&&!Array.isArray(baseValue)&&!Array.isArray(overrideValue)){merged[key]=this.mergeConfig(baseValue,overrideValue)}else{merged[key]=overrideValue}}return merged}static async loadFromMultipleSources(sources){let merged={};for(const source of sources){if("path"in source&&"format"in source){const fileConfig=await this.loadFromFile(source);merged=this.mergeConfig(merged,fileConfig)}else if(!("path"in source)&&!("format"in source)){merged=this.mergeConfig(merged,source)}}return merged}static loadFromEnv(prefix="FRAMEWORK_"){const config={};if(typeof process==="undefined"||!process.env){return config}for(const[key,value]of Object.entries(process.env)){if(!key.startsWith(prefix)){continue}const configKey=key.slice(prefix.length).toLowerCase().split("_").map((part,index)=>index===0?part:part.charAt(0).toUpperCase()+part.slice(1)).join("");let parsedValue=value;if(value==="true"||value==="false"){parsedValue=value==="true"}else if(!isNaN(Number(value))){parsedValue=Number(value)}else if(value?.startsWith("{")||value?.startsWith("[")){try{parsedValue=JSON.parse(value)}catch{}}config[configKey]=parsedValue}logger.debug("从环境变量加载配置:",config);return config}static async loadFromAllSources(sources=[],defaultConfig={},includeEnv=true,envPrefix="FRAMEWORK_"){const oldConfig={...defaultConfig};let merged={...defaultConfig};const fileConfigs=await this.loadFromMultipleSources(sources.filter(source=>typeof source==="object"&&"path"in source));merged=this.mergeConfig(merged,fileConfigs);if(includeEnv){const envConfig=this.loadFromEnv(envPrefix);merged=this.mergeConfig(merged,envConfig)}const codeConfigs=sources.filter(source=>typeof source==="object"&&!("path"in source));for(const codeConfig of codeConfigs){merged=this.mergeConfig(merged,codeConfig)}configChangeNotifier.notify(merged,oldConfig);return merged}static onConfigChange(listener){return configChangeNotifier.addListener(listener)}static removeConfigChangeListener(listener){configChangeNotifier.removeListener(listener)}}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get ConfigValidationError(){return ConfigValidationError},get ConfigValidator(){return ConfigValidator}});const _zod=require("zod");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let ConfigValidationError=class ConfigValidationError extends Error{constructor(message,errors){super(message),_define_property(this,"errors",void 0),this.errors=errors;this.name="ConfigValidationError"}};let ConfigValidator=class ConfigValidator{static validate(config,schema){const result=schema.safeParse(config);if(!result.success){throw new ConfigValidationError("配置验证失败",result.error)}return result.data}static safeValidate(config,schema){const result=schema.safeParse(config);if(result.success){return{success:true,data:result.data}}return{success:false,error:result.error}}static createStartOptionsSchema(){return _zod.z.object({loggerLevel:_zod.z.enum(["DEBUG","INFO","WARN","ERROR"]).optional(),showSplashScreen:_zod.z.enum(["auto","always","never","first-time-only"]).optional(),minSplashScreenTime:_zod.z.number().positive().optional(),security:_zod.z.object({enableXSSProtection:_zod.z.boolean().optional(),validateConfig:_zod.z.boolean().optional(),sanitizeUserInput:_zod.z.boolean().optional(),csp:_zod.z.object({defaultSrc:_zod.z.array(_zod.z.string()).optional(),scriptSrc:_zod.z.array(_zod.z.string()).optional(),styleSrc:_zod.z.array(_zod.z.string()).optional(),imgSrc:_zod.z.array(_zod.z.string()).optional(),connectSrc:_zod.z.array(_zod.z.string()).optional(),fontSrc:_zod.z.array(_zod.z.string()).optional(),frameSrc:_zod.z.array(_zod.z.string()).optional(),allowUnsafeInline:_zod.z.boolean().optional(),allowUnsafeEval:_zod.z.boolean().optional()}).optional()}).optional()}).passthrough()}static validateWithFriendlyErrors(config,schema){const result=schema.safeParse(config);if(!result.success){const errorMessages=result.error.issues.map(issue=>{const path=issue.path.length>0?issue.path.join("."):"root";return`配置项 "${path}": ${issue.message}`});const friendlyMessage=`配置验证失败:
2
- ${errorMessages.join("\n")}`;throw new ConfigValidationError(friendlyMessage,result.error)}return result.data}};
@@ -1,84 +0,0 @@
1
- /**
2
- * 配置验证模块
3
- * 使用Zod进行配置验证
4
- */
5
- import { z } from 'zod';
6
- /**
7
- * 配置验证错误
8
- */
9
- export declare class ConfigValidationError extends Error {
10
- readonly errors: z.ZodError;
11
- constructor(message: string, errors: z.ZodError);
12
- }
13
- /**
14
- * 配置验证器
15
- */
16
- export declare class ConfigValidator {
17
- /**
18
- * 验证配置
19
- *
20
- * @param config - 要验证的配置
21
- * @param schema - Zod模式
22
- * @returns 验证后的配置
23
- * @throws ConfigValidationError 如果配置验证失败
24
- */
25
- static validate<T>(config: unknown, schema: z.ZodSchema<T>): T;
26
- /**
27
- * 安全验证配置(不抛出异常)
28
- *
29
- * @param config - 要验证的配置
30
- * @param schema - Zod模式
31
- * @returns 验证结果
32
- */
33
- static safeValidate<T>(config: unknown, schema: z.ZodSchema<T>): {
34
- success: true;
35
- data: T;
36
- } | {
37
- success: false;
38
- error: z.ZodError;
39
- };
40
- /**
41
- * 创建StartOptions的部分验证模式
42
- * 注意:这是一个基础模式,可以根据需要扩展
43
- */
44
- static createStartOptionsSchema(): z.ZodObject<{
45
- loggerLevel: z.ZodOptional<z.ZodEnum<{
46
- DEBUG: "DEBUG";
47
- INFO: "INFO";
48
- WARN: "WARN";
49
- ERROR: "ERROR";
50
- }>>;
51
- showSplashScreen: z.ZodOptional<z.ZodEnum<{
52
- auto: "auto";
53
- always: "always";
54
- never: "never";
55
- "first-time-only": "first-time-only";
56
- }>>;
57
- minSplashScreenTime: z.ZodOptional<z.ZodNumber>;
58
- security: z.ZodOptional<z.ZodObject<{
59
- enableXSSProtection: z.ZodOptional<z.ZodBoolean>;
60
- validateConfig: z.ZodOptional<z.ZodBoolean>;
61
- sanitizeUserInput: z.ZodOptional<z.ZodBoolean>;
62
- csp: z.ZodOptional<z.ZodObject<{
63
- defaultSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
64
- scriptSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
65
- styleSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
66
- imgSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
67
- connectSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
68
- fontSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
69
- frameSrc: z.ZodOptional<z.ZodArray<z.ZodString>>;
70
- allowUnsafeInline: z.ZodOptional<z.ZodBoolean>;
71
- allowUnsafeEval: z.ZodOptional<z.ZodBoolean>;
72
- }, z.core.$strip>>;
73
- }, z.core.$strip>>;
74
- }, z.core.$loose>;
75
- /**
76
- * 验证配置并提供友好的错误信息
77
- *
78
- * @param config - 要验证的配置
79
- * @param schema - Zod模式
80
- * @returns 验证后的配置
81
- * @throws ConfigValidationError 如果配置验证失败,包含详细的错误信息
82
- */
83
- static validateWithFriendlyErrors<T>(config: unknown, schema: z.ZodSchema<T>): T;
84
- }
@@ -1,2 +0,0 @@
1
- function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}import{z}from"zod";export class ConfigValidationError extends Error{constructor(message,errors){super(message),_define_property(this,"errors",void 0),this.errors=errors;this.name="ConfigValidationError"}}export class ConfigValidator{static validate(config,schema){const result=schema.safeParse(config);if(!result.success){throw new ConfigValidationError("配置验证失败",result.error)}return result.data}static safeValidate(config,schema){const result=schema.safeParse(config);if(result.success){return{success:true,data:result.data}}return{success:false,error:result.error}}static createStartOptionsSchema(){return z.object({loggerLevel:z.enum(["DEBUG","INFO","WARN","ERROR"]).optional(),showSplashScreen:z.enum(["auto","always","never","first-time-only"]).optional(),minSplashScreenTime:z.number().positive().optional(),security:z.object({enableXSSProtection:z.boolean().optional(),validateConfig:z.boolean().optional(),sanitizeUserInput:z.boolean().optional(),csp:z.object({defaultSrc:z.array(z.string()).optional(),scriptSrc:z.array(z.string()).optional(),styleSrc:z.array(z.string()).optional(),imgSrc:z.array(z.string()).optional(),connectSrc:z.array(z.string()).optional(),fontSrc:z.array(z.string()).optional(),frameSrc:z.array(z.string()).optional(),allowUnsafeInline:z.boolean().optional(),allowUnsafeEval:z.boolean().optional()}).optional()}).optional()}).passthrough()}static validateWithFriendlyErrors(config,schema){const result=schema.safeParse(config);if(!result.success){const errorMessages=result.error.issues.map(issue=>{const path=issue.path.length>0?issue.path.join("."):"root";return`配置项 "${path}": ${issue.message}`});const friendlyMessage=`配置验证失败:
2
- ${errorMessages.join("\n")}`;throw new ConfigValidationError(friendlyMessage,result.error)}return result.data}}
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"appConfig",{enumerable:true,get:function(){return _AppConfig.appConfig}});_export_star(require("./ConfigValidator"),exports);_export_star(require("./ConfigLoader"),exports);const _AppConfig=require("./AppConfig");function _export_star(from,to){Object.keys(from).forEach(function(k){if(k!=="default"&&!Object.prototype.hasOwnProperty.call(to,k)){Object.defineProperty(to,k,{enumerable:true,get:function(){return from[k]}})}});return from}
@@ -1,6 +0,0 @@
1
- /**
2
- * 配置模块统一导出
3
- */
4
- export * from './ConfigValidator';
5
- export * from './ConfigLoader';
6
- export { appConfig } from './AppConfig';
@@ -1 +0,0 @@
1
- export*from"./ConfigValidator";export*from"./ConfigLoader";export{appConfig}from"./AppConfig";
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get DevTools(){return DevTools},get DevToolsTrigger(){return DevToolsTrigger}});const _jsxruntime=require("react/jsx-runtime");const _react=require("react");const _app=require("../app");function toPrettyJson(value){try{return JSON.stringify(value,null,2)}catch{return String(value)}}function DevTools({appInstance,visible,onClose}){const[performanceMetrics,setPerformanceMetrics]=(0,_react.useState)({});const stateManager=(0,_app.useStateManager)();(0,_react.useEffect)(()=>{if(!visible){return}const tracker=appInstance.getPerformanceTracker();if(!tracker){return}const metrics=tracker.getMetrics();setPerformanceMetrics({serviceInitDuration:metrics.serviceInitDuration||0,initializationDuration:metrics.initializationDuration||0,firstRenderDuration:metrics.firstRenderDuration||0,totalStartupDuration:metrics.totalStartupDuration||0,fcp:metrics.fcp||0,lcp:metrics.lcp||0,fid:metrics.fid||0,cls:metrics.cls||0})},[visible,appInstance]);if(!visible){return null}const options=appInstance.getOptions();const allStates=stateManager?.getAllStates?.()||[];return(0,_jsxruntime.jsxs)("div",{style:{position:"fixed",top:0,right:0,width:"min(680px, 95vw)",height:"100vh",zIndex:9999,background:"#fff",borderLeft:"1px solid #d9e2ec",padding:16,overflowY:"auto",boxShadow:"-8px 0 20px rgba(0, 0, 0, 0.08)"},children:[(0,_jsxruntime.jsxs)("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[(0,_jsxruntime.jsx)("h3",{style:{margin:0},children:"DevTools"}),(0,_jsxruntime.jsx)("button",{onClick:onClose,style:{border:"none",background:"transparent",cursor:"pointer"},children:"关闭"})]}),(0,_jsxruntime.jsxs)("section",{style:{marginTop:12},children:[(0,_jsxruntime.jsx)("h4",{children:"实例"}),(0,_jsxruntime.jsxs)("div",{children:["id: ",appInstance.id]}),(0,_jsxruntime.jsxs)("div",{children:["initialized: ",String(appInstance.isInitialized())]})]}),(0,_jsxruntime.jsxs)("section",{style:{marginTop:12},children:[(0,_jsxruntime.jsx)("h4",{children:"性能"}),(0,_jsxruntime.jsx)("pre",{style:{background:"#f7fafc",padding:10,borderRadius:8},children:toPrettyJson(performanceMetrics)})]}),(0,_jsxruntime.jsxs)("section",{style:{marginTop:12},children:[(0,_jsxruntime.jsx)("h4",{children:"状态管理"}),(0,_jsxruntime.jsxs)("div",{children:["stateCount: ",allStates.length]}),(0,_jsxruntime.jsx)("pre",{style:{background:"#f7fafc",padding:10,borderRadius:8},children:toPrettyJson(allStates.slice(0,10))})]}),(0,_jsxruntime.jsxs)("section",{style:{marginTop:12},children:[(0,_jsxruntime.jsx)("h4",{children:"配置"}),(0,_jsxruntime.jsx)("pre",{style:{background:"#f7fafc",padding:10,borderRadius:8,whiteSpace:"pre-wrap"},children:toPrettyJson(options)})]})]})}function resolvePosition(position){const style={position:"fixed",zIndex:9998};const pos=position||"bottom-right";if(pos.includes("bottom"))style.bottom=16;if(pos.includes("top"))style.top=16;if(pos.includes("right"))style.right=16;if(pos.includes("left"))style.left=16;return style}function DevToolsTrigger({appInstance,position="bottom-right"}){const[visible,setVisible]=(0,_react.useState)(false);if(process.env.NODE_ENV!=="development"){return null}return(0,_jsxruntime.jsxs)(_jsxruntime.Fragment,{children:[(0,_jsxruntime.jsx)("button",{onClick:()=>setVisible(true),style:{...resolvePosition(position),border:"none",background:"#2f80ed",color:"#fff",borderRadius:999,padding:"8px 14px",cursor:"pointer"},children:"DevTools"}),(0,_jsxruntime.jsx)(DevTools,{appInstance:appInstance,visible:visible,onClose:()=>setVisible(false)})]})}
@@ -1,16 +0,0 @@
1
- /**
2
- * 开发工具模块(无 UI 框架依赖)
3
- */
4
- import type { ReactNode } from 'react';
5
- import type { AppInstance } from '../startup/AppInstance';
6
- export interface DevToolsProps {
7
- appInstance: AppInstance;
8
- visible?: boolean;
9
- onClose?: () => void;
10
- }
11
- export declare function DevTools({ appInstance, visible, onClose }: DevToolsProps): ReactNode;
12
- export interface DevToolsTriggerProps {
13
- appInstance: AppInstance;
14
- position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
15
- }
16
- export declare function DevToolsTrigger({ appInstance, position }: DevToolsTriggerProps): ReactNode;
@@ -1 +0,0 @@
1
- import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from"react/jsx-runtime";import{useState,useEffect}from"react";import{useStateManager}from"../app";function toPrettyJson(value){try{return JSON.stringify(value,null,2)}catch{return String(value)}}export function DevTools({appInstance,visible,onClose}){const[performanceMetrics,setPerformanceMetrics]=useState({});const stateManager=useStateManager();useEffect(()=>{if(!visible){return}const tracker=appInstance.getPerformanceTracker();if(!tracker){return}const metrics=tracker.getMetrics();setPerformanceMetrics({serviceInitDuration:metrics.serviceInitDuration||0,initializationDuration:metrics.initializationDuration||0,firstRenderDuration:metrics.firstRenderDuration||0,totalStartupDuration:metrics.totalStartupDuration||0,fcp:metrics.fcp||0,lcp:metrics.lcp||0,fid:metrics.fid||0,cls:metrics.cls||0})},[visible,appInstance]);if(!visible){return null}const options=appInstance.getOptions();const allStates=stateManager?.getAllStates?.()||[];return _jsxs("div",{style:{position:"fixed",top:0,right:0,width:"min(680px, 95vw)",height:"100vh",zIndex:9999,background:"#fff",borderLeft:"1px solid #d9e2ec",padding:16,overflowY:"auto",boxShadow:"-8px 0 20px rgba(0, 0, 0, 0.08)"},children:[_jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center"},children:[_jsx("h3",{style:{margin:0},children:"DevTools"}),_jsx("button",{onClick:onClose,style:{border:"none",background:"transparent",cursor:"pointer"},children:"关闭"})]}),_jsxs("section",{style:{marginTop:12},children:[_jsx("h4",{children:"实例"}),_jsxs("div",{children:["id: ",appInstance.id]}),_jsxs("div",{children:["initialized: ",String(appInstance.isInitialized())]})]}),_jsxs("section",{style:{marginTop:12},children:[_jsx("h4",{children:"性能"}),_jsx("pre",{style:{background:"#f7fafc",padding:10,borderRadius:8},children:toPrettyJson(performanceMetrics)})]}),_jsxs("section",{style:{marginTop:12},children:[_jsx("h4",{children:"状态管理"}),_jsxs("div",{children:["stateCount: ",allStates.length]}),_jsx("pre",{style:{background:"#f7fafc",padding:10,borderRadius:8},children:toPrettyJson(allStates.slice(0,10))})]}),_jsxs("section",{style:{marginTop:12},children:[_jsx("h4",{children:"配置"}),_jsx("pre",{style:{background:"#f7fafc",padding:10,borderRadius:8,whiteSpace:"pre-wrap"},children:toPrettyJson(options)})]})]})}function resolvePosition(position){const style={position:"fixed",zIndex:9998};const pos=position||"bottom-right";if(pos.includes("bottom"))style.bottom=16;if(pos.includes("top"))style.top=16;if(pos.includes("right"))style.right=16;if(pos.includes("left"))style.left=16;return style}export function DevToolsTrigger({appInstance,position="bottom-right"}){const[visible,setVisible]=useState(false);if(process.env.NODE_ENV!=="development"){return null}return _jsxs(_Fragment,{children:[_jsx("button",{onClick:()=>setVisible(true),style:{...resolvePosition(position),border:"none",background:"#2f80ed",color:"#fff",borderRadius:999,padding:"8px 14px",cursor:"pointer"},children:"DevTools"}),_jsx(DevTools,{appInstance:appInstance,visible:visible,onClose:()=>setVisible(false)})]})}
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get ErrorBoundary(){return ErrorBoundary},get useErrorHandler(){return useErrorHandler},get withErrorBoundary(){return withErrorBoundary}});const _jsxruntime=require("react/jsx-runtime");const _react=/*#__PURE__*/_interop_require_wildcard(require("react"));const _reacterrorboundary=require("react-error-boundary");const _logger=require("@vlian/logger");const _utils=require("@vlian/utils");const _initialization=require("../initialization");const _ErrorHandler=require("./ErrorHandler");function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}function ErrorBoundary({children,fallback,onError,showInConsole=true,resetKeys,onReset,onResetKeysChange}){const retryCountRef=(0,_react.useRef)(0);const errorHandler=(0,_react.useMemo)(()=>(0,_ErrorHandler.getDefaultErrorHandler)(),[]);const handleError=(0,_react.useCallback)(async(error,errorInfo)=>{const normalizedError=_utils.errorUtils.normalizeError(error);const reactErrorInfo={componentStack:errorInfo.componentStack||""};const handleResult=await errorHandler.handleError(normalizedError,{componentStack:reactErrorInfo.componentStack,source:"ErrorBoundary"});if(!handleResult.handled){_logger.logger.error("错误边界捕获到错误:",{error:normalizedError.toJSON(),errorInfo:{componentStack:reactErrorInfo.componentStack}})}if(onError){onError(normalizedError,reactErrorInfo)}if(showInConsole){console.error("错误边界捕获到错误:",normalizedError);console.error("错误信息:",reactErrorInfo)}},[errorHandler,onError,showInConsole]);const handleReset=()=>{_initialization.initializationErrorState.clearError();if(onReset){onReset()}};const DefaultFallbackComponent=_react.default.memo(({error,resetErrorBoundary})=>{const normalizedError=_utils.errorUtils.normalizeError(error);const[retryCount,setRetryCount]=(0,_react.useState)(retryCountRef.current);const[showDetails,setShowDetails]=(0,_react.useState)(false);(0,_react.useEffect)(()=>{setRetryCount(retryCountRef.current)},[]);const handleRetry=(0,_react.useCallback)(()=>{const newCount=retryCount+1;retryCountRef.current=newCount;setRetryCount(newCount);handleReset();resetErrorBoundary()},[retryCount,resetErrorBoundary]);const handleReload=(0,_react.useCallback)(()=>{window.location.reload()},[]);const userFriendlyMessage=(0,_react.useMemo)(()=>{if(normalizedError.code==="NETWORK_ERROR"){return"网络连接失败,请检查您的网络设置后再尝试"}if(normalizedError.code==="TIMEOUT_ERROR"){return"请求超时,请稍后再尝试"}if(normalizedError.code==="VALIDATION_ERROR"){return"数据验证失败,请检查输入内容"}return"应用运行时发生了错误,请稍后再尝试"},[normalizedError.code]);const extraButtons=(0,_react.useMemo)(()=>{const buttons=[(0,_jsxruntime.jsx)("button",{onClick:handleRetry,"aria-label":"重试加载应用",style:{border:"none",background:"var(--app-primary-color, #2f80ed)",color:"#fff",borderRadius:6,padding:"8px 14px",cursor:"pointer"},children:"重试"},"retry"),(0,_jsxruntime.jsx)("button",{onClick:()=>setShowDetails(!showDetails),"aria-label":showDetails?"隐藏错误详情":"显示错误详情",style:{border:"1px solid #cfd7df",background:"#fff",color:"#1f2933",borderRadius:6,padding:"8px 14px",cursor:"pointer"},children:showDetails?"隐藏详情":"查看详情"},"details")];if(retryCount>=1){buttons.push((0,_jsxruntime.jsx)("button",{onClick:handleReload,"aria-label":"刷新页面",style:{border:"1px solid #cfd7df",background:"#fff",color:"#1f2933",borderRadius:6,padding:"8px 14px",cursor:"pointer"},children:"刷新页面"},"reload"))}return buttons},[retryCount,handleRetry,handleReload,showDetails]);return(0,_jsxruntime.jsxs)("div",{role:"alert","aria-live":"assertive","aria-atomic":"true",style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",minHeight:"100vh",padding:"24px"},children:[(0,_jsxruntime.jsxs)("div",{style:{maxWidth:580,width:"100%",textAlign:"center",border:"1px solid #dde5ec",borderRadius:10,padding:24,background:"#fff"},children:[(0,_jsxruntime.jsx)("div",{style:{fontSize:40,lineHeight:"44px"},children:"⚠️"}),(0,_jsxruntime.jsx)("h2",{style:{margin:"8px 0 4px"},children:"出错了"}),(0,_jsxruntime.jsx)("p",{style:{marginTop:0,color:"#52606d"},children:userFriendlyMessage}),(0,_jsxruntime.jsx)("div",{style:{display:"flex",gap:8,justifyContent:"center",flexWrap:"wrap"},children:extraButtons})]}),showDetails&&(0,_jsxruntime.jsxs)("div",{style:{marginTop:24,padding:16,backgroundColor:"#f5f5f5",borderRadius:4,maxWidth:800,width:"100%",maxHeight:400,overflow:"auto"},children:[(0,_jsxruntime.jsx)("div",{style:{marginBottom:8,fontWeight:"bold"},children:"错误详情:"}),(0,_jsxruntime.jsxs)("div",{style:{fontFamily:"monospace",fontSize:12},children:[(0,_jsxruntime.jsxs)("div",{children:[(0,_jsxruntime.jsx)("strong",{children:"错误类型:"}),normalizedError.name]}),(0,_jsxruntime.jsxs)("div",{children:[(0,_jsxruntime.jsx)("strong",{children:"错误代码:"}),normalizedError.code]}),(0,_jsxruntime.jsxs)("div",{children:[(0,_jsxruntime.jsx)("strong",{children:"错误信息:"}),normalizedError.message]}),normalizedError.stack&&(0,_jsxruntime.jsxs)("div",{style:{marginTop:8},children:[(0,_jsxruntime.jsx)("strong",{children:"堆栈信息:"}),(0,_jsxruntime.jsx)("pre",{style:{whiteSpace:"pre-wrap",wordBreak:"break-word"},children:normalizedError.stack})]})]})]})]})});DefaultFallbackComponent.displayName="DefaultFallbackComponent";const defaultFallback=({error,resetErrorBoundary})=>{return(0,_jsxruntime.jsx)(DefaultFallbackComponent,{error:error,resetErrorBoundary:resetErrorBoundary})};const fallbackRender=fallback?({error,resetErrorBoundary})=>{const normalizedError=_utils.errorUtils.normalizeError(error);return fallback(normalizedError,()=>{handleReset();resetErrorBoundary()})}:defaultFallback;const handleResetWithCount=()=>{retryCountRef.current=0;handleReset()};const handleResetKeysChange=(prevKeys,nextKeys)=>{retryCountRef.current=0;if(onResetKeysChange){onResetKeysChange(prevKeys,nextKeys)}};const errorBoundaryProps={fallbackRender,onError:handleError,onReset:handleResetWithCount,resetKeys,onResetKeysChange:handleResetKeysChange};return(0,_jsxruntime.jsx)(_reacterrorboundary.ErrorBoundary,{...errorBoundaryProps,children:children})}function withErrorBoundary(Component,errorBoundaryProps){const WrappedComponent=props=>{return(0,_jsxruntime.jsx)(ErrorBoundary,{...errorBoundaryProps,children:(0,_jsxruntime.jsx)(Component,{...props})})};WrappedComponent.displayName=`withErrorBoundary(${Component.displayName||Component.name||"Component"})`;return WrappedComponent}function useErrorHandler(){return error=>{_initialization.initializationErrorState.setError(error)}}
@@ -1,121 +0,0 @@
1
- import React, { type ReactNode, type ErrorInfo } from 'react';
2
- import type { FrameworkError } from '@vlian/utils';
3
- /**
4
- * 错误边界组件属性
5
- */
6
- export interface ErrorBoundaryProps {
7
- /**
8
- * 子组件
9
- */
10
- children: ReactNode;
11
- /**
12
- * 错误回退 UI(函数形式)
13
- *
14
- * 如果不提供,将使用默认错误 UI(框架内置实现,居中显示)。
15
- * 如果提供,将使用自定义的错误 UI。
16
- *
17
- * @param error - 标准化后的框架错误对象
18
- * @param resetError - 重置错误边界的函数,调用后可以尝试重新渲染子组件
19
- * @returns 错误 UI 的 React 节点
20
- *
21
- * @example
22
- * ```tsx
23
- * <ErrorBoundary
24
- * fallback={(error, reset) => (
25
- * <div>
26
- * <h2>自定义错误标题</h2>
27
- * <p>{error.message}</p>
28
- * <button onClick={reset}>重试</button>
29
- * </div>
30
- * )}
31
- * >
32
- * <App />
33
- * </ErrorBoundary>
34
- * ```
35
- */
36
- fallback?: (error: FrameworkError, resetError: () => void) => ReactNode;
37
- /**
38
- * 错误回调
39
- */
40
- onError?: (error: FrameworkError, errorInfo: ErrorInfo) => void;
41
- /**
42
- * 是否在控制台显示错误
43
- */
44
- showInConsole?: boolean;
45
- /**
46
- * 重置键数组,当这些值变化时自动重置错误边界
47
- */
48
- resetKeys?: Array<string | number>;
49
- /**
50
- * 重置错误时的回调
51
- */
52
- onReset?: () => void;
53
- /**
54
- * 重置键变化时的回调
55
- */
56
- onResetKeysChange?: (prevKeys: Array<string | number> | undefined, nextKeys: Array<string | number> | undefined) => void;
57
- }
58
- /**
59
- * 错误边界组件
60
- *
61
- * 基于 react-error-boundary 实现,集成了框架的错误处理系统
62
- * 用于捕获 React 组件树中的错误,防止整个应用崩溃
63
- *
64
- * 默认使用框架内置错误 UI,居中显示。
65
- * 可以通过 fallback 属性自定义错误 UI。
66
- *
67
- * @example
68
- * ```tsx
69
- * // 使用默认错误 UI(推荐)
70
- * <ErrorBoundary>
71
- * <App />
72
- * </ErrorBoundary>
73
- *
74
- * // 自定义错误 UI
75
- * <ErrorBoundary
76
- * fallback={(error, reset) => (
77
- * <div>
78
- * <h1>出错了</h1>
79
- * <p>{error.message}</p>
80
- * <button onClick={reset}>重试</button>
81
- * </div>
82
- * )}
83
- * >
84
- * <App />
85
- * </ErrorBoundary>
86
- * ```
87
- */
88
- export declare function ErrorBoundary({ children, fallback, onError, showInConsole, resetKeys, onReset, onResetKeysChange, }: ErrorBoundaryProps): ReactNode;
89
- /**
90
- * 带错误边界的 HOC
91
- */
92
- export declare function withErrorBoundary<P extends object>(Component: React.ComponentType<P>, errorBoundaryProps?: Omit<ErrorBoundaryProps, 'children'>): React.ComponentType<P>;
93
- /**
94
- * 使用错误处理器的 Hook
95
- *
96
- * 用于在函数组件中处理异步错误
97
- *
98
- * 注意:这个 Hook 需要配合 ErrorBoundary 使用。当调用返回的错误处理函数时,
99
- * 错误会被设置到初始化错误状态,然后通过 InitializationErrorThrower 组件抛出。
100
- *
101
- * @example
102
- * ```tsx
103
- * import { useErrorHandler } from '@vlian/framework';
104
- *
105
- * function MyComponent() {
106
- * const handleError = useErrorHandler();
107
- *
108
- * useEffect(() => {
109
- * async function fetchData() {
110
- * try {
111
- * await someAsyncOperation();
112
- * } catch (error) {
113
- * handleError(error);
114
- * }
115
- * }
116
- * fetchData();
117
- * }, [handleError]);
118
- * }
119
- * ```
120
- */
121
- export declare function useErrorHandler(): (error: unknown) => void;
@@ -1 +0,0 @@
1
- import{jsx as _jsx,jsxs as _jsxs}from"react/jsx-runtime";import React,{useState,useRef,useEffect,useCallback,useMemo}from"react";import{ErrorBoundary as ReactErrorBoundary}from"react-error-boundary";import{logger}from"@vlian/logger";import{errorUtils}from"@vlian/utils";import{initializationErrorState}from"../initialization";import{getDefaultErrorHandler}from"./ErrorHandler";export function ErrorBoundary({children,fallback,onError,showInConsole=true,resetKeys,onReset,onResetKeysChange}){const retryCountRef=useRef(0);const errorHandler=useMemo(()=>getDefaultErrorHandler(),[]);const handleError=useCallback(async(error,errorInfo)=>{const normalizedError=errorUtils.normalizeError(error);const reactErrorInfo={componentStack:errorInfo.componentStack||""};const handleResult=await errorHandler.handleError(normalizedError,{componentStack:reactErrorInfo.componentStack,source:"ErrorBoundary"});if(!handleResult.handled){logger.error("错误边界捕获到错误:",{error:normalizedError.toJSON(),errorInfo:{componentStack:reactErrorInfo.componentStack}})}if(onError){onError(normalizedError,reactErrorInfo)}if(showInConsole){console.error("错误边界捕获到错误:",normalizedError);console.error("错误信息:",reactErrorInfo)}},[errorHandler,onError,showInConsole]);const handleReset=()=>{initializationErrorState.clearError();if(onReset){onReset()}};const DefaultFallbackComponent=React.memo(({error,resetErrorBoundary})=>{const normalizedError=errorUtils.normalizeError(error);const[retryCount,setRetryCount]=useState(retryCountRef.current);const[showDetails,setShowDetails]=useState(false);useEffect(()=>{setRetryCount(retryCountRef.current)},[]);const handleRetry=useCallback(()=>{const newCount=retryCount+1;retryCountRef.current=newCount;setRetryCount(newCount);handleReset();resetErrorBoundary()},[retryCount,resetErrorBoundary]);const handleReload=useCallback(()=>{window.location.reload()},[]);const userFriendlyMessage=useMemo(()=>{if(normalizedError.code==="NETWORK_ERROR"){return"网络连接失败,请检查您的网络设置后再尝试"}if(normalizedError.code==="TIMEOUT_ERROR"){return"请求超时,请稍后再尝试"}if(normalizedError.code==="VALIDATION_ERROR"){return"数据验证失败,请检查输入内容"}return"应用运行时发生了错误,请稍后再尝试"},[normalizedError.code]);const extraButtons=useMemo(()=>{const buttons=[_jsx("button",{onClick:handleRetry,"aria-label":"重试加载应用",style:{border:"none",background:"var(--app-primary-color, #2f80ed)",color:"#fff",borderRadius:6,padding:"8px 14px",cursor:"pointer"},children:"重试"},"retry"),_jsx("button",{onClick:()=>setShowDetails(!showDetails),"aria-label":showDetails?"隐藏错误详情":"显示错误详情",style:{border:"1px solid #cfd7df",background:"#fff",color:"#1f2933",borderRadius:6,padding:"8px 14px",cursor:"pointer"},children:showDetails?"隐藏详情":"查看详情"},"details")];if(retryCount>=1){buttons.push(_jsx("button",{onClick:handleReload,"aria-label":"刷新页面",style:{border:"1px solid #cfd7df",background:"#fff",color:"#1f2933",borderRadius:6,padding:"8px 14px",cursor:"pointer"},children:"刷新页面"},"reload"))}return buttons},[retryCount,handleRetry,handleReload,showDetails]);return _jsxs("div",{role:"alert","aria-live":"assertive","aria-atomic":"true",style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",minHeight:"100vh",padding:"24px"},children:[_jsxs("div",{style:{maxWidth:580,width:"100%",textAlign:"center",border:"1px solid #dde5ec",borderRadius:10,padding:24,background:"#fff"},children:[_jsx("div",{style:{fontSize:40,lineHeight:"44px"},children:"⚠️"}),_jsx("h2",{style:{margin:"8px 0 4px"},children:"出错了"}),_jsx("p",{style:{marginTop:0,color:"#52606d"},children:userFriendlyMessage}),_jsx("div",{style:{display:"flex",gap:8,justifyContent:"center",flexWrap:"wrap"},children:extraButtons})]}),showDetails&&_jsxs("div",{style:{marginTop:24,padding:16,backgroundColor:"#f5f5f5",borderRadius:4,maxWidth:800,width:"100%",maxHeight:400,overflow:"auto"},children:[_jsx("div",{style:{marginBottom:8,fontWeight:"bold"},children:"错误详情:"}),_jsxs("div",{style:{fontFamily:"monospace",fontSize:12},children:[_jsxs("div",{children:[_jsx("strong",{children:"错误类型:"}),normalizedError.name]}),_jsxs("div",{children:[_jsx("strong",{children:"错误代码:"}),normalizedError.code]}),_jsxs("div",{children:[_jsx("strong",{children:"错误信息:"}),normalizedError.message]}),normalizedError.stack&&_jsxs("div",{style:{marginTop:8},children:[_jsx("strong",{children:"堆栈信息:"}),_jsx("pre",{style:{whiteSpace:"pre-wrap",wordBreak:"break-word"},children:normalizedError.stack})]})]})]})]})});DefaultFallbackComponent.displayName="DefaultFallbackComponent";const defaultFallback=({error,resetErrorBoundary})=>{return _jsx(DefaultFallbackComponent,{error:error,resetErrorBoundary:resetErrorBoundary})};const fallbackRender=fallback?({error,resetErrorBoundary})=>{const normalizedError=errorUtils.normalizeError(error);return fallback(normalizedError,()=>{handleReset();resetErrorBoundary()})}:defaultFallback;const handleResetWithCount=()=>{retryCountRef.current=0;handleReset()};const handleResetKeysChange=(prevKeys,nextKeys)=>{retryCountRef.current=0;if(onResetKeysChange){onResetKeysChange(prevKeys,nextKeys)}};const errorBoundaryProps={fallbackRender,onError:handleError,onReset:handleResetWithCount,resetKeys,onResetKeysChange:handleResetKeysChange};return _jsx(ReactErrorBoundary,{...errorBoundaryProps,children:children})}export function withErrorBoundary(Component,errorBoundaryProps){const WrappedComponent=props=>{return _jsx(ErrorBoundary,{...errorBoundaryProps,children:_jsx(Component,{...props})})};WrappedComponent.displayName=`withErrorBoundary(${Component.displayName||Component.name||"Component"})`;return WrappedComponent}export function useErrorHandler(){return error=>{initializationErrorState.setError(error)}}
@@ -1 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get ErrorHandler(){return ErrorHandler},get ErrorHandlingStrategy(){return ErrorHandlingStrategy},get getDefaultErrorHandler(){return getDefaultErrorHandler},get setDefaultErrorHandler(){return setDefaultErrorHandler}});const _logger=require("@vlian/logger");const _utils=require("@vlian/utils");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}var ErrorHandlingStrategy=/*#__PURE__*/function(ErrorHandlingStrategy){ErrorHandlingStrategy["LOG"]="LOG";ErrorHandlingStrategy["REPORT"]="REPORT";ErrorHandlingStrategy["RECOVER"]="RECOVER";ErrorHandlingStrategy["FALLBACK"]="FALLBACK";ErrorHandlingStrategy["IGNORE"]="IGNORE";return ErrorHandlingStrategy}({});let ErrorHandler=class ErrorHandler{setMonitoring(monitoring){this.monitoring=monitoring}async handleError(error,context){const normalizedError=_utils.errorUtils.normalizeError(error);const errorWithContext=context?new _utils.FrameworkError(normalizedError.message,normalizedError.type,normalizedError.severity,{code:normalizedError.code,originalError:normalizedError.originalError,context:{...normalizedError.context,...context},recoverable:normalizedError.recoverable}):normalizedError;const strategies=this.determineStrategies(errorWithContext);const handled=await this.executeStrategies(errorWithContext,strategies);let recoveredValue;let recoverable=false;if(handled&&errorWithContext.recoverable&&this.config.recoveryOptions){const recoveryResult=await this.attemptRecovery(errorWithContext);recoverable=recoveryResult.recoverable;recoveredValue=recoveryResult.value}return{handled,recoverable,recoveredValue,strategies,error:errorWithContext}}determineStrategies(error){if(this.config.typeStrategies[error.type]){return this.config.typeStrategies[error.type]}if(this.config.severityStrategies[error.severity]){return this.config.severityStrategies[error.severity]}return this.config.defaultStrategies}async executeStrategies(error,strategies){let handled=false;for(const strategy of strategies){try{switch(strategy){case"LOG":this.logError(error);handled=true;break;case"REPORT":await this.reportError(error);handled=true;break;case"RECOVER":handled=true;break;case"FALLBACK":handled=true;break;case"IGNORE":handled=true;break}}catch(strategyError){_logger.logger.warn(`错误处理策略 ${strategy} 执行失败:`,strategyError)}}return handled}logError(error){const errorInfo=_utils.errorUtils.extractErrorInfo(error);switch(error.severity){case _utils.ErrorSeverity.CRITICAL:case _utils.ErrorSeverity.HIGH:_logger.logger.error("错误:",errorInfo);break;case _utils.ErrorSeverity.MEDIUM:_logger.logger.warn("警告:",errorInfo);break;case _utils.ErrorSeverity.LOW:_logger.logger.info("信息:",errorInfo);break}if(this.config.showDetailedErrorsInDev&&process.env.NODE_ENV==="development"){const detailedError=_utils.errorUtils.formatErrorForDev(error);console.error(detailedError)}}async reportError(error){if(!this.monitoring){_logger.logger.debug("监控服务未配置,跳过错误上报");return}try{this.monitoring.captureError(error,{severity:error.severity,type:error.type,code:error.code,context:error.context})}catch(reportError){_logger.logger.warn("错误上报失败:",reportError)}}async attemptRecovery(error){const options=this.config.recoveryOptions;if(!options){return{recoverable:false}}const maxRetries=options.maxRetries??3;const retryDelay=options.retryDelay??1e3;const exponentialBackoff=options.exponentialBackoff??true;const shouldRetry=options.shouldRetry??(()=>true);if(options.fallback){try{const fallbackValue=await Promise.resolve(options.fallback());_logger.logger.info("错误已通过降级方案恢复");return{recoverable:true,value:fallbackValue}}catch(fallbackError){_logger.logger.warn("降级方案执行失败:",fallbackError)}}if(error.recoverable&&shouldRetry(error,0)){for(let attempt=0;attempt<maxRetries;attempt++){if(!shouldRetry(error,attempt)){break}const delay=exponentialBackoff?retryDelay*Math.pow(2,attempt):retryDelay;_logger.logger.debug(`错误恢复重试 ${attempt+1}/${maxRetries},${delay}ms 后重试...`);await new Promise(resolve=>setTimeout(resolve,delay))}}return{recoverable:error.recoverable}}static create(config){return new ErrorHandler(config)}constructor(config={}){_define_property(this,"config",void 0);_define_property(this,"monitoring",void 0);this.monitoring=config.monitoring;this.config={defaultStrategies:config.defaultStrategies??["LOG","REPORT"],severityStrategies:config.severityStrategies??{},typeStrategies:config.typeStrategies??{},recoveryOptions:config.recoveryOptions??{},showDetailedErrorsInDev:config.showDetailedErrorsInDev??true}}};let defaultErrorHandler=null;function getDefaultErrorHandler(){if(!defaultErrorHandler){defaultErrorHandler=new ErrorHandler}return defaultErrorHandler}function setDefaultErrorHandler(handler){defaultErrorHandler=handler}