From 0d819e60e6a533bc4183dc21c7c0d10e24d87a1e Mon Sep 17 00:00:00 2001 From: Brenley Dueck Date: Wed, 2 Jul 2025 16:57:33 -0500 Subject: [PATCH 1/5] chore: add failing e2e test for solid stale bug --- .../basic-file-based/src/routes/posts.$postId.tsx | 1 + e2e/solid-router/basic-file-based/tests/app.spec.ts | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/e2e/solid-router/basic-file-based/src/routes/posts.$postId.tsx b/e2e/solid-router/basic-file-based/src/routes/posts.$postId.tsx index a112484f11..7b2bd5c4ad 100644 --- a/e2e/solid-router/basic-file-based/src/routes/posts.$postId.tsx +++ b/e2e/solid-router/basic-file-based/src/routes/posts.$postId.tsx @@ -14,6 +14,7 @@ export const Route = createFileRoute('/posts/$postId')({ return

Post not found

}, component: PostComponent, + // staleTime: 0 // This causes e2e to pass }) function PostComponent() { diff --git a/e2e/solid-router/basic-file-based/tests/app.spec.ts b/e2e/solid-router/basic-file-based/tests/app.spec.ts index 767ebe0468..365246d893 100644 --- a/e2e/solid-router/basic-file-based/tests/app.spec.ts +++ b/e2e/solid-router/basic-file-based/tests/app.spec.ts @@ -261,3 +261,14 @@ test('Should change title on client side navigation', async ({ page }) => { await expect(page).toHaveTitle('Posts page') }) + +test('Should change post navigating back and forth', async ({ page }) => { + await page.goto('/posts/1') + await page.getByRole('link', { name: 'sunt aut facere repe' }).click() + + await page.getByRole('link', { name: 'qui est esse' }).click() + await expect(page.getByTestId('post-title')).toContainText('qui est esse') + + await page.getByRole('link', { name: 'sunt aut facere repe' }).click() + await expect(page.getByTestId('post-title')).toContainText('sunt aut facere') +}) From 281259a33f75018dcc5b11c718ab06314b974fdf Mon Sep 17 00:00:00 2001 From: Brenley Dueck Date: Sat, 5 Jul 2025 19:01:20 -0500 Subject: [PATCH 2/5] fix: remount component if match id changes --- e2e/solid-router/basic-file-based/src/routes/posts.$postId.tsx | 1 - packages/solid-router/src/Match.tsx | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/e2e/solid-router/basic-file-based/src/routes/posts.$postId.tsx b/e2e/solid-router/basic-file-based/src/routes/posts.$postId.tsx index 7b2bd5c4ad..a112484f11 100644 --- a/e2e/solid-router/basic-file-based/src/routes/posts.$postId.tsx +++ b/e2e/solid-router/basic-file-based/src/routes/posts.$postId.tsx @@ -14,7 +14,6 @@ export const Route = createFileRoute('/posts/$postId')({ return

Post not found

}, component: PostComponent, - // staleTime: 0 // This causes e2e to pass }) function PostComponent() { diff --git a/packages/solid-router/src/Match.tsx b/packages/solid-router/src/Match.tsx index 7edb592d20..8c98ee0923 100644 --- a/packages/solid-router/src/Match.tsx +++ b/packages/solid-router/src/Match.tsx @@ -210,6 +210,9 @@ export const MatchInner = (props: { matchId: string }): any => { const match = () => matchState().match const out = () => { + // track the match id to remount the component + matchState().match.id + const Comp = route().options.component ?? router.options.defaultComponent if (Comp) { return From 087a3408aa01da4a03112b0fa1918cb5f1409939 Mon Sep 17 00:00:00 2001 From: Brenley Dueck Date: Sat, 5 Jul 2025 19:10:51 -0500 Subject: [PATCH 3/5] Retrigger CI From e61d45e2ba4d231696332b766917accda33c736f Mon Sep 17 00:00:00 2001 From: Brenley Dueck Date: Sat, 5 Jul 2025 19:23:48 -0500 Subject: [PATCH 4/5] chore: add react test for changing posts --- e2e/react-router/basic-file-based/tests/app.spec.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/e2e/react-router/basic-file-based/tests/app.spec.ts b/e2e/react-router/basic-file-based/tests/app.spec.ts index 11b8a18770..d41ed601c2 100644 --- a/e2e/react-router/basic-file-based/tests/app.spec.ts +++ b/e2e/react-router/basic-file-based/tests/app.spec.ts @@ -273,3 +273,14 @@ test('Should change title on client side navigation', async ({ page }) => { await expect(page).toHaveTitle('Posts page') }) + +test('Should change post navigating back and forth', async ({ page }) => { + await page.goto('/posts/1') + await page.getByRole('link', { name: 'sunt aut facere repe' }).click() + + await page.getByRole('link', { name: 'qui est esse' }).click() + await expect(page.getByTestId('post-title')).toContainText('qui est esse') + + await page.getByRole('link', { name: 'sunt aut facere repe' }).click() + await expect(page.getByTestId('post-title')).toContainText('sunt aut facere') +}) From afcfb1f5ac69d027c283b53b6233dabf954b7e90 Mon Sep 17 00:00:00 2001 From: Brenley Dueck Date: Sun, 6 Jul 2025 02:49:10 -0500 Subject: [PATCH 5/5] fix: use Show keyed to remount component --- packages/solid-router/src/Match.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/solid-router/src/Match.tsx b/packages/solid-router/src/Match.tsx index 8c98ee0923..6cb9d8ad2b 100644 --- a/packages/solid-router/src/Match.tsx +++ b/packages/solid-router/src/Match.tsx @@ -210,12 +210,13 @@ export const MatchInner = (props: { matchId: string }): any => { const match = () => matchState().match const out = () => { - // track the match id to remount the component - matchState().match.id - const Comp = route().options.component ?? router.options.defaultComponent if (Comp) { - return + return ( + + + + ) } return }