{"_id":"@neohm/nestend","_rev":"44-1ff4f9a56a64d5b68f53bc180f474988","name":"@neohm/nestend","dist-tags":{"latest":"5.0.1"},"versions":{"1.0.0":{"name":"@neohm/nestend","version":"1.0.0","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@1.0.0","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"e51dbbe718143aa6efd714331fd8f2f88fe46d1c","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-1.0.0.tgz","fileCount":614,"integrity":"sha512-ueKa7VSVI9NXnMkhb6EwgdHlHeJySvMUU/ORSv6yL1yKKGUh1sZgtdYMwZP1lfJQY0faXyv97uUD3CwFT+QgUg==","signatures":[{"sig":"MEQCIBhaASJl3wmbqwH4sgADUSQBjgM9D2iJNq1G8OkM/ge9AiBdYv5vGFcTl//mdxxqfA+5h+iz5QRzuWVB1xYy3Co2DQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":630559},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"ebd83e32b75374fdc5711ee601da7b433703188d","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.0.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_1.0.0_1781365065160_0.6605695177298865","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@neohm/nestend","version":"1.0.1","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@1.0.1","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"d0fc46cefa843b562af354fd31420591d4fe8b2d","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-1.0.1.tgz","fileCount":618,"integrity":"sha512-js1A4+I6cEV+QcODcjlaE4HDZckxg1oxIaC1U4FUU6fPP2aFqvdj8H4fC7r5KmGQMlEWSozz14KcxUnTXCwP3g==","signatures":[{"sig":"MEUCIAhuBIdDtfeofjpHCtW/nDVzqm46jOYCdSPWqQPnR053AiEAxEILwhkdARyh4nf0QO3DHjsx4VZHtjHkz8/hqoA0ZFk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":629066},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"1852beabfa067eda65462521ae73354cb55c3acd","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.0.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_1.0.1_1781403934363_0.36908037296332963","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@neohm/nestend","version":"1.0.2","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@1.0.2","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"870fc0ff2318588c48c466b7df8758d2c22cf625","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-1.0.2.tgz","fileCount":618,"integrity":"sha512-CwcjKiFWCITdYz+cjYxuUZq6jm+jplhkD8veDQMGBMrsLUva2HH/ZC/GESl3cEtalnBcg9Wzwe2XaXdbWD5/MQ==","signatures":[{"sig":"MEQCID8KgrwTnWCkVs9A2YiiX7BNnDdY7wsu5+DEFJWN29NsAiB+jMP6ejPBIGKjISQ0KR/EpfFya9a51SOH5kTopYO7jA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":631733},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"a67f4617167b2695dd1fbf2aa9981fcf3a7d97df","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.0.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_1.0.2_1781405563408_0.9416554431014452","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@neohm/nestend","version":"2.0.0","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@2.0.0","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"4eed96a41f341cdf0fde1e023cd355bb1fc3c508","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-2.0.0.tgz","fileCount":954,"integrity":"sha512-vk59ZJlhobdfWulNTEqAdGpQ9lswf3bXijHkZnmPtikFAsRP+TWITEGUmZZmh8H91+2sH3gamAH0G6HQhUPUAQ==","signatures":[{"sig":"MEUCIQCXZK16y4urq6lcUq0TePkZw3Ke5dmMiaL8hYdThDGksAIgQD+BaEeoWi7b0DZHP6E+Sx/27PZlTeU3QZI4xlN0qb4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1035495},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"126df46014f42482152d526562e6533be7b4af58","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.0.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_2.0.0_1784222722939_0.9187177946757441","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@neohm/nestend","version":"2.0.2","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@2.0.2","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"faa5f2a1596965237866be1cf0df8a5ba9882e60","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-2.0.2.tgz","fileCount":954,"integrity":"sha512-Xujf12gNysBPQ96bRVPkskMqI4ktl+udIBunamL+ZzNE7Qcyi+wHWXCyK3ezF2aCIiOOx2FfWMD3Oq+FXO5VBg==","signatures":[{"sig":"MEUCIQCl+sqWXiw+wKlA/sizxL+PTVYLhHzIBeiiFW18hm5zZAIgARmjDZARriq63Uw1990tHMB1LATqBWSTIXbhjV8URsw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1036347},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"56ce74764de973329f086d1d6e34e9da235c99df","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.0.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_2.0.2_1784225780151_0.6064837327368924","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@neohm/nestend","version":"2.0.3","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@2.0.3","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"d8c04ed397ce5cb31271db18702822d817f89050","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-2.0.3.tgz","fileCount":962,"integrity":"sha512-9rAuUqxQlFPU15m2kikkSg2navRMkm9MfGF0+MZuveLZHbhZJaRpt2G2EsCMu0ZThWhOTraD0ufS2GWtAW0ctQ==","signatures":[{"sig":"MEQCIAkVxWVVxbAcxOzfxPE0lktasY6ZUpG6snn9VXcdc+UkAiBWMJy5R4GQwQrMHcD4Fyu+TAIeGrDMbaPLwR4LawzjSA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1076885},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"67f11078276d6848448b2ccaaff8ae3485e8f7b6","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.0.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_2.0.3_1784313489045_0.6375088468970942","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"@neohm/nestend","version":"2.0.4","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@2.0.4","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"2780c39e197896997f98469dab82ddc7e4aacd73","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-2.0.4.tgz","fileCount":962,"integrity":"sha512-k2kqiucqMyZ+IpeWcasb8s0VyZInn5qTFtd/MTf2drT/DNGn1ipdC4ZUXnmKhPFb1Bd4p9d2tEtLsEORXpVBhg==","signatures":[{"sig":"MEUCIDXsIvz++Yt30kMER794eUq+6l7fadmGCS/pKK7mHFQzAiEAiplUyc34qhW/MTXyDZGRXCGlbQsN40HoU7lwrNlOsq8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1077108},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"aeb084a3fac6530ca6cdf14248896af194757f66","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.0.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_2.0.4_1784314942476_0.44292429470491146","host":"s3://npm-registry-packages-npm-production"}},"2.0.5":{"name":"@neohm/nestend","version":"2.0.5","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@2.0.5","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"2390034244f5da8060f55e12eaba413b2d2d5fe9","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-2.0.5.tgz","fileCount":962,"integrity":"sha512-8jJZgDXowbpPtT51yfui0/z7hY42/uqTxBxP9Om2UMeWBTsVrS6J8K3SpS+aRs4Cfd0Dlm75ktIwagVwb1Lm6A==","signatures":[{"sig":"MEUCIQCOOyWypNXg0BFAOh69AC2+/GM0HTxLxuUCdVVvtG0fgwIgflBk0g02vj2mUnSHTXb4Yo6KaDK8UYU4Es77CZ5SV30=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1083755},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"30b285cce801c0e946f002f6817965b37d17eff2","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.0.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_2.0.5_1784534992031_0.2007433811262398","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@neohm/nestend","version":"3.0.0","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.0.0","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"25d0f38f6eaf0d0604778dde7da56575692ca548","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.0.0.tgz","fileCount":1054,"integrity":"sha512-wTY3MsEn1lr+ccbK/R/AgqejwBKm+YvWNQE1pcaFOpb4ZdGPwxXS6e6bJNCNtdgvf+oWRwv3/g2wSsvHcTYlQQ==","signatures":[{"sig":"MEUCIEdtqTGMG8UKgRCwJrBk6CvVn00KXa4jSZS8r2pRKjtrAiEA/DTQEzMXkCAbKC4SY34SYj6R8qZS/ZyI9oJIRBhpqW8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1192292},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"0c3476a6b878794f1c6daf8c8e2c7deb00bc4f99","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.0.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.0.0_1784827517209_0.7810320752434066","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@neohm/nestend","version":"3.0.1","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.0.1","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"589a66594784ade052ce8b194ad787aa39f8584d","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.0.1.tgz","fileCount":1054,"integrity":"sha512-SUs56DP2P6prjXTVyRH45GKEOLkdz8ZihSRtQ5+sGv2LNImC9Vg0rIGCG+lh9ufUVUZ/e6WToqen3RSxdfbB7Q==","signatures":[{"sig":"MEUCIQDj276nZCQsElG4eGOpzClmeXmangSep26QcwxanhFc/wIgD2S86w+/aHEQdtPkuDWNYzAI3OdGNz+M3vxI+TX5AGk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1192292},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"4430516ad9e3d471a6a70b1257b3bf15127dbead","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.0.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.0.1_1784830410418_0.0030187663397791553","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"@neohm/nestend","version":"3.0.2","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.0.2","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"ea576773b392dccc39fb22ac00961b8a26bda00a","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.0.2.tgz","fileCount":1042,"integrity":"sha512-neweqk2V+T6+1s/DMFG3JA9V2XbQJNraPTct9xM1OyNt2I4H0cCQqqBGaWOw3HkTmX4+h3DakbLHDbcbbUevqA==","signatures":[{"sig":"MEUCIHqwBLPMVXjQnQXOa4zcchqpW5F9hm1qZEpNgWK1NsenAiEA9cQIhpa6/seEk3iFWn7HTDIKK4C3e9E5HTrMm9PDpbM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1180908},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"fafbb9750d0c2ac161397f61dd15d07ca54971f8","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.0.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.0.2_1784831678651_0.22361732002996715","host":"s3://npm-registry-packages-npm-production"}},"3.0.3":{"name":"@neohm/nestend","version":"3.0.3","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.0.3","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"10c3cf786c5175abdb462ec49341fb483353483a","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.0.3.tgz","fileCount":934,"integrity":"sha512-rdeDjwuVrmPv7eyG+vXV4JrVmtg09eQtSRx6iRC8CUKWOM16YP7hxQvMMKwGFDICV7Rz6RIXtQZ9Y92qdNLQzw==","signatures":[{"sig":"MEUCIQDkkdmNAwyAtXK6buqt9sRwJalPzb+XmCT64Q8SIKbsfgIgOHnf8OEpm+a/7cVm5Wx5GgIWai73Pb/LXyQGTZLDohI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1070666},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"c824f50a980a85147b871cd25a1b378a8e9391a7","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.0.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.0.3_1784924501080_0.11464487350275543","host":"s3://npm-registry-packages-npm-production"}},"3.0.4":{"name":"@neohm/nestend","version":"3.0.4","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.0.4","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"54fd9dd340d7f528738e8dada55e62fdb386a552","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.0.4.tgz","fileCount":938,"integrity":"sha512-tQg8xgKmQ6d3QWhXoJaX/gCH/zorSwzF6caDE+8CSKlOy7jWRAKRMYWZZPm3trslCpZ8sHs97s+sN7UNf5xkgw==","signatures":[{"sig":"MEQCIBEJzOUL5ItmMFZ42atAT+ox5SMc+wl82M2aJ+beYyplAiAZqH1VowdSvMyHi6NWBuqMW1Yh6Zt/Tbm7vUWb4Afl+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1089334},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"c7581ea0c7f555807f6f215186463552ab6d2586","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.0.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.0.4_1785000584786_0.7736016133930941","host":"s3://npm-registry-packages-npm-production"}},"3.0.5":{"name":"@neohm/nestend","version":"3.0.5","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.0.5","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"1c57c4a1daa750c5e66d11fdd663b82dbe624a1f","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.0.5.tgz","fileCount":938,"integrity":"sha512-KdbCoVlVPIdnQYFiwJUVuXaNT5z2SkeYC2+liDcOS1vyooXGQRtw4qG88nDQJlKiRzVVl0TWso2idzUath9xxQ==","signatures":[{"sig":"MEYCIQDfc0yMVxmCl84IPlywOIxrbuW9kzeW3f38+MidPahdgAIhAJSiz10P+aW6FRCP3bU2v8J+B7XtJWO8mYc1fjo2riqv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1090863},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"c674ee54c96ead69308aaaf1569a314ad229a21c","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.0.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.0.5_1785511175656_0.13536446989059114","host":"s3://npm-registry-packages-npm-production"}},"3.0.6":{"name":"@neohm/nestend","version":"3.0.6","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.0.6","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"1197039b634b418ed9308e24112841ce35490b13","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.0.6.tgz","fileCount":938,"integrity":"sha512-jTOjVWEgt90vLTfeLpazeSrEU4rncDB+92hYgTxsueA+gT2OXsMByISu3h/Tn0AadgJhiK95MWX+sYsWDE3iQA==","signatures":[{"sig":"MEQCIHnAzSGSvp/eLbJ48mjcXMKQsFyNneDx2tK5HAfRaH4yAiBuKd81Z/lq3iWgnvyLM4exTPlB7I2Y9M5GrYKteSouLw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1091363},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"f77a3c8b8d8f47689f3820cf03bbdac9063bc904","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.0.6_1785517139419_0.8469657254390117","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@neohm/nestend","version":"3.1.0","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.1.0","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"fb25bb04e4985bc0f241a8fa2ffd11c64155e312","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.1.0.tgz","fileCount":966,"integrity":"sha512-2Bv42lJLcTENOvfVCxctbEFygFPJ4FbStUvRqYun7BPxrEyrpAYm4ojSPb8ebUH98dUgAjHOXZLK4j6mm+RgCA==","signatures":[{"sig":"MEQCIAEA+0TNXUx3XoviDgqTZn/6jupmogC7ohELt2Imq4Y6AiBIIkC2hSH3K4R629cd3GN5LWuYQhDhZXRgnPxrNyXGJQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1163372},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"701dde7c2e235dcdcfd3bb42a117cd789a170ed2","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.1.0_1785525288619_0.4632404025808452","host":"s3://npm-registry-packages-npm-production"}},"3.1.1":{"name":"@neohm/nestend","version":"3.1.1","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.1.1","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"9c3b1604c72f0677a8f7778dec54bf12bcfcb3fd","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.1.1.tgz","fileCount":966,"integrity":"sha512-ocSCwerLtNjLauytk+OSRFfOP4wRnJIkWBbCmbV9sDDas+NVvX28dQCsnVzD1aRtcsuaX4PQyt/HM8ykmzrmcQ==","signatures":[{"sig":"MEYCIQDTANV7pjKdqIiVe9ojPGVN7pYcMDFGgFVQV1wRgIdn4gIhALgeAb6HVyer2u56Hr0Fo8FVloFJjFtLBsffFjO1MmR8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1166063},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"c9f44fd3e4b8a6eac5d66dd50587f62d37b8b296","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.1.1_1785561275881_0.5851816262931226","host":"s3://npm-registry-packages-npm-production"}},"3.1.2":{"name":"@neohm/nestend","version":"3.1.2","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.1.2","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"894f203e390b64b0773406c9041798dd854065ba","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.1.2.tgz","fileCount":1014,"integrity":"sha512-oLGkj6e2y1l2owkXfo/PBmU8fHNmCzBjjCEmGEG07rTczaVsnAW/QFvc8BrZuoeExb7sc3goYBs9t84BaY/wqg==","signatures":[{"sig":"MEQCIBXt0DmvYsn4r14ICSmegXmtLk0Gpx/uznecNJlHX6bsAiBAPksicJgUFkvyEZq5FXTuEruIwfqP3lShCOgjDGjT3g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1233099},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"fb36bbb7f86bdb0b7e3c14113c884647d6e98492","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.1.2_1785568421191_0.7816835751837068","host":"s3://npm-registry-packages-npm-production"}},"3.1.3":{"name":"@neohm/nestend","version":"3.1.3","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.1.3","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"bc20aa0e72e528a50013e90bbef5594495d6b34c","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.1.3.tgz","fileCount":1018,"integrity":"sha512-74nG5VASYToMeDcCBEulqMJRaBt5fpFJ0ZWYPbhYCL0j1y27R7FMTOXlVdtPkm2MY+XCy37TLsUT5omtZb9HPA==","signatures":[{"sig":"MEUCIFoxraVOE63Rp4deZjLz1QN3JoSnY9iJmNzRrCBR1XcMAiEAwlCK/GIKcYsrge3f6HUKHh+i1Nc694eXmY2K4hU+pP8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1244721},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"1aac396e6d4568e701cecd36ba967a276fe81c99","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.1.3_1785573460990_0.7729599127943676","host":"s3://npm-registry-packages-npm-production"}},"3.1.4":{"name":"@neohm/nestend","version":"3.1.4","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.1.4","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"9ff4ec05286d7fdbc13f135b4875ca1052f28eaa","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.1.4.tgz","fileCount":1026,"integrity":"sha512-HUDTXmO8E5Z6q9xiKx4qg27gBQAGxAuu6ob9CPff3gto6nifEA4t+hkdWXgx/ynGytZSC4EFduf1owEgn8eRSQ==","signatures":[{"sig":"MEUCIG/tKTx6RkZ1nA/mVD5cBgByExvDaw3g/0hnDXh0YJ/7AiEAnwDWBB1rAW6xX2AdX9wqivXzPc16+iq3BFJL6us/7l4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1211514},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"de934d92cebb5e4632068a5811502d1fe2bcc297","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.1.4_1785612001293_0.46450035097780784","host":"s3://npm-registry-packages-npm-production"}},"3.1.5":{"name":"@neohm/nestend","version":"3.1.5","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.1.5","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"47c52d2ba8686a8a60a810e4cd155e2ad45519f1","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.1.5.tgz","fileCount":1026,"integrity":"sha512-pnFjOSuiXHtkZPpg8e4kPyJEjvTx1f2TBXH76e4u1UQINwAjxcnPz1nwpuOEhmsoXiunv8wVZkX/0hOR4GzSgA==","signatures":[{"sig":"MEUCIQCNBankvy733L6dhPfjWZKwlzIcGxLLDFRO1/ARM/vLVAIgRSqfJlRVNWtj/m7KZVeykmHof8SeZUHcpniCyjRLxYg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1211479},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"9d81ccde990ba6ced8f1403dddeb52e448511992","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.1.5_1785613945967_0.8206816944852269","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"@neohm/nestend","version":"3.2.0","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.2.0","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"4fd28c8f132a1d982f3104cd8ed08426e86583da","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.2.0.tgz","fileCount":1082,"integrity":"sha512-ld91XWT0ytS0xr3hS8mA+im5QqvjwG4/wlj5eHhe63z+FjIoBzydPKIKi9yYYiG+NLYAbiHgdsF8pM/oG+73+Q==","signatures":[{"sig":"MEYCIQCZjNbxQBCa1x5m3gCIyQwE1Z+AIxeNV3d/lXbMPyphXAIhAIPuPMlYmSdLEisXiscVPcHALybh1NxoInkMMXXuaBPB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1309000},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"3759770d700e0191c0b6445e0f87837727d9bd18","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.2.0_1785948329826_0.804694843429985","host":"s3://npm-registry-packages-npm-production"}},"3.3.0":{"name":"@neohm/nestend","version":"3.3.0","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.3.0","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"a18c971fbdfa7988f60efd178eb261efc1998803","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.3.0.tgz","fileCount":1098,"integrity":"sha512-PhRgg1gGHYstpI36SRJmJ1pQz7EE2RzdmAeGB/g8JNbx4PcEDKQm9ICbFfBFBJ+1cQZrqEE1OJslaoGESHJwUg==","signatures":[{"sig":"MEUCICC8uM/V3QuxNO4z8mCG+DrlJIxsRXVZnlAe06HKmYN5AiEAqJN954S3RzSU2nT7udVD8Wsqg913+rKN+m8E0u0YfyM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1337924},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"ec7bee9e1b1787d7b378c98e777ad9f8fc4031df","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.3.0_1786031152820_0.08837005389136232","host":"s3://npm-registry-packages-npm-production"}},"3.3.1":{"name":"@neohm/nestend","version":"3.3.1","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.3.1","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"876e93fce8f1daa56c69590ec9848dca3863594e","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.3.1.tgz","fileCount":1098,"integrity":"sha512-Htf9HDruVMA5F8sNK9Hft/qbNOv+rMiKrGn5ltE0wikDELUebo8Q/wzXZ5ScO3xBFx/lHACs6exPPtOCQEuAnA==","signatures":[{"sig":"MEUCIGjfPGkZAA23Xm95ciwuOIzX7OeNv6e2sDEv3w/krAP7AiEApl8YM70BnhE/hIgZTQqxBuaz4kiu0e+ZmdUv6odiPNk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1340667},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"08a686f47744cfb6fc4432af49a2a4c9f306813c","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.3.1_1786032699890_0.21061608129422105","host":"s3://npm-registry-packages-npm-production"}},"3.3.2":{"name":"@neohm/nestend","version":"3.3.2","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.3.2","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"36c70ef67eb4a6093aee1459b8f23c219f8b0205","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.3.2.tgz","fileCount":1110,"integrity":"sha512-M3vvywBS046/3FV1jTxoFwgflMPssyDTuG23noT9hyGml/cN0Hv2vHu+WmyfIz6AaCKkvcfYJlu33Iwnj2fLFg==","signatures":[{"sig":"MEUCIQD74DcR1cwUC3nWG0GdLZX1h/la5sR2enReXVx7DIiFEQIgdmUYVLhNWziXJJ41FTLtMRd8gReQIyGzIX1j+uK9svQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1365959},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"4a6a4fdd6a67171091b995e61721822d5b337d86","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.3.2_1786176195480_0.7954329381186389","host":"s3://npm-registry-packages-npm-production"}},"3.3.3":{"name":"@neohm/nestend","version":"3.3.3","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.3.3","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"287036bc4f946b77e93c45bb88578db8d7ca58d5","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.3.3.tgz","fileCount":1146,"integrity":"sha512-N+8ooRY89D9AX/T++7vR2GH06pHQgyOIlpbR11CwmfIe25zOckWF8a6VsOyy2qucL1IsrmbGy6SW4eGoCA4LFA==","signatures":[{"sig":"MEUCIECyc9CtJJnHrNgJL5ZMUSn9TLpy9i3VmZ2LX4pzRk/1AiEArPUgYntEU4VE+re2fn2305fdqALyEa7YCG1WtO3TJ20=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1421390},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"bdcb257e37641fc8cc0f81cc8740e65a50aa7291","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.3.3_1786634308935_0.8022439003659514","host":"s3://npm-registry-packages-npm-production"}},"3.3.4":{"name":"@neohm/nestend","version":"3.3.4","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.3.4","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"3908de1524bece006137610a5a46e61907eb8ef3","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.3.4.tgz","fileCount":1146,"integrity":"sha512-QElv82Hr1epjzoXZbFbyDfBLdmIhV3G8oRqtFWAV7wvn/UY3QsuA5AccaZ2sg7zKf2GCaQ07ow7ClAo2FFVSug==","signatures":[{"sig":"MEUCIBzh18M/fU6o3+eNyU05YQGmthjqfoHopTMFp3uh3SiAAiEAjGO02poRCFwfVEyaVJ3WyryTTI/m+2KSKxk82Gkx0uA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1428473},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"965854221603ff54b0580f3f130a63125b64eda5","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.3.4_1786640788388_0.5316724073225962","host":"s3://npm-registry-packages-npm-production"}},"3.3.5":{"name":"@neohm/nestend","version":"3.3.5","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.3.5","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"b54c8fa264f0774cedb356b6c2df313f67b53dca","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.3.5.tgz","fileCount":1146,"integrity":"sha512-+ulTykJp8rpX05CP2hf1GVAWDmOQH9o42LxipJB4opqjYP6vS/MhPdIJisYGocwQAL0/UbBHDgWWwPKRWlZiCQ==","signatures":[{"sig":"MEQCIAdkdwQHKz1DzKGEKsbHypoFF0TbQdTugSYERPcBolh9AiAIEreo/ygP9OXLVYfmR24EPfPB3KBxO8l7aaxVdncg9Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1429617},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"43cbfeeb3bfdf97796280ca691db41cda069f4d5","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.3.5_1786641845155_0.21635842746518197","host":"s3://npm-registry-packages-npm-production"}},"3.3.6":{"name":"@neohm/nestend","version":"3.3.6","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.3.6","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"2595b539831180d492dd00af2297fb92a962e43b","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.3.6.tgz","fileCount":1138,"integrity":"sha512-nYCiV0kY+Jp9mSIfex2RzAHJE0L2AMvfEqTvcM/9VQnfirOknG8JbBdo4Sy+UyP3lUKhGfpABFhil1BM8Vg8lg==","signatures":[{"sig":"MEUCIAumsVw+mUmv46Ov9Hr8PaEB0VrNaz6vitTmaVcbbU64AiEA5Tvy2IjY5tWO/iyNOk8n7A4uWlrgWIEKHcRh8VAq2sY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1427869},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"920d5b063ae0238fdb10fb20a69edb07e6437ca3","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.3.6_1787341790995_0.23549748949535076","host":"s3://npm-registry-packages-npm-production"}},"3.3.7":{"name":"@neohm/nestend","version":"3.3.7","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.3.7","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"dbb509501ad06fd702dbf63ebbad767473c4e753","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.3.7.tgz","fileCount":1142,"integrity":"sha512-lIy6r31prAEW15YSBe6f/b7cF2kojmIAV1FT9yNTwkS6HMWYHH9XSuwgbDapqbyExm9vjdwfybe7RbEt6gwwAg==","signatures":[{"sig":"MEQCIEGTKt7LHVQlb7T9u1R5oTgJHZnRrmtoi2nHy+7jT2hQAiA5VAI/BYrftdyGn6xN7iajDMT9VU5mHHjztDDJ/bV/yw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1433913},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"535d4a2eaecc1f1826dae2918818b75840f7d3b3","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.3.7_1787857281026_0.577630216984528","host":"s3://npm-registry-packages-npm-production"}},"3.3.8":{"name":"@neohm/nestend","version":"3.3.8","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.3.8","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"27bc3c485d60d2fe19cbbfd8b8cfb77cc4af5c72","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.3.8.tgz","fileCount":1170,"integrity":"sha512-JUrfxDkaz6gA6mIzjD5O+acXMbvl88t5okUHxPpbz2nxhGGtW/MJrVQNMf7lMACwhfISyJ/27JqIuWQCvN1VsQ==","signatures":[{"sig":"MEQCIC5qSoQ+48UmwKo/pgNEs7lQbPEWn7Q879qzoxI7WNSoAiAS8iSACng4Nf1KeNGI1JMdzFzNal/CeCeM/RQ9r9ZRRw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1471924},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"b407263938b00da3cbac740c4db41995ddb894a1","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.3.8_1787941088139_0.1711560985318572","host":"s3://npm-registry-packages-npm-production"}},"3.3.9":{"name":"@neohm/nestend","version":"3.3.9","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.3.9","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"ec40f20b89568fe49caa4965b7f44518337c4fad","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.3.9.tgz","fileCount":1174,"integrity":"sha512-xVA8pqBR6WovMHP3Z0VIaY21D89JxlLggFLkkg29iTufW50/Xn95al2RbfND0J6KYto2wOlYaur27KeykL4qmA==","signatures":[{"sig":"MEUCIQDhtL/vB+24PetiVMnwUwIFNUvs5LMsO6HfjgdlqK6jQgIgZpFHpPMERUyp2oifqrDf+oZE7mI3EJEd2za/xpcbjVg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1493479},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"6816ce4ddcdcade232b76b612ae3388a6e50c24b","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.3.9_1788030488402_0.9751685192223452","host":"s3://npm-registry-packages-npm-production"}},"3.3.10":{"name":"@neohm/nestend","version":"3.3.10","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.3.10","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"592252371f4a4a386db33852f87502b7c1216768","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.3.10.tgz","fileCount":1242,"integrity":"sha512-ResLXWpPaDBe87d6EC5dYd7X8HNJ8lUYGCcDLPx+e4rSk0SmbjmrQUA4R1LI5QqnaaqhAGUTRMdVjqne5SEDvQ==","signatures":[{"sig":"MEUCIQCsO0pKpR7kOo0H5jROuTjda0PYy6emhobkHnLoEqPC9gIgXqAOlMaLMfSqluAdYfMUsbe+V5u2Lwv5rg73EANzjdI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1583936},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"7996e3c9186527a8929cf0633cf4162988883762","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.3.10_1788178209262_0.2384094497162108","host":"s3://npm-registry-packages-npm-production"}},"3.3.11":{"name":"@neohm/nestend","version":"3.3.11","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@3.3.11","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"6ba7308cedb2972017c9c833dd5153ce15c8d47a","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-3.3.11.tgz","fileCount":1258,"integrity":"sha512-oyiNdsoba1o8F9g5UYzmTJL5gy6eR++5KCY1zmqex6X3JzlatqC+j9vVsj5l1jplQn/KuHGp4txVdSEpZQmmyw==","signatures":[{"sig":"MEUCIAuGvbf5cWV3Qm9xq1OtIV3mN6cmfTkH2SuTg5InQQD0AiEAr9PWCYtZxkshXsp4MQmOWEuj8cWJXAKGOMlEOTyqw58=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1611121},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"10c6a26ea7658ebc820d76d7d553009609306f68","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^5.78.0","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.6.2","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.4","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","typeorm-naming-strategies":"^4.1.0","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.0","eslint":"^9.18.0","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","ts-loader":"^9.5.2","@eslint/js":"^9.18.0","typescript":"^6.0.3","@nestjs/cli":"^11.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^11.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_3.3.11_1788378057290_0.5150733716911","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@neohm/nestend","version":"4.0.0","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@4.0.0","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"479331196b34c48eb5504b1ffe5ca3e3690fdbee","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-4.0.0.tgz","fileCount":1262,"integrity":"sha512-+kCp1IPWKZNUmXyeXkwUxgQBSkVid0wCSq76yKLboWnYEy/beQsW0plEuQw7j/FjkF1qTcosRucTn+Gb8QJg9g==","signatures":[{"sig":"MEUCIB3GLSqtHeEiPI3N9AMoLFxkp1fqlmZoQoTQN+F+j2bLAiEAt6EBlMFsCvE7dNOJokjAcM3ibV+pcbtvN3cWAPyKwOI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCICgVvHbu5BKqulQGFFdE3NKgDsPwIrLB57hc7psTiTlfAiEAnMe0kZtWlmF5QzwRMjmpkjFQS29kG2amiyT2vhmXWWg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1615620},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"ecf2b7737ffffa2855ea2f5429ed9a7603e5c8a2","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"resolutions":{"test-exclude":"^8.0.0"},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^6.3.4","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.10.0","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.5","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.1","eslint":"^10.9.1","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","@eslint/js":"^10.0.1","typescript":"^6.0.3","@nestjs/cli":"^12.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^12.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_4.0.0_1788454587620_0.44738119421199185","host":"s3://npm-registry-packages-npm-production"}},"4.0.1":{"name":"@neohm/nestend","version":"4.0.1","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@4.0.1","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"8b402a126e12d64968b41665c93bdd7ece5cc548","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-4.0.1.tgz","fileCount":1262,"integrity":"sha512-AD/ASuOlKf41XezLDB1vW3MZnAkvznDutSkxax8nHs2gQ7XenjrONNd1vyhFe5NeNuJ9viz5NZMFWXCCa0N2uA==","signatures":[{"sig":"MEYCIQD2HcEaHKuGKAeYGHayWHwXQdxuPoGCk8kc8n52jyrfCQIhAO2lcMjkWikhEyo6eWHV/ozBM+/PXF+EQSMYSj1AdGSf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAnfz8puU5jUhdV5lZLM3W9DaL8EePf2Cz99CBPGxmdaAiEA2d1CujpbVCgFWGJQ5mL+se738Eag3kogEbd4SdIA5as=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1619866},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"7f53da34f1a4448f76d8ad88a9112d06324c16f7","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"resolutions":{"test-exclude":"^8.0.0"},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^6.3.4","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.10.0","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.5","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.1","eslint":"^10.9.1","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","@eslint/js":"^10.0.1","typescript":"^6.0.3","@nestjs/cli":"^12.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^12.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_4.0.1_1789312731892_0.5799974070547029","host":"s3://npm-registry-packages-npm-production"}},"4.0.2":{"name":"@neohm/nestend","version":"4.0.2","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@4.0.2","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"e8cad54a4ab9428ad40823af1472e96a7263f375","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-4.0.2.tgz","fileCount":1262,"integrity":"sha512-Lr+0Mvbhpu89Cli7FNQe9nBa+YIOguzQWrT55yXYAMToabmcjdU2eX8f3mEYWckd8MvwgK5mLvRLvLMXMMPmXg==","signatures":[{"sig":"MEUCIAZmUarUTawVzIGpMN2xI6VuxF3djI/XTSwNlSBAkejoAiEA3Q/F0j2LHWQlUT77M+XVCELVYajng+03RTw/BSgbx88=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGTcc+4fW/0gy2d+TyF7gPTWX1qJQgWVc2+h2k7SAq4SAiEA3GzF353lfv3/68Hmt24LLL/83frEr8HiKIa15/LSP88=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1636807},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"208fb5604ab947d38059d23438f9774e14ea68c9","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"resolutions":{"test-exclude":"^8.0.0"},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^6.3.4","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.10.0","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.5","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.1","eslint":"^10.9.1","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","@eslint/js":"^10.0.1","typescript":"^6.0.3","@nestjs/cli":"^12.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^12.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_4.0.2_1789748938970_0.18716168958707224","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"@neohm/nestend","version":"4.1.0","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@4.1.0","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"c670a59b24eb3f79d79a36dcdf91d6855324153d","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-4.1.0.tgz","fileCount":1358,"integrity":"sha512-TmUvw1PCgqpvp6sTdDUhv4yqCGepK0Bk9YAcxQwyVpiYGlTwFes32PDFOMNNedDoiGqza7PJCUW3Kg5jT70y1w==","signatures":[{"sig":"MEYCIQCS3PDLVM6DPMx3oOZIiwRsD6robbYGg/8Qo01lRdskaAIhALWXRAXsiK+Rx0oT2x3ltgq4EnxZS8rGgt7kAPIrxLTc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICkNFF/UIGVSaMWml+36ADpBHqKi3KsO1RS525Oh1X+jAiABwxPOZyCP2nbUbqyAVb+1s9iDJfHu2CTJQ0sHecq+bw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1831906},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"148187e23503658f12b24778ec77bdeb5ef3254e","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"resolutions":{"test-exclude":"^8.0.0"},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^6.3.4","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.10.0","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.5","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.1","eslint":"^10.9.1","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","@eslint/js":"^10.0.1","typescript":"^6.0.3","@nestjs/cli":"^12.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^12.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_4.1.0_1790358830263_0.1712089600452038","host":"s3://npm-registry-packages-npm-production"}},"4.1.1":{"name":"@neohm/nestend","version":"4.1.1","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@4.1.1","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"1f89ab6586114fbaf6454f0cae79b1bee485ad77","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-4.1.1.tgz","fileCount":1354,"integrity":"sha512-Xq7KY4MOamJV9zqZrNzozg9OZ5qKtYE2eW78+REXedDTDLpBwkbIXo93YBuFR7xKxyr/Sd29YaflnO70tOStiQ==","signatures":[{"sig":"MEUCIQDyfphpUKW7DX1JeJknheBpA47ilxgrAHDW0TPmW0Zo8QIgepqe1jcXQnyHyADyA2TI8yx5SRAqCIbaa+n+K8R1sHM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCJYLzb5fYSWeZW761NFry2nO+WzdvFhfAAinkc1OoisQIgE8ncJxIP8joVXlEKKZFGl6ZZ6q6/JPGXQZ/q9ucpxqM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1828332},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"80a7614d7dce040aa8e423a9723c9578ff9e35f7","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"resolutions":{"test-exclude":"^8.0.0"},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^6.3.4","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.10.0","@nestjs/core":"^11.0.1","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.5","@nestjs/common":"^11.0.1","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.4","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.0.1","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.1","eslint":"^10.9.1","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","@eslint/js":"^10.0.1","typescript":"^6.0.3","@nestjs/cli":"^12.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^12.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_4.1.1_1790618033027_0.7744799952565502","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"@neohm/nestend","version":"5.0.0","author":{"name":"Neohm"},"license":"MIT","_id":"@neohm/nestend@5.0.0","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"dist":{"shasum":"8bfb225694bf56f9fe627e6e9696324554bd52b2","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-5.0.0.tgz","fileCount":1626,"integrity":"sha512-2eA/c1cpDTzCmB489VWSi5g8lr0E0N4GB1r1/u7SSTZFnusz/s6aGqeqqMCQXQMQJ//UBNRtmpk8TLfPkgB55Q==","signatures":[{"sig":"MEUCICcdcm5zuz3xeSTdvGJsP9JkWR7I04+eTDN9soMqavdpAiEAqDG99bEltMQFUjts7XlO6S0Gl22T4baEk2fwuimxMlY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD2g4E1lr+seiS6gaN9v1cuWaCWa5KPwZJYQYDQ6pbdcQIhAM8kXHjXnYVD/0rnonTZvSEAVhzvrp2BOaT/hIYB1qdD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2427212},"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":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"8e96eff4f99075f70018ca69bb868ede0cc7ba76","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"resolutions":{"qs":"^6.16.0","body-parser":"^2.3.0","test-exclude":"^8.0.0","@nestjs/swagger/js-yaml":"^5.4.2"},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^6.3.4","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.10.0","@nestjs/core":"^11.1.6","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.5","@nestjs/common":"^11.1.6","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.7","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.2.7","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.1","eslint":"^10.9.1","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","@eslint/js":"^10.0.1","typescript":"^6.0.3","@nestjs/cli":"^12.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^12.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/nestend_5.0.0_1791003217196_0.5009517428581278","host":"s3://npm-registry-packages-npm-production"}},"5.0.1":{"_id":"@neohm/nestend@5.0.1","dist":{"shasum":"318155d1dc4b8eb72f8e5fa11c1fdac67679acee","tarball":"https://registry.npmjs.org/@neohm/nestend/-/nestend-5.0.1.tgz","fileCount":1626,"integrity":"sha512-pvNpEGN9R7l75UoaUk7aiNW/onnC3i5ROTddHf4zFJjz1kFBbtzvhihJK6xiJ6/duZ4+iVWZi+8eEo6nnLeUiQ==","signatures":[{"sig":"MEUCIQC9aEblKacQfVWPGySQ/Zv1tDmyHi8Os6L8EnvKtJwsDQIgd0I26spPrMG0HwfzqsPs3e1ubWjK23O5EVCf4+Y7wr0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDeXdu6CjoeRlTZMIxySYOPnFLhkyPbx1F3l6osxsU6eQIgQq2o8cFNolqXY/RFdNL6CRn25fvzetcyvv9tG6s5XD0="}],"unpackedSize":2427200},"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","name":"@neohm/nestend","types":"dist/index.d.ts","author":{"name":"Neohm"},"engines":{"node":">=22 <25"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"}},"gitHead":"baf82a5853301e1b966b48ee1801d335bd9db435","license":"MIT","scripts":{"lint":"eslint \"{src,test}/**/*.ts\" --fix","test":"jest","build":"nest build","format":"prettier --write \"src/**/*.ts\"","test:cov":"jest --coverage","start:dev":"nest start --watch","start:prod":"node dist/main","test:watch":"jest --watch","build:watch":"nest build --watch","prepublishOnly":"yarn build"},"version":"5.0.1","_npmUser":{"name":"ashim404","email":"ashim.baral50@gmail.com"},"_npmVersion":"11.13.0","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","directories":{},"maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"resolutions":{"qs":"^6.16.0","body-parser":"^2.3.0","test-exclude":"^8.0.0","@nestjs/swagger/js-yaml":"^5.4.2"},"_nodeVersion":"24.16.0","dependencies":{"rxjs":"^7.8.1","uuid":"^14.0.0","minio":"^8.0.7","bcrypt":"^6.0.0","bullmq":"^6.3.4","ioredis":"^5.11.1","typeorm":"^1.1.0","passport":"^0.7.0","@nestjs/jwt":"^11.0.2","cron-parser":"^5.10.0","@nestjs/core":"^11.1.6","passport-jwt":"^4.0.1","@nestjs/bullmq":"^11.0.5","@nestjs/common":"^11.1.6","@nestjs/config":"^4.0.4","@nestjs/swagger":"^11.4.7","@nestjs/typeorm":"^11.0.1","class-validator":"^0.15.1","@nestjs/passport":"^11.0.5","reflect-metadata":"^0.2.2","class-transformer":"^0.5.1","@aws-sdk/client-s3":"^3.1067.0","@aws-sdk/client-ses":"^3.1067.0","@nestjs/platform-express":"^11.2.7","@aws-sdk/s3-request-presigner":"^3.1067.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.1","eslint":"^10.9.1","globals":"^16.0.0","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","supertest":"^7.0.0","@eslint/js":"^10.0.1","typescript":"^6.0.3","@nestjs/cli":"^12.0.0","@types/jest":"^30.0.0","@types/node":"^24.0.0","@types/uuid":"^11.0.0","@types/bcrypt":"^6.0.0","@types/multer":"^2.1.0","@types/express":"^5.0.0","tsconfig-paths":"^4.2.0","@nestjs/testing":"^11.0.1","@eslint/eslintrc":"^3.2.0","@types/supertest":"^6.0.2","typescript-eslint":"^8.20.0","@nestjs/schematics":"^12.0.0","source-map-support":"^0.5.21","@types/passport-jwt":"^4.0.1","eslint-config-prettier":"^10.0.1","eslint-plugin-prettier":"^5.2.2"},"peerDependencies":{"puppeteer":">=22.0.0","@sentry/node":">=8.0.0","firebase-admin":">=12.0.0"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"@sentry/node":{"optional":true},"firebase-admin":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nestend_5.0.1_1791039585997_0.7819702584520869"}}},"time":{"created":"2026-06-13T15:37:44.967Z","modified":"2026-10-03T14:59:46.288Z","0.1.0":"2026-06-13T14:22:24.608Z","1.0.0":"2026-06-13T15:37:45.306Z","1.0.1":"2026-06-14T02:25:34.516Z","1.0.2":"2026-06-14T02:52:43.544Z","2.0.0":"2026-07-16T17:25:23.164Z","2.0.2":"2026-07-16T18:16:20.342Z","2.0.3":"2026-07-17T18:38:09.321Z","2.0.4":"2026-07-17T19:02:22.648Z","2.0.5":"2026-07-20T08:09:52.191Z","3.0.0":"2026-07-23T17:25:17.452Z","3.0.1":"2026-07-23T18:13:30.614Z","3.0.2":"2026-07-23T18:34:38.824Z","3.0.3":"2026-07-24T20:21:41.245Z","3.0.4":"2026-07-25T17:29:44.947Z","3.0.5":"2026-07-31T15:19:35.884Z","3.0.6":"2026-07-31T16:58:59.613Z","3.1.0":"2026-07-31T19:14:48.762Z","3.1.1":"2026-08-01T05:14:36.049Z","3.1.2":"2026-08-01T07:13:41.387Z","3.1.3":"2026-08-01T08:37:41.156Z","3.1.4":"2026-08-01T19:20:01.518Z","3.1.5":"2026-08-01T19:52:26.155Z","3.2.0":"2026-08-05T16:45:30.087Z","3.3.0":"2026-08-06T15:45:53.011Z","3.3.1":"2026-08-06T16:11:40.050Z","3.3.2":"2026-08-08T08:03:15.630Z","3.3.3":"2026-08-13T15:18:29.083Z","3.3.4":"2026-08-13T17:06:28.526Z","3.3.5":"2026-08-13T17:24:05.297Z","3.3.6":"2026-08-21T19:49:51.190Z","3.3.7":"2026-08-27T19:01:21.194Z","3.3.8":"2026-08-28T18:18:08.423Z","3.3.9":"2026-08-29T19:08:08.545Z","3.3.10":"2026-08-31T12:10:09.535Z","3.3.11":"2026-09-02T19:40:57.497Z","4.0.0":"2026-09-03T16:56:27.744Z","4.0.1":"2026-09-13T15:18:52.004Z","4.0.2":"2026-09-18T16:28:59.074Z","4.1.0":"2026-09-25T17:53:50.348Z","4.1.1":"2026-09-28T17:53:53.141Z","5.0.0":"2026-10-03T04:53:37.310Z","5.0.1":"2026-10-03T14:59:46.086Z"},"author":{"name":"Neohm"},"license":"MIT","description":"Reusable NestJS utilities: entities, queue, auth, cache, encryption, migrations and more","maintainers":[{"name":"ashim404","email":"ashim.baral50@gmail.com"}],"readme":"# @neohm/nestend\n\nReusable NestJS building blocks for SaaS backends: entities, migrations, JWT auth\n(+ Google SSO), BullMQ queueing, Redis caching, encryption, system properties,\ndocument storage (S3 / MinIO), raw SQL on a read replica, outbound HTTP, templated\nSES email, logging and monitoring interceptors, and more — all behind one flat import.\n\n```ts\nimport {\n  CommonEntity,\n  QueueService,\n  AuthService,\n  DocumentService,\n} from '@neohm/nestend';\n```\n\n> Full, verbose reference (every service, method, env variable, and an end-to-end\n> integration guide): see [`documentation.tex`](./documentation.tex).\n\n## Installation\n\n```bash\nyarn add @neohm/nestend\n```\n\nCopy [`.env.example`](./.env.example) into your project and fill in real values —\nit documents every env variable the library reads.\n\n## Quick Start\n\nAll modules work as **plain class imports** — `.register(options)` is only needed for\noverrides (named data source, custom queue name):\n\n```ts\nimport { Module } from '@nestjs/common';\nimport { ConfigModule } from '@nestjs/config';\nimport { TypeOrmModule } from '@nestjs/typeorm';\nimport {\n  CommonModule,\n  SystemPropertyModule,\n  QueueModule,\n  AuthModule,\n  DocumentModule,\n  TenantModule,\n  NotificationModule,\n} from '@neohm/nestend';\n\n@Module({\n  imports: [\n    ConfigModule.forRoot({ isGlobal: true }),\n    TypeOrmModule.forRootAsync({\n      /* your datasource */\n    }),\n    CommonModule, // global: encryption, cache, monitoring, audit\n    SystemPropertyModule, // sys_properties get/set\n    QueueModule, // BullMQ queue + worker (BULL_* env vars)\n    // ...or own the Redis connection in your own config, keeping one instance:\n    // QueueModule.withConnection(queueConnection),\n    AuthModule, // JWT access/refresh auth + API keys\n    DocumentModule, // S3 / MinIO file storage\n    TenantModule, // multi-tenancy context + middleware\n    NotificationModule, // in-app + FCM push notifications\n  ],\n})\nexport class AppModule {}\n```\n\n```ts\n// main.ts\nimport { NestFactory } from '@nestjs/core';\nimport type { NestExpressApplication } from '@nestjs/platform-express';\nimport { applySecureDefaults, validateEnvironment } from '@neohm/nestend';\n\nvalidateEnvironment(); // fail fast on missing/weak secrets and bad config\nconst app = await NestFactory.create<NestExpressApplication>(AppModule);\n// Security headers, trust proxy, body limits, CORS allowlist, StrictValidationPipe,\n// GlobalExceptionFilter, logging/monitoring interceptors, shutdown hooks,\n// and Swagger only when ENABLE_SWAGGER=true.\napplySecureDefaults(app);\n```\n\n## Public API Surface\n\nThe barrel (`src/index.ts`) exports only what a consuming app builds against: every\nmodule (plus its `*ModuleOptions`), every entity including the abstract bases, the\nmiddlewares and request-context helpers (`Auth`, `AdminAuth`, `ApiKeyContext`), the\ninjectable services, guards, decorators, base classes, common DTOs, utilities,\nidentifier constants/maps, and the types those signatures name — plus everything in\nthe notification and document modules.\n\nInternal by design: the controllers, DTOs and processors behind the built-in endpoints\n(the whole `admin` module beyond `AdminModule` itself, `AuthController`,\n`AdminAuthController`, `ImpersonationController` and `ImpersonationService`), the\npassport strategies, `JobConsumer` and the framework\njobs/subscribers/schedule resolvers, the `FILTER_OPERATORS` registry, the internal\n`*Default` enums, and the migration classes. Import the module and call the endpoints —\nthese are free to change without a breaking release.\n\n## Feature Map\n\n| Area              | Key exports                                                                                                                          | Notes                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |\n| ----------------- | ------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Entities          | `RootEntity`, `CommonEntity`, `CommonAdminEntity`, `UserEntity`, `AdminUserEntity`, `SystemRoleEntity`, `SystemAdminRoleEntity`, ... | uuid PK, soft deletes, `created_by`/`updated_by` (+ `creator`/`updater` relations), jsonb `attributes`; entity-level `findOneOrNew`, `hardDelete`, `restore`, `paginate` statics plus a row-wise `softDelete()`                                                                                                                                                                                                                                                                                         |\n| Migrations        | `MigrationUtility`, `SeederUtility` (the 31 table migrations ship in `dist/migrations` — glob them, they are not barrel exports)     | fluent `this.string()`, `this.numeric()`, `addRecord()` seeding                                                                                                                                                                                                                                                                                                                                                                                                                                         |\n| Queue             | `QueueModule`, `QueueModule.withConnection()`, `QueueService`, `CommonJob`                                                           | BullMQ `@Processor`/`WorkerHost` consumer; auto-discovered jobs, duplicate prevention, recurring schedulers, completed jobs cleared from Redis on success (1-day TTL on failures), `clearQueue()`, retries, failures persisted to `sys_failed_jobs`; connection from `BULL_REDIS_*` or supplied by the app — never register `BullModule.forRoot()` yourself, two roots race over the worker's connection                                                                                                |\n| Scheduled events  | `SystemScheduledTaskEntity`, `ScheduledEventEntity`, `ScheduleKind`, `ScheduleSpec`, `IsCronExpression`                              | schedule definitions in `sys_scheduled_tasks` → events in `sys_scheduled_events`; interval / cron / once specs with timezones, drift-free slots, horizon materialisation, catch-up + overlap policies, fire-once dispatch with backoff, cadence via `SCHEDULED_EVENT_MIN`                                                                                                                                                                                                                               |\n| Auth              | `AuthModule`, `AuthService.validateRole()`, `RoleTier`, `TenantRole`, `Auth`, `JwtMiddleware`                                        | imperative auth (open by default); `<module>.<tier>` role hierarchy (manager > writer > viewer), with `global.admin` overriding every role check; JwtMiddleware resolves the user into `Auth`'s AsyncLocalStorage context per request; access + rotating refresh tokens; session-based logout invalidation (`sys_auth_sessions`); Google SSO via ID token at `POST /auth/google`; impersonation — a tenantless `has_global_access` user signs into one organization at `POST /auth/impersonation/login`; multi-organization membership with per-organization roles, organization switching and `global.admin` invitations (`TenantMembershipService`, `TenantInvitationService`) |\n| Admin auth        | `AdminAuthService.validateRole()`, `AdminAuth`, `AdminJwtMiddleware` (endpoints at `/admin/auth`)                                    | fully separate stack for back-office admins — own users table (`sys_admin_users`), own roles (`sys_admin_roles`/`sys_auser_roles`), own sessions/refresh tokens (shared tables, `is_admin` flag)                                                                                                                                                                                                                                                                                                        |\n| API keys          | `ApiKeyService`, `ApiKeyGuard` / `ApiKeyMiddleware`, `@ApiKeyScopes()`, `ApiKeyContext`                                              | hashed keys in `sys_api_keys` (admin-owned), one tenant per key, expiry/revocation, `x-api-key` header; `validateAccess(scope)` returns the tenant the key acts for                                                                                                                                                                                                                                                                                                                                     |\n| Scopes            | `ScopeService`, `AuthService.validateAccess()`, `ScopeEntity`, `TenantScopeEntity`, `ApiScopeEntity`                                 | one feature named once in `sys_scopes`, optionally with child scopes under it, then granted per organization (`sys_tenant_scopes`) or per API key (`sys_api_scopes`) — never an array on the principal                                                                                                                                                                                                                                                                                                                                         |\n| Multi-tenancy     | `TenantModule`, `TenantEntity`, `CommonTenantEntity`, `TenantContextService`, `TenantContextMiddleware`                              | AsyncLocalStorage tenant context bound from the authenticated session (or API key), never a client-supplied header; tenants are onboarded by admins (`TenantEntity.creator` → `AdminUserEntity`)                                                                                                                                                                                                                                                                                                                                                      |\n| Admin             | `AdminModule` (its controllers, DTOs and processors are internal — import the module and hit the endpoints), `GlobalAdminRoles`      | back-office APIs: tenant onboarding, client/admin/system user registration (single + bulk), the `has_global_access` grant that enables impersonation, tenant + scheduled-task listing, the email/PDF template catalogues (read at content-reader, written at content-manager, deleted at global admin); 4-tier `GlobalAdminRoles` gate over `sys_admin_roles`; Swagger at `/docs` (hidden in production)                                                                                                                                                                                                                 |\n| Notifications     | `NotificationModule`, `NotificationService`, `FcmPushNotificationService`                                                            | in-app rows + FCM push (optional `firebase-admin`); device token registry                                                                                                                                                                                                                                                                                                                                                                                                                               |\n| Email (SES)       | `EmailNotificationService`, `ProcessEmailNotification`, `EmailTemplateEntity`, `EmailNotificationLogEntity`                          | templates in `sys_email_templates` (managed from the admin surface) rendered by a remote service, dispatched via SES per recipient (to/cc/bcc); logged to `sys_email_notification_logs` outside production; dispatch skipped when `AWS_SES_FROM_ADDRESS` unset                                                                                                                                                                                                                                                                           |\n| Audit             | `AuditService`                                                                                                                       | `saveAuditLog(old, new)` with changed-value diffing into `sys_audit_logs`                                                                                                                                                                                                                                                                                                                                                                                                                               |\n| Cache             | `CacheService`                                                                                                                       | Redis, TTL objects (`{days, hours, min}`), transparent encryption                                                                                                                                                                                                                                                                                                                                                                                                                                       |\n| Encryption        | `EncryptionService`                                                                                                                  | AES-256-GCM, scrypt-derived keys                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |\n| System properties | `SystemPropertyModule`, `SystemPropertyService`                                                                                      | cached + optionally encrypted key/value settings in `sys_properties`                                                                                                                                                                                                                                                                                                                                                                                                                                    |\n| Documents         | `DocumentModule`, `DocumentService`, `S3BucketDocumentService`, `MinioBucketDocumentService`                                         | `POST /api/documents/upload` (multipart) or `uploadDocument(multerFiles) → links[]`; driver chosen via `DOCUMENT_STORAGE_DRIVER`; `sys_document_uploads` is the file, `sys_documents` the link to one of your records (`system_generated` marks the ones the backend produced itself)                                                                                                                                                                                                                    |\n| PDF documents     | `PdfService`, `PdfTemplateService`, `ProcessPdfDocument`, `PdfTemplateEntity`, `PdfRenderOptions`                                     | templates in `sys_pdf_templates` rendered to HTML by a remote service, rasterized by headless Chromium (`renderHtmlToPdf(html) → Buffer`, honours the document's own `@page` rules and paginates to any length), then stored — `ProcessPdfDocument` writes both rows and flags the `sys_documents` one `system_generated`; optional peer dep `puppeteer`                                                                                                                                                  |\n| HTTP              | `CommonController`, `GlobalExceptionFilter`, common DTOs                                                                             | health endpoint base controller, uniform error envelope                                                                                                                                                                                                                                                                                                                                                                                                                                                 |\n| Raw SQL           | `SqlService`, `SqlTarget`                                                                                                            | named `:key` placeholders always bound as driver params, `:...key` array expansion; runs on the read replica (`DB_READ_*`) with transparent primary fallback; `fetchOne`/`fetchScalar`/`exists`/`count`/`paginate` helpers                                                                                                                                                                                                                                                                              |\n| List endpoints    | `CommonListProcessor`, `CommonListFilterDto`, `FilterDto`, `CommonListFilterConfig`                                                  | allowlisted columns, parameterised operators (`eq`…`isNull`), typed value casting (`str`/`num`/`date`/`bool`/`null`), multi-sort + paginated on the read replica                                                                                                                                                                                                                                                                                                                                        |\n| Outbound HTTP     | `RemoteRequestService`, `ApiRequestTypeEnum`, `ApiContentTypeEnum`                                                                   | injectable `fetch` wrapper (global via `CommonModule`); `getApiResponse<T>()` parses JSON/text and throws `OperationException` on non-2xx, `getApiRawResponse()` returns the raw `Response`; JSON + form-urlencoded body serialisation                                                                                                                                                                                                                                                                  |\n| Observability     | `LoggingInterceptor`, `MonitoringInterceptor`, `MonitoringService`                                                                   | Sentry auto-registers when `@sentry/node` + `SENTRY_DSN` present; pluggable `MonitoringAdapter`                                                                                                                                                                                                                                                                                                                                                                                                         |\n| Jobs/Events       | `CommonJob`, `CommonSubscriber`, `CommonDataProcessor`                                                                               | dispatch/handle separation, discovery-based registration, worker-event lifecycle, column-change detection, `created_by`/`updated_by` stamped from the `Auth` context in `beforeInsert`/`beforeUpdate`, field error collection                                                                                                                                                                                                                                                                           |\n| Constants & maps  | `baseEntityConstants`, `baseJobConstants`, `baseEntityMaps`, `baseJobMaps`                                                           | centralised dotted identifiers (`as const`) plus identifier → class maps of every concrete entity and job (abstract bases excluded); map keys are computed from the constants, so renames propagate at compile time                                                                                                                                                                                                                                                                                     |\n\n## Environment Variables\n\nCopy [`.env.example`](./.env.example) into your project. Every variable is optional\nunless marked **required**.\n\n### Application\n\n| Variable     | Default       | Description                                                                                                                                          |\n| ------------ | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `SERVER_ENV` | `development` | Runtime environment (`development` / `staging` / `production` / `test`). Swagger docs at `/docs` are mounted in every value **except** `production`. |\n| `PORT`       | `8000`        | HTTP port the server listens on                                                                                                                      |\n\n### Database (PostgreSQL)\n\n| Variable      | Default     | Description       |\n| ------------- | ----------- | ----------------- |\n| `DB_HOST`     | `localhost` | Postgres host     |\n| `DB_PORT`     | `5432`      | Postgres port     |\n| `DB_USERNAME` | `postgres`  | Postgres user     |\n| `DB_PASSWORD` | `postgres`  | Postgres password |\n| `DB_NAME`     | `myapp_db`  | Database name     |\n\n**Read replica** (optional, used by `SqlService` and the list processors for read\nqueries). Comma-separate `DB_READ_HOST` for multiple replicas; unset `DB_READ_*`\nvalues fall back to the primary's. Leave `DB_READ_HOST` empty to route replica\nqueries to the primary.\n\n| Variable           | Default       | Description           |\n| ------------------ | ------------- | --------------------- |\n| `DB_READ_HOST`     | _(empty)_     | Replica host(s)       |\n| `DB_READ_PORT`     | `DB_PORT`     | Replica port          |\n| `DB_READ_USERNAME` | `DB_USERNAME` | Replica user          |\n| `DB_READ_PASSWORD` | `DB_PASSWORD` | Replica password      |\n| `DB_READ_NAME`     | `DB_NAME`     | Replica database name |\n\n### JWT / Auth\n\n| Variable               | Default   | Description                                                                                    |\n| ---------------------- | --------- | ---------------------------------------------------------------------------------------------- |\n| `ACCESS_TOKEN_SECRET`  | —         | **Required.** Secret for signing access tokens. Min 32 chars                                   |\n| `REFRESH_TOKEN_SECRET` | —         | **Required.** Secret for signing refresh tokens. Min 32 chars                                  |\n| `ACCESS_TOKEN_EXPIRY`  | `1h`      | Access token lifetime (`60s`, `15m`, `1h`, `7d`, …)                                            |\n| `REFRESH_TOKEN_EXPIRY` | `30d`     | Refresh token lifetime                                                                         |\n| `GOOGLE_CLIENT_ID`     | _(empty)_ | OAuth client id whose ID tokens are accepted at `POST /auth/google`. Empty disables Google SSO |\n\n#### Authentication (imperative)\n\nControllers are **open by default**; you authenticate explicitly inside the\nhandler with `AuthService.validateRole()`. It reads the current user from\n`Auth`'s `AsyncLocalStorage` context — populated once per request by\n`JwtMiddleware`, which verifies the bearer token and checks that its session\n(`sys_auth_sessions`) hasn't been invalidated (logout) or expired — and returns\nthe user row with its roles, throwing `AccessException` (403) when there's no\nactive session. Pass a role identifier to gate on a specific role:\n`validateRole('invoice.viewer')`. This keeps authorization next to your business\nlogic, so layering tenant/plan/role checks is just more code.\n\nRole checks understand seniority. Identifiers named `<module>.<tier>` — where the\ntier is one of `RoleTier`: **manager** > **writer** > **viewer** — are satisfied by\nany equal or more senior tier of the same module, so gating a read endpoint at\n`invoice.viewer` also admits `invoice.writer` and `invoice.manager` without\nlisting them. The module half must match exactly (`payroll.manager` never clears\n`invoice.viewer`), and an identifier that isn't tiered — `tenant.editor`, or a\nbare `manager` — still matches by exact string, so roles outside the convention\nbehave as before. Rank comes from the declaration order of `RoleTier`, the same\nderivation `AdminAccessService` uses for `GlobalAdminRoles`; adding a tier is an\nenum edit. Nothing changes in the schema — a `sys_roles` row named to the\nconvention gets the hierarchy for free. Above all of it sits `global.admin`\n(`TenantRole.GLOBAL_ADMIN`): a user granted that role clears every\n`validateRole()` check, whatever module or tier it asks for — a scope check on\n`validateAccess()` still applies.\n\nFor a feature that a whole organization is either enabled for or not, use\n`validateAccess(scopeIdentifier, roleIdentifier?)`: it first checks that the\ncaller's tenant holds that scope (`sys_tenant_scopes` against the `sys_scopes`\ncatalogue), then delegates to `validateRole()`. One call answers \"is this feature\nsold to them?\" and \"is this person allowed to use it?\" in that order.\n\nA scope can be a parent of others (`parent_id` on `sys_scopes`), which is how part\nof a feature is sold on its own. Granting the parent grants every child under it, so\na tenant enabled for `billing.invoices` clears `billing.invoices.refund` too;\ngranting children grants only those, and never the parent. The catalogue stops at two\nlevels — a child holds no children — so a grant expands in exactly one hop.\n\n```ts\nconst { user } = await this.authService.validateAccess('billing.invoices');\nconst { user } = await this.authService.validateAccess(\n  'billing.invoices',\n  'invoice.writer',\n);\n```\n\n`AuthController` (mounted at `/auth`) exposes the ready-made flows: `POST\n/auth/login`, `/auth/google`, `/auth/register`, `/auth/refresh`, `/auth/logout`,\n`/auth/change-password`, and `GET /auth/me` (user, roles in the session's\norganization, `organizations` to switch to, pending `invitations`). Passwords are hashed/verified via\n`AuthUtility` (bcrypt); the write flows use the processor lifecycle. Credential\nmisses spend the same bcrypt work as a wrong password\n(`AuthUtility.compareAgainstDummy()`), so response timing does not reveal\nwhether an account exists. Every\n`issueTokens()` call (login or refresh) creates a fresh `sys_auth_sessions` row\nand embeds its identifier in the access token as `sid`; `logout()` revokes the\nrefresh token and invalidates that session, so a still-unexpired access token\nstops working immediately.\n\n**Impersonation** — support staff work inside a customer's organization without\nborrowing anyone's identity. The principal is a `sys_users` row with\n`user_type = system.user`, no `organization_id` and `has_global_access = true`; it\ncannot use `POST /auth/login` at all, and signs in through `POST\n/auth/impersonation/login` with `{ email, password, tenant_id }`. The assumed\norganization is stored on the session row (and its refresh-token row, so a\nrotation keeps it) and stamped onto the context user's `organization_id` by\n`JwtMiddleware`, so `validateAccess()` and every processor reading\n`user.organization_id` work unchanged. Because the token belongs to the real actor,\n`created_by`/`updated_by` record who actually did the work. Role assertions yield to the\ngrant — the account holds no roles inside the tenant — but scope checks never\ndo, so impersonation cannot reach a feature the organization was not sold.\n`GET /auth/impersonation/tenants` lists the organizations available (also from an\nimpersonated session, for an in-app switcher), each login writes an\n`AuditAction.IMPERSONATE` entry, and withdrawing the flag through\n`POST /admin/system-users` revokes the sessions it opened. Distinguish an assumed\ntenant from real membership with `Auth.isImpersonating()` /\n`Auth.impersonatedTenant()`.\n\n**Multiple organizations** — a tenant user may belong to many organizations\n(`sys_tenant_users`), with roles granted per organization (`sys_user_roles.tenant_id`).\nEach session works in one, held on its `sys_auth_sessions` row and mirrored onto\n`Auth.user().organization_id`, so role and scope checks only ever see that\norganization's grants. Login lands in the last organization switched to (remembered in\n`sys_users.organization_id`) or the first membership; a user with none gets a\ntenantless session. `GET /auth/organizations` lists memberships and\n`POST /auth/organizations/switch` (`{ tenant_id, refresh_token }`) retires the current\nsession and returns a pair bound to the chosen one; `POST /auth/organizations/:id/leave`\nends a membership and returns a fresh pair. A refresh re-checks the membership and\nthe tenant, so a removed member or a deactivated tenant drops the organization.\n\n**Invitations** — an organization's `global.admin` invites an email with roles at\n`POST /organization/invitations` (`{ email, role_ids }`; also `POST .../list`,\n`DELETE .../:id` to revoke, `GET .../roles` for the picker). An address with no account gets one: a random one-time password is mailed through the\n`tenant-user-invited` template and `password_change_required` is set, so every endpoint\nexcept `GET /auth/me` and `POST /auth/change-password` (`AuthService.validateIdentity()`)\nrefuses until it is changed; resending the invitation re-issues it. The invitee\nsees pending ones on `GET /auth/me` / `GET /auth/invitations` and answers with\n`POST /auth/invitations/:id/accept` (membership + roles, then switch to use it) or\n`.../decline`. Invitations expire after `TENANT_INVITATION_EXPIRY` (default `7d`).\nAcceptance trusts the account's email — emails are unique case-insensitively, but\nverify addresses if you allow open self-registration. The same `global.admin` manages\nmembers at `/organization/members` (`POST list`, `POST :userId/roles`,\n`POST :userId/deactivate` / `reactivate`, `DELETE :userId`) and resends invitations\n(`POST /organization/invitations/:id/resend`). Deactivation suspends the membership,\nnot the account (which may belong elsewhere); an organization always keeps at least\none active `global.admin`. A deactivated account is refused on its next request.\n\n**Google SSO** — the client posts a Google ID token as `{ id_token }` to\n`POST /auth/google`. `GoogleAuthService` verifies it against Google's tokeninfo\nendpoint (audience must match `GOOGLE_CLIENT_ID`, issuer `accounts.google.com`,\nemail verified), then `GoogleUserDataProcessor` reuses the matching user or\nprovisions a tenant user (no password — password login stays disabled until one\nis set) and the standard `issueTokens()` flow returns the app's own token pair.\n\n```ts\n@Controller('reports')\nexport class ReportController {\n  constructor(private readonly authService: AuthService) {}\n\n  @Get()\n  async list() {\n    const { user, roles } = await this.authService.validateRole();\n    // ...custom checks: roles, tenant membership, subscription, ownership\n  }\n}\n```\n\nWire the middleware once in your app so the user is resolved per request.\n`TenantContextMiddleware` goes after it — it binds the session's organization\n(or the API key's tenant), never a client-supplied header or hostname:\n\n```ts\nexport class AppModule implements NestModule {\n  configure(consumer: MiddlewareConsumer) {\n    consumer\n      .apply(JwtMiddleware, ApiKeyMiddleware, TenantContextMiddleware)\n      .forRoutes('*'); // Express 5: e.g. '{*splat}'\n  }\n}\n```\n\nRead the current user anywhere without going through `AuthService` via the\n`Auth` static class: `Auth.user()` / `Auth.session()`. The Passport\n`JwtStrategy`/`JwtAuthGuard` remain available if you prefer guard-based\nprotection on specific routes, but they're no longer the default path, and\nthey aren't wired to `sys_auth_sessions` invalidation.\n\n#### Admin authentication (separate stack)\n\nBack-office admins are a **fully separate principal** from tenant users — own\ntable (`sys_admin_users`), own roles (`sys_admin_roles`/`sys_auser_roles`), own\ncontext helper (`AdminAuth`), own middleware (`AdminJwtMiddleware`), own service\n(`AdminAuthService`), mirroring everything above:\n\n```ts\nexport class AppModule implements NestModule {\n  configure(consumer: MiddlewareConsumer) {\n    consumer.apply(JwtMiddleware).forRoutes('*');\n    consumer.apply(AdminJwtMiddleware).forRoutes('api/admin/{*splat}');\n  }\n}\n```\n\n`AdminAuthController` (mounted at `/admin/auth`) exposes `POST login` (body:\n`email_or_username`, `password`), `POST refresh`, `POST logout`, `GET me`.\n`AdminAccessService` (internal to the back-office admin APIs, see\n[Admin Module](#admin-module)) is built on `AdminAuthService.validateRole()` and gates\nagainst the `GlobalAdminRoles` hierarchy stored in\n`sys_admin_roles.identifier`. Admins **cannot** grant `sys_roles` to tenant\nusers — that's a planned tenant-side self-service feature, not yet built; an\nadmin with the `admin` role can grant `sys_admin_roles` to other admins via\n`POST /admin/users/admins`.\n\n### Encryption\n\n| Variable            | Default | Description                                                                                                                                   |\n| ------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------- |\n| `ENCRYPTION_SECRET` | —       | **Required** when `EncryptionService` is used — which now includes issuing API keys (`key_encrypted`). AES-256-GCM key material. Min 32 chars |\n\n### Cache (Redis)\n\n| Variable               | Default     | Description                               |\n| ---------------------- | ----------- | ----------------------------------------- |\n| `CACHE_REDIS_HOST`     | `localhost` | Redis host for `CacheService`             |\n| `CACHE_REDIS_PORT`     | `6379`      | Redis port                                |\n| `CACHE_REDIS_PASSWORD` | _(empty)_   | Redis password                            |\n| `CACHE_REDIS_DB`       | `1`         | Redis DB index (keep separate from queue) |\n\n### Queue (BullMQ / Redis)\n\n| Variable                            | Default       | Description                                                                                                                           |\n| ----------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------------------- |\n| `BULL_REDIS_HOST`                   | `localhost`   | Redis host for BullMQ                                                                                                                 |\n| `BULL_REDIS_PORT`                   | `6379`        | Redis port                                                                                                                            |\n| `BULL_REDIS_PASSWORD`               | _(empty)_     | Redis password                                                                                                                        |\n| `BULL_REDIS_DB`                     | `0`           | Redis DB index                                                                                                                        |\n| `BULL_QUEUE_NAME`                   | `myapp-queue` | Name of the BullMQ queue                                                                                                              |\n| `BULL_WORKERS`                      | `2`           | Concurrent worker threads per process                                                                                                 |\n| `BULL_QUEUE_WORKER`                 | `false`       | Set `true` on consumer instances only — API servers should leave this `false`                                                         |\n| `BULL_JOB_TTL_SECONDS`              | `86400`       | Retention (seconds) for **failed** jobs before removal from the queue + Redis (default 1 day); completed jobs are removed immediately |\n| `MAX_JOB_RETRIES`                   | `3`           | Max attempts per job (BullMQ `attempts` default) and the scheduled-event retry ceiling                                                |\n| `SCHEDULED_EVENT_MIN`               | `0`           | `SetScheduledEventJob` cadence in minutes (every N minutes); `0`/unset disables self-scheduling                                       |\n| `SCHEDULED_EVENT_HORIZON_MIN`       | _(derived)_   | How far ahead occurrences are materialised; defaults to 2× the cadence, floored at one minute                                         |\n| `SCHEDULED_EVENT_BATCH`             | `500`         | Occurrences dispatched per pass                                                                                                       |\n| `ENABLE_SCHEDULED_EVENTS_EXECUTION` | _unset_       | Must be exactly `true` to arm scheduled-event materialisation and dispatch                                                            |\n\n#### Jobs\n\nA job pairs a **dispatch** side (enqueue work) with a **handle** side (process it).\nExtend `CommonJob`, add it to your module's providers, and inject `QueueService`:\n\n```ts\n@Injectable()\nexport class WelcomeEmailJob extends CommonJob {\n  constructor(protected readonly queueService: QueueService) {\n    super('welcome.email.job'); // unique identifier\n  }\n  async handle(data: { userId: string }): Promise<void> {\n    // ...send the email\n  }\n}\n\n// elsewhere: await welcomeEmailJob.dispatch({ userId });\n```\n\n`CommonJob` has **no `onModuleInit`**. At boot `QueueService` uses Nest's\n`DiscoveryService` to find every `CommonJob` provider and register its handler\nby identifier — so simply providing the job is enough; nothing self-registers.\nRegistration is guarded: two different classes claiming the same identifier\nabort boot (no silent shadowing), and the discovered registry is validated\nagainst `baseJobMaps` (merged with `QueueModule.register({ jobMaps })` for app\njobs) — a mapped job with no provider fails fast at startup instead of\nsurfacing as a consume-time \"not registered\" error on the worker.\n\nFor database-event jobs (dispatched by a `CommonSubscriber`), `CommonJob`\nexposes `isNewRecord(event)`, `isColumnUpdated(event, col)` and\n`isAnyColumnUpdated(event, cols)` — usable directly inside `handle()` (they work\non the plain event object after the queue round-trip).\n\n**Consumer / worker.** A single `JobConsumer` (a BullMQ `@Processor` /\n`WorkerHost`) is the only worker. On instances where `BULL_QUEUE_WORKER=true` it\nprocesses every job — routing each to the handler registered under\n`job.data.job` — tracks queue stats via worker lifecycle events\n(`active`/`completed`/`failed`), and persists _final_ failures (after\n`MAX_JOB_RETRIES` attempts) to `sys_failed_jobs`. The worker is created with\n`autorun: false` and only starts consuming on `onApplicationBootstrap`, after\nthe job registry is populated and validated — so a restart against a non-empty\nqueue can never pick up jobs before their handlers exist. Failed chained\ndispatches (`nextQueuePayload` links) are persisted to `sys_failed_jobs` too.\nAnything in that table can be re-dispatched with\n`queueService.retryFailedJob(id)` (records are stamped once re-dispatched;\npass `force` to repeat) — this is also the recovery path for\nduplicate-prevented jobs, which are removed from Redis on failure and are\ntherefore invisible to `retryJob(jobId)`. API instances leave\n`BULL_QUEUE_WORKER=false` so no worker spawns; they can still `dispatch()`.\n\n**Retention and clearing.** A job's serialized payload is deleted from Redis the\nmoment it completes successfully (`removeOnComplete: true`), so Redis only ever\nholds pending, active and recently failed work — `getCompletedJobs()` is\ntherefore empty under the default. Failures are kept for\n`BULL_JOB_TTL_SECONDS` (1 day) so they can be inspected and retried in place;\ntheir permanent record lives in `sys_failed_jobs` regardless. To wipe a queue\npolluted with work that must never run, `queueService.clearQueue(queueName)`\nobliterates it — every job in every state, plus the queue's own keys and its\nrecurring schedulers, which are re-enrolled on the next worker boot. The name\nmust match the queue the service is bound to; it is a confirmation, not a\nselector.\n\n`clearQueue(queueName, true)` keeps in-flight work instead: every state but\n`active` is swept, a running job keeps the hash it needs to finish, and\nschedulers survive. Be aware that an active job which then fails with attempts\nremaining is moved back to `wait` — it reappears in the queue just cleared, so\nthe default (obliterate) is the one to use when the jobs must never run.\n\n#### Scheduled events\n\nRecurring work is event-driven (off the BullMQ worker), not a reconciliation\nloop. Two tables back it:\n\n| Table                  | Entity                      | Role                                                                                                                                                                                         |\n| ---------------------- | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `sys_scheduled_tasks`  | `SystemScheduledTaskEntity` | a schedule definition (`identifier`, `name`, `start_from`, `schedule`, `timezone`, `payload`, `catch_up_policy`, `max_catchup`, `overlap_policy`, `jitter_sec`, `enabled`, `next_upsert_at`) |\n| `sys_scheduled_events` | `ScheduledEventEntity`      | one row per fire time (`job_id` → task, `scheduled_at`, `status`, `next_attempt_at`, `started_at`, `failed_at`, `total_attempts`, `active`); one task → many events                          |\n\n`JobConsumer` enrols `SetScheduledEventJob` as a recurring scheduler once **both**\nthe worker's Redis connection is ready and the application has bootstrapped —\nwhichever lands second triggers it. Both conditions matter: BullMQ emits `ready`\nfrom the connection built in the `Worker` constructor, so it can arrive before the\njob registry exists, while enrolling at bootstrap alone would reach for Redis\nbefore it is known to be up. Because BullMQ schedules the first job of an `every`\nseries at the current time, the first materialise-and-dispatch pass runs as soon as\nthe worker is ready rather than one cadence later.\n\nCadence comes from `SCHEDULED_EVENT_MIN` — every N minutes (`0`/unset disables it).\nBullMQ keys the scheduler on the job identifier, so re-running on each boot\n**upserts** rather than duplicates. Set `ENABLE_SCHEDULED_EVENTS_EXECUTION=true` to\narm materialisation and dispatch — the value must be exactly `true`.\n\n##### Schedule kinds\n\nEach task's `schedule` column is a discriminated JSONB spec, so expressing a new\nkind of \"when\" never changes the schema:\n\n| `kind`     | Shape                                            | Example                                       |\n| ---------- | ------------------------------------------------ | --------------------------------------------- |\n| `interval` | `{ kind, day?, hour?, min?, sec? }`              | `{ kind: 'interval', hour: 6 }`               |\n| `cron`     | `{ kind, expression }` (5- or 6-field)           | `{ kind: 'cron', expression: '0 2 * * MON' }` |\n| `once`     | `{ kind }` — fires at `start_from`, then retires | `{ kind: 'once' }`                            |\n\n`cron` is what expresses day-, weekday- and month-based schedules, evaluated in the\ntask's `timezone` (IANA name, default `UTC`) so a local wall time stays put across\nDST. Each kind is advanced by a pure `ScheduleResolver` registered in\n`baseScheduleResolverMaps`; adding a kind means adding a resolver, not touching the\nmaterialiser. Rows written before `schedule` carried a `kind` are read as intervals\nby `ScheduleUtility.normalise`, so no backfill is needed.\n\n##### Slots are derived from slots, not from `now`\n\n`next_upsert_at` is the cursor — the next slot not yet materialised — and every slot\nis computed from the **previous slot**. Anchoring on `now` instead would fold each\npass's lateness into the next fire time permanently: an hourly task polled every\nfive minutes would slide by up to five minutes per occurrence, roughly two hours a\nday. `start_from` is itself the first candidate slot, so a task fires at the time it\nwas asked to start rather than one interval later.\n\n##### Horizon materialisation\n\nA pass materialises every slot up to `now + horizon`, not one slot at a time. The\nhorizon defaults to twice the driver cadence (`SCHEDULED_EVENT_HORIZON_MIN`\noverrides it, floored at a minute), so an occurrence always exists before it comes\ndue. The cadence therefore bounds only how far ahead work is prepared — it is **not\na floor on schedule granularity**. A `{ sec: 30 }` task materialises every\n30-second slot even when the driver polls every few minutes.\n\n##### Catch-up, overlap and jitter\n\nWhat happens to fire times missed while the scheduler was down is a per-task\ndecision (`catch_up_policy`), not an accident:\n\n| Policy        | Behaviour                                                               |\n| ------------- | ----------------------------------------------------------------------- |\n| `skip_missed` | advance past them, materialise nothing                                  |\n| `fire_once`   | **default** — materialise only the most recent elapsed slot             |\n| `fire_all`    | materialise every elapsed slot, retaining the most recent `max_catchup` |\n\nDiscarded slots are counted and logged; a silent gap would read as \"nothing was\nscheduled\". The elapsed-slot walk is bounded by `ScheduleDefault.MAX_SCAN`, and a\nfast-forward is logged too.\n\n`overlap_policy: skip_when_due_pending` holds the cursor while an already-due\noccurrence of the same task is still undispatched. It suppresses **dispatch\nbacklog**, not overlapping runs — once an occurrence is on the queue its completion\nlives in BullMQ and is invisible here. Nothing is discarded when it engages: the\nslots stay unmaterialised and the catch-up policy decides later. `jitter_sec` adds a\nrandom spread to each fire time so tasks sharing a schedule do not stampede; the\njitter lands on the occurrence, never on the cursor, so it cannot accumulate.\n\n##### Creating and editing a task\n\n`POST /api/admin/scheduled-tasks` is an upsert. `AddScheduledTaskDto` extends\n`CommonDataDto`, so it carries an optional `id`: send one to edit that task, omit\nit to create. `identifier`, `name` and `schedule` are required by the DTO either way;\n`identifier` uniqueness is checked in the processor, excluding the row being edited.\n\nChanging what the schedule **means** — `schedule`, `timezone` or `start_from` —\nadditionally re-seats the cursor and soft-deletes occurrences that are `pending` and\nnot yet due, both in one transaction with the save so a materialisation pass landing\nmid-edit cannot leave stale slots behind. Already-due occurrences are kept (the old\nschedule genuinely asked for that work), and anything `claimed`/`enqueued`/`failed`/\n`abandoned` is left alone. Schedules are compared by meaning — interval millisecond\nsum, cron expression — so renaming a task or editing its payload never moves its\nfire times.\n\nThe cursor is seeded by `seedScheduleCursor`, not set to `start_from` directly: the\nmaterialiser trusts the cursor to be a real slot of the series. `start_from` is only\na valid slot for `interval` (which re-anchors onto it) and `once` (whose only slot it\nis); a cron series snaps forward to its first real slot at or after the anchor, so a\n`0 2 * * MON` task doesn't fire once at whatever minute it was saved. A past\n`start_from` is clamped to `now` for the recurring kinds, so creating a task doesn't\nhand the catch-up policy a backlog it never asked for.\n\n##### Occurrence lifecycle\n\n`status` carries where an occurrence is; `active` is orthogonal and carries\nsuppression by the parent task.\n\n| Status      | Meaning                                                                            |\n| ----------- | ---------------------------------------------------------------------------------- |\n| `pending`   | awaiting dispatch; `next_attempt_at` gates eligibility                             |\n| `claimed`   | a pass owns it — a row stuck here means the process died between claim and enqueue |\n| `enqueued`  | handed to the queue (terminal); BullMQ's own `attempts` governs it from there      |\n| `failed`    | last enqueue failed; retried once `next_attempt_at` passes                         |\n| `abandoned` | attempts exhausted — terminal and queryable, not merely absent from the due set    |\n\nEach occurrence fires **once**. A pass claims an event by moving it to `claimed`\nunder a still-dispatchable condition, incrementing `total_attempts` in the same\nstatement, and only enqueues if that claim affected a row — so two concurrent passes\ncannot both dispatch it. Because the claim is written before the enqueue, dispatch\nis **at-most-once**: if the process dies between them the occurrence is skipped\nrather than dispatched twice, and it stays visible as `claimed`.\n\nA failed enqueue releases the claim, records `failed_at`/`error`, and pushes\n`next_attempt_at` out by an exponential backoff (60s doubling per attempt, capped at\nan hour), so a broken task is not retried on every tick. Once `total_attempts`\nreaches `MAX_JOB_RETRIES` (default 3) the occurrence is moved to `abandoned`.\nDispatch reads oldest-first, bounded by `SCHEDULED_EVENT_BATCH` (default 500); the\n`(status, scheduled_at)` index seeks to the due set and already yields it in\n`ORDER BY` order.\n\nMaterialisation is safe to run concurrently — `BULL_WORKERS` defaults to 2, and\nseveral worker instances may share one queue. Each task's slots are **claimed**\nbefore their events are created: a conditional `UPDATE` re-asserts\n`next_upsert_at < horizonEnd` while advancing the cursor, so a second racing pass\nmatches zero rows and skips the task. The claim and the inserts share a transaction,\nso a crash between them cannot advance the cursor without creating the occurrences\nit accounted for. `SystemScheduledTaskJob` (via `SystemScheduledTaskSubscriber`)\nkeeps events in step with task changes — toggling `active` when a task is\nenabled/disabled and soft-deleting events when a task is removed.\n\n> `sys_scheduled_events` is append-only — nothing in the package prunes it, and\n> horizon materialisation writes a row per slot. Bounding it with a retention sweep\n> over terminal rows (`enqueued`, `abandoned`) older than a cutoff is left to the\n> application; the `(status, scheduled_at)` index covers that delete. Never prune\n> `pending` or `failed` rows — those are live work.\n\n`DispatchScheduledEventJob` enqueues each due event under **the scheduled task's\nown `identifier`**, so register a job in your app whose identifier matches the\n`identifier` you gave the task — that job's `handle()` is what runs per fire time.\n\n`SystemScheduledTaskSubscriber` is the only entity subscriber registered for a job:\nit is the only base job whose `handle()` does real work. `DocumentModule` registers\ntwo more — `DocumentSubscriber` and `DocumentUploadSubscriber` — with no job at all;\nthey exist so `created_by` / `updated_by` get stamped on the document tables.\nSubscribers for your own entities are yours to provide (see `CommonSubscriber`);\na subscriber only starts firing once something constructs it.\n\n### Document Storage\n\n| Variable                                | Default | Description                                    |\n| --------------------------------------- | ------- | ---------------------------------------------- |\n| `DOCUMENT_STORAGE_DRIVER`               | `minio` | Active driver: `s3` or `minio`                 |\n| `DOCUMENT_PRESIGNED_URL_EXPIRY_SECONDS` | `3600`  | Presigned download URL validity in seconds     |\n| `DOCUMENT_MAX_UPLOAD_FILES`             | `10`    | Files per `POST /api/documents/upload` request |\n| `DOCUMENT_MAX_UPLOAD_SIZE_MB`           | `25`    | Per-file size ceiling on that endpoint         |\n\n**S3 driver** (`DOCUMENT_STORAGE_DRIVER=s3`):\n\n| Variable                  | Default     | Description                                                     |\n| ------------------------- | ----------- | --------------------------------------------------------------- |\n| `AWS_S3_BUCKET`           | —           | **Required.** S3 bucket name                                    |\n| `AWS_S3_REGION`           | `us-east-1` | AWS region                                                      |\n| `AWS_ACCESS_KEY_ID`       | —           | AWS access key (falls back to instance profile / env chain)     |\n| `AWS_SECRET_ACCESS_KEY`   | —           | AWS secret key                                                  |\n| `AWS_S3_ENDPOINT`         | _(empty)_   | Custom endpoint for S3-compatible providers                     |\n| `AWS_S3_PUBLIC_URL`       | _(empty)_   | CDN base URL for public files                                   |\n| `AWS_S3_FORCE_PATH_STYLE` | `false`     | Force path-style URLs (required by some S3-compatible services) |\n\n**MinIO driver** (`DOCUMENT_STORAGE_DRIVER=minio`):\n\n| Variable           | Default      | Description                                 |\n| ------------------ | ------------ | ------------------------------------------- |\n| `MINIO_ENDPOINT`   | `localhost`  | MinIO host                                  |\n| `MINIO_PORT`       | `9000`       | MinIO port                                  |\n| `MINIO_USE_SSL`    | `false`      | Enable TLS                                  |\n| `MINIO_ACCESS_KEY` | `minioadmin` | MinIO access key                            |\n| `MINIO_SECRET_KEY` | `minioadmin` | MinIO secret key                            |\n| `MINIO_BUCKET`     | `documents`  | Bucket name (auto-created if missing)       |\n| `MINIO_PUBLIC_URL` | _(empty)_    | CDN base URL when MinIO sits behind a proxy |\n\n### PDF Documents\n\nRequires the optional peer dependency `puppeteer`.\n\n| Variable                  | Default   | Description                                                                         |\n| ------------------------- | --------- | ----------------------------------------------------------------------------------- |\n| `PDF_CHROMIUM_PATH`       | _(empty)_ | Path to an existing Chromium/Chrome binary; falls back to puppeteer's bundled one   |\n| `PDF_CHROMIUM_NO_SANDBOX` | `false`   | `true` passes `--no-sandbox`. Needed in most containers; only use with trusted HTML |\n| `PDF_RENDER_TIMEOUT_MS`   | `30000`   | Per-render page load timeout in milliseconds                                        |\n\n### HTTP Logging\n\n| Variable          | Default | Description                                                                 |\n| ----------------- | ------- | --------------------------------------------------------------------------- |\n| `HTTP_LOG_FORMAT` | `dev`   | Morgan log format: `dev` (compact) or `combined` (includes IP + user agent) |\n\n### Monitoring\n\n| Variable                     | Default   | Description                                                                            |\n| ---------------------------- | --------- | -------------------------------------------------------------------------------------- |\n| `SENTRY_DSN`                 | _(empty)_ | Sentry DSN — Sentry is only activated when this is set and `@sentry/node` is installed |\n| `SENTRY_TRACES_SAMPLE_RATE`  | `0`       | Sentry performance traces sample rate (0–1)                                            |\n| `MONITORING_SLOW_REQUEST_MS` | `3000`    | Requests slower than this (ms) are flagged as warnings                                 |\n\n### Multi-tenancy\n\n| Variable                   | Default | Description                                          |\n| -------------------------- | ------- | ---------------------------------------------------- |\n| `TENANT_INVITATION_EXPIRY` | `7d`    | How long an organization invitation stays answerable |\n\n### API Keys\n\n| Variable              | Default     | Description                                                 |\n| --------------------- | ----------- | ----------------------------------------------------------- |\n| `API_KEY_HEADER_NAME` | `x-api-key` | Request header carrying the API key                         |\n| `ENCRYPTION_SECRET`   | —           | **Required to issue keys** — `key_encrypted` is AES-256-GCM |\n\nA key is stored three ways: its sha256 hash in `key_hash` (what lookups match), a\nshort visible prefix in `key_prefix`, and the key itself encrypted in\n`key_encrypted`. That last one makes a key recoverable after issuing, so a lost key\ndoes not force a reissue and a redeploy — `revealApiKey(uuid)` returns it, and\n`apiKeyDetail(uuid, reveal)` folds it into the detail as `key`. The column is\n`select: false` like `UserEntity.password`, so the ciphertext never rides along on a\nread. Note what it costs: a key is no longer irrecoverable by construction, so treat\nreaching either method as equivalent to holding the key — which is why\n`GET /admin/api-keys/:id` reveals it from the global admin role up and not to a\ncontent reader.\n\nA key belongs to one tenant and holds its scopes as `sys_api_scopes` rows against\nthe `sys_scopes` catalogue — there is no scopes array on the key, and a key grants\nnothing it was not given (a granted `*` is the only blanket, and a granted parent\nscope carries its children). `ApiKeyMiddleware`\nresolves the key, its tenant and its scope identifiers once per request into\n`ApiKeyContext`; enforce from there:\n\n```ts\nconst { tenant } = this.apiKeyService.validateAccess('orders:read');\n// tenant is the sys_tenants row the key acts for — never taken from the payload\n```\n\n`ApiKeyGuard`/`@ApiKeyScopes()` remain available for guard-based enforcement;\n`hasScope()` is `async` now that grants are rows.\n\n### Email Notifications (AWS SES)\n\nCredentials resolve through the standard AWS SDK chain. When\n`AWS_SES_FROM_ADDRESS` is unset, dispatch is skipped with a warning — safe by\ndefault in development.\n\n| Variable               | Default     | Description                                 |\n| ---------------------- | ----------- | ------------------------------------------- |\n| `AWS_SES_FROM_ADDRESS` | _(empty)_   | Sender address; empty skips actual dispatch |\n| `AWS_SES_REGION`       | `us-east-1` | SES region (falls back to `AWS_REGION`)     |\n\n### Push Notifications (FCM)\n\nRequires the optional peer dependency `firebase-admin`. Provide **one** of:\n\n| Variable                     | Default   | Description                                                                   |\n| ---------------------------- | --------- | ----------------------------------------------------------------------------- |\n| `FCM_SERVICE_ACCOUNT_PATH`   | _(empty)_ | Absolute path to the Firebase service account JSON file                       |\n| `FCM_SERVICE_ACCOUNT_BASE64` | _(empty)_ | Base64-encoded service account JSON (preferred for containerised deployments) |\n\n---\n\n## Document Uploads in 10 Lines\n\nStorage is split across two tables. `sys_document_uploads` (`DocumentUploadEntity`)\nis the stored object — name, mime type, size, driver, path, url, `is_public` — and\nevery upload writes one row automatically. `sys_documents` (`DocumentEntity`) is just\nthe link to one of your records: `upload_id` + `source_type` + `source_id` +\n`system_generated`, no file metadata. So one file can hang off several records, and a\nfile can exist before anything owns it.\n\n`system_generated` answers a question the two tables otherwise cannot: whether anybody\nuploaded this file. A generated invoice and an uploaded scan of one are the same pair of\nrows, so the flag is what lets a listing tell them apart — and what lets a regeneration\nknow which of its records it may replace. It is set through\n`setDocument(dto, { systemGenerated: true })`, which is how\n[`ProcessPdfDocument`](#pdf-documents-pdfservice-pdftemplateservice-processpdfdocument)\nmarks what it produces; it is deliberately absent from `SetDocumentDto`, so the HTTP\nendpoint cannot claim it.\n\n`DocumentModule` ships two endpoints. `POST /api/documents/upload` is multipart: it\ntakes the files in a `files` field, uploads them through the active driver and returns\nthe saved `sys_document_uploads` row of each. `POST /api/documents/set` then attaches\none of those uploads to a record of yours — `{ upload_id, source_type, source_id }` —\nand returns the `sys_documents` link row, re-sending an existing link rather than\nduplicating it. `documentService.deleteDocument(id)` soft deletes such a link —\nno endpoint, since detaching belongs to the flow that owns the record — and leaves the\nupload and its object alone. `DocumentSubscriber` records who did it under\n`attributes.deleted_by`, as `sys_documents` has no such column.\n\nCallers do not choose the folder. They send a `path_identifier` (`invoice`,\n`avatar`, ...) which resolves through the `document.path.<path_identifier>` system\nproperty to the key prefix — so the bucket layout is configuration, and an unknown\nidentifier is a 400 rather than a new folder. The `DOCUMENT_MAX_UPLOAD_*` limits bound\nthe request. Any authenticated caller may upload, so gate it in your app when uploads\nare a restricted feature.\n\n```ts\nawait systemPropertyService.set('document.path.invoice', {\n  name: 'Invoice uploads',\n  value: 'invoices/2026',\n});\n// path_identifier=invoice  ->  invoices/2026/<uuid>.pdf\n```\n\nTo record the file against one of your entities — or for anything else the endpoint\ndoes not cover — inject `DocumentService`:\n\n```ts\n@Post('attachments')\n@UseInterceptors(FilesInterceptor('files'))\nasync upload(@UploadedFiles() files: Express.Multer.File[], @CurrentUser() user: RequestUser) {\n  // Rows in sys_document_uploads always; sourceType/sourceId also link them\n  // to the ticket through sys_documents.\n  return this.documentService.uploadDocuments(files, {\n    pathPrefix: 'attachments',\n    createdBy: user.userId,\n    sourceType: 'ticket',\n    sourceId: ticketUuid,\n  });\n}\n```\n\nSet `DOCUMENT_STORAGE_DRIVER=minio` for a local MinIO bucket (auto-created) or\n`DOCUMENT_STORAGE_DRIVER=s3` for Amazon S3. Switching drivers requires no code change.\n\nBecause uploading and attaching are separate steps, a file can end up claimed by\nnothing. `CleanOrphanDocumentsJob` (`clean.orphan.documents.job`) sweeps those. Run\nwith no payload it collects every upload that has no `sys_documents` row and is more\nthan a day old, then re-dispatches itself as `{ id }` per row; each of those deletes\nthat object from the bucket and soft deletes its row, so one unreachable file retries\nalone instead of stalling the sweep. Schedule it with a `sys_scheduled_tasks` row under\nthat identifier — the module registers the handler but never dispatches it.\n\n## PDF Documents (PdfService, PdfTemplateService, ProcessPdfDocument)\n\nThe `/pdfs` counterpart of [Templated Email](#templated-email-aws-ses), and it reuses\nthat pipeline's shape exactly: a catalogue row names a template, a remote service\nrenders it, a processor drives the whole thing. What differs is the last mile — mail is\nhanded to SES, a document is rasterized and stored.\n\nThree pieces, split along the one line that matters — where the browser binary lives:\n\n- **`PdfTemplateService`** — resolves a `sys_pdf_templates` row by `identifier` and\n  POSTs your `data` to the remote template service, returning print-ready HTML. Exactly\n  `EmailNotificationService.getEmailBody()`, for documents.\n- **`PdfService`** — turns that HTML into PDF bytes with a headless Chromium. Knows\n  nothing about templates or storage.\n- **`ProcessPdfDocument`** — the entry point. Validates, renders, rasterizes, stores,\n  and returns the `sys_documents` row with its `upload` relation attached.\n\nAll three are exported by `DocumentModule`.\n\n### The whole thing in one call\n\n```ts\nconst processor = new ProcessPdfDocument(\n  this.pdfTemplateService,\n  this.pdfService,\n  this.documentService,\n);\n\nconst document = await processor.process({\n  identifier: 'purchase-order',        // a sys_pdf_templates row\n  metadata: {\n    fileName: 'po-10432.pdf',\n    mimeType: 'application/pdf',       // default\n    pathIdentifier: 'purchase.order',  // → the document.pa","readmeFilename":"README.md"}