diff --git a/.changeset/pink-candles-allow.md b/.changeset/pink-candles-allow.md new file mode 100644 index 0000000000..bc888f8b6a --- /dev/null +++ b/.changeset/pink-candles-allow.md @@ -0,0 +1,5 @@ +--- +"react-router": patch +--- + +Fix `handleError` `params` values on `.data` requests 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); }