From 0d9bc26bec0c69b8d705309212daa594b85202c5 Mon Sep 17 00:00:00 2001 From: Daniil Gitelson Date: Fri, 14 Jul 2023 21:18:44 +0600 Subject: [PATCH 1/4] Fix isQueryRouteResponse Typo during check in isQueryRouteResponse --- packages/router/router.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/router/router.ts b/packages/router/router.ts index ca7163d13b..d84db507b6 100644 --- a/packages/router/router.ts +++ b/packages/router/router.ts @@ -4220,7 +4220,7 @@ function isQueryRouteResponse(obj: any): obj is QueryRouteResponse { return ( obj && isResponse(obj.response) && - (obj.type === ResultType.data || ResultType.error) + (obj.type === ResultType.data || obj.type === ResultType.error) ); } From 99c58442a8882942e70423102805e8ebdf2f5c93 Mon Sep 17 00:00:00 2001 From: Daniil Gitelson Date: Fri, 14 Jul 2023 21:27:03 +0600 Subject: [PATCH 2/4] Signed CLA by adding daniilguit to contributors.yml --- contributors.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/contributors.yml b/contributors.yml index b0fc66fe83..3f31fe2a05 100644 --- a/contributors.yml +++ b/contributors.yml @@ -48,6 +48,7 @@ - cvbuelow - damianstasik - danielberndt +- daniilguit - dauletbaev - david-crespo - decadentsavant From 6933ae682a88023d33301dcfd613c9502674944d Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Wed, 19 Jul 2023 08:46:23 -0400 Subject: [PATCH 3/4] Add unit tests and changeset --- .changeset/fix-query-route-response.md | 5 +++ packages/router/__tests__/router-test.ts | 40 ++++++++++++++++++++++++ packages/router/router.ts | 6 ++-- 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 .changeset/fix-query-route-response.md diff --git a/.changeset/fix-query-route-response.md b/.changeset/fix-query-route-response.md new file mode 100644 index 0000000000..55d77cf45e --- /dev/null +++ b/.changeset/fix-query-route-response.md @@ -0,0 +1,5 @@ +--- +"@remix-run/router": patch +--- + +Fix an issue in `queryRoute` that was not always identifying thrown `Response` instances diff --git a/packages/router/__tests__/router-test.ts b/packages/router/__tests__/router-test.ts index 51fe38a0ff..4bdd1c4c7f 100644 --- a/packages/router/__tests__/router-test.ts +++ b/packages/router/__tests__/router-test.ts @@ -16230,6 +16230,46 @@ describe("a router", () => { expect(await data.json()).toEqual({ key: "value" }); }); + it("should not unwrap responses thrown from loaders", async () => { + let response = json({ key: "value" }); + let { queryRoute } = createStaticHandler([ + { + id: "root", + path: "/", + loader: () => Promise.reject(response), + }, + ]); + let request = createRequest("/"); + let data; + try { + await queryRoute(request, { routeId: "root" }); + } catch (e) { + data = e; + } + expect(data instanceof Response).toBe(true); + expect(await data.json()).toEqual({ key: "value" }); + }); + + it("should not unwrap responses thrown from actions", async () => { + let response = json({ key: "value" }); + let { queryRoute } = createStaticHandler([ + { + id: "root", + path: "/", + action: () => Promise.reject(response), + }, + ]); + let request = createSubmitRequest("/"); + let data; + try { + await queryRoute(request, { routeId: "root" }); + } catch (e) { + data = e; + } + expect(data instanceof Response).toBe(true); + expect(await data.json()).toEqual({ key: "value" }); + }); + it("should handle aborted load requests", async () => { let dfd = createDeferred(); let controller = new AbortController(); diff --git a/packages/router/router.ts b/packages/router/router.ts index d84db507b6..6ab1bfebf0 100644 --- a/packages/router/router.ts +++ b/packages/router/router.ts @@ -2789,7 +2789,7 @@ export function createStaticHandler( // it to bail out and then return or throw here based on whether the user // returned or threw if (isQueryRouteResponse(e)) { - if (e.type === ResultType.error && !isRedirectResponse(e.response)) { + if (e.type === ResultType.error) { throw e.response; } return e.response; @@ -3741,11 +3741,11 @@ async function callLoaderOrAction( // without unwrapping. We do this with the QueryRouteResponse wrapper // interface so we can know whether it was returned or thrown if (opts.isRouteRequest) { - // eslint-disable-next-line no-throw-literal - throw { + let queryRouteResponse: QueryRouteResponse = { type: resultType || ResultType.data, response: result, }; + throw queryRouteResponse; } let data: any; From 94e5442f589800fcfd32dfdda9a230a95cc1c343 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Wed, 19 Jul 2023 08:48:47 -0400 Subject: [PATCH 4/4] Update --- packages/router/router.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/router/router.ts b/packages/router/router.ts index 6ab1bfebf0..9d28f016df 100644 --- a/packages/router/router.ts +++ b/packages/router/router.ts @@ -3742,7 +3742,8 @@ async function callLoaderOrAction( // interface so we can know whether it was returned or thrown if (opts.isRouteRequest) { let queryRouteResponse: QueryRouteResponse = { - type: resultType || ResultType.data, + type: + resultType === ResultType.error ? ResultType.error : ResultType.data, response: result, }; throw queryRouteResponse;