diff --git a/.changeset/five-bottles-press.md b/.changeset/five-bottles-press.md new file mode 100644 index 0000000000..d63704b34a --- /dev/null +++ b/.changeset/five-bottles-press.md @@ -0,0 +1,11 @@ +--- +"@remix-run/router": minor +--- + +`redirect` now accepts a `replace` option in the same way as `navigate`. + +```ts +loader: () => { + return redirect("/", { replace: true }); +}; +``` diff --git a/contributors.yml b/contributors.yml index 0956acf022..53927f618a 100644 --- a/contributors.yml +++ b/contributors.yml @@ -34,6 +34,7 @@ - bhbs - bilalk711 - bobziroll +- Brendonovich - BrianT1414 - brockross - brookslybrand diff --git a/packages/router/router.ts b/packages/router/router.ts index 5992912a11..227f04b56a 100644 --- a/packages/router/router.ts +++ b/packages/router/router.ts @@ -1796,7 +1796,9 @@ export function createRouter(init: RouterInit): Router { revalidatingFetchers[redirect.idx - matchesToLoad.length].key; fetchRedirectIds.add(fetcherKey); } - await startRedirectNavigation(state, redirect.result, { replace }); + await startRedirectNavigation(state, redirect.result, { + replace: replace || redirect.result.replace, + }); return { shortCircuited: true }; } @@ -2118,7 +2120,9 @@ export function createRouter(init: RouterInit): Router { revalidatingFetchers[redirect.idx - matchesToLoad.length].key; fetchRedirectIds.add(fetcherKey); } - return startRedirectNavigation(state, redirect.result); + return startRedirectNavigation(state, redirect.result, { + replace: redirect.result.replace, + }); } // Process and commit output from loaders @@ -4066,6 +4070,7 @@ async function callLoaderOrAction( type: ResultType.redirect, status, location, + replace: result.headers.get("X-Remix-Redirect-Replace") !== null, revalidate: result.headers.get("X-Remix-Revalidate") !== null, reloadDocument: result.headers.get("X-Remix-Reload-Document") !== null, }; diff --git a/packages/router/utils.ts b/packages/router/utils.ts index bc9a4b211b..7e1ea872d3 100644 --- a/packages/router/utils.ts +++ b/packages/router/utils.ts @@ -44,6 +44,7 @@ export interface RedirectResult { location: string; revalidate: boolean; reloadDocument?: boolean; + replace?: boolean; } /** @@ -1543,7 +1544,7 @@ export const defer: DeferFunction = (data, init = {}) => { export type RedirectFunction = ( url: string, - init?: number | ResponseInit + init?: number | (ResponseInit & { replace?: boolean }) ) => Response; /** @@ -1561,6 +1562,9 @@ export const redirect: RedirectFunction = (url, init = 302) => { let headers = new Headers(responseInit.headers); headers.set("Location", url); + if (typeof init === "object" && init.replace) + headers.set("X-Remix-Redirect-Replace", "true"); + return new Response(null, { ...responseInit, headers,