{"version":3,"file":"routeMetadata.mjs","sources":["../../../src/lib/auth/routeMetadata.ts"],"sourcesContent":["import type { RoutePath } from '@/lib/routing/routes';\nimport type { RouteAuthConfig, Role, Permission } from './types';\n\n/**\n * Mapping of routes to required roles/permissions.\n */\nexport const routeMetadata: Partial<Record<RoutePath, RouteAuthConfig>> = {\n  // Public routes\n  '/': {\n    requireAuth: false,\n  },\n  '/login': {\n    requireAuth: false,\n  },\n  '/register': {\n    requireAuth: false,\n  },\n  '/forgot-password': {\n    requireAuth: false,\n  },\n\n  // Protected routes - any authenticated user\n  '/dashboard': {\n    requireAuth: true,\n  },\n  '/dashboard/overview': {\n    requireAuth: true,\n  },\n  '/dashboard/settings': {\n    requireAuth: true,\n  },\n\n  // Protected routes - specific roles\n  '/dashboard/analytics': {\n    requireAuth: true,\n    allowedRoles: ['admin', 'manager'],\n  },\n\n  // Reports\n  '/reports': {\n    requireAuth: true,\n    requiredPermissions: ['view:reports'],\n  },\n  '/reports/list': {\n    requireAuth: true,\n    requiredPermissions: ['view:reports'],\n  },\n  '/reports/create': {\n    requireAuth: true,\n    requiredPermissions: ['create:reports'],\n  },\n\n  // Users\n  '/users': {\n    requireAuth: true,\n    requiredPermissions: ['view:users'],\n  },\n  '/users/list': {\n    requireAuth: true,\n    requiredPermissions: ['view:users'],\n  },\n  '/users/create': {\n    requireAuth: true,\n    requiredPermissions: ['create:users'],\n  },\n  '/users/profile': {\n    requireAuth: true,\n  },\n\n  // Settings\n  '/settings': {\n    requireAuth: true,\n  },\n  '/settings/general': {\n    requireAuth: true,\n  },\n  '/settings/notifications': {\n    requireAuth: true,\n  },\n  '/settings/security': {\n    requireAuth: true,\n  },\n\n  // Admin routes\n  '/admin': {\n    requireAuth: true,\n    minRole: 'admin',\n    requiredPermissions: ['admin:access'],\n    redirectTo: '/dashboard',\n  },\n  '/admin/users': {\n    requireAuth: true,\n    minRole: 'admin',\n    requiredPermissions: ['admin:access'],\n  },\n  '/admin/roles': {\n    requireAuth: true,\n    minRole: 'admin',\n    requiredPermissions: ['admin:access'],\n  },\n  '/admin/logs': {\n    requireAuth: true,\n    minRole: 'admin',\n    requiredPermissions: ['admin:access'],\n  },\n};\n\n/**\n * Get the auth configuration for a route\n */\nexport function getRouteAuthConfig(path: string): RouteAuthConfig {\n  // Try exact match first\n  const exactMatch = routeMetadata[path as RoutePath];\n  if (exactMatch !== undefined && exactMatch !== null) return exactMatch;\n\n  // Try to find a matching pattern\n  for (const [routePath, config] of Object.entries(routeMetadata)) {\n    if (matchRoutePath(path, routePath)) {\n      return config;\n    }\n  }\n\n  // Default to requiring auth\n  return { requireAuth: true };\n}\n\n/**\n * Match a path against a route pattern\n */\nfunction matchRoutePath(path: string, pattern: string): boolean {\n  const pathParts = path.split('/').filter(Boolean);\n  const patternParts = pattern.split('/').filter(Boolean);\n\n  if (pathParts.length !== patternParts.length) {\n    // Check if pattern could be a prefix\n    if (patternParts.length < pathParts.length) {\n      return patternParts.every((part, i) => {\n        if (part.startsWith(':')) return true;\n        return part === pathParts[i];\n      });\n    }\n    return false;\n  }\n\n  return patternParts.every((part, i) => {\n    if (part.startsWith(':')) return true;\n    return part === pathParts[i];\n  });\n}\n\n/**\n * Check if a user can access a route\n */\nexport function canAccessRoute(\n  routeConfig: RouteAuthConfig,\n  user: { roles: Role[]; permissions: Permission[] } | null\n): boolean {\n  // Route doesn't require auth\n  if (!routeConfig.requireAuth) return true;\n\n  // No user, can't access protected routes\n  if (user === undefined || user === null) return false;\n\n  // Check minimum role\n  if (routeConfig.minRole !== undefined && routeConfig.minRole !== null) {\n    const roleHierarchy: Role[] = ['guest', 'user', 'manager', 'admin'];\n    const minRoleIndex = roleHierarchy.indexOf(routeConfig.minRole);\n    const hasMinRole = user.roles.some((role) => roleHierarchy.indexOf(role) >= minRoleIndex);\n    if (!hasMinRole) return false;\n  }\n\n  // Check allowed roles\n  if (\n    routeConfig.allowedRoles !== undefined &&\n    routeConfig.allowedRoles !== null &&\n    routeConfig.allowedRoles.length > 0\n  ) {\n    const hasAllowedRole = routeConfig.allowedRoles.some((role) => user.roles.includes(role));\n    if (!hasAllowedRole) return false;\n  }\n\n  // Check required permissions\n  if (\n    routeConfig.requiredPermissions !== undefined &&\n    routeConfig.requiredPermissions !== null &&\n    routeConfig.requiredPermissions.length > 0\n  ) {\n    const hasAllPermissions = routeConfig.requiredPermissions.every((perm) =>\n      user.permissions.includes(perm)\n    );\n    if (!hasAllPermissions) return false;\n  }\n\n  return true;\n}\n"],"names":["routeMetadata","getRouteAuthConfig","path","exactMatch","routePath","config","matchRoutePath","pattern","pathParts","patternParts","part","i","canAccessRoute","routeConfig","user","roleHierarchy","minRoleIndex","role","perm"],"mappings":"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"}