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.
The core RBAC system that provides the building blocks for permission management:
- Module and registry system
- Permission definitions and validation
- Extensible architecture for custom permission types
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:
- Type-safe expressions with full TypeScript support
- Functional composition using Reader monads
- Composable operators (
has
,not
,and
,or
) - Performance optimized for large permission sets
- Zero runtime dependencies beyond core libraries
React hooks and components for seamless RBAC integration in React applications:
usePermissions()
hook for permission checking<PermissionGate>
component for conditional rendering- Context providers for permission management
- HOCs for higher-order component patterns
# 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
- Set up your permission modules:
import { createModule, getDefaultRegistry, register } from '@levi2ki/rbac-core';
const registry = pipe(getDefaultRegistry(), register(createModule<UserPermissions>()('user')), register(createModule<TeamPermissions>()('team')));
- Create expressions:
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')])]);
- Evaluate permissions:
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
- Core Library - Foundation and architecture
- Expression DSL - Complex permission expressions
- React Integration - Coming soon!
We welcome contributions! Please see our Contributing Guide for details.
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature
- Make your changes
- Run tests:
nx test
- Commit your changes:
git commit -m 'feat: add amazing feature'
- Push to the branch:
git push origin feature/amazing-feature
- Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Core RBAC system (
@levi2ki/rbac-core
) - Expression DSL (
@levi2ki/rbac-expression
) - React integration (
@levi2ki/rbac-react
) - NestJS integration (
@levi2ki/rbac-nest
) - Vue.js integration
- Angular integration
- GraphQL directives
- Database adapters
- Performance benchmarks
- Migration guides
- Built with fp-ts for functional programming utilities
- Powered by Nx for monorepo management
- Type-safe by TypeScript
Ready to build robust permission systems? Start with @levi2ki/rbac-core for the foundation, then explore @levi2ki/rbac-expression for complex permission logic! 🚀