{"version":3,"file":"route-groups.mjs","sources":["../../../../src/lib/routing/advanced/route-groups.ts"],"sourcesContent":["/**\n * @file Route Groups Support\n * @description Implements route grouping patterns for logical organization without URL impact.\n * Enables organizing routes by feature, access level, or any other logical boundary.\n *\n * @module @/lib/routing/advanced/route-groups\n *\n * This module provides:\n * - Route group definitions\n * - Group-based layout sharing\n * - Group metadata propagation\n * - Access control groups\n * - Feature-based grouping\n *\n * @example\n * ```typescript\n * import { RouteGroupManager, createRouteGroup } from '@/lib/routing/advanced/route-groups';\n *\n * const authGroup = createRouteGroup({\n *   name: 'auth',\n *   layout: AuthLayout,\n *   guards: [authGuard],\n *   meta: { requiresAuth: true },\n * });\n *\n * const manager = new RouteGroupManager();\n * manager.registerGroup(authGroup);\n * ```\n */\n\nimport type { ComponentType, ReactNode } from 'react';\nimport { splitPath } from '../core/path-utils';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Route group configuration\n */\nexport interface RouteGroupConfig {\n  /** Unique group name (used in file system as (name)) */\n  readonly name: string;\n  /** Display name for UI/debugging */\n  readonly displayName?: string;\n  /** Group description */\n  readonly description?: string;\n  /** Layout component for all routes in group */\n  readonly layout?: ComponentType<{ children: ReactNode }>;\n  /** Guards applied to all routes in group */\n  readonly guards?: readonly RouteGroupGuard[];\n  /** Middleware applied to all routes in group */\n  readonly middleware?: readonly RouteGroupMiddleware[];\n  /** Metadata inherited by all routes in group */\n  readonly meta?: RouteGroupMeta;\n  /** Parent group (for nested groups) */\n  readonly parent?: string;\n  /** Child groups */\n  readonly children?: readonly string[];\n  /** Feature flag for this group */\n  readonly featureFlag?: string;\n  /** Whether group is enabled */\n  readonly enabled?: boolean;\n}\n\n/**\n * Route group guard function\n */\nexport type RouteGroupGuard = (context: RouteGroupContext) => boolean | Promise<boolean>;\n\n/**\n * Route group middleware function\n */\nexport type RouteGroupMiddleware = (\n  context: RouteGroupContext,\n  next: () => void | Promise<void>\n) => void | Promise<void>;\n\n/**\n * Context passed to group guards and middleware\n */\nexport interface RouteGroupContext {\n  /** Current group */\n  readonly group: RouteGroup;\n  /** Current route path */\n  readonly path: string;\n  /** Route parameters */\n  readonly params: Record<string, string>;\n  /** Query parameters */\n  readonly query: Record<string, string>;\n  /** User context (if available) */\n  readonly user?: RouteGroupUser;\n  /** Feature flags */\n  readonly features?: Record<string, boolean>;\n}\n\n/**\n * User context for group access control\n */\nexport interface RouteGroupUser {\n  /** User ID */\n  readonly id: string;\n  /** User roles */\n  readonly roles: readonly string[];\n  /** User permissions */\n  readonly permissions: readonly string[];\n  /** Additional user data */\n  readonly data?: Record<string, unknown>;\n}\n\n/**\n * Route group metadata\n */\nexport interface RouteGroupMeta {\n  /** Whether routes require authentication */\n  readonly requiresAuth?: boolean;\n  /** Required roles for access */\n  readonly roles?: readonly string[];\n  /** Required permissions for access */\n  readonly permissions?: readonly string[];\n  /** Analytics category */\n  readonly analyticsCategory?: string;\n  /** SEO configuration */\n  readonly seo?: RouteGroupSEO;\n  /** Custom metadata */\n  readonly custom?: Record<string, unknown>;\n}\n\n/**\n * SEO configuration for route group\n */\nexport interface RouteGroupSEO {\n  /** Title template (can include {route} placeholder) */\n  readonly titleTemplate?: string;\n  /** Default description */\n  readonly description?: string;\n  /** robots directive */\n  readonly robots?: string;\n}\n\n/**\n * Registered route group\n */\nexport interface RouteGroup extends RouteGroupConfig {\n  /** Full path to this group (including parents) */\n  readonly fullPath: string;\n  /** Computed guards (including inherited) */\n  readonly computedGuards: readonly RouteGroupGuard[];\n  /** Computed middleware (including inherited) */\n  readonly computedMiddleware: readonly RouteGroupMiddleware[];\n  /** Computed metadata (including inherited) */\n  readonly computedMeta: RouteGroupMeta;\n  /** Registration timestamp */\n  readonly registeredAt: number;\n}\n\n/**\n * Route assignment to group\n */\nexport interface GroupedRoute {\n  /** Route path */\n  readonly path: string;\n  /** Group this route belongs to */\n  readonly group: string;\n  /** Route-specific metadata (merged with group meta) */\n  readonly meta?: RouteGroupMeta;\n  /** Route-specific guards (added to group guards) */\n  readonly guards?: readonly RouteGroupGuard[];\n}\n\n/**\n * Group resolution result\n */\nexport interface GroupResolution {\n  /** Resolved group chain (from root to leaf) */\n  readonly groups: readonly RouteGroup[];\n  /** Combined guards */\n  readonly guards: readonly RouteGroupGuard[];\n  /** Combined middleware */\n  readonly middleware: readonly RouteGroupMiddleware[];\n  /** Combined metadata */\n  readonly meta: RouteGroupMeta;\n  /** Layout components (outer to inner) */\n  readonly layouts: readonly ComponentType<{ children: ReactNode }>[];\n}\n\n// =============================================================================\n// RouteGroupManager Class\n// =============================================================================\n\n/**\n * Manages route group registration and resolution\n *\n * @example\n * ```typescript\n * const manager = new RouteGroupManager();\n *\n * // Register groups\n * manager.registerGroup(createRouteGroup({ name: 'marketing' }));\n * manager.registerGroup(createRouteGroup({ name: 'dashboard', parent: 'auth' }));\n *\n * // Resolve groups for a route\n * const resolution = manager.resolveGroups('/dashboard/settings');\n * ```\n */\nexport class RouteGroupManager {\n  private groups: Map<string, RouteGroup> = new Map();\n  private routeAssignments: Map<string, GroupedRoute> = new Map();\n\n  /**\n   * Register a route group\n   *\n   * @param config - Group configuration\n   * @returns Registered group\n   */\n  registerGroup(config: RouteGroupConfig): RouteGroup {\n    // Compute full path\n    let fullPath = `(${config.name})`;\n    if (config.parent !== null && config.parent !== undefined && config.parent !== '') {\n      const parent = this.groups.get(config.parent);\n      if (parent) {\n        fullPath = `${parent.fullPath}/(${config.name})`;\n      }\n    }\n\n    // Compute inherited guards, middleware, and meta\n    const { guards, middleware, meta } = this.computeInheritedProperties(config);\n\n    const group: RouteGroup = {\n      ...config,\n      fullPath,\n      computedGuards: guards,\n      computedMiddleware: middleware,\n      computedMeta: meta,\n      registeredAt: Date.now(),\n      enabled: config.enabled ?? true,\n    };\n\n    this.groups.set(config.name, group);\n\n    // Update parent's children\n    if (config.parent != null && config.parent !== '') {\n      const parent = this.groups.get(config.parent);\n      if (parent) {\n        const updatedParent: RouteGroup = {\n          ...parent,\n          children: [...(parent.children ?? []), config.name],\n        };\n        this.groups.set(config.parent, updatedParent);\n      }\n    }\n\n    return group;\n  }\n\n  /**\n   * Unregister a route group\n   *\n   * @param name - Group name\n   * @returns True if group was found and removed\n   */\n  unregisterGroup(name: string): boolean {\n    const group = this.groups.get(name);\n    if (!group) return false;\n\n    // Remove children recursively\n    for (const childName of group.children ?? []) {\n      this.unregisterGroup(childName);\n    }\n\n    // Remove from parent's children\n    if (group.parent !== undefined && group.parent !== null && group.parent !== '') {\n      const parent = this.groups.get(group.parent);\n      if (parent) {\n        const updatedParent: RouteGroup = {\n          ...parent,\n          children: parent.children?.filter(c => c !== name) ?? [],\n        };\n        this.groups.set(group.parent, updatedParent);\n      }\n    }\n\n    // Remove route assignments\n    for (const [path, assignment] of this.routeAssignments) {\n      if (assignment.group === name) {\n        this.routeAssignments.delete(path);\n      }\n    }\n\n    return this.groups.delete(name);\n  }\n\n  /**\n   * Assign a route to a group\n   *\n   * @param route - Grouped route configuration\n   */\n  assignRoute(route: GroupedRoute): void {\n    this.routeAssignments.set(route.path, route);\n  }\n\n  /**\n   * Remove route assignment\n   *\n   * @param path - Route path\n   * @returns True if assignment was found and removed\n   */\n  unassignRoute(path: string): boolean {\n    return this.routeAssignments.delete(path);\n  }\n\n  /**\n   * Get group for a route\n   *\n   * @param path - Route path\n   * @returns Group name or null\n   */\n  getRouteGroup(path: string): string | null {\n    const assignment = this.routeAssignments.get(path);\n    return assignment?.group ?? null;\n  }\n\n  /**\n   * Get a registered group\n   *\n   * @param name - Group name\n   * @returns Group or undefined\n   */\n  getGroup(name: string): RouteGroup | undefined {\n    return this.groups.get(name);\n  }\n\n  /**\n   * Get all registered groups\n   */\n  getAllGroups(): readonly RouteGroup[] {\n    return Array.from(this.groups.values());\n  }\n\n  /**\n   * Resolve groups for a route path\n   *\n   * @param path - Route path\n   * @returns Group resolution result\n   */\n  resolveGroups(path: string): GroupResolution {\n    const assignment = this.routeAssignments.get(path);\n\n    if (!assignment) {\n      return {\n        groups: [],\n        guards: [],\n        middleware: [],\n        meta: {},\n        layouts: [],\n      };\n    }\n\n    const group = this.groups.get(assignment.group);\n    if (!group) {\n      return {\n        groups: [],\n        guards: [],\n        middleware: [],\n        meta: {},\n        layouts: [],\n      };\n    }\n\n    // Build group chain\n    const groupChain = [...this.getParentChain(group.parent), group];\n\n    // Collect layouts\n    const layouts: ComponentType<{ children: ReactNode }>[] = [];\n    for (const g of groupChain) {\n      if (g.layout) {\n        layouts.push(g.layout);\n      }\n    }\n\n    // Merge route-specific guards and meta\n    const allGuards = [\n      ...group.computedGuards,\n      ...(assignment.guards ?? []),\n    ];\n\n    const allMeta = this.mergeMeta(group.computedMeta, assignment.meta ?? {});\n\n    return {\n      groups: groupChain,\n      guards: allGuards,\n      middleware: group.computedMiddleware,\n      meta: allMeta,\n      layouts,\n    };\n  }\n\n  /**\n   * Check if a user can access routes in a group\n   *\n   * @param groupName - Group name\n   * @param user - User context\n   * @returns True if user can access\n   */\n  canAccess(groupName: string, user: RouteGroupUser | undefined): boolean {\n    const group = this.groups.get(groupName);\n    if (group?.enabled !== true) return false;\n\n    const meta = group.computedMeta;\n\n    // Check auth requirement\n    if (meta.requiresAuth === true && (user === undefined || user === null)) {\n      return false;\n    }\n\n    // Check roles\n    if (meta.roles && meta.roles.length > 0) {\n      if (!user || !meta.roles.some(role => user.roles.includes(role))) {\n        return false;\n      }\n    }\n\n    // Check permissions\n    if (meta.permissions && meta.permissions.length > 0) {\n      if (!user || !meta.permissions.some(perm => user.permissions.includes(perm))) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  /**\n   * Run guards for a group\n   *\n   * @param groupName - Group name\n   * @param context - Guard context\n   * @returns True if all guards pass\n   */\n  async runGuards(groupName: string, context: Omit<RouteGroupContext, 'group'>): Promise<boolean> {\n    const group = this.groups.get(groupName);\n    if (!group) return false;\n\n    const fullContext: RouteGroupContext = {\n      ...context,\n      group,\n    };\n\n    for (const guard of group.computedGuards) {\n      const result = await guard(fullContext);\n      if (!result) return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Run middleware chain for a group\n   *\n   * @param groupName - Group name\n   * @param context - Middleware context\n   * @returns Promise that resolves when chain completes\n   */\n  async runMiddleware(\n    groupName: string,\n    context: Omit<RouteGroupContext, 'group'>\n  ): Promise<void> {\n    const group = this.groups.get(groupName);\n    if (!group) return;\n\n    const fullContext: RouteGroupContext = {\n      ...context,\n      group,\n    };\n\n    const middleware = [...group.computedMiddleware];\n\n    let index = 0;\n    const runNext = async (): Promise<void> => {\n      if (index < middleware.length) {\n        const currentMiddleware = middleware[index++];\n        await currentMiddleware?.(fullContext, runNext);\n      }\n    };\n\n    await runNext();\n  }\n\n  /**\n   * Get all routes in a group\n   *\n   * @param groupName - Group name\n   * @param includeChildren - Include routes in child groups\n   * @returns Array of route paths\n   */\n  getRoutesInGroup(groupName: string, includeChildren = true): string[] {\n    const routes: string[] = [];\n    const groups = includeChildren\n      ? this.getGroupWithDescendants(groupName)\n      : [groupName];\n\n    for (const [path, assignment] of this.routeAssignments) {\n      if (groups.includes(assignment.group)) {\n        routes.push(path);\n      }\n    }\n\n    return routes;\n  }\n\n  /**\n   * Clear all groups and assignments\n   */\n  clearAll(): void {\n    this.groups.clear();\n    this.routeAssignments.clear();\n  }\n\n  /**\n   * Compute inherited properties from parent groups\n   */\n  private computeInheritedProperties(config: RouteGroupConfig): {\n    guards: readonly RouteGroupGuard[];\n    middleware: readonly RouteGroupMiddleware[];\n    meta: RouteGroupMeta;\n  } {\n    const guards: RouteGroupGuard[] = [];\n    const middleware: RouteGroupMiddleware[] = [];\n    let meta: RouteGroupMeta = {};\n\n    // Walk up the parent chain\n    const parentChain = this.getParentChain(config.parent);\n\n    for (const parent of parentChain) {\n      guards.push(...(parent.guards ?? []));\n      middleware.push(...(parent.middleware ?? []));\n      meta = this.mergeMeta(meta, parent.meta ?? {});\n    }\n\n    // Add own guards, middleware, and meta\n    guards.push(...(config.guards ?? []));\n    middleware.push(...(config.middleware ?? []));\n    meta = this.mergeMeta(meta, config.meta ?? {});\n\n    return { guards, middleware, meta };\n  }\n\n  /**\n   * Get parent group chain (from root to immediate parent)\n   */\n  private getParentChain(parentName: string | undefined): RouteGroup[] {\n    const chain: RouteGroup[] = [];\n    let current = parentName;\n\n    while (current != null && current !== '') {\n      const group = this.groups.get(current);\n      if (!group) break;\n      chain.unshift(group); // Add to beginning\n      current = group.parent;\n    }\n\n    return chain;\n  }\n\n  /**\n   * Merge metadata objects\n   */\n  private mergeMeta(base: RouteGroupMeta, override: RouteGroupMeta): RouteGroupMeta {\n    return {\n      ...base,\n      ...override,\n      roles: [...(base.roles ?? []), ...(override.roles ?? [])],\n      permissions: [...(base.permissions ?? []), ...(override.permissions ?? [])],\n      seo: { ...base.seo, ...override.seo },\n      custom: { ...base.custom, ...override.custom },\n    };\n  }\n\n  /**\n   * Get group and all its descendants\n   */\n  private getGroupWithDescendants(groupName: string): string[] {\n    const result: string[] = [groupName];\n    const group = this.groups.get(groupName);\n\n    if (group?.children) {\n      for (const childName of group.children) {\n        result.push(...this.getGroupWithDescendants(childName));\n      }\n    }\n\n    return result;\n  }\n}\n\n// =============================================================================\n// Factory Functions\n// =============================================================================\n\n/**\n * Create a route group configuration\n *\n * @param config - Group configuration\n * @returns Validated configuration\n */\nexport function createRouteGroup(config: RouteGroupConfig): RouteGroupConfig {\n  return {\n    ...config,\n    enabled: config.enabled ?? true,\n    guards: config.guards ?? [],\n    middleware: config.middleware ?? [],\n    meta: config.meta ?? {},\n    children: config.children ?? [],\n  };\n}\n\n/**\n * Create a grouped route assignment\n *\n * @param path - Route path\n * @param group - Group name\n * @param options - Additional options\n * @returns Grouped route configuration\n */\nexport function createGroupedRoute(\n  path: string,\n  group: string,\n  options: Partial<Omit<GroupedRoute, 'path' | 'group'>> = {}\n): GroupedRoute {\n  return {\n    path,\n    group,\n    ...options,\n  };\n}\n\n// =============================================================================\n// Singleton Instance\n// =============================================================================\n\nlet defaultManager: RouteGroupManager | null = null;\n\n/**\n * Get the default route group manager\n */\nexport function getRouteGroupManager(): RouteGroupManager {\n  defaultManager ??= new RouteGroupManager();\n  return defaultManager;\n}\n\n/**\n * Reset the default route group manager\n */\nexport function resetRouteGroupManager(): void {\n  defaultManager?.clearAll();\n  defaultManager = null;\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Check if a path segment is a group marker\n *\n * @param segment - Path segment\n * @returns True if segment is a group marker\n */\nexport function isGroupSegment(segment: string): boolean {\n  return /^\\([a-zA-Z][a-zA-Z0-9_-]*\\)$/.test(segment);\n}\n\n/**\n * Extract group name from segment\n *\n * @param segment - Group segment (e.g., '(auth)')\n * @returns Group name (e.g., 'auth')\n */\nexport function extractGroupName(segment: string): string | null {\n  const match = segment.match(/^\\(([a-zA-Z][a-zA-Z0-9_-]*)\\)$/);\n  return match?.[1] ?? null;\n}\n\n/**\n * Create a group segment from name\n *\n * @param name - Group name\n * @returns Group segment (e.g., '(auth)')\n */\nexport function createGroupSegment(name: string): string {\n  return `(${name})`;\n}\n\n/**\n * Extract all groups from a path\n *\n * @param path - File path with group markers\n * @returns Array of group names\n */\nexport function extractGroupsFromPath(path: string): string[] {\n  const segments = splitPath(path);\n  const groups: string[] = [];\n\n  for (const segment of segments) {\n    const groupName = extractGroupName(segment);\n    if (groupName !== null && groupName !== undefined) {\n      groups.push(groupName);\n    }\n  }\n\n  return groups;\n}\n\n/**\n * Remove group segments from a path\n *\n * @param path - Path with group markers\n * @returns Clean URL path\n */\nexport function stripGroupsFromPath(path: string): string {\n  const segments = splitPath(path);\n  const cleanSegments = segments.filter(s => !isGroupSegment(s));\n  return `/${  cleanSegments.join('/')}`;\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Type guard for RouteGroup\n */\nexport function isRouteGroup(value: unknown): value is RouteGroup {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    'name' in value &&\n    'fullPath' in value &&\n    'computedGuards' in value\n  );\n}\n\n/**\n * Type guard for GroupedRoute\n */\nexport function isGroupedRoute(value: unknown): value is GroupedRoute {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    'path' in value &&\n    'group' in value\n  );\n}\n"],"names":["RouteGroupManager","config","fullPath","parent","guards","middleware","meta","group","updatedParent","name","childName","c","path","assignment","route","groupChain","layouts","g","allGuards","allMeta","groupName","user","role","perm","context","fullContext","guard","index","runNext","currentMiddleware","includeChildren","routes","groups","parentChain","parentName","chain","current","base","override","result","createRouteGroup","defaultManager","getRouteGroupManager","resetRouteGroupManager"],"mappings":"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"}