From da87e89dd659872c4f4cf0ac6d65a601b628e697 Mon Sep 17 00:00:00 2001 From: Vincent Voyer Date: Wed, 2 Oct 2024 10:06:24 +0200 Subject: [PATCH] fix(blob): Allow for Request object to be a body of objects (#767) * fix(blob): Allow for Request object to be a body of objects Before this commit, you could not pass Request objects because of a bug in the module we used to detect plain objects. This is now fixed. * lockfile --- .changeset/pretty-tomatoes-jump.md | 5 +++++ packages/blob/package.json | 1 - packages/blob/src/helpers.ts | 18 ++++++++++++++++++ packages/blob/src/multipart/create-uploader.ts | 7 +++++-- packages/blob/src/multipart/upload.ts | 2 +- packages/blob/src/put.ts | 3 +-- pnpm-lock.yaml | 8 -------- 7 files changed, 30 insertions(+), 14 deletions(-) create mode 100644 .changeset/pretty-tomatoes-jump.md diff --git a/.changeset/pretty-tomatoes-jump.md b/.changeset/pretty-tomatoes-jump.md new file mode 100644 index 000000000..c90bc05c3 --- /dev/null +++ b/.changeset/pretty-tomatoes-jump.md @@ -0,0 +1,5 @@ +--- +'@vercel/blob': patch +--- + +Fix bad detection of Request being a plain object diff --git a/packages/blob/package.json b/packages/blob/package.json index 22aefb74d..c14bc52a1 100644 --- a/packages/blob/package.json +++ b/packages/blob/package.json @@ -63,7 +63,6 @@ "async-retry": "^1.3.3", "bytes": "^3.1.2", "is-buffer": "^2.0.5", - "is-plain-object": "^5.0.0", "undici": "^5.28.4" }, "devDependencies": { diff --git a/packages/blob/src/helpers.ts b/packages/blob/src/helpers.ts index ca51bcc8a..a4e4f0a3d 100644 --- a/packages/blob/src/helpers.ts +++ b/packages/blob/src/helpers.ts @@ -63,3 +63,21 @@ export function getDownloadUrl(blobUrl: string): string { return url.toString(); } + +// Extracted from https://github.com/sindresorhus/is-plain-obj/blob/main/index.js +// It's just nearly impossible to use ESM modules with our current setup +export function isPlainObject(value: unknown): boolean { + if (typeof value !== 'object' || value === null) { + return false; + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- ok + const prototype = Object.getPrototypeOf(value); + return ( + (prototype === null || + prototype === Object.prototype || + Object.getPrototypeOf(prototype) === null) && + !(Symbol.toStringTag in value) && + !(Symbol.iterator in value) + ); +} diff --git a/packages/blob/src/multipart/create-uploader.ts b/packages/blob/src/multipart/create-uploader.ts index 7e32fa0e4..0e41b6342 100644 --- a/packages/blob/src/multipart/create-uploader.ts +++ b/packages/blob/src/multipart/create-uploader.ts @@ -1,5 +1,8 @@ -import { isPlainObject } from 'is-plain-object'; -import { BlobError, type CommonCreateBlobOptions } from '../helpers'; +import { + BlobError, + isPlainObject, + type CommonCreateBlobOptions, +} from '../helpers'; import type { CreatePutMethodOptions, PutBody } from '../put-helpers'; import { createPutHeaders, createPutOptions } from '../put-helpers'; import { completeMultipartUpload } from './complete'; diff --git a/packages/blob/src/multipart/upload.ts b/packages/blob/src/multipart/upload.ts index e43adf57f..7152e60dc 100644 --- a/packages/blob/src/multipart/upload.ts +++ b/packages/blob/src/multipart/upload.ts @@ -1,12 +1,12 @@ import bytes from 'bytes'; import type { BodyInit } from 'undici'; -import { isPlainObject } from 'is-plain-object'; import { BlobServiceNotAvailable, requestApi } from '../api'; import { debug } from '../debug'; import { type CommonCreateBlobOptions, type BlobCommandOptions, BlobError, + isPlainObject, } from '../helpers'; import { createPutHeaders, createPutOptions } from '../put-helpers'; import type { PutBody, CreatePutMethodOptions } from '../put-helpers'; diff --git a/packages/blob/src/put.ts b/packages/blob/src/put.ts index 2a2b66aa7..cd48f869a 100644 --- a/packages/blob/src/put.ts +++ b/packages/blob/src/put.ts @@ -1,8 +1,7 @@ import type { BodyInit } from 'undici'; -import { isPlainObject } from 'is-plain-object'; import { requestApi } from './api'; import type { CommonCreateBlobOptions } from './helpers'; -import { BlobError } from './helpers'; +import { BlobError, isPlainObject } from './helpers'; import { uncontrolledMultipartUpload } from './multipart/uncontrolled'; import type { CreatePutMethodOptions, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6c58eb2f2..605dddd1f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,9 +56,6 @@ importers: is-buffer: specifier: ^2.0.5 version: 2.0.5 - is-plain-object: - specifier: ^5.0.0 - version: 5.0.0 undici: specifier: ^5.28.4 version: 5.28.4 @@ -5192,11 +5189,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - dev: false - /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true