{"_id":"s3mini","_rev":"20-ec7a552266bf71a85c0fca543a7556b6","name":"s3mini","dist-tags":{"latest":"1.0.2"},"versions":{"0.1.0":{"name":"s3mini","version":"0.1.0","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Azure Blob Storage","Google Cloud Storage","Ceph","mibion","backblaze"],"author":{"name":"good-lly"},"_id":"s3mini@0.1.0","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"00ef13e23685f848943d81b1e04f62a65ef3b7b1","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.1.0.tgz","fileCount":13,"integrity":"sha512-mzRFmte1F6m+bR68Y15HJ+GCE1yvJfs+HRSVMrjYMtiw8wXg0bEh58V6gZvqjqLVhqAbNc5fxwNEf6WpwBhh9w==","signatures":[{"sig":"MEUCICAWXmlOKNj7irHdko777DJ9Aq5WgGMigg7EpfyYdoxyAiEA0CZsHr0CkTw0XIPYTUNys4/Z/nJiftMsnIwD2QPYenY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":158312},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{"types":"./dist/s3mini.d.ts","import":{"default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":"./dist/s3mini.min.js"},"gitHead":"bab33481e0bbc538f226a0c5f4d83cbd323477a2","scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","tsc":"tsc","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose","test:perf":"node ./tests/perf/performance.test.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","prepublishOnly":"npm run build"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"11.2.0","description":"👶 Tiny & fast S3 client built for edge.","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","minio":"^8.0.5","tslib":"^2.8.1","dotenv":"^16.4.7","eslint":"^9.26.0","rimraf":"^6.0.1","rollup":"^4.34.8","globals":"^16.0.0","ts-jest":"^29.2.6","prettier":"^3.5.2","tinybench":"^4.0.1","@eslint/js":"^9.26.0","typescript":"^5.7.3","@types/node":"^22.15.14","@eslint/eslintrc":"^3.3.1","rollup-plugin-dts":"^6.1.1","@aws-sdk/client-s3":"^3.802.0","@rollup/plugin-terser":"^0.4.4","eslint-config-prettier":"^10.0.1","@rollup/plugin-typescript":"^12.1.2","@typescript-eslint/parser":"^8.25.0","@rollup/plugin-node-resolve":"^16.0.0","@typescript-eslint/eslint-plugin":"^8.25.0","@monstermann/tinybench-pretty-printer":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.1.0_1747144577784_0.28678966287127805","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"s3mini","version":"0.1.1","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Azure Blob Storage","Google Cloud Storage","Ceph","mibion","backblaze"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.1.1","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"713ab60d3aca3021e0e911bc865454455a7d60de","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.1.1.tgz","fileCount":13,"integrity":"sha512-wIY6HaHWAwwE7wCxh9tjoVF9D1kt1KA91ArJou6unnHNResGngkBhKTRaDMqLd4IjYeNb7zpTO15e0lJRNjGtg==","signatures":[{"sig":"MEYCIQDEYBgfccc8SYboFQ5KMzbnBTnwK/7CyFecUxeYwsmKkgIhANlE13dNa8h9tgQ04gp8MzssBbr+h3AOee7axVWUtazs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":163454},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"dd77671bb95ef0a0fa58dbac18970ed374d3bea1","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","tsc":"tsc","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose","test:perf":"node ./tests/perf/performance.test.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","prepublishOnly":"npm run build"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","minio":"^8.0.5","tslib":"^2.8.1","dotenv":"^16.4.7","eslint":"^9.26.0","rimraf":"^6.0.1","rollup":"^4.34.8","globals":"^16.0.0","ts-jest":"^29.2.6","prettier":"^3.5.2","tinybench":"^4.0.1","@eslint/js":"^9.26.0","typescript":"^5.7.3","@types/node":"^22.15.14","@eslint/eslintrc":"^3.3.1","rollup-plugin-dts":"^6.1.1","@aws-sdk/client-s3":"^3.802.0","@rollup/plugin-terser":"^0.4.4","eslint-config-prettier":"^10.0.1","@rollup/plugin-typescript":"^12.1.2","@typescript-eslint/parser":"^8.25.0","@rollup/plugin-node-resolve":"^16.0.0","@typescript-eslint/eslint-plugin":"^8.25.0","@monstermann/tinybench-pretty-printer":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.1.1_1749481643111_0.5841498095334408","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"s3mini","version":"0.2.0","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Azure Blob Storage","Google Cloud Storage","Ceph","mibion","backblaze"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.2.0","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"14e1e49f66e8546b5a41e0ffde07c5b7494ceeab","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.2.0.tgz","fileCount":13,"integrity":"sha512-wEiPibnyGN8B/1vJiOQGZbaF/t5A356RjAH4ch75UZi5e04LM9qaRh3A5KXk2Eq/qdU7I/2qXtigk1ifFl6yEA==","signatures":[{"sig":"MEUCIQDe4LTKcOlhVF2pyBTTw7R+ZEIIfttu5JA8V7VIaUW8ZAIgVyyghixDQ7zumC/+irnZ0QdFwDtIF9X+2jLvHMVAlH4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":166306},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"41caaa6e9f64f11a0c9bb36e4e594e8fe303c96c","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","tsc":"tsc","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose","test:perf":"node ./tests/perf/performance.test.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","prepublishOnly":"npm run build"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","minio":"^8.0.5","tslib":"^2.8.1","dotenv":"^16.4.7","eslint":"^9.26.0","rimraf":"^6.0.1","rollup":"^4.34.8","globals":"^16.0.0","ts-jest":"^29.2.6","prettier":"^3.5.2","tinybench":"^4.0.1","@eslint/js":"^9.26.0","typescript":"^5.7.3","@types/node":"^22.15.14","@eslint/eslintrc":"^3.3.1","rollup-plugin-dts":"^6.1.1","@aws-sdk/client-s3":"^3.802.0","@rollup/plugin-terser":"^0.4.4","eslint-config-prettier":"^10.0.1","@rollup/plugin-typescript":"^12.1.2","@typescript-eslint/parser":"^8.25.0","@rollup/plugin-node-resolve":"^16.0.0","@typescript-eslint/eslint-plugin":"^8.25.0","@monstermann/tinybench-pretty-printer":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.2.0_1749924196682_0.08115471782869554","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"s3mini","version":"0.3.0","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Azure Blob Storage","Google Cloud Storage","Ceph","mibion","backblaze"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.3.0","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"b852bc90192e1649199d35917266c3cd4ba0b954","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.3.0.tgz","fileCount":13,"integrity":"sha512-IIPEV/H/LATN8eu/sd9AlWVSJ1B4sFWMOPoMyyCZcvCOGSnz/QK/v2skatn4mqCZWdMjbTV5wme4yMxV+76QXw==","signatures":[{"sig":"MEQCIC/FuikxRFYQzb8gxDQ7Kj6ItpxqpE4eUwpaEV/EapCMAiAd3yeB1Syu6D+O2+mRHWwE+XW7UnPC4bOpF5V72pFAWA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":221570},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"8080b33a381456bdd51bf14637f8a9edfc50faea","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","tsc":"tsc","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose","test:perf":"node ./tests/perf/performance.test.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","prepublishOnly":"npm run build"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","actor":{"name":"jolly-good","type":"user","email":"peter@jensen.wtf"},"email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","minio":"^8.0.5","tslib":"^2.8.1","dotenv":"^16.4.7","eslint":"^9.26.0","rimraf":"^6.0.1","rollup":"^4.34.8","globals":"^16.0.0","ts-jest":"^29.2.6","prettier":"^3.5.2","tinybench":"^4.0.1","@eslint/js":"^9.26.0","typescript":"^5.7.3","@types/node":"^22.15.14","@eslint/eslintrc":"^3.3.1","rollup-plugin-dts":"^6.1.1","@aws-sdk/client-s3":"^3.802.0","@rollup/plugin-terser":"^0.4.4","eslint-config-prettier":"^10.0.1","@rollup/plugin-typescript":"^12.1.2","@typescript-eslint/parser":"^8.25.0","@rollup/plugin-node-resolve":"^16.0.0","@typescript-eslint/eslint-plugin":"^8.25.0","@monstermann/tinybench-pretty-printer":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.3.0_1750603332449_0.8807143995138469","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"s3mini","version":"0.4.0","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Azure Blob Storage","Google Cloud Storage","Ceph","mibion","backblaze"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.4.0","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"78864b62c994d1d68dcd691ccef5dcb8be4b5aaf","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.4.0.tgz","fileCount":13,"integrity":"sha512-PHvHiwuGxLuyofnOlxSEPnU1uP52Rf/7jM2oOPSaoBbssPmkgNAFXHDMozNyr76jN9wsgMTpgGp2XM5AKbZzRQ==","signatures":[{"sig":"MEQCIHqrdrbC9lul9KsrVMfx52E1OusWZN/zKntlAjmpueyQAiANbEOEa0DOW2qI71eL2GpcDDIrArP6c6YFWXUfOB4mlg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":232401},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"73173e7c508b68d76c9e1e7aef0aa41d1e6dabe9","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","tsc":"tsc","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose","test:perf":"node ./tests/perf/performance.test.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","prepublishOnly":"npm run build"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","actor":{"name":"jolly-good","type":"user","email":"peter@jensen.wtf"},"email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.3","minio":"^8.0.5","tslib":"^2.8.1","dotenv":"^17.0.0","eslint":"^9.30.0","rimraf":"^6.0.1","rollup":"^4.44.1","globals":"^16.3.0","ts-jest":"^29.4.0","prettier":"^3.6.2","tinybench":"^4.0.1","@eslint/js":"^9.30.0","typescript":"^5.8.3","@types/node":"^24.0.8","@eslint/eslintrc":"^3.3.1","rollup-plugin-dts":"^6.2.1","@aws-sdk/client-s3":"^3.840.0","@rollup/plugin-terser":"^0.4.4","eslint-config-prettier":"^10.1.5","@rollup/plugin-typescript":"^12.1.4","@typescript-eslint/parser":"^8.35.1","@rollup/plugin-node-resolve":"^16.0.1","@typescript-eslint/eslint-plugin":"^8.35.1","@monstermann/tinybench-pretty-printer":"^0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.4.0_1751376704174_0.4697365362257966","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"s3mini","version":"0.5.0","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Azure Blob Storage","Google Cloud Storage","Ceph","mibion","backblaze"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.5.0","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"e160bf65122694a1d7a823671429ef0744f491a7","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.5.0.tgz","fileCount":13,"integrity":"sha512-90sErR8ND4lN5DWMCnrThw7v6cxzjVXRhvFGiZ1mKwQZG5eYh/5FyD6GnahnbHfuQn4gCLbOc+2B5WsCwoZtkQ==","signatures":[{"sig":"MEUCIQDsNQez86XKJke5h2mwLHKoIVfyVTue3EeHmpSDdvb0rAIgf4zCNxJhf0smAFxBPoM6Q9QuVHFdjrgj1cXesHXmTno=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":271788},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"95734c1ec3832a0604d0825e8e1f23c1f0a99279","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","tsc":"tsc","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose","test:perf":"node ./tests/perf/performance.test.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","prepublishOnly":"npm run build"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"overrides":{"glob":"^11.0.3"},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.3","minio":"^8.0.5","dotenv":"^17.0.0","eslint":"^9.30.0","rimraf":"^6.0.1","rollup":"^4.46.1","s3mini":"^0.4.0","prettier":"^3.6.2","tinybench":"^5.0.0","@eslint/js":"^9.30.0","typescript":"^5.8.3","@types/node":"^24.3.0","@aws-lite/s3":"^0.2.6","@aws-lite/client":"^0.23.2","@eslint/eslintrc":"^3.3.1","rollup-plugin-dts":"^6.2.3","@aws-sdk/client-s3":"^3.872.0","@rollup/plugin-terser":"^0.4.4","console-table-printer":"^2.14.6","eslint-config-prettier":"^10.1.5","@rollup/plugin-typescript":"^12.1.4","@typescript-eslint/parser":"^8.40.0","@rollup/plugin-node-resolve":"^16.0.1","@typescript-eslint/eslint-plugin":"^8.40.0"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.5.0_1756130597705_0.8177718111533132","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"s3mini","version":"0.6.0","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Azure Blob Storage","Google Cloud Storage","Ceph","mibion","backblaze"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.6.0","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"e95fab9af60c1ea360d5429de45730c3374cb744","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.6.0.tgz","fileCount":13,"integrity":"sha512-GcZPMOzeiokra9ssElssLhGfgUBq42nemnKTwdYOzHGK9S3YOuNeKxIT0qforkz1GvuoDnGp+HHqTkkoMLyCNw==","signatures":[{"sig":"MEQCIDQRZBknqvBFDy+5+3HpxkISjleXUOm6RD1s65ZzbzNIAiBlTxKtumG4zsYV/d8l6ZS8sOIz/xBOW2GGailUDbK+4g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":271660},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"c3d31feb34b34052a8d25d97af5769713bc2803d","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","tsc":"tsc","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose","test:perf":"node ./tests/perf/performance.test.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","prepublishOnly":"npm run build"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"overrides":{"glob":"^11.0.3"},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","minio":"^8.0.6","dotenv":"^17.2.3","eslint":"^9.37.0","rimraf":"^6.0.1","rollup":"^4.52.4","s3mini":"^0.5.0","prettier":"^3.6.2","tinybench":"^5.0.1","@eslint/js":"^9.37.0","typescript":"^5.9.3","@types/node":"^24.7.2","@aws-lite/s3":"^0.2.6","@aws-lite/client":"^0.23.2","@eslint/eslintrc":"^3.3.1","rollup-plugin-dts":"^6.2.3","@aws-sdk/client-s3":"^3.908.0","@rollup/plugin-terser":"^0.4.4","console-table-printer":"^2.14.6","eslint-config-prettier":"^10.1.5","@rollup/plugin-typescript":"^12.1.4","@typescript-eslint/parser":"^8.46.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"^8.46.0"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.6.0_1760348004839_0.4108444617863076","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"s3mini","version":"0.7.0","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Oracle Cloud Infrastructure","OCI Object Storage","Azure Blob Storage","Google Cloud Storage","Ceph","backblaze","scaleway","digitalocean","minio"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.7.0","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"c3a6f552b8515d5059a990e6257393015627e7a5","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.7.0.tgz","fileCount":13,"integrity":"sha512-f0oNjWm1gMkv0iF/ad11x69n3S/F3sdFlSRTy/AnQKrhayoVGBYQ30uSP7X/yIyhptqIvT38CaEgKUqZGxNAig==","signatures":[{"sig":"MEUCIA39J7APPAEyxKFl2xCbfR2pEp2Ey00E9eb2iv4YfLNdAiEA9AJD8Gc8dl2vL/HPsrkp9JLyssp9L0+gVET+tsN14T8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":272984},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"700597064bb60ad4d3bf62c1f88323002f003b6a","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","tsc":"tsc","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose","test:perf":"node ./tests/perf/performance.test.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","prepublishOnly":"npm run build"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"overrides":{"glob":"12.0.0"},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.2.0","minio":"8.0.6","dotenv":"17.2.3","eslint":"9.39.1","rimraf":"6.1.0","rollup":"4.53.2","s3mini":"0.6.0","prettier":"3.6.2","tinybench":"5.1.0","@eslint/js":"9.39.1","typescript":"5.9.3","@types/node":"24.10.1","@aws-lite/s3":"0.2.6","@aws-lite/client":"^0.23.2","@eslint/eslintrc":"3.3.1","rollup-plugin-dts":"6.2.3","@aws-sdk/client-s3":"3.933.0","@rollup/plugin-terser":"0.4.4","console-table-printer":"2.15.0","eslint-config-prettier":"10.1.8","@rollup/plugin-typescript":"12.3.0","@typescript-eslint/parser":"8.47.0","@rollup/plugin-node-resolve":"16.0.3","@typescript-eslint/eslint-plugin":"8.47.0"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.7.0_1763461292045_0.9948523668354166","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"s3mini","version":"0.7.1","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Oracle Cloud Infrastructure","OCI Object Storage","Azure Blob Storage","Google Cloud Storage","Ceph","backblaze","scaleway","digitalocean","minio"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.7.1","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"739a31024865b60b2eda8d3ad45c0cd1c8c1b307","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.7.1.tgz","fileCount":13,"integrity":"sha512-6TfOdi+mfqmshJ0vJOfQyoSPY9hxElOEyrU0AyhQaEOSn9BGEN/V+pkBrxM219hNcz97j4laATzNWJbTCKlNDQ==","signatures":[{"sig":"MEUCIEEadC1dVfeOUH5f+9xisOBuOG0eXQ15xB8O5V6c0pAwAiEAp+R8JxSTMl+aiU9e0lA3s+PDz4TPX0FGHbLoBJjYB24=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":273208},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"fb8b4a59a8b43957d74c43691144cba5fa0b5e9e","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","tsc":"tsc","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose","test:perf":"node ./tests/perf/performance.test.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","prepublishOnly":"npm run build"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"overrides":{"glob":"13.0.0"},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.2.0","minio":"8.0.6","dotenv":"17.2.3","eslint":"9.39.1","rimraf":"6.1.2","rollup":"4.53.3","s3mini":"0.7.0","prettier":"3.7.2","tinybench":"5.1.0","@eslint/js":"9.39.1","typescript":"5.9.3","@types/node":"24.10.1","@aws-lite/s3":"0.2.6","@aws-lite/client":"^0.23.2","@eslint/eslintrc":"3.3.3","rollup-plugin-dts":"6.3.0","@aws-sdk/client-s3":"3.940.0","@rollup/plugin-terser":"0.4.4","console-table-printer":"2.15.0","eslint-config-prettier":"10.1.8","@rollup/plugin-typescript":"12.3.0","@typescript-eslint/parser":"8.48.0","@rollup/plugin-node-resolve":"16.0.3","@typescript-eslint/eslint-plugin":"8.48.0"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.7.1_1764434845321_0.41925960942844753","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"s3mini","version":"0.8.0","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Oracle Cloud Infrastructure","OCI Object Storage","Azure Blob Storage","Google Cloud Storage","Ceph","backblaze","scaleway","digitalocean","minio"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.8.0","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"13f7c5db30fce8c0b93a2d87e5127243ad4948f2","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.8.0.tgz","fileCount":13,"integrity":"sha512-xFoM4ZW98I4fqdYVZz/ptC8JGX3dAgfveK90rMMo+2tS4ylloYTmQt/Wx6uBDA2uwHHNxuCVb1b5yMyRpU10Eg==","signatures":[{"sig":"MEUCIDVOOvPSXWLjtp7fT5Lgqo4JoHyA+OkTVbWUpvTU9XJ8AiEAvJcGVcwLX3i9JUj2HeuFEgIKznDI9jJPmD1SaccRLlM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":281743},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"003be2053d236dd3b7c6d1baad93e44583802f22","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","tsc":"tsc","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose","test:perf":"node ./tests/perf/performance.test.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","prepublishOnly":"npm run build"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"overrides":{"glob":"13.0.0"},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.2.0","minio":"8.0.6","dotenv":"17.2.3","eslint":"9.39.1","rimraf":"6.1.2","rollup":"4.53.3","s3mini":"0.7.1","prettier":"3.7.4","tinybench":"6.0.0","@eslint/js":"9.39.1","typescript":"5.9.3","@aws-lite/s3":"0.2.6","@aws-lite/client":"^0.23.2","@eslint/eslintrc":"3.3.3","rollup-plugin-dts":"6.3.0","@aws-sdk/client-s3":"3.948.0","@rollup/plugin-terser":"0.4.4","console-table-printer":"2.15.0","eslint-config-prettier":"10.1.8","@rollup/plugin-typescript":"12.3.0","@typescript-eslint/parser":"8.49.0","@rollup/plugin-node-resolve":"16.0.3","@typescript-eslint/eslint-plugin":"8.49.0"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.8.0_1765392933811_0.06655807479230647","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"s3mini","version":"0.8.1","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Oracle Cloud Infrastructure","OCI Object Storage","Azure Blob Storage","Google Cloud Storage","Ceph","backblaze","scaleway","digitalocean","minio"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.8.1","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"b962c85c8af50c36800ee48e289d81cf91441f84","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.8.1.tgz","fileCount":13,"integrity":"sha512-RQYrtx6qTzXCcJsxLMGNmfO+av2mbhMq/8U26Ao0PmYje53SAULIpm2+dFa/rQNqetS2pAVavJYslpIjWNdudQ==","signatures":[{"sig":"MEUCIQDj9YRYVTYdWMtNggFqPArmyh589WWF1pdR1rlc+84hkgIgdOe6Gp5bVZR/+xM5vi7zSAaEBOn3A6u4yjzC32lYgEk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":282978},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"8a133739677a71ccc30e0661fffb8ff80ccf4ec9","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","tsc":"tsc","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose","test:perf":"node ./tests/perf/performance.test.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","prepublishOnly":"npm run build"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"overrides":{"glob":"13.0.0"},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.2.0","minio":"8.0.6","dotenv":"17.2.3","eslint":"9.39.2","rimraf":"6.1.2","rollup":"4.54.0","s3mini":"0.8.0","prettier":"3.7.4","tinybench":"6.0.0","@eslint/js":"9.39.2","typescript":"5.9.3","@aws-lite/s3":"0.2.6","@aws-lite/client":"^0.23.2","@eslint/eslintrc":"3.3.3","rollup-plugin-dts":"6.3.0","@aws-sdk/client-s3":"3.956.0","@rollup/plugin-terser":"0.4.4","console-table-printer":"2.15.0","eslint-config-prettier":"10.1.8","@rollup/plugin-typescript":"12.3.0","@typescript-eslint/parser":"8.50.0","@rollup/plugin-node-resolve":"16.0.3","@typescript-eslint/eslint-plugin":"8.50.0"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.8.1_1766260978678_0.9469368952499198","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"s3mini","version":"0.9.0","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Oracle Cloud Infrastructure","OCI Object Storage","Azure Blob Storage","Google Cloud Storage","Ceph","backblaze","scaleway","digitalocean","minio"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.9.0","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"abb327103445759a5ad321b210ee594448f03dac","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.9.0.tgz","fileCount":13,"integrity":"sha512-R88F9ZYZKn2OJNbk/lnUBEpgoUJ7egMR35ZZowMVT3ltvsydRZDK8tMDNlkhCPJ+jvl2yZH2J92Cap+2yTzsFA==","signatures":[{"sig":"MEUCIQDAp1D2zZ+rO2fGiRcLO2YQBFPGZ8Ml2opc+IBwMDpwGwIgLnRF9L49ovB2IgDKNStzbuyAM+Vm6954vzCidT540LM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":284090},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"a9147905a14c9909dda47d863f45b6837293791f","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","tsc":"tsc","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"npm run test:public && npm run test:providers","test:perf":"node ./tests/perf/performance.test.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","test:public":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.public.js --verbose","prepublishOnly":"npm run build","test:providers":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"overrides":{"glob":"13.0.0"},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"11.6.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.2.0","minio":"8.0.6","dotenv":"17.2.3","eslint":"9.39.2","rimraf":"6.1.2","rollup":"4.54.0","s3mini":"0.8.1","prettier":"3.7.4","tinybench":"6.0.0","@eslint/js":"9.39.2","typescript":"5.9.3","@aws-lite/s3":"0.2.6","@aws-lite/client":"^0.23.2","@eslint/eslintrc":"3.3.3","rollup-plugin-dts":"6.3.0","@aws-sdk/client-s3":"3.957.0","@rollup/plugin-terser":"0.4.4","console-table-printer":"2.15.0","eslint-config-prettier":"10.1.8","@rollup/plugin-typescript":"12.3.0","@typescript-eslint/parser":"8.50.1","@rollup/plugin-node-resolve":"16.0.3","@typescript-eslint/eslint-plugin":"8.50.1"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.9.0_1766459798019_0.20745578042548396","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"s3mini","version":"0.9.1","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Oracle Cloud Infrastructure","OCI Object Storage","Azure Blob Storage","Google Cloud Storage","Ceph","backblaze","scaleway","digitalocean","minio"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.9.1","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"1801626b0044bbc7661445f568ae5cec05020a27","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.9.1.tgz","fileCount":13,"integrity":"sha512-aIsdMFbNEjA10KRRTWuEn52zX8kkB5ByrWOoyZg/WFrsMLqGbypTf0y2M7DdltoKkl+FYzl3g/SXJLvVZ54eXw==","signatures":[{"sig":"MEQCIBLVIOmHrU9x7woJdBc0V+m03kB0WFvY+DA9sgL5JBZtAiBlNrVcvaiDppRQKvKocuQHCNnJkRg3TCiN97jUlqMNIw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":323254},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"06cf6c26ecc0c73315053069c5ccf63ef4523ba7","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","tsc":"tsc","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"npm run test:public && npm run test:providers","test:perf":"node ./tests/perf/performance.test.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","test:public":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.public.js --verbose","prepublishOnly":"npm run build","test:providers":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"overrides":{"glob":"13.0.0"},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"11.6.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.2.0","minio":"8.0.6","dotenv":"17.2.3","eslint":"9.39.2","rimraf":"6.1.2","rollup":"4.55.1","s3mini":"0.9.0","prettier":"3.7.4","tinybench":"6.0.0","@eslint/js":"9.39.2","typescript":"5.9.3","@aws-lite/s3":"0.2.6","@aws-lite/client":"^0.23.2","@eslint/eslintrc":"3.3.3","rollup-plugin-dts":"6.3.0","@aws-sdk/client-s3":"3.968.0","@rollup/plugin-terser":"0.4.4","console-table-printer":"2.15.0","eslint-config-prettier":"10.1.8","@rollup/plugin-typescript":"12.3.0","@typescript-eslint/parser":"8.53.0","@rollup/plugin-node-resolve":"16.0.3","@typescript-eslint/eslint-plugin":"8.53.0"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.9.1_1768466434814_0.3293154872980528","host":"s3://npm-registry-packages-npm-production"}},"0.9.2":{"name":"s3mini","version":"0.9.2","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Oracle Cloud Infrastructure","OCI Object Storage","Azure Blob Storage","Google Cloud Storage","Ceph","backblaze","scaleway","digitalocean","minio"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.9.2","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"2f52aca49fe08c7a3b674d0c379caf481b4af3dc","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.9.2.tgz","fileCount":13,"integrity":"sha512-WqfUFirHSWJeZ7EhfcvjioJ8olecb/4N9CraUGY9hWGshehl1l/hX+eU+ZqJw4bKNqGIvOGT/rVCHchX1mQR6Q==","signatures":[{"sig":"MEQCIBIbwICx7IXaHEhfl2w0/0wHwGfmeHY1LYjKwKqfvrZbAiBAyyWRuYadS83Fcrprc4CCdLiUVOTBELtdrj1Co7NmWA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":354031},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"3fbee85c66e6e46c3ec3a6087129b2b3dd914dad","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"npm run test:public && npm run test:providers","test:perf":"node ./tests/perf/performance.test.js","test:unit":"node --experimental-vm-modules node_modules/jest/bin/jest.js --testMatch='<rootDir>/tests/presigned-url.test.js' --verbose","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","test:public":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.public.js --verbose","prepublishOnly":"npm run build","test:providers":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"overrides":{"glob":"13.0.0"},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"11.6.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"25.2.1","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.3.0","minio":"8.0.7","dotenv":"17.3.1","eslint":"10.1.0","rimraf":"6.1.3","rollup":"4.60.0","s3mini":"0.9.1","prettier":"3.8.1","tinybench":"6.0.0","@eslint/js":"^10.0.1","typescript":"5.9.3","@aws-lite/s3":"0.2.6","@aws-lite/client":"0.23.5","rollup-plugin-dts":"6.4.1","typescript-eslint":"8.57.1","@aws-sdk/client-s3":"3.1014.0","@rollup/plugin-terser":"1.0.0","console-table-printer":"2.15.0","eslint-config-prettier":"^10.1.8","@rollup/plugin-typescript":"12.3.0","@rollup/plugin-node-resolve":"16.0.3"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.9.2_1774290744534_0.4128293615576317","host":"s3://npm-registry-packages-npm-production"}},"0.9.3":{"name":"s3mini","version":"0.9.3","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Oracle Cloud Infrastructure","OCI Object Storage","Azure Blob Storage","Google Cloud Storage","Ceph","backblaze","scaleway","digitalocean","minio"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.9.3","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"0d926d2efafa8702be233b4a7df13b281a7a6cdb","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.9.3.tgz","fileCount":13,"integrity":"sha512-uJOYN+aADjRJBLEWD8eq4SZGgOa3JNOPBLJBVf56SVtk34YI8kGqwEbVpEaxWUOYwhEJHfGdj4cnbA9PGTteRQ==","signatures":[{"sig":"MEQCIBpKPvDMROEzulwyVgdMqL3xmYx8pxyZiou29wzQ2XVuAiBdXxsDyFM44upzGCBTfzS6JUb5bp6+5HsdSoOGSNlZeg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":358899},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"90b3cc6c5374b6c63460ca64b9c3feaae669e88f","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"npm run test:public && npm run test:providers","test:perf":"node ./tests/perf/performance.test.js","test:unit":"node --experimental-vm-modules node_modules/jest/bin/jest.js --testMatch='<rootDir>/tests/presigned-url.test.js' --verbose","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","test:public":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.public.js --verbose","prepublishOnly":"npm run build","test:providers":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"overrides":{"glob":"13.0.0"},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.3.0","minio":"8.0.7","dotenv":"17.3.1","eslint":"10.1.0","rimraf":"6.1.3","rollup":"4.60.0","s3mini":"0.9.1","prettier":"3.8.1","tinybench":"6.0.0","@eslint/js":"^10.0.1","typescript":"5.9.3","@aws-lite/s3":"0.2.6","@aws-lite/client":"0.23.5","rollup-plugin-dts":"6.4.1","typescript-eslint":"8.57.1","@aws-sdk/client-s3":"3.1014.0","@rollup/plugin-terser":"1.0.0","console-table-printer":"2.15.0","eslint-config-prettier":"^10.1.8","@rollup/plugin-typescript":"12.3.0","@rollup/plugin-node-resolve":"16.0.3"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.9.3_1775549722294_0.6901045169943367","host":"s3://npm-registry-packages-npm-production"}},"0.9.4":{"name":"s3mini","version":"0.9.4","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Oracle Cloud Infrastructure","OCI Object Storage","Azure Blob Storage","Google Cloud Storage","Ceph","backblaze","scaleway","digitalocean","minio"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.9.4","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://github.com/good-lly/s3mini","bugs":{"url":"https://github.com/good-lly/s3mini/issues"},"dist":{"shasum":"d790ad52a31e193d6e5777fdcce2d1953975eca5","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.9.4.tgz","fileCount":13,"integrity":"sha512-lA6p6JY0+lbcz/NJL8O/BKU8q96iA3f+wDO/QCg4QxOooEJwe0fomHZoeDJhs8TDDRTA40OVNY2E9wOQgAoAVw==","signatures":[{"sig":"MEQCIB4/SjzNMh7En+ukooh+VYLBOyZlnnYzyBvf5xpcFPMaAiAgcT/hVWZulNVB5PtKtwxM4Qfli2lcHp164xushixcxw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":390685},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"cf1eb3f65403a29456920f693de46fe1cb86d6f9","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"npm run test:public && npm run test:providers","test:perf":"node ./tests/perf/performance.test.js","test:unit":"node --experimental-vm-modules node_modules/jest/bin/jest.js --testMatch='<rootDir>/tests/{presigned-url,extract-bucket-name}.test.js' --verbose","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","test:public":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.public.js --verbose","test:e2e:bun":"npm run test:public:bun && npm run test:providers:bun","test:unit:bun":"bun test tests/presigned-url.test.js tests/extract-bucket-name.test.js","prepublishOnly":"npm run build","test:providers":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose","test:public:bun":"bun test tests/anonymous-access.test.js","test:providers:bun":"bun tests/run-bun.js tests/minio.test.js tests/hetzner.test.js tests/cloudflare.test.js tests/aws.test.js tests/backblaze.test.js tests/digitalocean.test.js tests/garage.test.js tests/oracle.test.js tests/scaleway.test.js tests/ceph.test.js tests/custom-fetch.test.js"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"overrides":{"glob":"13.0.0"},"repository":{"url":"git+https://github.com/good-lly/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.3.0","minio":"8.0.7","dotenv":"17.4.1","eslint":"10.2.0","rimraf":"6.1.3","rollup":"4.60.1","s3mini":"0.9.3","prettier":"3.8.1","tinybench":"6.0.0","@eslint/js":"^10.0.1","typescript":"6.0.2","@aws-lite/s3":"0.2.6","@aws-lite/client":"0.23.5","rollup-plugin-dts":"6.4.1","typescript-eslint":"8.58.1","@aws-sdk/client-s3":"3.1026.0","@rollup/plugin-terser":"1.0.0","console-table-printer":"2.15.0","eslint-config-prettier":"^10.1.8","@rollup/plugin-typescript":"12.3.0","@rollup/plugin-node-resolve":"16.0.3"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.9.4_1775653742016_0.24408744052019027","host":"s3://npm-registry-packages-npm-production"}},"0.9.5":{"name":"s3mini","version":"0.9.5","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Oracle Cloud Infrastructure","OCI Object Storage","Azure Blob Storage","Google Cloud Storage","Ceph","backblaze","scaleway","digitalocean","minio"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@0.9.5","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://codeberg.org/thinking_tools/s3mini","bugs":{"url":"https://codeberg.org/thinking_tools/s3mini/issues"},"dist":{"shasum":"6c3062f74f7f98e88612c423ceeb3807dc146e71","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-0.9.5.tgz","fileCount":13,"integrity":"sha512-TQ6RXz4eFzCAappzwHSfjgZ4YZMrJ/+mtVcSlc7tkL1wrPf/INZ3eOcVPJk65MAYZf7ueMbHCYjYmzkdkCAPSg==","signatures":[{"sig":"MEUCIFjGjxoz92yPj/eN6+NF9Mf1VTjON5lOH0AXsGtSXIV9AiEAshy3U785srjyiohU7vV5UqbFZ3PuyXmy883K3qxAXfk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":392678},"main":"dist/s3mini.min.js","type":"module","types":"dist/s3mini.d.ts","module":"dist/s3mini.js","engines":{"node":">=20"},"exports":{".":{"import":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js","development":"./dist/s3mini.js"},"require":{"types":"./dist/s3mini.d.ts","default":"./dist/s3mini.min.js"}}},"gitHead":"722d813cab832137a0924706f059dcb72df27b17","private":false,"scripts":{"dev":"npm run clean && npm run typecheck -w && rollup -c -w","lint":"eslint src --ext .ts","build":"npm run clean && npm run typecheck && rollup -c","clean":"rimraf dist","format":"prettier -w src","test:e2e":"npm run test:public && npm run test:providers","test:perf":"node ./tests/perf/performance.test.js","test:unit":"node --experimental-vm-modules node_modules/jest/bin/jest.js --testMatch='<rootDir>/tests/{presigned-url,extract-bucket-name}.test.js' --verbose","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","test:public":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.public.js --verbose","test:e2e:bun":"npm run test:public:bun && npm run test:providers:bun","test:unit:bun":"bun test tests/presigned-url.test.js tests/extract-bucket-name.test.js","prepublishOnly":"npm run build","test:providers":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose","test:public:bun":"bun test tests/anonymous-access.test.js","test:providers:bun":"bun tests/run-bun.js tests/minio.test.js tests/hetzner.test.js tests/cloudflare.test.js tests/aws.test.js tests/backblaze.test.js tests/digitalocean.test.js tests/garage.test.js tests/oracle.test.js tests/scaleway.test.js tests/ceph.test.js tests/custom-fetch.test.js"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"overrides":{"glob":"13.0.0"},"repository":{"url":"git+https://codeberg.org/thinking_tools/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.3.0","minio":"8.0.7","dotenv":"17.4.1","eslint":"10.2.0","rimraf":"6.1.3","rollup":"4.60.1","s3mini":"0.9.3","prettier":"3.8.1","tinybench":"6.0.0","@eslint/js":"^10.0.1","typescript":"6.0.2","@aws-lite/s3":"0.2.6","@aws-lite/client":"0.23.5","rollup-plugin-dts":"6.4.1","typescript-eslint":"8.58.1","@aws-sdk/client-s3":"3.1026.0","@rollup/plugin-terser":"1.0.0","console-table-printer":"2.15.0","eslint-config-prettier":"^10.1.8","@rollup/plugin-typescript":"12.3.0","@rollup/plugin-node-resolve":"16.0.3"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_0.9.5_1779634484261_0.5056310636186803","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"s3mini","version":"1.0.0","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Oracle Cloud Infrastructure","OCI Object Storage","Azure Blob Storage","Google Cloud Storage","Ceph","backblaze","scaleway","digitalocean","minio"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@1.0.0","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://codeberg.org/thinking_tools/s3mini","bugs":{"url":"https://codeberg.org/thinking_tools/s3mini/issues"},"dist":{"shasum":"5d87ff7ff58c35eab6fc4926c8f6c201c1f4bf90","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-1.0.0.tgz","fileCount":10,"integrity":"sha512-/lMtusIFZzpX5T0sti3aMxDD5gTcPRBSUWMP6q2hrx+NeDSJVUgzF4shoF1e2JOklx2C5xbsO70fgYZko0vsZw==","signatures":[{"sig":"MEQCIG6BgikdFntyvyKaWKsUOIWlhc5XVzeZbeIG/RPOIfhBAiA6f7FowbeQ15hi7VfAqXyXYo34cjV31EsMcTfAtUEaDA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":280531},"type":"module","tsdown":{"dts":true,"clean":true,"entry":["./src/index.ts"],"exports":true},"engines":{"node":">=20"},"exports":{".":"./dist/index.mjs","./package.json":"./package.json"},"gitHead":"73a64181769cb73eb897a636f00f49bc6f143a0e","private":false,"scripts":{"dev":"tsdown --watch","lint":"eslint src --ext .ts","build":"npm run typecheck && tsdown","format":"prettier -w src","test:e2e":"npm run test:public && npm run test:providers","test:perf":"node ./tests/perf/performance.test.js","test:unit":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.unit.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","test:public":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.public.js --verbose","test:e2e:bun":"npm run test:public:bun && npm run test:providers:bun","test:unit:bun":"bun test tests/presigned-url.test.js tests/extract-bucket-name.test.js","prepublishOnly":"npm run build","test:providers":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose --bail","test:bun-native":"bun tests/run-bun.js tests/bun-native.test.js","test:public:bun":"bun test tests/anonymous-access.test.js","test:providers:bun":"bun tests/run-bun.js tests/minio.test.js tests/hetzner.test.js tests/cloudflare.test.js tests/aws.test.js tests/backblaze.test.js tests/digitalocean.test.js tests/garage.test.js tests/oracle.test.js tests/scaleway.test.js tests/ceph.test.js tests/custom-fetch.test.js tests/bun-native.test.js"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"repository":{"url":"git+https://codeberg.org/thinking_tools/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.4.2","minio":"8.0.7","dotenv":"17.4.2","eslint":"10.8.0","s3mini":"0.9.5","tsdown":"0.22.14","prettier":"3.9.6","tinybench":"6.1.2","@eslint/js":"10.0.1","typescript":"6.0.3","@babel/core":"7.29.7","@aws-lite/s3":"0.2.7","@aws-lite/client":"0.23.7","typescript-eslint":"8.66.0","@aws-sdk/client-s3":"3.1103.0","console-table-printer":"2.16.1","eslint-config-prettier":"10.1.8","@babel/preset-typescript":"7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_1.0.0_1785931375165_0.2462516184380923","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"s3mini","version":"1.0.1","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Oracle Cloud Infrastructure","OCI Object Storage","Azure Blob Storage","Google Cloud Storage","Ceph","backblaze","scaleway","digitalocean","minio"],"author":{"name":"good-lly"},"license":"MIT","_id":"s3mini@1.0.1","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"homepage":"https://code.nolog.cz/thinking.tools/s3mini","bugs":{"url":"https://code.nolog.cz/thinking.tools/s3mini/issues"},"dist":{"shasum":"43ee1899c99e9ee5f93168b56b9bb82c71d174c6","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-1.0.1.tgz","fileCount":10,"integrity":"sha512-8pY0DywQqL+DL6jUpfeRQRDCOIjnm8UrQwyTRgYTjsVBqeNJDhs44nCorqMtanJ79DMxL6igbGSKrih2u5xV6g==","signatures":[{"sig":"MEQCIF5YTH5C7p8W2XpImnZgwLlZFeqhhDV+1nwKFVfQtWSWAiBekve5GMrkYkey7AH0Gm8ZUt+PgJRRkpVrlHHmPqAd3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":281411},"type":"module","tsdown":{"dts":true,"clean":true,"entry":["./src/index.ts"],"exports":true},"engines":{"node":">=20"},"exports":{".":"./dist/index.mjs","./package.json":"./package.json"},"gitHead":"566d0b3a6ed2ed0ab1ff3dcd00726ebb8d4be5c5","private":false,"scripts":{"dev":"tsdown --watch","lint":"eslint src --ext .ts","build":"npm run typecheck && tsdown","format":"prettier -w src","test:e2e":"npm run test:public && npm run test:providers","test:perf":"node ./tests/perf/performance.test.js","test:unit":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.unit.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","test:memory":"node --expose-gc ./tests/perf/memory.test.js","test:public":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.public.js --verbose","test:e2e:bun":"npm run test:public:bun && npm run test:providers:bun","test:unit:bun":"bun test tests/presigned-url.test.js tests/extract-bucket-name.test.js","prepublishOnly":"npm run build","test:providers":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose --bail","test:bun-native":"bun tests/run-bun.js tests/bun-native.test.js","test:public:bun":"bun test tests/anonymous-access.test.js","test:providers:bun":"bun tests/run-bun.js tests/minio.test.js tests/hetzner.test.js tests/cloudflare.test.js tests/aws.test.js tests/backblaze.test.js tests/digitalocean.test.js tests/garage.test.js tests/oracle.test.js tests/scaleway.test.js tests/ceph.test.js tests/custom-fetch.test.js tests/bun-native.test.js"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"repository":{"url":"git+https://code.nolog.cz/thinking.tools/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.5.1","minio":"8.0.7","dotenv":"17.4.2","eslint":"10.9.1","s3mini":"1.0.0","tsdown":"0.22.14","prettier":"3.9.6","tinybench":"6.1.4","@eslint/js":"10.0.1","typescript":"6.0.3","@babel/core":"7.29.7","@aws-lite/s3":"0.2.7","@aws-lite/client":"0.23.7","typescript-eslint":"8.69.0","@aws-sdk/client-s3":"3.1124.0","console-table-printer":"2.16.1","eslint-config-prettier":"10.1.8","@babel/preset-typescript":"7.29.7"},"_npmOperationalInternal":{"tmp":"tmp/s3mini_1.0.1_1788337339338_0.4389619452006963","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"_id":"s3mini@1.0.2","bugs":{"url":"https://code.nolog.cz/thinking.tools/s3mini/issues"},"dist":{"shasum":"a2c705b36a07437cd460cc081e1a8073ce9fa833","tarball":"https://registry.npmjs.org/s3mini/-/s3mini-1.0.2.tgz","fileCount":10,"integrity":"sha512-/c/dlK7JDijEbCmrXQ6M/Z6uiRpYTw2XKX01RzZwVuwE0x3ORo+Cyf1t99cIEBXvv3L9iqRQD7INy/wAXLLY2A==","signatures":[{"sig":"MEUCIFiCQ8mdSnvjOUfOIIyeHnA/4YWhko7rbPYZrKJS2UF/AiEA7ToxnTsZBqJyG29iZlBBeM1zBLGnBoMmLAwxoviAgv4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCE6gp5KmZjIV+QgrldRp0fMGT9h4RBvqg16fNK995J/AIgf3oe7OphLzIFNciefNDB9W7MQcJA2/9yTwPrGDhZhmo="}],"unpackedSize":281530},"main":"./dist/index.mjs","name":"s3mini","type":"module","types":"./dist/index.d.mts","author":{"name":"good-lly"},"module":"./dist/index.mjs","tsdown":{"dts":true,"clean":true,"entry":["./src/index.ts"],"exports":{"legacy":true}},"engines":{"node":">=20"},"exports":{".":"./dist/index.mjs","./package.json":"./package.json"},"gitHead":"0560905956b7807dde11745c7404a8e0dd2eeb1a","license":"MIT","private":false,"scripts":{"dev":"tsdown --watch","lint":"eslint src --ext .ts","build":"npm run typecheck && tsdown","format":"prettier -w src","test:e2e":"npm run test:public && npm run test:providers","test:perf":"node ./tests/perf/performance.test.js","test:unit":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.unit.js","typecheck":"tsc --noEmit","formatcheck":"prettier --list-different src","test:memory":"node --expose-gc ./tests/perf/memory.test.js","test:public":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.public.js --verbose","test:e2e:bun":"npm run test:public:bun && npm run test:providers:bun","test:unit:bun":"bun test tests/presigned-url.test.js tests/extract-bucket-name.test.js","prepublishOnly":"npm run build","test:providers":"node --experimental-vm-modules node_modules/jest/bin/jest.js --config jest.config.js --verbose --bail","test:bun-native":"bun tests/run-bun.js tests/bun-native.test.js","test:public:bun":"bun test tests/anonymous-access.test.js","test:providers:bun":"bun tests/run-bun.js tests/minio.test.js tests/hetzner.test.js tests/cloudflare.test.js tests/aws.test.js tests/backblaze.test.js tests/digitalocean.test.js tests/garage.test.js tests/oracle.test.js tests/scaleway.test.js tests/ceph.test.js tests/custom-fetch.test.js tests/bun-native.test.js"},"targets":{"bun":true,"edge":true,"node":20,"worker":true,"browser":false},"version":"1.0.2","_npmUser":{"name":"jolly-good","email":"peter@jensen.wtf"},"homepage":"https://code.nolog.cz/thinking.tools/s3mini","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Oracle Cloud Infrastructure","OCI Object Storage","Azure Blob Storage","Google Cloud Storage","Ceph","backblaze","scaleway","digitalocean","minio"],"prettier":{"semi":true,"tabWidth":2,"endOfLine":"lf","printWidth":120,"arrowParens":"avoid","singleQuote":true,"trailingComma":"all","bracketSpacing":true,"bracketSameLine":false},"repository":{"url":"git+https://code.nolog.cz/thinking.tools/s3mini.git","type":"git"},"_npmVersion":"10.9.2","description":"👶 Tiny & fast S3 client for node and edge computing platforms","directories":{},"maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"sideEffects":false,"_nodeVersion":"22.14.0","engineStrict":true,"publishConfig":{"registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.5.1","minio":"8.0.7","dotenv":"17.4.2","eslint":"10.9.1","s3mini":"1.0.0","tsdown":"0.22.14","prettier":"3.9.6","tinybench":"6.1.4","@eslint/js":"10.0.1","typescript":"6.0.3","@babel/core":"7.29.7","@aws-lite/s3":"0.2.7","@aws-lite/client":"0.23.7","typescript-eslint":"8.69.0","@aws-sdk/client-s3":"3.1124.0","console-table-printer":"2.16.1","eslint-config-prettier":"10.1.8","@babel/preset-typescript":"7.29.7"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/s3mini_1.0.2_1789468844941_0.5045072468249443"}}},"time":{"created":"2025-05-13T13:56:17.782Z","modified":"2026-09-15T10:40:45.169Z","0.1.0":"2025-05-13T13:56:17.958Z","0.1.1":"2025-06-09T15:07:23.318Z","0.2.0":"2025-06-14T18:03:16.881Z","0.3.0":"2025-06-22T14:42:12.681Z","0.4.0":"2025-07-01T13:31:44.348Z","0.5.0":"2025-08-25T14:03:17.881Z","0.6.0":"2025-10-13T09:33:25.027Z","0.7.0":"2025-11-18T10:21:32.239Z","0.7.1":"2025-11-29T16:47:25.521Z","0.8.0":"2025-12-10T18:55:33.978Z","0.8.1":"2025-12-20T20:02:58.827Z","0.9.0":"2025-12-23T03:16:38.166Z","0.9.1":"2026-01-15T08:40:34.974Z","0.9.2":"2026-03-23T18:32:24.761Z","0.9.3":"2026-04-07T08:15:22.485Z","0.9.4":"2026-04-08T13:09:02.246Z","0.9.5":"2026-05-24T14:54:44.416Z","1.0.0":"2026-08-05T12:02:55.328Z","1.0.1":"2026-09-02T08:22:19.478Z","1.0.2":"2026-09-15T10:40:45.023Z"},"bugs":{"url":"https://code.nolog.cz/thinking.tools/s3mini/issues"},"author":{"name":"good-lly"},"license":"MIT","homepage":"https://code.nolog.cz/thinking.tools/s3mini","keywords":["s3","s3 client","s3 sdk","b2","b2 client","r2","r2 client","cloudflare","cloudflare r2","AWS S3","Oracle Cloud Infrastructure","OCI Object Storage","Azure Blob Storage","Google Cloud Storage","Ceph","backblaze","scaleway","digitalocean","minio"],"repository":{"url":"git+https://code.nolog.cz/thinking.tools/s3mini.git","type":"git"},"description":"👶 Tiny & fast S3 client for node and edge computing platforms","maintainers":[{"name":"jolly-good","email":"peter@jensen.wtf"}],"readme":"# s3mini | Tiny & fast S3 client for node, bun and edge platforms.\n\n`s3mini` is an ultra-lightweight Typescript client (~20 KB minified, ≈15 % more ops/s) for S3-compatible object storage. It runs on Node, Bun, Cloudflare Workers, and other edge platforms. It has been tested on Cloudflare R2, Backblaze B2, DigitalOcean Spaces, Ceph, Oracle, Garage and MinIO. (No Browser support!)\n\n![Node.js](https://img.shields.io/badge/node.js-6DA55F?style=for-the-badge&logo=node.js&logoColor=white)\n![Bun](https://img.shields.io/badge/Bun-%23000000.svg?style=for-the-badge&logo=bun&logoColor=white)\n![Cloudflare](https://img.shields.io/badge/Cloudflare-F38020?style=for-the-badge&logo=Cloudflare&logoColor=white)\n\n[[code.nolog](https://code.nolog.cz/thinking.tools/s3mini)]\n[[issues](https://code.nolog.cz/thinking.tools/s3mini/issues)]\n[[npm](https://www.npmjs.com/package/s3mini)]\n\n## Features\n\n- 🚀 Light and fast: ~20 KB (minified, not gzipped), up to 1.37x faster on Bun vs Node.\n- 🔧 Zero dependencies; supports AWS SigV4, pre-signed URLs, and SSE-C headers (tested on Cloudflare)\n- 🟠 Works on Cloudflare Workers; ideal for edge computing, Node, and Bun (no browser support).\n- 🔑 Only the essential S3 APIs—improved list, put, get, delete, and a few more.\n- 🛠️ Supports multipart uploads.\n- 🎄 Tree-shakeable ES module.\n- 🎯 TypeScript support with type definitions.\n- 📚 Documented with examples, tests and widely tested on various S3-compatible services! (Contributions welcome!)\n- 📦 **BYOS3** — _Bring your own S3-compatible bucket_ (tested on Cloudflare R2, Backblaze B2, DigitalOcean Spaces, MinIO, Garage, Micro/Ceph and Oracle Object Storage, Scaleway).\n\n#### Tested On\n\n![Tested On](testedon.png) and more ...\nContributions welcome!\n\nDev:\n\n[![Last commit](https://img.shields.io/gitea/last-commit/thinking.tools/s3mini/dev?gitea_url=https%3A%2F%2Fcode.nolog.cz&color=green)](https://code.nolog.cz/thinking.tools/s3mini/commits/branch/dev)\n[![Issues](https://img.shields.io/gitea/issues/open/thinking.tools/s3mini?gitea_url=https%3A%2F%2Fcode.nolog.cz)](https://code.nolog.cz/thinking.tools/s3mini/issues)\n[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=thinking-tools-at-code-nolog-s3mini&metric=bugs&branch=dev)](https://sonarcloud.io/summary/new_code?id=thinking-tools-at-code-nolog-s3mini&branch=dev)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=thinking-tools-at-code-nolog-s3mini&metric=reliability_rating&branch=dev)](https://sonarcloud.io/summary/new_code?id=thinking-tools-at-code-nolog-s3mini&branch=dev)\n[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=thinking-tools-at-code-nolog-s3mini&metric=security_rating&branch=dev)](https://sonarcloud.io/summary/new_code?id=thinking-tools-at-code-nolog-s3mini&branch=dev)\n[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=thinking-tools-at-code-nolog-s3mini&metric=vulnerabilities&branch=dev)](https://sonarcloud.io/summary/new_code?id=thinking-tools-at-code-nolog-s3mini&branch=dev)\n[![Technical Debt](https://sonarcloud.io/api/project_badges/measure?project=thinking-tools-at-code-nolog-s3mini&metric=sqale_index&branch=dev)](https://sonarcloud.io/summary/new_code?id=thinking-tools-at-code-nolog-s3mini&branch=dev)\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=thinking-tools-at-code-nolog-s3mini&metric=sqale_rating&branch=dev)](https://sonarcloud.io/summary/new_code?id=thinking-tools-at-code-nolog-s3mini&branch=dev)\n[![Test:e2e(all)](https://code.nolog.cz/thinking.tools/s3mini/actions/workflows/test-e2e.yml/badge.svg?branch=dev)](https://code.nolog.cz/thinking.tools/s3mini/actions?workflow=test-e2e.yml)\n\n[![code.nolog Repo stars](https://img.shields.io/gitea/stars/thinking.tools/s3mini?gitea_url=https%3A%2F%2Fcode.nolog.cz&style=social&label=code.nolog)](https://code.nolog.cz/thinking.tools/s3mini/stars) **+** [![GitHub Repo stars](https://img.shields.io/github/stars/good-lly/s3mini?style=social&label=GitHub)](https://github.com/good-lly/s3mini/stargazers)\n[![NPM Downloads](https://img.shields.io/npm/dm/s3mini)](https://www.npmjs.com/package/s3mini)\n![NPM Version](https://img.shields.io/npm/v/s3mini?color=green)\n![npm package minimized gzipped size](https://img.shields.io/bundlejs/size/s3mini?color=green)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green)](https://code.nolog.cz/thinking.tools/s3mini/src/branch/dev/LICENSE)\n\n<a href=\"https://code.nolog.cz/thinking.tools/s3mini/issues/\"> <img src=\"https://img.shields.io/badge/contributions-welcome-brightgreen.svg\" alt=\"Contributions welcome\" /></a>\n\n### Bun vs Node\n\ns3mini is tested on both Node and Bun. In our benchmarks against MinIO, Bun is roughly **~1.4x faster** on most operations (median across ~40 tests). Blob multipart uploads see the largest gain (~20x) thanks to Bun's native `Blob.slice()`. Results are approximate and will vary by environment.\n\n## Table of Contents\n\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Configuration](#configuration)\n- [Uploading Objects](#uploading-objects)\n- [Downloading Objects](#downloading-objects)\n- [Listing Objects](#listing-objects)\n- [Deleting Objects](#deleting-objects)\n- [Copy and Move](#copy-and-move)\n- [Conditional Requests](#conditional-requests)\n- [Pre-signed URLs](#pre-signed-urls)\n- [Server-Side Encryption (SSE-C)](#server-side-encryption-sse-c)\n- [API Reference](#api-reference)\n- [Error Handling](#error-handling)\n- [Cloudflare Workers](#cloudflare-workers)\n- [Supported Operations](#supported-operations)\n- [Security Notes](#security-notes)\n- [💙 Contributions welcomed!](#contributions-welcomed)\n- [License](#license)\n\n## Installation\n\n```bash\nnpm install s3mini\n```\n\n```bash\nyarn add s3mini\n```\n\n```bash\npnpm add s3mini\n```\n\n### Environment Variables\n\nTo use `s3mini`, you need to set up your environment variables for provider credentials and S3 endpoint. Create a `.env` file in your project root directory. Checkout the [example.env](example.env) file for reference.\n\n```bash\n# On Windows, Mac, or Linux\nmv example.env .env\n```\n\n> **⚠️ Environment Support Notice**\n>\n> This library is designed to run in environments like **Node.js**, **Bun**, and **Cloudflare Workers**. It does **not support browser environments** due to the use of Node.js APIs and polyfills.\n\n## Quick Start\n\n```typescript\nimport { S3mini } from 's3mini';\n\nconst s3 = new S3mini({\n  accessKeyId: process.env.S3_ACCESS_KEY,\n  secretAccessKey: process.env.S3_SECRET_KEY,\n  endpoint: 'https://bucket.region.r2.cloudflarestorage.com',\n  region: 'auto',\n});\n\n// Upload (auto-selects single PUT or multipart based on size)\nawait s3.putAnyObject('photos/vacation.jpg', fileBuffer, 'image/jpeg');\n\n// Download\nconst data = await s3.getObject('photos/vacation.jpg');\n\n// List\nconst objects = await s3.listObjects('/', 'photos/');\n\n// Delete\nawait s3.deleteObject('photos/vacation.jpg');\n```\n\n## Configuration\n\n```typescript\nconst s3 = new S3mini({\n  // Required\n  accessKeyId: string,\n  secretAccessKey: string,\n  endpoint: string, // Full URL: https://bucket.region.provider.com\n\n  // Optional\n  region: string, // Default: 'auto'\n  minPartSize: number, // Default: 8MB — threshold for multipart\n  requestSizeInBytes: number, // Default: 8MB — chunk size for range requests\n  requestAbortTimeout: number, // Timeout in ms (undefined = no timeout)\n  logger: Logger, // Custom logger with info/warn/error methods\n  fetch: typeof fetch, // Custom fetch implementation\n});\n```\n\n**Endpoint formats:**\n\n```typescript\n// Path-style (bucket in path)\n'https://s3.us-east-1.amazonaws.com/my-bucket';\n\n// Virtual-hosted-style (bucket in subdomain)\n'https://my-bucket.s3.us-east-1.amazonaws.com';\n\n// Provider-specific\n'https://my-bucket.nyc3.digitaloceanspaces.com';\n'https://account-id.r2.cloudflarestorage.com/my-bucket';\n```\n\n---\n\n## Uploading Objects\n\n### putObject — Simple Upload\n\nDirect single-request upload. Use for small files or when you need fine control.\n\n```typescript\nconst response = await s3.putObject(\n  key: string,                    // Object key/path\n  data: string | Buffer | Uint8Array | Blob | File | ReadableStream,\n  contentType?: string,           // Default: 'application/octet-stream'\n  ssecHeaders?: SSECHeaders,      // Optional encryption headers\n  additionalHeaders?: AWSHeaders, // Optional x-amz-* headers\n  contentLength?: number,         // Optional, auto-detected for most types\n);\n\n// Returns: Response object\nconst etag = response.headers.get('etag');\n```\n\n**Examples:**\n\n```typescript\n// String content\nawait s3.putObject('config.json', JSON.stringify({ key: 'value' }), 'application/json');\n\n// Buffer/Uint8Array\nconst buffer = await fs.readFile('image.png');\nawait s3.putObject('images/photo.png', buffer, 'image/png');\n\n// Blob (browser File API or Node 18+)\nconst blob = new Blob(['Hello'], { type: 'text/plain' });\nawait s3.putObject('hello.txt', blob, 'text/plain');\n\n// With custom headers\nawait s3.putObject('data.bin', buffer, 'application/octet-stream', undefined, {\n  'x-amz-meta-author': 'john',\n  'x-amz-meta-version': '1.0',\n});\n```\n\n### putAnyObject — Smart Upload (Recommended)\n\nAutomatically chooses single PUT or multipart based on data size. **This is the recommended method for most use cases.**\n\n```typescript\nconst response = await s3.putAnyObject(\n  key: string,\n  data: string | Buffer | Uint8Array | Blob | File | ReadableStream,\n  contentType?: string,\n  ssecHeaders?: SSECHeaders,\n  additionalHeaders?: AWSHeaders,\n  contentLength?: number,\n);\n```\n\n**Behavior:**\n\n- **≤ minPartSize (8MB default):** Single PUT request\n- **> minPartSize:** Automatic multipart upload with:\n  - Parallel part uploads (4 concurrent by default)\n  - Automatic retries with exponential backoff (3 retries)\n  - Proper cleanup on failure (aborts incomplete uploads)\n\n**Examples:**\n\n```typescript\n// Small file — uses single PUT internally\nawait s3.putAnyObject('small.txt', 'Hello World');\n\n// Large file — automatically uses multipart\nconst largeBuffer = await fs.readFile('video.mp4'); // 500MB\nawait s3.putAnyObject('videos/movie.mp4', largeBuffer, 'video/mp4');\n\n// Blob (zero-copy slicing for memory efficiency)\nconst file = new File([largeArrayBuffer], 'data.bin');\nawait s3.putAnyObject('uploads/data.bin', file);\n\n// ReadableStream (uploads as data arrives)\nconst stream = fs.createReadStream('huge-file.dat');\nawait s3.putAnyObject('backups/data.dat', Readable.toWeb(stream));\n```\n\n**Memory efficiency with Blobs:**\n\nFor large files, using `Blob` or `File` is more memory-efficient than `Uint8Array`:\n\n```typescript\n// ❌ Loads entire file into memory\nconst buffer = await fs.readFile('large-video.mp4');\nawait s3.putAnyObject('video.mp4', buffer);\n\n// ✅ Zero-copy slicing — only reads data when uploading each part\nconst file = Bun.file('large-video.mp4'); // Bun\n// or\nconst blob = await fs.openAsBlob('large-video.mp4'); // Node\nawait s3.putAnyObject('video.mp4', blob);\n```\n\n### Manual Multipart Upload\n\nFor advanced control over multipart uploads (progress tracking, resumable uploads, custom concurrency).\n\n```typescript\n// 1. Initialize upload\nconst uploadId = await s3.getMultipartUploadId(\n  key: string,\n  contentType?: string,\n  ssecHeaders?: SSECHeaders,\n  additionalHeaders?: AWSHeaders,\n);\n\n// 2. Upload parts (must be ≥ 5MB except last part)\nconst parts: UploadPart[] = [];\n\nfor (let i = 0; i < totalParts; i++) {\n  const partData = buffer.subarray(i * partSize, (i + 1) * partSize);\n  const part = await s3.uploadPart(\n    key,\n    uploadId,\n    partData,\n    i + 1,  // partNumber: 1-indexed, max 10,000\n  );\n  parts.push(part);\n  console.log(`Uploaded part ${i + 1}/${totalParts}`);\n}\n\n// 3. Complete upload\nconst result = await s3.completeMultipartUpload(key, uploadId, parts);\nconsole.log('Final ETag:', result.etag);\n```\n\n**Parallel uploads with progress:**\n\n```typescript\nimport { runInBatches } from 's3mini';\n\nconst PART_SIZE = 8 * 1024 * 1024; // 8MB\nconst CONCURRENCY = 6;\n\nasync function uploadWithProgress(key: string, data: Uint8Array) {\n  const uploadId = await s3.getMultipartUploadId(key);\n  const totalParts = Math.ceil(data.byteLength / PART_SIZE);\n  let completed = 0;\n\n  const tasks = Array.from({ length: totalParts }, (_, i) => async () => {\n    const start = i * PART_SIZE;\n    const end = Math.min(start + PART_SIZE, data.byteLength);\n    const part = await s3.uploadPart(key, uploadId, data.subarray(start, end), i + 1);\n    completed++;\n    console.log(`Progress: ${((completed / totalParts) * 100).toFixed(1)}%`);\n    return part;\n  });\n\n  const results = await runInBatches(tasks, CONCURRENCY);\n  const parts = results\n    .filter((r): r is PromiseFulfilledResult => r.status === 'fulfilled')\n    .map(r => r.value)\n    .sort((a, b) => a.partNumber - b.partNumber);\n\n  return s3.completeMultipartUpload(key, uploadId, parts);\n}\n```\n\n**Abort an incomplete upload:**\n\n```typescript\nawait s3.abortMultipartUpload(key, uploadId);\n```\n\n**List pending multipart uploads:**\n\n```typescript\nconst pending = await s3.listMultipartUploads();\n// Clean up orphaned uploads\nfor (const upload of pending.Upload || []) {\n  await s3.abortMultipartUpload(upload.Key, upload.UploadId);\n}\n```\n\n---\n\n## Downloading Objects\n\n```typescript\n// As string\nconst text = await s3.getObject('file.txt');\n\n// As ArrayBuffer\nconst buffer = await s3.getObjectArrayBuffer('image.png');\n\n// As JSON (auto-parsed)\nconst data = await s3.getObjectJSON('config.json');\n\n// Full Response object (for headers, streaming)\nconst response = await s3.getObjectResponse('video.mp4');\nconst stream = response.body; // ReadableStream\n\n// With ETag for caching\nconst { etag, data } = await s3.getObjectWithETag('file.txt');\n\n// Range request (partial download)\nconst response = await s3.getObjectRaw(\n  'large-file.bin',\n  false, // wholeFile: false for range request\n  0, // rangeFrom\n  1024 * 1024, // rangeTo (first 1MB)\n);\n```\n\n---\n\n## Listing Objects\n\n```typescript\n// List all objects (auto-paginates)\nconst objects = await s3.listObjects();\n\n// With prefix filter (list \"folder\")\nconst photos = await s3.listObjects('/', 'photos/');\n\n// With max keys limit\nconst first100 = await s3.listObjects('/', '', 100);\n\n// Manual pagination\nlet token: string | undefined;\ndo {\n  const { objects, nextContinuationToken } = await s3.listObjectsPaged(\n    '/', // delimiter\n    'uploads/', // prefix\n    100, // maxKeys per page\n    token, // continuation token\n  );\n  console.log(objects);\n  token = nextContinuationToken;\n} while (token);\n```\n\n**Response shape:**\n\n```typescript\ninterface ListObject {\n  Key: string;\n  Size: number;\n  LastModified: Date;\n  ETag: string;\n  StorageClass: string;\n}\n```\n\n---\n\n## Deleting Objects\n\n```typescript\n// Single object\nconst deleted = await s3.deleteObject('file.txt'); // boolean\n\n// Multiple objects (batched, max 1000 per request)\nconst keys = ['a.txt', 'b.txt', 'c.txt'];\nconst results = await s3.deleteObjects(keys); // boolean[] in same order\n```\n\n---\n\n## Copy and Move\n\nServer-side copy (no data transfer through client):\n\n```typescript\n// Copy within same bucket\nconst result = await s3.copyObject('source.txt', 'backup/source.txt');\n\n// Copy with new metadata\nawait s3.copyObject('report.pdf', 'archive/report.pdf', {\n  metadataDirective: 'REPLACE',\n  metadata: {\n    'archived-at': new Date().toISOString(),\n  },\n  contentType: 'application/pdf',\n});\n\n// Move (copy + delete source)\nawait s3.moveObject('temp/upload.tmp', 'files/document.pdf');\n```\n\n**Options:**\n\n```typescript\ninterface CopyObjectOptions {\n  metadataDirective?: 'COPY' | 'REPLACE';\n  metadata?: Record;\n  contentType?: string;\n  storageClass?: string;\n  taggingDirective?: 'COPY' | 'REPLACE';\n  sourceSSECHeaders?: SSECHeaders;\n  destinationSSECHeaders?: SSECHeaders;\n  additionalHeaders?: AWSHeaders;\n}\n```\n\n---\n\n## Conditional Requests\n\nUse If-\\* headers to avoid unnecessary transfers:\n\n```typescript\n// Only download if changed (returns null if ETag matches)\nconst data = await s3.getObject('file.txt', {\n  'if-none-match': '\"abc123\"',\n});\n\n// Only download if modified since date\nconst data = await s3.getObject('file.txt', {\n  'if-modified-since': 'Wed, 21 Oct 2024 07:28:00 GMT',\n});\n\n// Check existence with conditions\nconst exists = await s3.objectExists('file.txt', {\n  'if-match': '\"abc123\"',\n}); // null if ETag mismatch, true/false otherwise\n```\n\n---\n\n## Pre-signed URLs\n\nGenerate time-limited URLs that allow unauthenticated HTTP clients to upload or download objects directly — no credentials needed on the client side.\n\n```typescript\n// Download URL (valid for 1 hour by default)\nconst downloadUrl = await s3.getPresignedUrl('GET', 'photos/vacation.jpg');\n\n// Upload URL (valid for 5 minutes)\nconst uploadUrl = await s3.getPresignedUrl('PUT', 'uploads/file.bin', 300);\n```\n\n**Client-side usage (no SDK or credentials required):**\n\n```typescript\n// Upload via pre-signed URL\nawait fetch(uploadUrl, {\n  method: 'PUT',\n  body: fileData,\n  headers: { 'Content-Type': 'image/jpeg' },\n});\n\n// Download via pre-signed URL\nconst response = await fetch(downloadUrl);\nconst data = await response.arrayBuffer();\n```\n\n**Custom response headers:**\n\n```typescript\n// Force download with a specific filename\nconst url = await s3.getPresignedUrl('GET', 'report.pdf', 3600, {\n  'response-content-disposition': 'attachment; filename=\"report.pdf\"',\n  'response-content-type': 'application/pdf',\n});\n```\n\n**Signed headers (enforce headers on the client request):**\n\n```typescript\n// Upload URL that requires Content-Type — client MUST send this exact header\nconst url = await s3.getPresignedUrl(\n  'PUT',\n  'uploads/data.json',\n  300,\n  {},\n  {\n    'Content-Type': 'application/json',\n  },\n);\n\nawait fetch(url, {\n  method: 'PUT',\n  body: JSON.stringify({ ok: true }),\n  headers: { 'Content-Type': 'application/json' },\n});\n```\n\n**Method signature:**\n\n```typescript\ngetPresignedUrl(\n  method: 'GET' | 'PUT',\n  key: string,\n  expiresIn?: number,           // Default: 3600 (1 hour), max: 604800 (7 days)\n  queryParams?: Record<string, string>,\n  headers?: Record<string, string>,  // HTTP headers to sign (e.g. Content-Type)\n): Promise<string>\n```\n\n**Notes:**\n\n- `expiresIn` must be between 1 and 604800 seconds (7 days); non-integer values are floored.\n- Works with both virtual-hosted-style and path-style endpoints.\n- Special characters and unicode in keys are handled automatically.\n- Throws `TypeError` for empty keys or out-of-range `expiresIn`.\n- When `headers` are provided, they are included in `X-Amz-SignedHeaders` and the signature. The client consuming the URL must send those exact headers with matching values. The `host` header is always signed automatically.\n\n---\n\n## Server-Side Encryption (SSE-C)\n\nCustomer-provided encryption keys (tested on Cloudflare R2):\n\n```typescript\nconst ssecHeaders = {\n  'x-amz-server-side-encryption-customer-algorithm': 'AES256',\n  'x-amz-server-side-encryption-customer-key': base64Key,\n  'x-amz-server-side-encryption-customer-key-md5': base64KeyMd5,\n};\n\n// Upload encrypted\nawait s3.putObject('secret.dat', data, 'application/octet-stream', ssecHeaders);\n\n// Download encrypted (must provide same key)\nconst decrypted = await s3.getObject('secret.dat', {}, ssecHeaders);\n\n// Copy encrypted object\nawait s3.copyObject('secret.dat', 'backup/secret.dat', {\n  sourceSSECHeaders: {\n    'x-amz-copy-source-server-side-encryption-customer-algorithm': 'AES256',\n    'x-amz-copy-source-server-side-encryption-customer-key': base64Key,\n    'x-amz-copy-source-server-side-encryption-customer-key-md5': base64KeyMd5,\n  },\n  destinationSSECHeaders: ssecHeaders,\n});\n```\n\n---\n\n## API Reference\n\n### Constructor\n\n| Parameter             | Type           | Default            | Description               |\n| --------------------- | -------------- | ------------------ | ------------------------- |\n| `accessKeyId`         | `string`       | required           | AWS access key            |\n| `secretAccessKey`     | `string`       | required           | AWS secret key            |\n| `endpoint`            | `string`       | required           | Full S3 endpoint URL      |\n| `region`              | `string`       | `'auto'`           | AWS region                |\n| `minPartSize`         | `number`       | `8388608`          | Multipart threshold (8MB) |\n| `requestAbortTimeout` | `number`       | `undefined`        | Request timeout in ms     |\n| `logger`              | `Logger`       | `undefined`        | Custom logger             |\n| `fetch`               | `typeof fetch` | `globalThis.fetch` | Custom fetch              |\n\n### Methods\n\n| Method                                                             | Returns                                     | Description             |\n| ------------------------------------------------------------------ | ------------------------------------------- | ----------------------- |\n| `bucketExists()`                                                   | `Promise<boolean>`                          | Check if bucket exists  |\n| `createBucket()`                                                   | `Promise<boolean>`                          | Create bucket           |\n| `listObjects(delimiter?, prefix?, maxKeys?)`                       | `Promise<ListObject[] \\| null>`             | List all objects        |\n| `listObjectsPaged(delimiter?, prefix?, maxKeys?, token?)`          | `Promise<{objects, nextContinuationToken}>` | Paginated list          |\n| `getObject(key, opts?, ssec?)`                                     | `Promise<string \\| null>`                   | Get object as string    |\n| `getObjectArrayBuffer(key, opts?, ssec?)`                          | `Promise<ArrayBuffer \\| null>`              | Get as ArrayBuffer      |\n| `getObjectJSON<T>(key, opts?, ssec?)`                              | `Promise<T \\| null>`                        | Get as parsed JSON      |\n| `getObjectResponse(key, opts?, ssec?)`                             | `Promise<Response \\| null>`                 | Get full Response       |\n| `getObjectWithETag(key, opts?, ssec?)`                             | `Promise<{etag, data}>`                     | Get with ETag           |\n| `getObjectRaw(key, wholeFile?, from?, to?, opts?, ssec?)`          | `Promise<Response>`                         | Range request           |\n| `putObject(key, data, type?, ssec?, headers?, length?)`            | `Promise<Response>`                         | Simple upload           |\n| `putAnyObject(key, data, type?, ssec?, headers?, length?)`         | `Promise<Response>`                         | Smart upload            |\n| `deleteObject(key)`                                                | `Promise<boolean>`                          | Delete single object    |\n| `deleteObjects(keys)`                                              | `Promise<boolean[]>`                        | Delete multiple         |\n| `objectExists(key, opts?)`                                         | `Promise<boolean \\| null>`                  | Check existence         |\n| `getEtag(key, opts?, ssec?)`                                       | `Promise<string \\| null>`                   | Get ETag only           |\n| `getContentLength(key, ssec?)`                                     | `Promise<number>`                           | Get size in bytes       |\n| `copyObject(source, dest, opts?)`                                  | `Promise<CopyObjectResult>`                 | Server-side copy        |\n| `moveObject(source, dest, opts?)`                                  | `Promise<CopyObjectResult>`                 | Copy + delete           |\n| `getPresignedUrl(method, key, expiresIn?, queryParams?, headers?)` | `Promise<string>`                           | Generate pre-signed URL |\n| `getMultipartUploadId(key, type?, ssec?, headers?)`                | `Promise<string>`                           | Init multipart          |\n| `uploadPart(key, uploadId, data, partNum, opts?, ssec?, headers?)` | `Promise<UploadPart>`                       | Upload part             |\n| `completeMultipartUpload(key, uploadId, parts)`                    | `Promise<CompleteResult>`                   | Complete multipart      |\n| `abortMultipartUpload(key, uploadId, ssec?)`                       | `Promise<object>`                           | Abort multipart         |\n| `listMultipartUploads(delimiter?, prefix?, method?, opts?)`        | `Promise<object>`                           | List pending            |\n| `sanitizeETag(etag)`                                               | `string`                                    | Remove quotes from ETag |\n\n### Utility Functions\n\n```typescript\nimport { runInBatches, sanitizeETag } from 's3mini';\n\n// Run async tasks with concurrency control\nconst results = await runInBatches(\n  tasks: Iterable<() => Promise>,\n  batchSize?: number,    // Default: 30\n  minIntervalMs?: number // Default: 0 (no delay between batches)\n);\n\n// Clean ETag value\nconst clean = sanitizeETag('\"abc123\"'); // 'abc123'\n```\n\n---\n\n## Error Handling\n\n```typescript\nimport { S3ServiceError, S3NetworkError } from 's3mini';\n\ntry {\n  await s3.getObject('missing.txt');\n} catch (err) {\n  if (err instanceof S3ServiceError) {\n    console.error(`S3 error ${err.status}: ${err.serviceCode}`);\n    console.error('Response body:', err.body);\n  } else if (err instanceof S3NetworkError) {\n    console.error(`Network error: ${err.code}`); // ENOTFOUND, ETIMEDOUT, etc.\n  }\n}\n```\n\n**Error classes:**\n\n- `S3Error` — Base error class\n- `S3ServiceError` — S3 returned an error response (4xx, 5xx)\n- `S3NetworkError` — Network-level failure (DNS, timeout, connection refused)\n\n---\n\n## Cloudflare Workers\n\nWorks natively without `nodejs_compat`:\n\n```typescript\nexport default {\n  async fetch(request: Request, env: Env): Promise {\n    const s3 = new S3mini({\n      accessKeyId: env.R2_ACCESS_KEY,\n      secretAccessKey: env.R2_SECRET_KEY,\n      endpoint: env.R2_ENDPOINT,\n    });\n\n    const data = await s3.getObject('hello.txt');\n    return new Response(data);\n  },\n};\n```\n\n---\n\n## Supported Operations\n\n| Operation               | Method                                                                                                                     |\n| ----------------------- | -------------------------------------------------------------------------------------------------------------------------- |\n| HeadBucket              | `bucketExists()`                                                                                                           |\n| CreateBucket            | `createBucket()`                                                                                                           |\n| ListObjectsV2           | `listObjects()`, `listObjectsPaged()`                                                                                      |\n| GetObject               | `getObject()`, `getObjectArrayBuffer()`, `getObjectJSON()`, `getObjectResponse()`, `getObjectWithETag()`, `getObjectRaw()` |\n| PutObject               | `putObject()`, `putAnyObject()`                                                                                            |\n| DeleteObject            | `deleteObject()`                                                                                                           |\n| DeleteObjects           | `deleteObjects()`                                                                                                          |\n| HeadObject              | `objectExists()`, `getEtag()`, `getContentLength()`                                                                        |\n| CopyObject              | `copyObject()`, `moveObject()`                                                                                             |\n| CreateMultipartUpload   | `getMultipartUploadId()`                                                                                                   |\n| UploadPart              | `uploadPart()`                                                                                                             |\n| CompleteMultipartUpload | `completeMultipartUpload()`                                                                                                |\n| AbortMultipartUpload    | `abortMultipartUpload()`                                                                                                   |\n| ListMultipartUploads    | `listMultipartUploads()`                                                                                                   |\n| Pre-signed URLs         | `getPresignedUrl()`                                                                                                        |\n\n---\n\n## Security Notes\n\n- The library masks sensitive information (access keys, session tokens, etc.) when logging.\n- Always protect your AWS credentials and avoid hard-coding them in your application (!!!). Use environment variables. Use environment variables or a secure vault for storing credentials.\n- Ensure you have the necessary permissions to access the S3 bucket and perform operations.\n- Be cautious when using multipart uploads, as they can incur additional costs if not managed properly.\n- Authors are not responsible for any data loss or security breaches resulting from improper usage of the library.\n- If you find a security vulnerability, please report it to us directly via email. For more details, please refer to the [SECURITY.md](SECURITY.md) file.\n\n## Contributions welcomed! (in specific order)\n\nContributions are greatly appreciated! If you have an idea for a new feature or have found a bug, we encourage you to get involved in this order:\n\n1. _Open/Report Issues or Ideas_: If you encounter a problem, have an idea or a feature request, please open an issue on [code.nolog.cz](https://code.nolog.cz/thinking.tools/s3mini/issues) (FIRST!) . Be concise but include as much detail as necessary (environment, error messages, logs, steps to reproduce, etc.) so we can understand and address the issue and have a dialog.\n\n2. _Create Pull Requests_: We welcome PRs! If you want to implement a new feature or fix a bug, feel free to submit a pull request to the latest `dev branch`. For major changes, it's a necessary to discuss your plans in an issue first!\n\n3. _Lightweight Philosophy_: When contributing, keep in mind that s3mini aims to remain lightweight and dependency-free. Please avoid adding heavy dependencies. New features should provide significant value to justify any increase in size.\n\n4. _Community Conduct_: Be respectful and constructive in communications. We want a welcoming environment for all contributors. For more details, please refer to our [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md). No one reads it, but it's there for a reason.\n\nIf you figure out a solution to your question or problem on your own, please consider posting the answer or closing the issue with an explanation. It could help the next person who runs into the same thing!\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Sponsor This Project\n\nDeveloping and maintaining s3mini (and other open-source projects) requires time and effort. If you find this library useful, please consider sponsoring its development. Your support helps ensure I can continue improving s3mini and other projects. Thank you!\n\n[![Become a Sponsor](https://img.shields.io/badge/💸_GitHub-Sponsor-ff69b4?logo=github&logoColor=white)](https://github.com/sponsors/good-lly)\n","readmeFilename":"README.md"}