From 1987423f7a28a7f04f3f35e72b1c36a6cad4a095 Mon Sep 17 00:00:00 2001 From: Bereket Engida Date: Mon, 9 Sep 2024 12:30:42 +0300 Subject: [PATCH] feat: error object should be returned onError hook --- package.json | 1 + packages/better-fetch/src/fetch.ts | 12 +++++++---- packages/better-fetch/src/plugins.ts | 2 ++ packages/better-fetch/src/test/fetch.test.ts | 21 ++++++++++++++++---- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index be19218..9e2a9c7 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "dev": "pnpm -F fetch dev", "test": "pnpm --filter \"./packages/*\" test", "bump": "bumpp \"./packages/*/package.json\"", + "release": "pnpm build && pnpm bump && pnpm publish --access public", "typecheck": "pnpm -r typecheck", "lint": "biome check .", "format": "biome check . --apply" diff --git a/packages/better-fetch/src/fetch.ts b/packages/better-fetch/src/fetch.ts index 9bd3803..909fd99 100644 --- a/packages/better-fetch/src/fetch.ts +++ b/packages/better-fetch/src/fetch.ts @@ -152,12 +152,20 @@ export const betterFetch = async < error: null, } as any; } + const parser = options?.jsonParser ?? jsonParse; + const text = await response.text(); + const errorObject = isJSONParsable(text) ? await parser(text) : {}; /** * Error Branch */ const errorContext = { response, request: context, + error: { + ...errorObject, + status: response.status, + statusText: response.statusText, + }, }; for (const onError of hooks.onError) { if (onError) { @@ -188,10 +196,6 @@ export const betterFetch = async < } } - const parser = options?.jsonParser ?? jsonParse; - const text = await response.text(); - const errorObject = isJSONParsable(text) ? await parser(text) : {}; - if (options?.throw) { throw new BetterFetchError( response.status, diff --git a/packages/better-fetch/src/plugins.ts b/packages/better-fetch/src/plugins.ts index c8a1626..71b3ca3 100644 --- a/packages/better-fetch/src/plugins.ts +++ b/packages/better-fetch/src/plugins.ts @@ -1,6 +1,7 @@ import { ZodSchema } from "zod"; import { Schema } from "./create-fetch"; import type { BetterFetchOption } from "./types"; +import { BetterFetchError } from "./error"; export type RequestContext = any> = { url: URL; @@ -21,6 +22,7 @@ export type SuccessContext = { export type ErrorContext = { response: Response; request: RequestContext; + error: BetterFetchError & Record; }; export interface FetchHooks { /** diff --git a/packages/better-fetch/src/test/fetch.test.ts b/packages/better-fetch/src/test/fetch.test.ts index 768e88a..a66cc41 100644 --- a/packages/better-fetch/src/test/fetch.test.ts +++ b/packages/better-fetch/src/test/fetch.test.ts @@ -303,16 +303,29 @@ describe("hooks", () => { const f = createFetch({ baseURL: "http://localhost:4001", customFetchImpl: async (req, init) => { - return new Response(null, { - status: 500, - }); + return new Response( + JSON.stringify({ + message: "Server Error", + }), + { + status: 500, + }, + ); }, onError, onResponse, onSuccess, }); await f("/ok"); - expect(onError).toHaveBeenCalled(); + expect(onError).toHaveBeenCalledWith({ + request: expect.any(Object), + response: expect.any(Response), + error: { + message: "Server Error", + status: 500, + statusText: "", + }, + }); expect(onResponse).toHaveBeenCalled(); expect(onSuccess).not.toHaveBeenCalled(); });