{"_id":"@atlex/storage","_rev":"16-9d8ad062eb953b0ff0348d917b8af185","name":"@atlex/storage","dist-tags":{"latest":"0.2.2"},"versions":{"0.1.1":{"name":"@atlex/storage","version":"0.1.1","keywords":["atlex","storage","typescript","s3"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/storage@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":"4edcf45751434510395cc7eaa256df8a761f7739","tarball":"https://registry.npmjs.org/@atlex/storage/-/storage-0.1.1.tgz","fileCount":96,"integrity":"sha512-nnFint+Z+CER0nqFOT9s+UFUL0VcWFsoClx1mQhtdFiQ3U/84xAhcEolF7wSA9o1fH8Wsk1tyCYil3A/qwvVIA==","signatures":[{"sig":"MEYCIQDE2BQaK5QnWfRcQsZ3kdmXtgpA6mKVTDrGIQHFqH5RVwIhAKY6tMj34TlC4c8YTXk7hVjAn944HjWUbh6zAM/YF6sc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193134},"main":"./dist/index.js","type":"module","_from":"file:atlex-storage-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","require":"./dist/index.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/b1db5fd3d6aa9b8176ee3c835d3f4d59/atlex-storage-0.1.1.tgz","_integrity":"sha512-nnFint+Z+CER0nqFOT9s+UFUL0VcWFsoClx1mQhtdFiQ3U/84xAhcEolF7wSA9o1fH8Wsk1tyCYil3A/qwvVIA==","repository":{"url":"git+https://github.com/atlex-framework/atlex-monorepo.git","type":"git","directory":"packages/storage"},"_npmVersion":"10.9.7","description":"Filesystem abstraction (local, S3, GCS) for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","busboy":"^1.6.0","mime-types":"^2.1.35","@atlex/core":"0.1.1","@atlex/config":"0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","express":"^5.1.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/busboy":"^1.5.4","@types/express":"^5.0.3","@types/mime-types":"^2.1.4","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"peerDependencies":{"@atlex/core":"0.1.1","@atlex/config":"0.1.1","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"_npmOperationalInternal":{"tmp":"tmp/storage_0.1.1_1776194500216_0.8731611188305768","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@atlex/storage","version":"0.1.2","keywords":["atlex","storage","typescript","s3"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/storage@0.1.2","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/storage/issues"},"dist":{"shasum":"0a740276e322c6c777c9019118ffe88e0c3f39eb","tarball":"https://registry.npmjs.org/@atlex/storage/-/storage-0.1.2.tgz","fileCount":96,"integrity":"sha512-s//IXZYYJIO0HZYfsNX+f8pcQ2BkUJUlb1d0pCjqZVO4oHKVgDrwvj0NkGjL9KYE0U02hpWSFl2BvtV4H41V6Q==","signatures":[{"sig":"MEUCIFSiiL6DtRlInhrodo1PbhfZpAF/uoEON6Pwf79D3mw0AiEAl+laE/rNidxu4jqpnZQPFOgi7pwTW6q10Tjrm0PMs0s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193248},"main":"./dist/index.js","type":"module","_from":"file:atlex-storage-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","require":"./dist/index.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/cf015ac5d660bc45cf1fc6a34e3224a9/atlex-storage-0.1.2.tgz","_integrity":"sha512-s//IXZYYJIO0HZYfsNX+f8pcQ2BkUJUlb1d0pCjqZVO4oHKVgDrwvj0NkGjL9KYE0U02hpWSFl2BvtV4H41V6Q==","repository":{"url":"git+https://github.com/atlex-framework/storage.git","type":"git","directory":"packages/storage"},"_npmVersion":"10.9.7","description":"Filesystem abstraction (local, S3, GCS) for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","busboy":"^1.6.0","mime-types":"^2.1.35","@atlex/core":"0.1.2","@atlex/config":"0.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","express":"^5.1.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/busboy":"^1.5.4","@types/express":"^5.0.3","@types/mime-types":"^2.1.4","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"peerDependencies":{"@atlex/core":"0.1.2","@atlex/config":"0.1.2","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"_npmOperationalInternal":{"tmp":"tmp/storage_0.1.2_1776235412102_0.6165812283066501","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@atlex/storage","version":"0.1.3","keywords":["atlex","storage","typescript","s3"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/storage@0.1.3","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/storage/issues"},"dist":{"shasum":"1f58e1aa2c51d3f68c780624d821955f754f3ec7","tarball":"https://registry.npmjs.org/@atlex/storage/-/storage-0.1.3.tgz","fileCount":96,"integrity":"sha512-UmhJO8aks9H0vNQYOGacB52PeunpphO2VUpkRekzLnCg8FvDGzC8nWeMuSSH+FlsdGV/o7pNTVAmYUiPfDmTyg==","signatures":[{"sig":"MEYCIQDds8tWQw6XZ9xxxGk+XMjKUJNqkCR2bE96tXOVSNHQKwIhAPh/T/6KbW+9Jeh3luNtshNg4uYW3ydOkfHfxwcxrdCk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193389},"main":"./dist/index.js","type":"module","_from":"file:atlex-storage-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","require":"./dist/index.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/2347d1a581f6297f5fdea8b0f0329590/atlex-storage-0.1.3.tgz","_integrity":"sha512-UmhJO8aks9H0vNQYOGacB52PeunpphO2VUpkRekzLnCg8FvDGzC8nWeMuSSH+FlsdGV/o7pNTVAmYUiPfDmTyg==","repository":{"url":"git+https://github.com/atlex-framework/storage.git","type":"git","directory":"packages/storage"},"_npmVersion":"10.9.7","description":"Filesystem abstraction (local, S3, GCS) for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","busboy":"^1.6.0","mime-types":"^2.1.35","@atlex/core":"0.1.3","@atlex/config":"0.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","express":"^5.1.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/busboy":"^1.5.4","@types/express":"^5.0.3","@types/mime-types":"^2.1.4","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"peerDependencies":{"@atlex/core":"0.1.3","@atlex/config":"0.1.3","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"_npmOperationalInternal":{"tmp":"tmp/storage_0.1.3_1776256104111_0.26718232474255665","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@atlex/storage","version":"0.1.4","keywords":["atlex","storage","filesystem","file-storage","s3","aws-s3","amazon-s3","google-cloud-storage","gcs","local-storage","cloud-storage","file-upload","flysystem-alternative","laravel-storage","laravel-filesystem","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/storage@0.1.4","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/storage/issues"},"dist":{"shasum":"355395f9e1b919e2b5dd5967b8fbcd1189a29735","tarball":"https://registry.npmjs.org/@atlex/storage/-/storage-0.1.4.tgz","fileCount":96,"integrity":"sha512-p5ncATLp5WXdDAILAFEgrxu01AB7yvO0nZYqyNu8DrzoXQoTnQZ13ZPVJbOhfpJpxQsnuSvlONZOs9txdKA4Bw==","signatures":[{"sig":"MEYCIQC19j36uv4bKwukMaqSw4lcs9I7MgxtH4i0149aKlDNLgIhAOQKdUtBTMhJmBPPQM+vPg0MWrZMOkmPlUBMawIKVqLj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":193943},"main":"./dist/index.js","type":"module","_from":"file:atlex-storage-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","require":"./dist/index.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/d64aadf0744de572c1e15458cf3ea2af/atlex-storage-0.1.4.tgz","_integrity":"sha512-p5ncATLp5WXdDAILAFEgrxu01AB7yvO0nZYqyNu8DrzoXQoTnQZ13ZPVJbOhfpJpxQsnuSvlONZOs9txdKA4Bw==","repository":{"url":"git+https://github.com/atlex-framework/storage.git","type":"git","directory":"packages/storage"},"_npmVersion":"10.9.7","description":"Filesystem abstraction (local, S3, GCS) for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","busboy":"^1.6.0","mime-types":"^2.1.35","@atlex/core":"0.1.4","@atlex/config":"0.1.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","express":"^5.1.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/busboy":"^1.5.4","@types/express":"^5.0.3","@types/mime-types":"^2.1.4","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"peerDependencies":{"@atlex/core":"0.1.4","@atlex/config":"0.1.4","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"_npmOperationalInternal":{"tmp":"tmp/storage_0.1.4_1776259470763_0.7061436544461457","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@atlex/storage","version":"0.1.5","keywords":["atlex","storage","filesystem","file-storage","s3","aws-s3","amazon-s3","google-cloud-storage","gcs","local-storage","cloud-storage","file-upload","flysystem-alternative","laravel-storage","laravel-filesystem","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/storage@0.1.5","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/storage/issues"},"dist":{"shasum":"1f1ab561441b54bfe800d5d9f0514d5630427cea","tarball":"https://registry.npmjs.org/@atlex/storage/-/storage-0.1.5.tgz","fileCount":96,"integrity":"sha512-IaemCjj256IIr9NSy0qf739Z+hSA366+H4JncQ/eCJxwV+ykGmimP6STbKJLNLt2VmFwm29EdNwQUjyFx6K0AQ==","signatures":[{"sig":"MEUCIFbfX9HDE83vWFARn4P+LqNGJRriGmapQ/2o95QPbft8AiEA0+PugmeVHnqYFIdUlQ0U/S8CJkATb0bZJXD1EZim0WU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194071},"main":"./dist/index.js","type":"module","_from":"file:atlex-storage-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","require":"./dist/index.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/56389b40b3ddd7a023cccfe1bd77a149/atlex-storage-0.1.5.tgz","_integrity":"sha512-IaemCjj256IIr9NSy0qf739Z+hSA366+H4JncQ/eCJxwV+ykGmimP6STbKJLNLt2VmFwm29EdNwQUjyFx6K0AQ==","repository":{"url":"git+https://github.com/atlex-framework/storage.git","type":"git","directory":"packages/storage"},"_npmVersion":"10.9.7","description":"Filesystem abstraction (local, S3, GCS) for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","busboy":"^1.6.0","mime-types":"^2.1.35","@atlex/core":"0.1.5","@atlex/config":"0.1.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","express":"^5.1.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/busboy":"^1.5.4","@types/express":"^5.0.3","@types/mime-types":"^2.1.4","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"peerDependencies":{"@atlex/core":"0.1.5","@atlex/config":"0.1.5","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"_npmOperationalInternal":{"tmp":"tmp/storage_0.1.5_1776260745231_0.3546286766510691","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@atlex/storage","version":"0.1.6","keywords":["atlex","storage","filesystem","file-storage","s3","aws-s3","amazon-s3","google-cloud-storage","gcs","local-storage","cloud-storage","file-upload","flysystem-alternative","laravel-storage","laravel-filesystem","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/storage@0.1.6","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/storage/issues"},"dist":{"shasum":"db96e5625d9dd4a90889841ead6f1d56f986127c","tarball":"https://registry.npmjs.org/@atlex/storage/-/storage-0.1.6.tgz","fileCount":96,"integrity":"sha512-8BnegvU4qU9rsxldRaAFqS5Z6npZtDT26XFHkk+xztQsfBCqDf3q6LUbfms7qZjrWydyrwvJ6PhPYOFSoNpz+w==","signatures":[{"sig":"MEQCIH9f2+HSO7ITK/RQqT52WliKCx6l1Y2j2Cx1Bdqy7ph1AiBHqEYjnGVGIdzbX+o2qAjuz05v9gHBl1iqbI9GbCFSog==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194228},"main":"./dist/index.js","type":"module","_from":"file:atlex-storage-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","require":"./dist/index.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/ae589707af095cdde8351d245d8a206a/atlex-storage-0.1.6.tgz","_integrity":"sha512-8BnegvU4qU9rsxldRaAFqS5Z6npZtDT26XFHkk+xztQsfBCqDf3q6LUbfms7qZjrWydyrwvJ6PhPYOFSoNpz+w==","repository":{"url":"git+https://github.com/atlex-framework/storage.git","type":"git","directory":"packages/storage"},"_npmVersion":"10.9.7","description":"Filesystem abstraction (local, S3, GCS) for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","busboy":"^1.6.0","mime-types":"^2.1.35","@atlex/core":"0.1.6","@atlex/config":"0.1.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","express":"^5.1.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/busboy":"^1.5.4","@types/express":"^5.0.3","@types/mime-types":"^2.1.4","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"peerDependencies":{"@atlex/core":"0.1.6","@atlex/config":"0.1.6","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"_npmOperationalInternal":{"tmp":"tmp/storage_0.1.6_1778694379670_0.8480985107958232","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@atlex/storage","version":"0.1.7","keywords":["atlex","storage","filesystem","file-storage","s3","aws-s3","amazon-s3","google-cloud-storage","gcs","local-storage","cloud-storage","file-upload","flysystem-alternative","laravel-storage","laravel-filesystem","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/storage@0.1.7","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/storage/issues"},"dist":{"shasum":"6e9247d46ec12afa1bf587a82165088bcd3a7a90","tarball":"https://registry.npmjs.org/@atlex/storage/-/storage-0.1.7.tgz","fileCount":100,"integrity":"sha512-zi6S8fO2lfaMRM/eScv9aLpwgDJK+NPyvfUSRkmkXwkiKR/W9WqYLJbGoYFGdJJ9pEP8A2DcU5Ht4n/UdWT/uQ==","signatures":[{"sig":"MEQCIEc746uTsuOLRP2ZX0PALf5TWj6CXXp4rp9dgI8UIad6AiBzI86LURsZtottAyASG1Po3OlSv4KvXc93VFOUGmD41A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":203545},"main":"./dist/index.js","type":"module","_from":"file:atlex-storage-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","require":"./dist/index.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/02aea85cd9e3cc03d385742dad4549dd/atlex-storage-0.1.7.tgz","_integrity":"sha512-zi6S8fO2lfaMRM/eScv9aLpwgDJK+NPyvfUSRkmkXwkiKR/W9WqYLJbGoYFGdJJ9pEP8A2DcU5Ht4n/UdWT/uQ==","repository":{"url":"git+https://github.com/atlex-framework/storage.git","type":"git","directory":"packages/storage"},"_npmVersion":"10.9.7","description":"Filesystem abstraction (local, S3, GCS) for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","busboy":"^1.6.0","mime-types":"^2.1.35","@atlex/core":"0.1.7","@atlex/config":"0.1.7"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","express":"^5.1.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/busboy":"^1.5.4","@types/express":"^5.0.3","@types/mime-types":"^2.1.4","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"peerDependencies":{"@atlex/core":"0.1.7","@atlex/config":"0.1.7","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"_npmOperationalInternal":{"tmp":"tmp/storage_0.1.7_1778755106155_0.38793050598096923","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@atlex/storage","version":"0.1.8","keywords":["atlex","storage","filesystem","file-storage","s3","aws-s3","amazon-s3","google-cloud-storage","gcs","local-storage","cloud-storage","file-upload","flysystem-alternative","laravel-storage","laravel-filesystem","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/storage@0.1.8","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/storage/issues"},"dist":{"shasum":"ba72730f816d6ffa7275303b057fba276d4c4bdc","tarball":"https://registry.npmjs.org/@atlex/storage/-/storage-0.1.8.tgz","fileCount":100,"integrity":"sha512-f6DxlS+cLKzxma6c7x5Ivm8fD/2DOzYJpUeXBZ+OAuDN11bManV1+zTTUHdCuFdOj4pPfGSAnwaYfCX2FpqaeQ==","signatures":[{"sig":"MEUCIBJ90vf1t7XrHlCQoUsmVDkyObiQSKJYDQBbRlCxFIyVAiEA9pQTvVEXQww+z+AOixt7U7KzmoxfcX5C+SWOeKMc0w8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":203676},"main":"./dist/index.js","type":"module","_from":"file:atlex-storage-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","require":"./dist/index.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/ff79580e96f2f037f14aa347a9ccd2e3/atlex-storage-0.1.8.tgz","_integrity":"sha512-f6DxlS+cLKzxma6c7x5Ivm8fD/2DOzYJpUeXBZ+OAuDN11bManV1+zTTUHdCuFdOj4pPfGSAnwaYfCX2FpqaeQ==","repository":{"url":"git+https://github.com/atlex-framework/storage.git","type":"git","directory":"packages/storage"},"_npmVersion":"10.9.7","description":"Filesystem abstraction (local, S3, GCS) for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","busboy":"^1.6.0","mime-types":"^2.1.35","@atlex/core":"0.1.8","@atlex/config":"0.1.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","express":"^5.1.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/busboy":"^1.5.4","@types/express":"^5.0.3","@types/mime-types":"^2.1.4","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"peerDependencies":{"@atlex/core":"0.1.8","@atlex/config":"0.1.8","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"_npmOperationalInternal":{"tmp":"tmp/storage_0.1.8_1778775547166_0.7815673518974615","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@atlex/storage","version":"0.1.9","keywords":["atlex","storage","filesystem","file-storage","s3","aws-s3","amazon-s3","google-cloud-storage","gcs","local-storage","cloud-storage","file-upload","flysystem-alternative","laravel-storage","laravel-filesystem","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/storage@0.1.9","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/storage/issues"},"dist":{"shasum":"df2955fa8478584e72ad591973dbcfc2eb84fac9","tarball":"https://registry.npmjs.org/@atlex/storage/-/storage-0.1.9.tgz","fileCount":100,"integrity":"sha512-xkVAOov7YgDgj+XQJLH7H5+bckRP24qLZXZuL3SRgndr+CVk6KXsmUFLrv+PMh0z7AtD8Pqb+hfvcAAFUBLVZA==","signatures":[{"sig":"MEQCIAqUkGoCq5uCOgp00PWUjBg9thtFQyTB8VD0LMsB+6a/AiB3KTu2Np/AfVw4ndWIgFSiWk+0lFQZSTW5uh2bW9i53g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":203819},"main":"./dist/index.js","type":"module","_from":"file:atlex-storage-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","require":"./dist/index.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/64d2a5659b809e20da18c8c84ea00da2/atlex-storage-0.1.9.tgz","_integrity":"sha512-xkVAOov7YgDgj+XQJLH7H5+bckRP24qLZXZuL3SRgndr+CVk6KXsmUFLrv+PMh0z7AtD8Pqb+hfvcAAFUBLVZA==","repository":{"url":"git+https://github.com/atlex-framework/storage.git","type":"git","directory":"packages/storage"},"_npmVersion":"10.9.7","description":"Filesystem abstraction (local, S3, GCS) for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","busboy":"^1.6.0","mime-types":"^2.1.35","@atlex/core":"0.1.9","@atlex/config":"0.1.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","express":"^5.1.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/busboy":"^1.5.4","@types/express":"^5.0.3","@types/mime-types":"^2.1.4","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"peerDependencies":{"@atlex/core":"0.1.9","@atlex/config":"0.1.9","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"_npmOperationalInternal":{"tmp":"tmp/storage_0.1.9_1778830272055_0.18120836561186948","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"@atlex/storage","version":"0.1.10","keywords":["atlex","storage","filesystem","file-storage","s3","aws-s3","amazon-s3","google-cloud-storage","gcs","local-storage","cloud-storage","file-upload","flysystem-alternative","laravel-storage","laravel-filesystem","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/storage@0.1.10","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/storage/issues"},"dist":{"shasum":"303dd83363f6a4d568a7e576d572d82c362460d6","tarball":"https://registry.npmjs.org/@atlex/storage/-/storage-0.1.10.tgz","fileCount":100,"integrity":"sha512-q4ZqhCvNEZo0/8dLsbxTCOs3KPG9fNzY04tyq1q/+OxhD0lD5YGI0JrfoeDLMygDKh+GOJAKhL6G48Y6LaUZww==","signatures":[{"sig":"MEUCIQDVhzN4E3rPuyMG0qA3RbpjNnpyU7icPmgK0RymmqEsEAIgfEg0DqJ6jnfX0PPCr3Y+rI6DPUk9q3ZI+qAUABqPDRs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":203957},"main":"./dist/index.js","type":"module","_from":"file:atlex-storage-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","require":"./dist/index.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/140a42150cbe050895d14d8c7eff6346/atlex-storage-0.1.10.tgz","_integrity":"sha512-q4ZqhCvNEZo0/8dLsbxTCOs3KPG9fNzY04tyq1q/+OxhD0lD5YGI0JrfoeDLMygDKh+GOJAKhL6G48Y6LaUZww==","repository":{"url":"git+https://github.com/atlex-framework/storage.git","type":"git","directory":"packages/storage"},"_npmVersion":"10.9.7","description":"Filesystem abstraction (local, S3, GCS) for Atlex","directories":{},"_nodeVersion":"22.22.2","dependencies":{"uuid":"^11.1.0","busboy":"^1.6.0","mime-types":"^2.1.35","@atlex/core":"0.1.10","@atlex/config":"0.1.10"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","express":"^5.1.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/busboy":"^1.5.4","@types/express":"^5.0.3","@types/mime-types":"^2.1.4","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"peerDependencies":{"@atlex/core":"0.1.10","@atlex/config":"0.1.10","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"_npmOperationalInternal":{"tmp":"tmp/storage_0.1.10_1778834123183_0.5054992784631116","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"@atlex/storage","version":"0.1.11","keywords":["atlex","storage","filesystem","file-storage","s3","aws-s3","amazon-s3","google-cloud-storage","gcs","local-storage","cloud-storage","file-upload","flysystem-alternative","laravel-storage","laravel-filesystem","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/storage@0.1.11","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/storage/issues"},"dist":{"shasum":"35687fdaf12d18a66404d3aa0943c6926ca9fa64","tarball":"https://registry.npmjs.org/@atlex/storage/-/storage-0.1.11.tgz","fileCount":100,"integrity":"sha512-3BLJ9CDOrtoB0Ag5marmKh4KIgHcjw+gZxlx8oAw8TMly4VmrKzJV8n5jYx/GLmmFu/8wY7ffBYU0Gd9EfN1cQ==","signatures":[{"sig":"MEUCIQCnYq2SwEbTyYnijnw5yS5NGBRmsWJpsIv73vwv6jOD2wIgHu0XG0l8fCQ1DGonK34F5j7WZRJvvVN6Z0yyXfplG08=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":204088},"main":"./dist/index.js","type":"module","_from":"file:atlex-storage-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","require":"./dist/index.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/aeb459d73f7379beb11c8716352805ee/atlex-storage-0.1.11.tgz","_integrity":"sha512-3BLJ9CDOrtoB0Ag5marmKh4KIgHcjw+gZxlx8oAw8TMly4VmrKzJV8n5jYx/GLmmFu/8wY7ffBYU0Gd9EfN1cQ==","repository":{"url":"git+https://github.com/atlex-framework/storage.git","type":"git","directory":"packages/storage"},"_npmVersion":"10.9.8","description":"Filesystem abstraction (local, S3, GCS) for Atlex","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^11.1.0","busboy":"^1.6.0","mime-types":"^2.1.35","@atlex/core":"0.1.11","@atlex/config":"0.1.11"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","express":"^5.1.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/busboy":"^1.5.4","@types/express":"^5.0.3","@types/mime-types":"^2.1.4","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"peerDependencies":{"@atlex/core":"0.1.11","@atlex/config":"0.1.11","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"_npmOperationalInternal":{"tmp":"tmp/storage_0.1.11_1780144981291_0.11784212049090392","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@atlex/storage","version":"0.2.0","keywords":["atlex","storage","filesystem","file-storage","s3","aws-s3","amazon-s3","google-cloud-storage","gcs","local-storage","cloud-storage","file-upload","flysystem-alternative","laravel-storage","laravel-filesystem","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/storage@0.2.0","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/storage/issues"},"dist":{"shasum":"07aca4c95828b8df48f4f494fef2cb5f742846ba","tarball":"https://registry.npmjs.org/@atlex/storage/-/storage-0.2.0.tgz","fileCount":100,"integrity":"sha512-48zEWkG3DglVDOmzBWDvLiWZKxwGGNh+yo26SV/A39lNQS1XKNRTW5e8nfRXAijRkCZe/reORneXY3Y684yV6w==","signatures":[{"sig":"MEYCIQCEeFJUQBGKnJlnA7/M1le4kIvxrRUzkAiEpdJDWif6+QIhALRV27dr8+T+MvH7dKJGAhg8aEyT0ekqv6APIdZ180Rv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":205305},"main":"./dist/index.js","type":"module","_from":"file:atlex-storage-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","require":"./dist/index.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/70bec7d97e8921cde7d1d7f1a2fb8777/atlex-storage-0.2.0.tgz","_integrity":"sha512-48zEWkG3DglVDOmzBWDvLiWZKxwGGNh+yo26SV/A39lNQS1XKNRTW5e8nfRXAijRkCZe/reORneXY3Y684yV6w==","repository":{"url":"git+https://github.com/atlex-framework/storage.git","type":"git","directory":"packages/storage"},"_npmVersion":"10.9.8","description":"Filesystem abstraction (local, S3, GCS) for Atlex","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^11.1.0","busboy":"^1.6.0","mime-types":"^2.1.35","@atlex/core":"0.2.0","@atlex/config":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","express":"^5.1.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/busboy":"^1.5.4","@types/express":"^5.0.3","@types/mime-types":"^2.1.4","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"peerDependencies":{"@atlex/core":">=0.2.0","@atlex/config":">=0.2.0","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"_npmOperationalInternal":{"tmp":"tmp/storage_0.2.0_1780306570298_0.9510868586107424","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@atlex/storage","version":"0.2.1","keywords":["atlex","storage","filesystem","file-storage","s3","aws-s3","amazon-s3","google-cloud-storage","gcs","local-storage","cloud-storage","file-upload","flysystem-alternative","laravel-storage","laravel-filesystem","laravel-alternative","nodejs","javascript","typescript"],"author":{"url":"https://github.com/khamazaspyan","name":"Karen Hamazaspyan"},"license":"MIT","_id":"@atlex/storage@0.2.1","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/storage/issues"},"dist":{"shasum":"5846219a29cfc6224cd650d3d32b607b55dc421a","tarball":"https://registry.npmjs.org/@atlex/storage/-/storage-0.2.1.tgz","fileCount":100,"integrity":"sha512-MUHoa8RF0YtefgxnZdmgZLF3KAwBQHbRWwQb58u2JFTF6GbwfmBoNXhqL8bOxej9ifirAtNc9cIXqP8892B4/A==","signatures":[{"sig":"MEQCIAyBaxnViIcFnZVcH2hbprZvWlsmP7o4xYdglF9Xm61SAiBtEl1dMj21wWcUJOf7a2Etz9xpHgr6yegEXbnVbRJkFQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":205448},"main":"./dist/index.js","type":"module","_from":"file:atlex-storage-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","require":"./dist/index.js"}},"scripts":{"lint":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json"},"_npmUser":{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"},"_resolved":"/tmp/3e88948d4b20412d60d1879768333705/atlex-storage-0.2.1.tgz","_integrity":"sha512-MUHoa8RF0YtefgxnZdmgZLF3KAwBQHbRWwQb58u2JFTF6GbwfmBoNXhqL8bOxej9ifirAtNc9cIXqP8892B4/A==","repository":{"url":"git+https://github.com/atlex-framework/storage.git","type":"git","directory":"packages/storage"},"_npmVersion":"10.9.8","description":"Filesystem abstraction (local, S3, GCS) for Atlex","directories":{},"_nodeVersion":"22.22.3","dependencies":{"uuid":"^11.1.0","busboy":"^1.6.0","mime-types":"^2.1.35","@atlex/core":"0.2.1","@atlex/config":"0.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","express":"^5.1.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/busboy":"^1.5.4","@types/express":"^5.0.3","@types/mime-types":"^2.1.4","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"peerDependencies":{"@atlex/core":">=0.2.1","@atlex/config":">=0.2.1","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"_npmOperationalInternal":{"tmp":"tmp/storage_0.2.1_1780423689879_0.9763320701031779","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@atlex/storage","version":"0.2.2","description":"Filesystem abstraction (local, S3, GCS) for Atlex","type":"module","license":"MIT","author":{"name":"Karen Hamazaspyan","url":"https://github.com/khamazaspyan"},"keywords":["atlex","storage","filesystem","file-storage","s3","aws-s3","amazon-s3","google-cloud-storage","gcs","local-storage","cloud-storage","file-upload","flysystem-alternative","laravel-storage","laravel-filesystem","laravel-alternative","nodejs","javascript","typescript"],"engines":{"node":">=20"},"repository":{"type":"git","url":"git+https://github.com/atlex-framework/storage.git","directory":"packages/storage"},"homepage":"https://atlex.dev","bugs":{"url":"https://github.com/atlex-framework/storage/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.js"}},"peerDependencies":{"@atlex/config":">=0.2.2","@atlex/core":">=0.2.2","@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0"},"dependencies":{"busboy":"^1.6.0","mime-types":"^2.1.35","uuid":"^11.1.0","@atlex/config":"0.2.2","@atlex/core":"0.2.2"},"devDependencies":{"@aws-sdk/client-s3":"^3.750.0","@aws-sdk/s3-request-presigner":"^3.750.0","@types/busboy":"^1.5.4","@types/mime-types":"^2.1.4","@types/node":"^20.0.0","@types/express":"^5.0.3","express":"^5.1.0","typescript":"^5.0.0","vitest":"^3.2.4"},"scripts":{"build":"tsc -p tsconfig.json","lint":"tsc --noEmit -p tsconfig.json","typecheck":"tsc --noEmit -p tsconfig.json","test":"vitest run -c vitest.config.ts"},"_id":"@atlex/storage@0.2.2","_integrity":"sha512-wY6/qReJXSRwkbLIb9C1/D0sIeG0LIffIZYPIUPbIHc0eliwi2Ezv3CmJ1QjdT2UgguMG4UtX+Y6dgSoNzbaMg==","_resolved":"/tmp/658d64c22ef92620a940479e3caa2b2b/atlex-storage-0.2.2.tgz","_from":"file:atlex-storage-0.2.2.tgz","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-wY6/qReJXSRwkbLIb9C1/D0sIeG0LIffIZYPIUPbIHc0eliwi2Ezv3CmJ1QjdT2UgguMG4UtX+Y6dgSoNzbaMg==","shasum":"401018028f7feb9db27fe8240468f56c45f391c6","tarball":"https://registry.npmjs.org/@atlex/storage/-/storage-0.2.2.tgz","fileCount":100,"unpackedSize":205587,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDhaHPc5BgSJwjhRBu74chV93Tf7SW/K+vWoYCkyUP1iQIhANPfJD7+9s4tX7UNxAwSTFJ2IjRvv6A4kf7NfR6qtR3h"}]},"_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/storage_0.2.2_1784391616553_0.030094546842834857"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-14T19:21:40.036Z","modified":"2026-07-18T16:20:16.843Z","0.1.0-beta":"2026-04-11T21:23:35.592Z","0.1.1":"2026-04-14T19:21:40.375Z","0.1.2":"2026-04-15T06:43:32.231Z","0.1.3":"2026-04-15T12:28:24.257Z","0.1.4":"2026-04-15T13:24:30.951Z","0.1.5":"2026-04-15T13:45:45.411Z","0.1.6":"2026-05-13T17:46:19.820Z","0.1.7":"2026-05-14T10:38:26.304Z","0.1.8":"2026-05-14T16:19:07.359Z","0.1.9":"2026-05-15T07:31:12.191Z","0.1.10":"2026-05-15T08:35:23.322Z","0.1.11":"2026-05-30T12:43:01.425Z","0.2.0":"2026-06-01T09:36:10.461Z","0.2.1":"2026-06-02T18:08:10.011Z","0.2.2":"2026-07-18T16:20:16.696Z"},"bugs":{"url":"https://github.com/atlex-framework/storage/issues"},"author":{"name":"Karen Hamazaspyan","url":"https://github.com/khamazaspyan"},"license":"MIT","homepage":"https://atlex.dev","keywords":["atlex","storage","filesystem","file-storage","s3","aws-s3","amazon-s3","google-cloud-storage","gcs","local-storage","cloud-storage","file-upload","flysystem-alternative","laravel-storage","laravel-filesystem","laravel-alternative","nodejs","javascript","typescript"],"repository":{"type":"git","url":"git+https://github.com/atlex-framework/storage.git","directory":"packages/storage"},"description":"Filesystem abstraction (local, S3, GCS) for Atlex","maintainers":[{"name":"khamazaspyan","email":"khamazaspyan@gmail.com"}],"readme":"# @atlex/storage\n\n> Filesystem abstraction for local, S3, and Cloudflare R2 storage.\n\n[![npm](https://img.shields.io/npm/v/@atlex/storage.svg?style=flat-square&color=7c3aed)](https://www.npmjs.com/package/@atlex/storage)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-7c3aed.svg?style=flat-square)](https://www.typescriptlang.org/)\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\n```bash\nnpm install @atlex/storage\n# or\nyarn add @atlex/storage\n```\n\n## Quick Start\n\n```typescript\nimport { StorageManager } from '@atlex/storage'\nimport { LocalDriver } from '@atlex/storage'\n\nconst manager = new StorageManager()\nmanager.disk('local', new LocalDriver({ root: './storage' }))\n\nconst disk = manager.disk('local')\n\n// Write file\nawait disk.put('users/avatar.jpg', fileContent)\n\n// Read file\nconst content = await disk.get('users/avatar.jpg')\n\n// Check existence\nconst exists = await disk.exists('users/avatar.jpg')\n\n// Delete file\nawait disk.delete('users/avatar.jpg')\n\n// Get file URL\nconst url = disk.url('users/avatar.jpg')\n```\n\n## Features\n\n- **Multi-Driver Support**: Local, S3, Cloudflare R2\n- **Unified API**: Same interface across all storage drivers\n- **File Operations**: Read, write, delete, copy, move files\n- **Directory Management**: Create and delete directories\n- **Metadata**: Get file size, MIME type, visibility, last modified time\n- **Presigned URLs**: Generate temporary signed URLs via `getPresignedUrl()` (S3 and R2)\n- **File Uploads**: Seamless handling of multipart file uploads\n- **Visibility Control**: Set public/private file visibility\n- **Content Streaming**: Stream file content for large files\n\n## Basic File Operations\n\n### Reading Files\n\n```typescript\nimport { StorageManager } from '@atlex/storage'\nimport { LocalDriver } from '@atlex/storage'\n\nconst manager = new StorageManager()\nconst disk = manager.disk('local', new LocalDriver({ root: './storage' }))\n\n// Read entire file as string\nconst content = await disk.get('path/to/file.txt')\n\n// Read file as bytes/buffer\nconst buffer = await disk.getBytes('path/to/file.jpg')\n\n// Check if file exists\nconst exists = await disk.exists('path/to/file.txt')\nconst missing = await disk.missing('path/to/file.txt')\n```\n\n### Writing Files\n\n```typescript\nconst disk = manager.disk('local')\n\n// Write string content\nawait disk.put('path/to/file.txt', 'Hello, World!')\n\n// Write buffer content\nconst buffer = Buffer.from('binary data')\nawait disk.put('path/to/file.bin', buffer)\n\n// Append to file\nawait disk.append('logs/app.log', 'Log message\\n')\n\n// Write with visibility\nawait disk.put('public/image.jpg', buffer, { visibility: 'public' })\n```\n\n### File Management\n\n```typescript\nconst disk = manager.disk('local')\n\n// Copy file\nawait disk.copy('original.txt', 'backup.txt')\n\n// Move file\nawait disk.move('old/location.txt', 'new/location.txt')\n\n// Delete file\nawait disk.delete('path/to/file.txt')\n\n// Delete directory (recursively)\nawait disk.deleteDirectory('path/to/directory')\n\n// Create directory\nawait disk.makeDirectory('new/directory/path')\n```\n\n## File Metadata\n\n```typescript\nconst disk = manager.disk('local')\n\n// Get file size in bytes\nconst size = await disk.size('file.txt')\n\n// Get MIME type\nconst mimeType = await disk.mimeType('image.jpg')\n\n// Get last modification time\nconst modified = await disk.lastModified('file.txt')\n\n// Get file visibility\nconst visibility = await disk.getVisibility('file.txt')\n\n// Set file visibility\nawait disk.setVisibility('file.txt', 'public')\n```\n\n## Working with URLs\n\n```typescript\nconst disk = manager.disk('local')\n\n// Get public URL (if accessible)\nconst url = disk.url('public/image.jpg')\n// Returns: /storage/public/image.jpg\n\n// Generate temporary signed URL (S3/GCS)\nconst tempUrl = disk.temporaryUrl('private/document.pdf', {\n  expiresIn: 3600, // 1 hour\n})\n```\n\n## Directory Operations\n\n```typescript\nconst disk = manager.disk('local')\n\n// List directory contents\nconst files = await disk.listContents('uploads')\n// Returns: [\n//   { path: 'uploads/file1.txt', type: 'file', size: 1024 },\n//   { path: 'uploads/subdir', type: 'dir' }\n// ]\n\n// List recursively\nconst allFiles = await disk.listContents('uploads', { recursive: true })\n\n// Create nested directories\nawait disk.makeDirectory('uploads/users/profiles')\n```\n\n## Local Driver\n\n```typescript\nimport { LocalDriver } from '@atlex/storage'\nimport path from 'path'\n\nconst driver = new LocalDriver({\n  root: path.join(__dirname, '../storage'),\n  public: path.join(__dirname, '../public/storage'),\n})\n\nconst manager = new StorageManager()\nmanager.disk('local', driver)\n```\n\n## S3 Driver\n\n```typescript\nimport { S3Driver } from '@atlex/storage'\n\nconst driver = new S3Driver({\n  key: process.env.AWS_ACCESS_KEY_ID,\n  secret: process.env.AWS_SECRET_ACCESS_KEY,\n  bucket: process.env.AWS_BUCKET,\n  region: process.env.AWS_REGION,\n  endpoint: 'https://s3.amazonaws.com',\n})\n\nconst manager = new StorageManager()\nmanager.disk('s3', driver)\n\nconst disk = manager.disk('s3')\nawait disk.put('uploads/file.txt', 'content')\n\nconst url = disk.url('uploads/file.txt')\nconst tempUrl = disk.temporaryUrl('uploads/file.txt', { expiresIn: 3600 })\n```\n\n## Cloudflare R2 Driver\n\n`@atlex/storage` v0.1.7 adds `R2Driver` — a Cloudflare R2 driver that extends `S3Driver` with automatic endpoint derivation. R2 is S3-compatible, but credentials come from Cloudflare R2 API tokens (not AWS IAM), and the endpoint is always `https://{accountId}.r2.cloudflarestorage.com`.\n\nInstall the AWS SDK peer dependencies if not already present:\n\n```bash\nnpm install @aws-sdk/client-s3 @aws-sdk/s3-request-presigner\n```\n\n### Configuration via StorageManager\n\n```typescript\nimport { StorageManager } from '@atlex/storage'\n\nconst manager = StorageManager.fromConfig(\n  {\n    default: 'r2',\n    disks: {\n      r2: {\n        driver: 'r2',\n        bucket: process.env.R2_BUCKET!,\n        url: process.env.R2_PUBLIC_URL ?? '', // optional CDN URL\n        accountId: process.env.R2_ACCOUNT_ID!,\n        accessKeyId: process.env.R2_ACCESS_KEY_ID!,\n        secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,\n      },\n    },\n  },\n  app.basePath,\n)\n\nconst disk = manager.disk('r2')\n```\n\n### Usage\n\n```typescript\n// Upload a file\nawait disk.put('voice/familyId/messageId.m4a', buffer)\n\n// Generate a presigned GET URL (expires in 1 hour)\nconst url = await disk.getPresignedUrl('voice/familyId/messageId.m4a', { expiresIn: 3600 })\n\n// Delete a file\nawait disk.delete('voice/familyId/messageId.m4a')\n\n// Check existence, copy, move — all S3Driver operations are inherited\nconst exists = await disk.exists('voice/familyId/messageId.m4a')\n```\n\n### Direct Driver Instantiation\n\n```typescript\nimport { R2Driver } from '@atlex/storage'\n\nconst driver = new R2Driver({\n  accountId: process.env.R2_ACCOUNT_ID!,\n  accessKeyId: process.env.R2_ACCESS_KEY_ID!,\n  secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,\n  bucket: process.env.R2_BUCKET!,\n  url: process.env.R2_PUBLIC_URL ?? '',\n})\n// Endpoint is auto-derived: https://{accountId}.r2.cloudflarestorage.com\n```\n\n### Presigned URLs on S3\n\nThe same `getPresignedUrl` convenience method is available on any disk backed by `S3Driver`:\n\n```typescript\nconst s3Disk = manager.disk('s3')\nconst signedUrl = await s3Disk.getPresignedUrl('uploads/report.pdf', { expiresIn: 900 })\n```\n\n## Memory Driver\n\n```typescript\nimport { MemoryDriver } from '@atlex/storage'\n\nconst driver = new MemoryDriver()\n\nconst manager = new StorageManager()\nmanager.disk('memory', driver)\n\nconst disk = manager.disk('memory')\nawait disk.put('temp/data.json', JSON.stringify({ test: true }))\n```\n\n## Handling File Uploads\n\n### UploadedFile API\n\n```typescript\nimport { UploadedFile } from '@atlex/storage'\n\nclass UserController {\n  async uploadAvatar(file: UploadedFile) {\n    // Get file info\n    const originalName = file.originalName\n    const extension = file.extension\n    const mimeType = file.mimeType\n    const size = file.size\n\n    // Get file stream\n    const stream = file.stream()\n\n    // Get file buffer\n    const buffer = await file.buffer()\n\n    // Store file\n    const path = `avatars/${Date.now()}.${extension}`\n    await file.store(path, 'local')\n\n    return { path, originalName }\n  }\n}\n```\n\n### Parsing Multipart Uploads\n\n```typescript\nimport { parseUploads } from '@atlex/storage'\nimport { Request } from '@atlex/http'\n\nasync function handleUpload(req: Request) {\n  const uploads = await parseUploads(req)\n\n  const avatar = uploads.file('avatar')\n  if (avatar) {\n    const path = await avatar.store('avatars', 'local')\n    console.log('Saved to:', path)\n  }\n\n  const documents = uploads.files('documents')\n  for (const doc of documents) {\n    await doc.store('documents', 's3')\n  }\n}\n```\n\n## StorageManager Configuration\n\n```typescript\nimport { StorageManager } from '@atlex/storage'\nimport { LocalDriver, S3Driver } from '@atlex/storage'\nimport { FilesystemsConfig } from '@atlex/storage'\n\nconst config: FilesystemsConfig = {\n  default: 'local',\n  disks: {\n    local: {\n      driver: 'local',\n      root: './storage',\n    },\n    public: {\n      driver: 'local',\n      root: './public/storage',\n      url: '/storage',\n    },\n    s3: {\n      driver: 's3',\n      key: process.env.AWS_ACCESS_KEY_ID,\n      secret: process.env.AWS_SECRET_ACCESS_KEY,\n      region: process.env.AWS_REGION,\n      bucket: process.env.AWS_BUCKET,\n    },\n  },\n}\n\nconst manager = StorageManager.fromConfig(config)\n\n// Use default disk\nconst disk = manager.disk()\n\n// Switch disks at runtime\nconst publicDisk = manager.disk('public')\nconst s3Disk = manager.disk('s3')\n\n// Replace disk driver\nmanager.replaceDisk('local', new LocalDriver({ root: './new-storage' }))\n```\n\n## Complete Example\n\n```typescript\nimport { StorageManager } from '@atlex/storage'\nimport { LocalDriver, S3Driver } from '@atlex/storage'\nimport path from 'path'\n\nclass FileService {\n  private storage: StorageManager\n\n  constructor() {\n    this.storage = new StorageManager()\n    this.setupDisks()\n  }\n\n  private setupDisks() {\n    const env = process.env.NODE_ENV || 'development'\n\n    // Local storage for development\n    this.storage.disk(\n      'local',\n      new LocalDriver({\n        root: path.join(__dirname, '../storage'),\n        public: path.join(__dirname, '../public/storage'),\n      }),\n    )\n\n    // S3 for production\n    if (env === 'production') {\n      this.storage.disk(\n        's3',\n        new S3Driver({\n          key: process.env.AWS_ACCESS_KEY_ID!,\n          secret: process.env.AWS_SECRET_ACCESS_KEY!,\n          bucket: process.env.AWS_BUCKET!,\n          region: process.env.AWS_REGION!,\n        }),\n      )\n    }\n  }\n\n  async uploadUserAvatar(userId: string, file: UploadedFile) {\n    const disk = this.storage.disk()\n\n    // Validate file\n    if (!['image/jpeg', 'image/png'].includes(file.mimeType)) {\n      throw new Error('Only JPEG and PNG images are allowed')\n    }\n\n    if (file.size > 5 * 1024 * 1024) {\n      throw new Error('File must be less than 5MB')\n    }\n\n    // Generate filename\n    const filename = `${userId}-${Date.now()}.${file.extension}`\n    const path = `avatars/${filename}`\n\n    // Store file\n    await disk.put(path, await file.buffer(), {\n      visibility: 'public',\n    })\n\n    return {\n      path,\n      url: disk.url(path),\n      mimeType: file.mimeType,\n      size: file.size,\n    }\n  }\n\n  async deleteOldFiles(directory: string, days: number = 30) {\n    const disk = this.storage.disk()\n    const cutoffTime = Date.now() - days * 24 * 60 * 60 * 1000\n\n    const files = await disk.listContents(directory, { recursive: true })\n\n    for (const file of files) {\n      if (file.type === 'file') {\n        const lastModified = await disk.lastModified(file.path)\n        if (lastModified.getTime() < cutoffTime) {\n          await disk.delete(file.path)\n          console.log(`Deleted: ${file.path}`)\n        }\n      }\n    }\n  }\n\n  async getTemporaryAccessUrl(filePath: string, expiresIn: number = 3600) {\n    const disk = this.storage.disk()\n    return disk.temporaryUrl(filePath, { expiresIn })\n  }\n}\n\nexport default new FileService()\n```\n\n## API Overview\n\n### StorageManager\n\n| Method                      | Description                       |\n| --------------------------- | --------------------------------- |\n| `disk(name?)`               | Get or set a storage disk         |\n| `fromConfig(config)`        | Create manager from configuration |\n| `replaceDisk(name, driver)` | Replace a disk driver             |\n\n### Disk\n\n| Method                                 | Description                                 |\n| -------------------------------------- | ------------------------------------------- |\n| `exists(path)`                         | Check if file exists                        |\n| `missing(path)`                        | Check if file is missing                    |\n| `get(path)`                            | Read file as string                         |\n| `getBytes(path)`                       | Read file as buffer                         |\n| `put(path, content, options?)`         | Write file                                  |\n| `putFile(path, file)`                  | Write from file                             |\n| `delete(path)`                         | Delete file                                 |\n| `deleteDirectory(path)`                | Delete directory recursively                |\n| `makeDirectory(path)`                  | Create directory                            |\n| `append(path, content)`                | Append to file                              |\n| `copy(from, to)`                       | Copy file                                   |\n| `move(from, to)`                       | Move file                                   |\n| `getVisibility(path)`                  | Get file visibility                         |\n| `setVisibility(path, visibility)`      | Set file visibility                         |\n| `url(path)`                            | Get public URL                              |\n| `temporaryUrl(path, expiresInSeconds)` | Get temporary signed URL (low-level)        |\n| `getPresignedUrl(key, { expiresIn })`  | Get presigned GET URL (convenience wrapper) |\n| `lastModified(path)`                   | Get last modification time                  |\n| `size(path)`                           | Get file size                               |\n| `mimeType(path)`                       | Get MIME type                               |\n| `listContents(path, options?)`         | List directory contents                     |\n\n### Drivers\n\n| Driver         | Description                              |\n| -------------- | ---------------------------------------- |\n| `LocalDriver`  | File system storage                      |\n| `S3Driver`     | Amazon S3 storage (with presigned URLs)  |\n| `R2Driver`     | Cloudflare R2 storage (extends S3Driver) |\n| `MemoryDriver` | In-memory storage (testing)              |\n\n## Documentation\n\nFor complete documentation, visit [https://atlex.dev/guide/storage](https://atlex.dev/guide/storage)\n\n## License\n\n## MIT\n\nPart of [Atlex](https://atlex.dev) — A modern framework for Node.js.\n","readmeFilename":"README.md"}