@@ -206,9 +206,14 @@ const invalidated = [];
206206 */
207207const components = [ ] ;
208208
209- /** @type {{id: string, token: {}, promise: Promise<import('./types.js').NavigationResult>} | null } */
209+ /** @type {{id: string, token: {}, promise: Promise<import('./types.js').NavigationResult>, fork: Promise<import('svelte').Fork | null> | null } | null } */
210210let load_cache = null ;
211211
212+ function discard_load_cache ( ) {
213+ void load_cache ?. fork ?. then ( ( f ) => f ?. discard ( ) ) ;
214+ load_cache = null ;
215+ }
216+
212217/**
213218 * @type {Map<string, Promise<URL>> }
214219 * Cache for client-side rerouting, since it could contain async calls which we want to
@@ -382,7 +387,7 @@ async function _invalidate(include_load_functions = true, reset_page_state = tru
382387 // Also solves an edge case where a preload is triggered, the navigation for it
383388 // was then triggered and is still running while the invalidation kicks in,
384389 // at which point the invalidation should take over and "win".
385- load_cache = null ;
390+ discard_load_cache ( ) ;
386391
387392 // Rerun queries
388393 if ( force_invalidation ) {
@@ -461,7 +466,7 @@ export async function _goto(url, options, redirect_count, nav_token) {
461466 // Clear preload cache when invalidateAll is true to ensure fresh data
462467 // after form submissions or explicit invalidations
463468 if ( options . invalidateAll ) {
464- load_cache = null ;
469+ discard_load_cache ( ) ;
465470 }
466471
467472 await navigate ( {
@@ -518,11 +523,32 @@ async function _preload_data(intent) {
518523 preload_tokens . delete ( preload ) ;
519524 if ( result . type === 'loaded' && result . state . error ) {
520525 // Don't cache errors, because they might be transient
521- load_cache = null ;
526+ discard_load_cache ( ) ;
522527 }
523528 return result ;
524- } )
529+ } ) ,
530+ fork : null
525531 } ;
532+
533+ if ( svelte . fork ) {
534+ const lc = load_cache ;
535+
536+ lc . fork = lc . promise . then ( ( result ) => {
537+ // if load_cache was discarded before load_cache.promise could
538+ // resolve, bail rather than creating an orphan fork
539+ if ( lc === load_cache && result . type === 'loaded' ) {
540+ try {
541+ return svelte . fork ( ( ) => {
542+ root . $set ( result . props ) ;
543+ } ) ;
544+ } catch {
545+ // if it errors, it's because the experimental flag isn't enabled
546+ }
547+ }
548+
549+ return null ;
550+ } ) ;
551+ }
526552 }
527553
528554 return load_cache . promise ;
@@ -1658,6 +1684,7 @@ async function navigate({
16581684 }
16591685
16601686 // reset preload synchronously after the history state has been set to avoid race conditions
1687+ const load_cache_fork = load_cache ?. fork ;
16611688 load_cache = null ;
16621689
16631690 navigation_result . props . page . state = state ;
@@ -1692,7 +1719,14 @@ async function navigate({
16921719 navigation_result . props . page . url = url ;
16931720 }
16941721
1695- root . $set ( navigation_result . props ) ;
1722+ const fork = load_cache_fork && ( await load_cache_fork ) ;
1723+
1724+ if ( fork ) {
1725+ void fork . commit ( ) ;
1726+ } else {
1727+ root . $set ( navigation_result . props ) ;
1728+ }
1729+
16961730 update ( navigation_result . props . page ) ;
16971731 has_navigated = true ;
16981732 } else {
0 commit comments