@memoized-dom/router 0.0.1 → 0.0.2
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 +203 -150
- package/dist/active-runtime.d.ts +45 -0
- package/dist/active-runtime.d.ts.map +1 -0
- package/dist/chunks/types-BWmc67Zg.js +1 -0
- package/dist/history.d.ts.map +1 -1
- package/dist/index.d.ts +8 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/internal.d.ts +11 -9
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/scroll.d.ts +28 -0
- package/dist/scroll.d.ts.map +1 -0
- package/package.json +30 -30
- package/dist/chunks/chunk-MH5AOHEF.js +0 -1
package/README.md
CHANGED
|
@@ -1,150 +1,203 @@
|
|
|
1
|
-
# `@memoized-dom/router`
|
|
2
|
-
|
|
3
|
-
`@memoized-dom/router` is Memoized DOM's renderer-independent routing
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
route.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
route
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
1
|
+
# `@memoized-dom/router`
|
|
2
|
+
|
|
3
|
+
`@memoized-dom/router` is Memoized DOM's compiler-first, renderer-independent routing engine. It owns immutable URL state, deterministic route matching, compiler-extracted nested manifests, history management, scroll restoration, cancellation, and synchronous navigation guards.
|
|
4
|
+
|
|
5
|
+
There are no router context providers, component wrappers, or hooks. Routing declarations compile to stable, mutually exclusive real-DOM regions.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Reactive Route State (`route`)
|
|
10
|
+
|
|
11
|
+
Import the getter-backed `route` object in any component, helper, or derived state. Reads are compiler-tracked and re-render only the subtrees that consume changed fields:
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { route } from '@memoized-dom/router';
|
|
15
|
+
|
|
16
|
+
// Reactive URL properties:
|
|
17
|
+
route.pathname; // e.g. "/projects/compiler"
|
|
18
|
+
route.query.get('tab'); // e.g. "activity"
|
|
19
|
+
route.query.getAll('tag'); // string[] for multi-value keys (?tag=a&tag=b)
|
|
20
|
+
route.search; // e.g. "?tab=activity"
|
|
21
|
+
route.hash; // e.g. "#heading-2"
|
|
22
|
+
route.state; // Unwrapped history state (objects, primitives, arrays)
|
|
23
|
+
route.navigationType; // 'load' | 'push' | 'replace' | 'pop'
|
|
24
|
+
|
|
25
|
+
// Matched route metadata:
|
|
26
|
+
route.params; // Frozen parameter dictionary: { projectId: "compiler" }
|
|
27
|
+
route.matches; // Full hierarchy of matched manifest entries
|
|
28
|
+
route.matched; // Nearest active route match
|
|
29
|
+
|
|
30
|
+
// Request cancellation:
|
|
31
|
+
route.signal; // AbortSignal: aborted on every subsequent navigation
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 2. Programmatic Navigation
|
|
37
|
+
|
|
38
|
+
Use imperative navigation when transitions are triggered by code, forms, or timers:
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
import {
|
|
42
|
+
navigate,
|
|
43
|
+
navigateRelative,
|
|
44
|
+
back,
|
|
45
|
+
forward,
|
|
46
|
+
blockNavigation,
|
|
47
|
+
redirectRoute,
|
|
48
|
+
subscribeNavigation,
|
|
49
|
+
} from '@memoized-dom/router';
|
|
50
|
+
|
|
51
|
+
// Parameterized path navigation with query and history state:
|
|
52
|
+
navigate('/organizations/:orgId/projects/:projectId', {
|
|
53
|
+
params: { orgId: 'acme', projectId: 'compiler' },
|
|
54
|
+
query: { tab: 'members', sort: 'desc' },
|
|
55
|
+
hash: 'team-lead',
|
|
56
|
+
state: { fromCheckout: true },
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
// Relative directory navigation:
|
|
60
|
+
navigateRelative('../settings');
|
|
61
|
+
|
|
62
|
+
// Browser traversal:
|
|
63
|
+
back();
|
|
64
|
+
forward();
|
|
65
|
+
|
|
66
|
+
// Synchronous navigation blockers / guards:
|
|
67
|
+
const unblock = blockNavigation(navigation => {
|
|
68
|
+
if (navigation.to.pathname === '/admin' && !currentUser.isAdmin) {
|
|
69
|
+
return redirectRoute('/login', { replace: true });
|
|
70
|
+
}
|
|
71
|
+
if (hasUnsavedChanges()) {
|
|
72
|
+
return window.confirm('Discard unsaved changes?');
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Navigation lifecycle observer:
|
|
77
|
+
subscribeNavigation(event => {
|
|
78
|
+
console.log(event.phase, event.navigation.to.pathname);
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 3. Compiler JSX Directives (`route` & `route-to`)
|
|
85
|
+
|
|
86
|
+
The compiler owns `route` and `route-to` as universal JSX attributes. They are erased from DOM attributes and component props during build time.
|
|
87
|
+
|
|
88
|
+
### Declaring Route Regions (`route`)
|
|
89
|
+
```tsx
|
|
90
|
+
export function App() {
|
|
91
|
+
return (
|
|
92
|
+
// Root element registers the application route graph root:
|
|
93
|
+
<div class="shell" route="/">
|
|
94
|
+
<Header />
|
|
95
|
+
<main class="outlet">
|
|
96
|
+
{/* Sibling routes are resolved exclusively by the compiler: */}
|
|
97
|
+
<Dashboard route="/" />
|
|
98
|
+
<Stories route="/stories" />
|
|
99
|
+
<StoryPage route="/item/:storyId" />
|
|
100
|
+
<Settings route="/settings/*" />
|
|
101
|
+
<NotFound route="/*" />
|
|
102
|
+
</main>
|
|
103
|
+
</div>
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Declarative Links (`route-to`)
|
|
109
|
+
`route-to` on an `<a>` tag compiles to a real `href` with client-side pushState navigation:
|
|
110
|
+
|
|
111
|
+
```tsx
|
|
112
|
+
{/* Static route link */}
|
|
113
|
+
<a route-to="/stories">Stories</a>
|
|
114
|
+
|
|
115
|
+
{/* Object destination with params, query, hash, and replace */}
|
|
116
|
+
<a route-to={{
|
|
117
|
+
path: '/item/:storyId',
|
|
118
|
+
params: { storyId: story.id },
|
|
119
|
+
query: { comments: 'all' },
|
|
120
|
+
hash: 'reply-form',
|
|
121
|
+
replace: false,
|
|
122
|
+
}}>
|
|
123
|
+
{story.title}
|
|
124
|
+
</a>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 4. History State (`route.state`)
|
|
130
|
+
|
|
131
|
+
`route.state` gives access to ephemeral client-side metadata attached directly to the browser's history entry (`history.state`):
|
|
132
|
+
|
|
133
|
+
- **Invisible in URL**: Never exposed in the address bar or sent to the server in HTTP requests.
|
|
134
|
+
- **Any Data Type**: Accepts plain objects, arrays, numbers, strings, and booleans.
|
|
135
|
+
- **Isolated**: Internal router bookkeeping (such as scroll keys) is automatically stripped; `route.state` returns pure user data.
|
|
136
|
+
- **Survives Reloads**: Preserved by the browser across page reloads and browser Back/Forward traversals.
|
|
137
|
+
|
|
138
|
+
```ts
|
|
139
|
+
// Passing state during navigation:
|
|
140
|
+
navigate('/checkout', {
|
|
141
|
+
state: { draftOrderId: 1042, step: 2 }
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
// Reading state reactively in any component:
|
|
145
|
+
const state = route.state as { draftOrderId?: number; step?: number } | null;
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 5. Deterministic Scroll Restoration Engine
|
|
151
|
+
|
|
152
|
+
`@memoized-dom/router` includes an automatic, zero-configuration scroll coordinator:
|
|
153
|
+
|
|
154
|
+
1. **Manual Restoration Enforcement**: Disables native browser scroll snapping (`history.scrollRestoration = 'manual'`) so asynchronous component rendering never gets clamped to `(0, 0)`.
|
|
155
|
+
2. **History-Keyed Tracking**: Automatically captures viewport `(x, y)` scroll positions per history entry, persisting them to memory with `sessionStorage` fallback.
|
|
156
|
+
3. **Pop Navigation (Back/Forward)**: Automatically restores exact previous scroll coordinates after the target route's microtask and render phase settle.
|
|
157
|
+
4. **Push Navigation (New Link)**: Resets viewport scroll to top `(0, 0)`.
|
|
158
|
+
5. **Hash Navigation (`#target`)**: Queries `#target` elements by `id` or `name` and scrolls them into view, retrying on the next animation frame if asynchronous data is loading.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## 6. Server-Side Rendering (SSR) & Request Isolation
|
|
163
|
+
|
|
164
|
+
During server renders or unit tests, routing runs through an isolated memory history without touching global browser singletons:
|
|
165
|
+
|
|
166
|
+
```ts
|
|
167
|
+
import {
|
|
168
|
+
createRouteRuntime,
|
|
169
|
+
createMemoryRouteHistory,
|
|
170
|
+
runWithRouteRuntime,
|
|
171
|
+
} from '@memoized-dom/router';
|
|
172
|
+
|
|
173
|
+
const routeHistory = createMemoryRouteHistory({
|
|
174
|
+
initialEntries: ['/stories?sort=desc'],
|
|
175
|
+
});
|
|
176
|
+
const runtime = createRouteRuntime({ routeHistory });
|
|
177
|
+
|
|
178
|
+
// Every read, match, and navigation inside the callback is isolated to this request:
|
|
179
|
+
runWithRouteRuntime(runtime, () => {
|
|
180
|
+
console.log(route.pathname); // "/stories"
|
|
181
|
+
console.log(route.query.get('sort')); // "desc"
|
|
182
|
+
});
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## 7. Manifests & Lower-Level Matching Primitives
|
|
188
|
+
|
|
189
|
+
For tools, static analyzers, and headless routing:
|
|
190
|
+
|
|
191
|
+
```ts
|
|
192
|
+
import { createRouteManifest, matchRoutePattern } from '@memoized-dom/router';
|
|
193
|
+
|
|
194
|
+
const manifest = createRouteManifest([
|
|
195
|
+
{ id: 'root', pattern: '/', metadata: { layout: true } },
|
|
196
|
+
{ id: 'projects', parentId: 'root', pattern: '/projects' },
|
|
197
|
+
{ id: 'project', parentId: 'projects', pattern: '/:projectId' },
|
|
198
|
+
{ id: 'catchall', parentId: 'root', pattern: '/*' },
|
|
199
|
+
]);
|
|
200
|
+
|
|
201
|
+
manifest.matchAll('/projects/compiler'); // [root, projects, project]
|
|
202
|
+
manifest.build('project', { params: { projectId: 'compiler' } }); // "/projects/compiler"
|
|
203
|
+
```
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ambient route-runtime selection.
|
|
3
|
+
*
|
|
4
|
+
* The default browser experience runs on one process-wide runtime
|
|
5
|
+
* (`defaultRouteRuntime`). Server rendering must instead route every read,
|
|
6
|
+
* subscription, and navigation through a request-local runtime, without
|
|
7
|
+
* application authors abandoning the convenient public API.
|
|
8
|
+
*
|
|
9
|
+
* The bridge therefore delegates through an ambient pointer: when no override
|
|
10
|
+
* is active every export behaves exactly as before; a server render activates
|
|
11
|
+
* a memory-history runtime for the duration of its synchronous work.
|
|
12
|
+
*
|
|
13
|
+
* Compiled modules install their route manifest once at module evaluation
|
|
14
|
+
* (`replaceRouteResolver` at top level). That resolver is recorded here and
|
|
15
|
+
* replayed onto every newly activated runtime, so each request resolves its
|
|
16
|
+
* own URL against the application graph.
|
|
17
|
+
*/
|
|
18
|
+
import type { RouteRuntime } from './runtime';
|
|
19
|
+
import type { NavigateArguments, RelativeNavigateArguments, RouteListener, RouteNavigationBlocker, RouteNavigationListener, RouteResolver, RouteSelector, RouteSelectionEquality, RouteSelectionListener, RouteState } from './types';
|
|
20
|
+
export declare function getActiveRouteRuntime(): RouteRuntime;
|
|
21
|
+
export declare function runWithRouteRuntime<T>(runtime: RouteRuntime, fn: () => T): T;
|
|
22
|
+
/**
|
|
23
|
+
* Activate a runtime for the current synchronous scope. Returns the previous
|
|
24
|
+
* active runtime for restoration. Installing the recorded manifest resolver
|
|
25
|
+
* is idempotent per runtime.
|
|
26
|
+
*/
|
|
27
|
+
export declare function setActiveRouteRuntime(runtime: RouteRuntime | null): RouteRuntime;
|
|
28
|
+
/**
|
|
29
|
+
* Bridge for compiler-emitted `replaceRouteResolver` calls. Records the
|
|
30
|
+
* application's structural resolver for future activations and installs it
|
|
31
|
+
* on the currently active runtime.
|
|
32
|
+
*/
|
|
33
|
+
export declare function noteManifestResolver(resolver: RouteResolver): () => void;
|
|
34
|
+
/** Getter-backed facade over whichever runtime is currently active. */
|
|
35
|
+
export declare const activeRoute: RouteState;
|
|
36
|
+
export declare function navigate<Path extends string>(pattern: Path, ...arguments_: NavigateArguments<Path>): import("./types").RouteNavigationResult;
|
|
37
|
+
export declare function navigateRelative<Path extends string>(pattern: Path, ...arguments_: RelativeNavigateArguments<Path>): import("./types").RouteNavigationResult;
|
|
38
|
+
export declare function blockNavigation(blocker: RouteNavigationBlocker): () => void;
|
|
39
|
+
export declare function subscribeNavigation(listener: RouteNavigationListener): () => void;
|
|
40
|
+
export declare function back(): import("./types").RouteNavigationResult | null;
|
|
41
|
+
export declare function forward(): import("./types").RouteNavigationResult | null;
|
|
42
|
+
export declare function subscribe(listener: RouteListener): () => void;
|
|
43
|
+
export declare function subscribeSelected<Value>(selector: RouteSelector<Value>, listener: RouteSelectionListener<Value>, equals?: RouteSelectionEquality<Value>): () => void;
|
|
44
|
+
export declare function connect(): () => void;
|
|
45
|
+
//# sourceMappingURL=active-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-runtime.d.ts","sourceRoot":"","sources":["../src/active-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EACV,iBAAiB,EACjB,yBAAyB,EACzB,aAAa,EACb,sBAAsB,EACtB,uBAAuB,EACvB,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,UAAU,EACX,MAAM,SAAS,CAAC;AAOjB,wBAAgB,qBAAqB,IAAI,YAAY,CAEpD;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAM5E;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,YAAY,GAAG,IAAI,GAC3B,YAAY,CAcd;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI,CAGxE;AAED,uEAAuE;AACvE,eAAO,MAAM,WAAW,EAAE,UAkCxB,CAAC;AAEH,wBAAgB,QAAQ,CAAC,IAAI,SAAS,MAAM,EAC1C,OAAO,EAAE,IAAI,EACb,GAAG,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,2CAGvC;AAED,wBAAgB,gBAAgB,CAAC,IAAI,SAAS,MAAM,EAClD,OAAO,EAAE,IAAI,EACb,GAAG,UAAU,EAAE,yBAAyB,CAAC,IAAI,CAAC,2CAG/C;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,IAAI,CAE3E;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,uBAAuB,GAChC,MAAM,IAAI,CAEZ;AAED,wBAAgB,IAAI,mDAEnB;AAED,wBAAgB,OAAO,mDAEtB;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI,CAE7D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EACrC,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,EAC9B,QAAQ,EAAE,sBAAsB,CAAC,KAAK,CAAC,EACvC,MAAM,CAAC,EAAE,sBAAsB,CAAC,KAAK,CAAC,GACrC,MAAM,IAAI,CAEZ;AAED,wBAAgB,OAAO,IAAI,MAAM,IAAI,CAEpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let e=t;function t(){let e;return{getStore(){return e},run(t,n){let r=e;e=t;try{return n()}finally{e=r}}}}function n(t=`default`){let n=globalThis,r=n.__MMD_ASYNC_STORAGE__??=new Map,i=r.get(t);if(i!==void 0)return i;let a,o={getStore(){return a??=e(),a.getStore()},run(t,n){return a??=e(),a.run(t,n)}};return r.set(t,o),o}function r(){return new Map}function i(){if(typeof document>`u`)throw Error(`[memo-dom] no document available - server environments must inject a DocumentLike into their application runtime`);return document}function a(){return typeof requestAnimationFrame==`function`?requestAnimationFrame.bind(globalThis):null}function o(){return{mode:`client-create`,get document(){return i()},get schedule(){return a()},effects:`run`,refs:`run`}}function s(e){let t=o();return e===void 0?t:{mode:e.mode??t.mode,document:e.document??t.document,schedule:e.schedule===void 0?t.schedule:e.schedule,effects:e.effects??t.effects,refs:e.refs??t.refs,hydration:e.hydration}}const c=typeof queueMicrotask==`function`?queueMicrotask.bind(globalThis):e=>Promise.resolve().then(e);function l(e){return{registry:new Map,dirty:new Set,volatile:new Set,dirtyReasons:r(),cells:new Map,idsCache:null,generation:0,scheduler:c,volatileFrameScheduled:!1,scheduled:!1,inCommit:!1,renderingEntity:null,renderCounts:null,markedBy:null,extensions:new Map,environment:s(e)}}l(),n(`runtime`);function u(e){let t=e.length;for(let n=0;n<t;n++){let t=e.charCodeAt(n);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 d(e){if(e==null)return``;if(typeof e==`number`)return String(e);if(e===!0)return`true`;if(e===!1)return`false`;let t=String(e);return t===``?``:u(t)?t:encodeURIComponent(t).replace(/%20/g,`+`)}function f(e){return u(e)?e:encodeURIComponent(e).replace(/%20/g,`+`)}function p(e){if(!e.includes(`%`)&&!e.includes(`+`))return e;try{return decodeURIComponent(e.replace(/\+/g,` `))}catch{return e}}const m=Object.freeze(Object.create(null));let h=``,g=m;function _(e){if(!e||e===`?`||e===``)return m;if(e===h)return g;let t=Object.create(null),n=+(e.charCodeAt(0)===63),r=e.length,i=n,a=-1,o=!1,s=!1;for(let c=n;c<=r;c++){let n=c===r?38:e.charCodeAt(c);if(n===61&&a===-1)a=c+1;else if(n===38){if(c>i){let n,r;if(a===-1){let t=e.slice(i,c);n=o?p(t):t,r=``}else{let t=e.slice(i,a-1),l=e.slice(a,c);n=o?p(t):t,r=s?p(l):l}let l=t[n];l===void 0?t[n]=r:Array.isArray(l)?l.push(r):t[n]=[l,r]}i=c+1,a=-1,o=!1,s=!1}else(n===37||n===43)&&(a===-1?o=!0:s=!0)}for(let e of Object.keys(t)){let n=t[e];Array.isArray(n)&&Object.freeze(n)}let c=Object.freeze(t);return h=e,g=c,c}function v(e){if(e[0]>e[1]){let t=e[0];e[0]=e[1],e[1]=t}if(e[1]>e[2]){let t=e[1];e[1]=e[2],e[2]=t}if(e[0]>e[1]){let t=e[0];e[0]=e[1],e[1]=t}}function y(e){if(e[0]>e[1]){let t=e[0];e[0]=e[1],e[1]=t}if(e[2]>e[3]){let t=e[2];e[2]=e[3],e[3]=t}if(e[0]>e[2]){let t=e[0];e[0]=e[2],e[2]=t}if(e[1]>e[3]){let t=e[1];e[1]=e[3],e[3]=t}if(e[1]>e[2]){let t=e[1];e[1]=e[2],e[2]=t}}function b(e){let t=e.length;for(let n=1;n<t;n++){let t=e[n],r=n-1;for(;r>=0&&e[r]>t;)e[r+1]=e[r],r--;e[r+1]=t}}let x,S=``;function C(e){if(e===void 0)return!0;if(!Object.isFrozen(e))return!1;for(let t of Object.values(e))if(Array.isArray(t)&&!Object.isFrozen(t))return!1;return!0}function w(e){if(e===void 0)return``;let t=C(e);if(t&&e===x)return S;let n=e,r=Object.keys(n),i=r.length;if(i===0)return``;let a=``;if(i===1){let i=r[0],o=n[i];if(o==null)return``;let s=u(i)?i:f(i);if(!Array.isArray(o))a=`?${s}=${d(o)}`;else if(o.length>0)for(let e=0;e<o.length;e++){let t=o[e];t!=null&&(a+=(a===``?`?`:`&`)+s+`=`+d(t))}return t&&(x=e,S=a),a}if(i===2){let i=r[0],o=r[1],s=i<o?i:o,c=i<o?o:i,l=n[s],p=n[c];if(!Array.isArray(l)&&!Array.isArray(p)&&l!=null&&p!=null){let n=u(s)?s:f(s),r=u(c)?c:f(c);return a=`?${n}=${d(l)}&${r}=${d(p)}`,t&&(x=e,S=a),a}let m=[s,c];for(let e=0;e<2;e++){let t=m[e],r=n[t];if(r==null)continue;let i=u(t)?t:f(t);if(Array.isArray(r))for(let e=0;e<r.length;e++){let t=r[e];t!=null&&(a+=(a===``?`?`:`&`)+i+`=`+d(t))}else a+=(a===``?`?`:`&`)+i+`=`+d(r)}return t&&(x=e,S=a),a}i===3?v(r):i===4?y(r):i<=8?b(r):r.sort();for(let e=0;e<i;e++){let t=r[e],i=n[t];if(i==null)continue;let o=u(t)?t:f(t);if(Array.isArray(i))for(let e=0;e<i.length;e++){let t=i[e];t!=null&&(a+=(a===``?`?`:`&`)+o+`=`+d(t))}else a+=(a===``?`?`:`&`)+o+`=`+d(i)}return t&&(x=e,S=a),a}const T=Object.freeze(Object.create(null)),E=Object.freeze({"*":``}),D=Object.freeze([]);function O(e){let t={};for(let n=0;n<e.length;n++){let r=e[n],i=typeof r==`string`?{id:r,pattern:r}:r,a=K(i.pattern),o=F(a),s=[],c=t;for(let e=0;e<o.length;e++){let t=o[e];if(t===`*`){c.wildcardChild={id:i.id,pattern:a};break}if(t.startsWith(`:`)){let e=t.slice(1);s.push(e),c.paramChild===void 0&&(c.paramChild={name:e,node:{}}),c=c.paramChild.node}else{c.staticChildren===void 0&&(c.staticChildren=new Map);let e=c.staticChildren.get(t);e===void 0&&(e={},c.staticChildren.set(t,e)),c=e}}if(!a.endsWith(`/*`)){let e=Object.freeze([...s]);c.match={id:i.id,pattern:a,paramNames:e},e.length===0&&(c.staticMatch=Object.freeze({id:i.id,pattern:a,pathname:a,params:T}))}}function n(e,t,r,i,a){if(r===t.length){if(e.staticMatch!==void 0&&a===e.staticMatch.pathname)return e.staticMatch;if(e.match!==void 0){if(e.match.paramNames.length===0)return{id:e.match.id,pattern:e.match.pattern,pathname:a,params:T};let t={};for(let n=0;n<e.match.paramNames.length;n++)t[e.match.paramNames[n]]=Y(i[n]);return{id:e.match.id,pattern:e.match.pattern,pathname:a,params:Object.freeze(t)}}return e.wildcardChild===void 0?null:{id:e.wildcardChild.id,pattern:e.wildcardChild.pattern,pathname:a,params:E}}let o=t[r];if(e.staticChildren!==void 0){let s=e.staticChildren.get(o);if(s!==void 0){let e=n(s,t,r+1,i,a);if(e!==null)return e}}if(e.paramChild!==void 0){i.push(o);let s=n(e.paramChild.node,t,r+1,i,a);if(s!==null)return s;i.pop()}if(e.wildcardChild!==void 0){let n={"*":Y(t.slice(r).join(`/`))};return{id:e.wildcardChild.id,pattern:e.wildcardChild.pattern,pathname:a,params:Object.freeze(n)}}return null}let r=`\0`,i=null;return{match(e){if(e===r)return i;let a=V(e);if(a===r)return i;if(a===`/`){let n=null;return t.staticMatch===void 0?t.match===void 0?t.wildcardChild!==void 0&&(n={id:t.wildcardChild.id,pattern:t.wildcardChild.pattern,pathname:`/`,params:E}):n={id:t.match.id,pattern:t.match.pattern,pathname:`/`,params:T}:n=t.staticMatch,r=e,i=n,n}let o=[],s=1,c=a.length;for(let e=1;e<=c;e++)(e===c||a.charCodeAt(e)===47)&&(e>s&&o.push(a.slice(s,e)),s=e+1);let l=n(t,o,0,[],a);return r=e,i=l,l},resolve(e){let t=this.match(e.pathname);return t===null?D:[t]}}}const k=/^:([A-Za-z_$][A-Za-z0-9_$]*)$/,A=4096,j=Object.freeze(Object.create(null)),M=new Map,N=new Map;function P(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function F(e){return e.split(`/`).filter(Boolean)}function I(e){return F(K(e))}function L(e){return e===`*`?1:k.test(e)?2:3}let R=``,z=``;const ee=Object.create(null);let B=0;function V(e){if(e===`/`||e===``)return`/`;if(e===R)return z;let t=ee[e];if(t!==void 0)return R=e,z=t,t;let n=e.length,r;if(e.charCodeAt(0)===47&&e.charCodeAt(n-1)!==47&&!e.includes(`?`)&&!e.includes(`#`)&&!e.includes(`//`))r=e;else{let[t=``]=e.split(/[?#]/,1),n=t.replace(/^\/+|\/+$/g,``);r=n===``?`/`:`/${n}`}return B<A&&(ee[e]=r,B++),R=e,z=r,r}const H=`http://memoized-dom.relative`;function te(e,t){let n=new URL(e,H);if(n.origin!==H)throw TypeError(`Relative route base '${e}' must be same-origin`);let r;if(t===``)r=n;else if(t.startsWith(`?`)||t.startsWith(`#`))r=new URL(t,n);else{let e=new URL(n.href);e.search=``,e.hash=``,e.pathname.endsWith(`/`)||(e.pathname+=`/`),r=new URL(t,e)}if(r.origin!==H)throw TypeError(`Relative route destination '${t}' must be same-origin`);return`${V(r.pathname)}${r.search}${r.hash}`}let U=``,W=``,ne=``;function G(e,t){if(e===U&&t===W)return ne;let n=K(e),r=K(t),i;return i=r===`/`?n:n===`/`?r:K(`${n}${r}`),U=e,W=t,ne=i,i}function K(e){let t=N.get(e);if(t!==void 0)return t;if(e.includes(`?`)||e.includes(`#`))throw TypeError(`Route pattern '${e}' must not contain a query or hash`);if(e.includes(`//`))throw TypeError(`Route pattern '${e}' contains an empty path segment`);let n=V(e),r=new Set,i=F(n);for(let t=0;t<i.length;t++){let n=i[t];if(n===`*`){if(t!==i.length-1)throw TypeError(`Route wildcard must be terminal in '${e}'`);continue}if(!n.startsWith(`:`))continue;let a=k.exec(n);if(a===null)throw TypeError(`Invalid route parameter segment '${n}' in '${e}'`);let o=a[1];if(r.has(o))throw TypeError(`Duplicate route parameter '${o}' in '${e}'`);r.add(o)}if(N.size>=A){let e=N.keys().next().value;e!==void 0&&N.delete(e)}return N.set(e,n),n}function q(e){let t=new Set,n=new Map;for(let r of e){if(t.has(r.id))throw TypeError(`Duplicate route ID '${r.id}'`);t.add(r.id);let e=K(r.pattern).split(`/`).map(e=>e===`*`?`*`:e.startsWith(`:`)?`:param`:e).join(`/`),i=n.get(e);if(i!==void 0&&i!==r.id)throw TypeError(`Ambiguous routes '${i}' and '${r.id}' share pattern signature '${e}'`);n.set(e,r.id)}}function J(e){let t=K(e),n=M.get(t);if(n!==void 0)return n;let r=[],i=[],a=F(t),o=``;for(let e of a){if(e===`*`){r.push(`*`),i.push({kind:`wildcard`}),o+=`(?:/(.*))?`;continue}let t=k.exec(e);if(t!==null){let e=t[1];r.push(e),i.push({kind:`param`,name:e}),o+=`/([^/]+)`;continue}i.push({kind:`static`,text:`/${e}`}),o+=`/${P(e)}`}a.length===0&&(o=`/`);let s=o===`/`?``:o,c=r.length===0&&!t.includes(`*`)&&!t.includes(`:`),l=Object.freeze({pattern:t,pathname:t,params:j,consumed:t,remaining:`/`}),u={pattern:t,keys:r,chunks:i,isStatic:c,end:RegExp(`^${s||`/`}/*$`),prefix:RegExp(`^${s||``}(?=/|$)`),exactMatch:l};if(M.size>=A){let e=M.keys().next().value;e!==void 0&&M.delete(e)}return M.set(t,u),u}function Y(e){if(!e.includes(`%`))return e;try{return decodeURIComponent(e)}catch{return e}}function re(e,t,n={}){let r=J(e),i=V(t),a=n.end??!0;if(r.lastPath===i&&r.lastEnd===a)return r.lastResult;let o=null;if(r.isStatic){if(a)i===r.pattern&&(o=r.exactMatch);else if(r.pattern===`/`||i===r.pattern||i.startsWith(`${r.pattern}/`)){let e=r.pattern===`/`?i:i.slice(r.pattern.length);o={pattern:r.pattern,pathname:i,params:j,consumed:r.pattern,remaining:e===``||e===`/`?`/`:V(e)}}}else{let e=(a?r.end:r.prefix).exec(i);if(e!==null){let t;if(r.keys.length===0)t=j;else{let n={};for(let t=0;t<r.keys.length;t++){let i=e[t+1];i!==void 0&&(n[r.keys[t]]=Y(i))}t=Object.freeze(n)}let n=e[0]===``?`/`:e[0],a=i.slice(e[0].length);o={pattern:r.pattern,pathname:i,params:t,consumed:n,remaining:a===``?`/`:V(a)}}}return r.lastPath=i,r.lastEnd=a,r.lastResult=o,o}function ie(e,t){if(e===`.`||e===`..`)throw TypeError(`Route parameter '${t}' must not be a dot segment`);let n=e.length;for(let t=0;t<n;t++){let n=e.charCodeAt(t);if(!(n>=97&&n<=122||n>=65&&n<=90||n>=48&&n<=57||n===45||n===95||n===46))return encodeURIComponent(e)}return e}let X,ae,oe,se,ce=``;function le(e,t,n,r){let i=(t===void 0||Object.isFrozen(t))&&C(n);if(i&&e===X&&t===ae&&n===oe&&r===se)return ce;let a;if(t===void 0&&n===void 0&&r===void 0&&!e.includes(`:`)&&!e.includes(`*`))a=V(e);else{let i=J(e);if(i.isStatic){let e=w(n),t=r===void 0||r===``?``:r.startsWith(`#`)?r:`#${r}`;a=`${i.pattern}${e}${t}`}else{let o=t,s=``;for(let t=0;t<i.chunks.length;t++){let n=i.chunks[t];if(n.kind===`static`)s+=n.text;else if(n.kind===`param`){let t=o?.[n.name];if(t===void 0)throw TypeError(`Missing route parameter '${n.name}' for '${e}'`);s+=`/${ie(String(t),n.name)}`}else{let t=o?.[`*`];if(t===void 0)throw TypeError(`Missing route parameter '*' for '${e}'`);let n=String(t).split(`/`);if(n.some(e=>e===``||e===`.`||e===`..`))throw TypeError(`Route wildcard '*' contains an invalid path segment`);for(let e=0;e<n.length;e++)s+=`/${ie(n[e],`*`)}`}}s===``&&(s=`/`);let c=w(n),l=r===void 0||r===``?``:r.startsWith(`#`)?r:`#${r}`;a=`${s}${c}${l}`}}return i&&(X=e,ae=t,oe=n,se=r,ce=a),a}function ue(e){let t=1;for(let n of I(e))t=t*4+L(n);return t}function de(e,t){let n=I(e),r=I(t),i=Math.max(n.length,r.length);for(let e=0;e<i;e++){let t=n[e],i=r[e];if(t===void 0)return 1;if(i===void 0)return-1;if(t!==i)return L(i)-L(t)}return 0}const fe=Object.freeze([]);function pe(e){return F(e).map(e=>e===`*`?`*`:e.startsWith(`:`)?`:param`:e).join(`/`)}function me(e){let t=[];for(let n of F(e))n===`*`?t.push(`*`):n.startsWith(`:`)&&t.push(n.slice(1));return Object.freeze(t)}function he(e,t){let n=t.parent;for(;n!==null;){if(n===e)return!0;n=n.parent}return!1}function ge(e){let t=new Map;for(let n of e){let e=typeof n==`string`?{id:n,pattern:n}:n;if(e.id.trim()===``)throw TypeError(`Route IDs must not be empty`);if(t.has(e.id))throw TypeError(`Duplicate route ID '${e.id}'`);t.set(e.id,e)}let n=new Map,r=new Set;function i(e){let a=n.get(e);if(a!==void 0)return a;let o=t.get(e);if(o===void 0)throw TypeError(`Unknown route ID '${e}'`);if(r.has(e))throw TypeError(`Route parent cycle includes '${e}'`);r.add(e);try{let r=K(o.pattern),a=null,s=r,c=0;if(o.parentId!==void 0){if(!t.has(o.parentId))throw TypeError(`Route '${e}' references missing parent '${o.parentId}'`);a=i(o.parentId);let n=new Set(me(a.fullPattern));for(let t of me(r))if(n.has(t))throw TypeError(`Route '${e}' shadows active parameter '${t}'`);s=G(a.fullPattern,r),c=a.depth+1}let l=Object.freeze({id:o.id,pattern:r,parentId:o.parentId,metadata:o.metadata,fullPattern:s,depth:c,ownParamNames:me(r),parent:a});return n.set(e,l),l}finally{r.delete(e)}}for(let e of t.keys())i(e);let a=[...n.values()].sort((e,t)=>e.depth-t.depth),o=new Map;for(let e of a){let t=pe(e.fullPattern),n=o.get(t);if(n!==void 0&&!he(n,e)&&!he(e,n))throw TypeError(`Ambiguous routes '${n.id}' and '${e.id}' share pattern signature '${t}'`);o.set(t,e);let r=new Set,i=[],a=e;for(;a!==null;)i.push(a),a=a.parent;for(let t=i.length-1;t>=0;t--)for(let n of i[t].ownParamNames){if(r.has(n))throw TypeError(`Route '${e.id}' shadows active parameter '${n}'`);r.add(n)}}let s=O(a.map(e=>({id:e.id,pattern:e.fullPattern}))),c=Object.freeze(a.map(e=>Object.freeze({id:e.id,pattern:e.pattern,parentId:e.parentId,metadata:e.metadata,fullPattern:e.fullPattern,depth:e.depth})));function l(e){let t=s.match(e);if(t===null)return fe;let r=n.get(t.id),i=[],a=r;for(;a!==null;)i.push(a),a=a.parent;i.reverse();let o=Array(i.length);for(let t=0;t<i.length;t++){let n=i[t],r=re(n.fullPattern,e,{end:t===i.length-1});if(r===null)throw Error(`Resolved route '${n.id}' did not match '${e}'`);let a={};for(let e of n.ownParamNames){let t=r.params[e];t!==void 0&&(a[e]=t)}o[t]=Object.freeze({id:n.id,pattern:n.pattern,pathname:r.consumed,params:Object.freeze(a),metadata:n.metadata})}return Object.freeze(o)}return Object.freeze({entries:c,get(e){return c.find(t=>t.id===e)},match(e){return l(e).at(-1)??null},matchAll:l,resolve(e){return l(e.pathname)},build(e,t={}){let r=n.get(e);if(r===void 0)throw TypeError(`Unknown route ID '${e}'`);return le(r.fullPattern,t.params,t.query,t.hash)}})}const Z=`__mmd_scroll_`;function _e(e){try{if(typeof sessionStorage>`u`)return;let t=sessionStorage.getItem(`${Z}${e}`);if(t===null)return;let n=JSON.parse(t);if(typeof n.x==`number`&&typeof n.y==`number`)return{x:n.x,y:n.y}}catch{}}function ve(e,t){try{if(typeof sessionStorage>`u`)return;sessionStorage.setItem(`${Z}${e}`,JSON.stringify(t))}catch{}}function ye(e,t){if(t===``||t===`#`)return null;let n=t.startsWith(`#`)?t.slice(1):t,r=decodeURIComponent(n);return e.getElementById(r)??e.querySelector(`[name="${CSS.escape(r)}"]`)}function be(e={}){let t=e.window??(typeof window>`u`?void 0:window),n=e.document??(typeof document>`u`?void 0:document),r=e.history??(typeof window>`u`?void 0:window.history),i=new Map,a=null,o,s=null,c=!1;function l(){return t===void 0?{x:0,y:0}:{x:t.scrollX??t.pageXOffset??0,y:t.scrollY??t.pageYOffset??0}}function u(e,t){if(i.size>=100){let e=i.keys().next().value;e!==void 0&&i.delete(e)}i.set(e,t),ve(e,t)}function d(e){let t=i.get(e);if(t!==void 0)return t;let n=_e(e);if(n!==void 0)return i.set(e,n),n}function f(){a!==null&&s===null&&(s=(t?.requestAnimationFrame??setTimeout)(()=>{s=null,a!==null&&u(a,l())}))}function p(){a!==null&&u(a,l())}return{capture(e){let t=e??a;t!=null&&u(t,l())},restore(e,r,i){if(a=i??null,t===void 0)return;let o=e=>{typeof t.requestAnimationFrame==`function`?t.requestAnimationFrame(e):setTimeout(e,0)};if(e.hash!==``&&e.hash!==`#`&&n!==void 0){o(()=>{let t=ye(n,e.hash);t===null?o(()=>{ye(n,e.hash)?.scrollIntoView({block:`start`})}):t.scrollIntoView({block:`start`})});return}if(r===`pop`){let e=i==null?void 0:d(i);o(()=>{e===void 0?t.scrollTo(0,0):t.scrollTo(e.x,e.y)});return}if(r===`push`){o(()=>{t.scrollTo(0,0)});return}},connect(){if(c)return()=>{};if(c=!0,r!==void 0&&`scrollRestoration`in r){o=r.scrollRestoration;try{r.scrollRestoration=`manual`}catch{}}return t!==void 0&&(t.addEventListener(`scroll`,f,{passive:!0}),t.addEventListener(`beforeunload`,p,{passive:!0})),()=>{if(c){if(c=!1,s!==null&&t!==void 0&&((t.cancelAnimationFrame??clearTimeout)(s),s=null),r!==void 0&&o!==void 0&&`scrollRestoration`in r)try{r.scrollRestoration=o}catch{}t!==void 0&&(t.removeEventListener(`scroll`,f),t.removeEventListener(`beforeunload`,p))}}},dispose(){i.clear(),a=null,s!==null&&t!==void 0&&((t.cancelAnimationFrame??clearTimeout)(s),s=null)}}}var xe=class extends Error{cause;constructor(e){super(`A route observer failed after the history update committed`),this.name=`RouteHistoryCommittedUpdateError`,this.cause=e}};function Se(e,t){throw e instanceof xe?e.cause:(t(),e)}function Ce(e){return typeof e==`string`||e instanceof URL?{href:e}:e}function we(e={}){let t=new URL(e.origin??`http://memoized-dom.local`),n=e.initialEntries??[`/`];if(n.length===0)throw TypeError(`Memory route history requires at least one initial entry`);let r=0,i=(e,n,i)=>{let a=Ce(e);return Object.freeze({key:i??`memory-${r++}`,index:n,href:new URL(a.href,t).href,state:a.state??null})},a=n.map((e,t)=>i(e,t)),o=e.initialIndex??a.length-1;if(!Number.isInteger(o)||o<0||o>=a.length)throw RangeError(`Memory route history initialIndex ${o} is outside 0..${a.length-1}`);let s=!1,c=new Set;function l(){if(s)throw Error(`Cannot use a destroyed memory route history`)}function u(e){let t=Object.freeze({action:e,location:a[o]}),n=[];for(let e of[...c])if(c.has(e))try{e(t)}catch(e){n.push(e)}if(n.length===1)throw n[0];if(n.length>1)throw AggregateError(n,`Route history listeners failed`)}function d(e){if(l(),!Number.isInteger(e))throw TypeError(`Memory route history delta must be an integer`);let t=o+e;if(t<0||t>=a.length||t===o)return;let n=o;o=t;try{u(`pop`)}catch(e){Se(e,()=>{o=n})}}return{get location(){return a[o]},get canGoBack(){return o>0},get canGoForward(){return o<a.length-1},peek(e){if(l(),!Number.isInteger(e))throw TypeError(`Memory route history delta must be an integer`);return a[o+e]},push(e,t=null){l();let n=a,r=o,s=o+1;a=a.slice(0,s),a.push(i({href:e,state:t},s)),o=s;try{u(`push`)}catch(e){Se(e,()=>{a=n,o=r})}},replace(e,t=null){l();let n=a[o];a[o]=i({href:e,state:t},o,a[o].key);try{u(`replace`)}catch(e){Se(e,()=>{a[o]=n})}},go:d,back(){d(-1)},forward(){d(1)},subscribe(e){return l(),c.add(e),()=>c.delete(e)},destroy(){s||(s=!0,c.clear())}}}const Te=`http://memoized-dom.local`;function Ee(e=typeof window>`u`?{}:window){return e.navigation!==void 0}function De(e){let t=e.location?.href;return new URL(t??`/`,t??Te)}function Oe(e){return Object.freeze({...e,params:Object.freeze({...e.params})})}const ke=new WeakMap;var Ae=class{_search;constructor(e){this._search=e}_ensure(){let e=ke.get(this);return e===void 0&&(e=new URLSearchParams(this._search),ke.set(this,e)),e}get size(){return this._ensure().size}get(e){return this._ensure().get(e)}getAll(e){return this._ensure().getAll(e)}has(e,t){return this._ensure().has(e,t)}entries(){return this._ensure().entries()}keys(){return this._ensure().keys()}values(){return this._ensure().values()}forEach(e,t){this._ensure().forEach((n,r)=>e.call(t,n,r,this))}toString(){return this._search.startsWith(`?`)?this._search.slice(1):this._search}[Symbol.iterator](){return this._ensure()[Symbol.iterator]()}};function je(e){return Object.freeze(new Ae(e))}function Me(e){let t=e.length;if(t===0)return{matches:Object.freeze([]),params:Object.freeze({})};if(t===1){let t=e[0];if(t.id.trim()===``)throw TypeError(`Route match IDs must not be empty`);let n=K(t.pattern),r={};for(let e in t.params)r[e]=t.params[e];return{matches:Object.freeze([Oe({...t,pattern:n})]),params:Object.freeze(r)}}let n=new Set,r={},i=Array(t);for(let a=0;a<t;a++){let t=e[a];if(t.id.trim()===``)throw TypeError(`Route match IDs must not be empty`);if(n.has(t.id))throw TypeError(`Duplicate active route ID '${t.id}'`);n.add(t.id);let o=K(t.pattern);for(let e in t.params){if(Object.hasOwn(r,e))throw TypeError(`Duplicate active route parameter '${e}'`);r[e]=t.params[e]}i[a]=Oe({...t,pattern:o})}return{matches:Object.freeze(i),params:Object.freeze(r)}}function Ne(e,t){return e.length===t.length&&e.every((e,n)=>{let r=t[n];if(r===void 0||e.id!==r.id||e.pattern!==r.pattern||e.pathname!==r.pathname)return!1;let i=Object.keys(e.params);return i.length===Object.keys(r.params).length&&i.every(t=>e.params[t]===r.params[t])})}function Pe(e,t){return typeof e==`object`&&e&&!Array.isArray(e)?{...e,__mmd_key:t}:{__mmd_val:e,__mmd_key:t}}function Fe(e){if(typeof e==`object`&&e){let t=e,n=typeof t.__mmd_key==`string`?t.__mmd_key:null;if(`__mmd_val`in t)return{userState:t.__mmd_val,key:n};if(n!==null){let{__mmd_key:e,...r}=t;return{userState:r,key:n}}}return{userState:e,key:null}}function Ie(){return`k_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}function Le(e=typeof window>`u`?{}:window){let t=typeof e==`object`&&e&&(`routes`in e||`resolver`in e||`environment`in e||`routeHistory`in e||`basePath`in e)?e:{environment:e},n=t.environment??(typeof window>`u`?{}:window),r=t.routeHistory,i=K(t.basePath??`/`);if(i.includes(`:`)||i.includes(`*`))throw TypeError(`Route runtime basePath must be static`);function a(e){let t=V(e);return i===`/`?t:t===i?`/`:t.startsWith(`${i}/`)?t.slice(i.length):null}function o(e){let t=new URL(e,Te);if(t.origin!==Te)throw TypeError(`Route destination '${e}' must be application-relative`);let n=V(t.pathname),r=i===`/`?n:n===`/`?i:`${i}${n}`;return new URL(`${r}${t.search}${t.hash}`,s)}let s=r===void 0?De(n):new URL(r.location.href,Te),c=a(s.pathname);if(c===null)throw TypeError(`Initial URL pathname '${s.pathname}' is outside router basePath '${i}'`);let l=c,u=Fe(r?.location.state??n.history?.state??null),d=u.userState,f=u.key??Ie(),p=be({window:typeof window>`u`?void 0:window,document:typeof document>`u`?void 0:document,history:n.history}),m=null,h=`load`,g=Object.freeze([]),_=Object.freeze({}),v=je(s.search),y=new AbortController,b=!1,x=0,S=!1,C=t.resolver??null;if(C===null&&t.routes!==void 0){let e=ge(t.routes);C=e.resolve.bind(e)}let w=!1,T=!1,E=0,D=0,O=0,k=0,A=0,j=!1,M=!1,N=new Set,P=new Set,F=new Set,I=new Set,L=null,R=Object.freeze({get href(){return s.href},get pathname(){return l},get search(){return s.search},get query(){return v},get hash(){return s.hash},get state(){return d},get navigationType(){return h},get params(){return _},get matches(){return g},get matched(){return g.at(-1)??null},get signal(){return b=!0,y.signal}});function z(){return Object.freeze({href:R.href,pathname:R.pathname,search:R.search,query:R.query,hash:R.hash,state:R.state,navigationType:R.navigationType,params:R.params,matches:R.matches,matched:R.matched,signal:R.signal})}function ee(){return Object.freeze({href:s.href,pathname:l,search:s.search,query:v,hash:s.hash,state:d,navigationType:h,get signal(){return b=!0,y.signal}})}function B(){if(E++,N.size===0&&P.size===0)return;if(j){M=!0;return}j=!0;let e=[];try{do{M=!1;let t=E;if(N.size!==0){let n=z();for(let r of[...N])if(N.has(r)){try{r(n)}catch(t){e.push(t)}if(E!==t){M=!0;break}}}if(E===t){for(let n of[...P])if(P.has(n)){try{let e=n.selector(R);n.equals(n.value,e)||(n.value=e,n.listener(e,R))}catch(t){e.push(t)}if(E!==t){M=!0;break}}}}while(M)}finally{j=!1}if(e.length===1)throw e[0];if(e.length>1)throw AggregateError(e,`Route listeners failed`)}function H(e){if(w)throw Error(`Route resolvers must not mutate router state`);w=!0;try{return Me(e(ee()))}finally{w=!1}}if(C!==null){let e=H(C);g=e.matches,_=e.params}function U(e,t=`replace`,n=null,r=!1){if(S)throw Error(`Cannot set location on a disposed route runtime`);if(w||T)throw Error(`Route resolvers and blockers must not mutate router state`);let o=typeof e==`string`?new URL(e,s):e,c=a(o.pathname);if(c===null)throw TypeError(`URL pathname '${o.pathname}' is outside router basePath '${i}'`);if(!(o.href!==s.href||!Object.is(n,d)))return;let u=s,m=l,x=d,E=h,O=v,k=y,A=b;A&&(y=new AbortController,b=!1),s=o,l=c,d=n,h=t,v=je(s.search);let j;try{j=C===null?Me([]):H(C)}catch(e){throw s=u,l=m,d=x,h=E,v=O,A&&(y.abort(),y=k,b=A),e}g=j.matches,_=j.params,A&&k.abort(),D++;try{B()}catch(e){throw r?new xe(e):e}p.restore(s,h,f)}r!==void 0&&(L=r.subscribe(e=>{U(e.location.href,e.action,e.location.state,!0)}));function W(e,t){if(e.origin!==s.origin)throw TypeError(`Route destination '${e.href}' must be same-origin`);let n=a(e.pathname);if(n===null)throw TypeError(`URL pathname '${e.pathname}' is outside router basePath '${i}'`);return Object.freeze({href:e.href,pathname:n,search:e.search,hash:e.hash,state:t})}function ne(e,t,n,r,i=r.replace?`replace`:`push`){return Object.freeze({id:e,from:t,to:W(n,r.state??null),type:i})}function G(e){let t=[];for(let n of[...I])if(I.has(n))try{n(e)}catch(e){t.push(e)}if(t.length===1)throw t[0];if(t.length>1)throw AggregateError(t,`Route navigation listeners failed`)}function q(e,t,n=t.replace?`replace`:`push`){let r=++k,i=W(s,d),a=e,c=t,l=n,u=0;for(;;){let e=ne(r,i,a,c,l);u===0&&G(Object.freeze({phase:`start`,navigation:e}));let t=!1;T=!0;try{for(let n of[...F]){if(!F.has(n))continue;let r=n(e);if(typeof r==`object`&&r&&`then`in r)throw TypeError(`Route navigation blockers must be synchronous; async work belongs to the data boundary`);if(r===!1)return G(Object.freeze({phase:`blocked`,navigation:e})),Object.freeze({status:`blocked`,navigation:e,redirects:u});if(typeof r==`object`&&r&&`to`in r){if(u++,u>16)throw Error(`Route navigation exceeded 16 redirects`);G(Object.freeze({phase:`redirect`,navigation:e,redirect:r})),a=r.to instanceof URL?new URL(r.to.href):o(te(e.to.pathname,r.to)),c={replace:r.replace??c.replace,state:r.state??null},l=c.replace?`replace`:`push`,t=!0;break}}}finally{T=!1}if(!t)return{status:`ready`,next:a,options:c,navigation:e,redirects:u}}}let J=()=>{let e=n.location;if(e!==void 0&&a(new URL(e.href).pathname)!==null){let{userState:t,key:r}=Fe(n.history?.state??null);r!==null&&(f=r),U(e.href,`pop`,t)}},Y=()=>{let e=n.location;e!==void 0&&e.href!==s.href&&a(new URL(e.href).pathname)!==null&&U(e.href,`pop`,n.history?.state??null)},re=e=>{let t=e;if(t.defaultPrevented||t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey)return;let n=t.composedPath().find(e=>e instanceof HTMLAnchorElement&&e.hasAttribute(`href`)),r=t.target,i=n??(r instanceof Element?r.closest(`a[href]`):null);if(i===null||i.hasAttribute(`download`)||i.target!==``&&i.target.toLowerCase()!==`_self`||i.relList.contains(`external`))return;let o=new URL(i.href,s);o.origin!==s.origin||a(o.pathname)===null||o.protocol!==`http:`&&o.protocol!==`https:`||(o.pathname!==s.pathname||o.search!==s.search||o.hash===s.hash)&&(t.preventDefault(),_e(o,{state:null}))},ie=e=>{O++;let t=e;if(!t.canIntercept||t.downloadRequest!==null&&t.downloadRequest!==void 0)return;let n=new URL(t.destination.url,s);if(n.origin!==s.origin||a(n.pathname)===null)return;let r=t.navigationType===`traverse`?`pop`:t.navigationType===`push`?`push`:`replace`,i=t.destination.getState?.()??null;if(A===0){let e=q(n,{replace:r!==`push`,state:i},r);if(e.status===`blocked`){t.preventDefault();return}if(e.next.href!==n.href){t.preventDefault(),Z(e.next,e.options),G(Object.freeze({phase:`complete`,navigation:e.navigation}));return}U(n,r,i),G(Object.freeze({phase:`complete`,navigation:e.navigation})),t.hashChange||t.intercept({scroll:`after-transition`,async handler(){await Promise.resolve()}});return}if(t.hashChange){U(n,r,i);return}U(n,r,i),t.intercept({scroll:`after-transition`,async handler(){await Promise.resolve()}})};function X(){if(w)throw Error(`Route resolvers must not mutate router state`);x!==0&&(x--,x===0&&(m?.(),m=null,r===void 0&&(Ee(n)?n.navigation.removeEventListener(`navigate`,ie):(n.removeEventListener?.(`popstate`,J),n.removeEventListener?.(`hashchange`,Y),n.removeEventListener?.(`click`,re)))))}function ae(){if(S)throw Error(`Cannot connect a disposed route runtime`);if(w)throw Error(`Route resolvers must not mutate router state`);x++;try{if(x===1&&(m=p.connect(),r!==void 0||(Ee(n)?n.navigation.addEventListener(`navigate`,ie):(n.addEventListener?.(`popstate`,J),n.addEventListener?.(`hashchange`,Y),n.addEventListener?.(`click`,re))),r===void 0&&n.location!==void 0&&a(new URL(n.location.href).pathname)!==null)){let{userState:e,key:t}=Fe(n.history?.state??null);t!==null&&(f=t),U(n.location.href,`replace`,e)}}catch(e){throw X(),e}let e=!0;return()=>{e&&(e=!1,X())}}function oe(e){if(S)throw Error(`Cannot subscribe to a disposed route runtime`);if(w)throw Error(`Route resolvers must not mutate router state`);N.add(e);try{e(z())}catch(t){throw N.delete(e),t}return()=>N.delete(e)}function se(e,t,n=Object.is){if(S)throw Error(`Cannot subscribe to a disposed route runtime`);if(w||T)throw Error(`Route resolvers and blockers must not mutate router state`);let r={selector:e,listener:t,equals:n,value:e(R)};P.add(r);try{t(r.value,R)}catch(e){throw P.delete(r),e}return()=>P.delete(r)}function ce(e){if(S)throw Error(`Cannot install a blocker on a disposed route runtime`);if(w||T)throw Error(`Route resolvers and blockers must not mutate router state`);return F.add(e),()=>F.delete(e)}function ue(e){if(S)throw Error(`Cannot subscribe to a disposed route runtime`);if(w||T)throw Error(`Route resolvers and blockers must not mutate router state`);return I.add(e),()=>I.delete(e)}function de(e){if(S)throw Error(`Cannot install a resolver on a disposed route runtime`);if(T)throw Error(`Route blockers must not mutate router state`);if(C!==null)throw Error(`A route runtime can only have one structural resolver`);let t=H(e);C=e,Ne(g,t.matches)||(g=t.matches,_=t.params,B());let n=!0;return()=>{if(n){if(w)throw Error(`Route resolvers must not mutate router state`);n=!1,C===e&&(C=null,!(S||g.length===0)&&(g=Object.freeze([]),_=Object.freeze({}),B()))}}}function fe(e){if(S)throw Error(`Cannot replace a resolver on a disposed route runtime`);if(w||T)throw Error(`Route resolvers and blockers must not mutate router state`);let t=H(e);C=e,Ne(g,t.matches)||(g=t.matches,_=t.params,B());let n=!0;return()=>{if(n){if(w)throw Error(`Route resolvers must not mutate router state`);n=!1,C===e&&(C=null,!(S||g.length===0)&&(g=Object.freeze([]),_=Object.freeze({}),B()))}}}function pe(e){if(S)throw Error(`Cannot set matches on a disposed route runtime`);if(w)throw Error(`Route resolvers must not mutate router state`);if(C!==null)throw Error(`Cannot set matches while a structural resolver is installed`);let t=Me(e);Ne(g,t.matches)||(g=t.matches,_=t.params,B())}function me(e,...t){if(S)throw Error(`Cannot navigate with a disposed route runtime`);if(w)throw Error(`Route resolvers must not mutate router state`);let n=t[0]??{};return _e(o(le(e,n.params,n.query,n.hash)),n)}function he(e,...t){if(S)throw Error(`Cannot navigate with a disposed route runtime`);if(w||T)throw Error(`Route resolvers and blockers must not mutate router state`);let n=t[0]??{},r;return(e.startsWith(`?`)||e.startsWith(`#`)||e===``)&&n.params===void 0&&n.query===void 0&&n.hash===void 0?r=e:(r=le(e,n.params,n.query,n.hash),e.startsWith(`/`)||(r=r.slice(1))),_e(o(te(n.from??R.pathname,r)),n)}function Z(e,t){if(p.capture(f),t.replace||(f=Ie()),r!==void 0){let n=D;t.replace?r.replace(e,t.state??null):r.push(e,t.state??null),D===n&&U(e,t.replace?`replace`:`push`,t.state??null);return}let i=n.navigation;if(i!==void 0){let n=D,r=O;A++;try{i.navigate(e.href,{history:t.replace?`replace`:`push`,state:t.state??null})}finally{A--}O===r&&D===n&&U(e,t.replace?`replace`:`push`,t.state??null);return}let a=n.history;if(a!==void 0){let n=Pe(t.state??null,f);t.replace?a.replaceState(n,``,e):a.pushState(n,``,e)}U(e,t.replace?`replace`:`push`,t.state??null)}function _e(e,t){if(S)throw Error(`Cannot navigate with a disposed route runtime`);if(w||T)throw Error(`Route resolvers and blockers must not mutate router state`);let n=q(e,t);if(n.status===`blocked`)return n;let{next:r,options:i,navigation:a,redirects:o}=n;return Z(r,i),G(Object.freeze({phase:`complete`,navigation:a})),Object.freeze({status:`completed`,navigation:a,redirects:o})}function ve(e){if(r===void 0)return null;let t=r.peek(e);if(t===void 0)return null;let n=new URL(t.href,s),i=q(n,{replace:!0,state:t.state},`pop`);return i.status===`blocked`?i:(i.navigation.type===`pop`&&i.next.href===n.href?r.go(e):Z(i.next,i.options),G(Object.freeze({phase:`complete`,navigation:i.navigation})),Object.freeze({status:`completed`,navigation:i.navigation,redirects:i.redirects}))}function ye(){if(S)throw Error(`Cannot navigate with a disposed route runtime`);if(w||T)throw Error(`Route resolvers and blockers must not mutate router state`);return r===void 0?(n.navigation===void 0?n.history?.back():n.navigation.back(),null):ve(-1)}function Se(){if(S)throw Error(`Cannot navigate with a disposed route runtime`);if(w||T)throw Error(`Route resolvers and blockers must not mutate router state`);return r===void 0?(n.navigation===void 0?n.history?.forward():n.navigation.forward(),null):ve(1)}function Ce(){if(!S){if(w||T)throw Error(`Route resolvers and blockers must not mutate router state`);for(;x>0;)X();m?.(),m=null,p.dispose(),L?.(),L=null,S=!0,y.abort(),N.clear(),P.clear(),F.clear(),I.clear(),C=null,g=Object.freeze([]),_=Object.freeze({})}}return{route:R,snapshot:z,subscribe:oe,subscribeSelected:se,subscribeNavigation:ue,blockNavigation:ce,connect:ae,installResolver:de,replaceResolver:fe,navigate:me,navigateRelative:he,back:ye,forward:Se,setLocation:U,setMatches:pe,dispose:Ce}}const Re=Le(),ze=n(`router`);let Be=null,Q=null;const Ve=new WeakSet;function $(){return ze.getStore()??Be??Re}function He(e,t){return Q!==null&&!Ve.has(e)&&(Ve.add(e),e.replaceResolver(Q)),ze.run(e,t)}function Ue(e){let t=$();return Be=e,e!==null&&Q!==null&&!Ve.has(e)&&(e.replaceResolver(Q),Ve.add(e)),t}function We(e){return Q=e,$().replaceResolver(e)}const Ge=Object.freeze({get href(){return $().route.href},get pathname(){return $().route.pathname},get search(){return $().route.search},get query(){return $().route.query},get hash(){return $().route.hash},get state(){return $().route.state},get navigationType(){return $().route.navigationType},get params(){return $().route.params},get matches(){return $().route.matches},get matched(){return $().route.matched},get signal(){return $().route.signal}});function Ke(e,...t){return $().navigate(e,...t)}function qe(e,...t){return $().navigateRelative(e,...t)}function Je(e){return $().subscribeNavigation(e)}function Ye(){return $().back()}function Xe(){return $().forward()}function Ze(e){return $().subscribe(e)}function Qe(e,t,n){return $().subscribeSelected(e,t,n)}function $e(){return $().connect()}function et(e,t={}){return Object.freeze({to:e,...t})}export{_ as A,V as C,q as D,K as E,O,re as S,te as T,we as _,Xe as a,de as b,qe as c,Ue as d,Ze as f,Ee as g,Le as h,$e as i,w as k,We as l,Qe as m,Ge as n,$ as o,Je as p,Ye as r,Ke as s,et as t,He as u,ge as v,ue as w,G as x,le as y};
|
package/dist/history.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;IAEjC,YAAY,KAAK,EAAE,OAAO,EAIzB;CACF;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
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import type { NavigateArguments, RelativeNavigateArguments, RouteNavigationBlocker, RouteNavigationListener } from './types';
|
|
1
2
|
export declare const route: import("./types").RouteState;
|
|
2
|
-
export declare
|
|
3
|
-
export declare
|
|
4
|
-
export declare
|
|
5
|
-
export declare
|
|
6
|
-
export declare
|
|
7
|
-
export declare
|
|
3
|
+
export declare function navigate<Path extends string>(pattern: Path, ...arguments_: NavigateArguments<Path>): import("./types").RouteNavigationResult;
|
|
4
|
+
export declare function navigateRelative<Path extends string>(pattern: Path, ...arguments_: RelativeNavigateArguments<Path>): import("./types").RouteNavigationResult;
|
|
5
|
+
export declare function blockNavigation(blocker: RouteNavigationBlocker): () => void;
|
|
6
|
+
export declare function subscribeNavigation(listener: RouteNavigationListener): () => void;
|
|
7
|
+
export declare function back(): import("./types").RouteNavigationResult | null;
|
|
8
|
+
export declare function forward(): import("./types").RouteNavigationResult | null;
|
|
9
|
+
export { getActiveRouteRuntime, setActiveRouteRuntime, runWithRouteRuntime } from './active-runtime';
|
|
8
10
|
export { createRouteRuntime, supportsNavigationAPI } from './runtime';
|
|
9
11
|
export { redirectRoute } from './types';
|
|
10
12
|
export type { RouteEnvironment, RouteRuntime, RouteRuntimeOptions } from './runtime';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,SAAS,CAAC;AAQjB,eAAO,MAAM,KAAK,8BAAc,CAAC;AACjC,wBAAgB,QAAQ,CAAC,IAAI,SAAS,MAAM,EAC1C,OAAO,EAAE,IAAI,EACb,GAAG,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,2CAGvC;AACD,wBAAgB,gBAAgB,CAAC,IAAI,SAAS,MAAM,EAClD,OAAO,EAAE,IAAI,EACb,GAAG,UAAU,EAAE,yBAAyB,CAAC,IAAI,CAAC,2CAG/C;AACD,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,IAAI,CAE3E;AACD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,uBAAuB,GAChC,MAAM,IAAI,CAEZ;AACD,wBAAgB,IAAI,mDAEnB;AACD,wBAAgB,OAAO,mDAEtB;AACD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAErG,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
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{A as e,C as t,D as n,E as r,O as i,S as a,T as o,_ as s,a as c,b as l,d as u,g as d,h as f,k as p,n as m,o as h,r as g,t as _,u as v,v as y,w as b,x,y as S}from"./chunks/types-BWmc67Zg.js";const C=m;function w(e,...t){return h().navigate(e,...t)}function T(e,...t){return h().navigateRelative(e,...t)}function E(e){return h().blockNavigation(e)}function D(e){return h().subscribeNavigation(e)}function O(){return g()}function k(){return c()}export{O as back,E as blockNavigation,S as buildRoutePath,l as compareRoutePatterns,s as createMemoryRouteHistory,y as createRouteManifest,i as createRouteMatcher,p as createRouteQuery,f as createRouteRuntime,k as forward,h as getActiveRouteRuntime,x as joinRoutePaths,a as matchRoutePattern,w as navigate,T as navigateRelative,t as normalizeRoutePath,e as parseRouteQuery,b as rankRoutePattern,_ as redirectRoute,o as resolveRoutePath,C as route,v as runWithRouteRuntime,u as setActiveRouteRuntime,D as subscribeNavigation,d as supportsNavigationAPI,r as validateRoutePattern,n as validateRoutePatterns};
|
package/dist/internal.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import type { RouteNavigationBlocker as Blocker, RouteResolver } from './types';
|
|
2
|
+
import { navigate as activeNavigate, navigateRelative as activeNavigateRelative, subscribe as activeSubscribe, subscribeNavigation as activeSubscribeNavigation, subscribeSelected as activeSubscribeSelected } from './active-runtime';
|
|
1
3
|
export declare const route: import("./types").RouteState;
|
|
2
|
-
export declare const navigateRoute:
|
|
4
|
+
export declare const navigateRoute: typeof activeNavigate;
|
|
3
5
|
export { createRouteRuntime, supportsNavigationAPI } from './runtime';
|
|
4
6
|
export { redirectRoute } from './types';
|
|
5
7
|
export { createRouteManifest } from './manifest';
|
|
@@ -9,13 +11,13 @@ export { createMemoryRouteHistory } from './history';
|
|
|
9
11
|
export type { RouteHistory } from './history';
|
|
10
12
|
export { buildRoutePath } from './path';
|
|
11
13
|
/** Compiler-runtime boundary. Application code should not need these calls. */
|
|
12
|
-
export declare const connectRouter: () => () => void;
|
|
14
|
+
export declare const connectRouter: () => (() => void);
|
|
13
15
|
export declare function ensureRouterConnected(): void;
|
|
14
|
-
export declare
|
|
15
|
-
export declare
|
|
16
|
-
export declare const navigateRouteRelative:
|
|
17
|
-
export declare
|
|
18
|
-
export declare const subscribeRouteNavigation:
|
|
19
|
-
export declare const subscribeRoute:
|
|
20
|
-
export declare const subscribeRouteSelected:
|
|
16
|
+
export declare function installRouteResolver(resolver: RouteResolver): () => void;
|
|
17
|
+
export declare function replaceRouteResolver(resolver: RouteResolver): () => void;
|
|
18
|
+
export declare const navigateRouteRelative: typeof activeNavigateRelative;
|
|
19
|
+
export declare function blockRouteNavigation(blocker: Blocker): () => void;
|
|
20
|
+
export declare const subscribeRouteNavigation: typeof activeSubscribeNavigation;
|
|
21
|
+
export declare const subscribeRoute: typeof activeSubscribe;
|
|
22
|
+
export declare const subscribeRouteSelected: typeof activeSubscribeSelected;
|
|
21
23
|
//# sourceMappingURL=internal.d.ts.map
|
package/dist/internal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,IAAI,OAAO,EACjC,aAAa,EACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAIL,QAAQ,IAAI,cAAc,EAC1B,gBAAgB,IAAI,sBAAsB,EAE1C,SAAS,IAAI,eAAe,EAC5B,mBAAmB,IAAI,yBAAyB,EAChD,iBAAiB,IAAI,uBAAuB,EAC7C,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,KAAK,8BAAc,CAAC;AACjC,eAAO,MAAM,aAAa,uBAAiB,CAAC;AAE5C,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,QAAO,CAAC,MAAM,IAAI,CAAoB,CAAC;AAEjE,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AACD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI,CAExE;AACD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI,CAExE;AACD,eAAO,MAAM,qBAAqB,+BAAyB,CAAC;AAC5D,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,IAAI,CAEjE;AACD,eAAO,MAAM,wBAAwB,kCAA4B,CAAC;AAClE,eAAO,MAAM,cAAc,wBAAkB,CAAC;AAC9C,eAAO,MAAM,sBAAsB,gCAA0B,CAAC"}
|
package/dist/internal.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{_ as e,c as t,f as n,g as r,h as i,i as a,l as o,m as s,n as c,o as l,p as u,s as d,t as f,v as p,y as m}from"./chunks/types-BWmc67Zg.js";const h=c,g=d,_=()=>a(),v=new WeakMap;function y(){let e=l();v.has(e)||v.set(e,e.connect())}function b(e){return l().installResolver(e)}function x(e){return o(e)}const S=t;function C(e){return l().blockNavigation(e)}const w=u,T=n,E=s;export{C as blockRouteNavigation,m as buildRoutePath,_ as connectRouter,e as createMemoryRouteHistory,p as createRouteManifest,i as createRouteRuntime,y as ensureRouterConnected,b as installRouteResolver,g as navigateRoute,S as navigateRouteRelative,f as redirectRoute,x as replaceRouteResolver,h as route,T as subscribeRoute,w as subscribeRouteNavigation,E as subscribeRouteSelected,r as supportsNavigationAPI};
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAEV,iBAAiB,EACjB,cAAc,EACd,aAAa,EAEb,UAAU,EAEV,sBAAsB,EAEtB,uBAAuB,EAEvB,qBAAqB,EACrB,sBAAsB,EAEtB,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,UAAU,EACV,yBAAyB,EAE1B,MAAM,SAAS,CAAC;AAIjB,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAC3C,gBAAgB,CAAC,CACf,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,OAAO,EACzC,QAAQ,EAAE,aAAa,GACtB,IAAI,CAAC;IACR,mBAAmB,CAAC,CAClB,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,OAAO,EACzC,QAAQ,EAAE,aAAa,GACtB,IAAI,CAAC;CACT;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,mBAAoB,SAAQ,KAAK;IAChD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,yBAAyB,CAAC;IAChD,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;IACpE,MAAM,CAAC,IAAI,IAAI,CAAC;IAChB,SAAS,CAAC,OAAO,CAAC,EAAE;QAClB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,QAAQ,CAAC;KACjD,GAAG,IAAI,CAAC;CACV;AAED,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAClE,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IACrE,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;QAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;KAC1B,GACA,OAAO,CAAC;IACX,IAAI,IAAI,OAAO,CAAC;IAChB,OAAO,IAAI,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,IAAI,aAAa,CAAC;IAC1B,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI,CAAC;IAC/C,iBAAiB,CAAC,KAAK,EACrB,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,EAC9B,QAAQ,EAAE,sBAAsB,CAAC,KAAK,CAAC,EACvC,MAAM,CAAC,EAAE,sBAAsB,CAAC,KAAK,CAAC,GACrC,MAAM,IAAI,CAAC;IACd,OAAO,IAAI,MAAM,IAAI,CAAC;IACtB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI,CAAC;IACrD,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI,CAAC;IACrD,QAAQ,CAAC,IAAI,SAAS,MAAM,EAC1B,OAAO,EAAE,IAAI,EACb,GAAG,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,GACrC,qBAAqB,CAAC;IACzB,gBAAgB,CAAC,IAAI,SAAS,MAAM,EAClC,OAAO,EAAE,IAAI,EACb,GAAG,UAAU,EAAE,yBAAyB,CAAC,IAAI,CAAC,GAC7C,qBAAqB,CAAC;IACzB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,IAAI,CAAC;IAC7D,mBAAmB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,MAAM,IAAI,CAAC;IACnE,IAAI,IAAI,qBAAqB,GAAG,IAAI,CAAC;IACrC,OAAO,IAAI,qBAAqB,GAAG,IAAI,CAAC;IACxC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9E,UAAU,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,CAAC;IACjD,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,wBAAgB,qBAAqB,CACnC,WAAW,GAAE,gBAA+F,GAC3G,OAAO,CAET;AAiFD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,sBAAsB,GAAG,MAAM,CAAC,EAAE,CAAC;IAC/D,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAkGD,wBAAgB,kBAAkB,CAChC,oBAAoB,GAAE,gBAAgB,GAAG,mBAAkG,GAC1I,YAAY,CAk9Bd"}
|
package/dist/scroll.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @memoized-dom/router — Deterministic scroll position restoration coordinator.
|
|
3
|
+
*
|
|
4
|
+
* Manages history-keyed scroll positions, hash navigation, and manual scroll
|
|
5
|
+
* restoration across single-page transitions without exposing any extra
|
|
6
|
+
* public API surface.
|
|
7
|
+
*/
|
|
8
|
+
export interface ScrollPosition {
|
|
9
|
+
readonly x: number;
|
|
10
|
+
readonly y: number;
|
|
11
|
+
}
|
|
12
|
+
export interface ScrollCoordinatorOptions {
|
|
13
|
+
readonly window?: Window;
|
|
14
|
+
readonly document?: Document;
|
|
15
|
+
readonly history?: History;
|
|
16
|
+
}
|
|
17
|
+
export interface ScrollCoordinator {
|
|
18
|
+
/** Capture current viewport scroll offset for the specified history key. */
|
|
19
|
+
capture(key?: string | null): void;
|
|
20
|
+
/** Restore or update viewport scroll offset for the destination URL and key. */
|
|
21
|
+
restore(url: URL, type: 'load' | 'push' | 'replace' | 'pop', key?: string | null): void;
|
|
22
|
+
/** Connect global scroll and navigation listeners. Returns a disconnect callback. */
|
|
23
|
+
connect(): () => void;
|
|
24
|
+
/** Clear in-memory snapshots and release listeners. */
|
|
25
|
+
dispose(): void;
|
|
26
|
+
}
|
|
27
|
+
export declare function createScrollCoordinator(options?: ScrollCoordinatorOptions): ScrollCoordinator;
|
|
28
|
+
//# sourceMappingURL=scroll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll.d.ts","sourceRoot":"","sources":["../src/scroll.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,4EAA4E;IAC5E,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACnC,gFAAgF;IAChF,OAAO,CACL,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,EACzC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAClB,IAAI,CAAC;IACR,qFAAqF;IACrF,OAAO,IAAI,MAAM,IAAI,CAAC;IACtB,uDAAuD;IACvD,OAAO,IAAI,IAAI,CAAC;CACjB;AAuCD,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,wBAA6B,GACrC,iBAAiB,CA2KnB"}
|
package/package.json
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@memoized-dom/router",
|
|
3
|
-
"version": "0.0.
|
|
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 &&
|
|
25
|
-
"test": "vitest run --config vitest.config.ts && tsc -p tsconfig.test.json"
|
|
26
|
-
},
|
|
27
|
-
"publishConfig": {
|
|
28
|
-
"access": "public"
|
|
29
|
-
}
|
|
30
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@memoized-dom/router",
|
|
3
|
+
"version": "0.0.2",
|
|
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 && rolldown -c rolldown.config.ts && 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
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
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};
|