From f0afa8a4a7f7309a977a3570cc308741905848f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ullrich=20Sch=C3=A4fer?= Date: Wed, 25 Mar 2026 00:11:48 +0100 Subject: [PATCH] Fix withDb: detect DataWithResponseInit from data() throws MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit React Router's data() throw creates a DataWithResponseInit object (type + data + init), not a Response or ErrorResponseImpl. Check for type === "DataWithResponseInit" to re-throw correctly. Verified: nonexistent session → 404, DB down → 503. Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/db/src/index.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/db/src/index.ts b/packages/db/src/index.ts index 26f84fa..5d5e6b8 100644 --- a/packages/db/src/index.ts +++ b/packages/db/src/index.ts @@ -20,12 +20,12 @@ export type Database = ReturnType; */ export function withDb(handler: () => Promise): Promise { return handler().catch((error) => { - // Re-throw anything that looks like a React Router response: - // - Response (redirects) - // - ErrorResponseImpl from data() throws (has status + data) + // Re-throw React Router responses and data() throws: + // - Response instances (redirects, manual responses) + // - DataWithResponseInit from data() throws (type + data + init) if ( error instanceof Response || - (error != null && typeof error === "object" && "status" in error) + (error != null && typeof error === "object" && error.type === "DataWithResponseInit") ) { throw error; } @@ -34,7 +34,6 @@ export function withDb(handler: () => Promise): Promise { const message = error instanceof Error ? error.message : String(error); console.error("[withDb] Database error:", message); - // Use the same shape as data() throw so isRouteErrorResponse works throw new Response("Database unavailable", { status: 503, statusText: "Service Unavailable" }); }); }