@buzola/router 0.0.15 → 0.0.17
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/matcher.d.ts.map +1 -1
- package/dist/engine/matcher.js +15 -12
- package/dist/engine/matcher.js.map +1 -1
- package/dist/engine/navigation-adapter.d.ts +8 -1
- package/dist/engine/navigation-adapter.d.ts.map +1 -1
- package/dist/engine/navigation-adapter.js +33 -5
- package/dist/engine/navigation-adapter.js.map +1 -1
- package/dist/engine/route-tree.js +9 -9
- package/dist/engine/route-tree.js.map +1 -1
- package/dist/engine/router.d.ts +24 -0
- package/dist/engine/router.d.ts.map +1 -1
- package/dist/engine/router.js +61 -0
- package/dist/engine/router.js.map +1 -1
- package/dist/engine/types.d.ts +16 -10
- package/dist/engine/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/matcher.test.ts +33 -0
- package/src/__tests__/router.test.ts +98 -0
- package/src/engine/matcher.ts +16 -17
- package/src/engine/navigation-adapter.ts +42 -4
- package/src/engine/route-tree.ts +9 -9
- package/src/engine/router.ts +63 -2
- package/src/engine/types.ts +16 -4
- package/src/index.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../src/engine/matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../src/engine/matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAuB,MAAM,YAAY,CAAA;AAE5E;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,UAAU,EAAE,GAAG,IAAI,CAI1E"}
|
package/dist/engine/matcher.js
CHANGED
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
export function matchRoutes(tree, url) {
|
|
9
9
|
const pathname = url.pathname;
|
|
10
10
|
const segments = pathname.split('/').filter(Boolean);
|
|
11
|
-
return matchTrie(tree.root, segments, 0,
|
|
11
|
+
return matchTrie(tree.root, segments, 0, [], pathname);
|
|
12
12
|
}
|
|
13
|
-
function matchTrie(node, segments, index,
|
|
13
|
+
function matchTrie(node, segments, index, values, pathname) {
|
|
14
14
|
// All segments consumed — check if this trie node has a terminal route
|
|
15
15
|
if (index === segments.length) {
|
|
16
16
|
if (node.route) {
|
|
17
|
-
return buildMatchChain(node.route
|
|
17
|
+
return buildMatchChain(node.route, values, pathname);
|
|
18
18
|
}
|
|
19
19
|
return null;
|
|
20
20
|
}
|
|
@@ -22,30 +22,33 @@ function matchTrie(node, segments, index, params, pathname) {
|
|
|
22
22
|
// 1. Try static child first — O(1) Map lookup, always most specific
|
|
23
23
|
const staticChild = node.staticChildren.get(segment);
|
|
24
24
|
if (staticChild) {
|
|
25
|
-
const result = matchTrie(staticChild, segments, index + 1,
|
|
25
|
+
const result = matchTrie(staticChild, segments, index + 1, values, pathname);
|
|
26
26
|
if (result)
|
|
27
27
|
return result;
|
|
28
28
|
}
|
|
29
29
|
// 2. Try dynamic child — matches any single segment
|
|
30
30
|
if (node.dynamicChild) {
|
|
31
|
-
const
|
|
32
|
-
const result = matchTrie(node.dynamicChild.node, segments, index + 1, newParams, pathname);
|
|
31
|
+
const result = matchTrie(node.dynamicChild, segments, index + 1, [...values, decodeURIComponent(segment)], pathname);
|
|
33
32
|
if (result)
|
|
34
33
|
return result;
|
|
35
34
|
}
|
|
36
35
|
// 3. Try catch-all child — consumes all remaining segments
|
|
37
36
|
if (node.catchAllChild) {
|
|
38
37
|
const remaining = segments.slice(index).map(s => decodeURIComponent(s)).join('/');
|
|
39
|
-
|
|
40
|
-
return buildMatchChain(node.catchAllChild.chain, newParams, pathname);
|
|
38
|
+
return buildMatchChain(node.catchAllChild, [...values, remaining], pathname);
|
|
41
39
|
}
|
|
42
40
|
return null;
|
|
43
41
|
}
|
|
44
42
|
/**
|
|
45
|
-
* Build a RouteMatch[] array
|
|
46
|
-
*
|
|
43
|
+
* Build a RouteMatch[] array for a matched route. Values are collected by position and named here,
|
|
44
|
+
* by the matched route's own pattern, since routes sharing a trie position may name it differently.
|
|
45
|
+
* Each match in the chain gets all params (they're merged by the React layer anyway).
|
|
47
46
|
*/
|
|
48
|
-
function buildMatchChain(
|
|
49
|
-
|
|
47
|
+
function buildMatchChain(route, values, pathname) {
|
|
48
|
+
const params = {};
|
|
49
|
+
route.paramNames.forEach((name, i) => {
|
|
50
|
+
params[name] = values[i];
|
|
51
|
+
});
|
|
52
|
+
return route.chain.map(node => ({ node, params, pathname }));
|
|
50
53
|
}
|
|
51
54
|
//# sourceMappingURL=matcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/engine/matcher.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,IAAe,EAAE,GAAQ;IACpD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAA;IAC7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACpD,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;AACvD,CAAC;AAED,SAAS,SAAS,CACjB,IAAc,EACd,QAAkB,EAClB,KAAa,EACb,
|
|
1
|
+
{"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../src/engine/matcher.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,IAAe,EAAE,GAAQ;IACpD,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAA;IAC7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACpD,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAA;AACvD,CAAC;AAED,SAAS,SAAS,CACjB,IAAc,EACd,QAAkB,EAClB,KAAa,EACb,MAAgB,EAChB,QAAgB;IAEhB,uEAAuE;IACvE,IAAI,KAAK,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;QACrD,CAAC;QACD,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE/B,oEAAoE;IACpE,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACpD,IAAI,WAAW,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC5E,IAAI,MAAM;YAAE,OAAO,MAAM,CAAA;IAC1B,CAAC;IAED,oDAAoD;IACpD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;QACpH,IAAI,MAAM;YAAE,OAAO,MAAM,CAAA;IAC1B,CAAC;IAED,2DAA2D;IAC3D,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjF,OAAO,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,MAAM,EAAE,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAA;IAC7E,CAAC;IAED,OAAO,IAAI,CAAA;AACZ,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,KAAgB,EAAE,MAAgB,EAAE,QAAgB;IAC5E,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;IACF,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;AAC7D,CAAC"}
|
|
@@ -9,5 +9,12 @@ export interface MemoryNavigationAdapterOptions {
|
|
|
9
9
|
/**
|
|
10
10
|
* Create an in-memory NavigationAdapter for testing.
|
|
11
11
|
*/
|
|
12
|
-
|
|
12
|
+
/** The memory adapter plus the record a test needs to see what was handed to the browser. */
|
|
13
|
+
export interface MemoryNavigationAdapter extends NavigationAdapter {
|
|
14
|
+
/** URLs passed to `leaveApp`, in order. */
|
|
15
|
+
leftApp(): readonly string[];
|
|
16
|
+
/** How many reloads went through to the browser, i.e. were not intercepted. */
|
|
17
|
+
reloadCount(): number;
|
|
18
|
+
}
|
|
19
|
+
export declare function createMemoryNavigationAdapter(options?: MemoryNavigationAdapterOptions): MemoryNavigationAdapter;
|
|
13
20
|
//# 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,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,CAsFlE;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;CACrB;AAED,wBAAgB,6BAA6B,CAC5C,OAAO,GAAE,8BAAmC,GAC1C,uBAAuB,CAmHzB"}
|
|
@@ -48,6 +48,14 @@ export function createBrowserNavigationAdapter() {
|
|
|
48
48
|
state: options?.state,
|
|
49
49
|
});
|
|
50
50
|
},
|
|
51
|
+
leaveApp(url) {
|
|
52
|
+
// Deliberately NOT nav.navigate(): this is the one navigation the router hands to the
|
|
53
|
+
// browser, so it must go through the plain Location API and stay cross-document.
|
|
54
|
+
window.location.assign(url);
|
|
55
|
+
},
|
|
56
|
+
reload() {
|
|
57
|
+
window.location.reload();
|
|
58
|
+
},
|
|
51
59
|
back() {
|
|
52
60
|
nav.back();
|
|
53
61
|
},
|
|
@@ -74,14 +82,13 @@ export function createBrowserNavigationAdapter() {
|
|
|
74
82
|
},
|
|
75
83
|
};
|
|
76
84
|
}
|
|
77
|
-
/**
|
|
78
|
-
* Create an in-memory NavigationAdapter for testing.
|
|
79
|
-
*/
|
|
80
85
|
export function createMemoryNavigationAdapter(options = {}) {
|
|
81
86
|
const { initialURL = 'http://localhost/' } = options;
|
|
82
87
|
const entries = [{ url: initialURL }];
|
|
83
88
|
let currentIndex = 0;
|
|
84
89
|
const listeners = new Set();
|
|
90
|
+
const left = [];
|
|
91
|
+
let reloads = 0;
|
|
85
92
|
function emitNavigateEvent(url, navigationType, commitNavigation, viewTransition) {
|
|
86
93
|
let intercepted = false;
|
|
87
94
|
let interceptHandler;
|
|
@@ -102,7 +109,7 @@ export function createMemoryNavigationAdapter(options = {}) {
|
|
|
102
109
|
if (intercepted && interceptHandler) {
|
|
103
110
|
// Run the handler and only commit navigation state on success.
|
|
104
111
|
void interceptHandler().then(() => {
|
|
105
|
-
commitNavigation();
|
|
112
|
+
commitNavigation(true);
|
|
106
113
|
}, (error) => {
|
|
107
114
|
// Guard aborts are expected — rethrow unexpected errors
|
|
108
115
|
if (error instanceof Error && error.name === 'NavigationAbortedError')
|
|
@@ -112,13 +119,28 @@ export function createMemoryNavigationAdapter(options = {}) {
|
|
|
112
119
|
}
|
|
113
120
|
else {
|
|
114
121
|
// No interception — commit immediately
|
|
115
|
-
commitNavigation();
|
|
122
|
+
commitNavigation(false);
|
|
116
123
|
}
|
|
117
124
|
}
|
|
118
125
|
return {
|
|
119
126
|
getCurrentURL() {
|
|
120
127
|
return new URL(entries[currentIndex].url);
|
|
121
128
|
},
|
|
129
|
+
leaveApp(url) {
|
|
130
|
+
// A real browser would replace the document here. The memory adapter cannot, so it records
|
|
131
|
+
// the destination and still raises the event, which is what lets a test assert that the
|
|
132
|
+
// router declined to intercept it.
|
|
133
|
+
const resolved = new URL(url, entries[currentIndex].url).href;
|
|
134
|
+
left.push(resolved);
|
|
135
|
+
emitNavigateEvent(resolved, 'push', () => { });
|
|
136
|
+
},
|
|
137
|
+
reload() {
|
|
138
|
+
// An intercepted reload stays in the document; only one the router let through counts.
|
|
139
|
+
emitNavigateEvent(entries[currentIndex].url, 'reload', (intercepted) => {
|
|
140
|
+
if (!intercepted)
|
|
141
|
+
reloads++;
|
|
142
|
+
});
|
|
143
|
+
},
|
|
122
144
|
navigate(url, options) {
|
|
123
145
|
const resolved = new URL(url, entries[currentIndex].url).href;
|
|
124
146
|
const type = options?.replace ? 'replace' : 'push';
|
|
@@ -157,6 +179,12 @@ export function createMemoryNavigationAdapter(options = {}) {
|
|
|
157
179
|
getState() {
|
|
158
180
|
return entries[currentIndex].state;
|
|
159
181
|
},
|
|
182
|
+
leftApp() {
|
|
183
|
+
return left;
|
|
184
|
+
},
|
|
185
|
+
reloadCount() {
|
|
186
|
+
return reloads;
|
|
187
|
+
},
|
|
160
188
|
};
|
|
161
189
|
}
|
|
162
190
|
//# sourceMappingURL=navigation-adapter.js.map
|
|
@@ -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;oBACtB,UAAU,EAAE,OAAO,CAAC,UAAU;iBAC9B,CAAC,CAAA;YACH,CAAC;SACD,CAAA;QAED,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAClC,QAAQ,CAAC,WAAW,CAAC,CAAA;QACtB,CAAC;IACF,CAAC,CAAA;IAED,OAAO;QACN,aAAa;YACZ,4EAA4E;YAC5E,2EAA2E;YAC3E,6EAA6E;YAC7E,4EAA4E;YAC5E,qCAAqC;YACrC,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC9D,CAAC;QACD,QAAQ,CAAC,GAAG,EAAE,OAAO;YACpB,IAAI,OAAO,EAAE,cAAc,EAAE,CAAC;gBAC7B,qBAAqB,GAAG,IAAI,CAAA;YAC7B,CAAC;YACD,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;gBACjB,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;gBAC9C,KAAK,EAAE,OAAO,EAAE,KAAK;aACrB,CAAC,CAAA;QACH,CAAC;QACD,IAAI;YACH,GAAG,CAAC,IAAI,EAAE,CAAA;QACX,CAAC;QACD,OAAO;YACN,GAAG,CAAC,OAAO,EAAE,CAAA;QACd,CAAC;QACD,gBAAgB,CAAC,KAAK,EAAE,OAAO;YAC9B,sEAAsE;YACtE,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,KAAK,CAAC,CAAA;YACrC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACtB,IAAI,QAAQ,EAAE,CAAC;gBACd,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;YAChD,CAAC;QACF,CAAC;QACD,mBAAmB,CAAC,KAAK,EAAE,OAAO;YACjC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACzB,6DAA6D;YAC7D,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC1B,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;YACnD,CAAC;QACF,CAAC;QACD,QAAQ;YACP,OAAO,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,EAAE,CAAA;QACtC,CAAC;KACD,CAAA;AACF,CAAC;
|
|
1
|
+
{"version":3,"file":"navigation-adapter.js","sourceRoot":"","sources":["../../src/engine/navigation-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -79,22 +79,22 @@ function createTrieNode() {
|
|
|
79
79
|
}
|
|
80
80
|
function insertIntoTrie(root, pattern, chain) {
|
|
81
81
|
const segments = splitPathSegments(pattern);
|
|
82
|
+
const paramNames = [];
|
|
82
83
|
let node = root;
|
|
83
84
|
for (let i = 0; i < segments.length; i++) {
|
|
84
85
|
const segment = segments[i];
|
|
85
86
|
if (segment.startsWith(':') && (segment.endsWith('+') || segment.endsWith('*'))) {
|
|
86
87
|
// Catch-all segment — consumes all remaining segments
|
|
87
|
-
|
|
88
|
-
node.catchAllChild = {
|
|
88
|
+
paramNames.push(segment.slice(1, -1));
|
|
89
|
+
node.catchAllChild = { chain, paramNames };
|
|
89
90
|
return;
|
|
90
91
|
}
|
|
91
92
|
if (segment.startsWith(':')) {
|
|
92
|
-
// Dynamic segment
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
node = node.dynamicChild.node;
|
|
93
|
+
// Dynamic segment. The name stays with this route, not the shared trie node: another route
|
|
94
|
+
// through the same position may call it something else.
|
|
95
|
+
paramNames.push(segment.slice(1));
|
|
96
|
+
node.dynamicChild ??= createTrieNode();
|
|
97
|
+
node = node.dynamicChild;
|
|
98
98
|
}
|
|
99
99
|
else {
|
|
100
100
|
// Static segment
|
|
@@ -107,7 +107,7 @@ function insertIntoTrie(root, pattern, chain) {
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
// Terminal — route matches at this trie node
|
|
110
|
-
node.route = { chain };
|
|
110
|
+
node.route = { chain, paramNames };
|
|
111
111
|
}
|
|
112
112
|
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
113
113
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-tree.js","sourceRoot":"","sources":["../../src/engine/route-tree.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"route-tree.js","sourceRoot":"","sources":["../../src/engine/route-tree.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/router.d.ts
CHANGED
|
@@ -54,6 +54,8 @@ export declare class Router {
|
|
|
54
54
|
private state;
|
|
55
55
|
private navigationId;
|
|
56
56
|
private stopFn;
|
|
57
|
+
private releasedURL;
|
|
58
|
+
private reloadReleased;
|
|
57
59
|
private blockers;
|
|
58
60
|
private pendingScrollBehavior;
|
|
59
61
|
private pendingFocusReset;
|
|
@@ -81,6 +83,28 @@ export declare class Router {
|
|
|
81
83
|
* Call this once when the router is initialized.
|
|
82
84
|
*/
|
|
83
85
|
start(): () => void;
|
|
86
|
+
/**
|
|
87
|
+
* A reload asks for a fresh document (e.g. to recover from stale chunks after a deploy), so it goes to
|
|
88
|
+
* the browser. Re-rendering the current route from the JavaScript already loaded would defeat it.
|
|
89
|
+
*
|
|
90
|
+
* Blockers still get their say. They are async and a navigation can only be let through synchronously,
|
|
91
|
+
* so the reload is held while they run and, if they allow it, requested again and released.
|
|
92
|
+
*/
|
|
93
|
+
private handleReload;
|
|
94
|
+
/**
|
|
95
|
+
* Hand one navigation to the browser instead of intercepting it, for a URL the SERVER owns —
|
|
96
|
+
* an auth handoff, a file download, a server-rendered page that happens to share this origin.
|
|
97
|
+
*
|
|
98
|
+
* The Navigation API offers no way for a caller to mark a navigation un-interceptable:
|
|
99
|
+
* `location.assign`, `location.href`, a link click and a form submit all raise the same event
|
|
100
|
+
* with `canIntercept` true, so a router that matches the URL will swallow it. That is easy to hit
|
|
101
|
+
* by accident, because a catch-all 404 route matches every path on the origin.
|
|
102
|
+
*
|
|
103
|
+
* The release is recorded BEFORE the navigation is requested and is keyed to the resolved URL, so
|
|
104
|
+
* it cannot race the event or release some other navigation. Unlike `navigate`, the URL is passed
|
|
105
|
+
* to the browser as given — no base path is prepended, because the target is outside the app.
|
|
106
|
+
*/
|
|
107
|
+
leaveApp(url: string): void;
|
|
84
108
|
/**
|
|
85
109
|
* Navigate programmatically.
|
|
86
110
|
* The `to` path should not include the base path — it is prepended automatically.
|
|
@@ -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,
|
|
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
|
@@ -26,6 +26,8 @@ export class Router {
|
|
|
26
26
|
state;
|
|
27
27
|
navigationId = 0;
|
|
28
28
|
stopFn;
|
|
29
|
+
releasedURL;
|
|
30
|
+
reloadReleased = false;
|
|
29
31
|
blockers = new Set();
|
|
30
32
|
pendingScrollBehavior = 'after-transition';
|
|
31
33
|
pendingFocusReset;
|
|
@@ -92,8 +94,20 @@ export class Router {
|
|
|
92
94
|
const explicitFocusReset = this.pendingFocusReset;
|
|
93
95
|
this.pendingScrollBehavior = 'after-transition';
|
|
94
96
|
this.pendingFocusReset = undefined;
|
|
97
|
+
if (this.releasedURL !== undefined && event.destination.url === this.releasedURL) {
|
|
98
|
+
this.releasedURL = undefined;
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (event.navigationType === 'reload' && this.reloadReleased) {
|
|
102
|
+
this.reloadReleased = false;
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
95
105
|
if (!event.canIntercept)
|
|
96
106
|
return;
|
|
107
|
+
if (event.navigationType === 'reload') {
|
|
108
|
+
this.handleReload(event);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
97
111
|
const url = new URL(event.destination.url);
|
|
98
112
|
const matchUrl = this.createMatchUrl(url);
|
|
99
113
|
const matches = matchRoutes(this.routes, matchUrl);
|
|
@@ -164,6 +178,53 @@ export class Router {
|
|
|
164
178
|
this.stopFn = stop;
|
|
165
179
|
return stop;
|
|
166
180
|
}
|
|
181
|
+
/**
|
|
182
|
+
* A reload asks for a fresh document (e.g. to recover from stale chunks after a deploy), so it goes to
|
|
183
|
+
* the browser. Re-rendering the current route from the JavaScript already loaded would defeat it.
|
|
184
|
+
*
|
|
185
|
+
* Blockers still get their say. They are async and a navigation can only be let through synchronously,
|
|
186
|
+
* so the reload is held while they run and, if they allow it, requested again and released.
|
|
187
|
+
*/
|
|
188
|
+
handleReload(event) {
|
|
189
|
+
if (this.blockers.size === 0)
|
|
190
|
+
return;
|
|
191
|
+
const currentNavId = ++this.navigationId;
|
|
192
|
+
event.intercept({
|
|
193
|
+
scroll: 'manual',
|
|
194
|
+
focusReset: 'manual',
|
|
195
|
+
handler: async () => {
|
|
196
|
+
for (const blocker of this.blockers) {
|
|
197
|
+
if (this.navigationId !== currentNavId)
|
|
198
|
+
return;
|
|
199
|
+
const shouldProceed = await blocker();
|
|
200
|
+
if (!shouldProceed) {
|
|
201
|
+
throw new NavigationAbortedError();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
if (this.navigationId !== currentNavId)
|
|
205
|
+
return;
|
|
206
|
+
this.reloadReleased = true;
|
|
207
|
+
this.adapter.reload();
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Hand one navigation to the browser instead of intercepting it, for a URL the SERVER owns —
|
|
213
|
+
* an auth handoff, a file download, a server-rendered page that happens to share this origin.
|
|
214
|
+
*
|
|
215
|
+
* The Navigation API offers no way for a caller to mark a navigation un-interceptable:
|
|
216
|
+
* `location.assign`, `location.href`, a link click and a form submit all raise the same event
|
|
217
|
+
* with `canIntercept` true, so a router that matches the URL will swallow it. That is easy to hit
|
|
218
|
+
* by accident, because a catch-all 404 route matches every path on the origin.
|
|
219
|
+
*
|
|
220
|
+
* The release is recorded BEFORE the navigation is requested and is keyed to the resolved URL, so
|
|
221
|
+
* it cannot race the event or release some other navigation. Unlike `navigate`, the URL is passed
|
|
222
|
+
* to the browser as given — no base path is prepended, because the target is outside the app.
|
|
223
|
+
*/
|
|
224
|
+
leaveApp(url) {
|
|
225
|
+
this.releasedURL = new URL(url, this.adapter.getCurrentURL()).href;
|
|
226
|
+
this.adapter.leaveApp(url);
|
|
227
|
+
}
|
|
167
228
|
/**
|
|
168
229
|
* Navigate programmatically.
|
|
169
230
|
* The `to` path should not include the base path — it is prepended automatically.
|
|
@@ -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
|
@@ -98,16 +98,13 @@ export interface RouteNode {
|
|
|
98
98
|
export interface TrieNode {
|
|
99
99
|
/** Static children — exact segment match via Map lookup (O(1)). */
|
|
100
100
|
staticChildren: Map<string, TrieNode>;
|
|
101
|
-
/**
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
/** Catch-all child
|
|
107
|
-
catchAllChild?:
|
|
108
|
-
paramName: string;
|
|
109
|
-
chain: RouteNode[];
|
|
110
|
-
};
|
|
101
|
+
/**
|
|
102
|
+
* Dynamic child: matches any single segment. It carries no param name, because routes sharing this
|
|
103
|
+
* position may name it differently; each terminal names the values of its own route.
|
|
104
|
+
*/
|
|
105
|
+
dynamicChild?: TrieNode;
|
|
106
|
+
/** Catch-all child: matches all remaining segments. */
|
|
107
|
+
catchAllChild?: TrieRoute;
|
|
111
108
|
/** When defined, a route terminates at this trie node. */
|
|
112
109
|
route?: TrieRoute;
|
|
113
110
|
}
|
|
@@ -115,6 +112,8 @@ export interface TrieNode {
|
|
|
115
112
|
export interface TrieRoute {
|
|
116
113
|
/** Match chain: array of RouteNode from root layout to leaf page. */
|
|
117
114
|
chain: RouteNode[];
|
|
115
|
+
/** This route's param names, one per dynamic segment in path order (a catch-all name last). */
|
|
116
|
+
paramNames: string[];
|
|
118
117
|
}
|
|
119
118
|
/** Opaque route tree built from RouteConfig[]. Passed to matchRoutes() and Router. */
|
|
120
119
|
export interface RouteTree {
|
|
@@ -189,6 +188,13 @@ export interface NavigationAdapter {
|
|
|
189
188
|
getCurrentURL(): URL;
|
|
190
189
|
/** Navigate to a URL. */
|
|
191
190
|
navigate(url: string, options?: NavigateOptions): void;
|
|
191
|
+
/**
|
|
192
|
+
* Ask the browser for a real cross-document navigation, as-is.
|
|
193
|
+
* The router pairs this with a release so its own listener does not intercept the result.
|
|
194
|
+
*/
|
|
195
|
+
leaveApp(url: string): void;
|
|
196
|
+
/** Reload the current document, as `location.reload()` does. */
|
|
197
|
+
reload(): void;
|
|
192
198
|
/** Go back. */
|
|
193
199
|
back(): void;
|
|
194
200
|
/** Go forward. */
|
|
@@ -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/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export { buildRouteTree, createRouteNode } from './engine/route-tree.js';
|
|
|
5
5
|
export type { CreateRouteNodeOptions } from './engine/route-tree.js';
|
|
6
6
|
export { matchRoutes } from './engine/matcher.js';
|
|
7
7
|
export { createBrowserNavigationAdapter, createMemoryNavigationAdapter } from './engine/navigation-adapter.js';
|
|
8
|
-
export type { MemoryNavigationAdapterOptions } from './engine/navigation-adapter.js';
|
|
8
|
+
export type { MemoryNavigationAdapter, MemoryNavigationAdapterOptions } from './engine/navigation-adapter.js';
|
|
9
9
|
export type { BlockerFn, BuzolaNavigateEvent, BuzolaPageMap, BuzolaPersistentParams, EffectivePageParams, NavigateOptions, NavigationAdapter, PageParams, RegisteredPage, RouteComponent, RouteConfig, RouteMatch, RouteNode, RouterState, RouteTree, StandardSchema, } from './engine/types.js';
|
|
10
10
|
export { s } from './engine/schema.js';
|
|
11
11
|
export { BuzolaRedirect, createPage, redirect } from './define/create-page.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AACnE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAEzE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxE,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD,OAAO,EAAE,8BAA8B,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAA;AAC9G,YAAY,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAEtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AACnE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAEzE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxE,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD,OAAO,EAAE,8BAA8B,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAA;AAC9G,YAAY,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,MAAM,gCAAgC,CAAA;AAG7G,YAAY,EACX,SAAS,EACT,mBAAmB,EACnB,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,cAAc,EACd,WAAW,EACX,UAAU,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,cAAc,GACd,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAA;AAGtC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAC9E,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAGlG,OAAO,EACN,cAAc,EACd,aAAa,EACb,IAAI,EACJ,MAAM,EACN,YAAY,EACZ,aAAa,EACb,UAAU,EACV,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,SAAS,EACT,QAAQ,EACR,SAAS,EACT,cAAc,EACd,eAAe,GACf,MAAM,kBAAkB,CAAA;AACzB,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA"}
|
package/package.json
CHANGED
|
@@ -367,3 +367,36 @@ describe('matchRoutes', () => {
|
|
|
367
367
|
expect(matches).toBeNull()
|
|
368
368
|
})
|
|
369
369
|
})
|
|
370
|
+
|
|
371
|
+
describe('matchRoutes with differently named params at the same position', () => {
|
|
372
|
+
const tree = createTestTree([
|
|
373
|
+
{ path: '/app/programs/:programId/sessions/create', component: dummyComponent },
|
|
374
|
+
{ path: '/app/programs/:id/sessions', component: dummyComponent },
|
|
375
|
+
{ path: '/app/programs/:slug/files/:path+', component: dummyComponent },
|
|
376
|
+
])
|
|
377
|
+
|
|
378
|
+
it('names the value by the route that matched, not the one registered first', () => {
|
|
379
|
+
const matches = matchRoutes(tree, new URL('http://localhost/app/programs/42/sessions'))
|
|
380
|
+
expect(matches!.at(-1)!.node.fullPath).toBe('/app/programs/:id/sessions')
|
|
381
|
+
expect(matches!.at(-1)!.params).toEqual({ id: '42' })
|
|
382
|
+
})
|
|
383
|
+
|
|
384
|
+
it('still gives the first route its own name', () => {
|
|
385
|
+
const matches = matchRoutes(tree, new URL('http://localhost/app/programs/42/sessions/create'))
|
|
386
|
+
expect(matches!.at(-1)!.params).toEqual({ programId: '42' })
|
|
387
|
+
})
|
|
388
|
+
|
|
389
|
+
it('names values before a catch-all by the matched route too', () => {
|
|
390
|
+
const matches = matchRoutes(tree, new URL('http://localhost/app/programs/42/files/a/b'))
|
|
391
|
+
expect(matches!.at(-1)!.params).toEqual({ slug: '42', path: 'a/b' })
|
|
392
|
+
})
|
|
393
|
+
|
|
394
|
+
it('does not leak a value from a branch that failed to match', () => {
|
|
395
|
+
const tree = createTestTree([
|
|
396
|
+
{ path: '/a/:x/b', component: dummyComponent },
|
|
397
|
+
{ path: '/a/:y/:z/c', component: dummyComponent },
|
|
398
|
+
])
|
|
399
|
+
const matches = matchRoutes(tree, new URL('http://localhost/a/1/b/c'))
|
|
400
|
+
expect(matches!.at(-1)!.params).toEqual({ y: '1', z: 'b' })
|
|
401
|
+
})
|
|
402
|
+
})
|
|
@@ -420,3 +420,101 @@ describe('Router focus reset', () => {
|
|
|
420
420
|
}
|
|
421
421
|
})
|
|
422
422
|
})
|
|
423
|
+
|
|
424
|
+
describe('Router.leaveApp', () => {
|
|
425
|
+
// A catch-all 404 route matches every path on the origin, so without a release the router
|
|
426
|
+
// swallows the server's own URLs and renders "Not found" with no request ever sent.
|
|
427
|
+
// Shaped like a codegen'd tree: the catch-all is a child of the root layout, not its sibling.
|
|
428
|
+
const withCatchAll: RouteConfig[] = [
|
|
429
|
+
{
|
|
430
|
+
path: '/',
|
|
431
|
+
component: dummyComponent,
|
|
432
|
+
isLayout: true,
|
|
433
|
+
children: [
|
|
434
|
+
{ path: '/', component: dummyComponent, isIndex: true },
|
|
435
|
+
{ path: '/about', component: dummyComponent },
|
|
436
|
+
{ path: '/:__notFound+', component: dummyComponent },
|
|
437
|
+
],
|
|
438
|
+
},
|
|
439
|
+
]
|
|
440
|
+
|
|
441
|
+
it('hands the URL to the browser instead of intercepting it', () => {
|
|
442
|
+
const { router, adapter } = createRouter(withCatchAll)
|
|
443
|
+
|
|
444
|
+
router.leaveApp('/api/source/github/manifest/abc')
|
|
445
|
+
|
|
446
|
+
expect(adapter.leftApp()).toEqual(['http://localhost/api/source/github/manifest/abc'])
|
|
447
|
+
// The router did not take it: state still points at the page the user was on.
|
|
448
|
+
expect(router.getState().location.pathname).toBe('/')
|
|
449
|
+
})
|
|
450
|
+
|
|
451
|
+
it('would otherwise intercept that same URL', () => {
|
|
452
|
+
const { router } = createRouter(withCatchAll)
|
|
453
|
+
|
|
454
|
+
router.navigate('/api/source/github/manifest/abc')
|
|
455
|
+
|
|
456
|
+
expect(router.getState().location.pathname).toBe('/api/source/github/manifest/abc')
|
|
457
|
+
})
|
|
458
|
+
|
|
459
|
+
it('releases exactly one navigation, and only the one it named', () => {
|
|
460
|
+
const { router } = createRouter(withCatchAll)
|
|
461
|
+
|
|
462
|
+
router.leaveApp('/api/one')
|
|
463
|
+
router.navigate('/api/two')
|
|
464
|
+
|
|
465
|
+
expect(router.getState().location.pathname).toBe('/api/two')
|
|
466
|
+
})
|
|
467
|
+
|
|
468
|
+
it('releases a URL the router does have a route for', () => {
|
|
469
|
+
const { router, adapter } = createRouter(withCatchAll)
|
|
470
|
+
|
|
471
|
+
router.leaveApp('/about')
|
|
472
|
+
|
|
473
|
+
expect(adapter.leftApp()).toEqual(['http://localhost/about'])
|
|
474
|
+
expect(router.getState().location.pathname).toBe('/')
|
|
475
|
+
})
|
|
476
|
+
})
|
|
477
|
+
|
|
478
|
+
describe('Router reload', () => {
|
|
479
|
+
const flush = () => new Promise(resolve => setTimeout(resolve, 0))
|
|
480
|
+
|
|
481
|
+
it('lets a reload through to the browser so it loads a fresh document', () => {
|
|
482
|
+
const { adapter } = createRouter([{ path: '/list', component: dummyComponent }], 'http://localhost/list')
|
|
483
|
+
|
|
484
|
+
adapter.reload()
|
|
485
|
+
|
|
486
|
+
expect(adapter.reloadCount()).toBe(1)
|
|
487
|
+
})
|
|
488
|
+
|
|
489
|
+
it('asks the blockers first and reloads once they allow it', async () => {
|
|
490
|
+
const { router, adapter } = createRouter([{ path: '/list', component: dummyComponent }], 'http://localhost/list')
|
|
491
|
+
const blocker = mock(async () => true)
|
|
492
|
+
router.addBlocker(blocker)
|
|
493
|
+
|
|
494
|
+
adapter.reload()
|
|
495
|
+
await flush()
|
|
496
|
+
|
|
497
|
+
expect(blocker).toHaveBeenCalledTimes(1)
|
|
498
|
+
expect(adapter.reloadCount()).toBe(1)
|
|
499
|
+
})
|
|
500
|
+
|
|
501
|
+
it('does not reload when a blocker refuses', async () => {
|
|
502
|
+
const { router, adapter } = createRouter([{ path: '/list', component: dummyComponent }], 'http://localhost/list')
|
|
503
|
+
router.addBlocker(async () => false)
|
|
504
|
+
|
|
505
|
+
adapter.reload()
|
|
506
|
+
await flush()
|
|
507
|
+
|
|
508
|
+
expect(adapter.reloadCount()).toBe(0)
|
|
509
|
+
})
|
|
510
|
+
|
|
511
|
+
it('still intercepts a push to the current URL', () => {
|
|
512
|
+
const { router, adapter } = createRouter([{ path: '/list', component: dummyComponent }], 'http://localhost/list')
|
|
513
|
+
const before = router.getState().location
|
|
514
|
+
|
|
515
|
+
router.navigate('/list')
|
|
516
|
+
|
|
517
|
+
expect(adapter.reloadCount()).toBe(0)
|
|
518
|
+
expect(router.getState().location).not.toBe(before)
|
|
519
|
+
})
|
|
520
|
+
})
|
package/src/engine/matcher.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { RouteMatch, RouteTree, TrieNode } from './types.js'
|
|
1
|
+
import type { RouteMatch, RouteTree, TrieNode, TrieRoute } from './types.js'
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Match a URL against the route trie.
|
|
@@ -10,20 +10,20 @@ import type { RouteMatch, RouteTree, TrieNode } from './types.js'
|
|
|
10
10
|
export function matchRoutes(tree: RouteTree, url: URL): RouteMatch[] | null {
|
|
11
11
|
const pathname = url.pathname
|
|
12
12
|
const segments = pathname.split('/').filter(Boolean)
|
|
13
|
-
return matchTrie(tree.root, segments, 0,
|
|
13
|
+
return matchTrie(tree.root, segments, 0, [], pathname)
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
function matchTrie(
|
|
17
17
|
node: TrieNode,
|
|
18
18
|
segments: string[],
|
|
19
19
|
index: number,
|
|
20
|
-
|
|
20
|
+
values: string[],
|
|
21
21
|
pathname: string,
|
|
22
22
|
): RouteMatch[] | null {
|
|
23
23
|
// All segments consumed — check if this trie node has a terminal route
|
|
24
24
|
if (index === segments.length) {
|
|
25
25
|
if (node.route) {
|
|
26
|
-
return buildMatchChain(node.route
|
|
26
|
+
return buildMatchChain(node.route, values, pathname)
|
|
27
27
|
}
|
|
28
28
|
return null
|
|
29
29
|
}
|
|
@@ -33,35 +33,34 @@ function matchTrie(
|
|
|
33
33
|
// 1. Try static child first — O(1) Map lookup, always most specific
|
|
34
34
|
const staticChild = node.staticChildren.get(segment)
|
|
35
35
|
if (staticChild) {
|
|
36
|
-
const result = matchTrie(staticChild, segments, index + 1,
|
|
36
|
+
const result = matchTrie(staticChild, segments, index + 1, values, pathname)
|
|
37
37
|
if (result) return result
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
// 2. Try dynamic child — matches any single segment
|
|
41
41
|
if (node.dynamicChild) {
|
|
42
|
-
const
|
|
43
|
-
const result = matchTrie(node.dynamicChild.node, segments, index + 1, newParams, pathname)
|
|
42
|
+
const result = matchTrie(node.dynamicChild, segments, index + 1, [...values, decodeURIComponent(segment)], pathname)
|
|
44
43
|
if (result) return result
|
|
45
44
|
}
|
|
46
45
|
|
|
47
46
|
// 3. Try catch-all child — consumes all remaining segments
|
|
48
47
|
if (node.catchAllChild) {
|
|
49
48
|
const remaining = segments.slice(index).map(s => decodeURIComponent(s)).join('/')
|
|
50
|
-
|
|
51
|
-
return buildMatchChain(node.catchAllChild.chain, newParams, pathname)
|
|
49
|
+
return buildMatchChain(node.catchAllChild, [...values, remaining], pathname)
|
|
52
50
|
}
|
|
53
51
|
|
|
54
52
|
return null
|
|
55
53
|
}
|
|
56
54
|
|
|
57
55
|
/**
|
|
58
|
-
* Build a RouteMatch[] array
|
|
59
|
-
*
|
|
56
|
+
* Build a RouteMatch[] array for a matched route. Values are collected by position and named here,
|
|
57
|
+
* by the matched route's own pattern, since routes sharing a trie position may name it differently.
|
|
58
|
+
* Each match in the chain gets all params (they're merged by the React layer anyway).
|
|
60
59
|
*/
|
|
61
|
-
function buildMatchChain(
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
)
|
|
66
|
-
return chain.map(node => ({ node, params, pathname }))
|
|
60
|
+
function buildMatchChain(route: TrieRoute, values: string[], pathname: string): RouteMatch[] {
|
|
61
|
+
const params: Record<string, string> = {}
|
|
62
|
+
route.paramNames.forEach((name, i) => {
|
|
63
|
+
params[name] = values[i]
|
|
64
|
+
})
|
|
65
|
+
return route.chain.map(node => ({ node, params, pathname }))
|
|
67
66
|
}
|
|
@@ -58,6 +58,14 @@ export function createBrowserNavigationAdapter(): NavigationAdapter {
|
|
|
58
58
|
state: options?.state,
|
|
59
59
|
})
|
|
60
60
|
},
|
|
61
|
+
leaveApp(url) {
|
|
62
|
+
// Deliberately NOT nav.navigate(): this is the one navigation the router hands to the
|
|
63
|
+
// browser, so it must go through the plain Location API and stay cross-document.
|
|
64
|
+
window.location.assign(url)
|
|
65
|
+
},
|
|
66
|
+
reload() {
|
|
67
|
+
window.location.reload()
|
|
68
|
+
},
|
|
61
69
|
back() {
|
|
62
70
|
nav.back()
|
|
63
71
|
},
|
|
@@ -99,19 +107,29 @@ interface MemoryEntry {
|
|
|
99
107
|
/**
|
|
100
108
|
* Create an in-memory NavigationAdapter for testing.
|
|
101
109
|
*/
|
|
110
|
+
/** The memory adapter plus the record a test needs to see what was handed to the browser. */
|
|
111
|
+
export interface MemoryNavigationAdapter extends NavigationAdapter {
|
|
112
|
+
/** URLs passed to `leaveApp`, in order. */
|
|
113
|
+
leftApp(): readonly string[]
|
|
114
|
+
/** How many reloads went through to the browser, i.e. were not intercepted. */
|
|
115
|
+
reloadCount(): number
|
|
116
|
+
}
|
|
117
|
+
|
|
102
118
|
export function createMemoryNavigationAdapter(
|
|
103
119
|
options: MemoryNavigationAdapterOptions = {},
|
|
104
|
-
):
|
|
120
|
+
): MemoryNavigationAdapter {
|
|
105
121
|
const { initialURL = 'http://localhost/' } = options
|
|
106
122
|
|
|
107
123
|
const entries: MemoryEntry[] = [{ url: initialURL }]
|
|
108
124
|
let currentIndex = 0
|
|
109
125
|
const listeners = new Set<(event: BuzolaNavigateEvent) => void>()
|
|
126
|
+
const left: string[] = []
|
|
127
|
+
let reloads = 0
|
|
110
128
|
|
|
111
129
|
function emitNavigateEvent(
|
|
112
130
|
url: string,
|
|
113
131
|
navigationType: BuzolaNavigateEvent['navigationType'],
|
|
114
|
-
commitNavigation: () => void,
|
|
132
|
+
commitNavigation: (intercepted: boolean) => void,
|
|
115
133
|
viewTransition?: boolean,
|
|
116
134
|
): void {
|
|
117
135
|
let intercepted = false
|
|
@@ -137,7 +155,7 @@ export function createMemoryNavigationAdapter(
|
|
|
137
155
|
// Run the handler and only commit navigation state on success.
|
|
138
156
|
void interceptHandler().then(
|
|
139
157
|
() => {
|
|
140
|
-
commitNavigation()
|
|
158
|
+
commitNavigation(true)
|
|
141
159
|
},
|
|
142
160
|
(error) => {
|
|
143
161
|
// Guard aborts are expected — rethrow unexpected errors
|
|
@@ -147,7 +165,7 @@ export function createMemoryNavigationAdapter(
|
|
|
147
165
|
)
|
|
148
166
|
} else {
|
|
149
167
|
// No interception — commit immediately
|
|
150
|
-
commitNavigation()
|
|
168
|
+
commitNavigation(false)
|
|
151
169
|
}
|
|
152
170
|
}
|
|
153
171
|
|
|
@@ -155,6 +173,20 @@ export function createMemoryNavigationAdapter(
|
|
|
155
173
|
getCurrentURL() {
|
|
156
174
|
return new URL(entries[currentIndex].url)
|
|
157
175
|
},
|
|
176
|
+
leaveApp(url) {
|
|
177
|
+
// A real browser would replace the document here. The memory adapter cannot, so it records
|
|
178
|
+
// the destination and still raises the event, which is what lets a test assert that the
|
|
179
|
+
// router declined to intercept it.
|
|
180
|
+
const resolved = new URL(url, entries[currentIndex].url).href
|
|
181
|
+
left.push(resolved)
|
|
182
|
+
emitNavigateEvent(resolved, 'push', () => {})
|
|
183
|
+
},
|
|
184
|
+
reload() {
|
|
185
|
+
// An intercepted reload stays in the document; only one the router let through counts.
|
|
186
|
+
emitNavigateEvent(entries[currentIndex].url, 'reload', (intercepted) => {
|
|
187
|
+
if (!intercepted) reloads++
|
|
188
|
+
})
|
|
189
|
+
},
|
|
158
190
|
navigate(url, options) {
|
|
159
191
|
const resolved = new URL(url, entries[currentIndex].url).href
|
|
160
192
|
const type = options?.replace ? 'replace' : 'push'
|
|
@@ -193,5 +225,11 @@ export function createMemoryNavigationAdapter(
|
|
|
193
225
|
getState() {
|
|
194
226
|
return entries[currentIndex].state
|
|
195
227
|
},
|
|
228
|
+
leftApp() {
|
|
229
|
+
return left
|
|
230
|
+
},
|
|
231
|
+
reloadCount() {
|
|
232
|
+
return reloads
|
|
233
|
+
},
|
|
196
234
|
}
|
|
197
235
|
}
|
package/src/engine/route-tree.ts
CHANGED
|
@@ -120,6 +120,7 @@ function createTrieNode(): TrieNode {
|
|
|
120
120
|
|
|
121
121
|
function insertIntoTrie(root: TrieNode, pattern: string, chain: RouteNode[]): void {
|
|
122
122
|
const segments = splitPathSegments(pattern)
|
|
123
|
+
const paramNames: string[] = []
|
|
123
124
|
let node = root
|
|
124
125
|
|
|
125
126
|
for (let i = 0; i < segments.length; i++) {
|
|
@@ -127,18 +128,17 @@ function insertIntoTrie(root: TrieNode, pattern: string, chain: RouteNode[]): vo
|
|
|
127
128
|
|
|
128
129
|
if (segment.startsWith(':') && (segment.endsWith('+') || segment.endsWith('*'))) {
|
|
129
130
|
// Catch-all segment — consumes all remaining segments
|
|
130
|
-
|
|
131
|
-
node.catchAllChild = {
|
|
131
|
+
paramNames.push(segment.slice(1, -1))
|
|
132
|
+
node.catchAllChild = { chain, paramNames }
|
|
132
133
|
return
|
|
133
134
|
}
|
|
134
135
|
|
|
135
136
|
if (segment.startsWith(':')) {
|
|
136
|
-
// Dynamic segment
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
node = node.dynamicChild.node
|
|
137
|
+
// Dynamic segment. The name stays with this route, not the shared trie node: another route
|
|
138
|
+
// through the same position may call it something else.
|
|
139
|
+
paramNames.push(segment.slice(1))
|
|
140
|
+
node.dynamicChild ??= createTrieNode()
|
|
141
|
+
node = node.dynamicChild
|
|
142
142
|
} else {
|
|
143
143
|
// Static segment
|
|
144
144
|
let child = node.staticChildren.get(segment)
|
|
@@ -151,7 +151,7 @@ function insertIntoTrie(root: TrieNode, pattern: string, chain: RouteNode[]): vo
|
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
// Terminal — route matches at this trie node
|
|
154
|
-
node.route = { chain }
|
|
154
|
+
node.route = { chain, paramNames }
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
// ─── Helpers ────────────────────────────────────────────────────────────────
|
package/src/engine/router.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { LoaderCache } from './loader-cache.js'
|
|
2
2
|
import { matchRoutes } from './matcher.js'
|
|
3
|
-
import type { BlockerFn, NavigateOptions, NavigationAdapter, RouterState, RouteTree } from './types.js'
|
|
3
|
+
import type { BlockerFn, BuzolaNavigateEvent, NavigateOptions, NavigationAdapter, RouterState, RouteTree } from './types.js'
|
|
4
4
|
import { extractParamNames, isSamePath, parseParamSegment } from './utils.js'
|
|
5
5
|
|
|
6
6
|
/**
|
|
@@ -63,6 +63,8 @@ export class Router {
|
|
|
63
63
|
private state: RouterState
|
|
64
64
|
private navigationId = 0
|
|
65
65
|
private stopFn: (() => void) | undefined
|
|
66
|
+
private releasedURL: string | undefined
|
|
67
|
+
private reloadReleased = false
|
|
66
68
|
private blockers = new Set<BlockerFn>()
|
|
67
69
|
private pendingScrollBehavior: 'after-transition' | 'manual' = 'after-transition'
|
|
68
70
|
private pendingFocusReset: 'after-transition' | 'manual' | undefined
|
|
@@ -131,7 +133,7 @@ export class Router {
|
|
|
131
133
|
* Call this once when the router is initialized.
|
|
132
134
|
*/
|
|
133
135
|
start(): () => void {
|
|
134
|
-
const handler = (event:
|
|
136
|
+
const handler = (event: BuzolaNavigateEvent) => {
|
|
135
137
|
// Consume the pending options before any early return — they belong to the
|
|
136
138
|
// navigation that armed them and must not leak into the next one.
|
|
137
139
|
const scrollBehavior = this.pendingScrollBehavior
|
|
@@ -139,7 +141,19 @@ export class Router {
|
|
|
139
141
|
this.pendingScrollBehavior = 'after-transition'
|
|
140
142
|
this.pendingFocusReset = undefined
|
|
141
143
|
|
|
144
|
+
if (this.releasedURL !== undefined && event.destination.url === this.releasedURL) {
|
|
145
|
+
this.releasedURL = undefined
|
|
146
|
+
return
|
|
147
|
+
}
|
|
148
|
+
if (event.navigationType === 'reload' && this.reloadReleased) {
|
|
149
|
+
this.reloadReleased = false
|
|
150
|
+
return
|
|
151
|
+
}
|
|
142
152
|
if (!event.canIntercept) return
|
|
153
|
+
if (event.navigationType === 'reload') {
|
|
154
|
+
this.handleReload(event)
|
|
155
|
+
return
|
|
156
|
+
}
|
|
143
157
|
|
|
144
158
|
const url = new URL(event.destination.url)
|
|
145
159
|
const matchUrl = this.createMatchUrl(url)
|
|
@@ -217,6 +231,53 @@ export class Router {
|
|
|
217
231
|
return stop
|
|
218
232
|
}
|
|
219
233
|
|
|
234
|
+
/**
|
|
235
|
+
* A reload asks for a fresh document (e.g. to recover from stale chunks after a deploy), so it goes to
|
|
236
|
+
* the browser. Re-rendering the current route from the JavaScript already loaded would defeat it.
|
|
237
|
+
*
|
|
238
|
+
* Blockers still get their say. They are async and a navigation can only be let through synchronously,
|
|
239
|
+
* so the reload is held while they run and, if they allow it, requested again and released.
|
|
240
|
+
*/
|
|
241
|
+
private handleReload(event: BuzolaNavigateEvent): void {
|
|
242
|
+
if (this.blockers.size === 0) return
|
|
243
|
+
|
|
244
|
+
const currentNavId = ++this.navigationId
|
|
245
|
+
event.intercept({
|
|
246
|
+
scroll: 'manual',
|
|
247
|
+
focusReset: 'manual',
|
|
248
|
+
handler: async () => {
|
|
249
|
+
for (const blocker of this.blockers) {
|
|
250
|
+
if (this.navigationId !== currentNavId) return
|
|
251
|
+
const shouldProceed = await blocker()
|
|
252
|
+
if (!shouldProceed) {
|
|
253
|
+
throw new NavigationAbortedError()
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (this.navigationId !== currentNavId) return
|
|
257
|
+
this.reloadReleased = true
|
|
258
|
+
this.adapter.reload()
|
|
259
|
+
},
|
|
260
|
+
})
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Hand one navigation to the browser instead of intercepting it, for a URL the SERVER owns —
|
|
265
|
+
* an auth handoff, a file download, a server-rendered page that happens to share this origin.
|
|
266
|
+
*
|
|
267
|
+
* The Navigation API offers no way for a caller to mark a navigation un-interceptable:
|
|
268
|
+
* `location.assign`, `location.href`, a link click and a form submit all raise the same event
|
|
269
|
+
* with `canIntercept` true, so a router that matches the URL will swallow it. That is easy to hit
|
|
270
|
+
* by accident, because a catch-all 404 route matches every path on the origin.
|
|
271
|
+
*
|
|
272
|
+
* The release is recorded BEFORE the navigation is requested and is keyed to the resolved URL, so
|
|
273
|
+
* it cannot race the event or release some other navigation. Unlike `navigate`, the URL is passed
|
|
274
|
+
* to the browser as given — no base path is prepended, because the target is outside the app.
|
|
275
|
+
*/
|
|
276
|
+
leaveApp(url: string): void {
|
|
277
|
+
this.releasedURL = new URL(url, this.adapter.getCurrentURL()).href
|
|
278
|
+
this.adapter.leaveApp(url)
|
|
279
|
+
}
|
|
280
|
+
|
|
220
281
|
/**
|
|
221
282
|
* Navigate programmatically.
|
|
222
283
|
* The `to` path should not include the base path — it is prepended automatically.
|
package/src/engine/types.ts
CHANGED
|
@@ -115,10 +115,13 @@ export interface RouteNode {
|
|
|
115
115
|
export interface TrieNode {
|
|
116
116
|
/** Static children — exact segment match via Map lookup (O(1)). */
|
|
117
117
|
staticChildren: Map<string, TrieNode>
|
|
118
|
-
/**
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
118
|
+
/**
|
|
119
|
+
* Dynamic child: matches any single segment. It carries no param name, because routes sharing this
|
|
120
|
+
* position may name it differently; each terminal names the values of its own route.
|
|
121
|
+
*/
|
|
122
|
+
dynamicChild?: TrieNode
|
|
123
|
+
/** Catch-all child: matches all remaining segments. */
|
|
124
|
+
catchAllChild?: TrieRoute
|
|
122
125
|
/** When defined, a route terminates at this trie node. */
|
|
123
126
|
route?: TrieRoute
|
|
124
127
|
}
|
|
@@ -127,6 +130,8 @@ export interface TrieNode {
|
|
|
127
130
|
export interface TrieRoute {
|
|
128
131
|
/** Match chain: array of RouteNode from root layout to leaf page. */
|
|
129
132
|
chain: RouteNode[]
|
|
133
|
+
/** This route's param names, one per dynamic segment in path order (a catch-all name last). */
|
|
134
|
+
paramNames: string[]
|
|
130
135
|
}
|
|
131
136
|
|
|
132
137
|
/** Opaque route tree built from RouteConfig[]. Passed to matchRoutes() and Router. */
|
|
@@ -207,6 +212,13 @@ export interface NavigationAdapter {
|
|
|
207
212
|
getCurrentURL(): URL
|
|
208
213
|
/** Navigate to a URL. */
|
|
209
214
|
navigate(url: string, options?: NavigateOptions): void
|
|
215
|
+
/**
|
|
216
|
+
* Ask the browser for a real cross-document navigation, as-is.
|
|
217
|
+
* The router pairs this with a release so its own listener does not intercept the result.
|
|
218
|
+
*/
|
|
219
|
+
leaveApp(url: string): void
|
|
220
|
+
/** Reload the current document, as `location.reload()` does. */
|
|
221
|
+
reload(): void
|
|
210
222
|
/** Go back. */
|
|
211
223
|
back(): void
|
|
212
224
|
/** Go forward. */
|
package/src/index.ts
CHANGED
|
@@ -10,7 +10,7 @@ export type { CreateRouteNodeOptions } from './engine/route-tree.js'
|
|
|
10
10
|
export { matchRoutes } from './engine/matcher.js'
|
|
11
11
|
|
|
12
12
|
export { createBrowserNavigationAdapter, createMemoryNavigationAdapter } from './engine/navigation-adapter.js'
|
|
13
|
-
export type { MemoryNavigationAdapterOptions } from './engine/navigation-adapter.js'
|
|
13
|
+
export type { MemoryNavigationAdapter, MemoryNavigationAdapterOptions } from './engine/navigation-adapter.js'
|
|
14
14
|
|
|
15
15
|
// ─── Types ──────────────────────────────────────────────────────────────────
|
|
16
16
|
export type {
|