@vlian/framework 1.2.16 → 1.2.19

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 (58) hide show
  1. package/dist/analytics.umd.js +1 -1
  2. package/dist/core/router/RouterManager.cjs +52 -3
  3. package/dist/core/router/RouterManager.cjs.map +1 -1
  4. package/dist/core/router/RouterManager.d.ts +5 -0
  5. package/dist/core/router/RouterManager.js +53 -4
  6. package/dist/core/router/RouterManager.js.map +1 -1
  7. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +1 -1
  8. package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +1 -1
  9. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +1 -1
  10. package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +1 -1
  11. package/dist/core/router/dev/RouterDevTools.cjs.map +1 -1
  12. package/dist/core/router/dev/RouterDevTools.js.map +1 -1
  13. package/dist/core/router/middleware/RouterMiddlewareManager.cjs +24 -4
  14. package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +1 -1
  15. package/dist/core/router/middleware/RouterMiddlewareManager.d.ts +1 -0
  16. package/dist/core/router/middleware/RouterMiddlewareManager.js +24 -4
  17. package/dist/core/router/middleware/RouterMiddlewareManager.js.map +1 -1
  18. package/dist/core/router/middleware/types.cjs.map +1 -1
  19. package/dist/core/router/middleware/types.d.ts +1 -1
  20. package/dist/core/router/middleware/types.js.map +1 -1
  21. package/dist/core/router/navigation/RouterNavigation.cjs +69 -14
  22. package/dist/core/router/navigation/RouterNavigation.cjs.map +1 -1
  23. package/dist/core/router/navigation/RouterNavigation.d.ts +3 -0
  24. package/dist/core/router/navigation/RouterNavigation.js +69 -14
  25. package/dist/core/router/navigation/RouterNavigation.js.map +1 -1
  26. package/dist/core/router/performance/RouteCache.cjs +34 -13
  27. package/dist/core/router/performance/RouteCache.cjs.map +1 -1
  28. package/dist/core/router/performance/RouteCache.d.ts +8 -2
  29. package/dist/core/router/performance/RouteCache.js +34 -13
  30. package/dist/core/router/performance/RouteCache.js.map +1 -1
  31. package/dist/core/router/performance/RoutePreloader.cjs +89 -22
  32. package/dist/core/router/performance/RoutePreloader.cjs.map +1 -1
  33. package/dist/core/router/performance/RoutePreloader.d.ts +9 -1
  34. package/dist/core/router/performance/RoutePreloader.js +89 -22
  35. package/dist/core/router/performance/RoutePreloader.js.map +1 -1
  36. package/dist/core/router/types.d.ts +31 -5
  37. package/dist/core/router/types.js.map +1 -1
  38. package/dist/core/router/utils/adapters/react-router/transform.cjs +43 -65
  39. package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
  40. package/dist/core/router/utils/adapters/react-router/transform.d.ts +1 -1
  41. package/dist/core/router/utils/adapters/react-router/transform.js +43 -60
  42. package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
  43. package/dist/core/router/utils/transform.cjs +79 -70
  44. package/dist/core/router/utils/transform.cjs.map +1 -1
  45. package/dist/core/router/utils/transform.d.ts +1 -1
  46. package/dist/core/router/utils/transform.js +80 -71
  47. package/dist/core/router/utils/transform.js.map +1 -1
  48. package/dist/core/router/validation/RouterConfigValidator.d.ts +68 -4
  49. package/dist/core/router/validation/schema.cjs +72 -2
  50. package/dist/core/router/validation/schema.cjs.map +1 -1
  51. package/dist/core/router/validation/schema.d.ts +105 -6
  52. package/dist/core/router/validation/schema.js +72 -2
  53. package/dist/core/router/validation/schema.js.map +1 -1
  54. package/dist/index.umd.js +705 -431
  55. package/dist/index.umd.js.map +1 -1
  56. package/dist/request.umd.js +1 -1
  57. package/dist/state.umd.js +1 -1
  58. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @vlian/framework v1.2.16
2
+ * @vlian/framework v1.2.19
3
3
  * Secra Framework - 一个现代化的低代码框架
4
4
  * (c) 2026 Secra Framework Contributors
5
5
  * Licensed under Apache-2.0
@@ -90,6 +90,9 @@ let RouterManager = class RouterManager {
90
90
  if (!config.routes) {
91
91
  throw new _errors.RouterError('路由配置不能为空', _errors.RouterErrorCode.ROUTER_CONFIG_ERROR);
92
92
  }
93
+ // 更新预加载策略(默认关闭,按需懒加载)
94
+ this.preloader.updateConfig(config.preload);
95
+ this.preloader.clear();
93
96
  let result;
94
97
  const cacheKey = config.routes;
95
98
  const cachedResult = this.cache.get(cacheKey);
@@ -110,13 +113,15 @@ let RouterManager = class RouterManager {
110
113
  // 缓存转换结果
111
114
  this.cache.set(cacheKey, result);
112
115
  }
113
- const reactRoutes = await (0, _transform1.transformRoutesToReactRoutes)(result.routes, result, config.defaultRouteErrorComponent, config.defaultRouteLoadingComponent);
116
+ const enableHydrateFallback = config.enableHydrateFallback ?? Boolean(config.options?.hydrationData);
117
+ const reactRoutes = await (0, _transform1.transformRoutesToReactRoutes)(result.routes, result, config.defaultRouteErrorComponent, config.defaultRouteLoadingComponent, enableHydrateFallback);
114
118
  // 注册路由到预加载器
115
119
  if (result.routes) {
116
- this.preloader.registerRoutes(result.routes);
120
+ this.preloader.registerRoutes(result.routes, result);
117
121
  // 开始预加载
118
122
  this.preloader.startPreload();
119
123
  }
124
+ await this.resolveInitialLazyRoutes(reactRoutes, !enableHydrateFallback);
120
125
  let routerInstance = null;
121
126
  if (config.mode === 'browser') {
122
127
  routerInstance = (0, _reactrouterdom.createBrowserRouter)(reactRoutes, config.options);
@@ -139,14 +144,58 @@ let RouterManager = class RouterManager {
139
144
  routes: result.routes
140
145
  });
141
146
  // 记录监控:路由初始化完成
147
+ const initialPath = typeof window !== 'undefined' ? `${window.location.pathname}${window.location.search}${window.location.hash}` : this.router?.state?.location?.pathname ?? '/';
142
148
  this.monitoring.trackRouteAccess({
143
- path: window.location.pathname,
149
+ path: initialPath,
144
150
  meta: {
145
151
  name: 'router-init'
146
152
  }
147
153
  }, undefined, true);
148
154
  _utils.logger.info('路由管理器初始化完成');
149
155
  }
