- Declare the router stable as 1.0.0. This is a version realignment, not a breaking change: the code is functionally identical to the 0.16 line, which has held API-stable for years, and
^1.0.0finally gets normal caret semantics instead of the pinned-minor treatment resolvers give 0.x releases. It also aligns major numbers across the ecosystem — router 1.x pairs with Solid 1.x (and SolidStart 2.0), while the in-progress Solid 2 router moves from1.0.0-next.*to2.0.0-next.*prereleases under thenexttag.
- 1211a89: Restore scroll with a single scroll once routing settles, dropping the
ResizeObserverthat re-asserted the offset while the document was still growing (<Router scrollRestoration>, added in 0.16.3). Settling after the navigation commits is what makes the offset reachable, and it is the strategy every peer router ships (SvelteKit, TanStack Router, React Router, Next); TanStack's equivalentMutationObserversits commented out in their source. The chase carried real downside for a case none of them try to cover: with no bound, a target that is never reachable (a list that is genuinely shorter now) left the observer connected for the life of the page, re-clamping the viewport to the bottom on every subsequent resize, and scroll-induced layout changes can feed it back into itself. It was also untestable in jsdom, which has noResizeObserver, so the branch had no coverage. Content committing after the navigation settles — an image without reserved space, a boundary below the fold — now keeps whatever offset the document can hold.
- 31501fd: Add opt-in explicit scroll restoration for back/forward navigation:
<Router scrollRestoration>(#577). The browser's native same-document heuristic loses the saved offset when the destination route forces a layout while the document is still short — any component that measures itself on mount is enough to trigger it. When enabled the router setshistory.scrollRestoration = "manual", captures positions continuously keyed by the history entry depth it already tracks, persists them across reloads, and restores after the navigation settles — retrying as the document grows if the target offset isn't reachable yet, cancelled by the first user scroll. Off by default on 0.x; no behavior changes unless enabled.
-
676db85: fix #451 - dispose per-route roots when the route tree unmounts; leaked roots stayed subscribed to route matches and crashed with
TypeError: ... (evaluating 'match().path')on a later navigation (e.g. when a<Show>in the root component hid the outlet during login/logout flows) -
cae1d15: Fix a batch of long-standing bugs:
useSubmission().retrywas always a no-op due to an operator-precedence bug (#504)- disposing an older owner no longer unregisters a newer action bound to the same URL, which caused forms to fall through to native submission after revalidation (#542)
useBeforeLeavelisteners now observedefaultPreventedset by other listeners (#530)<A>active state now ignores trailing slashes onhref(#532)useCurrentMatchesreturns a copy so user mutation can't corrupt router state (#516)- static path segments no longer percent-encode RFC 3986 pchar characters (
+,@,:,$,&,,,;,=), so routes like/+fooor/@usermatch the browser's raw pathname (#559, #509) - consecutive synchronous
setSearchParamscalls now compose: the merge applies to the in-flight navigation target instead of the stale committed location (#547)
-
e9acd69: fix #454 - default
RouteDefinition's data generic toanyso typed components and preload functions are assignable in annotated configs likeconst routes: RouteDefinition[], where no inference site for the generic exists -
9d80d4e: Paths with empty interior segments (doubled slashes, e.g.
//dashor/foo//bar) no longer match routes and now render the not-found state instead of silently matching their collapsed form (#567). A single trailing slash is still tolerated. Doubled leading slashes are also no longer normalized away by the browser integration and parse correctly instead of being treated as protocol-relative URLs. -
b308c21: fix #497 -
revalidatenow forces the cache miss synchronously instead of deferring it into the transition microtask, so a same-tickrefetch()after an un-awaitedrevalidate()refetches fresh data -
e9acd69: fix #347 - accept
VoidComponentpages as route components;componentnow takes aRouteSectionComponentunion so components that don't declarechildrentype-check, while components requiring props the router doesn't pass are still rejected
-
e847f96: Fix the published package contents so
distno longer includes mirroredsrc,test, or co-located spec files.Also move the data tests under
test/and align the test TypeScript config with that layout sotest:typescontinues to pass cleanly.
- 8f0a8c3: Re-export context
- 9e85fe2: Update
moduleResolution
-
63940c5: Use
nameinactionandcreateAsyncaction()andcreateAsync()were not respecting user defined name. Moreover, action was not applying the hashed name and only naming the action "mutate". -
f9b6dc6: Make useHref return a string with string param
-
da5e1f9: allow URLSearchParams type for when enctype is not set to multipart/form-data
-
1aa664e: - Improve route matching fallback
- Optimize imports
-
fa46b67: fix(type): allow value from
ParamsandSearchParamsto be optional -
bd89541: Support
inoperator for useParams() -
0a2f556: preserve headers in
query()'shandleResponse() -
ac97470: added
SearchParamsto the exported types -
8885abf: fix: createAsync - catch errors of prev to avoid bubbling error up
-
d665cc9: Fix Router popstate event handling logic
- Simplified delta check logic for history navigation
- Improved reliability of forward navigation detection
- Fixed window.history.forward() navigation handling
- 97184e4: more lenient on cache resuming (allow nested promises during hydration)
- fe5c83e: Add JSdoc
- 9a5e350: Vite 6 compatibility
- 20ad18f: only clear completed actions on navigation
- f3763aa: Export Submission at the top level
- 813e6bd: fix
onCompletereturn type
- 6799556: rename
cachetoquery, actiononComplete
- 18b9b52: Support arrays in Search Params
- 272218f: fix #491 - useSubmission with "with" actions
- a22d7d2: fix preloadRoute to take string path
- 6dd0473: support empty array/string to mean no revalidation
- a3a36fb: Add query and param wrappers to support non-Proxy envs
- 2475851: bump deps
- 2f1fa18: improve anchor preload performance
- 3594e45: fix iterator methods on useSubmissions
- 0a964b6: Fix duplicated push history
- c61231d: Fix scrollToHash to handle hashes starting with a number
- 83b7093: remove extra code, fix #406 slow perf on localeCompare
- 5c87acc: fix partial matches in single flight mutations
- 098dccb: fix #474 improper search parameter resolution while routing
- f8f30df: fix initial state including _depth
- 19a21cc: fix async store references
- f8aaf16: make url transform consistent
- 86c3b1f: better handling of query only navigation
- bc3d8e3: expose .latest from createAsync
- fc6ac53: fix #464 flaky hydration bail out
- 3295502: fix hydration cancellation on browser events
- 6144da8: fix Response type narrowing in submission APIs
- e4a13f6: Response helpers return responses, cache/action filter them out
- bd9f19a: default form actions to url encoded
- 5d9263b: rename load to preload
- a7e4062: fix #457 extra leading slashes on path
- 4b4536e: add usePreloadRoute export
- 8cc0530: hack the types to work a bit better with Response Unions
- 7344f69: Handle absolute redirects within
cacheon server - 8263115: Forward absolute redirects inside
cachefrom server to client - 8fbf74a: Treat
window.location.hashas URI encoded - e9fd55d: fix #449 No JS submissions not working
- f311f4a: fix #452 useSubmission types/references
- 2f05f37: Make isRouting more reliable + other fixes
- 618ef17: performance improvement leveraging redirects in loadfn
- d81473a: usePreloadRoute method pre-release
- bfb059f: types Route -> RouteDescription
- 00e37fd: Export all types used in public API
- 2e90de5: Fix
HashRouterstate reset withreplace: false - 75472d2: Fix useCurrentMatches a getter function
- 884b8be: fix #374, fix #399 - suppress cache errors in load function
- 4a76e7d: Fix state updates detection on history back/forward
- 5af3da8: fix #407 single flight without explicit keys
- 1068f1b: fix #408 - accessing route information
- 0c698ed: Allow rewriting url
- 0a34883: preserve original path on optional segments
- 94797e1: Fix types for cache functions with all optional arguments
- 8a547a8: don't submit form when submit event is defaultPrevented
- 8b766a9: restore params into root
- 7b1597b: Add errors to actions
- 83e827d: minimum types for submission flash
- 6df4a7a: push root/rootLoad outside of route matching
- fdefceb: fix #388 reference to element prop
- ffbd35a: fix #389 update router context error message
- bceb358: fix backcache storing invalidated values
- 533b7a0: fix unintended early return in cache during server render
- 02c6e7a: action to return fully processed response
- 5e8cbdb: apply the right owner (who's aware of the router)
- 6d0be9e: fix cache serialization to match returned value
- 052d385: Run load functions with owner & context of
Routercomponent.
- 17ea145: add createAsyncStorage, prev argument, remove store from cache
- 0413594: fix memory router no native events
- 97d387b: add
rootLoad - 5a94e7d: fix Router types, make singleFlight optional
- d67ccbb: single flight mutations
- 76724af: pass revalidate through
jsonhelper
- 9cc1a85: update response types to be always present
- fab3cc0: fix renderToString for cache fns
- 20663d5: metadata -> info
- 6e661eb: add changesets