Skip to content

Commit

Permalink
fix: update createHref to be history-aware
Browse files Browse the repository at this point in the history
  • Loading branch information
brophdawg11 committed Oct 5, 2022
1 parent 20499b5 commit 31af3cd
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 2 deletions.
98 changes: 97 additions & 1 deletion packages/react-router-dom/__tests__/link-href-test.tsx
@@ -1,6 +1,18 @@
import * as React from "react";
import { createRoot } from "react-dom/client";
import * as TestRenderer from "react-test-renderer";
import { MemoryRouter, Routes, Route, Link, Outlet } from "react-router-dom";
import {
MemoryRouter,
Routes,
Route,
Link,
Outlet,
BrowserRouter,
HashRouter,
createBrowserRouter,
RouterProvider,
createHashRouter,
} from "react-router-dom";

describe("<Link> href", () => {
describe("in a static route", () => {
Expand Down Expand Up @@ -679,4 +691,88 @@ describe("<Link> href", () => {
);
});
});

it("inside a browser router", () => {
let node: HTMLDivElement = document.createElement("div");
document.body.appendChild(node);
TestRenderer.act(() => {
createRoot(node).render(
<BrowserRouter>
<Routes>
<Route
path="/"
element={<Link to="/path?search=value#hash">Link</Link>}
/>
</Routes>
</BrowserRouter>
);
});

expect(node.innerHTML).toMatchInlineSnapshot(
`"<a href=\\"/path?search=value#hash\\">Link</a>"`
);

document.body.removeChild(node);
node = null!;
});

it("inside a hash router", () => {
let node: HTMLDivElement = document.createElement("div");
document.body.appendChild(node);
TestRenderer.act(() => {
createRoot(node).render(
<HashRouter>
<Routes>
<Route
path="/"
element={<Link to="/path?search=value#hash">Link</Link>}
/>
</Routes>
</HashRouter>
);
});

expect(node.innerHTML).toMatchInlineSnapshot(
`"<a href=\\"#/path?search=value#hash\\">Link</a>"`
);

document.body.removeChild(node);
node = null!;
});

it("inside a data browser router", () => {
let node: HTMLDivElement = document.createElement("div");
document.body.appendChild(node);
TestRenderer.act(() => {
let router = createBrowserRouter([
{ path: "/", element: <Link to="/path?search=value#hash">Link</Link> },
]);
createRoot(node).render(<RouterProvider router={router} />);
});

expect(node.innerHTML).toMatchInlineSnapshot(
`"<a href=\\"/path?search=value#hash\\">Link</a>"`
);

document.body.removeChild(node);
node = null!;
});

it("inside a data hash router", () => {
let node: HTMLDivElement = document.createElement("div");
document.body.appendChild(node);
TestRenderer.act(() => {
let router = createHashRouter([
{ path: "/", element: <Link to="/path?search=value#hash">Link</Link> },
]);
createRoot(node).render(<RouterProvider router={router} />);
});

expect(node.innerHTML).toMatchInlineSnapshot(
`"<a href=\\"#/path?search=value#hash\\">Link</a>"`
);

document.body.removeChild(node);
node = null!;
});
});
4 changes: 3 additions & 1 deletion packages/router/router.ts
Expand Up @@ -1739,7 +1739,9 @@ export function createRouter(init: RouterInit): Router {
navigate,
fetch,
revalidate,
createHref,
// Passthrough to history-aware createHref used by useHref so we get proper
// hash-aware URLs in DOM paths
createHref: (to: To) => init.history.createHref(to),
getFetcher,
deleteFetcher,
dispose,
Expand Down

0 comments on commit 31af3cd

Please sign in to comment.