@vlian/framework 1.0.1 → 1.0.4

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 (63) hide show
  1. package/dist/core/event/AppEventBus.cjs +446 -0
  2. package/dist/core/event/AppEventBus.cjs.map +1 -0
  3. package/dist/core/event/AppEventBus.d.ts +179 -0
  4. package/dist/core/event/AppEventBus.d.ts.map +1 -0
  5. package/dist/core/event/AppEventBus.js +438 -0
  6. package/dist/core/event/AppEventBus.js.map +1 -0
  7. package/dist/core/event/frameworkEvents.cjs +143 -0
  8. package/dist/core/event/frameworkEvents.cjs.map +1 -0
  9. package/dist/core/event/frameworkEvents.d.ts +70 -0
  10. package/dist/core/event/frameworkEvents.d.ts.map +1 -0
  11. package/dist/core/event/frameworkEvents.js +135 -0
  12. package/dist/core/event/frameworkEvents.js.map +1 -0
  13. package/dist/core/event/hooks.cjs +71 -0
  14. package/dist/core/event/hooks.cjs.map +1 -0
  15. package/dist/core/event/hooks.d.ts +58 -0
  16. package/dist/core/event/hooks.d.ts.map +1 -0
  17. package/dist/core/event/hooks.js +95 -0
  18. package/dist/core/event/hooks.js.map +1 -0
  19. package/dist/core/event/index.cjs +43 -0
  20. package/dist/core/event/index.cjs.map +1 -0
  21. package/dist/core/event/index.d.ts +11 -0
  22. package/dist/core/event/index.d.ts.map +1 -0
  23. package/dist/core/event/index.js +10 -0
  24. package/dist/core/event/index.js.map +1 -0
  25. package/dist/core/event/types.cjs +64 -0
  26. package/dist/core/event/types.cjs.map +1 -0
  27. package/dist/core/event/types.d.ts +270 -0
  28. package/dist/core/event/types.d.ts.map +1 -0
  29. package/dist/core/event/types.js +56 -0
  30. package/dist/core/event/types.js.map +1 -0
  31. package/dist/core/event/useEventBus.cjs +27 -0
  32. package/dist/core/event/useEventBus.cjs.map +1 -0
  33. package/dist/core/event/useEventBus.d.ts +29 -0
  34. package/dist/core/event/useEventBus.d.ts.map +1 -0
  35. package/dist/core/event/useEventBus.js +39 -0
  36. package/dist/core/event/useEventBus.js.map +1 -0
  37. package/dist/core/index.cjs +1 -0
  38. package/dist/core/index.cjs.map +1 -1
  39. package/dist/core/index.d.ts +1 -0
  40. package/dist/core/index.d.ts.map +1 -1
  41. package/dist/core/index.js +2 -0
  42. package/dist/core/index.js.map +1 -1
  43. package/dist/core/startup/AppInstance.cjs +8 -0
  44. package/dist/core/startup/AppInstance.cjs.map +1 -1
  45. package/dist/core/startup/AppInstance.d.ts +4 -0
  46. package/dist/core/startup/AppInstance.d.ts.map +1 -1
  47. package/dist/core/startup/AppInstance.js +8 -0
  48. package/dist/core/startup/AppInstance.js.map +1 -1
  49. package/dist/core/startup/initializeServices.cjs +21 -4
  50. package/dist/core/startup/initializeServices.cjs.map +1 -1
  51. package/dist/core/startup/initializeServices.d.ts +5 -0
  52. package/dist/core/startup/initializeServices.d.ts.map +1 -1
  53. package/dist/core/startup/initializeServices.js +21 -4
  54. package/dist/core/startup/initializeServices.js.map +1 -1
  55. package/dist/core/startup/startApp.cjs +59 -1
  56. package/dist/core/startup/startApp.cjs.map +1 -1
  57. package/dist/core/startup/startApp.d.ts.map +1 -1
  58. package/dist/core/startup/startApp.js +59 -1
  59. package/dist/core/startup/startApp.js.map +1 -1
  60. package/dist/core/types.d.ts +31 -0
  61. package/dist/core/types.d.ts.map +1 -1
  62. package/dist/core/types.js.map +1 -1
  63. package/package.json +2 -3
@@ -11,6 +11,7 @@ import { initializeServices } from "./initializeServices";
11
11
  import { getAppInstanceManager } from "./AppInstance";
12
12
  import { getEnvironmentDetector } from "./environment";
13
13
  import { getRouterManager } from "../router/RouterManager";
