@multiplatform.one/router 6.1.0 → 6.3.0
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 +51 -0
- package/dist/cjs/hooks/useUrlState.cjs +30 -9
- package/dist/cjs/hooks/useUrlState.native.js +32 -9
- package/dist/cjs/hooks/useUrlState.native.js.map +1 -1
- package/dist/cjs/seam/DomNavigationHost.cjs +122 -0
- package/dist/cjs/seam/DomNavigationHost.native.js +186 -0
- package/dist/cjs/seam/DomNavigationHost.native.js.map +1 -0
- package/dist/cjs/seam/index.cjs +47 -0
- package/dist/cjs/seam/index.native.js +50 -0
- package/dist/cjs/seam/index.native.js.map +1 -0
- package/dist/cjs/seam/navigator.cjs +309 -0
- package/dist/cjs/seam/navigator.native.js +479 -0
- package/dist/cjs/seam/navigator.native.js.map +1 -0
- package/dist/cjs/seam/oneAdapter.cjs +128 -0
- package/dist/cjs/seam/oneAdapter.native.js +141 -0
- package/dist/cjs/seam/oneAdapter.native.js.map +1 -0
- package/dist/esm/hooks/useUrlState.mjs +31 -10
- package/dist/esm/hooks/useUrlState.mjs.map +1 -1
- package/dist/esm/hooks/useUrlState.native.js +33 -10
- package/dist/esm/hooks/useUrlState.native.js.map +1 -1
- package/dist/esm/seam/DomNavigationHost.mjs +96 -0
- package/dist/esm/seam/DomNavigationHost.mjs.map +1 -0
- package/dist/esm/seam/DomNavigationHost.native.js +157 -0
- package/dist/esm/seam/DomNavigationHost.native.js.map +1 -0
- package/dist/esm/seam/index.mjs +5 -0
- package/dist/esm/seam/index.mjs.map +1 -0
- package/dist/esm/seam/index.native.js +5 -0
- package/dist/esm/seam/index.native.js.map +1 -0
- package/dist/esm/seam/navigator.mjs +279 -0
- package/dist/esm/seam/navigator.mjs.map +1 -0
- package/dist/esm/seam/navigator.native.js +446 -0
- package/dist/esm/seam/navigator.native.js.map +1 -0
- package/dist/esm/seam/oneAdapter.mjs +90 -0
- package/dist/esm/seam/oneAdapter.mjs.map +1 -0
- package/dist/esm/seam/oneAdapter.native.js +100 -0
- package/dist/esm/seam/oneAdapter.native.js.map +1 -0
- package/dist/jsx/hooks/useUrlState.mjs +31 -10
- package/dist/jsx/hooks/useUrlState.mjs.map +1 -1
- package/dist/jsx/hooks/useUrlState.native.js +32 -9
- package/dist/jsx/hooks/useUrlState.native.js.map +1 -1
- package/dist/jsx/seam/DomNavigationHost.mjs +96 -0
- package/dist/jsx/seam/DomNavigationHost.mjs.map +1 -0
- package/dist/jsx/seam/DomNavigationHost.native.js +186 -0
- package/dist/jsx/seam/DomNavigationHost.native.js.map +1 -0
- package/dist/jsx/seam/index.mjs +5 -0
- package/dist/jsx/seam/index.mjs.map +1 -0
- package/dist/jsx/seam/index.native.js +50 -0
- package/dist/jsx/seam/index.native.js.map +1 -0
- package/dist/jsx/seam/navigator.mjs +279 -0
- package/dist/jsx/seam/navigator.mjs.map +1 -0
- package/dist/jsx/seam/navigator.native.js +479 -0
- package/dist/jsx/seam/navigator.native.js.map +1 -0
- package/dist/jsx/seam/oneAdapter.mjs +90 -0
- package/dist/jsx/seam/oneAdapter.mjs.map +1 -0
- package/dist/jsx/seam/oneAdapter.native.js +141 -0
- package/dist/jsx/seam/oneAdapter.native.js.map +1 -0
- package/package.json +26 -9
- package/src/hooks/urlStateEdges.spec.ts +98 -0
- package/src/hooks/useUrlState.ts +34 -8
- package/src/seam/DomNavigationHost.spec.tsx +78 -0
- package/src/seam/DomNavigationHost.tsx +150 -0
- package/src/seam/index.ts +41 -0
- package/src/seam/navigator.spec.ts +189 -0
- package/src/seam/navigator.ts +405 -0
- package/src/seam/oneAdapter.tsx +166 -0
- package/types/hooks/index.d.ts +2 -0
- package/types/hooks/index.d.ts.map +1 -0
- package/types/hooks/useUrlState.d.ts +36 -0
- package/types/hooks/useUrlState.d.ts.map +1 -0
- package/types/index.d.ts +4 -0
- package/types/index.d.ts.map +1 -0
- package/types/index.storybook.d.ts +4 -0
- package/types/index.storybook.d.ts.map +1 -0
- package/types/router/EmptyRouter.d.ts +7 -0
- package/types/router/EmptyRouter.d.ts.map +1 -0
- package/types/router/ReactRouter.d.ts +6 -0
- package/types/router/ReactRouter.d.ts.map +1 -0
- package/types/router/index.d.ts +2 -0
- package/types/router/index.d.ts.map +1 -0
- package/types/router/index.storybook-expo.d.ts +2 -0
- package/types/router/index.storybook-expo.d.ts.map +1 -0
- package/types/router/index.storybook.d.ts +2 -0
- package/types/router/index.storybook.d.ts.map +1 -0
- package/types/router/index.webext.d.ts +2 -0
- package/types/router/index.webext.d.ts.map +1 -0
- package/types/seam/DomNavigationHost.d.ts +33 -0
- package/types/seam/DomNavigationHost.d.ts.map +1 -0
- package/types/seam/index.d.ts +7 -0
- package/types/seam/index.d.ts.map +1 -0
- package/types/seam/navigator.d.ts +133 -0
- package/types/seam/navigator.d.ts.map +1 -0
- package/types/seam/oneAdapter.d.ts +57 -0
- package/types/seam/oneAdapter.d.ts.map +1 -0
- package/types/types.d.ts +40 -0
- package/types/types.d.ts.map +1 -0
- package/dist/cjs/hooks/useUrlState.spec.cjs +0 -280
- package/dist/cjs/hooks/useUrlState.spec.native.js +0 -315
- package/dist/cjs/hooks/useUrlState.spec.native.js.map +0 -1
- package/dist/esm/hooks/useUrlState.spec.mjs +0 -257
- package/dist/esm/hooks/useUrlState.spec.mjs.map +0 -1
- package/dist/esm/hooks/useUrlState.spec.native.js +0 -289
- package/dist/esm/hooks/useUrlState.spec.native.js.map +0 -1
- package/dist/jsx/hooks/useUrlState.spec.mjs +0 -257
- package/dist/jsx/hooks/useUrlState.spec.mjs.map +0 -1
- package/dist/jsx/hooks/useUrlState.spec.native.js +0 -315
- package/dist/jsx/hooks/useUrlState.spec.native.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["jsx","_jsx","Suspense","useEffect","useRef","RouteTagContext","stackNavigator","useNavState","_class_call_check","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_create_class","protoProps","staticProps","prototype","_define_property","obj","value","DomStackAdapter","DomStackAdapter2","rootTag","onChanged","stack","push_by_tag","tag","push","pop","pop_to_tag","idx","lastIndexOf","slice","replace_with_tags","tags","get_navigation_stack"],"sources":["../../../src/seam/DomNavigationHost.tsx"],"sourcesContent":[null],"mappings":"AAwBA,SAASA,GAAA,IAAAC,IAAU,2BAAyB;AAC5C,SAAAC,QAAA,EAAAC,SAAA,EAAAC,MAAA;AAAA,SACEC,eAAA,EAAAC,cAAA,EAAAC,WAAA;AAAA,SACAC,kBAAAC,QAAA,EAAAC,WAAA;EACA,MAAAD,QAAA,YAAAC,WAAA;IAAA,MAIK,IAAAC,SAAA;EA8GO;AAzGP;AAAiD,SAC9CC,kBAAAC,MAAA,EAAAC,KAAA;EACS,SAAAC,CAAA,MAAAA,CAAA,GAAAD,KAAA,CAAAE,MAAA,EAAAD,CAAA;IAEjB,IAAAE,UAAY,GAAAH,KAAiB,CAAAC,CAAA;IAC3BE,UAAK,CAAAC,UAAQ,GAAWD,UAAO,CAAIC,UAAC;IACpCD,UAAK,CAAAE,YAAY;IACnB,eAAAF,UAAA,EAAAA,UAAA,CAAAG,QAAA;IAEAC,MAAA,CAAAC,cAA+B,CAAAT,MAAA,EAAAI,UAAA,CAAAM,GAAA,EAAAN,UAAA;EAC7B;AACA;AAAe,SACjBO,cAAAd,WAAA,EAAAe,UAAA,EAAAC,WAAA;EAEA,IAAAD,UAAe,EAAAb,iBAAA,CAAAF,WAAA,CAAAiB,SAAA,EAAAF,UAAA;EACb,IAAAC,WAAS,EAAMd,iBAAa,CAAAF,WAAO,EAAAgB,WAAA;EACnC,OAAKhB,WAAU;AACf;AACA,SAAAkB,gBAAOA,CAAAC,GAAA,EAAAN,GAAA,EAAAO,KAAA;EACT,IAAAP,GAAA,IAAAM,GAAA;IAEAR,MAAA,CAAAC,cAAiC,CAAAO,GAAA,EAAAN,GAAA;MAC/BO,KAAM;MACNZ,UAAY,MAAM;MAClBC,YAAa,MAAK;MAClBC,QAAK;IACL;EACF;IAEAS,GAAA,CAAAN,GAAA,IAAAO,KAAkB;EAChB;EACA,OAAKD,GAAA;AAAU;AACjB,IAEAE,eAAA,kBAGE;EACA,YAAM;;EACN,SAAOC,iBAAAC,OAAA,EAAAC,SAAA;IAAA1B,iBACQ,KAAM,EAAAwB,gBAAS;IAAAJ,gBACjB,OACT,SAAS,KAAK;IAClBA,gBAAA;IACF,KAAAO,KAAA,GAAAF,OAAA,IACFA,OAAA,CAeA,GAAM;IACJ,KAAAC,SAAU,GAAAA,SAAA;EACV;EACAV,aAAS,CAAAQ,gBAAA,GACT;IACAT,GAAA,eAAU;IACZO,KAAA,WAAAM,YAAAC,GAAA;MAEO,IAAS,CAAAF,KAAA,CAAAG,IAAA,CAAAD,GAAkB;MAChC,KAAAH,SAAA;IACA;EACA,GACoC;IACpCX,GAAM;IACNO,KAAA,EAAW,SAAAS,GAAYA,CAAA;MAAoB,IAAQ,IAAG,CAAAJ,KAAO,CAAAnB,MAAA;MAAI,IAC/D,CAAAmB,KAAA,CAAAI,GAAA;MACF,KAAAL,SAAA;MAGM;IAEN;EACE,GACA;IACAX,GAAA,cAAe;IACfO,KAAM,WAAUU,WAAAH,GAAe;MAC3B,IAAAI,GAAA,GAAS,KAAAN,KAAA,CAAAO,WAAuB,CAAAL,GAAA;MACpC,IAAOI,GAAA,KAAM,MAAAA,GAAA,KAAe,KAAON,KAAA,CAAAnB,MAAA;MAChC,KAAAmB,KAAA,QAAAA,KAAA,CAAAQ,KAAA,IAAAF,GAAA;MAEC,KAAAP,SAAM;MAEZ,OACE;IAEI;EACA,GACA;IACGX,GAAA;IAAAO,KAAA,WAAAc,kBAAAC,IAAA;MAEC,KAAAV,KAAA,IACA,GAAAU,IAAA,CACA;MAEA,KAAAX,SAAA;IAEA;EAAA,GACF;IAGNX,GAAA;IAEJO,KAAA,WAAAgB,qBAAA","ignoreList":[]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { RouteTagContext, StackNavigator, hrefToString, stackNavigator, useNavState, useRouteParams } from "./navigator.mjs";
|
|
2
|
+
import { DomNavigationHost, DomStackAdapter } from "./DomNavigationHost.mjs";
|
|
3
|
+
import { Link, LoadProgressBar, Slot, useBlocker, useLoader, useLocalSearchParams, useMatches, useParams, usePathname, useRouter } from "./oneAdapter.mjs";
|
|
4
|
+
export { DomNavigationHost, DomStackAdapter, Link, LoadProgressBar, RouteTagContext, Slot, StackNavigator, hrefToString, stackNavigator, useBlocker, useLoader, useLocalSearchParams, useMatches, useNavState, useParams, usePathname, useRouteParams, useRouter };
|
|
5
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["RouteTagContext","StackNavigator","hrefToString","stackNavigator","useNavState","useRouteParams","DomNavigationHost","DomStackAdapter","Link","LoadProgressBar","Slot","useBlocker","useLoader","useLocalSearchParams","useMatches","useParams","usePathname","useRouter"],"sources":["../../../src/seam/index.ts"],"sourcesContent":[null],"mappings":"AASA,SACEA,eAAA,EACAC,cAAA,EACAC,YAAA,EACAC,cAAA,EACAC,WAAA,EACAC,cAAA,QACK;AAUP,SAASC,iBAAA,EAAmBC,eAAA,QAAuB;AAEnD,SACEC,IAAA,EACAC,eAAA,EACAC,IAAA,EACAC,UAAA,EACAC,SAAA,EACAC,oBAAA,EACAC,UAAA,EACAC,SAAA,EACAC,WAAA,EACAC,SAAA,QACK","ignoreList":[]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { RouteTagContext, StackNavigator, hrefToString, stackNavigator, useNavState, useRouteParams } from "./navigator.native.js";
|
|
2
|
+
import { DomNavigationHost, DomStackAdapter } from "./DomNavigationHost.native.js";
|
|
3
|
+
import { Link, LoadProgressBar, Slot, useBlocker, useLoader, useLocalSearchParams, useMatches, useParams, usePathname, useRouter } from "./oneAdapter.native.js";
|
|
4
|
+
export { DomNavigationHost, DomStackAdapter, Link, LoadProgressBar, RouteTagContext, Slot, StackNavigator, hrefToString, stackNavigator, useBlocker, useLoader, useLocalSearchParams, useMatches, useNavState, useParams, usePathname, useRouteParams, useRouter };
|
|
5
|
+
//# sourceMappingURL=index.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["RouteTagContext","StackNavigator","hrefToString","stackNavigator","useNavState","useRouteParams","DomNavigationHost","DomStackAdapter","Link","LoadProgressBar","Slot","useBlocker","useLoader","useLocalSearchParams","useMatches","useParams","usePathname","useRouter"],"sources":["../../../src/seam/index.ts"],"sourcesContent":[null],"mappings":"AASA,SAAAA,eAAA,EAAAC,cAAA,EAAAC,YAAA,EAAAC,cAAA,EAAAC,WAAA,EAAAC,cAAA;AAAA,SACEC,iBAAA,EAAAC,eAAA;AAAA,SACAC,IAAA,EAAAC,eAAA,EAAAC,IAAA,EAAAC,UAAA,EAAAC,SAAA,EAAAC,oBAAA,EAAAC,UAAA,EAAAC,SAAA,EAAAC,WAAA,EAAAC,SAAA;AAAA,SAEAX,iBAAA,EACAC,eAAA,EACAC,IAAA,EAAAC,eACK,EAUPT,eAAS,EAETU,IAAA,EACET,cAAA,EACAC,YAAA,EACAC,cAAA,EACAQ,UAAA,EACAC,SAAA,EACAC,oBAAA,EACAC,UAAA,EACAV,WAAA,EACAW,SAAA,EACAC,WAAA,EAAAX,cACK,E","ignoreList":[]}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { createContext, useContext, useSyncExternalStore } from "react";
|
|
2
|
+
function compileRoute(def) {
|
|
3
|
+
const segments = def.pattern.split("/").filter(Boolean).map(seg => {
|
|
4
|
+
const m = seg.match(/^\[(\.{3})?(.+)\]$/);
|
|
5
|
+
return m ? {
|
|
6
|
+
param: m[2]
|
|
7
|
+
} : {
|
|
8
|
+
literal: seg
|
|
9
|
+
};
|
|
10
|
+
});
|
|
11
|
+
return {
|
|
12
|
+
...def,
|
|
13
|
+
segments
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function parseQuery(query) {
|
|
17
|
+
const params = {};
|
|
18
|
+
if (!query) return params;
|
|
19
|
+
for (const pair of query.split("&")) {
|
|
20
|
+
if (!pair) continue;
|
|
21
|
+
const eq = pair.indexOf("=");
|
|
22
|
+
const key = decodeURIComponent(eq === -1 ? pair : pair.slice(0, eq));
|
|
23
|
+
const value = eq === -1 ? "" : decodeURIComponent(pair.slice(eq + 1));
|
|
24
|
+
const prev = params[key];
|
|
25
|
+
if (prev === void 0) params[key] = value;else if (Array.isArray(prev)) prev.push(value);else params[key] = [prev, value];
|
|
26
|
+
}
|
|
27
|
+
return params;
|
|
28
|
+
}
|
|
29
|
+
function hrefToString(href) {
|
|
30
|
+
if (typeof href === "string") return href;
|
|
31
|
+
let path = href.pathname;
|
|
32
|
+
const leftover = [];
|
|
33
|
+
for (const [key, raw] of Object.entries(href.params ?? {})) {
|
|
34
|
+
const value = String(raw);
|
|
35
|
+
const token = `[${key}]`;
|
|
36
|
+
if (path.includes(token)) path = path.replace(token, encodeURIComponent(value));else leftover.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);
|
|
37
|
+
}
|
|
38
|
+
return leftover.length ? `${path}?${leftover.join("&")}` : path;
|
|
39
|
+
}
|
|
40
|
+
const EMPTY_PARAMS = Object.freeze({});
|
|
41
|
+
class StackNavigator {
|
|
42
|
+
routes = [];
|
|
43
|
+
host = null;
|
|
44
|
+
listeners = /* @__PURE__ */new Set();
|
|
45
|
+
/** Stack mirror rebuilt from the host on every pushed/popped/replaced
|
|
46
|
+
* signal. */
|
|
47
|
+
stackTags = [];
|
|
48
|
+
paramsByTag = /* @__PURE__ */new Map();
|
|
49
|
+
pathnameByTag = /* @__PURE__ */new Map();
|
|
50
|
+
/** Tags whose page content has been navigated to at least once. The host
|
|
51
|
+
* gates each page's React content on this (lazy mounting) — a tag enters
|
|
52
|
+
* the set right before its first host push and never leaves (backgrounded
|
|
53
|
+
* pages stay alive, same as One keeping stack screens mounted). */
|
|
54
|
+
visitedTags = /* @__PURE__ */new Set();
|
|
55
|
+
/** Route-loader results, per tag (the loader bridge's store). */
|
|
56
|
+
loaderDataByTag = /* @__PURE__ */new Map();
|
|
57
|
+
/** Monotonic navigation sequence — a loader that resolves after a NEWER
|
|
58
|
+
* navigation started must not perform its (stale) host action. */
|
|
59
|
+
navSeq = 0;
|
|
60
|
+
generation = 0;
|
|
61
|
+
snapshot = {
|
|
62
|
+
pathname: "/",
|
|
63
|
+
tag: "",
|
|
64
|
+
depth: 0,
|
|
65
|
+
canGoBack: false,
|
|
66
|
+
generation: 0
|
|
67
|
+
};
|
|
68
|
+
get isConfigured() {
|
|
69
|
+
return this.routes.length > 0;
|
|
70
|
+
}
|
|
71
|
+
/** Register the route manifest. The FIRST route is the root page. */
|
|
72
|
+
configure(defs) {
|
|
73
|
+
this.routes = defs.map(compileRoute);
|
|
74
|
+
this.visitedTags = /* @__PURE__ */new Set();
|
|
75
|
+
this.loaderDataByTag = /* @__PURE__ */new Map();
|
|
76
|
+
const root = defs[0];
|
|
77
|
+
if (root) {
|
|
78
|
+
this.stackTags = [root.tag];
|
|
79
|
+
this.visitedTags.add(root.tag);
|
|
80
|
+
this.pathnameByTag.set(root.tag, root.pattern);
|
|
81
|
+
this.rebuildSnapshot();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** Has this route's page been navigated to (⇒ its content may mount)? */
|
|
85
|
+
isVisited(tag) {
|
|
86
|
+
return tag !== null && this.visitedTags.has(tag);
|
|
87
|
+
}
|
|
88
|
+
/** The route's last loader result (stable identity until the loader runs
|
|
89
|
+
* again). undefined when the route has no loader / hasn't resolved. */
|
|
90
|
+
loaderSnapshot(tag) {
|
|
91
|
+
if (!tag) return void 0;
|
|
92
|
+
return this.loaderDataByTag.get(tag);
|
|
93
|
+
}
|
|
94
|
+
/** Resolve a route's loader WITHOUT navigating. For the initial page:
|
|
95
|
+
* entries can `await stackNavigator.preload("/")` during top-level await
|
|
96
|
+
* (where GJS reliably drains promise jobs) so even the root page's first
|
|
97
|
+
* paint has loader data. */
|
|
98
|
+
async preload(href) {
|
|
99
|
+
const hit = this.match(href);
|
|
100
|
+
if (!hit?.route.loader) return;
|
|
101
|
+
try {
|
|
102
|
+
const data = await hit.route.loader({
|
|
103
|
+
path: hit.pathname,
|
|
104
|
+
params: hit.params
|
|
105
|
+
});
|
|
106
|
+
this.loaderDataByTag.set(hit.route.tag, data);
|
|
107
|
+
this.rebuildSnapshot();
|
|
108
|
+
} catch (err) {
|
|
109
|
+
console.error(`[stack nav] preload loader for ${hit.route.tag} failed: ${String(err)}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** Bind the live host stack (an Adw.NavigationView widget on GTK, a
|
|
113
|
+
* DomStackAdapter on DOM targets). */
|
|
114
|
+
attach(host) {
|
|
115
|
+
this.host = host;
|
|
116
|
+
this.syncFromHost();
|
|
117
|
+
}
|
|
118
|
+
detach() {
|
|
119
|
+
this.host = null;
|
|
120
|
+
}
|
|
121
|
+
subscribe = fn => {
|
|
122
|
+
this.listeners.add(fn);
|
|
123
|
+
return () => this.listeners.delete(fn);
|
|
124
|
+
};
|
|
125
|
+
getSnapshot = () => this.snapshot;
|
|
126
|
+
paramsSnapshot(tag) {
|
|
127
|
+
if (!tag) return EMPTY_PARAMS;
|
|
128
|
+
return this.paramsByTag.get(tag) ?? EMPTY_PARAMS;
|
|
129
|
+
}
|
|
130
|
+
match(href) {
|
|
131
|
+
const str = hrefToString(href);
|
|
132
|
+
const [path = "", query] = str.split("?");
|
|
133
|
+
const parts = path.split("/").filter(Boolean);
|
|
134
|
+
for (const route of this.routes) {
|
|
135
|
+
if (route.segments.length !== parts.length) continue;
|
|
136
|
+
const params = parseQuery(query);
|
|
137
|
+
let ok = true;
|
|
138
|
+
for (let i = 0; i < parts.length; i++) {
|
|
139
|
+
const seg = route.segments[i];
|
|
140
|
+
const part = decodeURIComponent(parts[i]);
|
|
141
|
+
if (seg.literal !== void 0) {
|
|
142
|
+
if (seg.literal !== part) {
|
|
143
|
+
ok = false;
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
} else if (seg.param !== void 0) {
|
|
147
|
+
params[seg.param] = part;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (ok) return {
|
|
151
|
+
route,
|
|
152
|
+
pathname: path === "" ? "/" : `/${parts.join("/")}`,
|
|
153
|
+
params
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
push = href => {
|
|
159
|
+
void this.navigate(href, "push");
|
|
160
|
+
};
|
|
161
|
+
replace = href => {
|
|
162
|
+
void this.navigate(href, "replace");
|
|
163
|
+
};
|
|
164
|
+
/** Shared push/replace flow, incl. the loader bridge. When the target
|
|
165
|
+
* route has no loader the whole body runs SYNCHRONOUSLY (an async
|
|
166
|
+
* function only yields at its first await), preserving the original
|
|
167
|
+
* timing. With a loader, the host action waits for the loader to resolve
|
|
168
|
+
* — same contract as One on web, where client navigation completes only
|
|
169
|
+
* after the route's loader data arrived — so the page's first paint has
|
|
170
|
+
* its data (and the lazily-mounted content mounts with it). */
|
|
171
|
+
async navigate(href, mode) {
|
|
172
|
+
const hit = this.match(href);
|
|
173
|
+
if (!hit) {
|
|
174
|
+
console.log(`[stack nav] ${mode} ${hrefToString(href)} \u2014 no page in the route manifest, ignored`);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (!this.host) {
|
|
178
|
+
console.log(`[stack nav] ${mode} ${hrefToString(href)} \u2014 no stack host attached, ignored`);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const {
|
|
182
|
+
route,
|
|
183
|
+
pathname,
|
|
184
|
+
params
|
|
185
|
+
} = hit;
|
|
186
|
+
const seq = ++this.navSeq;
|
|
187
|
+
if (route.loader) {
|
|
188
|
+
try {
|
|
189
|
+
const data = await route.loader({
|
|
190
|
+
path: pathname,
|
|
191
|
+
params
|
|
192
|
+
});
|
|
193
|
+
if (seq !== this.navSeq) return;
|
|
194
|
+
this.loaderDataByTag.set(route.tag, data);
|
|
195
|
+
} catch (err) {
|
|
196
|
+
if (seq !== this.navSeq) return;
|
|
197
|
+
console.error(`[stack nav] loader for ${route.tag} failed: ${String(err)}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
this.visitedTags.add(route.tag);
|
|
201
|
+
this.setRouteState(route.tag, pathname, params);
|
|
202
|
+
if (mode === "replace") {
|
|
203
|
+
const top = this.stackTags[this.stackTags.length - 1];
|
|
204
|
+
if (top === route.tag) return;
|
|
205
|
+
const tags = [...this.stackTags.slice(0, -1), route.tag];
|
|
206
|
+
this.host.replace_with_tags(tags);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const idx = this.stackTags.indexOf(route.tag);
|
|
210
|
+
if (idx === -1) {
|
|
211
|
+
this.host.push_by_tag(route.tag);
|
|
212
|
+
} else if (idx < this.stackTags.length - 1) {
|
|
213
|
+
this.host.pop_to_tag(route.tag);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
back = () => {
|
|
217
|
+
if (!this.host) {
|
|
218
|
+
console.log("[stack nav] back \u2014 no stack host attached, ignored");
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
this.navSeq++;
|
|
222
|
+
this.host.pop();
|
|
223
|
+
};
|
|
224
|
+
setParams = params => {
|
|
225
|
+
const top = this.stackTags[this.stackTags.length - 1];
|
|
226
|
+
if (!top) return;
|
|
227
|
+
const prev = this.paramsByTag.get(top) ?? {};
|
|
228
|
+
this.paramsByTag.set(top, {
|
|
229
|
+
...prev,
|
|
230
|
+
...params
|
|
231
|
+
});
|
|
232
|
+
this.rebuildSnapshot();
|
|
233
|
+
};
|
|
234
|
+
/** Re-read the host navigation stack (called from pushed/popped/replaced
|
|
235
|
+
* signal handlers and attach). The host is the source of truth. */
|
|
236
|
+
syncFromHost = () => {
|
|
237
|
+
if (!this.host) return;
|
|
238
|
+
this.navSeq++;
|
|
239
|
+
const model = this.host.get_navigation_stack();
|
|
240
|
+
const tags = [];
|
|
241
|
+
const count = model.get_n_items();
|
|
242
|
+
for (let i = 0; i < count; i++) {
|
|
243
|
+
const tag = model.get_item(i)?.get_tag();
|
|
244
|
+
if (tag) tags.push(tag);
|
|
245
|
+
}
|
|
246
|
+
if (tags.length > 0) this.stackTags = tags;
|
|
247
|
+
for (const tag of this.stackTags) this.visitedTags.add(tag);
|
|
248
|
+
this.rebuildSnapshot();
|
|
249
|
+
};
|
|
250
|
+
setRouteState(tag, pathname, params) {
|
|
251
|
+
this.paramsByTag.set(tag, params);
|
|
252
|
+
this.pathnameByTag.set(tag, pathname);
|
|
253
|
+
this.rebuildSnapshot();
|
|
254
|
+
}
|
|
255
|
+
rebuildSnapshot() {
|
|
256
|
+
const tag = this.stackTags[this.stackTags.length - 1] ?? "";
|
|
257
|
+
const route = this.routes.find(r => r.tag === tag);
|
|
258
|
+
this.generation++;
|
|
259
|
+
this.snapshot = {
|
|
260
|
+
pathname: this.pathnameByTag.get(tag) ?? route?.pattern ?? "/",
|
|
261
|
+
tag,
|
|
262
|
+
depth: this.stackTags.length,
|
|
263
|
+
canGoBack: this.stackTags.length > 1,
|
|
264
|
+
generation: this.generation
|
|
265
|
+
};
|
|
266
|
+
for (const fn of this.listeners) fn();
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
const stackNavigator = new StackNavigator();
|
|
270
|
+
const RouteTagContext = createContext(null);
|
|
271
|
+
function useNavState() {
|
|
272
|
+
return useSyncExternalStore(stackNavigator.subscribe, stackNavigator.getSnapshot);
|
|
273
|
+
}
|
|
274
|
+
function useRouteParams() {
|
|
275
|
+
const tag = useContext(RouteTagContext);
|
|
276
|
+
return useSyncExternalStore(stackNavigator.subscribe, () => stackNavigator.paramsSnapshot(tag));
|
|
277
|
+
}
|
|
278
|
+
export { RouteTagContext, StackNavigator, hrefToString, stackNavigator, useNavState, useRouteParams };
|
|
279
|
+
//# sourceMappingURL=navigator.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createContext","useContext","useSyncExternalStore","compileRoute","def","segments","pattern","split","filter","Boolean","map","seg","m","match","param","literal","parseQuery","query","params","pair","eq","indexOf","key","decodeURIComponent","slice","value","prev","Array","isArray","push","hrefToString","href","path","pathname","leftover","raw","Object","entries","String","token","includes","replace","encodeURIComponent","length","join","EMPTY_PARAMS","freeze","StackNavigator","routes","host","listeners","Set","stackTags","paramsByTag","Map","pathnameByTag","visitedTags","loaderDataByTag","navSeq","generation","snapshot","tag","depth","canGoBack","isConfigured","configure","defs","root","add","set","rebuildSnapshot","isVisited","has","loaderSnapshot","get","preload","hit","route","loader","data","err","console","error","attach","syncFromHost","detach","subscribe","fn","delete","getSnapshot","paramsSnapshot","str","parts","ok","i","part","navigate","mode","log","seq","setRouteState","top","tags","replace_with_tags","idx","push_by_tag","pop_to_tag","back","pop","setParams","model","get_navigation_stack","count","get_n_items","get_item","get_tag","find","r","stackNavigator","RouteTagContext","useNavState","useRouteParams"],"sources":["../../../src/seam/navigator.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|