156
+ /**
157
+ * 预解析 lazy 路由,避免首屏或重定向链路长时间停留在 hydrate fallback。
158
+ * resolveAll=true 时会在初始化阶段解析全部 lazy 路由。
159
+ */ async resolveInitialLazyRoutes(routes, resolveAll = false) {
160
+ if (typeof window === 'undefined') {
161
+ return;
162
+ }
163
+ let targetRoutes = [];
164
+ if (resolveAll) {
165
+ const stack = [
166
+ ...routes
167
+ ];
168
+ while(stack.length > 0){
169
+ const current = stack.shift();
170
+ if (!current) {
171
+ continue;
172
+ }
173
+ targetRoutes.push(current);
174
+ if (current.children && current.children.length > 0) {
175
+ stack.push(...current.children);
176
+ }
177
+ }
178
+ } else {
179
+ const matches = (0, _reactrouterdom.matchRoutes)(routes, window.location.pathname) ?? [];
180
+ if (matches.length === 0) {
181
+ return;
182
+ }
183
+ targetRoutes = matches.map((match)=>match.route);
184
+ }
185
+ await Promise.all(targetRoutes.map(async (route)=>{
186
+ const lazy = route.lazy;
187
+ if (typeof lazy !== 'function') {
188
+ return;
189
+ }
190
+ try {
191
+ const resolved = await lazy();
192
+ Object.assign(route, resolved);
193
+ delete route.lazy;
194
+ } catch (error) {
195
+ _utils.logger.warn('首屏路由懒加载预解析失败,回退到 Router 默认懒加载', error);
196
+ }
197
+ }));
198
+ }
150
199
  /**
151
200
  * 获取路由实例
152
201
  *
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/router/RouterManager.ts"],"sourcesContent":["import { logger } from '../../utils';\nimport type { RouterConfig } from './types';\nimport { transformRoutes } from './utils/transform';\nimport { transformRoutesToReactRoutes } from './utils/adapters/react-router/transform';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter } from 'react-router-dom';\nimport { RouterConfigValidator } from './validation';\nimport { getRouterLifecycleManager } from './lifecycle';\nimport { getRouterMiddlewareManager } from './middleware';\nimport { RouterError, RouterErrorCode } from './errors';\nimport { getRouteCache } from './performance/RouteCache';\nimport { getRoutePreloader } from './performance/RoutePreloader';\nimport { getRouterPluginManager, PluginLifecycleStage } from './plugin';\nimport { getRouterMonitoring } from './monitoring';\nimport { getAdapterManager } from './adapter';\nimport { createReactRouterAdapter } from './adapter/react-router';\n\nexport class RouterManager {\n private static instance: RouterManager | null = null;\n\n /**\n * 路由实例\n * 只能在 initialize 方法中赋值\n */\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 是否已初始化\n */\n private initialized = false;\n\n /**\n * 路由缓存实例\n */\n private cache = getRouteCache();\n\n /**\n * 路由预加载器实例\n */\n private preloader = getRoutePreloader();\n\n /**\n * 路由插件管理器实例\n */\n private pluginManager = getRouterPluginManager();\n\n /**\n * 路由监控服务实例\n */\n private monitoring = getRouterMonitoring();\n\n /**\n * 路由适配器管理器实例\n */\n private adapterManager = getAdapterManager();\n\n private constructor() {\n // 私有构造函数\n // 注册默认的 React Router 适配器\n this.adapterManager.register({\n name: 'react-router',\n factory: createReactRouterAdapter(),\n priority: 10,\n });\n }\n /**\n * 获取单例实例\n */\n static getInstance(): RouterManager {\n if (!RouterManager.instance) {\n RouterManager.instance = new RouterManager();\n }\n return RouterManager.instance;\n }\n /**\n * 初始化路由管理器\n * \n * @param config - 路由配置\n * @param _appInstance - 应用实例(保留用于兼容性,当前未使用)\n */\n async initialize(config: RouterConfig): Promise<void> {\n // 如果路由被禁用,直接返回\n if (config.enabled === false || config.enabled === 'disabled') {\n logger.info('路由系统已禁用');\n return;\n }\n\n // 配置验证(如果启用)\n if (config.enableValidation !== false) {\n try {\n RouterConfigValidator.validate(config);\n logger.debug('路由配置验证通过');\n } catch (error) {\n logger.error('路由配置验证失败', error);\n // 开发环境下抛出错误,生产环境下记录警告但继续执行\n if (process.env.NODE_ENV === 'development') {\n throw error;\n }\n }\n }\n\n // 执行插件钩子:路由初始化前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_INIT, {\n config,\n });\n\n // 注册生命周期钩子\n if (config.hooks) {\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.register(config.hooks);\n logger.debug('路由生命周期钩子已注册');\n }\n\n // 转换数据(使用缓存)\n if (!config.routes) {\n throw new RouterError(\n '路由配置不能为空',\n RouterErrorCode.ROUTER_CONFIG_ERROR\n );\n }\n\n let result;\n const cacheKey = config.routes;\n const cachedResult = this.cache.get(cacheKey);\n\n if (cachedResult) {\n logger.debug('使用缓存的路由转换结果');\n result = cachedResult;\n } else {\n // 执行插件钩子:路由转换前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_TRANSFORM, {\n config,\n });\n\n result = await transformRoutes(config.routes, config.transformOptions);\n\n // 执行插件钩子:路由转换后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_TRANSFORM, {\n config,\n routes: result.routes,\n });\n\n // 缓存转换结果\n this.cache.set(cacheKey, result);\n }\n\n const reactRoutes = await transformRoutesToReactRoutes(result.routes, result, config.defaultRouteErrorComponent, config.defaultRouteLoadingComponent);\n\n // 注册路由到预加载器\n if (result.routes) {\n this.preloader.registerRoutes(result.routes);\n // 开始预加载\n this.preloader.startPreload();\n }\n\n let routerInstance: ReturnType<typeof createBrowserRouter> | null = null;\n if (config.mode === 'browser') {\n routerInstance = createBrowserRouter(reactRoutes, config.options);\n } else if (config.mode === 'hash') {\n routerInstance = createHashRouter(reactRoutes, config.options);\n } else if (config.mode === 'memory') {\n routerInstance = createMemoryRouter(reactRoutes, config.options);\n }\n\n if (!routerInstance) {\n throw new RouterError(\n '路由模式不支持',\n RouterErrorCode.ROUTER_CONFIG_ERROR,\n undefined,\n undefined,\n { mode: config.mode }\n );\n }\n\n // 只能在 initialize 方法中赋值\n this.router = routerInstance;\n this.initialized = true;\n\n // 执行插件钩子:路由初始化后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_INIT, {\n config,\n routes: result.routes,\n });\n\n // 记录监控:路由初始化完成\n this.monitoring.trackRouteAccess(\n {\n path: window.location.pathname,\n meta: { name: 'router-init' },\n },\n undefined,\n true\n );\n\n logger.info('路由管理器初始化完成');\n }\n\n /**\n * 获取路由实例\n * \n * @returns 路由实例,如果未初始化则返回 null\n */\n getRouter(): ReturnType<typeof createBrowserRouter> | null {\n return this.router;\n }\n\n /**\n * 检查是否已初始化\n * \n * @returns 如果已初始化返回 true,否则返回 false\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * 销毁路由管理器\n */\n destroy(): void {\n // 执行插件钩子:销毁\n this.pluginManager.executeHooks(PluginLifecycleStage.DESTROY, {\n config: {} as RouterConfig,\n });\n\n // 停止预加载\n this.preloader.stopPreload();\n\n this.router = null;\n this.initialized = false;\n \n // 清空生命周期钩子和中间件\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.clear();\n \n const middlewareManager = getRouterMiddlewareManager();\n middlewareManager.clear();\n \n logger.info('路由管理器已销毁');\n }\n\n /**\n * 获取路由缓存实例\n */\n getCache() {\n return this.cache;\n }\n\n /**\n * 获取路由预加载器实例\n */\n getPreloader() {\n return this.preloader;\n }\n\n /**\n * 获取路由插件管理器实例\n */\n getPluginManager() {\n return this.pluginManager;\n }\n\n /**\n * 获取路由监控服务实例\n */\n getMonitoring() {\n return this.monitoring;\n }\n}\n\n/**\n * 获取路由管理器\n */\nexport function getRouterManager(): RouterManager {\n return RouterManager.getInstance();\n}"],"names":["RouterManager","getRouterManager","getInstance","instance","initialize","config","enabled","logger","info","enableValidation","RouterConfigValidator","validate","debug","error","process","env","NODE_ENV","pluginManager","executeHooks","PluginLifecycleStage","BEFORE_INIT","hooks","lifecycleManager","getRouterLifecycleManager","register","routes","RouterError","RouterErrorCode","ROUTER_CONFIG_ERROR","result","cacheKey","cachedResult","cache","get","BEFORE_TRANSFORM","transformRoutes","transformOptions","AFTER_TRANSFORM","set","reactRoutes","transformRoutesToReactRoutes","defaultRouteErrorComponent","defaultRouteLoadingComponent","preloader","registerRoutes","startPreload","routerInstance","mode","createBrowserRouter","options","createHashRouter","createMemoryRouter","undefined","router","initialized","AFTER_INIT","monitoring","trackRouteAccess","path","window","location","pathname","meta","name","getRouter","isInitialized","destroy","DESTROY","stopPreload","clear","middlewareManager","getRouterMiddlewareManager","getCache","getPreloader","getPluginManager","getMonitoring","getRouteCache","getRoutePreloader","getRouterPluginManager","getRouterMonitoring","adapterManager","getAdapterManager","factory","createReactRouterAdapter","priority"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/core/router/RouterManager.ts"],"sourcesContent":["import { logger } from '../../utils';\nimport type { RouterConfig } from './types';\nimport { transformRoutes } from './utils/transform';\nimport { transformRoutesToReactRoutes } from './utils/adapters/react-router/transform';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter, matchRoutes, type RouteObject } from 'react-router-dom';\nimport { RouterConfigValidator } from './validation';\nimport { getRouterLifecycleManager } from './lifecycle';\nimport { getRouterMiddlewareManager } from './middleware';\nimport { RouterError, RouterErrorCode } from './errors';\nimport { getRouteCache } from './performance/RouteCache';\nimport { getRoutePreloader } from './performance/RoutePreloader';\nimport { getRouterPluginManager, PluginLifecycleStage } from './plugin';\nimport { getRouterMonitoring } from './monitoring';\nimport { getAdapterManager } from './adapter';\nimport { createReactRouterAdapter } from './adapter/react-router';\n\nexport class RouterManager {\n private static instance: RouterManager | null = null;\n\n /**\n * 路由实例\n * 只能在 initialize 方法中赋值\n */\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 是否已初始化\n */\n private initialized = false;\n\n /**\n * 路由缓存实例\n */\n private cache = getRouteCache();\n\n /**\n * 路由预加载器实例\n */\n private preloader = getRoutePreloader();\n\n /**\n * 路由插件管理器实例\n */\n private pluginManager = getRouterPluginManager();\n\n /**\n * 路由监控服务实例\n */\n private monitoring = getRouterMonitoring();\n\n /**\n * 路由适配器管理器实例\n */\n private adapterManager = getAdapterManager();\n\n private constructor() {\n // 私有构造函数\n // 注册默认的 React Router 适配器\n this.adapterManager.register({\n name: 'react-router',\n factory: createReactRouterAdapter(),\n priority: 10,\n });\n }\n /**\n * 获取单例实例\n */\n static getInstance(): RouterManager {\n if (!RouterManager.instance) {\n RouterManager.instance = new RouterManager();\n }\n return RouterManager.instance;\n }\n /**\n * 初始化路由管理器\n * \n * @param config - 路由配置\n * @param _appInstance - 应用实例(保留用于兼容性,当前未使用)\n */\n async initialize(config: RouterConfig): Promise<void> {\n // 如果路由被禁用,直接返回\n if (config.enabled === false || config.enabled === 'disabled') {\n logger.info('路由系统已禁用');\n return;\n }\n\n // 配置验证(如果启用)\n if (config.enableValidation !== false) {\n try {\n RouterConfigValidator.validate(config);\n logger.debug('路由配置验证通过');\n } catch (error) {\n logger.error('路由配置验证失败', error);\n // 开发环境下抛出错误,生产环境下记录警告但继续执行\n if (process.env.NODE_ENV === 'development') {\n throw error;\n }\n }\n }\n\n // 执行插件钩子:路由初始化前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_INIT, {\n config,\n });\n\n // 注册生命周期钩子\n if (config.hooks) {\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.register(config.hooks);\n logger.debug('路由生命周期钩子已注册');\n }\n\n // 转换数据(使用缓存)\n if (!config.routes) {\n throw new RouterError(\n '路由配置不能为空',\n RouterErrorCode.ROUTER_CONFIG_ERROR\n );\n }\n\n // 更新预加载策略(默认关闭,按需懒加载)\n this.preloader.updateConfig(config.preload);\n this.preloader.clear();\n\n let result;\n const cacheKey = config.routes;\n const cachedResult = this.cache.get(cacheKey);\n\n if (cachedResult) {\n logger.debug('使用缓存的路由转换结果');\n result = cachedResult;\n } else {\n // 执行插件钩子:路由转换前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_TRANSFORM, {\n config,\n });\n\n result = await transformRoutes(config.routes, config.transformOptions);\n\n // 执行插件钩子:路由转换后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_TRANSFORM, {\n config,\n routes: result.routes,\n });\n\n // 缓存转换结果\n this.cache.set(cacheKey, result);\n }\n\n const enableHydrateFallback =\n config.enableHydrateFallback\n ?? Boolean((config.options as { hydrationData?: unknown } | undefined)?.hydrationData);\n\n const reactRoutes = await transformRoutesToReactRoutes(\n result.routes,\n result,\n config.defaultRouteErrorComponent,\n config.defaultRouteLoadingComponent,\n enableHydrateFallback,\n );\n\n // 注册路由到预加载器\n if (result.routes) {\n this.preloader.registerRoutes(result.routes, result);\n // 开始预加载\n this.preloader.startPreload();\n }\n\n await this.resolveInitialLazyRoutes(reactRoutes, !enableHydrateFallback);\n\n let routerInstance: ReturnType<typeof createBrowserRouter> | null = null;\n if (config.mode === 'browser') {\n routerInstance = createBrowserRouter(reactRoutes, config.options);\n } else if (config.mode === 'hash') {\n routerInstance = createHashRouter(reactRoutes, config.options);\n } else if (config.mode === 'memory') {\n routerInstance = createMemoryRouter(reactRoutes, config.options);\n }\n\n if (!routerInstance) {\n throw new RouterError(\n '路由模式不支持',\n RouterErrorCode.ROUTER_CONFIG_ERROR,\n undefined,\n undefined,\n { mode: config.mode }\n );\n }\n\n // 只能在 initialize 方法中赋值\n this.router = routerInstance;\n this.initialized = true;\n\n // 执行插件钩子:路由初始化后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_INIT, {\n config,\n routes: result.routes,\n });\n\n // 记录监控:路由初始化完成\n const initialPath = typeof window !== 'undefined'\n ? `${window.location.pathname}${window.location.search}${window.location.hash}`\n : this.router?.state?.location?.pathname ?? '/';\n\n this.monitoring.trackRouteAccess(\n {\n path: initialPath,\n meta: { name: 'router-init' },\n },\n undefined,\n true\n );\n\n logger.info('路由管理器初始化完成');\n }\n\n /**\n * 预解析 lazy 路由,避免首屏或重定向链路长时间停留在 hydrate fallback。\n * resolveAll=true 时会在初始化阶段解析全部 lazy 路由。\n */\n private async resolveInitialLazyRoutes(routes: RouteObject[], resolveAll: boolean = false): Promise<void> {\n if (typeof window === 'undefined') {\n return;\n }\n\n let targetRoutes: RouteObject[] = [];\n if (resolveAll) {\n const stack = [...routes];\n while (stack.length > 0) {\n const current = stack.shift();\n if (!current) {\n continue;\n }\n targetRoutes.push(current);\n if (current.children && current.children.length > 0) {\n stack.push(...current.children);\n }\n }\n } else {\n const matches = matchRoutes(routes, window.location.pathname) ?? [];\n if (matches.length === 0) {\n return;\n }\n targetRoutes = matches.map((match) => match.route);\n }\n\n await Promise.all(\n targetRoutes.map(async (route) => {\n const lazy = route.lazy;\n if (typeof lazy !== 'function') {\n return;\n }\n\n try {\n const resolved = await lazy();\n Object.assign(route, resolved);\n delete (route as RouteObject & { lazy?: unknown }).lazy;\n } catch (error) {\n logger.warn('首屏路由懒加载预解析失败,回退到 Router 默认懒加载', error);\n }\n }),\n );\n }\n\n /**\n * 获取路由实例\n * \n * @returns 路由实例,如果未初始化则返回 null\n */\n getRouter(): ReturnType<typeof createBrowserRouter> | null {\n return this.router;\n }\n\n /**\n * 检查是否已初始化\n * \n * @returns 如果已初始化返回 true,否则返回 false\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * 销毁路由管理器\n */\n destroy(): void {\n // 执行插件钩子:销毁\n this.pluginManager.executeHooks(PluginLifecycleStage.DESTROY, {\n config: {} as RouterConfig,\n });\n\n // 停止预加载\n this.preloader.stopPreload();\n\n this.router = null;\n this.initialized = false;\n \n // 清空生命周期钩子和中间件\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.clear();\n \n const middlewareManager = getRouterMiddlewareManager();\n middlewareManager.clear();\n \n logger.info('路由管理器已销毁');\n }\n\n /**\n * 获取路由缓存实例\n */\n getCache() {\n return this.cache;\n }\n\n /**\n * 获取路由预加载器实例\n */\n getPreloader() {\n return this.preloader;\n }\n\n /**\n * 获取路由插件管理器实例\n */\n getPluginManager() {\n return this.pluginManager;\n }\n\n /**\n * 获取路由监控服务实例\n */\n getMonitoring() {\n return this.monitoring;\n }\n}\n\n/**\n * 获取路由管理器\n */\nexport function getRouterManager(): RouterManager {\n return RouterManager.getInstance();\n}\n"],"names":["RouterManager","getRouterManager","getInstance","instance","initialize","config","enabled","logger","info","enableValidation","RouterConfigValidator","validate","debug","error","process","env","NODE_ENV","pluginManager","executeHooks","PluginLifecycleStage","BEFORE_INIT","hooks","lifecycleManager","getRouterLifecycleManager","register","routes","RouterError","RouterErrorCode","ROUTER_CONFIG_ERROR","preloader","updateConfig","preload","clear","result","cacheKey","cachedResult","cache","get","BEFORE_TRANSFORM","transformRoutes","transformOptions","AFTER_TRANSFORM","set","enableHydrateFallback","Boolean","options","hydrationData","reactRoutes","transformRoutesToReactRoutes","defaultRouteErrorComponent","defaultRouteLoadingComponent","registerRoutes","startPreload","resolveInitialLazyRoutes","routerInstance","mode","createBrowserRouter","createHashRouter","createMemoryRouter","undefined","router","initialized","AFTER_INIT","initialPath","window","location","pathname","search","hash","state","monitoring","trackRouteAccess","path","meta","name","resolveAll","targetRoutes","stack","length","current","shift","push","children","matches","matchRoutes","map","match","route","Promise","all","lazy","resolved","Object","assign","warn","getRouter","isInitialized","destroy","DESTROY","stopPreload","middlewareManager","getRouterMiddlewareManager","getCache","getPreloader","getPluginManager","getMonitoring","getRouteCache","getRoutePreloader","getRouterPluginManager","getRouterMonitoring","adapterManager","getAdapterManager","factory","createReactRouterAdapter","priority"],"mappings":"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"}
@@ -43,6 +43,11 @@ export declare class RouterManager {
43
43
  * @param _appInstance - 应用实例(保留用于兼容性,当前未使用)
44
44
  */
45
45
  initialize(config: RouterConfig): Promise<void>;
46
+ /**
47
+ * 预解析 lazy 路由,避免首屏或重定向链路长时间停留在 hydrate fallback。
48
+ * resolveAll=true 时会在初始化阶段解析全部 lazy 路由。
49
+ */
50
+ private resolveInitialLazyRoutes;
46
51
  /**
47
52
  * 获取路由实例
48
53
  *
@@ -14,7 +14,7 @@ function _define_property(obj, key, value) {
14
14
  import { logger } from "../../utils";
15
15
  import { transformRoutes } from "./utils/transform";
16
16
  import { transformRoutesToReactRoutes } from "./utils/adapters/react-router/transform";
17
- import { createBrowserRouter, createHashRouter, createMemoryRouter } from "react-router-dom";
17
+ import { createBrowserRouter, createHashRouter, createMemoryRouter, matchRoutes } from "react-router-dom";
18
18
  import { RouterConfigValidator } from "./validation";
19
19
  import { getRouterLifecycleManager } from "./lifecycle";
20
20
  import { getRouterMiddlewareManager } from "./middleware";
@@ -72,6 +72,9 @@ export class RouterManager {
72
72
  if (!config.routes) {
73
73
  throw new RouterError('路由配置不能为空', RouterErrorCode.ROUTER_CONFIG_ERROR);
74
74
  }
75
+ // 更新预加载策略(默认关闭,按需懒加载)
76
+ this.preloader.updateConfig(config.preload);
77
+ this.preloader.clear();
75
78
  let result;
76
79
  const cacheKey = config.routes;
77
80
  const cachedResult = this.cache.get(cacheKey);
@@ -92,13 +95,15 @@ export class RouterManager {
92
95
  // 缓存转换结果
93
96
  this.cache.set(cacheKey, result);
94
97
  }
95
- const reactRoutes = await transformRoutesToReactRoutes(result.routes, result, config.defaultRouteErrorComponent, config.defaultRouteLoadingComponent);
98
+ const enableHydrateFallback = config.enableHydrateFallback ?? Boolean(config.options?.hydrationData);
99
+ const reactRoutes = await transformRoutesToReactRoutes(result.routes, result, config.defaultRouteErrorComponent, config.defaultRouteLoadingComponent, enableHydrateFallback);
96
100
  // 注册路由到预加载器
97
101
  if (result.routes) {
98
- this.preloader.registerRoutes(result.routes);
102
+ this.preloader.registerRoutes(result.routes, result);
99
103
  // 开始预加载
100
104
  this.preloader.startPreload();
101
105
  }
106
+ await this.resolveInitialLazyRoutes(reactRoutes, !enableHydrateFallback);
102
107
  let routerInstance = null;
103
108
  if (config.mode === 'browser') {
104
109
  routerInstance = createBrowserRouter(reactRoutes, config.options);
@@ -121,14 +126,58 @@ export class RouterManager {
121
126
  routes: result.routes
122
127
  });
123
128
  // 记录监控:路由初始化完成
129
+ const initialPath = typeof window !== 'undefined' ? `${window.location.pathname}${window.location.search}${window.location.hash}` : this.router?.state?.location?.pathname ?? '/';
124
130
  this.monitoring.trackRouteAccess({
125
- path: window.location.pathname,
131
+ path: initialPath,
126
132
  meta: {
127
133
  name: 'router-init'
128
134
  }
129
135
  }, undefined, true);
130
136
  logger.info('路由管理器初始化完成');
131
137
  }
138
+ /**
139
+ * 预解析 lazy 路由,避免首屏或重定向链路长时间停留在 hydrate fallback。
140
+ * resolveAll=true 时会在初始化阶段解析全部 lazy 路由。
141
+ */ async resolveInitialLazyRoutes(routes, resolveAll = false) {
142
+ if (typeof window === 'undefined') {
143
+ return;
144
+ }
145
+ let targetRoutes = [];
146
+ if (resolveAll) {
147
+ const stack = [
148
+ ...routes
149
+ ];
150
+ while(stack.length > 0){
151
+ const current = stack.shift();
152
+ if (!current) {
153
+ continue;
154
+ }
155
+ targetRoutes.push(current);
156
+ if (current.children && current.children.length > 0) {
157
+ stack.push(...current.children);
158
+ }
159
+ }
160
+ } else {
161
+ const matches = matchRoutes(routes, window.location.pathname) ?? [];
162
+ if (matches.length === 0) {
163
+ return;
164
+ }
165
+ targetRoutes = matches.map((match)=>match.route);
166
+ }
167
+ await Promise.all(targetRoutes.map(async (route)=>{
168
+ const lazy = route.lazy;
169
+ if (typeof lazy !== 'function') {
170
+ return;
171
+ }
172
+ try {
173
+ const resolved = await lazy();
174
+ Object.assign(route, resolved);
175
+ delete route.lazy;
176
+ } catch (error) {
177
+ logger.warn('首屏路由懒加载预解析失败,回退到 Router 默认懒加载', error);
178
+ }
179
+ }));
180
+ }
132
181
  /**
133
182
  * 获取路由实例
134
183
  *
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/router/RouterManager.ts"],"sourcesContent":["import { logger } from '../../utils';\nimport type { RouterConfig } from './types';\nimport { transformRoutes } from './utils/transform';\nimport { transformRoutesToReactRoutes } from './utils/adapters/react-router/transform';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter } from 'react-router-dom';\nimport { RouterConfigValidator } from './validation';\nimport { getRouterLifecycleManager } from './lifecycle';\nimport { getRouterMiddlewareManager } from './middleware';\nimport { RouterError, RouterErrorCode } from './errors';\nimport { getRouteCache } from './performance/RouteCache';\nimport { getRoutePreloader } from './performance/RoutePreloader';\nimport { getRouterPluginManager, PluginLifecycleStage } from './plugin';\nimport { getRouterMonitoring } from './monitoring';\nimport { getAdapterManager } from './adapter';\nimport { createReactRouterAdapter } from './adapter/react-router';\n\nexport class RouterManager {\n private static instance: RouterManager | null = null;\n\n /**\n * 路由实例\n * 只能在 initialize 方法中赋值\n */\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 是否已初始化\n */\n private initialized = false;\n\n /**\n * 路由缓存实例\n */\n private cache = getRouteCache();\n\n /**\n * 路由预加载器实例\n */\n private preloader = getRoutePreloader();\n\n /**\n * 路由插件管理器实例\n */\n private pluginManager = getRouterPluginManager();\n\n /**\n * 路由监控服务实例\n */\n private monitoring = getRouterMonitoring();\n\n /**\n * 路由适配器管理器实例\n */\n private adapterManager = getAdapterManager();\n\n private constructor() {\n // 私有构造函数\n // 注册默认的 React Router 适配器\n this.adapterManager.register({\n name: 'react-router',\n factory: createReactRouterAdapter(),\n priority: 10,\n });\n }\n /**\n * 获取单例实例\n */\n static getInstance(): RouterManager {\n if (!RouterManager.instance) {\n RouterManager.instance = new RouterManager();\n }\n return RouterManager.instance;\n }\n /**\n * 初始化路由管理器\n * \n * @param config - 路由配置\n * @param _appInstance - 应用实例(保留用于兼容性,当前未使用)\n */\n async initialize(config: RouterConfig): Promise<void> {\n // 如果路由被禁用,直接返回\n if (config.enabled === false || config.enabled === 'disabled') {\n logger.info('路由系统已禁用');\n return;\n }\n\n // 配置验证(如果启用)\n if (config.enableValidation !== false) {\n try {\n RouterConfigValidator.validate(config);\n logger.debug('路由配置验证通过');\n } catch (error) {\n logger.error('路由配置验证失败', error);\n // 开发环境下抛出错误,生产环境下记录警告但继续执行\n if (process.env.NODE_ENV === 'development') {\n throw error;\n }\n }\n }\n\n // 执行插件钩子:路由初始化前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_INIT, {\n config,\n });\n\n // 注册生命周期钩子\n if (config.hooks) {\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.register(config.hooks);\n logger.debug('路由生命周期钩子已注册');\n }\n\n // 转换数据(使用缓存)\n if (!config.routes) {\n throw new RouterError(\n '路由配置不能为空',\n RouterErrorCode.ROUTER_CONFIG_ERROR\n );\n }\n\n let result;\n const cacheKey = config.routes;\n const cachedResult = this.cache.get(cacheKey);\n\n if (cachedResult) {\n logger.debug('使用缓存的路由转换结果');\n result = cachedResult;\n } else {\n // 执行插件钩子:路由转换前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_TRANSFORM, {\n config,\n });\n\n result = await transformRoutes(config.routes, config.transformOptions);\n\n // 执行插件钩子:路由转换后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_TRANSFORM, {\n config,\n routes: result.routes,\n });\n\n // 缓存转换结果\n this.cache.set(cacheKey, result);\n }\n\n const reactRoutes = await transformRoutesToReactRoutes(result.routes, result, config.defaultRouteErrorComponent, config.defaultRouteLoadingComponent);\n\n // 注册路由到预加载器\n if (result.routes) {\n this.preloader.registerRoutes(result.routes);\n // 开始预加载\n this.preloader.startPreload();\n }\n\n let routerInstance: ReturnType<typeof createBrowserRouter> | null = null;\n if (config.mode === 'browser') {\n routerInstance = createBrowserRouter(reactRoutes, config.options);\n } else if (config.mode === 'hash') {\n routerInstance = createHashRouter(reactRoutes, config.options);\n } else if (config.mode === 'memory') {\n routerInstance = createMemoryRouter(reactRoutes, config.options);\n }\n\n if (!routerInstance) {\n throw new RouterError(\n '路由模式不支持',\n RouterErrorCode.ROUTER_CONFIG_ERROR,\n undefined,\n undefined,\n { mode: config.mode }\n );\n }\n\n // 只能在 initialize 方法中赋值\n this.router = routerInstance;\n this.initialized = true;\n\n // 执行插件钩子:路由初始化后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_INIT, {\n config,\n routes: result.routes,\n });\n\n // 记录监控:路由初始化完成\n this.monitoring.trackRouteAccess(\n {\n path: window.location.pathname,\n meta: { name: 'router-init' },\n },\n undefined,\n true\n );\n\n logger.info('路由管理器初始化完成');\n }\n\n /**\n * 获取路由实例\n * \n * @returns 路由实例,如果未初始化则返回 null\n */\n getRouter(): ReturnType<typeof createBrowserRouter> | null {\n return this.router;\n }\n\n /**\n * 检查是否已初始化\n * \n * @returns 如果已初始化返回 true,否则返回 false\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * 销毁路由管理器\n */\n destroy(): void {\n // 执行插件钩子:销毁\n this.pluginManager.executeHooks(PluginLifecycleStage.DESTROY, {\n config: {} as RouterConfig,\n });\n\n // 停止预加载\n this.preloader.stopPreload();\n\n this.router = null;\n this.initialized = false;\n \n // 清空生命周期钩子和中间件\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.clear();\n \n const middlewareManager = getRouterMiddlewareManager();\n middlewareManager.clear();\n \n logger.info('路由管理器已销毁');\n }\n\n /**\n * 获取路由缓存实例\n */\n getCache() {\n return this.cache;\n }\n\n /**\n * 获取路由预加载器实例\n */\n getPreloader() {\n return this.preloader;\n }\n\n /**\n * 获取路由插件管理器实例\n */\n getPluginManager() {\n return this.pluginManager;\n }\n\n /**\n * 获取路由监控服务实例\n */\n getMonitoring() {\n return this.monitoring;\n }\n}\n\n/**\n * 获取路由管理器\n */\nexport function getRouterManager(): RouterManager {\n return RouterManager.getInstance();\n}"],"names":["logger","transformRoutes","transformRoutesToReactRoutes","createBrowserRouter","createHashRouter","createMemoryRouter","RouterConfigValidator","getRouterLifecycleManager","getRouterMiddlewareManager","RouterError","RouterErrorCode","getRouteCache","getRoutePreloader","getRouterPluginManager","PluginLifecycleStage","getRouterMonitoring","getAdapterManager","createReactRouterAdapter","RouterManager","getInstance","instance","initialize","config","enabled","info","enableValidation","validate","debug","error","process","env","NODE_ENV","pluginManager","executeHooks","BEFORE_INIT","hooks","lifecycleManager","register","routes","ROUTER_CONFIG_ERROR","result","cacheKey","cachedResult","cache","get","BEFORE_TRANSFORM","transformOptions","AFTER_TRANSFORM","set","reactRoutes","defaultRouteErrorComponent","defaultRouteLoadingComponent","preloader","registerRoutes","startPreload","routerInstance","mode","options","undefined","router","initialized","AFTER_INIT","monitoring","trackRouteAccess","path","window","location","pathname","meta","name","getRouter","isInitialized","destroy","DESTROY","stopPreload","clear","middlewareManager","getCache","getPreloader","getPluginManager","getMonitoring","adapterManager","factory","priority","getRouterManager"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/core/router/RouterManager.ts"],"sourcesContent":["import { logger } from '../../utils';\nimport type { RouterConfig } from './types';\nimport { transformRoutes } from './utils/transform';\nimport { transformRoutesToReactRoutes } from './utils/adapters/react-router/transform';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter, matchRoutes, type RouteObject } from 'react-router-dom';\nimport { RouterConfigValidator } from './validation';\nimport { getRouterLifecycleManager } from './lifecycle';\nimport { getRouterMiddlewareManager } from './middleware';\nimport { RouterError, RouterErrorCode } from './errors';\nimport { getRouteCache } from './performance/RouteCache';\nimport { getRoutePreloader } from './performance/RoutePreloader';\nimport { getRouterPluginManager, PluginLifecycleStage } from './plugin';\nimport { getRouterMonitoring } from './monitoring';\nimport { getAdapterManager } from './adapter';\nimport { createReactRouterAdapter } from './adapter/react-router';\n\nexport class RouterManager {\n private static instance: RouterManager | null = null;\n\n /**\n * 路由实例\n * 只能在 initialize 方法中赋值\n */\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 是否已初始化\n */\n private initialized = false;\n\n /**\n * 路由缓存实例\n */\n private cache = getRouteCache();\n\n /**\n * 路由预加载器实例\n */\n private preloader = getRoutePreloader();\n\n /**\n * 路由插件管理器实例\n */\n private pluginManager = getRouterPluginManager();\n\n /**\n * 路由监控服务实例\n */\n private monitoring = getRouterMonitoring();\n\n /**\n * 路由适配器管理器实例\n */\n private adapterManager = getAdapterManager();\n\n private constructor() {\n // 私有构造函数\n // 注册默认的 React Router 适配器\n this.adapterManager.register({\n name: 'react-router',\n factory: createReactRouterAdapter(),\n priority: 10,\n });\n }\n /**\n * 获取单例实例\n */\n static getInstance(): RouterManager {\n if (!RouterManager.instance) {\n RouterManager.instance = new RouterManager();\n }\n return RouterManager.instance;\n }\n /**\n * 初始化路由管理器\n * \n * @param config - 路由配置\n * @param _appInstance - 应用实例(保留用于兼容性,当前未使用)\n */\n async initialize(config: RouterConfig): Promise<void> {\n // 如果路由被禁用,直接返回\n if (config.enabled === false || config.enabled === 'disabled') {\n logger.info('路由系统已禁用');\n return;\n }\n\n // 配置验证(如果启用)\n if (config.enableValidation !== false) {\n try {\n RouterConfigValidator.validate(config);\n logger.debug('路由配置验证通过');\n } catch (error) {\n logger.error('路由配置验证失败', error);\n // 开发环境下抛出错误,生产环境下记录警告但继续执行\n if (process.env.NODE_ENV === 'development') {\n throw error;\n }\n }\n }\n\n // 执行插件钩子:路由初始化前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_INIT, {\n config,\n });\n\n // 注册生命周期钩子\n if (config.hooks) {\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.register(config.hooks);\n logger.debug('路由生命周期钩子已注册');\n }\n\n // 转换数据(使用缓存)\n if (!config.routes) {\n throw new RouterError(\n '路由配置不能为空',\n RouterErrorCode.ROUTER_CONFIG_ERROR\n );\n }\n\n // 更新预加载策略(默认关闭,按需懒加载)\n this.preloader.updateConfig(config.preload);\n this.preloader.clear();\n\n let result;\n const cacheKey = config.routes;\n const cachedResult = this.cache.get(cacheKey);\n\n if (cachedResult) {\n logger.debug('使用缓存的路由转换结果');\n result = cachedResult;\n } else {\n // 执行插件钩子:路由转换前\n await this.pluginManager.executeHooks(PluginLifecycleStage.BEFORE_TRANSFORM, {\n config,\n });\n\n result = await transformRoutes(config.routes, config.transformOptions);\n\n // 执行插件钩子:路由转换后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_TRANSFORM, {\n config,\n routes: result.routes,\n });\n\n // 缓存转换结果\n this.cache.set(cacheKey, result);\n }\n\n const enableHydrateFallback =\n config.enableHydrateFallback\n ?? Boolean((config.options as { hydrationData?: unknown } | undefined)?.hydrationData);\n\n const reactRoutes = await transformRoutesToReactRoutes(\n result.routes,\n result,\n config.defaultRouteErrorComponent,\n config.defaultRouteLoadingComponent,\n enableHydrateFallback,\n );\n\n // 注册路由到预加载器\n if (result.routes) {\n this.preloader.registerRoutes(result.routes, result);\n // 开始预加载\n this.preloader.startPreload();\n }\n\n await this.resolveInitialLazyRoutes(reactRoutes, !enableHydrateFallback);\n\n let routerInstance: ReturnType<typeof createBrowserRouter> | null = null;\n if (config.mode === 'browser') {\n routerInstance = createBrowserRouter(reactRoutes, config.options);\n } else if (config.mode === 'hash') {\n routerInstance = createHashRouter(reactRoutes, config.options);\n } else if (config.mode === 'memory') {\n routerInstance = createMemoryRouter(reactRoutes, config.options);\n }\n\n if (!routerInstance) {\n throw new RouterError(\n '路由模式不支持',\n RouterErrorCode.ROUTER_CONFIG_ERROR,\n undefined,\n undefined,\n { mode: config.mode }\n );\n }\n\n // 只能在 initialize 方法中赋值\n this.router = routerInstance;\n this.initialized = true;\n\n // 执行插件钩子:路由初始化后\n await this.pluginManager.executeHooks(PluginLifecycleStage.AFTER_INIT, {\n config,\n routes: result.routes,\n });\n\n // 记录监控:路由初始化完成\n const initialPath = typeof window !== 'undefined'\n ? `${window.location.pathname}${window.location.search}${window.location.hash}`\n : this.router?.state?.location?.pathname ?? '/';\n\n this.monitoring.trackRouteAccess(\n {\n path: initialPath,\n meta: { name: 'router-init' },\n },\n undefined,\n true\n );\n\n logger.info('路由管理器初始化完成');\n }\n\n /**\n * 预解析 lazy 路由,避免首屏或重定向链路长时间停留在 hydrate fallback。\n * resolveAll=true 时会在初始化阶段解析全部 lazy 路由。\n */\n private async resolveInitialLazyRoutes(routes: RouteObject[], resolveAll: boolean = false): Promise<void> {\n if (typeof window === 'undefined') {\n return;\n }\n\n let targetRoutes: RouteObject[] = [];\n if (resolveAll) {\n const stack = [...routes];\n while (stack.length > 0) {\n const current = stack.shift();\n if (!current) {\n continue;\n }\n targetRoutes.push(current);\n if (current.children && current.children.length > 0) {\n stack.push(...current.children);\n }\n }\n } else {\n const matches = matchRoutes(routes, window.location.pathname) ?? [];\n if (matches.length === 0) {\n return;\n }\n targetRoutes = matches.map((match) => match.route);\n }\n\n await Promise.all(\n targetRoutes.map(async (route) => {\n const lazy = route.lazy;\n if (typeof lazy !== 'function') {\n return;\n }\n\n try {\n const resolved = await lazy();\n Object.assign(route, resolved);\n delete (route as RouteObject & { lazy?: unknown }).lazy;\n } catch (error) {\n logger.warn('首屏路由懒加载预解析失败,回退到 Router 默认懒加载', error);\n }\n }),\n );\n }\n\n /**\n * 获取路由实例\n * \n * @returns 路由实例,如果未初始化则返回 null\n */\n getRouter(): ReturnType<typeof createBrowserRouter> | null {\n return this.router;\n }\n\n /**\n * 检查是否已初始化\n * \n * @returns 如果已初始化返回 true,否则返回 false\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /**\n * 销毁路由管理器\n */\n destroy(): void {\n // 执行插件钩子:销毁\n this.pluginManager.executeHooks(PluginLifecycleStage.DESTROY, {\n config: {} as RouterConfig,\n });\n\n // 停止预加载\n this.preloader.stopPreload();\n\n this.router = null;\n this.initialized = false;\n \n // 清空生命周期钩子和中间件\n const lifecycleManager = getRouterLifecycleManager();\n lifecycleManager.clear();\n \n const middlewareManager = getRouterMiddlewareManager();\n middlewareManager.clear();\n \n logger.info('路由管理器已销毁');\n }\n\n /**\n * 获取路由缓存实例\n */\n getCache() {\n return this.cache;\n }\n\n /**\n * 获取路由预加载器实例\n */\n getPreloader() {\n return this.preloader;\n }\n\n /**\n * 获取路由插件管理器实例\n */\n getPluginManager() {\n return this.pluginManager;\n }\n\n /**\n * 获取路由监控服务实例\n */\n getMonitoring() {\n return this.monitoring;\n }\n}\n\n/**\n * 获取路由管理器\n */\nexport function getRouterManager(): RouterManager {\n return RouterManager.getInstance();\n}\n"],"names":["logger","transformRoutes","transformRoutesToReactRoutes","createBrowserRouter","createHashRouter","createMemoryRouter","matchRoutes","RouterConfigValidator","getRouterLifecycleManager","getRouterMiddlewareManager","RouterError","RouterErrorCode","getRouteCache","getRoutePreloader","getRouterPluginManager","PluginLifecycleStage","getRouterMonitoring","getAdapterManager","createReactRouterAdapter","RouterManager","getInstance","instance","initialize","config","enabled","info","enableValidation","validate","debug","error","process","env","NODE_ENV","pluginManager","executeHooks","BEFORE_INIT","hooks","lifecycleManager","register","routes","ROUTER_CONFIG_ERROR","preloader","updateConfig","preload","clear","result","cacheKey","cachedResult","cache","get","BEFORE_TRANSFORM","transformOptions","AFTER_TRANSFORM","set","enableHydrateFallback","Boolean","options","hydrationData","reactRoutes","defaultRouteErrorComponent","defaultRouteLoadingComponent","registerRoutes","startPreload","resolveInitialLazyRoutes","routerInstance","mode","undefined","router","initialized","AFTER_INIT","initialPath","window","location","pathname","search","hash","state","monitoring","trackRouteAccess","path","meta","name","resolveAll","targetRoutes","stack","length","current","shift","push","children","matches","map","match","route","Promise","all","lazy","resolved","Object","assign","warn","getRouter","isInitialized","destroy","DESTROY","stopPreload","middlewareManager","getCache","getPreloader","getPluginManager","getMonitoring","adapterManager","factory","priority","getRouterManager"],"mappings":"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"}
@@ -41,7 +41,7 @@ let ReactRouterAdapter = class ReactRouterAdapter {
41
41
  */ async initialize(config) {
42
42
  // 转换路由配置
43
43
  const transformResult = await (0, _transform1.transformRoutes)(config.routes);
44
- const reactRoutes = await (0, _transform.transformRoutesToReactRoutes)(transformResult.routes, transformResult, config.defaultRouteErrorComponent, config.defaultRouteLoadingComponent);
44
+ const reactRoutes = await (0, _transform.transformRoutesToReactRoutes)(transformResult.routes, transformResult, config.defaultRouteErrorComponent, config.defaultRouteLoadingComponent, Boolean(config.options?.hydrationData));
45
45
  // 创建路由实例
46
46
  const mode = config.mode || 'browser';
47
47
  if (mode === 'browser') {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/router/adapter/react-router/ReactRouterAdapter.ts"],"sourcesContent":["/**\n * React Router 适配器实现\n */\n\nimport type { IRouterAdapter, RouterAdapterConfig } from '../types';\nimport type { RouteLocation, NavigateOptions } from '../../types';\nimport type { AppInstance } from '../../../startup/AppInstance';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter } from 'react-router-dom';\nimport { transformRoutesToReactRoutes } from '../../utils/adapters/react-router/transform';\nimport { transformRoutes } from '../../utils/transform';\nimport { logger } from '../../../../utils';\n\n/**\n * React Router 适配器\n */\nexport class ReactRouterAdapter implements IRouterAdapter {\n readonly name = 'react-router';\n readonly version = '6.0.0';\n\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 初始化适配器\n */\n async initialize(config: RouterAdapterConfig): Promise<void> {\n\n // 转换路由配置\n const transformResult = await transformRoutes(config.routes);\n const reactRoutes = await transformRoutesToReactRoutes(\n transformResult.routes,\n transformResult,\n config.defaultRouteErrorComponent,\n config.defaultRouteLoadingComponent\n );\n\n // 创建路由实例\n const mode = config.mode || 'browser';\n if (mode === 'browser') {\n this.router = createBrowserRouter(reactRoutes, config.options as any);\n } else if (mode === 'hash') {\n this.router = createHashRouter(reactRoutes, config.options as any);\n } else if (mode === 'memory') {\n this.router = createMemoryRouter(reactRoutes, config.options as any);\n } else {\n throw new Error(`不支持的路由模式: ${mode}`);\n }\n\n logger.debug('React Router 适配器初始化完成');\n }\n\n /**\n * 挂载到应用实例\n */\n mount(_app: AppInstance): void {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n // React Router 适配器通过 RouterProvider 挂载\n // 实际的挂载逻辑在 renderApp 中处理\n logger.debug('React Router 适配器已挂载');\n }\n\n /**\n * 导航到指定路径\n */\n navigate(to: string, options?: NavigateOptions): void {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n if (options?.replace) {\n this.router.navigate(to, { replace: true, state: options.state });\n } else {\n this.router.navigate(to, { state: options?.state });\n }\n }\n\n /**\n * 获取当前路由信息\n */\n getCurrentRoute(): RouteLocation {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n const state = this.router.state;\n const location = state.location;\n\n // 解析查询参数\n const query: Record<string, unknown> = {};\n if (location.search) {\n const params = new URLSearchParams(location.search);\n params.forEach((value, key) => {\n query[key] = value;\n });\n }\n\n return {\n path: location.pathname + location.hash,\n query,\n params: location.state as Record<string, unknown> | undefined,\n };\n }\n\n /**\n * 获取路由实例(用于 RouterProvider)\n */\n getRouter(): ReturnType<typeof createBrowserRouter> | null {\n return this.router;\n }\n\n /**\n * 销毁适配器\n */\n destroy(): void {\n this.router = null;\n logger.debug('React Router 适配器已销毁');\n }\n}\n\n/**\n * 创建 React Router 适配器工厂函数\n */\nexport function createReactRouterAdapter(): (_config: RouterAdapterConfig) => IRouterAdapter {\n return (_config: RouterAdapterConfig) => {\n return new ReactRouterAdapter();\n };\n}\n"],"names":["ReactRouterAdapter","createReactRouterAdapter","initialize","config","transformResult","transformRoutes","routes","reactRoutes","transformRoutesToReactRoutes","defaultRouteErrorComponent","defaultRouteLoadingComponent","mode","router","createBrowserRouter","options","createHashRouter","createMemoryRouter","Error","logger","debug","mount","_app","navigate","to","replace","state","getCurrentRoute","location","query","search","params","URLSearchParams","forEach","value","key","path","pathname","hash","getRouter","destroy","name","version","_config"],"mappings":"AAAA;;CAEC;;;;;;;;;;;QAaYA;eAAAA;;QA6GGC;eAAAA;;;gCArH0D;2BAC7B;4BACb;uBACT;;;;;;;;;;;;;;AAKhB,IAAA,AAAMD,qBAAN,MAAMA;IAMX;;GAEC,GACD,MAAME,WAAWC,MAA2B,EAAiB;QAE3D,SAAS;QACT,MAAMC,kBAAkB,MAAMC,IAAAA,2BAAe,EAACF,OAAOG,MAAM;QAC3D,MAAMC,cAAc,MAAMC,IAAAA,uCAA4B,EACpDJ,gBAAgBE,MAAM,EACtBF,iBACAD,OAAOM,0BAA0B,EACjCN,OAAOO,4BAA4B;QAGrC,SAAS;QACT,MAAMC,OAAOR,OAAOQ,IAAI,IAAI;QAC5B,IAAIA,SAAS,WAAW;YACtB,IAAI,CAACC,MAAM,GAAGC,IAAAA,mCAAmB,EAACN,aAAaJ,OAAOW,OAAO;QAC/D,OAAO,IAAIH,SAAS,QAAQ;YAC1B,IAAI,CAACC,MAAM,GAAGG,IAAAA,gCAAgB,EAACR,aAAaJ,OAAOW,OAAO;QAC5D,OAAO,IAAIH,SAAS,UAAU;YAC5B,IAAI,CAACC,MAAM,GAAGI,IAAAA,kCAAkB,EAACT,aAAaJ,OAAOW,OAAO;QAC9D,OAAO;YACL,MAAM,IAAIG,MAAM,CAAC,UAAU,EAAEN,MAAM;QACrC;QAEAO,aAAM,CAACC,KAAK,CAAC;IACf;IAEA;;GAEC,GACDC,MAAMC,IAAiB,EAAQ;QAC7B,IAAI,CAAC,IAAI,CAACT,MAAM,EAAE;YAChB,MAAM,IAAIK,MAAM;QAClB;QAEA,uCAAuC;QACvC,yBAAyB;QACzBC,aAAM,CAACC,KAAK,CAAC;IACf;IAEA;;GAEC,GACDG,SAASC,EAAU,EAAET,OAAyB,EAAQ;QACpD,IAAI,CAAC,IAAI,CAACF,MAAM,EAAE;YAChB,MAAM,IAAIK,MAAM;QAClB;QAEA,IAAIH,SAASU,SAAS;YACpB,IAAI,CAACZ,MAAM,CAACU,QAAQ,CAACC,IAAI;gBAAEC,SAAS;gBAAMC,OAAOX,QAAQW,KAAK;YAAC;QACjE,OAAO;YACL,IAAI,CAACb,MAAM,CAACU,QAAQ,CAACC,IAAI;gBAAEE,OAAOX,SAASW;YAAM;QACnD;IACF;IAEA;;GAEC,GACDC,kBAAiC;QAC/B,IAAI,CAAC,IAAI,CAACd,MAAM,EAAE;YAChB,MAAM,IAAIK,MAAM;QAClB;QAEA,MAAMQ,QAAQ,IAAI,CAACb,MAAM,CAACa,KAAK;QAC/B,MAAME,WAAWF,MAAME,QAAQ;QAE/B,SAAS;QACT,MAAMC,QAAiC,CAAC;QACxC,IAAID,SAASE,MAAM,EAAE;YACnB,MAAMC,SAAS,IAAIC,gBAAgBJ,SAASE,MAAM;YAClDC,OAAOE,OAAO,CAAC,CAACC,OAAOC;gBACrBN,KAAK,CAACM,IAAI,GAAGD;YACf;QACF;QAEA,OAAO;YACLE,MAAMR,SAASS,QAAQ,GAAGT,SAASU,IAAI;YACvCT;YACAE,QAAQH,SAASF,KAAK;QACxB;IACF;IAEA;;GAEC,GACDa,YAA2D;QACzD,OAAO,IAAI,CAAC1B,MAAM;IACpB;IAEA;;GAEC,GACD2B,UAAgB;QACd,IAAI,CAAC3B,MAAM,GAAG;QACdM,aAAM,CAACC,KAAK,CAAC;IACf;;QAtGA,uBAASqB,QAAO;QAChB,uBAASC,WAAU;QAEnB,uBAAQ7B,UAAwD;;AAoGlE;AAKO,SAASX;IACd,OAAO,CAACyC;QACN,OAAO,IAAI1C;IACb;AACF"}
1
+ {"version":3,"sources":["../../../../../src/core/router/adapter/react-router/ReactRouterAdapter.ts"],"sourcesContent":["/**\n * React Router 适配器实现\n */\n\nimport type { IRouterAdapter, RouterAdapterConfig } from '../types';\nimport type { RouteLocation, NavigateOptions } from '../../types';\nimport type { AppInstance } from '../../../startup/AppInstance';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter } from 'react-router-dom';\nimport { transformRoutesToReactRoutes } from '../../utils/adapters/react-router/transform';\nimport { transformRoutes } from '../../utils/transform';\nimport { logger } from '../../../../utils';\n\n/**\n * React Router 适配器\n */\nexport class ReactRouterAdapter implements IRouterAdapter {\n readonly name = 'react-router';\n readonly version = '6.0.0';\n\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 初始化适配器\n */\n async initialize(config: RouterAdapterConfig): Promise<void> {\n\n // 转换路由配置\n const transformResult = await transformRoutes(config.routes);\n const reactRoutes = await transformRoutesToReactRoutes(\n transformResult.routes,\n transformResult,\n config.defaultRouteErrorComponent,\n config.defaultRouteLoadingComponent,\n Boolean((config.options as { hydrationData?: unknown } | undefined)?.hydrationData),\n );\n\n // 创建路由实例\n const mode = config.mode || 'browser';\n if (mode === 'browser') {\n this.router = createBrowserRouter(reactRoutes, config.options as any);\n } else if (mode === 'hash') {\n this.router = createHashRouter(reactRoutes, config.options as any);\n } else if (mode === 'memory') {\n this.router = createMemoryRouter(reactRoutes, config.options as any);\n } else {\n throw new Error(`不支持的路由模式: ${mode}`);\n }\n\n logger.debug('React Router 适配器初始化完成');\n }\n\n /**\n * 挂载到应用实例\n */\n mount(_app: AppInstance): void {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n // React Router 适配器通过 RouterProvider 挂载\n // 实际的挂载逻辑在 renderApp 中处理\n logger.debug('React Router 适配器已挂载');\n }\n\n /**\n * 导航到指定路径\n */\n navigate(to: string, options?: NavigateOptions): void {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n if (options?.replace) {\n this.router.navigate(to, { replace: true, state: options.state });\n } else {\n this.router.navigate(to, { state: options?.state });\n }\n }\n\n /**\n * 获取当前路由信息\n */\n getCurrentRoute(): RouteLocation {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n const state = this.router.state;\n const location = state.location;\n\n // 解析查询参数\n const query: Record<string, unknown> = {};\n if (location.search) {\n const params = new URLSearchParams(location.search);\n params.forEach((value, key) => {\n query[key] = value;\n });\n }\n\n return {\n path: location.pathname + location.hash,\n query,\n params: location.state as Record<string, unknown> | undefined,\n };\n }\n\n /**\n * 获取路由实例(用于 RouterProvider)\n */\n getRouter(): ReturnType<typeof createBrowserRouter> | null {\n return this.router;\n }\n\n /**\n * 销毁适配器\n */\n destroy(): void {\n this.router = null;\n logger.debug('React Router 适配器已销毁');\n }\n}\n\n/**\n * 创建 React Router 适配器工厂函数\n */\nexport function createReactRouterAdapter(): (_config: RouterAdapterConfig) => IRouterAdapter {\n return (_config: RouterAdapterConfig) => {\n return new ReactRouterAdapter();\n };\n}\n"],"names":["ReactRouterAdapter","createReactRouterAdapter","initialize","config","transformResult","transformRoutes","routes","reactRoutes","transformRoutesToReactRoutes","defaultRouteErrorComponent","defaultRouteLoadingComponent","Boolean","options","hydrationData","mode","router","createBrowserRouter","createHashRouter","createMemoryRouter","Error","logger","debug","mount","_app","navigate","to","replace","state","getCurrentRoute","location","query","search","params","URLSearchParams","forEach","value","key","path","pathname","hash","getRouter","destroy","name","version","_config"],"mappings":"AAAA;;CAEC;;;;;;;;;;;QAaYA;eAAAA;;QA8GGC;eAAAA;;;gCAtH0D;2BAC7B;4BACb;uBACT;;;;;;;;;;;;;;AAKhB,IAAA,AAAMD,qBAAN,MAAMA;IAMX;;GAEC,GACD,MAAME,WAAWC,MAA2B,EAAiB;QAE3D,SAAS;QACT,MAAMC,kBAAkB,MAAMC,IAAAA,2BAAe,EAACF,OAAOG,MAAM;QAC3D,MAAMC,cAAc,MAAMC,IAAAA,uCAA4B,EACpDJ,gBAAgBE,MAAM,EACtBF,iBACAD,OAAOM,0BAA0B,EACjCN,OAAOO,4BAA4B,EACnCC,QAASR,OAAOS,OAAO,EAA8CC;QAGvE,SAAS;QACT,MAAMC,OAAOX,OAAOW,IAAI,IAAI;QAC5B,IAAIA,SAAS,WAAW;YACtB,IAAI,CAACC,MAAM,GAAGC,IAAAA,mCAAmB,EAACT,aAAaJ,OAAOS,OAAO;QAC/D,OAAO,IAAIE,SAAS,QAAQ;YAC1B,IAAI,CAACC,MAAM,GAAGE,IAAAA,gCAAgB,EAACV,aAAaJ,OAAOS,OAAO;QAC5D,OAAO,IAAIE,SAAS,UAAU;YAC5B,IAAI,CAACC,MAAM,GAAGG,IAAAA,kCAAkB,EAACX,aAAaJ,OAAOS,OAAO;QAC9D,OAAO;YACL,MAAM,IAAIO,MAAM,CAAC,UAAU,EAAEL,MAAM;QACrC;QAEAM,aAAM,CAACC,KAAK,CAAC;IACf;IAEA;;GAEC,GACDC,MAAMC,IAAiB,EAAQ;QAC7B,IAAI,CAAC,IAAI,CAACR,MAAM,EAAE;YAChB,MAAM,IAAII,MAAM;QAClB;QAEA,uCAAuC;QACvC,yBAAyB;QACzBC,aAAM,CAACC,KAAK,CAAC;IACf;IAEA;;GAEC,GACDG,SAASC,EAAU,EAAEb,OAAyB,EAAQ;QACpD,IAAI,CAAC,IAAI,CAACG,MAAM,EAAE;YAChB,MAAM,IAAII,MAAM;QAClB;QAEA,IAAIP,SAASc,SAAS;YACpB,IAAI,CAACX,MAAM,CAACS,QAAQ,CAACC,IAAI;gBAAEC,SAAS;gBAAMC,OAAOf,QAAQe,KAAK;YAAC;QACjE,OAAO;YACL,IAAI,CAACZ,MAAM,CAACS,QAAQ,CAACC,IAAI;gBAAEE,OAAOf,SAASe;YAAM;QACnD;IACF;IAEA;;GAEC,GACDC,kBAAiC;QAC/B,IAAI,CAAC,IAAI,CAACb,MAAM,EAAE;YAChB,MAAM,IAAII,MAAM;QAClB;QAEA,MAAMQ,QAAQ,IAAI,CAACZ,MAAM,CAACY,KAAK;QAC/B,MAAME,WAAWF,MAAME,QAAQ;QAE/B,SAAS;QACT,MAAMC,QAAiC,CAAC;QACxC,IAAID,SAASE,MAAM,EAAE;YACnB,MAAMC,SAAS,IAAIC,gBAAgBJ,SAASE,MAAM;YAClDC,OAAOE,OAAO,CAAC,CAACC,OAAOC;gBACrBN,KAAK,CAACM,IAAI,GAAGD;YACf;QACF;QAEA,OAAO;YACLE,MAAMR,SAASS,QAAQ,GAAGT,SAASU,IAAI;YACvCT;YACAE,QAAQH,SAASF,KAAK;QACxB;IACF;IAEA;;GAEC,GACDa,YAA2D;QACzD,OAAO,IAAI,CAACzB,MAAM;IACpB;IAEA;;GAEC,GACD0B,UAAgB;QACd,IAAI,CAAC1B,MAAM,GAAG;QACdK,aAAM,CAACC,KAAK,CAAC;IACf;;QAvGA,uBAASqB,QAAO;QAChB,uBAASC,WAAU;QAEnB,uBAAQ5B,UAAwD;;AAqGlE;AAKO,SAASd;IACd,OAAO,CAAC2C;QACN,OAAO,IAAI5C;IACb;AACF"}
@@ -25,7 +25,7 @@ import { logger } from "../../../../utils";
25
25
  */ async initialize(config) {
26
26
  // 转换路由配置
27
27
  const transformResult = await transformRoutes(config.routes);
28
- const reactRoutes = await transformRoutesToReactRoutes(transformResult.routes, transformResult, config.defaultRouteErrorComponent, config.defaultRouteLoadingComponent);
28
+ const reactRoutes = await transformRoutesToReactRoutes(transformResult.routes, transformResult, config.defaultRouteErrorComponent, config.defaultRouteLoadingComponent, Boolean(config.options?.hydrationData));
29
29
  // 创建路由实例
30
30
  const mode = config.mode || 'browser';
31
31
  if (mode === 'browser') {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/router/adapter/react-router/ReactRouterAdapter.ts"],"sourcesContent":["/**\n * React Router 适配器实现\n */\n\nimport type { IRouterAdapter, RouterAdapterConfig } from '../types';\nimport type { RouteLocation, NavigateOptions } from '../../types';\nimport type { AppInstance } from '../../../startup/AppInstance';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter } from 'react-router-dom';\nimport { transformRoutesToReactRoutes } from '../../utils/adapters/react-router/transform';\nimport { transformRoutes } from '../../utils/transform';\nimport { logger } from '../../../../utils';\n\n/**\n * React Router 适配器\n */\nexport class ReactRouterAdapter implements IRouterAdapter {\n readonly name = 'react-router';\n readonly version = '6.0.0';\n\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 初始化适配器\n */\n async initialize(config: RouterAdapterConfig): Promise<void> {\n\n // 转换路由配置\n const transformResult = await transformRoutes(config.routes);\n const reactRoutes = await transformRoutesToReactRoutes(\n transformResult.routes,\n transformResult,\n config.defaultRouteErrorComponent,\n config.defaultRouteLoadingComponent\n );\n\n // 创建路由实例\n const mode = config.mode || 'browser';\n if (mode === 'browser') {\n this.router = createBrowserRouter(reactRoutes, config.options as any);\n } else if (mode === 'hash') {\n this.router = createHashRouter(reactRoutes, config.options as any);\n } else if (mode === 'memory') {\n this.router = createMemoryRouter(reactRoutes, config.options as any);\n } else {\n throw new Error(`不支持的路由模式: ${mode}`);\n }\n\n logger.debug('React Router 适配器初始化完成');\n }\n\n /**\n * 挂载到应用实例\n */\n mount(_app: AppInstance): void {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n // React Router 适配器通过 RouterProvider 挂载\n // 实际的挂载逻辑在 renderApp 中处理\n logger.debug('React Router 适配器已挂载');\n }\n\n /**\n * 导航到指定路径\n */\n navigate(to: string, options?: NavigateOptions): void {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n if (options?.replace) {\n this.router.navigate(to, { replace: true, state: options.state });\n } else {\n this.router.navigate(to, { state: options?.state });\n }\n }\n\n /**\n * 获取当前路由信息\n */\n getCurrentRoute(): RouteLocation {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n const state = this.router.state;\n const location = state.location;\n\n // 解析查询参数\n const query: Record<string, unknown> = {};\n if (location.search) {\n const params = new URLSearchParams(location.search);\n params.forEach((value, key) => {\n query[key] = value;\n });\n }\n\n return {\n path: location.pathname + location.hash,\n query,\n params: location.state as Record<string, unknown> | undefined,\n };\n }\n\n /**\n * 获取路由实例(用于 RouterProvider)\n */\n getRouter(): ReturnType<typeof createBrowserRouter> | null {\n return this.router;\n }\n\n /**\n * 销毁适配器\n */\n destroy(): void {\n this.router = null;\n logger.debug('React Router 适配器已销毁');\n }\n}\n\n/**\n * 创建 React Router 适配器工厂函数\n */\nexport function createReactRouterAdapter(): (_config: RouterAdapterConfig) => IRouterAdapter {\n return (_config: RouterAdapterConfig) => {\n return new ReactRouterAdapter();\n };\n}\n"],"names":["createBrowserRouter","createHashRouter","createMemoryRouter","transformRoutesToReactRoutes","transformRoutes","logger","ReactRouterAdapter","initialize","config","transformResult","routes","reactRoutes","defaultRouteErrorComponent","defaultRouteLoadingComponent","mode","router","options","Error","debug","mount","_app","navigate","to","replace","state","getCurrentRoute","location","query","search","params","URLSearchParams","forEach","value","key","path","pathname","hash","getRouter","destroy","name","version","createReactRouterAdapter","_config"],"mappings":"AAAA;;CAEC;;;;;;;;;;;;;AAKD,SAASA,mBAAmB,EAAEC,gBAAgB,EAAEC,kBAAkB,QAAQ,mBAAmB;AAC7F,SAASC,4BAA4B,QAAQ,8CAA8C;AAC3F,SAASC,eAAe,QAAQ,wBAAwB;AACxD,SAASC,MAAM,QAAQ,oBAAoB;AAE3C;;CAEC,GACD,OAAO,MAAMC;IAMX;;GAEC,GACD,MAAMC,WAAWC,MAA2B,EAAiB;QAE3D,SAAS;QACT,MAAMC,kBAAkB,MAAML,gBAAgBI,OAAOE,MAAM;QAC3D,MAAMC,cAAc,MAAMR,6BACxBM,gBAAgBC,MAAM,EACtBD,iBACAD,OAAOI,0BAA0B,EACjCJ,OAAOK,4BAA4B;QAGrC,SAAS;QACT,MAAMC,OAAON,OAAOM,IAAI,IAAI;QAC5B,IAAIA,SAAS,WAAW;YACtB,IAAI,CAACC,MAAM,GAAGf,oBAAoBW,aAAaH,OAAOQ,OAAO;QAC/D,OAAO,IAAIF,SAAS,QAAQ;YAC1B,IAAI,CAACC,MAAM,GAAGd,iBAAiBU,aAAaH,OAAOQ,OAAO;QAC5D,OAAO,IAAIF,SAAS,UAAU;YAC5B,IAAI,CAACC,MAAM,GAAGb,mBAAmBS,aAAaH,OAAOQ,OAAO;QAC9D,OAAO;YACL,MAAM,IAAIC,MAAM,CAAC,UAAU,EAAEH,MAAM;QACrC;QAEAT,OAAOa,KAAK,CAAC;IACf;IAEA;;GAEC,GACDC,MAAMC,IAAiB,EAAQ;QAC7B,IAAI,CAAC,IAAI,CAACL,MAAM,EAAE;YAChB,MAAM,IAAIE,MAAM;QAClB;QAEA,uCAAuC;QACvC,yBAAyB;QACzBZ,OAAOa,KAAK,CAAC;IACf;IAEA;;GAEC,GACDG,SAASC,EAAU,EAAEN,OAAyB,EAAQ;QACpD,IAAI,CAAC,IAAI,CAACD,MAAM,EAAE;YAChB,MAAM,IAAIE,MAAM;QAClB;QAEA,IAAID,SAASO,SAAS;YACpB,IAAI,CAACR,MAAM,CAACM,QAAQ,CAACC,IAAI;gBAAEC,SAAS;gBAAMC,OAAOR,QAAQQ,KAAK;YAAC;QACjE,OAAO;YACL,IAAI,CAACT,MAAM,CAACM,QAAQ,CAACC,IAAI;gBAAEE,OAAOR,SAASQ;YAAM;QACnD;IACF;IAEA;;GAEC,GACDC,kBAAiC;QAC/B,IAAI,CAAC,IAAI,CAACV,MAAM,EAAE;YAChB,MAAM,IAAIE,MAAM;QAClB;QAEA,MAAMO,QAAQ,IAAI,CAACT,MAAM,CAACS,KAAK;QAC/B,MAAME,WAAWF,MAAME,QAAQ;QAE/B,SAAS;QACT,MAAMC,QAAiC,CAAC;QACxC,IAAID,SAASE,MAAM,EAAE;YACnB,MAAMC,SAAS,IAAIC,gBAAgBJ,SAASE,MAAM;YAClDC,OAAOE,OAAO,CAAC,CAACC,OAAOC;gBACrBN,KAAK,CAACM,IAAI,GAAGD;YACf;QACF;QAEA,OAAO;YACLE,MAAMR,SAASS,QAAQ,GAAGT,SAASU,IAAI;YACvCT;YACAE,QAAQH,SAASF,KAAK;QACxB;IACF;IAEA;;GAEC,GACDa,YAA2D;QACzD,OAAO,IAAI,CAACtB,MAAM;IACpB;IAEA;;GAEC,GACDuB,UAAgB;QACd,IAAI,CAACvB,MAAM,GAAG;QACdV,OAAOa,KAAK,CAAC;IACf;;QAtGA,uBAASqB,QAAO;QAChB,uBAASC,WAAU;QAEnB,uBAAQzB,UAAwD;;AAoGlE;AAEA;;CAEC,GACD,OAAO,SAAS0B;IACd,OAAO,CAACC;QACN,OAAO,IAAIpC;IACb;AACF"}
1
+ {"version":3,"sources":["../../../../../src/core/router/adapter/react-router/ReactRouterAdapter.ts"],"sourcesContent":["/**\n * React Router 适配器实现\n */\n\nimport type { IRouterAdapter, RouterAdapterConfig } from '../types';\nimport type { RouteLocation, NavigateOptions } from '../../types';\nimport type { AppInstance } from '../../../startup/AppInstance';\nimport { createBrowserRouter, createHashRouter, createMemoryRouter } from 'react-router-dom';\nimport { transformRoutesToReactRoutes } from '../../utils/adapters/react-router/transform';\nimport { transformRoutes } from '../../utils/transform';\nimport { logger } from '../../../../utils';\n\n/**\n * React Router 适配器\n */\nexport class ReactRouterAdapter implements IRouterAdapter {\n readonly name = 'react-router';\n readonly version = '6.0.0';\n\n private router: ReturnType<typeof createBrowserRouter> | null = null;\n\n /**\n * 初始化适配器\n */\n async initialize(config: RouterAdapterConfig): Promise<void> {\n\n // 转换路由配置\n const transformResult = await transformRoutes(config.routes);\n const reactRoutes = await transformRoutesToReactRoutes(\n transformResult.routes,\n transformResult,\n config.defaultRouteErrorComponent,\n config.defaultRouteLoadingComponent,\n Boolean((config.options as { hydrationData?: unknown } | undefined)?.hydrationData),\n );\n\n // 创建路由实例\n const mode = config.mode || 'browser';\n if (mode === 'browser') {\n this.router = createBrowserRouter(reactRoutes, config.options as any);\n } else if (mode === 'hash') {\n this.router = createHashRouter(reactRoutes, config.options as any);\n } else if (mode === 'memory') {\n this.router = createMemoryRouter(reactRoutes, config.options as any);\n } else {\n throw new Error(`不支持的路由模式: ${mode}`);\n }\n\n logger.debug('React Router 适配器初始化完成');\n }\n\n /**\n * 挂载到应用实例\n */\n mount(_app: AppInstance): void {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n // React Router 适配器通过 RouterProvider 挂载\n // 实际的挂载逻辑在 renderApp 中处理\n logger.debug('React Router 适配器已挂载');\n }\n\n /**\n * 导航到指定路径\n */\n navigate(to: string, options?: NavigateOptions): void {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n if (options?.replace) {\n this.router.navigate(to, { replace: true, state: options.state });\n } else {\n this.router.navigate(to, { state: options?.state });\n }\n }\n\n /**\n * 获取当前路由信息\n */\n getCurrentRoute(): RouteLocation {\n if (!this.router) {\n throw new Error('适配器未初始化');\n }\n\n const state = this.router.state;\n const location = state.location;\n\n // 解析查询参数\n const query: Record<string, unknown> = {};\n if (location.search) {\n const params = new URLSearchParams(location.search);\n params.forEach((value, key) => {\n query[key] = value;\n });\n }\n\n return {\n path: location.pathname + location.hash,\n query,\n params: location.state as Record<string, unknown> | undefined,\n };\n }\n\n /**\n * 获取路由实例(用于 RouterProvider)\n */\n getRouter(): ReturnType<typeof createBrowserRouter> | null {\n return this.router;\n }\n\n /**\n * 销毁适配器\n */\n destroy(): void {\n this.router = null;\n logger.debug('React Router 适配器已销毁');\n }\n}\n\n/**\n * 创建 React Router 适配器工厂函数\n */\nexport function createReactRouterAdapter(): (_config: RouterAdapterConfig) => IRouterAdapter {\n return (_config: RouterAdapterConfig) => {\n return new ReactRouterAdapter();\n };\n}\n"],"names":["createBrowserRouter","createHashRouter","createMemoryRouter","transformRoutesToReactRoutes","transformRoutes","logger","ReactRouterAdapter","initialize","config","transformResult","routes","reactRoutes","defaultRouteErrorComponent","defaultRouteLoadingComponent","Boolean","options","hydrationData","mode","router","Error","debug","mount","_app","navigate","to","replace","state","getCurrentRoute","location","query","search","params","URLSearchParams","forEach","value","key","path","pathname","hash","getRouter","destroy","name","version","createReactRouterAdapter","_config"],"mappings":"AAAA;;CAEC;;;;;;;;;;;;;AAKD,SAASA,mBAAmB,EAAEC,gBAAgB,EAAEC,kBAAkB,QAAQ,mBAAmB;AAC7F,SAASC,4BAA4B,QAAQ,8CAA8C;AAC3F,SAASC,eAAe,QAAQ,wBAAwB;AACxD,SAASC,MAAM,QAAQ,oBAAoB;AAE3C;;CAEC,GACD,OAAO,MAAMC;IAMX;;GAEC,GACD,MAAMC,WAAWC,MAA2B,EAAiB;QAE3D,SAAS;QACT,MAAMC,kBAAkB,MAAML,gBAAgBI,OAAOE,MAAM;QAC3D,MAAMC,cAAc,MAAMR,6BACxBM,gBAAgBC,MAAM,EACtBD,iBACAD,OAAOI,0BAA0B,EACjCJ,OAAOK,4BAA4B,EACnCC,QAASN,OAAOO,OAAO,EAA8CC;QAGvE,SAAS;QACT,MAAMC,OAAOT,OAAOS,IAAI,IAAI;QAC5B,IAAIA,SAAS,WAAW;YACtB,IAAI,CAACC,MAAM,GAAGlB,oBAAoBW,aAAaH,OAAOO,OAAO;QAC/D,OAAO,IAAIE,SAAS,QAAQ;YAC1B,IAAI,CAACC,MAAM,GAAGjB,iBAAiBU,aAAaH,OAAOO,OAAO;QAC5D,OAAO,IAAIE,SAAS,UAAU;YAC5B,IAAI,CAACC,MAAM,GAAGhB,mBAAmBS,aAAaH,OAAOO,OAAO;QAC9D,OAAO;YACL,MAAM,IAAII,MAAM,CAAC,UAAU,EAAEF,MAAM;QACrC;QAEAZ,OAAOe,KAAK,CAAC;IACf;IAEA;;GAEC,GACDC,MAAMC,IAAiB,EAAQ;QAC7B,IAAI,CAAC,IAAI,CAACJ,MAAM,EAAE;YAChB,MAAM,IAAIC,MAAM;QAClB;QAEA,uCAAuC;QACvC,yBAAyB;QACzBd,OAAOe,KAAK,CAAC;IACf;IAEA;;GAEC,GACDG,SAASC,EAAU,EAAET,OAAyB,EAAQ;QACpD,IAAI,CAAC,IAAI,CAACG,MAAM,EAAE;YAChB,MAAM,IAAIC,MAAM;QAClB;QAEA,IAAIJ,SAASU,SAAS;YACpB,IAAI,CAACP,MAAM,CAACK,QAAQ,CAACC,IAAI;gBAAEC,SAAS;gBAAMC,OAAOX,QAAQW,KAAK;YAAC;QACjE,OAAO;YACL,IAAI,CAACR,MAAM,CAACK,QAAQ,CAACC,IAAI;gBAAEE,OAAOX,SAASW;YAAM;QACnD;IACF;IAEA;;GAEC,GACDC,kBAAiC;QAC/B,IAAI,CAAC,IAAI,CAACT,MAAM,EAAE;YAChB,MAAM,IAAIC,MAAM;QAClB;QAEA,MAAMO,QAAQ,IAAI,CAACR,MAAM,CAACQ,KAAK;QAC/B,MAAME,WAAWF,MAAME,QAAQ;QAE/B,SAAS;QACT,MAAMC,QAAiC,CAAC;QACxC,IAAID,SAASE,MAAM,EAAE;YACnB,MAAMC,SAAS,IAAIC,gBAAgBJ,SAASE,MAAM;YAClDC,OAAOE,OAAO,CAAC,CAACC,OAAOC;gBACrBN,KAAK,CAACM,IAAI,GAAGD;YACf;QACF;QAEA,OAAO;YACLE,MAAMR,SAASS,QAAQ,GAAGT,SAASU,IAAI;YACvCT;YACAE,QAAQH,SAASF,KAAK;QACxB;IACF;IAEA;;GAEC,GACDa,YAA2D;QACzD,OAAO,IAAI,CAACrB,MAAM;IACpB;IAEA;;GAEC,GACDsB,UAAgB;QACd,IAAI,CAACtB,MAAM,GAAG;QACdb,OAAOe,KAAK,CAAC;IACf;;QAvGA,uBAASqB,QAAO;QAChB,uBAASC,WAAU;QAEnB,uBAAQxB,UAAwD;;AAqGlE;AAEA;;CAEC,GACD,OAAO,SAASyB;IACd,OAAO,CAACC;QACN,OAAO,IAAItC;IACb;AACF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/router/dev/RouterDevTools.tsx"],"sourcesContent":["/**\n * 路由调试工具(开发环境,无 UI 框架依赖)\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { getRouterManager } from '../RouterManager';\nimport { getRouterLifecycleManager } from '../lifecycle';\nimport { getRouterMiddlewareManager } from '../middleware';\nimport { RouterNavigation } from '../navigation';\nimport type { RouteLocation } from '../types';\n\nfunction pretty(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function RouterDevTools(): React.ReactElement | null {\n if (process.env.NODE_ENV !== 'development') {\n return null;\n }\n\n const [visible, setVisible] = useState(false);\n const [currentRoute, setCurrentRoute] = useState<RouteLocation | null>(null);\n const [routeState, setRouteState] = useState<Record<string, unknown>>({});\n const [lifecycleHooks, setLifecycleHooks] = useState<any[]>([]);\n const [middlewares, setMiddlewares] = useState<any[]>([]);\n\n const updateRouteInfo = () => {\n try {\n const route = RouterNavigation.getCurrentRoute();\n setCurrentRoute(route);\n\n const router = getRouterManager().getRouter();\n if (router) {\n const state = router.state;\n setRouteState({\n pathname: state.location.pathname,\n search: state.location.search || '',\n hash: state.location.hash || '',\n state: state.location.state || {},\n });\n } else {\n setRouteState({});\n }\n\n const hooks = getRouterLifecycleManager().getAll();\n setLifecycleHooks(hooks.map((hook, index) => ({\n key: index,\n hasBeforeEach: !!hook.beforeEach,\n hasAfterEach: !!hook.afterEach,\n })));\n\n const middlewareList = getRouterMiddlewareManager().getAll();\n setMiddlewares(middlewareList.map((m, index) => ({\n key: index,\n name: m.name || `middleware-${index}`,\n priority: m.priority || 100,\n enabled: m.enabled !== false,\n })));\n } catch (error) {\n console.error('更新路由信息失败', error);\n }\n };\n\n useEffect(() => {\n if (!visible) {\n return;\n }\n updateRouteInfo();\n const timer = setInterval(updateRouteInfo, 1000);\n return () => clearInterval(timer);\n }, [visible]);\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setVisible(true)}\n style={{\n position: 'fixed',\n right: 20,\n bottom: 20,\n zIndex: 9999,\n border: 'none',\n background: '#2f80ed',\n color: '#fff',\n borderRadius: 999,\n padding: '8px 12px',\n cursor: 'pointer',\n }}\n >\n 路由调试\n </button>\n\n {visible && (\n <div\n style={{\n position: 'fixed',\n top: 0,\n right: 0,\n width: 'min(800px, 96vw)',\n height: '100vh',\n zIndex: 10000,\n background: '#fff',\n borderLeft: '1px solid #d9e2ec',\n boxShadow: '-8px 0 20px rgba(0, 0, 0, 0.08)',\n padding: 16,\n overflowY: 'auto',\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <h3 style={{ margin: 0 }}>路由调试工具</h3>\n <div style={{ display: 'flex', gap: 8 }}>\n <button onClick={updateRouteInfo}>刷新</button>\n <button onClick={() => setVisible(false)}>关闭</button>\n </div>\n </div>\n\n <section style={{ marginTop: 12 }}>\n <h4>当前路由</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(currentRoute || {})}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>路由状态</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(routeState)}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>生命周期钩子</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(lifecycleHooks)}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>中间件</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(middlewares)}\n </pre>\n </section>\n </div>\n )}\n </>\n );\n}\n"],"names":["RouterDevTools","pretty","value","JSON","stringify","String","process","env","NODE_ENV","visible","setVisible","useState","currentRoute","setCurrentRoute","routeState","setRouteState","lifecycleHooks","setLifecycleHooks","middlewares","setMiddlewares","updateRouteInfo","route","RouterNavigation","getCurrentRoute","router","getRouterManager","getRouter","state","pathname","location","search","hash","hooks","getRouterLifecycleManager","getAll","map","hook","index","key","hasBeforeEach","beforeEach","hasAfterEach","afterEach","middlewareList","getRouterMiddlewareManager","m","name","priority","enabled","error","console","useEffect","timer","setInterval","clearInterval","button","type","onClick","style","position","right","bottom","zIndex","border","background","color","borderRadius","padding","cursor","div","top","width","height","borderLeft","boxShadow","overflowY","display","justifyContent","alignItems","h3","margin","gap","section","marginTop","h4","pre"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/core/router/dev/RouterDevTools.tsx"],"sourcesContent":["/**\n * 路由调试工具(开发环境,无 UI 框架依赖)\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { getRouterManager } from '../RouterManager';\nimport { getRouterLifecycleManager } from '../lifecycle';\nimport { getRouterMiddlewareManager } from '../middleware';\nimport { RouterNavigation } from '../navigation';\nimport type { RouteLocation } from '../types';\n\nfunction pretty(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function RouterDevTools(): React.ReactElement | null {\n if (process.env.NODE_ENV !== 'development') {\n return null;\n }\n\n const [visible, setVisible] = useState(false);\n const [currentRoute, setCurrentRoute] = useState<RouteLocation | null>(null);\n const [routeState, setRouteState] = useState<Record<string, unknown>>({});\n const [lifecycleHooks, setLifecycleHooks] = useState<\n Array<{ key: number; hasBeforeEach: boolean; hasAfterEach: boolean }>\n >([]);\n const [middlewares, setMiddlewares] = useState<\n Array<{ key: number; name: string; priority: number; enabled: boolean }>\n >([]);\n\n const updateRouteInfo = () => {\n try {\n const route = RouterNavigation.getCurrentRoute();\n setCurrentRoute(route);\n\n const router = getRouterManager().getRouter();\n if (router) {\n const state = router.state;\n setRouteState({\n pathname: state.location.pathname,\n search: state.location.search || '',\n hash: state.location.hash || '',\n state: state.location.state || {},\n });\n } else {\n setRouteState({});\n }\n\n const hooks = getRouterLifecycleManager().getAll();\n setLifecycleHooks(hooks.map((hook, index) => ({\n key: index,\n hasBeforeEach: !!hook.beforeEach,\n hasAfterEach: !!hook.afterEach,\n })));\n\n const middlewareList = getRouterMiddlewareManager().getAll();\n setMiddlewares(middlewareList.map((m, index) => ({\n key: index,\n name: m.name || `middleware-${index}`,\n priority: m.priority || 100,\n enabled: m.enabled !== false,\n })));\n } catch (error) {\n console.error('更新路由信息失败', error);\n }\n };\n\n useEffect(() => {\n if (!visible) {\n return;\n }\n updateRouteInfo();\n const timer = setInterval(updateRouteInfo, 1000);\n return () => clearInterval(timer);\n }, [visible]);\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setVisible(true)}\n style={{\n position: 'fixed',\n right: 20,\n bottom: 20,\n zIndex: 9999,\n border: 'none',\n background: '#2f80ed',\n color: '#fff',\n borderRadius: 999,\n padding: '8px 12px',\n cursor: 'pointer',\n }}\n >\n 路由调试\n </button>\n\n {visible && (\n <div\n style={{\n position: 'fixed',\n top: 0,\n right: 0,\n width: 'min(800px, 96vw)',\n height: '100vh',\n zIndex: 10000,\n background: '#fff',\n borderLeft: '1px solid #d9e2ec',\n boxShadow: '-8px 0 20px rgba(0, 0, 0, 0.08)',\n padding: 16,\n overflowY: 'auto',\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <h3 style={{ margin: 0 }}>路由调试工具</h3>\n <div style={{ display: 'flex', gap: 8 }}>\n <button onClick={updateRouteInfo}>刷新</button>\n <button onClick={() => setVisible(false)}>关闭</button>\n </div>\n </div>\n\n <section style={{ marginTop: 12 }}>\n <h4>当前路由</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(currentRoute || {})}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>路由状态</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(routeState)}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>生命周期钩子</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(lifecycleHooks)}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>中间件</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(middlewares)}\n </pre>\n </section>\n </div>\n )}\n </>\n );\n}\n"],"names":["RouterDevTools","pretty","value","JSON","stringify","String","process","env","NODE_ENV","visible","setVisible","useState","currentRoute","setCurrentRoute","routeState","setRouteState","lifecycleHooks","setLifecycleHooks","middlewares","setMiddlewares","updateRouteInfo","route","RouterNavigation","getCurrentRoute","router","getRouterManager","getRouter","state","pathname","location","search","hash","hooks","getRouterLifecycleManager","getAll","map","hook","index","key","hasBeforeEach","beforeEach","hasAfterEach","afterEach","middlewareList","getRouterMiddlewareManager","m","name","priority","enabled","error","console","useEffect","timer","setInterval","clearInterval","button","type","onClick","style","position","right","bottom","zIndex","border","background","color","borderRadius","padding","cursor","div","top","width","height","borderLeft","boxShadow","overflowY","display","justifyContent","alignItems","h3","margin","gap","section","marginTop","h4","pre"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/router/dev/RouterDevTools.tsx"],"sourcesContent":["/**\n * 路由调试工具(开发环境,无 UI 框架依赖)\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { getRouterManager } from '../RouterManager';\nimport { getRouterLifecycleManager } from '../lifecycle';\nimport { getRouterMiddlewareManager } from '../middleware';\nimport { RouterNavigation } from '../navigation';\nimport type { RouteLocation } from '../types';\n\nfunction pretty(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function RouterDevTools(): React.ReactElement | null {\n if (process.env.NODE_ENV !== 'development') {\n return null;\n }\n\n const [visible, setVisible] = useState(false);\n const [currentRoute, setCurrentRoute] = useState<RouteLocation | null>(null);\n const [routeState, setRouteState] = useState<Record<string, unknown>>({});\n const [lifecycleHooks, setLifecycleHooks] = useState<any[]>([]);\n const [middlewares, setMiddlewares] = useState<any[]>([]);\n\n const updateRouteInfo = () => {\n try {\n const route = RouterNavigation.getCurrentRoute();\n setCurrentRoute(route);\n\n const router = getRouterManager().getRouter();\n if (router) {\n const state = router.state;\n setRouteState({\n pathname: state.location.pathname,\n search: state.location.search || '',\n hash: state.location.hash || '',\n state: state.location.state || {},\n });\n } else {\n setRouteState({});\n }\n\n const hooks = getRouterLifecycleManager().getAll();\n setLifecycleHooks(hooks.map((hook, index) => ({\n key: index,\n hasBeforeEach: !!hook.beforeEach,\n hasAfterEach: !!hook.afterEach,\n })));\n\n const middlewareList = getRouterMiddlewareManager().getAll();\n setMiddlewares(middlewareList.map((m, index) => ({\n key: index,\n name: m.name || `middleware-${index}`,\n priority: m.priority || 100,\n enabled: m.enabled !== false,\n })));\n } catch (error) {\n console.error('更新路由信息失败', error);\n }\n };\n\n useEffect(() => {\n if (!visible) {\n return;\n }\n updateRouteInfo();\n const timer = setInterval(updateRouteInfo, 1000);\n return () => clearInterval(timer);\n }, [visible]);\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setVisible(true)}\n style={{\n position: 'fixed',\n right: 20,\n bottom: 20,\n zIndex: 9999,\n border: 'none',\n background: '#2f80ed',\n color: '#fff',\n borderRadius: 999,\n padding: '8px 12px',\n cursor: 'pointer',\n }}\n >\n 路由调试\n </button>\n\n {visible && (\n <div\n style={{\n position: 'fixed',\n top: 0,\n right: 0,\n width: 'min(800px, 96vw)',\n height: '100vh',\n zIndex: 10000,\n background: '#fff',\n borderLeft: '1px solid #d9e2ec',\n boxShadow: '-8px 0 20px rgba(0, 0, 0, 0.08)',\n padding: 16,\n overflowY: 'auto',\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <h3 style={{ margin: 0 }}>路由调试工具</h3>\n <div style={{ display: 'flex', gap: 8 }}>\n <button onClick={updateRouteInfo}>刷新</button>\n <button onClick={() => setVisible(false)}>关闭</button>\n </div>\n </div>\n\n <section style={{ marginTop: 12 }}>\n <h4>当前路由</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(currentRoute || {})}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>路由状态</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(routeState)}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>生命周期钩子</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(lifecycleHooks)}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>中间件</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(middlewares)}\n </pre>\n </section>\n </div>\n )}\n </>\n );\n}\n"],"names":["React","useState","useEffect","getRouterManager","getRouterLifecycleManager","getRouterMiddlewareManager","RouterNavigation","pretty","value","JSON","stringify","String","RouterDevTools","process","env","NODE_ENV","visible","setVisible","currentRoute","setCurrentRoute","routeState","setRouteState","lifecycleHooks","setLifecycleHooks","middlewares","setMiddlewares","updateRouteInfo","route","getCurrentRoute","router","getRouter","state","pathname","location","search","hash","hooks","getAll","map","hook","index","key","hasBeforeEach","beforeEach","hasAfterEach","afterEach","middlewareList","m","name","priority","enabled","error","console","timer","setInterval","clearInterval","button","type","onClick","style","position","right","bottom","zIndex","border","background","color","borderRadius","padding","cursor","div","top","width","height","borderLeft","boxShadow","overflowY","display","justifyContent","alignItems","h3","margin","gap","section","marginTop","h4","pre"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/core/router/dev/RouterDevTools.tsx"],"sourcesContent":["/**\n * 路由调试工具(开发环境,无 UI 框架依赖)\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { getRouterManager } from '../RouterManager';\nimport { getRouterLifecycleManager } from '../lifecycle';\nimport { getRouterMiddlewareManager } from '../middleware';\nimport { RouterNavigation } from '../navigation';\nimport type { RouteLocation } from '../types';\n\nfunction pretty(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nexport function RouterDevTools(): React.ReactElement | null {\n if (process.env.NODE_ENV !== 'development') {\n return null;\n }\n\n const [visible, setVisible] = useState(false);\n const [currentRoute, setCurrentRoute] = useState<RouteLocation | null>(null);\n const [routeState, setRouteState] = useState<Record<string, unknown>>({});\n const [lifecycleHooks, setLifecycleHooks] = useState<\n Array<{ key: number; hasBeforeEach: boolean; hasAfterEach: boolean }>\n >([]);\n const [middlewares, setMiddlewares] = useState<\n Array<{ key: number; name: string; priority: number; enabled: boolean }>\n >([]);\n\n const updateRouteInfo = () => {\n try {\n const route = RouterNavigation.getCurrentRoute();\n setCurrentRoute(route);\n\n const router = getRouterManager().getRouter();\n if (router) {\n const state = router.state;\n setRouteState({\n pathname: state.location.pathname,\n search: state.location.search || '',\n hash: state.location.hash || '',\n state: state.location.state || {},\n });\n } else {\n setRouteState({});\n }\n\n const hooks = getRouterLifecycleManager().getAll();\n setLifecycleHooks(hooks.map((hook, index) => ({\n key: index,\n hasBeforeEach: !!hook.beforeEach,\n hasAfterEach: !!hook.afterEach,\n })));\n\n const middlewareList = getRouterMiddlewareManager().getAll();\n setMiddlewares(middlewareList.map((m, index) => ({\n key: index,\n name: m.name || `middleware-${index}`,\n priority: m.priority || 100,\n enabled: m.enabled !== false,\n })));\n } catch (error) {\n console.error('更新路由信息失败', error);\n }\n };\n\n useEffect(() => {\n if (!visible) {\n return;\n }\n updateRouteInfo();\n const timer = setInterval(updateRouteInfo, 1000);\n return () => clearInterval(timer);\n }, [visible]);\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setVisible(true)}\n style={{\n position: 'fixed',\n right: 20,\n bottom: 20,\n zIndex: 9999,\n border: 'none',\n background: '#2f80ed',\n color: '#fff',\n borderRadius: 999,\n padding: '8px 12px',\n cursor: 'pointer',\n }}\n >\n 路由调试\n </button>\n\n {visible && (\n <div\n style={{\n position: 'fixed',\n top: 0,\n right: 0,\n width: 'min(800px, 96vw)',\n height: '100vh',\n zIndex: 10000,\n background: '#fff',\n borderLeft: '1px solid #d9e2ec',\n boxShadow: '-8px 0 20px rgba(0, 0, 0, 0.08)',\n padding: 16,\n overflowY: 'auto',\n }}\n >\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <h3 style={{ margin: 0 }}>路由调试工具</h3>\n <div style={{ display: 'flex', gap: 8 }}>\n <button onClick={updateRouteInfo}>刷新</button>\n <button onClick={() => setVisible(false)}>关闭</button>\n </div>\n </div>\n\n <section style={{ marginTop: 12 }}>\n <h4>当前路由</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(currentRoute || {})}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>路由状态</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(routeState)}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>生命周期钩子</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(lifecycleHooks)}\n </pre>\n </section>\n\n <section style={{ marginTop: 12 }}>\n <h4>中间件</h4>\n <pre style={{ background: '#f7fafc', borderRadius: 8, padding: 12 }}>\n {pretty(middlewares)}\n </pre>\n </section>\n </div>\n )}\n </>\n );\n}\n"],"names":["React","useState","useEffect","getRouterManager","getRouterLifecycleManager","getRouterMiddlewareManager","RouterNavigation","pretty","value","JSON","stringify","String","RouterDevTools","process","env","NODE_ENV","visible","setVisible","currentRoute","setCurrentRoute","routeState","setRouteState","lifecycleHooks","setLifecycleHooks","middlewares","setMiddlewares","updateRouteInfo","route","getCurrentRoute","router","getRouter","state","pathname","location","search","hash","hooks","getAll","map","hook","index","key","hasBeforeEach","beforeEach","hasAfterEach","afterEach","middlewareList","m","name","priority","enabled","error","console","timer","setInterval","clearInterval","button","type","onClick","style","position","right","bottom","zIndex","border","background","color","borderRadius","padding","cursor","div","top","width","height","borderLeft","boxShadow","overflowY","display","justifyContent","alignItems","h3","margin","gap","section","marginTop","h4","pre"],"mappings":";AAAA;;CAEC,GAED,OAAOA,SAASC,QAAQ,EAAEC,SAAS,QAAQ,QAAQ;AACnD,SAASC,gBAAgB,QAAQ,mBAAmB;AACpD,SAASC,yBAAyB,QAAQ,eAAe;AACzD,SAASC,0BAA0B,QAAQ,gBAAgB;AAC3D,SAASC,gBAAgB,QAAQ,gBAAgB;AAGjD,SAASC,OAAOC,KAAc;IAC5B,IAAI;QACF,OAAOC,KAAKC,SAAS,CAACF,OAAO,MAAM;IACrC,EAAE,OAAM;QACN,OAAOG,OAAOH;IAChB;AACF;AAEA,OAAO,SAASI;IACd,IAAIC,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;QAC1C,OAAO;IACT;IAEA,MAAM,CAACC,SAASC,WAAW,GAAGhB,SAAS;IACvC,MAAM,CAACiB,cAAcC,gBAAgB,GAAGlB,SAA+B;IACvE,MAAM,CAACmB,YAAYC,cAAc,GAAGpB,SAAkC,CAAC;IACvE,MAAM,CAACqB,gBAAgBC,kBAAkB,GAAGtB,SAE1C,EAAE;IACJ,MAAM,CAACuB,aAAaC,eAAe,GAAGxB,SAEpC,EAAE;IAEJ,MAAMyB,kBAAkB;QACtB,IAAI;YACF,MAAMC,QAAQrB,iBAAiBsB,eAAe;YAC9CT,gBAAgBQ;YAEhB,MAAME,SAAS1B,mBAAmB2B,SAAS;YAC3C,IAAID,QAAQ;gBACV,MAAME,QAAQF,OAAOE,KAAK;gBAC1BV,cAAc;oBACZW,UAAUD,MAAME,QAAQ,CAACD,QAAQ;oBACjCE,QAAQH,MAAME,QAAQ,CAACC,MAAM,IAAI;oBACjCC,MAAMJ,MAAME,QAAQ,CAACE,IAAI,IAAI;oBAC7BJ,OAAOA,MAAME,QAAQ,CAACF,KAAK,IAAI,CAAC;gBAClC;YACF,OAAO;gBACLV,cAAc,CAAC;YACjB;YAEA,MAAMe,QAAQhC,4BAA4BiC,MAAM;YAChDd,kBAAkBa,MAAME,GAAG,CAAC,CAACC,MAAMC,QAAW,CAAA;oBAC5CC,KAAKD;oBACLE,eAAe,CAAC,CAACH,KAAKI,UAAU;oBAChCC,cAAc,CAAC,CAACL,KAAKM,SAAS;gBAChC,CAAA;YAEA,MAAMC,iBAAiBzC,6BAA6BgC,MAAM;YAC1DZ,eAAeqB,eAAeR,GAAG,CAAC,CAACS,GAAGP,QAAW,CAAA;oBAC/CC,KAAKD;oBACLQ,MAAMD,EAAEC,IAAI,IAAI,CAAC,WAAW,EAAER,OAAO;oBACrCS,UAAUF,EAAEE,QAAQ,IAAI;oBACxBC,SAASH,EAAEG,OAAO,KAAK;gBACzB,CAAA;QACF,EAAE,OAAOC,OAAO;YACdC,QAAQD,KAAK,CAAC,YAAYA;QAC5B;IACF;IAEAjD,UAAU;QACR,IAAI,CAACc,SAAS;YACZ;QACF;QACAU;QACA,MAAM2B,QAAQC,YAAY5B,iBAAiB;QAC3C,OAAO,IAAM6B,cAAcF;IAC7B,GAAG;QAACrC;KAAQ;IAEZ,qBACE;;0BACE,KAACwC;gBACCC,MAAK;gBACLC,SAAS,IAAMzC,WAAW;gBAC1B0C,OAAO;oBACLC,UAAU;oBACVC,OAAO;oBACPC,QAAQ;oBACRC,QAAQ;oBACRC,QAAQ;oBACRC,YAAY;oBACZC,OAAO;oBACPC,cAAc;oBACdC,SAAS;oBACTC,QAAQ;gBACV;0BACD;;YAIArD,yBACC,MAACsD;gBACCX,OAAO;oBACLC,UAAU;oBACVW,KAAK;oBACLV,OAAO;oBACPW,OAAO;oBACPC,QAAQ;oBACRV,QAAQ;oBACRE,YAAY;oBACZS,YAAY;oBACZC,WAAW;oBACXP,SAAS;oBACTQ,WAAW;gBACb;;kCAEA,MAACN;wBAAIX,OAAO;4BAAEkB,SAAS;4BAAQC,gBAAgB;4BAAiBC,YAAY;wBAAS;;0CACnF,KAACC;gCAAGrB,OAAO;oCAAEsB,QAAQ;gCAAE;0CAAG;;0CAC1B,MAACX;gCAAIX,OAAO;oCAAEkB,SAAS;oCAAQK,KAAK;gCAAE;;kDACpC,KAAC1B;wCAAOE,SAAShC;kDAAiB;;kDAClC,KAAC8B;wCAAOE,SAAS,IAAMzC,WAAW;kDAAQ;;;;;;kCAI9C,MAACkE;wBAAQxB,OAAO;4BAAEyB,WAAW;wBAAG;;0CAC9B,KAACC;0CAAG;;0CACJ,KAACC;gCAAI3B,OAAO;oCAAEM,YAAY;oCAAWE,cAAc;oCAAGC,SAAS;gCAAG;0CAC/D7D,OAAOW,gBAAgB,CAAC;;;;kCAI7B,MAACiE;wBAAQxB,OAAO;4BAAEyB,WAAW;wBAAG;;0CAC9B,KAACC;0CAAG;;0CACJ,KAACC;gCAAI3B,OAAO;oCAAEM,YAAY;oCAAWE,cAAc;oCAAGC,SAAS;gCAAG;0CAC/D7D,OAAOa;;;;kCAIZ,MAAC+D;wBAAQxB,OAAO;4BAAEyB,WAAW;wBAAG;;0CAC9B,KAACC;0CAAG;;0CACJ,KAACC;gCAAI3B,OAAO;oCAAEM,YAAY;oCAAWE,cAAc;oCAAGC,SAAS;gCAAG;0CAC/D7D,OAAOe;;;;kCAIZ,MAAC6D;wBAAQxB,OAAO;4BAAEyB,WAAW;wBAAG;;0CAC9B,KAACC;0CAAG;;0CACJ,KAACC;gCAAI3B,OAAO;oCAAEM,YAAY;oCAAWE,cAAc;oCAAGC,SAAS;gCAAG;0CAC/D7D,OAAOiB;;;;;;;;AAOtB"}