{"_id":"@bernierllc/permission-checker","_rev":"7-e4a793d257835e2492516bd50acb3f2a","name":"@bernierllc/permission-checker","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.1":{"name":"@bernierllc/permission-checker","version":"0.1.1","keywords":["permissions","rbac","access-control","authorization","security","bernierllc"],"author":{"name":"Bernier LLC"},"license":"ISC","_id":"@bernierllc/permission-checker@0.1.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"6c2aa23d5e74df293683569cb31aa915743032d3","tarball":"https://registry.npmjs.org/@bernierllc/permission-checker/-/permission-checker-0.1.1.tgz","fileCount":29,"integrity":"sha512-cY8+h6XuOUDaOOAcgvsu7VoxDDzWhEQfj/KxWXkkYfmwBVDFEM0+DftL6Ku9xTb/uti4oG8ftAcFrEga3ir56Q==","signatures":[{"sig":"MEUCIAI9YZ60h4mAGGzlhc69EtydgWw8LZcMdYIL1tlENXXHAiEA2Npcs3U8bU3xWUB4bD2ySXGEfibNEMIOh8wXSVnZZA4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":130518},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"9723b5baa753b68a4aa12a2bf2e97c8146d4eb23","private":false,"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.4.2","description":"Atomic permission checking utilities for role-based access control","directories":{},"packageType":"core","_nodeVersion":"24.4.1","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/permission-checker_0.1.1_1753832924629_0.25001640835148264","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bernierllc/permission-checker","version":"0.3.0","keywords":["permissions","rbac","access-control","authorization","security","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/permission-checker@0.3.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"2a850df200bf99395aab38fc3a7a933f4067c044","tarball":"https://registry.npmjs.org/@bernierllc/permission-checker/-/permission-checker-0.3.0.tgz","fileCount":29,"integrity":"sha512-G81lnKtWTimUNKN99z9xlvxLOM49cr6LMnnS2ajPxkl1ET++fP8NICp/bj6CAT8XXxWQeYaxmxhIxBH2MGp14Q==","signatures":[{"sig":"MEQCICuBlPd1Kd4YoBF3OUyKraGVP0F7fTL3AjjUPVE3T3SKAiBU2NvXk3lUJ8Qo+zG/kptpJuhcdimLpNTHSV33q84xWQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":133155},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","private":false,"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:84b59c68-3cec-42a8-800a-fb05895a04a4"}},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Atomic permission checking utilities for role-based access control","directories":{},"packageType":"core","_nodeVersion":"20.19.6","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/permission-checker_0.3.0_1767642318477_0.14042113940296885","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@bernierllc/permission-checker","version":"0.3.1","keywords":["permissions","rbac","access-control","authorization","security","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/permission-checker@0.3.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"7cfd06bd1769164a8139b757eed67b640d642b0a","tarball":"https://registry.npmjs.org/@bernierllc/permission-checker/-/permission-checker-0.3.1.tgz","fileCount":29,"integrity":"sha512-zq33esNNEL8YUpPJ8W1yw+CHYZkXVMwy/yH0pYqAuTz3iiWsc3/vU/Midz0YH27jkjLkpzUWZqhDNjen5eQn4A==","signatures":[{"sig":"MEUCICnG3WvsApIRy4Y9GB69+OuPZTZCoGrrKvuJ6MxOVO5kAiEA8uNgaAssiJR9n0Kj0hc9cKfO82MutJJWMAFLrbh2ZYs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":133320},"main":"dist/index.js","_from":"file:bernierllc-permission-checker-0.3.1.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"private":false,"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:84b59c68-3cec-42a8-800a-fb05895a04a4"}},"_resolved":"/tmp/74647450ae19a7b02a2ec76b9f7993c0/bernierllc-permission-checker-0.3.1.tgz","_integrity":"sha512-zq33esNNEL8YUpPJ8W1yw+CHYZkXVMwy/yH0pYqAuTz3iiWsc3/vU/Midz0YH27jkjLkpzUWZqhDNjen5eQn4A==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.11.0","description":"Atomic permission checking utilities for role-based access control","directories":{},"packageType":"core","_nodeVersion":"20.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/permission-checker_0.3.1_1773078043227_0.6355365810559312","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@bernierllc/permission-checker","version":"0.3.2","keywords":["permissions","rbac","access-control","authorization","security","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/permission-checker@0.3.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"b1d7fc4ed619a068d5aef1b543634b6f342682bd","tarball":"https://registry.npmjs.org/@bernierllc/permission-checker/-/permission-checker-0.3.2.tgz","fileCount":29,"integrity":"sha512-VcG6qxgCcbMaOSTaDWdGVGPqvKUdWcKFp/BjeBnm+ItyoRbZ/PnIyvGDE3hivQ76JuCBTJMYZbye5z2umWZQcg==","signatures":[{"sig":"MEUCIDxfgXaoXrxJycBPslPTM+AQNQ0NhtvFbIqkXyxCULlXAiEA35qG64Lt3EOJFOsv1FQQtJpmlwx5pZhbynfBUI8WpCQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":133543},"main":"dist/index.js","_from":"file:bernierllc-permission-checker-0.3.2.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"private":false,"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:84b59c68-3cec-42a8-800a-fb05895a04a4"}},"_resolved":"/tmp/110bd75f2effd0ef261e6478701996b3/bernierllc-permission-checker-0.3.2.tgz","_integrity":"sha512-VcG6qxgCcbMaOSTaDWdGVGPqvKUdWcKFp/BjeBnm+ItyoRbZ/PnIyvGDE3hivQ76JuCBTJMYZbye5z2umWZQcg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.11.0","description":"Atomic permission checking utilities for role-based access control","directories":{},"packageType":"core","_nodeVersion":"20.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/permission-checker_0.3.2_1773081225666_0.6136658583904206","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@bernierllc/permission-checker","version":"0.5.0","keywords":["permissions","rbac","access-control","authorization","security","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","_id":"@bernierllc/permission-checker@0.5.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"f6ca19f7a76c6140aa6879203c4afd0fe32f494e","tarball":"https://registry.npmjs.org/@bernierllc/permission-checker/-/permission-checker-0.5.0.tgz","fileCount":23,"integrity":"sha512-FwZp8OACRJCtjQddyRE4LqH3ip78Psud2xs92uF9XAbRDrf+lmvn4IAwugNMiE+56HFdXhn9n/FERmTiJNI4Eg==","signatures":[{"sig":"MEQCIHcwmFMe9ln/qqYhsD8OLS3afYGyvyonTjvSNeyLwAReAiAxZ4DWDIcGiQ6h4XUQelhYbSTPcsDxoMtW4fC37F3lhA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81270},"main":"dist/index.js","_from":"file:bernierllc-permission-checker-0.5.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"private":false,"scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","lint:fix":"eslint src --ext .ts --fix","prebuild":"npm run clean","test:watch":"jest --watch","test:coverage":"jest --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:84b59c68-3cec-42a8-800a-fb05895a04a4"}},"_resolved":"/home/runner/work/tools/tools/packages/core/permission-checker/bernierllc-permission-checker-0.5.0.tgz","_integrity":"sha512-FwZp8OACRJCtjQddyRE4LqH3ip78Psud2xs92uF9XAbRDrf+lmvn4IAwugNMiE+56HFdXhn9n/FERmTiJNI4Eg==","repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git"},"_npmVersion":"11.14.1","description":"Atomic permission checking utilities for role-based access control","directories":{},"packageType":"core","_nodeVersion":"20.20.2","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/permission-checker_0.5.0_1779241324655_0.050130772914439126","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@bernierllc/permission-checker","version":"0.6.0","private":false,"description":"Atomic permission checking utilities for role-based access control","main":"dist/index.js","types":"dist/index.d.ts","keywords":["permissions","rbac","access-control","authorization","security","bernierllc"],"author":{"name":"Bernier LLC"},"license":"Bernier LLC","repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git"},"bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"homepage":"https://github.com/bernier-llc/tools#readme","devDependencies":{"@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/eslint-plugin":"^6.0.0","@typescript-eslint/parser":"^6.0.0","eslint":"^8.0.0","jest":"^29.5.0","ts-jest":"^29.1.0","typescript":"^5.0.0"},"engines":{"node":">=18.0.0"},"packageType":"core","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build":"tsc","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","lint":"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix","clean":"rm -rf dist","prebuild":"npm run clean"},"_id":"@bernierllc/permission-checker@0.6.0","_integrity":"sha512-CfRxD0V2x03aPqF1RkgJqGJ9UfLa6nOjDS+O20W3xDmF8BMO0jRy5gQ6cAc2hwWv41ei7CpnawT1SM9hNo1YJg==","_resolved":"/home/runner/work/tools/tools/packages/core/permission-checker/bernierllc-permission-checker-0.6.0.tgz","_from":"file:bernierllc-permission-checker-0.6.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-CfRxD0V2x03aPqF1RkgJqGJ9UfLa6nOjDS+O20W3xDmF8BMO0jRy5gQ6cAc2hwWv41ei7CpnawT1SM9hNo1YJg==","shasum":"1f0763051cf2811a5b0f9a8c41dcd263d685933b","tarball":"https://registry.npmjs.org/@bernierllc/permission-checker/-/permission-checker-0.6.0.tgz","fileCount":23,"unpackedSize":81270,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGkjOMP/iBT8ZSlhY7q8mLLH6sE5SqIUBnXdGanNp4sjAiB4OaBMCiftqeRuM4dxmNW9wpH8lJQxJLsEmnLhwIipAw=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:84b59c68-3cec-42a8-800a-fb05895a04a4"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/permission-checker_0.6.0_1779250074045_0.4409767660645705"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-29T23:48:43.860Z","modified":"2026-05-20T04:07:54.316Z","0.1.1":"2025-07-29T23:48:44.877Z","0.3.0":"2026-01-05T19:45:18.620Z","0.3.1":"2026-03-09T17:40:43.359Z","0.3.2":"2026-03-09T18:33:45.822Z","0.5.0":"2026-05-20T01:42:04.854Z","0.6.0":"2026-05-20T04:07:54.195Z"},"bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"Bernier LLC","homepage":"https://github.com/bernier-llc/tools#readme","keywords":["permissions","rbac","access-control","authorization","security","bernierllc"],"repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git"},"description":"Atomic permission checking utilities for role-based access control","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"# @bernierllc/permission-checker\n\nA comprehensive role-based access control (RBAC) and policy-based access control (PBAC) system for Node.js applications.\n\n## Features\n\n- **Role-Based Access Control (RBAC)**: Define roles with permissions and assign them to users\n- **Policy-Based Access Control (PBAC)**: Create complex policies with priority-based evaluation\n- **Role Inheritance**: Roles can inherit permissions from other roles\n- **Conditional Permissions**: Support for time-based, IP-based, and custom conditions\n- **Caching**: Built-in caching for performance optimization\n- **Validation**: Comprehensive validation for all permission entities\n- **TypeScript**: Full TypeScript support with strict typing\n\n## Installation\n\n```bash\nnpm install @bernierllc/permission-checker\n```\n\n## Quick Start\n\n```typescript\nimport { PermissionChecker, Permission, Role, User } from '@bernierllc/permission-checker';\n\n// Create a permission checker instance\nconst checker = new PermissionChecker();\n\n// Define permissions\nconst readPermission: Permission = {\n  id: 'read-users',\n  name: 'Read Users',\n  resource: 'users',\n  action: 'read'\n};\n\n// Define a role\nconst userRole: Role = {\n  id: 'user',\n  name: 'User',\n  permissions: ['read-users']\n};\n\n// Define a user\nconst user: User = {\n  id: 'user1',\n  roles: ['user']\n};\n\n// Add everything to the checker\nchecker.addPermission(readPermission);\nchecker.addRole(userRole);\nchecker.addUser(user);\n\n// Check permissions\nconst result = checker.checkPermission({\n  user,\n  resource: 'users',\n  action: 'read'\n});\n\nconsole.log(result.allowed); // true\n```\n\n## Core Concepts\n\n### Permissions\n\nPermissions define what actions can be performed on what resources.\n\n```typescript\ninterface Permission {\n  id: string;\n  name: string;\n  description?: string;\n  resource: string;\n  action: string;\n  conditions?: PermissionCondition[];\n}\n```\n\n### Roles\n\nRoles group permissions together and can be assigned to users.\n\n```typescript\ninterface Role {\n  id: string;\n  name: string;\n  description?: string;\n  permissions: string[]; // Permission IDs\n  inherits?: string[]; // Role IDs to inherit from\n}\n```\n\n### Users\n\nUsers have roles and can optionally have direct permissions.\n\n```typescript\ninterface User {\n  id: string;\n  roles: string[]; // Role IDs\n  permissions?: string[]; // Direct permission IDs (optional)\n  metadata?: Record<string, any>;\n}\n```\n\n### Policies\n\nPolicies provide fine-grained control with priority-based evaluation.\n\n```typescript\ninterface Policy {\n  id: string;\n  name: string;\n  description?: string;\n  rules: PolicyRule[];\n  priority: number; // Higher numbers = higher priority\n  enabled: boolean;\n}\n```\n\n## Advanced Usage\n\n### Role Inheritance\n\n```typescript\nconst readerRole: Role = {\n  id: 'reader',\n  name: 'Reader',\n  permissions: ['read-users']\n};\n\nconst writerRole: Role = {\n  id: 'writer',\n  name: 'Writer',\n  permissions: ['write-users'],\n  inherits: ['reader'] // Inherits read permissions\n};\n\nconst user: User = {\n  id: 'user1',\n  roles: ['writer']\n};\n\n// User will have both read and write permissions\nconst permissions = checker.getUserPermissions('user1');\n```\n\n### Conditional Permissions\n\n```typescript\nconst timeRestrictedPermission: Permission = {\n  id: 'time-limited-read',\n  name: 'Time Limited Read',\n  resource: 'data',\n  action: 'read',\n  conditions: [{\n    type: 'time',\n    operator: 'between',\n    field: 'timestamp',\n    value: [startTime, endTime]\n  }]\n};\n\nconst result = checker.checkPermission({\n  user,\n  resource: 'data',\n  action: 'read',\n  context: { timestamp: new Date() }\n});\n```\n\n### Policy-Based Access Control\n\n```typescript\nconst denySensitivePolicy: Policy = {\n  id: 'deny-sensitive',\n  name: 'Deny Sensitive Data',\n  priority: 200,\n  enabled: true,\n  rules: [{\n    effect: 'deny',\n    resources: ['sensitive-data'],\n    actions: ['*'],\n    conditions: [{\n      type: 'ip',\n      operator: 'not_in',\n      field: 'ipAddress',\n      value: ['192.168.1.1', '192.168.1.2']\n    }]\n  }]\n};\n\nchecker.addPolicy(denySensitivePolicy);\n```\n\n### Caching\n\nThe permission checker includes built-in caching for performance:\n\n```typescript\n// Disable caching\nconst checker = new PermissionChecker({ cacheEnabled: false });\n\n// Set custom cache TTL (in milliseconds)\nconst checker = new PermissionChecker({ cacheTTL: 60000 }); // 1 minute\n\n// Clear cache\nchecker.clearCache();\n\n// Invalidate specific cache entries\nchecker.invalidateCache('user1');\n```\n\n## API Reference\n\n### PermissionChecker\n\n#### Constructor\n\n```typescript\nnew PermissionChecker(options?: {\n  cacheEnabled?: boolean;\n  cacheTTL?: number;\n})\n```\n\n#### Methods\n\n##### Permission Management\n\n- `addPermission(permission: Permission): void`\n- `removePermission(permissionId: string): void`\n\n##### Role Management\n\n- `addRole(role: Role): void`\n- `removeRole(roleId: string): void`\n- `getRolePermissions(roleId: string): Permission[]`\n\n##### User Management\n\n- `addUser(user: User): void`\n- `removeUser(userId: string): void`\n- `assignRoleToUser(userId: string, roleId: string): void`\n- `removeRoleFromUser(userId: string, roleId: string): void`\n- `getUserPermissions(userId: string): Permission[]`\n\n##### Permission Checking\n\n- `checkPermission(check: PermissionCheck): PermissionResult`\n\n##### Policy Management\n\n- `addPolicy(policy: Policy): void`\n- `removePolicy(policyId: string): void`\n\n##### Cache Management\n\n- `clearCache(): void`\n- `invalidateCache(pattern?: string): void`\n\n### Validation Utilities\n\n```typescript\nimport {\n  validatePermission,\n  validateRole,\n  validateUser,\n  validatePolicy,\n  generateId\n} from '@bernierllc/permission-checker';\n\n// Validate entities before adding them\nconst validation = validatePermission(permission);\nif (!validation.isValid) {\n  console.log('Errors:', validation.errors);\n  console.log('Warnings:', validation.warnings);\n}\n\n// Generate unique IDs\nconst permissionId = generateId('permission');\n```\n\n## Condition Types\n\n### Time Conditions\n\n```typescript\n{\n  type: 'time',\n  operator: 'between',\n  field: 'timestamp',\n  value: [startTime, endTime]\n}\n```\n\n### IP Conditions\n\n```typescript\n{\n  type: 'ip',\n  operator: 'in',\n  field: 'ipAddress',\n  value: ['192.168.1.1', '192.168.1.2']\n}\n```\n\n### Resource Conditions\n\n```typescript\n{\n  type: 'resource',\n  operator: 'equals',\n  field: 'owner',\n  value: 'user123'\n}\n```\n\n### Custom Conditions\n\n```typescript\n{\n  type: 'custom',\n  operator: 'in',\n  field: 'department',\n  value: ['engineering', 'product']\n}\n```\n\n## Operators\n\n- `equals`: Exact match\n- `not_equals`: Not equal\n- `in`: Value is in array\n- `not_in`: Value is not in array\n- `greater_than`: Numeric comparison\n- `less_than`: Numeric comparison\n- `between`: Value is between two numbers (inclusive)\n\n## Performance Considerations\n\n- **Caching**: Enable caching for frequently checked permissions\n- **Role Hierarchy**: Keep role inheritance chains short\n- **Policy Priority**: Use higher priorities sparingly\n- **Condition Evaluation**: Complex conditions impact performance\n\n## Best Practices\n\n1. **Use Descriptive IDs**: Use kebab-case for IDs (e.g., `read-users`)\n2. **Validate Input**: Always validate permissions, roles, and users before adding\n3. **Cache Strategically**: Enable caching for read-heavy workloads\n4. **Monitor Performance**: Watch for slow permission checks in production\n5. **Test Thoroughly**: Test complex permission scenarios\n\n## Examples\n\nSee the `examples/` directory for comprehensive usage examples:\n\n- Basic RBAC setup\n- Policy-based access control\n- Conditional permissions\n- Role inheritance\n- Caching strategies\n\n## License\n\nISC License - see LICENSE file for details.\n\n## Contributing\n\nThis package is part of the Bernier LLC tools ecosystem. Please follow the project's contribution guidelines. ","readmeFilename":"README.md"}