{"_id":"@ahksolution/permissions-sdk","_rev":"11-b508023c7a3776ea4f1891745911e318","name":"@ahksolution/permissions-sdk","dist-tags":{"latest":"1.7.0"},"versions":{"1.0.0":{"name":"@ahksolution/permissions-sdk","version":"1.0.0","keywords":["permissions","rbac","abac","grpc","nestjs","microservice","authorization"],"author":{"name":"AHK"},"license":"MIT","_id":"@ahksolution/permissions-sdk@1.0.0","maintainers":[{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"}],"homepage":"https://github.com/ahksolution/permissions-sdk#readme","bugs":{"url":"https://github.com/ahksolution/permissions-sdk/issues"},"dist":{"shasum":"37d7a26e8bccb50f0d78c711c12e627037b63070","tarball":"https://registry.npmjs.org/@ahksolution/permissions-sdk/-/permissions-sdk-1.0.0.tgz","fileCount":56,"integrity":"sha512-3GC98VUE3GMX8Qc31DT0pJGTwNwxsLKlHv6Jqb1V8fBaocEFEnXNmRVbB5tP3gyBjFllvgHcSf890V4hf9UaqQ==","signatures":[{"sig":"MEQCIG432wu45cN0isTi/fTQtRYLERCF11FQ4zLq1h62U23vAiB0vgHoecBuaRegsXANSjxwWAnGoRc08aewoFAo6jns9A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84126},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"fdb8531068cc596271e1d67ca93a5f6bb22049ef","scripts":{"lint":"eslint \"src/**/*.ts\"","build":"tsc -p tsconfig.build.json && npm run copy:proto","clean":"rimraf dist","lint:fix":"eslint \"src/**/*.ts\" --fix","prebuild":"npm run clean","copy:proto":"node -e \"const fs=require('fs');const path=require('path');fs.mkdirSync('dist/proto',{recursive:true});fs.copyFileSync('src/proto/permissions.proto','dist/proto/permissions.proto');\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"},"repository":{"url":"git+https://github.com/ahksolution/permissions-sdk.git","type":"git"},"_npmVersion":"10.9.3","description":"gRPC client SDK for AHK Solution Permissions Microservice - provides NestJS guard, decorators, and client for inter-service permission checks","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","rimraf":"^6.1.2","typescript":"^5.7.3","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@grpc/grpc-js":"^1.12.5","@nestjs/common":"^11.0.1","@grpc/proto-loader":"^0.7.13","@nestjs/microservices":"^11.0.1"},"peerDependencies":{"rxjs":"^7.0.0","@nestjs/core":"^11.0.0","@grpc/grpc-js":"^1.12.0","@nestjs/common":"^11.0.0","@grpc/proto-loader":"^0.7.0","@nestjs/microservices":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/permissions-sdk_1.0.0_1768561544987_0.4861673936730484","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@ahksolution/permissions-sdk","version":"1.1.0","keywords":["permissions","rbac","abac","grpc","nestjs","microservice","authorization"],"author":{"name":"AHK"},"license":"MIT","_id":"@ahksolution/permissions-sdk@1.1.0","maintainers":[{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"}],"homepage":"https://github.com/ahksolution/permissions-sdk#readme","bugs":{"url":"https://github.com/ahksolution/permissions-sdk/issues"},"dist":{"shasum":"ea533df2fe166798bf81a743a3e685b4524ded61","tarball":"https://registry.npmjs.org/@ahksolution/permissions-sdk/-/permissions-sdk-1.1.0.tgz","fileCount":72,"integrity":"sha512-UyXOEV0ap7jzeEmDWSbs0KJVPy63t0NxKJKHmEVtelKDncPMBeitqG6XaqWsJuUKOthS6/MOUWVN05Vs7Jypvg==","signatures":[{"sig":"MEQCIA+uqEh0KMwalAP3vydojj2/Jkq+fcUxgmAXs/EjGknDAiBLR++seVIdUWUOY0D2WLa0PIsfACtCqTdYTvA9Q0frag==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109795},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"687dc7105b5b4232d27517e1a19f26cb146357c2","scripts":{"lint":"eslint \"src/**/*.ts\"","build":"tsc -p tsconfig.build.json && npm run copy:proto","clean":"rimraf dist","lint:fix":"eslint \"src/**/*.ts\" --fix","prebuild":"npm run clean","copy:proto":"node -e \"const fs=require('fs');const path=require('path');fs.mkdirSync('dist/proto',{recursive:true});fs.copyFileSync('src/proto/permissions.proto','dist/proto/permissions.proto');\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"},"repository":{"url":"git+https://github.com/ahksolution/permissions-sdk.git","type":"git"},"_npmVersion":"10.9.3","description":"gRPC client SDK for AHK Solution Permissions Microservice - provides NestJS guard, decorators, and client for inter-service permission checks","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","rimraf":"^6.1.2","typescript":"^5.7.3","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@grpc/grpc-js":"^1.12.5","@nestjs/common":"^11.0.1","@grpc/proto-loader":"^0.7.13","@nestjs/microservices":"^11.0.1"},"peerDependencies":{"rxjs":"^7.0.0","@nestjs/core":"^11.0.0","@grpc/grpc-js":"^1.12.0","@nestjs/common":"^11.0.0","@grpc/proto-loader":"^0.7.0","@nestjs/microservices":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/permissions-sdk_1.1.0_1769156719137_0.8408819656311157","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@ahksolution/permissions-sdk","version":"1.1.1","keywords":["permissions","rbac","abac","grpc","nestjs","microservice","authorization"],"author":{"name":"AHK"},"license":"MIT","_id":"@ahksolution/permissions-sdk@1.1.1","maintainers":[{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"}],"homepage":"https://github.com/ahksolution/permissions-sdk#readme","bugs":{"url":"https://github.com/ahksolution/permissions-sdk/issues"},"dist":{"shasum":"0278381c22699842b81ae91f8e097d0af09a5ed4","tarball":"https://registry.npmjs.org/@ahksolution/permissions-sdk/-/permissions-sdk-1.1.1.tgz","fileCount":72,"integrity":"sha512-mI3i0/QLnLjBZ1si2NVH48YWq4SSY84LdeLP4927dECbuT9TDUwEuG3kSsPcGlCYOSgp2Yjfdgp4CkdnW5JNWA==","signatures":[{"sig":"MEUCIQCZskuEECtD2GqTRUh0auN/NQVWUkhrq+TYFkLP3OPi5QIgGIG+usj2St2wvLiQNOlOA8DFc+2aZmwxSQGKIw0EcmI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":113753},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"a0fc21ba070ede3624ebb575aee6ebb3e1c97742","scripts":{"lint":"eslint \"src/**/*.ts\"","build":"tsc -p tsconfig.build.json && npm run copy:proto","clean":"rimraf dist","lint:fix":"eslint \"src/**/*.ts\" --fix","prebuild":"npm run clean","copy:proto":"node -e \"const fs=require('fs');const path=require('path');fs.mkdirSync('dist/proto',{recursive:true});fs.copyFileSync('src/proto/permissions.proto','dist/proto/permissions.proto');\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"},"repository":{"url":"git+https://github.com/ahksolution/permissions-sdk.git","type":"git"},"_npmVersion":"10.9.3","description":"gRPC client SDK for AHK Solution Permissions Microservice - provides NestJS guard, decorators, and client for inter-service permission checks","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","rimraf":"^6.1.2","typescript":"^5.7.3","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@grpc/grpc-js":"^1.12.5","@nestjs/common":"^11.0.1","@grpc/proto-loader":"^0.7.13","@nestjs/microservices":"^11.0.1"},"peerDependencies":{"rxjs":"^7.0.0","@nestjs/core":"^11.0.0","@grpc/grpc-js":"^1.12.0","@nestjs/common":"^11.0.0","@grpc/proto-loader":"^0.7.0","@nestjs/microservices":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/permissions-sdk_1.1.1_1769174914604_0.9642320685472525","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@ahksolution/permissions-sdk","version":"1.1.2","keywords":["permissions","rbac","abac","grpc","nestjs","microservice","authorization"],"author":{"name":"AHK"},"license":"MIT","_id":"@ahksolution/permissions-sdk@1.1.2","maintainers":[{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"}],"homepage":"https://github.com/ahksolution/permissions-sdk#readme","bugs":{"url":"https://github.com/ahksolution/permissions-sdk/issues"},"dist":{"shasum":"56315de9ad1dca51df3c375c22c99e2147bb0969","tarball":"https://registry.npmjs.org/@ahksolution/permissions-sdk/-/permissions-sdk-1.1.2.tgz","fileCount":72,"integrity":"sha512-ZMEyhm4A84gMNXepeuxwKpp0u9Ue4V+n/BDyMX1cE37rAKHh4dQbpUoRe+KfHx6Ey7Fq58pQMfilLv9iYmnSyw==","signatures":[{"sig":"MEYCIQDyGk0JRKwAZMvLfYPSWUVfZm+/rcEBTizH4yogtyDQPwIhAPRR8lf1QyYFKYm+PX7BEQL7TpaXLNq/eKzhVWaJ0UgO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115495},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"a0fc21ba070ede3624ebb575aee6ebb3e1c97742","scripts":{"lint":"eslint \"src/**/*.ts\"","build":"tsc -p tsconfig.build.json && npm run copy:proto","clean":"rimraf dist","lint:fix":"eslint \"src/**/*.ts\" --fix","prebuild":"npm run clean","copy:proto":"node -e \"const fs=require('fs');const path=require('path');fs.mkdirSync('dist/proto',{recursive:true});fs.copyFileSync('src/proto/permissions.proto','dist/proto/permissions.proto');\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"},"repository":{"url":"git+https://github.com/ahksolution/permissions-sdk.git","type":"git"},"_npmVersion":"10.9.3","description":"gRPC client SDK for AHK Solution Permissions Microservice - provides NestJS guard, decorators, and client for inter-service permission checks","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","rimraf":"^6.1.2","typescript":"^5.7.3","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@grpc/grpc-js":"^1.12.5","@nestjs/common":"^11.0.1","@grpc/proto-loader":"^0.7.13","@nestjs/microservices":"^11.0.1"},"peerDependencies":{"rxjs":"^7.0.0","@nestjs/core":"^11.0.0","@grpc/grpc-js":"^1.12.0","@nestjs/common":"^11.0.0","@grpc/proto-loader":"^0.7.0","@nestjs/microservices":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/permissions-sdk_1.1.2_1769179734757_0.9375948500867972","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@ahksolution/permissions-sdk","version":"1.2.0","keywords":["permissions","rbac","abac","grpc","nestjs","microservice","authorization"],"author":{"name":"AHK"},"license":"MIT","_id":"@ahksolution/permissions-sdk@1.2.0","maintainers":[{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"}],"homepage":"https://github.com/ahksolution/permissions-sdk#readme","bugs":{"url":"https://github.com/ahksolution/permissions-sdk/issues"},"dist":{"shasum":"002a86c60df79c122ec1ac7e0a7a6c39359495d9","tarball":"https://registry.npmjs.org/@ahksolution/permissions-sdk/-/permissions-sdk-1.2.0.tgz","fileCount":72,"integrity":"sha512-9zKyC7lbpQgpWI7cvZavt0tmWAAwH7n+XjnV8f2UV0CD1dn0CK112SSVGKR9953Qxi3BCAaZI9hw1ZYNQWznkw==","signatures":[{"sig":"MEYCIQDgFSBXgudKhVATINNnmpGDaZjO9TGHugHKsmuvG9m0MAIhAKTj2FMCrBKCkzjHbJQIJIp5xsj1qRhbzJMcKrLyLNXN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":129867},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"db3e2efe7a6c2f4262a68554687f4d914c09276d","scripts":{"lint":"eslint \"src/**/*.ts\"","build":"tsc -p tsconfig.build.json && npm run copy:proto","clean":"rimraf dist","lint:fix":"eslint \"src/**/*.ts\" --fix","prebuild":"npm run clean","copy:proto":"node -e \"const fs=require('fs');const path=require('path');fs.mkdirSync('dist/proto',{recursive:true});fs.copyFileSync('src/proto/permissions.proto','dist/proto/permissions.proto');\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"},"repository":{"url":"git+https://github.com/ahksolution/permissions-sdk.git","type":"git"},"_npmVersion":"10.9.3","description":"gRPC client SDK for AHK Solution Permissions Microservice - provides NestJS guard, decorators, and client for inter-service permission checks","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","rimraf":"^6.1.2","typescript":"^5.7.3","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@grpc/grpc-js":"^1.12.5","@nestjs/common":"^11.0.1","@grpc/proto-loader":"^0.7.13","@nestjs/microservices":"^11.0.1"},"peerDependencies":{"rxjs":"^7.0.0","@nestjs/core":"^11.0.0","@grpc/grpc-js":"^1.12.0","@nestjs/common":"^11.0.0","@grpc/proto-loader":"^0.7.0","@nestjs/microservices":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/permissions-sdk_1.2.0_1769430999924_0.8246039377644825","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@ahksolution/permissions-sdk","version":"1.2.1","keywords":["permissions","rbac","abac","grpc","nestjs","microservice","authorization"],"author":{"name":"AHK"},"license":"MIT","_id":"@ahksolution/permissions-sdk@1.2.1","maintainers":[{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"}],"homepage":"https://github.com/ahksolution/permissions-sdk#readme","bugs":{"url":"https://github.com/ahksolution/permissions-sdk/issues"},"dist":{"shasum":"7167547583d27531dbaf528e037984e1f0c91e71","tarball":"https://registry.npmjs.org/@ahksolution/permissions-sdk/-/permissions-sdk-1.2.1.tgz","fileCount":72,"integrity":"sha512-RHoWlszqkBi41v6b959rcvgnnuB/jQkhSdX22X0wFTFbpac2PSM6J+lUfK7N+Zsr5lKLtvz9cpPjEojbBbpfDw==","signatures":[{"sig":"MEUCIF2lYM72ZX2t7iIfxhlBvNBtFTm55hZfHIBvOP7GTYgRAiEAkGlBJAFmh62VMvyRDYRYFx0Vu7p7OGlJPtUPh2zmTTs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":130165},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"3302c3c88436a3690067317fa96cb15316164009","scripts":{"lint":"eslint \"src/**/*.ts\"","build":"tsc -p tsconfig.build.json && npm run copy:proto","clean":"rimraf dist","lint:fix":"eslint \"src/**/*.ts\" --fix","prebuild":"npm run clean","copy:proto":"node -e \"const fs=require('fs');const path=require('path');fs.mkdirSync('dist/proto',{recursive:true});fs.copyFileSync('src/proto/permissions.proto','dist/proto/permissions.proto');\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"},"repository":{"url":"git+https://github.com/ahksolution/permissions-sdk.git","type":"git"},"_npmVersion":"10.9.3","description":"gRPC client SDK for AHK Solution Permissions Microservice - provides NestJS guard, decorators, and client for inter-service permission checks","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","rimraf":"^6.1.2","typescript":"^5.7.3","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@grpc/grpc-js":"^1.12.5","@nestjs/common":"^11.0.1","@grpc/proto-loader":"^0.7.13","@nestjs/microservices":"^11.0.1"},"peerDependencies":{"rxjs":"^7.0.0","@nestjs/core":"^11.0.0","@grpc/grpc-js":"^1.12.0","@nestjs/common":"^11.0.0","@grpc/proto-loader":"^0.7.0","@nestjs/microservices":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/permissions-sdk_1.2.1_1769501143837_0.9967381659924786","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@ahksolution/permissions-sdk","version":"1.3.0","keywords":["permissions","rbac","abac","grpc","nestjs","microservice","authorization"],"author":{"name":"AHK"},"license":"MIT","_id":"@ahksolution/permissions-sdk@1.3.0","maintainers":[{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"}],"homepage":"https://github.com/ahksolution/permissions-sdk#readme","bugs":{"url":"https://github.com/ahksolution/permissions-sdk/issues"},"dist":{"shasum":"d0493d1012a4ca128b63567f335318f520f84d95","tarball":"https://registry.npmjs.org/@ahksolution/permissions-sdk/-/permissions-sdk-1.3.0.tgz","fileCount":72,"integrity":"sha512-qwhpHrjArCUf40YgiyKQRaLgecP6JXCXj8ULLvQIZpDazQrx2ziS5jAclNwHSA6B5h7b01BCYGxbeZi0YtO5mw==","signatures":[{"sig":"MEUCIFyVPFvbhdE5jw7DEzKs4HkBi2S3nSUzHN9Rj+gjrjnZAiEAuGkGyccgK2a9leWCv53IpotCuJtpD7kykC7PL8p1FlA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":132158},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"2ca2ae6d4c4517abdda2abae134f99d97c7fa436","scripts":{"lint":"eslint \"src/**/*.ts\"","build":"tsc -p tsconfig.build.json && npm run copy:proto","clean":"rimraf dist","lint:fix":"eslint \"src/**/*.ts\" --fix","prebuild":"npm run clean","copy:proto":"node -e \"const fs=require('fs');const path=require('path');fs.mkdirSync('dist/proto',{recursive:true});fs.copyFileSync('src/proto/permissions.proto','dist/proto/permissions.proto');\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"},"repository":{"url":"git+https://github.com/ahksolution/permissions-sdk.git","type":"git"},"_npmVersion":"10.9.3","description":"gRPC client SDK for AHK Solution Permissions Microservice - provides NestJS guard, decorators, and client for inter-service permission checks","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","rimraf":"^6.1.2","typescript":"^5.7.3","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@grpc/grpc-js":"^1.12.5","@nestjs/common":"^11.0.1","@grpc/proto-loader":"^0.7.13","@nestjs/microservices":"^11.0.1"},"peerDependencies":{"rxjs":"^7.0.0","@nestjs/core":"^11.0.0","@grpc/grpc-js":"^1.12.0","@nestjs/common":"^11.0.0","@grpc/proto-loader":"^0.7.0","@nestjs/microservices":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/permissions-sdk_1.3.0_1770025333815_0.8246959082030616","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@ahksolution/permissions-sdk","version":"1.3.1","keywords":["permissions","rbac","abac","grpc","nestjs","microservice","authorization"],"author":{"name":"AHK"},"license":"MIT","_id":"@ahksolution/permissions-sdk@1.3.1","maintainers":[{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"}],"homepage":"https://github.com/ahksolution/permissions-sdk#readme","bugs":{"url":"https://github.com/ahksolution/permissions-sdk/issues"},"dist":{"shasum":"86e5980e2dcd22afe3227d80a6248109d267a14a","tarball":"https://registry.npmjs.org/@ahksolution/permissions-sdk/-/permissions-sdk-1.3.1.tgz","fileCount":72,"integrity":"sha512-9RJcgn43f/UgiLiLdNpEvbSpjY4Qxw+GWlYB31l2ST71Om38bD4dzG2tP31pHyKAHaWpAdo8RFBwdK9IpRy9ZQ==","signatures":[{"sig":"MEYCIQCwVAiIHg9bB6X8e25lNYmWvVnqD9zxoqm6tKMCqDyocwIhAOGN3vD9Dlr1i4pY7HV5Ibn8+uclnvPlD55DS07eHl2i","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":166460},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"ab162dc7178d789e1adfb32b73b083c21479506f","scripts":{"lint":"eslint \"src/**/*.ts\"","build":"tsc -p tsconfig.build.json && npm run copy:proto","clean":"rimraf dist","lint:fix":"eslint \"src/**/*.ts\" --fix","prebuild":"npm run clean","copy:proto":"node -e \"const fs=require('fs');const path=require('path');fs.mkdirSync('dist/proto',{recursive:true});fs.copyFileSync('src/proto/permissions.proto','dist/proto/permissions.proto');\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"},"repository":{"url":"git+https://github.com/ahksolution/permissions-sdk.git","type":"git"},"_npmVersion":"10.9.3","description":"gRPC client SDK for AHK Solution Permissions Microservice - provides NestJS guard, decorators, and client for inter-service permission checks","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","rimraf":"^6.1.2","typescript":"^5.7.3","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@grpc/grpc-js":"^1.12.5","@nestjs/common":"^11.0.1","@grpc/proto-loader":"^0.7.13","@nestjs/microservices":"^11.0.1"},"peerDependencies":{"rxjs":"^7.0.0","@nestjs/core":"^11.0.0","@grpc/grpc-js":"^1.12.0","@nestjs/common":"^11.0.0","@grpc/proto-loader":"^0.7.0","@nestjs/microservices":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/permissions-sdk_1.3.1_1770136534179_0.7217216480288078","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@ahksolution/permissions-sdk","version":"1.5.0","keywords":["permissions","rbac","abac","grpc","nestjs","microservice","authorization"],"author":{"name":"AHK"},"license":"MIT","_id":"@ahksolution/permissions-sdk@1.5.0","maintainers":[{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"}],"homepage":"https://github.com/ahksolution/permissions-sdk#readme","bugs":{"url":"https://github.com/ahksolution/permissions-sdk/issues"},"dist":{"shasum":"367b2fc9a5eeac2d10f46c208655b1e185d1b354","tarball":"https://registry.npmjs.org/@ahksolution/permissions-sdk/-/permissions-sdk-1.5.0.tgz","fileCount":76,"integrity":"sha512-BiR/poaOOPIVoPCoWJULV3DWFVmQx+u1tAaBgTEH2BDwK+mZZcNU8ymS2OuG5f5FrCylNoLTgQ+TK1KjiOBbYg==","signatures":[{"sig":"MEUCIQD6j5CkeL3cRpscWpv3wRkP1YPARlMqmBMtSGM22pg1agIgbhPwO7oiYmapCDx2OQzNOkWblFTMhOTwf12M7p9L3Cw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":186863},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"77bf243ba49bb7e82ae5bb222da44512982a7f84","scripts":{"lint":"eslint \"src/**/*.ts\"","build":"tsc -p tsconfig.build.json && npm run copy:proto","clean":"rimraf dist","lint:fix":"eslint \"src/**/*.ts\" --fix","prebuild":"npm run clean","copy:proto":"node -e \"const fs=require('fs');const path=require('path');fs.mkdirSync('dist/proto',{recursive:true});fs.copyFileSync('src/proto/permissions.proto','dist/proto/permissions.proto');\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"},"repository":{"url":"git+https://github.com/ahksolution/permissions-sdk.git","type":"git"},"_npmVersion":"10.9.3","description":"gRPC client SDK for AHK Solution Permissions Microservice - provides NestJS guard, decorators, and client for inter-service permission checks","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","rimraf":"^6.1.2","typescript":"^5.7.3","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@grpc/grpc-js":"^1.12.5","@nestjs/common":"^11.0.1","@grpc/proto-loader":"^0.7.13","@nestjs/microservices":"^11.0.1"},"peerDependencies":{"rxjs":"^7.0.0","@nestjs/core":"^11.0.0","@grpc/grpc-js":"^1.12.0","@nestjs/common":"^11.0.0","@grpc/proto-loader":"^0.7.0","@nestjs/microservices":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/permissions-sdk_1.5.0_1772011573479_0.269253699865984","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@ahksolution/permissions-sdk","version":"1.6.0","keywords":["permissions","rbac","abac","grpc","nestjs","microservice","authorization"],"author":{"name":"AHK"},"license":"MIT","_id":"@ahksolution/permissions-sdk@1.6.0","maintainers":[{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"}],"homepage":"https://github.com/ahksolution/permissions-sdk#readme","bugs":{"url":"https://github.com/ahksolution/permissions-sdk/issues"},"dist":{"shasum":"582e875a92ebb361c24d0ae8f3b35861d18a0aa3","tarball":"https://registry.npmjs.org/@ahksolution/permissions-sdk/-/permissions-sdk-1.6.0.tgz","fileCount":80,"integrity":"sha512-NZt2BqtO1zVjJP5oE7mg9uCNtT9kb9zE6bvnH6r2Qe2zZwjLtUlluscikTIueBkO5Pq0PQjdUztUoksTCwGrGw==","signatures":[{"sig":"MEYCIQDpYIEQH6PH8fMdCm77qhS/Fa3QrMCqCWPlY3KrfNtA1wIhAKpYBMVm/Pk6/jx/lQdp02Ho7BSDFQLahIOWlK4V0pHs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":203765},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"39fe9e16fe34e3cf124283a185ad8cee6b80c3b3","scripts":{"lint":"eslint \"src/**/*.ts\"","build":"tsc -p tsconfig.build.json && npm run copy:proto","clean":"rimraf dist","lint:fix":"eslint \"src/**/*.ts\" --fix","prebuild":"npm run clean","copy:proto":"node -e \"const fs=require('fs');const path=require('path');fs.mkdirSync('dist/proto',{recursive:true});fs.copyFileSync('src/proto/permissions.proto','dist/proto/permissions.proto');\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"},"repository":{"url":"git+https://github.com/ahksolution/permissions-sdk.git","type":"git"},"_npmVersion":"10.9.3","description":"gRPC client SDK for AHK Solution Permissions Microservice - provides NestJS guard, decorators, and client for inter-service permission checks","directories":{},"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","rimraf":"^6.1.2","typescript":"^5.7.3","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@grpc/grpc-js":"^1.12.5","@nestjs/common":"^11.0.1","@grpc/proto-loader":"^0.7.13","@nestjs/microservices":"^11.0.1"},"peerDependencies":{"rxjs":"^7.0.0","@nestjs/core":"^11.0.0","@grpc/grpc-js":"^1.12.0","@nestjs/common":"^11.0.0","@grpc/proto-loader":"^0.7.0","@nestjs/microservices":"^11.0.0"},"_npmOperationalInternal":{"tmp":"tmp/permissions-sdk_1.6.0_1772088056518_0.5339585861924667","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@ahksolution/permissions-sdk","version":"1.7.0","description":"gRPC client SDK for AHK Solution Permissions Microservice - provides NestJS guard, decorators, and client for inter-service permission checks","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc -p tsconfig.build.json && npm run copy:proto","copy:proto":"node -e \"const fs=require('fs');const path=require('path');fs.mkdirSync('dist/proto',{recursive:true});fs.copyFileSync('src/proto/permissions.proto','dist/proto/permissions.proto');\"","clean":"rimraf dist","prebuild":"npm run clean","prepublishOnly":"npm run build","lint":"eslint \"src/**/*.ts\"","lint:fix":"eslint \"src/**/*.ts\" --fix"},"keywords":["permissions","rbac","abac","grpc","nestjs","microservice","authorization"],"author":{"name":"AHK"},"license":"MIT","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/ahksolution/permissions-sdk.git"},"peerDependencies":{"@nestjs/common":"^11.0.0","@nestjs/core":"^11.0.0","@nestjs/microservices":"^11.0.0","@grpc/grpc-js":"^1.12.0","@grpc/proto-loader":"^0.7.0","rxjs":"^7.0.0"},"devDependencies":{"@nestjs/common":"^11.0.1","@nestjs/core":"^11.0.1","@nestjs/microservices":"^11.0.1","@grpc/grpc-js":"^1.12.5","@grpc/proto-loader":"^0.7.13","@types/node":"^22.10.7","rimraf":"^6.1.2","rxjs":"^7.8.1","typescript":"^5.7.3"},"engines":{"node":">=18.0.0"},"_id":"@ahksolution/permissions-sdk@1.7.0","gitHead":"86d82e9121fcb2c04bde6a9e845d2eb5dadbe1ad","bugs":{"url":"https://github.com/ahksolution/permissions-sdk/issues"},"homepage":"https://github.com/ahksolution/permissions-sdk#readme","_nodeVersion":"22.19.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-LbsYnyLihJ/p+JJApVQumyfTqPLmwY8eQ9aHt2m0cOc/4kVcWp2DuSqOPty+UYZmeQFGdDmBSRg28OmSaiX+kg==","shasum":"067c5ff2281f0830fb3ba66a9a368cb0eaa0fed7","tarball":"https://registry.npmjs.org/@ahksolution/permissions-sdk/-/permissions-sdk-1.7.0.tgz","fileCount":80,"unpackedSize":230985,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCqfedLc9NEUsipVxkrsw/O+0kYEywXMFMQN9OlFOVOPwIgXESBJlwgwpZUdVIIjyKg9vGtaTU6/ypqKy9JvjyhZMU="}]},"_npmUser":{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"},"directories":{},"maintainers":[{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/permissions-sdk_1.7.0_1776250132410_0.29719627355452016"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-16T11:05:44.854Z","modified":"2026-04-15T10:48:52.707Z","1.0.0":"2026-01-16T11:05:45.145Z","1.1.0":"2026-01-23T08:25:19.280Z","1.1.1":"2026-01-23T13:28:34.742Z","1.1.2":"2026-01-23T14:48:54.925Z","1.2.0":"2026-01-26T12:36:40.056Z","1.2.1":"2026-01-27T08:05:43.986Z","1.3.0":"2026-02-02T09:42:13.949Z","1.3.1":"2026-02-03T16:35:34.325Z","1.5.0":"2026-02-25T09:26:13.659Z","1.6.0":"2026-02-26T06:40:56.728Z","1.7.0":"2026-04-15T10:48:52.564Z"},"bugs":{"url":"https://github.com/ahksolution/permissions-sdk/issues"},"author":{"name":"AHK"},"license":"MIT","homepage":"https://github.com/ahksolution/permissions-sdk#readme","keywords":["permissions","rbac","abac","grpc","nestjs","microservice","authorization"],"repository":{"type":"git","url":"git+https://github.com/ahksolution/permissions-sdk.git"},"description":"gRPC client SDK for AHK Solution Permissions Microservice - provides NestJS guard, decorators, and client for inter-service permission checks","maintainers":[{"name":"nabeel_ahmed1699","email":"nabeel.ahmed@ahksolution.com"}],"readme":"# @ahksolution/permissions-sdk\r\n\r\ngRPC client SDK for the AHK Solution Permissions Microservice. Provides NestJS integration for:\r\n\r\n- **JWT Authentication** - Validate tokens via gRPC (no JWT secret needed in consuming services)\r\n- **Permission Checks** - RBAC and ABAC support via gRPC\r\n\r\n## Installation\r\n\r\n```bash\r\n# From private npm registry\r\nnpm install @ahksolution/permissions-sdk\r\n\r\n# Or using pnpm\r\npnpm add @ahksolution/permissions-sdk\r\n```\r\n\r\n**Peer Dependencies** (must be installed in your project):\r\n\r\n```bash\r\npnpm add @nestjs/microservices @grpc/grpc-js @grpc/proto-loader\r\n```\r\n\r\n## Quick Start\r\n\r\n### 1. Register the Module\r\n\r\n```typescript\r\n// app.module.ts\r\nimport { Module } from '@nestjs/common';\r\nimport { PermissionsClientModule } from '@ahksolution/permissions-sdk';\r\n\r\n@Module({\r\n  imports: [\r\n    // Static configuration\r\n    PermissionsClientModule.register({\r\n      url: 'localhost:50051',\r\n    }),\r\n  ],\r\n})\r\nexport class AppModule {}\r\n```\r\n\r\n**With async configuration (recommended for production):**\r\n\r\n```typescript\r\n// app.module.ts\r\nimport { Module } from '@nestjs/common';\r\nimport { ConfigModule, ConfigService } from '@nestjs/config';\r\nimport { PermissionsClientModule } from '@ahksolution/permissions-sdk';\r\n\r\n@Module({\r\n  imports: [\r\n    ConfigModule.forRoot(),\r\n    PermissionsClientModule.registerAsync({\r\n      imports: [ConfigModule],\r\n      useFactory: (config: ConfigService) => ({\r\n        url: config.get<string>('PERMISSIONS_SERVICE_URL', 'localhost:50051'),\r\n      }),\r\n      inject: [ConfigService],\r\n    }),\r\n  ],\r\n})\r\nexport class AppModule {}\r\n```\r\n\r\n### 2. Apply Guards Globally (Recommended)\r\n\r\nFor full authentication and authorization, apply both guards globally:\r\n\r\n```typescript\r\n// app.module.ts\r\nimport { Module } from '@nestjs/common';\r\nimport { APP_GUARD } from '@nestjs/core';\r\nimport {\r\n  PermissionsClientModule,\r\n  JwtAuthGuard,\r\n  PermissionsGuard,\r\n} from '@ahksolution/permissions-sdk';\r\n\r\n@Module({\r\n  imports: [PermissionsClientModule.register({ url: 'localhost:50051' })],\r\n  providers: [\r\n    // Order matters: authentication first, then authorization\r\n    { provide: APP_GUARD, useClass: JwtAuthGuard },\r\n    { provide: APP_GUARD, useClass: PermissionsGuard },\r\n  ],\r\n})\r\nexport class AppModule {}\r\n```\r\n\r\n### 3. Use Decorators in Controllers\r\n\r\n```typescript\r\nimport { Controller, Get, Post, Body } from '@nestjs/common';\r\nimport { Public, CurrentUser, RequirePermissions, JwtUserData } from '@ahksolution/permissions-sdk';\r\n\r\n@Controller('orders')\r\nexport class OrdersController {\r\n  // Public route - bypasses JWT authentication\r\n  @Public()\r\n  @Get('health')\r\n  health() {\r\n    return { status: 'ok' };\r\n  }\r\n\r\n  // Authenticated route - no specific permission required\r\n  @Get('me')\r\n  getProfile(@CurrentUser() user: JwtUserData) {\r\n    return {\r\n      id: user.id,\r\n      email: user.email,\r\n      roles: user.roles,\r\n    };\r\n  }\r\n\r\n  // Authenticated + requires specific permission\r\n  @Post()\r\n  @RequirePermissions('orders:create')\r\n  createOrder(@CurrentUser() user: JwtUserData, @Body() dto: CreateOrderDto) {\r\n    return this.orderService.create(user.id, dto);\r\n  }\r\n\r\n  // Get specific user property\r\n  @Get('my-orders')\r\n  @RequirePermissions('orders:read')\r\n  getMyOrders(@CurrentUser('id') userId: string) {\r\n    return this.orderService.findByUser(userId);\r\n  }\r\n}\r\n```\r\n\r\n## JWT Authentication\r\n\r\nThe SDK provides JWT authentication that validates tokens via gRPC call to the permissions service. **No JWT secret is required in consuming services** - all validation happens centrally.\r\n\r\n### How It Works\r\n\r\n1. `JwtAuthGuard` extracts the token from `Authorization: Bearer <token>` header\r\n2. Calls `ValidateToken` gRPC method on the permissions service\r\n3. Permissions service verifies the token and returns user data\r\n4. User data (with roles and permissions) is attached to `request.user`\r\n\r\n### JwtUserData Type\r\n\r\n```typescript\r\ninterface JwtUserData {\r\n  id: string;\r\n  email: string | null;\r\n  phone: string | null;\r\n  userType: string;\r\n  status: string;\r\n  isProfileComplete: boolean;\r\n  roles: RoleInfo[]; // User's roles\r\n  permissions: string[]; // User's permission codes\r\n  hasAllAccess: boolean; // True if user has wildcard access\r\n}\r\n\r\ninterface RoleInfo {\r\n  id: string;\r\n  code: string;\r\n  name: string;\r\n  isSystem: boolean;\r\n}\r\n```\r\n\r\n### Decorators\r\n\r\n| Decorator            | Description                                      |\r\n| -------------------- | ------------------------------------------------ |\r\n| `@Public()`          | Mark route as public (bypass JWT authentication) |\r\n| `@CurrentUser()`     | Get full user object from request                |\r\n| `@CurrentUser('id')` | Get specific property from user                  |\r\n\r\n## Permission Checking\r\n\r\n### Using Decorators (Recommended)\r\n\r\n```typescript\r\nimport {\r\n  RequirePermissions,\r\n  RequireAnyPermission,\r\n  RequireAllPermissions,\r\n} from '@ahksolution/permissions-sdk';\r\n\r\n@Controller('orders')\r\nexport class OrdersController {\r\n  // Require a single permission\r\n  @Post()\r\n  @RequirePermissions('orders:create')\r\n  create() {}\r\n\r\n  // Require ALL permissions (AND logic) - default behavior\r\n  @Post(':id/approve')\r\n  @RequirePermissions(['orders:read', 'orders:approve'])\r\n  approve() {}\r\n\r\n  // Require ANY of the permissions (OR logic)\r\n  @Delete(':id')\r\n  @RequirePermissions(['orders:delete', 'admin:full'], { mode: 'any' })\r\n  delete() {}\r\n\r\n  // Using alias decorators for clarity\r\n  @Post(':id/export')\r\n  @RequireAllPermissions(['orders:read', 'orders:export'])\r\n  export() {}\r\n\r\n  @Post(':id/cancel')\r\n  @RequireAnyPermission(['orders:cancel', 'orders:manage'])\r\n  cancel() {}\r\n}\r\n```\r\n\r\n### Using the Client Service\r\n\r\nInject `PermissionsGrpcClient` to check permissions programmatically:\r\n\r\n```typescript\r\nimport { Injectable } from '@nestjs/common';\r\nimport { PermissionsGrpcClient } from '@ahksolution/permissions-sdk';\r\n\r\n@Injectable()\r\nexport class OrderService {\r\n  constructor(private readonly permissions: PermissionsGrpcClient) {}\r\n\r\n  async createOrder(userId: string, orderData: CreateOrderDto) {\r\n    // Simple boolean check\r\n    const canCreate = await this.permissions.hasPermission(userId, 'orders:create');\r\n    if (!canCreate) {\r\n      throw new ForbiddenException('You do not have permission to create orders');\r\n    }\r\n\r\n    // Continue with order creation...\r\n  }\r\n\r\n  async deleteOrder(userId: string, orderId: string) {\r\n    // Check multiple permissions (user needs ANY of these)\r\n    const canDelete = await this.permissions.hasAnyPermission(userId, [\r\n      'orders:delete',\r\n      'orders:manage',\r\n      'admin:full',\r\n    ]);\r\n\r\n    if (!canDelete) {\r\n      throw new ForbiddenException('You do not have permission to delete orders');\r\n    }\r\n\r\n    // Continue with deletion...\r\n  }\r\n}\r\n```\r\n\r\n## API Reference\r\n\r\n### Guards\r\n\r\n| Guard              | Description                                                  |\r\n| ------------------ | ------------------------------------------------------------ |\r\n| `JwtAuthGuard`     | Validates JWT tokens via gRPC. Attaches user to request.     |\r\n| `PermissionsGuard` | Checks permissions based on `@RequirePermissions` decorator. |\r\n\r\n### PermissionsGrpcClient\r\n\r\n| Method                                                    | Description                                                 |\r\n| --------------------------------------------------------- | ----------------------------------------------------------- |\r\n| `validateToken(token)`                                    | Validates JWT and returns `ValidateTokenResult`             |\r\n| `hasPermission(userId, permissionCode)`                   | Returns `boolean` - does user have this permission?         |\r\n| `hasAllPermissions(userId, permissionCodes)`              | Returns `boolean` - does user have ALL permissions?         |\r\n| `hasAnyPermission(userId, permissionCodes)`               | Returns `boolean` - does user have ANY permission?          |\r\n| `checkPermission(userId, permissionCode, options?)`       | Returns full `EvaluationResult` with details                |\r\n| `checkBulkPermissions(userId, permissionCodes, options?)` | Returns results for multiple permissions                    |\r\n| `getEffectivePermissions(userId)`                         | Returns all permissions and roles for a user                |\r\n| `getUserInfo(userId)`                                     | Returns complete user profile with roles & permissions      |\r\n| `getUserRoles(userId)`                                    | Returns user's roles only                                   |\r\n| `getUserPermissions(userId)`                              | Returns user's permission codes only                        |\r\n| `getBulkUserInfo(userIds, options?)`                      | Returns user data for multiple users with optional flags    |\r\n| `createUser(options)`                                     | Creates a new user with validations and optional magic link |\r\n\r\n### Decorators\r\n\r\n| Decorator                                    | Description                                  |\r\n| -------------------------------------------- | -------------------------------------------- |\r\n| `@Public()`                                  | Mark route as public (bypass JWT auth)       |\r\n| `@CurrentUser()`                             | Get authenticated user from request          |\r\n| `@CurrentUser('property')`                   | Get specific property from user              |\r\n| `@RequirePermissions(permissions, options?)` | Require permission(s) with configurable mode |\r\n| `@RequireAllPermissions(permissions)`        | Shorthand for mode: 'all'                    |\r\n| `@RequireAnyPermission(permissions)`         | Shorthand for mode: 'any'                    |\r\n\r\n### Options\r\n\r\n```typescript\r\ninterface RequirePermissionsOptions {\r\n  // 'all' = user must have ALL permissions (default)\r\n  // 'any' = user must have at least ONE permission\r\n  mode?: 'all' | 'any';\r\n\r\n  // Custom error message when denied\r\n  errorMessage?: string;\r\n\r\n  // Include request params as resource context for ABAC\r\n  includeResourceContext?: boolean;\r\n}\r\n```\r\n\r\n## Advanced Usage\r\n\r\n### Full Evaluation Result\r\n\r\nGet detailed information about permission decisions:\r\n\r\n```typescript\r\nconst result = await this.permissions.checkPermission(userId, 'orders:create');\r\n\r\nconsole.log(result);\r\n// {\r\n//   allowed: true,\r\n//   source: 'rbac',           // 'rbac' | 'abac' | 'break-glass' | 'denied'\r\n//   matchedRoles: ['ADMIN'],\r\n//   matchedPolicies: [],\r\n//   reason: 'Permission granted via role(s): ADMIN',\r\n//   evaluationTimeMs: 3\r\n// }\r\n```\r\n\r\n### ABAC Context\r\n\r\nPass resource and request context for attribute-based access control:\r\n\r\n```typescript\r\nconst result = await this.permissions.checkPermission(userId, 'documents:read', {\r\n  resource: {\r\n    id: 'doc-123',\r\n    type: 'document',\r\n    ownerId: 'user-456',\r\n    department: 'engineering',\r\n  },\r\n  request: {\r\n    ip: '192.168.1.100',\r\n    method: 'GET',\r\n    path: '/api/documents/doc-123',\r\n  },\r\n});\r\n```\r\n\r\n### Get All User Permissions\r\n\r\n```typescript\r\nconst effective = await this.permissions.getEffectivePermissions(userId);\r\n\r\nconsole.log(effective);\r\n// {\r\n//   permissions: ['users:read', 'users:create', 'orders:read'],\r\n//   roles: [\r\n//     { id: '...', code: 'USER', name: 'User', isSystem: false },\r\n//     { id: '...', code: 'ORDER_VIEWER', name: 'Order Viewer', isSystem: false }\r\n//   ],\r\n//   version: 1,\r\n//   computedAt: Date\r\n// }\r\n```\r\n\r\n### User Data Methods (v1.2.0+)\r\n\r\nFetch user data directly by userId without token validation. Useful for service-to-service calls.\r\n\r\n```typescript\r\nimport { Injectable, NotFoundException } from '@nestjs/common';\r\nimport { PermissionsGrpcClient } from '@ahksolution/permissions-sdk';\r\n\r\n@Injectable()\r\nexport class UserProfileService {\r\n  constructor(private readonly permissions: PermissionsGrpcClient) {}\r\n\r\n  // Get complete user profile with roles and permissions\r\n  async getUserProfile(userId: string) {\r\n    const result = await this.permissions.getUserInfo(userId);\r\n    if (!result.found) {\r\n      throw new NotFoundException(result.errorMessage); // 'USER_NOT_FOUND' | 'USER_INACTIVE'\r\n    }\r\n    return result.user;\r\n    // {\r\n    //   id: '...',\r\n    //   email: 'user@example.com',\r\n    //   phone: '+1234567890',\r\n    //   userType: 'CUSTOMER',\r\n    //   status: 'ACTIVE',\r\n    //   isProfileComplete: true,\r\n    //   roles: [{ id, code, name, isSystem }],\r\n    //   permissions: ['orders:read', 'orders:create'],\r\n    //   hasAllAccess: false\r\n    // }\r\n  }\r\n\r\n  // Get only user's roles\r\n  async getUserRoleNames(userId: string) {\r\n    const result = await this.permissions.getUserRoles(userId);\r\n    if (!result.found) {\r\n      throw new NotFoundException(result.errorMessage);\r\n    }\r\n    return result.roles.map((r) => r.name); // ['Admin', 'Manager']\r\n  }\r\n\r\n  // Get only user's permissions\r\n  async canAccessFeature(userId: string, featurePermission: string) {\r\n    const result = await this.permissions.getUserPermissions(userId);\r\n    if (!result.found) return false;\r\n\r\n    // Check if user has all access or the specific permission\r\n    return result.hasAllAccess || result.permissions.includes(featurePermission);\r\n  }\r\n}\r\n```\r\n\r\n### Bulk User Data (v1.4.0+)\r\n\r\nFetch data for multiple users in a single gRPC call with optional flags to control what data is returned.\r\n\r\n```typescript\r\nimport { Injectable, NotFoundException } from '@nestjs/common';\r\nimport { PermissionsGrpcClient } from '@ahksolution/permissions-sdk';\r\n\r\n@Injectable()\r\nexport class TeamService {\r\n  constructor(private readonly permissions: PermissionsGrpcClient) {}\r\n\r\n  // Get basic info for multiple users (no roles/permissions)\r\n  async getTeamMembers(userIds: string[]) {\r\n    const result = await this.permissions.getBulkUserInfo(userIds);\r\n\r\n    return Object.entries(result.users)\r\n      .filter(([_, item]) => item.found)\r\n      .map(([userId, item]) => ({\r\n        id: item.user!.id,\r\n        email: item.user!.email,\r\n        name: item.user!.profile?.fullName,\r\n      }));\r\n  }\r\n\r\n  // Get users with their roles included\r\n  async getTeamWithRoles(userIds: string[]) {\r\n    const result = await this.permissions.getBulkUserInfo(userIds, {\r\n      includeRoles: true,\r\n    });\r\n\r\n    return Object.entries(result.users)\r\n      .filter(([_, item]) => item.found)\r\n      .map(([userId, item]) => ({\r\n        id: item.user!.id,\r\n        email: item.user!.email,\r\n        roles: item.user!.roles.map((r) => r.name),\r\n      }));\r\n  }\r\n\r\n  // Get users with both roles and permissions\r\n  async getTeamWithFullAccess(userIds: string[]) {\r\n    const result = await this.permissions.getBulkUserInfo(userIds, {\r\n      includeRoles: true,\r\n      includePermissions: true,\r\n    });\r\n\r\n    return Object.entries(result.users).map(([userId, item]) => {\r\n      if (!item.found) {\r\n        return { userId, error: item.errorMessage };\r\n      }\r\n      return {\r\n        userId,\r\n        email: item.user!.email,\r\n        roles: item.user!.roles,\r\n        permissions: item.user!.permissions,\r\n        hasAllAccess: item.user!.hasAllAccess,\r\n      };\r\n    });\r\n  }\r\n\r\n  // Handle mixed results (some users found, some not)\r\n  async validateUserIds(userIds: string[]) {\r\n    const result = await this.permissions.getBulkUserInfo(userIds);\r\n\r\n    const found: string[] = [];\r\n    const notFound: string[] = [];\r\n    const inactive: string[] = [];\r\n\r\n    for (const [userId, item] of Object.entries(result.users)) {\r\n      if (item.found) {\r\n        found.push(userId);\r\n      } else if (item.errorMessage === 'USER_INACTIVE') {\r\n        inactive.push(userId);\r\n      } else {\r\n        notFound.push(userId);\r\n      }\r\n    }\r\n\r\n    return { found, notFound, inactive };\r\n  }\r\n}\r\n```\r\n\r\n**Options:**\r\n\r\n| Option               | Type      | Default | Description                          |\r\n| -------------------- | --------- | ------- | ------------------------------------ |\r\n| `includeRoles`       | `boolean` | `false` | Include user roles in response       |\r\n| `includePermissions` | `boolean` | `false` | Include user permissions in response |\r\n\r\n**Return Types:**\r\n\r\n```typescript\r\ninterface GetBulkUserInfoResult {\r\n  users: Record<string, BulkUserInfoItem>;\r\n}\r\n\r\ninterface BulkUserInfoItem {\r\n  found: boolean;\r\n  errorMessage?: string; // 'USER_NOT_FOUND' | 'USER_INACTIVE' | 'INTERNAL_ERROR'\r\n  user?: BulkUserData; // Only populated if found=true\r\n}\r\n\r\ninterface BulkUserData {\r\n  id: string;\r\n  email: string | null;\r\n  phone: string | null;\r\n  userType: string;\r\n  status: string;\r\n  isProfileComplete: boolean;\r\n  roles: RoleInfo[]; // Empty array if includeRoles=false\r\n  permissions: string[]; // Empty array if includePermissions=false\r\n  hasAllAccess: boolean;\r\n  profile?: UserProfileData;\r\n}\r\n\r\ninterface GetUserInfoResult {\r\n  found: boolean;\r\n  errorMessage?: string; // 'USER_NOT_FOUND' | 'USER_INACTIVE' | 'INTERNAL_ERROR'\r\n  user?: JwtUserData; // Only populated if found=true\r\n}\r\n\r\ninterface GetUserRolesResult {\r\n  found: boolean;\r\n  errorMessage?: string;\r\n  roles: RoleInfo[];\r\n}\r\n\r\ninterface GetUserPermissionsResult {\r\n  found: boolean;\r\n  errorMessage?: string;\r\n  permissions: string[];\r\n  hasAllAccess: boolean;\r\n}\r\n```\r\n\r\n### Create User (v1.5.0+)\r\n\r\nCreate new users via gRPC with full validation support including email uniqueness, magic link sending, role assignment, and organization assignment.\r\n\r\n```typescript\r\nimport { Injectable, BadRequestException, ConflictException } from '@nestjs/common';\r\nimport { PermissionsGrpcClient, UserType } from '@ahksolution/permissions-sdk';\r\n\r\n@Injectable()\r\nexport class UserManagementService {\r\n  constructor(private readonly permissions: PermissionsGrpcClient) {}\r\n\r\n  // Create an admin user with magic link\r\n  async createAdminUser(email: string, firstName: string, lastName: string) {\r\n    const result = await this.permissions.createUser({\r\n      firstName,\r\n      lastName,\r\n      email,\r\n      userType: UserType.ADMIN,\r\n      sendMagicLink: true, // Default: true\r\n    });\r\n\r\n    if (!result.success) {\r\n      // Handle specific error codes\r\n      if (result.errorCode === 'EMAIL_EXISTS') {\r\n        throw new ConflictException('A user with this email already exists');\r\n      }\r\n      throw new BadRequestException(result.errorMessage);\r\n    }\r\n\r\n    return {\r\n      userId: result.user!.id,\r\n      email: result.user!.email,\r\n      magicLinkSent: result.magicLinkSent,\r\n    };\r\n  }\r\n\r\n  // Create a customer user with roles and organization\r\n  async createCustomerWithRoles(data: {\r\n    firstName: string;\r\n    lastName: string;\r\n    email?: string;\r\n    phone?: string;\r\n    departmentId?: string;\r\n    designationId?: string;\r\n    roleIds?: string[];\r\n  }) {\r\n    const result = await this.permissions.createUser({\r\n      firstName: data.firstName,\r\n      lastName: data.lastName,\r\n      email: data.email,\r\n      phone: data.phone,\r\n      userType: UserType.CUSTOMER,\r\n      departmentId: data.departmentId,\r\n      designationId: data.designationId,\r\n      roleIds: data.roleIds,\r\n      sendMagicLink: false, // Don't send magic link for customers\r\n    });\r\n\r\n    if (!result.success) {\r\n      this.handleCreateUserError(result.errorCode, result.errorMessage);\r\n    }\r\n\r\n    return result.user;\r\n  }\r\n\r\n  private handleCreateUserError(errorCode?: string, errorMessage?: string): never {\r\n    switch (errorCode) {\r\n      case 'EMAIL_EXISTS':\r\n        throw new ConflictException('Email already registered');\r\n      case 'PHONE_EXISTS':\r\n        throw new ConflictException('Phone number already registered');\r\n      case 'INVALID_ROLE':\r\n        throw new BadRequestException('One or more role IDs are invalid');\r\n      case 'INVALID_ORG':\r\n        throw new BadRequestException('Invalid department or designation ID');\r\n      case 'VALIDATION_ERROR':\r\n        throw new BadRequestException(errorMessage ?? 'Validation failed');\r\n      default:\r\n        throw new BadRequestException(errorMessage ?? 'Failed to create user');\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n**Options:**\r\n\r\n```typescript\r\ninterface CreateUserOptions {\r\n  firstName: string; // Required\r\n  lastName: string; // Required\r\n  email?: string; // Required if phone not provided\r\n  phone?: string; // Required if email not provided\r\n  userType: UserType; // Required: UserType.ADMIN or UserType.CUSTOMER\r\n  departmentId?: string; // Optional: Department for org assignment\r\n  designationId?: string; // Optional: Designation for org assignment\r\n  roleIds?: string[]; // Optional: Role IDs to assign to user\r\n  sendMagicLink?: boolean; // Optional: Send magic link email (default: true)\r\n}\r\n\r\nenum UserType {\r\n  ADMIN = 'ADMIN',\r\n  CUSTOMER = 'CUSTOMER',\r\n}\r\n```\r\n\r\n**Return Types:**\r\n\r\n```typescript\r\ninterface CreateUserResult {\r\n  success: boolean;\r\n  errorCode?: string; // 'EMAIL_EXISTS' | 'PHONE_EXISTS' | 'INVALID_ROLE' | 'INVALID_ORG' | 'VALIDATION_ERROR' | 'INTERNAL_ERROR'\r\n  errorMessage?: string;\r\n  user?: CreatedUserData; // Only populated if success=true\r\n  magicLinkSent: boolean;\r\n}\r\n\r\ninterface CreatedUserData {\r\n  id: string;\r\n  email: string | null;\r\n  phone: string | null;\r\n  userType: string;\r\n  status: string;\r\n  profile?: UserProfileData;\r\n}\r\n```\r\n\r\n**Error Codes:**\r\n\r\n| Error Code         | Description                            |\r\n| ------------------ | -------------------------------------- |\r\n| `EMAIL_EXISTS`     | A user with this email already exists  |\r\n| `PHONE_EXISTS`     | A user with this phone number exists   |\r\n| `INVALID_ROLE`     | One or more role IDs are invalid       |\r\n| `INVALID_ORG`      | Invalid department or designation ID   |\r\n| `VALIDATION_ERROR` | General validation error (see message) |\r\n| `INTERNAL_ERROR`   | Server-side error during user creation |\r\n\r\n## Environment Variables\r\n\r\n| Variable                  | Description         | Default           |\r\n| ------------------------- | ------------------- | ----------------- |\r\n| `PERMISSIONS_SERVICE_URL` | gRPC server address | `localhost:50051` |\r\n\r\n## Error Handling\r\n\r\nThe guard throws `ForbiddenException` when permission is denied:\r\n\r\n```typescript\r\n// Default error\r\nthrow new ForbiddenException('Access denied. Required permission(s): orders:create');\r\n\r\n// Custom error message\r\n@RequirePermissions('orders:create', {\r\n  errorMessage: 'You need order creation privileges'\r\n})\r\n```\r\n\r\n## Complete Example\r\n\r\n```typescript\r\n// app.module.ts\r\nimport { Module } from '@nestjs/common';\r\nimport { APP_GUARD } from '@nestjs/core';\r\nimport { ConfigModule, ConfigService } from '@nestjs/config';\r\nimport {\r\n  PermissionsClientModule,\r\n  JwtAuthGuard,\r\n  PermissionsGuard,\r\n} from '@ahksolution/permissions-sdk';\r\n\r\n@Module({\r\n  imports: [\r\n    ConfigModule.forRoot(),\r\n    PermissionsClientModule.registerAsync({\r\n      imports: [ConfigModule],\r\n      useFactory: (config: ConfigService) => ({\r\n        url: config.get('PERMISSIONS_SERVICE_URL', 'localhost:50051'),\r\n      }),\r\n      inject: [ConfigService],\r\n    }),\r\n  ],\r\n  providers: [\r\n    { provide: APP_GUARD, useClass: JwtAuthGuard },\r\n    { provide: APP_GUARD, useClass: PermissionsGuard },\r\n  ],\r\n})\r\nexport class AppModule {}\r\n\r\n// users.controller.ts\r\nimport { Controller, Get, Post, Body, Param } from '@nestjs/common';\r\nimport {\r\n  Public,\r\n  CurrentUser,\r\n  RequirePermissions,\r\n  RequireAnyPermission,\r\n  JwtUserData,\r\n} from '@ahksolution/permissions-sdk';\r\n\r\n@Controller('users')\r\nexport class UsersController {\r\n  // Public endpoint - no auth required\r\n  @Public()\r\n  @Get('health')\r\n  health() {\r\n    return { status: 'ok' };\r\n  }\r\n\r\n  // Auth required, no specific permission\r\n  @Get('profile')\r\n  getProfile(@CurrentUser() user: JwtUserData) {\r\n    return user;\r\n  }\r\n\r\n  // Auth + specific permission required\r\n  @Get()\r\n  @RequirePermissions('users:list')\r\n  findAll() {\r\n    return this.userService.findAll();\r\n  }\r\n\r\n  @Post()\r\n  @RequirePermissions('users:create')\r\n  create(@Body() dto: CreateUserDto, @CurrentUser('id') createdBy: string) {\r\n    return this.userService.create(dto, createdBy);\r\n  }\r\n\r\n  @Get(':id')\r\n  @RequireAnyPermission(['users:read', 'users:manage'])\r\n  findOne(@Param('id') id: string) {\r\n    return this.userService.findOne(id);\r\n  }\r\n}\r\n```\r\n\r\n## Important Notes\r\n\r\n1. **No JWT Secret Required**: The SDK validates tokens via gRPC call to the permissions service. You don't need to configure JWT secrets in consuming services.\r\n\r\n2. **Guard Order Matters**: When using both guards globally, `JwtAuthGuard` must run before `PermissionsGuard` (authentication before authorization).\r\n\r\n3. **Permissions Service Required**: This SDK is a client for the AHK Solution Permissions Microservice. It will not function without a running instance exposing a gRPC endpoint.\r\n\r\n4. **Same-Pod Deployment**: For optimal performance, deploy consuming services in the same pod/network as the permissions service to minimize gRPC latency.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md"}