{"version":3,"file":"permission-matrix.mjs","sources":["../../../../src/lib/auth/rbac/permission-matrix.ts"],"sourcesContent":["/**\n * Permission Matrix\n *\n * Defines and manages permission matrices for role-based access control.\n * Provides builders and utilities for creating complex permission structures.\n *\n * @module auth/rbac/permission-matrix\n */\n\nimport type {\n  PermissionMatrix,\n  PermissionMatrixEntry,\n  PermissionAction,\n  PermissionScope,\n  PermissionCondition,\n} from './types';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/**\n * All available permission actions.\n */\nexport const PERMISSION_ACTIONS: PermissionAction[] = [\n  'create',\n  'read',\n  'update',\n  'delete',\n  'list',\n  'execute',\n  'manage',\n  'approve',\n  'export',\n  'import',\n  '*',\n];\n\n/**\n * CRUD actions subset.\n */\nexport const CRUD_ACTIONS: PermissionAction[] = ['create', 'read', 'update', 'delete'];\n\n/**\n * Read-only actions.\n */\nexport const READ_ONLY_ACTIONS: PermissionAction[] = ['read', 'list'];\n\n/**\n * Full access actions.\n */\nexport const FULL_ACCESS_ACTIONS: PermissionAction[] = ['*'];\n\n// =============================================================================\n// Permission Matrix Builder\n// =============================================================================\n\n/**\n * Builder for creating permission matrices.\n *\n * @example\n * ```typescript\n * const matrix = new PermissionMatrixBuilder()\n *   .setDefaultBehavior('deny')\n *   .setConflictResolution('deny-wins')\n *   .addEntry({\n *     roleId: 'admin',\n *     resource: '*',\n *     allowedActions: ['*'],\n *   })\n *   .addEntry({\n *     roleId: 'user',\n *     resource: 'documents',\n *     allowedActions: ['create', 'read', 'update'],\n *     scope: 'own',\n *   })\n *   .addEntry({\n *     roleId: 'user',\n *     resource: 'documents',\n *     allowedActions: ['read'],\n *     scope: 'team',\n *   })\n *   .build();\n * ```\n */\nexport class PermissionMatrixBuilder {\n  private entries: PermissionMatrixEntry[] = [];\n  private defaultBehavior: 'deny' | 'allow' = 'deny';\n  private conflictResolution: PermissionMatrix['conflictResolution'] = 'deny-wins';\n  private version = '1.0.0';\n\n  /**\n   * Set the default behavior when no entry matches.\n   */\n  setDefaultBehavior(behavior: 'deny' | 'allow'): this {\n    this.defaultBehavior = behavior;\n    return this;\n  }\n\n  /**\n   * Set the conflict resolution strategy.\n   */\n  setConflictResolution(strategy: PermissionMatrix['conflictResolution']): this {\n    this.conflictResolution = strategy;\n    return this;\n  }\n\n  /**\n   * Set the matrix version.\n   */\n  setVersion(version: string): this {\n    this.version = version;\n    return this;\n  }\n\n  /**\n   * Add a permission matrix entry.\n   */\n  addEntry(entry: PermissionMatrixEntry): this {\n    this.entries.push(entry);\n    return this;\n  }\n\n  /**\n   * Add multiple entries at once.\n   */\n  addEntries(entries: PermissionMatrixEntry[]): this {\n    this.entries.push(...entries);\n    return this;\n  }\n\n  /**\n   * Add full access for a role.\n   */\n  grantFullAccess(roleId: string): this {\n    return this.addEntry({\n      roleId,\n      resource: '*',\n      allowedActions: ['*'],\n    });\n  }\n\n  /**\n   * Add read-only access for a role on a resource.\n   */\n  grantReadOnly(roleId: string, resource: string, scope?: PermissionScope): this {\n    return this.addEntry({\n      roleId,\n      resource,\n      allowedActions: [...READ_ONLY_ACTIONS],\n      scope,\n    });\n  }\n\n  /**\n   * Add CRUD access for a role on a resource.\n   */\n  grantCRUD(roleId: string, resource: string, scope?: PermissionScope): this {\n    return this.addEntry({\n      roleId,\n      resource,\n      allowedActions: [...CRUD_ACTIONS, 'list'],\n      scope,\n    });\n  }\n\n  /**\n   * Deny specific actions for a role on a resource.\n   */\n  denyActions(roleId: string, resource: string, actions: PermissionAction[]): this {\n    return this.addEntry({\n      roleId,\n      resource,\n      allowedActions: [],\n      deniedActions: actions,\n    });\n  }\n\n  /**\n   * Add conditional entry.\n   */\n  addConditionalEntry(\n    entry: Omit<PermissionMatrixEntry, 'conditions'>,\n    conditions: PermissionCondition[]\n  ): this {\n    return this.addEntry({\n      ...entry,\n      conditions,\n    });\n  }\n\n  /**\n   * Clear all entries.\n   */\n  clear(): this {\n    this.entries = [];\n    return this;\n  }\n\n  /**\n   * Remove entries for a specific role.\n   */\n  removeRoleEntries(roleId: string): this {\n    this.entries = this.entries.filter((e) => e.roleId !== roleId);\n    return this;\n  }\n\n  /**\n   * Remove entries for a specific resource.\n   */\n  removeResourceEntries(resource: string): this {\n    this.entries = this.entries.filter((e) => e.resource !== resource);\n    return this;\n  }\n\n  /**\n   * Build the permission matrix.\n   */\n  build(): PermissionMatrix {\n    return {\n      entries: [...this.entries],\n      defaultBehavior: this.defaultBehavior,\n      conflictResolution: this.conflictResolution,\n      version: this.version,\n      updatedAt: new Date().toISOString(),\n    };\n  }\n}\n\n// =============================================================================\n// Preset Permission Matrices\n// =============================================================================\n\n/**\n * Create a standard permission matrix for common applications.\n *\n * @param options - Configuration options\n * @returns Configured permission matrix\n */\nexport function createStandardMatrix(options: {\n  resources: string[];\n  adminRole?: string;\n  managerRole?: string;\n  userRole?: string;\n  guestRole?: string;\n}): PermissionMatrix {\n  const {\n    resources,\n    adminRole = 'admin',\n    managerRole = 'manager',\n    userRole = 'user',\n    guestRole = 'guest',\n  } = options;\n\n  const builder = new PermissionMatrixBuilder()\n    .setDefaultBehavior('deny')\n    .setConflictResolution('deny-wins');\n\n  // Admin: full access to everything\n  builder.grantFullAccess(adminRole);\n\n  // Manager: full CRUD on all resources, manage team\n  for (const resource of resources) {\n    builder.addEntry({\n      roleId: managerRole,\n      resource,\n      allowedActions: [...CRUD_ACTIONS, 'list', 'export', 'approve'],\n      scope: 'team',\n    });\n  }\n\n  // User: CRUD on own resources, read team resources\n  for (const resource of resources) {\n    builder.addEntry({\n      roleId: userRole,\n      resource,\n      allowedActions: [...CRUD_ACTIONS, 'list'],\n      scope: 'own',\n    });\n    builder.addEntry({\n      roleId: userRole,\n      resource,\n      allowedActions: ['read', 'list'],\n      scope: 'team',\n    });\n  }\n\n  // Guest: read-only on public resources\n  builder.addEntry({\n    roleId: guestRole,\n    resource: '*',\n    allowedActions: ['read'],\n    conditions: [{ field: 'isPublic', operator: 'equals', value: true }],\n  });\n\n  return builder.build();\n}\n\n/**\n * Create a healthcare-specific permission matrix.\n *\n * @returns Healthcare permission matrix\n */\nexport function createHealthcareMatrix(): PermissionMatrix {\n  const builder = new PermissionMatrixBuilder()\n    .setDefaultBehavior('deny')\n    .setConflictResolution('deny-wins')\n    .setVersion('hipaa-1.0');\n\n  // System Admin\n  builder.grantFullAccess('system_admin');\n\n  // Provider (Doctor/Nurse)\n  builder\n    .addEntry({\n      roleId: 'provider',\n      resource: 'patients',\n      allowedActions: ['read', 'list'],\n      conditions: [\n        { field: 'assignedProvider', operator: 'equals', value: null, contextKey: 'userId' },\n      ],\n    })\n    .addEntry({\n      roleId: 'provider',\n      resource: 'medical_records',\n      allowedActions: ['create', 'read', 'update'],\n      conditions: [\n        { field: 'assignedProvider', operator: 'equals', value: null, contextKey: 'userId' },\n      ],\n    })\n    .addEntry({\n      roleId: 'provider',\n      resource: 'prescriptions',\n      allowedActions: ['create', 'read', 'update'],\n      conditions: [\n        { field: 'prescriberId', operator: 'equals', value: null, contextKey: 'userId' },\n      ],\n    })\n    .addEntry({\n      roleId: 'provider',\n      resource: 'lab_results',\n      allowedActions: ['read', 'list'],\n    })\n    .addEntry({\n      roleId: 'provider',\n      resource: 'appointments',\n      allowedActions: ['create', 'read', 'update', 'list'],\n    });\n\n  // Nurse\n  builder\n    .addEntry({\n      roleId: 'nurse',\n      resource: 'patients',\n      allowedActions: ['read', 'list', 'update'],\n      conditions: [{ field: 'unit', operator: 'equals', value: null, contextKey: 'assignedUnit' }],\n    })\n    .addEntry({\n      roleId: 'nurse',\n      resource: 'medical_records',\n      allowedActions: ['read', 'update'],\n    })\n    .addEntry({\n      roleId: 'nurse',\n      resource: 'vitals',\n      allowedActions: ['create', 'read', 'update', 'list'],\n    })\n    .addEntry({\n      roleId: 'nurse',\n      resource: 'medication_administration',\n      allowedActions: ['create', 'read', 'update'],\n    });\n\n  // Front Desk / Receptionist\n  builder\n    .addEntry({\n      roleId: 'receptionist',\n      resource: 'patients',\n      allowedActions: ['create', 'read', 'update', 'list'],\n    })\n    .addEntry({\n      roleId: 'receptionist',\n      resource: 'appointments',\n      allowedActions: ['create', 'read', 'update', 'delete', 'list'],\n    })\n    .addEntry({\n      roleId: 'receptionist',\n      resource: 'insurance',\n      allowedActions: ['read', 'update'],\n    })\n    // Deny access to medical records\n    .denyActions('receptionist', 'medical_records', ['*']);\n\n  // Billing\n  builder\n    .addEntry({\n      roleId: 'billing',\n      resource: 'invoices',\n      allowedActions: [...CRUD_ACTIONS, 'list', 'export'],\n    })\n    .addEntry({\n      roleId: 'billing',\n      resource: 'insurance_claims',\n      allowedActions: [...CRUD_ACTIONS, 'list'],\n    })\n    .addEntry({\n      roleId: 'billing',\n      resource: 'patients',\n      allowedActions: ['read'],\n    })\n    // Deny access to detailed medical records\n    .denyActions('billing', 'medical_records', ['*'])\n    .denyActions('billing', 'prescriptions', ['*']);\n\n  // Patient (self-service portal)\n  builder\n    .addEntry({\n      roleId: 'patient',\n      resource: 'appointments',\n      allowedActions: ['create', 'read', 'update', 'list'],\n      scope: 'own',\n    })\n    .addEntry({\n      roleId: 'patient',\n      resource: 'medical_records',\n      allowedActions: ['read'],\n      scope: 'own',\n    })\n    .addEntry({\n      roleId: 'patient',\n      resource: 'prescriptions',\n      allowedActions: ['read', 'list'],\n      scope: 'own',\n    })\n    .addEntry({\n      roleId: 'patient',\n      resource: 'lab_results',\n      allowedActions: ['read', 'list'],\n      scope: 'own',\n    })\n    .addEntry({\n      roleId: 'patient',\n      resource: 'invoices',\n      allowedActions: ['read', 'list'],\n      scope: 'own',\n    });\n\n  return builder.build();\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Merge multiple permission matrices.\n *\n * @param matrices - Matrices to merge\n * @param options - Merge options\n * @returns Merged permission matrix\n */\nexport function mergePermissionMatrices(\n  matrices: PermissionMatrix[],\n  options?: {\n    defaultBehavior?: 'deny' | 'allow';\n    conflictResolution?: PermissionMatrix['conflictResolution'];\n  }\n): PermissionMatrix {\n  const allEntries: PermissionMatrixEntry[] = [];\n\n  for (const matrix of matrices) {\n    allEntries.push(...matrix.entries);\n  }\n\n  return {\n    entries: allEntries,\n    defaultBehavior: options?.defaultBehavior ?? 'deny',\n    conflictResolution: options?.conflictResolution ?? 'deny-wins',\n    version: Date.now().toString(),\n    updatedAt: new Date().toISOString(),\n  };\n}\n\n/**\n * Filter permission matrix entries by role.\n *\n * @param matrix - Permission matrix\n * @param roleIds - Role IDs to filter by\n * @returns Filtered entries\n */\nexport function filterEntriesByRole(\n  matrix: PermissionMatrix,\n  roleIds: string[]\n): PermissionMatrixEntry[] {\n  return matrix.entries.filter((entry) => roleIds.includes(entry.roleId));\n}\n\n/**\n * Filter permission matrix entries by resource.\n *\n * @param matrix - Permission matrix\n * @param resource - Resource to filter by\n * @returns Filtered entries\n */\nexport function filterEntriesByResource(\n  matrix: PermissionMatrix,\n  resource: string\n): PermissionMatrixEntry[] {\n  return matrix.entries.filter((entry) => entry.resource === resource || entry.resource === '*');\n}\n\n/**\n * Get all resources defined in a permission matrix.\n *\n * @param matrix - Permission matrix\n * @returns Unique resource list\n */\nexport function getDefinedResources(matrix: PermissionMatrix): string[] {\n  const resources = new Set<string>();\n\n  for (const entry of matrix.entries) {\n    if (entry.resource !== '*') {\n      resources.add(entry.resource);\n    }\n  }\n\n  return Array.from(resources).sort();\n}\n\n/**\n * Get all roles defined in a permission matrix.\n *\n * @param matrix - Permission matrix\n * @returns Unique role list\n */\nexport function getDefinedRoles(matrix: PermissionMatrix): string[] {\n  const roles = new Set<string>();\n\n  for (const entry of matrix.entries) {\n    roles.add(entry.roleId);\n  }\n\n  return Array.from(roles).sort();\n}\n\n/**\n * Validate a permission matrix for consistency.\n *\n * @param matrix - Permission matrix to validate\n * @returns Validation errors if any\n */\nexport function validatePermissionMatrix(matrix: PermissionMatrix): string[] {\n  const errors: string[] = [];\n\n  if (matrix.entries == null || !Array.isArray(matrix.entries)) {\n    errors.push('Matrix entries must be an array');\n    return errors;\n  }\n\n  for (const [index, entry] of matrix.entries.entries()) {\n    if (entry.roleId == null || entry.roleId === '') {\n      errors.push(`Entry at index ${index}: roleId is required`);\n    }\n\n    if (entry.resource == null || entry.resource === '') {\n      errors.push(`Entry at index ${index}: resource is required`);\n    }\n\n    if (entry.allowedActions == null || !Array.isArray(entry.allowedActions)) {\n      errors.push(`Entry at index ${index}: allowedActions must be an array`);\n    } else {\n      for (const action of entry.allowedActions) {\n        if (!PERMISSION_ACTIONS.includes(action)) {\n          errors.push(`Entry at index ${index}: invalid action '${action}'`);\n        }\n      }\n    }\n\n    if (entry.deniedActions) {\n      for (const action of entry.deniedActions) {\n        if (!PERMISSION_ACTIONS.includes(action)) {\n          errors.push(`Entry at index ${index}: invalid denied action '${action}'`);\n        }\n      }\n    }\n\n    // Check for conflicting allow/deny\n    if (entry.allowedActions != null && entry.deniedActions != null) {\n      const overlap = entry.allowedActions.filter((a) => (entry.deniedActions ?? []).includes(a));\n      if (overlap.length > 0) {\n        errors.push(\n          `Entry at index ${index}: conflicting allow/deny for actions: ${overlap.join(', ')}`\n        );\n      }\n    }\n  }\n\n  return errors;\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\n/**\n * Create a new permission matrix builder.\n *\n * @returns New PermissionMatrixBuilder instance\n */\nexport function createPermissionMatrixBuilder(): PermissionMatrixBuilder {\n  return new PermissionMatrixBuilder();\n}\n"],"names":["PERMISSION_ACTIONS","CRUD_ACTIONS","READ_ONLY_ACTIONS","FULL_ACCESS_ACTIONS","PermissionMatrixBuilder","behavior","strategy","version","entry","entries","roleId","resource","scope","actions","conditions","e","createStandardMatrix","options","resources","adminRole","managerRole","userRole","guestRole","builder","createHealthcareMatrix","mergePermissionMatrices","matrices","allEntries","matrix","filterEntriesByRole","roleIds","filterEntriesByResource","getDefinedResources","getDefinedRoles","roles","validatePermissionMatrix","errors","index","action","overlap","a","createPermissionMatrixBuilder"],"mappings":"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"}