This is a comprehensive list of the breaking changes introduced in the major version releases of s3mini library.
-
ESM only package, no more minified CJS build
-
The Bun native fast paths actually run now. Runtime detection compared
navigator.userAgentto'Bun', but Bun reportsBun/<version>, so the paths added in 0.9.4 never engaged and everything went through signedfetch. On Bun,getObject,getObjectArrayBuffer,getObjectJSON,getEtag,getContentLength,objectExists,deleteObject,listObjectsandgetPresignedUrlare now served byBun.S3Client. Node behaviour is unchanged. What differs on Bun:- Those requests no longer pass through
globalThis.fetch, so fetch mocks and interceptors do not see them,requestAbortTimeoutdoes not apply to them, and they produce no per-requestloggeroutput. - Errors are still
S3ServiceErrorwith the same.code, but.statusis0for codes the S3 API does not pin to a single status, and.bodycarries the provider's message text instead of the raw XML error body. - Presigned URLs are produced by Bun's signer. Valid SigV4, but the query parameters may differ.
- Migration: passing any
fetchin the config keeps the previous path, since a caller-supplied transport is never bypassed:
- Those requests no longer pass through
const s3 = new S3mini({ ...config, fetch: (input, init) => fetch(input, init) });putObject,putAnyObject,getObjectRawandgetObjectWithETagno longer have Bun fast paths (listed in 0.9.4, never active). Bun'swrite()rewritestext/plaintotext/plain;charset=utf-8, stores aReadableStreamas the literal string[object ReadableStream]and does not switch to multipart, while the two read helpers cost an extra round trip andgetObjectRawbuffered the whole body instead of streaming it. All four use the signed path on every runtime.
listObjectsandlistObjectsPagednow includeCommonPrefixesin results when using thedelimiteroption- Directory prefixes are returned as synthetic
ListObjectentries with:Keyending in/(e.g.,prefix/subdir/)Size: 0ETag: ''StorageClass: ''LastModified: new Date(0)
- Migration: If your code assumes all returned objects are files, filter by
!obj.Key.endsWith('/')or check for non-emptyETag
- Directory prefixes are returned as synthetic
// Before: only files returned
const objects = await s3.listObjects('/', 'prefix/', undefined, { delimiter: '/' });
// After: files + directory prefixes returned
const all = await s3.listObjects('/', 'prefix/', undefined, { delimiter: '/' });
const files = all.filter(o => !o.Key.endsWith('/'));
const directories = all.filter(o => o.Key.endsWith('/'));- The
s3miniclass has been renamed toS3minito follow typescript naming conventions.s3miniis now an alias forS3miniwith deprecated usage flag.
- Response objects now use uppercase property names to match AWS S3 API conventions (except for
etagwhich remains lowercase)key→Keysize→SizelastModified→LastModifiedetagremainsetag