Skip to content

Commit 1eeecd9

Browse files
committed
Remove dataRedirect utility
1 parent e15116a commit 1eeecd9

File tree

5 files changed

+10
-42
lines changed

5 files changed

+10
-42
lines changed

.changeset/new-hornets-run.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
---
2-
"react-router": minor
2+
"react-router": patch
33
---
44

5-
Add a new `dataRedirect` utility for performing redirects on `.data` requests outside of the React Router handler
5+
Update Single Fetch to also handle the 204 redirects used in `?_data` requests in Remix v2
6+
7+
- This allows applications to return a redirect on `.data` requests from outside the scope of React Router (i.e., an `express`/`hono` middleware)
8+
- ⚠️ Please note that doing so relies on implementation details that are subject to change without a SemVer major release
9+
- This is primarily done to ease upgrading to Single Fetch for existing Remix v2 applications, but the recommended way to handle this is redirecting from a route middleware

integration/single-fetch-test.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1482,13 +1482,9 @@ test.describe("single-fetch", () => {
14821482
customLogic: js`
14831483
app.use(async (req, res, next) => {
14841484
if (req.url === "/page.data") {
1485-
let { dataRedirect } = await import("react-router");
1486-
let response = dataRedirect("/target");
1487-
res.statusMessage = response.statusText;
1488-
res.status(response.status);
1489-
for (let [key, value] of response.headers.entries()) {
1490-
res.append(key, value);
1491-
}
1485+
res.status(204);
1486+
res.append('X-Remix-Status', '302');
1487+
res.append('X-Remix-Redirect', '/target');
14921488
res.end();
14931489
} else {
14941490
next();

packages/react-router/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ export {
6565
} from "./lib/router/router";
6666
export {
6767
data,
68-
dataRedirect,
6968
generatePath,
7069
isRouteErrorResponse,
7170
matchPath,

packages/react-router/lib/dom/ssr/single-fetch.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ async function fetchAndDecode(
551551
throw new ErrorResponseImpl(404, "Not Found", true);
552552
}
553553

554-
// Handle non-RR redirects (i.e., from express middleware via `dataRedirect`)
554+
// Handle non-RR redirects (i.e., from express middleware)
555555
if (res.status === 204 && res.headers.has("X-Remix-Redirect")) {
556556
let data: SingleFetchRedirectResult = {
557557
redirect: res.headers.get("X-Remix-Redirect")!,

packages/react-router/lib/router/utils.ts

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1605,37 +1605,6 @@ export const replace: RedirectFunction = (url, init) => {
16051605
return response;
16061606
};
16071607

1608-
/**
1609-
* A "soft" redirect response that can be returned from outside of React Router
1610-
* in response to a `.data` request. Options are available to set the status
1611-
* and toggle the equivalent behaviors of the traditional redirect utilities
1612-
* ()`redirect`/`replace`/`redirectDocument`)
1613-
*
1614-
* @category Utils
1615-
*/
1616-
export function dataRedirect(
1617-
url: string,
1618-
{
1619-
status,
1620-
replace,
1621-
revalidate,
1622-
reload,
1623-
}: {
1624-
status?: number;
1625-
replace?: boolean;
1626-
revalidate?: boolean;
1627-
reload?: boolean;
1628-
} = {}
1629-
) {
1630-
let headers = new Headers();
1631-
headers.set("X-Remix-Redirect", url);
1632-
if (status) headers.set("X-Remix-Status", String(status));
1633-
if (replace) headers.set("X-Remix-Replace", "true");
1634-
if (revalidate) headers.set("X-Remix-Revalidate", "true");
1635-
if (reload) headers.set("X-Remix-Reload-Document", "true");
1636-
return new Response(null, { status: 204, headers });
1637-
}
1638-
16391608
export type ErrorResponse = {
16401609
status: number;
16411610
statusText: string;

0 commit comments

Comments
 (0)