{"_id":"@bloomneo/appkit","_rev":"8-953cd796cafb7f6d01ed47436dcf992f","name":"@bloomneo/appkit","dist-tags":{"latest":"5.1.3"},"versions":{"1.2.9":{"name":"@bloomneo/appkit","version":"1.2.9","keywords":["nodejs","node","toolkit","framework-agnostic","auth","authentication","jwt","bcrypt","multi-tenant","tenant","database","saas","cache","caching","redis","memcached","events","event-bus","pubsub","security","csrf","rate-limiting","sanitization","email","smtp","ses","sendgrid","mailgun","queue","job-queue","background-jobs","logging","logger","storage","s3","file-storage","configuration","config","validation","utils","utilities","express","middleware","error-handling","tree-shaking","esm","typescript","cli","scaffolding","fbca","code-generation"],"author":{"name":"Bloomneo"},"license":"MIT","_id":"@bloomneo/appkit@1.2.9","maintainers":[{"name":"bloomneo","email":"krishnatejags@gmail.com"}],"contributors":[{"url":"https://bloomneo.com","name":"Krishna Teja GS","email":"kt@voilacode.com"}],"homepage":"https://github.com/bloomneo/appkit#readme","bugs":{"url":"https://github.com/bloomneo/appkit/issues"},"bin":{"appkit":"bin/appkit.js"},"dist":{"shasum":"b3cbb424ff1962cdecd1d2b9c456f0c07377c2d7","tarball":"https://registry.npmjs.org/@bloomneo/appkit/-/appkit-1.2.9.tgz","fileCount":262,"integrity":"sha512-dOz+4W0kWUOoHUq+/hVy73x9FVZAdtJcSAIJ8gDG799HpXQNZ12s3upYtfxSoBkIhnHMkKePRuD6kZgFvdMbzw==","signatures":[{"sig":"MEYCIQCjYUHE+lR59A+qisyQoXSM0fsEOdEIVwOVZHwaW/6McgIhAJWgvycBWYJOpSNN8AwukU7IYAHshNlLBbw4XNnw9QhV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1740662},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","creator":"Krishna Teja GS","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./auth":{"types":"./dist/auth/index.d.ts","default":"./dist/auth/index.js"},"./util":{"types":"./dist/util/index.d.ts","default":"./dist/util/index.js"},"./cache":{"types":"./dist/cache/index.d.ts","default":"./dist/cache/index.js"},"./email":{"types":"./dist/email/index.d.ts","default":"./dist/email/index.js"},"./error":{"types":"./dist/error/index.d.ts","default":"./dist/error/index.js"},"./queue":{"types":"./dist/queue/index.d.ts","default":"./dist/queue/index.js"},"./config":{"types":"./dist/config/index.d.ts","default":"./dist/config/index.js"},"./logger":{"types":"./dist/logger/index.d.ts","default":"./dist/logger/index.js"},"./storage":{"types":"./dist/storage/index.d.ts","default":"./dist/storage/index.js"},"./database":{"types":"./dist/database/index.d.ts","default":"./dist/database/index.js"},"./security":{"types":"./dist/security/index.d.ts","default":"./dist/security/index.js"}},"funding":{"url":"https://github.com/sponsors/bloomneo","type":"github"},"gitHead":"34333873f9dc78d1e880ce633a01c903a1313ef4","scripts":{"lint":"eslint src/","test":"vitest --run --passWithNoTests","build":"tsc","format":"prettier --write 'src/**/*.js'","prepublishOnly":"npm run build","prisma:generate":"prisma generate"},"_npmUser":{"name":"bloomneo","email":"krishnatejags@gmail.com"},"repository":{"url":"git+https://github.com/bloomneo/appkit.git","type":"git"},"_npmVersion":"11.4.2","description":"Minimal and framework agnostic Node.js toolkit designed for AI agentic backend development. Previously published as @voilajsx/appkit.","directories":{},"sideEffects":false,"_nodeVersion":"20.17.0","dependencies":{"bcrypt":"^5.1.1","dotenv":"^16.6.1","prisma":"^6.16.2","ioredis":"^5.6.1","commander":"^12.1.0","jsonwebtoken":"^9.0.2","@prisma/client":"^6.16.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^3.1.3","esbuild":">=0.25.0","express":"^5.1.0","prettier":"^3.2.4","@types/pg":"^8.10.0","supertest":"^7.1.1","@eslint/js":"^9.0.0","typescript":"^5.0.0","@types/node":"^18.0.0","@types/bcrypt":"^5.0.2","@types/nodemailer":"^6.4.17","@types/jsonwebtoken":"^9.0.10","@vitest/coverage-v8":"^3.1.3"},"peerDependencies":{"multer":"^2.0.2","express":"^4.0.0 || ^5.0.0","fastify":"^5.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","express-session":"^1.18.2","@fastify/session":"^11.1.0","@fastify/formbody":"^8.0.2"},"optionalDependencies":{"pg":"^8.11.0","bull":"^4.10.0","redis":"^4.7.1","mysql2":"^3.5.0","sqlite":"^4.2.1","sqlite3":"^5.1.6","mongoose":"^7.0.0","memcached":"^2.2.2","mailgun.js":"^9.0.0","nodemailer":"^7.0.12","@sendgrid/mail":"^8.1.5","@aws-sdk/client-s3":"^3.0.0","@aws-sdk/client-ses":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.0.0"},"peerDependenciesMeta":{"multer":{"optional":true},"express":{"optional":true},"fastify":{"optional":true},"@fastify/cookie":{"optional":true},"@fastify/helmet":{"optional":true},"express-session":{"optional":true},"@fastify/session":{"optional":true},"@fastify/formbody":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/appkit_1.2.9_1775880011571_0.2512086547045873","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@bloomneo/appkit","version":"1.5.1","keywords":["nodejs","node","toolkit","framework-agnostic","auth","authentication","jwt","bcrypt","multi-tenant","tenant","database","saas","cache","caching","redis","memcached","events","event-bus","pubsub","security","csrf","rate-limiting","sanitization","email","smtp","ses","sendgrid","mailgun","queue","job-queue","background-jobs","logging","logger","storage","s3","file-storage","configuration","config","validation","utils","utilities","express","middleware","error-handling","tree-shaking","esm","typescript","cli","scaffolding","fbca","code-generation"],"author":{"name":"Bloomneo"},"license":"MIT","_id":"@bloomneo/appkit@1.5.1","maintainers":[{"name":"bloomneo","email":"krishnatejags@gmail.com"}],"contributors":[{"url":"https://bloomneo.com","name":"Krishna Teja GS","email":"kt@voilacode.com"}],"homepage":"https://github.com/bloomneo/appkit#readme","bugs":{"url":"https://github.com/bloomneo/appkit/issues"},"bin":{"appkit":"bin/appkit.js"},"dist":{"shasum":"c43bec88bf9d80a918a7676e1787a69a3c70c686","tarball":"https://registry.npmjs.org/@bloomneo/appkit/-/appkit-1.5.1.tgz","fileCount":262,"integrity":"sha512-O2Zdm+Q5CqAkul3OdfHDGEbUBkvwJjzQF2DUhxPNfD1s+/V+GvfwDXCZRtw5N65KUjsxM8buMp98eUzG9Q07Nw==","signatures":[{"sig":"MEQCIChtESdaDXjqw1tYWiAFO5CEITttbAiRslTx6hznzYcYAiB16VPyamxVL/yNRzw3IgBWcExrO5f7HGve0Cfbwe5G8A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1740662},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","creator":"Krishna Teja GS","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./auth":{"types":"./dist/auth/index.d.ts","default":"./dist/auth/index.js"},"./util":{"types":"./dist/util/index.d.ts","default":"./dist/util/index.js"},"./cache":{"types":"./dist/cache/index.d.ts","default":"./dist/cache/index.js"},"./email":{"types":"./dist/email/index.d.ts","default":"./dist/email/index.js"},"./error":{"types":"./dist/error/index.d.ts","default":"./dist/error/index.js"},"./queue":{"types":"./dist/queue/index.d.ts","default":"./dist/queue/index.js"},"./config":{"types":"./dist/config/index.d.ts","default":"./dist/config/index.js"},"./logger":{"types":"./dist/logger/index.d.ts","default":"./dist/logger/index.js"},"./storage":{"types":"./dist/storage/index.d.ts","default":"./dist/storage/index.js"},"./database":{"types":"./dist/database/index.d.ts","default":"./dist/database/index.js"},"./security":{"types":"./dist/security/index.d.ts","default":"./dist/security/index.js"}},"funding":{"url":"https://github.com/sponsors/bloomneo","type":"github"},"gitHead":"5cc7f1f64628a8b5dc74db5d5240492403fa807e","scripts":{"lint":"eslint src/","test":"vitest --run --passWithNoTests","build":"tsc","format":"prettier --write 'src/**/*.js'","prepublishOnly":"npm run build","prisma:generate":"prisma generate"},"_npmUser":{"name":"bloomneo","email":"krishnatejags@gmail.com"},"repository":{"url":"git+https://github.com/bloomneo/appkit.git","type":"git"},"_npmVersion":"11.4.2","description":"Minimal and framework agnostic Node.js toolkit designed for AI agentic backend development. Previously published as @voilajsx/appkit.","directories":{},"sideEffects":false,"_nodeVersion":"20.17.0","dependencies":{"bcrypt":"^5.1.1","dotenv":"^16.6.1","prisma":"^6.16.2","ioredis":"^5.6.1","commander":"^12.1.0","jsonwebtoken":"^9.0.2","@prisma/client":"^6.16.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^3.1.3","esbuild":">=0.25.0","express":"^5.1.0","prettier":"^3.2.4","@types/pg":"^8.10.0","supertest":"^7.1.1","@eslint/js":"^9.0.0","typescript":"^5.0.0","@types/node":"^18.0.0","@types/bcrypt":"^5.0.2","@types/nodemailer":"^6.4.17","@types/jsonwebtoken":"^9.0.10","@vitest/coverage-v8":"^3.1.3"},"peerDependencies":{"multer":"^2.0.2","express":"^4.0.0 || ^5.0.0","fastify":"^5.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","express-session":"^1.18.2","@fastify/session":"^11.1.0","@fastify/formbody":"^8.0.2"},"optionalDependencies":{"pg":"^8.11.0","bull":"^4.10.0","redis":"^4.7.1","mysql2":"^3.5.0","sqlite":"^4.2.1","sqlite3":"^5.1.6","mongoose":"^7.0.0","memcached":"^2.2.2","mailgun.js":"^9.0.0","nodemailer":"^7.0.12","@sendgrid/mail":"^8.1.5","@aws-sdk/client-s3":"^3.0.0","@aws-sdk/client-ses":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.0.0"},"peerDependenciesMeta":{"multer":{"optional":true},"express":{"optional":true},"fastify":{"optional":true},"@fastify/cookie":{"optional":true},"@fastify/helmet":{"optional":true},"express-session":{"optional":true},"@fastify/session":{"optional":true},"@fastify/formbody":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/appkit_1.5.1_1775887194464_0.6393478022153791","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"@bloomneo/appkit","version":"1.5.2","keywords":["nodejs","node","toolkit","framework-agnostic","auth","authentication","jwt","bcrypt","multi-tenant","tenant","database","saas","cache","caching","redis","memcached","events","event-bus","pubsub","security","csrf","rate-limiting","sanitization","email","smtp","ses","sendgrid","mailgun","queue","job-queue","background-jobs","logging","logger","storage","s3","file-storage","configuration","config","validation","utils","utilities","express","middleware","error-handling","tree-shaking","esm","typescript","cli","scaffolding","fbca","code-generation"],"author":{"url":"https://github.com/ktvoilacode","name":"Krishna Teja GS","email":"kt@voilacode.com"},"license":"MIT","_id":"@bloomneo/appkit@1.5.2","maintainers":[{"name":"bloomneo","email":"krishnatejags@gmail.com"}],"homepage":"https://github.com/bloomneo/appkit#readme","bugs":{"url":"https://github.com/bloomneo/appkit/issues"},"bin":{"appkit":"bin/appkit.js"},"dist":{"shasum":"d119e7e7d2b0ec569bd103bff3c78c9abb94324c","tarball":"https://registry.npmjs.org/@bloomneo/appkit/-/appkit-1.5.2.tgz","fileCount":302,"integrity":"sha512-IwMY2KJh+kkXF0ReqvnF0qIfA4offyZnuMLlvf3EQ9AP2ztIwHuQbQOAX6gskv14M2tcFuQUHXb5+FRdDfpRXw==","signatures":[{"sig":"MEUCIEL73/G1NsJPaNZ8HUIK6nthU0gjCyulUc5Xjtbn2e5VAiEAuJfeWXHU1hCT12L6jNsWu8dWEgQQCO359D4EN2G6clU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1999173},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./auth":{"types":"./dist/auth/index.d.ts","default":"./dist/auth/index.js"},"./util":{"types":"./dist/util/index.d.ts","default":"./dist/util/index.js"},"./cache":{"types":"./dist/cache/index.d.ts","default":"./dist/cache/index.js"},"./email":{"types":"./dist/email/index.d.ts","default":"./dist/email/index.js"},"./error":{"types":"./dist/error/index.d.ts","default":"./dist/error/index.js"},"./queue":{"types":"./dist/queue/index.d.ts","default":"./dist/queue/index.js"},"./config":{"types":"./dist/config/index.d.ts","default":"./dist/config/index.js"},"./logger":{"types":"./dist/logger/index.d.ts","default":"./dist/logger/index.js"},"./storage":{"types":"./dist/storage/index.d.ts","default":"./dist/storage/index.js"},"./database":{"types":"./dist/database/index.d.ts","default":"./dist/database/index.js"},"./security":{"types":"./dist/security/index.d.ts","default":"./dist/security/index.js"}},"funding":{"url":"https://github.com/sponsors/bloomneo","type":"github"},"gitHead":"d7f66e8824a1f8d965defb807993b0b5c35590a5","scripts":{"lint":"eslint src/","test":"vitest --run --passWithNoTests","build":"tsc","format":"prettier --write 'src/**/*.js'","prepublishOnly":"npm run build","prisma:generate":"prisma generate"},"_npmUser":{"name":"bloomneo","email":"krishnatejags@gmail.com"},"repository":{"url":"git+https://github.com/bloomneo/appkit.git","type":"git"},"_npmVersion":"11.4.2","description":"Minimal and framework agnostic Node.js toolkit designed for AI agentic backend development. Previously published as @voilajsx/appkit.","directories":{},"sideEffects":false,"_nodeVersion":"20.17.0","dependencies":{"bcrypt":"^5.1.1","dotenv":"^16.6.1","prisma":"^6.16.2","ioredis":"^5.6.1","commander":"^12.1.0","jsonwebtoken":"^9.0.2","@prisma/client":"^6.16.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^3.1.3","esbuild":">=0.25.0","express":"^5.1.0","prettier":"^3.2.4","@types/pg":"^8.10.0","supertest":"^7.1.1","@eslint/js":"^9.0.0","typescript":"^5.0.0","@types/node":"^18.0.0","@types/bcrypt":"^5.0.2","@types/nodemailer":"^6.4.17","@types/jsonwebtoken":"^9.0.10","@vitest/coverage-v8":"^3.1.3"},"peerDependencies":{"multer":"^2.0.2","express":"^4.0.0 || ^5.0.0","fastify":"^5.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","express-session":"^1.18.2","@fastify/session":"^11.1.0","@fastify/formbody":"^8.0.2"},"optionalDependencies":{"pg":"^8.11.0","bull":"^4.10.0","redis":"^4.7.1","mysql2":"^3.5.0","sqlite":"^4.2.1","sqlite3":"^5.1.6","mongoose":"^7.0.0","memcached":"^2.2.2","mailgun.js":"^9.0.0","nodemailer":"^7.0.12","@sendgrid/mail":"^8.1.5","@aws-sdk/client-s3":"^3.0.0","@aws-sdk/client-ses":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.0.0"},"peerDependenciesMeta":{"multer":{"optional":true},"express":{"optional":true},"fastify":{"optional":true},"@fastify/cookie":{"optional":true},"@fastify/helmet":{"optional":true},"express-session":{"optional":true},"@fastify/session":{"optional":true},"@fastify/formbody":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/appkit_1.5.2_1775920507881_0.2790694886027074","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@bloomneo/appkit","version":"2.0.0","keywords":["nodejs","node","toolkit","framework-agnostic","auth","authentication","jwt","bcrypt","multi-tenant","tenant","database","saas","cache","caching","redis","memcached","events","event-bus","pubsub","security","csrf","rate-limiting","sanitization","email","smtp","ses","sendgrid","mailgun","queue","job-queue","background-jobs","logging","logger","storage","s3","file-storage","configuration","config","validation","utils","utilities","express","middleware","error-handling","tree-shaking","esm","typescript","cli","scaffolding","fbca","code-generation"],"author":{"url":"https://github.com/ktvoilacode","name":"Krishna Teja GS","email":"kt@voilacode.com"},"license":"MIT","_id":"@bloomneo/appkit@2.0.0","maintainers":[{"name":"bloomneo","email":"krishnatejags@gmail.com"}],"homepage":"https://github.com/bloomneo/appkit#readme","bugs":{"url":"https://github.com/bloomneo/appkit/issues"},"bin":{"appkit":"bin/appkit.js"},"dist":{"shasum":"7a40df6e492cb994728344ceb148d483ab51f247","tarball":"https://registry.npmjs.org/@bloomneo/appkit/-/appkit-2.0.0.tgz","fileCount":303,"integrity":"sha512-lJM7u+nCyhyJ9vTeSLTmiPEj4dXcvYxaUOtdx4EytGU40kKPMMptQoAbVBqZGkrD0Lbw9QakLiGMyz0umqoPqQ==","signatures":[{"sig":"MEUCIFuQJpCv5ANwDzMn9jbH7z2+32oueFaY824+yrcp6SCfAiEA3iLz/uI9Ng8hNI6o3Fw2nXAA1AwIPxkjmiZBuzJieLc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2087666},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./auth":{"types":"./dist/auth/index.d.ts","default":"./dist/auth/index.js"},"./util":{"types":"./dist/util/index.d.ts","default":"./dist/util/index.js"},"./cache":{"types":"./dist/cache/index.d.ts","default":"./dist/cache/index.js"},"./email":{"types":"./dist/email/index.d.ts","default":"./dist/email/index.js"},"./error":{"types":"./dist/error/index.d.ts","default":"./dist/error/index.js"},"./event":{"types":"./dist/event/index.d.ts","default":"./dist/event/index.js"},"./queue":{"types":"./dist/queue/index.d.ts","default":"./dist/queue/index.js"},"./config":{"types":"./dist/config/index.d.ts","default":"./dist/config/index.js"},"./logger":{"types":"./dist/logger/index.d.ts","default":"./dist/logger/index.js"},"./storage":{"types":"./dist/storage/index.d.ts","default":"./dist/storage/index.js"},"./database":{"types":"./dist/database/index.d.ts","default":"./dist/database/index.js"},"./security":{"types":"./dist/security/index.d.ts","default":"./dist/security/index.js"}},"funding":{"url":"https://github.com/sponsors/bloomneo","type":"github"},"gitHead":"80d31a99ea4c89079a3ca4d91fe3d59ac64188e7","scripts":{"lint":"eslint src/","test":"vitest --run --passWithNoTests","build":"tsc","format":"prettier --write 'src/**/*.js'","check:docs":"npx tsx scripts/check-doc-drift.ts","prepublishOnly":"npm run build","prisma:generate":"prisma generate"},"_npmUser":{"name":"bloomneo","email":"krishnatejags@gmail.com"},"repository":{"url":"git+https://github.com/bloomneo/appkit.git","type":"git"},"_npmVersion":"11.4.2","description":"Minimal and framework agnostic Node.js toolkit designed for AI agentic backend development.","directories":{},"sideEffects":false,"_nodeVersion":"20.17.0","dependencies":{"bcrypt":"^5.1.1","dotenv":"^16.6.1","prisma":"^6.16.2","ioredis":"^5.6.1","commander":"^12.1.0","jsonwebtoken":"^9.0.2","@prisma/client":"^6.16.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^3.1.3","esbuild":">=0.25.0","express":"^5.1.0","prettier":"^3.2.4","@types/pg":"^8.10.0","supertest":"^7.1.1","@eslint/js":"^9.0.0","typescript":"^5.0.0","@types/node":"^18.0.0","@types/bcrypt":"^5.0.2","@types/nodemailer":"^6.4.17","@types/jsonwebtoken":"^9.0.10","@vitest/coverage-v8":"^3.1.3"},"peerDependencies":{"multer":"^2.0.2","express":"^4.0.0 || ^5.0.0","fastify":"^5.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","express-session":"^1.18.2","@fastify/session":"^11.1.0","@fastify/formbody":"^8.0.2"},"optionalDependencies":{"pg":"^8.11.0","bull":"^4.10.0","redis":"^4.7.1","mysql2":"^3.5.0","sqlite":"^4.2.1","sqlite3":"^5.1.6","mongoose":"^7.0.0","memcached":"^2.2.2","mailgun.js":"^9.0.0","nodemailer":"^7.0.12","@sendgrid/mail":"^8.1.5","@aws-sdk/client-s3":"^3.0.0","@aws-sdk/client-ses":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.0.0"},"peerDependenciesMeta":{"multer":{"optional":true},"express":{"optional":true},"fastify":{"optional":true},"@fastify/cookie":{"optional":true},"@fastify/helmet":{"optional":true},"express-session":{"optional":true},"@fastify/session":{"optional":true},"@fastify/formbody":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/appkit_2.0.0_1776217118896_0.11048261181504793","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@bloomneo/appkit","version":"4.0.0","keywords":["nodejs","node","toolkit","framework-agnostic","auth","authentication","jwt","bcrypt","multi-tenant","tenant","database","saas","cache","caching","redis","memcached","events","event-bus","pubsub","security","csrf","rate-limiting","sanitization","email","smtp","ses","sendgrid","mailgun","queue","job-queue","background-jobs","logging","logger","storage","s3","file-storage","configuration","config","validation","utils","utilities","express","middleware","error-handling","tree-shaking","esm","typescript","cli","scaffolding","fbca","code-generation"],"author":{"url":"https://github.com/ktvoilacode","name":"Krishna Teja GS","email":"kt@voilacode.com"},"license":"MIT","_id":"@bloomneo/appkit@4.0.0","maintainers":[{"name":"bloomneo","email":"krishnatejags@gmail.com"}],"homepage":"https://github.com/bloomneo/appkit#readme","bugs":{"url":"https://github.com/bloomneo/appkit/issues"},"bin":{"appkit":"bin/appkit.js"},"dist":{"shasum":"22a46b5dc94c358df17dde0019debb5feb51e91f","tarball":"https://registry.npmjs.org/@bloomneo/appkit/-/appkit-4.0.0.tgz","fileCount":316,"integrity":"sha512-4j1q9DY5UZHhR4Glj4Hjo9pi1DggCi5QaMnAVjCq+/cjT99IZz/I6TQ9GU5+VoL16nRAT9MzfIHfYaVwgZGlEA==","signatures":[{"sig":"MEQCIDO8mlWel2vqAl0rpstgUrv9CdK8PyRd2Bc9lU7zoY/5AiAELT6be/bV36O+09b36ALGxJD25ev1QDv8azRsh2abAA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2183392},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./auth":{"types":"./dist/auth/index.d.ts","default":"./dist/auth/index.js"},"./util":{"types":"./dist/util/index.d.ts","default":"./dist/util/index.js"},"./cache":{"types":"./dist/cache/index.d.ts","default":"./dist/cache/index.js"},"./email":{"types":"./dist/email/index.d.ts","default":"./dist/email/index.js"},"./error":{"types":"./dist/error/index.d.ts","default":"./dist/error/index.js"},"./event":{"types":"./dist/event/index.d.ts","default":"./dist/event/index.js"},"./queue":{"types":"./dist/queue/index.d.ts","default":"./dist/queue/index.js"},"./config":{"types":"./dist/config/index.d.ts","default":"./dist/config/index.js"},"./logger":{"types":"./dist/logger/index.d.ts","default":"./dist/logger/index.js"},"./storage":{"types":"./dist/storage/index.d.ts","default":"./dist/storage/index.js"},"./database":{"types":"./dist/database/index.d.ts","default":"./dist/database/index.js"},"./security":{"types":"./dist/security/index.d.ts","default":"./dist/security/index.js"}},"funding":{"url":"https://github.com/sponsors/bloomneo","type":"github"},"gitHead":"3bddfba321b7319a72bbefeb9ed8c28ff520e1ec","scripts":{"lint":"eslint src/","test":"npm run check:docs && npm run check:anchors && vitest --run --passWithNoTests","build":"tsc","format":"prettier --write 'src/**/*.js'","test:unit":"vitest --run --passWithNoTests","check:docs":"npx tsx scripts/check-doc-drift.ts","check:anchors":"npx tsx scripts/check-readme-anchors.ts","prepublishOnly":"npm run test && npm run build","prisma:generate":"prisma generate"},"_npmUser":{"name":"bloomneo","email":"krishnatejags@gmail.com"},"repository":{"url":"git+https://github.com/bloomneo/appkit.git","type":"git"},"_npmVersion":"11.4.2","description":"Minimal and framework agnostic Node.js toolkit designed for AI agentic backend development.","directories":{},"sideEffects":false,"_nodeVersion":"20.17.0","dependencies":{"bcrypt":"^5.1.1","dotenv":"^16.6.1","prisma":"^6.16.2","ioredis":"^5.6.1","commander":"^12.1.0","jsonwebtoken":"^9.0.2","@prisma/client":"^6.16.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^3.1.3","esbuild":">=0.25.0","express":"^5.1.0","prettier":"^3.2.4","@types/pg":"^8.10.0","supertest":"^7.1.1","@eslint/js":"^9.0.0","typescript":"^5.0.0","@types/node":"^18.0.0","@types/bcrypt":"^5.0.2","@types/nodemailer":"^6.4.17","@types/jsonwebtoken":"^9.0.10","@vitest/coverage-v8":"^3.1.3"},"peerDependencies":{"multer":"^2.0.2","express":"^4.0.0 || ^5.0.0","fastify":"^5.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","express-session":"^1.18.2","@fastify/session":"^11.1.0","@fastify/formbody":"^8.0.2"},"optionalDependencies":{"pg":"^8.11.0","bull":"^4.10.0","redis":"^4.7.1","mysql2":"^3.5.0","sqlite":"^4.2.1","sqlite3":"^5.1.6","mongoose":"^7.0.0","memcached":"^2.2.2","mailgun.js":"^9.0.0","nodemailer":"^7.0.12","@sendgrid/mail":"^8.1.5","@aws-sdk/client-s3":"^3.0.0","@aws-sdk/client-ses":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.0.0"},"peerDependenciesMeta":{"multer":{"optional":true},"express":{"optional":true},"fastify":{"optional":true},"@fastify/cookie":{"optional":true},"@fastify/helmet":{"optional":true},"express-session":{"optional":true},"@fastify/session":{"optional":true},"@fastify/formbody":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/appkit_4.0.0_1776443726147_0.38756220375211514","host":"s3://npm-registry-packages-npm-production"}},"5.1.1":{"name":"@bloomneo/appkit","version":"5.1.1","keywords":["nodejs","node","toolkit","framework-agnostic","auth","authentication","jwt","bcrypt","multi-tenant","tenant","database","saas","cache","caching","redis","memcached","events","event-bus","pubsub","security","csrf","rate-limiting","sanitization","email","smtp","ses","sendgrid","mailgun","queue","job-queue","background-jobs","logging","logger","storage","s3","file-storage","configuration","config","validation","utils","utilities","express","middleware","error-handling","tree-shaking","esm","typescript","cli","scaffolding","fbca","code-generation"],"author":{"url":"https://github.com/ktvoilacode","name":"Krishna Teja GS","email":"kt@voilacode.com"},"license":"MIT","_id":"@bloomneo/appkit@5.1.1","maintainers":[{"name":"bloomneo","email":"krishnatejags@gmail.com"}],"homepage":"https://github.com/bloomneo/appkit#readme","bugs":{"url":"https://github.com/bloomneo/appkit/issues"},"bin":{"appkit":"bin/appkit.js"},"dist":{"shasum":"3caf46901161308a319256301dd6a3f1175ec904","tarball":"https://registry.npmjs.org/@bloomneo/appkit/-/appkit-5.1.1.tgz","fileCount":366,"integrity":"sha512-B3oGAEdUubXQKu1n2LQOeAbzLC6XGyBVrrWDI4lqkX+jLLyT2zvZCh7KeiZdvPgcKjOv9UE3jWW+9sVpR7bwhA==","signatures":[{"sig":"MEQCIArDgbKkqq6db4SF8uuFymPY8UdOoDbexqIyWSm0qhRdAiAxx03HR/SlzmQ+4X5PJfsRIMWmklNEMGD8aZN+3EM6pA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2422614},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./mcp":{"types":"./dist/mcp/index.d.ts","default":"./dist/mcp/index.js"},"./auth":{"types":"./dist/auth/index.d.ts","default":"./dist/auth/index.js"},"./util":{"types":"./dist/util/index.d.ts","default":"./dist/util/index.js"},"./cache":{"types":"./dist/cache/index.d.ts","default":"./dist/cache/index.js"},"./email":{"types":"./dist/email/index.d.ts","default":"./dist/email/index.js"},"./error":{"types":"./dist/error/index.d.ts","default":"./dist/error/index.js"},"./event":{"types":"./dist/event/index.d.ts","default":"./dist/event/index.js"},"./queue":{"types":"./dist/queue/index.d.ts","default":"./dist/queue/index.js"},"./config":{"types":"./dist/config/index.d.ts","default":"./dist/config/index.js"},"./logger":{"types":"./dist/logger/index.d.ts","default":"./dist/logger/index.js"},"./verify":{"types":"./dist/verify/index.d.ts","default":"./dist/verify/index.js"},"./storage":{"types":"./dist/storage/index.d.ts","default":"./dist/storage/index.js"},"./database":{"types":"./dist/database/index.d.ts","default":"./dist/database/index.js"},"./security":{"types":"./dist/security/index.d.ts","default":"./dist/security/index.js"}},"funding":{"url":"https://github.com/sponsors/bloomneo","type":"github"},"gitHead":"e707dff9e033f773476820fb1172ac20f67fefdb","scripts":{"lint":"eslint src/","test":"npm run check:docs && npm run check:anchors && npm run check:skills && vitest --run --passWithNoTests","build":"tsc","format":"prettier --write 'src/**/*.js'","test:unit":"vitest --run --passWithNoTests","check:docs":"npx tsx scripts/check-doc-drift.ts","check:skills":"npx tsx scripts/check-skill-api.ts","check:anchors":"npx tsx scripts/check-readme-anchors.ts","prepublishOnly":"npm run test && npm run build","prisma:generate":"prisma generate","test:integration":"vitest --run --config vitest.integration.config.js"},"_npmUser":{"name":"bloomneo","email":"krishnatejags@gmail.com"},"repository":{"url":"git+https://github.com/bloomneo/appkit.git","type":"git"},"_npmVersion":"11.4.2","description":"Minimal and framework agnostic Node.js toolkit designed for AI agentic backend development.","directories":{},"sideEffects":false,"_nodeVersion":"20.17.0","dependencies":{"bcrypt":"^5.1.1","dotenv":"^16.6.1","prisma":"^6.16.2","ioredis":"^5.6.1","commander":"^12.1.0","jsonwebtoken":"^9.0.2","@prisma/client":"^6.16.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^3.1.3","esbuild":">=0.25.0","express":"^5.1.0","prettier":"^3.2.4","@types/pg":"^8.10.0","supertest":"^7.1.1","@eslint/js":"^9.0.0","typescript":"^5.0.0","@types/node":"^18.0.0","@types/bcrypt":"^5.0.2","@types/nodemailer":"^6.4.17","@types/jsonwebtoken":"^9.0.10","@vitest/coverage-v8":"^3.1.3","@modelcontextprotocol/sdk":"^1.30.0"},"peerDependencies":{"multer":"^2.0.2","express":"^4.0.0 || ^5.0.0","fastify":"^5.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","express-session":"^1.18.2","@fastify/session":"^11.1.0","@fastify/formbody":"^8.0.2","@modelcontextprotocol/sdk":"^1.0.0"},"optionalDependencies":{"pg":"^8.11.0","bull":"^4.10.0","redis":"^4.7.1","mysql2":"^3.5.0","sqlite":"^4.2.1","sqlite3":"^5.1.6","mongoose":"^7.0.0","memcached":"^2.2.2","mailgun.js":"^9.0.0","nodemailer":"^7.0.12","@sendgrid/mail":"^8.1.5","@aws-sdk/client-s3":"^3.0.0","@aws-sdk/client-ses":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.0.0"},"peerDependenciesMeta":{"multer":{"optional":true},"express":{"optional":true},"fastify":{"optional":true},"@fastify/cookie":{"optional":true},"@fastify/helmet":{"optional":true},"express-session":{"optional":true},"@fastify/session":{"optional":true},"@fastify/formbody":{"optional":true},"@modelcontextprotocol/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/appkit_5.1.1_1786937348344_0.852252606881003","host":"s3://npm-registry-packages-npm-production"}},"5.1.2":{"name":"@bloomneo/appkit","version":"5.1.2","keywords":["nodejs","node","toolkit","framework-agnostic","auth","authentication","jwt","bcrypt","multi-tenant","tenant","database","saas","cache","caching","redis","memcached","events","event-bus","pubsub","security","csrf","rate-limiting","sanitization","email","smtp","ses","sendgrid","mailgun","queue","job-queue","background-jobs","logging","logger","storage","s3","file-storage","configuration","config","validation","utils","utilities","express","middleware","error-handling","tree-shaking","esm","typescript","cli","scaffolding","fbca","code-generation"],"author":{"url":"https://github.com/ktvoilacode","name":"Krishna Teja GS","email":"kt@voilacode.com"},"license":"MIT","_id":"@bloomneo/appkit@5.1.2","maintainers":[{"name":"bloomneo","email":"krishnatejags@gmail.com"}],"homepage":"https://github.com/bloomneo/appkit#readme","bugs":{"url":"https://github.com/bloomneo/appkit/issues"},"bin":{"appkit":"bin/appkit.js"},"dist":{"shasum":"ff9f60b63ff1e375b549b3e6f5d1a163b958c6cc","tarball":"https://registry.npmjs.org/@bloomneo/appkit/-/appkit-5.1.2.tgz","fileCount":366,"integrity":"sha512-Kfn+gThyCW6hDUTx0eHBQh58jhzrmckSNsO/9IlUsIOCElsyI7U++sjld0TOKvDPb/5dKWFqN8om8LVyzgtAvQ==","signatures":[{"sig":"MEYCIQCDJ4BoKdRXFayLOP9MAoGERM0uQSNJbeYZ6qJn+X3xzQIhAPp68tT6BeSgGqpuCEo3exf0D6McP40Ho8jyu97khtUG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2431644},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./mcp":{"types":"./dist/mcp/index.d.ts","default":"./dist/mcp/index.js"},"./auth":{"types":"./dist/auth/index.d.ts","default":"./dist/auth/index.js"},"./util":{"types":"./dist/util/index.d.ts","default":"./dist/util/index.js"},"./cache":{"types":"./dist/cache/index.d.ts","default":"./dist/cache/index.js"},"./email":{"types":"./dist/email/index.d.ts","default":"./dist/email/index.js"},"./error":{"types":"./dist/error/index.d.ts","default":"./dist/error/index.js"},"./event":{"types":"./dist/event/index.d.ts","default":"./dist/event/index.js"},"./queue":{"types":"./dist/queue/index.d.ts","default":"./dist/queue/index.js"},"./config":{"types":"./dist/config/index.d.ts","default":"./dist/config/index.js"},"./logger":{"types":"./dist/logger/index.d.ts","default":"./dist/logger/index.js"},"./verify":{"types":"./dist/verify/index.d.ts","default":"./dist/verify/index.js"},"./storage":{"types":"./dist/storage/index.d.ts","default":"./dist/storage/index.js"},"./database":{"types":"./dist/database/index.d.ts","default":"./dist/database/index.js"},"./security":{"types":"./dist/security/index.d.ts","default":"./dist/security/index.js"}},"funding":{"url":"https://github.com/sponsors/bloomneo","type":"github"},"gitHead":"0ecffd22883bfa74f20e26fec764fe4e5cfc3293","scripts":{"lint":"eslint src/","test":"npm run check:docs && npm run check:anchors && npm run check:skills && vitest --run --passWithNoTests","build":"tsc","format":"prettier --write 'src/**/*.js'","test:unit":"vitest --run --passWithNoTests","check:docs":"npx tsx scripts/check-doc-drift.ts","check:skills":"npx tsx scripts/check-skill-api.ts","check:anchors":"npx tsx scripts/check-readme-anchors.ts","prepublishOnly":"npm run test && npm run build","prisma:generate":"prisma generate","test:integration":"vitest --run --config vitest.integration.config.js"},"_npmUser":{"name":"bloomneo","email":"krishnatejags@gmail.com"},"repository":{"url":"git+https://github.com/bloomneo/appkit.git","type":"git"},"_npmVersion":"11.4.2","description":"Minimal and framework agnostic Node.js toolkit designed for AI agentic backend development.","directories":{},"sideEffects":false,"_nodeVersion":"20.17.0","dependencies":{"bcrypt":"^5.1.1","dotenv":"^16.6.1","prisma":"^6.16.2","ioredis":"^5.6.1","commander":"^12.1.0","jsonwebtoken":"^9.0.2","@prisma/client":"^6.16.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.0.0","vitest":"^3.1.3","esbuild":">=0.25.0","express":"^5.1.0","prettier":"^3.2.4","@types/pg":"^8.10.0","supertest":"^7.1.1","@eslint/js":"^9.0.0","typescript":"^5.0.0","@types/node":"^18.0.0","@types/bcrypt":"^5.0.2","@types/nodemailer":"^6.4.17","@types/jsonwebtoken":"^9.0.10","@vitest/coverage-v8":"^3.1.3","@modelcontextprotocol/sdk":"^1.30.0"},"peerDependencies":{"multer":"^2.0.2","express":"^4.0.0 || ^5.0.0","fastify":"^5.6.0","@fastify/cookie":"^11.0.2","@fastify/helmet":"^13.0.1","express-session":"^1.18.2","@fastify/session":"^11.1.0","@fastify/formbody":"^8.0.2","@modelcontextprotocol/sdk":"^1.0.0"},"optionalDependencies":{"pg":"^8.11.0","bull":"^4.10.0","redis":"^4.7.1","mysql2":"^3.5.0","sqlite":"^4.2.1","sqlite3":"^5.1.6","mongoose":"^7.0.0","memcached":"^2.2.2","mailgun.js":"^9.0.0","nodemailer":"^7.0.12","@sendgrid/mail":"^8.1.5","@aws-sdk/client-s3":"^3.0.0","@aws-sdk/client-ses":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.0.0"},"peerDependenciesMeta":{"multer":{"optional":true},"express":{"optional":true},"fastify":{"optional":true},"@fastify/cookie":{"optional":true},"@fastify/helmet":{"optional":true},"express-session":{"optional":true},"@fastify/session":{"optional":true},"@fastify/formbody":{"optional":true},"@modelcontextprotocol/sdk":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/appkit_5.1.2_1787474385232_0.3856871237616408","host":"s3://npm-registry-packages-npm-production"}},"5.1.3":{"name":"@bloomneo/appkit","version":"5.1.3","description":"Minimal and framework agnostic Node.js toolkit designed for AI agentic backend development.","main":"dist/index.js","type":"module","types":"./dist/index.d.ts","sideEffects":false,"bin":{"appkit":"bin/appkit.js"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./auth":{"types":"./dist/auth/index.d.ts","default":"./dist/auth/index.js"},"./config":{"types":"./dist/config/index.d.ts","default":"./dist/config/index.js"},"./security":{"types":"./dist/security/index.d.ts","default":"./dist/security/index.js"},"./database":{"types":"./dist/database/index.d.ts","default":"./dist/database/index.js"},"./cache":{"types":"./dist/cache/index.d.ts","default":"./dist/cache/index.js"},"./email":{"types":"./dist/email/index.d.ts","default":"./dist/email/index.js"},"./event":{"types":"./dist/event/index.d.ts","default":"./dist/event/index.js"},"./error":{"types":"./dist/error/index.d.ts","default":"./dist/error/index.js"},"./logger":{"types":"./dist/logger/index.d.ts","default":"./dist/logger/index.js"},"./queue":{"types":"./dist/queue/index.d.ts","default":"./dist/queue/index.js"},"./storage":{"types":"./dist/storage/index.d.ts","default":"./dist/storage/index.js"},"./util":{"types":"./dist/util/index.d.ts","default":"./dist/util/index.js"},"./mcp":{"types":"./dist/mcp/index.d.ts","default":"./dist/mcp/index.js"},"./verify":{"types":"./dist/verify/index.d.ts","default":"./dist/verify/index.js"}},"scripts":{"test":"npm run check:docs && npm run check:anchors && npm run check:skills && vitest --run --passWithNoTests","test:unit":"vitest --run --passWithNoTests","lint":"eslint src/","format":"prettier --write 'src/**/*.js'","prisma:generate":"prisma generate","build":"tsc","check:docs":"npx tsx scripts/check-doc-drift.ts","check:anchors":"npx tsx scripts/check-readme-anchors.ts","prepublishOnly":"npm run test && npm run build","test:integration":"vitest --run --config vitest.integration.config.js","check:skills":"npx tsx scripts/check-skill-api.ts"},"keywords":["nodejs","node","toolkit","framework-agnostic","auth","authentication","jwt","bcrypt","multi-tenant","tenant","database","saas","cache","caching","redis","memcached","events","event-bus","pubsub","security","csrf","rate-limiting","sanitization","email","smtp","ses","sendgrid","mailgun","queue","job-queue","background-jobs","logging","logger","storage","s3","file-storage","configuration","config","validation","utils","utilities","express","middleware","error-handling","tree-shaking","esm","typescript","cli","scaffolding","fbca","code-generation"],"author":{"name":"Krishna Teja GS","email":"kt@voilacode.com","url":"https://github.com/ktvoilacode"},"license":"MIT","dependencies":{"@prisma/client":"^6.16.2","bcrypt":"^5.1.1","commander":"^12.1.0","dotenv":"^16.6.1","ioredis":"^5.6.1","jsonwebtoken":"^9.0.2","prisma":"^6.16.2"},"peerDependencies":{"@fastify/cookie":"^11.0.2","@fastify/formbody":"^8.0.2","@fastify/helmet":"^13.0.1","@fastify/session":"^11.1.0","@modelcontextprotocol/sdk":"^1.0.0","express":"^4.0.0 || ^5.0.0","express-session":"^1.18.2","fastify":"^5.6.0","multer":"^2.0.2"},"peerDependenciesMeta":{"@fastify/cookie":{"optional":true},"@fastify/formbody":{"optional":true},"@fastify/helmet":{"optional":true},"@fastify/session":{"optional":true},"express":{"optional":true},"express-session":{"optional":true},"fastify":{"optional":true},"multer":{"optional":true},"@modelcontextprotocol/sdk":{"optional":true}},"devDependencies":{"@eslint/js":"^9.0.0","@modelcontextprotocol/sdk":"^1.30.0","@types/bcrypt":"^5.0.2","@types/jsonwebtoken":"^9.0.10","@types/node":"^18.0.0","@types/nodemailer":"^6.4.17","@types/pg":"^8.10.0","@vitest/coverage-v8":"^3.1.3","esbuild":">=0.25.0","eslint":"^9.0.0","express":"^5.1.0","prettier":"^3.2.4","supertest":"^7.1.1","typescript":"^5.0.0","vitest":"^3.1.3"},"optionalDependencies":{"@aws-sdk/client-s3":"^3.0.0","@aws-sdk/client-ses":"^3.0.0","@aws-sdk/s3-request-presigner":"^3.0.0","@sendgrid/mail":"^8.1.5","bull":"^4.10.0","mailgun.js":"^9.0.0","memcached":"^2.2.2","mongoose":"^7.0.0","mysql2":"^3.5.0","nodemailer":"^7.0.12","pg":"^8.11.0","redis":"^4.7.1","sqlite":"^4.2.1","sqlite3":"^5.1.6"},"engines":{"node":">=18.0.0"},"repository":{"type":"git","url":"git+https://github.com/bloomneo/appkit.git"},"bugs":{"url":"https://github.com/bloomneo/appkit/issues"},"publishConfig":{"access":"public"},"homepage":"https://github.com/bloomneo/appkit#readme","funding":{"type":"github","url":"https://github.com/sponsors/bloomneo"},"_id":"@bloomneo/appkit@5.1.3","gitHead":"238a715d991a4ccffbed8c07810f9e706eaca2ba","_nodeVersion":"20.17.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-VY3v24JQuYI8TwZrMdx75Z61xDsbGZyZlf3xjWMgSARuP+KSOUpq/HrKSNn/4q0NVUBIX9Q9LACYgnuIY5GNGg==","shasum":"7021a53033bd087fa5630369171c978238a89de4","tarball":"https://registry.npmjs.org/@bloomneo/appkit/-/appkit-5.1.3.tgz","fileCount":370,"unpackedSize":2433697,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD7YpH/pRxjg42wHBvVzIuNaHat9Lor4HaRcs7iU54wKQIhAIiZU2o1SkWpii6yTjxBdvqWA7NmkiQYKNMZnSSPWv1Q"}]},"_npmUser":{"name":"bloomneo","email":"krishnatejags@gmail.com"},"directories":{},"maintainers":[{"name":"bloomneo","email":"krishnatejags@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/appkit_5.1.3_1787637856292_0.43701434184666743"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-11T04:00:11.519Z","modified":"2026-08-25T06:04:16.653Z","1.2.9":"2026-04-11T04:00:11.726Z","1.5.1":"2026-04-11T05:59:54.616Z","1.5.2":"2026-04-11T15:15:08.052Z","2.0.0":"2026-04-15T01:38:39.079Z","4.0.0":"2026-04-17T16:35:26.348Z","5.1.1":"2026-08-17T03:29:08.519Z","5.1.2":"2026-08-23T08:39:45.395Z","5.1.3":"2026-08-25T06:04:16.481Z"},"bugs":{"url":"https://github.com/bloomneo/appkit/issues"},"author":{"name":"Krishna Teja GS","email":"kt@voilacode.com","url":"https://github.com/ktvoilacode"},"license":"MIT","homepage":"https://github.com/bloomneo/appkit#readme","keywords":["nodejs","node","toolkit","framework-agnostic","auth","authentication","jwt","bcrypt","multi-tenant","tenant","database","saas","cache","caching","redis","memcached","events","event-bus","pubsub","security","csrf","rate-limiting","sanitization","email","smtp","ses","sendgrid","mailgun","queue","job-queue","background-jobs","logging","logger","storage","s3","file-storage","configuration","config","validation","utils","utilities","express","middleware","error-handling","tree-shaking","esm","typescript","cli","scaffolding","fbca","code-generation"],"repository":{"type":"git","url":"git+https://github.com/bloomneo/appkit.git"},"description":"Minimal and framework agnostic Node.js toolkit designed for AI agentic backend development.","maintainers":[{"name":"bloomneo","email":"krishnatejags@gmail.com"}],"readme":"# Bloomneo AppKit 🚀\n\n[![npm version](https://img.shields.io/npm/v/@bloomneo/appkit.svg)](https://www.npmjs.com/package/@bloomneo/appkit)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue.svg)](https://www.typescriptlang.org/)\n[![AI Ready](https://img.shields.io/badge/AI-Optimized-purple.svg)](https://github.com/bloomneo/appkit)\n\n> Minimal, framework-agnostic Node.js toolkit designed for AI agentic backend development.\n\n**14 integrated modules. One pattern. Zero config to start, enterprise scaling on demand.**\n\n```ts\nimport { authClass, databaseClass, errorClass, loggerClass } from '@bloomneo/appkit';\n\nconst auth = authClass.get();\nconst database = await databaseClass.get();\nconst error = errorClass.get();\nconst logger = loggerClass.get('api');\n\napp.post(\n  '/api/users',\n  auth.requireLoginToken(),                    // 1. authenticate the user\n  auth.requireUserRoles(['admin.tenant']),     // 2. check the role (always chained)\n  error.asyncRoute(async (req, res) => {\n    if (!req.body?.email) throw error.badRequest('Email required');\n    const user = await database.user.create({ data: req.body });\n    logger.info('User created', { userId: user.id });\n    res.json({ user });\n  })\n);\n\napp.use(error.handleErrors());  // last middleware\n```\n\n**Production-ready API with auth, database, error handling, logging. Zero config files.**\n\n---\n\n## 🤖 For AI coding agents — read these first\n\nFive locations at the package root tell agents everything they need to know:\n\n| File | Purpose |\n|---|---|\n| **[`AGENTS.md`](./AGENTS.md)** | Rules: always-do, never-do, canonical patterns. Read first. |\n| **[`llms.txt`](./llms.txt)** | Reference: every export, every method, signatures + examples. |\n| **[`examples/`](./examples)** | 14 minimal `.ts` files, one per module. Copy and modify. |\n| **[`cookbook/`](./cookbook)** | Composed recipes for whole patterns (CRUD, multi-tenant, file upload, real-time). |\n| **[`.claude/skills/`](./.claude/skills)** | Claude Code skills — one `appkit` overview + one per module (`appkit-auth`, `appkit-cache`, `appkit-config`, `appkit-database`, `appkit-email`, `appkit-error`, `appkit-event`, `appkit-logger`, `appkit-mcp`, `appkit-queue`, `appkit-security`, `appkit-storage`, `appkit-util`, `appkit-verify`). Auto-trigger when agents work on code that imports this package. Copy the directory into your own repo's `.claude/skills/` to activate. |\n\nAll of the above ship inside the npm tarball. AI agents installing `@bloomneo/appkit`\ncan read them directly from `node_modules/@bloomneo/appkit/`.\n\n---\n\n## 🚀 Quick start\n\n### As a library (in any Node.js project)\n\n```bash\nnpm install @bloomneo/appkit\n```\n\n**Three things your project needs** before the first `import` works — these are\nthe most common first-run stumbles, so do them up front:\n\n1. **ESM.** AppKit is ESM-only. Your `package.json` must have `\"type\": \"module\"`,\n   or your source files must use the `.mjs` extension. Without this, `import`\n   throws `ERR_REQUIRE_ESM`.\n2. **Required env vars** must exist in `process.env` before you call any\n   `xxxClass.get()`. The minimum for auth:\n   ```bash\n   BLOOM_AUTH_SECRET=<at least 32 random chars>\n   ```\n   Full list: [`.env.example`](./.env.example) — copy it to `.env` and fill in\n   what your app uses.\n3. **AppKit does NOT auto-load `.env`.** Load it yourself, before any AppKit\n   import. Either preload on the command line:\n   ```bash\n   node --import=dotenv/config ./server.mjs\n   ```\n   or import at the very top of your entry file:\n   ```ts\n   import 'dotenv/config';   // MUST be the first import\n   import { authClass } from '@bloomneo/appkit/auth';\n   ```\n\n### Minimum working example\n\n`package.json`:\n\n```json\n{\n  \"type\": \"module\",\n  \"dependencies\": {\n    \"@bloomneo/appkit\": \"^5.1.3\",\n    \"dotenv\": \"^16.0.0\",\n    \"express\": \"^5.0.0\"\n  }\n}\n```\n\n`.env`:\n\n```bash\nBLOOM_AUTH_SECRET=change-me-to-at-least-32-random-characters\n```\n\n`server.mjs`:\n\n```ts\nimport 'dotenv/config';\nimport express from 'express';\nimport { authClass } from '@bloomneo/appkit/auth';\n\nconst auth = authClass.get();\nconst app = express();\napp.use(express.json());\n\napp.post('/login', async (req, res) => {\n  // ... verify user ...\n  const token = auth.generateLoginToken({ userId: 1, role: 'user', level: 'basic' });\n  res.json({ token });\n});\n\napp.get('/me', auth.requireLoginToken(), (req, res) => {\n  res.json(auth.getUser(req));\n});\n\napp.listen(3000, () => console.log('http://localhost:3000'));\n```\n\nRun it:\n\n```bash\nnpm install\nnode server.mjs\n```\n\n### As a complete scaffold (CLI)\n\n```bash\nnpm install -g @bloomneo/appkit\nappkit generate app myproject\ncd myproject && npm run dev:api\n```\n\n→ Production-ready Express API at `http://localhost:3000` with auth, database,\nlogging, error handling all wired.\n\nFor full-stack scaffolding (frontend + backend), use [`@bloomneo/bloom`](https://www.npmjs.com/package/@bloomneo/bloom)\nwhich assembles AppKit + UIKit + FBCA convention into one CLI.\n\n---\n\n## ✨ The one rule that matters most\n\n```ts\nconst auth = authClass.get();   // ALWAYS .get(), NEVER `new AuthClass()`\n```\n\nEvery module follows this exact pattern. There are no exceptions, no\nconstructors, no factories with custom names.\n\n```ts\nconst auth     = authClass.get();\nconst database = await databaseClass.get();\nconst error    = errorClass.get();\nconst cache    = cacheClass.get();           // default 'app' namespace\nconst userCache = cacheClass.get('users');   // custom namespace\nconst logger   = loggerClass.get('api');     // component-tagged\n```\n\n**One function per module. Predictable. Non-ambiguous. AI-agent friendly.**\n\n---\n\n## 🎭 The 14 modules\n\n| # | Module | Purpose | Auto-scales |\n|---|---|---|---|\n| 1 | **Auth** | JWT tokens, role.level permissions, middleware | — |\n| 2 | **Database** | Prisma/Mongoose with multi-tenant filtering | per-org databases |\n| 3 | **Security** | CSRF, rate limiting, AES-256-GCM, input sanitization | — |\n| 4 | **Error** | HTTP errors with semantic types + middleware | — |\n| 5 | **Cache** | Memory → Redis | `REDIS_URL` |\n| 6 | **Storage** | Local → S3/R2 | `AWS_S3_BUCKET` |\n| 7 | **Queue** | Memory → Redis → DB | `REDIS_URL` / `BLOOM_QUEUE_DB` |\n| 8 | **Email** | Console → SMTP → Resend | `RESEND_API_KEY` |\n| 9 | **Event** | Memory → Redis pub/sub | `REDIS_URL` |\n| 10 | **Logger** | Console → File → HTTP | `BLOOM_LOGGER_*` |\n| 11 | **Config** | Type-safe env var access | — |\n| 12 | **Util** | Safe property access, debounce, chunk, uuid, slugify | — |\n| 13 | **MCP** | Your app as an MCP server — OAuth 2.1 + FBCA tool discovery | optional peers |\n| 14 | **Verify** | Generates the cross-tenant attack matrix and fails CI on a leak | — |\n\nFor full method signatures and per-module examples, read [`llms.txt`](./llms.txt).\n\n---\n\n## 🌍 Environment-driven progressive scaling\n\nSame code. Different `.env`. Enterprise features automatically enabled.\n\n```bash\n# Day 1 — local development (zero config)\nBLOOM_AUTH_SECRET=<min 32 chars>\nDATABASE_URL=postgresql://localhost/myapp\n# → Memory cache, local file storage, console logs, console email\n\n# Month 6 — production (just add env vars, no code changes)\nREDIS_URL=redis://prod-cache:6379         # → distributed cache + queue\nAWS_S3_BUCKET=prod-assets                 # → cloud storage + CDN\nRESEND_API_KEY=re_production_key          # → professional email\nBLOOM_DB_TENANT=auto                      # → multi-tenant filtering\nBLOOM_LOGGER_HTTP_URL=https://logs.example.com  # → centralized logging\n```\n\nSee [`.env.example`](./.env.example) at the repo root for the full canonical template — every BLOOM_* var, organized by module.\n\n---\n\n## 🛠️ AppKit CLI\n\nProject generation:\n\n```bash\nappkit generate app myproject       # full backend scaffold (Express + auth + db + error + logger)\n```\n\nFeature generation:\n\n```bash\nappkit generate feature product     # basic feature (route + service + types)\nappkit generate feature order --db  # database-enabled feature (+ model + HTTP tests)\nappkit generate feature user        # complete authentication system (9-role hierarchy)\n```\n\nGenerated project structure:\n\n```\nmyproject/\n├── AGENTS.md                       # ← copied from @bloomneo/appkit at scaffold time\n├── llms.txt                        # ← copied from @bloomneo/appkit at scaffold time\n├── src/api/\n│   ├── server.ts                   # Express bootstrap\n│   ├── lib/api-router.ts           # auto-discovery routing\n│   └── features/\n│       ├── welcome/\n│       └── [your-features]/\n└── package.json\n\n# `.env` is created on demand — `generate feature user` (or any `--db` feature)\n# drops DATABASE_URL, BLOOM_AUTH_SECRET, and DEFAULT_USER_PASSWORD into it.\n```\n\n---\n\n## 🏗️ Migration\n\n**Current release: 5.1.3.** The full, canonical migration table lives in\n[`CHANGELOG.md`](./CHANGELOG.md#400---2026-04-17) — run that project-wide\nfind-and-replace and your code works.\n\n### From `@bloomneo/appkit@2.0.0` → `4.0.0`\n\nTeardown and error handling changed. Nothing else in the 2.0.0 public API\nwas renamed.\n\n```\ncacheClass.flushAll(      → cacheClass.clearAll(\ncacheClass.shutdown(      → cacheClass.disconnectAll(\nqueueClass.clear(         → queueClass.disconnectAll(\nemailClass.shutdown(      → emailClass.disconnectAll(\nemailClass.clear(         → emailClass.disconnectAll(\neventClass.shutdown(      → eventClass.disconnectAll(\neventClass.clear(         → eventClass.disconnectAll(\nstorageClass.shutdown(    → storageClass.disconnectAll(\nstorageClass.clear(       → storageClass.disconnectAll(\nloggerClass.clear(        → loggerClass.disconnectAll(\ndatabaseClass.disconnect( → databaseClass.disconnectAll(\n```\n\nThen:\n- Error handling: every typed error now extends `AppKitError`. Prefer\n  `catch (err) { if (err instanceof AppKitError) ... }` over\n  module-specific `instanceof` checks.\n- Production: email/storage/database/security refuse to silently fall back.\n  Confirm required env vars are set before deploy.\n- Library no longer auto-registers `process.on('SIGTERM', ...)` — wire\n  `xxxClass.disconnectAll()` from your own signal handler (the scaffolded\n  backend template does this).\n\n### From `@bloomneo/appkit@1.5.x` (or earlier) → `4.0.0`\n\nApply everything above PLUS the pre-2.0 renames:\n\n- `auth.user(req)` → `auth.getUser(req)`\n- `auth.can(user, perm)` → `auth.hasPermission(user, perm)`\n- `security.csrf()` → `security.forms()`\n- `error.handleErrors({ includeStack })` → `error.handleErrors({ showStack })`\n\nIf your code called `auth.requireLogin()` or `auth.requireRole(...)`, it\nwas already broken — those methods never existed. Use\n`auth.requireLoginToken()` and `auth.requireUserRoles([...])`.\n\n---\n\n## 📚 Resources\n\n- **[`AGENTS.md`](./AGENTS.md)** — agent-facing rules and conventions\n- **[`llms.txt`](./llms.txt)** — full machine-readable API reference\n- **[`examples/`](./examples)** — one minimal example per module\n- **[`cookbook/`](./cookbook)** — composed recipes (auth + crud, multi-tenant, file upload, real-time)\n- **[`CHANGELOG.md`](./CHANGELOG.md)** — release history\n- **[Per-module READMEs](https://github.com/bloomneo/appkit/tree/main/src)** — long-form human docs (also shipped in the tarball at `node_modules/@bloomneo/appkit/src/<module>/README.md`)\n- **Issues**: https://github.com/bloomneo/appkit/issues\n\n---\n\n## 📄 License\n\nMIT © [Krishna Teja GS](https://github.com/ktvoilacode)\n\n---\n\n<p align=\"center\">\n  <strong>🚀 Built for the AI-first future of backend development</strong><br>\n  <strong>Where enterprise applications are generated, not written</strong><br><br>\n  <a href=\"https://github.com/bloomneo/appkit\">⭐ Star on GitHub</a>\n</p>\n","readmeFilename":"README.md"}