15 changed files with 256 additions and 92 deletions
@ -1,24 +1,28 @@ |
|||
import { mergeRouteModules } from '@vben-core/helpers'; |
|||
import type { RouteRecordRaw } from 'vue-router'; |
|||
|
|||
import { essentialRoutes } from './_essential'; |
|||
import { nestedRoutes } from './modules/nested'; |
|||
import { outsideRoutes } from './modules/outside'; |
|||
import { rootRoutes } from './modules/root'; |
|||
import { vbenRoutes } from './modules/vben'; |
|||
|
|||
const dynamicRouteFiles = import.meta.glob('./dynamic/**/*.ts', { |
|||
eager: true, |
|||
}); |
|||
|
|||
const staticRouteFiles = import.meta.glob('./static/**/*.ts', { eager: true }); |
|||
|
|||
const externalRouteFiles = import.meta.glob('./external/**/*.ts', { |
|||
eager: true, |
|||
}); |
|||
|
|||
/** 动态路由 */ |
|||
const dynamicRoutes: RouteRecordRaw[] = [ |
|||
// 根路由
|
|||
...rootRoutes, |
|||
...nestedRoutes, |
|||
...outsideRoutes, |
|||
...vbenRoutes, |
|||
]; |
|||
const dynamicRoutes: RouteRecordRaw[] = mergeRouteModules(dynamicRouteFiles); |
|||
|
|||
/** 静态路由列表,访问这些页面可以不需要权限 */ |
|||
const staticRoutes: RouteRecordRaw[] = mergeRouteModules(staticRouteFiles); |
|||
|
|||
/** 排除在主框架外的路由,这些路由没有菜单和顶部及其他框架内容 */ |
|||
const externalRoutes: RouteRecordRaw[] = []; |
|||
const externalRoutes: RouteRecordRaw[] = mergeRouteModules(externalRouteFiles); |
|||
|
|||
/** 静态路由列表,访问这些页面可以不需要权限 */ |
|||
const staticRoutes: RouteRecordRaw[] = [...essentialRoutes]; |
|||
/** 路由列表,由基本路由+静态路由组成 */ |
|||
const routes: RouteRecordRaw[] = [...essentialRoutes, ...staticRoutes]; |
|||
|
|||
export { dynamicRoutes, externalRoutes, staticRoutes }; |
|||
export { dynamicRoutes, externalRoutes, routes }; |
|||
|
|||
@ -1,4 +1,5 @@ |
|||
export * from './flatten-object'; |
|||
export * from './generator-menus'; |
|||
export * from './generator-routes'; |
|||
export * from './merge-route-modules'; |
|||
export * from './nested-object'; |
|||
|
|||
@ -0,0 +1,68 @@ |
|||
import type { RouteRecordRaw } from 'vue-router'; |
|||
|
|||
import { describe, expect, it } from 'vitest'; |
|||
|
|||
import { mergeRouteModules } from './merge-route-modules'; |
|||
|
|||
import type { RouteModuleType } from './merge-route-modules'; |
|||
|
|||
describe('mergeRouteModules', () => { |
|||
it('should merge route modules correctly', () => { |
|||
const routeModules: Record<string, RouteModuleType> = { |
|||
'./dynamic-routes/about.ts': { |
|||
default: [ |
|||
{ |
|||
component: () => Promise.resolve({ template: '<div>About</div>' }), |
|||
name: 'About', |
|||
path: '/about', |
|||
}, |
|||
], |
|||
}, |
|||
'./dynamic-routes/home.ts': { |
|||
default: [ |
|||
{ |
|||
component: () => Promise.resolve({ template: '<div>Home</div>' }), |
|||
name: 'Home', |
|||
path: '/', |
|||
}, |
|||
], |
|||
}, |
|||
}; |
|||
|
|||
const expectedRoutes: RouteRecordRaw[] = [ |
|||
{ |
|||
component: expect.any(Function), |
|||
name: 'About', |
|||
path: '/about', |
|||
}, |
|||
{ |
|||
component: expect.any(Function), |
|||
name: 'Home', |
|||
path: '/', |
|||
}, |
|||
]; |
|||
|
|||
const mergedRoutes = mergeRouteModules(routeModules); |
|||
expect(mergedRoutes).toEqual(expectedRoutes); |
|||
}); |
|||
|
|||
it('should handle empty modules', () => { |
|||
const routeModules: Record<string, RouteModuleType> = {}; |
|||
const expectedRoutes: RouteRecordRaw[] = []; |
|||
|
|||
const mergedRoutes = mergeRouteModules(routeModules); |
|||
expect(mergedRoutes).toEqual(expectedRoutes); |
|||
}); |
|||
|
|||
it('should handle modules with no default export', () => { |
|||
const routeModules: Record<string, RouteModuleType> = { |
|||
'./dynamic-routes/empty.ts': { |
|||
default: [], |
|||
}, |
|||
}; |
|||
const expectedRoutes: RouteRecordRaw[] = []; |
|||
|
|||
const mergedRoutes = mergeRouteModules(routeModules); |
|||
expect(mergedRoutes).toEqual(expectedRoutes); |
|||
}); |
|||
}); |
|||
@ -0,0 +1,28 @@ |
|||
import type { RouteRecordRaw } from 'vue-router'; |
|||
|
|||
// 定义模块类型
|
|||
interface RouteModuleType { |
|||
default: RouteRecordRaw[]; |
|||
} |
|||
|
|||
/** |
|||
* 合并动态路由模块的默认导出 |
|||
* @param routeModules 动态导入的路由模块对象 |
|||
* @returns 合并后的路由配置数组 |
|||
*/ |
|||
function mergeRouteModules( |
|||
routeModules: Record<string, unknown>, |
|||
): RouteRecordRaw[] { |
|||
const mergedRoutes: RouteRecordRaw[] = []; |
|||
|
|||
for (const routeModule of Object.values(routeModules)) { |
|||
const moduleRoutes = (routeModule as RouteModuleType)?.default ?? []; |
|||
mergedRoutes.push(...moduleRoutes); |
|||
} |
|||
|
|||
return mergedRoutes; |
|||
} |
|||
|
|||
export { mergeRouteModules }; |
|||
|
|||
export type { RouteModuleType }; |
|||
Loading…
Reference in new issue