@vlian/framework 1.2.61 → 1.2.62

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 (260) hide show
  1. package/dist/analytics.umd.js +1 -1
  2. package/dist/components/index.cjs +1 -1
  3. package/dist/components/index.d.ts +0 -4
  4. package/dist/components/index.js +1 -1
  5. package/dist/core-bak/Test.cjs +1 -0
  6. package/dist/core-bak/Test.d.ts +5 -0
  7. package/dist/core-bak/Test.js +1 -0
  8. package/dist/core-bak/app/AppContext.cjs +1 -0
  9. package/dist/core-bak/app/AppContext.d.ts +113 -0
  10. package/dist/core-bak/app/AppContext.js +1 -0
  11. package/dist/core-bak/app/AppContext.types.cjs +1 -0
  12. package/dist/core-bak/app/AppContext.types.d.ts +146 -0
  13. package/dist/core-bak/app/AppContext.types.js +1 -0
  14. package/dist/core-bak/app/BasicLayout.cjs +1 -0
  15. package/dist/core-bak/app/BasicLayout.d.ts +15 -0
  16. package/dist/core-bak/app/BasicLayout.js +1 -0
  17. package/dist/core-bak/app/DefaultApp.cjs +1 -0
  18. package/dist/core-bak/app/DefaultApp.d.ts +10 -0
  19. package/dist/core-bak/app/DefaultApp.js +1 -0
  20. package/dist/core-bak/app/index.cjs +1 -0
  21. package/dist/core-bak/app/index.d.ts +8 -0
  22. package/dist/core-bak/app/index.js +1 -0
  23. package/dist/core-bak/config/AppConfig.cjs +1 -0
  24. package/dist/core-bak/config/AppConfig.d.ts +88 -0
  25. package/dist/core-bak/config/AppConfig.js +1 -0
  26. package/dist/core-bak/config/ConfigLoader.cjs +1 -0
  27. package/dist/core-bak/config/ConfigLoader.d.ts +118 -0
  28. package/dist/core-bak/config/ConfigLoader.js +1 -0
  29. package/dist/core-bak/config/ConfigValidator.cjs +2 -0
  30. package/dist/core-bak/config/ConfigValidator.d.ts +84 -0
  31. package/dist/core-bak/config/ConfigValidator.js +2 -0
  32. package/dist/core-bak/config/index.cjs +1 -0
  33. package/dist/core-bak/config/index.d.ts +6 -0
  34. package/dist/core-bak/config/index.js +1 -0
  35. package/dist/core-bak/dev/DevTools.cjs +1 -0
  36. package/dist/core-bak/dev/DevTools.d.ts +16 -0
  37. package/dist/core-bak/dev/DevTools.js +1 -0
  38. package/dist/core-bak/error/ErrorBoundary.cjs +1 -0
  39. package/dist/core-bak/error/ErrorBoundary.d.ts +121 -0
  40. package/dist/core-bak/error/ErrorBoundary.js +1 -0
  41. package/dist/core-bak/error/ErrorHandler.cjs +1 -0
  42. package/dist/core-bak/error/ErrorHandler.d.ts +171 -0
  43. package/dist/core-bak/error/ErrorHandler.js +1 -0
  44. package/dist/core-bak/error/index.cjs +1 -0
  45. package/dist/core-bak/error/index.d.ts +7 -0
  46. package/dist/core-bak/error/index.js +1 -0
  47. package/dist/core-bak/event/AppEventBus.cjs +1 -0
  48. package/dist/core-bak/event/AppEventBus.d.ts +178 -0
  49. package/dist/core-bak/event/AppEventBus.js +1 -0
  50. package/dist/core-bak/event/frameworkEvents.cjs +1 -0
  51. package/dist/core-bak/event/frameworkEvents.d.ts +69 -0
  52. package/dist/core-bak/event/frameworkEvents.js +1 -0
  53. package/dist/core-bak/event/hooks.cjs +1 -0
  54. package/dist/core-bak/event/hooks.d.ts +57 -0
  55. package/dist/core-bak/event/hooks.js +1 -0
  56. package/dist/core-bak/event/index.cjs +1 -0
  57. package/dist/core-bak/event/index.d.ts +10 -0
  58. package/dist/core-bak/event/index.js +1 -0
  59. package/dist/core-bak/event/types.cjs +1 -0
  60. package/dist/core-bak/event/types.d.ts +269 -0
  61. package/dist/core-bak/event/types.js +1 -0
  62. package/dist/core-bak/event/useEventBus.cjs +1 -0
  63. package/dist/core-bak/event/useEventBus.d.ts +28 -0
  64. package/dist/core-bak/event/useEventBus.js +1 -0
  65. package/dist/core-bak/index.cjs +1 -0
  66. package/dist/core-bak/index.d.ts +54 -0
  67. package/dist/core-bak/index.js +1 -0
  68. package/dist/core-bak/initialization/InitializationErrorThrower.cjs +1 -0
  69. package/dist/core-bak/initialization/InitializationErrorThrower.d.ts +7 -0
  70. package/dist/core-bak/initialization/InitializationErrorThrower.js +1 -0
  71. package/dist/core-bak/initialization/index.cjs +1 -0
  72. package/dist/core-bak/initialization/index.d.ts +7 -0
  73. package/dist/core-bak/initialization/index.js +1 -0
  74. package/dist/core-bak/initialization/initialization.cjs +1 -0
  75. package/dist/core-bak/initialization/initialization.d.ts +69 -0
  76. package/dist/core-bak/initialization/initialization.js +1 -0
  77. package/dist/core-bak/initialization/initializationErrorState.cjs +1 -0
  78. package/dist/core-bak/initialization/initializationErrorState.d.ts +35 -0
  79. package/dist/core-bak/initialization/initializationErrorState.js +1 -0
  80. package/dist/core-bak/kernel/defaultAdapters.cjs +1 -0
  81. package/dist/core-bak/kernel/defaultAdapters.d.ts +2 -0
  82. package/dist/core-bak/kernel/defaultAdapters.js +1 -0
  83. package/dist/core-bak/kernel/errors.cjs +1 -0
  84. package/dist/core-bak/kernel/errors.d.ts +18 -0
  85. package/dist/core-bak/kernel/errors.js +1 -0
  86. package/dist/core-bak/kernel/index.cjs +1 -0
  87. package/dist/core-bak/kernel/index.d.ts +3 -0
  88. package/dist/core-bak/kernel/index.js +1 -0
  89. package/dist/core-bak/kernel/startKernel.cjs +1 -0
  90. package/dist/core-bak/kernel/startKernel.d.ts +2 -0
  91. package/dist/core-bak/kernel/startKernel.js +1 -0
  92. package/dist/core-bak/kernel/types.cjs +1 -0
  93. package/dist/core-bak/kernel/types.d.ts +114 -0
  94. package/dist/core-bak/kernel/types.js +1 -0
  95. package/dist/core-bak/middleware.cjs +1 -0
  96. package/dist/core-bak/middleware.d.ts +36 -0
  97. package/dist/core-bak/middleware.js +1 -0
  98. package/dist/core-bak/plugin/PluginEventBus.cjs +1 -0
  99. package/dist/core-bak/plugin/PluginEventBus.d.ts +169 -0
  100. package/dist/core-bak/plugin/PluginEventBus.js +1 -0
  101. package/dist/core-bak/plugin/PluginSandbox.cjs +1 -0
  102. package/dist/core-bak/plugin/PluginSandbox.d.ts +101 -0
  103. package/dist/core-bak/plugin/PluginSandbox.js +1 -0
  104. package/dist/core-bak/plugin.cjs +1 -0
  105. package/dist/core-bak/plugin.d.ts +224 -0
  106. package/dist/core-bak/plugin.js +1 -0
  107. package/dist/core-bak/router/RouterManager.cjs +1 -0
  108. package/dist/core-bak/router/RouterManager.d.ts +87 -0
  109. package/dist/core-bak/router/RouterManager.js +1 -0
  110. package/dist/core-bak/router/adapter/AdapterManager.cjs +1 -0
  111. package/dist/core-bak/router/adapter/AdapterManager.d.ts +94 -0
  112. package/dist/core-bak/router/adapter/AdapterManager.js +1 -0
  113. package/dist/core-bak/router/adapter/index.cjs +1 -0
  114. package/dist/core-bak/router/adapter/index.d.ts +6 -0
  115. package/dist/core-bak/router/adapter/index.js +1 -0
  116. package/dist/core-bak/router/adapter/react-router/ReactRouterAdapter.cjs +1 -0
  117. package/dist/core-bak/router/adapter/react-router/ReactRouterAdapter.d.ts +43 -0
  118. package/dist/core-bak/router/adapter/react-router/ReactRouterAdapter.js +1 -0
  119. package/dist/core-bak/router/adapter/react-router/index.cjs +1 -0
  120. package/dist/core-bak/router/adapter/react-router/index.d.ts +4 -0
  121. package/dist/core-bak/router/adapter/react-router/index.js +1 -0
  122. package/dist/core-bak/router/adapter/types.cjs +1 -0
  123. package/dist/core-bak/router/adapter/types.d.ts +111 -0
  124. package/dist/core-bak/router/adapter/types.js +1 -0
  125. package/dist/core-bak/router/dev/RouterDevTools.cjs +1 -0
  126. package/dist/core-bak/router/dev/RouterDevTools.d.ts +5 -0
  127. package/dist/core-bak/router/dev/RouterDevTools.js +1 -0
  128. package/dist/core-bak/router/dev/index.cjs +1 -0
  129. package/dist/core-bak/router/dev/index.d.ts +4 -0
  130. package/dist/core-bak/router/dev/index.js +1 -0
  131. package/dist/core-bak/router/dynamic/DynamicRouteManager.cjs +1 -0
  132. package/dist/core-bak/router/dynamic/DynamicRouteManager.d.ts +71 -0
  133. package/dist/core-bak/router/dynamic/DynamicRouteManager.js +1 -0
  134. package/dist/core-bak/router/dynamic/index.cjs +1 -0
  135. package/dist/core-bak/router/dynamic/index.d.ts +4 -0
  136. package/dist/core-bak/router/dynamic/index.js +1 -0
  137. package/dist/core-bak/router/errors/RouterError.cjs +1 -0
  138. package/dist/core-bak/router/errors/RouterError.d.ts +48 -0
  139. package/dist/core-bak/router/errors/RouterError.js +1 -0
  140. package/dist/core-bak/router/errors/index.cjs +1 -0
  141. package/dist/core-bak/router/errors/index.d.ts +4 -0
  142. package/dist/core-bak/router/errors/index.js +1 -0
  143. package/dist/core-bak/router/index.cjs +1 -0
  144. package/dist/core-bak/router/index.d.ts +16 -0
  145. package/dist/core-bak/router/index.js +1 -0
  146. package/dist/core-bak/router/lifecycle/RouterLifecycleManager.cjs +1 -0
  147. package/dist/core-bak/router/lifecycle/RouterLifecycleManager.d.ts +56 -0
  148. package/dist/core-bak/router/lifecycle/RouterLifecycleManager.js +1 -0
  149. package/dist/core-bak/router/lifecycle/index.cjs +1 -0
  150. package/dist/core-bak/router/lifecycle/index.d.ts +4 -0
  151. package/dist/core-bak/router/lifecycle/index.js +1 -0
  152. package/dist/core-bak/router/middleware/RouterMiddlewareManager.cjs +1 -0
  153. package/dist/core-bak/router/middleware/RouterMiddlewareManager.d.ts +61 -0
  154. package/dist/core-bak/router/middleware/RouterMiddlewareManager.js +1 -0
  155. package/dist/core-bak/router/middleware/auth.cjs +1 -0
  156. package/dist/core-bak/router/middleware/auth.d.ts +54 -0
  157. package/dist/core-bak/router/middleware/auth.js +1 -0
  158. package/dist/core-bak/router/middleware/index.cjs +1 -0
  159. package/dist/core-bak/router/middleware/index.d.ts +6 -0
  160. package/dist/core-bak/router/middleware/index.js +1 -0
  161. package/dist/core-bak/router/middleware/types.cjs +1 -0
  162. package/dist/core-bak/router/middleware/types.d.ts +82 -0
  163. package/dist/core-bak/router/middleware/types.js +1 -0
  164. package/dist/core-bak/router/monitoring/RouterMonitoring.cjs +1 -0
  165. package/dist/core-bak/router/monitoring/RouterMonitoring.d.ts +134 -0
  166. package/dist/core-bak/router/monitoring/RouterMonitoring.js +1 -0
  167. package/dist/core-bak/router/monitoring/index.cjs +1 -0
  168. package/dist/core-bak/router/monitoring/index.d.ts +4 -0
  169. package/dist/core-bak/router/monitoring/index.js +1 -0
  170. package/dist/core-bak/router/navigation/RouterNavigation.cjs +1 -0
  171. package/dist/core-bak/router/navigation/RouterNavigation.d.ts +43 -0
  172. package/dist/core-bak/router/navigation/RouterNavigation.js +1 -0
  173. package/dist/core-bak/router/navigation/index.cjs +1 -0
  174. package/dist/core-bak/router/navigation/index.d.ts +4 -0
  175. package/dist/core-bak/router/navigation/index.js +1 -0
  176. package/dist/core-bak/router/performance/RouteCache.cjs +1 -0
  177. package/dist/core-bak/router/performance/RouteCache.d.ts +113 -0
  178. package/dist/core-bak/router/performance/RouteCache.js +1 -0
  179. package/dist/core-bak/router/performance/RoutePreloader.cjs +1 -0
  180. package/dist/core-bak/router/performance/RoutePreloader.d.ts +111 -0
  181. package/dist/core-bak/router/performance/RoutePreloader.js +1 -0
  182. package/dist/core-bak/router/performance/index.cjs +1 -0
  183. package/dist/core-bak/router/performance/index.d.ts +5 -0
  184. package/dist/core-bak/router/performance/index.js +1 -0
  185. package/dist/core-bak/router/plugin/RouterPluginManager.cjs +1 -0
  186. package/dist/core-bak/router/plugin/RouterPluginManager.d.ts +74 -0
  187. package/dist/core-bak/router/plugin/RouterPluginManager.js +1 -0
  188. package/dist/core-bak/router/plugin/index.cjs +1 -0
  189. package/dist/core-bak/router/plugin/index.d.ts +5 -0
  190. package/dist/core-bak/router/plugin/index.js +1 -0
  191. package/dist/core-bak/router/plugin/types.cjs +1 -0
  192. package/dist/core-bak/router/plugin/types.d.ts +153 -0
  193. package/dist/core-bak/router/plugin/types.js +1 -0
  194. package/dist/core-bak/router/types.cjs +1 -0
  195. package/dist/core-bak/router/types.d.ts +464 -0
  196. package/dist/core-bak/router/types.js +1 -0
  197. package/dist/core-bak/router/utils/adapters/react-router/RouteErrorBoundary.cjs +1 -0
  198. package/dist/core-bak/router/utils/adapters/react-router/RouteErrorBoundary.d.ts +2 -0
  199. package/dist/core-bak/router/utils/adapters/react-router/RouteErrorBoundary.js +1 -0
  200. package/dist/core-bak/router/utils/adapters/react-router/transform.cjs +1 -0
  201. package/dist/core-bak/router/utils/adapters/react-router/transform.d.ts +5 -0
  202. package/dist/core-bak/router/utils/adapters/react-router/transform.js +1 -0
  203. package/dist/core-bak/router/utils/transform.cjs +1 -0
  204. package/dist/core-bak/router/utils/transform.d.ts +348 -0
  205. package/dist/core-bak/router/utils/transform.js +1 -0
  206. package/dist/core-bak/router/validation/RouterConfigValidator.cjs +2 -0
  207. package/dist/core-bak/router/validation/RouterConfigValidator.d.ts +121 -0
  208. package/dist/core-bak/router/validation/RouterConfigValidator.js +2 -0
  209. package/dist/core-bak/router/validation/index.cjs +1 -0
  210. package/dist/core-bak/router/validation/index.d.ts +5 -0
  211. package/dist/core-bak/router/validation/index.js +1 -0
  212. package/dist/core-bak/router/validation/schema.cjs +1 -0
  213. package/dist/core-bak/router/validation/schema.d.ts +180 -0
  214. package/dist/core-bak/router/validation/schema.js +1 -0
  215. package/dist/core-bak/router/version/RouteVersionManager.cjs +1 -0
  216. package/dist/core-bak/router/version/RouteVersionManager.d.ts +124 -0
  217. package/dist/core-bak/router/version/RouteVersionManager.js +1 -0
  218. package/dist/core-bak/router/version/index.cjs +1 -0
  219. package/dist/core-bak/router/version/index.d.ts +4 -0
  220. package/dist/core-bak/router/version/index.js +1 -0
  221. package/dist/core-bak/splash/SplashScreen.cjs +1 -0
  222. package/dist/core-bak/splash/SplashScreen.d.ts +14 -0
  223. package/dist/core-bak/splash/SplashScreen.js +1 -0
  224. package/dist/core-bak/splash/index.cjs +1 -0
  225. package/dist/core-bak/splash/index.d.ts +5 -0
  226. package/dist/core-bak/splash/index.js +1 -0
  227. package/dist/core-bak/splash/splashScreenUtils.cjs +1 -0
  228. package/dist/core-bak/splash/splashScreenUtils.d.ts +7 -0
  229. package/dist/core-bak/splash/splashScreenUtils.js +1 -0
  230. package/dist/core-bak/startup/AppInstance.cjs +1 -0
  231. package/dist/core-bak/startup/AppInstance.d.ts +138 -0
  232. package/dist/core-bak/startup/AppInstance.js +1 -0
  233. package/dist/core-bak/startup/environment.cjs +1 -0
  234. package/dist/core-bak/startup/environment.d.ts +87 -0
  235. package/dist/core-bak/startup/environment.js +1 -0
  236. package/dist/core-bak/startup/index.cjs +1 -0
  237. package/dist/core-bak/startup/index.d.ts +7 -0
  238. package/dist/core-bak/startup/index.js +1 -0
  239. package/dist/core-bak/startup/initializeServices.cjs +1 -0
  240. package/dist/core-bak/startup/initializeServices.d.ts +68 -0
  241. package/dist/core-bak/startup/initializeServices.js +1 -0
  242. package/dist/core-bak/startup/performanceTracker.cjs +1 -0
  243. package/dist/core-bak/startup/performanceTracker.d.ts +104 -0
  244. package/dist/core-bak/startup/performanceTracker.js +1 -0
  245. package/dist/core-bak/startup/renderApp.cjs +1 -0
  246. package/dist/core-bak/startup/renderApp.d.ts +70 -0
  247. package/dist/core-bak/startup/renderApp.js +1 -0
  248. package/dist/core-bak/startup/startApp.cjs +1 -0
  249. package/dist/core-bak/startup/startApp.d.ts +14 -0
  250. package/dist/core-bak/startup/startApp.js +1 -0
  251. package/dist/core-bak/types.cjs +1 -0
  252. package/dist/core-bak/types.d.ts +501 -0
  253. package/dist/core-bak/types.js +1 -0
  254. package/dist/index.cjs +1 -1
  255. package/dist/index.d.ts +0 -1
  256. package/dist/index.js +1 -1
  257. package/dist/index.umd.js +31 -246
  258. package/dist/kernel/types.d.ts +46 -3
  259. package/dist/state.umd.js +1 -1
  260. package/package.json +1 -11
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});_export_star(require("./RouterLifecycleManager"),exports);function _export_star(from,to){Object.keys(from).forEach(function(k){if(k!=="default"&&!Object.prototype.hasOwnProperty.call(to,k)){Object.defineProperty(to,k,{enumerable:true,get:function(){return from[k]}})}});return from}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 路由生命周期模块入口
3
+ */
4
+ export * from './RouterLifecycleManager';
@@ -0,0 +1 @@
1
+ export*from"./RouterLifecycleManager";
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get RouterMiddlewareManager(){return RouterMiddlewareManager},get getRouterMiddlewareManager(){return getRouterMiddlewareManager}});const _logger=require("@vlian/logger");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let RouterMiddlewareManager=class RouterMiddlewareManager{register(config){if(!config.middleware||typeof config.middleware!=="function"){throw new Error("中间件必须是一个函数")}const middlewareConfig={priority:100,enabled:true,...config};this.middlewares.push(middlewareConfig);this.middlewares.sort((a,b)=>(a.priority||100)-(b.priority||100));_logger.logger.debug(`路由中间件已注册: ${middlewareConfig.name||"anonymous"}`);return()=>{const index=this.middlewares.indexOf(middlewareConfig);if(index>-1){this.middlewares.splice(index,1);_logger.logger.debug(`路由中间件已取消注册: ${middlewareConfig.name||"anonymous"}`)}}}registerBatch(configs){configs.forEach(config=>this.register(config))}unregister(name){const index=this.middlewares.findIndex(m=>m.name===name);if(index>-1){this.middlewares.splice(index,1);_logger.logger.debug(`路由中间件已取消注册: ${name}`)}}clear(){this.middlewares=[];_logger.logger.debug("所有路由中间件已清空")}async execute(context){const enabledMiddlewares=this.middlewares.filter(m=>{if(!m.enabled){return false}if(m.condition&&!m.condition(context)){return false}return true});for(const middlewareConfig of enabledMiddlewares){try{const result=await middlewareConfig.middleware(context);if(result===false){_logger.logger.debug(`路由中间件阻止导航: ${middlewareConfig.name||"anonymous"} -> false`);return{allow:false,reason:"中间件返回 false"}}if(typeof result==="object"&&result!==null&&result.allow===false){_logger.logger.debug(`路由中间件阻止导航: ${middlewareConfig.name||"anonymous"}`,result);if(result.redirect&&!RouterMiddlewareManager.SAFE_REDIRECT_PATH_REGEX.test(result.redirect)){_logger.logger.warn(`路由中间件返回了不安全的重定向地址,已拦截: ${middlewareConfig.name||"anonymous"} -> ${result.redirect}`);return{allow:false,reason:"中间件返回了不安全的重定向地址"}}return result}if(typeof result==="string"){if(!RouterMiddlewareManager.SAFE_REDIRECT_PATH_REGEX.test(result)){_logger.logger.warn(`路由中间件返回了不安全的重定向地址,已拦截: ${middlewareConfig.name||"anonymous"} -> ${result}`);return{allow:false,reason:"中间件返回了不安全的重定向地址"}}_logger.logger.debug(`路由中间件重定向: ${middlewareConfig.name||"anonymous"} -> ${result}`);return{allow:false,redirect:result}}}catch(error){_logger.logger.error(`路由中间件执行失败: ${middlewareConfig.name||"anonymous"}`,error);continue}}return{allow:true}}getAll(){return[...this.middlewares]}getEnabled(){return this.middlewares.filter(m=>m.enabled)}getCount(){return this.middlewares.length}constructor(){_define_property(this,"middlewares",[])}};_define_property(RouterMiddlewareManager,"SAFE_REDIRECT_PATH_REGEX",/^(\/|\.\/|\.\.\/|#)/);let middlewareManagerInstance=null;function getRouterMiddlewareManager(){if(!middlewareManagerInstance){middlewareManagerInstance=new RouterMiddlewareManager}return middlewareManagerInstance}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * 路由中间件管理器
3
+ * 负责管理路由中间件的注册、执行和生命周期
4
+ */
5
+ import type { RouterMiddlewareConfig, RouterMiddlewareContext, RouterMiddlewareResult } from './types';
6
+ /**
7
+ * 路由中间件管理器
8
+ */
9
+ export declare class RouterMiddlewareManager {
10
+ private middlewares;
11
+ private static readonly SAFE_REDIRECT_PATH_REGEX;
12
+ /**
13
+ * 注册中间件
14
+ *
15
+ * @param config - 中间件配置
16
+ * @returns 取消注册函数
17
+ */
18
+ register(config: RouterMiddlewareConfig): () => void;
19
+ /**
20
+ * 批量注册中间件
21
+ *
22
+ * @param configs - 中间件配置数组
23
+ */
24
+ registerBatch(configs: RouterMiddlewareConfig[]): void;
25
+ /**
26
+ * 取消注册中间件
27
+ *
28
+ * @param name - 中间件名称
29
+ */
30
+ unregister(name: string): void;
31
+ /**
32
+ * 清空所有中间件
33
+ */
34
+ clear(): void;
35
+ /**
36
+ * 执行中间件链
37
+ *
38
+ * @param context - 中间件上下文
39
+ * @returns 中间件执行结果
40
+ */
41
+ execute(context: RouterMiddlewareContext): Promise<RouterMiddlewareResult>;
42
+ /**
43
+ * 获取所有中间件
44
+ *
45
+ * @returns 中间件配置数组
46
+ */
47
+ getAll(): RouterMiddlewareConfig[];
48
+ /**
49
+ * 获取启用的中间件
50
+ *
51
+ * @returns 启用的中间件配置数组
52
+ */
53
+ getEnabled(): RouterMiddlewareConfig[];
54
+ /**
55
+ * 获取中间件数量
56
+ *
57
+ * @returns 中间件数量
58
+ */
59
+ getCount(): number;
60
+ }
61
+ export declare function getRouterMiddlewareManager(): RouterMiddlewareManager;
@@ -0,0 +1 @@
1
+ function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}import{logger}from"@vlian/logger";export class RouterMiddlewareManager{register(config){if(!config.middleware||typeof config.middleware!=="function"){throw new Error("中间件必须是一个函数")}const middlewareConfig={priority:100,enabled:true,...config};this.middlewares.push(middlewareConfig);this.middlewares.sort((a,b)=>(a.priority||100)-(b.priority||100));logger.debug(`路由中间件已注册: ${middlewareConfig.name||"anonymous"}`);return()=>{const index=this.middlewares.indexOf(middlewareConfig);if(index>-1){this.middlewares.splice(index,1);logger.debug(`路由中间件已取消注册: ${middlewareConfig.name||"anonymous"}`)}}}registerBatch(configs){configs.forEach(config=>this.register(config))}unregister(name){const index=this.middlewares.findIndex(m=>m.name===name);if(index>-1){this.middlewares.splice(index,1);logger.debug(`路由中间件已取消注册: ${name}`)}}clear(){this.middlewares=[];logger.debug("所有路由中间件已清空")}async execute(context){const enabledMiddlewares=this.middlewares.filter(m=>{if(!m.enabled){return false}if(m.condition&&!m.condition(context)){return false}return true});for(const middlewareConfig of enabledMiddlewares){try{const result=await middlewareConfig.middleware(context);if(result===false){logger.debug(`路由中间件阻止导航: ${middlewareConfig.name||"anonymous"} -> false`);return{allow:false,reason:"中间件返回 false"}}if(typeof result==="object"&&result!==null&&result.allow===false){logger.debug(`路由中间件阻止导航: ${middlewareConfig.name||"anonymous"}`,result);if(result.redirect&&!RouterMiddlewareManager.SAFE_REDIRECT_PATH_REGEX.test(result.redirect)){logger.warn(`路由中间件返回了不安全的重定向地址,已拦截: ${middlewareConfig.name||"anonymous"} -> ${result.redirect}`);return{allow:false,reason:"中间件返回了不安全的重定向地址"}}return result}if(typeof result==="string"){if(!RouterMiddlewareManager.SAFE_REDIRECT_PATH_REGEX.test(result)){logger.warn(`路由中间件返回了不安全的重定向地址,已拦截: ${middlewareConfig.name||"anonymous"} -> ${result}`);return{allow:false,reason:"中间件返回了不安全的重定向地址"}}logger.debug(`路由中间件重定向: ${middlewareConfig.name||"anonymous"} -> ${result}`);return{allow:false,redirect:result}}}catch(error){logger.error(`路由中间件执行失败: ${middlewareConfig.name||"anonymous"}`,error);continue}}return{allow:true}}getAll(){return[...this.middlewares]}getEnabled(){return this.middlewares.filter(m=>m.enabled)}getCount(){return this.middlewares.length}constructor(){_define_property(this,"middlewares",[])}}_define_property(RouterMiddlewareManager,"SAFE_REDIRECT_PATH_REGEX",/^(\/|\.\/|\.\.\/|#)/);let middlewareManagerInstance=null;export function getRouterMiddlewareManager(){if(!middlewareManagerInstance){middlewareManagerInstance=new RouterMiddlewareManager}return middlewareManagerInstance}
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"createAuthMiddleware",{enumerable:true,get:function(){return createAuthMiddleware}});const _logger=require("@vlian/logger");function createAuthMiddleware(config){const{checkAuth,checkLogin,checkRole,loginRedirect="/login",forbiddenRedirect="/403"}=config;return async context=>{const{to}=context;const needLogin=to.meta?.needLogin||to.meta?.handle?.needLogin;if(needLogin){if(checkLogin){const isLoggedIn=await checkLogin();if(!isLoggedIn){_logger.logger.debug(`路由权限拦截: 未登录,重定向到 ${loginRedirect}`);return{allow:false,redirect:loginRedirect,reason:"需要登录"}}}}const roles=to.meta?.roles||to.meta?.handle?.roles;if(roles&&Array.isArray(roles)&&roles.length>0){if(checkRole){const hasRole=await checkRole(roles);if(!hasRole){_logger.logger.debug(`路由权限拦截: 无权限,重定向到 ${forbiddenRedirect}`);return{allow:false,redirect:forbiddenRedirect,reason:"无权限访问"}}}}if(checkAuth){const hasAuth=await checkAuth(context);if(!hasAuth){_logger.logger.debug(`路由权限拦截: 权限检查失败,重定向到 ${forbiddenRedirect}`);return{allow:false,redirect:forbiddenRedirect,reason:"权限检查失败"}}}return{allow:true}}}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * 路由权限拦截中间件
3
+ */
4
+ import type { RouterMiddleware, RouterMiddlewareContext } from './types';
5
+ /**
6
+ * 权限检查函数类型
7
+ */
8
+ export type AuthCheckFunction = (context: RouterMiddlewareContext) => boolean | Promise<boolean>;
9
+ /**
10
+ * 权限拦截中间件配置
11
+ */
12
+ export interface AuthMiddlewareConfig {
13
+ /**
14
+ * 权限检查函数
15
+ * 返回 true 表示有权限,false 表示无权限
16
+ */
17
+ checkAuth: AuthCheckFunction;
18
+ /**
19
+ * 登录状态检查函数
20
+ * 返回 true 表示已登录,false 表示未登录
21
+ */
22
+ checkLogin?: () => boolean | Promise<boolean>;
23
+ /**
24
+ * 角色检查函数
25
+ * 返回 true 表示有权限,false 表示无权限
26
+ */
27
+ checkRole?: (roles: string[]) => boolean | Promise<boolean>;
28
+ /**
29
+ * 未登录时重定向路径
30
+ * @default '/login'
31
+ */
32
+ loginRedirect?: string;
33
+ /**
34
+ * 无权限时重定向路径
35
+ * @default '/403'
36
+ */
37
+ forbiddenRedirect?: string;
38
+ /**
39
+ * 中间件名称
40
+ */
41
+ name?: string;
42
+ /**
43
+ * 优先级
44
+ * @default 10
45
+ */
46
+ priority?: number;
47
+ }
48
+ /**
49
+ * 创建权限拦截中间件
50
+ *
51
+ * @param config - 权限拦截中间件配置
52
+ * @returns 路由中间件函数
53
+ */
54
+ export declare function createAuthMiddleware(config: AuthMiddlewareConfig): RouterMiddleware;
@@ -0,0 +1 @@
1
+ import{logger}from"@vlian/logger";export function createAuthMiddleware(config){const{checkAuth,checkLogin,checkRole,loginRedirect="/login",forbiddenRedirect="/403"}=config;return async context=>{const{to}=context;const needLogin=to.meta?.needLogin||to.meta?.handle?.needLogin;if(needLogin){if(checkLogin){const isLoggedIn=await checkLogin();if(!isLoggedIn){logger.debug(`路由权限拦截: 未登录,重定向到 ${loginRedirect}`);return{allow:false,redirect:loginRedirect,reason:"需要登录"}}}}const roles=to.meta?.roles||to.meta?.handle?.roles;if(roles&&Array.isArray(roles)&&roles.length>0){if(checkRole){const hasRole=await checkRole(roles);if(!hasRole){logger.debug(`路由权限拦截: 无权限,重定向到 ${forbiddenRedirect}`);return{allow:false,redirect:forbiddenRedirect,reason:"无权限访问"}}}}if(checkAuth){const hasAuth=await checkAuth(context);if(!hasAuth){logger.debug(`路由权限拦截: 权限检查失败,重定向到 ${forbiddenRedirect}`);return{allow:false,redirect:forbiddenRedirect,reason:"权限检查失败"}}}return{allow:true}}}
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});_export_star(require("./types"),exports);_export_star(require("./RouterMiddlewareManager"),exports);_export_star(require("./auth"),exports);function _export_star(from,to){Object.keys(from).forEach(function(k){if(k!=="default"&&!Object.prototype.hasOwnProperty.call(to,k)){Object.defineProperty(to,k,{enumerable:true,get:function(){return from[k]}})}});return from}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 路由中间件模块入口
3
+ */
4
+ export * from './types';
5
+ export * from './RouterMiddlewareManager';
6
+ export * from './auth';
@@ -0,0 +1 @@
1
+ export*from"./types";export*from"./RouterMiddlewareManager";export*from"./auth";
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});
@@ -0,0 +1,82 @@
1
+ /**
2
+ * 路由中间件类型定义
3
+ */
4
+ import type { RouteLocation, NavigateOptions } from '../types';
5
+ /**
6
+ * 路由中间件上下文
7
+ */
8
+ export interface RouterMiddlewareContext {
9
+ /**
10
+ * 目标路由
11
+ */
12
+ to: RouteLocation;
13
+ /**
14
+ * 来源路由
15
+ */
16
+ from?: RouteLocation;
17
+ /**
18
+ * 导航选项
19
+ */
20
+ options?: NavigateOptions;
21
+ /**
22
+ * 中间件元数据
23
+ */
24
+ meta?: Record<string, unknown>;
25
+ }
26
+ /**
27
+ * 路由中间件结果
28
+ */
29
+ export type RouterMiddlewareResult = {
30
+ /**
31
+ * 允许继续导航
32
+ */
33
+ allow: true;
34
+ } | {
35
+ /**
36
+ * 阻止导航
37
+ */
38
+ allow: false;
39
+ /**
40
+ * 重定向路径(可选)
41
+ */
42
+ redirect?: string;
43
+ /**
44
+ * 阻止原因
45
+ */
46
+ reason?: string;
47
+ };
48
+ /**
49
+ * 路由中间件函数
50
+ */
51
+ export type RouterMiddleware = (context: RouterMiddlewareContext) => RouterMiddlewareResult | string | false | void | Promise<RouterMiddlewareResult | string | false | void>;
52
+ /**
53
+ * 路由中间件配置
54
+ */
55
+ export interface RouterMiddlewareConfig {
56
+ /**
57
+ * 中间件函数
58
+ */
59
+ middleware: RouterMiddleware;
60
+ /**
61
+ * 中间件名称
62
+ */
63
+ name?: string;
64
+ /**
65
+ * 优先级(数字越小优先级越高)
66
+ * @default 100
67
+ */
68
+ priority?: number;
69
+ /**
70
+ * 是否启用
71
+ * @default true
72
+ */
73
+ enabled?: boolean;
74
+ /**
75
+ * 条件函数(返回 true 时才执行中间件)
76
+ */
77
+ condition?: (context: RouterMiddlewareContext) => boolean;
78
+ }
79
+ /**
80
+ * 路由生命周期钩子结果
81
+ */
82
+ export type RouteLifecycleResult = void | string | false | Promise<void | string | false>;
@@ -0,0 +1 @@
1
+ export{};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get RouterMonitoring(){return RouterMonitoring},get getRouterMonitoring(){return getRouterMonitoring}});const _monitoring=require("@vlian/monitoring");const _logger=require("@vlian/logger");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let RouterMonitoring=class RouterMonitoring{trackRouteAccess(to,from,success=true,error){if(!this.config.enabled||!this.config.trackAccess){return}if(Math.random()>this.config.sampleRate){return}const record={path:to.path,name:to.meta?.name,timestamp:Date.now(),from:from?.path,success,error:error?.message};if(this.currentRoute&&this.currentRouteStartTime>0){record.duration=Date.now()-this.currentRouteStartTime}this.accessRecords.push(record);if(this.accessRecords.length>this.config.maxRecords){this.accessRecords.shift()}this.monitoringService.trackEvent("route_access",{path:to.path,name:to.meta?.name,success,error:error?.message});this.currentRoute=to;this.currentRouteStartTime=Date.now();_logger.logger.debug("路由访问已记录",record)}trackRoutePerformance(routeName,metrics){if(!this.config.enabled||!this.config.trackPerformance){return}if(Math.random()>this.config.sampleRate){return}const routeMetrics=this.performanceMetrics.get(routeName)||[];routeMetrics.push(metrics);if(routeMetrics.length>100){routeMetrics.shift()}this.performanceMetrics.set(routeName,routeMetrics);this.monitoringService.reportPerformance({[`route_${routeName}_match`]:metrics.matchTime||0,[`route_${routeName}_load`]:metrics.loadTime||0,[`route_${routeName}_render`]:metrics.renderTime||0,[`route_${routeName}_total`]:metrics.totalTime||0});_logger.logger.debug(`路由性能指标已记录: ${routeName}`,metrics)}trackRouteError(error,context){if(!this.config.enabled||!this.config.trackErrors){return}if(Math.random()>this.config.sampleRate){return}this.monitoringService.captureError(error,{type:"router",...context});_logger.logger.error("路由错误已记录",error,context)}getAccessStats(){const stats={total:this.accessRecords.length,success:0,failed:0,byPath:{},byName:{},averageDuration:0};let totalDuration=0;let durationCount=0;for(const record of this.accessRecords){if(record.success){stats.success++}else{stats.failed++}stats.byPath[record.path]=(stats.byPath[record.path]||0)+1;if(record.name){stats.byName[record.name]=(stats.byName[record.name]||0)+1}if(record.duration){totalDuration+=record.duration;durationCount++}}stats.averageDuration=durationCount>0?totalDuration/durationCount:0;return stats}getPerformanceStats(){const stats={};for(const[routeName,metrics]of this.performanceMetrics.entries()){let totalMatchTime=0;let totalLoadTime=0;let totalRenderTime=0;let totalTotalTime=0;let count=0;for(const metric of metrics){if(metric.matchTime){totalMatchTime+=metric.matchTime}if(metric.loadTime){totalLoadTime+=metric.loadTime}if(metric.renderTime){totalRenderTime+=metric.renderTime}if(metric.totalTime){totalTotalTime+=metric.totalTime}count++}stats[routeName]={count,averageMatchTime:count>0?totalMatchTime/count:0,averageLoadTime:count>0?totalLoadTime/count:0,averageRenderTime:count>0?totalRenderTime/count:0,averageTotalTime:count>0?totalTotalTime/count:0}}return stats}clear(){this.accessRecords=[];this.performanceMetrics.clear();_logger.logger.debug("路由监控记录已清空")}getReport(){return{access:this.getAccessStats(),performance:this.getPerformanceStats(),timestamp:Date.now()}}constructor(config={}){_define_property(this,"accessRecords",[]);_define_property(this,"performanceMetrics",new Map);_define_property(this,"config",void 0);_define_property(this,"monitoringService",(0,_monitoring.getMonitoring)());_define_property(this,"currentRouteStartTime",0);_define_property(this,"currentRoute",void 0);this.config={enabled:config.enabled??true,trackAccess:config.trackAccess??true,trackPerformance:config.trackPerformance??true,trackErrors:config.trackErrors??true,maxRecords:config.maxRecords??1e3,sampleRate:config.sampleRate??1}}};let routerMonitoringInstance=null;function getRouterMonitoring(config){if(!routerMonitoringInstance){routerMonitoringInstance=new RouterMonitoring(config)}return routerMonitoringInstance}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * 路由监控服务
3
+ * 提供路由访问统计、性能监控、错误监控等功能
4
+ */
5
+ import type { RouteLocation } from '../types';
6
+ import type { RouterError } from '../errors';
7
+ /**
8
+ * 路由性能指标
9
+ */
10
+ interface RoutePerformanceMetrics {
11
+ /**
12
+ * 路由匹配时间(毫秒)
13
+ */
14
+ matchTime?: number;
15
+ /**
16
+ * 组件加载时间(毫秒)
17
+ */
18
+ loadTime?: number;
19
+ /**
20
+ * 路由渲染时间(毫秒)
21
+ */
22
+ renderTime?: number;
23
+ /**
24
+ * 总时间(毫秒)
25
+ */
26
+ totalTime?: number;
27
+ }
28
+ /**
29
+ * 路由监控配置
30
+ */
31
+ export interface RouterMonitoringConfig {
32
+ /**
33
+ * 是否启用路由监控
34
+ * @default true
35
+ */
36
+ enabled?: boolean;
37
+ /**
38
+ * 是否记录路由访问
39
+ * @default true
40
+ */
41
+ trackAccess?: boolean;
42
+ /**
43
+ * 是否记录性能指标
44
+ * @default true
45
+ */
46
+ trackPerformance?: boolean;
47
+ /**
48
+ * 是否记录错误
49
+ * @default true
50
+ */
51
+ trackErrors?: boolean;
52
+ /**
53
+ * 最大记录数量
54
+ * @default 1000
55
+ */
56
+ maxRecords?: number;
57
+ /**
58
+ * 采样率 (0-1)
59
+ * @default 1.0
60
+ */
61
+ sampleRate?: number;
62
+ }
63
+ /**
64
+ * 路由监控服务
65
+ */
66
+ export declare class RouterMonitoring {
67
+ private accessRecords;
68
+ private performanceMetrics;
69
+ private config;
70
+ private monitoringService;
71
+ private currentRouteStartTime;
72
+ private currentRoute?;
73
+ constructor(config?: RouterMonitoringConfig);
74
+ /**
75
+ * 记录路由访问
76
+ */
77
+ trackRouteAccess(to: RouteLocation, from?: RouteLocation, success?: boolean, error?: Error): void;
78
+ /**
79
+ * 记录路由性能指标
80
+ */
81
+ trackRoutePerformance(routeName: string, metrics: RoutePerformanceMetrics): void;
82
+ /**
83
+ * 记录路由错误
84
+ */
85
+ trackRouteError(error: RouterError | Error, context?: Record<string, unknown>): void;
86
+ /**
87
+ * 获取路由访问统计
88
+ */
89
+ getAccessStats(): {
90
+ total: number;
91
+ success: number;
92
+ failed: number;
93
+ byPath: Record<string, number>;
94
+ byName: Record<string, number>;
95
+ averageDuration: number;
96
+ };
97
+ /**
98
+ * 获取路由性能统计
99
+ */
100
+ getPerformanceStats(): Record<string, {
101
+ count: number;
102
+ averageMatchTime: number;
103
+ averageLoadTime: number;
104
+ averageRenderTime: number;
105
+ averageTotalTime: number;
106
+ }>;
107
+ /**
108
+ * 清空所有记录
109
+ */
110
+ clear(): void;
111
+ /**
112
+ * 获取监控报告
113
+ */
114
+ getReport(): {
115
+ access: {
116
+ total: number;
117
+ success: number;
118
+ failed: number;
119
+ byPath: Record<string, number>;
120
+ byName: Record<string, number>;
121
+ averageDuration: number;
122
+ };
123
+ performance: Record<string, {
124
+ count: number;
125
+ averageMatchTime: number;
126
+ averageLoadTime: number;
127
+ averageRenderTime: number;
128
+ averageTotalTime: number;
129
+ }>;
130
+ timestamp: number;
131
+ };
132
+ }
133
+ export declare function getRouterMonitoring(config?: RouterMonitoringConfig): RouterMonitoring;
134
+ export {};
@@ -0,0 +1 @@
1
+ function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}import{getMonitoring}from"@vlian/monitoring";import{logger}from"@vlian/logger";export class RouterMonitoring{trackRouteAccess(to,from,success=true,error){if(!this.config.enabled||!this.config.trackAccess){return}if(Math.random()>this.config.sampleRate){return}const record={path:to.path,name:to.meta?.name,timestamp:Date.now(),from:from?.path,success,error:error?.message};if(this.currentRoute&&this.currentRouteStartTime>0){record.duration=Date.now()-this.currentRouteStartTime}this.accessRecords.push(record);if(this.accessRecords.length>this.config.maxRecords){this.accessRecords.shift()}this.monitoringService.trackEvent("route_access",{path:to.path,name:to.meta?.name,success,error:error?.message});this.currentRoute=to;this.currentRouteStartTime=Date.now();logger.debug("路由访问已记录",record)}trackRoutePerformance(routeName,metrics){if(!this.config.enabled||!this.config.trackPerformance){return}if(Math.random()>this.config.sampleRate){return}const routeMetrics=this.performanceMetrics.get(routeName)||[];routeMetrics.push(metrics);if(routeMetrics.length>100){routeMetrics.shift()}this.performanceMetrics.set(routeName,routeMetrics);this.monitoringService.reportPerformance({[`route_${routeName}_match`]:metrics.matchTime||0,[`route_${routeName}_load`]:metrics.loadTime||0,[`route_${routeName}_render`]:metrics.renderTime||0,[`route_${routeName}_total`]:metrics.totalTime||0});logger.debug(`路由性能指标已记录: ${routeName}`,metrics)}trackRouteError(error,context){if(!this.config.enabled||!this.config.trackErrors){return}if(Math.random()>this.config.sampleRate){return}this.monitoringService.captureError(error,{type:"router",...context});logger.error("路由错误已记录",error,context)}getAccessStats(){const stats={total:this.accessRecords.length,success:0,failed:0,byPath:{},byName:{},averageDuration:0};let totalDuration=0;let durationCount=0;for(const record of this.accessRecords){if(record.success){stats.success++}else{stats.failed++}stats.byPath[record.path]=(stats.byPath[record.path]||0)+1;if(record.name){stats.byName[record.name]=(stats.byName[record.name]||0)+1}if(record.duration){totalDuration+=record.duration;durationCount++}}stats.averageDuration=durationCount>0?totalDuration/durationCount:0;return stats}getPerformanceStats(){const stats={};for(const[routeName,metrics]of this.performanceMetrics.entries()){let totalMatchTime=0;let totalLoadTime=0;let totalRenderTime=0;let totalTotalTime=0;let count=0;for(const metric of metrics){if(metric.matchTime){totalMatchTime+=metric.matchTime}if(metric.loadTime){totalLoadTime+=metric.loadTime}if(metric.renderTime){totalRenderTime+=metric.renderTime}if(metric.totalTime){totalTotalTime+=metric.totalTime}count++}stats[routeName]={count,averageMatchTime:count>0?totalMatchTime/count:0,averageLoadTime:count>0?totalLoadTime/count:0,averageRenderTime:count>0?totalRenderTime/count:0,averageTotalTime:count>0?totalTotalTime/count:0}}return stats}clear(){this.accessRecords=[];this.performanceMetrics.clear();logger.debug("路由监控记录已清空")}getReport(){return{access:this.getAccessStats(),performance:this.getPerformanceStats(),timestamp:Date.now()}}constructor(config={}){_define_property(this,"accessRecords",[]);_define_property(this,"performanceMetrics",new Map);_define_property(this,"config",void 0);_define_property(this,"monitoringService",getMonitoring());_define_property(this,"currentRouteStartTime",0);_define_property(this,"currentRoute",void 0);this.config={enabled:config.enabled??true,trackAccess:config.trackAccess??true,trackPerformance:config.trackPerformance??true,trackErrors:config.trackErrors??true,maxRecords:config.maxRecords??1e3,sampleRate:config.sampleRate??1}}}let routerMonitoringInstance=null;export function getRouterMonitoring(config){if(!routerMonitoringInstance){routerMonitoringInstance=new RouterMonitoring(config)}return routerMonitoringInstance}
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});_export_star(require("./RouterMonitoring"),exports);function _export_star(from,to){Object.keys(from).forEach(function(k){if(k!=="default"&&!Object.prototype.hasOwnProperty.call(to,k)){Object.defineProperty(to,k,{enumerable:true,get:function(){return from[k]}})}});return from}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 路由监控模块入口
3
+ */
4
+ export * from './RouterMonitoring';
@@ -0,0 +1 @@
1
+ export*from"./RouterMonitoring";
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"RouterNavigation",{enumerable:true,get:function(){return RouterNavigation}});const _logger=require("@vlian/logger");const _lifecycle=require("../lifecycle");const _middleware=require("../middleware");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap;var cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interop_require_wildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj}}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj)}var newObj={__proto__:null};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc)}else{newObj[key]=obj[key]}}}newObj.default=obj;if(cache){cache.set(obj,newObj)}return newObj}let RouterNavigation=class RouterNavigation{static buildTargetPath(to,query){const base=typeof window!=="undefined"&&window.location?.origin?window.location.origin:"http://localhost";const url=new URL(to,base);if(query&&Object.keys(query).length>0){const params=new URLSearchParams(url.search);Object.entries(query).forEach(([key,value])=>{if(value===undefined||value===null){params.delete(key);return}params.set(key,String(value))});url.search=params.toString()}return`${url.pathname}${url.search}${url.hash}`}static async navigateInternal(to,options,depth,visited){const startTime=performance.now();if(depth>this.MAX_REDIRECTS){throw new Error(`路由重定向次数超过上限(${this.MAX_REDIRECTS}),可能存在循环重定向`)}const targetPath=this.buildTargetPath(to,options?.query);if(visited.has(targetPath)){throw new Error(`检测到循环重定向: ${targetPath}`)}visited.add(targetPath);const routerManager=await Promise.resolve().then(()=>/*#__PURE__*/_interop_require_wildcard(require("../RouterManager"))).then(m=>m.getRouterManager());const router=routerManager.getRouter();if(!router){throw new Error("路由未初始化,无法导航")}const currentLocation=this.getCurrentRoute();const targetLocation={path:targetPath,query:options?.query};const lifecycleManager=(0,_lifecycle.getRouterLifecycleManager)();const beforeEachResult=await lifecycleManager.beforeEach(targetLocation,currentLocation);let finalPath=targetPath;if(beforeEachResult===false){_logger.logger.debug("路由导航被阻止: beforeEach 返回 false");return}if(typeof beforeEachResult==="string"){_logger.logger.debug(`路由导航重定向: ${beforeEachResult}`);finalPath=this.buildTargetPath(beforeEachResult)}const middlewareManager=(0,_middleware.getRouterMiddlewareManager)();const middlewareContext={to:{...targetLocation,path:finalPath},from:currentLocation,options};const middlewareResult=await middlewareManager.execute(middlewareContext);if(!middlewareResult.allow){if(middlewareResult.redirect){_logger.logger.debug(`路由导航被中间件重定向: ${middlewareResult.redirect}`);return this.navigateInternal(middlewareResult.redirect,{...options,query:undefined},depth+1,visited)}_logger.logger.debug(`路由导航被中间件阻止: ${middlewareResult.reason||"未知原因"}`);return}try{if(options?.replace){router.navigate(finalPath,{replace:true,state:options.state})}else{router.navigate(finalPath,{state:options?.state})}await lifecycleManager.afterEach({...targetLocation,path:finalPath},currentLocation);const duration=performance.now()-startTime;routerManager.getMonitoring().trackRoutePerformance(finalPath,{totalTime:duration})}catch(error){_logger.logger.error("路由导航失败",error);throw error}}static async navigate(to,options){return this.navigateInternal(to,options,0,new Set)}static getCurrentRoute(){if(typeof window==="undefined"){return{path:"/",query:{}}}const pathname=window.location.pathname;const search=window.location.search;const hash=window.location.hash;const query={};if(search){const params=new URLSearchParams(search);params.forEach((value,key)=>{query[key]=value})}return{path:pathname+hash,query}}static async goBack(fallback){if(window.history.length>1){window.history.back()}else if(fallback){await this.navigate(fallback)}else{_logger.logger.warn("没有历史记录,无法返回")}}static goForward(){window.history.forward()}static async replace(to,options){return this.navigate(to,{...options,replace:true})}};_define_property(RouterNavigation,"MAX_REDIRECTS",10);
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 路由导航 API
3
+ * 提供框架级别的路由导航能力,封装 react-router-dom 的导航功能
4
+ */
5
+ import type { RouteLocation, NavigateOptions } from '../types';
6
+ /**
7
+ * 路由导航器
8
+ */
9
+ export declare class RouterNavigation {
10
+ private static readonly MAX_REDIRECTS;
11
+ private static buildTargetPath;
12
+ private static navigateInternal;
13
+ /**
14
+ * 导航到指定路径
15
+ *
16
+ * @param to - 目标路径或路由名称
17
+ * @param options - 导航选项
18
+ */
19
+ static navigate(to: string, options?: NavigateOptions): Promise<void>;
20
+ /**
21
+ * 获取当前路由信息
22
+ *
23
+ * @returns 当前路由位置信息
24
+ */
25
+ static getCurrentRoute(): RouteLocation;
26
+ /**
27
+ * 返回上一页
28
+ *
29
+ * @param fallback - 如果没有历史记录,跳转到该路径
30
+ */
31
+ static goBack(fallback?: string): Promise<void>;
32
+ /**
33
+ * 前进到下一页
34
+ */
35
+ static goForward(): void;
36
+ /**
37
+ * 替换当前路由
38
+ *
39
+ * @param to - 目标路径
40
+ * @param options - 导航选项
41
+ */
42
+ static replace(to: string, options?: Omit<NavigateOptions, 'replace'>): Promise<void>;
43
+ }
@@ -0,0 +1 @@
1
+ function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}import{logger}from"@vlian/logger";import{getRouterLifecycleManager}from"../lifecycle";import{getRouterMiddlewareManager}from"../middleware";export class RouterNavigation{static buildTargetPath(to,query){const base=typeof window!=="undefined"&&window.location?.origin?window.location.origin:"http://localhost";const url=new URL(to,base);if(query&&Object.keys(query).length>0){const params=new URLSearchParams(url.search);Object.entries(query).forEach(([key,value])=>{if(value===undefined||value===null){params.delete(key);return}params.set(key,String(value))});url.search=params.toString()}return`${url.pathname}${url.search}${url.hash}`}static async navigateInternal(to,options,depth,visited){const startTime=performance.now();if(depth>this.MAX_REDIRECTS){throw new Error(`路由重定向次数超过上限(${this.MAX_REDIRECTS}),可能存在循环重定向`)}const targetPath=this.buildTargetPath(to,options?.query);if(visited.has(targetPath)){throw new Error(`检测到循环重定向: ${targetPath}`)}visited.add(targetPath);const routerManager=await import("../RouterManager").then(m=>m.getRouterManager());const router=routerManager.getRouter();if(!router){throw new Error("路由未初始化,无法导航")}const currentLocation=this.getCurrentRoute();const targetLocation={path:targetPath,query:options?.query};const lifecycleManager=getRouterLifecycleManager();const beforeEachResult=await lifecycleManager.beforeEach(targetLocation,currentLocation);let finalPath=targetPath;if(beforeEachResult===false){logger.debug("路由导航被阻止: beforeEach 返回 false");return}if(typeof beforeEachResult==="string"){logger.debug(`路由导航重定向: ${beforeEachResult}`);finalPath=this.buildTargetPath(beforeEachResult)}const middlewareManager=getRouterMiddlewareManager();const middlewareContext={to:{...targetLocation,path:finalPath},from:currentLocation,options};const middlewareResult=await middlewareManager.execute(middlewareContext);if(!middlewareResult.allow){if(middlewareResult.redirect){logger.debug(`路由导航被中间件重定向: ${middlewareResult.redirect}`);return this.navigateInternal(middlewareResult.redirect,{...options,query:undefined},depth+1,visited)}logger.debug(`路由导航被中间件阻止: ${middlewareResult.reason||"未知原因"}`);return}try{if(options?.replace){router.navigate(finalPath,{replace:true,state:options.state})}else{router.navigate(finalPath,{state:options?.state})}await lifecycleManager.afterEach({...targetLocation,path:finalPath},currentLocation);const duration=performance.now()-startTime;routerManager.getMonitoring().trackRoutePerformance(finalPath,{totalTime:duration})}catch(error){logger.error("路由导航失败",error);throw error}}static async navigate(to,options){return this.navigateInternal(to,options,0,new Set)}static getCurrentRoute(){if(typeof window==="undefined"){return{path:"/",query:{}}}const pathname=window.location.pathname;const search=window.location.search;const hash=window.location.hash;const query={};if(search){const params=new URLSearchParams(search);params.forEach((value,key)=>{query[key]=value})}return{path:pathname+hash,query}}static async goBack(fallback){if(window.history.length>1){window.history.back()}else if(fallback){await this.navigate(fallback)}else{logger.warn("没有历史记录,无法返回")}}static goForward(){window.history.forward()}static async replace(to,options){return this.navigate(to,{...options,replace:true})}}_define_property(RouterNavigation,"MAX_REDIRECTS",10);
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});_export_star(require("./RouterNavigation"),exports);function _export_star(from,to){Object.keys(from).forEach(function(k){if(k!=="default"&&!Object.prototype.hasOwnProperty.call(to,k)){Object.defineProperty(to,k,{enumerable:true,get:function(){return from[k]}})}});return from}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * 路由导航模块入口
3
+ */
4
+ export * from './RouterNavigation';
@@ -0,0 +1 @@
1
+ export*from"./RouterNavigation";
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:true});function _export(target,all){for(var name in all)Object.defineProperty(target,name,{enumerable:true,get:Object.getOwnPropertyDescriptor(all,name).get})}_export(exports,{get RouteCache(){return RouteCache},get getRouteCache(){return getRouteCache}});const _logger=require("@vlian/logger");function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}let RouteCache=class RouteCache{async initPersistence(){try{if(typeof window!=="undefined"&&"indexedDB"in window){this.persistenceEnabled=true;await this.loadFromPersistence();_logger.logger.debug("路由缓存持久化已启用")}}catch(error){_logger.logger.warn("路由缓存持久化初始化失败",error);this.persistenceEnabled=false}}async loadFromPersistence(){try{}catch(error){_logger.logger.warn("从持久化存储加载缓存失败",error)}}async saveToPersistence(_key,_value){if(!this.persistenceEnabled){return}try{}catch(error){_logger.logger.warn("保存到持久化存储失败",error)}}generateKey(routes){if(typeof routes==="function"){return`fn_${routes.name||Math.random().toString(36).substring(7)}`}try{const routesStr=JSON.stringify(routes,(_key,value)=>{if(typeof value==="function"){return"[Function]"}return value});return`routes_${this.hashString(routesStr)}`}catch(error){return`routes_${Math.random().toString(36).substring(7)}`}}hashString(str){let hash=0;for(let i=0;i<str.length;i++){const char=str.charCodeAt(i);hash=(hash<<5)-hash+char;hash=hash&hash}return Math.abs(hash).toString(36)}isExpired(item){return Date.now()>item.expiresAt}cleanup(){for(const[key,item]of this.cache.entries()){if(this.isExpired(item)){this.cache.delete(key)}}for(const[key,item]of this.matchCache.entries()){if(this.isExpired(item)){this.matchCache.delete(key)}}this.evictLRU()}evictLRU(){if(this.cache.size>this.config.maxSize){const sorted=Array.from(this.cache.entries()).sort((a,b)=>a[1].lastAccessedAt-b[1].lastAccessedAt);const toDelete=sorted.slice(0,this.cache.size-this.config.maxSize);toDelete.forEach(([key])=>this.cache.delete(key))}if(this.matchCache.size>this.config.maxSize){const sorted=Array.from(this.matchCache.entries()).sort((a,b)=>a[1].lastAccessedAt-b[1].lastAccessedAt);const toDelete=sorted.slice(0,this.matchCache.size-this.config.maxSize);toDelete.forEach(([key])=>this.matchCache.delete(key))}}startCleanupInterval(){if(this.cleanupTimer){clearInterval(this.cleanupTimer)}this.cleanupTimer=setInterval(()=>{this.cleanup()},60*1e3)}get(routes){const key=this.generateKey(routes);const item=this.cache.get(key);if(!item){this.stats.transformMisses++;return null}if(this.isExpired(item)){this.cache.delete(key);this.stats.transformMisses++;return null}item.lastAccessedAt=Date.now();item.accessCount++;this.stats.transformHits++;return item.value}set(routes,value){const key=this.generateKey(routes);const now=Date.now();const item={value,expiresAt:now+this.config.ttl,createdAt:now,accessCount:0,lastAccessedAt:now};this.cache.set(key,item);if(this.persistenceEnabled){this.saveToPersistence(key,value).catch(error=>{_logger.logger.warn("保存缓存到持久化存储失败",error)})}this.evictLRU()}getMatch(path){const item=this.matchCache.get(path);if(!item){this.stats.matchMisses++;return undefined}if(this.isExpired(item)){this.matchCache.delete(path);this.stats.matchMisses++;return undefined}item.lastAccessedAt=Date.now();item.accessCount++;this.stats.matchHits++;return item.value}setMatch(path,route){const now=Date.now();const item={value:route,expiresAt:now+this.config.ttl,createdAt:now,accessCount:0,lastAccessedAt:now};this.matchCache.set(path,item);this.evictLRU()}clear(){this.cache.clear();this.matchCache.clear();this.stats={transformHits:0,transformMisses:0,matchHits:0,matchMisses:0};_logger.logger.debug("路由缓存已清空")}destroy(){this.clear();if(this.cleanupTimer){clearInterval(this.cleanupTimer);this.cleanupTimer=null}}getStats(){const totalHits=this.stats.transformHits+this.stats.matchHits;const totalAccess=totalHits+this.stats.transformMisses+this.stats.matchMisses;const hitRate=totalAccess>0?totalHits/totalAccess:0;return{transformCacheSize:this.cache.size,matchCacheSize:this.matchCache.size,totalSize:this.cache.size+this.matchCache.size,hitRate}}constructor(config={}){_define_property(this,"cache",new Map);_define_property(this,"matchCache",new Map);_define_property(this,"config",void 0);_define_property(this,"persistenceEnabled",false);_define_property(this,"cleanupTimer",null);_define_property(this,"stats",{transformHits:0,transformMisses:0,matchHits:0,matchMisses:0});this.config={maxSize:config.maxSize??50,ttl:config.ttl??5*60*1e3,enablePersistence:config.enablePersistence??false,persistenceKeyPrefix:config.persistenceKeyPrefix??"router_cache_"};if(this.config.enablePersistence&&typeof window!=="undefined"&&"indexedDB"in window){this.initPersistence()}this.startCleanupInterval()}};let routeCacheInstance=null;function getRouteCache(config){if(!routeCacheInstance){routeCacheInstance=new RouteCache(config)}return routeCacheInstance}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * 路由缓存管理器
3
+ * 提供路由转换结果、匹配结果的缓存功能
4
+ */
5
+ import type { RouteConfig } from '../types';
6
+ import type { TransformRoutesResult } from '../utils/transform';
7
+ /**
8
+ * LRU 缓存配置
9
+ */
10
+ export interface RouteCacheConfig {
11
+ /**
12
+ * 最大缓存数量
13
+ * @default 50
14
+ */
15
+ maxSize?: number;
16
+ /**
17
+ * 缓存过期时间(毫秒)
18
+ * @default 5 * 60 * 1000 (5分钟)
19
+ */
20
+ ttl?: number;
21
+ /**
22
+ * 是否启用持久化缓存(使用 IndexedDB)
23
+ * @default false
24
+ */
25
+ enablePersistence?: boolean;
26
+ /**
27
+ * 持久化缓存键前缀
28
+ * @default 'router_cache_'
29
+ */
30
+ persistenceKeyPrefix?: string;
31
+ }
32
+ /**
33
+ * 路由缓存管理器
34
+ */
35
+ export declare class RouteCache {
36
+ private cache;
37
+ private matchCache;
38
+ private config;
39
+ private persistenceEnabled;
40
+ private cleanupTimer;
41
+ private stats;
42
+ constructor(config?: RouteCacheConfig);
43
+ /**
44
+ * 初始化持久化缓存
45
+ */
46
+ private initPersistence;
47
+ /**
48
+ * 从持久化存储加载缓存
49
+ */
50
+ private loadFromPersistence;
51
+ /**
52
+ * 保存到持久化存储
53
+ */
54
+ private saveToPersistence;
55
+ /**
56
+ * 生成缓存键
57
+ */
58
+ private generateKey;
59
+ /**
60
+ * 字符串哈希函数(简单实现)
61
+ */
62
+ private hashString;
63
+ /**
64
+ * 检查缓存项是否过期
65
+ */
66
+ private isExpired;
67
+ /**
68
+ * 清理过期缓存
69
+ */
70
+ private cleanup;
71
+ /**
72
+ * LRU 淘汰策略
73
+ */
74
+ private evictLRU;
75
+ /**
76
+ * 启动定期清理
77
+ */
78
+ private startCleanupInterval;
79
+ /**
80
+ * 获取转换结果缓存
81
+ */
82
+ get(routes: RouteConfig[] | (() => RouteConfig[] | Promise<RouteConfig[]>)): TransformRoutesResult | null;
83
+ /**
84
+ * 设置转换结果缓存
85
+ */
86
+ set(routes: RouteConfig[] | (() => RouteConfig[] | Promise<RouteConfig[]>), value: TransformRoutesResult): void;
87
+ /**
88
+ * 获取路由匹配缓存
89
+ */
90
+ getMatch(path: string): RouteConfig | null | undefined;
91
+ /**
92
+ * 设置路由匹配缓存
93
+ */
94
+ setMatch(path: string, route: RouteConfig | null): void;
95
+ /**
96
+ * 清空所有缓存
97
+ */
98
+ clear(): void;
99
+ /**
100
+ * 销毁缓存实例并释放资源
101
+ */
102
+ destroy(): void;
103
+ /**
104
+ * 获取缓存统计信息
105
+ */
106
+ getStats(): {
107
+ transformCacheSize: number;
108
+ matchCacheSize: number;
109
+ totalSize: number;
110
+ hitRate: number;
111
+ };
112
+ }
113
+ export declare function getRouteCache(config?: RouteCacheConfig): RouteCache;
@@ -0,0 +1 @@
1
+ function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}import{logger}from"@vlian/logger";export class RouteCache{async initPersistence(){try{if(typeof window!=="undefined"&&"indexedDB"in window){this.persistenceEnabled=true;await this.loadFromPersistence();logger.debug("路由缓存持久化已启用")}}catch(error){logger.warn("路由缓存持久化初始化失败",error);this.persistenceEnabled=false}}async loadFromPersistence(){try{}catch(error){logger.warn("从持久化存储加载缓存失败",error)}}async saveToPersistence(_key,_value){if(!this.persistenceEnabled){return}try{}catch(error){logger.warn("保存到持久化存储失败",error)}}generateKey(routes){if(typeof routes==="function"){return`fn_${routes.name||Math.random().toString(36).substring(7)}`}try{const routesStr=JSON.stringify(routes,(_key,value)=>{if(typeof value==="function"){return"[Function]"}return value});return`routes_${this.hashString(routesStr)}`}catch(error){return`routes_${Math.random().toString(36).substring(7)}`}}hashString(str){let hash=0;for(let i=0;i<str.length;i++){const char=str.charCodeAt(i);hash=(hash<<5)-hash+char;hash=hash&hash}return Math.abs(hash).toString(36)}isExpired(item){return Date.now()>item.expiresAt}cleanup(){for(const[key,item]of this.cache.entries()){if(this.isExpired(item)){this.cache.delete(key)}}for(const[key,item]of this.matchCache.entries()){if(this.isExpired(item)){this.matchCache.delete(key)}}this.evictLRU()}evictLRU(){if(this.cache.size>this.config.maxSize){const sorted=Array.from(this.cache.entries()).sort((a,b)=>a[1].lastAccessedAt-b[1].lastAccessedAt);const toDelete=sorted.slice(0,this.cache.size-this.config.maxSize);toDelete.forEach(([key])=>this.cache.delete(key))}if(this.matchCache.size>this.config.maxSize){const sorted=Array.from(this.matchCache.entries()).sort((a,b)=>a[1].lastAccessedAt-b[1].lastAccessedAt);const toDelete=sorted.slice(0,this.matchCache.size-this.config.maxSize);toDelete.forEach(([key])=>this.matchCache.delete(key))}}startCleanupInterval(){if(this.cleanupTimer){clearInterval(this.cleanupTimer)}this.cleanupTimer=setInterval(()=>{this.cleanup()},60*1e3)}get(routes){const key=this.generateKey(routes);const item=this.cache.get(key);if(!item){this.stats.transformMisses++;return null}if(this.isExpired(item)){this.cache.delete(key);this.stats.transformMisses++;return null}item.lastAccessedAt=Date.now();item.accessCount++;this.stats.transformHits++;return item.value}set(routes,value){const key=this.generateKey(routes);const now=Date.now();const item={value,expiresAt:now+this.config.ttl,createdAt:now,accessCount:0,lastAccessedAt:now};this.cache.set(key,item);if(this.persistenceEnabled){this.saveToPersistence(key,value).catch(error=>{logger.warn("保存缓存到持久化存储失败",error)})}this.evictLRU()}getMatch(path){const item=this.matchCache.get(path);if(!item){this.stats.matchMisses++;return undefined}if(this.isExpired(item)){this.matchCache.delete(path);this.stats.matchMisses++;return undefined}item.lastAccessedAt=Date.now();item.accessCount++;this.stats.matchHits++;return item.value}setMatch(path,route){const now=Date.now();const item={value:route,expiresAt:now+this.config.ttl,createdAt:now,accessCount:0,lastAccessedAt:now};this.matchCache.set(path,item);this.evictLRU()}clear(){this.cache.clear();this.matchCache.clear();this.stats={transformHits:0,transformMisses:0,matchHits:0,matchMisses:0};logger.debug("路由缓存已清空")}destroy(){this.clear();if(this.cleanupTimer){clearInterval(this.cleanupTimer);this.cleanupTimer=null}}getStats(){const totalHits=this.stats.transformHits+this.stats.matchHits;const totalAccess=totalHits+this.stats.transformMisses+this.stats.matchMisses;const hitRate=totalAccess>0?totalHits/totalAccess:0;return{transformCacheSize:this.cache.size,matchCacheSize:this.matchCache.size,totalSize:this.cache.size+this.matchCache.size,hitRate}}constructor(config={}){_define_property(this,"cache",new Map);_define_property(this,"matchCache",new Map);_define_property(this,"config",void 0);_define_property(this,"persistenceEnabled",false);_define_property(this,"cleanupTimer",null);_define_property(this,"stats",{transformHits:0,transformMisses:0,matchHits:0,matchMisses:0});this.config={maxSize:config.maxSize??50,ttl:config.ttl??5*60*1e3,enablePersistence:config.enablePersistence??false,persistenceKeyPrefix:config.persistenceKeyPrefix??"router_cache_"};if(this.config.enablePersistence&&typeof window!=="undefined"&&"indexedDB"in window){this.initPersistence()}this.startCleanupInterval()}}let routeCacheInstance=null;export function getRouteCache(config){if(!routeCacheInstance){routeCacheInstance=new RouteCache(config)}return routeCacheInstance}