import type { UserModel as OrmUserModel } from '@stacksjs/orm'; /** * Set the RBAC store implementation */ export declare function setRbacStore(rbacStore: RbacStore): void; /** * Flush the RBAC cache */ export declare function flushRbacCache(): void; /** * Create a new role */ export declare function createRole(name: string, guardName?: string, description?: string): Promise; /** * Find a role by name */ export declare function findRole(name: string, guardName?: string): Promise; /** * Delete a role */ export declare function deleteRole(name: string, guardName?: string): Promise; /** * Get all roles */ export declare function getAllRoles(guardName?: string): Promise; /** * Create a new permission */ export declare function createPermission(name: string, guardName?: string, description?: string): Promise; /** * Find a permission by name */ export declare function findPermission(name: string, guardName?: string): Promise; /** * Delete a permission */ export declare function deletePermission(name: string, guardName?: string): Promise; /** * Get all permissions */ export declare function getAllPermissions(guardName?: string): Promise; /** * Get all roles for a user */ export declare function getUserRoles(user: UserModel | { id: number } | number): Promise; /** * Assign a role to a user */ export declare function assignRole(user: UserModel | { id: number } | number, roleName: string, guardName?: string): Promise; /** * Remove a role from a user */ export declare function removeRole(user: UserModel | { id: number } | number, roleName: string, guardName?: string): Promise; /** * Remove all roles from a user */ export declare function removeAllRoles(user: UserModel | { id: number } | number): Promise; /** * Sync roles for a user within one guard. * * Roles belonging to other guards are preserved. The previous implementation * resolved the requested names within `guardName`, then replaced the complete * pivot set, which silently removed assignments from every other guard. */ export declare function syncRoles(user: UserModel | { id: number } | number, roleNames: string[], guardName?: string): Promise; /** * Check if a user has a specific role */ export declare function hasRole(user: UserModel | { id: number } | number, roleName: string, guardName?: string): Promise; /** * Check if a user has any of the given roles */ export declare function hasAnyRole(user: UserModel | { id: number } | number, roleNames: string[], guardName?: string): Promise; /** * Check if a user has all of the given roles */ export declare function hasAllRoles(user: UserModel | { id: number } | number, roleNames: string[], guardName?: string): Promise; /** * Get all permissions for a user (direct + via roles) */ export declare function getUserPermissions(user: UserModel | { id: number } | number): Promise; /** * Give a direct permission to a user */ export declare function givePermission(user: UserModel | { id: number } | number, permissionName: string, guardName?: string): Promise; /** * Revoke a direct permission from a user */ export declare function revokePermission(user: UserModel | { id: number } | number, permissionName: string, guardName?: string): Promise; /** * Revoke all direct permissions from a user */ export declare function revokeAllPermissions(user: UserModel | { id: number } | number): Promise; /** * Sync direct permissions for a user within one guard. * * Direct permissions belonging to other guards are preserved. */ export declare function syncPermissions(user: UserModel | { id: number } | number, permissionNames: string[], guardName?: string): Promise; /** * Check if a user has a specific permission (direct or via role) */ export declare function hasPermission(user: UserModel | { id: number } | number, permissionName: string, guardName?: string): Promise; /** * Check if a user has any of the given permissions */ export declare function hasAnyPermission(user: UserModel | { id: number } | number, permissionNames: string[], guardName?: string): Promise; /** * Check if a user has all of the given permissions */ export declare function hasAllPermissions(user: UserModel | { id: number } | number, permissionNames: string[], guardName?: string): Promise; /** * Get all permissions for a role */ export declare function getRolePermissions(roleId: number): Promise; /** * Assign a permission to a role */ export declare function givePermissionToRole(roleName: string, permissionName: string, guardName?: string): Promise; /** * Remove a permission from a role */ export declare function revokePermissionFromRole(roleName: string, permissionName: string, guardName?: string): Promise; /** * Sync permissions for a role */ export declare function syncRolePermissions(roleName: string, permissionNames: string[], guardName?: string): Promise; /** * Add RBAC methods to a user object * * @example * const user = withRbac(authenticatedUser) * if (await user.hasRole('admin')) { ... } * await user.assignRole('editor') */ export declare function withRbac(user: T): T & RbacMethods; /** * RBAC facade for convenient access */ export declare const Rbac: { setStore: unknown; flushCache: unknown; createRole: typeof createRole; findRole: typeof findRole; deleteRole: typeof deleteRole; getAllRoles: typeof getAllRoles; createPermission: typeof createPermission; findPermission: typeof findPermission; deletePermission: typeof deletePermission; getAllPermissions: typeof getAllPermissions; getUserRoles: typeof getUserRoles; assignRole: typeof assignRole; removeRole: typeof removeRole; removeAllRoles: typeof removeAllRoles; syncRoles: typeof syncRoles; hasRole: typeof hasRole; hasAnyRole: typeof hasAnyRole; hasAllRoles: typeof hasAllRoles; getUserPermissions: typeof getUserPermissions; givePermission: typeof givePermission; revokePermission: typeof revokePermission; revokeAllPermissions: typeof revokeAllPermissions; syncPermissions: typeof syncPermissions; hasPermission: typeof hasPermission; hasAnyPermission: typeof hasAnyPermission; hasAllPermissions: typeof hasAllPermissions; getRolePermissions: typeof getRolePermissions; givePermissionToRole: typeof givePermissionToRole; revokePermissionFromRole: typeof revokePermissionFromRole; syncRolePermissions: typeof syncRolePermissions; withRbac: typeof withRbac }; export declare interface RoleRecord { id: number name: string guard_name: string description?: string created_at?: string updated_at?: string } export declare interface PermissionRecord { id: number name: string guard_name: string description?: string created_at?: string updated_at?: string } export declare interface RolePermissionPivot { role_id: number permission_id: number created_at?: string } export declare interface UserRolePivot { user_id: number role_id: number created_at?: string } export declare interface UserPermissionPivot { user_id: number permission_id: number created_at?: string } /** * RBAC database adapter interface. * Implement this to connect RBAC to your database layer. */ export declare interface RbacStore { findRoleByName(name: string, guardName?: string): Promise findRoleById(id: number): Promise createRole(name: string, guardName?: string, description?: string): Promise deleteRole(id: number): Promise getAllRoles(guardName?: string): Promise findPermissionByName(name: string, guardName?: string): Promise findPermissionById(id: number): Promise createPermission(name: string, guardName?: string, description?: string): Promise deletePermission(id: number): Promise getAllPermissions(guardName?: string): Promise getUserRoles(userId: number): Promise assignRoleToUser(userId: number, roleId: number): Promise removeRoleFromUser(userId: number, roleId: number): Promise removeAllRolesFromUser(userId: number): Promise syncUserRoles(userId: number, roleIds: number[]): Promise getUserDirectPermissions(userId: number): Promise assignPermissionToUser(userId: number, permissionId: number): Promise removePermissionFromUser(userId: number, permissionId: number): Promise removeAllPermissionsFromUser(userId: number): Promise syncUserPermissions(userId: number, permissionIds: number[]): Promise getRolePermissions(roleId: number): Promise assignPermissionToRole(roleId: number, permissionId: number): Promise removePermissionFromRole(roleId: number, permissionId: number): Promise syncRolePermissions(roleId: number, permissionIds: number[]): Promise } // ─── Authorizable Mixin (add to user objects) ─────────────────── export declare interface RbacMethods { hasRole(roleName: string, guardName?: string): Promise hasAnyRole(roleNames: string[], guardName?: string): Promise hasAllRoles(roleNames: string[], guardName?: string): Promise hasPermission(permissionName: string, guardName?: string): Promise hasAnyPermission(permissionNames: string[], guardName?: string): Promise hasAllPermissions(permissionNames: string[], guardName?: string): Promise getRoles(): Promise getPermissions(): Promise assignRole(roleName: string, guardName?: string): Promise removeRole(roleName: string, guardName?: string): Promise syncRoles(roleNames: string[], guardName?: string): Promise givePermission(permissionName: string, guardName?: string): Promise revokePermission(permissionName: string, guardName?: string): Promise syncPermissions(permissionNames: string[], guardName?: string): Promise } // Use the row/instance shape from orm so role helpers operate on the // authenticated user object, not the User class constructor. declare type UserModel = OrmUserModel; export type RbacEntity = 'permission' | 'role'; export declare class RbacEntityNotFoundError extends Error { public readonly entity: RbacEntity; public readonly value: string; public readonly guardName: string; constructor(entity: RbacEntity, value: string, guardName: string); } /** * FIFO-bounded Map. Wraps Map with a hard size cap; on overflow, the * oldest entry (Map insertion order) is evicted. Used for the RBAC * per-user caches because the previous unbounded `Map` * grew without limit across the process lifetime — a long-running * server serving many distinct users would OOM eventually * (stacksjs/stacks#1860 M-5). Same shape as `BoundedMap` in * `@stacksjs/router/stacks-router.ts`. */ declare class BoundedMap { constructor(max: number); get(key: K): V | undefined; has(key: K): boolean; set(key: K, value: V): this; delete(key: K): boolean; clear(): void; } export default Rbac;