{"_id":"@antelopejs/file-storage-s3","_rev":"8-758aa98732f14fcebd782cf4f5dac995","name":"@antelopejs/file-storage-s3","dist-tags":{"latest":"0.1.5"},"versions":{"0.0.2":{"name":"@antelopejs/file-storage-s3","version":"0.0.2","keywords":["antelopejs","file-storage","s3","cloudflare-r2","presigned-url","upload"],"license":"Apache-2.0","_id":"@antelopejs/file-storage-s3@0.0.2","maintainers":[{"name":"mwesto","email":"contact@mwesto.be"},{"name":"upd4ting","email":"upd4ting@gmail.com"},{"name":"antelopesrl","email":"contact@antelopejs.com"}],"homepage":"https://github.com/AntelopeJS/file-storage-s3#readme","bugs":{"url":"https://github.com/AntelopeJS/file-storage-s3/issues"},"dist":{"shasum":"06ff8188428a50fe06cfe538a9741a9d3b205f1f","tarball":"https://registry.npmjs.org/@antelopejs/file-storage-s3/-/file-storage-s3-0.0.2.tgz","fileCount":17,"integrity":"sha512-SGC0JXRSsop2md5uMqo1QUfysD0rbow+SCXzKWe24g2Jgfyof8xIihP9EGxo6LPKhPQmhl+rUNKlTyos6YZJmQ==","signatures":[{"sig":"MEQCIBsR2N+CvYPjxxyHwLFiAwcbkHTkZNeVNlLsyy2fLOlxAiA6wCZPCjxdREatrzPkJl5wbvVncR1LJ5XFOYtdH0r91Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51828},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"44fd84b153174238a03386bb59a82521f8157f5b","scripts":{"dev":"ajs project run -w -p playground","lint":"biome check .","test":"pnpm run build && ajs module test .","build":"rimraf dist && tsc","format":"biome format --write .","prepack":"pnpm run build","release":"pnpm run lint && pnpm run test && pnpm run prepack && release-it","lint:fix":"biome check --write ."},"_npmUser":{"name":"upd4ting","email":"upd4ting@gmail.com"},"antelopeJs":{"test":"src/test/antelope.test.ts","implements":["@antelopejs/interface-file-storage"]},"repository":{"url":"git+https://github.com/AntelopeJS/file-storage-s3.git","type":"git"},"_npmVersion":"11.7.0","description":"A file storage module that implements the file-storage interface of AntelopeJS with S3-compatible backends (AWS S3, Cloudflare R2)","directories":{},"_nodeVersion":"20.19.1","dependencies":{"@aws-sdk/client-s3":"^3.700.0","@antelopejs/interface-core":"^0.0.2","@aws-sdk/s3-request-presigner":"^3.700.0","@antelopejs/interface-file-storage":"^0.0.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.6.5","devDependencies":{"rimraf":"^6.0.1","release-it":"^19.2.4","typescript":"^5.8.3","@types/node":"^22.15.18","@types/mocha":"^10.0.10","@biomejs/biome":"2.3.2","release-it-changelogen":"^0.1.0","@release-it/conventional-changelog":"^10.0.1"},"_npmOperationalInternal":{"tmp":"tmp/file-storage-s3_0.0.2_1774291804777_0.1926380659889808","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@antelopejs/file-storage-s3","version":"0.1.0","keywords":["antelopejs","file-storage","s3","cloudflare-r2","presigned-url","upload"],"license":"Apache-2.0","_id":"@antelopejs/file-storage-s3@0.1.0","maintainers":[{"name":"mwesto","email":"contact@mwesto.be"},{"name":"upd4ting","email":"upd4ting@gmail.com"},{"name":"antelopesrl","email":"contact@antelopejs.com"}],"homepage":"https://github.com/AntelopeJS/file-storage-s3#readme","bugs":{"url":"https://github.com/AntelopeJS/file-storage-s3/issues"},"dist":{"shasum":"87254103245cf2aef0f74ac30ac63d60e42553f8","tarball":"https://registry.npmjs.org/@antelopejs/file-storage-s3/-/file-storage-s3-0.1.0.tgz","fileCount":20,"integrity":"sha512-GxmU+h1eHICC+l7U3EV5cAan3CZDLXCsnE+/EZiEva2oE88JtPPYhjx0VmcPSI3jETMgfkP7OQ4NbEyUb1Yicg==","signatures":[{"sig":"MEUCIQD6qJxqp8TZnJ8tsMi70oerhFdsw9CSBZvfqcTQiwb4yAIgAjBiQGtnrpqkk3gmMxEWKG7uvMiX9+83WQ+v3w2/xac=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71757},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"fe1e90c96b6207686143847c70e5b43c49a9d1b4","scripts":{"dev":"ajs project run -w -p playground","lint":"biome check .","test":"pnpm run build && ajs module test .","build":"rimraf dist && tsc","format":"biome format --write .","prepack":"pnpm run build","release":"pnpm run lint && pnpm run test && pnpm run prepack && release-it","lint:fix":"biome check --write ."},"_npmUser":{"name":"upd4ting","email":"upd4ting@gmail.com"},"antelopeJs":{"test":"src/test/antelope.test.ts","implements":["@antelopejs/interface-file-storage"]},"repository":{"url":"git+https://github.com/AntelopeJS/file-storage-s3.git","type":"git"},"_npmVersion":"11.7.0","description":"A file storage module that implements the file-storage interface of AntelopeJS with S3-compatible backends (AWS S3, Cloudflare R2)","directories":{},"_nodeVersion":"20.19.1","dependencies":{"@aws-sdk/client-s3":"^3.1016.0","@antelopejs/interface-core":"^0.0.2","@aws-sdk/s3-request-presigner":"^3.1016.0","@antelopejs/interface-file-storage":"^0.1.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.6.5","devDependencies":{"rimraf":"^6.1.3","release-it":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.19.15","@types/mocha":"^10.0.10","@biomejs/biome":"2.3.2","release-it-changelogen":"^0.1.0","@release-it/conventional-changelog":"^10.0.6"},"_npmOperationalInternal":{"tmp":"tmp/file-storage-s3_0.1.0_1781520614839_0.7969552841455354","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@antelopejs/file-storage-s3","version":"0.1.1","keywords":["antelopejs","file-storage","s3","cloudflare-r2","presigned-url","upload"],"license":"Apache-2.0","_id":"@antelopejs/file-storage-s3@0.1.1","maintainers":[{"name":"mwesto","email":"contact@mwesto.be"},{"name":"upd4ting","email":"upd4ting@gmail.com"},{"name":"antelopesrl","email":"contact@antelopejs.com"}],"homepage":"https://github.com/AntelopeJS/file-storage-s3#readme","bugs":{"url":"https://github.com/AntelopeJS/file-storage-s3/issues"},"dist":{"shasum":"dc493efc16ace9640f1279c264a81671fe6660d6","tarball":"https://registry.npmjs.org/@antelopejs/file-storage-s3/-/file-storage-s3-0.1.1.tgz","fileCount":20,"integrity":"sha512-Q7MK3CPvz+wju6bLXAqAilwKxCzFaNmL6pktp2/A2fZHDSgJWwIx+jKhK1XEN/AnTM2XNOGctGPDrk0p/yfXIg==","signatures":[{"sig":"MEQCIFecdkKs/eO278KnuCRWQMAweZ7WX5AfHfe3401/2HO6AiACsooPez0vTQUHY4N3aa9Y8RmK/iHj9YduaYPocLidvA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71757},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"b3284a8b25276957b5ebc53d2994356a4185c04c","scripts":{"dev":"ajs project run -w -p playground","lint":"biome check .","test":"pnpm run build && ajs module test .","build":"rimraf dist && tsc","format":"biome format --write .","prepack":"pnpm run build","release":"pnpm run lint && pnpm run test && pnpm run prepack && release-it","lint:fix":"biome check --write ."},"_npmUser":{"name":"upd4ting","email":"upd4ting@gmail.com"},"antelopeJs":{"test":"src/test/antelope.test.ts","implements":["@antelopejs/interface-file-storage"]},"repository":{"url":"git+https://github.com/AntelopeJS/file-storage-s3.git","type":"git"},"_npmVersion":"11.7.0","description":"A file storage module that implements the file-storage interface of AntelopeJS with S3-compatible backends (AWS S3, Cloudflare R2)","directories":{},"_nodeVersion":"20.19.1","dependencies":{"@aws-sdk/client-s3":"^3.1016.0","@antelopejs/interface-core":"^0.0.5","@aws-sdk/s3-request-presigner":"^3.1016.0","@antelopejs/interface-file-storage":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.6.5","devDependencies":{"rimraf":"^6.1.3","release-it":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.19.15","@types/mocha":"^10.0.10","@biomejs/biome":"2.3.2","release-it-changelogen":"^0.1.0","@release-it/conventional-changelog":"^10.0.6"},"_npmOperationalInternal":{"tmp":"tmp/file-storage-s3_0.1.1_1781623580047_0.1007824818263845","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@antelopejs/file-storage-s3","version":"0.1.2","keywords":["antelopejs","file-storage","s3","cloudflare-r2","presigned-url","upload"],"license":"Apache-2.0","_id":"@antelopejs/file-storage-s3@0.1.2","maintainers":[{"name":"mwesto","email":"contact@mwesto.be"},{"name":"upd4ting","email":"upd4ting@gmail.com"},{"name":"thomasims","email":"thomas@antelopejs.com"},{"name":"antelopesrl","email":"contact@antelopejs.com"}],"homepage":"https://github.com/AntelopeJS/file-storage-s3#readme","bugs":{"url":"https://github.com/AntelopeJS/file-storage-s3/issues"},"dist":{"shasum":"fe11f3c09d4ff306129809e5921094159c1cb9f7","tarball":"https://registry.npmjs.org/@antelopejs/file-storage-s3/-/file-storage-s3-0.1.2.tgz","fileCount":20,"integrity":"sha512-nMQc1uY3VL5IWC+ghUbwaMT/+GssVsAUkNXwmyErh+NzvFaIDNavtgi5fOz+Oa1BiCAsr+h70XYB7Bk4QREGCA==","signatures":[{"sig":"MEMCIA6DltJOQ235yH8/OH1vli7iWUVK3iWKtUYj8IU1H2fuAh8tnFv2qgbBykOlzDY3fy7b/bqKDzBYfI25iWPXy/Zd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71773},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"eab0f2a073fc580d5b1571b67387acad0bf1204f","scripts":{"dev":"ajs project run -w -p playground","lint":"biome check .","test":"pnpm run build && ajs module test .","build":"rimraf dist && tsc","format":"biome format --write .","prepack":"pnpm run build","release":"pnpm run lint && pnpm run test && pnpm run prepack && release-it","lint:fix":"biome check --write ."},"_npmUser":{"name":"upd4ting","email":"upd4ting@gmail.com"},"antelopeJs":{"test":"src/test/antelope.test.ts","implements":["@antelopejs/interface-file-storage"]},"repository":{"url":"git+https://github.com/AntelopeJS/file-storage-s3.git","type":"git"},"_npmVersion":"11.7.0","description":"A file storage module that implements the file-storage interface of AntelopeJS with S3-compatible backends (AWS S3, Cloudflare R2)","directories":{},"_nodeVersion":"20.19.1","dependencies":{"@aws-sdk/client-s3":"^3.1016.0","@antelopejs/interface-core":">=0.0.5 <1.0.0","@aws-sdk/s3-request-presigner":"^3.1016.0","@antelopejs/interface-file-storage":">=0.1.1 <1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.6.5","devDependencies":{"rimraf":"^6.1.3","release-it":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.19.15","@types/mocha":"^10.0.10","@biomejs/biome":"2.3.2","release-it-changelogen":"^0.1.0","@release-it/conventional-changelog":"^10.0.6"},"_npmOperationalInternal":{"tmp":"tmp/file-storage-s3_0.1.2_1787299052913_0.9483973697831936","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@antelopejs/file-storage-s3","version":"0.1.3","keywords":["antelopejs","cloudflare-r2","file-storage","presigned-url","s3","upload"],"license":"Apache-2.0","_id":"@antelopejs/file-storage-s3@0.1.3","maintainers":[{"name":"mwesto","email":"contact@mwesto.be"},{"name":"upd4ting","email":"upd4ting@gmail.com"},{"name":"thomasims","email":"thomas@antelopejs.com"},{"name":"antelopesrl","email":"contact@antelopejs.com"}],"homepage":"https://github.com/AntelopeJS/file-storage-s3#readme","bugs":{"url":"https://github.com/AntelopeJS/file-storage-s3/issues"},"dist":{"shasum":"3806f237c1b509bfc88855b2e0530d28202145c2","tarball":"https://registry.npmjs.org/@antelopejs/file-storage-s3/-/file-storage-s3-0.1.3.tgz","fileCount":35,"integrity":"sha512-fQiQBu2Z8rPGS0iryGFHg0pn/+j1ifTzgAKB8WlhvxirqCRYJLbiDq6w5YiLqPK8FkWAqx/Q7dLk1anKALHT6w==","signatures":[{"sig":"MEUCIAfBE5u3nKDeCoYwRHq9PlreRIJ2m9fA/1Dmm31nr5UsAiEAr9Zj2wD+4PPqwNLMM0iuRo9sGka0oPd2uEDjOBHiKfo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDUHCYbZSCta8crbUxA98oS06Gebgwi7BMi8TBLDpVjyAIhANxjkLuzEuL0xulwLQoINWr2TDdlDK01z5FbKgps4yME","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@antelopejs%2ffile-storage-s3@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":106028},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"fdcf64948ff157ff1ddbbfcfea7520d253219127","scripts":{"dev":"ajs project run -w -p playground","knip":"knip","lint":"oxlint","test":"pnpm run build && ajs module test .","build":"rimraf dist && tsc","format":"oxfmt .","prepack":"pnpm run build","release":"pnpm run lint && pnpm run test && pnpm run prepack && release-it","lint:fix":"oxlint --fix","format:check":"oxfmt --check ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e3d2eb5c-00df-4591-bfd7-7f08c5790a43"}},"antelopeJs":{"test":"src/test/antelope.test.ts","implements":["@antelopejs/interface-file-storage"]},"repository":{"url":"git+https://github.com/AntelopeJS/file-storage-s3.git","type":"git"},"_npmVersion":"11.19.0","description":"A file storage module that implements the file-storage interface of AntelopeJS with S3-compatible backends (AWS S3, Cloudflare R2)","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@aws-sdk/client-s3":"^3.1016.0","@antelopejs/interface-core":">=0.0.5 <1.0.0","@aws-sdk/s3-request-presigner":"^3.1016.0","@antelopejs/interface-file-storage":">=0.1.3 <1.0.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.6.5","devDependencies":{"knip":"^6.34.0","oxfmt":"^0.66.0","oxlint":"1.81.0","rimraf":"^6.1.3","release-it":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.19.15","@types/mocha":"^10.0.10","oxlint-tsgolint":"^7.0.2001","release-it-changelogen":"^0.1.0","@antelopejs/tooling-configs":"^0.0.4","eslint-plugin-perfectionist":"^5.11.0"},"_npmOperationalInternal":{"tmp":"tmp/file-storage-s3_0.1.3_1789429409182_0.3371930232513054","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@antelopejs/file-storage-s3","version":"0.1.4","keywords":["antelopejs","cloudflare-r2","file-storage","presigned-url","s3","upload"],"license":"Apache-2.0","_id":"@antelopejs/file-storage-s3@0.1.4","maintainers":[{"name":"mwesto","email":"contact@mwesto.be"},{"name":"upd4ting","email":"upd4ting@gmail.com"},{"name":"thomasims","email":"thomas@antelopejs.com"},{"name":"antelopesrl","email":"contact@antelopejs.com"}],"homepage":"https://github.com/AntelopeJS/file-storage-s3#readme","bugs":{"url":"https://github.com/AntelopeJS/file-storage-s3/issues"},"dist":{"shasum":"6066b654a3ea96bd5ade5d07056ff1d21ad7b5c9","tarball":"https://registry.npmjs.org/@antelopejs/file-storage-s3/-/file-storage-s3-0.1.4.tgz","fileCount":42,"integrity":"sha512-fzRmktah0jmkpAWR8ML3/An9gbpWmXKKrQUq4ksqeK9NiYCVG8cDMO8YPKVt8SJKGo9OvUj6Cd9hV4/DHo2XFQ==","signatures":[{"sig":"MEYCIQCP667Fd4Zso6zD00oOphGEAVR0VKDjmiBkOuXCw7h9bwIhANoAE7fAeApD6JMswgEq4kcEl49be5ewXpmSBMZiDMJh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFKFB6keoDpBjrycSj14QGPSC+zst/hl2Y9csBETN1jFAiA4Im/oNFIo3m47GGHL53zvPRhLxoPuj/e47LqfuLI92w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@antelopejs%2ffile-storage-s3@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":133512},"main":"dist/index.js","types":"./dist/index.d.ts","gitHead":"0d004249520689f389f90db1cd6eb36badb338ad","scripts":{"dev":"ajs project run -w -p playground","knip":"knip","lint":"oxlint","test":"pnpm run build && ajs module test .","build":"rimraf dist && tsc","format":"oxfmt .","prepack":"pnpm run build","release":"pnpm run lint && pnpm run test && pnpm run prepack && release-it","lint:fix":"oxlint --fix","format:check":"oxfmt --check ."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:e3d2eb5c-00df-4591-bfd7-7f08c5790a43"}},"antelopeJs":{"test":"src/test/antelope.test.ts","implements":["@antelopejs/interface-file-storage"]},"repository":{"url":"git+https://github.com/AntelopeJS/file-storage-s3.git","type":"git"},"_npmVersion":"11.19.0","description":"A file storage module that implements the file-storage interface of AntelopeJS with S3-compatible backends (AWS S3, Cloudflare R2)","directories":{},"_nodeVersion":"24.21.0","dependencies":{"@aws-sdk/client-s3":"^3.1016.0","@antelopejs/interface-core":">=0.1.1 <1.0.0","@aws-sdk/s3-request-presigner":"^3.1016.0","@antelopejs/interface-file-storage":">=0.1.3 <1.0.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.6.5","devDependencies":{"knip":"^6.34.0","oxfmt":"^0.66.0","oxlint":"1.81.0","rimraf":"^6.1.3","release-it":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.19.15","@types/mocha":"^10.0.10","oxlint-tsgolint":"^7.0.2001","@antelopejs/core":"^1.9.1","release-it-changelogen":"^0.1.0","@antelopejs/tooling-configs":"^0.0.6","eslint-plugin-perfectionist":"^5.11.0"},"_npmOperationalInternal":{"tmp":"tmp/file-storage-s3_0.1.4_1790426647260_0.6113888872715034","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"_id":"@antelopejs/file-storage-s3@0.1.5","bugs":{"url":"https://github.com/AntelopeJS/file-storage-s3/issues"},"dist":{"shasum":"febfd37fb6123f76e7517cad68d30af07be1d10f","tarball":"https://registry.npmjs.org/@antelopejs/file-storage-s3/-/file-storage-s3-0.1.5.tgz","fileCount":45,"integrity":"sha512-QI54WQNu3AFXD6qSHbMfv9GT/eDY3bErQsbmygjUrCLUfeA/uvDmvwUk58zCQ2IlRcV68YmfNkEnHWU9otdl4g==","signatures":[{"sig":"MEYCIQChwq0VAbfxb3zmCz6BAnlHcBxtGwZ+iba2yg26aD5HLAIhAKH1arjXpuGZHNtTymZoas4VEm+3UmhHl5IaNtuMvhzb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAMsQNx/gcBsjxIZYl836DzCJRag1YFO/h8YCSa/SkRFAiEA2foGYqYhmBswI/pkayUWSDeJj6mNQEenW+bSYC0Tb0k="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@antelopejs%2ffile-storage-s3@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":139258},"main":"dist/index.js","name":"@antelopejs/file-storage-s3","types":"./dist/index.d.ts","gitHead":"76b71b973979c6df168877d8b8f8af954e8f8498","license":"Apache-2.0","scripts":{"dev":"ajs project run -w -p playground","knip":"knip","lint":"oxlint","test":"pnpm run build && ajs module test .","build":"rimraf dist && tsc","format":"oxfmt .","prepack":"pnpm run build","release":"pnpm run lint && pnpm run test && pnpm run prepack && release-it","lint:fix":"oxlint --fix","format:check":"oxfmt --check ."},"version":"0.1.5","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"e3d2eb5c-00df-4591-bfd7-7f08c5790a43"}},"homepage":"https://github.com/AntelopeJS/file-storage-s3#readme","keywords":["antelopejs","cloudflare-r2","file-storage","presigned-url","s3","upload"],"antelopeJs":{"test":"src/test/antelope.test.ts","implements":["@antelopejs/interface-file-storage"]},"repository":{"url":"git+https://github.com/AntelopeJS/file-storage-s3.git","type":"git"},"_npmVersion":"11.19.0","description":"A file storage module that implements the file-storage interface of AntelopeJS with S3-compatible backends (AWS S3, Cloudflare R2)","directories":{},"maintainers":[{"name":"mwesto","email":"contact@mwesto.be"},{"name":"upd4ting","email":"upd4ting@gmail.com"},{"name":"thomasims","email":"thomas@antelopejs.com"},{"name":"antelopesrl","email":"contact@antelopejs.com"}],"_nodeVersion":"24.21.0","dependencies":{"@aws-sdk/client-s3":"^3.1016.0","@antelopejs/interface-core":">=0.1.1 <1.0.0","@aws-sdk/s3-request-presigner":"^3.1016.0","@antelopejs/interface-file-storage":">=0.1.3 <1.0.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.6.5","devDependencies":{"knip":"^6.34.0","oxfmt":"^0.66.0","oxlint":"1.81.0","rimraf":"^6.1.3","release-it":"^19.2.4","typescript":"^5.9.3","@types/node":"^22.19.15","@types/mocha":"^10.0.10","oxlint-tsgolint":"^7.0.2001","@antelopejs/core":"^1.9.1","release-it-changelogen":"^0.1.0","@antelopejs/tooling-configs":"^0.0.6","eslint-plugin-perfectionist":"^5.11.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/file-storage-s3_0.1.5_1790701502931_0.533349839617618"}}},"time":{"created":"2026-03-23T18:50:04.700Z","modified":"2026-09-29T17:05:03.439Z","0.0.2":"2026-03-23T18:50:04.967Z","0.1.0":"2026-06-15T10:50:14.978Z","0.1.1":"2026-06-16T15:26:20.181Z","0.1.2":"2026-08-21T07:57:33.066Z","0.1.3":"2026-09-14T23:43:29.271Z","0.1.4":"2026-09-26T12:44:07.344Z","0.1.5":"2026-09-29T17:05:03.010Z"},"bugs":{"url":"https://github.com/AntelopeJS/file-storage-s3/issues"},"license":"Apache-2.0","homepage":"https://github.com/AntelopeJS/file-storage-s3#readme","keywords":["antelopejs","cloudflare-r2","file-storage","presigned-url","s3","upload"],"repository":{"url":"git+https://github.com/AntelopeJS/file-storage-s3.git","type":"git"},"description":"A file storage module that implements the file-storage interface of AntelopeJS with S3-compatible backends (AWS S3, Cloudflare R2)","maintainers":[{"name":"mwesto","email":"contact@mwesto.be"},{"name":"upd4ting","email":"upd4ting@gmail.com"},{"name":"thomasims","email":"thomas@antelopejs.com"},{"name":"antelopesrl","email":"contact@antelopejs.com"}],"readme":"# @antelopejs/file-storage-s3\n\n<div align=\"center\">\n<a href=\"https://www.npmjs.com/package/@antelopejs/file-storage-s3\"><img alt=\"NPM version\" src=\"https://img.shields.io/npm/v/@antelopejs/file-storage-s3.svg?style=for-the-badge&labelColor=000000\"></a>\n<a href=\"./LICENSE\"><img alt=\"License\" src=\"https://img.shields.io/npm/l/@antelopejs/file-storage-s3.svg?style=for-the-badge&labelColor=000000\"></a>\n<a href=\"https://discord.gg/sjK28QHrA7\"><img src=\"https://img.shields.io/badge/Discord-18181B?logo=discord&style=for-the-badge&color=000000\" alt=\"Discord\"></a>\n<a href=\"https://antelopejs.com\"><img src=\"https://img.shields.io/badge/Docs-18181B?style=for-the-badge&color=000000\" alt=\"Documentation\"></a>\n</div>\n\nS3-compatible implementation of the AntelopeJS file-storage interface. It\nsupports AWS S3, Cloudflare R2, and compatible services, with signed uploads,\npublic and private reads, named storage backends, and staged-file promotion.\n\n## Installation\n\n```bash\npnpm add @antelopejs/file-storage-s3\n```\n\nThe module implements\n[`@antelopejs/interface-file-storage`](https://github.com/AntelopeJS/interface-file-storage).\n\n## Configuration\n\nAdd the module to `antelope.config.ts`:\n\n```ts\nimport { defineConfig } from \"@antelopejs/interface-core/config\";\n\nexport default defineConfig({\n  name: \"my-app\",\n  modules: {\n    storage: {\n      source: {\n        type: \"package\",\n        package: \"@antelopejs/file-storage-s3\",\n      },\n      config: {\n        default: {\n          endpoint: \"https://s3.example.com\",\n          region: \"auto\",\n          accessKeyId: process.env.S3_ACCESS_KEY_ID,\n          secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,\n          bucket: \"app-files\",\n          attachmentPrivateBucket: \"app-private-files\",\n          publicUrl: \"https://cdn.example.com\",\n          defaultVisibility: \"private\",\n          defaultUploadExpiration: 3600,\n          defaultReadExpiration: 300,\n          stagingExpirationDays: 1,\n        },\n      },\n    },\n  },\n});\n```\n\n`attachmentPrivateBucket` keeps explicit private uploads separate from a public\nbucket. `publicUrl` is required for public reads. Omit\n`stagingExpirationDays` when lifecycle rules are managed by infrastructure.\n\n### Private bucket verification\n\nBefore its first use, the module verifies that `attachmentPrivateBucket` blocks\nall public access: `GetPublicAccessBlock` must report the four flags\n`BlockPublicAcls`, `IgnorePublicAcls`, `BlockPublicPolicy`, and\n`RestrictPublicBuckets` as enabled. Otherwise, every explicit private upload\nand read fails.\n\nSome S3-compatible providers cannot satisfy this verification. MinIO does not\nimplement `GetPublicAccessBlock` and answers `501 NotImplemented`. Other\nproviders implement it but reject authenticated writes when it is enabled: on\nHetzner Object Storage, `BlockPublicAcls` or `BlockPublicPolicy` makes every\nauthenticated `PutObject` (presigned uploads included) fail with `403`, and\n`RestrictPublicBuckets` turns the `412` of a create-only conditional upload into\na `403`. For those providers, set `assumePrivateBuckets: true` on the storage:\n\n```ts\ndefault: {\n  // ...\n  attachmentPrivateBucket: \"app-private-files\",\n  assumePrivateBuckets: true,\n},\n```\n\nWith this option, the module skips the public access block verification and\nlogs a warning at startup for each assumed bucket. It still verifies the bucket\nbefore its first use:\n\n- `GetBucketAcl` must not return any grant to the `AllUsers` or\n  `AuthenticatedUsers` groups, whatever the permission.\n- `GetBucketPolicyStatus` must not report the bucket public. A bucket without a\n  policy (`NoSuchBucketPolicy`) passes.\n\nThe module continues when the provider does not implement one of these calls\n(`501 NotImplemented`). Any other error, such as `AccessDenied`, fails the\nverification.\n\nThe operator is then responsible for keeping the private bucket private: do not\nattach a public bucket policy, public ACLs, anonymous access rules, or a public\ndomain to it. Providers can under-report public access (MinIO reports\n`IsPublic: false` through `GetBucketPolicyStatus` even with an anonymous read\npolicy), so do not rely on these checks alone. The option defaults to `false`,\nwhich keeps the strict verification.\n\nAdditional backends can be declared under `storages`. The name `default` is\nreserved.\n\n## Upload guarantees\n\nUpload URLs include a signed `If-None-Match: *` condition. Clients must send all\nreturned headers unchanged. This prevents an upload URL from replacing an\nexisting object while that object exists.\n\nRead [UPLOADS.md](UPLOADS.md) before deploying. It documents promotion,\nprivacy, expiry, CORS, conditional-write requirements, retries, and the trust\nboundary for S3-compatible providers.\n\n## Metadata keys\n\nS3 stores user metadata as `x-amz-meta-*` headers, whose names are\ncase-insensitive and lowercase on the wire. The module lowercases metadata keys\nbefore signing an upload, so `{ tenantId: \"t\" }` becomes the signed header\n`x-amz-meta-tenantid`. `GetFileMetadata` returns the keys S3 stores, in\nlowercase: read `metadata.tenantid`, not `metadata.tenantId`. Keys that only\ndiffer by casing, such as `tenantId` and `tenantid`, collide once lowercased and\nmake `CreateUploadUrl` throw instead of silently dropping one value.\n\n## Development\n\nTests use a disposable Moto server:\n\n```bash\nuv tool install 'moto[server]==5.2.3'\nmoto_server -H 127.0.0.1 -p 5005\n```\n\nIn another terminal:\n\n```bash\npnpm install\npnpm lint\npnpm format:check\npnpm test\n```\n\nSee the organization-wide\n[contribution guidelines](https://github.com/AntelopeJS/.github/blob/main/CONTRIBUTING.md)\nand [security policy](SECURITY.md).\n\n## License\n\nApache-2.0\n","readmeFilename":"README.md"}