@buzola/router 0.0.19 → 0.0.21
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/dist/engine/navigation-adapter.d.ts +3 -1
- package/dist/engine/navigation-adapter.d.ts.map +1 -1
- package/dist/engine/navigation-adapter.js +25 -0
- package/dist/engine/navigation-adapter.js.map +1 -1
- package/dist/engine/router.d.ts +6 -0
- package/dist/engine/router.d.ts.map +1 -1
- package/dist/engine/router.js +65 -17
- package/dist/engine/router.js.map +1 -1
- package/dist/engine/types.d.ts +7 -1
- package/dist/engine/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/navigation-adapter.test.ts +74 -1
- package/src/__tests__/router.test.ts +320 -2
- package/src/engine/navigation-adapter.ts +25 -0
- package/src/engine/router.ts +73 -17
- package/src/engine/types.ts +7 -1
- package/src/env.d.ts +8 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { NavigationAdapter } from './types.js';
|
|
1
|
+
import type { BuzolaNavigateEvent, NavigationAdapter } from './types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Create a NavigationAdapter that delegates to the browser's Navigation API.
|
|
4
4
|
*/
|
|
@@ -15,6 +15,8 @@ export interface MemoryNavigationAdapter extends NavigationAdapter {
|
|
|
15
15
|
leftApp(): readonly string[];
|
|
16
16
|
/** How many reloads went through to the browser, i.e. were not intercepted. */
|
|
17
17
|
reloadCount(): number;
|
|
18
|
+
/** How many navigations of each type the router intercepted. */
|
|
19
|
+
interceptCount(type: BuzolaNavigateEvent['navigationType']): number;
|
|
18
20
|
}
|
|
19
21
|
export declare function createMemoryNavigationAdapter(options?: MemoryNavigationAdapterOptions): MemoryNavigationAdapter;
|
|
20
22
|
//# sourceMappingURL=navigation-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-adapter.d.ts","sourceRoot":"","sources":["../../src/engine/navigation-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"navigation-adapter.d.ts","sourceRoot":"","sources":["../../src/engine/navigation-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAmB,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAIzF;;GAEG;AACH,wBAAgB,8BAA8B,IAAI,iBAAiB,CAmGlE;AAID,MAAM,WAAW,8BAA8B;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAOD;;GAEG;AACH,6FAA6F;AAC7F,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IACjE,2CAA2C;IAC3C,OAAO,IAAI,SAAS,MAAM,EAAE,CAAA;IAC5B,+EAA+E;IAC/E,WAAW,IAAI,MAAM,CAAA;IACrB,gEAAgE;IAChE,cAAc,CAAC,IAAI,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAA;CACnE;AAED,wBAAgB,6BAA6B,CAC5C,OAAO,GAAE,8BAAmC,GAC1C,uBAAuB,CA6HzB"}
|
|
@@ -18,6 +18,21 @@ export function createBrowserNavigationAdapter() {
|
|
|
18
18
|
navigationType: event.navigationType,
|
|
19
19
|
userInitiated: event.userInitiated,
|
|
20
20
|
viewTransition,
|
|
21
|
+
whenCommitted(callback) {
|
|
22
|
+
// The next entry change a navigation makes is this one's commit, unless it was cancelled and another
|
|
23
|
+
// navigation got there first. The destination key tells them apart (it is set on traversals).
|
|
24
|
+
// updateCurrentEntry() also fires the event, with no navigation type, and commits nothing: code that
|
|
25
|
+
// saves the scroll position into the entry being left does exactly that while the traversal is pending.
|
|
26
|
+
const key = event.destination.key;
|
|
27
|
+
const onChange = (change) => {
|
|
28
|
+
if (change.navigationType === null)
|
|
29
|
+
return;
|
|
30
|
+
nav.removeEventListener('currententrychange', onChange);
|
|
31
|
+
if (nav.currentEntry?.key === key)
|
|
32
|
+
callback();
|
|
33
|
+
};
|
|
34
|
+
nav.addEventListener('currententrychange', onChange);
|
|
35
|
+
},
|
|
21
36
|
intercept(options) {
|
|
22
37
|
event.intercept({
|
|
23
38
|
handler: options.handler,
|
|
@@ -89,15 +104,20 @@ export function createMemoryNavigationAdapter(options = {}) {
|
|
|
89
104
|
const listeners = new Set();
|
|
90
105
|
const left = [];
|
|
91
106
|
let reloads = 0;
|
|
107
|
+
const intercepts = new Map();
|
|
92
108
|
function emitNavigateEvent(url, navigationType, commitNavigation, viewTransition) {
|
|
93
109
|
let intercepted = false;
|
|
94
110
|
let interceptHandler;
|
|
111
|
+
let onCommitted;
|
|
95
112
|
const event = {
|
|
96
113
|
destination: { url },
|
|
97
114
|
canIntercept: true,
|
|
98
115
|
navigationType,
|
|
99
116
|
userInitiated: false,
|
|
100
117
|
viewTransition,
|
|
118
|
+
whenCommitted(callback) {
|
|
119
|
+
onCommitted = callback;
|
|
120
|
+
},
|
|
101
121
|
intercept(options) {
|
|
102
122
|
intercepted = true;
|
|
103
123
|
interceptHandler = options.handler;
|
|
@@ -107,6 +127,7 @@ export function createMemoryNavigationAdapter(options = {}) {
|
|
|
107
127
|
listener(event);
|
|
108
128
|
}
|
|
109
129
|
if (intercepted && interceptHandler) {
|
|
130
|
+
intercepts.set(navigationType, (intercepts.get(navigationType) ?? 0) + 1);
|
|
110
131
|
// Like the browser, commit the destination entry before the handler runs. A handler that
|
|
111
132
|
// fails or reloads therefore sees the destination as the current entry.
|
|
112
133
|
commitNavigation(true);
|
|
@@ -120,6 +141,7 @@ export function createMemoryNavigationAdapter(options = {}) {
|
|
|
120
141
|
else {
|
|
121
142
|
// No interception: commit immediately
|
|
122
143
|
commitNavigation(false);
|
|
144
|
+
onCommitted?.();
|
|
123
145
|
}
|
|
124
146
|
}
|
|
125
147
|
return {
|
|
@@ -185,6 +207,9 @@ export function createMemoryNavigationAdapter(options = {}) {
|
|
|
185
207
|
reloadCount() {
|
|
186
208
|
return reloads;
|
|
187
209
|
},
|
|
210
|
+
interceptCount(type) {
|
|
211
|
+
return intercepts.get(type) ?? 0;
|
|
212
|
+
},
|
|
188
213
|
};
|
|
189
214
|
}
|
|
190
215
|
//# sourceMappingURL=navigation-adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-adapter.js","sourceRoot":"","sources":["../../src/engine/navigation-adapter.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"navigation-adapter.js","sourceRoot":"","sources":["../../src/engine/navigation-adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/router.d.ts
CHANGED
|
@@ -71,6 +71,11 @@ export declare class Router {
|
|
|
71
71
|
private pendingScrollBehavior;
|
|
72
72
|
private pendingFocusReset;
|
|
73
73
|
private readonly _loaderCache;
|
|
74
|
+
/**
|
|
75
|
+
* Hot module replacement: every live router that renders `previous` switches to `next`. Generated route modules
|
|
76
|
+
* call this after a page module changed.
|
|
77
|
+
*/
|
|
78
|
+
static replaceRoutes(previous: RouteTree, next: RouteTree): void;
|
|
74
79
|
constructor(options: RouterOptions);
|
|
75
80
|
/**
|
|
76
81
|
* The configured base path (e.g., "/app"). Empty string if none.
|
|
@@ -94,6 +99,7 @@ export declare class Router {
|
|
|
94
99
|
* Call this once when the router is initialized.
|
|
95
100
|
*/
|
|
96
101
|
start(): () => void;
|
|
102
|
+
private commitLocation;
|
|
97
103
|
/**
|
|
98
104
|
* A reload asks for a fresh document (e.g. to recover from stale chunks after a deploy), so it goes to
|
|
99
105
|
* the browser. Re-rendering the current route from the JavaScript already loaded would defeat it.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/engine/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,KAAK,EAAE,SAAS,EAAuB,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAG/I;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;;CAKhD;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/engine/router.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/router.js
CHANGED
|
@@ -10,6 +10,8 @@ export class NavigationAbortedError extends Error {
|
|
|
10
10
|
this.name = 'NavigationAbortedError';
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
+
/** Routers not yet disposed, so a hot update can find the ones that render a replaced route tree. */
|
|
14
|
+
const liveRouters = new Set();
|
|
13
15
|
/**
|
|
14
16
|
* Central Router orchestrator.
|
|
15
17
|
* Intercepts all navigations via the Navigation API and manages route matching.
|
|
@@ -33,7 +35,18 @@ export class Router {
|
|
|
33
35
|
pendingScrollBehavior = 'after-transition';
|
|
34
36
|
pendingFocusReset;
|
|
35
37
|
_loaderCache;
|
|
38
|
+
/**
|
|
39
|
+
* Hot module replacement: every live router that renders `previous` switches to `next`. Generated route modules
|
|
40
|
+
* call this after a page module changed.
|
|
41
|
+
*/
|
|
42
|
+
static replaceRoutes(previous, next) {
|
|
43
|
+
for (const router of liveRouters) {
|
|
44
|
+
if (router.routes === previous)
|
|
45
|
+
router.updateRoutes(next);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
36
48
|
constructor(options) {
|
|
49
|
+
liveRouters.add(this);
|
|
37
50
|
this.routes = options.routes;
|
|
38
51
|
this.adapter = options.adapter;
|
|
39
52
|
this.viewTransitions = options.viewTransitions ?? false;
|
|
@@ -132,14 +145,35 @@ export class Router {
|
|
|
132
145
|
}
|
|
133
146
|
}
|
|
134
147
|
const currentNavId = ++this.navigationId;
|
|
135
|
-
const useViewTransition = event.viewTransition || this.viewTransitions
|
|
148
|
+
const useViewTransition = (event.viewTransition || this.viewTransitions) && typeof document !== 'undefined'
|
|
149
|
+
&& 'startViewTransition' in document;
|
|
150
|
+
// A traversal nobody needs to hold is left to the browser. Safari restores scroll for an intercepted
|
|
151
|
+
// traversal in a later task, and skips the restore if a wheel event reached the page in between. A trackpad
|
|
152
|
+
// back swipe always delivers some, and React always has a wheel listener, so the page comes back unscrolled
|
|
153
|
+
// and the swipe snapshot hangs for its 3 s timeout. Not intercepted, the traversal takes the browser's
|
|
154
|
+
// classic path, which switches the entry and restores scroll in one task. Rendering at the switch keeps the
|
|
155
|
+
// screen in step with the URL (an effect that replaces the entry must not hit the one being left) while
|
|
156
|
+
// the page is still in place before the restore.
|
|
157
|
+
if (event.navigationType === 'traverse' && this.blockers.size === 0 && !useViewTransition && event.whenCommitted) {
|
|
158
|
+
event.whenCommitted(() => {
|
|
159
|
+
if (this.navigationId !== currentNavId)
|
|
160
|
+
return;
|
|
161
|
+
this.commitLocation(url, matches, this.adapter.getState(), event.navigationType);
|
|
162
|
+
});
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
136
165
|
// Query-only navigations stay on the same page, so keep focus where the user left it
|
|
137
166
|
// (search boxes, filters, pagination). Path changes keep the browser's focus reset,
|
|
138
167
|
// and so do fragment changes, which must move focus to the targeted section.
|
|
139
168
|
const focusReset = explicitFocusReset
|
|
140
169
|
?? (isSamePath(this.state.location, url) && this.state.location.hash === url.hash ? 'manual' : 'after-transition');
|
|
170
|
+
// Safari 26.5 scrolls an intercepted push or replace to the top only in the web process. The page reports
|
|
171
|
+
// scrollY 0 while the screen stays where it was (a sticky header is gone) until the next scroll, which
|
|
172
|
+
// jumps from the old position (WebKit bug 309542, fixed in 308976@main). window.scrollTo reaches the
|
|
173
|
+
// screen, so the router scrolls to the top itself. A fragment and a traversal stay with the browser.
|
|
174
|
+
const scrollToTop = scrollBehavior === 'after-transition' && event.navigationType !== 'traverse' && url.hash === '';
|
|
141
175
|
event.intercept({
|
|
142
|
-
scroll: scrollBehavior,
|
|
176
|
+
scroll: scrollToTop ? 'manual' : scrollBehavior,
|
|
143
177
|
focusReset,
|
|
144
178
|
handler: async () => {
|
|
145
179
|
// Check blockers before setting pending state
|
|
@@ -160,24 +194,19 @@ export class Router {
|
|
|
160
194
|
// A newer navigation has started, so abandon this one
|
|
161
195
|
if (this.navigationId !== currentNavId)
|
|
162
196
|
return;
|
|
163
|
-
// Perform the DOM update
|
|
197
|
+
// Perform the DOM update. A view transition runs it later, by when a newer navigation may have
|
|
198
|
+
// committed its own state, so check again.
|
|
164
199
|
const doUpdate = () => {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
});
|
|
173
|
-
// Going to the URL we are already on is still a navigation: a browser
|
|
174
|
-
// re-requests the document for it. Loader data is keyed by href, so it
|
|
175
|
-
// would silently keep serving stale data without an explicit invalidation.
|
|
176
|
-
if (previousHref === url.href) {
|
|
177
|
-
this.invalidateAll();
|
|
200
|
+
if (this.navigationId !== currentNavId)
|
|
201
|
+
return;
|
|
202
|
+
this.commitLocation(url, matches, this.adapter.getState(), event.navigationType);
|
|
203
|
+
// Instant even where the page sets scroll-behavior: smooth, so the jump does not animate. Safari's
|
|
204
|
+
// own reset is instant as well (Chromium's follows the CSS).
|
|
205
|
+
if (scrollToTop && typeof window !== 'undefined') {
|
|
206
|
+
window.scrollTo({ top: 0, left: 0, behavior: 'instant' });
|
|
178
207
|
}
|
|
179
208
|
};
|
|
180
|
-
if (useViewTransition
|
|
209
|
+
if (useViewTransition) {
|
|
181
210
|
;
|
|
182
211
|
document.startViewTransition(doUpdate);
|
|
183
212
|
}
|
|
@@ -194,6 +223,24 @@ export class Router {
|
|
|
194
223
|
this.stopFn = stop;
|
|
195
224
|
return stop;
|
|
196
225
|
}
|
|
226
|
+
commitLocation(url, matches, navigationState, navigationType) {
|
|
227
|
+
const previousHref = this.state.location.href;
|
|
228
|
+
this.setState({
|
|
229
|
+
location: url,
|
|
230
|
+
matches,
|
|
231
|
+
isPending: false,
|
|
232
|
+
pendingLocation: undefined,
|
|
233
|
+
navigationState,
|
|
234
|
+
});
|
|
235
|
+
// Going to the URL we are already on is still a navigation: a browser
|
|
236
|
+
// re-requests the document for it. Loader data is keyed by href, so it
|
|
237
|
+
// would silently keep serving stale data without an explicit invalidation.
|
|
238
|
+
// A traversal re-requests nothing, and reloading would shorten the page before
|
|
239
|
+
// the browser restores its scroll position.
|
|
240
|
+
if (previousHref === url.href && navigationType !== 'traverse') {
|
|
241
|
+
this.invalidateAll();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
197
244
|
/**
|
|
198
245
|
* A reload asks for a fresh document (e.g. to recover from stale chunks after a deploy), so it goes to
|
|
199
246
|
* the browser. Re-rendering the current route from the JavaScript already loaded would defeat it.
|
|
@@ -456,6 +503,7 @@ export class Router {
|
|
|
456
503
|
* Dispose the router: clear all subscribers and reset state.
|
|
457
504
|
*/
|
|
458
505
|
dispose() {
|
|
506
|
+
liveRouters.delete(this);
|
|
459
507
|
this.stopFn?.();
|
|
460
508
|
this.stopFn = undefined;
|
|
461
509
|
this.subscribers.clear();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/engine/router.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/engine/router.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/types.d.ts
CHANGED
|
@@ -143,7 +143,7 @@ export interface NavigateOptions {
|
|
|
143
143
|
viewTransition?: boolean;
|
|
144
144
|
/**
|
|
145
145
|
* Whether to reset scroll position after navigation.
|
|
146
|
-
* Default is `true
|
|
146
|
+
* Default is `true`: scroll to the top (or to the `#fragment`) on push and replace, restore on traverse.
|
|
147
147
|
* Set to `false` to preserve current scroll position.
|
|
148
148
|
*/
|
|
149
149
|
resetScroll?: boolean;
|
|
@@ -195,6 +195,12 @@ export interface BuzolaNavigateEvent {
|
|
|
195
195
|
userInitiated: boolean;
|
|
196
196
|
/** Whether this navigation should use View Transitions API. */
|
|
197
197
|
viewTransition?: boolean;
|
|
198
|
+
/**
|
|
199
|
+
* Run `callback` once the browser has made the destination the current entry of a navigation nobody
|
|
200
|
+
* intercepted. It runs before the browser restores the scroll position, and not at all if the navigation
|
|
201
|
+
* is cancelled. An adapter that cannot tell leaves it out, and the router then intercepts traversals.
|
|
202
|
+
*/
|
|
203
|
+
whenCommitted?(callback: () => void): void;
|
|
198
204
|
/** Intercept the navigation and handle it client-side. */
|
|
199
205
|
intercept(options: {
|
|
200
206
|
handler: () => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/engine/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/engine/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import './setup-dom.js'
|
|
2
2
|
|
|
3
|
-
import { afterEach, describe, expect, it } from 'bun:test'
|
|
3
|
+
import { afterEach, describe, expect, it, mock } from 'bun:test'
|
|
4
4
|
import { createBrowserNavigationAdapter } from '../engine/navigation-adapter.js'
|
|
5
|
+
import type { BuzolaNavigateEvent } from '../engine/types.js'
|
|
5
6
|
|
|
6
7
|
/* The Navigation API is not implemented by happy-dom, and the parts of it this
|
|
7
8
|
adapter touches are small enough to stand in for directly. What matters here
|
|
@@ -67,3 +68,75 @@ describe('createBrowserNavigationAdapter', () => {
|
|
|
67
68
|
expect(adapter.getCurrentURL().href).toBe(window.location.href)
|
|
68
69
|
})
|
|
69
70
|
})
|
|
71
|
+
|
|
72
|
+
describe('createBrowserNavigationAdapter whenCommitted', () => {
|
|
73
|
+
/* A traversal the router does not intercept: the adapter has to spot the moment the browser
|
|
74
|
+
makes the destination the current entry, among every other entry change. */
|
|
75
|
+
function traverseTo(key: string) {
|
|
76
|
+
const listeners = new Map<string, Set<(event: unknown) => void>>()
|
|
77
|
+
const navigation = {
|
|
78
|
+
currentEntry: { url: 'https://example.test/users', key: 'users' },
|
|
79
|
+
addEventListener(type: string, listener: (event: unknown) => void) {
|
|
80
|
+
if (!listeners.has(type)) listeners.set(type, new Set())
|
|
81
|
+
listeners.get(type)?.add(listener)
|
|
82
|
+
},
|
|
83
|
+
removeEventListener(type: string, listener: (event: unknown) => void) {
|
|
84
|
+
listeners.get(type)?.delete(listener)
|
|
85
|
+
},
|
|
86
|
+
}
|
|
87
|
+
Object.defineProperty(window, 'navigation', { value: navigation, writable: true, configurable: true })
|
|
88
|
+
const fire = (type: string, event: unknown) => {
|
|
89
|
+
for (const listener of [...(listeners.get(type) ?? [])]) listener(event)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
let navigateEvent: BuzolaNavigateEvent | undefined
|
|
93
|
+
createBrowserNavigationAdapter().addEventListener('navigate', event => (navigateEvent = event))
|
|
94
|
+
fire('navigate', {
|
|
95
|
+
destination: { url: 'https://example.test/about', key, getState: () => undefined },
|
|
96
|
+
canIntercept: true,
|
|
97
|
+
navigationType: 'traverse',
|
|
98
|
+
userInitiated: true,
|
|
99
|
+
intercept() {},
|
|
100
|
+
})
|
|
101
|
+
const committed = mock(() => {})
|
|
102
|
+
navigateEvent?.whenCommitted?.(committed)
|
|
103
|
+
|
|
104
|
+
return {
|
|
105
|
+
committed,
|
|
106
|
+
/** The browser makes `entryKey` the current entry. */
|
|
107
|
+
change(entryKey: string, navigationType: string | null) {
|
|
108
|
+
if (navigationType !== null) navigation.currentEntry = { url: `https://example.test/${entryKey}`, key: entryKey }
|
|
109
|
+
fire('currententrychange', { navigationType })
|
|
110
|
+
},
|
|
111
|
+
pendingListeners: () => listeners.get('currententrychange')?.size ?? 0,
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
it('reports the commit once the destination becomes the current entry', () => {
|
|
116
|
+
const { committed, change, pendingListeners } = traverseTo('about')
|
|
117
|
+
|
|
118
|
+
change('about', 'traverse')
|
|
119
|
+
|
|
120
|
+
expect(committed).toHaveBeenCalledTimes(1)
|
|
121
|
+
expect(pendingListeners()).toBe(0)
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
it('is not fooled by updateCurrentEntry() on the entry being left', () => {
|
|
125
|
+
const { committed, change } = traverseTo('about')
|
|
126
|
+
|
|
127
|
+
change('users', null)
|
|
128
|
+
expect(committed).not.toHaveBeenCalled()
|
|
129
|
+
|
|
130
|
+
change('about', 'traverse')
|
|
131
|
+
expect(committed).toHaveBeenCalledTimes(1)
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
it('never reports a traversal that another navigation replaced, and stops listening', () => {
|
|
135
|
+
const { committed, change, pendingListeners } = traverseTo('about')
|
|
136
|
+
|
|
137
|
+
change('settings', 'push')
|
|
138
|
+
|
|
139
|
+
expect(committed).not.toHaveBeenCalled()
|
|
140
|
+
expect(pendingListeners()).toBe(0)
|
|
141
|
+
})
|
|
142
|
+
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { describe, expect, it, mock, spyOn } from 'bun:test'
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, mock, spyOn } from 'bun:test'
|
|
2
2
|
import { matchRoutes } from '../engine/matcher.js'
|
|
3
3
|
import { createMemoryNavigationAdapter } from '../engine/navigation-adapter.js'
|
|
4
4
|
import { buildRouteTree } from '../engine/route-tree.js'
|
|
@@ -12,7 +12,7 @@ function dummyComponent() {
|
|
|
12
12
|
function createRouter(
|
|
13
13
|
configs: RouteConfig[],
|
|
14
14
|
initialURL = 'http://localhost/',
|
|
15
|
-
options?: { persistentParams?: () => Record<string, string>; shouldIntercept?: ShouldInterceptFn },
|
|
15
|
+
options?: { persistentParams?: () => Record<string, string>; shouldIntercept?: ShouldInterceptFn; viewTransitions?: boolean },
|
|
16
16
|
) {
|
|
17
17
|
const routes = buildRouteTree(configs)
|
|
18
18
|
const adapter = createMemoryNavigationAdapter({ initialURL })
|
|
@@ -22,6 +22,35 @@ function createRouter(
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
describe('Router', () => {
|
|
25
|
+
it('replaceRoutes swaps the tree of every live router that renders it, and no other', () => {
|
|
26
|
+
function NextPage() {
|
|
27
|
+
return null
|
|
28
|
+
}
|
|
29
|
+
const adapter = () => createMemoryNavigationAdapter({ initialURL: 'http://localhost/' })
|
|
30
|
+
const routes = buildRouteTree([{ path: '/', component: dummyComponent, isIndex: true }])
|
|
31
|
+
const router = new Router({ routes, adapter: adapter() })
|
|
32
|
+
const other = new Router({ routes: buildRouteTree([{ path: '/', component: dummyComponent, isIndex: true }]), adapter: adapter() })
|
|
33
|
+
const otherMatches = other.getState().matches
|
|
34
|
+
|
|
35
|
+
Router.replaceRoutes(routes, buildRouteTree([{ path: '/', component: NextPage, isIndex: true }]))
|
|
36
|
+
|
|
37
|
+
expect(router.getState().matches[0]?.node.component).toBe(NextPage)
|
|
38
|
+
expect(other.getState().matches).toBe(otherMatches)
|
|
39
|
+
router.dispose()
|
|
40
|
+
other.dispose()
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it('replaceRoutes leaves a disposed router alone', () => {
|
|
44
|
+
const routes = buildRouteTree([{ path: '/', component: dummyComponent, isIndex: true }])
|
|
45
|
+
const router = new Router({ routes, adapter: createMemoryNavigationAdapter({ initialURL: 'http://localhost/' }) })
|
|
46
|
+
const matches = router.getState().matches
|
|
47
|
+
router.dispose()
|
|
48
|
+
|
|
49
|
+
Router.replaceRoutes(routes, buildRouteTree([{ path: '/', component: dummyComponent, isIndex: true }]))
|
|
50
|
+
|
|
51
|
+
expect(router.getState().matches).toBe(matches)
|
|
52
|
+
})
|
|
53
|
+
|
|
25
54
|
it('initializes with the current URL state', () => {
|
|
26
55
|
const { router } = createRouter([
|
|
27
56
|
{ path: '/', component: dummyComponent, isIndex: true },
|
|
@@ -307,6 +336,26 @@ describe('Router same-URL navigation', () => {
|
|
|
307
336
|
expect(count()).toBe(1)
|
|
308
337
|
})
|
|
309
338
|
|
|
339
|
+
it('does not invalidate on a traversal between two entries with the same URL', () => {
|
|
340
|
+
const { router, count } = createCountingRouter('http://localhost/list')
|
|
341
|
+
router.navigate('/list')
|
|
342
|
+
|
|
343
|
+
router.back()
|
|
344
|
+
|
|
345
|
+
expect(count()).toBe(1)
|
|
346
|
+
})
|
|
347
|
+
|
|
348
|
+
it('does not invalidate on an intercepted traversal between two entries with the same URL', async () => {
|
|
349
|
+
const { router, count } = createCountingRouter('http://localhost/list')
|
|
350
|
+
router.navigate('/list')
|
|
351
|
+
router.addBlocker(async () => true)
|
|
352
|
+
|
|
353
|
+
router.back()
|
|
354
|
+
await new Promise(resolve => setTimeout(resolve, 0))
|
|
355
|
+
|
|
356
|
+
expect(count()).toBe(1)
|
|
357
|
+
})
|
|
358
|
+
|
|
310
359
|
it('does not invalidate when the URL changes: the href-keyed loader reloads on its own', () => {
|
|
311
360
|
const { router, count } = createCountingRouter('http://localhost/')
|
|
312
361
|
|
|
@@ -317,6 +366,116 @@ describe('Router same-URL navigation', () => {
|
|
|
317
366
|
})
|
|
318
367
|
})
|
|
319
368
|
|
|
369
|
+
describe('Router scroll to top', () => {
|
|
370
|
+
// Stands in for the window the router scrolls. Other test files install a DOM, so the real global is put back.
|
|
371
|
+
const original = Object.getOwnPropertyDescriptor(globalThis, 'window')
|
|
372
|
+
const scrollTo = mock((_options: ScrollToOptions) => {})
|
|
373
|
+
beforeEach(() => {
|
|
374
|
+
scrollTo.mockClear()
|
|
375
|
+
Object.defineProperty(globalThis, 'window', { value: { scrollTo }, writable: true, configurable: true })
|
|
376
|
+
})
|
|
377
|
+
afterEach(() => {
|
|
378
|
+
if (original) {
|
|
379
|
+
Object.defineProperty(globalThis, 'window', original)
|
|
380
|
+
} else {
|
|
381
|
+
delete (globalThis as { window?: unknown }).window
|
|
382
|
+
}
|
|
383
|
+
})
|
|
384
|
+
|
|
385
|
+
// Records the scroll option of every navigation the router intercepts.
|
|
386
|
+
function createRecordingRouter() {
|
|
387
|
+
const adapter = createMemoryNavigationAdapter({ initialURL: 'http://localhost/list' })
|
|
388
|
+
const scroll: (string | undefined)[] = []
|
|
389
|
+
const recording = new Map<(event: BuzolaNavigateEvent) => void, (event: BuzolaNavigateEvent) => void>()
|
|
390
|
+
const router = new Router({
|
|
391
|
+
routes: buildRouteTree([
|
|
392
|
+
{ path: '/list', component: dummyComponent },
|
|
393
|
+
{ path: '/about', component: dummyComponent },
|
|
394
|
+
]),
|
|
395
|
+
adapter: {
|
|
396
|
+
...adapter,
|
|
397
|
+
addEventListener(type, listener) {
|
|
398
|
+
const record = (event: BuzolaNavigateEvent) =>
|
|
399
|
+
listener({
|
|
400
|
+
...event,
|
|
401
|
+
intercept(options) {
|
|
402
|
+
scroll.push(options.scroll)
|
|
403
|
+
event.intercept(options)
|
|
404
|
+
},
|
|
405
|
+
})
|
|
406
|
+
recording.set(listener, record)
|
|
407
|
+
adapter.addEventListener(type, record)
|
|
408
|
+
},
|
|
409
|
+
removeEventListener(type, listener) {
|
|
410
|
+
const record = recording.get(listener)
|
|
411
|
+
if (record) adapter.removeEventListener(type, record)
|
|
412
|
+
},
|
|
413
|
+
},
|
|
414
|
+
})
|
|
415
|
+
router.start()
|
|
416
|
+
return { router, scroll }
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
it('scrolls to the top itself instead of leaving it to the browser on a push', () => {
|
|
420
|
+
const { router, scroll } = createRecordingRouter()
|
|
421
|
+
|
|
422
|
+
router.navigate('/about')
|
|
423
|
+
|
|
424
|
+
expect(scroll).toEqual(['manual'])
|
|
425
|
+
expect(scrollTo).toHaveBeenCalledTimes(1)
|
|
426
|
+
expect(scrollTo).toHaveBeenCalledWith({ top: 0, left: 0, behavior: 'instant' })
|
|
427
|
+
})
|
|
428
|
+
|
|
429
|
+
it('scrolls to the top itself on a replace', () => {
|
|
430
|
+
const { router, scroll } = createRecordingRouter()
|
|
431
|
+
|
|
432
|
+
router.navigate('/about', { replace: true })
|
|
433
|
+
|
|
434
|
+
expect(scroll).toEqual(['manual'])
|
|
435
|
+
expect(scrollTo).toHaveBeenCalledTimes(1)
|
|
436
|
+
})
|
|
437
|
+
|
|
438
|
+
it('leaves a fragment to the browser', () => {
|
|
439
|
+
const { router, scroll } = createRecordingRouter()
|
|
440
|
+
|
|
441
|
+
router.navigate('/about#team')
|
|
442
|
+
|
|
443
|
+
expect(scroll).toEqual(['after-transition'])
|
|
444
|
+
expect(scrollTo).not.toHaveBeenCalled()
|
|
445
|
+
})
|
|
446
|
+
|
|
447
|
+
it('does not scroll on a traversal, whose position the browser restores', () => {
|
|
448
|
+
const { router, scroll } = createRecordingRouter()
|
|
449
|
+
router.navigate('/about')
|
|
450
|
+
|
|
451
|
+
router.back()
|
|
452
|
+
|
|
453
|
+
expect(scroll).toEqual(['manual'])
|
|
454
|
+
expect(scrollTo).toHaveBeenCalledTimes(1)
|
|
455
|
+
})
|
|
456
|
+
|
|
457
|
+
it('leaves the restore to the browser on a traversal it intercepts', async () => {
|
|
458
|
+
const { router, scroll } = createRecordingRouter()
|
|
459
|
+
router.navigate('/about')
|
|
460
|
+
router.addBlocker(async () => true)
|
|
461
|
+
|
|
462
|
+
router.back()
|
|
463
|
+
await new Promise(resolve => setTimeout(resolve, 0))
|
|
464
|
+
|
|
465
|
+
expect(scroll).toEqual(['manual', 'after-transition'])
|
|
466
|
+
expect(scrollTo).toHaveBeenCalledTimes(1)
|
|
467
|
+
})
|
|
468
|
+
|
|
469
|
+
it('does not scroll when resetScroll is false', () => {
|
|
470
|
+
const { router, scroll } = createRecordingRouter()
|
|
471
|
+
|
|
472
|
+
router.navigate('/about', { resetScroll: false })
|
|
473
|
+
|
|
474
|
+
expect(scroll).toEqual(['manual'])
|
|
475
|
+
expect(scrollTo).not.toHaveBeenCalled()
|
|
476
|
+
})
|
|
477
|
+
})
|
|
478
|
+
|
|
320
479
|
describe('Router focus reset', () => {
|
|
321
480
|
function createCapturingRouter(initialURL: string) {
|
|
322
481
|
const routes = buildRouteTree([
|
|
@@ -421,6 +580,165 @@ describe('Router focus reset', () => {
|
|
|
421
580
|
})
|
|
422
581
|
})
|
|
423
582
|
|
|
583
|
+
describe('Router traversals', () => {
|
|
584
|
+
const flush = () => new Promise(resolve => setTimeout(resolve, 0))
|
|
585
|
+
const configs: RouteConfig[] = [
|
|
586
|
+
{ path: '/list', component: dummyComponent },
|
|
587
|
+
{ path: '/about', component: dummyComponent },
|
|
588
|
+
]
|
|
589
|
+
|
|
590
|
+
// Safari only restores scroll reliably on the classic, non-intercepted path (see Router.start).
|
|
591
|
+
it('leaves a traversal to the browser and renders the destination once it commits', () => {
|
|
592
|
+
const { router, adapter } = createRouter(configs, 'http://localhost/list')
|
|
593
|
+
router.navigate('/about')
|
|
594
|
+
|
|
595
|
+
router.back()
|
|
596
|
+
|
|
597
|
+
expect(adapter.interceptCount('traverse')).toBe(0)
|
|
598
|
+
expect(router.getState().location.pathname).toBe('/list')
|
|
599
|
+
expect(router.getState().isPending).toBe(false)
|
|
600
|
+
})
|
|
601
|
+
|
|
602
|
+
it('takes the navigation state from the entry it traverses to', () => {
|
|
603
|
+
const { router } = createRouter(configs, 'http://localhost/list')
|
|
604
|
+
router.navigate('/about', { state: { tab: 'team' } })
|
|
605
|
+
router.navigate('/list')
|
|
606
|
+
|
|
607
|
+
router.back()
|
|
608
|
+
|
|
609
|
+
expect(router.getState().navigationState).toEqual({ tab: 'team' })
|
|
610
|
+
})
|
|
611
|
+
|
|
612
|
+
it('intercepts a traversal while a blocker is registered, so the blocker can hold it', async () => {
|
|
613
|
+
const { router, adapter } = createRouter(configs, 'http://localhost/list')
|
|
614
|
+
router.navigate('/about')
|
|
615
|
+
await flush()
|
|
616
|
+
const blocker = mock(async () => true)
|
|
617
|
+
router.addBlocker(blocker)
|
|
618
|
+
|
|
619
|
+
router.back()
|
|
620
|
+
await flush()
|
|
621
|
+
|
|
622
|
+
expect(adapter.interceptCount('traverse')).toBe(1)
|
|
623
|
+
expect(blocker).toHaveBeenCalledTimes(1)
|
|
624
|
+
expect(router.getState().location.pathname).toBe('/list')
|
|
625
|
+
})
|
|
626
|
+
|
|
627
|
+
// Lets a test change the navigate events the router sees.
|
|
628
|
+
function createRouterSeeing(change: (event: BuzolaNavigateEvent) => BuzolaNavigateEvent) {
|
|
629
|
+
const adapter = createMemoryNavigationAdapter({ initialURL: 'http://localhost/list' })
|
|
630
|
+
const wrapped = new Map<(event: BuzolaNavigateEvent) => void, (event: BuzolaNavigateEvent) => void>()
|
|
631
|
+
const router = new Router({
|
|
632
|
+
routes: buildRouteTree(configs),
|
|
633
|
+
adapter: {
|
|
634
|
+
...adapter,
|
|
635
|
+
addEventListener(type, listener) {
|
|
636
|
+
const changed = (event: BuzolaNavigateEvent) => listener(change(event))
|
|
637
|
+
wrapped.set(listener, changed)
|
|
638
|
+
adapter.addEventListener(type, changed)
|
|
639
|
+
},
|
|
640
|
+
removeEventListener(type, listener) {
|
|
641
|
+
const changed = wrapped.get(listener)
|
|
642
|
+
if (changed) adapter.removeEventListener(type, changed)
|
|
643
|
+
},
|
|
644
|
+
},
|
|
645
|
+
})
|
|
646
|
+
router.start()
|
|
647
|
+
return { router, adapter }
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
it('renders a traversal only when the browser commits it, so a cancelled one never shows', () => {
|
|
651
|
+
let commit: (() => void) | undefined
|
|
652
|
+
const { router } = createRouterSeeing(event => ({ ...event, whenCommitted: callback => (commit = callback) }))
|
|
653
|
+
router.navigate('/about')
|
|
654
|
+
|
|
655
|
+
router.back()
|
|
656
|
+
expect(router.getState().location.pathname).toBe('/about')
|
|
657
|
+
|
|
658
|
+
commit?.()
|
|
659
|
+
expect(router.getState().location.pathname).toBe('/list')
|
|
660
|
+
})
|
|
661
|
+
|
|
662
|
+
it('intercepts a traversal when the adapter cannot report its commit', () => {
|
|
663
|
+
const { router, adapter } = createRouterSeeing(({ whenCommitted: _, ...event }) => event)
|
|
664
|
+
router.navigate('/about')
|
|
665
|
+
|
|
666
|
+
router.back()
|
|
667
|
+
|
|
668
|
+
expect(adapter.interceptCount('traverse')).toBe(1)
|
|
669
|
+
expect(router.getState().location.pathname).toBe('/list')
|
|
670
|
+
})
|
|
671
|
+
|
|
672
|
+
it('leaves a forward traversal to the browser too', () => {
|
|
673
|
+
const { router, adapter } = createRouter(configs, 'http://localhost/list')
|
|
674
|
+
router.navigate('/about', { state: { tab: 'team' } })
|
|
675
|
+
router.back()
|
|
676
|
+
|
|
677
|
+
router.forward()
|
|
678
|
+
|
|
679
|
+
expect(adapter.interceptCount('traverse')).toBe(0)
|
|
680
|
+
expect(router.getState().location.pathname).toBe('/about')
|
|
681
|
+
expect(router.getState().navigationState).toEqual({ tab: 'team' })
|
|
682
|
+
})
|
|
683
|
+
|
|
684
|
+
describe('with view transitions', () => {
|
|
685
|
+
// Stands in for the document, holding each view transition update until the test runs it.
|
|
686
|
+
// Other test files install a DOM, so the real global is put back afterwards.
|
|
687
|
+
const original = Object.getOwnPropertyDescriptor(globalThis, 'document')
|
|
688
|
+
let transitions: (() => void)[] = []
|
|
689
|
+
function withDocument(viewTransitions: boolean) {
|
|
690
|
+
transitions = []
|
|
691
|
+
const document = viewTransitions ? { startViewTransition: (update: () => void) => transitions.push(update) } : {}
|
|
692
|
+
Object.defineProperty(globalThis, 'document', { value: document, writable: true, configurable: true })
|
|
693
|
+
}
|
|
694
|
+
afterEach(() => {
|
|
695
|
+
if (original) {
|
|
696
|
+
Object.defineProperty(globalThis, 'document', original)
|
|
697
|
+
} else {
|
|
698
|
+
delete (globalThis as { document?: unknown }).document
|
|
699
|
+
}
|
|
700
|
+
})
|
|
701
|
+
|
|
702
|
+
it('intercepts a traversal that runs a view transition', async () => {
|
|
703
|
+
withDocument(true)
|
|
704
|
+
const { router, adapter } = createRouter(configs, 'http://localhost/list', { viewTransitions: true })
|
|
705
|
+
router.navigate('/about')
|
|
706
|
+
await flush()
|
|
707
|
+
transitions.shift()?.()
|
|
708
|
+
|
|
709
|
+
router.back()
|
|
710
|
+
await flush()
|
|
711
|
+
transitions.shift()?.()
|
|
712
|
+
|
|
713
|
+
expect(adapter.interceptCount('traverse')).toBe(1)
|
|
714
|
+
expect(router.getState().location.pathname).toBe('/list')
|
|
715
|
+
})
|
|
716
|
+
|
|
717
|
+
it('leaves a traversal to the browser when it has no view transitions', () => {
|
|
718
|
+
withDocument(false)
|
|
719
|
+
const { router, adapter } = createRouter(configs, 'http://localhost/list', { viewTransitions: true })
|
|
720
|
+
router.navigate('/about')
|
|
721
|
+
|
|
722
|
+
router.back()
|
|
723
|
+
|
|
724
|
+
expect(adapter.interceptCount('traverse')).toBe(0)
|
|
725
|
+
expect(router.getState().location.pathname).toBe('/list')
|
|
726
|
+
})
|
|
727
|
+
|
|
728
|
+
it('drops the update of a transition that a traversal overtook', async () => {
|
|
729
|
+
withDocument(true)
|
|
730
|
+
const { router } = createRouter(configs, 'http://localhost/list')
|
|
731
|
+
router.navigate('/about', { viewTransition: true })
|
|
732
|
+
await flush()
|
|
733
|
+
|
|
734
|
+
router.back()
|
|
735
|
+
transitions.shift()?.()
|
|
736
|
+
|
|
737
|
+
expect(router.getState().location.pathname).toBe('/list')
|
|
738
|
+
})
|
|
739
|
+
})
|
|
740
|
+
})
|
|
741
|
+
|
|
424
742
|
describe('Router.leaveApp', () => {
|
|
425
743
|
// A catch-all 404 route matches every path on the origin, so without a release the router
|
|
426
744
|
// swallows the server's own URLs and renders "Not found" with no request ever sent.
|
|
@@ -26,6 +26,19 @@ export function createBrowserNavigationAdapter(): NavigationAdapter {
|
|
|
26
26
|
navigationType: event.navigationType as BuzolaNavigateEvent['navigationType'],
|
|
27
27
|
userInitiated: event.userInitiated,
|
|
28
28
|
viewTransition,
|
|
29
|
+
whenCommitted(callback) {
|
|
30
|
+
// The next entry change a navigation makes is this one's commit, unless it was cancelled and another
|
|
31
|
+
// navigation got there first. The destination key tells them apart (it is set on traversals).
|
|
32
|
+
// updateCurrentEntry() also fires the event, with no navigation type, and commits nothing: code that
|
|
33
|
+
// saves the scroll position into the entry being left does exactly that while the traversal is pending.
|
|
34
|
+
const key = event.destination.key
|
|
35
|
+
const onChange = (change: NavigationCurrentEntryChangeEvent) => {
|
|
36
|
+
if (change.navigationType === null) return
|
|
37
|
+
nav.removeEventListener('currententrychange', onChange)
|
|
38
|
+
if (nav.currentEntry?.key === key) callback()
|
|
39
|
+
}
|
|
40
|
+
nav.addEventListener('currententrychange', onChange)
|
|
41
|
+
},
|
|
29
42
|
intercept(options) {
|
|
30
43
|
event.intercept({
|
|
31
44
|
handler: options.handler,
|
|
@@ -113,6 +126,8 @@ export interface MemoryNavigationAdapter extends NavigationAdapter {
|
|
|
113
126
|
leftApp(): readonly string[]
|
|
114
127
|
/** How many reloads went through to the browser, i.e. were not intercepted. */
|
|
115
128
|
reloadCount(): number
|
|
129
|
+
/** How many navigations of each type the router intercepted. */
|
|
130
|
+
interceptCount(type: BuzolaNavigateEvent['navigationType']): number
|
|
116
131
|
}
|
|
117
132
|
|
|
118
133
|
export function createMemoryNavigationAdapter(
|
|
@@ -125,6 +140,7 @@ export function createMemoryNavigationAdapter(
|
|
|
125
140
|
const listeners = new Set<(event: BuzolaNavigateEvent) => void>()
|
|
126
141
|
const left: string[] = []
|
|
127
142
|
let reloads = 0
|
|
143
|
+
const intercepts = new Map<BuzolaNavigateEvent['navigationType'], number>()
|
|
128
144
|
|
|
129
145
|
function emitNavigateEvent(
|
|
130
146
|
url: string,
|
|
@@ -134,6 +150,7 @@ export function createMemoryNavigationAdapter(
|
|
|
134
150
|
): void {
|
|
135
151
|
let intercepted = false
|
|
136
152
|
let interceptHandler: (() => Promise<void>) | undefined
|
|
153
|
+
let onCommitted: (() => void) | undefined
|
|
137
154
|
|
|
138
155
|
const event: BuzolaNavigateEvent = {
|
|
139
156
|
destination: { url },
|
|
@@ -141,6 +158,9 @@ export function createMemoryNavigationAdapter(
|
|
|
141
158
|
navigationType,
|
|
142
159
|
userInitiated: false,
|
|
143
160
|
viewTransition,
|
|
161
|
+
whenCommitted(callback) {
|
|
162
|
+
onCommitted = callback
|
|
163
|
+
},
|
|
144
164
|
intercept(options) {
|
|
145
165
|
intercepted = true
|
|
146
166
|
interceptHandler = options.handler
|
|
@@ -152,6 +172,7 @@ export function createMemoryNavigationAdapter(
|
|
|
152
172
|
}
|
|
153
173
|
|
|
154
174
|
if (intercepted && interceptHandler) {
|
|
175
|
+
intercepts.set(navigationType, (intercepts.get(navigationType) ?? 0) + 1)
|
|
155
176
|
// Like the browser, commit the destination entry before the handler runs. A handler that
|
|
156
177
|
// fails or reloads therefore sees the destination as the current entry.
|
|
157
178
|
commitNavigation(true)
|
|
@@ -166,6 +187,7 @@ export function createMemoryNavigationAdapter(
|
|
|
166
187
|
} else {
|
|
167
188
|
// No interception: commit immediately
|
|
168
189
|
commitNavigation(false)
|
|
190
|
+
onCommitted?.()
|
|
169
191
|
}
|
|
170
192
|
}
|
|
171
193
|
|
|
@@ -231,5 +253,8 @@ export function createMemoryNavigationAdapter(
|
|
|
231
253
|
reloadCount() {
|
|
232
254
|
return reloads
|
|
233
255
|
},
|
|
256
|
+
interceptCount(type) {
|
|
257
|
+
return intercepts.get(type) ?? 0
|
|
258
|
+
},
|
|
234
259
|
}
|
|
235
260
|
}
|
package/src/engine/router.ts
CHANGED
|
@@ -15,6 +15,9 @@ export class NavigationAbortedError extends Error {
|
|
|
15
15
|
|
|
16
16
|
export type RouterSubscriber = (state: RouterState) => void
|
|
17
17
|
|
|
18
|
+
/** Routers not yet disposed, so a hot update can find the ones that render a replaced route tree. */
|
|
19
|
+
const liveRouters = new Set<Router>()
|
|
20
|
+
|
|
18
21
|
export interface RouterOptions {
|
|
19
22
|
/** Route tree (segment trie). */
|
|
20
23
|
routes: RouteTree
|
|
@@ -81,7 +84,18 @@ export class Router {
|
|
|
81
84
|
private pendingFocusReset: 'after-transition' | 'manual' | undefined
|
|
82
85
|
private readonly _loaderCache: LoaderCache | undefined
|
|
83
86
|
|
|
87
|
+
/**
|
|
88
|
+
* Hot module replacement: every live router that renders `previous` switches to `next`. Generated route modules
|
|
89
|
+
* call this after a page module changed.
|
|
90
|
+
*/
|
|
91
|
+
static replaceRoutes(previous: RouteTree, next: RouteTree): void {
|
|
92
|
+
for (const router of liveRouters) {
|
|
93
|
+
if (router.routes === previous) router.updateRoutes(next)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
84
97
|
constructor(options: RouterOptions) {
|
|
98
|
+
liveRouters.add(this)
|
|
85
99
|
this.routes = options.routes
|
|
86
100
|
this.adapter = options.adapter
|
|
87
101
|
this.viewTransitions = options.viewTransitions ?? false
|
|
@@ -191,15 +205,38 @@ export class Router {
|
|
|
191
205
|
}
|
|
192
206
|
|
|
193
207
|
const currentNavId = ++this.navigationId
|
|
194
|
-
const useViewTransition = event.viewTransition || this.viewTransitions
|
|
208
|
+
const useViewTransition = (event.viewTransition || this.viewTransitions) && typeof document !== 'undefined'
|
|
209
|
+
&& 'startViewTransition' in document
|
|
210
|
+
|
|
211
|
+
// A traversal nobody needs to hold is left to the browser. Safari restores scroll for an intercepted
|
|
212
|
+
// traversal in a later task, and skips the restore if a wheel event reached the page in between. A trackpad
|
|
213
|
+
// back swipe always delivers some, and React always has a wheel listener, so the page comes back unscrolled
|
|
214
|
+
// and the swipe snapshot hangs for its 3 s timeout. Not intercepted, the traversal takes the browser's
|
|
215
|
+
// classic path, which switches the entry and restores scroll in one task. Rendering at the switch keeps the
|
|
216
|
+
// screen in step with the URL (an effect that replaces the entry must not hit the one being left) while
|
|
217
|
+
// the page is still in place before the restore.
|
|
218
|
+
if (event.navigationType === 'traverse' && this.blockers.size === 0 && !useViewTransition && event.whenCommitted) {
|
|
219
|
+
event.whenCommitted(() => {
|
|
220
|
+
if (this.navigationId !== currentNavId) return
|
|
221
|
+
this.commitLocation(url, matches, this.adapter.getState(), event.navigationType)
|
|
222
|
+
})
|
|
223
|
+
return
|
|
224
|
+
}
|
|
225
|
+
|
|
195
226
|
// Query-only navigations stay on the same page, so keep focus where the user left it
|
|
196
227
|
// (search boxes, filters, pagination). Path changes keep the browser's focus reset,
|
|
197
228
|
// and so do fragment changes, which must move focus to the targeted section.
|
|
198
229
|
const focusReset = explicitFocusReset
|
|
199
230
|
?? (isSamePath(this.state.location, url) && this.state.location.hash === url.hash ? 'manual' : 'after-transition')
|
|
200
231
|
|
|
232
|
+
// Safari 26.5 scrolls an intercepted push or replace to the top only in the web process. The page reports
|
|
233
|
+
// scrollY 0 while the screen stays where it was (a sticky header is gone) until the next scroll, which
|
|
234
|
+
// jumps from the old position (WebKit bug 309542, fixed in 308976@main). window.scrollTo reaches the
|
|
235
|
+
// screen, so the router scrolls to the top itself. A fragment and a traversal stay with the browser.
|
|
236
|
+
const scrollToTop = scrollBehavior === 'after-transition' && event.navigationType !== 'traverse' && url.hash === ''
|
|
237
|
+
|
|
201
238
|
event.intercept({
|
|
202
|
-
scroll: scrollBehavior,
|
|
239
|
+
scroll: scrollToTop ? 'manual' : scrollBehavior,
|
|
203
240
|
focusReset,
|
|
204
241
|
handler: async () => {
|
|
205
242
|
// Check blockers before setting pending state
|
|
@@ -221,25 +258,19 @@ export class Router {
|
|
|
221
258
|
// A newer navigation has started, so abandon this one
|
|
222
259
|
if (this.navigationId !== currentNavId) return
|
|
223
260
|
|
|
224
|
-
// Perform the DOM update
|
|
261
|
+
// Perform the DOM update. A view transition runs it later, by when a newer navigation may have
|
|
262
|
+
// committed its own state, so check again.
|
|
225
263
|
const doUpdate = () => {
|
|
226
|
-
|
|
227
|
-
this.
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
navigationState: this.adapter.getState(),
|
|
233
|
-
})
|
|
234
|
-
// Going to the URL we are already on is still a navigation: a browser
|
|
235
|
-
// re-requests the document for it. Loader data is keyed by href, so it
|
|
236
|
-
// would silently keep serving stale data without an explicit invalidation.
|
|
237
|
-
if (previousHref === url.href) {
|
|
238
|
-
this.invalidateAll()
|
|
264
|
+
if (this.navigationId !== currentNavId) return
|
|
265
|
+
this.commitLocation(url, matches, this.adapter.getState(), event.navigationType)
|
|
266
|
+
// Instant even where the page sets scroll-behavior: smooth, so the jump does not animate. Safari's
|
|
267
|
+
// own reset is instant as well (Chromium's follows the CSS).
|
|
268
|
+
if (scrollToTop && typeof window !== 'undefined') {
|
|
269
|
+
window.scrollTo({ top: 0, left: 0, behavior: 'instant' })
|
|
239
270
|
}
|
|
240
271
|
}
|
|
241
272
|
|
|
242
|
-
if (useViewTransition
|
|
273
|
+
if (useViewTransition) {
|
|
243
274
|
;(document as unknown as { startViewTransition: (cb: () => void) => void }).startViewTransition(doUpdate)
|
|
244
275
|
} else {
|
|
245
276
|
doUpdate()
|
|
@@ -258,6 +289,30 @@ export class Router {
|
|
|
258
289
|
return stop
|
|
259
290
|
}
|
|
260
291
|
|
|
292
|
+
private commitLocation(
|
|
293
|
+
url: URL,
|
|
294
|
+
matches: RouterState['matches'],
|
|
295
|
+
navigationState: unknown,
|
|
296
|
+
navigationType: BuzolaNavigateEvent['navigationType'],
|
|
297
|
+
): void {
|
|
298
|
+
const previousHref = this.state.location.href
|
|
299
|
+
this.setState({
|
|
300
|
+
location: url,
|
|
301
|
+
matches,
|
|
302
|
+
isPending: false,
|
|
303
|
+
pendingLocation: undefined,
|
|
304
|
+
navigationState,
|
|
305
|
+
})
|
|
306
|
+
// Going to the URL we are already on is still a navigation: a browser
|
|
307
|
+
// re-requests the document for it. Loader data is keyed by href, so it
|
|
308
|
+
// would silently keep serving stale data without an explicit invalidation.
|
|
309
|
+
// A traversal re-requests nothing, and reloading would shorten the page before
|
|
310
|
+
// the browser restores its scroll position.
|
|
311
|
+
if (previousHref === url.href && navigationType !== 'traverse') {
|
|
312
|
+
this.invalidateAll()
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
261
316
|
/**
|
|
262
317
|
* A reload asks for a fresh document (e.g. to recover from stale chunks after a deploy), so it goes to
|
|
263
318
|
* the browser. Re-rendering the current route from the JavaScript already loaded would defeat it.
|
|
@@ -536,6 +591,7 @@ export class Router {
|
|
|
536
591
|
* Dispose the router: clear all subscribers and reset state.
|
|
537
592
|
*/
|
|
538
593
|
dispose(): void {
|
|
594
|
+
liveRouters.delete(this)
|
|
539
595
|
this.stopFn?.()
|
|
540
596
|
this.stopFn = undefined
|
|
541
597
|
this.subscribers.clear()
|
package/src/engine/types.ts
CHANGED
|
@@ -168,7 +168,7 @@ export interface NavigateOptions {
|
|
|
168
168
|
viewTransition?: boolean
|
|
169
169
|
/**
|
|
170
170
|
* Whether to reset scroll position after navigation.
|
|
171
|
-
* Default is `true
|
|
171
|
+
* Default is `true`: scroll to the top (or to the `#fragment`) on push and replace, restore on traverse.
|
|
172
172
|
* Set to `false` to preserve current scroll position.
|
|
173
173
|
*/
|
|
174
174
|
resetScroll?: boolean
|
|
@@ -222,6 +222,12 @@ export interface BuzolaNavigateEvent {
|
|
|
222
222
|
userInitiated: boolean
|
|
223
223
|
/** Whether this navigation should use View Transitions API. */
|
|
224
224
|
viewTransition?: boolean
|
|
225
|
+
/**
|
|
226
|
+
* Run `callback` once the browser has made the destination the current entry of a navigation nobody
|
|
227
|
+
* intercepted. It runs before the browser restores the scroll position, and not at all if the navigation
|
|
228
|
+
* is cancelled. An adapter that cannot tell leaves it out, and the router then intercepts traversals.
|
|
229
|
+
*/
|
|
230
|
+
whenCommitted?(callback: () => void): void
|
|
225
231
|
/** Intercept the navigation and handle it client-side. */
|
|
226
232
|
intercept(
|
|
227
233
|
options: { handler: () => Promise<void>; scroll?: 'after-transition' | 'manual'; focusReset?: 'after-transition' | 'manual' },
|
package/src/env.d.ts
CHANGED
|
@@ -37,6 +37,12 @@ interface NavigateEvent extends Event {
|
|
|
37
37
|
scroll(): void
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
interface NavigationCurrentEntryChangeEvent extends Event {
|
|
41
|
+
/** null when the entry changed through `updateCurrentEntry()` rather than a navigation. */
|
|
42
|
+
navigationType: 'push' | 'replace' | 'reload' | 'traverse' | null
|
|
43
|
+
from: NavigationHistoryEntry
|
|
44
|
+
}
|
|
45
|
+
|
|
40
46
|
interface NavigationNavigateOptions {
|
|
41
47
|
state?: unknown
|
|
42
48
|
info?: unknown
|
|
@@ -60,8 +66,10 @@ interface Navigation extends EventTarget {
|
|
|
60
66
|
back(options?: { info?: unknown }): NavigationResult
|
|
61
67
|
forward(options?: { info?: unknown }): NavigationResult
|
|
62
68
|
addEventListener(type: 'navigate', listener: (event: NavigateEvent) => void): void
|
|
69
|
+
addEventListener(type: 'currententrychange', listener: (event: NavigationCurrentEntryChangeEvent) => void): void
|
|
63
70
|
addEventListener(type: string, listener: EventListener): void
|
|
64
71
|
removeEventListener(type: 'navigate', listener: (event: NavigateEvent) => void): void
|
|
72
|
+
removeEventListener(type: 'currententrychange', listener: (event: NavigationCurrentEntryChangeEvent) => void): void
|
|
65
73
|
removeEventListener(type: string, listener: EventListener): void
|
|
66
74
|
}
|
|
67
75
|
|