From bb0edf566bf0205c9051c3460fe678a847246f5a Mon Sep 17 00:00:00 2001 From: ryota iso Date: Sun, 14 Dec 2025 17:19:55 +0900 Subject: [PATCH] feat: add body stringification for application/json content-type --- packages/better-fetch/src/test/fetch.test.ts | 12 ++++++++++++ packages/better-fetch/src/utils.ts | 7 ++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/better-fetch/src/test/fetch.test.ts b/packages/better-fetch/src/test/fetch.test.ts index 83a08da..5043b48 100644 --- a/packages/better-fetch/src/test/fetch.test.ts +++ b/packages/better-fetch/src/test/fetch.test.ts @@ -114,6 +114,18 @@ describe("fetch", () => { expect(data?.body).to.deep.eq(message); }); + it("stringifies body when content-type is explicitly application/json", async () => { + const payload = { foo: "bar" }; + const { data } = await $echo("/echo", { + method: "POST", + body: payload, + headers: { "Content-Type": "application/json" }, + }); + + expect(data?.body).toEqual(payload); + expect(data?.headers).to.include({ "content-type": "application/json" }); + }); + it("Bypass URLSearchParams body", async () => { const data = new URLSearchParams({ foo: "bar" }); const { data: res } = await betterFetch(getURL("post"), { diff --git a/packages/better-fetch/src/utils.ts b/packages/better-fetch/src/utils.ts index e4b0c88..32672f3 100644 --- a/packages/better-fetch/src/utils.ts +++ b/packages/better-fetch/src/utils.ts @@ -197,7 +197,12 @@ export function getBody(options?: BetterFetchOption) { return null; } const headers = new Headers(options?.headers); - if (isJSONSerializable(options.body) && !headers.has("content-type")) { + const contentType = headers.get("content-type"); + const isJSONContentType = contentType && JSON_RE.test(contentType); + if ( + isJSONSerializable(options.body) && + (!headers.has("content-type") || isJSONContentType) + ) { for (const [key, value] of Object.entries(options?.body)) { if (value instanceof Date) { options.body[key] = value.toISOString();