From e5bcd915c72134f29e2ffc92ef92210cbcf4ee63 Mon Sep 17 00:00:00 2001 From: dswbx Date: Wed, 28 Aug 2024 07:13:24 +0200 Subject: [PATCH 1/2] fix wouter link to prevent crash without href/to --- packages/wouter/src/index.js | 4 +++- packages/wouter/test/link.test.tsx | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/wouter/src/index.js b/packages/wouter/src/index.js index 8a20f8b..fc13290 100644 --- a/packages/wouter/src/index.js +++ b/packages/wouter/src/index.js @@ -265,7 +265,9 @@ export const Link = forwardRef((props, ref) => { // handle nested routers and absolute paths const href = router.hrefs( - targetPath[0] === "~" ? targetPath.slice(1) : router.base + targetPath, + (targetPath ?? "")[0] === "~" + ? targetPath.slice(1) + : router.base + targetPath, router // pass router as a second argument for convinience ); diff --git a/packages/wouter/test/link.test.tsx b/packages/wouter/test/link.test.tsx index 5208024..204027d 100644 --- a/packages/wouter/test/link.test.tsx +++ b/packages/wouter/test/link.test.tsx @@ -322,4 +322,17 @@ describe(" with `asChild` prop", () => { expect(link).toHaveAttribute("href", "/about"); expect(link).toHaveTextContent("Click Me"); }); + + it("missing href or to won't crash", () => { + const { getByText } = render( + /* @ts-expect-error */ + Click Me + ); + + const link = getByText("Click Me"); + + expect(link.tagName).toBe("A"); + expect(link).toHaveAttribute("href", undefined); + expect(link).toHaveTextContent("Click Me"); + }); }); From 23873a1be5cdb99fa124ef6d6a5b379a3ac7935a Mon Sep 17 00:00:00 2001 From: dswbx Date: Wed, 28 Aug 2024 19:18:11 +0200 Subject: [PATCH 2/2] ensure 'to' to be string on destructor --- packages/wouter/src/index.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/wouter/src/index.js b/packages/wouter/src/index.js index fc13290..795abed 100644 --- a/packages/wouter/src/index.js +++ b/packages/wouter/src/index.js @@ -230,7 +230,7 @@ export const Link = forwardRef((props, ref) => { const [currentPath, navigate] = useLocationFromRouter(router); const { - to, + to = "", href: targetPath = to, onClick: _onClick, asChild, @@ -265,9 +265,7 @@ export const Link = forwardRef((props, ref) => { // handle nested routers and absolute paths const href = router.hrefs( - (targetPath ?? "")[0] === "~" - ? targetPath.slice(1) - : router.base + targetPath, + targetPath[0] === "~" ? targetPath.slice(1) : router.base + targetPath, router // pass router as a second argument for convinience );