From 530c5a14e993ec8401c0fbadb1405a414edad50c Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Mon, 28 Apr 2025 16:45:14 -0400 Subject: [PATCH 1/2] fix handleError params values on dynamic param data calls --- .changeset/pink-candles-allow.md | 5 ++ .../server-runtime/handle-error-test.ts | 61 ++++++++++++++++++- .../react-router/lib/server-runtime/server.ts | 2 +- 3 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 .changeset/pink-candles-allow.md diff --git a/.changeset/pink-candles-allow.md b/.changeset/pink-candles-allow.md new file mode 100644 index 0000000000..00d5d94c4b --- /dev/null +++ b/.changeset/pink-candles-allow.md @@ -0,0 +1,5 @@ +--- +"react-router": patch +--- + +Fix `handleError` `params` values on `.data` reqeusts for routes with a dynamic param as the last URL segment diff --git a/packages/react-router/__tests__/server-runtime/handle-error-test.ts b/packages/react-router/__tests__/server-runtime/handle-error-test.ts index dfb751373d..756d0b9554 100644 --- a/packages/react-router/__tests__/server-runtime/handle-error-test.ts +++ b/packages/react-router/__tests__/server-runtime/handle-error-test.ts @@ -112,7 +112,7 @@ describe("handleError", () => { throw error; }, }); - let request = new Request("http://example.com/?_data=root"); + let request = new Request("http://example.com/_root.data"); await handler(request); expect(handleErrorSpy).toHaveBeenCalledWith(error, { request, @@ -123,7 +123,7 @@ describe("handleError", () => { it("provides router-thrown ErrorResponse", async () => { let { handler, handleErrorSpy } = getHandler({}); - let request = new Request("http://example.com/?_data=root", { + let request = new Request("http://example.com/_root.data", { method: "post", }); await handler(request); @@ -153,10 +153,65 @@ describe("handleError", () => { ); }, }); - let request = new Request("http://example.com/?_data=root"); + let request = new Request("http://example.com/_root.data"); await handler(request); expect(handleErrorSpy).not.toHaveBeenCalled(); }); + + it("provides proper params to handleError", async () => { + let error = new Error("💥"); + + let handleErrorSpy = jest.fn(); + let build: ServerBuild = { + routes: { + param: { + id: "param", + path: "/:param", + module: { + default() { + return null; + }, + loader() { + throw error; + }, + }, + }, + }, + entry: { + module: { + handleError: handleErrorSpy, + default() { + return new Response("Dummy document"); + }, + }, + }, + future: { + // Fill in the required values + unstable_middleware: false, + unstable_subResourceIntegrity: false, + }, + prerender: [], + assets: { + entry: { imports: [], module: "" }, + routes: {}, + url: "", + version: "", + }, + assetsBuildDirectory: "", + publicPath: "/", + ssr: true, + isSpaMode: false, + }; + + let handler = createRequestHandler(build); + let request = new Request("http://example.com/a.data"); + await handler(request); + expect(handleErrorSpy).toHaveBeenCalledWith(error, { + request, + params: { param: "a" }, + context: {}, + }); + }); }); describe("resource request", () => { diff --git a/packages/react-router/lib/server-runtime/server.ts b/packages/react-router/lib/server-runtime/server.ts index 1bb83d7041..662c1a2c81 100644 --- a/packages/react-router/lib/server-runtime/server.ts +++ b/packages/react-router/lib/server-runtime/server.ts @@ -216,7 +216,7 @@ export const createRequestHandler: CreateRequestHandlerFunction = ( } } - let matches = matchServerRoutes(routes, url.pathname, _build.basename); + let matches = matchServerRoutes(routes, normalizedPath, _build.basename); if (matches && matches.length > 0) { Object.assign(params, matches[0].params); } From 6d9f597720036a0914e8a967ccfb5c96548ab885 Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Mon, 28 Apr 2025 17:12:44 -0400 Subject: [PATCH 2/2] Update .changeset/pink-candles-allow.md --- .changeset/pink-candles-allow.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/pink-candles-allow.md b/.changeset/pink-candles-allow.md index 00d5d94c4b..bc888f8b6a 100644 --- a/.changeset/pink-candles-allow.md +++ b/.changeset/pink-candles-allow.md @@ -2,4 +2,4 @@ "react-router": patch --- -Fix `handleError` `params` values on `.data` reqeusts for routes with a dynamic param as the last URL segment +Fix `handleError` `params` values on `.data` requests for routes with a dynamic param as the last URL segment