@timber-js/app 0.2.0-alpha.211 → 0.2.0-alpha.213
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-skill.md +10 -5
- package/dist/_chunks/{actions-Rjk4htmA.js → actions-CEootpB1.js} +49 -12
- package/dist/_chunks/actions-CEootpB1.js.map +1 -0
- package/dist/_chunks/{als-registry-DaxkVjt5.js → als-registry-BZqHCtq-.js} +2 -4
- package/dist/_chunks/als-registry-BZqHCtq-.js.map +1 -0
- package/dist/_chunks/{cache-api-DGdYfNJn.js → cache-api-LA3sBpUS.js} +5 -5
- package/dist/_chunks/{cache-api-DGdYfNJn.js.map → cache-api-LA3sBpUS.js.map} +1 -1
- package/dist/_chunks/{chains-DGX9zmg9.js → chains-BfoPFraI.js} +2 -2
- package/dist/_chunks/{chains-DGX9zmg9.js.map → chains-BfoPFraI.js.map} +1 -1
- package/dist/_chunks/{classify-QwG5rxKI.js → classify-BT66U83D.js} +2 -2
- package/dist/_chunks/{classify-QwG5rxKI.js.map → classify-BT66U83D.js.map} +1 -1
- package/dist/_chunks/{cli-check-ajNY3B2e.js → cli-check-BfQ54-UJ.js} +3 -3
- package/dist/_chunks/{cli-check-ajNY3B2e.js.map → cli-check-BfQ54-UJ.js.map} +1 -1
- package/dist/_chunks/{cli-schema-sync-D2eI8jEg.js → cli-schema-sync-czh2dsLs.js} +2 -2
- package/dist/_chunks/{cli-schema-sync-D2eI8jEg.js.map → cli-schema-sync-czh2dsLs.js.map} +1 -1
- package/dist/_chunks/{client-dep-entries-2HCF09no.js → client-dep-entries-CQwpb8dI.js} +2 -2
- package/dist/_chunks/{client-dep-entries-2HCF09no.js.map → client-dep-entries-CQwpb8dI.js.map} +1 -1
- package/dist/_chunks/{convention-lint-DLmhGsRS.js → convention-lint-BEVW4EID.js} +3 -3
- package/dist/_chunks/{convention-lint-DLmhGsRS.js.map → convention-lint-BEVW4EID.js.map} +1 -1
- package/dist/_chunks/{dev-server-TFpEwm3H.js → dev-server-FKxptbnI.js} +2 -2
- package/dist/_chunks/{dev-server-TFpEwm3H.js.map → dev-server-FKxptbnI.js.map} +1 -1
- package/dist/_chunks/{error-boundary-DsNScGRM.js → error-boundary-9g_Lb2na.js} +3 -3
- package/dist/_chunks/{error-boundary-DsNScGRM.js.map → error-boundary-9g_Lb2na.js.map} +1 -1
- package/dist/_chunks/{json-lossy-check-CVuRs2hG.js → json-lossy-check-C8zBY2uZ.js} +2 -2
- package/dist/_chunks/{json-lossy-check-CVuRs2hG.js.map → json-lossy-check-C8zBY2uZ.js.map} +1 -1
- package/dist/_chunks/{live-graph-cNuWMYQI.js → live-graph-C_4v-fHv.js} +4 -4
- package/dist/_chunks/{live-graph-cNuWMYQI.js.map → live-graph-C_4v-fHv.js.map} +1 -1
- package/dist/_chunks/{logger-BP0LN6vP.js → logger-CbLdcy-W.js} +2 -2
- package/dist/_chunks/{logger-BP0LN6vP.js.map → logger-CbLdcy-W.js.map} +1 -1
- package/dist/_chunks/{poison-scan-CfQ3unZR.js → poison-scan-C92liMAr.js} +2 -2
- package/dist/_chunks/{poison-scan-CfQ3unZR.js.map → poison-scan-C92liMAr.js.map} +1 -1
- package/dist/_chunks/{scanner-DmqdxzbW.js → scanner-CQt12vE2.js} +2 -2
- package/dist/_chunks/{scanner-DmqdxzbW.js.map → scanner-CQt12vE2.js.map} +1 -1
- package/dist/_chunks/{sizeof-BM1409x2.js → sizeof-QPE5nd3u.js} +2 -2
- package/dist/_chunks/{sizeof-BM1409x2.js.map → sizeof-QPE5nd3u.js.map} +1 -1
- package/dist/_chunks/{walkers-Czu2jXFq.js → walkers-DAT4avhZ.js} +3 -3
- package/dist/_chunks/{walkers-Czu2jXFq.js.map → walkers-DAT4avhZ.js.map} +1 -1
- package/dist/adapters/cloudflare-kv-cache.js +1 -1
- package/dist/analyze/crawl-entry.js +3 -3
- package/dist/analyze/graph-command.js +2 -2
- package/dist/cache/index.js +2 -2
- package/dist/cache/stores/memory.js +1 -1
- package/dist/cdn/workers-cache-purge.js +1 -1
- package/dist/cli.js +3 -3
- package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -1
- package/dist/client/browser-entry/action-queue.d.ts +1 -0
- package/dist/client/browser-entry/action-queue.d.ts.map +1 -1
- package/dist/client/browser-entry/form-state.d.ts +22 -0
- package/dist/client/browser-entry/form-state.d.ts.map +1 -0
- package/dist/client/browser-entry/hydrate.d.ts +9 -1
- package/dist/client/browser-entry/hydrate.d.ts.map +1 -1
- package/dist/client/browser-entry/index.d.ts +2 -0
- package/dist/client/browser-entry/index.d.ts.map +1 -1
- package/dist/client/browser-entry/router-init.d.ts.map +1 -1
- package/dist/client/error-boundary.js +1 -1
- package/dist/client/form.d.ts +17 -64
- package/dist/client/form.d.ts.map +1 -1
- package/dist/client/index.d.ts +3 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +111 -51
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal.js +33 -32
- package/dist/client/internal.js.map +1 -1
- package/dist/client/navigation-api.d.ts +25 -63
- package/dist/client/navigation-api.d.ts.map +1 -1
- package/dist/client/navigation-transition.d.ts +11 -2
- package/dist/client/navigation-transition.d.ts.map +1 -1
- package/dist/client/router-effects.d.ts +7 -3
- package/dist/client/router-effects.d.ts.map +1 -1
- package/dist/client/router-lifecycle.d.ts +17 -11
- package/dist/client/router-lifecycle.d.ts.map +1 -1
- package/dist/client/router-pipeline.d.ts +3 -2
- package/dist/client/router-pipeline.d.ts.map +1 -1
- package/dist/client/router-types.d.ts +24 -44
- package/dist/client/router-types.d.ts.map +1 -1
- package/dist/client/router.d.ts.map +1 -1
- package/dist/client/use-form-field.d.ts +39 -0
- package/dist/client/use-form-field.d.ts.map +1 -0
- package/dist/config-types.d.ts +2 -1
- package/dist/config-types.d.ts.map +1 -1
- package/dist/index.js +6 -7
- package/dist/index.js.map +1 -1
- package/dist/plugins/shims.d.ts.map +1 -1
- package/dist/routing/index.js +2 -2
- package/dist/rsc-runtime/rsc.d.ts +1 -1
- package/dist/rsc-runtime/rsc.d.ts.map +1 -1
- package/dist/server/action-client.d.ts +20 -7
- package/dist/server/action-client.d.ts.map +1 -1
- package/dist/server/action-handler.d.ts +27 -8
- package/dist/server/action-handler.d.ts.map +1 -1
- package/dist/server/als-registry.d.ts +22 -2
- package/dist/server/als-registry.d.ts.map +1 -1
- package/dist/server/client-error-message.d.ts +12 -0
- package/dist/server/client-error-message.d.ts.map +1 -0
- package/dist/server/flight-scripts.d.ts +9 -0
- package/dist/server/flight-scripts.d.ts.map +1 -1
- package/dist/server/form-data.d.ts +13 -4
- package/dist/server/form-data.d.ts.map +1 -1
- package/dist/server/form-state-flight.d.ts +32 -0
- package/dist/server/form-state-flight.d.ts.map +1 -0
- package/dist/server/index.d.ts +0 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +41 -60
- package/dist/server/index.js.map +1 -1
- package/dist/server/internal.js +10 -6
- package/dist/server/internal.js.map +1 -1
- package/dist/server/logger.d.ts +1 -0
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/pipeline.d.ts +20 -6
- package/dist/server/pipeline.d.ts.map +1 -1
- package/dist/server/request-context.d.ts +27 -2
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/route-element-builder.d.ts.map +1 -1
- package/dist/server/rsc-entry/action-dispatcher.d.ts +6 -5
- package/dist/server/rsc-entry/action-dispatcher.d.ts.map +1 -1
- package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
- package/dist/server/rsc-entry/index.d.ts.map +1 -1
- package/dist/server/rsc-entry/render-route.d.ts +2 -0
- package/dist/server/rsc-entry/render-route.d.ts.map +1 -1
- package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
- package/dist/server/rsc-entry/ssr-renderer.d.ts +6 -0
- package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
- package/dist/server/ssr-bridge-types.d.ts +10 -0
- package/dist/server/ssr-bridge-types.d.ts.map +1 -1
- package/dist/server/ssr-entry.d.ts.map +1 -1
- package/dist/server/ssr-form-state.d.ts +30 -0
- package/dist/server/ssr-form-state.d.ts.map +1 -0
- package/dist/server/ssr-render.d.ts +3 -0
- package/dist/server/ssr-render.d.ts.map +1 -1
- package/dist/shared/form-state-flight.d.ts +36 -0
- package/dist/shared/form-state-flight.d.ts.map +1 -0
- package/docs/api/31-api-client.mdx +31 -3
- package/docs/api/34-api-config.mdx +1 -1
- package/docs/learn/08-forms-and-actions.mdx +116 -36
- package/package.json +1 -1
- package/src/client/browser-entry/action-dispatch.ts +104 -24
- package/src/client/browser-entry/action-queue.ts +1 -1
- package/src/client/browser-entry/form-state.ts +48 -0
- package/src/client/browser-entry/hydrate.ts +10 -1
- package/src/client/browser-entry/index.ts +25 -7
- package/src/client/browser-entry/router-init.ts +7 -20
- package/src/client/form.tsx +33 -98
- package/src/client/index.ts +3 -2
- package/src/client/navigation-api.ts +47 -173
- package/src/client/navigation-transition.ts +15 -4
- package/src/client/router-effects.ts +8 -4
- package/src/client/router-lifecycle.ts +40 -20
- package/src/client/router-pipeline.ts +10 -12
- package/src/client/router-types.ts +24 -48
- package/src/client/router.ts +49 -56
- package/src/client/use-form-field.ts +132 -0
- package/src/config-types.ts +2 -1
- package/src/plugins/shims.ts +0 -2
- package/src/rsc-runtime/rsc.ts +3 -0
- package/src/rsc-runtime/vendor-types.d.ts +14 -0
- package/src/server/action-client.ts +77 -64
- package/src/server/action-handler.ts +133 -95
- package/src/server/als-registry.ts +23 -9
- package/src/server/client-error-message.ts +18 -0
- package/src/server/flight-scripts.ts +13 -0
- package/src/server/form-data.ts +62 -10
- package/src/server/form-state-flight.ts +67 -0
- package/src/server/index.ts +0 -4
- package/src/server/logger.ts +6 -1
- package/src/server/pipeline.ts +27 -8
- package/src/server/request-context.ts +39 -2
- package/src/server/route-element-builder.ts +12 -1
- package/src/server/rsc-entry/action-dispatcher.ts +40 -34
- package/src/server/rsc-entry/error-renderer.ts +2 -1
- package/src/server/rsc-entry/index.ts +1 -0
- package/src/server/rsc-entry/render-route.ts +16 -0
- package/src/server/rsc-entry/rsc-stream.ts +20 -11
- package/src/server/rsc-entry/ssr-renderer.ts +11 -0
- package/src/server/ssr-bridge-types.ts +10 -0
- package/src/server/ssr-entry.ts +16 -2
- package/src/server/ssr-form-state.ts +58 -0
- package/src/server/ssr-render.ts +5 -0
- package/src/shared/form-state-flight.ts +74 -0
- package/dist/_chunks/actions-Rjk4htmA.js.map +0 -1
- package/dist/_chunks/als-registry-DaxkVjt5.js.map +0 -1
- package/dist/server/form-flash.d.ts +0 -78
- package/dist/server/form-flash.d.ts.map +0 -1
- package/src/server/form-flash.ts +0 -89
package/dist/client/internal.js
CHANGED
|
@@ -4,7 +4,7 @@ import { c as cachedSearchParams, s as cachedSearch, t as _setCachedSearch } fro
|
|
|
4
4
|
import { a as setGlobalRouter, i as getRouterOrNull, r as getRouter } from "../_chunks/navigation-root-BQfo1-kG.js";
|
|
5
5
|
import { n as registerSsrDataProvider, t as getSsrData } from "../_chunks/ssr-data-nA3I70_n.js";
|
|
6
6
|
import { i as useNavigationContext, n as useSegmentContext, r as NavigationProvider, t as SegmentProvider } from "../_chunks/segment-context-xtPUGfdq.js";
|
|
7
|
-
import { a as createSpaExits, c as NonRscResponse, d as readPublishedParams, i as createScrollEffects, l as fetchRscPayload, n as TimberErrorBoundary, o as recordSkew, r as createNavigationRecovery, s as isClientStale, u as readPayloadTree } from "../_chunks/error-boundary-
|
|
7
|
+
import { a as createSpaExits, c as NonRscResponse, d as readPublishedParams, i as createScrollEffects, l as fetchRscPayload, n as TimberErrorBoundary, o as recordSkew, r as createNavigationRecovery, s as isClientStale, u as readPayloadTree } from "../_chunks/error-boundary-9g_Lb2na.js";
|
|
8
8
|
import { t as bindUseQueryStates } from "../_chunks/use-query-states-I3JMng6J.js";
|
|
9
9
|
//#region src/client/history.ts
|
|
10
10
|
/**
|
|
@@ -121,13 +121,16 @@ function isAbortError(error) {
|
|
|
121
121
|
if (error instanceof Error && error.name === "AbortError") return true;
|
|
122
122
|
return false;
|
|
123
123
|
}
|
|
124
|
-
function createNavigationLifecycle(
|
|
124
|
+
function createNavigationLifecycle() {
|
|
125
125
|
let current = null;
|
|
126
126
|
let pendingCommit = null;
|
|
127
127
|
let routerPhase = { phase: "idle" };
|
|
128
128
|
const pendingListeners = /* @__PURE__ */ new Set();
|
|
129
129
|
let navigationSeq = 0;
|
|
130
130
|
let idleTask = null;
|
|
131
|
+
const idleListeners = /* @__PURE__ */ new Set();
|
|
132
|
+
const treeCommitListeners = /* @__PURE__ */ new Set();
|
|
133
|
+
const ownerSeq = /* @__PURE__ */ new WeakMap();
|
|
131
134
|
/**
|
|
132
135
|
* Whether a handed-off tree has not yet committed. Derived from the slot:
|
|
133
136
|
* true when `current` is handed off but not yet settled.
|
|
@@ -155,23 +158,18 @@ function createNavigationLifecycle(deps) {
|
|
|
155
158
|
* in-flight navigation. Optionally links to an external signal (e.g.,
|
|
156
159
|
* from the Navigation API's NavigateEvent.signal).
|
|
157
160
|
*
|
|
158
|
-
* Superseding is one operation with
|
|
161
|
+
* Superseding is one operation with two parts:
|
|
159
162
|
* 1. Abort the previous navigation's fetch — UNLESS its tree is the one on
|
|
160
163
|
* screen, in which case tearing the stream down would error the page the
|
|
161
164
|
* user is currently looking at. See `RenderOwner.handedOff`.
|
|
162
165
|
* 2. Settle the previous owner as 'superseded' so its transition detects
|
|
163
166
|
* it lost and never hands a stale tree to React. This replaces both
|
|
164
167
|
* `supersedeNavigationTransitions()` and the transition counter bump.
|
|
165
|
-
* 3. Resolve its Navigation API deferred — the superseded navigation's
|
|
166
|
-
* finally block is staleness-guarded (see TIM-1034) and no longer
|
|
167
|
-
* cleans up after itself, so the browser's native loading state for
|
|
168
|
-
* the dead navigation is cleared here.
|
|
169
168
|
*/
|
|
170
169
|
function createNavOwner(kind, externalSignal) {
|
|
171
170
|
if (current) {
|
|
172
171
|
abortUnlessHandedOff(current);
|
|
173
172
|
current.settle("superseded");
|
|
174
|
-
deps.completeRouterNavigation?.();
|
|
175
173
|
}
|
|
176
174
|
if (pendingCommit) {
|
|
177
175
|
pendingCommit.settle("superseded");
|
|
@@ -179,6 +177,7 @@ function createNavigationLifecycle(deps) {
|
|
|
179
177
|
}
|
|
180
178
|
navigationSeq += 1;
|
|
181
179
|
const owner = createRenderOwner(kind);
|
|
180
|
+
ownerSeq.set(owner, navigationSeq);
|
|
182
181
|
current = owner;
|
|
183
182
|
if (externalSignal) {
|
|
184
183
|
if (externalSignal.aborted) abortUnlessHandedOff(owner);
|
|
@@ -214,13 +213,14 @@ function createNavigationLifecycle(deps) {
|
|
|
214
213
|
if (current === owner) {
|
|
215
214
|
current = null;
|
|
216
215
|
setPending(false);
|
|
217
|
-
deps.completeRouterNavigation?.();
|
|
218
216
|
flushIdleTask();
|
|
219
217
|
}
|
|
220
218
|
}
|
|
221
219
|
}
|
|
222
220
|
function flushIdleTask() {
|
|
223
|
-
if (routerPhase.phase !== "idle" || hasUncommittedNav()
|
|
221
|
+
if (routerPhase.phase !== "idle" || hasUncommittedNav()) return;
|
|
222
|
+
for (const listener of [...idleListeners]) listener();
|
|
223
|
+
if (!idleTask) return;
|
|
224
224
|
const task = idleTask;
|
|
225
225
|
idleTask = null;
|
|
226
226
|
task();
|
|
@@ -237,9 +237,12 @@ function createNavigationLifecycle(deps) {
|
|
|
237
237
|
forgetOlderHandoffs(owner) {
|
|
238
238
|
owner.settle("committed");
|
|
239
239
|
if (pendingCommit === owner) pendingCommit = null;
|
|
240
|
+
const seq = ownerSeq.get(owner) ?? navigationSeq;
|
|
241
|
+
for (const listener of [...treeCommitListeners]) listener(seq);
|
|
240
242
|
flushIdleTask();
|
|
241
243
|
},
|
|
242
244
|
placeRevalidationOwner(owner) {
|
|
245
|
+
ownerSeq.set(owner, navigationSeq);
|
|
243
246
|
current = owner;
|
|
244
247
|
},
|
|
245
248
|
isPending: () => routerPhase.phase === "navigating",
|
|
@@ -264,6 +267,14 @@ function createNavigationLifecycle(deps) {
|
|
|
264
267
|
}
|
|
265
268
|
idleTask = task;
|
|
266
269
|
},
|
|
270
|
+
onIdle(listener) {
|
|
271
|
+
idleListeners.add(listener);
|
|
272
|
+
return () => idleListeners.delete(listener);
|
|
273
|
+
},
|
|
274
|
+
onTreeCommit(listener) {
|
|
275
|
+
treeCommitListeners.add(listener);
|
|
276
|
+
return () => treeCommitListeners.delete(listener);
|
|
277
|
+
},
|
|
267
278
|
settleHandoffs() {
|
|
268
279
|
if (pendingCommit) {
|
|
269
280
|
pendingCommit.settle("superseded");
|
|
@@ -381,7 +392,7 @@ function createNavigationPipeline({ deps, prefetchCache, currentStateTree, prepa
|
|
|
381
392
|
* the far side of the supersession check, which only NavigationRoot can
|
|
382
393
|
* make (TIM-1301).
|
|
383
394
|
*/
|
|
384
|
-
async function renderViaTransition(url, owner, types, perform, onCommit) {
|
|
395
|
+
async function renderViaTransition(url, owner, types, perform, onCommit, onHandOff) {
|
|
385
396
|
const handOff = () => markHandedOff(owner);
|
|
386
397
|
const commitAndForget = (commit) => () => {
|
|
387
398
|
forgetOlderHandoffs(owner);
|
|
@@ -408,7 +419,7 @@ function createNavigationPipeline({ deps, prefetchCache, currentStateTree, prepa
|
|
|
408
419
|
decodePromise: observeSkew(result.decodePromise),
|
|
409
420
|
commit: commitAndForget(result.commit)
|
|
410
421
|
};
|
|
411
|
-
}, onCommit);
|
|
422
|
+
}, onCommit, onHandOff);
|
|
412
423
|
}
|
|
413
424
|
/**
|
|
414
425
|
* Fetch (or take from the prefetch cache) a navigation's payload and
|
|
@@ -461,9 +472,7 @@ function createNavigationPipeline({ deps, prefetchCache, currentStateTree, prepa
|
|
|
461
472
|
result = await fetchRscPayload(url, deps, freshStateTree, currentUrl, options.signal);
|
|
462
473
|
}
|
|
463
474
|
const commitHistoryUrl = () => {
|
|
464
|
-
if (options.skipHistory) return;
|
|
465
475
|
const commitUrl = options.commitUrl ?? url;
|
|
466
|
-
deps.setRouterNavigating?.(true);
|
|
467
476
|
if (options.replace) deps.replaceState({
|
|
468
477
|
timber: true,
|
|
469
478
|
scrollY: 0
|
|
@@ -472,7 +481,6 @@ function createNavigationPipeline({ deps, prefetchCache, currentStateTree, prepa
|
|
|
472
481
|
timber: true,
|
|
473
482
|
scrollY: 0
|
|
474
483
|
}, "", commitUrl);
|
|
475
|
-
deps.setRouterNavigating?.(false);
|
|
476
484
|
};
|
|
477
485
|
const params = await result.params;
|
|
478
486
|
const { navState, commit } = prepareNavigation(url, {
|
|
@@ -513,7 +521,7 @@ function createRouter(deps) {
|
|
|
513
521
|
historyStack,
|
|
514
522
|
clientSegmentCache: () => deps.clientSegmentCache
|
|
515
523
|
});
|
|
516
|
-
const lifecycle = createNavigationLifecycle(
|
|
524
|
+
const lifecycle = createNavigationLifecycle();
|
|
517
525
|
const { currentOwner, createNavOwner, runNavigation, markHandedOff, forgetOlderHandoffs, isPending, getPendingUrl, onPendingChange } = lifecycle;
|
|
518
526
|
const { performNavigationFetch, renderViaTransition } = createNavigationPipeline({
|
|
519
527
|
deps,
|
|
@@ -533,21 +541,20 @@ function createRouter(deps) {
|
|
|
533
541
|
const recoverFromNavigationError = createNavigationRecovery({
|
|
534
542
|
currentOwner,
|
|
535
543
|
leaveSpaIfOwned,
|
|
536
|
-
navigate: (url, types) => navigate(url, {
|
|
544
|
+
navigate: (url, types, onHandOff) => navigate(url, {
|
|
537
545
|
replace: true,
|
|
538
|
-
_renderTypes: types
|
|
546
|
+
_renderTypes: types,
|
|
547
|
+
onHandOff
|
|
539
548
|
})
|
|
540
549
|
});
|
|
541
550
|
async function navigate(url, options = {}) {
|
|
542
551
|
const scroll = options.scroll !== false;
|
|
543
552
|
const replace = options.replace === true;
|
|
544
|
-
const externalSignal = options._signal;
|
|
545
|
-
const skipHistory = options._skipHistory === true;
|
|
546
553
|
const types = options._renderTypes ?? ["navigation-forward", ...options.transitionTypes ?? []];
|
|
547
554
|
const hashIndex = url.indexOf("#");
|
|
548
555
|
const hash = hashIndex === -1 ? "" : url.slice(hashIndex);
|
|
549
556
|
const fetchUrl = hashIndex === -1 ? url : url.slice(0, hashIndex);
|
|
550
|
-
const departingUrl =
|
|
557
|
+
const departingUrl = deps.getCurrentUrl();
|
|
551
558
|
const currentScrollY = deps.getScrollY();
|
|
552
559
|
if (deps.saveNavigationEntryScroll) deps.saveNavigationEntryScroll(currentScrollY);
|
|
553
560
|
else deps.replaceState({
|
|
@@ -555,29 +562,21 @@ function createRouter(deps) {
|
|
|
555
562
|
scrollY: currentScrollY
|
|
556
563
|
}, "", deps.getCurrentUrl());
|
|
557
564
|
if (isClientStale()) await leaveSpaSuperseding(url, departingUrl);
|
|
558
|
-
let effectiveSkipHistory = skipHistory;
|
|
559
565
|
await runNavigation(url, async (owner) => {
|
|
560
|
-
if (!effectiveSkipHistory && deps.navigationNavigate) {
|
|
561
|
-
deps.setRouterNavigating?.(true);
|
|
562
|
-
deps.navigationNavigate(url, replace);
|
|
563
|
-
deps.setRouterNavigating?.(false);
|
|
564
|
-
effectiveSkipHistory = true;
|
|
565
|
-
}
|
|
566
566
|
try {
|
|
567
567
|
await renderViaTransition(fetchUrl, owner, types, () => performNavigationFetch(fetchUrl, {
|
|
568
568
|
replace,
|
|
569
569
|
commitUrl: url,
|
|
570
570
|
signal: owner.fetchAbort.signal,
|
|
571
|
-
skipHistory: effectiveSkipHistory,
|
|
572
571
|
departingUrl
|
|
573
|
-
}), options.onCommit);
|
|
572
|
+
}), options.onCommit, options.onHandOff);
|
|
574
573
|
if (scroll && hash) scrollToHashAfterPaint(hash);
|
|
575
574
|
else restoreScrollAfterPaint(scroll ? 0 : currentScrollY);
|
|
576
575
|
} catch (error) {
|
|
577
|
-
if (await recoverFromNavigationError(error, owner, url, departingUrl, types)) return;
|
|
576
|
+
if (await recoverFromNavigationError(error, owner, url, departingUrl, types, options.onHandOff)) return;
|
|
578
577
|
throw error;
|
|
579
578
|
}
|
|
580
|
-
}
|
|
579
|
+
});
|
|
581
580
|
}
|
|
582
581
|
/**
|
|
583
582
|
* Fetch a URL's RSC payload, commit it, and render — the pipeline shared by
|
|
@@ -717,6 +716,8 @@ function createRouter(deps) {
|
|
|
717
716
|
return outcome === "committed";
|
|
718
717
|
},
|
|
719
718
|
runWhenIdle: (task) => lifecycle.runWhenIdle(task),
|
|
719
|
+
onIdle: (listener) => lifecycle.onIdle(listener),
|
|
720
|
+
onTreeCommit: (listener) => lifecycle.onTreeCommit(listener),
|
|
720
721
|
settleHandoffs: () => lifecycle.settleHandoffs(),
|
|
721
722
|
suppressSegmentReuse() {
|
|
722
723
|
segmentCache.invalidateReuse();
|