import type { RouteLocationNormalizedLoaded, RouteLocationResolved } from 'vue-router' import type { WorkspaceTabCandidate } from './types' type WorkspaceRoute = RouteLocationNormalizedLoaded | RouteLocationResolved export function workspaceRouteId(route: WorkspaceRoute) { return route.name === undefined || route.name === null ? null : String(route.name) } export function isWorkspaceRoute(route: WorkspaceRoute) { return Boolean( workspaceRouteId(route) && route.meta.workspaceTab !== false && route.matched.some((record) => record.meta.requiresAuth), ) } export function canAccessWorkspaceRoute(route: WorkspaceRoute, permissions: ReadonlySet) { if (!isWorkspaceRoute(route)) return false const permission = typeof route.meta.permission === 'string' ? route.meta.permission : undefined const alternatives = route.meta.permissionAnyOf ?? [] if (!permission && alternatives.length === 0) return true return Boolean( (permission && permissions.has(permission)) || alternatives.some((code) => permissions.has(code)), ) } export function workspaceTabCandidate(route: WorkspaceRoute): WorkspaceTabCandidate | null { const id = workspaceRouteId(route) if (!id || !isWorkspaceRoute(route)) return null return { id, title: typeof route.meta.title === 'string' && route.meta.title.trim() ? route.meta.title.trim() : '未命名页面', path: route.fullPath, } }