@buzola/router 0.0.12 → 0.0.14
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/loader-state.d.ts +2 -0
- package/dist/engine/loader-state.d.ts.map +1 -1
- package/dist/engine/loader-state.js +18 -6
- package/dist/engine/loader-state.js.map +1 -1
- package/dist/engine/navigation-adapter.d.ts.map +1 -1
- package/dist/engine/navigation-adapter.js +7 -1
- package/dist/engine/navigation-adapter.js.map +1 -1
- package/dist/engine/router.d.ts +1 -0
- package/dist/engine/router.d.ts.map +1 -1
- package/dist/engine/router.js +17 -3
- package/dist/engine/router.js.map +1 -1
- package/dist/engine/types.d.ts +8 -0
- package/dist/engine/types.d.ts.map +1 -1
- package/dist/engine/utils.d.ts +9 -0
- package/dist/engine/utils.d.ts.map +1 -1
- package/dist/engine/utils.js +13 -0
- package/dist/engine/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/loader-state.test.ts +61 -0
- package/src/__tests__/navigation-adapter.test.ts +69 -0
- package/src/__tests__/router.test.ts +106 -2
- package/src/engine/loader-state.ts +18 -6
- package/src/engine/navigation-adapter.ts +7 -1
- package/src/engine/router.ts +18 -3
- package/src/engine/types.ts +10 -1
- package/src/engine/utils.ts +14 -0
|
@@ -43,6 +43,8 @@ export declare class PageLoaderState {
|
|
|
43
43
|
private activeCacheKey;
|
|
44
44
|
private activePromise;
|
|
45
45
|
private activeResolvedData;
|
|
46
|
+
/** URL the currently held data was loaded for — data is cached under this href, not the active one. */
|
|
47
|
+
private resolvedUrlHref;
|
|
46
48
|
private hasResolved;
|
|
47
49
|
private pendingBackgroundKey;
|
|
48
50
|
private readonly id;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader-state.d.ts","sourceRoot":"","sources":["../../src/engine/loader-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"loader-state.d.ts","sourceRoot":"","sources":["../../src/engine/loader-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAKpD,MAAM,MAAM,iBAAiB,GAC1B;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GACvD;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAA;AAEnD,MAAM,WAAW,oBAAoB;IACpC,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAA;IACtB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAA;IAChB,gDAAgD;IAChD,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5B,0DAA0D;IAC1D,WAAW,EAAE,WAAW,GAAG,SAAS,CAAA;IACpC;;;;OAIG;IACH,mBAAmB,EAAE,CAAC,OAAO,EAAE;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAA;KAAE,KAAK,IAAI,CAAA;CACrF;AAMD;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,kBAAkB,CAAS;IACnC,uGAAuG;IACvG,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,oBAAoB,CAAsB;IAClD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAQ;;IAM3B;;;OAGG;IACH,OAAO,CAAC,GAAG,EAAE,oBAAoB,GAAG,iBAAiB;IA8CrD,sDAAsD;IACtD,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAMjC,yEAAyE;IACzE,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAM3C,sFAAsF;IACtF,qBAAqB,IAAI,IAAI;IAK7B,8DAA8D;IAC9D,OAAO,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI;IAenD,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,gBAAgB;CAGxB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isSamePath } from './utils.js';
|
|
1
2
|
// ─── State machine ──────────────────────────────────────────────────────────
|
|
2
3
|
let nextId = 0;
|
|
3
4
|
/**
|
|
@@ -15,6 +16,8 @@ export class PageLoaderState {
|
|
|
15
16
|
activeCacheKey = null;
|
|
16
17
|
activePromise = null;
|
|
17
18
|
activeResolvedData;
|
|
19
|
+
/** URL the currently held data was loaded for — data is cached under this href, not the active one. */
|
|
20
|
+
resolvedUrlHref = null;
|
|
18
21
|
hasResolved = false;
|
|
19
22
|
pendingBackgroundKey = null;
|
|
20
23
|
id;
|
|
@@ -64,11 +67,13 @@ export class PageLoaderState {
|
|
|
64
67
|
/** Commit data after use() resolves (suspend case) */
|
|
65
68
|
commitResult(data) {
|
|
66
69
|
this.activeResolvedData = data;
|
|
70
|
+
this.resolvedUrlHref = this.activeUrlHref;
|
|
67
71
|
this.hasResolved = true;
|
|
68
72
|
}
|
|
69
73
|
/** Commit background SWR success — update data and clear pending flag */
|
|
70
74
|
commitBackgroundResult(data) {
|
|
71
75
|
this.activeResolvedData = data;
|
|
76
|
+
this.resolvedUrlHref = this.activeUrlHref;
|
|
72
77
|
this.pendingBackgroundKey = null;
|
|
73
78
|
}
|
|
74
79
|
/** Mark background load as failed — next render will suspend with rejected promise */
|
|
@@ -78,33 +83,39 @@ export class PageLoaderState {
|
|
|
78
83
|
}
|
|
79
84
|
/** Save state to stale cache and reset (called on unmount) */
|
|
80
85
|
dispose(loaderCache) {
|
|
81
|
-
if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined && this.
|
|
82
|
-
this.saveToStaleCache(loaderCache, this.
|
|
86
|
+
if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined && this.resolvedUrlHref) {
|
|
87
|
+
this.saveToStaleCache(loaderCache, this.resolvedUrlHref, this.activeResolvedData);
|
|
83
88
|
}
|
|
84
89
|
this.activeUrlHref = null;
|
|
85
90
|
this.activeCacheKey = null;
|
|
86
91
|
this.activePromise = null;
|
|
87
92
|
this.activeResolvedData = undefined;
|
|
93
|
+
this.resolvedUrlHref = null;
|
|
88
94
|
this.hasResolved = false;
|
|
89
95
|
this.pendingBackgroundKey = null;
|
|
90
96
|
}
|
|
91
97
|
// ─── Private ────────────────────────────────────────────────────────────
|
|
92
98
|
handleUrlChange(currentUrlHref, loaderCache) {
|
|
93
99
|
if (this.activeUrlHref !== null && this.activeUrlHref !== currentUrlHref) {
|
|
94
|
-
// URL changed — save
|
|
95
|
-
if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined) {
|
|
96
|
-
this.saveToStaleCache(loaderCache, this.
|
|
100
|
+
// URL changed — save the held data to stale cache under the href it was loaded for
|
|
101
|
+
if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined && this.resolvedUrlHref) {
|
|
102
|
+
this.saveToStaleCache(loaderCache, this.resolvedUrlHref, this.activeResolvedData);
|
|
97
103
|
}
|
|
98
104
|
// Try to restore from stale cache for new URL
|
|
99
105
|
const cached = loaderCache && this.restoreFromStaleCache(loaderCache, currentUrlHref);
|
|
100
106
|
if (cached?.hit) {
|
|
101
107
|
this.activeResolvedData = cached.value;
|
|
108
|
+
this.resolvedUrlHref = currentUrlHref;
|
|
102
109
|
this.hasResolved = true;
|
|
103
110
|
}
|
|
104
|
-
else {
|
|
111
|
+
else if (!isSamePath(this.activeUrlHref, currentUrlHref)) {
|
|
112
|
+
// Different path — the held data describes another page, drop it and suspend
|
|
105
113
|
this.hasResolved = false;
|
|
106
114
|
this.activeResolvedData = undefined;
|
|
115
|
+
this.resolvedUrlHref = null;
|
|
107
116
|
}
|
|
117
|
+
// Same path, only search/hash changed (filters, sorting, pagination, search):
|
|
118
|
+
// keep the data as stale so resolve() serves it while the new query loads.
|
|
108
119
|
this.pendingBackgroundKey = null;
|
|
109
120
|
}
|
|
110
121
|
else if (this.activeUrlHref === null && loaderCache) {
|
|
@@ -112,6 +123,7 @@ export class PageLoaderState {
|
|
|
112
123
|
const cached = this.restoreFromStaleCache(loaderCache, currentUrlHref);
|
|
113
124
|
if (cached.hit) {
|
|
114
125
|
this.activeResolvedData = cached.value;
|
|
126
|
+
this.resolvedUrlHref = currentUrlHref;
|
|
115
127
|
this.hasResolved = true;
|
|
116
128
|
}
|
|
117
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader-state.js","sourceRoot":"","sources":["../../src/engine/loader-state.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loader-state.js","sourceRoot":"","sources":["../../src/engine/loader-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-adapter.d.ts","sourceRoot":"","sources":["../../src/engine/navigation-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwC,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAIzF;;GAEG;AACH,wBAAgB,8BAA8B,IAAI,iBAAiB,
|
|
1
|
+
{"version":3,"file":"navigation-adapter.d.ts","sourceRoot":"","sources":["../../src/engine/navigation-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwC,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAIzF;;GAEG;AACH,wBAAgB,8BAA8B,IAAI,iBAAiB,CA8ElE;AAID,MAAM,WAAW,8BAA8B;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAOD;;GAEG;AACH,wBAAgB,6BAA6B,CAC5C,OAAO,GAAE,8BAAmC,GAC1C,iBAAiB,CA6FnB"}
|
|
@@ -22,6 +22,7 @@ export function createBrowserNavigationAdapter() {
|
|
|
22
22
|
event.intercept({
|
|
23
23
|
handler: options.handler,
|
|
24
24
|
scroll: options.scroll,
|
|
25
|
+
focusReset: options.focusReset,
|
|
25
26
|
});
|
|
26
27
|
},
|
|
27
28
|
};
|
|
@@ -31,7 +32,12 @@ export function createBrowserNavigationAdapter() {
|
|
|
31
32
|
};
|
|
32
33
|
return {
|
|
33
34
|
getCurrentURL() {
|
|
34
|
-
|
|
35
|
+
// `currentEntry` is null on a document that is not fully active or still on
|
|
36
|
+
// the initial about:blank; Safari reports an empty `url` in that situation
|
|
37
|
+
// instead. `||` catches both, and `location.href` is the URL the entry would
|
|
38
|
+
// have reported. This runs in the Router constructor, so a throw is a blank
|
|
39
|
+
// page rather than a degraded route.
|
|
40
|
+
return new URL(nav.currentEntry?.url || window.location.href);
|
|
35
41
|
},
|
|
36
42
|
navigate(url, options) {
|
|
37
43
|
if (options?.viewTransition) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-adapter.js","sourceRoot":"","sources":["../../src/engine/navigation-adapter.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,8BAA8B;IAC7C,MAAM,GAAG,GAAI,MAAsC,CAAC,UAAU,CAAA;IAC9D,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACd,8FAA8F,CAC9F,CAAA;IACF,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAwC,CAAA;IACjE,IAAI,qBAAqB,GAAG,KAAK,CAAA;IAEjC,MAAM,aAAa,GAAG,CAAC,KAAoB,EAAE,EAAE;QAC9C,MAAM,cAAc,GAAG,qBAAqB,CAAA;QAC5C,qBAAqB,GAAG,KAAK,CAAA;QAE7B,MAAM,WAAW,GAAwB;YACxC,WAAW,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;YAC3C,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,cAAc,EAAE,KAAK,CAAC,cAAuD;YAC7E,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,cAAc;YACd,SAAS,CAAC,OAAO;gBAChB,KAAK,CAAC,SAAS,CAAC;oBACf,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;
|
|
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
|
@@ -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,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAGvG;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;;CAKhD;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;AAE3D,MAAM,WAAW,aAAa;IAC7B,iCAAiC;IACjC,MAAM,EAAE,SAAS,CAAA;IACjB,8CAA8C;IAC9C,OAAO,EAAE,iBAAiB,CAAA;IAC1B,mDAAmD;IACnD,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/C;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;GAGG;AACH,qBAAa,MAAM;IAClB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAA8B;IAClE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwB;IACrD,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,YAAY,CAAI;IACxB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,qBAAqB,CAAoD;IACjF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAyB;gBAE1C,OAAO,EAAE,aAAa;IA0BlC;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,WAAW,GAAG,SAAS,CAEzC;IAED;;OAEG;IACH,QAAQ,IAAI,WAAW;IAIvB;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,IAAI;IAOnD;;;OAGG;IACH,KAAK,IAAI,MAAM,IAAI;
|
|
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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { LoaderCache } from './loader-cache.js';
|
|
2
2
|
import { matchRoutes } from './matcher.js';
|
|
3
|
-
import { extractParamNames, parseParamSegment } from './utils.js';
|
|
3
|
+
import { extractParamNames, isSamePath, parseParamSegment } from './utils.js';
|
|
4
4
|
/**
|
|
5
5
|
* Thrown when a route guard prevents navigation.
|
|
6
6
|
*/
|
|
@@ -28,6 +28,7 @@ export class Router {
|
|
|
28
28
|
stopFn;
|
|
29
29
|
blockers = new Set();
|
|
30
30
|
pendingScrollBehavior = 'after-transition';
|
|
31
|
+
pendingFocusReset;
|
|
31
32
|
_loaderCache;
|
|
32
33
|
constructor(options) {
|
|
33
34
|
this.routes = options.routes;
|
|
@@ -85,6 +86,12 @@ export class Router {
|
|
|
85
86
|
*/
|
|
86
87
|
start() {
|
|
87
88
|
const handler = (event) => {
|
|
89
|
+
// Consume the pending options before any early return — they belong to the
|
|
90
|
+
// navigation that armed them and must not leak into the next one.
|
|
91
|
+
const scrollBehavior = this.pendingScrollBehavior;
|
|
92
|
+
const explicitFocusReset = this.pendingFocusReset;
|
|
93
|
+
this.pendingScrollBehavior = 'after-transition';
|
|
94
|
+
this.pendingFocusReset = undefined;
|
|
88
95
|
if (!event.canIntercept)
|
|
89
96
|
return;
|
|
90
97
|
const url = new URL(event.destination.url);
|
|
@@ -96,10 +103,14 @@ export class Router {
|
|
|
96
103
|
}
|
|
97
104
|
const currentNavId = ++this.navigationId;
|
|
98
105
|
const useViewTransition = event.viewTransition || this.viewTransitions;
|
|
99
|
-
|
|
100
|
-
|
|
106
|
+
// Query-only navigations stay on the same page — keep focus where the user left it
|
|
107
|
+
// (search boxes, filters, pagination). Path changes keep the browser's focus reset,
|
|
108
|
+
// and so do fragment changes, which must move focus to the targeted section.
|
|
109
|
+
const focusReset = explicitFocusReset
|
|
110
|
+
?? (isSamePath(this.state.location, url) && this.state.location.hash === url.hash ? 'manual' : 'after-transition');
|
|
101
111
|
event.intercept({
|
|
102
112
|
scroll: scrollBehavior,
|
|
113
|
+
focusReset,
|
|
103
114
|
handler: async () => {
|
|
104
115
|
// Check blockers before setting pending state
|
|
105
116
|
for (const blocker of this.blockers) {
|
|
@@ -154,6 +165,9 @@ export class Router {
|
|
|
154
165
|
if (options?.resetScroll === false) {
|
|
155
166
|
this.pendingScrollBehavior = 'manual';
|
|
156
167
|
}
|
|
168
|
+
if (options?.focusReset) {
|
|
169
|
+
this.pendingFocusReset = options.focusReset;
|
|
170
|
+
}
|
|
157
171
|
this.adapter.navigate(this._basePath + to, options);
|
|
158
172
|
}
|
|
159
173
|
/**
|
|
@@ -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
|
@@ -148,6 +148,13 @@ export interface NavigateOptions {
|
|
|
148
148
|
* Set to `false` to preserve current scroll position.
|
|
149
149
|
*/
|
|
150
150
|
resetScroll?: boolean;
|
|
151
|
+
/**
|
|
152
|
+
* Whether the browser moves focus after navigation.
|
|
153
|
+
* Defaults to `manual` when only the search string changes — so search boxes, filters and
|
|
154
|
+
* pagination controls keep the caret — and to `after-transition` when the path or the hash
|
|
155
|
+
* changes, so fragment links move focus to the section they target.
|
|
156
|
+
*/
|
|
157
|
+
focusReset?: 'after-transition' | 'manual';
|
|
151
158
|
}
|
|
152
159
|
/**
|
|
153
160
|
* Blocker function registered with the router.
|
|
@@ -173,6 +180,7 @@ export interface BuzolaNavigateEvent {
|
|
|
173
180
|
intercept(options: {
|
|
174
181
|
handler: () => Promise<void>;
|
|
175
182
|
scroll?: 'after-transition' | 'manual';
|
|
183
|
+
focusReset?: 'after-transition' | 'manual';
|
|
176
184
|
}): void;
|
|
177
185
|
}
|
|
178
186
|
/** Abstraction over the Navigation API for testability. */
|
|
@@ -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/dist/engine/utils.d.ts
CHANGED
|
@@ -12,4 +12,13 @@ export declare function parseParamSegment(segment: string): {
|
|
|
12
12
|
* "/:lang/users/:userId+" → ["lang", "userId"]
|
|
13
13
|
*/
|
|
14
14
|
export declare function extractParamNames(pattern: string): string[];
|
|
15
|
+
/**
|
|
16
|
+
* Whether two URLs address the same page — i.e. only search/hash differ.
|
|
17
|
+
* Same-path navigations (filters, sorting, pagination, search) keep the page
|
|
18
|
+
* on screen and keep its loader data as stale; path changes do not.
|
|
19
|
+
*
|
|
20
|
+
* Note this ignores the hash. Callers that care about fragment changes — focus
|
|
21
|
+
* handling, for one — have to compare `hash` themselves.
|
|
22
|
+
*/
|
|
23
|
+
export declare function isSamePath(a: string | URL, b: string | URL): boolean;
|
|
15
24
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/engine/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAIxF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ3D"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/engine/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,CAIxF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ3D;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,CAIpE"}
|
package/dist/engine/utils.js
CHANGED
|
@@ -21,4 +21,17 @@ export function extractParamNames(pattern) {
|
|
|
21
21
|
}
|
|
22
22
|
return names;
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Whether two URLs address the same page — i.e. only search/hash differ.
|
|
26
|
+
* Same-path navigations (filters, sorting, pagination, search) keep the page
|
|
27
|
+
* on screen and keep its loader data as stale; path changes do not.
|
|
28
|
+
*
|
|
29
|
+
* Note this ignores the hash. Callers that care about fragment changes — focus
|
|
30
|
+
* handling, for one — have to compare `hash` themselves.
|
|
31
|
+
*/
|
|
32
|
+
export function isSamePath(a, b) {
|
|
33
|
+
const urlA = typeof a === 'string' ? new URL(a) : a;
|
|
34
|
+
const urlB = typeof b === 'string' ? new URL(b) : b;
|
|
35
|
+
return urlA.origin === urlB.origin && urlA.pathname === urlB.pathname;
|
|
36
|
+
}
|
|
24
37
|
//# sourceMappingURL=utils.js.map
|
package/dist/engine/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/engine/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACjE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAChD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAA;QAC5C,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAA;AACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/engine/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAChD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACjE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAA;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAChD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAA;QAC5C,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAA;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,CAAe,EAAE,CAAe;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnD,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,CAAA;AACtE,CAAC"}
|
package/package.json
CHANGED
|
@@ -233,6 +233,67 @@ describe('PageLoaderState', () => {
|
|
|
233
233
|
}
|
|
234
234
|
})
|
|
235
235
|
|
|
236
|
+
it('keeps data as stale when only the query changes — no suspend', () => {
|
|
237
|
+
const cache = new LoaderCache(10)
|
|
238
|
+
const state = createState()
|
|
239
|
+
|
|
240
|
+
resolveCtx(state, { url: 'http://localhost/list', cacheKey: 'list:0', loaderCache: cache })
|
|
241
|
+
state.commitResult('page-1')
|
|
242
|
+
|
|
243
|
+
// Same path, different query (filter/sort/search/pagination)
|
|
244
|
+
const instruction = resolveCtx(state, {
|
|
245
|
+
url: 'http://localhost/list?search=foo',
|
|
246
|
+
cacheKey: 'list?search=foo:0',
|
|
247
|
+
loaderCache: cache,
|
|
248
|
+
})
|
|
249
|
+
|
|
250
|
+
expect(instruction).toEqual({ action: 'render', data: 'page-1', isLoading: true })
|
|
251
|
+
})
|
|
252
|
+
|
|
253
|
+
it('keeps data as stale on query change without a loader cache', () => {
|
|
254
|
+
const state = createState()
|
|
255
|
+
|
|
256
|
+
resolveCtx(state, { url: 'http://localhost/list', cacheKey: 'list:0' })
|
|
257
|
+
state.commitResult('page-1')
|
|
258
|
+
|
|
259
|
+
const instruction = resolveCtx(state, { url: 'http://localhost/list?page=2', cacheKey: 'list?page=2:0' })
|
|
260
|
+
|
|
261
|
+
expect(instruction).toEqual({ action: 'render', data: 'page-1', isLoading: true })
|
|
262
|
+
})
|
|
263
|
+
|
|
264
|
+
it('caches carried-over data under the href it was loaded for', () => {
|
|
265
|
+
const cache = new LoaderCache(10)
|
|
266
|
+
const state = createState()
|
|
267
|
+
|
|
268
|
+
resolveCtx(state, { url: 'http://localhost/list', cacheKey: 'list:0', loaderCache: cache })
|
|
269
|
+
state.commitResult('page-1')
|
|
270
|
+
|
|
271
|
+
// Query change carries 'page-1' over as stale, still belonging to /list
|
|
272
|
+
resolveCtx(state, { url: 'http://localhost/list?page=2', cacheKey: 'list?page=2:0', loaderCache: cache })
|
|
273
|
+
// Leaving before the background load settles must not cache 'page-1' under ?page=2
|
|
274
|
+
state.dispose(cache)
|
|
275
|
+
|
|
276
|
+
const instruction = resolveCtx(state, { url: 'http://localhost/list?page=2', cacheKey: 'list?page=2:0', loaderCache: cache })
|
|
277
|
+
expect(instruction.action).toBe('suspend')
|
|
278
|
+
|
|
279
|
+
state.commitResult('page-2')
|
|
280
|
+
state.dispose(cache)
|
|
281
|
+
|
|
282
|
+
const restored = resolveCtx(state, { url: 'http://localhost/list', cacheKey: 'list:0', loaderCache: cache })
|
|
283
|
+
expect(restored).toEqual({ action: 'render', data: 'page-1', isLoading: true })
|
|
284
|
+
})
|
|
285
|
+
|
|
286
|
+
it('drops data when the path changes', () => {
|
|
287
|
+
const state = createState()
|
|
288
|
+
|
|
289
|
+
resolveCtx(state, { url: 'http://localhost/project/a', cacheKey: 'a:0' })
|
|
290
|
+
state.commitResult('project-a')
|
|
291
|
+
|
|
292
|
+
const instruction = resolveCtx(state, { url: 'http://localhost/project/b', cacheKey: 'b:0' })
|
|
293
|
+
|
|
294
|
+
expect(instruction.action).toBe('suspend')
|
|
295
|
+
})
|
|
296
|
+
|
|
236
297
|
it('returns suspend when no stale cache available on URL change', () => {
|
|
237
298
|
const cache = new LoaderCache(10)
|
|
238
299
|
const state = createState()
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import './setup-dom.js'
|
|
2
|
+
|
|
3
|
+
import { afterEach, describe, expect, it } from 'bun:test'
|
|
4
|
+
import { createBrowserNavigationAdapter } from '../engine/navigation-adapter.js'
|
|
5
|
+
|
|
6
|
+
/* The Navigation API is not implemented by happy-dom, and the parts of it this
|
|
7
|
+
adapter touches are small enough to stand in for directly. What matters here
|
|
8
|
+
is the shape of `currentEntry`, which is the whole subject of these tests. */
|
|
9
|
+
type EntryStub = { url: string | null } | null
|
|
10
|
+
|
|
11
|
+
function withNavigation(currentEntry: EntryStub) {
|
|
12
|
+
Object.defineProperty(window, 'navigation', {
|
|
13
|
+
value: {
|
|
14
|
+
currentEntry,
|
|
15
|
+
addEventListener() {},
|
|
16
|
+
removeEventListener() {},
|
|
17
|
+
navigate() {},
|
|
18
|
+
back() {},
|
|
19
|
+
forward() {},
|
|
20
|
+
},
|
|
21
|
+
writable: true,
|
|
22
|
+
configurable: true,
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
return createBrowserNavigationAdapter()
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
afterEach(() => {
|
|
29
|
+
Reflect.deleteProperty(window, 'navigation')
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
describe('createBrowserNavigationAdapter', () => {
|
|
33
|
+
it('reports the current entry URL', () => {
|
|
34
|
+
const adapter = withNavigation({ url: 'https://example.test/projects/7?tab=logs' })
|
|
35
|
+
|
|
36
|
+
expect(adapter.getCurrentURL().href).toBe('https://example.test/projects/7?tab=logs')
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
/* The case actually seen in the wild: the getter returns the empty string on a
|
|
40
|
+
document that is not fully active, which is what Safari handed us. `new
|
|
41
|
+
URL('')` throws just as `new URL(null)` does, and it throws out of the
|
|
42
|
+
`Router` constructor during render — a blank page, not a degraded route. An
|
|
43
|
+
empty string is falsy but not nullish, so this is the case `??` would miss. */
|
|
44
|
+
it('falls back to the document URL when the entry reports an empty URL', () => {
|
|
45
|
+
const adapter = withNavigation({ url: '' })
|
|
46
|
+
|
|
47
|
+
expect(adapter.getCurrentURL().href).toBe(window.location.href)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
/* `url` is also typed nullable: the getter returns null for entries whose
|
|
51
|
+
document is not the current one and was fetched under a `no-referrer` or
|
|
52
|
+
`origin` referrer policy. That branch needs `sameDocument` to be false, which
|
|
53
|
+
`currentEntry` never is, so it should not be reachable through this call —
|
|
54
|
+
but the type permits it and the fallback costs nothing. */
|
|
55
|
+
it('falls back to the document URL when the entry reports no URL', () => {
|
|
56
|
+
const adapter = withNavigation({ url: null })
|
|
57
|
+
|
|
58
|
+
expect(adapter.getCurrentURL().href).toBe(window.location.href)
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
/* `currentEntry` itself is null while the document is not fully active or is
|
|
62
|
+
still on the initial about:blank, which is what an iframe reports before its
|
|
63
|
+
first real navigation. */
|
|
64
|
+
it('falls back to the document URL when there is no current entry', () => {
|
|
65
|
+
const adapter = withNavigation(null)
|
|
66
|
+
|
|
67
|
+
expect(adapter.getCurrentURL().href).toBe(window.location.href)
|
|
68
|
+
})
|
|
69
|
+
})
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { describe, expect, it, mock } from 'bun:test'
|
|
1
|
+
import { 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'
|
|
5
5
|
import { Router } from '../engine/router.js'
|
|
6
|
-
import type { RouteConfig } from '../engine/types.js'
|
|
6
|
+
import type { BuzolaNavigateEvent, NavigationAdapter, RouteConfig } from '../engine/types.js'
|
|
7
7
|
|
|
8
8
|
function dummyComponent() {
|
|
9
9
|
return null
|
|
@@ -276,3 +276,107 @@ describe('Router.preload', () => {
|
|
|
276
276
|
router.preload('about')
|
|
277
277
|
})
|
|
278
278
|
})
|
|
279
|
+
|
|
280
|
+
describe('Router focus reset', () => {
|
|
281
|
+
function createCapturingRouter(initialURL: string) {
|
|
282
|
+
const routes = buildRouteTree([
|
|
283
|
+
{ path: '/list', component: dummyComponent },
|
|
284
|
+
{ path: '/about', component: dummyComponent },
|
|
285
|
+
])
|
|
286
|
+
const adapter = createMemoryNavigationAdapter({ initialURL })
|
|
287
|
+
const captured: ({ scroll?: string; focusReset?: string })[] = []
|
|
288
|
+
const listeners = new Set<(event: BuzolaNavigateEvent) => void>()
|
|
289
|
+
const capturingAdapter: NavigationAdapter = {
|
|
290
|
+
...adapter,
|
|
291
|
+
addEventListener(type, listener) {
|
|
292
|
+
listeners.add(listener)
|
|
293
|
+
},
|
|
294
|
+
removeEventListener(type, listener) {
|
|
295
|
+
listeners.delete(listener)
|
|
296
|
+
},
|
|
297
|
+
navigate(url) {
|
|
298
|
+
for (const listener of listeners) {
|
|
299
|
+
listener({
|
|
300
|
+
destination: { url: new URL(url, initialURL).href },
|
|
301
|
+
canIntercept: true,
|
|
302
|
+
navigationType: 'push',
|
|
303
|
+
userInitiated: false,
|
|
304
|
+
intercept(options) {
|
|
305
|
+
captured.push({ scroll: options.scroll, focusReset: options.focusReset })
|
|
306
|
+
void options.handler()
|
|
307
|
+
},
|
|
308
|
+
})
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
}
|
|
312
|
+
const router = new Router({ routes, adapter: capturingAdapter })
|
|
313
|
+
router.start()
|
|
314
|
+
return { router, captured }
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
it('keeps focus when only the query changes', () => {
|
|
318
|
+
const { router, captured } = createCapturingRouter('http://localhost/list')
|
|
319
|
+
|
|
320
|
+
router.navigate('/list?search=foo')
|
|
321
|
+
|
|
322
|
+
expect(captured.at(-1)?.focusReset).toBe('manual')
|
|
323
|
+
})
|
|
324
|
+
|
|
325
|
+
it('resets focus when the path changes', () => {
|
|
326
|
+
const { router, captured } = createCapturingRouter('http://localhost/list')
|
|
327
|
+
|
|
328
|
+
router.navigate('/about')
|
|
329
|
+
|
|
330
|
+
expect(captured.at(-1)?.focusReset).toBe('after-transition')
|
|
331
|
+
})
|
|
332
|
+
|
|
333
|
+
it('honours an explicit focusReset option', () => {
|
|
334
|
+
const { router, captured } = createCapturingRouter('http://localhost/list')
|
|
335
|
+
|
|
336
|
+
router.navigate('/about', { focusReset: 'manual' })
|
|
337
|
+
|
|
338
|
+
expect(captured.at(-1)?.focusReset).toBe('manual')
|
|
339
|
+
})
|
|
340
|
+
|
|
341
|
+
it('applies the explicit focusReset only to the navigation it was passed with', () => {
|
|
342
|
+
const { router, captured } = createCapturingRouter('http://localhost/list')
|
|
343
|
+
|
|
344
|
+
router.navigate('/about', { focusReset: 'manual' })
|
|
345
|
+
router.navigate('/list')
|
|
346
|
+
|
|
347
|
+
expect(captured.at(-1)?.focusReset).toBe('after-transition')
|
|
348
|
+
})
|
|
349
|
+
|
|
350
|
+
it('resets focus when the hash changes, so fragment links reach their target', () => {
|
|
351
|
+
const { router, captured } = createCapturingRouter('http://localhost/list')
|
|
352
|
+
|
|
353
|
+
router.navigate('/list#details')
|
|
354
|
+
|
|
355
|
+
expect(captured.at(-1)?.focusReset).toBe('after-transition')
|
|
356
|
+
})
|
|
357
|
+
|
|
358
|
+
it('keeps focus when the query changes but the hash stays put', () => {
|
|
359
|
+
const { router, captured } = createCapturingRouter('http://localhost/list#details')
|
|
360
|
+
|
|
361
|
+
router.navigate('/list?search=foo#details')
|
|
362
|
+
|
|
363
|
+
expect(captured.at(-1)?.focusReset).toBe('manual')
|
|
364
|
+
})
|
|
365
|
+
|
|
366
|
+
it('does not leak an explicit focusReset past a navigation that was never intercepted', () => {
|
|
367
|
+
const warn = spyOn(console, 'warn').mockImplementation(() => {})
|
|
368
|
+
try {
|
|
369
|
+
const { router, captured } = createCapturingRouter('http://localhost/list')
|
|
370
|
+
|
|
371
|
+
// No route matches — the router bails out before intercepting
|
|
372
|
+
router.navigate('/unmatched', { focusReset: 'manual' })
|
|
373
|
+
expect(captured).toHaveLength(0)
|
|
374
|
+
|
|
375
|
+
router.navigate('/about')
|
|
376
|
+
|
|
377
|
+
expect(captured.at(-1)?.focusReset).toBe('after-transition')
|
|
378
|
+
} finally {
|
|
379
|
+
warn.mockRestore()
|
|
380
|
+
}
|
|
381
|
+
})
|
|
382
|
+
})
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { LoaderCache } from './loader-cache.js'
|
|
2
|
+
import { isSamePath } from './utils.js'
|
|
2
3
|
|
|
3
4
|
// ─── Types ──────────────────────────────────────────────────────────────────
|
|
4
5
|
|
|
@@ -42,6 +43,8 @@ export class PageLoaderState {
|
|
|
42
43
|
private activeCacheKey: string | null = null
|
|
43
44
|
private activePromise: Promise<unknown> | null = null
|
|
44
45
|
private activeResolvedData: unknown
|
|
46
|
+
/** URL the currently held data was loaded for — data is cached under this href, not the active one. */
|
|
47
|
+
private resolvedUrlHref: string | null = null
|
|
45
48
|
private hasResolved = false
|
|
46
49
|
private pendingBackgroundKey: string | null = null
|
|
47
50
|
private readonly id: number
|
|
@@ -103,12 +106,14 @@ export class PageLoaderState {
|
|
|
103
106
|
/** Commit data after use() resolves (suspend case) */
|
|
104
107
|
commitResult(data: unknown): void {
|
|
105
108
|
this.activeResolvedData = data
|
|
109
|
+
this.resolvedUrlHref = this.activeUrlHref
|
|
106
110
|
this.hasResolved = true
|
|
107
111
|
}
|
|
108
112
|
|
|
109
113
|
/** Commit background SWR success — update data and clear pending flag */
|
|
110
114
|
commitBackgroundResult(data: unknown): void {
|
|
111
115
|
this.activeResolvedData = data
|
|
116
|
+
this.resolvedUrlHref = this.activeUrlHref
|
|
112
117
|
this.pendingBackgroundKey = null
|
|
113
118
|
}
|
|
114
119
|
|
|
@@ -120,13 +125,14 @@ export class PageLoaderState {
|
|
|
120
125
|
|
|
121
126
|
/** Save state to stale cache and reset (called on unmount) */
|
|
122
127
|
dispose(loaderCache: LoaderCache | undefined): void {
|
|
123
|
-
if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined && this.
|
|
124
|
-
this.saveToStaleCache(loaderCache, this.
|
|
128
|
+
if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined && this.resolvedUrlHref) {
|
|
129
|
+
this.saveToStaleCache(loaderCache, this.resolvedUrlHref, this.activeResolvedData)
|
|
125
130
|
}
|
|
126
131
|
this.activeUrlHref = null
|
|
127
132
|
this.activeCacheKey = null
|
|
128
133
|
this.activePromise = null
|
|
129
134
|
this.activeResolvedData = undefined
|
|
135
|
+
this.resolvedUrlHref = null
|
|
130
136
|
this.hasResolved = false
|
|
131
137
|
this.pendingBackgroundKey = null
|
|
132
138
|
}
|
|
@@ -135,25 +141,31 @@ export class PageLoaderState {
|
|
|
135
141
|
|
|
136
142
|
private handleUrlChange(currentUrlHref: string, loaderCache: LoaderCache | undefined): void {
|
|
137
143
|
if (this.activeUrlHref !== null && this.activeUrlHref !== currentUrlHref) {
|
|
138
|
-
// URL changed — save
|
|
139
|
-
if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined) {
|
|
140
|
-
this.saveToStaleCache(loaderCache, this.
|
|
144
|
+
// URL changed — save the held data to stale cache under the href it was loaded for
|
|
145
|
+
if (loaderCache && this.hasResolved && this.activeResolvedData !== undefined && this.resolvedUrlHref) {
|
|
146
|
+
this.saveToStaleCache(loaderCache, this.resolvedUrlHref, this.activeResolvedData)
|
|
141
147
|
}
|
|
142
148
|
// Try to restore from stale cache for new URL
|
|
143
149
|
const cached = loaderCache && this.restoreFromStaleCache(loaderCache, currentUrlHref)
|
|
144
150
|
if (cached?.hit) {
|
|
145
151
|
this.activeResolvedData = cached.value
|
|
152
|
+
this.resolvedUrlHref = currentUrlHref
|
|
146
153
|
this.hasResolved = true
|
|
147
|
-
} else {
|
|
154
|
+
} else if (!isSamePath(this.activeUrlHref, currentUrlHref)) {
|
|
155
|
+
// Different path — the held data describes another page, drop it and suspend
|
|
148
156
|
this.hasResolved = false
|
|
149
157
|
this.activeResolvedData = undefined
|
|
158
|
+
this.resolvedUrlHref = null
|
|
150
159
|
}
|
|
160
|
+
// Same path, only search/hash changed (filters, sorting, pagination, search):
|
|
161
|
+
// keep the data as stale so resolve() serves it while the new query loads.
|
|
151
162
|
this.pendingBackgroundKey = null
|
|
152
163
|
} else if (this.activeUrlHref === null && loaderCache) {
|
|
153
164
|
// Remount — try to restore from stale cache
|
|
154
165
|
const cached = this.restoreFromStaleCache(loaderCache, currentUrlHref)
|
|
155
166
|
if (cached.hit) {
|
|
156
167
|
this.activeResolvedData = cached.value
|
|
168
|
+
this.resolvedUrlHref = currentUrlHref
|
|
157
169
|
this.hasResolved = true
|
|
158
170
|
}
|
|
159
171
|
}
|
|
@@ -30,6 +30,7 @@ export function createBrowserNavigationAdapter(): NavigationAdapter {
|
|
|
30
30
|
event.intercept({
|
|
31
31
|
handler: options.handler,
|
|
32
32
|
scroll: options.scroll,
|
|
33
|
+
focusReset: options.focusReset,
|
|
33
34
|
})
|
|
34
35
|
},
|
|
35
36
|
}
|
|
@@ -41,7 +42,12 @@ export function createBrowserNavigationAdapter(): NavigationAdapter {
|
|
|
41
42
|
|
|
42
43
|
return {
|
|
43
44
|
getCurrentURL() {
|
|
44
|
-
|
|
45
|
+
// `currentEntry` is null on a document that is not fully active or still on
|
|
46
|
+
// the initial about:blank; Safari reports an empty `url` in that situation
|
|
47
|
+
// instead. `||` catches both, and `location.href` is the URL the entry would
|
|
48
|
+
// have reported. This runs in the Router constructor, so a throw is a blank
|
|
49
|
+
// page rather than a degraded route.
|
|
50
|
+
return new URL(nav.currentEntry?.url || window.location.href)
|
|
45
51
|
},
|
|
46
52
|
navigate(url, options) {
|
|
47
53
|
if (options?.viewTransition) {
|
package/src/engine/router.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { LoaderCache } from './loader-cache.js'
|
|
2
2
|
import { matchRoutes } from './matcher.js'
|
|
3
3
|
import type { BlockerFn, NavigateOptions, NavigationAdapter, RouterState, RouteTree } from './types.js'
|
|
4
|
-
import { extractParamNames, parseParamSegment } from './utils.js'
|
|
4
|
+
import { extractParamNames, isSamePath, parseParamSegment } from './utils.js'
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Thrown when a route guard prevents navigation.
|
|
@@ -65,6 +65,7 @@ export class Router {
|
|
|
65
65
|
private stopFn: (() => void) | undefined
|
|
66
66
|
private blockers = new Set<BlockerFn>()
|
|
67
67
|
private pendingScrollBehavior: 'after-transition' | 'manual' = 'after-transition'
|
|
68
|
+
private pendingFocusReset: 'after-transition' | 'manual' | undefined
|
|
68
69
|
private readonly _loaderCache: LoaderCache | undefined
|
|
69
70
|
|
|
70
71
|
constructor(options: RouterOptions) {
|
|
@@ -131,6 +132,13 @@ export class Router {
|
|
|
131
132
|
*/
|
|
132
133
|
start(): () => void {
|
|
133
134
|
const handler = (event: import('./types.js').BuzolaNavigateEvent) => {
|
|
135
|
+
// Consume the pending options before any early return — they belong to the
|
|
136
|
+
// navigation that armed them and must not leak into the next one.
|
|
137
|
+
const scrollBehavior = this.pendingScrollBehavior
|
|
138
|
+
const explicitFocusReset = this.pendingFocusReset
|
|
139
|
+
this.pendingScrollBehavior = 'after-transition'
|
|
140
|
+
this.pendingFocusReset = undefined
|
|
141
|
+
|
|
134
142
|
if (!event.canIntercept) return
|
|
135
143
|
|
|
136
144
|
const url = new URL(event.destination.url)
|
|
@@ -143,11 +151,15 @@ export class Router {
|
|
|
143
151
|
|
|
144
152
|
const currentNavId = ++this.navigationId
|
|
145
153
|
const useViewTransition = event.viewTransition || this.viewTransitions
|
|
146
|
-
|
|
147
|
-
|
|
154
|
+
// Query-only navigations stay on the same page — keep focus where the user left it
|
|
155
|
+
// (search boxes, filters, pagination). Path changes keep the browser's focus reset,
|
|
156
|
+
// and so do fragment changes, which must move focus to the targeted section.
|
|
157
|
+
const focusReset = explicitFocusReset
|
|
158
|
+
?? (isSamePath(this.state.location, url) && this.state.location.hash === url.hash ? 'manual' : 'after-transition')
|
|
148
159
|
|
|
149
160
|
event.intercept({
|
|
150
161
|
scroll: scrollBehavior,
|
|
162
|
+
focusReset,
|
|
151
163
|
handler: async () => {
|
|
152
164
|
// Check blockers before setting pending state
|
|
153
165
|
for (const blocker of this.blockers) {
|
|
@@ -206,6 +218,9 @@ export class Router {
|
|
|
206
218
|
if (options?.resetScroll === false) {
|
|
207
219
|
this.pendingScrollBehavior = 'manual'
|
|
208
220
|
}
|
|
221
|
+
if (options?.focusReset) {
|
|
222
|
+
this.pendingFocusReset = options.focusReset
|
|
223
|
+
}
|
|
209
224
|
this.adapter.navigate(this._basePath + to, options)
|
|
210
225
|
}
|
|
211
226
|
|
package/src/engine/types.ts
CHANGED
|
@@ -167,6 +167,13 @@ export interface NavigateOptions {
|
|
|
167
167
|
* Set to `false` to preserve current scroll position.
|
|
168
168
|
*/
|
|
169
169
|
resetScroll?: boolean
|
|
170
|
+
/**
|
|
171
|
+
* Whether the browser moves focus after navigation.
|
|
172
|
+
* Defaults to `manual` when only the search string changes — so search boxes, filters and
|
|
173
|
+
* pagination controls keep the caret — and to `after-transition` when the path or the hash
|
|
174
|
+
* changes, so fragment links move focus to the section they target.
|
|
175
|
+
*/
|
|
176
|
+
focusReset?: 'after-transition' | 'manual'
|
|
170
177
|
}
|
|
171
178
|
|
|
172
179
|
/**
|
|
@@ -189,7 +196,9 @@ export interface BuzolaNavigateEvent {
|
|
|
189
196
|
/** Whether this navigation should use View Transitions API. */
|
|
190
197
|
viewTransition?: boolean
|
|
191
198
|
/** Intercept the navigation and handle it client-side. */
|
|
192
|
-
intercept(
|
|
199
|
+
intercept(
|
|
200
|
+
options: { handler: () => Promise<void>; scroll?: 'after-transition' | 'manual'; focusReset?: 'after-transition' | 'manual' },
|
|
201
|
+
): void
|
|
193
202
|
}
|
|
194
203
|
|
|
195
204
|
/** Abstraction over the Navigation API for testability. */
|
package/src/engine/utils.ts
CHANGED
|
@@ -22,3 +22,17 @@ export function extractParamNames(pattern: string): string[] {
|
|
|
22
22
|
}
|
|
23
23
|
return names
|
|
24
24
|
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Whether two URLs address the same page — i.e. only search/hash differ.
|
|
28
|
+
* Same-path navigations (filters, sorting, pagination, search) keep the page
|
|
29
|
+
* on screen and keep its loader data as stale; path changes do not.
|
|
30
|
+
*
|
|
31
|
+
* Note this ignores the hash. Callers that care about fragment changes — focus
|
|
32
|
+
* handling, for one — have to compare `hash` themselves.
|
|
33
|
+
*/
|
|
34
|
+
export function isSamePath(a: string | URL, b: string | URL): boolean {
|
|
35
|
+
const urlA = typeof a === 'string' ? new URL(a) : a
|
|
36
|
+
const urlB = typeof b === 'string' ? new URL(b) : b
|
|
37
|
+
return urlA.origin === urlB.origin && urlA.pathname === urlB.pathname
|
|
38
|
+
}
|