From 3ff12ce23787d9592050dbd1f2a5e191613dc81f Mon Sep 17 00:00:00 2001 From: "zhanghang.heal" Date: Thu, 20 Nov 2025 17:44:57 +0800 Subject: [PATCH] fix(retry-plugin): add autoParseResponse to auto-select JSON or text based on file extension --- .changeset/thirty-cooks-dream.md | 5 +++++ packages/retry-plugin/src/fetch-retry.ts | 14 +++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 .changeset/thirty-cooks-dream.md diff --git a/.changeset/thirty-cooks-dream.md b/.changeset/thirty-cooks-dream.md new file mode 100644 index 00000000000..b7b63084440 --- /dev/null +++ b/.changeset/thirty-cooks-dream.md @@ -0,0 +1,5 @@ +--- +'@module-federation/retry-plugin': patch +--- + +fix(retry-plugin): add autoParseResponse to auto-select JSON or text based on file extension diff --git a/packages/retry-plugin/src/fetch-retry.ts b/packages/retry-plugin/src/fetch-retry.ts index 8b43396da9d..0553860654e 100644 --- a/packages/retry-plugin/src/fetch-retry.ts +++ b/packages/retry-plugin/src/fetch-retry.ts @@ -9,6 +9,18 @@ import { import logger from './logger'; import { getRetryUrl, combineUrlDomainWithPathQuery } from './utils'; +function autoParseResponse(url: string, response: Response) { + try { + const parsed = new URL(url); + if (parsed.pathname.endsWith('.js')) { + return response.text(); + } + return response.json(); + } catch (error) { + return response.json(); + } +} + async function fetchRetry( params: FetchRetryOptions, lastRequestUrl?: string, @@ -63,7 +75,7 @@ async function fetchRetry( `${PLUGIN_IDENTIFIER}: Request failed: ${response.status} ${response.statusText || ''} | url: ${requestUrl}`, ); } - await responseClone.json().catch((error) => { + await autoParseResponse(requestUrl, responseClone).catch((error) => { throw new Error( `${PLUGIN_IDENTIFIER}: JSON parse failed: ${(error as Error)?.message || String(error)} | url: ${requestUrl}`, );