diff --git a/packages/react-router/tests/loaders.test.tsx b/packages/react-router/tests/loaders.test.tsx index 7eccb96a13e..326c018ed6f 100644 --- a/packages/react-router/tests/loaders.test.tsx +++ b/packages/react-router/tests/loaders.test.tsx @@ -430,7 +430,7 @@ test('reproducer #4546', async () => { component: () => { return ( <> -
+
{ expect(nestedPendingComponentOnMountMock).not.toHaveBeenCalled() expect(fooPendingComponentOnMountMock).not.toHaveBeenCalled() }) + +test('throw abortError from loader upon initial load with basepath', async () => { + const rootRoute = createRootRoute({}) + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + loader: async () => { + return Promise.reject(new DOMException('Aborted', 'AbortError')) + }, + component: () =>
Index route content
, + errorComponent: () => ( +
indexErrorComponent
+ ), + }) + + const routeTree = rootRoute.addChildren([indexRoute]) + const router = createRouter({ routeTree, history, basepath: '/app' }) + + render() + + const indexElement = await screen.findByText('Index route content') + expect(indexElement).toBeInTheDocument() + expect(screen.queryByTestId('index-error')).not.toBeInTheDocument() + expect(window.location.pathname.startsWith('/app')).toBe(true) +}) diff --git a/packages/router-core/src/load-matches.ts b/packages/router-core/src/load-matches.ts index 6889d886773..13d1180bc63 100644 --- a/packages/router-core/src/load-matches.ts +++ b/packages/router-core/src/load-matches.ts @@ -670,6 +670,16 @@ const runLoader = async ( } catch (e) { let error = e + if (error instanceof DOMException && error.name === 'AbortError') { + const head = await executeHead(inner, matchId, route) + inner.updateMatch(matchId, (prev) => ({ + ...prev, + status: prev.status === 'pending' ? 'success' : prev.status, + ...head, + })) + return + } + const pendingPromise = match._nonReactive.minPendingPromise if (pendingPromise) await pendingPromise diff --git a/packages/solid-router/tests/loaders.test.tsx b/packages/solid-router/tests/loaders.test.tsx index 103bde16463..c301977181e 100644 --- a/packages/solid-router/tests/loaders.test.tsx +++ b/packages/solid-router/tests/loaders.test.tsx @@ -317,3 +317,29 @@ test('throw error from beforeLoad when navigating to route', async () => { const indexElement = await screen.findByText('fooErrorComponent') expect(indexElement).toBeInTheDocument() }) + +test('throw abortError from loader upon initial load with basepath', async () => { + const rootRoute = createRootRoute({}) + + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + loader: async () => { + return Promise.reject(new DOMException('Aborted', 'AbortError')) + }, + component: () =>
Index route content
, + errorComponent: () => ( +
indexErrorComponent
+ ), + }) + + const routeTree = rootRoute.addChildren([indexRoute]) + const router = createRouter({ routeTree, basepath: '/app' }) + + render(() => ) + + const indexElement = await screen.findByText('Index route content') + expect(indexElement).toBeInTheDocument() + expect(screen.queryByTestId('index-error')).not.toBeInTheDocument() + expect(window.location.pathname.startsWith('/app')).toBe(true) +})