{"_id":"@atlex/cache","_rev":"16-8a3018a1168c47aa832977318fe86906","name":"@atlex/cache","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.1":{"name":"@atlex/cache","version":"0.1.1","keywords":["atlex","cache","typescript","redis"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/cache@0.1.1","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/atlex-monorepo/issues"},"dist":{"shasum":"260480030613b5839316a2a5c14e8a8adf6ae6c6","tarball":"https://registry.npmjs.org/@atlex/cache/-/cache-0.1.1.tgz","fileCount":95,"integrity":"sha512-MUIy5D1BWxOgw5uRWhzEr54XPPxofLtsSMZQwt41cDYnjF5pnci5OTQrqYDgaEywcNDYR7xUjYu4BXn8IkNatQ==","signatures":[{"sig":"MEUCIQDvA9a9jl7JavnvXAe27QpVRVM6WCWNiwRbDUyhx4EqlAIgDeQKi4UXDQiG+0cuQdtoKltlb1QRe6DcAxtYwDHZH8A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":447168},"main":"./dist/index.js","type":"module","_from":"file:atlex-cache-0.1.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing/CacheFake.d.ts","import":"./dist/testing/CacheFake.js","default":"./dist/testing/CacheFake.js","require":"./dist/testing/CacheFake.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsup --config tsup.config.ts","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/408c8fa240ad39b1571ad40ae4c0e9ff/atlex-cache-0.1.1.tgz","_integrity":"sha512-MUIy5D1BWxOgw5uRWhzEr54XPPxofLtsSMZQwt41cDYnjF5pnci5OTQrqYDgaEywcNDYR7xUjYu4BXn8IkNatQ==","repository":{"url":"git+https://github.com/atlex-framework/atlex-monorepo.git","type":"git","directory":"packages/cache"},"_npmVersion":"10.9.7","description":"Cache drivers and tagging for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ioredis":"^5.10.1","@atlex/core":"0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.2.4","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"@atlex/core":"0.1.1"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.1.1_1776194481644_0.8583702911864575","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@atlex/cache","version":"0.1.2","keywords":["atlex","cache","typescript","redis"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/cache@0.1.2","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/cache/issues"},"dist":{"shasum":"a57c17c0bb1b1cd0a5239add58f2f4b0ad6acc64","tarball":"https://registry.npmjs.org/@atlex/cache/-/cache-0.1.2.tgz","fileCount":95,"integrity":"sha512-FpcQe/7pc/4Mp0H7F4c46BQNWbUtpQjKP+U5lihdiO+wG7KHQeZo55qJP+o3Ib94FXP44poUF7PWCyXXI7rA4Q==","signatures":[{"sig":"MEYCIQCvlqVdXqS4RyiVkGFCZ8bZ23pbP0XT9f2umBtnL8VhogIhAKuyACYvwuCW/3iCqTpPox/apPt1OwQM/HFKal0r8E40","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":447254},"main":"./dist/index.js","type":"module","_from":"file:atlex-cache-0.1.2.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing/CacheFake.d.ts","import":"./dist/testing/CacheFake.js","default":"./dist/testing/CacheFake.js","require":"./dist/testing/CacheFake.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsup --config tsup.config.ts","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/41730e9e2441d4fe6b90ab818832a610/atlex-cache-0.1.2.tgz","_integrity":"sha512-FpcQe/7pc/4Mp0H7F4c46BQNWbUtpQjKP+U5lihdiO+wG7KHQeZo55qJP+o3Ib94FXP44poUF7PWCyXXI7rA4Q==","repository":{"url":"git+https://github.com/atlex-framework/cache.git","type":"git","directory":"packages/cache"},"_npmVersion":"10.9.7","description":"Cache drivers and tagging for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ioredis":"^5.10.1","@atlex/core":"0.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.2.4","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"@atlex/core":"0.1.2"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.1.2_1776235393799_0.7327548017457404","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@atlex/cache","version":"0.1.3","keywords":["atlex","cache","typescript","redis"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/cache@0.1.3","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/cache/issues"},"dist":{"shasum":"05439c89df9ddf3482b83bd7dda7712a8013a406","tarball":"https://registry.npmjs.org/@atlex/cache/-/cache-0.1.3.tgz","fileCount":95,"integrity":"sha512-dZLB+1h/zwN+o0JOYOn9qoFleTmIebcZEPkNkxveVHCPI/4qb2mtT6jBXuBJ6geO+gyAwGJZK6ZCi10o9rEmbQ==","signatures":[{"sig":"MEQCIHTTQ4pe2M2ZpXnDeaflIP+3DMlSNJE3uX1Cy5qsGksuAiAkofPaJQxpOsWjPhoC1idGao3xVbXdKkN3+k+iWwzO1w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":447371},"main":"./dist/index.js","type":"module","_from":"file:atlex-cache-0.1.3.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing/CacheFake.d.ts","import":"./dist/testing/CacheFake.js","default":"./dist/testing/CacheFake.js","require":"./dist/testing/CacheFake.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsup --config tsup.config.ts","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/76700a89c616fb10b3b31585728c670f/atlex-cache-0.1.3.tgz","_integrity":"sha512-dZLB+1h/zwN+o0JOYOn9qoFleTmIebcZEPkNkxveVHCPI/4qb2mtT6jBXuBJ6geO+gyAwGJZK6ZCi10o9rEmbQ==","repository":{"url":"git+https://github.com/atlex-framework/cache.git","type":"git","directory":"packages/cache"},"_npmVersion":"10.9.7","description":"Cache drivers and tagging for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ioredis":"^5.10.1","@atlex/core":"0.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.2.4","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"@atlex/core":"0.1.3"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.1.3_1776256085667_0.46010944210355476","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@atlex/cache","version":"0.1.4","keywords":["atlex","cache","caching","redis-cache","file-cache","in-memory-cache","memory-cache","cache-tags","cache-lock","distributed-cache","distributed-lock","redis","ioredis","laravel-cache","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/cache@0.1.4","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/cache/issues"},"dist":{"shasum":"7f36e92e4288b0f7c0f49e2957c4493ddb6ef376","tarball":"https://registry.npmjs.org/@atlex/cache/-/cache-0.1.4.tgz","fileCount":95,"integrity":"sha512-a/G4vnuOnqg7QH1PTvdeiJYht36bkXzTF0wyv4wDg2Tj4KfwfPQCz47Bh/YpxzwKmHQPUy0yR8P89bmPn7mgHA==","signatures":[{"sig":"MEQCIFypjiQX6R//6Z3WQ2yXkq/9zA4ZIGC7r3VX4sBTQArvAiAXEqUdgomtHEDPnD+Di+I8GDd8C1muTGIkgWbp8WfuZw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":447870},"main":"./dist/index.js","type":"module","_from":"file:atlex-cache-0.1.4.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing/CacheFake.d.ts","import":"./dist/testing/CacheFake.js","default":"./dist/testing/CacheFake.js","require":"./dist/testing/CacheFake.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsup --config tsup.config.ts","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/1c61762c86b0f359896b4c06099c4eef/atlex-cache-0.1.4.tgz","_integrity":"sha512-a/G4vnuOnqg7QH1PTvdeiJYht36bkXzTF0wyv4wDg2Tj4KfwfPQCz47Bh/YpxzwKmHQPUy0yR8P89bmPn7mgHA==","repository":{"url":"git+https://github.com/atlex-framework/cache.git","type":"git","directory":"packages/cache"},"_npmVersion":"10.9.7","description":"Cache drivers and tagging for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ioredis":"^5.10.1","@atlex/core":"0.1.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.2.4","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"@atlex/core":"0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.1.4_1776259452696_0.1321581079028482","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@atlex/cache","version":"0.1.5","keywords":["atlex","cache","caching","redis-cache","file-cache","in-memory-cache","memory-cache","cache-tags","cache-lock","distributed-cache","distributed-lock","redis","ioredis","laravel-cache","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/cache@0.1.5","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/cache/issues"},"dist":{"shasum":"481b43b0bdeb81560658bde2b02c474b619ed863","tarball":"https://registry.npmjs.org/@atlex/cache/-/cache-0.1.5.tgz","fileCount":95,"integrity":"sha512-6KZNc3aC7TsV6SwxSKI1BbVabFiUSSIYAp9EiIxwGFLvbDtHpC6UHfaf0SwkfLl+elu/X+8YXN7VlCwcxXqHDA==","signatures":[{"sig":"MEUCICX6wm8ApAV6KVpVnPjPc/4iWk4w3QcWcRDLgSPzEInOAiEA7EMkV2r3WDGE9k/EvYAjxS5Dwqpkvl2UKs7xuRr2lhg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":447974},"main":"./dist/index.js","type":"module","_from":"file:atlex-cache-0.1.5.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing/CacheFake.d.ts","import":"./dist/testing/CacheFake.js","default":"./dist/testing/CacheFake.js","require":"./dist/testing/CacheFake.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsup --config tsup.config.ts","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/bb271579c1e8c08a1d6fc61cb66009e0/atlex-cache-0.1.5.tgz","_integrity":"sha512-6KZNc3aC7TsV6SwxSKI1BbVabFiUSSIYAp9EiIxwGFLvbDtHpC6UHfaf0SwkfLl+elu/X+8YXN7VlCwcxXqHDA==","repository":{"url":"git+https://github.com/atlex-framework/cache.git","type":"git","directory":"packages/cache"},"_npmVersion":"10.9.7","description":"Cache drivers and tagging for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ioredis":"^5.10.1","@atlex/core":"0.1.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.2.4","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"@atlex/core":"0.1.5"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.1.5_1776260725335_0.7864687529595309","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@atlex/cache","version":"0.1.6","keywords":["atlex","cache","caching","redis-cache","file-cache","in-memory-cache","memory-cache","cache-tags","cache-lock","distributed-cache","distributed-lock","redis","ioredis","laravel-cache","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/cache@0.1.6","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/cache/issues"},"dist":{"shasum":"92d3ee5733b67d128959e9a69a03dd62dc5b90f6","tarball":"https://registry.npmjs.org/@atlex/cache/-/cache-0.1.6.tgz","fileCount":95,"integrity":"sha512-c6lUYLL/d/e+2iFclxGa6fNsmZCtJkh01quBA7eRNJG4qqINkFAMCr6A4zgGH0+JyhyVagi0R+i+qnlligddug==","signatures":[{"sig":"MEUCIQCNNPtZEDw+B+8ZOykt86Axjk0NsH8rPAkp/YV5DRbebQIgJ2FteWTbyyuu1c7Cuz1k+0gACPu64Xfm9GJs2Ihi78o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":448107},"main":"./dist/index.js","type":"module","_from":"file:atlex-cache-0.1.6.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing/CacheFake.d.ts","import":"./dist/testing/CacheFake.js","default":"./dist/testing/CacheFake.js","require":"./dist/testing/CacheFake.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsup --config tsup.config.ts","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/6c62cb8155f85ce0918724bc27de4a17/atlex-cache-0.1.6.tgz","_integrity":"sha512-c6lUYLL/d/e+2iFclxGa6fNsmZCtJkh01quBA7eRNJG4qqINkFAMCr6A4zgGH0+JyhyVagi0R+i+qnlligddug==","repository":{"url":"git+https://github.com/atlex-framework/cache.git","type":"git","directory":"packages/cache"},"_npmVersion":"10.9.7","description":"Cache drivers and tagging for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ioredis":"^5.10.1","@atlex/core":"0.1.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.2.4","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"@atlex/core":"0.1.6"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.1.6_1778694362821_0.4411730053464631","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@atlex/cache","version":"0.1.7","keywords":["atlex","cache","caching","redis-cache","file-cache","in-memory-cache","memory-cache","cache-tags","cache-lock","distributed-cache","distributed-lock","redis","ioredis","laravel-cache","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/cache@0.1.7","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/cache/issues"},"dist":{"shasum":"a2b9b39921bdea26837d09ddf52d5ae79a8bf722","tarball":"https://registry.npmjs.org/@atlex/cache/-/cache-0.1.7.tgz","fileCount":95,"integrity":"sha512-HdBmQ+s507603rL/mwq4MTbhi8PH7KjfDWgH3eYhMUHd3jJeHMH2M0ySrLikoLPzaxXTwK6cPvelUeTRDVXJlw==","signatures":[{"sig":"MEUCIAkfIljjGUZ6bSV5OCQrqlYkZgv1Lu4DnRo4D9zDvfhRAiEA/2k7eTmN6SwiCwNOfHl2Nx4owiKrSND2MEhejqQRIqk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":448513},"main":"./dist/index.js","type":"module","_from":"file:atlex-cache-0.1.7.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing/CacheFake.d.ts","import":"./dist/testing/CacheFake.js","default":"./dist/testing/CacheFake.js","require":"./dist/testing/CacheFake.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsup --config tsup.config.ts","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/70af7dbbb6d8941f4dba2ef72c3a2d44/atlex-cache-0.1.7.tgz","_integrity":"sha512-HdBmQ+s507603rL/mwq4MTbhi8PH7KjfDWgH3eYhMUHd3jJeHMH2M0ySrLikoLPzaxXTwK6cPvelUeTRDVXJlw==","repository":{"url":"git+https://github.com/atlex-framework/cache.git","type":"git","directory":"packages/cache"},"_npmVersion":"10.9.7","description":"Cache drivers and tagging for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ioredis":"^5.10.1","@atlex/core":"0.1.7"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.2.4","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"@atlex/core":"0.1.7"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.1.7_1778755088847_0.5720488949590534","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@atlex/cache","version":"0.1.8","keywords":["atlex","cache","caching","redis-cache","file-cache","in-memory-cache","memory-cache","cache-tags","cache-lock","distributed-cache","distributed-lock","redis","ioredis","laravel-cache","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/cache@0.1.8","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/cache/issues"},"dist":{"shasum":"f08ea2d957fb9ab8e9cb8673842747f77d25b48d","tarball":"https://registry.npmjs.org/@atlex/cache/-/cache-0.1.8.tgz","fileCount":95,"integrity":"sha512-9P8eP+f7gJLuQ31SvKG2xrEcyGZzNjt/elNVis6z09+qT2blswlms2XvN0Y7seA0SedPJmaBrHJQg7EgfB7uxQ==","signatures":[{"sig":"MEQCICIUfC/aCLBWOOQJdKYJZG001uHjUeBqxiJvck6AfnsYAiB/hQ4ai8OrhABmXbRGuT2zPa8VCzDLN3ft4YxsAsXUjA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":448620},"main":"./dist/index.js","type":"module","_from":"file:atlex-cache-0.1.8.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing/CacheFake.d.ts","import":"./dist/testing/CacheFake.js","default":"./dist/testing/CacheFake.js","require":"./dist/testing/CacheFake.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsup --config tsup.config.ts","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/89754c0aa3dac6991bcf00f4ff3b61ca/atlex-cache-0.1.8.tgz","_integrity":"sha512-9P8eP+f7gJLuQ31SvKG2xrEcyGZzNjt/elNVis6z09+qT2blswlms2XvN0Y7seA0SedPJmaBrHJQg7EgfB7uxQ==","repository":{"url":"git+https://github.com/atlex-framework/cache.git","type":"git","directory":"packages/cache"},"_npmVersion":"10.9.7","description":"Cache drivers and tagging for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ioredis":"^5.10.1","@atlex/core":"0.1.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.2.4","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"@atlex/core":"0.1.8"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.1.8_1778775527281_0.4667142455881037","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@atlex/cache","version":"0.1.9","keywords":["atlex","cache","caching","redis-cache","file-cache","in-memory-cache","memory-cache","cache-tags","cache-lock","distributed-cache","distributed-lock","redis","ioredis","laravel-cache","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/cache@0.1.9","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/cache/issues"},"dist":{"shasum":"feccfc338095e3906a16813cf2b0413aa69f4c52","tarball":"https://registry.npmjs.org/@atlex/cache/-/cache-0.1.9.tgz","fileCount":95,"integrity":"sha512-2o4lhIflvV8/+n2+WaC+oF6KI3fyI3clNlT3iqxYwhx01gm54WUsFHDr4r1U34Pw3/U5vw96fzBcKsdwDKPcjw==","signatures":[{"sig":"MEYCIQDVtlgk5z9V2rnbMsHdJ1KQ5tyHuL2tsCGX5qUxMFzKmgIhAPegmvQY9922qPXkY0e0eG0gcYptUlVRaYxN7lTHNP8Y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":448739},"main":"./dist/index.js","type":"module","_from":"file:atlex-cache-0.1.9.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing/CacheFake.d.ts","import":"./dist/testing/CacheFake.js","default":"./dist/testing/CacheFake.js","require":"./dist/testing/CacheFake.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsup --config tsup.config.ts","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/2b081ebe899f32107e04b22d1f34ddc6/atlex-cache-0.1.9.tgz","_integrity":"sha512-2o4lhIflvV8/+n2+WaC+oF6KI3fyI3clNlT3iqxYwhx01gm54WUsFHDr4r1U34Pw3/U5vw96fzBcKsdwDKPcjw==","repository":{"url":"git+https://github.com/atlex-framework/cache.git","type":"git","directory":"packages/cache"},"_npmVersion":"10.9.7","description":"Cache drivers and tagging for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ioredis":"^5.10.1","@atlex/core":"0.1.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.2.4","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"@atlex/core":"0.1.9"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.1.9_1778830254436_0.0422560921029127","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@atlex/cache","version":"0.1.10","keywords":["atlex","cache","caching","redis-cache","file-cache","in-memory-cache","memory-cache","cache-tags","cache-lock","distributed-cache","distributed-lock","redis","ioredis","laravel-cache","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/cache@0.1.10","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/cache/issues"},"dist":{"shasum":"0d07446eff2afb1dc35c168df1bfa22c44b65108","tarball":"https://registry.npmjs.org/@atlex/cache/-/cache-0.1.10.tgz","fileCount":95,"integrity":"sha512-EDHFW1RKccYZtpjHyaf3/3Nr+AYq7jPMvk6ies89MZwdQQzRCYEm3NZcyCz6FP5rxv1r6iw/F2C65tqKvsGKDA==","signatures":[{"sig":"MEUCIQCO+BwRpXxvtt64zWN7FQilqblg0IbogdBODCDtvxeWaAIgceYe60Ld84+opkqmZ75ScJT6IqcSmBpgFTVHDQq4DgM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":448850},"main":"./dist/index.js","type":"module","_from":"file:atlex-cache-0.1.10.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing/CacheFake.d.ts","import":"./dist/testing/CacheFake.js","default":"./dist/testing/CacheFake.js","require":"./dist/testing/CacheFake.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsup --config tsup.config.ts","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/ec5bdc3b10bd1ba4de169eddcf15474f/atlex-cache-0.1.10.tgz","_integrity":"sha512-EDHFW1RKccYZtpjHyaf3/3Nr+AYq7jPMvk6ies89MZwdQQzRCYEm3NZcyCz6FP5rxv1r6iw/F2C65tqKvsGKDA==","repository":{"url":"git+https://github.com/atlex-framework/cache.git","type":"git","directory":"packages/cache"},"_npmVersion":"10.9.7","description":"Cache drivers and tagging for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ioredis":"^5.10.1","@atlex/core":"0.1.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.2.4","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"@atlex/core":"0.1.10"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.1.10_1778834110875_0.7523393063142616","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@atlex/cache","version":"0.1.11","keywords":["atlex","cache","caching","redis-cache","file-cache","in-memory-cache","memory-cache","cache-tags","cache-lock","distributed-cache","distributed-lock","redis","ioredis","laravel-cache","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/cache@0.1.11","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/cache/issues"},"dist":{"shasum":"e24cafb04672c4525535da4cc9ebfe2a0bc5db5a","tarball":"https://registry.npmjs.org/@atlex/cache/-/cache-0.1.11.tgz","fileCount":95,"integrity":"sha512-TgFgM+rQmouPoiAOOQL34UsD+rmnmqr9MzWlha1DBDKWnYxcty8CDIg3u0ewkFP0aKF36/pqiqeyG2r0JF9tlQ==","signatures":[{"sig":"MEYCIQCOErmOWQtyyS1L7UthoCW8d+JDMCS+YwVTQ6fxhPtjxgIhAIeOpGKo/TIcylRlCOMYgk/VKXmHiv4duFt8QFawGOVK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":448956},"main":"./dist/index.js","type":"module","_from":"file:atlex-cache-0.1.11.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing/CacheFake.d.ts","import":"./dist/testing/CacheFake.js","default":"./dist/testing/CacheFake.js","require":"./dist/testing/CacheFake.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsup --config tsup.config.ts","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/d9807a5a85f74bf68e043cf9c711ff54/atlex-cache-0.1.11.tgz","_integrity":"sha512-TgFgM+rQmouPoiAOOQL34UsD+rmnmqr9MzWlha1DBDKWnYxcty8CDIg3u0ewkFP0aKF36/pqiqeyG2r0JF9tlQ==","repository":{"url":"git+https://github.com/atlex-framework/cache.git","type":"git","directory":"packages/cache"},"_npmVersion":"10.9.8","description":"Cache drivers and tagging for Atlex","directories":{},"_nodeVersion":"22.22.3","dependencies":{"ioredis":"^5.10.1","@atlex/core":"0.1.11"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.2.4","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"@atlex/core":"0.1.11"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.1.11_1780144963876_0.8426702084641526","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@atlex/cache","version":"0.2.0","keywords":["atlex","cache","caching","redis-cache","file-cache","in-memory-cache","memory-cache","cache-tags","cache-lock","distributed-cache","distributed-lock","redis","ioredis","laravel-cache","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/cache@0.2.0","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/cache/issues"},"dist":{"shasum":"38a1a38ef10a400bf2f1eca8b6249bd2d8279a84","tarball":"https://registry.npmjs.org/@atlex/cache/-/cache-0.2.0.tgz","fileCount":95,"integrity":"sha512-jPGuglbFJWr1oZMjRuDDdGMQPKndc+PgzXVWoD0Skg+cjXmr91Ff/ND37Ogw8OkHZx1Km5AZUMPTcJ9fCxNJUw==","signatures":[{"sig":"MEYCIQCa4i8Rxxu+12vQIfBuRQNU50E81G9P8ke9dhO2ipiIIwIhAOSNf3HOSAsHlqAlD3OViuB9kKy7d4khrTLp2vbG1OJ7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":450149},"main":"./dist/index.js","type":"module","_from":"file:atlex-cache-0.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing/CacheFake.d.ts","import":"./dist/testing/CacheFake.js","default":"./dist/testing/CacheFake.js","require":"./dist/testing/CacheFake.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsup --config tsup.config.ts","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/143c019fb898dc4004b0b326fad67bee/atlex-cache-0.2.0.tgz","_integrity":"sha512-jPGuglbFJWr1oZMjRuDDdGMQPKndc+PgzXVWoD0Skg+cjXmr91Ff/ND37Ogw8OkHZx1Km5AZUMPTcJ9fCxNJUw==","repository":{"url":"git+https://github.com/atlex-framework/cache.git","type":"git","directory":"packages/cache"},"_npmVersion":"10.9.8","description":"Cache drivers and tagging for Atlex","directories":{},"_nodeVersion":"22.22.3","dependencies":{"ioredis":"^5.10.1","@atlex/core":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.2.4","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"@atlex/core":">=0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.2.0_1780306550062_0.4029110950289403","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@atlex/cache","version":"0.2.1","keywords":["atlex","cache","caching","redis-cache","file-cache","in-memory-cache","memory-cache","cache-tags","cache-lock","distributed-cache","distributed-lock","redis","ioredis","laravel-cache","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/cache@0.2.1","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/cache/issues"},"dist":{"shasum":"a6a0e949f4bf578c1c455340120f21b6b471bd2d","tarball":"https://registry.npmjs.org/@atlex/cache/-/cache-0.2.1.tgz","fileCount":95,"integrity":"sha512-+MX0+Ly3k6FDEN3dwMG5xtJfCVAofJNUDR5L4uIiIfTq4SX//nnSbuHVJo66ITL3GjfcyPJBiz2TGNiZGgO2yA==","signatures":[{"sig":"MEUCIQDd+Qg8kvj7ysTgw+BDifPXpGtIrd18b6TPNoxOTIavHgIgH2XGI2UZhIprZIf27Ntw83ZAtnvgtZW9aI1AIQ32zuY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":450268},"main":"./dist/index.js","type":"module","_from":"file:atlex-cache-0.2.1.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./testing":{"types":"./dist/testing/CacheFake.d.ts","import":"./dist/testing/CacheFake.js","default":"./dist/testing/CacheFake.js","require":"./dist/testing/CacheFake.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsup --config tsup.config.ts","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/d4c7a43081bedcc02661d8fd4d2f0aa1/atlex-cache-0.2.1.tgz","_integrity":"sha512-+MX0+Ly3k6FDEN3dwMG5xtJfCVAofJNUDR5L4uIiIfTq4SX//nnSbuHVJo66ITL3GjfcyPJBiz2TGNiZGgO2yA==","repository":{"url":"git+https://github.com/atlex-framework/cache.git","type":"git","directory":"packages/cache"},"_npmVersion":"10.9.8","description":"Cache drivers and tagging for Atlex","directories":{},"_nodeVersion":"22.22.3","dependencies":{"ioredis":"^5.10.1","@atlex/core":"0.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^3.2.4","typescript":"^5.0.0","@types/node":"^20.0.0"},"peerDependencies":{"@atlex/core":">=0.2.1"},"_npmOperationalInternal":{"tmp":"tmp/cache_0.2.1_1780423670656_0.21028996756477225","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@atlex/cache","version":"0.2.2","description":"Cache drivers and tagging for Atlex","type":"module","license":"MIT","author":{"name":"Karen Hamazaspyan","url":"https://github.com/khamazaspyan"},"keywords":["atlex","cache","caching","redis-cache","file-cache","in-memory-cache","memory-cache","cache-tags","cache-lock","distributed-cache","distributed-lock","redis","ioredis","laravel-cache","laravel-alternative","nodejs","javascript","typescript"],"engines":{"node":">=20"},"repository":{"type":"git","url":"git+https://github.com/atlex-framework/cache.git","directory":"packages/cache"},"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/cache/issues"},"publishConfig":{"access":"public"},"main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/CacheFake.d.ts","import":"./dist/testing/CacheFake.js","require":"./dist/testing/CacheFake.js","default":"./dist/testing/CacheFake.js"}},"peerDependencies":{"@atlex/core":">=0.2.2"},"dependencies":{"ioredis":"^5.10.1","@atlex/core":"0.2.2"},"devDependencies":{"@types/node":"^20.0.0","tsup":"^8.5.0","typescript":"^5.0.0","vitest":"^3.2.4"},"scripts":{"build":"tsup --config tsup.config.ts","lint":"tsc --noEmit -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts"},"_id":"@atlex/cache@0.2.2","_integrity":"sha512-wsqXrwd3RGFpoNIS36ytiYSfSN2chOucrOkOQLRSaDILFiMT6nBEdV9n5pTiTurQeGIjXhwAEN4AsEZA+uRlBw==","_resolved":"/tmp/71686f242961e2010910c69310b68a22/atlex-cache-0.2.2.tgz","_from":"file:atlex-cache-0.2.2.tgz","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-wsqXrwd3RGFpoNIS36ytiYSfSN2chOucrOkOQLRSaDILFiMT6nBEdV9n5pTiTurQeGIjXhwAEN4AsEZA+uRlBw==","shasum":"07f92f4d21ffe642231ad5897354db93cb29f4f8","tarball":"https://registry.npmjs.org/@atlex/cache/-/cache-0.2.2.tgz","fileCount":95,"unpackedSize":450383,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFpst2H6EFPz0lEOW35xT7yPC+mC9368qgY42Lk8qSi8AiBzx/HJ2E1Q3z+o8YYIiHaYpR4fFTjCcTQuvMgDuxfF4Q=="}]},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"directories":{},"maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cache_0.2.2_1784391598203_0.4179798970834272"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-14T19:21:21.540Z","modified":"2026-07-18T16:19:58.503Z","0.1.0-beta":"2026-04-11T21:23:23.567Z","0.1.1":"2026-04-14T19:21:21.782Z","0.1.2":"2026-04-15T06:43:13.945Z","0.1.3":"2026-04-15T12:28:05.818Z","0.1.4":"2026-04-15T13:24:12.849Z","0.1.5":"2026-04-15T13:45:25.481Z","0.1.6":"2026-05-13T17:46:03.020Z","0.1.7":"2026-05-14T10:38:09.013Z","0.1.8":"2026-05-14T16:18:47.476Z","0.1.9":"2026-05-15T07:30:54.625Z","0.1.10":"2026-05-15T08:35:11.035Z","0.1.11":"2026-05-30T12:42:44.016Z","0.2.0":"2026-06-01T09:35:50.212Z","0.2.1":"2026-06-02T18:07:50.821Z","0.2.2":"2026-07-18T16:19:58.333Z"},"bugs":{"url":"https://github.com/atlex-framework/cache/issues"},"author":{"name":"Karen Hamazaspyan","url":"https://github.com/khamazaspyan"},"license":"MIT","homepage":"https://atlex.dev","keywords":["atlex","cache","caching","redis-cache","file-cache","in-memory-cache","memory-cache","cache-tags","cache-lock","distributed-cache","distributed-lock","redis","ioredis","laravel-cache","laravel-alternative","nodejs","javascript","typescript"],"repository":{"type":"git","url":"git+https://github.com/atlex-framework/cache.git","directory":"packages/cache"},"description":"Cache drivers and tagging for Atlex","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"readme":"# Cache\n\n> Multi-driver caching system with support for Redis, file-based, in-memory stores, and distributed locking. Automatically cache expensive computations and manage cache expiration.\n\n[![npm version](https://img.shields.io/npm/v/@atlex/cache?style=flat-square&color=7c3aed)](https://www.npmjs.com/package/@atlex/cache)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-3178C6?style=flat-square)](https://www.typescriptlang.org/)\n[![License](https://img.shields.io/npm/l/@atlex/cache?style=flat-square)](./LICENSE)\n\n[![Buy Me A Coffee](https://img.shields.io/badge/Buy%20Me%20A%20Coffee-Support-yellow?style=flat-square&logo=buy-me-a-coffee)](https://buymeacoffee.com/khamazaspyan)\n\n## Installation\n\nInstall the package via npm, yarn, or pnpm:\n\n```bash\nnpm install @atlex/cache\n```\n\n```bash\nyarn add @atlex/cache\n```\n\n```bash\npnpm add @atlex/cache\n```\n\n## Quick Start\n\n### Configuration\n\nFirst, configure your cache drivers in your application's config file:\n\n```typescript\n// config/cache.ts\nexport const cacheConfig = {\n  default: 'memory',\n  prefix: 'app_cache',\n  stores: {\n    memory: {\n      // In-memory cache store\n    },\n    file: {\n      directory: './storage/cache',\n    },\n    redis: {\n      host: process.env.REDIS_HOST || 'localhost',\n      port: parseInt(process.env.REDIS_PORT || '6379'),\n      password: process.env.REDIS_PASSWORD,\n    },\n    null: {\n      // Disables caching\n    },\n  },\n}\n```\n\n### Basic Usage\n\nGet, set, and retrieve cached values:\n\n```typescript\nimport { Cache } from '@atlex/cache'\n\n// Set a value\nawait Cache.set('user:1', userData, 3600) // expires in 1 hour\n\n// Get a value\nconst user = await Cache.get('user:1')\n\n// Get with default value\nconst user = await Cache.get('user:1', null)\n\n// Check if key exists\nconst exists = await Cache.has('user:1')\n\n// Forget a key\nawait Cache.forget('user:1')\n\n// Flush all cache\nawait Cache.flush()\n```\n\n### Remember Pattern\n\nAutomatically cache expensive computations:\n\n```typescript\nconst user = await Cache.remember('user:1', 3600, async () => {\n  // This callback only runs if the key doesn't exist\n  return await User.find(1)\n})\n\n// Remember forever (no expiration)\nconst allUsers = await Cache.rememberForever('users:all', async () => {\n  return await User.all()\n})\n```\n\n### Search Pattern\n\nCache a value and retrieve it, creating if it doesn't exist:\n\n```typescript\nconst user = await Cache.sear('user:1', async () => {\n  return await User.find(1)\n})\n```\n\n## Features\n\n- **Multiple Drivers**: Memory, File, Redis, and Null stores\n- **Fluent API**: Simple and intuitive interface for cache operations\n- **Auto-expiration**: Set TTL for automatic key expiration\n- **Tagging**: Organize and flush cache by tags\n- **Rate Limiting**: Built-in rate limiter for API protection\n- **Distributed Locking**: Prevent cache stampedes with locks\n- **Remember Pattern**: Automatically cache expensive computations\n- **Prefix Support**: Namespace all cache keys automatically\n- **TypeScript**: Full type safety throughout the API\n\n## Core Concepts\n\n### CacheManager\n\nThe `CacheManager` is the main entry point for cache operations. It manages driver registration and provides the API for cache access.\n\n```typescript\nimport { CacheManager } from '@atlex/cache'\n\n// Get the default store\nconst store = CacheManager.store()\n\n// Switch to a specific driver\nconst redisStore = CacheManager.store('redis')\n\n// Get a specific driver without creating repository\nconst driver = CacheManager.driver('file')\n\n// Extend with custom drivers\nCacheManager.extend('custom', new CustomCacheDriver())\n```\n\n### Repository\n\nThe `Repository` class provides the main caching API. It handles getting, setting, remembering, and managing cache data.\n\n```typescript\nconst cache = CacheManager.store()\n\n// Set a value with TTL in seconds\nawait cache.set('config:app', appConfig, 3600)\n\n// Get a value\nconst config = await cache.get('config:app')\n\n// Put is an alias for set\nawait cache.put('config:app', appConfig, 3600)\n\n// Add only if key doesn't exist\nconst added = await cache.add('config:app', appConfig, 3600)\n\n// Remember: get or compute and cache\nconst data = await cache.remember('expensive:operation', 3600, async () => {\n  return await expensiveOperation()\n})\n\n// Remember forever\nconst data = await cache.rememberForever('static:data', async () => {\n  return await fetchStaticData()\n})\n\n// Sear: like remember but returns cached value after caching\nconst item = await cache.sear('item:1', async () => {\n  return await Item.find(1)\n})\n\n// Remove a key\nawait cache.forget('config:app')\n\n// Flush all keys in store\nawait cache.flush()\n\n// Increment numeric value\nawait cache.set('counter', 0)\nawait cache.increment('counter', 5) // Now 5\n\n// Decrement numeric value\nawait cache.decrement('counter', 2) // Now 3\n\n// Pull: get and delete\nconst value = await cache.pull('temp:data')\n```\n\n### Tagged Cache\n\nOrganize cache by tags for grouped operations:\n\n```typescript\nconst cache = CacheManager.store()\n\n// Set with tags\nawait cache.tags(['user', 'user:1']).set('user:1:profile', userData, 3600)\n\n// Get tagged value\nconst user = await cache.tags(['user', 'user:1']).get('user:1:profile')\n\n// Flush all keys with specific tag\nawait cache.tags(['user']).flush()\n\n// Multiple tags for filtering\nawait cache.tags(['user', 'active']).set('user:1', userData, 3600)\n\n// Flush by multiple tags\nawait cache.tags(['user', 'active']).flush()\n```\n\n### Distributed Locking\n\nPrevent cache stampedes with distributed locks:\n\n```typescript\nconst cache = CacheManager.store()\n\n// Get a lock\nconst lock = cache.lock('expensive:operation')\n\n// Acquire the lock\nconst acquired = await lock.acquire()\n\nif (acquired) {\n  try {\n    // Do expensive operation\n    await expensiveOperation()\n  } finally {\n    // Release the lock\n    await lock.release()\n  }\n}\n\n// Force release a lock (use cautiously)\nawait lock.forceRelease()\n\n// Block until lock is available\nawait lock.block(10, async () => {\n  // This code runs once the lock is acquired\n  // Lock is automatically released after this function completes\n  await expensiveOperation()\n})\n\n// Block with timeout\nconst completed = await lock.block(\n  5,\n  async () => {\n    await heavyProcessing()\n  },\n  { timeout: 10 },\n) // Wait max 10 seconds for lock\n```\n\n### Rate Limiter\n\nLimit request rates to prevent abuse:\n\n```typescript\nconst cache = CacheManager.store()\nconst limiter = cache.rateLimiter('login-attempts', {\n  maxAttempts: 5,\n  decayMinutes: 15,\n})\n\n// Record a hit\nawait limiter.hit()\n\n// Get remaining attempts\nconst remaining = await limiter.remaining()\n\n// Check if too many attempts\nif (remaining === 0) {\n  throw new Error('Too many login attempts')\n}\n\n// Reset the limiter\nawait limiter.reset()\n\n// Get total hits\nconst hits = await limiter.hits()\n\n// Retry after delay\nconst backoffSeconds = await limiter.retry()\n```\n\n## Available Drivers\n\n### Memory Store\n\nIn-memory cache storage (data lost on restart):\n\n```typescript\n{\n  memory: {\n    // No configuration needed\n  }\n}\n```\n\nBest for development and testing. Not suitable for production with multiple processes.\n\n### File Store\n\nFile-based cache storage:\n\n```typescript\n{\n  file: {\n    directory: './storage/cache',\n  }\n}\n```\n\nSuitable for single-server deployments. Slower than memory but persists across restarts.\n\n### Redis Store\n\nDistributed Redis cache:\n\n```typescript\n{\n  redis: {\n    host: 'localhost',\n    port: 6379,\n    password: 'secret',\n    db: 0,\n  }\n}\n```\n\nBest for distributed systems and high-performance caching. Supports tagging and locking across processes.\n\n### Null Store\n\nDisables caching (useful for testing):\n\n```typescript\n{\n  null: {\n    // No configuration\n  }\n}\n```\n\nAll cache operations execute immediately without storing values.\n\n## API Reference\n\n### CacheManager\n\n```typescript\n// Get the default store\nstatic store(name?: string): Repository\n\n// Get a specific driver\nstatic driver(name: string): CacheDriver\n\n// Register a custom driver\nstatic extend(name: string, driver: CacheDriver): void\n```\n\n### Repository\n\n```typescript\n// Get a value from cache\nasync get(key: string, defaultValue?: any): Promise<any>\n\n// Set a value in cache with TTL (seconds)\nasync set(key: string, value: any, seconds?: number): Promise<void>\n\n// Put is an alias for set\nasync put(key: string, value: any, seconds?: number): Promise<void>\n\n// Add only if key doesn't exist\nasync add(key: string, value: any, seconds?: number): Promise<boolean>\n\n// Get or cache result of callback\nasync remember(key: string, seconds: number, callback: () => Promise<any>): Promise<any>\n\n// Get or cache result forever\nasync rememberForever(key: string, callback: () => Promise<any>): Promise<any>\n\n// Get and cache, return cached value immediately\nasync sear(key: string, callback: () => Promise<any>): Promise<any>\n\n// Get and delete\nasync pull(key: string, defaultValue?: any): Promise<any>\n\n// Delete a key\nasync forget(key: string): Promise<boolean>\n\n// Delete all keys\nasync flush(): Promise<void>\n\n// Increment numeric value\nasync increment(key: string, value: number = 1): Promise<number>\n\n// Decrement numeric value\nasync decrement(key: string, value: number = 1): Promise<number>\n\n// Get tagged cache instance\ntags(...tags: string[]): TaggedCache\n\n// Get a lock\nlock(name: string, seconds?: number, owner?: string): Lock\n\n// Get a rate limiter\nrateLimiter(name: string, options: RateLimiterOptions): RateLimiter\n```\n\n### TaggedCache\n\nExtends Repository with tag-scoped operations:\n\n```typescript\n// All Repository methods available, but scoped to tags\n\n// Get tagged value\nasync get(key: string): Promise<any>\n\n// Set with tags\nasync set(key: string, value: any, seconds?: number): Promise<void>\n\n// Flush all keys with these tags\nasync flush(): Promise<void>\n```\n\n### Lock\n\n```typescript\n// Acquire the lock\nasync acquire(): Promise<boolean>\n\n// Release the lock\nasync release(): Promise<void>\n\n// Force release (dangerous)\nasync forceRelease(): Promise<void>\n\n// Block until available and execute callback\nasync block(seconds: number, callback: () => Promise<any>, options?: BlockOptions): Promise<any>\n```\n\n### RateLimiter\n\n```typescript\n// Record a hit\nasync hit(): Promise<number>\n\n// Get number of hits\nasync hits(): Promise<number>\n\n// Get remaining attempts\nasync remaining(): Promise<number>\n\n// Reset the limiter\nasync reset(): Promise<void>\n\n// Get retry backoff\nasync retry(): Promise<number>\n\n// Check if limited\nasync tooManyAttempts(): Promise<boolean>\n\n// Clear the limiter\nasync clear(): Promise<void>\n```\n\n## Examples\n\n### Caching Database Queries\n\n```typescript\nexport class UserRepository {\n  async find(id: number): Promise<User> {\n    return await Cache.remember(`user:${id}`, 3600, async () => {\n      return await database.table('users').where('id', id).first()\n    })\n  }\n\n  async update(id: number, data: any): Promise<void> {\n    // Invalidate cache when updated\n    await Cache.forget(`user:${id}`)\n    await database.table('users').where('id', id).update(data)\n  }\n}\n```\n\n### Tag-Based Cache Invalidation\n\n```typescript\nexport class PostRepository {\n  async getByAuthor(authorId: number): Promise<Post[]> {\n    return await Cache.tags(['post', `author:${authorId}`]).remember(\n      `author:${authorId}:posts`,\n      3600,\n      async () => {\n        return await Post.where('author_id', authorId).get()\n      },\n    )\n  }\n\n  async publishPost(post: Post): Promise<void> {\n    // Save post...\n\n    // Invalidate all posts by this author\n    await Cache.tags([`author:${post.authorId}`]).flush()\n  }\n}\n```\n\n### API Rate Limiting\n\n```typescript\nexport async function handleLogin(request: Request): Promise<Response> {\n  const email = request.body.email\n  const limiter = Cache.store().rateLimiter(`login:${email}`, {\n    maxAttempts: 5,\n    decayMinutes: 15,\n  })\n\n  if (await limiter.tooManyAttempts()) {\n    const retrySeconds = await limiter.retry()\n    return response.status(429).json({\n      error: `Too many attempts. Try again in ${retrySeconds} seconds.`,\n    })\n  }\n\n  await limiter.hit()\n\n  try {\n    const user = await User.findByEmail(email)\n    if (!user || !(await user.verifyPassword(request.body.password))) {\n      return response.status(401).json({ error: 'Invalid credentials' })\n    }\n\n    await limiter.reset()\n    return response.json({ token: user.generateToken() })\n  } catch (error) {\n    return response.status(500).json({ error: 'Login failed' })\n  }\n}\n```\n\n### Preventing Cache Stampedes\n\n```typescript\nexport async function expensiveQuery(): Promise<any> {\n  const cacheKey = 'expensive:computation'\n  const lock = Cache.store().lock(cacheKey, 30)\n\n  // Check cache first\n  const cached = await Cache.get(cacheKey)\n  if (cached) return cached\n\n  // Block until lock available\n  try {\n    await lock.block(10, async () => {\n      // Double-check cache\n      const rechecked = await Cache.get(cacheKey)\n      if (rechecked) return rechecked\n\n      // Do expensive operation\n      const result = await performExpensiveQuery()\n      await Cache.set(cacheKey, result, 3600)\n    })\n  } catch (error) {\n    // Lock timeout - return error or use fallback\n    console.error('Cache lock timeout')\n  }\n\n  return await Cache.get(cacheKey)\n}\n```\n\n## Testing\n\n### Using the Null Driver\n\nDisable caching in tests:\n\n```typescript\n// config/cache.test.ts\nexport const cacheConfig = {\n  default: 'null',\n  stores: {\n    null: {},\n  },\n}\n```\n\n### Mocking Cache\n\n```typescript\nimport { Cache } from '@atlex/cache'\nimport { vi } from 'vitest'\n\ntest('caches user lookup', async () => {\n  const getSpy = vi.spyOn(Cache, 'remember')\n\n  await userRepository.find(1)\n\n  expect(getSpy).toHaveBeenCalledWith('user:1', expect.any(Number), expect.any(Function))\n})\n```\n\n## Configuration Reference\n\n```typescript\ninterface CacheConfig {\n  // Default cache store\n  default: string\n\n  // Key prefix for all cached values\n  prefix: string\n\n  // Store configurations\n  stores: {\n    memory?: {}\n    file?: { directory: string }\n    redis?: { host: string; port: number; password?: string }\n    null?: {}\n  }\n}\n```\n\n## Best Practices\n\n1. **Use Appropriate TTLs**: Set reasonable expiration times based on data freshness requirements.\n\n2. **Implement Cache Invalidation**: Invalidate cache when underlying data changes.\n\n3. **Prevent Stampedes**: Use locks to prevent multiple processes from computing the same expensive operation.\n\n4. **Monitor Cache Hit Rates**: Track cache performance in production.\n\n5. **Use Tags for Related Data**: Group related cache entries with tags for bulk operations.\n\n6. **Handle Cache Misses**: Always provide fallback values or async computation.\n\n7. **Test with Null Driver**: Use the null driver in tests to ensure code works without cache.\n\n8. **Separate Cache Layers**: Use different stores for different data types (sessions in Redis, config in memory).\n\n9. **Set Prefix**: Use cache prefix to avoid collisions in shared environments.\n\n10. **Rate Limit Strategically**: Use rate limiters on expensive operations and user-facing APIs.\n\n## Documentation\n\nFor more information and advanced usage, visit the [Atlex documentation](https://atlex.dev/guide/cache).\n\n## License\n\n## MIT © [Karen Hamazaspyan](https://github.com/khamazaspyan)\n\nPart of [Atlex](https://atlex.dev) — A modern framework for Node.js.\n","readmeFilename":"README.md"}