{"_id":"@c-a-f/permission","_rev":"2-2224ba0ae068115f9dca8cda2c278a10","name":"@c-a-f/permission","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@c-a-f/permission","version":"1.0.0","keywords":["clean-architecture-frontend","clean-architecture","clean architecture frontend","caf","permission","authorization","access-control","rbac","casl","policy"],"author":{"name":"ali aslani","email":"aliaslani.mm@gmail.com"},"license":"MIT","_id":"@c-a-f/permission@1.0.0","maintainers":[{"name":"ialiaslani","email":"aliaslani.mm@gmail.com"}],"homepage":"https://github.com/ialiaslani/caf#readme","bugs":{"url":"https://github.com/ialiaslani/caf/issues"},"dist":{"shasum":"552725c9d17e23aee07f47e5e1da78b40c030b44","tarball":"https://registry.npmjs.org/@c-a-f/permission/-/permission-1.0.0.tgz","fileCount":28,"integrity":"sha512-TtKzBzH9Kl9onqiwKLUJiU0+xN1o0PMWui2GxPE3eH8gwmqERckawA6cayGjNG2Z8swniWhDrXpedD50nYOmng==","signatures":[{"sig":"MEUCICwJBA6TTduUwlKsjT8Kz7mL010ZJqZDo6qMsfcEdWoQAiEAi/JTIn0JL8UjBnHMxRMB8Ze75WpSwJmRh78NhMSNRPE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":62012},"main":"./.build/index.js","type":"module","types":"./.build/index.d.ts","module":"./.build/index.js","exports":{".":{"node":"./.build/index.js","types":"./.build/index.d.ts","import":"./.build/index.js","default":"./.build/index.js"},"./casl":{"node":"./.build/src/adapters/CaslAdapter.js","types":"./.build/src/adapters/CaslAdapter.d.ts","import":"./.build/src/adapters/CaslAdapter.js","default":"./.build/src/adapters/CaslAdapter.js"},"./simple":{"node":"./.build/src/adapters/SimplePermissionChecker.js","types":"./.build/src/adapters/SimplePermissionChecker.d.ts","import":"./.build/src/adapters/SimplePermissionChecker.js","default":"./.build/src/adapters/SimplePermissionChecker.js"},"./role-based":{"node":"./.build/src/adapters/RoleBasedPermissionChecker.js","types":"./.build/src/adapters/RoleBasedPermissionChecker.d.ts","import":"./.build/src/adapters/RoleBasedPermissionChecker.js","default":"./.build/src/adapters/RoleBasedPermissionChecker.js"},"./time-based":{"node":"./.build/src/adapters/TimeBasedPermissionChecker.js","types":"./.build/src/adapters/TimeBasedPermissionChecker.d.ts","import":"./.build/src/adapters/TimeBasedPermissionChecker.js","default":"./.build/src/adapters/TimeBasedPermissionChecker.js"},"./hierarchical":{"node":"./.build/src/adapters/HierarchicalPermissionChecker.js","types":"./.build/src/adapters/HierarchicalPermissionChecker.d.ts","import":"./.build/src/adapters/HierarchicalPermissionChecker.js","default":"./.build/src/adapters/HierarchicalPermissionChecker.js"},"./policy-based":{"node":"./.build/src/adapters/PolicyBasedPermissionChecker.js","types":"./.build/src/adapters/PolicyBasedPermissionChecker.d.ts","import":"./.build/src/adapters/PolicyBasedPermissionChecker.js","default":"./.build/src/adapters/PolicyBasedPermissionChecker.js"},"./resource-based":{"node":"./.build/src/adapters/ResourceBasedPermissionChecker.js","types":"./.build/src/adapters/ResourceBasedPermissionChecker.d.ts","import":"./.build/src/adapters/ResourceBasedPermissionChecker.js","default":"./.build/src/adapters/ResourceBasedPermissionChecker.js"}},"gitHead":"ca2feba4757534a4a130717ea50c4df2e2ff01e6","scripts":{"test":"vitest run","build":"tsc --build","start":"tsc --watch","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"ialiaslani","email":"aliaslani.mm@gmail.com"},"repository":{"url":"git+https://github.com/ialiaslani/caf.git","type":"git"},"_npmVersion":"10.9.2","description":"Clean Architecture Frontend (CAF) — framework-agnostic permission interfaces and adapters. Role-based, policy-based, CASL, resource-based, hierarchical, time-based.","directories":{},"_nodeVersion":"22.13.0","dependencies":{"@c-a-f/core":"1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","@vitest/coverage-v8":"^2.1.0"},"peerDependencies":{"@casl/ability":"*"},"peerDependenciesMeta":{"@casl/ability":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/permission_1.0.0_1771671099388_0.6512309774108029","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@c-a-f/permission","type":"module","version":"1.0.1","description":"Clean Architecture Frontend (CAF) — framework-agnostic permission interfaces and adapters. Role-based, policy-based, CASL, resource-based, hierarchical, time-based.","keywords":["clean-architecture-frontend","clean-architecture","clean architecture frontend","caf","permission","authorization","access-control","rbac","casl","policy"],"author":{"name":"ali aslani","email":"aliaslani.mm@gmail.com"},"license":"MIT","homepage":"https://docs-caf.vercel.app/docs/packages/permission","repository":{"type":"git","url":"git+https://github.com/ialiaslani/caf.git"},"main":"./.build/index.js","module":"./.build/index.js","types":"./.build/index.d.ts","exports":{".":{"types":"./.build/index.d.ts","import":"./.build/index.js","node":"./.build/index.js","default":"./.build/index.js"},"./role-based":{"types":"./.build/src/adapters/RoleBasedPermissionChecker.d.ts","import":"./.build/src/adapters/RoleBasedPermissionChecker.js","node":"./.build/src/adapters/RoleBasedPermissionChecker.js","default":"./.build/src/adapters/RoleBasedPermissionChecker.js"},"./policy-based":{"types":"./.build/src/adapters/PolicyBasedPermissionChecker.d.ts","import":"./.build/src/adapters/PolicyBasedPermissionChecker.js","node":"./.build/src/adapters/PolicyBasedPermissionChecker.js","default":"./.build/src/adapters/PolicyBasedPermissionChecker.js"},"./simple":{"types":"./.build/src/adapters/SimplePermissionChecker.d.ts","import":"./.build/src/adapters/SimplePermissionChecker.js","node":"./.build/src/adapters/SimplePermissionChecker.js","default":"./.build/src/adapters/SimplePermissionChecker.js"},"./casl":{"types":"./.build/src/adapters/CaslAdapter.d.ts","import":"./.build/src/adapters/CaslAdapter.js","node":"./.build/src/adapters/CaslAdapter.js","default":"./.build/src/adapters/CaslAdapter.js"},"./resource-based":{"types":"./.build/src/adapters/ResourceBasedPermissionChecker.d.ts","import":"./.build/src/adapters/ResourceBasedPermissionChecker.js","node":"./.build/src/adapters/ResourceBasedPermissionChecker.js","default":"./.build/src/adapters/ResourceBasedPermissionChecker.js"},"./hierarchical":{"types":"./.build/src/adapters/HierarchicalPermissionChecker.d.ts","import":"./.build/src/adapters/HierarchicalPermissionChecker.js","node":"./.build/src/adapters/HierarchicalPermissionChecker.js","default":"./.build/src/adapters/HierarchicalPermissionChecker.js"},"./time-based":{"types":"./.build/src/adapters/TimeBasedPermissionChecker.d.ts","import":"./.build/src/adapters/TimeBasedPermissionChecker.js","node":"./.build/src/adapters/TimeBasedPermissionChecker.js","default":"./.build/src/adapters/TimeBasedPermissionChecker.js"}},"scripts":{"build":"tsc --build","start":"tsc --watch","prepublishOnly":"npm run build","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage"},"dependencies":{"@c-a-f/core":"1.0.3"},"peerDependencies":{"@casl/ability":"*"},"peerDependenciesMeta":{"@casl/ability":{"optional":true}},"devDependencies":{"@vitest/coverage-v8":"^2.1.0","vitest":"^2.1.0"},"_id":"@c-a-f/permission@1.0.1","gitHead":"c754b6d68b1a5b1196bb202e70c962ea7c3de87e","bugs":{"url":"https://github.com/ialiaslani/caf/issues"},"_nodeVersion":"22.13.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-sZi9IZRWH1eVfaWvLM9l5DJVJ9RGMscG45h337ShYrhx/Gh5IarcZ0wn+xQMTG+MRrm2CztM5HcjH6d0vv6PZw==","shasum":"a281c5618ecdad09342d88fb4faae69cf70070eb","tarball":"https://registry.npmjs.org/@c-a-f/permission/-/permission-1.0.1.tgz","fileCount":28,"unpackedSize":62336,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIBib0Ru/Ibu8qvZRlhnY5A0MlFXQ8mt2cczmhicYcMVFAiEAvx47uYpaJ3/1qQqYgo7snjRBp7JCgj1VT8oQ3IP923Q="}]},"_npmUser":{"name":"ialiaslani","email":"aliaslani.mm@gmail.com"},"directories":{},"maintainers":[{"name":"ialiaslani","email":"aliaslani.mm@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/permission_1.0.1_1771679996219_0.972811468124932"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-21T10:51:39.236Z","modified":"2026-02-21T13:19:56.513Z","1.0.0":"2026-02-21T10:51:39.531Z","1.0.1":"2026-02-21T13:19:56.371Z"},"bugs":{"url":"https://github.com/ialiaslani/caf/issues"},"author":{"name":"ali aslani","email":"aliaslani.mm@gmail.com"},"license":"MIT","homepage":"https://docs-caf.vercel.app/docs/packages/permission","keywords":["clean-architecture-frontend","clean-architecture","clean architecture frontend","caf","permission","authorization","access-control","rbac","casl","policy"],"repository":{"type":"git","url":"git+https://github.com/ialiaslani/caf.git"},"description":"Clean Architecture Frontend (CAF) — framework-agnostic permission interfaces and adapters. Role-based, policy-based, CASL, resource-based, hierarchical, time-based.","maintainers":[{"name":"ialiaslani","email":"aliaslani.mm@gmail.com"}],"readme":"# @c-a-f/permission\r\n\r\nFramework-agnostic permission checking interfaces and adapters for CAF. Works with role-based, policy-based, or custom permission strategies.\r\n\r\n**Documentation:** [@c-a-f/permission docs](https://docs-caf.vercel.app/docs/packages/permission)\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @c-a-f/permission\r\n```\r\n\r\n## Usage\r\n\r\n### Core Interfaces\r\n\r\nThe package provides framework-agnostic interfaces that work with any permission checking strategy:\r\n\r\n```typescript\r\nimport { IPermissionChecker, PermissionResult, PermissionManager } from '@c-a-f/permission';\r\n\r\n// IPermissionChecker interface can be implemented by any permission checking adapter\r\ninterface IPermissionChecker {\r\n  check(permission: string): Promise<PermissionResult> | PermissionResult;\r\n  checkAny(permissions: string[]): Promise<PermissionResult> | PermissionResult;\r\n  checkAll(permissions: string[]): Promise<PermissionResult> | PermissionResult;\r\n}\r\n```\r\n\r\n### Permission Manager\r\n\r\nUse `PermissionManager` to provide convenient methods for checking permissions:\r\n\r\n```typescript\r\nimport { PermissionManager, IPermissionChecker } from '@c-a-f/permission';\r\n\r\n// Create a permission checker implementation\r\nclass MyPermissionChecker implements IPermissionChecker {\r\n  check(permission: string): PermissionResult {\r\n    // Your permission checking logic\r\n    return { granted: true };\r\n  }\r\n  checkAny(permissions: string[]): PermissionResult {\r\n    // Your logic\r\n    return { granted: true };\r\n  }\r\n  checkAll(permissions: string[]): PermissionResult {\r\n    // Your logic\r\n    return { granted: true };\r\n  }\r\n}\r\n\r\n// Use PermissionManager\r\nconst checker = new MyPermissionChecker();\r\nconst permissionManager = new PermissionManager(checker);\r\n\r\n// Check permissions\r\nconst canEdit = await permissionManager.hasPermission('user.edit');\r\nconst canDelete = await permissionManager.hasAnyPermission(['user.delete', 'admin.delete']);\r\nconst canManage = await permissionManager.hasAllPermissions(['user.edit', 'user.delete']);\r\n\r\n// Require permissions (throws if denied)\r\nawait permissionManager.requirePermission('user.delete');\r\n```\r\n\r\n## Integration with Role-Based Permissions\r\n\r\n```typescript\r\nimport { RoleBasedPermissionChecker } from '@c-a-f/permission/role-based';\r\nimport { PermissionManager } from '@c-a-f/permission';\r\n\r\n// Define role-to-permission mapping\r\nconst rolePermissions = {\r\n  admin: ['user.create', 'user.edit', 'user.delete', 'admin.dashboard'],\r\n  editor: ['user.edit', 'post.create', 'post.edit'],\r\n  viewer: ['user.view', 'post.view'],\r\n};\r\n\r\n// Create checker with user roles\r\nconst checker = new RoleBasedPermissionChecker(['admin', 'editor'], rolePermissions);\r\nconst permissionManager = new PermissionManager(checker);\r\n\r\n// Check permissions\r\nconst canEdit = await permissionManager.hasPermission('user.edit'); // true\r\nconst canDelete = await permissionManager.hasPermission('user.delete'); // true\r\nconst canView = await permissionManager.hasPermission('user.view'); // true\r\n\r\n// Require permission (throws if denied)\r\nawait permissionManager.requirePermission('admin.dashboard');\r\n```\r\n\r\n## Integration with Policy-Based Permissions\r\n\r\n```typescript\r\nimport { PolicyBasedPermissionChecker } from '@c-a-f/permission/policy-based';\r\nimport { PermissionManager } from '@c-a-f/permission';\r\n\r\n// Define user context\r\ninterface UserContext {\r\n  userId: string;\r\n  roles: string[];\r\n  targetUserId?: string;\r\n}\r\n\r\n// Define policies\r\nconst policies = {\r\n  'user.edit': (context: UserContext) => {\r\n    return context.userId === context.targetUserId || context.roles.includes('admin');\r\n  },\r\n  'post.delete': (context: UserContext & { authorId: string }) => {\r\n    return context.authorId === context.userId || context.roles.includes('admin');\r\n  },\r\n  'admin.dashboard': (context: UserContext) => {\r\n    return context.roles.includes('admin');\r\n  },\r\n};\r\n\r\n// Create checker with user context\r\nconst context: UserContext = {\r\n  userId: '123',\r\n  roles: ['user'],\r\n  targetUserId: '123',\r\n};\r\n\r\nconst checker = new PolicyBasedPermissionChecker(policies, context);\r\nconst permissionManager = new PermissionManager(checker);\r\n\r\n// Check permissions\r\nconst canEdit = await permissionManager.hasPermission('user.edit'); // true (same user)\r\nconst canDelete = await permissionManager.hasPermission('post.delete'); // false (different author)\r\n```\r\n\r\n## Integration with Simple Permissions\r\n\r\n```typescript\r\nimport { SimplePermissionChecker } from '@c-a-f/permission/simple';\r\nimport { PermissionManager } from '@c-a-f/permission';\r\n\r\n// Create checker with user permissions\r\nconst checker = new SimplePermissionChecker([\r\n  'user.view',\r\n  'user.edit',\r\n  'post.create',\r\n]);\r\nconst permissionManager = new PermissionManager(checker);\r\n\r\n// Check permissions\r\nconst canEdit = await permissionManager.hasPermission('user.edit'); // true\r\nconst canDelete = await permissionManager.hasPermission('user.delete'); // false\r\n\r\n// Require permission (throws if denied)\r\ntry {\r\n  await permissionManager.requirePermission('user.delete');\r\n} catch (error) {\r\n  // PermissionDeniedError thrown\r\n}\r\n```\r\n\r\n## Integration with CASL\r\n\r\n```typescript\r\nimport { AbilityBuilder, Ability } from '@casl/ability';\r\nimport { CaslPermissionChecker } from '@c-a-f/permission/casl';\r\nimport { PermissionManager } from '@c-a-f/permission';\r\n\r\n// Define abilities using CASL\r\nconst { can, cannot, build } = new AbilityBuilder(Ability);\r\ncan('read', 'Post');\r\ncan('delete', 'Post', { authorId: '123' });\r\ncan('manage', 'all'); // Admin can do everything\r\n\r\nconst ability = build();\r\n\r\n// Create checker\r\nconst checker = new CaslPermissionChecker(ability);\r\nconst permissionManager = new PermissionManager(checker);\r\n\r\n// Check permissions (CASL uses 'action:subject' format)\r\nconst canRead = await permissionManager.hasPermission('read:Post'); // true\r\nconst canDelete = await permissionManager.hasPermission('delete:Post'); // true (if authorId matches)\r\nconst canManage = await permissionManager.hasPermission('manage:all'); // true\r\n```\r\n\r\n## Integration with Resource-Based Permissions\r\n\r\n```typescript\r\nimport { ResourceBasedPermissionChecker } from '@c-a-f/permission/resource-based';\r\nimport { PermissionManager } from '@c-a-f/permission';\r\n\r\n// Define resource permissions\r\nconst resourcePermissions = {\r\n  user: {\r\n    create: ['admin'],\r\n    read: ['admin', 'user', 'viewer'],\r\n    update: ['admin', 'user'],\r\n    delete: ['admin'],\r\n  },\r\n  post: {\r\n    create: ['admin', 'editor'],\r\n    read: ['admin', 'editor', 'viewer'],\r\n    update: ['admin', 'editor'],\r\n    delete: ['admin'],\r\n  },\r\n};\r\n\r\n// Create checker with user roles\r\nconst checker = new ResourceBasedPermissionChecker(['admin', 'editor'], resourcePermissions);\r\nconst permissionManager = new PermissionManager(checker);\r\n\r\n// Check permissions (format: 'action:resource')\r\nconst canCreate = await permissionManager.hasPermission('create:user'); // true\r\nconst canRead = await permissionManager.hasPermission('read:post'); // true\r\nconst canDelete = await permissionManager.hasPermission('delete:user'); // true\r\n```\r\n\r\n## Integration with Hierarchical Permissions\r\n\r\n```typescript\r\nimport { HierarchicalPermissionChecker } from '@c-a-f/permission/hierarchical';\r\nimport { PermissionManager } from '@c-a-f/permission';\r\n\r\n// Define hierarchical permissions (wildcards supported)\r\nconst userPermissions = [\r\n  'admin.*',           // Grants all admin permissions\r\n  'user.edit.*',       // Grants all user.edit permissions\r\n  'post.create',       // Specific permission\r\n];\r\n\r\n// Create checker\r\nconst checker = new HierarchicalPermissionChecker(userPermissions);\r\nconst permissionManager = new PermissionManager(checker);\r\n\r\n// Check permissions\r\nconst canAdmin = await permissionManager.hasPermission('admin.dashboard'); // true (inherited from admin.*)\r\nconst canEditUser = await permissionManager.hasPermission('user.edit.name'); // true (inherited from user.edit.*)\r\nconst canCreatePost = await permissionManager.hasPermission('post.create'); // true (exact match)\r\nconst canDeletePost = await permissionManager.hasPermission('post.delete'); // false\r\n```\r\n\r\n## Integration with Time-Based Permissions\r\n\r\n```typescript\r\nimport { TimeBasedPermissionChecker } from '@c-a-f/permission/time-based';\r\nimport { SimplePermissionChecker } from '@c-a-f/permission/simple';\r\nimport { PermissionManager } from '@c-a-f/permission';\r\n\r\n// Define time-based permissions\r\nconst timePermissions = {\r\n  'user.edit': {\r\n    allowed: true,\r\n    startTime: new Date('2024-01-01'),\r\n    endTime: new Date('2024-12-31'),\r\n    allowedDays: [1, 2, 3, 4, 5], // Monday to Friday\r\n    allowedHours: { start: 9, end: 17 }, // 9 AM to 5 PM\r\n  },\r\n  'admin.dashboard': {\r\n    allowed: true,\r\n    // No time restrictions\r\n  },\r\n};\r\n\r\n// Create base checker\r\nconst baseChecker = new SimplePermissionChecker(['user.edit', 'admin.dashboard']);\r\n\r\n// Wrap with time-based checker\r\nconst checker = new TimeBasedPermissionChecker(baseChecker, timePermissions);\r\nconst permissionManager = new PermissionManager(checker);\r\n\r\n// Check permissions (will check time constraints)\r\nconst canEdit = await permissionManager.hasPermission('user.edit'); // true if within time constraints\r\nconst canAdmin = await permissionManager.hasPermission('admin.dashboard'); // always true\r\n```\r\n\r\n## Custom Permission Checker Implementation\r\n\r\nYou can implement `IPermissionChecker` for any permission checking strategy:\r\n\r\n```typescript\r\nimport { IPermissionChecker, PermissionResult, PermissionManager } from '@c-a-f/permission';\r\n\r\nclass CustomPermissionChecker implements IPermissionChecker {\r\n  constructor(private userPermissions: string[]) {}\r\n\r\n  check(permission: string): PermissionResult {\r\n    const granted = this.userPermissions.includes(permission);\r\n    return {\r\n      granted,\r\n      reason: granted ? undefined : `Permission '${permission}' not granted`,\r\n    };\r\n  }\r\n\r\n  checkAny(permissions: string[]): PermissionResult {\r\n    const granted = permissions.some(p => this.userPermissions.includes(p));\r\n    return {\r\n      granted,\r\n      reason: granted ? undefined : 'None of the permissions are granted',\r\n    };\r\n  }\r\n\r\n  checkAll(permissions: string[]): PermissionResult {\r\n    const missing = permissions.filter(p => !this.userPermissions.includes(p));\r\n    return {\r\n      granted: missing.length === 0,\r\n      reason: missing.length > 0 ? `Missing permissions: ${missing.join(', ')}` : undefined,\r\n    };\r\n  }\r\n}\r\n\r\n// Use with PermissionManager\r\nconst checker = new CustomPermissionChecker(['user.edit', 'post.create']);\r\nconst permissionManager = new PermissionManager(checker);\r\nconst canEdit = await permissionManager.hasPermission('user.edit');\r\n```\r\n\r\n## Usage in Use Cases and Plocs\r\n\r\n```typescript\r\nimport { UseCase, RequestResult, pulse } from '@c-a-f/core';\r\nimport { PermissionManager, IPermissionChecker } from '@c-a-f/permission';\r\n\r\nclass DeleteUser implements UseCase<[{ userId: string }], void> {\r\n  constructor(\r\n    private userService: UserService,\r\n    private permissionManager: PermissionManager\r\n  ) {}\r\n\r\n  async execute(args: { userId: string }): Promise<RequestResult<void>> {\r\n    // Check permission before proceeding\r\n    await this.permissionManager.requirePermission('user.delete');\r\n\r\n    try {\r\n      await this.userService.deleteUser(args.userId);\r\n      return {\r\n        loading: pulse(false),\r\n        data: pulse(undefined!),\r\n        error: pulse(null! as Error),\r\n      };\r\n    } catch (error) {\r\n      return {\r\n        loading: pulse(false),\r\n        data: pulse(undefined!),\r\n        error: pulse(error as Error),\r\n      };\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n## Exports\r\n\r\n- `IPermissionChecker` — Interface for permission checking implementations\r\n- `PermissionResult` — Result type with granted status and optional reason\r\n- `PermissionManager` — Utility class for checking permissions\r\n- `PermissionDeniedError` — Exception thrown when permission is denied\r\n- `RoleBasedPermissionChecker` — Adapter for role-based permissions (from `@c-a-f/permission/role-based`)\r\n- `PolicyBasedPermissionChecker` — Adapter for policy-based permissions (from `@c-a-f/permission/policy-based`)\r\n- `SimplePermissionChecker` — Adapter for simple permission lists (from `@c-a-f/permission/simple`)\r\n- `CaslPermissionChecker` — Adapter for CASL abilities (from `@c-a-f/permission/casl`)\r\n- `ResourceBasedPermissionChecker` — Adapter for resource-based permissions (from `@c-a-f/permission/resource-based`)\r\n- `HierarchicalPermissionChecker` — Adapter for hierarchical permissions with wildcards (from `@c-a-f/permission/hierarchical`)\r\n- `TimeBasedPermissionChecker` — Adapter for time-based permission constraints (from `@c-a-f/permission/time-based`)\r\n\r\n## Dependencies\r\n\r\n- `@c-a-f/core` — Core primitives\r\n\r\n## Peer Dependencies (Optional)\r\n\r\n- `@casl/ability` — For CASL integration\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md"}