@memoized-dom/router 0.0.1
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 +150 -0
- package/dist/chunks/chunk-MH5AOHEF.js +1 -0
- package/dist/default-runtime.d.ts +2 -0
- package/dist/default-runtime.d.ts.map +1 -0
- package/dist/history.d.ts +50 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/internal.d.ts +21 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +1 -0
- package/dist/manifest.d.ts +10 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/matcher.d.ts +15 -0
- package/dist/matcher.d.ts.map +1 -0
- package/dist/path.d.ts +68 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/query.d.ts +40 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/runtime.d.ts +64 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/types.d.ts +157 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +30 -0
package/README.md
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# `@memoized-dom/router`
|
|
2
|
+
|
|
3
|
+
`@memoized-dom/router` is Memoized DOM's renderer-independent routing runtime. It owns immutable URL state, deterministic matching, nested route manifests, navigation history, cancellation, redirects, and synchronous navigation guards. It does not render components, load route data, or define an SSR wire format.
|
|
4
|
+
|
|
5
|
+
## Route state and focused subscriptions
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { route, subscribeNavigation } from '@memoized-dom/router';
|
|
9
|
+
|
|
10
|
+
route.pathname;
|
|
11
|
+
route.query.get('tab');
|
|
12
|
+
route.params;
|
|
13
|
+
route.matches;
|
|
14
|
+
route.matched?.metadata;
|
|
15
|
+
route.signal;
|
|
16
|
+
|
|
17
|
+
subscribeNavigation(event => {
|
|
18
|
+
console.log(event.phase, event.navigation.to.pathname);
|
|
19
|
+
});
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`route` is one stable, getter-backed object. Its query view is read-only, match arrays and parameters are frozen, and every location change aborts the previous `route.signal`. Generated consumers can use `subscribeRouteSelected()` from the internal entry to update only when a selected pathname, query value, parameter, or match changes.
|
|
23
|
+
|
|
24
|
+
## Manifests and matching
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import { createRouteManifest } from '@memoized-dom/router';
|
|
28
|
+
|
|
29
|
+
const manifest = createRouteManifest([
|
|
30
|
+
{ id: 'root', pattern: '/', metadata: { layout: true } },
|
|
31
|
+
{ id: 'projects', parentId: 'root', pattern: '/projects' },
|
|
32
|
+
{ id: 'project', parentId: 'projects', pattern: '/:projectId' },
|
|
33
|
+
{ id: 'missing', parentId: 'root', pattern: '/*' },
|
|
34
|
+
]);
|
|
35
|
+
|
|
36
|
+
manifest.matchAll('/projects/compiler'); // root -> projects -> project
|
|
37
|
+
manifest.build('project', { params: { projectId: 'compiler' } });
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Definitions may be out of order. Construction validates duplicate and missing IDs, parent cycles, parameter shadowing, wildcard placement, and ambiguous unrelated routes. Static segments outrank parameters, which outrank wildcards. A terminal wildcard is the not-found/catch-all mechanism.
|
|
41
|
+
|
|
42
|
+
For lower-level use, `matchRoutePattern()`, `createRouteMatcher()`, `joinRoutePaths()`, and `buildRoutePath()` expose the same validated path primitives.
|
|
43
|
+
|
|
44
|
+
## Navigation
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import {
|
|
48
|
+
navigate,
|
|
49
|
+
navigateRelative,
|
|
50
|
+
redirectRoute,
|
|
51
|
+
blockNavigation,
|
|
52
|
+
} from '@memoized-dom/router';
|
|
53
|
+
|
|
54
|
+
navigate('/organizations/:organizationId', {
|
|
55
|
+
params: { organizationId: 'acme' },
|
|
56
|
+
query: { tab: 'members', tag: ['compiler', 'runtime'] },
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
navigateRelative('../settings');
|
|
60
|
+
|
|
61
|
+
const unblock = blockNavigation(navigation => {
|
|
62
|
+
if (navigation.to.pathname === '/private') {
|
|
63
|
+
return redirectRoute('/login', { replace: true });
|
|
64
|
+
}
|
|
65
|
+
if (hasUnsavedChanges) return false;
|
|
66
|
+
});
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
`navigate()` and `navigateRelative()` return a `completed` or `blocked` result. Guards run before router-owned history changes and may allow, block, or redirect. They are intentionally synchronous: waiting for data belongs to the future router/data coordination layer. Redirect chains are capped at 16 and guards cannot recursively mutate router state.
|
|
70
|
+
|
|
71
|
+
Relative paths use directory semantics: `details` from `/projects/one` resolves to `/projects/one/details`, while `../two` resolves to `/projects/two`. A runtime `basePath` keeps application paths independent from deployment paths:
|
|
72
|
+
|
|
73
|
+
```ts
|
|
74
|
+
const runtime = createRouteRuntime({
|
|
75
|
+
basePath: '/app',
|
|
76
|
+
routeHistory: createMemoryRouteHistory({ initialEntries: ['/app'] }),
|
|
77
|
+
routes: manifest.entries,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
runtime.navigate('/projects'); // address: /app/projects, route.pathname: /projects
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Router-owned history
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
const history = createMemoryRouteHistory({
|
|
87
|
+
initialEntries: ['/', '/projects'],
|
|
88
|
+
});
|
|
89
|
+
const runtime = createRouteRuntime({ routeHistory: history });
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
The `RouteHistory` interface separates navigation storage from browser event plumbing. The built-in memory implementation has stable keys and indices, forward-stack truncation, non-mutating `peek()`, synchronous publication, and rollback when a subscriber rejects an update. It is useful for tests, embedded/non-browser roots, deterministic replay, and guardable traversal. An explicitly supplied history remains owned by the caller; disposing the runtime unsubscribes but does not destroy it.
|
|
93
|
+
|
|
94
|
+
## Browser behavior
|
|
95
|
+
|
|
96
|
+
The Navigation API is the primary browser boundary. Same-origin application navigations are intercepted and use after-transition scrolling. The fallback uses history plus reference-counted `popstate`, `hashchange`, and delegated click listeners. Downloads, external links, non-self targets, modified clicks, hash-only anchors, and URLs outside `basePath` remain native.
|
|
97
|
+
|
|
98
|
+
Navigation API events can be guarded before commit. Router-initiated memory-history traversal is also guardable because the destination can be peeked first. Legacy browser `popstate` is observational—the browser has already traversed when it fires—so it cannot provide the same pre-commit guarantee.
|
|
99
|
+
|
|
100
|
+
## Compiler boundary and HMR
|
|
101
|
+
|
|
102
|
+
`@memoized-dom/router/internal` exposes the small bridge intended for generated code: connection lifetime, structural resolver installation/replacement, atomic location-and-match publication, full or selected subscriptions, relative navigation, and navigation lifecycle access. `replaceRouteResolver()` resolves the current location before swapping and makes stale HMR disposers harmless.
|
|
103
|
+
|
|
104
|
+
The compiler owns `route` and `route-to` as universal JSX properties. They are
|
|
105
|
+
erased before normal host/component prop handling, so neither appears in the
|
|
106
|
+
DOM or a component's public props. Every route fragment is canonical and starts
|
|
107
|
+
with `/`; nested fragments compose with their nearest route-bearing JSX
|
|
108
|
+
ancestor:
|
|
109
|
+
|
|
110
|
+
```tsx
|
|
111
|
+
<main route="/">
|
|
112
|
+
<section route="/projects">
|
|
113
|
+
<article route="/:projectId">Project</article>
|
|
114
|
+
</section>
|
|
115
|
+
<aside route="/*">Not found</aside>
|
|
116
|
+
</main>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
This declares `/`, `/projects`, `/projects/:projectId`, and the terminal
|
|
120
|
+
catch-all. The compiler emits one structural manifest plus focused DOM regions;
|
|
121
|
+
it does not perform a runtime JSX-tree discovery pass.
|
|
122
|
+
|
|
123
|
+
Navigation targets are checked against that linked route graph. Parameterized
|
|
124
|
+
and catch-all paths require exact parameter keys:
|
|
125
|
+
|
|
126
|
+
```tsx
|
|
127
|
+
<button route-to={{
|
|
128
|
+
path: '/projects/:projectId',
|
|
129
|
+
params: { projectId },
|
|
130
|
+
query: { tab: 'activity' },
|
|
131
|
+
}}>
|
|
132
|
+
Open project
|
|
133
|
+
</button>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
`route-to` accepts `path`, `params`, `query`, `hash`, and `replace`. History
|
|
137
|
+
`state` is intentionally not authored here; any internal navigation metadata is
|
|
138
|
+
compiler/runtime-owned. Anchors receive a real `href`, while other intrinsic
|
|
139
|
+
elements receive compiled navigation behavior that composes with `onClick` and
|
|
140
|
+
respects `preventDefault()`. The generated singleton browser connection is
|
|
141
|
+
idempotent across HMR module evaluation.
|
|
142
|
+
|
|
143
|
+
Chunk-loading syntax remains a build-integration concern and is not part of the
|
|
144
|
+
current directive lowering.
|
|
145
|
+
|
|
146
|
+
## Deliberate boundaries
|
|
147
|
+
|
|
148
|
+
- Router/data coordination is not implemented yet. Its caching, pending-state, error, and invalidation contract needs a separate design discussion.
|
|
149
|
+
- Router SSR is not implemented yet. Memoized DOM first needs renderer-level SSR, streaming, and hydration ownership. The package therefore does not depend on Seroval or commit to another router's serialization format.
|
|
150
|
+
- Each server request or independently routed root must eventually receive its own runtime. The default singleton is browser-document state and must never be shared between concurrent requests.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function _(e){let n=e.length;for(let u=0;u<n;u++){let t=e.charCodeAt(u);if(!(t>=97&&t<=122||t>=65&&t<=90||t>=48&&t<=57||t===45||t===95||t===46||t===126))return!1}return!0}function I(e){if(e==null)return"";if(typeof e=="number")return String(e);if(e===!0)return"true";if(e===!1)return"false";let n=String(e);return n===""?"":_(n)?n:encodeURIComponent(n).replace(/%20/g,"+")}function F(e){return _(e)?e:encodeURIComponent(e).replace(/%20/g,"+")}function be(e){if(!e.includes("%")&&!e.includes("+"))return e;try{return decodeURIComponent(e.replace(/\+/g," "))}catch{return e}}var Ke=Object.freeze(Object.create(null)),We="",Be=Ke;function zt(e){if(!e||e==="?"||e==="")return Ke;if(e===We)return Be;let n=Object.create(null),u=e.charCodeAt(0)===63?1:0,t=e.length,a=u,r=-1,o=!1,p=!1;for(let y=u;y<=t;y++){let d=y===t?38:e.charCodeAt(y);if(d===61&&r===-1)r=y+1;else if(d===38){if(y>a){let c,h;if(r===-1){let v=e.slice(a,y);c=o?be(v):v,h=""}else{let v=e.slice(a,r-1),w=e.slice(r,y);c=o?be(v):v,h=p?be(w):w}let m=n[c];m===void 0?n[c]=h:Array.isArray(m)?m.push(h):n[c]=[m,h]}a=y+1,r=-1,o=!1,p=!1}else(d===37||d===43)&&(r===-1?o=!0:p=!0)}for(let y of Object.keys(n)){let f=n[y];Array.isArray(f)&&Object.freeze(f)}let s=Object.freeze(n);return We=e,Be=s,s}function Ct(e){if(e[0]>e[1]){let n=e[0];e[0]=e[1],e[1]=n}if(e[1]>e[2]){let n=e[1];e[1]=e[2],e[2]=n}if(e[0]>e[1]){let n=e[0];e[0]=e[1],e[1]=n}}function $t(e){if(e[0]>e[1]){let n=e[0];e[0]=e[1],e[1]=n}if(e[2]>e[3]){let n=e[2];e[2]=e[3],e[3]=n}if(e[0]>e[2]){let n=e[0];e[0]=e[2],e[2]=n}if(e[1]>e[3]){let n=e[1];e[1]=e[3],e[3]=n}if(e[1]>e[2]){let n=e[1];e[1]=e[2],e[2]=n}}function jt(e){let n=e.length;for(let u=1;u<n;u++){let t=e[u],a=u-1;for(;a>=0&&e[a]>t;)e[a+1]=e[a],a--;e[a+1]=t}}var J,Z="";function Pe(e){if(e===void 0)return!0;if(!Object.isFrozen(e))return!1;for(let n of Object.values(e))if(Array.isArray(n)&&!Object.isFrozen(n))return!1;return!0}function ue(e){if(e===void 0)return"";let n=Pe(e);if(n&&e===J)return Z;let u=e,t=Object.keys(u),a=t.length;if(a===0)return"";let r="";if(a===1){let o=t[0],p=u[o];if(p==null)return"";let s=_(o)?o:F(o);if(!Array.isArray(p))r=`?${s}=${I(p)}`;else if(p.length>0)for(let y=0;y<p.length;y++){let f=p[y];f!=null&&(r+=(r===""?"?":"&")+s+"="+I(f))}return n&&(J=e,Z=r),r}if(a===2){let o=t[0],p=t[1],s=o<p?o:p,y=o<p?p:o,f=u[s],d=u[y];if(!Array.isArray(f)&&!Array.isArray(d)&&f!=null&&d!=null){let h=_(s)?s:F(s),m=_(y)?y:F(y);return r=`?${h}=${I(f)}&${m}=${I(d)}`,n&&(J=e,Z=r),r}let c=[s,y];for(let h=0;h<2;h++){let m=c[h],v=u[m];if(v==null)continue;let w=_(m)?m:F(m);if(Array.isArray(v))for(let E=0;E<v.length;E++){let L=v[E];L!=null&&(r+=(r===""?"?":"&")+w+"="+I(L))}else r+=(r===""?"?":"&")+w+"="+I(v)}return n&&(J=e,Z=r),r}a===3?Ct(t):a===4?$t(t):a<=8?jt(t):t.sort();for(let o=0;o<a;o++){let p=t[o],s=u[p];if(s==null)continue;let y=_(p)?p:F(p);if(Array.isArray(s))for(let f=0;f<s.length;f++){let d=s[f];d!=null&&(r+=(r===""?"?":"&")+y+"="+I(d))}else r+=(r===""?"?":"&")+y+"="+I(s)}return n&&(J=e,Z=r),r}var Oe=/^:([A-Za-z_$][A-Za-z0-9_$]*)$/,Te=4096,Ne=Object.freeze(Object.create(null)),X=new Map,ee=new Map;function At(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function U(e){return e.split("/").filter(Boolean)}function Me(e){return U(O(e))}function Le(e){return e==="*"?1:Oe.test(e)?2:3}var Ee="",ke="",Ge=Object.create(null),Ye=0;function $(e){if(e==="/"||e==="")return"/";if(e===Ee)return ke;let n=Ge[e];if(n!==void 0)return Ee=e,ke=n,n;let u=e.length,t;if(e.charCodeAt(0)===47&&e.charCodeAt(u-1)!==47&&!e.includes("?")&&!e.includes("#")&&!e.includes("//"))t=e;else{let[a=""]=e.split(/[?#]/,1),r=a.replace(/^\/+|\/+$/g,"");t=r===""?"/":`/${r}`}return Ye<Te&&(Ge[e]=t,Ye++),Ee=e,ke=t,t}var xe="http://memoized-dom.relative";function ze(e,n){let u=new URL(e,xe);if(u.origin!==xe)throw new TypeError(`Relative route base '${e}' must be same-origin`);let t;if(n==="")t=u;else if(n.startsWith("?")||n.startsWith("#"))t=new URL(n,u);else{let a=new URL(u.href);a.search="",a.hash="",a.pathname.endsWith("/")||(a.pathname+="/"),t=new URL(n,a)}if(t.origin!==xe)throw new TypeError(`Relative route destination '${n}' must be same-origin`);return`${$(t.pathname)}${t.search}${t.hash}`}var Fe="",Je="",Ze="";function at(e,n){if(e===Fe&&n===Je)return Ze;let u=O(e),t=O(n),a;return t==="/"?a=u:u==="/"?a=t:a=O(`${u}${t}`),Fe=e,Je=n,Ze=a,a}function O(e){let n=ee.get(e);if(n!==void 0)return n;if(e.includes("?")||e.includes("#"))throw new TypeError(`Route pattern '${e}' must not contain a query or hash`);if(e.includes("//"))throw new TypeError(`Route pattern '${e}' contains an empty path segment`);let u=$(e),t=new Set,a=U(u);for(let r=0;r<a.length;r++){let o=a[r];if(o==="*"){if(r!==a.length-1)throw new TypeError(`Route wildcard must be terminal in '${e}'`);continue}if(!o.startsWith(":"))continue;let p=Oe.exec(o);if(p===null)throw new TypeError(`Invalid route parameter segment '${o}' in '${e}'`);let s=p[1];if(t.has(s))throw new TypeError(`Duplicate route parameter '${s}' in '${e}'`);t.add(s)}if(ee.size>=Te){let r=ee.keys().next().value;r!==void 0&&ee.delete(r)}return ee.set(e,u),u}function Wt(e){let n=new Set,u=new Map;for(let t of e){if(n.has(t.id))throw new TypeError(`Duplicate route ID '${t.id}'`);n.add(t.id);let r=O(t.pattern).split("/").map(p=>p==="*"?"*":p.startsWith(":")?":param":p).join("/"),o=u.get(r);if(o!==void 0&&o!==t.id)throw new TypeError(`Ambiguous routes '${o}' and '${t.id}' share pattern signature '${r}'`);u.set(r,t.id)}}function it(e){let n=O(e),u=X.get(n);if(u!==void 0)return u;let t=[],a=[],r=U(n),o="";for(let d of r){if(d==="*"){t.push("*"),a.push({kind:"wildcard"}),o+="(?:/(.*))?";continue}let c=Oe.exec(d);if(c!==null){let h=c[1];t.push(h),a.push({kind:"param",name:h}),o+="/([^/]+)";continue}a.push({kind:"static",text:`/${d}`}),o+=`/${At(d)}`}r.length===0&&(o="/");let p=o==="/"?"":o,s=t.length===0&&!n.includes("*")&&!n.includes(":"),y=Object.freeze({pattern:n,pathname:n,params:Ne,consumed:n,remaining:"/"}),f={pattern:n,keys:t,chunks:a,isStatic:s,end:new RegExp(`^${p||"/"}/*$`),prefix:new RegExp(`^${p||""}(?=/|$)`),exactMatch:y};if(X.size>=Te){let d=X.keys().next().value;d!==void 0&&X.delete(d)}return X.set(n,f),f}function le(e){if(!e.includes("%"))return e;try{return decodeURIComponent(e)}catch{return e}}function st(e,n,u={}){let t=it(e),a=$(n),r=u.end??!0;if(t.lastPath===a&&t.lastEnd===r)return t.lastResult;let o=null;if(t.isStatic){if(r)a===t.pattern&&(o=t.exactMatch);else if(t.pattern==="/"||a===t.pattern||a.startsWith(`${t.pattern}/`)){let p=t.pattern==="/"?a:a.slice(t.pattern.length);o={pattern:t.pattern,pathname:a,params:Ne,consumed:t.pattern,remaining:p===""||p==="/"?"/":$(p)}}}else{let s=(r?t.end:t.prefix).exec(a);if(s!==null){let y;if(t.keys.length===0)y=Ne;else{let c={};for(let h=0;h<t.keys.length;h++){let m=s[h+1];m!==void 0&&(c[t.keys[h]]=le(m))}y=Object.freeze(c)}let f=s[0]===""?"/":s[0],d=a.slice(s[0].length);o={pattern:t.pattern,pathname:a,params:y,consumed:f,remaining:d===""?"/":$(d)}}}return t.lastPath=a,t.lastEnd=r,t.lastResult=o,o}function Xe(e,n){if(e==="."||e==="..")throw new TypeError(`Route parameter '${n}' must not be a dot segment`);let u=e.length;for(let t=0;t<u;t++){let a=e.charCodeAt(t);if(!(a>=97&&a<=122||a>=65&&a<=90||a>=48&&a<=57||a===45||a===95||a===46))return encodeURIComponent(e)}return e}var et,tt,nt,rt,ot="";function te(e,n,u,t){let a=(n===void 0||Object.isFrozen(n))&&Pe(u);if(a&&e===et&&n===tt&&u===nt&&t===rt)return ot;let r;if(n===void 0&&u===void 0&&t===void 0&&!e.includes(":")&&!e.includes("*"))r=$(e);else{let o=it(e);if(o.isStatic){let p=ue(u),s=t===void 0||t===""?"":t.startsWith("#")?t:`#${t}`;r=`${o.pattern}${p}${s}`}else{let p=n,s="";for(let d=0;d<o.chunks.length;d++){let c=o.chunks[d];if(c.kind==="static")s+=c.text;else if(c.kind==="param"){let h=p?.[c.name];if(h===void 0)throw new TypeError(`Missing route parameter '${c.name}' for '${e}'`);s+=`/${Xe(String(h),c.name)}`}else{let h=p?.["*"];if(h===void 0)throw new TypeError(`Missing route parameter '*' for '${e}'`);let v=String(h).split("/");if(v.some(w=>w===""||w==="."||w===".."))throw new TypeError("Route wildcard '*' contains an invalid path segment");for(let w=0;w<v.length;w++)s+=`/${Xe(v[w],"*")}`}}s===""&&(s="/");let y=ue(u),f=t===void 0||t===""?"":t.startsWith("#")?t:`#${t}`;r=`${s}${y}${f}`}}return a&&(et=e,tt=n,nt=u,rt=t,ot=r),r}function Bt(e){let n=1;for(let u of Me(e))n=n*4+Le(u);return n}function Kt(e,n){let u=Me(e),t=Me(n),a=Math.max(u.length,t.length);for(let r=0;r<a;r++){let o=u[r],p=t[r];if(o===void 0)return 1;if(p===void 0)return-1;if(o!==p)return Le(p)-Le(o)}return 0}var Ce=Object.freeze(Object.create(null)),ut=Object.freeze({"*":""}),It=Object.freeze([]);function Se(e){let n={};for(let r=0;r<e.length;r++){let o=e[r],p=typeof o=="string"?{id:o,pattern:o}:o,s=O(p.pattern),y=U(s),f=[],d=n;for(let c=0;c<y.length;c++){let h=y[c];if(h==="*"){d.wildcardChild={id:p.id,pattern:s};break}if(h.startsWith(":")){let m=h.slice(1);f.push(m),d.paramChild===void 0&&(d.paramChild={name:m,node:{}}),d=d.paramChild.node}else{d.staticChildren===void 0&&(d.staticChildren=new Map);let m=d.staticChildren.get(h);m===void 0&&(m={},d.staticChildren.set(h,m)),d=m}}if(!s.endsWith("/*")){let c=Object.freeze([...f]);d.match={id:p.id,pattern:s,paramNames:c},c.length===0&&(d.staticMatch=Object.freeze({id:p.id,pattern:s,pathname:s,params:Ce}))}}function u(r,o,p,s,y){if(p===o.length){if(r.staticMatch!==void 0&&y===r.staticMatch.pathname)return r.staticMatch;if(r.match!==void 0){if(r.match.paramNames.length===0)return{id:r.match.id,pattern:r.match.pattern,pathname:y,params:Ce};let d={};for(let c=0;c<r.match.paramNames.length;c++)d[r.match.paramNames[c]]=le(s[c]);return{id:r.match.id,pattern:r.match.pattern,pathname:y,params:Object.freeze(d)}}return r.wildcardChild!==void 0?{id:r.wildcardChild.id,pattern:r.wildcardChild.pattern,pathname:y,params:ut}:null}let f=o[p];if(r.staticChildren!==void 0){let d=r.staticChildren.get(f);if(d!==void 0){let c=u(d,o,p+1,s,y);if(c!==null)return c}}if(r.paramChild!==void 0){s.push(f);let d=u(r.paramChild.node,o,p+1,s,y);if(d!==null)return d;s.pop()}if(r.wildcardChild!==void 0){let d={"*":le(o.slice(p).join("/"))};return{id:r.wildcardChild.id,pattern:r.wildcardChild.pattern,pathname:y,params:Object.freeze(d)}}return null}let t="\0",a=null;return{match(r){if(r===t)return a;let o=$(r);if(o===t)return a;if(o==="/"){let c=null;return n.staticMatch!==void 0?c=n.staticMatch:n.match!==void 0?c={id:n.match.id,pattern:n.match.pattern,pathname:"/",params:Ce}:n.wildcardChild!==void 0&&(c={id:n.wildcardChild.id,pattern:n.wildcardChild.pattern,pathname:"/",params:ut}),t=r,a=c,c}let p=[],s=1,y=o.length;for(let c=1;c<=y;c++)(c===y||o.charCodeAt(c)===47)&&(c>s&&p.push(o.slice(s,c)),s=c+1);let d=u(n,p,0,[],o);return t=r,a=d,d},resolve(r){let o=this.match(r.pathname);return o===null?It:[o]}}}var Ut=Object.freeze([]);function Ht(e){return U(e).map(n=>n==="*"?"*":n.startsWith(":")?":param":n).join("/")}function $e(e){let n=[];for(let u of U(e))u==="*"?n.push("*"):u.startsWith(":")&&n.push(u.slice(1));return Object.freeze(n)}function lt(e,n){let u=n.parent;for(;u!==null;){if(u===e)return!0;u=u.parent}return!1}function ct(e){let n=new Map;for(let f of e){let d=typeof f=="string"?{id:f,pattern:f}:f;if(d.id.trim()==="")throw new TypeError("Route IDs must not be empty");if(n.has(d.id))throw new TypeError(`Duplicate route ID '${d.id}'`);n.set(d.id,d)}let u=new Map,t=new Set;function a(f){let d=u.get(f);if(d!==void 0)return d;let c=n.get(f);if(c===void 0)throw new TypeError(`Unknown route ID '${f}'`);if(t.has(f))throw new TypeError(`Route parent cycle includes '${f}'`);t.add(f);try{let h=O(c.pattern),m=null,v=h,w=0;if(c.parentId!==void 0){if(!n.has(c.parentId))throw new TypeError(`Route '${f}' references missing parent '${c.parentId}'`);m=a(c.parentId);let L=new Set($e(m.fullPattern));for(let k of $e(h))if(L.has(k))throw new TypeError(`Route '${f}' shadows active parameter '${k}'`);v=at(m.fullPattern,h),w=m.depth+1}let E=Object.freeze({id:c.id,pattern:h,parentId:c.parentId,metadata:c.metadata,fullPattern:v,depth:w,ownParamNames:$e(h),parent:m});return u.set(f,E),E}finally{t.delete(f)}}for(let f of n.keys())a(f);let r=[...u.values()].sort((f,d)=>f.depth-d.depth),o=new Map;for(let f of r){let d=Ht(f.fullPattern),c=o.get(d);if(c!==void 0&&!lt(c,f)&&!lt(f,c))throw new TypeError(`Ambiguous routes '${c.id}' and '${f.id}' share pattern signature '${d}'`);o.set(d,f);let h=new Set,m=[],v=f;for(;v!==null;)m.push(v),v=v.parent;for(let w=m.length-1;w>=0;w--)for(let E of m[w].ownParamNames){if(h.has(E))throw new TypeError(`Route '${f.id}' shadows active parameter '${E}'`);h.add(E)}}let p=Se(r.map(f=>({id:f.id,pattern:f.fullPattern}))),s=Object.freeze(r.map(f=>Object.freeze({id:f.id,pattern:f.pattern,parentId:f.parentId,metadata:f.metadata,fullPattern:f.fullPattern,depth:f.depth})));function y(f){let d=p.match(f);if(d===null)return Ut;let c=u.get(d.id),h=[],m=c;for(;m!==null;)h.push(m),m=m.parent;h.reverse();let v=new Array(h.length);for(let w=0;w<h.length;w++){let E=h[w],L=st(E.fullPattern,f,{end:w===h.length-1});if(L===null)throw new Error(`Resolved route '${E.id}' did not match '${f}'`);let k={};for(let N of E.ownParamNames){let x=L.params[N];x!==void 0&&(k[N]=x)}v[w]=Object.freeze({id:E.id,pattern:E.pattern,pathname:L.consumed,params:Object.freeze(k),metadata:E.metadata})}return Object.freeze(v)}return Object.freeze({entries:s,get(f){return s.find(d=>d.id===f)},match(f){return y(f).at(-1)??null},matchAll:y,resolve(f){return y(f.pathname)},build(f,d={}){let c=u.get(f);if(c===void 0)throw new TypeError(`Unknown route ID '${f}'`);return te(c.fullPattern,d.params,d.query,d.hash)}})}var ne=class extends Error{cause;constructor(n){super("A route observer failed after the history update committed"),this.name="RouteHistoryCommittedUpdateError",this.cause=n}};function je(e,n){throw e instanceof ne?e.cause:(n(),e)}var Qt="http://memoized-dom.local";function Vt(e){return typeof e=="string"||e instanceof URL?{href:e}:e}function nn(e={}){let n=new URL(e.origin??Qt),u=e.initialEntries??["/"];if(u.length===0)throw new TypeError("Memory route history requires at least one initial entry");let t=0,a=(c,h,m)=>{let v=Vt(c);return Object.freeze({key:m??`memory-${t++}`,index:h,href:new URL(v.href,n).href,state:v.state??null})},r=u.map((c,h)=>a(c,h)),o=e.initialIndex??r.length-1;if(!Number.isInteger(o)||o<0||o>=r.length)throw new RangeError(`Memory route history initialIndex ${o} is outside 0..${r.length-1}`);let p=!1,s=new Set;function y(){if(p)throw new Error("Cannot use a destroyed memory route history")}function f(c){let h=Object.freeze({action:c,location:r[o]}),m=[];for(let v of[...s])if(s.has(v))try{v(h)}catch(w){m.push(w)}if(m.length===1)throw m[0];if(m.length>1)throw new AggregateError(m,"Route history listeners failed")}function d(c){if(y(),!Number.isInteger(c))throw new TypeError("Memory route history delta must be an integer");let h=o+c;if(h<0||h>=r.length||h===o)return;let m=o;o=h;try{f("pop")}catch(v){je(v,()=>{o=m})}}return{get location(){return r[o]},get canGoBack(){return o>0},get canGoForward(){return o<r.length-1},peek(c){if(y(),!Number.isInteger(c))throw new TypeError("Memory route history delta must be an integer");return r[o+c]},push(c,h=null){y();let m=r,v=o,w=o+1;r=r.slice(0,w),r.push(a({href:c,state:h},w)),o=w;try{f("push")}catch(E){je(E,()=>{r=m,o=v})}},replace(c,h=null){y();let m=r[o];r[o]=a({href:c,state:h},o,r[o].key);try{f("replace")}catch(v){je(v,()=>{r[o]=m})}},go:d,back(){d(-1)},forward(){d(1)},subscribe(c){return y(),s.add(c),()=>s.delete(c)},destroy(){p||(p=!0,s.clear())}}}var ce="http://memoized-dom.local";function dt(e=typeof window>"u"?{}:window){return e.navigation!==void 0}function _t(e){let n=e.location?.href;return new URL(n??"/",n??ce)}function ft(e){return Object.freeze({...e,params:Object.freeze({...e.params})})}var ht=new WeakMap,Ue=class{_search;constructor(n){this._search=n}_ensure(){let n=ht.get(this);return n===void 0&&(n=new URLSearchParams(this._search),ht.set(this,n)),n}get size(){return this._ensure().size}get(n){return this._ensure().get(n)}getAll(n){return this._ensure().getAll(n)}has(n,u){return this._ensure().has(n,u)}entries(){return this._ensure().entries()}keys(){return this._ensure().keys()}values(){return this._ensure().values()}forEach(n,u){this._ensure().forEach((a,r)=>n.call(u,a,r,this))}toString(){return this._search.startsWith("?")?this._search.slice(1):this._search}[Symbol.iterator](){return this._ensure()[Symbol.iterator]()}};function pt(e){return Object.freeze(new Ue(e))}function Ae(e){let n=e.length;if(n===0)return{matches:Object.freeze([]),params:Object.freeze({})};if(n===1){let r=e[0];if(r.id.trim()==="")throw new TypeError("Route match IDs must not be empty");let o=O(r.pattern),p={};for(let s in r.params)p[s]=r.params[s];return{matches:Object.freeze([ft({...r,pattern:o})]),params:Object.freeze(p)}}let u=new Set,t={},a=new Array(n);for(let r=0;r<n;r++){let o=e[r];if(o.id.trim()==="")throw new TypeError("Route match IDs must not be empty");if(u.has(o.id))throw new TypeError(`Duplicate active route ID '${o.id}'`);u.add(o.id);let p=O(o.pattern);for(let s in o.params){if(Object.hasOwn(t,s))throw new TypeError(`Duplicate active route parameter '${s}'`);t[s]=o.params[s]}a[r]=ft({...o,pattern:p})}return{matches:Object.freeze(a),params:Object.freeze(t)}}function Ie(e,n){return e.length!==n.length?!1:e.every((u,t)=>{let a=n[t];if(a===void 0||u.id!==a.id||u.pattern!==a.pattern||u.pathname!==a.pathname)return!1;let r=Object.keys(u.params);return r.length===Object.keys(a.params).length&&r.every(o=>u.params[o]===a.params[o])})}function gt(e=typeof window>"u"?{}:window){let u=typeof e=="object"&&e!==null&&("routes"in e||"resolver"in e||"environment"in e||"routeHistory"in e||"basePath"in e)?e:{environment:e},t=u.environment??(typeof window>"u"?{}:window),a=u.routeHistory,r=O(u.basePath??"/");if(r.includes(":")||r.includes("*"))throw new TypeError("Route runtime basePath must be static");function o(i){let l=$(i);return r==="/"?l:l===r?"/":l.startsWith(`${r}/`)?l.slice(r.length):null}function p(i){let l=new URL(i,ce);if(l.origin!==ce)throw new TypeError(`Route destination '${i}' must be application-relative`);let g=$(l.pathname),R=r==="/"?g:g==="/"?r:`${r}${g}`;return new URL(`${R}${l.search}${l.hash}`,s)}let s=a===void 0?_t(t):new URL(a.location.href,ce),y=o(s.pathname);if(y===null)throw new TypeError(`Initial URL pathname '${s.pathname}' is outside router basePath '${r}'`);let f=y,d=a?.location.state??t.history?.state??null,c="load",h=Object.freeze([]),m=Object.freeze({}),v=pt(s.search),w=new AbortController,E=!1,L=0,k=!1,N=u.resolver??null;if(N===null&&u.routes!==void 0){let i=ct(u.routes);N=i.resolve.bind(i)}let x=!1,T=!1,W=0,B=0,de=0,mt=0,fe=0,he=!1,K=!1,A=new Set,H=new Set,G=new Set,Y=new Set,pe=null,M=Object.freeze({get href(){return s.href},get pathname(){return f},get search(){return s.search},get query(){return v},get hash(){return s.hash},get state(){return d},get navigationType(){return c},get params(){return m},get matches(){return h},get matched(){return h.at(-1)??null},get signal(){return E=!0,w.signal}});function ge(){return Object.freeze({href:M.href,pathname:M.pathname,search:M.search,query:M.query,hash:M.hash,state:M.state,navigationType:M.navigationType,params:M.params,matches:M.matches,matched:M.matched,signal:M.signal})}function yt(){return Object.freeze({href:s.href,pathname:f,search:s.search,query:v,hash:s.hash,state:d,navigationType:c,get signal(){return E=!0,w.signal}})}function D(){if(W++,A.size===0&&H.size===0)return;if(he){K=!0;return}he=!0;let i=[];try{do{K=!1;let l=W;if(A.size!==0){let g=ge();for(let R of[...A])if(A.has(R)){try{R(g)}catch(b){i.push(b)}if(W!==l){K=!0;break}}}if(W===l){for(let g of[...H])if(H.has(g)){try{let R=g.selector(M);g.equals(g.value,R)||(g.value=R,g.listener(R,M))}catch(R){i.push(R)}if(W!==l){K=!0;break}}}}while(K)}finally{he=!1}if(i.length===1)throw i[0];if(i.length>1)throw new AggregateError(i,"Route listeners failed")}function re(i){if(x)throw new Error("Route resolvers must not mutate router state");x=!0;try{return Ae(i(yt()))}finally{x=!1}}if(N!==null){let i=re(N);h=i.matches,m=i.params}function z(i,l="replace",g=null,R=!1){if(k)throw new Error("Cannot set location on a disposed route runtime");if(x||T)throw new Error("Route resolvers and blockers must not mutate router state");let b=typeof i=="string"?new URL(i,s):i,P=o(b.pathname);if(P===null)throw new TypeError(`URL pathname '${b.pathname}' is outside router basePath '${r}'`);if(!(b.href!==s.href||!Object.is(g,d)))return;let oe=s,V=f,j=d,ae=c,ie=v,S=w,q=E;q&&(w=new AbortController,E=!1),s=b,f=P,d=g,c=l,v=pt(s.search);let we;try{we=N===null?Ae([]):re(N)}catch(se){throw s=oe,f=V,d=j,c=ae,v=ie,q&&(w.abort(),w=S,E=q),se}h=we.matches,m=we.params,q&&S.abort(),B++;try{D()}catch(se){throw R?new ne(se):se}}a!==void 0&&(pe=a.subscribe(i=>{z(i.location.href,i.action,i.location.state,!0)}));function He(i,l){if(i.origin!==s.origin)throw new TypeError(`Route destination '${i.href}' must be same-origin`);let g=o(i.pathname);if(g===null)throw new TypeError(`URL pathname '${i.pathname}' is outside router basePath '${r}'`);return Object.freeze({href:i.href,pathname:g,search:i.search,hash:i.hash,state:l})}function Rt(i,l,g,R,b=R.replace?"replace":"push"){return Object.freeze({id:i,from:l,to:He(g,R.state??null),type:b})}function Q(i){let l=[];for(let g of[...Y])if(Y.has(g))try{g(i)}catch(R){l.push(R)}if(l.length===1)throw l[0];if(l.length>1)throw new AggregateError(l,"Route navigation listeners failed")}function me(i,l,g=l.replace?"replace":"push"){let R=++mt,b=He(s,d),P=i,C=l,oe=g,V=0;for(;;){let j=Rt(R,b,P,C,oe);V===0&&Q(Object.freeze({phase:"start",navigation:j}));let ae=!1;T=!0;try{for(let ie of[...G]){if(!G.has(ie))continue;let S=ie(j);if(typeof S=="object"&&S!==null&&"then"in S)throw new TypeError("Route navigation blockers must be synchronous; async work belongs to the data boundary");if(S===!1)return Q(Object.freeze({phase:"blocked",navigation:j})),Object.freeze({status:"blocked",navigation:j,redirects:V});if(typeof S=="object"&&S!==null&&"to"in S){if(V++,V>16)throw new Error("Route navigation exceeded 16 redirects");if(Q(Object.freeze({phase:"redirect",navigation:j,redirect:S})),S.to instanceof URL)P=new URL(S.to.href);else{let q=ze(j.to.pathname,S.to);P=p(q)}C={replace:S.replace??C.replace,state:S.state??null},oe=C.replace?"replace":"push",ae=!0;break}}}finally{T=!1}if(!ae)return{status:"ready",next:P,options:C,navigation:j,redirects:V}}}let Qe=()=>{let i=t.location;i!==void 0&&o(new URL(i.href).pathname)!==null&&z(i.href,"pop",t.history?.state??null)},Ve=()=>{let i=t.location;i!==void 0&&i.href!==s.href&&o(new URL(i.href).pathname)!==null&&z(i.href,"pop",t.history?.state??null)},_e=i=>{let l=i;if(l.defaultPrevented||l.button!==0||l.metaKey||l.ctrlKey||l.shiftKey||l.altKey)return;let g=l.composedPath().find(C=>C instanceof HTMLAnchorElement&&C.hasAttribute("href")),R=l.target,b=g??(R instanceof Element?R.closest("a[href]"):null);if(b===null||b.hasAttribute("download")||b.target!==""&&b.target.toLowerCase()!=="_self"||b.relList.contains("external"))return;let P=new URL(b.href,s);P.origin!==s.origin||o(P.pathname)===null||P.protocol!=="http:"&&P.protocol!=="https:"||P.pathname===s.pathname&&P.search===s.search&&P.hash!==s.hash||(l.preventDefault(),ve(P,{state:null}))},De=i=>{de++;let l=i;if(!l.canIntercept||l.downloadRequest!==null&&l.downloadRequest!==void 0)return;let g=new URL(l.destination.url,s);if(g.origin!==s.origin||o(g.pathname)===null)return;let R=l.navigationType==="traverse"?"pop":l.navigationType==="push"?"push":"replace",b=l.destination.getState?.()??null;if(fe===0){let P=me(g,{replace:R!=="push",state:b},R);if(P.status==="blocked"){l.preventDefault();return}if(P.next.href!==g.href){l.preventDefault(),Re(P.next,P.options),Q(Object.freeze({phase:"complete",navigation:P.navigation}));return}z(g,R,b),Q(Object.freeze({phase:"complete",navigation:P.navigation})),l.hashChange||l.intercept({scroll:"after-transition",async handler(){await Promise.resolve()}});return}if(l.hashChange){z(g,R,b);return}z(g,R,b),l.intercept({scroll:"after-transition",async handler(){await Promise.resolve()}})};function ye(){if(x)throw new Error("Route resolvers must not mutate router state");L!==0&&(L--,L===0&&a===void 0&&(dt(t)?t.navigation.removeEventListener("navigate",De):(t.removeEventListener?.("popstate",Qe),t.removeEventListener?.("hashchange",Ve),t.removeEventListener?.("click",_e))))}function vt(){if(k)throw new Error("Cannot connect a disposed route runtime");if(x)throw new Error("Route resolvers must not mutate router state");L++;try{L===1&&(a!==void 0||(dt(t)?t.navigation.addEventListener("navigate",De):(t.addEventListener?.("popstate",Qe),t.addEventListener?.("hashchange",Ve),t.addEventListener?.("click",_e))),a===void 0&&t.location!==void 0&&o(new URL(t.location.href).pathname)!==null&&z(t.location.href,"replace",t.history?.state??null))}catch(l){throw ye(),l}let i=!0;return()=>{i&&(i=!1,ye())}}function wt(i){if(k)throw new Error("Cannot subscribe to a disposed route runtime");if(x)throw new Error("Route resolvers must not mutate router state");A.add(i);try{i(ge())}catch(l){throw A.delete(i),l}return()=>A.delete(i)}function bt(i,l,g=Object.is){if(k)throw new Error("Cannot subscribe to a disposed route runtime");if(x||T)throw new Error("Route resolvers and blockers must not mutate router state");let R={selector:i,listener:l,equals:g,value:i(M)};H.add(R);try{l(R.value,M)}catch(b){throw H.delete(R),b}return()=>H.delete(R)}function Pt(i){if(k)throw new Error("Cannot install a blocker on a disposed route runtime");if(x||T)throw new Error("Route resolvers and blockers must not mutate router state");return G.add(i),()=>G.delete(i)}function Et(i){if(k)throw new Error("Cannot subscribe to a disposed route runtime");if(x||T)throw new Error("Route resolvers and blockers must not mutate router state");return Y.add(i),()=>Y.delete(i)}function kt(i){if(k)throw new Error("Cannot install a resolver on a disposed route runtime");if(T)throw new Error("Route blockers must not mutate router state");if(N!==null)throw new Error("A route runtime can only have one structural resolver");let l=re(i);N=i,Ie(h,l.matches)||(h=l.matches,m=l.params,D());let g=!0;return()=>{if(g){if(x)throw new Error("Route resolvers must not mutate router state");g=!1,N===i&&(N=null,!(k||h.length===0)&&(h=Object.freeze([]),m=Object.freeze({}),D()))}}}function xt(i){if(k)throw new Error("Cannot replace a resolver on a disposed route runtime");if(x||T)throw new Error("Route resolvers and blockers must not mutate router state");let l=re(i);N=i,Ie(h,l.matches)||(h=l.matches,m=l.params,D());let g=!0;return()=>{if(g){if(x)throw new Error("Route resolvers must not mutate router state");g=!1,N===i&&(N=null,!(k||h.length===0)&&(h=Object.freeze([]),m=Object.freeze({}),D()))}}}function Nt(i){if(k)throw new Error("Cannot set matches on a disposed route runtime");if(x)throw new Error("Route resolvers must not mutate router state");if(N!==null)throw new Error("Cannot set matches while a structural resolver is installed");let l=Ae(i);Ie(h,l.matches)||(h=l.matches,m=l.params,D())}function Mt(i,...l){if(k)throw new Error("Cannot navigate with a disposed route runtime");if(x)throw new Error("Route resolvers must not mutate router state");let g=l[0]??{},R=te(i,g.params,g.query,g.hash),b=p(R);return ve(b,g)}function Lt(i,...l){if(k)throw new Error("Cannot navigate with a disposed route runtime");if(x||T)throw new Error("Route resolvers and blockers must not mutate router state");let g=l[0]??{},R;(i.startsWith("?")||i.startsWith("#")||i==="")&&g.params===void 0&&g.query===void 0&&g.hash===void 0?R=i:(R=te(i,g.params,g.query,g.hash),i.startsWith("/")||(R=R.slice(1)));let b=ze(g.from??M.pathname,R);return ve(p(b),g)}function Re(i,l){if(a!==void 0){let b=B;l.replace?a.replace(i,l.state??null):a.push(i,l.state??null),B===b&&z(i,l.replace?"replace":"push",l.state??null);return}let g=t.navigation;if(g!==void 0){let b=B,P=de;fe++;try{g.navigate(i.href,{history:l.replace?"replace":"push",state:l.state??null})}finally{fe--}de===P&&B===b&&z(i,l.replace?"replace":"push",l.state??null);return}let R=t.history;R!==void 0&&(l.replace?R.replaceState(l.state??null,"",i):R.pushState(l.state??null,"",i)),z(i,l.replace?"replace":"push",l.state??null)}function ve(i,l){if(k)throw new Error("Cannot navigate with a disposed route runtime");if(x||T)throw new Error("Route resolvers and blockers must not mutate router state");let g=me(i,l);if(g.status==="blocked")return g;let{next:R,options:b,navigation:P,redirects:C}=g;return Re(R,b),Q(Object.freeze({phase:"complete",navigation:P})),Object.freeze({status:"completed",navigation:P,redirects:C})}function qe(i){if(a===void 0)return null;let l=a.peek(i);if(l===void 0)return null;let g=new URL(l.href,s),R=me(g,{replace:!0,state:l.state},"pop");return R.status==="blocked"?R:(R.navigation.type==="pop"&&R.next.href===g.href?a.go(i):Re(R.next,R.options),Q(Object.freeze({phase:"complete",navigation:R.navigation})),Object.freeze({status:"completed",navigation:R.navigation,redirects:R.redirects}))}function St(){if(k)throw new Error("Cannot navigate with a disposed route runtime");if(x||T)throw new Error("Route resolvers and blockers must not mutate router state");return a!==void 0?qe(-1):(t.navigation!==void 0?t.navigation.back():t.history?.back(),null)}function Ot(){if(k)throw new Error("Cannot navigate with a disposed route runtime");if(x||T)throw new Error("Route resolvers and blockers must not mutate router state");return a!==void 0?qe(1):(t.navigation!==void 0?t.navigation.forward():t.history?.forward(),null)}function Tt(){if(!k){if(x||T)throw new Error("Route resolvers and blockers must not mutate router state");for(;L>0;)ye();pe?.(),pe=null,k=!0,w.abort(),A.clear(),H.clear(),G.clear(),Y.clear(),N=null,h=Object.freeze([]),m=Object.freeze({})}}return{route:M,snapshot:ge,subscribe:wt,subscribeSelected:bt,subscribeNavigation:Et,blockNavigation:Pt,connect:vt,installResolver:kt,replaceResolver:xt,navigate:Mt,navigateRelative:Lt,back:St,forward:Ot,setLocation:z,setMatches:Nt,dispose:Tt}}var cn=gt();function fn(e,n={}){return Object.freeze({to:e,...n})}export{zt as a,ue as b,Se as c,$ as d,ze as e,at as f,O as g,Wt as h,st as i,te as j,Bt as k,Kt as l,ct as m,nn as n,dt as o,gt as p,cn as q,fn as r};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-runtime.d.ts","sourceRoot":"","sources":["../src/default-runtime.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,kCAAuB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export type RouteHistoryAction = 'push' | 'replace' | 'pop';
|
|
2
|
+
export interface RouteHistoryLocation {
|
|
3
|
+
readonly key: string;
|
|
4
|
+
readonly index: number;
|
|
5
|
+
readonly href: string;
|
|
6
|
+
readonly state: unknown;
|
|
7
|
+
}
|
|
8
|
+
export interface RouteHistoryUpdate {
|
|
9
|
+
readonly action: RouteHistoryAction;
|
|
10
|
+
readonly location: RouteHistoryLocation;
|
|
11
|
+
}
|
|
12
|
+
export type RouteHistoryListener = (update: RouteHistoryUpdate) => void;
|
|
13
|
+
/** @internal Marks an observer error that happened after router state committed. */
|
|
14
|
+
export declare class RouteHistoryCommittedUpdateError extends Error {
|
|
15
|
+
readonly cause: unknown;
|
|
16
|
+
constructor(cause: unknown);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Synchronous storage boundary consumed by the route runtime.
|
|
20
|
+
*
|
|
21
|
+
* Browser adapters remain responsible for synchronizing this contract with the
|
|
22
|
+
* actual address bar. The built-in memory implementation is intended for tests,
|
|
23
|
+
* SSR preparation, embedded roots, and non-browser environments.
|
|
24
|
+
*/
|
|
25
|
+
export interface RouteHistory {
|
|
26
|
+
readonly location: RouteHistoryLocation;
|
|
27
|
+
readonly canGoBack: boolean;
|
|
28
|
+
readonly canGoForward: boolean;
|
|
29
|
+
/** Reads a traversal target without mutating the stack. */
|
|
30
|
+
peek(delta: number): RouteHistoryLocation | undefined;
|
|
31
|
+
push(href: string | URL, state?: unknown): void;
|
|
32
|
+
replace(href: string | URL, state?: unknown): void;
|
|
33
|
+
go(delta: number): void;
|
|
34
|
+
back(): void;
|
|
35
|
+
forward(): void;
|
|
36
|
+
subscribe(listener: RouteHistoryListener): () => void;
|
|
37
|
+
destroy(): void;
|
|
38
|
+
}
|
|
39
|
+
export interface MemoryRouteHistoryEntry {
|
|
40
|
+
readonly href: string | URL;
|
|
41
|
+
readonly state?: unknown;
|
|
42
|
+
}
|
|
43
|
+
export interface MemoryRouteHistoryOptions {
|
|
44
|
+
readonly initialEntries?: readonly (string | URL | MemoryRouteHistoryEntry)[];
|
|
45
|
+
readonly initialIndex?: number;
|
|
46
|
+
readonly origin?: string | URL;
|
|
47
|
+
}
|
|
48
|
+
/** Creates an isolated, deterministic history stack with synchronous updates. */
|
|
49
|
+
export declare function createMemoryRouteHistory(options?: MemoryRouteHistoryOptions): RouteHistory;
|
|
50
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;CACzC;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;AAExE,oFAAoF;AACpF,qBAAa,gCAAiC,SAAQ,KAAK;IACzD,SAAkB,KAAK,EAAE,OAAO,CAAC;gBAErB,KAAK,EAAE,OAAO;CAK3B;AAQD;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,2DAA2D;IAC3D,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAAC;IACtD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAChD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACnD,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,IAAI,IAAI,CAAC;IAChB,SAAS,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI,CAAC;IACtD,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,uBAAuB,CAAC,EAAE,CAAC;IAC9E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAChC;AAYD,iFAAiF;AACjF,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,yBAA8B,GACtC,YAAY,CAkId"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const route: import("./types").RouteState;
|
|
2
|
+
export declare const navigate: <Path extends string>(pattern: Path, ...arguments_: import("./types").NavigateArguments<Path>) => import("./types").RouteNavigationResult;
|
|
3
|
+
export declare const navigateRelative: <Path extends string>(pattern: Path, ...arguments_: import("./types").RelativeNavigateArguments<Path>) => import("./types").RouteNavigationResult;
|
|
4
|
+
export declare const blockNavigation: (blocker: import("./types").RouteNavigationBlocker) => () => void;
|
|
5
|
+
export declare const subscribeNavigation: (listener: import("./types").RouteNavigationListener) => () => void;
|
|
6
|
+
export declare const back: () => import("./types").RouteNavigationResult | null;
|
|
7
|
+
export declare const forward: () => import("./types").RouteNavigationResult | null;
|
|
8
|
+
export { createRouteRuntime, supportsNavigationAPI } from './runtime';
|
|
9
|
+
export { redirectRoute } from './types';
|
|
10
|
+
export type { RouteEnvironment, RouteRuntime, RouteRuntimeOptions } from './runtime';
|
|
11
|
+
export { createMemoryRouteHistory } from './history';
|
|
12
|
+
export { createRouteManifest } from './manifest';
|
|
13
|
+
export type { MemoryRouteHistoryEntry, MemoryRouteHistoryOptions, RouteHistory, RouteHistoryAction, RouteHistoryListener, RouteHistoryLocation, RouteHistoryUpdate, } from './history';
|
|
14
|
+
export { buildRoutePath, compareRoutePatterns, createRouteMatcher, createRouteQuery, joinRoutePaths, matchRoutePattern, normalizeRoutePath, resolveRoutePath, parseRouteQuery, rankRoutePattern, validateRoutePattern, validateRoutePatterns, } from './path';
|
|
15
|
+
export type { MatchPatternOptions, NavigateArguments, NavigateOptions, RelativeNavigateArguments, RelativeNavigateOptions, NavigationType, ParsedRouteQuery, PatternMatch, RouteLocationSnapshot, RouteListener, RouteManifest, RouteManifestEntry, RouteMatch, RouteNavigation, RouteNavigationBlocker, RouteNavigationDecision, RouteNavigationEvent, RouteNavigationListener, RouteNavigationLocation, RouteNavigationPhase, RouteNavigationResult, RouteRedirect, RouteParamValue, RouteParams, RoutePatternDefinition, RouteQuery, RouteQueryInput, RouteQueryValue, RouteSnapshot, RouteState, RouteResolver, RouteSelectionEquality, RouteSelectionListener, RouteSelector, RouteTableMatcher, } from './types';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK,8BAA4B,CAAC;AAC/C,eAAO,MAAM,QAAQ,2IAA+B,CAAC;AACrD,eAAO,MAAM,gBAAgB,mJAAuC,CAAC;AACrE,eAAO,MAAM,eAAe,mEAAsC,CAAC;AACnE,eAAO,MAAM,mBAAmB,qEAA0C,CAAC;AAC3E,eAAO,MAAM,IAAI,sDAA2B,CAAC;AAC7C,eAAO,MAAM,OAAO,sDAA8B,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErF,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EACV,uBAAuB,EACvB,yBAAyB,EACzB,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,QAAQ,CAAC;AAEhB,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,yBAAyB,EACzB,uBAAuB,EACvB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,WAAW,EACX,sBAAsB,EACtB,UAAU,EACV,eAAe,EACf,eAAe,EACf,aAAa,EACb,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,aAAa,EACb,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,b as o,c as a,d as r,e as i,f as u,g as n,h as R,i as s,j as c,k as p,l as v,m,n as y,o as g,p as l,q as t,r as N}from"./chunks/chunk-MH5AOHEF.js";var f=t.route,x=t.navigate,h=t.navigateRelative,M=t.blockNavigation,b=t.subscribeNavigation,d=t.back,H=t.forward;export{d as back,M as blockNavigation,c as buildRoutePath,v as compareRoutePatterns,y as createMemoryRouteHistory,m as createRouteManifest,a as createRouteMatcher,o as createRouteQuery,l as createRouteRuntime,H as forward,u as joinRoutePaths,s as matchRoutePattern,x as navigate,h as navigateRelative,r as normalizeRoutePath,e as parseRouteQuery,p as rankRoutePattern,N as redirectRoute,i as resolveRoutePath,f as route,b as subscribeNavigation,g as supportsNavigationAPI,n as validateRoutePattern,R as validateRoutePatterns};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const route: import("./types").RouteState;
|
|
2
|
+
export declare const navigateRoute: <Path extends string>(pattern: Path, ...arguments_: import("./types").NavigateArguments<Path>) => import("./types").RouteNavigationResult;
|
|
3
|
+
export { createRouteRuntime, supportsNavigationAPI } from './runtime';
|
|
4
|
+
export { redirectRoute } from './types';
|
|
5
|
+
export { createRouteManifest } from './manifest';
|
|
6
|
+
export type { NavigationController, NavigationDestinationLike, NavigationEventLike, RouteEnvironment, RouteRuntime, } from './runtime';
|
|
7
|
+
export type { RouteLocationSnapshot, RouteNavigation, RouteNavigationBlocker, RouteNavigationEvent, RouteNavigationListener, RouteNavigationResult, RouteResolver, } from './types';
|
|
8
|
+
export { createMemoryRouteHistory } from './history';
|
|
9
|
+
export type { RouteHistory } from './history';
|
|
10
|
+
export { buildRoutePath } from './path';
|
|
11
|
+
/** Compiler-runtime boundary. Application code should not need these calls. */
|
|
12
|
+
export declare const connectRouter: () => () => void;
|
|
13
|
+
export declare function ensureRouterConnected(): void;
|
|
14
|
+
export declare const installRouteResolver: (resolver: import("./types").RouteResolver) => () => void;
|
|
15
|
+
export declare const replaceRouteResolver: (resolver: import("./types").RouteResolver) => () => void;
|
|
16
|
+
export declare const navigateRouteRelative: <Path extends string>(pattern: Path, ...arguments_: import("./types").RelativeNavigateArguments<Path>) => import("./types").RouteNavigationResult;
|
|
17
|
+
export declare const blockRouteNavigation: (blocker: import("./types").RouteNavigationBlocker) => () => void;
|
|
18
|
+
export declare const subscribeRouteNavigation: (listener: import("./types").RouteNavigationListener) => () => void;
|
|
19
|
+
export declare const subscribeRoute: (listener: import("./types").RouteListener) => () => void;
|
|
20
|
+
export declare const subscribeRouteSelected: <Value>(selector: import("./types").RouteSelector<Value>, listener: import("./types").RouteSelectionListener<Value>, equals?: import("./types").RouteSelectionEquality<Value>) => () => void;
|
|
21
|
+
//# sourceMappingURL=internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK,8BAA4B,CAAC;AAC/C,eAAO,MAAM,aAAa,2IAA+B,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EACV,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,GACb,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,+EAA+E;AAC/E,eAAO,MAAM,aAAa,kBAA8B,CAAC;AAEzD,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AACD,eAAO,MAAM,oBAAoB,2DAAsC,CAAC;AACxE,eAAO,MAAM,oBAAoB,2DAAsC,CAAC;AACxE,eAAO,MAAM,qBAAqB,mJAAuC,CAAC;AAC1E,eAAO,MAAM,oBAAoB,mEAAsC,CAAC;AACxE,eAAO,MAAM,wBAAwB,qEAA0C,CAAC;AAChF,eAAO,MAAM,cAAc,2DAAgC,CAAC;AAC5D,eAAO,MAAM,sBAAsB,8LAAwC,CAAC"}
|
package/dist/internal.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as t,m as o,n as r,o as i,p as n,q as e,r as a}from"./chunks/chunk-MH5AOHEF.js";var c=e.route,R=e.navigate,l=e.connect,u=null;function p(){u??=e.connect()}var v=e.installResolver,x=e.replaceResolver,g=e.navigateRelative,m=e.blockNavigation,b=e.subscribeNavigation,f=e.subscribe,N=e.subscribeSelected;export{m as blockRouteNavigation,t as buildRoutePath,l as connectRouter,r as createMemoryRouteHistory,o as createRouteManifest,n as createRouteRuntime,p as ensureRouterConnected,v as installRouteResolver,R as navigateRoute,g as navigateRouteRelative,a as redirectRoute,x as replaceRouteResolver,c as route,f as subscribeRoute,b as subscribeRouteNavigation,N as subscribeRouteSelected,i as supportsNavigationAPI};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RouteManifest, RoutePatternDefinition } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Builds a validated nested route manifest.
|
|
4
|
+
*
|
|
5
|
+
* This is the runtime form of the structure the compiler can emit ahead of
|
|
6
|
+
* time. Parent IDs determine active match chains; child patterns remain local
|
|
7
|
+
* while `fullPattern` is precomposed for matching and destination generation.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createRouteManifest(definitions: readonly (RoutePatternDefinition | string)[]): RouteManifest;
|
|
10
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAGV,aAAa,EAGb,sBAAsB,EACvB,MAAM,SAAS,CAAC;AAoCjB;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,SAAS,CAAC,sBAAsB,GAAG,MAAM,CAAC,EAAE,GACxD,aAAa,CAgLf"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview High-throughput Radix Segment Trie route matcher for @memoized-dom/router.
|
|
3
|
+
*
|
|
4
|
+
* Implements an O(path_depth) hierarchical search tree for multi-route tables:
|
|
5
|
+
* - Specificity priority: Exact Static Segment > Dynamic Param Segment (:id) > Terminal Wildcard (*)
|
|
6
|
+
* - Zero intermediate array allocations during path scanning via character-index tokenizer.
|
|
7
|
+
* - Active route pointer cache for instant sub-nanosecond memoized repeated lookups.
|
|
8
|
+
*/
|
|
9
|
+
import type { RoutePatternDefinition, RouteTableMatcher } from './types';
|
|
10
|
+
/**
|
|
11
|
+
* Creates a high-throughput Radix Segment Trie matcher for route tables.
|
|
12
|
+
* Scales multi-route resolution in O(path_depth) time rather than O(N) linear scans.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createRouteMatcher(definitions: readonly (RoutePatternDefinition | string)[]): RouteTableMatcher;
|
|
15
|
+
//# sourceMappingURL=matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../src/matcher.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAGV,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAwBjB;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,SAAS,CAAC,sBAAsB,GAAG,MAAM,CAAC,EAAE,GACxD,iBAAiB,CA4MnB"}
|
package/dist/path.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Path manipulation, pattern validation, and template interpolation for @memoized-dom/router.
|
|
3
|
+
*
|
|
4
|
+
* Implements high-throughput URL pattern matching and path interpolation:
|
|
5
|
+
* - Pre-compiled regex and chunked template caches.
|
|
6
|
+
* - Single-parameter and multi-parameter extraction.
|
|
7
|
+
* - Terminal wildcard capture (/docs/*).
|
|
8
|
+
* - Specificity ranking and comparison for deterministic route tables.
|
|
9
|
+
*/
|
|
10
|
+
import type { MatchPatternOptions, PatternMatch, RouteParams, RouteQueryInput } from './types';
|
|
11
|
+
export { createRouteQuery, parseRouteQuery } from './query';
|
|
12
|
+
export { createRouteMatcher } from './matcher';
|
|
13
|
+
/**
|
|
14
|
+
* Splits a normalized path into non-empty segment strings.
|
|
15
|
+
*/
|
|
16
|
+
export declare function pathSegments(path: string): string[];
|
|
17
|
+
/**
|
|
18
|
+
* Normalizes a pathname string to ensure a single leading slash and no trailing slash.
|
|
19
|
+
* Fast-paths already normalized paths without string allocation.
|
|
20
|
+
*/
|
|
21
|
+
export declare function normalizeRoutePath(path: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Resolves a destination relative to a route pathname. Route paths are treated
|
|
24
|
+
* as directories, so `details` from `/projects/one` becomes
|
|
25
|
+
* `/projects/one/details`, while `../two` becomes `/projects/two`.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveRoutePath(base: string, destination: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Combines parent and child route paths safely.
|
|
30
|
+
*/
|
|
31
|
+
export declare function joinRoutePaths(parent: string, child: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Validates and normalizes a route pattern declaration.
|
|
34
|
+
* Results are cached to avoid repeated Set allocations and segment parsing.
|
|
35
|
+
*/
|
|
36
|
+
export declare function validateRoutePattern(pattern: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Validates an array of route pattern declarations, detecting duplicate IDs and ambiguous definitions.
|
|
39
|
+
*/
|
|
40
|
+
export declare function validateRoutePatterns(definitions: readonly {
|
|
41
|
+
readonly id: string;
|
|
42
|
+
readonly pattern: string;
|
|
43
|
+
}[]): void;
|
|
44
|
+
/**
|
|
45
|
+
* Decodes a URI component safely, falling back to the raw value on malformed URI sequences.
|
|
46
|
+
*/
|
|
47
|
+
export declare function decodePathValue(value: string): string;
|
|
48
|
+
/**
|
|
49
|
+
* Matches a route pattern against an incoming pathname string.
|
|
50
|
+
*
|
|
51
|
+
* Fast-paths exact static routes without RegExp evaluation and memoizes active matches.
|
|
52
|
+
*/
|
|
53
|
+
export declare function matchRoutePattern(pattern: string, pathname: string, options?: MatchPatternOptions): PatternMatch | null;
|
|
54
|
+
/**
|
|
55
|
+
* Interpolates parameters, query inputs, and hash fragments into a concrete URL path.
|
|
56
|
+
*
|
|
57
|
+
* Fast-paths static patterns and chunked templates without regex evaluation.
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildRoutePath<Path extends string>(pattern: Path, params?: RouteParams<Path>, query?: RouteQueryInput, hash?: string): string;
|
|
60
|
+
/**
|
|
61
|
+
* Calculates the specificity ranking integer for a route pattern.
|
|
62
|
+
*/
|
|
63
|
+
export declare function rankRoutePattern(pattern: string): number;
|
|
64
|
+
/**
|
|
65
|
+
* Compares two route patterns for sorting. More specific routes sort first.
|
|
66
|
+
*/
|
|
67
|
+
export declare function compareRoutePatterns(first: string, second: string): number;
|
|
68
|
+
//# sourceMappingURL=path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../src/path.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EAEZ,WAAW,EACX,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AA8B/C;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEnD;AAiBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmCvD;AAID;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAuB1E;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAkBpE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAuC5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,SAAS;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,GACxE,IAAI,CA4BN;AA6DD;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,mBAAwB,GAChC,YAAY,GAAG,IAAI,CAoErB;AA8BD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,SAAS,MAAM,EAChD,OAAO,EAAE,IAAI,EACb,MAAM,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,EAC1B,KAAK,CAAC,EAAE,eAAe,EACvB,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CA8ER;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMxD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAa1E"}
|
package/dist/query.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview High-performance query-string serialization and parsing for @memoized-dom/router.
|
|
3
|
+
*
|
|
4
|
+
* Designed for extreme hotpath throughput:
|
|
5
|
+
* - Bypasses Web IDL URLSearchParams host object allocation.
|
|
6
|
+
* - Single-pass key-value string concatenation and zero-alloc scanning.
|
|
7
|
+
* - Small-array sorting networks (3-key and 4-key) avoiding Array.prototype.sort() engine overhead.
|
|
8
|
+
* - Reference memoization and unreserved character fast paths.
|
|
9
|
+
* - Conforms to standard application/x-www-form-urlencoded specifications.
|
|
10
|
+
*/
|
|
11
|
+
import type { ParsedRouteQuery, RouteParamValue, RouteQueryInput } from './types';
|
|
12
|
+
/**
|
|
13
|
+
* Encodes a query value into a URL-safe string representation,
|
|
14
|
+
* encoding spaces as '+' conforming to standard URL query syntax.
|
|
15
|
+
*/
|
|
16
|
+
export declare function encodeQueryValue(value: RouteParamValue | null | undefined): string;
|
|
17
|
+
/**
|
|
18
|
+
* Encodes a query key into a URL-safe string representation.
|
|
19
|
+
*/
|
|
20
|
+
export declare function encodeQueryKey(key: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Parses a query string into a key-value dictionary without instantiating URLSearchParams.
|
|
23
|
+
*
|
|
24
|
+
* Supports scalar values, repeated keys into arrays, and reference memoization.
|
|
25
|
+
*/
|
|
26
|
+
export declare function parseRouteQuery(search: string): ParsedRouteQuery;
|
|
27
|
+
/** Reference memoization is safe only for runtime-immutable input graphs. */
|
|
28
|
+
export declare function isMemoizableRouteQuery(query: RouteQueryInput | undefined): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Serializes a key-value dictionary into a deterministic URL query string.
|
|
31
|
+
*
|
|
32
|
+
* Features:
|
|
33
|
+
* - Reference memoization for identical query dictionaries.
|
|
34
|
+
* - Single-pass key-value string concatenation without URLSearchParams.
|
|
35
|
+
* - In-place small-array sorting networks for deterministic URL keys.
|
|
36
|
+
* - Array values produce repeated keys: `?tag=alpha&tag=beta`.
|
|
37
|
+
* - Null and undefined values are omitted.
|
|
38
|
+
*/
|
|
39
|
+
export declare function createRouteQuery(query: RouteQueryInput | undefined): string;
|
|
40
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA0BlF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CASlF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGlD;AAmBD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAiEhE;AAyCD,6EAA6E;AAC7E,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,eAAe,GAAG,SAAS,GACjC,OAAO,CAOT;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,GAAG,MAAM,CAkH3E"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type RouteHistory } from './history';
|
|
2
|
+
import type { NavigateArguments, NavigationType, RouteListener, RouteMatch, RouteNavigationBlocker, RouteNavigationListener, RouteNavigationResult, RoutePatternDefinition, RouteResolver, RouteSelectionEquality, RouteSelectionListener, RouteSelector, RouteSnapshot, RouteState, RelativeNavigateArguments } from './types';
|
|
3
|
+
export interface RouteEnvironment {
|
|
4
|
+
readonly location?: Location;
|
|
5
|
+
readonly history?: History;
|
|
6
|
+
readonly navigation?: NavigationController;
|
|
7
|
+
addEventListener?(type: 'popstate' | 'hashchange' | 'click', listener: EventListener): void;
|
|
8
|
+
removeEventListener?(type: 'popstate' | 'hashchange' | 'click', listener: EventListener): void;
|
|
9
|
+
}
|
|
10
|
+
export interface NavigationDestinationLike {
|
|
11
|
+
readonly url: string;
|
|
12
|
+
getState?(): unknown;
|
|
13
|
+
}
|
|
14
|
+
export interface NavigationEventLike extends Event {
|
|
15
|
+
readonly canIntercept: boolean;
|
|
16
|
+
readonly destination: NavigationDestinationLike;
|
|
17
|
+
readonly downloadRequest?: string | null;
|
|
18
|
+
readonly hashChange: boolean;
|
|
19
|
+
readonly navigationType: 'push' | 'replace' | 'reload' | 'traverse';
|
|
20
|
+
scroll?(): void;
|
|
21
|
+
intercept(options?: {
|
|
22
|
+
readonly handler?: () => Promise<void> | void;
|
|
23
|
+
readonly scroll?: 'after-transition' | 'manual';
|
|
24
|
+
}): void;
|
|
25
|
+
}
|
|
26
|
+
export interface NavigationController {
|
|
27
|
+
addEventListener(type: 'navigate', listener: EventListener): void;
|
|
28
|
+
removeEventListener(type: 'navigate', listener: EventListener): void;
|
|
29
|
+
navigate(url: string, options?: {
|
|
30
|
+
readonly history?: 'auto' | 'push' | 'replace';
|
|
31
|
+
readonly state?: unknown;
|
|
32
|
+
}): unknown;
|
|
33
|
+
back(): unknown;
|
|
34
|
+
forward(): unknown;
|
|
35
|
+
}
|
|
36
|
+
export interface RouteRuntime {
|
|
37
|
+
readonly route: RouteState;
|
|
38
|
+
snapshot(): RouteSnapshot;
|
|
39
|
+
subscribe(listener: RouteListener): () => void;
|
|
40
|
+
subscribeSelected<Value>(selector: RouteSelector<Value>, listener: RouteSelectionListener<Value>, equals?: RouteSelectionEquality<Value>): () => void;
|
|
41
|
+
connect(): () => void;
|
|
42
|
+
installResolver(resolver: RouteResolver): () => void;
|
|
43
|
+
replaceResolver(resolver: RouteResolver): () => void;
|
|
44
|
+
navigate<Path extends string>(pattern: Path, ...arguments_: NavigateArguments<Path>): RouteNavigationResult;
|
|
45
|
+
navigateRelative<Path extends string>(pattern: Path, ...arguments_: RelativeNavigateArguments<Path>): RouteNavigationResult;
|
|
46
|
+
blockNavigation(blocker: RouteNavigationBlocker): () => void;
|
|
47
|
+
subscribeNavigation(listener: RouteNavigationListener): () => void;
|
|
48
|
+
back(): RouteNavigationResult | null;
|
|
49
|
+
forward(): RouteNavigationResult | null;
|
|
50
|
+
setLocation(href: string | URL, type?: NavigationType, state?: unknown): void;
|
|
51
|
+
setMatches(matches: readonly RouteMatch[]): void;
|
|
52
|
+
dispose(): void;
|
|
53
|
+
}
|
|
54
|
+
export declare function supportsNavigationAPI(environment?: RouteEnvironment): boolean;
|
|
55
|
+
export interface RouteRuntimeOptions {
|
|
56
|
+
readonly environment?: RouteEnvironment;
|
|
57
|
+
readonly routeHistory?: RouteHistory;
|
|
58
|
+
readonly resolver?: RouteResolver;
|
|
59
|
+
readonly routes?: readonly (RoutePatternDefinition | string)[];
|
|
60
|
+
/** Static URL prefix where the application is mounted, such as `/app`. */
|
|
61
|
+
readonly basePath?: string;
|
|
62
|
+
}
|
|
63
|
+
export declare function createRouteRuntime(optionsOrEnvironment?: RouteEnvironment | RouteRuntimeOptions): RouteRuntime;
|
|
64
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
export type RouteParamValue = string | number | boolean | bigint;
|
|
2
|
+
export type RouteQueryValue = RouteParamValue | null | undefined | readonly (RouteParamValue | null | undefined)[];
|
|
3
|
+
export type RouteQueryInput = Readonly<Record<string, RouteQueryValue>>;
|
|
4
|
+
export type ParsedRouteQuery = Readonly<Record<string, string | readonly string[]>>;
|
|
5
|
+
type SegmentParam<Segment extends string> = Segment extends `:${infer Name}` ? Name extends '' ? never : Name : Segment extends '*' ? '*' : never;
|
|
6
|
+
type PathParamNames<Path extends string> = Path extends `${infer Head}/${infer Tail}` ? SegmentParam<Head> | PathParamNames<Tail> : SegmentParam<Path>;
|
|
7
|
+
export type RouteParams<Path extends string> = string extends Path ? Record<string, RouteParamValue> : [PathParamNames<Path>] extends [never] ? Record<never, never> : {
|
|
8
|
+
[Name in PathParamNames<Path>]: RouteParamValue;
|
|
9
|
+
};
|
|
10
|
+
export interface RouteMatch {
|
|
11
|
+
readonly id: string;
|
|
12
|
+
readonly pattern: string;
|
|
13
|
+
readonly pathname: string;
|
|
14
|
+
readonly params: Readonly<Record<string, string>>;
|
|
15
|
+
readonly metadata?: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface RoutePatternDefinition {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly pattern: string;
|
|
20
|
+
readonly parentId?: string;
|
|
21
|
+
readonly metadata?: unknown;
|
|
22
|
+
}
|
|
23
|
+
export type NavigationType = 'load' | 'push' | 'replace' | 'pop';
|
|
24
|
+
/** The read-only portion of URLSearchParams exposed by route state. */
|
|
25
|
+
export interface RouteQuery extends Iterable<[string, string]> {
|
|
26
|
+
readonly size: number;
|
|
27
|
+
get(name: string): string | null;
|
|
28
|
+
getAll(name: string): string[];
|
|
29
|
+
has(name: string, value?: string): boolean;
|
|
30
|
+
entries(): URLSearchParamsIterator<[string, string]>;
|
|
31
|
+
keys(): URLSearchParamsIterator<string>;
|
|
32
|
+
values(): URLSearchParamsIterator<string>;
|
|
33
|
+
forEach(callback: (value: string, key: string, query: RouteQuery) => void, thisArg?: unknown): void;
|
|
34
|
+
toString(): string;
|
|
35
|
+
}
|
|
36
|
+
export interface RouteLocationSnapshot {
|
|
37
|
+
readonly href: string;
|
|
38
|
+
readonly pathname: string;
|
|
39
|
+
readonly search: string;
|
|
40
|
+
readonly query: RouteQuery;
|
|
41
|
+
readonly hash: string;
|
|
42
|
+
readonly state: unknown;
|
|
43
|
+
readonly navigationType: NavigationType;
|
|
44
|
+
readonly signal: AbortSignal;
|
|
45
|
+
}
|
|
46
|
+
export interface RouteSnapshot {
|
|
47
|
+
readonly href: string;
|
|
48
|
+
readonly pathname: string;
|
|
49
|
+
readonly search: string;
|
|
50
|
+
readonly query: RouteQuery;
|
|
51
|
+
readonly hash: string;
|
|
52
|
+
readonly state: unknown;
|
|
53
|
+
readonly navigationType: NavigationType;
|
|
54
|
+
readonly params: Readonly<Record<string, string>>;
|
|
55
|
+
readonly matches: readonly RouteMatch[];
|
|
56
|
+
readonly matched: RouteMatch | null;
|
|
57
|
+
readonly signal: AbortSignal;
|
|
58
|
+
}
|
|
59
|
+
export interface RouteState {
|
|
60
|
+
readonly href: string;
|
|
61
|
+
readonly pathname: string;
|
|
62
|
+
readonly search: string;
|
|
63
|
+
readonly query: RouteQuery;
|
|
64
|
+
readonly hash: string;
|
|
65
|
+
readonly state: unknown;
|
|
66
|
+
readonly navigationType: NavigationType;
|
|
67
|
+
readonly params: Readonly<Record<string, string>>;
|
|
68
|
+
readonly matches: readonly RouteMatch[];
|
|
69
|
+
readonly matched: RouteMatch | null;
|
|
70
|
+
readonly signal: AbortSignal;
|
|
71
|
+
}
|
|
72
|
+
export interface NavigateOptions<Path extends string = string> {
|
|
73
|
+
readonly params?: RouteParams<Path>;
|
|
74
|
+
readonly query?: RouteQueryInput;
|
|
75
|
+
readonly hash?: string;
|
|
76
|
+
readonly state?: unknown;
|
|
77
|
+
readonly replace?: boolean;
|
|
78
|
+
}
|
|
79
|
+
export interface RelativeNavigateOptions<Path extends string = string> extends NavigateOptions<Path> {
|
|
80
|
+
/** Path used as the relative base. Defaults to the active pathname. */
|
|
81
|
+
readonly from?: string;
|
|
82
|
+
}
|
|
83
|
+
export type NavigateArguments<Path extends string> = string extends Path ? [options?: NavigateOptions<Path>] : keyof RouteParams<Path> extends never ? [options?: NavigateOptions<Path>] : [options: NavigateOptions<Path> & {
|
|
84
|
+
readonly params: RouteParams<Path>;
|
|
85
|
+
}];
|
|
86
|
+
export type RelativeNavigateArguments<Path extends string> = string extends Path ? [options?: RelativeNavigateOptions<Path>] : keyof RouteParams<Path> extends never ? [options?: RelativeNavigateOptions<Path>] : [options: RelativeNavigateOptions<Path> & {
|
|
87
|
+
readonly params: RouteParams<Path>;
|
|
88
|
+
}];
|
|
89
|
+
export type RouteListener = (snapshot: RouteSnapshot) => void;
|
|
90
|
+
export type RouteSelector<Value> = (route: RouteState) => Value;
|
|
91
|
+
export type RouteSelectionListener<Value> = (value: Value, route: RouteState) => void;
|
|
92
|
+
export type RouteSelectionEquality<Value> = (previous: Value, next: Value) => boolean;
|
|
93
|
+
export interface RouteNavigationLocation {
|
|
94
|
+
readonly href: string;
|
|
95
|
+
readonly pathname: string;
|
|
96
|
+
readonly search: string;
|
|
97
|
+
readonly hash: string;
|
|
98
|
+
readonly state: unknown;
|
|
99
|
+
}
|
|
100
|
+
export interface RouteNavigation {
|
|
101
|
+
readonly id: number;
|
|
102
|
+
readonly from: RouteNavigationLocation;
|
|
103
|
+
readonly to: RouteNavigationLocation;
|
|
104
|
+
readonly type: Exclude<NavigationType, 'load'>;
|
|
105
|
+
}
|
|
106
|
+
export interface RouteRedirect {
|
|
107
|
+
readonly to: string | URL;
|
|
108
|
+
readonly replace?: boolean;
|
|
109
|
+
readonly state?: unknown;
|
|
110
|
+
}
|
|
111
|
+
export type RouteNavigationDecision = boolean | void | RouteRedirect;
|
|
112
|
+
/** A synchronous navigation guard. Async work belongs to the data boundary. */
|
|
113
|
+
export type RouteNavigationBlocker = (navigation: RouteNavigation) => RouteNavigationDecision;
|
|
114
|
+
export type RouteNavigationPhase = 'start' | 'redirect' | 'blocked' | 'complete';
|
|
115
|
+
export interface RouteNavigationEvent {
|
|
116
|
+
readonly phase: RouteNavigationPhase;
|
|
117
|
+
readonly navigation: RouteNavigation;
|
|
118
|
+
readonly redirect?: RouteRedirect;
|
|
119
|
+
}
|
|
120
|
+
export type RouteNavigationListener = (event: RouteNavigationEvent) => void;
|
|
121
|
+
export type RouteNavigationResult = {
|
|
122
|
+
readonly status: 'completed';
|
|
123
|
+
readonly navigation: RouteNavigation;
|
|
124
|
+
readonly redirects: number;
|
|
125
|
+
} | {
|
|
126
|
+
readonly status: 'blocked';
|
|
127
|
+
readonly navigation: RouteNavigation;
|
|
128
|
+
readonly redirects: number;
|
|
129
|
+
};
|
|
130
|
+
export declare function redirectRoute(to: string | URL, options?: Omit<RouteRedirect, 'to'>): RouteRedirect;
|
|
131
|
+
export type RouteResolver = (location: RouteLocationSnapshot) => readonly RouteMatch[];
|
|
132
|
+
export interface PatternMatch {
|
|
133
|
+
readonly pattern: string;
|
|
134
|
+
readonly pathname: string;
|
|
135
|
+
readonly params: Readonly<Record<string, string>>;
|
|
136
|
+
readonly consumed: string;
|
|
137
|
+
readonly remaining: string;
|
|
138
|
+
}
|
|
139
|
+
export interface MatchPatternOptions {
|
|
140
|
+
readonly end?: boolean;
|
|
141
|
+
}
|
|
142
|
+
export interface RouteTableMatcher {
|
|
143
|
+
match(pathname: string): RouteMatch | null;
|
|
144
|
+
resolve(location: RouteLocationSnapshot): readonly RouteMatch[];
|
|
145
|
+
}
|
|
146
|
+
export interface RouteManifestEntry extends RoutePatternDefinition {
|
|
147
|
+
readonly fullPattern: string;
|
|
148
|
+
readonly depth: number;
|
|
149
|
+
}
|
|
150
|
+
export interface RouteManifest extends RouteTableMatcher {
|
|
151
|
+
readonly entries: readonly RouteManifestEntry[];
|
|
152
|
+
get(id: string): RouteManifestEntry | undefined;
|
|
153
|
+
matchAll(pathname: string): readonly RouteMatch[];
|
|
154
|
+
build(id: string, options?: NavigateOptions<string>): string;
|
|
155
|
+
}
|
|
156
|
+
export {};
|
|
157
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@memoized-dom/router",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Compiler-ready URL state, matching, and navigation for memoized-dom",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md"
|
|
10
|
+
],
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./internal": {
|
|
18
|
+
"types": "./dist/internal.d.ts",
|
|
19
|
+
"import": "./dist/internal.js",
|
|
20
|
+
"default": "./dist/internal.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "bun run ./scripts/clean.ts && esbuild ./src/index.ts ./src/internal.ts --bundle --outdir=./dist --platform=browser --format=esm --target=es2022 --minify --splitting --entry-names=[name] --chunk-names=chunks/[name]-[hash] && tsc -p tsconfig.build.json",
|
|
25
|
+
"test": "vitest run --config vitest.config.ts && tsc -p tsconfig.test.json"
|
|
26
|
+
},
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
}
|
|
30
|
+
}
|