From deef3feebbfb67331e5aa50158d34f35be05a95e Mon Sep 17 00:00:00 2001 From: Tom Klaver Date: Tue, 8 Apr 2025 10:24:44 +0200 Subject: [PATCH 1/2] feat: Attach fetch response to SWR data/error It is useful to have the original fetch response available in the hook result. For instance to distinguish the HTTP status code in case of an `error`. Since SWR only returns `error` / `data` properties, this provides an escape hatch to be able to access to original `fetch` response, as returned by the `openapi-fetch` client. --- packages/swr-openapi/src/query-base.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/swr-openapi/src/query-base.ts b/packages/swr-openapi/src/query-base.ts index 234101842..36582f3d2 100644 --- a/packages/swr-openapi/src/query-base.ts +++ b/packages/swr-openapi/src/query-base.ts @@ -4,6 +4,8 @@ import type { Fetcher, SWRHook } from "swr"; import type { TypesForGetRequest } from "./types.js"; import { useCallback, useDebugValue, useMemo } from "react"; +export const RESPONSE = Symbol.for('response'); + /** * @private */ @@ -35,8 +37,18 @@ export function configureBaseQueryHook(useHook: SWRHook) { // @ts-expect-error TODO: Improve internal init types const res = await client.GET(path, init); if (res.error) { + Object.defineProperty(res.error, RESPONSE, { + value: res.response, + enumerable: false, + }); throw res.error; } + if (res.data) { + Object.defineProperty(res.data, RESPONSE, { + value: res.response, + enumerable: false, + }); + } return res.data as Data; }, [client], From 4070c426307f1309c2bc7cfb43e3a727e78baa37 Mon Sep 17 00:00:00 2001 From: Tom Klaver Date: Tue, 8 Apr 2025 10:33:34 +0200 Subject: [PATCH 2/2] fix --- packages/swr-openapi/src/query-base.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/swr-openapi/src/query-base.ts b/packages/swr-openapi/src/query-base.ts index 36582f3d2..edd180812 100644 --- a/packages/swr-openapi/src/query-base.ts +++ b/packages/swr-openapi/src/query-base.ts @@ -4,7 +4,7 @@ import type { Fetcher, SWRHook } from "swr"; import type { TypesForGetRequest } from "./types.js"; import { useCallback, useDebugValue, useMemo } from "react"; -export const RESPONSE = Symbol.for('response'); +export const RESPONSE = Symbol.for("response"); /** * @private @@ -43,7 +43,7 @@ export function configureBaseQueryHook(useHook: SWRHook) { }); throw res.error; } - if (res.data) { + if (res.data && typeof res.data === "object") { Object.defineProperty(res.data, RESPONSE, { value: res.response, enumerable: false,