14
+ import { FrameworkEventManager } from "../event/frameworkEvents";
14
15
  /**
15
16
  * 启动应用
16
17
  *
@@ -25,6 +26,8 @@ import { getRouterManager } from "../router/RouterManager";
25
26
  initTraceIdGenerator('app');
26
27
  const traceId = generateTraceId();
27
28
  setCurrentTraceId(traceId);
29
+ // 框架事件管理器(在服务初始化后创建)
30
+ let frameworkEventManager = null;
28
31
  try {
29
32
  // 1. 环境检测和容器获取
30
33
  const container = options.container || envDetector.safeGetElement('#root');
@@ -36,10 +39,23 @@ import { getRouterManager } from "../router/RouterManager";
36
39
  logger.info('框架启动中...');
37
40
  // 2. 创建应用实例
38
41
  const appInstance = instanceManager.createInstance(instanceId, options);
42
+ const finalInstanceId = appInstance.id;
39
43
  // 3. 初始化服务(并行)
40
44
  const servicesInitStart = performance.now();
41
- const services = await initializeServices(options);
45
+ const services = await initializeServices({
46
+ ...options,
47
+ eventBus: {
48
+ ...options.eventBus,
49
+ instanceId: finalInstanceId
50
+ }
51
+ });
42
52
  const servicesInitDuration = performance.now() - servicesInitStart;
53
+ // 创建框架事件管理器
54
+ frameworkEventManager = new FrameworkEventManager(services.eventBus);
55
+ // 触发应用启动事件(使用真实的事件总线)
56
+ frameworkEventManager.emitAppStart(finalInstanceId);
57
+ // 触发实例创建事件
58
+ frameworkEventManager.emitInstanceCreated(finalInstanceId);
43
59
  // 4. 初始化应用实例
44
60
  appInstance.initialize(container, services);
45
61
  // 5. 初始化路由管理器
@@ -58,14 +74,26 @@ import { getRouterManager } from "../router/RouterManager";
58
74
  // 8. 渲染应用函数
59
75
  const renderApp = async (context)=>{
60
76
  const renderStart = performance.now();
77
+ // 触发渲染开始事件
78
+ if (frameworkEventManager) {
79
+ frameworkEventManager.emitAppRenderStart(finalInstanceId);
80
+ }
61
81
  await renderer.renderApp(options, services, context);
62
82
  const renderDuration = performance.now() - renderStart;
83
+ // 触发渲染完成事件
84
+ if (frameworkEventManager) {
85
+ frameworkEventManager.emitAppRenderComplete(finalInstanceId, renderDuration);
86
+ }
63
87
  if (performanceTracker) {
64
88
  performanceTracker.recordFirstRender(renderDuration);
65
89
  const totalDuration = performance.now() - startTime;
66
90
  performanceTracker.recordTotalStartup(totalDuration);
67
91
  performanceTracker.report();
68
92
  }
93
+ // 触发应用启动完成事件
94
+ if (frameworkEventManager) {
95
+ frameworkEventManager.emitAppStarted(finalInstanceId, performance.now() - startTime);
96
+ }
69
97
  // 开发模式下显示开发工具
70
98
  if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {
71
99
  // 延迟显示开发工具,避免影响首次渲染
@@ -86,6 +114,11 @@ import { getRouterManager } from "../router/RouterManager";
86
114
  // 场景1: 显示启动页,初始化在启动页中完成
87
115
  const onSplashComplete = (context)=>{
88
116
  logger.info('启动页初始化完成');
117
+ // 触发初始化完成事件
118
+ if (frameworkEventManager) {
119
+ const initDuration = context.duration || 0;
120
+ frameworkEventManager.emitAppInitComplete(finalInstanceId, context, initDuration);
121
+ }
89
122
  if (options.onSplashComplete) {
90
123
  Promise.resolve(options.onSplashComplete(()=>{
91
124
  logger.info('框架加载完成');
@@ -100,11 +133,19 @@ import { getRouterManager } from "../router/RouterManager";
100
133
  renderApp(context);
101
134
  }
102
135
  };
136
+ // 触发初始化开始事件
137
+ if (frameworkEventManager) {
138
+ frameworkEventManager.emitAppInitStart(finalInstanceId);
139
+ }
103
140
  // 渲染启动页
104
141
  renderer.renderSplashScreen(options, services, onSplashComplete);
105
142
  } else {
106
143
  // 场景2: 不显示启动页,直接执行初始化
107
144
  logger.info('开始执行初始化(无启动页)');
145
+ // 触发初始化开始事件
146
+ if (frameworkEventManager) {
147
+ frameworkEventManager.emitAppInitStart(finalInstanceId);
148
+ }
108
149
  try {
109
150
  const initStart = performance.now();
110
151
  // 使用中间件包装初始化函数
@@ -114,6 +155,10 @@ import { getRouterManager } from "../router/RouterManager";
114
155
  });
115
156
  });
116
157
  const initDuration = performance.now() - initStart;
158
+ // 触发初始化完成事件
159
+ if (frameworkEventManager) {
160
+ frameworkEventManager.emitAppInitComplete(finalInstanceId, initContext, initDuration);
161
+ }
117
162
  if (performanceTracker) {
118
163
  performanceTracker.recordInitialization(initDuration);
119
164
  }
@@ -122,6 +167,10 @@ import { getRouterManager } from "../router/RouterManager";
122
167
  renderApp(initContext);
123
168
  } catch (error) {
124
169
  logger.error('初始化失败:', error);
170
+ // 触发初始化错误事件
171
+ if (frameworkEventManager) {
172
+ frameworkEventManager.emitAppInitError(finalInstanceId, error instanceof Error ? error : new Error(String(error)));
173
+ }
125
174
  initializationErrorState.setError(error);
126
175
  renderApp();
127
176
  }
@@ -129,6 +178,15 @@ import { getRouterManager } from "../router/RouterManager";
129
178
  return instanceManager;
130
179
  } catch (error) {
131
180
  logger.error('框架启动失败:', error);
181
+ // 触发错误事件
182
+ if (frameworkEventManager) {
183
+ const errorInstanceId = instanceId || instanceManager.getInstance()?.id;
184
+ if (errorInstanceId) {
185
+ frameworkEventManager.emitErrorOccurred(error instanceof Error ? error : new Error(String(error)), {
186
+ phase: 'startup'
187
+ });
188
+ }
189
+ }
132
190
  // 如果容器存在,尝试渲染错误页面
133
191
  const container = options.container || envDetector.safeGetElement('#root');
134
192
  if (container) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/startup/startApp.ts"],"sourcesContent":["/**\n * 应用启动主函数\n * 重构后的启动逻辑,集成所有新功能\n */\n\nimport { logger } from '../../utils';\nimport { ErrorCode, InitializationError } from '../../utils/errors';\nimport { initTraceIdGenerator, generateTraceId, setCurrentTraceId } from '../../utils/traceId';\nimport type { StartOptions } from '../types';\nimport { shouldShowSplashScreen } from '../splash';\nimport { initialization, initializationErrorState } from '../initialization/index';\nimport { middlewareManager } from '../middleware';\nimport { initializeServices } from './initializeServices';\nimport { AppInstanceManager, getAppInstanceManager } from './AppInstance';\nimport { getEnvironmentDetector } from './environment';\nimport { getRouterManager } from '../router/RouterManager';\n\n/**\n * 启动应用\n * \n * @param options - 启动配置选项\n * @param instanceId - 应用实例ID(可选,用于多实例场景)\n * @returns 应用实例\n */\nexport async function startApp(\n options: StartOptions = {},\n instanceId?: string\n): Promise<AppInstanceManager> {\n const startTime = performance.now();\n const envDetector = getEnvironmentDetector();\n const instanceManager = getAppInstanceManager();\n\n // 初始化追踪 ID 生成器\n initTraceIdGenerator('app');\n const traceId = generateTraceId();\n setCurrentTraceId(traceId);\n\n try {\n // 1. 环境检测和容器获取\n const container = options.container || envDetector.safeGetElement('#root');\n if (!container) {\n throw new InitializationError(\n '未找到挂载容器',\n undefined,\n { container: options.container },\n ErrorCode.CONTAINER_NOT_FOUND\n );\n }\n\n logger.info('框架启动中...');\n\n // 2. 创建应用实例\n const appInstance = instanceManager.createInstance(instanceId, options);\n\n // 3. 初始化服务(并行)\n const servicesInitStart = performance.now();\n const services = await initializeServices(options);\n const servicesInitDuration = performance.now() - servicesInitStart;\n\n // 4. 初始化应用实例\n appInstance.initialize(container, services);\n\n // 5. 初始化路由管理器\n const routerManager = getRouterManager();\n if (options.router) {\n await routerManager.initialize(options.router);\n }\n\n // 6. 性能追踪\n const performanceTracker = appInstance.getPerformanceTracker();\n if (performanceTracker) {\n performanceTracker.recordServiceInit(servicesInitDuration);\n }\n\n // 6. 是否显示启动页\n const shouldShowSplash = shouldShowSplashScreen(options.showSplashScreen);\n\n const renderer = appInstance.getRenderer();\n\n // 8. 渲染应用函数\n const renderApp = async (context?: Awaited<ReturnType<typeof initialization>>) => {\n const renderStart = performance.now();\n await renderer.renderApp(options, services, context);\n const renderDuration = performance.now() - renderStart;\n\n if (performanceTracker) {\n performanceTracker.recordFirstRender(renderDuration);\n const totalDuration = performance.now() - startTime;\n performanceTracker.recordTotalStartup(totalDuration);\n performanceTracker.report();\n }\n\n // 开发模式下显示开发工具\n if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {\n // 延迟显示开发工具,避免影响首次渲染\n setTimeout(() => {\n const devToolsContainer = document.createElement('div');\n devToolsContainer.id = '__framework_dev_tools__';\n document.body.appendChild(devToolsContainer);\n \n // 这里需要动态导入React来渲染开发工具\n // 为了简化,暂时注释掉,后续可以完善\n // import('react-dom/client').then(({ createRoot }) => {\n // const root = createRoot(devToolsContainer);\n // root.render(<DevToolsTrigger appInstance={appInstance} />);\n // });\n }, 1000);\n }\n };\n\n if (shouldShowSplash) {\n // 场景1: 显示启动页,初始化在启动页中完成\n const onSplashComplete = (context: Awaited<ReturnType<typeof initialization>>) => {\n logger.info('启动页初始化完成');\n\n if (options.onSplashComplete) {\n Promise.resolve(\n options.onSplashComplete(() => {\n logger.info('框架加载完成');\n renderApp(context);\n }, context)\n ).catch((error) => {\n logger.error('onSplashComplete 回调执行失败:', error);\n initializationErrorState.setError(error);\n renderApp(context);\n });\n } else {\n logger.info('框架加载完成');\n renderApp(context);\n }\n };\n\n // 渲染启动页\n renderer.renderSplashScreen(options, services, onSplashComplete);\n } else {\n // 场景2: 不显示启动页,直接执行初始化\n logger.info('开始执行初始化(无启动页)');\n\n try {\n const initStart = performance.now();\n\n // 使用中间件包装初始化函数\n const initContext = await middlewareManager.execute(\n options,\n async () => {\n return await initialization(options, (progress, step) => {\n logger.debug(`初始化进度: ${progress}%${step ? ` - ${step}` : ''}`);\n });\n }\n );\n\n const initDuration = performance.now() - initStart;\n if (performanceTracker) {\n performanceTracker.recordInitialization(initDuration);\n }\n\n logger.info('初始化完成(无启动页)', initContext);\n logger.info('框架加载完成');\n renderApp(initContext);\n } catch (error) {\n logger.error('初始化失败:', error);\n initializationErrorState.setError(error);\n renderApp();\n }\n }\n\n return instanceManager;\n } catch (error) {\n logger.error('框架启动失败:', error);\n\n // 如果容器存在,尝试渲染错误页面\n const container = options.container || envDetector.safeGetElement('#root');\n if (container) {\n const errorInstance = instanceManager.getInstance();\n if (errorInstance && errorInstance.isInitialized()) {\n const renderer = errorInstance.getRenderer();\n const services = errorInstance.getServices();\n initializationErrorState.setError(error);\n renderer.renderError(options, services);\n }\n }\n\n throw error;\n }\n}\n"],"names":["logger","ErrorCode","InitializationError","initTraceIdGenerator","generateTraceId","setCurrentTraceId","shouldShowSplashScreen","initialization","initializationErrorState","middlewareManager","initializeServices","getAppInstanceManager","getEnvironmentDetector","getRouterManager","startApp","options","instanceId","startTime","performance","now","envDetector","instanceManager","traceId","container","safeGetElement","undefined","CONTAINER_NOT_FOUND","info","appInstance","createInstance","servicesInitStart","services","servicesInitDuration","initialize","routerManager","router","performanceTracker","getPerformanceTracker","recordServiceInit","shouldShowSplash","showSplashScreen","renderer","getRenderer","renderApp","context","renderStart","renderDuration","recordFirstRender","totalDuration","recordTotalStartup","report","process","env","NODE_ENV","window","setTimeout","devToolsContainer","document","createElement","id","body","appendChild","onSplashComplete","Promise","resolve","catch","error","setError","renderSplashScreen","initStart","initContext","execute","progress","step","debug","initDuration","recordInitialization","errorInstance","getInstance","isInitialized","getServices","renderError"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/core/startup/startApp.ts"],"sourcesContent":["/**\n * 应用启动主函数\n * 重构后的启动逻辑,集成所有新功能\n */\n\nimport { logger } from '../../utils';\nimport { ErrorCode, InitializationError } from '../../utils/errors';\nimport { initTraceIdGenerator, generateTraceId, setCurrentTraceId } from '../../utils/traceId';\nimport type { StartOptions } from '../types';\nimport { shouldShowSplashScreen } from '../splash';\nimport { initialization, initializationErrorState } from '../initialization/index';\nimport { middlewareManager } from '../middleware';\nimport { initializeServices } from './initializeServices';\nimport { AppInstanceManager, getAppInstanceManager } from './AppInstance';\nimport { getEnvironmentDetector } from './environment';\nimport { getRouterManager } from '../router/RouterManager';\nimport { FrameworkEventManager } from '../event/frameworkEvents';\n\n/**\n * 启动应用\n * \n * @param options - 启动配置选项\n * @param instanceId - 应用实例ID(可选,用于多实例场景)\n * @returns 应用实例\n */\nexport async function startApp(\n options: StartOptions = {},\n instanceId?: string\n): Promise<AppInstanceManager> {\n const startTime = performance.now();\n const envDetector = getEnvironmentDetector();\n const instanceManager = getAppInstanceManager();\n\n // 初始化追踪 ID 生成器\n initTraceIdGenerator('app');\n const traceId = generateTraceId();\n setCurrentTraceId(traceId);\n\n // 框架事件管理器(在服务初始化后创建)\n let frameworkEventManager: FrameworkEventManager | null = null;\n\n try {\n // 1. 环境检测和容器获取\n const container = options.container || envDetector.safeGetElement('#root');\n if (!container) {\n throw new InitializationError(\n '未找到挂载容器',\n undefined,\n { container: options.container },\n ErrorCode.CONTAINER_NOT_FOUND\n );\n }\n\n logger.info('框架启动中...');\n\n // 2. 创建应用实例\n const appInstance = instanceManager.createInstance(instanceId, options);\n const finalInstanceId = appInstance.id;\n\n // 3. 初始化服务(并行)\n const servicesInitStart = performance.now();\n const services = await initializeServices({\n ...options,\n eventBus: {\n ...options.eventBus,\n instanceId: finalInstanceId,\n },\n });\n const servicesInitDuration = performance.now() - servicesInitStart;\n\n // 创建框架事件管理器\n frameworkEventManager = new FrameworkEventManager(services.eventBus);\n \n // 触发应用启动事件(使用真实的事件总线)\n frameworkEventManager.emitAppStart(finalInstanceId);\n \n // 触发实例创建事件\n frameworkEventManager.emitInstanceCreated(finalInstanceId);\n\n // 4. 初始化应用实例\n appInstance.initialize(container, services);\n\n // 5. 初始化路由管理器\n const routerManager = getRouterManager();\n if (options.router) {\n await routerManager.initialize(options.router);\n }\n\n // 6. 性能追踪\n const performanceTracker = appInstance.getPerformanceTracker();\n if (performanceTracker) {\n performanceTracker.recordServiceInit(servicesInitDuration);\n }\n\n // 6. 是否显示启动页\n const shouldShowSplash = shouldShowSplashScreen(options.showSplashScreen);\n\n const renderer = appInstance.getRenderer();\n\n // 8. 渲染应用函数\n const renderApp = async (context?: Awaited<ReturnType<typeof initialization>>) => {\n const renderStart = performance.now();\n \n // 触发渲染开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderStart(finalInstanceId);\n }\n \n await renderer.renderApp(options, services, context);\n const renderDuration = performance.now() - renderStart;\n\n // 触发渲染完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppRenderComplete(finalInstanceId, renderDuration);\n }\n\n if (performanceTracker) {\n performanceTracker.recordFirstRender(renderDuration);\n const totalDuration = performance.now() - startTime;\n performanceTracker.recordTotalStartup(totalDuration);\n performanceTracker.report();\n }\n \n // 触发应用启动完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppStarted(finalInstanceId, performance.now() - startTime);\n }\n\n // 开发模式下显示开发工具\n if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {\n // 延迟显示开发工具,避免影响首次渲染\n setTimeout(() => {\n const devToolsContainer = document.createElement('div');\n devToolsContainer.id = '__framework_dev_tools__';\n document.body.appendChild(devToolsContainer);\n \n // 这里需要动态导入React来渲染开发工具\n // 为了简化,暂时注释掉,后续可以完善\n // import('react-dom/client').then(({ createRoot }) => {\n // const root = createRoot(devToolsContainer);\n // root.render(<DevToolsTrigger appInstance={appInstance} />);\n // });\n }, 1000);\n }\n };\n\n if (shouldShowSplash) {\n // 场景1: 显示启动页,初始化在启动页中完成\n const onSplashComplete = (context: Awaited<ReturnType<typeof initialization>>) => {\n logger.info('启动页初始化完成');\n\n // 触发初始化完成事件\n if (frameworkEventManager) {\n const initDuration = context.duration || 0;\n frameworkEventManager.emitAppInitComplete(finalInstanceId, context, initDuration);\n }\n\n if (options.onSplashComplete) {\n Promise.resolve(\n options.onSplashComplete(() => {\n logger.info('框架加载完成');\n renderApp(context);\n }, context)\n ).catch((error) => {\n logger.error('onSplashComplete 回调执行失败:', error);\n initializationErrorState.setError(error);\n renderApp(context);\n });\n } else {\n logger.info('框架加载完成');\n renderApp(context);\n }\n };\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n // 渲染启动页\n renderer.renderSplashScreen(options, services, onSplashComplete);\n } else {\n // 场景2: 不显示启动页,直接执行初始化\n logger.info('开始执行初始化(无启动页)');\n\n // 触发初始化开始事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitStart(finalInstanceId);\n }\n\n try {\n const initStart = performance.now();\n\n // 使用中间件包装初始化函数\n const initContext = await middlewareManager.execute(\n options,\n async () => {\n return await initialization(options, (progress, step) => {\n logger.debug(`初始化进度: ${progress}%${step ? ` - ${step}` : ''}`);\n });\n }\n );\n\n const initDuration = performance.now() - initStart;\n \n // 触发初始化完成事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitComplete(finalInstanceId, initContext, initDuration);\n }\n \n if (performanceTracker) {\n performanceTracker.recordInitialization(initDuration);\n }\n\n logger.info('初始化完成(无启动页)', initContext);\n logger.info('框架加载完成');\n renderApp(initContext);\n } catch (error) {\n logger.error('初始化失败:', error);\n \n // 触发初始化错误事件\n if (frameworkEventManager) {\n frameworkEventManager.emitAppInitError(\n finalInstanceId,\n error instanceof Error ? error : new Error(String(error))\n );\n }\n \n initializationErrorState.setError(error);\n renderApp();\n }\n }\n\n return instanceManager;\n } catch (error) {\n logger.error('框架启动失败:', error);\n\n // 触发错误事件\n if (frameworkEventManager) {\n const errorInstanceId = instanceId || instanceManager.getInstance()?.id;\n if (errorInstanceId) {\n frameworkEventManager.emitErrorOccurred(\n error instanceof Error ? error : new Error(String(error)),\n { phase: 'startup' }\n );\n }\n }\n\n // 如果容器存在,尝试渲染错误页面\n const container = options.container || envDetector.safeGetElement('#root');\n if (container) {\n const errorInstance = instanceManager.getInstance();\n if (errorInstance && errorInstance.isInitialized()) {\n const renderer = errorInstance.getRenderer();\n const services = errorInstance.getServices();\n initializationErrorState.setError(error);\n renderer.renderError(options, services);\n }\n }\n\n throw error;\n }\n}\n"],"names":["logger","ErrorCode","InitializationError","initTraceIdGenerator","generateTraceId","setCurrentTraceId","shouldShowSplashScreen","initialization","initializationErrorState","middlewareManager","initializeServices","getAppInstanceManager","getEnvironmentDetector","getRouterManager","FrameworkEventManager","startApp","options","instanceId","startTime","performance","now","envDetector","instanceManager","traceId","frameworkEventManager","container","safeGetElement","undefined","CONTAINER_NOT_FOUND","info","appInstance","createInstance","finalInstanceId","id","servicesInitStart","services","eventBus","servicesInitDuration","emitAppStart","emitInstanceCreated","initialize","routerManager","router","performanceTracker","getPerformanceTracker","recordServiceInit","shouldShowSplash","showSplashScreen","renderer","getRenderer","renderApp","context","renderStart","emitAppRenderStart","renderDuration","emitAppRenderComplete","recordFirstRender","totalDuration","recordTotalStartup","report","emitAppStarted","process","env","NODE_ENV","window","setTimeout","devToolsContainer","document","createElement","body","appendChild","onSplashComplete","initDuration","duration","emitAppInitComplete","Promise","resolve","catch","error","setError","emitAppInitStart","renderSplashScreen","initStart","initContext","execute","progress","step","debug","recordInitialization","emitAppInitError","Error","String","errorInstanceId","getInstance","emitErrorOccurred","phase","errorInstance","isInitialized","getServices","renderError"],"mappings":"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"}
@@ -275,6 +275,37 @@ export interface StartOptions {
275
275
  * ```
276
276
  */
277
277
  stateManager?: import('../state').StateManagerOptions;
278
+ /**
279
+ * 事件总线配置
280
+ *
281
+ * 配置应用级事件系统,支持事件追踪、性能监控、安全模式等。
282
+ * 如果不提供,将使用默认配置创建事件总线。
283
+ *
284
+ * @example
285
+ * ```typescript
286
+ * import { start } from '@vlian/framework';
287
+ *
288
+ * start({
289
+ * eventBus: {
290
+ * enableTracking: true,
291
+ * maxHistorySize: 200,
292
+ * enablePerformanceMonitoring: true,
293
+ * namespacePrefix: 'my-app:',
294
+ * },
295
+ * });
296
+ * ```
297
+ */
298
+ eventBus?: {
299
+ enableTracking?: boolean;
300
+ maxHistorySize?: number;
301
+ enableValidation?: boolean;
302
+ validator?: (event: string, data: unknown) => boolean;
303
+ enablePerformanceMonitoring?: boolean;
304
+ namespacePrefix?: string;
305
+ instanceId?: string;
306
+ enableSecurityMode?: boolean;
307
+ allowedSources?: string[];
308
+ };
278
309
  /**
279
310
  * 自定义启动屏组件
280
311
  *
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/types.ts"],"sourcesContent":["import { LogLevel } from '../utils';\nimport type { LangType } from '../library/locale/types';\nimport { Container, RootOptions } from 'react-dom/client';\nimport { type ReactElement, type ReactNode } from 'react';\nimport { type InitializationContext, type ConfigStrategy } from './initialization';\nimport type { StorageOptions } from '../types';\nimport type { ConfigProviderProps, AppProps } from \"antd\";\nimport type { ThemeConfig } from './app';\nimport type { FrameworkError } from '../utils/errors';\nimport type { RouterConfig } from './router/types';\n\n/**\n * 生命周期钩子函数类型\n */\nexport type ManagerLifecycle = {\n /**\n * 在初始化之前执行\n */\n beforeInitialization?: () => Promise<void> | void;\n\n /**\n * 初始化\n */\n initialization?: () => Promise<void> | void;\n\n /**\n * 在初始化之后执行\n * \n * @param context - 初始化上下文,包含配置、进度、耗时等信息\n * \n * @example\n * ```typescript\n * start({\n * lifecycle: {\n * afterInitialization: (context) => {\n * console.log('初始化完成', context);\n * },\n * },\n * });\n * ```\n */\n afterInitialization?: (context: InitializationContext) => Promise<void> | void;\n};\n\n\n/**\n * 启动配置选项\n */\nexport interface StartOptions {\n /**\n * React 应用的挂载容器\n * \n * 用于指定 React 应用渲染的目标 DOM 元素。如果不提供,框架将自动查找页面中\n * 的根元素(通常为 id=\"root\" 的元素)作为默认容器。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * // 使用默认容器(自动查找 id=\"root\" 的元素)\n * start({});\n * \n * // 指定自定义容器\n * const container = document.getElementById('app');\n * start({ container });\n * ```\n */\n container?: Container;\n /**\n * React 根节点的配置选项\n * \n * 用于配置 React 18+ 的 createRoot 方法的选项,包括:\n * - `onRecoverableError`: 错误恢复回调函数\n * - `identifierPrefix`: 用于标识符前缀,用于服务端渲染的 hydration\n * \n * 这些选项将传递给 `react-dom/client` 的 `createRoot` 方法。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * rootOptions: {\n * onRecoverableError: (error) => {\n * console.error('React 错误恢复:', error);\n * },\n * identifierPrefix: 'my-app-',\n * },\n * });\n * ```\n */\n rootOptions?: RootOptions;\n /**\n * 应用根组件\n * \n * 用于指定要渲染的 React 应用根组件。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * import App from './App';\n * \n * start({\n * app: <App />,\n * });\n * ```\n */\n app?: ReactElement;\n /**\n * 是否显示启动页\n * - 'auto': 自动判断(推荐)\n * - 'always': 总是显示\n * - 'never': 从不显示\n * - 'first-time-only': 仅首次加载显示\n * \n * @default 'auto'\n */\n showSplashScreen?: 'auto' | 'always' | 'never' | 'first-time-only';\n\n /**\n * 启动页最小显示时间(毫秒)\n * \n * 用于避免启动页闪烁,确保用户能看到启动过程。\n * 如果初始化完成时间小于此值,将等待至最小时间后再隐藏启动页。\n * \n * @default 500\n * \n * @example\n * ```typescript\n * start({\n * minSplashScreenTime: 1000, // 至少显示 1 秒\n * });\n * ```\n */\n minSplashScreenTime?: number;\n\n /**\n * 路由配置\n * \n * 配置应用的路由系统,支持内置路由、自定义路由和禁用路由三种模式。\n * \n * @example\n * ```typescript\n * start({\n * router: {\n * enabled: true,\n * routes: [\n * {\n * path: '/login',\n * page: LoginPage,\n * },\n * {\n * path: '/',\n * layout: MainLayout,\n * children: [\n * {\n * path: 'dashboard',\n * page: DashboardPage,\n * meta: { title: '仪表盘' },\n * },\n * ],\n * },\n * ],\n * },\n * });\n * ```\n */\n router?: RouterConfig;\n /**\n * 日志级别\n */\n loggerLevel?: LogLevel;\n /**\n * 生命周期钩子\n */\n lifecycle?: ManagerLifecycle;\n /**\n * 国际化\n */\n locale?: Record<LangType, Record<string, unknown>>;\n /**\n * 配置加载策略\n */\n configStrategy?: ConfigStrategy;\n /**\n * 启动页完成回调\n * 仅在显示启动页时,启动页完成初始化后调用\n * 可以在这里执行额外的操作,然后调用 complete() 继续\n * \n * @example\n * ```typescript\n * start({\n * onSplashComplete: (complete, context) => {\n * // 执行额外操作\n * await doSomething();\n * // 完成后继续\n * complete();\n * },\n * });\n * ```\n */\n onSplashComplete?: (\n complete: () => void,\n context: InitializationContext\n ) => Promise<void> | void;\n\n /**\n * 存储配置\n */\n storageOptions?: StorageOptions;\n\n /**\n * IndexedDB 表名\n */\n indexedDBTableName?: string;\n\n /**\n * antd 配置\n */\n antd?: ConfigProviderProps;\n\n /**\n * antd App 组件配置\n * \n * 用于配置 antd 的 App 组件,使 message、modal、notification 等静态方法能够正确使用。\n * \n * @example\n * ```typescript\n * start({\n * antdApp: {\n * message: { maxCount: 3 },\n * notification: { placement: 'topRight' },\n * },\n * });\n * ```\n */\n antdApp?: AppProps;\n\n /**\n * 主题配置\n * \n * @example\n * ```typescript\n * start({\n * theme: {\n * mode: 'dark',\n * primaryColor: '#1890ff',\n * },\n * });\n * ```\n */\n theme?: ThemeConfig;\n\n /**\n * 运行时安全配置\n */\n runtimeSecurity?: import('../utils/runtimeSecurity').RuntimeSecurityOptions;\n\n /**\n * 配置安全选项\n */\n configSecurity?: import('../utils/configSecurity').ConfigSecurityOptions;\n\n /**\n * 性能监控配置\n */\n performanceMonitor?: import('../utils/performance').PerformanceMonitorConfig;\n\n /**\n * 错误监控配置\n */\n errorMonitor?: import('../utils/monitoring').ErrorMonitorConfig;\n\n /**\n * 分析服务配置\n */\n analytics?: import('../utils/analytics').AnalyticsConfig;\n\n /**\n * 状态管理器配置\n * \n * 配置框架的状态管理器,支持自定义适配器和作用域设置。\n * 如果不提供,将使用默认配置创建状态管理器。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * stateManager: {\n * enableRegistry: true,\n * defaultScope: 'app',\n * devMode: true,\n * },\n * });\n * ```\n */\n stateManager?: import('../state').StateManagerOptions;\n\n /**\n * 自定义启动屏组件\n * \n * 如果提供,将使用自定义组件替代默认的启动屏 UI。\n * 自定义组件将接收初始化进度、当前步骤和初始化状态作为 props。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * const CustomSplashScreen = ({ progress, currentStep, isInitializing }) => {\n * return (\n * <div>\n * <h1>加载中...</h1>\n * <div>进度: {progress}%</div>\n * <div>步骤: {currentStep}</div>\n * </div>\n * );\n * };\n * \n * start({\n * splashScreen: CustomSplashScreen,\n * });\n * ```\n */\n splashScreen?: React.ComponentType<SplashScreenCustomProps>;\n\n /**\n * 自定义错误反馈组件\n * \n * 如果提供,将使用自定义的错误 UI 替代默认的错误 UI(基于 antd 的 Result 组件)。\n * 自定义组件将接收错误对象和重置函数作为参数。\n * \n * @param error - 标准化后的框架错误对象\n * @param resetError - 重置错误边界的函数,调用后可以尝试重新渲染子组件\n * @returns 错误 UI 的 React 节点\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * import { Result, Button } from 'antd';\n * \n * start({\n * errorFallback: (error, reset) => (\n * <Result\n * status=\"error\"\n * title=\"自定义错误标题\"\n * subTitle={error.message}\n * extra={<Button onClick={reset}>重试</Button>}\n * />\n * ),\n * });\n * ```\n */\n errorFallback?: (error: FrameworkError, resetError: () => void) => ReactNode;\n\n /**\n * 安全配置选项\n * \n * 用于配置框架的安全策略,包括 XSS 防护、配置验证等。\n * 框架默认启用所有安全策略,确保应用安全。\n * \n * @example\n * ```typescript\n * start({\n * security: {\n * enableXSSProtection: true, // 默认启用\n * validateConfig: true, // 默认启用\n * sanitizeUserInput: true, // 默认启用\n * },\n * });\n * ```\n */\n security?: {\n /**\n * 是否启用 XSS 防护\n * @default true\n */\n enableXSSProtection?: boolean;\n /**\n * 是否验证配置项安全性\n * @default true\n */\n validateConfig?: boolean;\n /**\n * 是否清理用户输入\n * @default true\n */\n sanitizeUserInput?: boolean;\n /**\n * CSP(内容安全策略)配置\n */\n csp?: {\n defaultSrc?: string[];\n scriptSrc?: string[];\n styleSrc?: string[];\n imgSrc?: string[];\n connectSrc?: string[];\n fontSrc?: string[];\n frameSrc?: string[];\n allowUnsafeInline?: boolean;\n allowUnsafeEval?: boolean;\n };\n /**\n * CSRF 防护配置\n */\n csrf?: {\n /**\n * 是否启用 CSRF 防护\n * @default true\n */\n enabled?: boolean;\n /**\n * CSRF Token 获取函数\n * 如果不提供,框架会自动从 cookie 或 header 中获取\n */\n getToken?: () => string | Promise<string>;\n /**\n * CSRF Token 验证函数\n * 如果不提供,框架会使用默认验证逻辑\n */\n validateToken?: (token: string) => boolean | Promise<boolean>;\n /**\n * CSRF Token 请求头名称\n * @default 'X-CSRF-Token'\n */\n headerName?: string;\n /**\n * CSRF Token Cookie 名称\n * @default 'csrf-token'\n */\n cookieName?: string;\n };\n };\n \n /**\n * 服务初始化重试配置\n * \n * 用于配置服务初始化失败时的重试策略。\n * \n * @example\n * ```typescript\n * start({\n * serviceRetry: {\n * maxRetries: 3,\n * retryDelay: 1000,\n * exponentialBackoff: true,\n * },\n * });\n * ```\n */\n serviceRetry?: {\n /**\n * 最大重试次数\n * @default 3\n */\n maxRetries?: number;\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n /**\n * 是否启用指数退避\n * @default true\n */\n exponentialBackoff?: boolean;\n };\n}\n\n/**\n * 自定义启动屏组件的 Props\n */\nexport interface SplashScreenCustomProps {\n /**\n * 初始化进度(0-100)\n */\n progress: number;\n\n /**\n * 当前步骤描述\n */\n currentStep: string;\n\n /**\n * 是否正在初始化\n */\n isInitializing: boolean;\n}"],"names":[],"mappings":"AAqdA;;CAEC,GACD,WAeC"}
1
+ {"version":3,"sources":["../../src/core/types.ts"],"sourcesContent":["import { LogLevel } from '../utils';\nimport type { LangType } from '../library/locale/types';\nimport { Container, RootOptions } from 'react-dom/client';\nimport { type ReactElement, type ReactNode } from 'react';\nimport { type InitializationContext, type ConfigStrategy } from './initialization';\nimport type { StorageOptions } from '../types';\nimport type { ConfigProviderProps, AppProps } from \"antd\";\nimport type { ThemeConfig } from './app';\nimport type { FrameworkError } from '../utils/errors';\nimport type { RouterConfig } from './router/types';\n\n/**\n * 生命周期钩子函数类型\n */\nexport type ManagerLifecycle = {\n /**\n * 在初始化之前执行\n */\n beforeInitialization?: () => Promise<void> | void;\n\n /**\n * 初始化\n */\n initialization?: () => Promise<void> | void;\n\n /**\n * 在初始化之后执行\n * \n * @param context - 初始化上下文,包含配置、进度、耗时等信息\n * \n * @example\n * ```typescript\n * start({\n * lifecycle: {\n * afterInitialization: (context) => {\n * console.log('初始化完成', context);\n * },\n * },\n * });\n * ```\n */\n afterInitialization?: (context: InitializationContext) => Promise<void> | void;\n};\n\n\n/**\n * 启动配置选项\n */\nexport interface StartOptions {\n /**\n * React 应用的挂载容器\n * \n * 用于指定 React 应用渲染的目标 DOM 元素。如果不提供,框架将自动查找页面中\n * 的根元素(通常为 id=\"root\" 的元素)作为默认容器。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * // 使用默认容器(自动查找 id=\"root\" 的元素)\n * start({});\n * \n * // 指定自定义容器\n * const container = document.getElementById('app');\n * start({ container });\n * ```\n */\n container?: Container;\n /**\n * React 根节点的配置选项\n * \n * 用于配置 React 18+ 的 createRoot 方法的选项,包括:\n * - `onRecoverableError`: 错误恢复回调函数\n * - `identifierPrefix`: 用于标识符前缀,用于服务端渲染的 hydration\n * \n * 这些选项将传递给 `react-dom/client` 的 `createRoot` 方法。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * rootOptions: {\n * onRecoverableError: (error) => {\n * console.error('React 错误恢复:', error);\n * },\n * identifierPrefix: 'my-app-',\n * },\n * });\n * ```\n */\n rootOptions?: RootOptions;\n /**\n * 应用根组件\n * \n * 用于指定要渲染的 React 应用根组件。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * import App from './App';\n * \n * start({\n * app: <App />,\n * });\n * ```\n */\n app?: ReactElement;\n /**\n * 是否显示启动页\n * - 'auto': 自动判断(推荐)\n * - 'always': 总是显示\n * - 'never': 从不显示\n * - 'first-time-only': 仅首次加载显示\n * \n * @default 'auto'\n */\n showSplashScreen?: 'auto' | 'always' | 'never' | 'first-time-only';\n\n /**\n * 启动页最小显示时间(毫秒)\n * \n * 用于避免启动页闪烁,确保用户能看到启动过程。\n * 如果初始化完成时间小于此值,将等待至最小时间后再隐藏启动页。\n * \n * @default 500\n * \n * @example\n * ```typescript\n * start({\n * minSplashScreenTime: 1000, // 至少显示 1 秒\n * });\n * ```\n */\n minSplashScreenTime?: number;\n\n /**\n * 路由配置\n * \n * 配置应用的路由系统,支持内置路由、自定义路由和禁用路由三种模式。\n * \n * @example\n * ```typescript\n * start({\n * router: {\n * enabled: true,\n * routes: [\n * {\n * path: '/login',\n * page: LoginPage,\n * },\n * {\n * path: '/',\n * layout: MainLayout,\n * children: [\n * {\n * path: 'dashboard',\n * page: DashboardPage,\n * meta: { title: '仪表盘' },\n * },\n * ],\n * },\n * ],\n * },\n * });\n * ```\n */\n router?: RouterConfig;\n /**\n * 日志级别\n */\n loggerLevel?: LogLevel;\n /**\n * 生命周期钩子\n */\n lifecycle?: ManagerLifecycle;\n /**\n * 国际化\n */\n locale?: Record<LangType, Record<string, unknown>>;\n /**\n * 配置加载策略\n */\n configStrategy?: ConfigStrategy;\n /**\n * 启动页完成回调\n * 仅在显示启动页时,启动页完成初始化后调用\n * 可以在这里执行额外的操作,然后调用 complete() 继续\n * \n * @example\n * ```typescript\n * start({\n * onSplashComplete: (complete, context) => {\n * // 执行额外操作\n * await doSomething();\n * // 完成后继续\n * complete();\n * },\n * });\n * ```\n */\n onSplashComplete?: (\n complete: () => void,\n context: InitializationContext\n ) => Promise<void> | void;\n\n /**\n * 存储配置\n */\n storageOptions?: StorageOptions;\n\n /**\n * IndexedDB 表名\n */\n indexedDBTableName?: string;\n\n /**\n * antd 配置\n */\n antd?: ConfigProviderProps;\n\n /**\n * antd App 组件配置\n * \n * 用于配置 antd 的 App 组件,使 message、modal、notification 等静态方法能够正确使用。\n * \n * @example\n * ```typescript\n * start({\n * antdApp: {\n * message: { maxCount: 3 },\n * notification: { placement: 'topRight' },\n * },\n * });\n * ```\n */\n antdApp?: AppProps;\n\n /**\n * 主题配置\n * \n * @example\n * ```typescript\n * start({\n * theme: {\n * mode: 'dark',\n * primaryColor: '#1890ff',\n * },\n * });\n * ```\n */\n theme?: ThemeConfig;\n\n /**\n * 运行时安全配置\n */\n runtimeSecurity?: import('../utils/runtimeSecurity').RuntimeSecurityOptions;\n\n /**\n * 配置安全选项\n */\n configSecurity?: import('../utils/configSecurity').ConfigSecurityOptions;\n\n /**\n * 性能监控配置\n */\n performanceMonitor?: import('../utils/performance').PerformanceMonitorConfig;\n\n /**\n * 错误监控配置\n */\n errorMonitor?: import('../utils/monitoring').ErrorMonitorConfig;\n\n /**\n * 分析服务配置\n */\n analytics?: import('../utils/analytics').AnalyticsConfig;\n\n /**\n * 状态管理器配置\n * \n * 配置框架的状态管理器,支持自定义适配器和作用域设置。\n * 如果不提供,将使用默认配置创建状态管理器。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * stateManager: {\n * enableRegistry: true,\n * defaultScope: 'app',\n * devMode: true,\n * },\n * });\n * ```\n */\n stateManager?: import('../state').StateManagerOptions;\n\n /**\n * 事件总线配置\n * \n * 配置应用级事件系统,支持事件追踪、性能监控、安全模式等。\n * 如果不提供,将使用默认配置创建事件总线。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * start({\n * eventBus: {\n * enableTracking: true,\n * maxHistorySize: 200,\n * enablePerformanceMonitoring: true,\n * namespacePrefix: 'my-app:',\n * },\n * });\n * ```\n */\n eventBus?: {\n enableTracking?: boolean;\n maxHistorySize?: number;\n enableValidation?: boolean;\n validator?: (event: string, data: unknown) => boolean;\n enablePerformanceMonitoring?: boolean;\n namespacePrefix?: string;\n instanceId?: string;\n enableSecurityMode?: boolean;\n allowedSources?: string[];\n };\n\n /**\n * 自定义启动屏组件\n * \n * 如果提供,将使用自定义组件替代默认的启动屏 UI。\n * 自定义组件将接收初始化进度、当前步骤和初始化状态作为 props。\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * \n * const CustomSplashScreen = ({ progress, currentStep, isInitializing }) => {\n * return (\n * <div>\n * <h1>加载中...</h1>\n * <div>进度: {progress}%</div>\n * <div>步骤: {currentStep}</div>\n * </div>\n * );\n * };\n * \n * start({\n * splashScreen: CustomSplashScreen,\n * });\n * ```\n */\n splashScreen?: React.ComponentType<SplashScreenCustomProps>;\n\n /**\n * 自定义错误反馈组件\n * \n * 如果提供,将使用自定义的错误 UI 替代默认的错误 UI(基于 antd 的 Result 组件)。\n * 自定义组件将接收错误对象和重置函数作为参数。\n * \n * @param error - 标准化后的框架错误对象\n * @param resetError - 重置错误边界的函数,调用后可以尝试重新渲染子组件\n * @returns 错误 UI 的 React 节点\n * \n * @example\n * ```typescript\n * import { start } from '@vlian/framework';\n * import { Result, Button } from 'antd';\n * \n * start({\n * errorFallback: (error, reset) => (\n * <Result\n * status=\"error\"\n * title=\"自定义错误标题\"\n * subTitle={error.message}\n * extra={<Button onClick={reset}>重试</Button>}\n * />\n * ),\n * });\n * ```\n */\n errorFallback?: (error: FrameworkError, resetError: () => void) => ReactNode;\n\n /**\n * 安全配置选项\n * \n * 用于配置框架的安全策略,包括 XSS 防护、配置验证等。\n * 框架默认启用所有安全策略,确保应用安全。\n * \n * @example\n * ```typescript\n * start({\n * security: {\n * enableXSSProtection: true, // 默认启用\n * validateConfig: true, // 默认启用\n * sanitizeUserInput: true, // 默认启用\n * },\n * });\n * ```\n */\n security?: {\n /**\n * 是否启用 XSS 防护\n * @default true\n */\n enableXSSProtection?: boolean;\n /**\n * 是否验证配置项安全性\n * @default true\n */\n validateConfig?: boolean;\n /**\n * 是否清理用户输入\n * @default true\n */\n sanitizeUserInput?: boolean;\n /**\n * CSP(内容安全策略)配置\n */\n csp?: {\n defaultSrc?: string[];\n scriptSrc?: string[];\n styleSrc?: string[];\n imgSrc?: string[];\n connectSrc?: string[];\n fontSrc?: string[];\n frameSrc?: string[];\n allowUnsafeInline?: boolean;\n allowUnsafeEval?: boolean;\n };\n /**\n * CSRF 防护配置\n */\n csrf?: {\n /**\n * 是否启用 CSRF 防护\n * @default true\n */\n enabled?: boolean;\n /**\n * CSRF Token 获取函数\n * 如果不提供,框架会自动从 cookie 或 header 中获取\n */\n getToken?: () => string | Promise<string>;\n /**\n * CSRF Token 验证函数\n * 如果不提供,框架会使用默认验证逻辑\n */\n validateToken?: (token: string) => boolean | Promise<boolean>;\n /**\n * CSRF Token 请求头名称\n * @default 'X-CSRF-Token'\n */\n headerName?: string;\n /**\n * CSRF Token Cookie 名称\n * @default 'csrf-token'\n */\n cookieName?: string;\n };\n };\n \n /**\n * 服务初始化重试配置\n * \n * 用于配置服务初始化失败时的重试策略。\n * \n * @example\n * ```typescript\n * start({\n * serviceRetry: {\n * maxRetries: 3,\n * retryDelay: 1000,\n * exponentialBackoff: true,\n * },\n * });\n * ```\n */\n serviceRetry?: {\n /**\n * 最大重试次数\n * @default 3\n */\n maxRetries?: number;\n /**\n * 重试延迟(毫秒)\n * @default 1000\n */\n retryDelay?: number;\n /**\n * 是否启用指数退避\n * @default true\n */\n exponentialBackoff?: boolean;\n };\n}\n\n/**\n * 自定义启动屏组件的 Props\n */\nexport interface SplashScreenCustomProps {\n /**\n * 初始化进度(0-100)\n */\n progress: number;\n\n /**\n * 当前步骤描述\n */\n currentStep: string;\n\n /**\n * 是否正在初始化\n */\n isInitializing: boolean;\n}"],"names":[],"mappings":"AAqfA;;CAEC,GACD,WAeC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vlian/framework",
3
- "version": "1.0.1",
3
+ "version": "1.0.4",
4
4
  "private": false,
5
5
  "packageManager": "pnpm@10.27.0",
6
6
  "description": "Secra Framework - 一个现代化的低代码框架",
@@ -40,8 +40,7 @@
40
40
  "test:run": "vitest run",
41
41
  "test:coverage": "vitest run --coverage",
42
42
  "lint": "eslint src --ext .ts,.tsx",
43
- "format": "prettier --write \"src/**/*.{ts,tsx,json,md}\"",
44
- "publish": "npm publish --access public"
43
+ "format": "prettier --write \"src/**/*.{ts,tsx,json,md}\""
45
44
  },
46
45
  "keywords": [
47
46
  "framework",