@vlian/framework 1.2.37 → 1.2.39
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.
- package/dist/analytics.umd.js +1 -1
- package/dist/core/Test.cjs +2 -2
- package/dist/core/Test.cjs.map +1 -1
- package/dist/core/Test.js +1 -1
- package/dist/core/Test.js.map +1 -1
- package/dist/core/config/ConfigLoader.cjs +7 -7
- package/dist/core/config/ConfigLoader.cjs.map +1 -1
- package/dist/core/config/ConfigLoader.js +1 -1
- package/dist/core/config/ConfigLoader.js.map +1 -1
- package/dist/core/error/ErrorBoundary.cjs +6 -6
- package/dist/core/error/ErrorBoundary.cjs.map +1 -1
- package/dist/core/error/ErrorBoundary.d.ts +1 -1
- package/dist/core/error/ErrorBoundary.js +2 -2
- package/dist/core/error/ErrorBoundary.js.map +1 -1
- package/dist/core/error/ErrorHandler.cjs +19 -19
- package/dist/core/error/ErrorHandler.cjs.map +1 -1
- package/dist/core/error/ErrorHandler.d.ts +1 -1
- package/dist/core/error/ErrorHandler.js +2 -2
- package/dist/core/error/ErrorHandler.js.map +1 -1
- package/dist/core/event/AppEventBus.cjs +5 -5
- package/dist/core/event/AppEventBus.cjs.map +1 -1
- package/dist/core/event/AppEventBus.js +1 -1
- package/dist/core/event/AppEventBus.js.map +1 -1
- package/dist/core/initialization/InitializationErrorThrower.cjs.map +1 -1
- package/dist/core/initialization/InitializationErrorThrower.js.map +1 -1
- package/dist/core/initialization/initialization.cjs +3 -3
- package/dist/core/initialization/initialization.cjs.map +1 -1
- package/dist/core/initialization/initialization.d.ts +1 -1
- package/dist/core/initialization/initialization.js +1 -1
- package/dist/core/initialization/initialization.js.map +1 -1
- package/dist/core/initialization/initializationErrorState.cjs +2 -2
- package/dist/core/initialization/initializationErrorState.cjs.map +1 -1
- package/dist/core/initialization/initializationErrorState.d.ts +1 -1
- package/dist/core/initialization/initializationErrorState.js +1 -1
- package/dist/core/initialization/initializationErrorState.js.map +1 -1
- package/dist/core/kernel/defaultAdapters.cjs +14 -13
- package/dist/core/kernel/defaultAdapters.cjs.map +1 -1
- package/dist/core/kernel/defaultAdapters.js +2 -1
- package/dist/core/kernel/defaultAdapters.js.map +1 -1
- package/dist/core/kernel/types.d.ts +1 -1
- package/dist/core/kernel/types.js.map +1 -1
- package/dist/core/router/RouterManager.cjs +9 -9
- package/dist/core/router/RouterManager.cjs.map +1 -1
- package/dist/core/router/RouterManager.js +1 -1
- package/dist/core/router/RouterManager.js.map +1 -1
- package/dist/core/router/adapter/AdapterManager.cjs +10 -10
- package/dist/core/router/adapter/AdapterManager.cjs.map +1 -1
- package/dist/core/router/adapter/AdapterManager.js +1 -1
- package/dist/core/router/adapter/AdapterManager.js.map +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs +4 -4
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.cjs.map +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.js +1 -1
- package/dist/core/router/adapter/react-router/ReactRouterAdapter.js.map +1 -1
- package/dist/core/router/dynamic/DynamicRouteManager.cjs +8 -8
- package/dist/core/router/dynamic/DynamicRouteManager.cjs.map +1 -1
- package/dist/core/router/dynamic/DynamicRouteManager.js +1 -1
- package/dist/core/router/dynamic/DynamicRouteManager.js.map +1 -1
- package/dist/core/router/errors/RouterError.cjs.map +1 -1
- package/dist/core/router/errors/RouterError.d.ts +4 -3
- package/dist/core/router/errors/RouterError.js.map +1 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.cjs +8 -8
- package/dist/core/router/lifecycle/RouterLifecycleManager.cjs.map +1 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.js +1 -1
- package/dist/core/router/lifecycle/RouterLifecycleManager.js.map +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs +11 -11
- package/dist/core/router/middleware/RouterMiddlewareManager.cjs.map +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.js +1 -1
- package/dist/core/router/middleware/RouterMiddlewareManager.js.map +1 -1
- package/dist/core/router/middleware/auth.cjs +4 -4
- package/dist/core/router/middleware/auth.cjs.map +1 -1
- package/dist/core/router/middleware/auth.js +1 -1
- package/dist/core/router/middleware/auth.js.map +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.cjs +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.cjs.map +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.js +1 -1
- package/dist/core/router/monitoring/RouterMonitoring.js.map +1 -1
- package/dist/core/router/navigation/RouterNavigation.cjs +7 -7
- package/dist/core/router/navigation/RouterNavigation.cjs.map +1 -1
- package/dist/core/router/navigation/RouterNavigation.js +1 -1
- package/dist/core/router/navigation/RouterNavigation.js.map +1 -1
- package/dist/core/router/performance/RouteCache.cjs +7 -7
- package/dist/core/router/performance/RouteCache.cjs.map +1 -1
- package/dist/core/router/performance/RouteCache.js +1 -1
- package/dist/core/router/performance/RouteCache.js.map +1 -1
- package/dist/core/router/performance/RoutePreloader.cjs +6 -6
- package/dist/core/router/performance/RoutePreloader.cjs.map +1 -1
- package/dist/core/router/performance/RoutePreloader.js +1 -1
- package/dist/core/router/performance/RoutePreloader.js.map +1 -1
- package/dist/core/router/plugin/RouterPluginManager.cjs +8 -8
- package/dist/core/router/plugin/RouterPluginManager.cjs.map +1 -1
- package/dist/core/router/plugin/RouterPluginManager.js +1 -1
- package/dist/core/router/plugin/RouterPluginManager.js.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.cjs +2 -2
- package/dist/core/router/utils/adapters/react-router/transform.cjs.map +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.js +1 -1
- package/dist/core/router/utils/adapters/react-router/transform.js.map +1 -1
- package/dist/core/router/utils/transform.cjs +13 -12
- package/dist/core/router/utils/transform.cjs.map +1 -1
- package/dist/core/router/utils/transform.js +2 -1
- package/dist/core/router/utils/transform.js.map +1 -1
- package/dist/core/router/validation/RouterConfigValidator.cjs +2 -2
- package/dist/core/router/validation/RouterConfigValidator.cjs.map +1 -1
- package/dist/core/router/validation/RouterConfigValidator.js +1 -1
- package/dist/core/router/validation/RouterConfigValidator.js.map +1 -1
- package/dist/core/router/version/RouteVersionManager.cjs +6 -6
- package/dist/core/router/version/RouteVersionManager.cjs.map +1 -1
- package/dist/core/router/version/RouteVersionManager.js +1 -1
- package/dist/core/router/version/RouteVersionManager.js.map +1 -1
- package/dist/core/splash/SplashScreen.cjs +4 -4
- package/dist/core/splash/SplashScreen.cjs.map +1 -1
- package/dist/core/splash/SplashScreen.js +1 -1
- package/dist/core/splash/SplashScreen.js.map +1 -1
- package/dist/core/startup/initializeServices.cjs +14 -14
- package/dist/core/startup/initializeServices.cjs.map +1 -1
- package/dist/core/startup/initializeServices.d.ts +1 -1
- package/dist/core/startup/initializeServices.js +2 -2
- package/dist/core/startup/initializeServices.js.map +1 -1
- package/dist/core/startup/renderApp.cjs +2 -2
- package/dist/core/startup/renderApp.cjs.map +1 -1
- package/dist/core/startup/renderApp.js +1 -1
- package/dist/core/startup/renderApp.js.map +1 -1
- package/dist/core/startup/startApp.cjs +22 -22
- package/dist/core/startup/startApp.cjs.map +1 -1
- package/dist/core/startup/startApp.js +2 -2
- package/dist/core/startup/startApp.js.map +1 -1
- package/dist/core/types.d.ts +2 -2
- package/dist/core/types.js.map +1 -1
- package/dist/index.cjs +0 -112
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.js +0 -8
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +1389 -1486
- package/dist/index.umd.js.map +1 -1
- package/dist/kernel/constants.cjs +2 -2
- package/dist/kernel/constants.cjs.map +1 -1
- package/dist/kernel/constants.js +1 -1
- package/dist/kernel/constants.js.map +1 -1
- package/dist/kernel/manager/loggerManager.cjs +10 -10
- package/dist/kernel/manager/loggerManager.cjs.map +1 -1
- package/dist/kernel/manager/loggerManager.d.ts +1 -1
- package/dist/kernel/manager/loggerManager.js +1 -1
- package/dist/kernel/manager/loggerManager.js.map +1 -1
- package/dist/kernel/types.d.ts +1 -1
- package/dist/kernel/types.js.map +1 -1
- package/dist/library/storage/encryption.cjs +12 -13
- package/dist/library/storage/encryption.cjs.map +1 -1
- package/dist/library/storage/encryption.js +1 -2
- package/dist/library/storage/encryption.js.map +1 -1
- package/dist/state.umd.js +1 -1
- package/dist/utils/errors.cjs +71 -15
- package/dist/utils/errors.cjs.map +1 -1
- package/dist/utils/errors.d.ts +30 -1
- package/dist/utils/errors.js +16 -1
- package/dist/utils/errors.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/router/dynamic/DynamicRouteManager.ts"],"sourcesContent":["/**\n * 路由动态注册管理器\n * 支持运行时动态注册和卸载路由\n */\n\nimport { logger } from '
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/router/dynamic/DynamicRouteManager.ts"],"sourcesContent":["/**\n * 路由动态注册管理器\n * 支持运行时动态注册和卸载路由\n */\n\nimport { logger } from '@vlian/logger';\nimport type { RouteConfig } from '../types';\nimport { getRouterManager } from '../RouterManager';\nimport { transformRoutes } from '../utils/transform';\nimport { RouterError, RouterErrorCode } from '../errors';\n\n/**\n * 动态路由注册管理器\n */\nexport class DynamicRouteManager {\n private registeredRoutes: Map<string, RouteConfig[]> = new Map();\n private routeVersion: number = 0;\n\n /**\n * 注册路由\n * \n * @param routes - 要注册的路由配置\n * @param namespace - 路由命名空间(可选,用于分组管理)\n * @returns 取消注册函数\n */\n async register(\n routes: RouteConfig[],\n namespace?: string\n ): Promise<() => Promise<void>> {\n const ns = namespace || 'default';\n\n // 验证路由配置\n if (!Array.isArray(routes) || routes.length === 0) {\n throw new RouterError(\n '路由配置必须是非空数组',\n RouterErrorCode.ROUTER_CONFIG_ERROR\n );\n }\n\n // 检查路由名称是否冲突\n const existingRoutes = this.registeredRoutes.get(ns) || [];\n const existingNames = new Set(existingRoutes.map((r) => r.name));\n const newNames = routes.map((r) => r.name);\n const conflicts = newNames.filter((name) => existingNames.has(name));\n\n if (conflicts.length > 0) {\n throw new RouterError(\n `路由名称冲突: ${conflicts.join(', ')}`,\n RouterErrorCode.ROUTER_CONFIG_ERROR,\n undefined,\n undefined,\n { conflicts, namespace: ns }\n );\n }\n\n // 添加到注册表\n const currentRoutes = this.registeredRoutes.get(ns) || [];\n this.registeredRoutes.set(ns, [...currentRoutes, ...routes]);\n\n // 更新版本号\n this.routeVersion++;\n\n logger.info(`路由已注册: ${routes.length} 个路由到命名空间 \"${ns}\"`);\n\n // 返回取消注册函数\n return async () => {\n await this.unregister(routes.map((r) => r.name), ns);\n };\n }\n\n /**\n * 取消注册路由\n * \n * @param routeNames - 要取消注册的路由名称数组\n * @param namespace - 路由命名空间(可选)\n */\n async unregister(routeNames: string[], namespace?: string): Promise<void> {\n const ns = namespace || 'default';\n const routes = this.registeredRoutes.get(ns) || [];\n\n // 过滤掉要取消注册的路由\n const filteredRoutes = routes.filter((r) => !routeNames.includes(r.name));\n\n if (filteredRoutes.length === routes.length) {\n logger.warn(`未找到要取消注册的路由: ${routeNames.join(', ')}`);\n return;\n }\n\n // 更新注册表\n if (filteredRoutes.length === 0) {\n this.registeredRoutes.delete(ns);\n } else {\n this.registeredRoutes.set(ns, filteredRoutes);\n }\n\n // 更新版本号\n this.routeVersion++;\n\n logger.info(\n `路由已取消注册: ${routeNames.length} 个路由从命名空间 \"${ns}\"`\n );\n }\n\n /**\n * 获取指定命名空间的路由\n * \n * @param namespace - 路由命名空间(可选)\n * @returns 路由配置数组\n */\n getRoutes(namespace?: string): RouteConfig[] {\n const ns = namespace || 'default';\n return [...(this.registeredRoutes.get(ns) || [])];\n }\n\n /**\n * 获取所有路由\n * \n * @returns 所有命名空间的路由配置\n */\n getAllRoutes(): Map<string, RouteConfig[]> {\n return new Map(this.registeredRoutes);\n }\n\n /**\n * 清空指定命名空间的路由\n * \n * @param namespace - 路由命名空间(可选)\n */\n clear(namespace?: string): void {\n const ns = namespace || 'default';\n this.registeredRoutes.delete(ns);\n this.routeVersion++;\n logger.info(`路由命名空间已清空: \"${ns}\"`);\n }\n\n /**\n * 清空所有路由\n */\n clearAll(): void {\n this.registeredRoutes.clear();\n this.routeVersion++;\n logger.info('所有路由已清空');\n }\n\n /**\n * 获取路由版本号\n * \n * @returns 路由版本号\n */\n getVersion(): number {\n return this.routeVersion;\n }\n\n /**\n * 检查路由是否已注册\n * \n * @param routeName - 路由名称\n * @param namespace - 路由命名空间(可选)\n * @returns 如果已注册返回 true,否则返回 false\n */\n isRegistered(routeName: string, namespace?: string): boolean {\n const ns = namespace || 'default';\n const routes = this.registeredRoutes.get(ns) || [];\n return routes.some((r) => r.name === routeName);\n }\n\n /**\n * 重新加载路由\n * \n * 注意:此方法会重新初始化路由管理器,需要谨慎使用\n */\n async reload(): Promise<void> {\n const routerManager = getRouterManager();\n if (!routerManager.isInitialized()) {\n throw new RouterError(\n '路由管理器未初始化',\n RouterErrorCode.ROUTER_NOT_INITIALIZED\n );\n }\n\n // 获取所有路由\n const allRoutes: RouteConfig[] = [];\n this.registeredRoutes.forEach((routes) => {\n allRoutes.push(...routes);\n });\n\n if (allRoutes.length === 0) {\n logger.warn('没有已注册的路由,无法重新加载');\n return;\n }\n\n // 转换路由\n await transformRoutes(allRoutes);\n // const reactRoutes = await transformRoutesToReactRoutes(result.routes, result);\n\n // 重新创建路由实例\n // 注意:这里需要获取原始配置的模式和选项\n // 由于当前架构限制,这里只是示例实现\n logger.info('路由重新加载完成');\n }\n}\n\n/**\n * 获取动态路由管理器单例\n */\nlet dynamicRouteManagerInstance: DynamicRouteManager | null = null;\n\nexport function getDynamicRouteManager(): DynamicRouteManager {\n if (!dynamicRouteManagerInstance) {\n dynamicRouteManagerInstance = new DynamicRouteManager();\n }\n return dynamicRouteManagerInstance;\n}\n"],"names":["logger","getRouterManager","transformRoutes","RouterError","RouterErrorCode","DynamicRouteManager","register","routes","namespace","ns","Array","isArray","length","ROUTER_CONFIG_ERROR","existingRoutes","registeredRoutes","get","existingNames","Set","map","r","name","newNames","conflicts","filter","has","join","undefined","currentRoutes","set","routeVersion","info","unregister","routeNames","filteredRoutes","includes","warn","delete","getRoutes","getAllRoutes","Map","clear","clearAll","getVersion","isRegistered","routeName","some","reload","routerManager","isInitialized","ROUTER_NOT_INITIALIZED","allRoutes","forEach","push","dynamicRouteManagerInstance","getDynamicRouteManager"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/router/errors/RouterError.ts"],"sourcesContent":["/**\n * 路由错误类型定义\n */\n\nimport { FrameworkError, ErrorSeverity, ErrorType } from '../../../utils/errors';\n\n/**\n * 路由错误代码\n */\nexport enum RouterErrorCode {\n /**\n * 路由未初始化\n */\n ROUTER_NOT_INITIALIZED = 'ROUTER_NOT_INITIALIZED',\n\n /**\n * 路由配置错误\n */\n ROUTER_CONFIG_ERROR = 'ROUTER_CONFIG_ERROR',\n\n /**\n * 路由未找到\n */\n ROUTE_NOT_FOUND = 'ROUTE_NOT_FOUND',\n\n /**\n * 路由导航失败\n */\n ROUTE_NAVIGATION_FAILED = 'ROUTE_NAVIGATION_FAILED',\n\n /**\n * 路由权限不足\n */\n ROUTE_PERMISSION_DENIED = 'ROUTE_PERMISSION_DENIED',\n\n /**\n * 路由组件加载失败\n */\n ROUTE_COMPONENT_LOAD_FAILED = 'ROUTE_COMPONENT_LOAD_FAILED',\n\n /**\n * 路由转换失败\n */\n ROUTE_TRANSFORM_FAILED = 'ROUTE_TRANSFORM_FAILED',\n}\n\n/**\n * 路由错误\n */\nexport class RouterError extends FrameworkError {\n constructor(\n message: string,\n code: RouterErrorCode,\n severity:
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/router/errors/RouterError.ts"],"sourcesContent":["/**\n * 路由错误类型定义\n */\n\nimport { FrameworkError, ErrorSeverity, ErrorType } from '../../../utils/errors';\nimport type { ErrorSeverity as ErrorSeverityType } from '@vlian/utils';\n\n/**\n * 路由错误代码\n */\nexport enum RouterErrorCode {\n /**\n * 路由未初始化\n */\n ROUTER_NOT_INITIALIZED = 'ROUTER_NOT_INITIALIZED',\n\n /**\n * 路由配置错误\n */\n ROUTER_CONFIG_ERROR = 'ROUTER_CONFIG_ERROR',\n\n /**\n * 路由未找到\n */\n ROUTE_NOT_FOUND = 'ROUTE_NOT_FOUND',\n\n /**\n * 路由导航失败\n */\n ROUTE_NAVIGATION_FAILED = 'ROUTE_NAVIGATION_FAILED',\n\n /**\n * 路由权限不足\n */\n ROUTE_PERMISSION_DENIED = 'ROUTE_PERMISSION_DENIED',\n\n /**\n * 路由组件加载失败\n */\n ROUTE_COMPONENT_LOAD_FAILED = 'ROUTE_COMPONENT_LOAD_FAILED',\n\n /**\n * 路由转换失败\n */\n ROUTE_TRANSFORM_FAILED = 'ROUTE_TRANSFORM_FAILED',\n}\n\n/**\n * 路由错误\n */\nexport class RouterError extends FrameworkError {\n constructor(\n message: string,\n code: RouterErrorCode,\n severity: ErrorSeverityType = ErrorSeverity.MEDIUM,\n cause?: Error,\n context?: Record<string, unknown>\n ) {\n super(message, ErrorType.RUNTIME, severity, {\n code,\n originalError: cause,\n context: context || {},\n });\n this.name = 'RouterError';\n }\n}\n\n/**\n * 创建路由错误\n */\nexport function createRouterError(\n message: string,\n code: RouterErrorCode,\n severity?: ErrorSeverityType,\n cause?: Error,\n context?: Record<string, unknown>\n): RouterError {\n return new RouterError(message, code, severity, cause, context);\n}\n"],"names":["RouterError","RouterErrorCode","createRouterError","FrameworkError","message","code","severity","ErrorSeverity","MEDIUM","cause","context","ErrorType","RUNTIME","originalError","name"],"mappings":"AAAA;;CAEC;;;;;;;;;;;QAgDYA;eAAAA;;QAxCDC;eAAAA;;QA4DIC;eAAAA;;;wBAlEyC;AAMlD,IAAA,AAAKD,yCAAAA;IACV;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;WAjCSA;;AAwCL,IAAA,AAAMD,cAAN,MAAMA,oBAAoBG,sBAAc;IAC7C,YACEC,OAAe,EACfC,IAAqB,EACrBC,WAA8BC,qBAAa,CAACC,MAAM,EAClDC,KAAa,EACbC,OAAiC,CACjC;QACA,KAAK,CAACN,SAASO,iBAAS,CAACC,OAAO,EAAEN,UAAU;YAC1CD;YACAQ,eAAeJ;YACfC,SAASA,WAAW,CAAC;QACvB;QACA,IAAI,CAACI,IAAI,GAAG;IACd;AACF;AAKO,SAASZ,kBACdE,OAAe,EACfC,IAAqB,EACrBC,QAA4B,EAC5BG,KAAa,EACbC,OAAiC;IAEjC,OAAO,IAAIV,YAAYI,SAASC,MAAMC,UAAUG,OAAOC;AACzD"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 路由错误类型定义
|
|
3
3
|
*/
|
|
4
|
-
import { FrameworkError
|
|
4
|
+
import { FrameworkError } from '../../../utils/errors';
|
|
5
|
+
import type { ErrorSeverity as ErrorSeverityType } from '@vlian/utils';
|
|
5
6
|
/**
|
|
6
7
|
* 路由错误代码
|
|
7
8
|
*/
|
|
@@ -39,9 +40,9 @@ export declare enum RouterErrorCode {
|
|
|
39
40
|
* 路由错误
|
|
40
41
|
*/
|
|
41
42
|
export declare class RouterError extends FrameworkError {
|
|
42
|
-
constructor(message: string, code: RouterErrorCode, severity?:
|
|
43
|
+
constructor(message: string, code: RouterErrorCode, severity?: ErrorSeverityType, cause?: Error, context?: Record<string, unknown>);
|
|
43
44
|
}
|
|
44
45
|
/**
|
|
45
46
|
* 创建路由错误
|
|
46
47
|
*/
|
|
47
|
-
export declare function createRouterError(message: string, code: RouterErrorCode, severity?:
|
|
48
|
+
export declare function createRouterError(message: string, code: RouterErrorCode, severity?: ErrorSeverityType, cause?: Error, context?: Record<string, unknown>): RouterError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/router/errors/RouterError.ts"],"sourcesContent":["/**\n * 路由错误类型定义\n */\n\nimport { FrameworkError, ErrorSeverity, ErrorType } from '../../../utils/errors';\n\n/**\n * 路由错误代码\n */\nexport enum RouterErrorCode {\n /**\n * 路由未初始化\n */\n ROUTER_NOT_INITIALIZED = 'ROUTER_NOT_INITIALIZED',\n\n /**\n * 路由配置错误\n */\n ROUTER_CONFIG_ERROR = 'ROUTER_CONFIG_ERROR',\n\n /**\n * 路由未找到\n */\n ROUTE_NOT_FOUND = 'ROUTE_NOT_FOUND',\n\n /**\n * 路由导航失败\n */\n ROUTE_NAVIGATION_FAILED = 'ROUTE_NAVIGATION_FAILED',\n\n /**\n * 路由权限不足\n */\n ROUTE_PERMISSION_DENIED = 'ROUTE_PERMISSION_DENIED',\n\n /**\n * 路由组件加载失败\n */\n ROUTE_COMPONENT_LOAD_FAILED = 'ROUTE_COMPONENT_LOAD_FAILED',\n\n /**\n * 路由转换失败\n */\n ROUTE_TRANSFORM_FAILED = 'ROUTE_TRANSFORM_FAILED',\n}\n\n/**\n * 路由错误\n */\nexport class RouterError extends FrameworkError {\n constructor(\n message: string,\n code: RouterErrorCode,\n severity:
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/router/errors/RouterError.ts"],"sourcesContent":["/**\n * 路由错误类型定义\n */\n\nimport { FrameworkError, ErrorSeverity, ErrorType } from '../../../utils/errors';\nimport type { ErrorSeverity as ErrorSeverityType } from '@vlian/utils';\n\n/**\n * 路由错误代码\n */\nexport enum RouterErrorCode {\n /**\n * 路由未初始化\n */\n ROUTER_NOT_INITIALIZED = 'ROUTER_NOT_INITIALIZED',\n\n /**\n * 路由配置错误\n */\n ROUTER_CONFIG_ERROR = 'ROUTER_CONFIG_ERROR',\n\n /**\n * 路由未找到\n */\n ROUTE_NOT_FOUND = 'ROUTE_NOT_FOUND',\n\n /**\n * 路由导航失败\n */\n ROUTE_NAVIGATION_FAILED = 'ROUTE_NAVIGATION_FAILED',\n\n /**\n * 路由权限不足\n */\n ROUTE_PERMISSION_DENIED = 'ROUTE_PERMISSION_DENIED',\n\n /**\n * 路由组件加载失败\n */\n ROUTE_COMPONENT_LOAD_FAILED = 'ROUTE_COMPONENT_LOAD_FAILED',\n\n /**\n * 路由转换失败\n */\n ROUTE_TRANSFORM_FAILED = 'ROUTE_TRANSFORM_FAILED',\n}\n\n/**\n * 路由错误\n */\nexport class RouterError extends FrameworkError {\n constructor(\n message: string,\n code: RouterErrorCode,\n severity: ErrorSeverityType = ErrorSeverity.MEDIUM,\n cause?: Error,\n context?: Record<string, unknown>\n ) {\n super(message, ErrorType.RUNTIME, severity, {\n code,\n originalError: cause,\n context: context || {},\n });\n this.name = 'RouterError';\n }\n}\n\n/**\n * 创建路由错误\n */\nexport function createRouterError(\n message: string,\n code: RouterErrorCode,\n severity?: ErrorSeverityType,\n cause?: Error,\n context?: Record<string, unknown>\n): RouterError {\n return new RouterError(message, code, severity, cause, context);\n}\n"],"names":["FrameworkError","ErrorSeverity","ErrorType","RouterErrorCode","RouterError","message","code","severity","MEDIUM","cause","context","RUNTIME","originalError","name","createRouterError"],"mappings":"AAAA;;CAEC,GAED,SAASA,cAAc,EAAEC,aAAa,EAAEC,SAAS,QAAQ,wBAAwB;AAGjF;;CAEC,GACD,OAAO,IAAA,AAAKC,yCAAAA;IACV;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;IAGD;;GAEC;WAjCSA;MAmCX;AAED;;CAEC,GACD,OAAO,MAAMC,oBAAoBJ;IAC/B,YACEK,OAAe,EACfC,IAAqB,EACrBC,WAA8BN,cAAcO,MAAM,EAClDC,KAAa,EACbC,OAAiC,CACjC;QACA,KAAK,CAACL,SAASH,UAAUS,OAAO,EAAEJ,UAAU;YAC1CD;YACAM,eAAeH;YACfC,SAASA,WAAW,CAAC;QACvB;QACA,IAAI,CAACG,IAAI,GAAG;IACd;AACF;AAEA;;CAEC,GACD,OAAO,SAASC,kBACdT,OAAe,EACfC,IAAqB,EACrBC,QAA4B,EAC5BE,KAAa,EACbC,OAAiC;IAEjC,OAAO,IAAIN,YAAYC,SAASC,MAAMC,UAAUE,OAAOC;AACzD"}
|
|
@@ -19,7 +19,7 @@ _export(exports, {
|
|
|
19
19
|
return getRouterLifecycleManager;
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
|
-
const
|
|
22
|
+
const _logger = require("@vlian/logger");
|
|
23
23
|
function _define_property(obj, key, value) {
|
|
24
24
|
if (key in obj) {
|
|
25
25
|
Object.defineProperty(obj, key, {
|
|
@@ -41,13 +41,13 @@ let RouterLifecycleManager = class RouterLifecycleManager {
|
|
|
41
41
|
* @returns 取消注册函数
|
|
42
42
|
*/ register(hooks) {
|
|
43
43
|
this.hooks.push(hooks);
|
|
44
|
-
|
|
44
|
+
_logger.logger.debug('路由生命周期钩子已注册');
|
|
45
45
|
// 返回取消注册函数
|
|
46
46
|
return ()=>{
|
|
47
47
|
const index = this.hooks.indexOf(hooks);
|
|
48
48
|
if (index > -1) {
|
|
49
49
|
this.hooks.splice(index, 1);
|
|
50
|
-
|
|
50
|
+
_logger.logger.debug('路由生命周期钩子已取消注册');
|
|
51
51
|
}
|
|
52
52
|
};
|
|
53
53
|
}
|
|
@@ -62,7 +62,7 @@ let RouterLifecycleManager = class RouterLifecycleManager {
|
|
|
62
62
|
* 清空所有生命周期钩子
|
|
63
63
|
*/ clear() {
|
|
64
64
|
this.hooks = [];
|
|
65
|
-
|
|
65
|
+
_logger.logger.debug('所有路由生命周期钩子已清空');
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
68
68
|
* 执行路由跳转前钩子
|
|
@@ -78,16 +78,16 @@ let RouterLifecycleManager = class RouterLifecycleManager {
|
|
|
78
78
|
const result = await hooks.beforeEach(to, from);
|
|
79
79
|
// 如果返回 false,阻止跳转
|
|
80
80
|
if (result === false) {
|
|
81
|
-
|
|
81
|
+
_logger.logger.debug('路由跳转被阻止: beforeEach 返回 false');
|
|
82
82
|
return false;
|
|
83
83
|
}
|
|
84
84
|
// 如果返回字符串,重定向到该路径
|
|
85
85
|
if (typeof result === 'string') {
|
|
86
|
-
|
|
86
|
+
_logger.logger.debug(`路由跳转重定向: beforeEach 返回 ${result}`);
|
|
87
87
|
return result;
|
|
88
88
|
}
|
|
89
89
|
} catch (error) {
|
|
90
|
-
|
|
90
|
+
_logger.logger.error('路由生命周期钩子执行失败: beforeEach', error);
|
|
91
91
|
continue;
|
|
92
92
|
}
|
|
93
93
|
}
|
|
@@ -107,7 +107,7 @@ let RouterLifecycleManager = class RouterLifecycleManager {
|
|
|
107
107
|
try {
|
|
108
108
|
await hooks.afterEach(to, from);
|
|
109
109
|
} catch (error) {
|
|
110
|
-
|
|
110
|
+
_logger.logger.error('路由生命周期钩子执行失败: afterEach', error);
|
|
111
111
|
continue;
|
|
112
112
|
}
|
|
113
113
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/router/lifecycle/RouterLifecycleManager.ts"],"sourcesContent":["/**\n * 路由生命周期管理器\n * 负责管理路由生命周期钩子的注册和执行\n */\n\nimport { logger } from '
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/router/lifecycle/RouterLifecycleManager.ts"],"sourcesContent":["/**\n * 路由生命周期管理器\n * 负责管理路由生命周期钩子的注册和执行\n */\n\nimport { logger } from '@vlian/logger';\nimport type { RouteLocation, RouteLifecycleHooks } from '../types';\n\n/**\n * 路由生命周期管理器\n */\nexport class RouterLifecycleManager {\n private hooks: RouteLifecycleHooks[] = [];\n\n /**\n * 注册生命周期钩子\n * \n * @param hooks - 生命周期钩子配置\n * @returns 取消注册函数\n */\n register(hooks: RouteLifecycleHooks): () => void {\n this.hooks.push(hooks);\n logger.debug('路由生命周期钩子已注册');\n\n // 返回取消注册函数\n return () => {\n const index = this.hooks.indexOf(hooks);\n if (index > -1) {\n this.hooks.splice(index, 1);\n logger.debug('路由生命周期钩子已取消注册');\n }\n };\n }\n\n /**\n * 批量注册生命周期钩子\n * \n * @param hooksArray - 生命周期钩子配置数组\n */\n registerBatch(hooksArray: RouteLifecycleHooks[]): void {\n hooksArray.forEach((hooks) => this.register(hooks));\n }\n\n /**\n * 清空所有生命周期钩子\n */\n clear(): void {\n this.hooks = [];\n logger.debug('所有路由生命周期钩子已清空');\n }\n\n /**\n * 执行路由跳转前钩子\n * \n * @param to - 目标路由\n * @param from - 来源路由\n * @returns 如果返回字符串,则跳转到该路径;如果返回 false,则阻止跳转;返回 true 或 undefined 则继续跳转\n */\n async beforeEach(\n to: RouteLocation,\n from?: RouteLocation\n ): Promise<string | false | void> {\n // 按注册顺序执行所有 beforeEach 钩子\n for (const hooks of this.hooks) {\n if (hooks.beforeEach) {\n try {\n const result = await hooks.beforeEach(to, from);\n\n // 如果返回 false,阻止跳转\n if (result === false) {\n logger.debug('路由跳转被阻止: beforeEach 返回 false');\n return false;\n }\n\n // 如果返回字符串,重定向到该路径\n if (typeof result === 'string') {\n logger.debug(`路由跳转重定向: beforeEach 返回 ${result}`);\n return result;\n }\n } catch (error) {\n logger.error('路由生命周期钩子执行失败: beforeEach', error);\n // 钩子执行失败时,默认继续跳转\n continue;\n }\n }\n }\n\n // 所有钩子都通过,允许跳转\n return undefined;\n }\n\n /**\n * 执行路由跳转后钩子\n * \n * @param to - 目标路由\n * @param from - 来源路由\n */\n async afterEach(to: RouteLocation, from?: RouteLocation): Promise<void> {\n // 按注册顺序执行所有 afterEach 钩子\n for (const hooks of this.hooks) {\n if (hooks.afterEach) {\n try {\n await hooks.afterEach(to, from);\n } catch (error) {\n logger.error('路由生命周期钩子执行失败: afterEach', error);\n // 钩子执行失败不影响路由跳转\n continue;\n }\n }\n }\n }\n\n /**\n * 获取所有生命周期钩子\n * \n * @returns 生命周期钩子配置数组\n */\n getAll(): RouteLifecycleHooks[] {\n return [...this.hooks];\n }\n\n /**\n * 获取生命周期钩子数量\n * \n * @returns 生命周期钩子数量\n */\n getCount(): number {\n return this.hooks.length;\n }\n}\n\n/**\n * 获取路由生命周期管理器单例\n */\nlet lifecycleManagerInstance: RouterLifecycleManager | null = null;\n\nexport function getRouterLifecycleManager(): RouterLifecycleManager {\n if (!lifecycleManagerInstance) {\n lifecycleManagerInstance = new RouterLifecycleManager();\n }\n return lifecycleManagerInstance;\n}\n"],"names":["RouterLifecycleManager","getRouterLifecycleManager","register","hooks","push","logger","debug","index","indexOf","splice","registerBatch","hooksArray","forEach","clear","beforeEach","to","from","result","error","undefined","afterEach","getAll","getCount","length","lifecycleManagerInstance"],"mappings":"AAAA;;;CAGC;;;;;;;;;;;QAQYA;eAAAA;;QA6HGC;eAAAA;;;wBAnIO;;;;;;;;;;;;;;AAMhB,IAAA,AAAMD,yBAAN,MAAMA;IAGX;;;;;GAKC,GACDE,SAASC,KAA0B,EAAc;QAC/C,IAAI,CAACA,KAAK,CAACC,IAAI,CAACD;QAChBE,cAAM,CAACC,KAAK,CAAC;QAEb,WAAW;QACX,OAAO;YACL,MAAMC,QAAQ,IAAI,CAACJ,KAAK,CAACK,OAAO,CAACL;YACjC,IAAII,QAAQ,CAAC,GAAG;gBACd,IAAI,CAACJ,KAAK,CAACM,MAAM,CAACF,OAAO;gBACzBF,cAAM,CAACC,KAAK,CAAC;YACf;QACF;IACF;IAEA;;;;GAIC,GACDI,cAAcC,UAAiC,EAAQ;QACrDA,WAAWC,OAAO,CAAC,CAACT,QAAU,IAAI,CAACD,QAAQ,CAACC;IAC9C;IAEA;;GAEC,GACDU,QAAc;QACZ,IAAI,CAACV,KAAK,GAAG,EAAE;QACfE,cAAM,CAACC,KAAK,CAAC;IACf;IAEA;;;;;;GAMC,GACD,MAAMQ,WACJC,EAAiB,EACjBC,IAAoB,EACY;QAChC,0BAA0B;QAC1B,KAAK,MAAMb,SAAS,IAAI,CAACA,KAAK,CAAE;YAC9B,IAAIA,MAAMW,UAAU,EAAE;gBACpB,IAAI;oBACF,MAAMG,SAAS,MAAMd,MAAMW,UAAU,CAACC,IAAIC;oBAE1C,kBAAkB;oBAClB,IAAIC,WAAW,OAAO;wBACpBZ,cAAM,CAACC,KAAK,CAAC;wBACb,OAAO;oBACT;oBAEA,kBAAkB;oBAClB,IAAI,OAAOW,WAAW,UAAU;wBAC9BZ,cAAM,CAACC,KAAK,CAAC,CAAC,uBAAuB,EAAEW,QAAQ;wBAC/C,OAAOA;oBACT;gBACF,EAAE,OAAOC,OAAO;oBACdb,cAAM,CAACa,KAAK,CAAC,4BAA4BA;oBAEzC;gBACF;YACF;QACF;QAEA,eAAe;QACf,OAAOC;IACT;IAEA;;;;;GAKC,GACD,MAAMC,UAAUL,EAAiB,EAAEC,IAAoB,EAAiB;QACtE,yBAAyB;QACzB,KAAK,MAAMb,SAAS,IAAI,CAACA,KAAK,CAAE;YAC9B,IAAIA,MAAMiB,SAAS,EAAE;gBACnB,IAAI;oBACF,MAAMjB,MAAMiB,SAAS,CAACL,IAAIC;gBAC5B,EAAE,OAAOE,OAAO;oBACdb,cAAM,CAACa,KAAK,CAAC,2BAA2BA;oBAExC;gBACF;YACF;QACF;IACF;IAEA;;;;GAIC,GACDG,SAAgC;QAC9B,OAAO;eAAI,IAAI,CAAClB,KAAK;SAAC;IACxB;IAEA;;;;GAIC,GACDmB,WAAmB;QACjB,OAAO,IAAI,CAACnB,KAAK,CAACoB,MAAM;IAC1B;;QApHA,uBAAQpB,SAA+B,EAAE;;AAqH3C;AAEA;;CAEC,GACD,IAAIqB,2BAA0D;AAEvD,SAASvB;IACd,IAAI,CAACuB,0BAA0B;QAC7BA,2BAA2B,IAAIxB;IACjC;IACA,OAAOwB;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/router/lifecycle/RouterLifecycleManager.ts"],"sourcesContent":["/**\n * 路由生命周期管理器\n * 负责管理路由生命周期钩子的注册和执行\n */\n\nimport { logger } from '
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/router/lifecycle/RouterLifecycleManager.ts"],"sourcesContent":["/**\n * 路由生命周期管理器\n * 负责管理路由生命周期钩子的注册和执行\n */\n\nimport { logger } from '@vlian/logger';\nimport type { RouteLocation, RouteLifecycleHooks } from '../types';\n\n/**\n * 路由生命周期管理器\n */\nexport class RouterLifecycleManager {\n private hooks: RouteLifecycleHooks[] = [];\n\n /**\n * 注册生命周期钩子\n * \n * @param hooks - 生命周期钩子配置\n * @returns 取消注册函数\n */\n register(hooks: RouteLifecycleHooks): () => void {\n this.hooks.push(hooks);\n logger.debug('路由生命周期钩子已注册');\n\n // 返回取消注册函数\n return () => {\n const index = this.hooks.indexOf(hooks);\n if (index > -1) {\n this.hooks.splice(index, 1);\n logger.debug('路由生命周期钩子已取消注册');\n }\n };\n }\n\n /**\n * 批量注册生命周期钩子\n * \n * @param hooksArray - 生命周期钩子配置数组\n */\n registerBatch(hooksArray: RouteLifecycleHooks[]): void {\n hooksArray.forEach((hooks) => this.register(hooks));\n }\n\n /**\n * 清空所有生命周期钩子\n */\n clear(): void {\n this.hooks = [];\n logger.debug('所有路由生命周期钩子已清空');\n }\n\n /**\n * 执行路由跳转前钩子\n * \n * @param to - 目标路由\n * @param from - 来源路由\n * @returns 如果返回字符串,则跳转到该路径;如果返回 false,则阻止跳转;返回 true 或 undefined 则继续跳转\n */\n async beforeEach(\n to: RouteLocation,\n from?: RouteLocation\n ): Promise<string | false | void> {\n // 按注册顺序执行所有 beforeEach 钩子\n for (const hooks of this.hooks) {\n if (hooks.beforeEach) {\n try {\n const result = await hooks.beforeEach(to, from);\n\n // 如果返回 false,阻止跳转\n if (result === false) {\n logger.debug('路由跳转被阻止: beforeEach 返回 false');\n return false;\n }\n\n // 如果返回字符串,重定向到该路径\n if (typeof result === 'string') {\n logger.debug(`路由跳转重定向: beforeEach 返回 ${result}`);\n return result;\n }\n } catch (error) {\n logger.error('路由生命周期钩子执行失败: beforeEach', error);\n // 钩子执行失败时,默认继续跳转\n continue;\n }\n }\n }\n\n // 所有钩子都通过,允许跳转\n return undefined;\n }\n\n /**\n * 执行路由跳转后钩子\n * \n * @param to - 目标路由\n * @param from - 来源路由\n */\n async afterEach(to: RouteLocation, from?: RouteLocation): Promise<void> {\n // 按注册顺序执行所有 afterEach 钩子\n for (const hooks of this.hooks) {\n if (hooks.afterEach) {\n try {\n await hooks.afterEach(to, from);\n } catch (error) {\n logger.error('路由生命周期钩子执行失败: afterEach', error);\n // 钩子执行失败不影响路由跳转\n continue;\n }\n }\n }\n }\n\n /**\n * 获取所有生命周期钩子\n * \n * @returns 生命周期钩子配置数组\n */\n getAll(): RouteLifecycleHooks[] {\n return [...this.hooks];\n }\n\n /**\n * 获取生命周期钩子数量\n * \n * @returns 生命周期钩子数量\n */\n getCount(): number {\n return this.hooks.length;\n }\n}\n\n/**\n * 获取路由生命周期管理器单例\n */\nlet lifecycleManagerInstance: RouterLifecycleManager | null = null;\n\nexport function getRouterLifecycleManager(): RouterLifecycleManager {\n if (!lifecycleManagerInstance) {\n lifecycleManagerInstance = new RouterLifecycleManager();\n }\n return lifecycleManagerInstance;\n}\n"],"names":["logger","RouterLifecycleManager","register","hooks","push","debug","index","indexOf","splice","registerBatch","hooksArray","forEach","clear","beforeEach","to","from","result","error","undefined","afterEach","getAll","getCount","length","lifecycleManagerInstance","getRouterLifecycleManager"],"mappings":";;;;;;;;;;;;;AAAA;;;CAGC,GAED,SAASA,MAAM,QAAQ,gBAAgB;AAGvC;;CAEC,GACD,OAAO,MAAMC;IAGX;;;;;GAKC,GACDC,SAASC,KAA0B,EAAc;QAC/C,IAAI,CAACA,KAAK,CAACC,IAAI,CAACD;QAChBH,OAAOK,KAAK,CAAC;QAEb,WAAW;QACX,OAAO;YACL,MAAMC,QAAQ,IAAI,CAACH,KAAK,CAACI,OAAO,CAACJ;YACjC,IAAIG,QAAQ,CAAC,GAAG;gBACd,IAAI,CAACH,KAAK,CAACK,MAAM,CAACF,OAAO;gBACzBN,OAAOK,KAAK,CAAC;YACf;QACF;IACF;IAEA;;;;GAIC,GACDI,cAAcC,UAAiC,EAAQ;QACrDA,WAAWC,OAAO,CAAC,CAACR,QAAU,IAAI,CAACD,QAAQ,CAACC;IAC9C;IAEA;;GAEC,GACDS,QAAc;QACZ,IAAI,CAACT,KAAK,GAAG,EAAE;QACfH,OAAOK,KAAK,CAAC;IACf;IAEA;;;;;;GAMC,GACD,MAAMQ,WACJC,EAAiB,EACjBC,IAAoB,EACY;QAChC,0BAA0B;QAC1B,KAAK,MAAMZ,SAAS,IAAI,CAACA,KAAK,CAAE;YAC9B,IAAIA,MAAMU,UAAU,EAAE;gBACpB,IAAI;oBACF,MAAMG,SAAS,MAAMb,MAAMU,UAAU,CAACC,IAAIC;oBAE1C,kBAAkB;oBAClB,IAAIC,WAAW,OAAO;wBACpBhB,OAAOK,KAAK,CAAC;wBACb,OAAO;oBACT;oBAEA,kBAAkB;oBAClB,IAAI,OAAOW,WAAW,UAAU;wBAC9BhB,OAAOK,KAAK,CAAC,CAAC,uBAAuB,EAAEW,QAAQ;wBAC/C,OAAOA;oBACT;gBACF,EAAE,OAAOC,OAAO;oBACdjB,OAAOiB,KAAK,CAAC,4BAA4BA;oBAEzC;gBACF;YACF;QACF;QAEA,eAAe;QACf,OAAOC;IACT;IAEA;;;;;GAKC,GACD,MAAMC,UAAUL,EAAiB,EAAEC,IAAoB,EAAiB;QACtE,yBAAyB;QACzB,KAAK,MAAMZ,SAAS,IAAI,CAACA,KAAK,CAAE;YAC9B,IAAIA,MAAMgB,SAAS,EAAE;gBACnB,IAAI;oBACF,MAAMhB,MAAMgB,SAAS,CAACL,IAAIC;gBAC5B,EAAE,OAAOE,OAAO;oBACdjB,OAAOiB,KAAK,CAAC,2BAA2BA;oBAExC;gBACF;YACF;QACF;IACF;IAEA;;;;GAIC,GACDG,SAAgC;QAC9B,OAAO;eAAI,IAAI,CAACjB,KAAK;SAAC;IACxB;IAEA;;;;GAIC,GACDkB,WAAmB;QACjB,OAAO,IAAI,CAAClB,KAAK,CAACmB,MAAM;IAC1B;;QApHA,uBAAQnB,SAA+B,EAAE;;AAqH3C;AAEA;;CAEC,GACD,IAAIoB,2BAA0D;AAE9D,OAAO,SAASC;IACd,IAAI,CAACD,0BAA0B;QAC7BA,2BAA2B,IAAItB;IACjC;IACA,OAAOsB;AACT"}
|
|
@@ -19,7 +19,7 @@ _export(exports, {
|
|
|
19
19
|
return getRouterMiddlewareManager;
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
|
-
const
|
|
22
|
+
const _logger = require("@vlian/logger");
|
|
23
23
|
function _define_property(obj, key, value) {
|
|
24
24
|
if (key in obj) {
|
|
25
25
|
Object.defineProperty(obj, key, {
|
|
@@ -54,13 +54,13 @@ let RouterMiddlewareManager = class RouterMiddlewareManager {
|
|
|
54
54
|
this.middlewares.push(middlewareConfig);
|
|
55
55
|
// 按优先级排序
|
|
56
56
|
this.middlewares.sort((a, b)=>(a.priority || 100) - (b.priority || 100));
|
|
57
|
-
|
|
57
|
+
_logger.logger.debug(`路由中间件已注册: ${middlewareConfig.name || 'anonymous'}`);
|
|
58
58
|
// 返回取消注册函数
|
|
59
59
|
return ()=>{
|
|
60
60
|
const index = this.middlewares.indexOf(middlewareConfig);
|
|
61
61
|
if (index > -1) {
|
|
62
62
|
this.middlewares.splice(index, 1);
|
|
63
|
-
|
|
63
|
+
_logger.logger.debug(`路由中间件已取消注册: ${middlewareConfig.name || 'anonymous'}`);
|
|
64
64
|
}
|
|
65
65
|
};
|
|
66
66
|
}
|
|
@@ -79,14 +79,14 @@ let RouterMiddlewareManager = class RouterMiddlewareManager {
|
|
|
79
79
|
const index = this.middlewares.findIndex((m)=>m.name === name);
|
|
80
80
|
if (index > -1) {
|
|
81
81
|
this.middlewares.splice(index, 1);
|
|
82
|
-
|
|
82
|
+
_logger.logger.debug(`路由中间件已取消注册: ${name}`);
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
/**
|
|
86
86
|
* 清空所有中间件
|
|
87
87
|
*/ clear() {
|
|
88
88
|
this.middlewares = [];
|
|
89
|
-
|
|
89
|
+
_logger.logger.debug('所有路由中间件已清空');
|
|
90
90
|
}
|
|
91
91
|
/**
|
|
92
92
|
* 执行中间件链
|
|
@@ -111,7 +111,7 @@ let RouterMiddlewareManager = class RouterMiddlewareManager {
|
|
|
111
111
|
const result = await middlewareConfig.middleware(context);
|
|
112
112
|
// 如果中间件返回 false,阻止导航
|
|
113
113
|
if (result === false) {
|
|
114
|
-
|
|
114
|
+
_logger.logger.debug(`路由中间件阻止导航: ${middlewareConfig.name || 'anonymous'} -> false`);
|
|
115
115
|
return {
|
|
116
116
|
allow: false,
|
|
117
117
|
reason: '中间件返回 false'
|
|
@@ -119,9 +119,9 @@ let RouterMiddlewareManager = class RouterMiddlewareManager {
|
|
|
119
119
|
}
|
|
120
120
|
// 如果中间件返回对象且 allow: false,阻止导航
|
|
121
121
|
if (typeof result === 'object' && result !== null && result.allow === false) {
|
|
122
|
-
|
|
122
|
+
_logger.logger.debug(`路由中间件阻止导航: ${middlewareConfig.name || 'anonymous'}`, result);
|
|
123
123
|
if (result.redirect && !RouterMiddlewareManager.SAFE_REDIRECT_PATH_REGEX.test(result.redirect)) {
|
|
124
|
-
|
|
124
|
+
_logger.logger.warn(`路由中间件返回了不安全的重定向地址,已拦截: ${middlewareConfig.name || 'anonymous'} -> ${result.redirect}`);
|
|
125
125
|
return {
|
|
126
126
|
allow: false,
|
|
127
127
|
reason: '中间件返回了不安全的重定向地址'
|
|
@@ -132,20 +132,20 @@ let RouterMiddlewareManager = class RouterMiddlewareManager {
|
|
|
132
132
|
// 如果中间件返回字符串,重定向到该路径
|
|
133
133
|
if (typeof result === 'string') {
|
|
134
134
|
if (!RouterMiddlewareManager.SAFE_REDIRECT_PATH_REGEX.test(result)) {
|
|
135
|
-
|
|
135
|
+
_logger.logger.warn(`路由中间件返回了不安全的重定向地址,已拦截: ${middlewareConfig.name || 'anonymous'} -> ${result}`);
|
|
136
136
|
return {
|
|
137
137
|
allow: false,
|
|
138
138
|
reason: '中间件返回了不安全的重定向地址'
|
|
139
139
|
};
|
|
140
140
|
}
|
|
141
|
-
|
|
141
|
+
_logger.logger.debug(`路由中间件重定向: ${middlewareConfig.name || 'anonymous'} -> ${result}`);
|
|
142
142
|
return {
|
|
143
143
|
allow: false,
|
|
144
144
|
redirect: result
|
|
145
145
|
};
|
|
146
146
|
}
|
|
147
147
|
} catch (error) {
|
|
148
|
-
|
|
148
|
+
_logger.logger.error(`路由中间件执行失败: ${middlewareConfig.name || 'anonymous'}`, error);
|
|
149
149
|
continue;
|
|
150
150
|
}
|
|
151
151
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/router/middleware/RouterMiddlewareManager.ts"],"sourcesContent":["/**\n * 路由中间件管理器\n * 负责管理路由中间件的注册、执行和生命周期\n */\n\nimport { logger } from '
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/router/middleware/RouterMiddlewareManager.ts"],"sourcesContent":["/**\n * 路由中间件管理器\n * 负责管理路由中间件的注册、执行和生命周期\n */\n\nimport { logger } from '@vlian/logger';\nimport type {\n RouterMiddlewareConfig,\n RouterMiddlewareContext,\n RouterMiddlewareResult,\n} from './types';\n\n/**\n * 路由中间件管理器\n */\nexport class RouterMiddlewareManager {\n private middlewares: RouterMiddlewareConfig[] = [];\n private static readonly SAFE_REDIRECT_PATH_REGEX = /^(\\/|\\.\\/|\\.\\.\\/|#)/;\n\n /**\n * 注册中间件\n * \n * @param config - 中间件配置\n * @returns 取消注册函数\n */\n register(config: RouterMiddlewareConfig): () => void {\n // 验证中间件配置\n if (!config.middleware || typeof config.middleware !== 'function') {\n throw new Error('中间件必须是一个函数');\n }\n\n // 设置默认值\n const middlewareConfig: RouterMiddlewareConfig = {\n priority: 100,\n enabled: true,\n ...config,\n };\n\n // 添加到中间件列表\n this.middlewares.push(middlewareConfig);\n\n // 按优先级排序\n this.middlewares.sort((a, b) => (a.priority || 100) - (b.priority || 100));\n\n logger.debug(`路由中间件已注册: ${middlewareConfig.name || 'anonymous'}`);\n\n // 返回取消注册函数\n return () => {\n const index = this.middlewares.indexOf(middlewareConfig);\n if (index > -1) {\n this.middlewares.splice(index, 1);\n logger.debug(`路由中间件已取消注册: ${middlewareConfig.name || 'anonymous'}`);\n }\n };\n }\n\n /**\n * 批量注册中间件\n * \n * @param configs - 中间件配置数组\n */\n registerBatch(configs: RouterMiddlewareConfig[]): void {\n configs.forEach((config) => this.register(config));\n }\n\n /**\n * 取消注册中间件\n * \n * @param name - 中间件名称\n */\n unregister(name: string): void {\n const index = this.middlewares.findIndex((m) => m.name === name);\n if (index > -1) {\n this.middlewares.splice(index, 1);\n logger.debug(`路由中间件已取消注册: ${name}`);\n }\n }\n\n /**\n * 清空所有中间件\n */\n clear(): void {\n this.middlewares = [];\n logger.debug('所有路由中间件已清空');\n }\n\n /**\n * 执行中间件链\n * \n * @param context - 中间件上下文\n * @returns 中间件执行结果\n */\n async execute(context: RouterMiddlewareContext): Promise<RouterMiddlewareResult> {\n // 过滤启用的中间件\n const enabledMiddlewares = this.middlewares.filter((m) => {\n if (!m.enabled) {\n return false;\n }\n\n // 检查条件函数\n if (m.condition && !m.condition(context)) {\n return false;\n }\n\n return true;\n });\n\n // 按顺序执行中间件\n for (const middlewareConfig of enabledMiddlewares) {\n try {\n const result = await middlewareConfig.middleware(context);\n\n // 如果中间件返回 false,阻止导航\n if (result === false) {\n logger.debug(\n `路由中间件阻止导航: ${middlewareConfig.name || 'anonymous'} -> false`\n );\n return {\n allow: false,\n reason: '中间件返回 false',\n };\n }\n\n // 如果中间件返回对象且 allow: false,阻止导航\n if (typeof result === 'object' && result !== null && result.allow === false) {\n logger.debug(\n `路由中间件阻止导航: ${middlewareConfig.name || 'anonymous'}`,\n result\n );\n\n if (result.redirect && !RouterMiddlewareManager.SAFE_REDIRECT_PATH_REGEX.test(result.redirect)) {\n logger.warn(\n `路由中间件返回了不安全的重定向地址,已拦截: ${middlewareConfig.name || 'anonymous'} -> ${result.redirect}`\n );\n return {\n allow: false,\n reason: '中间件返回了不安全的重定向地址',\n };\n }\n\n return result;\n }\n\n // 如果中间件返回字符串,重定向到该路径\n if (typeof result === 'string') {\n if (!RouterMiddlewareManager.SAFE_REDIRECT_PATH_REGEX.test(result)) {\n logger.warn(\n `路由中间件返回了不安全的重定向地址,已拦截: ${middlewareConfig.name || 'anonymous'} -> ${result}`\n );\n return {\n allow: false,\n reason: '中间件返回了不安全的重定向地址',\n };\n }\n\n logger.debug(\n `路由中间件重定向: ${middlewareConfig.name || 'anonymous'} -> ${result}`\n );\n\n return {\n allow: false,\n redirect: result,\n };\n }\n } catch (error) {\n logger.error(\n `路由中间件执行失败: ${middlewareConfig.name || 'anonymous'}`,\n error\n );\n\n // 中间件执行失败时,默认允许继续导航\n // 但记录错误以便调试\n continue;\n }\n }\n\n // 所有中间件都通过,允许导航\n return { allow: true };\n }\n\n /**\n * 获取所有中间件\n * \n * @returns 中间件配置数组\n */\n getAll(): RouterMiddlewareConfig[] {\n return [...this.middlewares];\n }\n\n /**\n * 获取启用的中间件\n * \n * @returns 启用的中间件配置数组\n */\n getEnabled(): RouterMiddlewareConfig[] {\n return this.middlewares.filter((m) => m.enabled);\n }\n\n /**\n * 获取中间件数量\n * \n * @returns 中间件数量\n */\n getCount(): number {\n return this.middlewares.length;\n }\n}\n\n/**\n * 获取路由中间件管理器单例\n */\nlet middlewareManagerInstance: RouterMiddlewareManager | null = null;\n\nexport function getRouterMiddlewareManager(): RouterMiddlewareManager {\n if (!middlewareManagerInstance) {\n middlewareManagerInstance = new RouterMiddlewareManager();\n }\n return middlewareManagerInstance;\n}\n"],"names":["RouterMiddlewareManager","getRouterMiddlewareManager","register","config","middleware","Error","middlewareConfig","priority","enabled","middlewares","push","sort","a","b","logger","debug","name","index","indexOf","splice","registerBatch","configs","forEach","unregister","findIndex","m","clear","execute","context","enabledMiddlewares","filter","condition","result","allow","reason","redirect","SAFE_REDIRECT_PATH_REGEX","test","warn","error","getAll","getEnabled","getCount","length","middlewareManagerInstance"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/router/middleware/RouterMiddlewareManager.ts"],"sourcesContent":["/**\n * 路由中间件管理器\n * 负责管理路由中间件的注册、执行和生命周期\n */\n\nimport { logger } from '
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/router/middleware/RouterMiddlewareManager.ts"],"sourcesContent":["/**\n * 路由中间件管理器\n * 负责管理路由中间件的注册、执行和生命周期\n */\n\nimport { logger } from '@vlian/logger';\nimport type {\n RouterMiddlewareConfig,\n RouterMiddlewareContext,\n RouterMiddlewareResult,\n} from './types';\n\n/**\n * 路由中间件管理器\n */\nexport class RouterMiddlewareManager {\n private middlewares: RouterMiddlewareConfig[] = [];\n private static readonly SAFE_REDIRECT_PATH_REGEX = /^(\\/|\\.\\/|\\.\\.\\/|#)/;\n\n /**\n * 注册中间件\n * \n * @param config - 中间件配置\n * @returns 取消注册函数\n */\n register(config: RouterMiddlewareConfig): () => void {\n // 验证中间件配置\n if (!config.middleware || typeof config.middleware !== 'function') {\n throw new Error('中间件必须是一个函数');\n }\n\n // 设置默认值\n const middlewareConfig: RouterMiddlewareConfig = {\n priority: 100,\n enabled: true,\n ...config,\n };\n\n // 添加到中间件列表\n this.middlewares.push(middlewareConfig);\n\n // 按优先级排序\n this.middlewares.sort((a, b) => (a.priority || 100) - (b.priority || 100));\n\n logger.debug(`路由中间件已注册: ${middlewareConfig.name || 'anonymous'}`);\n\n // 返回取消注册函数\n return () => {\n const index = this.middlewares.indexOf(middlewareConfig);\n if (index > -1) {\n this.middlewares.splice(index, 1);\n logger.debug(`路由中间件已取消注册: ${middlewareConfig.name || 'anonymous'}`);\n }\n };\n }\n\n /**\n * 批量注册中间件\n * \n * @param configs - 中间件配置数组\n */\n registerBatch(configs: RouterMiddlewareConfig[]): void {\n configs.forEach((config) => this.register(config));\n }\n\n /**\n * 取消注册中间件\n * \n * @param name - 中间件名称\n */\n unregister(name: string): void {\n const index = this.middlewares.findIndex((m) => m.name === name);\n if (index > -1) {\n this.middlewares.splice(index, 1);\n logger.debug(`路由中间件已取消注册: ${name}`);\n }\n }\n\n /**\n * 清空所有中间件\n */\n clear(): void {\n this.middlewares = [];\n logger.debug('所有路由中间件已清空');\n }\n\n /**\n * 执行中间件链\n * \n * @param context - 中间件上下文\n * @returns 中间件执行结果\n */\n async execute(context: RouterMiddlewareContext): Promise<RouterMiddlewareResult> {\n // 过滤启用的中间件\n const enabledMiddlewares = this.middlewares.filter((m) => {\n if (!m.enabled) {\n return false;\n }\n\n // 检查条件函数\n if (m.condition && !m.condition(context)) {\n return false;\n }\n\n return true;\n });\n\n // 按顺序执行中间件\n for (const middlewareConfig of enabledMiddlewares) {\n try {\n const result = await middlewareConfig.middleware(context);\n\n // 如果中间件返回 false,阻止导航\n if (result === false) {\n logger.debug(\n `路由中间件阻止导航: ${middlewareConfig.name || 'anonymous'} -> false`\n );\n return {\n allow: false,\n reason: '中间件返回 false',\n };\n }\n\n // 如果中间件返回对象且 allow: false,阻止导航\n if (typeof result === 'object' && result !== null && result.allow === false) {\n logger.debug(\n `路由中间件阻止导航: ${middlewareConfig.name || 'anonymous'}`,\n result\n );\n\n if (result.redirect && !RouterMiddlewareManager.SAFE_REDIRECT_PATH_REGEX.test(result.redirect)) {\n logger.warn(\n `路由中间件返回了不安全的重定向地址,已拦截: ${middlewareConfig.name || 'anonymous'} -> ${result.redirect}`\n );\n return {\n allow: false,\n reason: '中间件返回了不安全的重定向地址',\n };\n }\n\n return result;\n }\n\n // 如果中间件返回字符串,重定向到该路径\n if (typeof result === 'string') {\n if (!RouterMiddlewareManager.SAFE_REDIRECT_PATH_REGEX.test(result)) {\n logger.warn(\n `路由中间件返回了不安全的重定向地址,已拦截: ${middlewareConfig.name || 'anonymous'} -> ${result}`\n );\n return {\n allow: false,\n reason: '中间件返回了不安全的重定向地址',\n };\n }\n\n logger.debug(\n `路由中间件重定向: ${middlewareConfig.name || 'anonymous'} -> ${result}`\n );\n\n return {\n allow: false,\n redirect: result,\n };\n }\n } catch (error) {\n logger.error(\n `路由中间件执行失败: ${middlewareConfig.name || 'anonymous'}`,\n error\n );\n\n // 中间件执行失败时,默认允许继续导航\n // 但记录错误以便调试\n continue;\n }\n }\n\n // 所有中间件都通过,允许导航\n return { allow: true };\n }\n\n /**\n * 获取所有中间件\n * \n * @returns 中间件配置数组\n */\n getAll(): RouterMiddlewareConfig[] {\n return [...this.middlewares];\n }\n\n /**\n * 获取启用的中间件\n * \n * @returns 启用的中间件配置数组\n */\n getEnabled(): RouterMiddlewareConfig[] {\n return this.middlewares.filter((m) => m.enabled);\n }\n\n /**\n * 获取中间件数量\n * \n * @returns 中间件数量\n */\n getCount(): number {\n return this.middlewares.length;\n }\n}\n\n/**\n * 获取路由中间件管理器单例\n */\nlet middlewareManagerInstance: RouterMiddlewareManager | null = null;\n\nexport function getRouterMiddlewareManager(): RouterMiddlewareManager {\n if (!middlewareManagerInstance) {\n middlewareManagerInstance = new RouterMiddlewareManager();\n }\n return middlewareManagerInstance;\n}\n"],"names":["logger","RouterMiddlewareManager","register","config","middleware","Error","middlewareConfig","priority","enabled","middlewares","push","sort","a","b","debug","name","index","indexOf","splice","registerBatch","configs","forEach","unregister","findIndex","m","clear","execute","context","enabledMiddlewares","filter","condition","result","allow","reason","redirect","SAFE_REDIRECT_PATH_REGEX","test","warn","error","getAll","getEnabled","getCount","length","middlewareManagerInstance","getRouterMiddlewareManager"],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ Object.defineProperty(exports, "createAuthMiddleware", {
|
|
|
10
10
|
return createAuthMiddleware;
|
|
11
11
|
}
|
|
12
12
|
});
|
|
13
|
-
const
|
|
13
|
+
const _logger = require("@vlian/logger");
|
|
14
14
|
function createAuthMiddleware(config) {
|
|
15
15
|
const { checkAuth, checkLogin, checkRole, loginRedirect = '/login', forbiddenRedirect = '/403' } = config;
|
|
16
16
|
return async (context)=>{
|
|
@@ -22,7 +22,7 @@ function createAuthMiddleware(config) {
|
|
|
22
22
|
if (checkLogin) {
|
|
23
23
|
const isLoggedIn = await checkLogin();
|
|
24
24
|
if (!isLoggedIn) {
|
|
25
|
-
|
|
25
|
+
_logger.logger.debug(`路由权限拦截: 未登录,重定向到 ${loginRedirect}`);
|
|
26
26
|
return {
|
|
27
27
|
allow: false,
|
|
28
28
|
redirect: loginRedirect,
|
|
@@ -37,7 +37,7 @@ function createAuthMiddleware(config) {
|
|
|
37
37
|
if (checkRole) {
|
|
38
38
|
const hasRole = await checkRole(roles);
|
|
39
39
|
if (!hasRole) {
|
|
40
|
-
|
|
40
|
+
_logger.logger.debug(`路由权限拦截: 无权限,重定向到 ${forbiddenRedirect}`);
|
|
41
41
|
return {
|
|
42
42
|
allow: false,
|
|
43
43
|
redirect: forbiddenRedirect,
|
|
@@ -50,7 +50,7 @@ function createAuthMiddleware(config) {
|
|
|
50
50
|
if (checkAuth) {
|
|
51
51
|
const hasAuth = await checkAuth(context);
|
|
52
52
|
if (!hasAuth) {
|
|
53
|
-
|
|
53
|
+
_logger.logger.debug(`路由权限拦截: 权限检查失败,重定向到 ${forbiddenRedirect}`);
|
|
54
54
|
return {
|
|
55
55
|
allow: false,
|
|
56
56
|
redirect: forbiddenRedirect,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/router/middleware/auth.ts"],"sourcesContent":["/**\n * 路由权限拦截中间件\n */\n\nimport type {\n RouterMiddleware,\n RouterMiddlewareContext,\n RouterMiddlewareResult,\n} from './types';\nimport { logger } from '
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/router/middleware/auth.ts"],"sourcesContent":["/**\n * 路由权限拦截中间件\n */\n\nimport type {\n RouterMiddleware,\n RouterMiddlewareContext,\n RouterMiddlewareResult,\n} from './types';\nimport { logger } from '@vlian/logger';\n\n/**\n * 权限检查函数类型\n */\nexport type AuthCheckFunction = (context: RouterMiddlewareContext) => boolean | Promise<boolean>;\n\n/**\n * 权限拦截中间件配置\n */\nexport interface AuthMiddlewareConfig {\n /**\n * 权限检查函数\n * 返回 true 表示有权限,false 表示无权限\n */\n checkAuth: AuthCheckFunction;\n\n /**\n * 登录状态检查函数\n * 返回 true 表示已登录,false 表示未登录\n */\n checkLogin?: () => boolean | Promise<boolean>;\n\n /**\n * 角色检查函数\n * 返回 true 表示有权限,false 表示无权限\n */\n checkRole?: (roles: string[]) => boolean | Promise<boolean>;\n\n /**\n * 未登录时重定向路径\n * @default '/login'\n */\n loginRedirect?: string;\n\n /**\n * 无权限时重定向路径\n * @default '/403'\n */\n forbiddenRedirect?: string;\n\n /**\n * 中间件名称\n */\n name?: string;\n\n /**\n * 优先级\n * @default 10\n */\n priority?: number;\n}\n\n/**\n * 创建权限拦截中间件\n * \n * @param config - 权限拦截中间件配置\n * @returns 路由中间件函数\n */\nexport function createAuthMiddleware(\n config: AuthMiddlewareConfig\n): RouterMiddleware {\n const {\n checkAuth,\n checkLogin,\n checkRole,\n loginRedirect = '/login',\n forbiddenRedirect = '/403',\n } = config;\n\n return async (context: RouterMiddlewareContext): Promise<RouterMiddlewareResult> => {\n const { to } = context;\n\n // 检查路由是否需要登录\n const needLogin = to.meta?.needLogin || (to.meta as any)?.handle?.needLogin;\n\n if (needLogin) {\n // 检查登录状态\n if (checkLogin) {\n const isLoggedIn = await checkLogin();\n if (!isLoggedIn) {\n logger.debug(`路由权限拦截: 未登录,重定向到 ${loginRedirect}`);\n return {\n allow: false,\n redirect: loginRedirect,\n reason: '需要登录',\n };\n }\n }\n }\n\n // 检查路由角色权限\n const roles = to.meta?.roles || (to.meta as any)?.handle?.roles;\n if (roles && Array.isArray(roles) && roles.length > 0) {\n if (checkRole) {\n const hasRole = await checkRole(roles);\n if (!hasRole) {\n logger.debug(`路由权限拦截: 无权限,重定向到 ${forbiddenRedirect}`);\n return {\n allow: false,\n redirect: forbiddenRedirect,\n reason: '无权限访问',\n };\n }\n }\n }\n\n // 执行自定义权限检查\n if (checkAuth) {\n const hasAuth = await checkAuth(context);\n if (!hasAuth) {\n logger.debug(`路由权限拦截: 权限检查失败,重定向到 ${forbiddenRedirect}`);\n return {\n allow: false,\n redirect: forbiddenRedirect,\n reason: '权限检查失败',\n };\n }\n }\n\n // 权限检查通过\n return { allow: true };\n };\n}\n"],"names":["createAuthMiddleware","config","checkAuth","checkLogin","checkRole","loginRedirect","forbiddenRedirect","context","to","needLogin","meta","handle","isLoggedIn","logger","debug","allow","redirect","reason","roles","Array","isArray","length","hasRole","hasAuth"],"mappings":"AAAA;;CAEC;;;;+BAkEeA;;;eAAAA;;;wBA3DO;AA2DhB,SAASA,qBACdC,MAA4B;IAE5B,MAAM,EACJC,SAAS,EACTC,UAAU,EACVC,SAAS,EACTC,gBAAgB,QAAQ,EACxBC,oBAAoB,MAAM,EAC3B,GAAGL;IAEJ,OAAO,OAAOM;QACZ,MAAM,EAAEC,EAAE,EAAE,GAAGD;QAEf,aAAa;QACb,MAAME,YAAYD,GAAGE,IAAI,EAAED,aAAcD,GAAGE,IAAI,EAAUC,QAAQF;QAElE,IAAIA,WAAW;YACb,SAAS;YACT,IAAIN,YAAY;gBACd,MAAMS,aAAa,MAAMT;gBACzB,IAAI,CAACS,YAAY;oBACfC,cAAM,CAACC,KAAK,CAAC,CAAC,iBAAiB,EAAET,eAAe;oBAChD,OAAO;wBACLU,OAAO;wBACPC,UAAUX;wBACVY,QAAQ;oBACV;gBACF;YACF;QACF;QAEA,WAAW;QACX,MAAMC,QAAQV,GAAGE,IAAI,EAAEQ,SAAUV,GAAGE,IAAI,EAAUC,QAAQO;QAC1D,IAAIA,SAASC,MAAMC,OAAO,CAACF,UAAUA,MAAMG,MAAM,GAAG,GAAG;YACrD,IAAIjB,WAAW;gBACb,MAAMkB,UAAU,MAAMlB,UAAUc;gBAChC,IAAI,CAACI,SAAS;oBACZT,cAAM,CAACC,KAAK,CAAC,CAAC,iBAAiB,EAAER,mBAAmB;oBACpD,OAAO;wBACLS,OAAO;wBACPC,UAAUV;wBACVW,QAAQ;oBACV;gBACF;YACF;QACF;QAEA,YAAY;QACZ,IAAIf,WAAW;YACb,MAAMqB,UAAU,MAAMrB,UAAUK;YAChC,IAAI,CAACgB,SAAS;gBACZV,cAAM,CAACC,KAAK,CAAC,CAAC,oBAAoB,EAAER,mBAAmB;gBACvD,OAAO;oBACLS,OAAO;oBACPC,UAAUV;oBACVW,QAAQ;gBACV;YACF;QACF;QAEA,SAAS;QACT,OAAO;YAAEF,OAAO;QAAK;IACvB;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/router/middleware/auth.ts"],"sourcesContent":["/**\n * 路由权限拦截中间件\n */\n\nimport type {\n RouterMiddleware,\n RouterMiddlewareContext,\n RouterMiddlewareResult,\n} from './types';\nimport { logger } from '
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/router/middleware/auth.ts"],"sourcesContent":["/**\n * 路由权限拦截中间件\n */\n\nimport type {\n RouterMiddleware,\n RouterMiddlewareContext,\n RouterMiddlewareResult,\n} from './types';\nimport { logger } from '@vlian/logger';\n\n/**\n * 权限检查函数类型\n */\nexport type AuthCheckFunction = (context: RouterMiddlewareContext) => boolean | Promise<boolean>;\n\n/**\n * 权限拦截中间件配置\n */\nexport interface AuthMiddlewareConfig {\n /**\n * 权限检查函数\n * 返回 true 表示有权限,false 表示无权限\n */\n checkAuth: AuthCheckFunction;\n\n /**\n * 登录状态检查函数\n * 返回 true 表示已登录,false 表示未登录\n */\n checkLogin?: () => boolean | Promise<boolean>;\n\n /**\n * 角色检查函数\n * 返回 true 表示有权限,false 表示无权限\n */\n checkRole?: (roles: string[]) => boolean | Promise<boolean>;\n\n /**\n * 未登录时重定向路径\n * @default '/login'\n */\n loginRedirect?: string;\n\n /**\n * 无权限时重定向路径\n * @default '/403'\n */\n forbiddenRedirect?: string;\n\n /**\n * 中间件名称\n */\n name?: string;\n\n /**\n * 优先级\n * @default 10\n */\n priority?: number;\n}\n\n/**\n * 创建权限拦截中间件\n * \n * @param config - 权限拦截中间件配置\n * @returns 路由中间件函数\n */\nexport function createAuthMiddleware(\n config: AuthMiddlewareConfig\n): RouterMiddleware {\n const {\n checkAuth,\n checkLogin,\n checkRole,\n loginRedirect = '/login',\n forbiddenRedirect = '/403',\n } = config;\n\n return async (context: RouterMiddlewareContext): Promise<RouterMiddlewareResult> => {\n const { to } = context;\n\n // 检查路由是否需要登录\n const needLogin = to.meta?.needLogin || (to.meta as any)?.handle?.needLogin;\n\n if (needLogin) {\n // 检查登录状态\n if (checkLogin) {\n const isLoggedIn = await checkLogin();\n if (!isLoggedIn) {\n logger.debug(`路由权限拦截: 未登录,重定向到 ${loginRedirect}`);\n return {\n allow: false,\n redirect: loginRedirect,\n reason: '需要登录',\n };\n }\n }\n }\n\n // 检查路由角色权限\n const roles = to.meta?.roles || (to.meta as any)?.handle?.roles;\n if (roles && Array.isArray(roles) && roles.length > 0) {\n if (checkRole) {\n const hasRole = await checkRole(roles);\n if (!hasRole) {\n logger.debug(`路由权限拦截: 无权限,重定向到 ${forbiddenRedirect}`);\n return {\n allow: false,\n redirect: forbiddenRedirect,\n reason: '无权限访问',\n };\n }\n }\n }\n\n // 执行自定义权限检查\n if (checkAuth) {\n const hasAuth = await checkAuth(context);\n if (!hasAuth) {\n logger.debug(`路由权限拦截: 权限检查失败,重定向到 ${forbiddenRedirect}`);\n return {\n allow: false,\n redirect: forbiddenRedirect,\n reason: '权限检查失败',\n };\n }\n }\n\n // 权限检查通过\n return { allow: true };\n };\n}\n"],"names":["logger","createAuthMiddleware","config","checkAuth","checkLogin","checkRole","loginRedirect","forbiddenRedirect","context","to","needLogin","meta","handle","isLoggedIn","debug","allow","redirect","reason","roles","Array","isArray","length","hasRole","hasAuth"],"mappings":"AAAA;;CAEC,GAOD,SAASA,MAAM,QAAQ,gBAAgB;AAqDvC;;;;;CAKC,GACD,OAAO,SAASC,qBACdC,MAA4B;IAE5B,MAAM,EACJC,SAAS,EACTC,UAAU,EACVC,SAAS,EACTC,gBAAgB,QAAQ,EACxBC,oBAAoB,MAAM,EAC3B,GAAGL;IAEJ,OAAO,OAAOM;QACZ,MAAM,EAAEC,EAAE,EAAE,GAAGD;QAEf,aAAa;QACb,MAAME,YAAYD,GAAGE,IAAI,EAAED,aAAcD,GAAGE,IAAI,EAAUC,QAAQF;QAElE,IAAIA,WAAW;YACb,SAAS;YACT,IAAIN,YAAY;gBACd,MAAMS,aAAa,MAAMT;gBACzB,IAAI,CAACS,YAAY;oBACfb,OAAOc,KAAK,CAAC,CAAC,iBAAiB,EAAER,eAAe;oBAChD,OAAO;wBACLS,OAAO;wBACPC,UAAUV;wBACVW,QAAQ;oBACV;gBACF;YACF;QACF;QAEA,WAAW;QACX,MAAMC,QAAQT,GAAGE,IAAI,EAAEO,SAAUT,GAAGE,IAAI,EAAUC,QAAQM;QAC1D,IAAIA,SAASC,MAAMC,OAAO,CAACF,UAAUA,MAAMG,MAAM,GAAG,GAAG;YACrD,IAAIhB,WAAW;gBACb,MAAMiB,UAAU,MAAMjB,UAAUa;gBAChC,IAAI,CAACI,SAAS;oBACZtB,OAAOc,KAAK,CAAC,CAAC,iBAAiB,EAAEP,mBAAmB;oBACpD,OAAO;wBACLQ,OAAO;wBACPC,UAAUT;wBACVU,QAAQ;oBACV;gBACF;YACF;QACF;QAEA,YAAY;QACZ,IAAId,WAAW;YACb,MAAMoB,UAAU,MAAMpB,UAAUK;YAChC,IAAI,CAACe,SAAS;gBACZvB,OAAOc,KAAK,CAAC,CAAC,oBAAoB,EAAEP,mBAAmB;gBACvD,OAAO;oBACLQ,OAAO;oBACPC,UAAUT;oBACVU,QAAQ;gBACV;YACF;QACF;QAEA,SAAS;QACT,OAAO;YAAEF,OAAO;QAAK;IACvB;AACF"}
|
|
@@ -20,7 +20,7 @@ _export(exports, {
|
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
22
|
const _monitoring = require("@vlian/monitoring");
|
|
23
|
-
const _logger = require("
|
|
23
|
+
const _logger = require("@vlian/logger");
|
|
24
24
|
function _define_property(obj, key, value) {
|
|
25
25
|
if (key in obj) {
|
|
26
26
|
Object.defineProperty(obj, key, {
|