@xmachines/play-router 1.0.0-beta.20 → 1.0.0-beta.22
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/README.md +17 -0
- package/dist/base-route-map.d.ts +0 -2
- package/dist/base-route-map.d.ts.map +1 -1
- package/dist/base-route-map.js +7 -48
- package/dist/base-route-map.js.map +1 -1
- package/dist/create-browser-history.d.ts +5 -0
- package/dist/create-browser-history.d.ts.map +1 -1
- package/dist/create-browser-history.js +9 -4
- package/dist/create-browser-history.js.map +1 -1
- package/dist/create-route-map.d.ts.map +1 -1
- package/dist/create-route-map.js +1 -42
- package/dist/create-route-map.js.map +1 -1
- package/dist/find-route.d.ts.map +1 -1
- package/dist/find-route.js +20 -48
- package/dist/find-route.js.map +1 -1
- package/dist/router-bridge-base.d.ts +12 -0
- package/dist/router-bridge-base.d.ts.map +1 -1
- package/dist/router-bridge-base.js +16 -3
- package/dist/router-bridge-base.js.map +1 -1
- package/dist/url-pattern-utils.d.ts +60 -0
- package/dist/url-pattern-utils.d.ts.map +1 -0
- package/dist/url-pattern-utils.js +77 -0
- package/dist/url-pattern-utils.js.map +1 -0
- package/package.json +9 -7
package/README.md
CHANGED
|
@@ -181,6 +181,23 @@ Bridge teardown must be explicit and deterministic:
|
|
|
181
181
|
- Do not rely on GC-only cleanup guidance.
|
|
182
182
|
- Infrastructure remains passive: bridges observe and forward intents, actors decide validity.
|
|
183
183
|
- `createBrowserHistory().destroy()` is idempotent and restores shared `window.history` patches only after the last wrapper for that window is removed.
|
|
184
|
+
- **Note**: `createBrowserHistory()` mutates global `window.history` methods (`pushState` and `replaceState`) and coordinates wrappers with shared ref-count state. To reduce leakage, create one history wrapper per browser window at the application boundary and always pair it with `destroy()` during teardown.
|
|
185
|
+
|
|
186
|
+
## Bridge Sync Ordering
|
|
187
|
+
|
|
188
|
+
`RouterBridgeBase.connect()` has an intentional ordering contract used by all framework adapters:
|
|
189
|
+
|
|
190
|
+
- seed `lastSyncedPath` from `actor.currentRoute` in the constructor
|
|
191
|
+
- install the actor route watcher
|
|
192
|
+
- install adapter router subscriptions
|
|
193
|
+
- resolve initial sync using `getInitialRouterPath()` and `actor.initialRoute`
|
|
194
|
+
|
|
195
|
+
That final step distinguishes:
|
|
196
|
+
|
|
197
|
+
- **deep-link:** browser URL differs from the machine's initial route, so router wins and the actor receives `play.route`
|
|
198
|
+
- **restore:** browser URL is still at the machine's initial route while the actor was restored elsewhere, so actor wins and the bridge pushes the actor route back into the router
|
|
199
|
+
|
|
200
|
+
Actor-originated router sync also keeps `isProcessingNavigation` set until the next microtask. That short window intentionally suppresses synchronous router callbacks that echo the same navigation back into the actor.
|
|
184
201
|
|
|
185
202
|
## Diagnostics
|
|
186
203
|
|
package/dist/base-route-map.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-route-map.d.ts","sourceRoot":"","sources":["../src/base-route-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"base-route-map.d.ts","sourceRoot":"","sources":["../src/base-route-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgCH;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,YAAY;IAC5B,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,oFAAoF;IACpF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBAAa,YAAY;IACxB,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,cAAc,CAGpB;IACF,OAAO,CAAC,cAAc,CAAkC;IAExD;;;;;;;;;OASG;gBACS,QAAQ,EAAE,YAAY,EAAE;IAiCpC;;;;;;;;;;;;;;;OAeG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAuB7C;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAGhD"}
|
package/dist/base-route-map.js
CHANGED
|
@@ -9,9 +9,8 @@
|
|
|
9
9
|
* Uses URLPattern for parameterized route matching (same engine as createRouteMap).
|
|
10
10
|
*/
|
|
11
11
|
import QuickLRU from "quick-lru";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
12
|
+
import { getURLPatternCtor, getIndexKey, getCandidates, } from "./url-pattern-utils.js";
|
|
13
|
+
import { URLPatternUnavailableError, InvalidRoutePatternError } from "./errors.js";
|
|
15
14
|
/**
|
|
16
15
|
* Normalize a route path so its parameter names are valid URLPattern identifiers.
|
|
17
16
|
*
|
|
@@ -90,10 +89,9 @@ export class BaseRouteMap {
|
|
|
90
89
|
if (path.includes(":")) {
|
|
91
90
|
const URLPatternCtorFn = getURLPatternCtor();
|
|
92
91
|
if (!URLPatternCtorFn) {
|
|
93
|
-
|
|
94
|
-
continue;
|
|
92
|
+
throw new URLPatternUnavailableError();
|
|
95
93
|
}
|
|
96
|
-
const bucketKey =
|
|
94
|
+
const bucketKey = getIndexKey(path);
|
|
97
95
|
const bucket = this.patternBuckets.get(bucketKey) ?? [];
|
|
98
96
|
try {
|
|
99
97
|
bucket.push({
|
|
@@ -102,8 +100,8 @@ export class BaseRouteMap {
|
|
|
102
100
|
order: patternOrder++,
|
|
103
101
|
});
|
|
104
102
|
}
|
|
105
|
-
catch {
|
|
106
|
-
|
|
103
|
+
catch (err) {
|
|
104
|
+
throw new InvalidRoutePatternError(path, { cause: err });
|
|
107
105
|
}
|
|
108
106
|
this.patternBuckets.set(bucketKey, bucket);
|
|
109
107
|
}
|
|
@@ -137,7 +135,7 @@ export class BaseRouteMap {
|
|
|
137
135
|
const cachedMatch = this.pathMatchCache.get(cleanPath);
|
|
138
136
|
if (cachedMatch !== undefined)
|
|
139
137
|
return cachedMatch;
|
|
140
|
-
const candidates =
|
|
138
|
+
const candidates = getCandidates(this.patternBuckets, getIndexKey(cleanPath));
|
|
141
139
|
for (const { pattern, stateId } of candidates) {
|
|
142
140
|
const match = pattern.exec({ pathname: cleanPath });
|
|
143
141
|
if (match) {
|
|
@@ -163,44 +161,5 @@ export class BaseRouteMap {
|
|
|
163
161
|
getPathByStateId(stateId) {
|
|
164
162
|
return this.stateIdToPath.get(stateId) ?? null;
|
|
165
163
|
}
|
|
166
|
-
getIndexKey(path) {
|
|
167
|
-
const trimmed = path.startsWith("/") ? path.slice(1) : path;
|
|
168
|
-
if (trimmed.length === 0)
|
|
169
|
-
return "/";
|
|
170
|
-
const segment = trimmed.split("/")[0];
|
|
171
|
-
if (segment === undefined || segment.startsWith(":"))
|
|
172
|
-
return "*";
|
|
173
|
-
return segment;
|
|
174
|
-
}
|
|
175
|
-
getCandidates(indexKey) {
|
|
176
|
-
const bucket = this.patternBuckets.get(indexKey) ?? [];
|
|
177
|
-
const wildcardBucket = this.patternBuckets.get("*") ?? [];
|
|
178
|
-
if (bucket.length === 0)
|
|
179
|
-
return wildcardBucket;
|
|
180
|
-
if (wildcardBucket.length === 0)
|
|
181
|
-
return bucket;
|
|
182
|
-
const merged = [];
|
|
183
|
-
let b = 0;
|
|
184
|
-
let w = 0;
|
|
185
|
-
while (b < bucket.length && w < wildcardBucket.length) {
|
|
186
|
-
if (bucket[b].order < wildcardBucket[w].order) {
|
|
187
|
-
merged.push(bucket[b]);
|
|
188
|
-
b += 1;
|
|
189
|
-
}
|
|
190
|
-
else {
|
|
191
|
-
merged.push(wildcardBucket[w]);
|
|
192
|
-
w += 1;
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
while (b < bucket.length) {
|
|
196
|
-
merged.push(bucket[b]);
|
|
197
|
-
b += 1;
|
|
198
|
-
}
|
|
199
|
-
while (w < wildcardBucket.length) {
|
|
200
|
-
merged.push(wildcardBucket[w]);
|
|
201
|
-
w += 1;
|
|
202
|
-
}
|
|
203
|
-
return merged;
|
|
204
|
-
}
|
|
205
164
|
}
|
|
206
165
|
//# sourceMappingURL=base-route-map.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-route-map.js","sourceRoot":"","sources":["../src/base-route-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,QAAQ,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"base-route-map.js","sourceRoot":"","sources":["../src/base-route-map.ts"],"names":[],"mappings":"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"}
|
|
@@ -94,6 +94,11 @@ export interface BrowserWindow {
|
|
|
94
94
|
*
|
|
95
95
|
* `destroy()` is idempotent and cooperates with other wrappers created for the
|
|
96
96
|
* same `window` instance.
|
|
97
|
+
*
|
|
98
|
+
* **Warning**: `createBrowserHistory()` mutates global `window.history` methods
|
|
99
|
+
* (`pushState` and `replaceState`) and coordinates wrappers with shared ref-count state.
|
|
100
|
+
* To mitigate leakage, create one history wrapper per browser window at the application
|
|
101
|
+
* boundary and always pair it with `destroy()` during teardown.
|
|
97
102
|
*/
|
|
98
103
|
export declare function createBrowserHistory(options: {
|
|
99
104
|
window: BrowserWindow;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-browser-history.d.ts","sourceRoot":"","sources":["../src/create-browser-history.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC9B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,OAAO,CAAC;KACf,CAAC;IAEF;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAE1C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAE7C;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,IAAI,IAAI,CAAC;IAEhB;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAEhF;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAEjC;;;;;;OAMG;IACH,OAAO,IAAI,IAAI,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE;QACR,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QACxB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;QACpE,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;QACvE,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,IAAI,IAAI,IAAI,CAAC;QACb,OAAO,IAAI,IAAI,CAAC;KAChB,CAAC;IACF,QAAQ,EAAE;QACT,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC/D,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CAClE;AAWD
|
|
1
|
+
{"version":3,"file":"create-browser-history.d.ts","sourceRoot":"","sources":["../src/create-browser-history.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC9B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,OAAO,CAAC;KACf,CAAC;IAEF;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAE1C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAE7C;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,IAAI,IAAI,CAAC;IAEhB;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,UAAU,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAEhF;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAEjC;;;;;;OAMG;IACH,OAAO,IAAI,IAAI,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE;QACR,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QACxB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;QACpE,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;QACvE,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,IAAI,IAAI,IAAI,CAAC;QACb,OAAO,IAAI,IAAI,CAAC;KAChB,CAAC;IACF,QAAQ,EAAE;QACT,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC/D,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CAClE;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG,cAAc,CA8EvF"}
|
|
@@ -27,6 +27,11 @@ const historyPatchStates = new WeakMap();
|
|
|
27
27
|
*
|
|
28
28
|
* `destroy()` is idempotent and cooperates with other wrappers created for the
|
|
29
29
|
* same `window` instance.
|
|
30
|
+
*
|
|
31
|
+
* **Warning**: `createBrowserHistory()` mutates global `window.history` methods
|
|
32
|
+
* (`pushState` and `replaceState`) and coordinates wrappers with shared ref-count state.
|
|
33
|
+
* To mitigate leakage, create one history wrapper per browser window at the application
|
|
34
|
+
* boundary and always pair it with `destroy()` during teardown.
|
|
30
35
|
*/
|
|
31
36
|
export function createBrowserHistory(options) {
|
|
32
37
|
const win = options.window;
|
|
@@ -98,8 +103,8 @@ function getOrCreatePatchState(win) {
|
|
|
98
103
|
existing.refCount += 1;
|
|
99
104
|
return existing;
|
|
100
105
|
}
|
|
101
|
-
const originalPushState = win.history.pushState
|
|
102
|
-
const originalReplaceState = win.history.replaceState
|
|
106
|
+
const originalPushState = win.history.pushState;
|
|
107
|
+
const originalReplaceState = win.history.replaceState;
|
|
103
108
|
const patchState = {
|
|
104
109
|
originalPushState,
|
|
105
110
|
originalReplaceState,
|
|
@@ -107,11 +112,11 @@ function getOrCreatePatchState(win) {
|
|
|
107
112
|
refCount: 1,
|
|
108
113
|
};
|
|
109
114
|
win.history.pushState = function (state, title, url) {
|
|
110
|
-
patchState.originalPushState(state, title, url);
|
|
115
|
+
patchState.originalPushState.call(win.history, state, title, url);
|
|
111
116
|
patchState.wrappers.forEach((notify) => notify());
|
|
112
117
|
};
|
|
113
118
|
win.history.replaceState = function (state, title, url) {
|
|
114
|
-
patchState.originalReplaceState(state, title, url);
|
|
119
|
+
patchState.originalReplaceState.call(win.history, state, title, url);
|
|
115
120
|
patchState.wrappers.forEach((notify) => notify());
|
|
116
121
|
};
|
|
117
122
|
historyPatchStates.set(win.history, patchState);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-browser-history.js","sourceRoot":"","sources":["../src/create-browser-history.ts"],"names":[],"mappings":"AAmFA,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAA+C,CAAC;AAEtF
|
|
1
|
+
{"version":3,"file":"create-browser-history.js","sourceRoot":"","sources":["../src/create-browser-history.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-route-map.d.ts","sourceRoot":"","sources":["../src/create-route-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"create-route-map.d.ts","sourceRoot":"","sources":["../src/create-route-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,YAAY,CAAC;AASvD;;;;;;;;;GASG;AACH,MAAM,WAAW,QAAQ;IACxB;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG;QACtB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,QAAQ,CAuD7D"}
|
package/dist/create-route-map.js
CHANGED
|
@@ -1,46 +1,5 @@
|
|
|
1
1
|
import { URLPatternUnavailableError, InvalidRoutePatternError } from "./errors.js";
|
|
2
|
-
|
|
3
|
-
return globalThis["URLPattern"];
|
|
4
|
-
}
|
|
5
|
-
function getIndexKey(path) {
|
|
6
|
-
const trimmed = path.startsWith("/") ? path.slice(1) : path;
|
|
7
|
-
if (trimmed.length === 0)
|
|
8
|
-
return "/";
|
|
9
|
-
const segment = trimmed.split("/")[0];
|
|
10
|
-
if (segment === undefined || segment.startsWith(":"))
|
|
11
|
-
return "*";
|
|
12
|
-
return segment;
|
|
13
|
-
}
|
|
14
|
-
function getCandidates(patternBuckets, indexKey) {
|
|
15
|
-
const bucket = patternBuckets.get(indexKey) ?? [];
|
|
16
|
-
const wildcardBucket = patternBuckets.get("*") ?? [];
|
|
17
|
-
if (bucket.length === 0)
|
|
18
|
-
return wildcardBucket;
|
|
19
|
-
if (wildcardBucket.length === 0)
|
|
20
|
-
return bucket;
|
|
21
|
-
const merged = [];
|
|
22
|
-
let b = 0;
|
|
23
|
-
let w = 0;
|
|
24
|
-
while (b < bucket.length && w < wildcardBucket.length) {
|
|
25
|
-
if (bucket[b].order < wildcardBucket[w].order) {
|
|
26
|
-
merged.push(bucket[b]);
|
|
27
|
-
b += 1;
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
merged.push(wildcardBucket[w]);
|
|
31
|
-
w += 1;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
while (b < bucket.length) {
|
|
35
|
-
merged.push(bucket[b]);
|
|
36
|
-
b += 1;
|
|
37
|
-
}
|
|
38
|
-
while (w < wildcardBucket.length) {
|
|
39
|
-
merged.push(wildcardBucket[w]);
|
|
40
|
-
w += 1;
|
|
41
|
-
}
|
|
42
|
-
return merged;
|
|
43
|
-
}
|
|
2
|
+
import { getURLPatternCtor, getIndexKey, getCandidates, } from "./url-pattern-utils.js";
|
|
44
3
|
/**
|
|
45
4
|
* Create a RouteMap from a RouteTree for efficient path lookups.
|
|
46
5
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-route-map.js","sourceRoot":"","sources":["../src/create-route-map.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"create-route-map.js","sourceRoot":"","sources":["../src/create-route-map.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAEN,iBAAiB,EACjB,WAAW,EACX,aAAa,GACb,MAAM,wBAAwB,CAAC;AAmChC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,cAAc,CAAC,SAAoB;IAClD,yEAAyE;IACzE,MAAM,cAAc,GAAG,IAAI,GAAG,EAG3B,CAAC;IACJ,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAE3C,SAAS,eAAe,CAAC,IAAe;QACvC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACrB,MAAM,IAAI,0BAA0B,EAAE,CAAC;YACxC,CAAC;YACD,IAAI,CAAC;gBACJ,MAAM,UAAU,GAAG,IAAI,cAAc,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBAClE,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBACnD,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;gBAClE,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,MAAM,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAClE,CAAC;QACF,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,eAAe,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACF,CAAC;IAED,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAEhC,OAAO;QACN,OAAO,CAAC,IAAY;YACnB,wDAAwD;YACxD,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,UAAU,EAAE,QAAQ,EAAE,CAAC;gBAC1B,OAAO,EAAE,EAAE,EAAE,IAAI,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;YAChD,CAAC;YAED,mFAAmF;YACnF,MAAM,UAAU,GAAG,aAAa,CAAC,cAAc,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YACpE,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,CAAC;gBAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/C,IAAI,KAAK,EAAE,CAAC;oBACX,MAAM,MAAM,GAA2B,EAAE,CAAC;oBAC1C,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;wBAC3B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAC9C,CAAC;oBACD,OAAO,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;gBACtC,CAAC;YACF,CAAC;YAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACjC,CAAC;KACD,CAAC;AACH,CAAC"}
|
package/dist/find-route.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-route.d.ts","sourceRoot":"","sources":["../src/find-route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"find-route.d.ts","sourceRoot":"","sources":["../src/find-route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAgCvD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,SAAS,EAAE,IAAI,MAAM,KAAG,SAAS,GAAG,SAEvE,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,GAAI,MAAM,SAAS,EAAE,MAAM,MAAM,KAAG,SAAS,GAAG,SAyB3E,CAAC"}
|
package/dist/find-route.js
CHANGED
|
@@ -1,63 +1,35 @@
|
|
|
1
|
+
import { getURLPatternCtor } from "./url-pattern-utils.js";
|
|
2
|
+
import { URLPatternUnavailableError, InvalidRoutePatternError } from "./errors.js";
|
|
1
3
|
/**
|
|
2
|
-
* Check if a URL path matches a route pattern
|
|
4
|
+
* Check if a URL path matches a route pattern using URLPattern.
|
|
3
5
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
+
* For static patterns (no `:param`) falls back to a direct equality check so
|
|
7
|
+
* URLPattern is never required for polyfill-free environments that only use
|
|
8
|
+
* static routes.
|
|
9
|
+
*
|
|
10
|
+
* Throws `URLPatternUnavailableError` when a parameterised pattern is tested
|
|
11
|
+
* and URLPattern is not available on `globalThis`.
|
|
12
|
+
* Throws `InvalidRoutePatternError` when URLPattern cannot compile the pattern.
|
|
6
13
|
*
|
|
7
14
|
* Private — not exported from the package public API.
|
|
8
15
|
*
|
|
9
16
|
* @param path - URL path (e.g., '/settings', '/settings/billing')
|
|
10
17
|
* @param pattern - Route pattern (e.g., '/settings/:section?')
|
|
11
18
|
* @returns True if path matches pattern
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```typescript
|
|
15
|
-
* matchesPattern('/settings', '/settings/:section?') // true
|
|
16
|
-
* matchesPattern('/settings/billing', '/settings/:section?') // true
|
|
17
|
-
* matchesPattern('/profile/123', '/profile/:userId') // true
|
|
18
|
-
* matchesPattern('/profile', '/profile/:userId') // false (required param missing)
|
|
19
|
-
* ```
|
|
20
19
|
*/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if (!pattern.includes(":")) {
|
|
20
|
+
function matchesPattern(path, pattern) {
|
|
21
|
+
if (!pattern.includes(":"))
|
|
24
22
|
return path === pattern;
|
|
23
|
+
const Ctor = getURLPatternCtor();
|
|
24
|
+
if (!Ctor)
|
|
25
|
+
throw new URLPatternUnavailableError();
|
|
26
|
+
try {
|
|
27
|
+
return new Ctor({ pathname: pattern }).test({ pathname: path });
|
|
25
28
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
// Check each segment
|
|
29
|
-
for (let i = 0; i < patternSegments.length; i++) {
|
|
30
|
-
const patternSegment = patternSegments[i];
|
|
31
|
-
const pathSegment = pathSegments[i];
|
|
32
|
-
// Static segment - must match exactly
|
|
33
|
-
if (!patternSegment.startsWith(":")) {
|
|
34
|
-
if (patternSegment !== pathSegment) {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
// Parameter segment
|
|
40
|
-
const isOptional = patternSegment.endsWith("?");
|
|
41
|
-
// Optional parameter - can be missing
|
|
42
|
-
if (isOptional && pathSegment === undefined) {
|
|
43
|
-
// Check if there are more path segments after this - if so, no match
|
|
44
|
-
if (i < pathSegments.length) {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
continue;
|
|
48
|
-
}
|
|
49
|
-
// Required parameter - must exist
|
|
50
|
-
if (!isOptional && pathSegment === undefined) {
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
throw new InvalidRoutePatternError(pattern, { cause: err });
|
|
53
31
|
}
|
|
54
|
-
|
|
55
|
-
// (unless all remaining pattern segments are optional - but we don't support that)
|
|
56
|
-
if (pathSegments.length > patternSegments.length) {
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
return true;
|
|
60
|
-
};
|
|
32
|
+
}
|
|
61
33
|
/**
|
|
62
34
|
* Find route node by state ID
|
|
63
35
|
*
|
package/dist/find-route.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-route.js","sourceRoot":"","sources":["../src/find-route.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"find-route.js","sourceRoot":"","sources":["../src/find-route.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEnF;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,cAAc,CAAC,IAAY,EAAE,OAAe;IACpD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,KAAK,OAAO,CAAC;IACpD,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,0BAA0B,EAAE,CAAC;IAClD,IAAI,CAAC;QACJ,OAAO,IAAI,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,wBAAwB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC;AACF,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAe,EAAE,EAAU,EAAyB,EAAE;IACnF,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAe,EAAE,IAAY,EAAyB,EAAE;IACvF,yDAAyD;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEnC,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACb,CAAC;IAED,oEAAoE;IACpE,gBAAgB;IAChB,yDAAyD;IACzD,wDAAwD;IACxD,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;QACjD,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACzB,SAAS,CAAC,0BAA0B;QACrC,CAAC;QAED,4CAA4C;QAC5C,IAAI,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,OAAO,SAAS,CAAC;QAClB,CAAC;IACF,CAAC;IAED,+DAA+D;IAC/D,OAAO,IAAI,CAAC;AACb,CAAC,CAAC"}
|
|
@@ -95,6 +95,14 @@ export declare abstract class RouterBridgeBase implements RouterBridge {
|
|
|
95
95
|
*
|
|
96
96
|
* Sets up the TC39 Signal watcher for actor → router direction and
|
|
97
97
|
* starts watching router changes (framework-specific).
|
|
98
|
+
*
|
|
99
|
+
* Ordering here is part of the bridge contract:
|
|
100
|
+
* - `lastSyncedPath` is seeded in the constructor from `actor.currentRoute`
|
|
101
|
+
* - the actor watcher is installed before adapter router subscriptions
|
|
102
|
+
* - initial sync then resolves deep-link vs restore using `actor.initialRoute`
|
|
103
|
+
*
|
|
104
|
+
* Adapters that need custom initial-sync behavior should override
|
|
105
|
+
* `getInitialRouterPath()` rather than reordering `connect()` steps.
|
|
98
106
|
*/
|
|
99
107
|
connect(): void;
|
|
100
108
|
/**
|
|
@@ -108,6 +116,10 @@ export declare abstract class RouterBridgeBase implements RouterBridge {
|
|
|
108
116
|
*
|
|
109
117
|
* Calls navigateRouter() for framework-specific navigation.
|
|
110
118
|
* Prevents circular updates via isProcessingNavigation flag.
|
|
119
|
+
*
|
|
120
|
+
* `lastSyncedPath` is updated before `navigateRouter()` and the processing flag is
|
|
121
|
+
* released in a microtask so synchronous router callbacks triggered by navigation are
|
|
122
|
+
* suppressed as circular echoes.
|
|
111
123
|
*/
|
|
112
124
|
protected syncRouterFromActor(route: string | null | unknown): void;
|
|
113
125
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-bridge-base.d.ts","sourceRoot":"","sources":["../src/router-bridge-base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,EAAE,MAAM,EAAe,MAAM,yBAAyB,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"router-bridge-base.d.ts","sourceRoot":"","sources":["../src/router-bridge-base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,EAAE,MAAM,EAAe,MAAM,yBAAyB,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAY5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAkB;IAClC,mDAAmD;IACnD,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAC3C,8CAA8C;IAC9C,OAAO,IAAI,IAAI,CAAC;CAChB;AAED;;;;;;GAMG;AACH,8BAAsB,gBAAiB,YAAW,YAAY;IAe5D,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,QAAQ;IACjE,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE;QAC5B,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;QAC1D,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;KACxD;IAjBF,SAAS,CAAC,WAAW,EAAE,OAAO,CAAS;IACvC,SAAS,CAAC,gBAAgB,EAAE,OAAO,CAAS;IAC5C,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/C,SAAS,CAAC,sBAAsB,EAAE,OAAO,CAAS;IAClD,SAAS,CAAC,YAAY,EAAE,kBAAkB,GAAG,IAAI,CAAQ;IAEzD;;;;;OAKG;gBAEiB,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,GAAG,QAAQ,EAC9C,QAAQ,EAAE;QAC5B,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;QAC1D,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;KACxD;IASF;;;;;;;;;;;;;OAaG;IACH,OAAO,IAAI,IAAI;IA+Df;;;;OAIG;IACH,UAAU,IAAI,IAAI;IAqBlB;;;;;;;;;OASG;IACH,SAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI;IAcnE;;;;;OAKG;IACH,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAwCtE;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAelF;;;;;OAKG;IACH,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAM9D;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAErD;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,CAAC,kBAAkB,IAAI,IAAI;IAE7C;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,oBAAoB,IAAI,IAAI;IAE/C;;;;;;;;;;;;;;;;;OAiBG;IACH,SAAS,CAAC,oBAAoB,IAAI,MAAM,GAAG,IAAI,GAAG,SAAS;CAG3D"}
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
*/
|
|
43
43
|
import { Signal, watchSignal } from "@xmachines/play-signals";
|
|
44
44
|
import { RouterSyncError } from "./errors.js";
|
|
45
|
+
import { getURLPatternCtor, } from "./url-pattern-utils.js";
|
|
45
46
|
import { buildPlayRouteEvent, extractQuery, resolveRouteMapMatch, sanitizePathname, } from "./router-sync.js";
|
|
46
47
|
/**
|
|
47
48
|
* Abstract base class for all `@xmachines` router adapter bridges.
|
|
@@ -78,6 +79,14 @@ export class RouterBridgeBase {
|
|
|
78
79
|
*
|
|
79
80
|
* Sets up the TC39 Signal watcher for actor → router direction and
|
|
80
81
|
* starts watching router changes (framework-specific).
|
|
82
|
+
*
|
|
83
|
+
* Ordering here is part of the bridge contract:
|
|
84
|
+
* - `lastSyncedPath` is seeded in the constructor from `actor.currentRoute`
|
|
85
|
+
* - the actor watcher is installed before adapter router subscriptions
|
|
86
|
+
* - initial sync then resolves deep-link vs restore using `actor.initialRoute`
|
|
87
|
+
*
|
|
88
|
+
* Adapters that need custom initial-sync behavior should override
|
|
89
|
+
* `getInitialRouterPath()` rather than reordering `connect()` steps.
|
|
81
90
|
*/
|
|
82
91
|
connect() {
|
|
83
92
|
if (this.isConnected) {
|
|
@@ -166,6 +175,10 @@ export class RouterBridgeBase {
|
|
|
166
175
|
*
|
|
167
176
|
* Calls navigateRouter() for framework-specific navigation.
|
|
168
177
|
* Prevents circular updates via isProcessingNavigation flag.
|
|
178
|
+
*
|
|
179
|
+
* `lastSyncedPath` is updated before `navigateRouter()` and the processing flag is
|
|
180
|
+
* released in a microtask so synchronous router callbacks triggered by navigation are
|
|
181
|
+
* suppressed as circular echoes.
|
|
169
182
|
*/
|
|
170
183
|
syncRouterFromActor(route) {
|
|
171
184
|
if (this.hasConnectedOnce && !this.isConnected)
|
|
@@ -242,10 +255,10 @@ export class RouterBridgeBase {
|
|
|
242
255
|
if (!pattern || !pattern.includes(":"))
|
|
243
256
|
return {};
|
|
244
257
|
try {
|
|
245
|
-
const
|
|
246
|
-
if (!
|
|
258
|
+
const Ctor = getURLPatternCtor();
|
|
259
|
+
if (!Ctor)
|
|
247
260
|
return {};
|
|
248
|
-
const urlPattern = new
|
|
261
|
+
const urlPattern = new Ctor({ pathname: pattern });
|
|
249
262
|
const result = urlPattern.exec({ pathname });
|
|
250
263
|
if (!result)
|
|
251
264
|
return {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-bridge-base.js","sourceRoot":"","sources":["../src/router-bridge-base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EACN,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,GAChB,MAAM,kBAAkB,CAAC;AAsB1B;;;;;;GAMG;AACH,MAAM,OAAgB,gBAAgB;IAejB;IACA;IAfpB,+DAA+D;IACrD,WAAW,GAAY,KAAK,CAAC;IAC7B,gBAAgB,GAAY,KAAK,CAAC;IAClC,cAAc,GAAkB,IAAI,CAAC;IACrC,sBAAsB,GAAY,KAAK,CAAC;IACxC,YAAY,GAA8B,IAAI,CAAC;IAEzD;;;;;OAKG;IACH,YACoB,KAA8C,EAC9C,QAGlB;QAJkB,UAAK,GAAL,KAAK,CAAyC;QAC9C,aAAQ,GAAR,QAAQ,CAG1B;QAED,mFAAmF;QACnF,wEAAwE;QACxE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;IAC7D,CAAC;IAED,qEAAqE;IAErE
|
|
1
|
+
{"version":3,"file":"router-bridge-base.js","sourceRoot":"","sources":["../src/router-bridge-base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared URLPattern utilities — internal module, NOT exported from index.ts
|
|
3
|
+
*
|
|
4
|
+
* Provides the common URLPattern plumbing shared by:
|
|
5
|
+
* - `create-route-map.ts`
|
|
6
|
+
* - `base-route-map.ts`
|
|
7
|
+
* - `find-route.ts`
|
|
8
|
+
* - `router-bridge-base.ts`
|
|
9
|
+
*
|
|
10
|
+
* URLPattern is accessed via globalThis — consumers must load a polyfill on
|
|
11
|
+
* environments without native support (Node < 24, older browsers).
|
|
12
|
+
*
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Minimal structural type for the subset of URLPattern we use.
|
|
17
|
+
* Avoids a hard dependency on the full URLPattern type declaration.
|
|
18
|
+
*/
|
|
19
|
+
export type URLPatternLike = {
|
|
20
|
+
exec(input: {
|
|
21
|
+
pathname: string;
|
|
22
|
+
}): {
|
|
23
|
+
pathname: {
|
|
24
|
+
groups: Record<string, string | undefined>;
|
|
25
|
+
};
|
|
26
|
+
} | null;
|
|
27
|
+
test(input: {
|
|
28
|
+
pathname: string;
|
|
29
|
+
}): boolean;
|
|
30
|
+
};
|
|
31
|
+
/** Constructor type for URLPatternLike instances. */
|
|
32
|
+
export type URLPatternCtor = new (init: {
|
|
33
|
+
pathname: string;
|
|
34
|
+
}) => URLPatternLike;
|
|
35
|
+
/**
|
|
36
|
+
* Retrieve the URLPattern constructor from `globalThis`, or `undefined` if
|
|
37
|
+
* it is not available (Node < 24, older browsers without a polyfill).
|
|
38
|
+
*/
|
|
39
|
+
export declare function getURLPatternCtor(): URLPatternCtor | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Compute the bucket index key for a given path or pattern.
|
|
42
|
+
*
|
|
43
|
+
* The key is the first path segment (e.g. `"settings"` for `"/settings/:id"`).
|
|
44
|
+
* Parameterised first segments (`:lang`) fall into the `"*"` wildcard bucket.
|
|
45
|
+
* The root path `"/"` maps to the key `"/"`.
|
|
46
|
+
*
|
|
47
|
+
* @param path - URL path or route pattern string
|
|
48
|
+
*/
|
|
49
|
+
export declare function getIndexKey(path: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* Merge the named-segment bucket and the wildcard bucket for a given index key,
|
|
52
|
+
* preserving insertion order (by `order` field).
|
|
53
|
+
*
|
|
54
|
+
* @param patternBuckets - Map of bucket key → ordered pattern entries
|
|
55
|
+
* @param indexKey - First-segment key computed by `getIndexKey`
|
|
56
|
+
*/
|
|
57
|
+
export declare function getCandidates<T extends {
|
|
58
|
+
order: number;
|
|
59
|
+
}>(patternBuckets: Map<string, T[]>, indexKey: string): T[];
|
|
60
|
+
//# sourceMappingURL=url-pattern-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-pattern-utils.d.ts","sourceRoot":"","sources":["../src/url-pattern-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,IAAI,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG;QAClC,QAAQ,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;SAAE,CAAC;KACzD,GAAG,IAAI,CAAC;IACT,IAAI,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;CAC3C,CAAC;AAEF,qDAAqD;AACrD,MAAM,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,KAAK,cAAc,CAAC;AAEhF;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,SAAS,CAE9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EACxD,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAChC,QAAQ,EAAE,MAAM,GACd,CAAC,EAAE,CA2BL"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared URLPattern utilities — internal module, NOT exported from index.ts
|
|
3
|
+
*
|
|
4
|
+
* Provides the common URLPattern plumbing shared by:
|
|
5
|
+
* - `create-route-map.ts`
|
|
6
|
+
* - `base-route-map.ts`
|
|
7
|
+
* - `find-route.ts`
|
|
8
|
+
* - `router-bridge-base.ts`
|
|
9
|
+
*
|
|
10
|
+
* URLPattern is accessed via globalThis — consumers must load a polyfill on
|
|
11
|
+
* environments without native support (Node < 24, older browsers).
|
|
12
|
+
*
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Retrieve the URLPattern constructor from `globalThis`, or `undefined` if
|
|
17
|
+
* it is not available (Node < 24, older browsers without a polyfill).
|
|
18
|
+
*/
|
|
19
|
+
export function getURLPatternCtor() {
|
|
20
|
+
return globalThis["URLPattern"];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Compute the bucket index key for a given path or pattern.
|
|
24
|
+
*
|
|
25
|
+
* The key is the first path segment (e.g. `"settings"` for `"/settings/:id"`).
|
|
26
|
+
* Parameterised first segments (`:lang`) fall into the `"*"` wildcard bucket.
|
|
27
|
+
* The root path `"/"` maps to the key `"/"`.
|
|
28
|
+
*
|
|
29
|
+
* @param path - URL path or route pattern string
|
|
30
|
+
*/
|
|
31
|
+
export function getIndexKey(path) {
|
|
32
|
+
const trimmed = path.startsWith("/") ? path.slice(1) : path;
|
|
33
|
+
if (trimmed.length === 0)
|
|
34
|
+
return "/";
|
|
35
|
+
const segment = trimmed.split("/")[0];
|
|
36
|
+
if (segment === undefined || segment.startsWith(":"))
|
|
37
|
+
return "*";
|
|
38
|
+
return segment;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Merge the named-segment bucket and the wildcard bucket for a given index key,
|
|
42
|
+
* preserving insertion order (by `order` field).
|
|
43
|
+
*
|
|
44
|
+
* @param patternBuckets - Map of bucket key → ordered pattern entries
|
|
45
|
+
* @param indexKey - First-segment key computed by `getIndexKey`
|
|
46
|
+
*/
|
|
47
|
+
export function getCandidates(patternBuckets, indexKey) {
|
|
48
|
+
const bucket = patternBuckets.get(indexKey) ?? [];
|
|
49
|
+
const wildcardBucket = patternBuckets.get("*") ?? [];
|
|
50
|
+
if (bucket.length === 0)
|
|
51
|
+
return wildcardBucket;
|
|
52
|
+
if (wildcardBucket.length === 0)
|
|
53
|
+
return bucket;
|
|
54
|
+
const merged = [];
|
|
55
|
+
let b = 0;
|
|
56
|
+
let w = 0;
|
|
57
|
+
while (b < bucket.length && w < wildcardBucket.length) {
|
|
58
|
+
if (bucket[b].order < wildcardBucket[w].order) {
|
|
59
|
+
merged.push(bucket[b]);
|
|
60
|
+
b += 1;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
merged.push(wildcardBucket[w]);
|
|
64
|
+
w += 1;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
while (b < bucket.length) {
|
|
68
|
+
merged.push(bucket[b]);
|
|
69
|
+
b += 1;
|
|
70
|
+
}
|
|
71
|
+
while (w < wildcardBucket.length) {
|
|
72
|
+
merged.push(wildcardBucket[w]);
|
|
73
|
+
w += 1;
|
|
74
|
+
}
|
|
75
|
+
return merged;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=url-pattern-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url-pattern-utils.js","sourceRoot":"","sources":["../src/url-pattern-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAgBH;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAChC,OAAQ,UAAsC,CAAC,YAAY,CAA+B,CAAC;AAC5F,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACjE,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC5B,cAAgC,EAChC,QAAgB;IAEhB,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IAC/C,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAE/C,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC;QACvD,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC,IAAI,CAAC,CAAC;QACR,CAAC;aAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC,IAAI,CAAC,CAAC;QACR,CAAC;IACF,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC,IAAI,CAAC,CAAC;IACR,CAAC;IACD,OAAO,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC,IAAI,CAAC,CAAC;IACR,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xmachines/play-router",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.22",
|
|
4
4
|
"description": "Route tree extraction from XState v5 state machines. Part of @xmachines/play Universal Player Architecture.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"routing",
|
|
@@ -34,21 +34,23 @@
|
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
36
36
|
"build": "tsc --build",
|
|
37
|
-
"clean": "rm -rf dist *.tsbuildinfo coverage .vitest-attachments test/browser/__screenshots__",
|
|
37
|
+
"clean": "rm -rf dist *.tsbuildinfo coverage .vitest-attachments test/browser/__screenshots__ node_modules/.vite-temp",
|
|
38
|
+
"lint": "oxlint .",
|
|
39
|
+
"format": "oxfmt .",
|
|
38
40
|
"test": "vitest",
|
|
39
41
|
"prepublishOnly": "npm run build"
|
|
40
42
|
},
|
|
41
43
|
"dependencies": {
|
|
42
44
|
"@statelyai/graph": "^0.9.0",
|
|
43
|
-
"@xmachines/play": "1.0.0-beta.
|
|
44
|
-
"@xmachines/play-actor": "1.0.0-beta.
|
|
45
|
-
"@xmachines/play-signals": "1.0.0-beta.
|
|
45
|
+
"@xmachines/play": "1.0.0-beta.22",
|
|
46
|
+
"@xmachines/play-actor": "1.0.0-beta.22",
|
|
47
|
+
"@xmachines/play-signals": "1.0.0-beta.22",
|
|
46
48
|
"quick-lru": "^7.0.0"
|
|
47
49
|
},
|
|
48
50
|
"devDependencies": {
|
|
49
51
|
"@types/node": "^25.5.0",
|
|
50
|
-
"@xmachines/play-xstate": "1.0.0-beta.
|
|
51
|
-
"@xmachines/shared": "1.0.0-beta.
|
|
52
|
+
"@xmachines/play-xstate": "1.0.0-beta.22",
|
|
53
|
+
"@xmachines/shared": "1.0.0-beta.22",
|
|
52
54
|
"typescript": "^5.9.3 || ^6.0.2",
|
|
53
55
|
"urlpattern-polyfill": "^10.1.0",
|
|
54
56
|
"vitest": "^4.1.2",
|