{"version":3,"file":"permission-guard.mjs","sources":["../../../../src/lib/routing/guards/permission-guard.ts"],"sourcesContent":["/**\n * @file Permission-Based Guard\n * @description Route guard for fine-grained permission-based access control.\n * Checks if the user has the required permissions to access a route.\n *\n * @module @/lib/routing/guards/permission-guard\n *\n * This module provides:\n * - Permission requirement definitions\n * - Resource-based permissions\n * - Action-based permissions\n * - Permission combination strategies\n * - Dynamic permission evaluation\n *\n * @example\n * ```typescript\n * import { createPermissionGuard, PermissionGuard } from '@/lib/routing/guards/permission-guard';\n *\n * const editGuard = createPermissionGuard({\n *   requiredPermissions: ['posts:edit'],\n *   matchStrategy: 'any',\n * });\n *\n * const adminGuard = createPermissionGuard({\n *   requiredPermissions: ['users:read', 'users:write', 'users:delete'],\n *   matchStrategy: 'all',\n * });\n * ```\n */\n\nimport {\n  BaseRouteGuard,\n  GuardResult,\n  type GuardContext,\n  type GuardResultObject,\n} from './route-guard';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Permission matching strategy\n */\nexport type PermissionMatchStrategy =\n  | 'any'   // User must have at least one permission\n  | 'all'   // User must have all permissions\n  | 'none'; // User must not have any permissions (blacklist)\n\n/**\n * Permission format: resource:action or custom format\n */\nexport type Permission = string;\n\n/**\n * Structured permission with resource and action\n */\nexport interface StructuredPermission {\n  /** Resource identifier (e.g., 'posts', 'users') */\n  readonly resource: string;\n  /** Action identifier (e.g., 'read', 'write', 'delete') */\n  readonly action: string;\n  /** Optional resource instance ID */\n  readonly resourceId?: string;\n}\n\n/**\n * Permission guard configuration\n */\nexport interface PermissionGuardConfig {\n  /** Guard name */\n  readonly name?: string;\n  /** Required permissions */\n  readonly requiredPermissions: readonly Permission[];\n  /** How to match permissions */\n  readonly matchStrategy?: PermissionMatchStrategy;\n  /** Path to redirect unauthorized users */\n  readonly unauthorizedPath?: string;\n  /** Custom unauthorized message */\n  readonly unauthorizedMessage?: string;\n  /** Get user permissions from context */\n  readonly getUserPermissions?: (context: GuardContext) => readonly Permission[];\n  /** Custom permission check function */\n  readonly checkPermission?: (\n    userPermissions: readonly Permission[],\n    required: Permission,\n    context: GuardContext\n  ) => boolean | Promise<boolean>;\n  /** Permission aliases (permission -> expanded permissions) */\n  readonly aliases?: Record<string, readonly Permission[]>;\n  /** Wildcard permission that grants all access */\n  readonly wildcardPermission?: Permission;\n  /** Separator for resource:action format */\n  readonly separator?: string;\n  /** Routes this guard applies to */\n  readonly routes?: readonly string[];\n  /** Routes to exclude */\n  readonly exclude?: readonly string[];\n  /** Guard priority */\n  readonly priority?: number;\n  /** Feature flag */\n  readonly featureFlag?: string;\n}\n\n/**\n * Permission check result\n */\nexport interface PermissionCheckResult {\n  /** Whether user has required permissions */\n  readonly hasAccess: boolean;\n  /** User's permissions */\n  readonly userPermissions: readonly Permission[];\n  /** Required permissions */\n  readonly requiredPermissions: readonly Permission[];\n  /** Missing permissions */\n  readonly missingPermissions: readonly Permission[];\n  /** Matched permissions */\n  readonly matchedPermissions: readonly Permission[];\n  /** Strategy used */\n  readonly strategy: PermissionMatchStrategy;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/**\n * Default permission guard configuration\n */\nexport const DEFAULT_PERMISSION_CONFIG: Partial<PermissionGuardConfig> = {\n  name: 'permission',\n  matchStrategy: 'any',\n  unauthorizedPath: '/forbidden',\n  unauthorizedMessage: 'You do not have permission to access this page',\n  separator: ':',\n  wildcardPermission: '*',\n  priority: 25,\n};\n\n/**\n * Common permission actions\n */\nexport const PermissionActions = {\n  READ: 'read',\n  WRITE: 'write',\n  CREATE: 'create',\n  UPDATE: 'update',\n  DELETE: 'delete',\n  MANAGE: 'manage',\n  ADMIN: 'admin',\n} as const;\n\n// =============================================================================\n// PermissionGuard Class\n// =============================================================================\n\n/**\n * Permission-based route guard\n *\n * @example\n * ```typescript\n * const guard = new PermissionGuard({\n *   requiredPermissions: ['posts:edit', 'posts:delete'],\n *   matchStrategy: 'any',\n *   aliases: {\n *     'posts:manage': ['posts:read', 'posts:write', 'posts:delete'],\n *   },\n * });\n *\n * const result = await guard.execute('canActivate', context);\n * ```\n */\nexport class PermissionGuard extends BaseRouteGuard {\n  private readonly permConfig: PermissionGuardConfig;\n\n  constructor(config: PermissionGuardConfig) {\n    const mergedConfig = { ...DEFAULT_PERMISSION_CONFIG, ...config };\n\n    super({\n      name: mergedConfig.name ?? 'permission',\n      description: `Permission guard - requires: ${config.requiredPermissions.join(', ')}`,\n      priority: mergedConfig.priority,\n      routes: mergedConfig.routes,\n      exclude: mergedConfig.exclude,\n      featureFlag: mergedConfig.featureFlag,\n      canActivate: async (context) => this.checkPermissionAccess(context),\n      canLoad: async (context) => this.checkPermissionAccess(context),\n    });\n\n    this.permConfig = mergedConfig;\n  }\n\n  /**\n   * Get required permissions\n   */\n  getRequiredPermissions(): readonly Permission[] {\n    return this.permConfig.requiredPermissions;\n  }\n\n  /**\n   * Get match strategy\n   */\n  getMatchStrategy(): PermissionMatchStrategy {\n    return this.permConfig.matchStrategy ?? 'any';\n  }\n\n  /**\n   * Check permissions without full guard execution\n   */\n  async checkPermissions(\n    userPermissions: readonly Permission[],\n    context: GuardContext\n  ): Promise<PermissionCheckResult> {\n    return this.performPermissionCheck(userPermissions, context);\n  }\n\n  /**\n   * Expand permissions with aliases\n   */\n  private expandPermissionsWithAliases(\n    permissions: readonly Permission[],\n    aliases: Record<string, readonly Permission[]>\n  ): ReadonlySet<Permission> {\n    const expanded = new Set<Permission>();\n\n    const expand = (perm: Permission, visited: Set<string>): void => {\n      if (visited.has(perm)) return;\n      visited.add(perm);\n\n      expanded.add(perm);\n\n      // Check if this permission is an alias\n      const aliasedPerms = aliases[perm];\n      if (aliasedPerms !== undefined && aliasedPerms !== null) {\n        for (const aliased of aliasedPerms) {\n          expand(aliased, visited);\n        }\n      }\n    };\n\n    for (const perm of permissions) {\n      expand(perm, new Set());\n    }\n\n    return expanded;\n  }\n\n  /**\n   * Check if user has required permission access\n   */\n  private async checkPermissionAccess(context: GuardContext): Promise<GuardResultObject> {\n    // Get user permissions\n    const userPermissions = this.getUserPermissions(context);\n\n    // Check if user has wildcard permission\n    const wildcard = this.permConfig.wildcardPermission;\n    if (wildcard !== undefined && wildcard !== null && userPermissions.includes(wildcard)) {\n      return GuardResult.allow({ hasWildcard: true });\n    }\n\n    // Check permission access\n    const checkResult = await this.performPermissionCheck(userPermissions, context);\n\n    if (!checkResult.hasAccess) {\n      return this.handleUnauthorized(context, checkResult);\n    }\n\n    return GuardResult.allow({ permissionCheck: checkResult });\n  }\n\n  /**\n   * Get user permissions from context\n   */\n  private getUserPermissions(context: GuardContext): readonly Permission[] {\n    if (this.permConfig.getUserPermissions !== undefined && this.permConfig.getUserPermissions !== null) {\n      return this.permConfig.getUserPermissions(context);\n    }\n\n    return context.user?.permissions ?? [];\n  }\n\n  /**\n   * Perform permission check based on strategy\n   */\n  private async performPermissionCheck(\n    userPermissions: readonly Permission[],\n    context: GuardContext\n  ): Promise<PermissionCheckResult> {\n    const strategy = this.permConfig.matchStrategy ?? 'any';\n    const {requiredPermissions} = this.permConfig;\n\n    // Expand user permissions with aliases\n    const expandedUserPerms = this.expandPermissionsWithAliases(\n      userPermissions,\n      this.permConfig.aliases ?? {}\n    );\n\n    const missingPermissions: Permission[] = [];\n    const matchedPermissions: Permission[] = [];\n\n    for (const required of requiredPermissions) {\n      const hasPermission = await this.checkSinglePermission(\n        expandedUserPerms,\n        required,\n        context\n      );\n\n      if (hasPermission) {\n        matchedPermissions.push(required);\n      } else {\n        missingPermissions.push(required);\n      }\n    }\n\n    let hasAccess = false;\n    switch (strategy) {\n      case 'any':\n        hasAccess = matchedPermissions.length > 0;\n        break;\n      case 'all':\n        hasAccess = missingPermissions.length === 0;\n        break;\n      case 'none':\n        hasAccess = matchedPermissions.length === 0;\n        break;\n    }\n\n    return {\n      hasAccess,\n      userPermissions,\n      requiredPermissions,\n      missingPermissions,\n      matchedPermissions,\n      strategy,\n    };\n  }\n\n  /**\n   * Check a single permission\n   */\n  private async checkSinglePermission(\n    userPerms: ReadonlySet<Permission>,\n    required: Permission,\n    context: GuardContext\n  ): Promise<boolean> {\n    // Use custom check if provided\n    if (this.permConfig.checkPermission !== undefined && this.permConfig.checkPermission !== null) {\n      return this.permConfig.checkPermission(\n        Array.from(userPerms),\n        required,\n        context\n      );\n    }\n\n    // Exact match\n    if (userPerms.has(required)) {\n      return true;\n    }\n\n    // Check for wildcard permissions (e.g., posts:* matches posts:read)\n    const separator = this.permConfig.separator ?? ':';\n    const [resource] = required.split(separator);\n    if (resource !== undefined && resource !== null && resource !== '' && userPerms.has(`${resource}${separator}*`)) {\n      return true;\n    }\n\n    // Check for resource-level wildcard\n    return userPerms.has(`*${separator}*`);\n\n\n  }\n\n  /**\n   * Handle unauthorized access\n   */\n  private handleUnauthorized(\n    _context: GuardContext,\n    checkResult: PermissionCheckResult\n  ): GuardResultObject {\n    const unauthorizedPath = this.permConfig.unauthorizedPath ?? '/forbidden';\n    const message = this.permConfig.unauthorizedMessage ??\n      'You do not have permission to access this page';\n\n    return GuardResult.redirect(unauthorizedPath, {\n      state: {\n        reason: message,\n        requiredPermissions: checkResult.requiredPermissions,\n        missingPermissions: checkResult.missingPermissions,\n        strategy: checkResult.strategy,\n      },\n    });\n  }\n}\n\n// =============================================================================\n// Factory Functions\n// =============================================================================\n\n/**\n * Create a permission guard\n *\n * @param config - Guard configuration\n * @returns PermissionGuard instance\n */\nexport function createPermissionGuard(config: PermissionGuardConfig): PermissionGuard {\n  return new PermissionGuard(config);\n}\n\n/**\n * Create a guard requiring a single permission\n *\n * @param permission - Required permission\n * @param options - Additional options\n * @returns PermissionGuard instance\n */\nexport function requirePermission(\n  permission: Permission,\n  options: Partial<Omit<PermissionGuardConfig, 'requiredPermissions'>> = {}\n): PermissionGuard {\n  return new PermissionGuard({\n    ...options,\n    requiredPermissions: [permission],\n    matchStrategy: 'any',\n  });\n}\n\n/**\n * Create a guard requiring any of the specified permissions\n *\n * @param permissions - Permissions (any one required)\n * @param options - Additional options\n * @returns PermissionGuard instance\n */\nexport function requireAnyPermission(\n  permissions: readonly Permission[],\n  options: Partial<Omit<PermissionGuardConfig, 'requiredPermissions' | 'matchStrategy'>> = {}\n): PermissionGuard {\n  return new PermissionGuard({\n    ...options,\n    requiredPermissions: permissions,\n    matchStrategy: 'any',\n  });\n}\n\n/**\n * Create a guard requiring all specified permissions\n *\n * @param permissions - Permissions (all required)\n * @param options - Additional options\n * @returns PermissionGuard instance\n */\nexport function requireAllPermissions(\n  permissions: readonly Permission[],\n  options: Partial<Omit<PermissionGuardConfig, 'requiredPermissions' | 'matchStrategy'>> = {}\n): PermissionGuard {\n  return new PermissionGuard({\n    ...options,\n    requiredPermissions: permissions,\n    matchStrategy: 'all',\n  });\n}\n\n/**\n * Create a resource-action permission guard\n *\n * @param resource - Resource name\n * @param action - Action name\n * @param options - Additional options\n * @returns PermissionGuard instance\n */\nexport function requireResourcePermission(\n  resource: string,\n  action: string,\n  options: Partial<Omit<PermissionGuardConfig, 'requiredPermissions'>> = {}\n): PermissionGuard {\n  const separator = options.separator ?? ':';\n  return new PermissionGuard({\n    ...options,\n    requiredPermissions: [`${resource}${separator}${action}`],\n    matchStrategy: 'any',\n  });\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Parse a permission string into structured format\n *\n * @param permission - Permission string (e.g., 'posts:edit')\n * @param separator - Separator character\n * @returns Structured permission\n */\nexport function parsePermission(\n  permission: Permission,\n  separator = ':'\n): StructuredPermission {\n  const parts = permission.split(separator);\n  return {\n    resource: parts[0] ?? '',\n    action: parts[1] ?? '',\n    resourceId: parts[2],\n  };\n}\n\n/**\n * Build a permission string from structured format\n *\n * @param structured - Structured permission\n * @param separator - Separator character\n * @returns Permission string\n */\nexport function buildPermission(\n  structured: StructuredPermission,\n  separator = ':'\n): Permission {\n  let perm = `${structured.resource}${separator}${structured.action}`;\n  if (structured.resourceId !== undefined && structured.resourceId !== null) {\n    perm += `${separator}${structured.resourceId}`;\n  }\n  return perm;\n}\n\n/**\n * Check if user has a specific permission\n *\n * @param userPermissions - User's permissions\n * @param permission - Permission to check\n * @param separator - Separator for wildcard matching\n * @returns True if user has permission\n */\nexport function hasPermission(\n  userPermissions: readonly Permission[],\n  permission: Permission,\n  separator = ':'\n): boolean {\n  // Exact match\n  if (userPermissions.includes(permission)) {\n    return true;\n  }\n\n  // Wildcard match\n  if (userPermissions.includes('*')) {\n    return true;\n  }\n\n  // Resource wildcard (e.g., posts:* matches posts:read)\n  const [resource] = permission.split(separator);\n  return resource !== undefined && resource !== null && resource !== '' && userPermissions.includes(`${resource}${separator}*`);\n\n\n}\n\n/**\n * Check if user has any of the specified permissions\n *\n * @param userPermissions - User's permissions\n * @param permissions - Permissions to check\n * @param separator - Separator for wildcard matching\n * @returns True if user has any permission\n */\nexport function hasAnyPermission(\n  userPermissions: readonly Permission[],\n  permissions: readonly Permission[],\n  separator = ':'\n): boolean {\n  return permissions.some(p => hasPermission(userPermissions, p, separator));\n}\n\n/**\n * Check if user has all specified permissions\n *\n * @param userPermissions - User's permissions\n * @param permissions - Permissions to check\n * @param separator - Separator for wildcard matching\n * @returns True if user has all permissions\n */\nexport function hasAllPermissions(\n  userPermissions: readonly Permission[],\n  permissions: readonly Permission[],\n  separator = ':'\n): boolean {\n  return permissions.every(p => hasPermission(userPermissions, p, separator));\n}\n\n/**\n * Get missing permissions for a user\n *\n * @param userPermissions - User's permissions\n * @param requiredPermissions - Required permissions\n * @param separator - Separator for wildcard matching\n * @returns Array of missing permissions\n */\nexport function getMissingPermissions(\n  userPermissions: readonly Permission[],\n  requiredPermissions: readonly Permission[],\n  separator = ':'\n): Permission[] {\n  return requiredPermissions.filter(p => !hasPermission(userPermissions, p, separator));\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Type guard for PermissionGuard\n */\nexport function isPermissionGuard(value: unknown): value is PermissionGuard {\n  return value instanceof PermissionGuard;\n}\n\n/**\n * Type guard for PermissionCheckResult\n */\nexport function isPermissionCheckResult(value: unknown): value is PermissionCheckResult {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    'hasAccess' in value &&\n    'userPermissions' in value &&\n    'requiredPermissions' in value &&\n    'strategy' in value\n  );\n}\n\n/**\n * Type guard for StructuredPermission\n */\nexport function isStructuredPermission(value: unknown): value is StructuredPermission {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    'resource' in value &&\n    'action' in value\n  );\n}\n"],"names":["DEFAULT_PERMISSION_CONFIG","PermissionActions","PermissionGuard","BaseRouteGuard","config","mergedConfig","context","userPermissions","permissions","aliases","expanded","expand","perm","visited","aliasedPerms","aliased","wildcard","GuardResult","checkResult","strategy","requiredPermissions","expandedUserPerms","missingPermissions","matchedPermissions","required","hasAccess","userPerms","separator","resource","_context","unauthorizedPath","message","createPermissionGuard","requirePermission","permission","options","requireAnyPermission","requireAllPermissions","requireResourcePermission","action","parsePermission","parts","buildPermission","structured","hasPermission","hasAnyPermission","p","hasAllPermissions","getMissingPermissions","isPermissionGuard","value","isPermissionCheckResult","isStructuredPermission"],"mappings":"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"}