Release 2026-08-04 20:36
Release 2026-08-04 20:36
- router: correct lane loader changeset (#7948) (a4942ff68a) by @Sheraff
- router-core: lane match loader rewrite (#7805) (45c4ad8d62) by @Sheraff
- @tanstack/react-router@1.170.19
- @tanstack/react-router-devtools@1.167.1
- @tanstack/react-start@1.168.36
- @tanstack/react-start-client@1.168.17
- @tanstack/react-start-rsc@0.1.35
- @tanstack/react-start-server@1.167.24
- @tanstack/router-cli@1.167.22
- @tanstack/router-core@1.171.16
- @tanstack/router-devtools@1.167.1
- @tanstack/router-devtools-core@1.168.1
- @tanstack/router-generator@1.167.22
- @tanstack/router-plugin@1.168.24
- @tanstack/router-vite-plugin@1.167.24
- @tanstack/solid-router@1.170.19
- @tanstack/solid-router-devtools@1.167.1
- @tanstack/solid-start@1.168.35
- @tanstack/solid-start-client@1.168.17
- @tanstack/solid-start-server@1.167.24
- @tanstack/start-client-core@1.170.15
- @tanstack/start-plugin-core@1.171.27
- @tanstack/start-server-core@1.169.19
- @tanstack/start-static-server-functions@1.167.20
- @tanstack/start-storage-context@1.167.18
- @tanstack/vue-router@1.170.18
- @tanstack/vue-router-devtools@1.167.1
- @tanstack/vue-start@1.168.34
- @tanstack/vue-start-client@1.167.20
- @tanstack/vue-start-server@1.167.24
@tanstack/start-storage-context@1.167.18
- Updated dependencies [
45c4ad8]:- @tanstack/router-core@1.171.16
@tanstack/vue-start-server@1.167.24
- Updated dependencies [
45c4ad8]:- @tanstack/router-core@1.171.16
- @tanstack/vue-router@1.170.18
- @tanstack/start-server-core@1.169.19
@tanstack/vue-start@1.168.34
- Updated dependencies [
45c4ad8]:- @tanstack/vue-router@1.170.18
- @tanstack/start-client-core@1.170.15
- @tanstack/start-plugin-core@1.171.27
- @tanstack/start-server-core@1.169.19
- @tanstack/vue-start-client@1.167.20
- @tanstack/vue-start-server@1.167.24
@tanstack/start-server-core@1.169.19
- Updated dependencies [
45c4ad8]:- @tanstack/router-core@1.171.16
- @tanstack/start-client-core@1.170.15
- @tanstack/start-storage-context@1.167.18
@tanstack/vue-start-client@1.167.20
- Updated dependencies [
45c4ad8]:- @tanstack/router-core@1.171.16
- @tanstack/vue-router@1.170.18
- @tanstack/start-client-core@1.170.15
@tanstack/start-plugin-core@1.171.27
- Updated dependencies [
45c4ad8]:- @tanstack/router-core@1.171.16
- @tanstack/router-generator@1.167.22
- @tanstack/router-plugin@1.168.24
- @tanstack/start-server-core@1.169.19
@tanstack/vue-router@1.170.18
-
#7805
45c4ad8- Rewrite match loading around a lane-based scheduler that tracks each navigation, preload, and background reload as an ordered unit of work. This fixes pending/redirect/retry state leaking between overlapping navigations, restores correct SSR status codes for redirects, errors, and not-found responses, and closes hydration gaps where the client re-ran work the server had already completed.- Invalidation now retires matching active preloads so older speculative loader results cannot become fresh cache data after invalidation.
- Route
headers()now only runs on the server, matching the documented behavior — it is no longer invoked during client-side asset projection. - The documented default
gcTimeandpreloadGcTimenow match the existing runtime default of 5 minutes (300_000).
Removed / changed exported internals
RouterStateno longer includesloadedAt,isTransitioning,statusCode, orredirect. Usematch.updatedAtin place ofloadedAt; subscribe torouter.state.status/router.state.isLoadingin place ofisTransitioning; server response status and redirect handling are now internal to the server loader and are no longer exposed onrouter.state.RouteMatch.fetchCounthas been removed, with no replacement — it was purely informational.RouteMatch.statusno longer includes'redirected'(it remains'pending' | 'success' | 'error' | 'notFound') — redirected matches are dropped from the match list instead of being rendered.RouteMatch.globalNotFoundhas been renamed and privatized to the internal_notFoundfield. Usematch.status === 'notFound'instead.- The exported React, Solid, and Vue
Matchcomponents now acceptrouteIdinstead ofmatchId. - The exported
RouterStoresadapter contract now uses route-keyed presentation stores:matchesIdis replaced byids,matchStoresbybyRoute, andgetRouteMatchStore()bygetMatchStore(). The separateloadedAt,isLoading,isTransitioning,statusCode, andredirectstores have been removed, along with the pending/cache stores and their setters.StoreConfig.inithas also been removed. Read application-facing state fromrouter.state; preload and cache coordination are now internal. - Removed
RouterCoremembersgetMatch(),updateMatch(),cancelMatch(), andcancelMatches()— read matches fromrouter.state.matches(e.g.router.state.matches.find((m) => m.id === id)); there is no replacement for mutating or cancelling an individual in-flight match from outside the router. - Removed
RouterCore.hasNotFoundMatch()— userouter.state.matches.some((m) => m.status === 'notFound'). - Removed
RouterCore.looseRoutesById— useroutesById. - Removed
RouterCore.isPrerendering(),RouterCore.isViewTransitionTypesSupported, andRouterCore.viewTransitionPromise, with no replacement. - Removed
RouterCore.getParsedLocationHref()andRouterCore.clearExpiredCache(), with no replacement — expired cache entries are now reconciled automatically as part of match commit. - Removed
RouterCore.latestLoadPromiseandRouterCore.beforeLoad(), with no replacement. RouterCore.commitLocationPromiseandRouterCore.pendingBuiltLocationhave been replaced by the internal_commitPromiseand_pendingLocationfields.- Removed the exported
GetMatchFnandUpdateMatchFntypes, along with the methods they typed. - Removed the standalone
getMatchedRoutes()export from@tanstack/router-core— use therouter.getMatchedRoutes()instance method instead. RouterCore.loadRouteChunk()no longer accepts an array of component types as its second argument. One-argument usage is unchanged; the optional second argument is now'errorComponent','notFoundComponent', orfalsefor internal boundary loading.- Removed
Redirect.redirectHandled, which was internal redirect bookkeeping. MatchRoutesOpts.preloadandMatchRoutesOpts.desthave been removed.StartTransitionFnis now(fn, expected) => Promise<boolean>(previously(fn) => void). This only affects custom framework adapters that implementstartTransition.
-
Updated dependencies [
45c4ad8]:- @tanstack/router-core@1.171.16
@tanstack/vue-router-devtools@1.167.1
- Updated dependencies [
45c4ad8]:- @tanstack/router-core@1.171.16
- @tanstack/vue-router@1.170.18
- @tanstack/router-devtools-core@1.168.1