diff --git a/.changeset/rare-bikes-report.md b/.changeset/rare-bikes-report.md new file mode 100644 index 00000000000..6cebbae1e69 --- /dev/null +++ b/.changeset/rare-bikes-report.md @@ -0,0 +1,5 @@ +--- +"@remix-run/server-runtime": patch +--- + +Remove `instanceof Response` checks in favor of isResponse" diff --git a/integration/loader-test.ts b/integration/loader-test.ts index e8544423674..ea6149e2751 100644 --- a/integration/loader-test.ts +++ b/integration/loader-test.ts @@ -69,17 +69,22 @@ test.describe("loader in an app", () => { let appFixture: AppFixture; let HOME_PAGE_TEXT = "hello world"; + let REDIRECT_TARGET_TEXT = "redirect target"; + let FETCH_TARGET_TEXT = "fetch target"; test.beforeAll(async () => { appFixture = await createAppFixture( await createFixture({ files: { "app/root.jsx": js` + import { Outlet } from '@remix-run/react' + export default function Root() { return ( ${HOME_PAGE_TEXT} + ); @@ -87,9 +92,25 @@ test.describe("loader in an app", () => { `, "app/routes/redirect.jsx": js` import { redirect } from "@remix-run/node"; - export const loader = () => redirect("/"); + export const loader = () => redirect("/redirect-target"); export default () =>
Yo
`, + "app/routes/redirect-target.jsx": js` + export default () =>
${REDIRECT_TARGET_TEXT}
+ `, + "app/routes/fetch.jsx": js` + export function loader({ request }) { + return fetch(new URL(request.url).origin + '/fetch-target'); + } + `, + + "app/routes/fetch-target.jsx": js` + import { json } from "@remix-run/node"; + + export function loader() { + return json({ message: "${FETCH_TARGET_TEXT}" }) + } + `, }, }) ); @@ -103,5 +124,12 @@ test.describe("loader in an app", () => { let app = new PlaywrightFixture(appFixture, page); await app.goto("/redirect"); expect(await app.getHtml()).toMatch(HOME_PAGE_TEXT); + expect(await app.getHtml()).toMatch(REDIRECT_TARGET_TEXT); + }); + + test("handles raw fetch responses", async ({ page }) => { + let app = new PlaywrightFixture(appFixture, page); + let res = await app.goto(`/fetch`); + expect((await res.json()).message).toBe(FETCH_TARGET_TEXT); }); }); diff --git a/packages/remix-server-runtime/package.json b/packages/remix-server-runtime/package.json index 72291026910..9d439db9424 100644 --- a/packages/remix-server-runtime/package.json +++ b/packages/remix-server-runtime/package.json @@ -16,7 +16,7 @@ "typings": "dist/index.d.ts", "module": "dist/esm/index.js", "dependencies": { - "@remix-run/router": "1.0.5-pre.0", + "@remix-run/router": "1.0.5-pre.1", "@types/cookie": "^0.4.0", "@web3-storage/multipart-parser": "^1.0.0", "cookie": "^0.4.1", diff --git a/packages/remix-server-runtime/server.ts b/packages/remix-server-runtime/server.ts index feea61bdbd7..b3a403a7668 100644 --- a/packages/remix-server-runtime/server.ts +++ b/packages/remix-server-runtime/server.ts @@ -17,7 +17,7 @@ import type { RouteMatch } from "./routeMatching"; import { matchServerRoutes } from "./routeMatching"; import type { ServerRoute, ServerRouteManifest } from "./routes"; import { createStaticHandlerDataRoutes, createRoutes } from "./routes"; -import { json, isRedirectResponse } from "./responses"; +import { json, isRedirectResponse, isResponse } from "./responses"; import { createServerHandoffString } from "./serverHandoff"; export type RequestHandler = ( @@ -123,7 +123,7 @@ async function handleDataRequestRR( return response; } catch (error) { - if (error instanceof Response) { + if (isResponse(error)) { error.headers.set("X-Remix-Catch", "yes"); return error; } @@ -217,7 +217,7 @@ async function handleDocumentRequestRR( return new Response(null, { status: 500 }); } - if (context instanceof Response) { + if (isResponse(context)) { return context; } @@ -373,12 +373,12 @@ async function handleResourceRequestRR( let response = await staticHandler.queryRoute(request, routeId); // callRouteLoader/callRouteAction always return responses invariant( - response instanceof Response, + isResponse(response), "Expected a Response to be returned from queryRoute" ); return response; } catch (error) { - if (error instanceof Response) { + if (isResponse(error)) { // Note: Not functionally required but ensures that our response headers // match identically to what Remix returns error.headers.set("X-Remix-Catch", "yes"); diff --git a/yarn.lock b/yarn.lock index 0bb377ea839..b86dbead77e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2069,10 +2069,10 @@ "@changesets/types" "^5.0.0" dotenv "^8.1.0" -"@remix-run/router@1.0.5-pre.0": - version "1.0.5-pre.0" - resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.0.5-pre.0.tgz#d5327cc606b444b9721dd0856ad18760e8d75d6d" - integrity sha512-7UWQ6HcuNHbKeCiOKD94WDz+FAeeJVzxVi+GNeLczzEdJtqKAvYMiXqJ/IF84T8479+bUrEm/zp7hr+itZs8Zg== +"@remix-run/router@1.0.5-pre.1": + version "1.0.5-pre.1" + resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.0.5-pre.1.tgz#dd0939d1631ebd56faa2bc69141e94a96887c7e5" + integrity sha512-dDfVwp0ta99+7vMKMDb5eh1Pc9CWZ5/Q+679YojyHyrZqSWJmlZyCP7prs6UAaXaGg5MveP1pCav/YFCINlcFw== "@remix-run/web-blob@^3.0.3", "@remix-run/web-blob@^3.0.4": version "3.0.4"