A modern, type-safe Role-Based Access Control (RBAC) system built with TypeScript and functional programming principles. This monorepo provides a comprehensive solution for implementing robust permission systems in your applications.
@levi2ki/rbac-core - Foundation LibraryThe core RBAC system that provides the building blocks for permission management:
A powerful Domain Specific Language for building complex permission expressions with full type safety:
import { createExpression } from '@levi2ki/rbac-expression'; import { createModule, getDefaultRegistry, register } from '@levi2ki/rbac-core'; import { pipe } from 'fp-ts/function'; import * as Option from 'fp-ts/Option'; // Define permissions enum UserPermissions { READ = 'READ', WRITE = 'WRITE', DELETE = 'DELETE', ADMIN = 'ADMIN', } enum TeamPermissions { MANAGE = 'MANAGE', VIEW = 'VIEW', } // Create registry const registry = pipe(getDefaultRegistry(), register(createModule<UserPermissions>()('user')), register(createModule<TeamPermissions>()('team'))); // Create expressions const { has, not, and, or } = createExpression(registry); // Build complex permission logic const canEditSensitiveData = and([has('user.WRITE'), or([has('user.ADMIN'), has('team.MANAGE')]), not('user.RESTRICTED')]); // Evaluate against user context const userContext = { user: Option.some([UserPermissions.WRITE, UserPermissions.ADMIN]), team: Option.some([TeamPermissions.VIEW]), }; const result = canEditSensitiveData(userContext); console.log(result); // true
✨ Key Features:
has
, not
, and
, or
)React hooks and components for seamless RBAC integration in React applications:
usePermissions()
hook for permission checking<PermissionGate>
component for conditional rendering# Install the entire monorepo pnpm add @levi2ki/rbac-core @levi2ki/rbac-expression # Or install individual packages pnpm add @levi2ki/rbac-core pnpm add @levi2ki/rbac-expression
import { createModule, getDefaultRegistry, register } from '@levi2ki/rbac-core'; const registry = pipe(getDefaultRegistry(), register(createModule<UserPermissions>()('user')), register(createModule<TeamPermissions>()('team')));
import { createExpression } from '@levi2ki/rbac-expression'; const { has, and, or } = createExpression(registry); const canAccessAdminPanel = and([has('user.ADMIN'), or([has('user.SUPER_USER'), has('team.ADMIN')])]);
const userContext = { user: Option.some([UserPermissions.ADMIN]), team: Option.some([TeamPermissions.VIEW]), }; const hasAccess = canAccessAdminPanel(userContext);
improved-rbac/
├── packages/
│ ├── rbac-core/ # Core RBAC system
│ ├── rbac-expression/ # DSL for complex permissions
│ └── rbac-react/ # React integration (coming soon)
├── examples/ # Usage examples
└── docs/ # Documentation
This is a monorepo built with Nx and managed with pnpm.
# Install dependencies pnpm install # Run tests nx test # Build packages nx build # Run linting nx lint
We welcome contributions! Please see our Contributing Guide for details.
git checkout -b feature/amazing-feature
nx test
git commit -m 'feat: add amazing feature'
git push origin feature/amazing-feature
This project is licensed under the MIT License - see the LICENSE file for details.
@levi2ki/rbac-core
)@levi2ki/rbac-expression
)@levi2ki/rbac-react
)@levi2ki/rbac-nest
)Ready to build robust permission systems? Start with @levi2ki/rbac-core for the foundation, then explore @levi2ki/rbac-expression for complex permission logic! 🚀
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4