npm / @tanstack/solid-router
@tanstack/solid-router
What changed in @tanstack/solid-router 1, from its official release notes, upgrade guides and advisories. Sources checked 2026-11-15.
51 breaking1 security1 new APIs and options5 performance2 behavior and defaults33 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli init@tanstack/solid-router 193 changes
Breaking changes 51
A Solid
<Await>without afallbackno longer holds the streamed shell; it renders inside the nearest<Suspense>boundary and renders falsy resolved values.Flags are now positional arguments (
partial?,explicitUndefined?) instead of an options object;explicitUndefinedreplacesignoreUndefined: false.The internal helper is no longer exported.
This option is initialization-only: configure it when creating the router; changing allowed characters requires creating a new router instance.
Configured origins must already be normalized.
Active route components remain mounted by default when route params change.
Removes the data-transitioning attribute from Link.
Removes the undocumented Link state isTransitioning.
RouterCore.getMatchedRoutes() now returns a tuple of matched routes, raw parameters, and the found route instead of an object.
The standalone @tanstack/router-core export has been removed; use the router.getMatchedRoutes() instance method.
The exported GetMatchFn type has been removed along with the method it typed.
The exported Solid Match component now accepts routeId instead of matchId.
MatchRoutesOpts.dest has been removed.
MatchRoutesOpts.preload has been removed.
Redirect.redirectHandled has been removed because it was internal redirect bookkeeping.
RouteMatch.fetchCount has been removed with no replacement; it was purely informational.
RouteMatch.globalNotFound was renamed and privatized to _notFound; use match.status === 'notFound' instead.
The status union no longer includes 'redirected'; redirected matches are dropped from the match list instead of being rendered.
RouterCore.beforeLoad() has been removed with no replacement.
RouterCore.cancelMatch() has been removed, with no replacement for cancelling an individual in-flight match externally.
RouterCore.cancelMatches() has been removed, with no replacement for cancelling an individual in-flight match externally.
RouterCore.clearExpiredCache() has been removed; expired cache entries are reconciled automatically as part of match commit.
RouterCore.commitLocationPromise has been replaced by the internal _commitPromise field.
RouterCore.getMatch() has been removed; read matches from router.state.matches.
RouterCore.getParsedLocationHref() has been removed with no replacement.
RouterCore.hasNotFoundMatch() has been removed; check router.state.matches for a match with status 'notFound'.
RouterCore.isPrerendering() has been removed with no replacement.
RouterCore.isViewTransitionTypesSupported has been removed with no replacement.
RouterCore.latestLoadPromise has been removed with no replacement.
The optional second argument no longer accepts an array of component types; it now accepts 'errorComponent', 'notFoundComponent', or false for internal boundary loading.
RouterCore.looseRoutesById has been removed; use routesById.
RouterCore.pendingBuiltLocation has been replaced by the internal _pendingLocation field.
RouterCore.updateMatch() has been removed, with no replacement for mutating an individual in-flight match externally.
RouterCore.viewTransitionPromise has been removed with no replacement.
RouterState no longer includes isTransitioning; subscribe to router.state.status or router.state.isLoading instead.
RouterState no longer includes loadedAt; use match.updatedAt instead.
RouterState no longer exposes redirect; redirect handling is internal to the server loader.
RouterState no longer exposes statusCode; server response status handling is internal to the server loader.
The adapter contract replaces getRouteMatchStore() with getMatchStore().
The separate isLoading store has been removed; read application-facing state from router.state.
The separate isTransitioning store has been removed; read application-facing state from router.state.
The separate loadedAt store has been removed; read application-facing state from router.state.
The adapter contract replaces matchesId with ids for route-keyed presentation stores.
The adapter contract replaces matchStores with byRoute for route-keyed presentation stores.
Pending and cache stores and their setters have been removed; preload and cache coordination are now internal.
The separate redirect store has been removed; read application-facing state from router.state.
The separate statusCode store has been removed; read application-facing state from router.state.
StartTransitionFn now has signature (fn, expected) => Promise<boolean> instead of (fn) => void; custom framework adapters implementing startTransition are affected.
StoreConfig.init has been removed.
The exported UpdateMatchFn type has been removed along with the method it typed.
The script callback context now exposes only kind: 'script' and url; script format handling is internal to manifest rendering.
Security 1
Navigation and redirect destinations are validated; ambiguous relative URLs remain on the current origin.
New APIs and options 1
Rsbuild client output supports module output by default and IIFE output for classic script environments.
Performance 5
Pending link preload timers are canceled when navigation starts, avoiding redundant preloading while the destination is loading.
Solid Links reuse the router's built destination and derive state through fewer reactive nodes; they also resolve props through one reactive memo, making mounting and updating many Links slightly faster.
Skips unused Link preload cleanup when preloading is disabled.
Link reduces bundle size by sharing active-path checks and resolving only the selected active or inactive props, while avoiding unnecessary class/style allocations.
Server-rendered links skip client-only hydration, preloading, observer, and event-handler setup.
Behavior and default changes 2
Warns when an Outlet is rendered inside a pending, error, or not-found component.
Client entry scripts and preloads are represented as root route manifest assets.
Fixes and other changes 33
Builds mask and routeMasks locations from the same _fromLocation as the destination.
Links of a route left by pending navigation skip deriving the destination location, and clicks and preloads follow the href displayed by the Link.
Solid Links call a user ref once per element and create no reactive nodes on the server.
Ignores queued viewport notifications after their effect has been cleaned up.
Router requests whose
Acceptheader allows neithertext/htmlnor*/*now receive406 Not Acceptableinstead of500.Solid SSR renders late lazy errors through route boundaries.
Solid SSR now emits one document type.
Active and inactive Link props can override base element props, but Solid's computed href, target, and disabled values remain authoritative when state props contain routing options; class/style merging is preserved.
Avoids duplicate external script execution when a Solid script has both src and children.
Prerender requests and output paths are constrained.
Explicit redirect Location headers take precedence over route options.
Redirect headers no longer appear in serialized server function response bodies.
Successful not-found matches remain terminal shared boundaries during client navigation, preserving route context while the destination loads.
Structural descendants below error and not-found boundaries are excluded from route lifecycle callbacks, while lifecycle membership is preserved through invalidation, hydration, background reloads, and superseded navigation publication.
SSR wraps non-Error loader errors to match Solid’s native boundary behavior, preserving the original value in cause; router state and loader onError values are unchanged.
Absolute URL checks in links, navigation, redirects, and build configuration use URL.canParse, with a URL constructor fallback for older browsers.
The route-scoped API now forwards shouldThrow and preserves optional return types when shouldThrow is false.
Context is preserved during reloads.
Pending UI is preserved across retained routes.
Resolved lazy route components are reused when revisiting code-split routes, preventing unnecessary pending UI.
Applies preloadDelay to viewport link preloading and cancels pending preloads when links leave the viewport.
Path parameters are preserved in their raw string form while matching, so structured values returned by params.parse produce stable match IDs and do not reuse stale loader data.
The documented default now matches the existing runtime default of 5 minutes (300_000).
Route headers() now runs only on the server and is no longer invoked during client-side asset projection.
The client no longer reruns work already completed by the server during hydration.
Invalidation retires matching active preloads so older speculative loader results cannot become fresh cache data afterward.
Match loading now uses a lane-based scheduler that tracks each navigation, preload, and background reload as ordered work, preventing state from leaking between overlapping navigations.
Redirect, error, and not-found responses now receive correct SSR status codes.
Fixes search middleware composition so retainSearchParams does not restore search params removed by a downstream stripSearchParams.
Fixed streaming behavior.
Script preloads follow the manifest script format.
Script asset cross-origin configuration uses the script key.
Hash navigation is no longer overridden by stale scroll restoration entries.