lean-s3 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -41,6 +41,7 @@ interface S3FilePresignOptions {
41
41
  /** Seconds. */
42
42
  expiresIn: number;
43
43
  method: PresignableHttpMethod;
44
+ contentLength: number;
44
45
  storageClass: StorageClass;
45
46
  acl: Acl;
46
47
  }
@@ -224,7 +225,7 @@ declare class S3Client {
224
225
  * ```
225
226
  */
226
227
  presign(path: string, { method, expiresIn, // TODO: Maybe rename this to expiresInSeconds
227
- storageClass, acl, region: regionOverride, bucket: bucketOverride, endpoint: endpointOverride, }?: Partial<S3FilePresignOptions & OverridableS3ClientOptions>): string;
228
+ storageClass, contentLength, acl, region: regionOverride, bucket: bucketOverride, endpoint: endpointOverride, }?: Partial<S3FilePresignOptions & OverridableS3ClientOptions>): string;
228
229
  createMultipartUpload(key: string, options?: CreateMultipartUploadOptions): Promise<CreateMultipartUploadResponse>;
229
230
  /**
230
231
  * @remarks Uses [`ListMultipartUploads`](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html).
package/dist/index.js CHANGED
@@ -431,11 +431,17 @@ var S3Client = class {
431
431
  expiresIn = 3600,
432
432
  // TODO: Maybe rename this to expiresInSeconds
433
433
  storageClass,
434
+ contentLength,
434
435
  acl,
435
436
  region: regionOverride,
436
437
  bucket: bucketOverride,
437
438
  endpoint: endpointOverride
438
439
  } = {}) {
440
+ if (typeof contentLength === "number") {
441
+ if (contentLength < 0) {
442
+ throw new RangeError("`contentLength` must be >= 0.");
443
+ }
444
+ }
439
445
  const now2 = /* @__PURE__ */ new Date();
440
446
  const date = getAmzDate(now2);
441
447
  const options = this.#options;
@@ -447,13 +453,19 @@ var S3Client = class {
447
453
  `${options.accessKeyId}/${date.date}/${region}/s3/aws4_request`,
448
454
  date,
449
455
  expiresIn,
450
- "host",
451
- void 0,
456
+ typeof contentLength === "number" ? "content-length;host" : "host",
457
+ unsignedPayload,
452
458
  storageClass,
453
459
  options.sessionToken,
454
460
  acl
455
461
  );
456
- const dataDigest = createCanonicalDataDigestHostOnly(
462
+ const dataDigest = typeof contentLength === "number" ? createCanonicalDataDigest(
463
+ method,
464
+ res.pathname,
465
+ query,
466
+ { "content-length": String(contentLength), host: res.host },
467
+ unsignedPayload
468
+ ) : createCanonicalDataDigestHostOnly(
457
469
  method,
458
470
  res.pathname,
459
471
  query,
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "lean-s3",
3
3
  "author": "Niklas Mollenhauer",
4
4
  "license": "MIT",
5
- "version": "0.4.1",
5
+ "version": "0.5.0",
6
6
  "description": "A server-side S3 API for the regular user.",
7
7
  "keywords": [
8
8
  "s3",
@@ -51,8 +51,8 @@
51
51
  "@testcontainers/localstack": "^11.0.3",
52
52
  "@testcontainers/minio": "^11.0.3",
53
53
  "@types/node": "^24.0.3",
54
- "@typescript/native-preview": "^7.0.0-dev.20250618.1",
55
- "expect": "^30.0.0",
54
+ "@typescript/native-preview": "^7.0.0-dev.20250619.1",
55
+ "expect": "^30.0.2",
56
56
  "lefthook": "^1.11.14",
57
57
  "tsup": "^8.5.0",
58
58
  "tsx": "^4.20.3",