@xmachines/play-router 1.0.0-beta.21 → 1.0.0-beta.23
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 +20 -5
- 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-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/index.d.ts +2 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -8
- package/dist/index.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/router-sync.d.ts +5 -6
- package/dist/router-sync.d.ts.map +1 -1
- package/dist/router-sync.js +3 -3
- 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 +12 -8
- package/dist/connect-router.d.ts +0 -56
- package/dist/connect-router.d.ts.map +0 -1
- package/dist/connect-router.js +0 -109
- package/dist/connect-router.js.map +0 -1
- package/dist/create-browser-history.d.ts +0 -101
- package/dist/create-browser-history.d.ts.map +0 -1
- package/dist/create-browser-history.js +0 -120
- package/dist/create-browser-history.js.map +0 -1
- package/dist/create-router.d.ts +0 -73
- package/dist/create-router.d.ts.map +0 -1
- package/dist/create-router.js +0 -63
- package/dist/create-router.js.map +0 -1
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ It also exports `RouterBridgeBase`, the shared base class used by framework adap
|
|
|
12
12
|
|
|
13
13
|
`RouterBridgeBase` is the policy point; framework adapters are thin ports that implement only framework-specific navigate/subscribe/unsubscribe behavior.
|
|
14
14
|
|
|
15
|
-
The low-level `connectRouter()`
|
|
15
|
+
The low-level `connectRouter()` from `@xmachines/play-dom-router` uses the same router-to-actor event builder and route-map match helper as `RouterBridgeBase`, so pathname sanitization, state-id normalization, param extraction, and query extraction stay aligned across vanilla and framework adapters.
|
|
16
16
|
|
|
17
17
|
Per [Play RFC](../docs/rfc/play.md), this package implements:
|
|
18
18
|
|
|
@@ -109,9 +109,7 @@ The demo demonstrates:
|
|
|
109
109
|
**Run the demo:**
|
|
110
110
|
|
|
111
111
|
```bash
|
|
112
|
-
|
|
113
|
-
npm install
|
|
114
|
-
npm run dev
|
|
112
|
+
npm run dev -w packages/play-dom-router/examples/demo
|
|
115
113
|
```
|
|
116
114
|
|
|
117
115
|
Open http://localhost:5174/ and explore:
|
|
@@ -180,7 +178,24 @@ Bridge teardown must be explicit and deterministic:
|
|
|
180
178
|
- `disconnect`/`dispose` must unwatch signal subscriptions and unhook router listeners.
|
|
181
179
|
- Do not rely on GC-only cleanup guidance.
|
|
182
180
|
- Infrastructure remains passive: bridges observe and forward intents, actors decide validity.
|
|
183
|
-
- `createBrowserHistory().destroy()` is idempotent and restores shared `window.history` patches only after the last wrapper for that window is removed.
|
|
181
|
+
- `createBrowserHistory().destroy()` (from `@xmachines/play-dom-router`) is idempotent and restores shared `window.history` patches only after the last wrapper for that window is removed.
|
|
182
|
+
- **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.
|
|
183
|
+
|
|
184
|
+
## Bridge Sync Ordering
|
|
185
|
+
|
|
186
|
+
`RouterBridgeBase.connect()` has an intentional ordering contract used by all framework adapters:
|
|
187
|
+
|
|
188
|
+
- seed `lastSyncedPath` from `actor.currentRoute` in the constructor
|
|
189
|
+
- install the actor route watcher
|
|
190
|
+
- install adapter router subscriptions
|
|
191
|
+
- resolve initial sync using `getInitialRouterPath()` and `actor.initialRoute`
|
|
192
|
+
|
|
193
|
+
That final step distinguishes:
|
|
194
|
+
|
|
195
|
+
- **deep-link:** browser URL differs from the machine's initial route, so router wins and the actor receives `play.route`
|
|
196
|
+
- **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
|
|
197
|
+
|
|
198
|
+
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
199
|
|
|
185
200
|
## Diagnostics
|
|
186
201
|
|
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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"}
|
|
@@ -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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { RouterBridgeBase } from "./router-bridge-base.js";
|
|
2
2
|
export type { RouteWatcherHandle } from "./router-bridge-base.js";
|
|
3
|
-
export { sanitizePathname } from "./router-sync.js";
|
|
3
|
+
export { sanitizePathname, buildPlayRouteEvent, extractQuery } from "./router-sync.js";
|
|
4
|
+
export type { RouteMatch, BuildPlayRouteEventOptions } from "./router-sync.js";
|
|
4
5
|
export { validateRouteFormat, validateStateExists, detectDuplicateRoutes, } from "./validate-routes.js";
|
|
5
6
|
export { buildRouteTree } from "./build-tree.js";
|
|
6
7
|
export { extractMachineRoutes } from "./extract-routes.js";
|
|
@@ -10,8 +11,5 @@ export type { MachineGraph } from "./machine-to-graph.js";
|
|
|
10
11
|
export type { RouteInfo, RouteNode, RouteTree, RouteObject, RouteMetadata, PlayRouteEvent, RouterBridge, MachineNodeData, MachineEdgeData, } from "./types.js";
|
|
11
12
|
export { createRouteMap, type RouteMap } from "./create-route-map.js";
|
|
12
13
|
export { BaseRouteMap, type RouteMapping as BaseRouteMapping } from "./base-route-map.js";
|
|
13
|
-
export { createBrowserHistory, type BrowserHistory, type BrowserWindow, } from "./create-browser-history.js";
|
|
14
|
-
export { createRouter, type VanillaRouter } from "./create-router.js";
|
|
15
|
-
export { connectRouter, type ConnectRouterOptions } from "./connect-router.js";
|
|
16
14
|
export { findRouteById, findRouteByPath } from "./find-route.js";
|
|
17
15
|
//# sourceMappingURL=index.d.ts.map
|
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,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGlE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGlE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACvF,YAAY,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAG/E,OAAO,EACN,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACN,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,4BAA4B,EAC5B,gBAAgB,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,YAAY,EACX,SAAS,EACT,SAAS,EACT,SAAS,EACT,WAAW,EACX,aAAa,EACb,cAAc,EACd,YAAY,EACZ,eAAe,EACf,eAAe,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAKtE,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG1F,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// RouterBridgeBase — public API for community adapters
|
|
2
2
|
export { RouterBridgeBase } from "./router-bridge-base.js";
|
|
3
|
-
// Router sync utilities —
|
|
4
|
-
export { sanitizePathname } from "./router-sync.js";
|
|
3
|
+
// Router sync utilities — used by play-dom-router and adapters that bypass syncActorFromRouter()
|
|
4
|
+
export { sanitizePathname, buildPlayRouteEvent, extractQuery } from "./router-sync.js";
|
|
5
5
|
// Route utilities (existing)
|
|
6
6
|
export { validateRouteFormat, validateStateExists, detectDuplicateRoutes, } from "./validate-routes.js";
|
|
7
7
|
export { buildRouteTree } from "./build-tree.js";
|
|
@@ -15,12 +15,6 @@ export { createRouteMap } from "./create-route-map.js";
|
|
|
15
15
|
// Re-exported as `BaseRouteMapping` (not `RouteMapping`) so adapter packages can
|
|
16
16
|
// define their own local `RouteMapping` type without a name collision.
|
|
17
17
|
export { BaseRouteMap } from "./base-route-map.js";
|
|
18
|
-
// Browser history abstraction (aligned with TanStack Router)
|
|
19
|
-
export { createBrowserHistory, } from "./create-browser-history.js";
|
|
20
|
-
// Vanilla router (framework-agnostic)
|
|
21
|
-
export { createRouter } from "./create-router.js";
|
|
22
|
-
// Pure browser integration (low-level API)
|
|
23
|
-
export { connectRouter } from "./connect-router.js";
|
|
24
18
|
// Route lookup helpers — matchesPattern is private within find-route.ts
|
|
25
19
|
export { findRouteById, findRouteByPath } from "./find-route.js";
|
|
26
20
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,iGAAiG;AACjG,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,iGAAiG;AACjG,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGvF,6BAA6B;AAC7B,OAAO,EACN,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACN,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,EACX,4BAA4B,EAC5B,gBAAgB,GAChB,MAAM,YAAY,CAAC;AAEpB,qEAAqE;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAevD,iFAAiF;AACjF,OAAO,EAAE,cAAc,EAAiB,MAAM,uBAAuB,CAAC;AAEtE,iDAAiD;AACjD,iFAAiF;AACjF,uEAAuE;AACvE,OAAO,EAAE,YAAY,EAAyC,MAAM,qBAAqB,CAAC;AAE1F,wEAAwE;AACxE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,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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"}
|
package/dist/router-sync.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { PlayRouteEvent } from "./types.js";
|
|
2
|
-
interface RouteMatch {
|
|
2
|
+
export interface RouteMatch {
|
|
3
3
|
to: string | null | undefined;
|
|
4
4
|
params?: Record<string, string>;
|
|
5
5
|
}
|
|
6
|
-
interface BuildPlayRouteEventOptions {
|
|
6
|
+
export interface BuildPlayRouteEventOptions {
|
|
7
7
|
pathname: string;
|
|
8
8
|
search?: string | undefined;
|
|
9
9
|
resolve: (sanitizedPathname: string) => RouteMatch;
|
|
@@ -50,13 +50,12 @@ export declare function extractQuery(search: string): Record<string, string>;
|
|
|
50
50
|
/**
|
|
51
51
|
* Build a normalized `play.route` event from raw router/browser input.
|
|
52
52
|
*
|
|
53
|
-
* Both `connectRouter()` and `RouterBridgeBase`
|
|
54
|
-
* framework adapters share the same pathname
|
|
55
|
-
* query extraction behavior.
|
|
53
|
+
* Both `connectRouter()` (from `@xmachines/play-dom-router`) and `RouterBridgeBase`
|
|
54
|
+
* use this helper so low-level and framework adapters share the same pathname
|
|
55
|
+
* sanitization, route resolution, and query extraction behavior.
|
|
56
56
|
*/
|
|
57
57
|
export declare function buildPlayRouteEvent(options: BuildPlayRouteEventOptions): {
|
|
58
58
|
pathname: string;
|
|
59
59
|
event: PlayRouteEvent;
|
|
60
60
|
} | null;
|
|
61
|
-
export {};
|
|
62
61
|
//# sourceMappingURL=router-sync.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-sync.d.ts","sourceRoot":"","sources":["../src/router-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,
|
|
1
|
+
{"version":3,"file":"router-sync.d.ts","sourceRoot":"","sources":["../src/router-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,WAAW,UAAU;IAC1B,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,UAAU,CAAC;CACnD;AAED,MAAM,WAAW,gBAAgB;IAChC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1D,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACxD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1E,UAAU,CAUZ;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKhE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUnE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,0BAA0B,GACjC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,GAAG,IAAI,CAiBpD"}
|
package/dist/router-sync.js
CHANGED
|
@@ -62,9 +62,9 @@ export function extractQuery(search) {
|
|
|
62
62
|
/**
|
|
63
63
|
* Build a normalized `play.route` event from raw router/browser input.
|
|
64
64
|
*
|
|
65
|
-
* Both `connectRouter()` and `RouterBridgeBase`
|
|
66
|
-
* framework adapters share the same pathname
|
|
67
|
-
* query extraction behavior.
|
|
65
|
+
* Both `connectRouter()` (from `@xmachines/play-dom-router`) and `RouterBridgeBase`
|
|
66
|
+
* use this helper so low-level and framework adapters share the same pathname
|
|
67
|
+
* sanitization, route resolution, and query extraction behavior.
|
|
68
68
|
*/
|
|
69
69
|
export function buildPlayRouteEvent(options) {
|
|
70
70
|
const pathname = sanitizePathname(options.pathname);
|
|
@@ -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
|