{"version":3,"sources":["../../src/adapters/base.ts","../../src/adapters/mongodb.ts","../../src/adapters/prisma.ts","../../src/adapters/memory.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { RBACAdapter, Role, Permission } from '../types';\r\n\r\nexport interface CacheConfig {\r\n  enabled?: boolean;\r\n  ttl?: number; // seconds\r\n}\r\n\r\n/**\r\n * Base adapter with common functionality like caching\r\n * All adapters should extend this class\r\n */\r\nexport abstract class BaseAdapter implements RBACAdapter {\r\n  protected cache?: Map<string, { data: any; expires: number }>;\r\n  protected cacheConfig: CacheConfig;\r\n\r\n  constructor(cacheConfig: CacheConfig = {}) {\r\n    this.cacheConfig = cacheConfig;\r\n    if (cacheConfig.enabled) {\r\n      this.cache = new Map();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get from cache or fetch and cache\r\n   */\r\n  protected async withCache<T>(\r\n    key: string,\r\n    fetcher: () => Promise<T>\r\n  ): Promise<T> {\r\n    if (!this.cache) {\r\n      return fetcher();\r\n    }\r\n\r\n    const cached = this.cache.get(key);\r\n    if (cached && cached.expires > Date.now()) {\r\n      return cached.data as T;\r\n    }\r\n\r\n    const data = await fetcher();\r\n    const ttl = this.cacheConfig.ttl || 300; // default 5 minutes\r\n    this.cache.set(key, {\r\n      data,\r\n      expires: Date.now() + ttl * 1000,\r\n    });\r\n\r\n    return data;\r\n  }\r\n\r\n  /**\r\n   * Clear cache for a specific key or all cache\r\n   */\r\n  public clearCache(key?: string): void {\r\n    if (!this.cache) return;\r\n\r\n    if (key) {\r\n      this.cache.delete(key);\r\n    } else {\r\n      this.cache.clear();\r\n    }\r\n  }\r\n\r\n  // Abstract methods that each adapter must implement\r\n  abstract findRole(roleName: Role): Promise<any>;\r\n  abstract getUserRole(userId: string): Promise<Role | null>;\r\n  abstract getRolePermissions(roleName: Role): Promise<Permission[]>;\r\n}\r\n","import type { Db, Collection } from 'mongodb';\r\nimport type { RBACAdapter, RoleDocument, UserDocument, Role, Permission } from '../types';\r\n\r\n/**\r\n * MongoDB adapter configuration\r\n */\r\nexport interface MongoDBAdapterConfig {\r\n  db: Db;\r\n  rolesCollection?: string;\r\n  usersCollection?: string;\r\n}\r\n\r\n/**\r\n * MongoDB adapter for RBAC\r\n *\r\n * @example\r\n * ```typescript\r\n * import { MongoClient } from 'mongodb';\r\n * import { MongoDBAdapter } from '@yourusername/next-rbac/adapters';\r\n *\r\n * const client = new MongoClient(process.env.MONGODB_URI);\r\n * await client.connect();\r\n * const db = client.db('myapp');\r\n *\r\n * const adapter = new MongoDBAdapter({ db });\r\n * ```\r\n */\r\nexport class MongoDBAdapter implements RBACAdapter {\r\n  private db: Db;\r\n  private rolesCollectionName: string;\r\n  private usersCollectionName: string;\r\n\r\n  constructor(config: MongoDBAdapterConfig) {\r\n    this.db = config.db;\r\n    this.rolesCollectionName = config.rolesCollection || 'roles';\r\n    this.usersCollectionName = config.usersCollection || 'users';\r\n  }\r\n\r\n  private get rolesCollection(): Collection<RoleDocument> {\r\n    return this.db.collection<RoleDocument>(this.rolesCollectionName);\r\n  }\r\n\r\n  private get usersCollection(): Collection<UserDocument> {\r\n    return this.db.collection<UserDocument>(this.usersCollectionName);\r\n  }\r\n\r\n  async findRole(roleName: Role): Promise<RoleDocument | null> {\r\n    return this.rolesCollection.findOne({\r\n      name: roleName,\r\n      $or: [\r\n        { deleted_at: null },\r\n        { deleted_at: { $exists: false } }\r\n      ]\r\n    });\r\n  }\r\n\r\n  async getUserRole(userId: string): Promise<Role | null> {\r\n    // Try to find by ObjectId first, then by string\r\n    let user;\r\n\r\n    try {\r\n      const { ObjectId } = await import('mongodb');\r\n      user = await this.usersCollection.findOne({ _id: new ObjectId(userId) } as any);\r\n    } catch {\r\n      // If ObjectId import fails or invalid ObjectId, try string\r\n      user = await this.usersCollection.findOne({ _id: userId } as any);\r\n    }\r\n\r\n    return user?.role || null;\r\n  }\r\n\r\n  async getRolePermissions(roleName: Role): Promise<Permission[]> {\r\n    const role = await this.findRole(roleName);\r\n\r\n    if (!role) {\r\n      return [];\r\n    }\r\n\r\n    // Get direct permissions\r\n    const permissions = new Set<Permission>(role.permissions || []);\r\n\r\n    // Recursively get inherited permissions\r\n    if (role.inherits) {\r\n      const inheritedPermissions = await this.getRolePermissions(role.inherits as Role);\r\n      inheritedPermissions.forEach(p => permissions.add(p));\r\n    }\r\n\r\n    return Array.from(permissions);\r\n  }\r\n}\r\n","import { BaseAdapter, type CacheConfig } from './base';\r\nimport type { Role, Permission, RoleDocument } from '../types';\r\n\r\nexport interface PrismaAdapterConfig extends CacheConfig {\r\n  /**\r\n   * Prisma client instance\r\n   */\r\n  prisma: any;\r\n\r\n  /**\r\n   * Name of the roles model in your Prisma schema\r\n   * @default 'role'\r\n   */\r\n  roleModel?: string;\r\n\r\n  /**\r\n   * Name of the users model in your Prisma schema\r\n   * @default 'user'\r\n   */\r\n  userModel?: string;\r\n\r\n  /**\r\n   * Field name for role name in roles table\r\n   * @default 'name'\r\n   */\r\n  roleNameField?: string;\r\n\r\n  /**\r\n   * Field name for permissions array in roles table\r\n   * @default 'permissions'\r\n   */\r\n  rolePermissionsField?: string;\r\n\r\n  /**\r\n   * Field name for role in users table\r\n   * @default 'role'\r\n   */\r\n  userRoleField?: string;\r\n\r\n  /**\r\n   * Field name for deleted_at (soft delete)\r\n   * @default 'deleted_at'\r\n   */\r\n  deletedAtField?: string;\r\n}\r\n\r\n/**\r\n * Prisma adapter for RBAC\r\n *\r\n * Works with any database supported by Prisma:\r\n * - PostgreSQL\r\n * - MySQL\r\n * - SQLite\r\n * - SQL Server\r\n * - MongoDB\r\n * - CockroachDB\r\n *\r\n * @example\r\n * ```typescript\r\n * import { PrismaClient } from '@prisma/client';\r\n * import { PrismaAdapter } from '@khannara/next-rbac/adapters';\r\n *\r\n * const prisma = new PrismaClient();\r\n *\r\n * const adapter = new PrismaAdapter({\r\n *   prisma,\r\n *   roleModel: 'role',\r\n *   userModel: 'user',\r\n *   enabled: true, // Enable caching\r\n *   ttl: 300 // Cache for 5 minutes\r\n * });\r\n * ```\r\n *\r\n * Required Prisma schema:\r\n * ```prisma\r\n * model Role {\r\n *   id          String   @id @default(auto()) @map(\"_id\") @db.ObjectId\r\n *   name        String   @unique\r\n *   permissions String[]\r\n *   deleted_at  DateTime?\r\n *   created_at  DateTime  @default(now())\r\n *   updated_at  DateTime  @updatedAt\r\n * }\r\n *\r\n * model User {\r\n *   id    String @id @default(auto()) @map(\"_id\") @db.ObjectId\r\n *   email String @unique\r\n *   role  String\r\n *   // ... other fields\r\n * }\r\n * ```\r\n */\r\nexport class PrismaAdapter extends BaseAdapter {\r\n  private prisma: any;\r\n  private roleModel: string;\r\n  private userModel: string;\r\n  private roleNameField: string;\r\n  private rolePermissionsField: string;\r\n  private userRoleField: string;\r\n  private deletedAtField: string;\r\n\r\n  constructor(config: PrismaAdapterConfig) {\r\n    super(config);\r\n\r\n    if (!config.prisma) {\r\n      throw new Error('PrismaAdapter requires a Prisma client instance');\r\n    }\r\n\r\n    this.prisma = config.prisma;\r\n    this.roleModel = config.roleModel || 'role';\r\n    this.userModel = config.userModel || 'user';\r\n    this.roleNameField = config.roleNameField || 'name';\r\n    this.rolePermissionsField = config.rolePermissionsField || 'permissions';\r\n    this.userRoleField = config.userRoleField || 'role';\r\n    this.deletedAtField = config.deletedAtField || 'deleted_at';\r\n  }\r\n\r\n  /**\r\n   * Find a role by name\r\n   */\r\n  async findRole(roleName: Role): Promise<RoleDocument | null> {\r\n    return this.withCache(`role:${roleName}`, async () => {\r\n      try {\r\n        const role = await this.prisma[this.roleModel].findUnique({\r\n          where: {\r\n            [this.roleNameField]: roleName,\r\n            [this.deletedAtField]: null,\r\n          },\r\n        });\r\n\r\n        if (!role) return null;\r\n\r\n        return {\r\n          _id: role.id,\r\n          name: role[this.roleNameField],\r\n          permissions: role[this.rolePermissionsField] || [],\r\n          created_at: role.created_at,\r\n          updated_at: role.updated_at,\r\n          deleted_at: role[this.deletedAtField],\r\n        };\r\n      } catch (error) {\r\n        // If deleted_at field doesn't exist, try without it\r\n        const role = await this.prisma[this.roleModel].findUnique({\r\n          where: {\r\n            [this.roleNameField]: roleName,\r\n          },\r\n        });\r\n\r\n        if (!role) return null;\r\n\r\n        return {\r\n          _id: role.id,\r\n          name: role[this.roleNameField],\r\n          permissions: role[this.rolePermissionsField] || [],\r\n          created_at: role.created_at,\r\n          updated_at: role.updated_at,\r\n          deleted_at: null,\r\n        };\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Get user's role\r\n   */\r\n  async getUserRole(userId: string): Promise<Role | null> {\r\n    return this.withCache(`user-role:${userId}`, async () => {\r\n      const user = await this.prisma[this.userModel].findUnique({\r\n        where: { id: userId },\r\n        select: {\r\n          [this.userRoleField]: true,\r\n        },\r\n      });\r\n\r\n      return user ? user[this.userRoleField] : null;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Get all permissions for a role\r\n   */\r\n  async getRolePermissions(roleName: Role): Promise<Permission[]> {\r\n    const role = await this.findRole(roleName);\r\n    return role?.permissions || [];\r\n  }\r\n}\r\n","import { BaseAdapter } from './base';\r\nimport type { Role, Permission, RoleDocument } from '../types';\r\n\r\nexport interface MemoryAdapterConfig {\r\n  /**\r\n   * Initial roles data\r\n   */\r\n  roles?: Array<{\r\n    name: string;\r\n    permissions: string[];\r\n  }>;\r\n\r\n  /**\r\n   * Initial users data\r\n   */\r\n  users?: Array<{\r\n    id: string;\r\n    role: string;\r\n  }>;\r\n}\r\n\r\n/**\r\n * In-memory adapter for RBAC\r\n *\r\n * Perfect for:\r\n * - Unit testing\r\n * - Development/demos\r\n * - Documentation examples\r\n * - Prototyping\r\n *\r\n * @example\r\n * ```typescript\r\n * import { InMemoryAdapter } from '@khannara/next-rbac/adapters';\r\n *\r\n * const adapter = new InMemoryAdapter({\r\n *   roles: [\r\n *     {\r\n *       name: 'admin',\r\n *       permissions: ['users.create', 'users.read', 'users.update', 'users.delete']\r\n *     },\r\n *     {\r\n *       name: 'user',\r\n *       permissions: ['users.read']\r\n *     }\r\n *   ],\r\n *   users: [\r\n *     { id: '1', role: 'admin' },\r\n *     { id: '2', role: 'user' }\r\n *   ]\r\n * });\r\n * ```\r\n */\r\nexport class InMemoryAdapter extends BaseAdapter {\r\n  private roles: Map<string, RoleDocument>;\r\n  private users: Map<string, { id: string; role: string }>;\r\n\r\n  constructor(config: MemoryAdapterConfig = {}) {\r\n    super(); // No caching needed for in-memory\r\n\r\n    this.roles = new Map();\r\n    this.users = new Map();\r\n\r\n    // Initialize roles\r\n    if (config.roles) {\r\n      config.roles.forEach(role => {\r\n        this.roles.set(role.name, {\r\n          _id: role.name,\r\n          name: role.name,\r\n          permissions: role.permissions,\r\n          created_at: new Date(),\r\n          updated_at: new Date(),\r\n          deleted_at: null,\r\n        });\r\n      });\r\n    }\r\n\r\n    // Initialize users\r\n    if (config.users) {\r\n      config.users.forEach(user => {\r\n        this.users.set(user.id, user);\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Find a role by name\r\n   */\r\n  async findRole(roleName: Role): Promise<RoleDocument | null> {\r\n    return this.roles.get(roleName) || null;\r\n  }\r\n\r\n  /**\r\n   * Get user's role\r\n   */\r\n  async getUserRole(userId: string): Promise<Role | null> {\r\n    const user = this.users.get(userId);\r\n    return user ? user.role : null;\r\n  }\r\n\r\n  /**\r\n   * Get all permissions for a role\r\n   */\r\n  async getRolePermissions(roleName: Role): Promise<Permission[]> {\r\n    const role = this.roles.get(roleName);\r\n    return role?.permissions || [];\r\n  }\r\n\r\n  /**\r\n   * Add or update a role (useful for testing)\r\n   */\r\n  setRole(name: string, permissions: string[]): void {\r\n    this.roles.set(name, {\r\n      _id: name,\r\n      name,\r\n      permissions,\r\n      created_at: new Date(),\r\n      updated_at: new Date(),\r\n      deleted_at: null,\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Add or update a user (useful for testing)\r\n   */\r\n  setUser(id: string, role: string): void {\r\n    this.users.set(id, { id, role });\r\n  }\r\n\r\n  /**\r\n   * Remove a role (useful for testing)\r\n   */\r\n  deleteRole(name: string): void {\r\n    this.roles.delete(name);\r\n  }\r\n\r\n  /**\r\n   * Remove a user (useful for testing)\r\n   */\r\n  deleteUser(id: string): void {\r\n    this.users.delete(id);\r\n  }\r\n\r\n  /**\r\n   * Clear all data (useful for test cleanup)\r\n   */\r\n  clear(): void {\r\n    this.roles.clear();\r\n    this.users.clear();\r\n  }\r\n}\r\n"]}