@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 CHANGED
@@ -1,150 +1,203 @@
1
- # `@memoized-dom/router`
2
-
3
- `@memoized-dom/router` is Memoized DOM's renderer-independent routing runtime. It owns immutable URL state, deterministic matching, nested route manifests, navigation history, cancellation, redirects, and synchronous navigation guards. It does not render components, load route data, or define an SSR wire format.
4
-
5
- ## Route state and focused subscriptions
6
-
7
- ```ts
8
- import { route, subscribeNavigation } from '@memoized-dom/router';
9
-
10
- route.pathname;
11
- route.query.get('tab');
12
- route.params;
13
- route.matches;
14
- route.matched?.metadata;
15
- route.signal;
16
-
17
- subscribeNavigation(event => {
18
- console.log(event.phase, event.navigation.to.pathname);
19
- });
20
- ```
21
-
22
- `route` is one stable, getter-backed object. Its query view is read-only, match arrays and parameters are frozen, and every location change aborts the previous `route.signal`. Generated consumers can use `subscribeRouteSelected()` from the internal entry to update only when a selected pathname, query value, parameter, or match changes.
23
-
24
- ## Manifests and matching
25
-
26
- ```ts
27
- import { createRouteManifest } from '@memoized-dom/router';
28
-
29
- const manifest = createRouteManifest([
30
- { id: 'root', pattern: '/', metadata: { layout: true } },
31
- { id: 'projects', parentId: 'root', pattern: '/projects' },
32
- { id: 'project', parentId: 'projects', pattern: '/:projectId' },
33
- { id: 'missing', parentId: 'root', pattern: '/*' },
34
- ]);
35
-
36
- manifest.matchAll('/projects/compiler'); // root -> projects -> project
37
- manifest.build('project', { params: { projectId: 'compiler' } });
38
- ```
39
-
40
- Definitions may be out of order. Construction validates duplicate and missing IDs, parent cycles, parameter shadowing, wildcard placement, and ambiguous unrelated routes. Static segments outrank parameters, which outrank wildcards. A terminal wildcard is the not-found/catch-all mechanism.
41
-
42
- For lower-level use, `matchRoutePattern()`, `createRouteMatcher()`, `joinRoutePaths()`, and `buildRoutePath()` expose the same validated path primitives.
43
-
44
- ## Navigation
45
-
46
- ```ts
47
- import {
48
- navigate,
49
- navigateRelative,
50
- redirectRoute,
51
- blockNavigation,
52
- } from '@memoized-dom/router';
53
-
54
- navigate('/organizations/:organizationId', {
55
- params: { organizationId: 'acme' },
56
- query: { tab: 'members', tag: ['compiler', 'runtime'] },
57
- });
58
-
59
- navigateRelative('../settings');
60
-
61
- const unblock = blockNavigation(navigation => {
62
- if (navigation.to.pathname === '/private') {
63
- return redirectRoute('/login', { replace: true });
64
- }
65
- if (hasUnsavedChanges) return false;
66
- });
67
- ```
68
-
69
- `navigate()` and `navigateRelative()` return a `completed` or `blocked` result. Guards run before router-owned history changes and may allow, block, or redirect. They are intentionally synchronous: waiting for data belongs to the future router/data coordination layer. Redirect chains are capped at 16 and guards cannot recursively mutate router state.
70
-
71
- Relative paths use directory semantics: `details` from `/projects/one` resolves to `/projects/one/details`, while `../two` resolves to `/projects/two`. A runtime `basePath` keeps application paths independent from deployment paths:
72
-
73
- ```ts
74
- const runtime = createRouteRuntime({
75
- basePath: '/app',
76
- routeHistory: createMemoryRouteHistory({ initialEntries: ['/app'] }),
77
- routes: manifest.entries,
78
- });
79
-
80
- runtime.navigate('/projects'); // address: /app/projects, route.pathname: /projects
81
- ```
82
-
83
- ## Router-owned history
84
-
85
- ```ts
86
- const history = createMemoryRouteHistory({
87
- initialEntries: ['/', '/projects'],
88
- });
89
- const runtime = createRouteRuntime({ routeHistory: history });
90
- ```
91
-
92
- The `RouteHistory` interface separates navigation storage from browser event plumbing. The built-in memory implementation has stable keys and indices, forward-stack truncation, non-mutating `peek()`, synchronous publication, and rollback when a subscriber rejects an update. It is useful for tests, embedded/non-browser roots, deterministic replay, and guardable traversal. An explicitly supplied history remains owned by the caller; disposing the runtime unsubscribes but does not destroy it.
93
-
94
- ## Browser behavior
95
-
96
- The Navigation API is the primary browser boundary. Same-origin application navigations are intercepted and use after-transition scrolling. The fallback uses history plus reference-counted `popstate`, `hashchange`, and delegated click listeners. Downloads, external links, non-self targets, modified clicks, hash-only anchors, and URLs outside `basePath` remain native.
97
-
98
- Navigation API events can be guarded before commit. Router-initiated memory-history traversal is also guardable because the destination can be peeked first. Legacy browser `popstate` is observational—the browser has already traversed when it fires—so it cannot provide the same pre-commit guarantee.
99
-
100
- ## Compiler boundary and HMR
101
-
102
- `@memoized-dom/router/internal` exposes the small bridge intended for generated code: connection lifetime, structural resolver installation/replacement, atomic location-and-match publication, full or selected subscriptions, relative navigation, and navigation lifecycle access. `replaceRouteResolver()` resolves the current location before swapping and makes stale HMR disposers harmless.
103
-
104
- The compiler owns `route` and `route-to` as universal JSX properties. They are
105
- erased before normal host/component prop handling, so neither appears in the
106
- DOM or a component's public props. Every route fragment is canonical and starts
107
- with `/`; nested fragments compose with their nearest route-bearing JSX
108
- ancestor:
109
-
110
- ```tsx
111
- <main route="/">
112
- <section route="/projects">
113
- <article route="/:projectId">Project</article>
114
- </section>
115
- <aside route="/*">Not found</aside>
116
- </main>
117
- ```
118
-
119
- This declares `/`, `/projects`, `/projects/:projectId`, and the terminal
120
- catch-all. The compiler emits one structural manifest plus focused DOM regions;
121
- it does not perform a runtime JSX-tree discovery pass.
122
-
123
- Navigation targets are checked against that linked route graph. Parameterized
124
- and catch-all paths require exact parameter keys:
125
-
126
- ```tsx
127
- <button route-to={{
128
- path: '/projects/:projectId',
129
- params: { projectId },
130
- query: { tab: 'activity' },
131
- }}>
132
- Open project
133
- </button>
134
- ```
135
-
136
- `route-to` accepts `path`, `params`, `query`, `hash`, and `replace`. History
137
- `state` is intentionally not authored here; any internal navigation metadata is
138
- compiler/runtime-owned. Anchors receive a real `href`, while other intrinsic
139
- elements receive compiled navigation behavior that composes with `onClick` and
140
- respects `preventDefault()`. The generated singleton browser connection is
141
- idempotent across HMR module evaluation.
142
-
143
- Chunk-loading syntax remains a build-integration concern and is not part of the
144
- current directive lowering.
145
-
146
- ## Deliberate boundaries
147
-
148
- - Router/data coordination is not implemented yet. Its caching, pending-state, error, and invalidation contract needs a separate design discussion.
149
- - Router SSR is not implemented yet. Memoized DOM first needs renderer-level SSR, streaming, and hydration ownership. The package therefore does not depend on Seroval or commit to another router's serialization format.
150
- - Each server request or independently routed root must eventually receive its own runtime. The default singleton is browser-document state and must never be shared between concurrent requests.
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};
@@ -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;gBAErB,KAAK,EAAE,OAAO;CAK3B;AAQD;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,2DAA2D;IAC3D,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAAC;IACtD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAChD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACnD,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,IAAI,IAAI,CAAC;IACb,OAAO,IAAI,IAAI,CAAC;IAChB,SAAS,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI,CAAC;IACtD,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,GAAG,GAAG,uBAAuB,CAAC,EAAE,CAAC;IAC9E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CAChC;AAYD,iFAAiF;AACjF,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,yBAA8B,GACtC,YAAY,CAkId"}
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 const navigate: <Path extends string>(pattern: Path, ...arguments_: import("./types").NavigateArguments<Path>) => import("./types").RouteNavigationResult;
3
- export declare const navigateRelative: <Path extends string>(pattern: Path, ...arguments_: import("./types").RelativeNavigateArguments<Path>) => import("./types").RouteNavigationResult;
4
- export declare const blockNavigation: (blocker: import("./types").RouteNavigationBlocker) => () => void;
5
- export declare const subscribeNavigation: (listener: import("./types").RouteNavigationListener) => () => void;
6
- export declare const back: () => import("./types").RouteNavigationResult | null;
7
- export declare const forward: () => import("./types").RouteNavigationResult | null;
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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK,8BAA4B,CAAC;AAC/C,eAAO,MAAM,QAAQ,2IAA+B,CAAC;AACrD,eAAO,MAAM,gBAAgB,mJAAuC,CAAC;AACrE,eAAO,MAAM,eAAe,mEAAsC,CAAC;AACnE,eAAO,MAAM,mBAAmB,qEAA0C,CAAC;AAC3E,eAAO,MAAM,IAAI,sDAA2B,CAAC;AAC7C,eAAO,MAAM,OAAO,sDAA8B,CAAC;AAEnD,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErF,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EACV,uBAAuB,EACvB,yBAAyB,EACzB,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,QAAQ,CAAC;AAEhB,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,yBAAyB,EACzB,uBAAuB,EACvB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EACrB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,sBAAsB,EACtB,uBAAuB,EACvB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,WAAW,EACX,sBAAsB,EACtB,UAAU,EACV,eAAe,EACf,eAAe,EACf,aAAa,EACb,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,aAAa,EACb,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
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{a as e,b as o,c as a,d as r,e as i,f as u,g as n,h as R,i as s,j as c,k as p,l as v,m,n as y,o as g,p as l,q as t,r as N}from"./chunks/chunk-MH5AOHEF.js";var f=t.route,x=t.navigate,h=t.navigateRelative,M=t.blockNavigation,b=t.subscribeNavigation,d=t.back,H=t.forward;export{d as back,M as blockNavigation,c as buildRoutePath,v as compareRoutePatterns,y as createMemoryRouteHistory,m as createRouteManifest,a as createRouteMatcher,o as createRouteQuery,l as createRouteRuntime,H as forward,u as joinRoutePaths,s as matchRoutePattern,x as navigate,h as navigateRelative,r as normalizeRoutePath,e as parseRouteQuery,p as rankRoutePattern,N as redirectRoute,i as resolveRoutePath,f as route,b as subscribeNavigation,g as supportsNavigationAPI,n as validateRoutePattern,R as validateRoutePatterns};
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};
@@ -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: <Path extends string>(pattern: Path, ...arguments_: import("./types").NavigateArguments<Path>) => import("./types").RouteNavigationResult;
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 const installRouteResolver: (resolver: import("./types").RouteResolver) => () => void;
15
- export declare const replaceRouteResolver: (resolver: import("./types").RouteResolver) => () => void;
16
- export declare const navigateRouteRelative: <Path extends string>(pattern: Path, ...arguments_: import("./types").RelativeNavigateArguments<Path>) => import("./types").RouteNavigationResult;
17
- export declare const blockRouteNavigation: (blocker: import("./types").RouteNavigationBlocker) => () => void;
18
- export declare const subscribeRouteNavigation: (listener: import("./types").RouteNavigationListener) => () => void;
19
- export declare const subscribeRoute: (listener: import("./types").RouteListener) => () => void;
20
- export declare const subscribeRouteSelected: <Value>(selector: import("./types").RouteSelector<Value>, listener: import("./types").RouteSelectionListener<Value>, equals?: import("./types").RouteSelectionEquality<Value>) => () => void;
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
@@ -1 +1 @@
1
- {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK,8BAA4B,CAAC;AAC/C,eAAO,MAAM,aAAa,2IAA+B,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,YAAY,EACV,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,GACb,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,qBAAqB,EACrB,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,+EAA+E;AAC/E,eAAO,MAAM,aAAa,kBAA8B,CAAC;AAEzD,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AACD,eAAO,MAAM,oBAAoB,2DAAsC,CAAC;AACxE,eAAO,MAAM,oBAAoB,2DAAsC,CAAC;AACxE,eAAO,MAAM,qBAAqB,mJAAuC,CAAC;AAC1E,eAAO,MAAM,oBAAoB,mEAAsC,CAAC;AACxE,eAAO,MAAM,wBAAwB,qEAA0C,CAAC;AAChF,eAAO,MAAM,cAAc,2DAAgC,CAAC;AAC5D,eAAO,MAAM,sBAAsB,8LAAwC,CAAC"}
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{j as t,m as o,n as r,o as i,p as n,q as e,r as a}from"./chunks/chunk-MH5AOHEF.js";var c=e.route,R=e.navigate,l=e.connect,u=null;function p(){u??=e.connect()}var v=e.installResolver,x=e.replaceResolver,g=e.navigateRelative,m=e.blockNavigation,b=e.subscribeNavigation,f=e.subscribe,N=e.subscribeSelected;export{m as blockRouteNavigation,t as buildRoutePath,l as connectRouter,r as createMemoryRouteHistory,o as createRouteManifest,n as createRouteRuntime,p as ensureRouterConnected,v as installRouteResolver,R as navigateRoute,g as navigateRouteRelative,a as redirectRoute,x as replaceRouteResolver,c as route,f as subscribeRoute,b as subscribeRouteNavigation,N as subscribeRouteSelected,i as supportsNavigationAPI};
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};
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -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.1",
4
- "description": "Compiler-ready URL state, matching, and navigation for memoized-dom",
5
- "type": "module",
6
- "sideEffects": false,
7
- "files": [
8
- "dist",
9
- "README.md"
10
- ],
11
- "exports": {
12
- ".": {
13
- "types": "./dist/index.d.ts",
14
- "import": "./dist/index.js",
15
- "default": "./dist/index.js"
16
- },
17
- "./internal": {
18
- "types": "./dist/internal.d.ts",
19
- "import": "./dist/internal.js",
20
- "default": "./dist/internal.js"
21
- }
22
- },
23
- "scripts": {
24
- "build": "bun run ./scripts/clean.ts && esbuild ./src/index.ts ./src/internal.ts --bundle --outdir=./dist --platform=browser --format=esm --target=es2022 --minify --splitting --entry-names=[name] --chunk-names=chunks/[name]-[hash] && tsc -p tsconfig.build.json",
25
- "test": "vitest run --config vitest.config.ts && tsc -p tsconfig.test.json"
26
- },
27
- "publishConfig": {
28
- "access": "public"
29
- }
30
- }
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};