{"_id":"key-rotation-manager","_rev":"27-9173e4987c61386e4a3ab51c08fedbc4","name":"key-rotation-manager","dist-tags":{"latest":"1.1.4"},"versions":{"1.0.4":{"name":"key-rotation-manager","version":"1.0.4","keywords":["typescript","module"],"author":{"name":"Duco"},"license":"MIT","_id":"key-rotation-manager@1.0.4","maintainers":[{"name":"ducanh261102","email":"ducanhmc24@gmail.com"}],"dist":{"shasum":"f307ef50a61e3856430a138f4f4f77a1fda0ec7d","tarball":"https://registry.npmjs.org/key-rotation-manager/-/key-rotation-manager-1.0.4.tgz","fileCount":11,"integrity":"sha512-nZOYJMu4YYA3+rbwNqtOWs3L5ItP2q7ZLtkJkHRGUzq1US88ut8oEaK+cH9Tjy7ScpwceXAzOWZGzFrpQRVb0w==","signatures":[{"sig":"MEQCIE4cxSIsltuJ/NDMaJca47+NaoYQ1lT5zrStQJsSAKtEAiBEiuMhQ0IR7MGLOoW+E74hff6FLvL0Pu6Aw1xje7l94w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":157555},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"a10e310698c83acbba389e9d67b8dab830aaad21","scripts":{"lint":"eslint src --ext .ts","build":"tsup && npm run copy-files","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","lint:fix":"eslint src --ext .ts --fix","copy-files":"node -e \"const fs=require('fs');['README.md','LICENSE'].forEach(f=>fs.copyFileSync(f,'dist/'+f))\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"ducanh261102","email":"ducanhmc24@gmail.com"},"_npmVersion":"11.6.2","description":"Simple, secure key rotation for Node.js","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","rimraf":"^5.0.7","prettier":"^3.3.3","typescript":"^5.4.5","@types/node":"^18.19.74","@typescript-eslint/parser":"^8.28.0","@typescript-eslint/eslint-plugin":"^8.28.0"},"_npmOperationalInternal":{"tmp":"tmp/key-rotation-manager_1.0.4_1766996603200_0.09575466192972315","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"key-rotation-manager","version":"1.0.6","keywords":["typescript","module"],"author":{"name":"Duco"},"license":"MIT","_id":"key-rotation-manager@1.0.6","maintainers":[{"name":"ducanh261102","email":"ducanhmc24@gmail.com"}],"dist":{"shasum":"fcb739c63e01252c2e92fd681200a1344b5ca22c","tarball":"https://registry.npmjs.org/key-rotation-manager/-/key-rotation-manager-1.0.6.tgz","fileCount":9,"integrity":"sha512-5aXAXsyHUMS/RHHHmPfoFTYTEGTMzwXAMTz2LEW/FE2U6Be8HS9MUyng+kFtwWWR2O20kWFNHTK5jW2elp+nVA==","signatures":[{"sig":"MEQCIAKLRbJzpCCndel6yTy+Y423a+kOMIpEKTCCR9YbfVTrAiBDAYJlcn/AKG8eB2K0mv+JrB5oLn3NJvQFGDQK6lgpDw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152075},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"a10e310698c83acbba389e9d67b8dab830aaad21","scripts":{"lint":"eslint src --ext .ts","build":"tsup","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","lint:fix":"eslint src --ext .ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"ducanh261102","email":"ducanhmc24@gmail.com"},"_npmVersion":"11.6.2","description":"Simple, secure key rotation for Node.js","directories":{},"_nodeVersion":"24.12.0","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","rimraf":"^5.0.7","prettier":"^3.3.3","typescript":"^5.4.5","@types/node":"^18.19.74","@typescript-eslint/parser":"^8.28.0","@typescript-eslint/eslint-plugin":"^8.28.0"},"_npmOperationalInternal":{"tmp":"tmp/key-rotation-manager_1.0.6_1767000802732_0.8701455589854215","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"key-rotation-manager","version":"1.0.7","keywords":["typescript","module"],"author":{"name":"Duco"},"license":"MIT","_id":"key-rotation-manager@1.0.7","maintainers":[{"name":"ducanh261102","email":"ducanhmc24@gmail.com"}],"dist":{"shasum":"67ed77cc2052e65406981ae4866adc8db6455152","tarball":"https://registry.npmjs.org/key-rotation-manager/-/key-rotation-manager-1.0.7.tgz","fileCount":9,"integrity":"sha512-ip8l/7RqJkQTV7Gpd1RxTZ9flGEbVhE4cXYU/16TGd7emNJxI+qH0rcPViQSu/6x+XzbKlyeFgh1Ay9VPZbI/g==","signatures":[{"sig":"MEQCIGH6hUX/R7oeyraqSayBIOH/aDubaKykRB2rq/mAmQd0AiAcIFL6nXg6Enq6v5PSJ+T3AAYlb8I81RjqxkDDM31W+Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173410},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"3365b5ca224cc8e9dc419765501a7b723828481d","scripts":{"lint":"eslint src --ext .ts","build":"tsup","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","lint:fix":"eslint src --ext .ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"ducanh261102","email":"ducanhmc24@gmail.com"},"_npmVersion":"10.8.2","description":"Simple, secure key rotation for Node.js","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","rimraf":"^5.0.7","prettier":"^3.3.3","typescript":"^5.4.5","@types/node":"^18.19.74","@typescript-eslint/parser":"^8.28.0","@typescript-eslint/eslint-plugin":"^8.28.0"},"_npmOperationalInternal":{"tmp":"tmp/key-rotation-manager_1.0.7_1767555254525_0.5501271979645312","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"key-rotation-manager","version":"1.0.9","keywords":["typescript","module"],"author":{"name":"Duco"},"license":"MIT","_id":"key-rotation-manager@1.0.9","maintainers":[{"name":"ducanh261102","email":"ducanhmc24@gmail.com"}],"dist":{"shasum":"b6dbbe617760c703c2a8cb554dc9d3cc75e7daea","tarball":"https://registry.npmjs.org/key-rotation-manager/-/key-rotation-manager-1.0.9.tgz","fileCount":9,"integrity":"sha512-3iGtEFUUHmWtsLWFOew5Dagg1BMm8gL48sOdsZyzpU5lHspmqW89TTHZNG+JgEc/UaHewdPfvhe1Hr3Qfm2EOg==","signatures":[{"sig":"MEUCIQCr7ILucYuyd8JW57m78lQTRotG0jKdrmyEQEQL9rLDcwIgKWkohE+xxZhDHBLpg4jjXdQI5tNS1lWEqlcHO7eORi8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":218863},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"433640b003e751eef47e7a4d714ef118cb9f103f","scripts":{"lint":"eslint src --ext .ts","build":"tsup","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","lint:fix":"eslint src --ext .ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"ducanh261102","email":"ducanhmc24@gmail.com"},"_npmVersion":"10.8.2","description":"Simple, secure key rotation for Node.js","directories":{},"_nodeVersion":"20.19.6","dependencies":{"crypto-js":"^4.2.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","rimraf":"^5.0.7","vitest":"^4.0.16","prettier":"^3.3.3","@vitest/ui":"^4.0.16","typescript":"^5.4.5","@types/node":"^18.19.74","@types/crypto-js":"^4.2.2","@typescript-eslint/parser":"^8.28.0","@typescript-eslint/eslint-plugin":"^8.28.0"},"_npmOperationalInternal":{"tmp":"tmp/key-rotation-manager_1.0.9_1767757028293_0.3172821518306441","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"name":"key-rotation-manager","version":"1.0.10","keywords":["typescript","module"],"author":{"name":"Duco"},"license":"MIT","_id":"key-rotation-manager@1.0.10","maintainers":[{"name":"ducanh261102","email":"ducanhmc24@gmail.com"}],"dist":{"shasum":"524bbb792380bdaf0dffb98c4a45276ea17bc141","tarball":"https://registry.npmjs.org/key-rotation-manager/-/key-rotation-manager-1.0.10.tgz","fileCount":9,"integrity":"sha512-gA0aioil6gvHuhetGMzNDvemiWhTcJU3Rrh6elYFHJx2dsOsbY36oX9Ndp4tz3lw5DyiQ5k2xYXfj/QL6SiY8Q==","signatures":[{"sig":"MEQCIBEQ3tY08Pn9SybJ59CswinWD2tX234Jh0tKMy/WSc+LAiBYO8ekZv7fk62vsHXIIXZiJwnf1/QUepyrHqHAeTw0nA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":236939},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"d0069725e0f5f846a8d7ecdbb60f943b74df0164","scripts":{"lint":"eslint src --ext .ts","build":"tsup","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","lint:fix":"eslint src --ext .ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"ducanh261102","email":"ducanhmc24@gmail.com"},"deprecated":"Bug appeared","_npmVersion":"10.8.2","description":"Simple, secure key rotation for Node.js","directories":{},"_nodeVersion":"20.19.6","dependencies":{"crypto-js":"^4.2.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","rimraf":"^5.0.7","prettier":"^3.3.3","typescript":"^5.4.5","@types/node":"^18.19.74","@types/crypto-js":"^4.2.2","@typescript-eslint/parser":"^8.28.0","@typescript-eslint/eslint-plugin":"^8.28.0"},"_npmOperationalInternal":{"tmp":"tmp/key-rotation-manager_1.0.10_1768072092253_0.12408429263932375","host":"s3://npm-registry-packages-npm-production"}},"1.0.11":{"name":"key-rotation-manager","version":"1.0.11","keywords":["typescript","module"],"author":{"name":"Duco"},"license":"MIT","_id":"key-rotation-manager@1.0.11","maintainers":[{"name":"ducanh261102","email":"ducanhmc24@gmail.com"}],"dist":{"shasum":"aac4a9034837dbecc2616f15c75e628972c81df9","tarball":"https://registry.npmjs.org/key-rotation-manager/-/key-rotation-manager-1.0.11.tgz","fileCount":9,"integrity":"sha512-0LCle3RFU5L9Y5SWjmYu8uEvzM+yNxwowbVB6nD1aR6M7VELpVEeXgPxSnn7hbDMHaT37Yrx4nln73vGiQgjbg==","signatures":[{"sig":"MEUCIQDfKqlYmMeoRDPEbwkweSvfn8ZjSRQGjuTtFUaCxzl7wwIgewCEju712isPvcKxVZvm8l1MR2H6Qoen2ygDYDSbkFY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":238319},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"0eedfc67c1b91eafac543fe5525f37367c7747ca","scripts":{"lint":"eslint src --ext .ts","build":"tsup","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","lint:fix":"eslint src --ext .ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"ducanh261102","email":"ducanhmc24@gmail.com"},"_npmVersion":"10.8.2","description":"Simple, secure key rotation for Node.js","directories":{},"_nodeVersion":"20.19.6","dependencies":{"crypto-js":"^4.2.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","rimraf":"^5.0.7","prettier":"^3.3.3","typescript":"^5.4.5","@types/node":"^18.19.74","@types/crypto-js":"^4.2.2","@typescript-eslint/parser":"^8.28.0","@typescript-eslint/eslint-plugin":"^8.28.0"},"_npmOperationalInternal":{"tmp":"tmp/key-rotation-manager_1.0.11_1768073574359_0.453791406696161","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"key-rotation-manager","version":"1.1.1","keywords":["typescript","module"],"author":{"name":"Duco"},"license":"MIT","_id":"key-rotation-manager@1.1.1","maintainers":[{"name":"ducanh261102","email":"ducanhmc24@gmail.com"}],"dist":{"shasum":"aad99f4aaf8d63868199c14fa5841e3f1144b682","tarball":"https://registry.npmjs.org/key-rotation-manager/-/key-rotation-manager-1.1.1.tgz","fileCount":9,"integrity":"sha512-vk0/X846ehsgbLRPg57dzl1grNivytGX1h+PZC+yW+OmP5Lsr75wV46ExXaon2zdVAqsMGyRa276tdr63gyCbw==","signatures":[{"sig":"MEYCIQCL4saO65TbhJ87BVtueu35YOX6UuGCKZb8jbhyF/IcUQIhAPH4chKDWHV35nS8UnsfgALMz6jUdDYWvTepZqvW9Cd2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":226849},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"c163bebd7b2427dc0aa1f8789d8ebe97f1b0467c","scripts":{"lint":"eslint src --ext .ts","build":"tsup","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","lint:fix":"eslint src --ext .ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"ducanh261102","email":"ducanhmc24@gmail.com"},"_npmVersion":"10.8.2","description":"Simple, secure key rotation for Node.js","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","rimraf":"^5.0.7","prettier":"^3.3.3","typescript":"^5.4.5","@types/node":"^18.19.74","@typescript-eslint/parser":"^8.28.0","@typescript-eslint/eslint-plugin":"^8.28.0"},"_npmOperationalInternal":{"tmp":"tmp/key-rotation-manager_1.1.1_1768075708308_0.2889861417941533","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"key-rotation-manager","version":"1.1.2","keywords":["key-rotation","key-management","secret-management","api-key-rotation","credential-management","encryption","cryptography","typescript","nodejs"],"author":{"name":"Duco"},"license":"MIT","_id":"key-rotation-manager@1.1.2","maintainers":[{"name":"ducanh261102","email":"ducanhmc24@gmail.com"}],"homepage":"https://github.com/DucAnh2611/key-rotation-manager#readme","bugs":{"url":"https://github.com/DucAnh2611/key-rotation-manager/issues"},"dist":{"shasum":"db41440a4b3e7d7017e851aea0a493d711e5a6ed","tarball":"https://registry.npmjs.org/key-rotation-manager/-/key-rotation-manager-1.1.2.tgz","fileCount":9,"integrity":"sha512-yTqOj3NgpWFy1QcUCyrpfPNuwuWnHfdlcQjE3t+/AGrMjtP0E8JYu4UNFqUM00QjNuHWZinrc+VHoZagiWDiow==","signatures":[{"sig":"MEUCIQCjlIYzp01e9/00yrquMLBXToZTo7Ix0fhmKxY9TFhsnQIgbPmAP3j1rCMbwKOMfwW/R//o4S3T9Gc/IeLnhcGY6x0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":245712},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"92b6c4968ec6b0b8d8fea0cff46716a3e8c99c9f","scripts":{"lint":"eslint src --ext .ts","build":"tsup","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","lint:fix":"eslint src --ext .ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"ducanh261102","email":"ducanhmc24@gmail.com"},"repository":{"url":"git+https://github.com/DucAnh2611/key-rotation-manager.git","type":"git"},"_npmVersion":"10.8.2","description":"Production-ready cryptographic key management library for Node.js with automatic rotation, expiration, versioning, and flexible storage. Supports AES-256-CBC encryption, PBKDF2 key derivation, file-based storage, custom hooks, and TypeScript.","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","rimraf":"^5.0.7","prettier":"^3.3.3","typescript":"^5.4.5","@types/node":"^18.19.74","@typescript-eslint/parser":"^8.28.0","@typescript-eslint/eslint-plugin":"^8.28.0"},"_npmOperationalInternal":{"tmp":"tmp/key-rotation-manager_1.1.2_1768688459177_0.9846954844457385","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"key-rotation-manager","version":"1.1.3","keywords":["key-rotation","key-management","secret-management","api-key-rotation","credential-management","encryption","cryptography","typescript","nodejs"],"author":{"name":"Duco"},"license":"MIT","_id":"key-rotation-manager@1.1.3","maintainers":[{"name":"ducanh261102","email":"ducanhmc24@gmail.com"}],"homepage":"https://github.com/DucAnh2611/key-rotation-manager#readme","bugs":{"url":"https://github.com/DucAnh2611/key-rotation-manager/issues"},"dist":{"shasum":"41b634562bd1ac7ff8ef67fb5c20ee75edb73ead","tarball":"https://registry.npmjs.org/key-rotation-manager/-/key-rotation-manager-1.1.3.tgz","fileCount":9,"integrity":"sha512-wxQ5KIvKmJHWmeJsVC/wklSCf8iFzQ6OjCgtci/LR5UEX6IYBaz5D3wH+kzG47UjobOngV+VflLzaIox61tTXQ==","signatures":[{"sig":"MEUCIQD7oOH/cMUs9mAsz3HtDcSZGcWZyjjqkiycTaZHO/OSQQIgUhJNhmiNaZr5HNPAKUdpuP1/J9YRI3gwxAID7ecw8bY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":245904},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"2a4d767f4590ae7f5979a6e0258646b0a08ba577","scripts":{"lint":"eslint src --ext .ts","build":"tsup","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","lint:fix":"eslint src --ext .ts --fix","prepublishOnly":"npm run build"},"_npmUser":{"name":"ducanh261102","email":"ducanhmc24@gmail.com"},"repository":{"url":"git+https://github.com/DucAnh2611/key-rotation-manager.git","type":"git"},"_npmVersion":"10.8.2","description":"Production-ready cryptographic key management library for Node.js with automatic rotation, expiration, versioning, and flexible storage. Supports AES-256-CBC encryption, PBKDF2 key derivation, file-based storage, custom hooks, and TypeScript.","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","rimraf":"^5.0.7","prettier":"^3.3.3","typescript":"^5.4.5","@types/node":"^18.19.74","@typescript-eslint/parser":"^8.28.0","@typescript-eslint/eslint-plugin":"^8.28.0"},"_npmOperationalInternal":{"tmp":"tmp/key-rotation-manager_1.1.3_1768847209402_0.8372643739430856","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"key-rotation-manager","version":"1.1.4","description":"Production-ready cryptographic key management library for Node.js with automatic rotation, expiration, versioning, and flexible storage. Supports AES-256-CBC encryption, PBKDF2 key derivation, file-based storage, custom hooks, and TypeScript.","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsup","clean":"rimraf dist","lint":"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix","format":"prettier --write \"src/**/*.ts\"","prepublishOnly":"npm run build"},"keywords":["key-rotation","key-management","secret-management","api-key-rotation","credential-management","encryption","cryptography","typescript","nodejs"],"author":{"name":"Duco"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/DucAnh2611/key-rotation-manager.git"},"homepage":"https://github.com/DucAnh2611/key-rotation-manager#readme","bugs":{"url":"https://github.com/DucAnh2611/key-rotation-manager/issues"},"engines":{"node":">=18.0.0"},"devDependencies":{"@types/node":"^18.19.74","@typescript-eslint/eslint-plugin":"^8.28.0","@typescript-eslint/parser":"^8.28.0","prettier":"^3.3.3","rimraf":"^5.0.7","tsup":"^8.5.1","tsx":"^4.19.2","typescript":"^5.4.5"},"_id":"key-rotation-manager@1.1.4","gitHead":"b4d382391d883091128e48182ed0307adb93a65d","_nodeVersion":"20.19.6","_npmVersion":"10.8.2","dist":{"integrity":"sha512-r1M+5V75E4PDWLzEMMWdWASIKTDUb442sS4x9IhPz1SwhkKwhQmeHT1D2b9xXAe3Jclrn/j/cR5gYiu4h8pvFA==","shasum":"c281dbb924c6666136fe3b611ea3fa47c1cc9a28","tarball":"https://registry.npmjs.org/key-rotation-manager/-/key-rotation-manager-1.1.4.tgz","fileCount":9,"unpackedSize":246120,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCIszqiN8Ma8TFgL9Cvs6YjtvzrXYRvPVYzQoH7v99blAIgGYXnDEbTEv+0tP9clkA6nWzG3svjnUM6FtSg0595uDk="}]},"_npmUser":{"name":"ducanh261102","email":"ducanhmc24@gmail.com"},"directories":{},"maintainers":[{"name":"ducanh261102","email":"ducanhmc24@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/key-rotation-manager_1.1.4_1769021952266_0.5551819603324497"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-29T03:09:34.341Z","modified":"2026-01-21T18:59:12.545Z","1.0.0":"2025-05-10T18:58:03.717Z","1.1.0":"2025-05-10T19:15:02.608Z","1.2.0":"2025-05-24T13:11:16.039Z","1.4.0":"2025-06-15T02:54:19.499Z","1.4.1":"2025-06-15T03:25:15.272Z","1.0.1":"2025-12-29T03:09:34.474Z","1.0.2":"2025-12-29T03:25:27.919Z","1.0.3":"2025-12-29T07:27:32.614Z","1.0.4":"2025-12-29T08:23:23.347Z","1.0.5":"2025-12-29T09:19:38.995Z","1.0.6":"2025-12-29T09:33:22.895Z","1.0.7":"2026-01-04T19:34:14.670Z","1.0.8":"2026-01-07T02:25:15.143Z","1.0.9":"2026-01-07T03:37:08.453Z","1.0.10":"2026-01-10T19:08:12.411Z","1.0.11":"2026-01-10T19:32:54.507Z","1.1.1":"2026-01-10T20:08:28.471Z","1.1.2":"2026-01-17T22:20:59.378Z","1.1.3":"2026-01-19T18:26:49.556Z","1.1.4":"2026-01-21T18:59:12.417Z"},"bugs":{"url":"https://github.com/DucAnh2611/key-rotation-manager/issues"},"author":{"name":"Duco"},"license":"MIT","homepage":"https://github.com/DucAnh2611/key-rotation-manager#readme","keywords":["key-rotation","key-management","secret-management","api-key-rotation","credential-management","encryption","cryptography","typescript","nodejs"],"repository":{"type":"git","url":"git+https://github.com/DucAnh2611/key-rotation-manager.git"},"description":"Production-ready cryptographic key management library for Node.js with automatic rotation, expiration, versioning, and flexible storage. Supports AES-256-CBC encryption, PBKDF2 key derivation, file-based storage, custom hooks, and TypeScript.","maintainers":[{"name":"ducanh261102","email":"ducanhmc24@gmail.com"}],"readme":"# 🔐 Key Rotation Manager\n\n> **Flexible, file-based cryptographic key management for Node.js**\n\nA production-ready library for generating, storing, rotating, and retrieving cryptographic keys with support for expiration, versioning, merge strategies, custom storage logic, and lifecycle hooks.\n\n**Key Rotation Manager** is a comprehensive Node.js library for secure cryptographic key management. It provides automatic key rotation, expiration handling, versioning, and flexible storage options. Perfect for API key management, token rotation, secret management, and credential handling in production applications.\n\n[![npm version](https://img.shields.io/npm/v/key-rotation-manager)](https://www.npmjs.com/package/key-rotation-manager)\n[![Node.js](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen)](https://nodejs.org/)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\n---\n\n## 📋 Table of Contents\n\n- [Features](#-features)\n- [Installation](#-installation)\n- [Quick Start](#-quick-start)\n- [Configuration](#-configuration)\n- [Core Concepts](#-core-concepts)\n  - [Creating Keys](#creating-keys)\n  - [Retrieving Keys](#retrieving-keys)\n  - [Key Rotation](#key-rotation)\n- [Advanced Usage](#-advanced-usage)\n  - [Custom Storage Logic](#custom-storage-logic)\n  - [Custom Path & File Naming](#custom-path--file-naming)\n  - [Hooks & Lifecycle Events](#hooks--lifecycle-events)\n  - [Logging](#logging)\n  - [Instance Cloning](#instance-cloning)\n- [API Reference](#-api-reference)\n- [Use Cases](#-use-cases)\n- [Changelog](#-changelog)\n- [Contributing](#-contributing)\n- [License](#-license)\n\n---\n\n## ✨ Features\n\n- 🔐 **Secure Key Generation** - AES-256-CBC encryption with PBKDF2 key derivation\n- 🔄 **Automatic Rotation** - Built-in expiration and rotation support\n- 🗂 **Flexible Storage** - File-based storage with configurable structure\n- 🧩 **Merge Strategies** - Support for single-file or multi-file key storage\n- 🔧 **Extensible** - Custom save/get hooks and storage logic\n- 📡 **Event-Driven** - Lifecycle hooks for key events\n- 📁 **Git Integration** - Automatic `.gitignore` management\n- 🎯 **TypeScript** - Full TypeScript support with comprehensive types\n- ⚡ **Zero Dependencies** - Uses native Node.js crypto module\n- 🚀 **Production Ready** - Battle-tested for enterprise applications\n\n---\n\n## 📦 Installation\n\n```bash\nnpm install key-rotation-manager\n```\n\n**Requirements:** Node.js >= 18.0.0\n\n**Package:** [npmjs.com/package/key-rotation-manager](https://www.npmjs.com/package/key-rotation-manager)\n\n---\n\n## 🚀 Quick Start\n\n```typescript\nimport { create } from 'key-rotation-manager';\n\n// Initialize key manager\nconst keyManager = create();\n\n// Generate a new key\nconst { key, path } = await keyManager.newKey({\n  type: 'api',\n  duration: 30,\n  unit: 'days',\n  rotate: true,\n});\n\nconsole.log('Key generated:', key.key);\nconsole.log('Storage path:', path);\n\n// Retrieve the key\nconst result = await keyManager.getKey({\n  path,\n  version: key.version,\n});\n```\n\n---\n\n## ⚙️ Configuration\n\n### Default Options\n\n```typescript\n{\n  // Storage configuration\n  path: ['keys', '{{type}}'],        // Directory structure (supports variables)\n  file: ['v', '{{version}}'],        // File naming pattern\n  fileSplitor: '_',                  // File name separator\n  fileExt: 'json',                   // File extension\n  gitIgnore: true,          // Auto-update .gitignore (boolean | string | string[])\n\n  // Cryptographic settings\n  crypto: {\n    algorithm: 'aes-256-cbc',\n    kdf: 'pbkdf2',\n    hashAlgorithm: 'sha256',\n    keyLength: 32,\n    ivLength: 16,\n    saltLength: 32,\n    tagLength: 16,\n    iterations: 100000,\n    encoding: 'base64',\n  },\n\n  // Version generation\n  versionGenerator: () => Date.now().toString()\n}\n```\n\n### File Structure\n\nWith default settings, keys are stored as:\n\n```\nkeys/\n└── {{type}}/\n    └── v_{{version}}.json\n```\n\n**Example:** `keys/api/v_1704067200000.json`\n\n### Git Ignore Configuration\n\nThe `gitIgnore` option controls how the key storage folder is added to `.gitignore`.\n\n**Type:** `boolean | string | string[]`\n\n| Value | Behavior |\n|-------|----------|\n| `false` | Disable auto-update `.gitignore` |\n| `true` | Uses `path + file + fileExt` pattern |\n| `string \\| string[]` | Uses custom path pattern |\n\n**Default:** `true` → adds `path + file + fileExt` to `.gitignore`\n\n**Variable Replacement:** Any `{{variable}}` in the path will be replaced with `*` in `.gitignore`.\n\n**Wildcard Support:** You can use `'*'` directly in the path array for explicit wildcard matching.\n\n**Examples:**\n\n```typescript\n// Disable gitignore management\nconst km1 = create({ gitIgnore: false });\n\n// Use full path pattern (path + file + fileExt)\nconst km2 = create({ gitIgnore: true });\n// .gitignore: keys/{{type}}/v_{{version}}.json → keys/*/v_*.json\n\n// Custom folder with wildcard (default)\nconst km3 = create({ gitIgnore: ['keys', '*'] });\n// .gitignore: keys/*\n\n// Custom path with variables\nconst km4 = create({ gitIgnore: ['secrets', '{{env}}', 'keys'] });\n// .gitignore: secrets/*/keys\n\n// Custom path with explicit wildcard\nconst km5 = create({ gitIgnore: ['keys', '{{type}}', '*'] });\n// .gitignore: keys/*/*\n\n// Simple string\nconst km6 = create({ gitIgnore: 'keys' });\n// .gitignore: keys\n```\n\n---\n\n## 📚 Core Concepts\n\n### Creating Keys\n\n#### 1. Non-Expiring Key\n\n```typescript\nconst { key, path } = await keyManager.newKey({\n  type: 'service',\n});\n```\n\n#### 2. Expiring Key with Rotation\n\n```typescript\nconst { key, path } = await keyManager.newKey({\n  type: 'api',\n  duration: 30,\n  unit: 'days',      // 'seconds' | 'minutes' | 'hours' | 'days'\n  rotate: true,      // Enable automatic rotation\n});\n```\n\n#### 3. Merge Strategy (Single File)\n\nStore multiple key versions in a single file:\n\n```typescript\nconst { key, path } = await keyManager.newKey({\n  type: 'service',\n  merge: true,       // Store all versions in one file\n  duration: 7,\n  unit: 'days',\n  rotate: true,\n});\n```\n\n### Retrieving Keys\n\n#### Basic Retrieval\n\n```typescript\nconst result = await keyManager.getKey({\n  path: '/path/to/key/file',\n  version: 'v1',\n});\n\n// Result structure\n{\n  ready: TKeyGenerated | null,    // Valid, usable key\n  expired: TKeyGenerated | null   // Expired key (if rotation occurred)\n}\n```\n\n#### Key Rotation\n\nWhen a key is expired and rotatable, provide rotation options:\n\n```typescript\nconst result = await keyManager.getKey({\n  path: '/path/to/key/file',\n  version: 'v1',\n  onRotate: {\n    duration: 30,\n    unit: 'days',\n    rotate: true,\n    merge: true,      // Optional: merge strategy for new key\n  },\n});\n\nif (result.expired) {\n  console.log('Key was rotated');\n  console.log('Old version:', result.expired.version);\n  console.log('New version:', result.ready?.version);\n}\n```\n\n#### Handling Missing Keys\n\n```typescript\nconst result = await keyManager.getKey({\n  path: '/path/to/key/file',\n  version: 'v1',\n});\n\nif (!result.ready) {\n  // Key not found or invalid\n  console.log('Key unavailable');\n}\n```\n\n### Key Rotation\n\nKey rotation occurs automatically when:\n\n1. A key is expired (`to` date has passed)\n2. The key has `rotate: true`\n3. `onRotate` options are provided in `getKey()`\n\n**Rotation Flow:**\n\n```\nExpired Key → Check rotate flag → Generate new key → Return both keys\n```\n\n---\n\n## 🔧 Advanced Usage\n\n### Custom Storage Logic\n\n#### Custom Get Logic\n\nOverride how keys are retrieved:\n\n```typescript\nkeyManager.useGetKey(async (path, version) => {\n  // Your custom retrieval logic\n  const data = await fetchFromDatabase(path, version);\n  \n  if (!data) return null;\n  \n  return {\n    from: data.createdAt,\n    to: data.expiresAt,\n    key: data.rawKey,\n    hashed: data.hashedKey,\n    hashedBytes: 32,\n    type: data.type,\n    version: data.version,\n    rotate: data.rotate,\n  };\n});\n```\n\n#### Custom Save Logic\n\nOverride how keys are saved:\n\n```typescript\nkeyManager.useSaveKey(async (keyData, options) => {\n  // Your custom save logic\n  const savedPath = await saveToDatabase(keyData);\n  return savedPath; // This becomes key.path\n});\n```\n\n### Custom Path & File Naming\n\nUse variables in path and file names:\n\n```typescript\nconst keyManager = create({\n  path: ['keys', '{{type}}', '{{env}}'],\n  file: ['{{version}}', '{{region}}'],\n  fileExt: 'json',\n});\n\nconst { key, path } = await keyManager.newKey(\n  {\n    type: 'api',\n  },\n  {\n    env: 'production',\n    region: 'us-east-1',\n  }\n);\n\n// Result: keys/api/production/1704067200000_us-east-1.json\n```\n\n**Available Variables:**\n- `{{type}}` - Key type\n- `{{version}}` - Key version\n- Any custom variables passed to `newKey()`\n\n### Hooks & Lifecycle Events\n\n> **Available since v1.0.10**\n\nHooks allow you to execute custom logic when specific key lifecycle events occur.\n\n#### Available Hooks\n\n**Key Manager Hooks:**\n\n| Hook | Description | Parameters |\n|------|-------------|------------|\n| `onKeyNotFound` | Fires when key file is not found or version doesn't exist | `(path: string, version: string \\| number)` |\n| `onKeyInvalid` | Fires when key validation fails | `(key: TKeyGenerated, message: string, errorOn?: keyof TKeyGenerated)` |\n| `onKeyMissingRotateOption` | Fires when expired key needs rotation but options are missing | `(key: TKeyGenerated, options: TGetKeyOptions)` |\n| `onKeyRenewed` | Fires when a key is successfully rotated | `(getKey: TGetKey, options: TGetKeyOptions)` |\n| `onKeyExpired` | Fires when a key expires but is not renewable | `(path: string, key: TKeyGenerated)` |\n\n**Base Hooks:**\n\n| Hook | Description | Parameters |\n|------|-------------|------------|\n| `onHookNotFound` | Fires when a hook is called but not registered | `(name: string)` |\n| `onHookOverriding` | Fires when a hook is being overridden | `(name: string)` |\n\n#### Setting Hooks\n\n**Set Multiple Hooks:**\n\n```typescript\nkeyManager.useHooks({\n  onKeyNotFound: (path, version) => {\n    console.log(`Key not found: ${path}@${version}`);\n  },\n  onKeyInvalid: (key, message, errorOn) => {\n    console.error(`Invalid key: ${message}`, { errorOn, key });\n  },\n  onKeyRenewed: (getKey, options) => {\n    console.log('Key renewed:', {\n      expired: getKey.expired?.version,\n      ready: getKey.ready?.version,\n    });\n  },\n});\n```\n\n**Set Single Hook:**\n\n```typescript\nkeyManager.setHook('onKeyRenewed', (getKey, options) => {\n  console.log('Key was renewed successfully');\n});\n```\n\n**Async Hooks:**\n\n```typescript\nkeyManager.setHook('onKeyRenewed', async (getKey, options) => {\n  await sendNotification({\n    message: 'Key was rotated',\n    expiredVersion: getKey.expired?.version,\n    newVersion: getKey.ready?.version,\n  });\n});\n\nkeyManager.setHook('onKeyInvalid', async (key, message, errorOn) => {\n  await logToDatabase({\n    event: 'key_invalid',\n    message,\n    errorOn,\n    keyVersion: key.version,\n  });\n});\n```\n\n#### Complete Hook Example\n\n```typescript\nimport { create } from 'key-rotation-manager';\n\nconst keyManager = create({\n  versionGenerator: () => 'v1',\n});\n\n// Configure all hooks\nkeyManager.useHooks({\n  onKeyNotFound: (path, version) => {\n    console.log(`[Hook] Key not found: ${path}@${version}`);\n  },\n  onKeyInvalid: (key, message, errorOn) => {\n    console.error(`[Hook] Invalid key: ${message}`, {\n      version: key.version,\n      errorOn,\n    });\n  },\n  onKeyRenewed: async (getKey, options) => {\n    console.log('[Hook] Key renewed:', {\n      from: getKey.expired?.version,\n      to: getKey.ready?.version,\n    });\n    // Perform async operations (notifications, logging, etc.)\n  },\n  onKeyMissingRotateOption: (key, options) => {\n    console.warn(`[Hook] Missing rotate option for key: ${key.version}`);\n  },\n  onKeyExpired: (path, key) => {\n    console.log(`[Hook] Key expired: ${path}@${key.version}`);\n  },\n});\n\n// Use the key manager\nconst result = await keyManager.getKey({\n  path: '/keys/api',\n  version: 'v1',\n});\n```\n\n### Logging\n\n#### Custom Logger\n\n```typescript\n// Synchronous logger\nkeyManager.setLogger((...args) => {\n  console.log('[KeyManager]', ...args);\n});\n\n// Async logger\nkeyManager.setLogger(async (...args) => {\n  await logToService(...args);\n});\n```\n\n#### System Logging\n\n```typescript\nawait keyManager.sysLog('Key operation completed');\n```\n\n#### Custom Logging\n\n```typescript\nawait keyManager.customLog(async (...args) => {\n  await customLoggingService.log(...args);\n}, 'Log message');\n```\n\n### Instance Cloning\n\nCreate a new instance with shared configuration:\n\n```typescript\nconst original = create({ versionGenerator: () => 'v1' });\n\n// Clone with additional options\nconst cloned = original.clone({\n  path: ['custom', 'keys'],\n});\n\n// Cloned instance includes:\n// - Custom save/get hooks\n// - Store path configuration\n// - Logger settings\n// - Hooks settings\n```\n\n---\n\n## 📖 API Reference\n\n### `create(options?, singleton?)`\n\nCreates a new KeyManager instance.\n\n**Parameters:**\n- `options` (optional): Partial `TModuleOptions`\n- `singleton` (optional): `boolean` - If `true`, returns a shared singleton instance (default: `false`)\n\n**Returns:** `KM` instance\n\n**Example:**\n```typescript\nconst km = create({ versionGenerator: () => 'v1' });\n// or\nconst km = create({}, true); // Singleton instance\n```\n\n### `newKey(options, variables?)`\n\nGenerates a new cryptographic key.\n\n**Parameters:**\n- `options`: `TGenerateKeyOptions`\n  - `type`: `string` - Key type identifier\n  - `duration?`: `number` - Expiration duration\n  - `unit?`: `'seconds' | 'minutes' | 'hours' | 'days'` - Time unit\n  - `rotate?`: `boolean` - Enable rotation\n  - `merge?`: `boolean` - Merge strategy\n  - `keyLength?`: `number` - Key length in bytes\n- `variables?`: `TKeyVariables` - Custom variables for path/file naming\n\n**Returns:** `Promise<{ key: TKeyGenerated, path: string }>`\n\n### `getKey(options)`\n\nRetrieves a key by path and version.\n\n**Parameters:**\n- `options`: `TGetKeyOptions`\n  - `path`: `string` - Storage path\n  - `version`: `string` - Key version\n  - `disableHooks?`: `boolean` - Skip hook execution (default: `false`)\n  - `onRotate?`: Rotation options (if key is expired and rotatable)\n\n**Returns:** `Promise<TGetKey>`\n\n**Example:**\n```typescript\nconst result = await keyManager.getKey({\n  path: '/keys/api',\n  version: 'v1',\n  onRotate: {\n    duration: 30,\n    unit: 'days',\n    rotate: true,\n  },\n});\n\n// With disabled hooks for performance\nconst result = await keyManager.getKey({\n  path: '/keys/api',\n  version: 'v1',\n  disableHooks: true,\n});\n```\n\n### `verifyKey(hashedKey, path, version, disableGetKeyHooks?)`\n\nVerifies a hashed key against a stored key.\n\n**Parameters:**\n- `hashedKey`: `string` - The hashed key to verify\n- `path`: `string` - Storage path\n- `version`: `string | number` - Key version\n- `disableGetKeyHooks?`: `boolean` - Disable hooks in getKey call (default: `true`)\n\n**Returns:** `Promise<boolean>`\n\n**Example:**\n```typescript\nconst isValid = await keyManager.verifyKey(hashedKey, '/keys/api', 'v1');\nif (isValid) {\n  console.log('Key is valid!');\n} else {\n  console.log('Key is invalid!');\n}\n\n// Verification with hooks enabled\nconst isValid = await keyManager.verifyKey(hashedKey, '/keys/api', 'v1', false);\n```\n\n**Notes:**\n- Uses PBKDF2 verification if the key has a `secret` field\n- Falls back to direct hash comparison otherwise\n- Verifies against expired keys if no ready key is available\n\n### `useHooks(hooks)`\n\nSets multiple hooks at once.\n\n**Parameters:**\n- `hooks`: `Partial<TModuleHooks>`\n\n**Returns:** `this` (chainable)\n\n### `setHook(name, handler)`\n\nSets a single hook.\n\n**Parameters:**\n- `name`: `keyof TModuleHooks`\n- `handler`: `TModuleHooks[K]`\n\n**Returns:** `this` (chainable)\n\n---\n\n## 🎯 Use Cases\n\n- **API Key Management** - Secure storage and rotation of API keys for third-party services\n- **Token Rotation** - Automatic credential rotation for OAuth tokens, JWT secrets, and access tokens\n- **Secret Management** - File-based secret storage with expiration for application secrets\n- **Multi-Version Keys** - Support for multiple key versions simultaneously during rotation periods\n- **Custom Persistence** - Integrate with databases, cloud storage, or key management services\n- **Backend Services** - Production-ready key management for Node.js applications and microservices\n- **Encryption Keys** - Manage encryption keys for data protection with automatic rotation\n- **Session Keys** - Rotate session encryption keys periodically for enhanced security\n- **Database Credentials** - Rotate database passwords and connection strings securely\n- **Service-to-Service Authentication** - Manage keys for inter-service communication\n\n---\n\n## 📝 Changelog\n\nSee the full changelog for each version:\n\n- **[v1.1.2](https://github.com/DucAnh2611/key-rotation-manager/tree/master/changelogs/1.1.2.md)** - Key verification, hook control, enhanced documentation\n- **[v1.1.1](https://github.com/DucAnh2611/key-rotation-manager/tree/master/changelogs/1.1.1.md)** - Native crypto, zero dependencies, bug fixes\n- **[v1.0.10](https://github.com/DucAnh2611/key-rotation-manager/tree/master/changelogs/1.0.10.md)** - Hooks system, enhanced gitIgnore configuration\n\n---\n\n## 🐛 Issues & Bug Reports\n\nFound a bug or have a feature request?\n\n**[🐛 Report an Issue](https://github.com/DucAnh2611/key-rotation-manager/issues/new)**\n\nPlease include:\n- Clear description of the issue\n- Steps to reproduce\n- Expected vs actual behavior\n- Environment details (Node.js version, OS, package version)\n- Code samples if applicable\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n---\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](https://github.com/DucAnh2611/key-rotation-manager/blob/master/LICENSE) file for details.\n\n---\n\n## 🔍 Search Keywords\n\nThis package is optimized for searches related to:\n- key rotation\n- key management\n- cryptographic key storage\n- API key rotation\n- secret rotation\n- credential management\n- token rotation\n- key versioning\n- automatic key rotation\n- secure key storage\n- Node.js key management\n- TypeScript key management\n- production key rotation\n- enterprise key management\n\n---\n\n**Made with ❤️ for secure key management**\n","readmeFilename":"README.md"}