{"_id":"@blackcherie/nestjs-shared-packages","_rev":"8-8658213f9c37b0dd0734c4c8697e333d","name":"@blackcherie/nestjs-shared-packages","dist-tags":{"latest":"0.1.7"},"versions":{"0.1.0":{"name":"@blackcherie/nestjs-shared-packages","version":"0.1.0","keywords":["nestjs","shared","utilities","redis","sqs","email","bcrypt","guards","zod"],"author":{"name":"Black Cherie"},"license":"MIT","_id":"@blackcherie/nestjs-shared-packages@0.1.0","maintainers":[{"name":"blackcherie","email":"blackcherietechnology@gmail.com"}],"dist":{"shasum":"f0d3a7d221334f8dfe2500a0edbfdd07ae1edee3","tarball":"https://registry.npmjs.org/@blackcherie/nestjs-shared-packages/-/nestjs-shared-packages-0.1.0.tgz","fileCount":118,"integrity":"sha512-DvtQqbobRl3LuigmuLDT6iNRwPb7WhhXhIPpScEAT77RUM4MGlcXTU+DPdk3sBPdfxfPmN7crgFSr5qGf8zzGQ==","signatures":[{"sig":"MEQCIDpcFJ92ZfVjA8deoqafCSKOc7n+GMkgVDwagYE495IvAiAx3OAuv0H2i5+xrlEqBbcGQ9HQeCTi2KJiw2aYUeFAHQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115268},"jest":{"rootDir":"src","testRegex":".*\\.spec\\.ts$","transform":{"^.+\\.(t|j)s$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"../coverage","collectCoverageFrom":["**/*.(t|j)s"],"moduleFileExtensions":["js","json","ts"]},"main":"./dist/index.js","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"lint":"eslint \"src/**/*.ts\" \"test/**/*.ts\" --fix","test":"jest","build":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","test:cov":"jest --coverage","test:watch":"jest --watch","prepublishOnly":"npm run build"},"_npmUser":{"name":"blackcherie","email":"blackcherietechnology@gmail.com"},"_npmVersion":"11.11.0","description":"Shared NestJS services, guards, decorators, DTOs, and utilities with consumer-driven configuration","directories":{},"_nodeVersion":"24.14.1","dependencies":{"zod":"^3.24.1","redis":"^5.11.0","bcryptjs":"^2.4.3","nodemailer":"^6.9.16","@aws-sdk/client-sqs":"^3.750.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","rxjs":"^7.8.1","eslint":"^9.18.0","express":"^5.0.1","globals":"^16.0.0","ts-jest":"^29.2.5","prettier":"^3.4.2","@eslint/js":"^9.18.0","typescript":"^5.7.3","@nestjs/jwt":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.0","@types/express":"^5.0.0","@types/bcryptjs":"^2.4.6","@eslint/eslintrc":"^3.2.0","reflect-metadata":"^0.2.2","@types/nodemailer":"^6.4.17","typescript-eslint":"^8.20.0","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"rxjs":"^7.8.0","express":"^4.21.0 || ^5.0.0","@nestjs/jwt":"^11.0.0","@nestjs/core":"^11.0.0","@nestjs/common":"^11.0.0","@nestjs/config":"^4.0.0","reflect-metadata":"^0.2.0"},"peerDependenciesMeta":{"@nestjs/jwt":{"optional":true},"@nestjs/config":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestjs-shared-packages_0.1.0_1779255653164_0.5870984035707933","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@blackcherie/nestjs-shared-packages","version":"0.1.1","keywords":["nestjs","shared","utilities","redis","sqs","email","bcrypt","guards","zod"],"author":{"name":"Black Cherie"},"license":"MIT","_id":"@blackcherie/nestjs-shared-packages@0.1.1","maintainers":[{"name":"blackcherie","email":"blackcherietechnology@gmail.com"}],"dist":{"shasum":"4809ec35722bb8bf47c1b82c18947423c292ebd0","tarball":"https://registry.npmjs.org/@blackcherie/nestjs-shared-packages/-/nestjs-shared-packages-0.1.1.tgz","fileCount":118,"integrity":"sha512-bf3PjaQQrVNOg6L5rvwRwgzeJNozyJhJ3zrGI+pAlQ4YXYtmiF4fJu66AKTBf+oWoYQ42h0wRmsVPViLXCAceg==","signatures":[{"sig":"MEQCIHai94oQdLULHuLWm/DILLgfshBk6z9s797WfbHYCirGAiAz2vIhGBX2VyGD85hNRN1XiHEwNuGolp3HzkUDbAQikQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115340},"jest":{"rootDir":"src","testRegex":".*\\.spec\\.ts$","transform":{"^.+\\.(t|j)s$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"../coverage","collectCoverageFrom":["**/*.(t|j)s"],"moduleFileExtensions":["js","json","ts"]},"main":"./dist/index.js","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"6ddb83c87b4c99ab023a14e8d6d397372fd69f5d","scripts":{"lint":"eslint \"src/**/*.ts\" \"test/**/*.ts\" --fix","test":"jest","build":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","test:cov":"jest --coverage","test:watch":"jest --watch","prepublishOnly":"npm run build"},"_npmUser":{"name":"blackcherie","email":"blackcherietechnology@gmail.com"},"_npmVersion":"11.11.0","description":"Shared NestJS services, guards, decorators, DTOs, and utilities with consumer-driven configuration","directories":{},"_nodeVersion":"24.14.1","dependencies":{"zod":"^3.24.1","redis":"^5.11.0","bcryptjs":"^2.4.3","nodemailer":"^6.9.16","@aws-sdk/client-sqs":"^3.750.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","rxjs":"^7.8.1","eslint":"^9.18.0","express":"^5.0.1","globals":"^16.0.0","ts-jest":"^29.2.5","prettier":"^3.4.2","@eslint/js":"^9.18.0","typescript":"^5.7.3","@nestjs/jwt":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.0","@types/express":"^5.0.0","@types/bcryptjs":"^2.4.6","@eslint/eslintrc":"^3.2.0","reflect-metadata":"^0.2.2","@types/nodemailer":"^6.4.17","typescript-eslint":"^8.20.0","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"rxjs":"^7.8.0","express":"^4.21.0 || ^5.0.0","@nestjs/jwt":"^11.0.0","@nestjs/core":"^11.0.0","@nestjs/common":"^11.0.0","@nestjs/config":"^4.0.0","reflect-metadata":"^0.2.0"},"peerDependenciesMeta":{"@nestjs/jwt":{"optional":true},"@nestjs/config":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestjs-shared-packages_0.1.1_1779517341231_0.15727886005495062","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@blackcherie/nestjs-shared-packages","version":"0.1.2","keywords":["nestjs","shared","utilities","redis","sqs","email","bcrypt","guards","zod"],"author":{"name":"Black Cherie"},"license":"MIT","_id":"@blackcherie/nestjs-shared-packages@0.1.2","maintainers":[{"name":"blackcherie","email":"blackcherietechnology@gmail.com"}],"dist":{"shasum":"943d7a787ae1df364ca922053d8b8977e3cd23e6","tarball":"https://registry.npmjs.org/@blackcherie/nestjs-shared-packages/-/nestjs-shared-packages-0.1.2.tgz","fileCount":118,"integrity":"sha512-AZW2XQ8Hy4qfxzylIvDKL/6SoCt2j26ncxzWsvnoSKtyDA6XFHARl/aw7N+DmkqAdRCMt/ZWsdNCXX3GWcm6RA==","signatures":[{"sig":"MEUCIHlJw888aXmBUNZWNI1Mri+xzyMgKS251c8GtK3TuFPhAiEAn64UpSxydwVfKZk3AmJ18p6Cx9Opv9EWWtATEdtMTb8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116270},"jest":{"rootDir":"src","testRegex":".*\\.spec\\.ts$","transform":{"^.+\\.(t|j)s$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"../coverage","collectCoverageFrom":["**/*.(t|j)s"],"moduleFileExtensions":["js","json","ts"]},"main":"./dist/index.js","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"5626cf98db88b67d6b401e1a0109b29e6a765340","scripts":{"lint":"eslint \"src/**/*.ts\" \"test/**/*.ts\" --fix","test":"jest","build":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","test:cov":"jest --coverage","test:watch":"jest --watch","prepublishOnly":"npm run build"},"_npmUser":{"name":"blackcherie","email":"blackcherietechnology@gmail.com"},"_npmVersion":"11.11.0","description":"Shared NestJS services, guards, decorators, DTOs, and utilities with consumer-driven configuration","directories":{},"_nodeVersion":"24.14.1","dependencies":{"zod":"^3.24.1","redis":"^5.11.0","bcryptjs":"^2.4.3","nodemailer":"^6.9.16","@aws-sdk/client-sqs":"^3.750.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","rxjs":"^7.8.1","eslint":"^9.18.0","express":"^5.0.1","globals":"^16.0.0","ts-jest":"^29.2.5","prettier":"^3.4.2","@eslint/js":"^9.18.0","typescript":"^5.7.3","@nestjs/jwt":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.0","@types/express":"^5.0.0","@types/bcryptjs":"^2.4.6","@eslint/eslintrc":"^3.2.0","reflect-metadata":"^0.2.2","@types/nodemailer":"^6.4.17","typescript-eslint":"^8.20.0","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"rxjs":"^7.8.0","express":"^4.21.0 || ^5.0.0","@nestjs/jwt":"^11.0.0","@nestjs/core":"^11.0.0","@nestjs/common":"^11.0.0","@nestjs/config":"^4.0.0","reflect-metadata":"^0.2.0"},"peerDependenciesMeta":{"@nestjs/jwt":{"optional":true},"@nestjs/config":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestjs-shared-packages_0.1.2_1779517711481_0.30224470502308187","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@blackcherie/nestjs-shared-packages","version":"0.1.3","keywords":["nestjs","shared","utilities","redis","sqs","email","bcrypt","guards","zod"],"author":{"name":"Black Cherie"},"license":"MIT","_id":"@blackcherie/nestjs-shared-packages@0.1.3","maintainers":[{"name":"blackcherie","email":"blackcherietechnology@gmail.com"}],"dist":{"shasum":"9dc3e6c506589854eff2f9adc85fa067658e122b","tarball":"https://registry.npmjs.org/@blackcherie/nestjs-shared-packages/-/nestjs-shared-packages-0.1.3.tgz","fileCount":119,"integrity":"sha512-JycNdnwnQfO/c/ofOPq4jVGfEXC/GwZpBByg4eFklUVhAU64OM6Wybk4MlCVxpx/Wl/wkL9A6AkWmozCdil6jw==","signatures":[{"sig":"MEYCIQDOr1W1sBKoubaY8EhCg5C8H+pKK5prGGuWYQDnZ/bNbgIhANZ2yNwlmXZ++xAV097NHjdZPg8XNuO2KDqIQiR+jgBo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":417368},"jest":{"rootDir":"src","testRegex":".*\\.spec\\.ts$","transform":{"^.+\\.(t|j)s$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"../coverage","collectCoverageFrom":["**/*.(t|j)s"],"moduleFileExtensions":["js","json","ts"]},"main":"./dist/index.js","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"5626cf98db88b67d6b401e1a0109b29e6a765340","scripts":{"lint":"eslint \"src/**/*.ts\" \"test/**/*.ts\" --fix","test":"jest","build":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","test:cov":"jest --coverage","test:watch":"jest --watch","prepublishOnly":"npm run build"},"_npmUser":{"name":"blackcherie","email":"blackcherietechnology@gmail.com"},"_npmVersion":"11.11.0","description":"Shared NestJS services, guards, decorators, DTOs, and utilities with consumer-driven configuration","directories":{},"_nodeVersion":"24.14.1","dependencies":{"zod":"^3.24.1","redis":"^5.11.0","bcryptjs":"^2.4.3","nodemailer":"^6.9.16","@aws-sdk/client-sqs":"^3.750.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","rxjs":"^7.8.1","eslint":"^9.18.0","express":"^5.0.1","globals":"^16.0.0","ts-jest":"^29.2.5","prettier":"^3.4.2","@eslint/js":"^9.18.0","typescript":"^5.7.3","@nestjs/jwt":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.0","@types/express":"^5.0.0","@types/bcryptjs":"^2.4.6","@eslint/eslintrc":"^3.2.0","reflect-metadata":"^0.2.2","@types/nodemailer":"^6.4.17","typescript-eslint":"^8.20.0","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"rxjs":"^7.8.0","express":"^4.21.0 || ^5.0.0","@nestjs/jwt":"^11.0.0","@nestjs/core":"^11.0.0","@nestjs/common":"^11.0.0","@nestjs/config":"^4.0.0","reflect-metadata":"^0.2.0"},"peerDependenciesMeta":{"@nestjs/jwt":{"optional":true},"@nestjs/config":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestjs-shared-packages_0.1.3_1779518187611_0.584364013519749","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@blackcherie/nestjs-shared-packages","version":"0.1.4","keywords":["nestjs","shared","utilities","redis","sqs","email","bcrypt","guards","zod"],"author":{"name":"Black Cherie"},"license":"MIT","_id":"@blackcherie/nestjs-shared-packages@0.1.4","maintainers":[{"name":"blackcherie","email":"blackcherietechnology@gmail.com"}],"dist":{"shasum":"66c97ce3f3493fdd5b2fcfd3657c3b0abb3ecfbd","tarball":"https://registry.npmjs.org/@blackcherie/nestjs-shared-packages/-/nestjs-shared-packages-0.1.4.tgz","fileCount":119,"integrity":"sha512-g4SYn9w0ImV3VvEXhNXneMyvjBkzEKq8wTeWAYbC2BLlGJWs40sZRDoYnhl7BDOBDDsS7H8lqER8eeScdhG8bg==","signatures":[{"sig":"MEUCIBvcaf62lP9DVclA5xqd6VKceInf7vLcsUbXrm6dol++AiEAlS8D5Qgps7olkowkw/SNlPAuByJCocs1zG9SYHgvGXs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":415229},"jest":{"rootDir":"src","testRegex":".*\\.spec\\.ts$","transform":{"^.+\\.(t|j)s$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"../coverage","collectCoverageFrom":["**/*.(t|j)s"],"moduleFileExtensions":["js","json","ts"]},"main":"./dist/index.js","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"e4a7d05ec1e42f0feac3f9cef932437d6f2588f2","scripts":{"lint":"eslint \"src/**/*.ts\" \"test/**/*.ts\" --fix","test":"jest","build":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","test:cov":"jest --coverage","test:watch":"jest --watch","prepublishOnly":"npm run build"},"_npmUser":{"name":"blackcherie","email":"blackcherietechnology@gmail.com"},"_npmVersion":"11.11.0","description":"Shared NestJS services, guards, decorators, DTOs, and utilities with consumer-driven configuration","directories":{},"_nodeVersion":"24.14.1","dependencies":{"zod":"^4.4.3","redis":"^5.11.0","bcryptjs":"^2.4.3","nodemailer":"^6.9.16","@aws-sdk/client-sqs":"^3.750.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","rxjs":"^7.8.1","eslint":"^9.18.0","express":"^5.0.1","globals":"^16.0.0","ts-jest":"^29.2.5","prettier":"^3.4.2","@eslint/js":"^9.18.0","typescript":"^5.7.3","@nestjs/jwt":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.0","@types/express":"^5.0.0","@types/bcryptjs":"^2.4.6","@eslint/eslintrc":"^3.2.0","reflect-metadata":"^0.2.2","@types/nodemailer":"^6.4.17","typescript-eslint":"^8.20.0","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"rxjs":"^7.8.0","express":"^4.21.0 || ^5.0.0","@nestjs/jwt":"^11.0.0","@nestjs/core":"^11.0.0","@nestjs/common":"^11.0.0","@nestjs/config":"^4.0.0","reflect-metadata":"^0.2.0"},"peerDependenciesMeta":{"@nestjs/jwt":{"optional":true},"@nestjs/config":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestjs-shared-packages_0.1.4_1779771156688_0.35117982944058146","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@blackcherie/nestjs-shared-packages","version":"0.1.5","keywords":["nestjs","shared","utilities","redis","sqs","email","bcrypt","guards","zod"],"author":{"name":"Black Cherie"},"license":"MIT","_id":"@blackcherie/nestjs-shared-packages@0.1.5","maintainers":[{"name":"blackcherie","email":"blackcherietechnology@gmail.com"}],"dist":{"shasum":"9986b7ebd15898362bacc9cf734563fd0a095553","tarball":"https://registry.npmjs.org/@blackcherie/nestjs-shared-packages/-/nestjs-shared-packages-0.1.5.tgz","fileCount":119,"integrity":"sha512-kznfgtCOUWAyTvQOCZtghWlr9ctAWJ/hW7BmkV3RLYbHVQPYqrI1QL01UzRWuV+TzF5zn3ssXScEwvV72XjT/g==","signatures":[{"sig":"MEYCIQCQmWuu/O6IAiMCa7n5nZEUyS4TKJfFUbPl2ZJw0A5AogIhAL0nc7lSyaEneXdkMdV3bcXJGQQfO1wSSKn/hjijbgmr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":415466},"jest":{"rootDir":"src","testRegex":".*\\.spec\\.ts$","transform":{"^.+\\.(t|j)s$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"../coverage","collectCoverageFrom":["**/*.(t|j)s"],"moduleFileExtensions":["js","json","ts"]},"main":"./dist/index.js","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"2a0352dd06adb5834ed206d947b3905b0b559881","scripts":{"lint":"eslint \"src/**/*.ts\" \"test/**/*.ts\" --fix","test":"jest","build":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","test:cov":"jest --coverage","test:watch":"jest --watch","prepublishOnly":"npm run build"},"_npmUser":{"name":"blackcherie","email":"blackcherietechnology@gmail.com"},"_npmVersion":"11.11.0","description":"Shared NestJS services, guards, decorators, DTOs, and utilities with consumer-driven configuration","directories":{},"_nodeVersion":"24.14.1","dependencies":{"redis":"^5.11.0","bcryptjs":"^2.4.3","nodemailer":"^6.9.16","@aws-sdk/client-sqs":"^3.750.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","jest":"^30.0.0","rxjs":"^7.8.1","eslint":"^9.18.0","express":"^5.0.1","globals":"^16.0.0","ts-jest":"^29.2.5","prettier":"^3.4.2","@eslint/js":"^9.18.0","typescript":"^5.7.3","@nestjs/jwt":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.0","@types/express":"^5.0.0","@types/bcryptjs":"^2.4.6","@eslint/eslintrc":"^3.2.0","reflect-metadata":"^0.2.2","@types/nodemailer":"^6.4.17","typescript-eslint":"^8.20.0","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"zod":"^3.24.0 || ^4.0.0","rxjs":"^7.8.0","express":"^4.21.0 || ^5.0.0","@nestjs/jwt":"^11.0.0","@nestjs/core":"^11.0.0","@nestjs/common":"^11.0.0","@nestjs/config":"^4.0.0","reflect-metadata":"^0.2.0"},"peerDependenciesMeta":{"@nestjs/jwt":{"optional":true},"@nestjs/config":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestjs-shared-packages_0.1.5_1779771600340_0.10651331240414752","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@blackcherie/nestjs-shared-packages","version":"0.1.6","keywords":["nestjs","shared","utilities","redis","sqs","email","bcrypt","guards","zod"],"author":{"name":"Black Cherie"},"license":"MIT","_id":"@blackcherie/nestjs-shared-packages@0.1.6","maintainers":[{"name":"blackcherie","email":"blackcherietechnology@gmail.com"}],"dist":{"shasum":"86a1eec0ffcdae0e6a1d2ad6a98a5774cbba3cd2","tarball":"https://registry.npmjs.org/@blackcherie/nestjs-shared-packages/-/nestjs-shared-packages-0.1.6.tgz","fileCount":119,"integrity":"sha512-FNi0gdm2P12to1FlxkwPwkn71Ua3BcGhntkKso6Pko5oFzqJJ3jVg4sVoyGwxR6gqzo4edp21ri20cUuUGErxA==","signatures":[{"sig":"MEQCIBpkd2etKmuUylHrXlCYpivQ8jgEZ1z5sJ6cMaZtjBFiAiBMuSLJd2CCiQTJ9NVI7wSPF+uu/SPio7/WinuhXQiiLg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":415236},"jest":{"rootDir":"src","testRegex":".*\\.spec\\.ts$","transform":{"^.+\\.(t|j)s$":"ts-jest"},"testEnvironment":"node","coverageDirectory":"../coverage","collectCoverageFrom":["**/*.(t|j)s"],"moduleFileExtensions":["js","json","ts"]},"main":"./dist/index.js","types":"./dist/index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"2a0352dd06adb5834ed206d947b3905b0b559881","scripts":{"lint":"eslint \"src/**/*.ts\" \"test/**/*.ts\" --fix","test":"jest","build":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","test:cov":"jest --coverage","test:watch":"jest --watch","prepublishOnly":"npm run build"},"_npmUser":{"name":"blackcherie","email":"blackcherietechnology@gmail.com"},"_npmVersion":"11.11.0","description":"Shared NestJS services, guards, decorators, DTOs, and utilities with consumer-driven configuration","directories":{},"_nodeVersion":"24.14.1","dependencies":{"redis":"^5.11.0","bcryptjs":"^2.4.3","nodemailer":"^6.9.16","@aws-sdk/client-sqs":"^3.750.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.4.3","jest":"^30.0.0","rxjs":"^7.8.1","eslint":"^9.18.0","express":"^5.0.1","globals":"^16.0.0","ts-jest":"^29.2.5","prettier":"^3.4.2","@eslint/js":"^9.18.0","typescript":"^5.7.3","@nestjs/jwt":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^22.10.7","@nestjs/core":"^11.0.1","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.0","@types/express":"^5.0.0","@types/bcryptjs":"^2.4.6","@eslint/eslintrc":"^3.2.0","reflect-metadata":"^0.2.2","@types/nodemailer":"^6.4.17","typescript-eslint":"^8.20.0","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"zod":"^3.24.0 || ^4.0.0","rxjs":"^7.8.0","express":"^4.21.0 || ^5.0.0","@nestjs/jwt":"^11.0.0","@nestjs/core":"^11.0.0","@nestjs/common":"^11.0.0","@nestjs/config":"^4.0.0","reflect-metadata":"^0.2.0"},"peerDependenciesMeta":{"@nestjs/jwt":{"optional":true},"@nestjs/config":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestjs-shared-packages_0.1.6_1779771755709_0.208578415715998","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@blackcherie/nestjs-shared-packages","version":"0.1.7","description":"Shared NestJS services, guards, decorators, DTOs, and utilities with consumer-driven configuration","publishConfig":{"access":"public"},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"build":"tsc -p tsconfig.build.json","format":"prettier --write \"src/**/*.ts\" \"test/**/*.ts\"","lint":"eslint \"src/**/*.ts\" \"test/**/*.ts\" --fix","test":"jest","test:watch":"jest --watch","test:cov":"jest --coverage","prepublishOnly":"npm run build"},"keywords":["nestjs","shared","utilities","redis","prisma","sqs","email","bcrypt","guards","zod","microservices","tcp"],"author":{"name":"Black Cherie"},"license":"MIT","engines":{"node":">=18"},"dependencies":{"@aws-sdk/client-sqs":"^3.750.0","bcryptjs":"^2.4.3","nodemailer":"^6.9.16","redis":"^5.11.0","zod":"^4.4.3"},"peerDependencies":{"@nestjs/common":"^11.0.0","@nestjs/config":"^4.0.0","@nestjs/core":"^11.0.0","@nestjs/microservices":"^11.0.0","@nestjs/jwt":"^11.0.0","@prisma/adapter-pg":"^7.0.0","@prisma/client":"^7.0.0","express":"^4.21.0 || ^5.0.0","reflect-metadata":"^0.2.0","rxjs":"^7.8.0"},"peerDependenciesMeta":{"@nestjs/config":{"optional":true},"@nestjs/jwt":{"optional":true},"@nestjs/microservices":{"optional":true},"@prisma/adapter-pg":{"optional":true},"@prisma/client":{"optional":true}},"devDependencies":{"@eslint/eslintrc":"^3.2.0","@eslint/js":"^9.18.0","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.0","@nestjs/core":"^11.0.1","@nestjs/jwt":"^11.0.0","@nestjs/microservices":"^11.0.1","@prisma/adapter-pg":"^7.8.0","@types/bcryptjs":"^2.4.6","@types/express":"^5.0.0","@types/jest":"^30.0.0","@types/node":"^22.10.7","@types/nodemailer":"^6.4.17","eslint":"^9.18.0","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2","express":"^5.0.1","globals":"^16.0.0","jest":"^30.0.0","prettier":"^3.4.2","reflect-metadata":"^0.2.2","rxjs":"^7.8.1","ts-jest":"^29.2.5","typescript":"^5.7.3","typescript-eslint":"^8.20.0"},"jest":{"moduleFileExtensions":["js","json","ts"],"rootDir":"src","testRegex":".*\\.spec\\.ts$","transform":{"^.+\\.(t|j)s$":"ts-jest"},"collectCoverageFrom":["**/*.(t|j)s"],"coverageDirectory":"../coverage","testEnvironment":"node"},"gitHead":"e4a7d05ec1e42f0feac3f9cef932437d6f2588f2","_id":"@blackcherie/nestjs-shared-packages@0.1.7","_nodeVersion":"24.11.0","_npmVersion":"11.6.1","dist":{"integrity":"sha512-oVlO0h4FsRQHSyg9TgTbbzrFXpIcr7UjC9YZlwWSfiE7ScooI4OIjfYOZPJWfn/G4kR1sSE+0SXF9Fcj3NKpcg==","shasum":"4303ecca793e9ac8b4cb5b8525e7d85ff027ad25","tarball":"https://registry.npmjs.org/@blackcherie/nestjs-shared-packages/-/nestjs-shared-packages-0.1.7.tgz","fileCount":145,"unpackedSize":139061,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCx6JDn8bKmsZTVgmJzfVXNxupVaWuX0Dg271pStv8msgIgfQ0QpiJfS4pLJd9zbFCIZdXKhaRHUns3gRN/t0CHGy0="}]},"_npmUser":{"name":"blackcherie","email":"blackcherietechnology@gmail.com"},"directories":{},"maintainers":[{"name":"blackcherie","email":"blackcherietechnology@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nestjs-shared-packages_0.1.7_1780119190437_0.9960693557760223"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-20T05:40:52.972Z","modified":"2026-05-30T05:33:10.722Z","0.1.0":"2026-05-20T05:40:53.405Z","0.1.1":"2026-05-23T06:22:21.380Z","0.1.2":"2026-05-23T06:28:31.630Z","0.1.3":"2026-05-23T06:36:27.767Z","0.1.4":"2026-05-26T04:52:36.818Z","0.1.5":"2026-05-26T05:00:00.493Z","0.1.6":"2026-05-26T05:02:35.917Z","0.1.7":"2026-05-30T05:33:10.606Z"},"author":{"name":"Black Cherie"},"license":"MIT","keywords":["nestjs","shared","utilities","redis","prisma","sqs","email","bcrypt","guards","zod","microservices","tcp"],"description":"Shared NestJS services, guards, decorators, DTOs, and utilities with consumer-driven configuration","maintainers":[{"name":"blackcherie","email":"blackcherietechnology@gmail.com"}],"readme":"# @blackcherie/nestjs-shared-packages\r\n\r\nShared [NestJS](https://nestjs.com) services, guards, decorators, DTOs, and utilities for BCM projects.\r\n\r\nConfiguration follows the same pattern as `@nestjs/jwt` or TypeORM: **you pass required data when registering a module** in your app. This package does not load `.env` files.\r\n\r\n## Requirements\r\n\r\n- Node.js **18+**\r\n- NestJS **11+**\r\n- `reflect-metadata` and `rxjs` (standard Nest app dependencies)\r\n\r\n## Install\r\n\r\n```bash\r\nnpm install @blackcherie/nestjs-shared-packages\r\n```\r\n\r\nPeer dependencies (install in your app if missing):\r\n\r\n```bash\r\nnpm install @nestjs/common @nestjs/core @nestjs/config @nestjs/jwt express\r\n```\r\n\r\nFor Prisma (PostgreSQL driver adapter):\r\n\r\n```bash\r\nnpm install @prisma/client @prisma/adapter-pg\r\n```\r\n\r\nFor TCP microservice calls (`TcpClientService`, `tcpSend`, `tcpEmit`):\r\n\r\n```bash\r\nnpm install @nestjs/microservices\r\n```\r\n\r\nYour app must run `prisma generate` so `PrismaClient` exists for your schema.\r\n\r\n## Quick start\r\n\r\n### 1. Register modules once in `AppModule`\r\n\r\n```typescript\r\nimport { Module } from '@nestjs/common';\r\nimport { ConfigModule, ConfigService } from '@nestjs/config';\r\nimport {\r\n  EmailModule,\r\n  RedisModule,\r\n  SqsModule,\r\n  BcryptModule,\r\n  PrismaModule,\r\n} from '@blackcherie/nestjs-shared-packages';\r\nimport { PrismaClient } from './generated/prisma/client';\r\n\r\n@Module({\r\n  imports: [\r\n    ConfigModule.forRoot({ isGlobal: true }),\r\n\r\n    EmailModule.forRootAsync({\r\n      isGlobal: true,\r\n      imports: [ConfigModule],\r\n      inject: [ConfigService],\r\n      useFactory: (config: ConfigService) => ({\r\n        senderEmail: config.getOrThrow<string>('SENDER_EMAIL'),\r\n        senderPassword: config.getOrThrow<string>('SENDER_EMAIL_APP_PASSWORD'),\r\n      }),\r\n    }),\r\n\r\n    RedisModule.forRootAsync({\r\n      isGlobal: true,\r\n      imports: [ConfigModule],\r\n      inject: [ConfigService],\r\n      useFactory: (config: ConfigService) => ({\r\n        url: config.getOrThrow<string>('REDIS_URL'),\r\n      }),\r\n    }),\r\n\r\n    SqsModule.forRootAsync({\r\n      isGlobal: true,\r\n      imports: [ConfigModule],\r\n      inject: [ConfigService],\r\n      useFactory: (config: ConfigService) => ({\r\n        client: {\r\n          region: config.getOrThrow<string>('AWS_REGION'),\r\n          maxAttempts: 3,\r\n          retryMode: 'adaptive',\r\n        },\r\n        queueUrls: {\r\n          emailNotifications: config.getOrThrow<string>('EMAIL_NOTIFICATIONS_QUEUE_URL'),\r\n        },\r\n      }),\r\n    }),\r\n\r\n    BcryptModule.forRoot(true),\r\n\r\n    PrismaModule.forRootAsync({\r\n      isGlobal: true,\r\n      imports: [ConfigModule],\r\n      inject: [ConfigService],\r\n      useFactory: (config: ConfigService) => ({\r\n        databaseUrl: config.getOrThrow<string>('DATABASE_URL'),\r\n        Client: PrismaClient,\r\n      }),\r\n    }),\r\n  ],\r\n})\r\nexport class AppModule {}\r\n```\r\n\r\nSee [`.env.example`](./.env.example) for variable names.\r\n\r\n### Prisma usage in services\r\n\r\nInject `PrismaService` and use `.client` for model access (the client class comes from your app):\r\n\r\n```typescript\r\nimport { Injectable } from '@nestjs/common';\r\nimport { PrismaService } from '@blackcherie/nestjs-shared-packages';\r\nimport { PrismaClient } from './generated/prisma/client';\r\n\r\n@Injectable()\r\nexport class UserService {\r\n  constructor(private readonly prisma: PrismaService<PrismaClient>) {}\r\n\r\n  findAll() {\r\n    return this.prisma.client.user.findMany();\r\n  }\r\n}\r\n```\r\n\r\n### 2. Inject services anywhere\r\n\r\nWith `isGlobal: true`, feature modules do **not** need to import service modules again:\r\n\r\n```typescript\r\nimport { Injectable } from '@nestjs/common';\r\nimport { EmailService, RedisService, SQSService, BcryptService } from '@blackcherie/nestjs-shared-packages';\r\n\r\n@Injectable()\r\nexport class UserService {\r\n  constructor(\r\n    private readonly email: EmailService,\r\n    private readonly redis: RedisService,\r\n    private readonly sqs: SQSService,\r\n    private readonly bcrypt: BcryptService,\r\n  ) {}\r\n\r\n  async register(email: string, password: string) {\r\n    const hash = await this.bcrypt.hashPassword(password);\r\n    await this.redis.setJson(`user:${email}`, { hash }, 3600);\r\n    await this.email.sendMail(email, 'Welcome', '<p>Hello</p>');\r\n  }\r\n}\r\n```\r\n\r\n---\r\n\r\n## Alternative: single module (sync config)\r\n\r\n```typescript\r\nimport { SharedPackagesModule } from '@blackcherie/nestjs-shared-packages';\r\n\r\nSharedPackagesModule.forRoot({\r\n  email: { senderEmail: 'app@example.com', senderPassword: 'secret' },\r\n  redis: { url: 'redis://localhost:6379' },\r\n  sqs: {\r\n    client: { region: 'us-east-1' },\r\n    queueUrls: { emailNotifications: 'https://sqs...' },\r\n  },\r\n}, true);\r\n```\r\n\r\nFor env-based config, use each module's `forRootAsync` (see [docs/CONFIGURATION.md](./docs/CONFIGURATION.md)).\r\n\r\n---\r\n\r\n## Package contents\r\n\r\n### Services\r\n\r\n| Export | Description |\r\n|--------|-------------|\r\n| `EmailModule` / `EmailService` | Gmail via Nodemailer |\r\n| `RedisModule` / `RedisService` | Redis cache (`get`, `set`, `getJson`, `setJson`, `delByPrefix`) |\r\n| `SqsModule` / `SQSService` | AWS SQS with batching and deduplication |\r\n| `BcryptModule` / `BcryptService` | Password hash and compare (`bcryptjs`) |\r\n| `PrismaModule` / `PrismaService` | Prisma + PostgreSQL adapter; consumer passes `databaseUrl` and generated `PrismaClient` |\r\n| `TcpClientService` / `tcpSend` / `tcpEmit` | TCP microservice client with timeout, retry, and error mapping |\r\n| `TcpClientProxy` | Type for host `ClientProxy` (avoids duplicate `@nestjs/microservices` types) |\r\n| `SharedPackagesModule` | Bundle multiple services (sync `forRoot`) |\r\n\r\n### Guards & decorators\r\n\r\n| Export | Description |\r\n|--------|-------------|\r\n| `AuthGuard` | JWT Bearer auth (requires `JwtModule` in your app) |\r\n| `createAuthGuardProvider` | Registers `AuthGuard` with your app's `JwtService` / `Reflector` (recommended for npm installs) |\r\n| `RolesGuard` | Role-based access |\r\n| `@Public()` | Skip `AuthGuard` |\r\n| `@Roles('admin', ...)` | Required roles for `RolesGuard` |\r\n| `@CurrentUser()` | Access JWT payload on request |\r\n\r\n### Validation & HTTP\r\n\r\n| Export | Description |\r\n|--------|-------------|\r\n| `ZodValidationPipe` | Validate request body with Zod |\r\n| `GlobalExceptionFilter` | Consistent error JSON responses |\r\n| `ResponseDto` / request DTOs | Zod schemas for API responses |\r\n\r\n### Utilities\r\n\r\n| Export | Description |\r\n|--------|-------------|\r\n| `generateFilters` | Build filter objects for queries |\r\n| `generateSort` | Build sort objects |\r\n| `generatePassword` | Random password generator |\r\n| `CustomException` | Custom HTTP exception helper |\r\n| `ApiResponse` | TypeScript response interface |\r\n| `logger`, `formatDate`, `isValidEmail` | Small helpers |\r\n\r\n---\r\n\r\n## Auth setup (consumer app)\r\n\r\n`AuthGuard` uses `JwtService` and `process.env.JWT_SECRET`. Register JWT in your app.\r\n\r\n**Recommended** (when installed from npm — avoids `JwtService` DI resolution errors):\r\n\r\n```typescript\r\nimport { Module } from '@nestjs/common';\r\nimport { Reflector } from '@nestjs/core';\r\nimport { JwtModule, JwtService } from '@nestjs/jwt';\r\nimport {\r\n  createAuthGuardProvider,\r\n  RolesGuard,\r\n} from '@blackcherie/nestjs-shared-packages';\r\n\r\n@Module({\r\n  imports: [\r\n    JwtModule.register({\r\n      global: true,\r\n      secret: process.env.JWT_SECRET,\r\n      signOptions: { expiresIn: '1d' },\r\n    }),\r\n  ],\r\n  providers: [\r\n    createAuthGuardProvider(JwtService, Reflector),\r\n    RolesGuard,\r\n  ],\r\n})\r\nexport class AppModule {}\r\n```\r\n\r\n```typescript\r\n@Public()\r\n@Post('login')\r\nlogin() { /* ... */ }\r\n\r\n@Roles('admin')\r\n@Get('admin')\r\nadminOnly() { /* ... */ }\r\n```\r\n\r\n---\r\n\r\n## TCP microservice client\r\n\r\nRegister `TcpClientService` in the module that calls other services over TCP:\r\n\r\n```typescript\r\nimport { Module } from '@nestjs/common';\r\nimport { TcpClientService } from '@blackcherie/nestjs-shared-packages';\r\n\r\n@Module({\r\n  providers: [TcpClientService, AppService],\r\n})\r\nexport class AppModule {}\r\n```\r\n\r\nCall another service (pattern must match the target `@MessagePattern`):\r\n\r\n```typescript\r\nimport { Injectable } from '@nestjs/common';\r\nimport { ClientProxyFactory, Transport } from '@nestjs/microservices';\r\nimport { TcpClientService } from '@blackcherie/nestjs-shared-packages';\r\n\r\n@Injectable()\r\nexport class AppService {\r\n  constructor(private readonly tcpClient: TcpClientService) {}\r\n\r\n  async getUserById(userId: string) {\r\n    const client = ClientProxyFactory.create({\r\n      transport: Transport.TCP,\r\n      options: { host: '127.0.0.1', port: 3001 },\r\n    });\r\n\r\n    try {\r\n      return await this.tcpClient.send(\r\n        client,\r\n        { cmd: 'get_user_by_id' },\r\n        { id: userId },\r\n        { timeoutMs: 3000, retries: 1, retryDelayMs: 500 },\r\n      );\r\n    } finally {\r\n      client.close();\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nUse matching object patterns on both sides, e.g. `{ cmd: 'get_user_by_id' }` in the client and `@MessagePattern({ cmd: 'get_user_by_id' })` on the handler.\r\n\r\n---\r\n\r\n## Documentation\r\n\r\n| Doc | Description |\r\n|-----|-------------|\r\n| [docs/CONFIGURATION.md](./docs/CONFIGURATION.md) | Options for each module |\r\n| [docs/PUBLISHING.md](./docs/PUBLISHING.md) | Build and publish to npm |\r\n| [CHANGELOG.md](./CHANGELOG.md) | Version history |\r\n\r\n---\r\n\r\n## Development\r\n\r\n```bash\r\ngit clone <repo>\r\ncd nestjs-shared-packages\r\nnpm install\r\nnpm run build\r\nnpm test\r\n```\r\n\r\n---\r\n\r\n## Publish\r\n\r\n```bash\r\nnpm login\r\nnpm run build\r\nnpm publish --access public\r\n```\r\n\r\nSee [docs/PUBLISHING.md](./docs/PUBLISHING.md).\r\n\r\n---\r\n\r\n## License\r\n\r\n[MIT](./LICENSE)\r\n","readmeFilename":"README.md"}