@real-router/vue 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +97 -13
- package/dist/cjs/createHttpStatusSink-XDu5aGhc.d.ts +32 -0
- package/dist/cjs/createHttpStatusSink-XDu5aGhc.d.ts.map +1 -0
- package/dist/cjs/index.d.ts +19 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/ssr.d.ts +181 -0
- package/dist/cjs/ssr.d.ts.map +1 -0
- package/dist/cjs/ssr.js +2 -0
- package/dist/cjs/ssr.js.map +1 -0
- package/dist/cjs/useRoute-BT3SkdOc.js +2 -0
- package/dist/cjs/useRoute-BT3SkdOc.js.map +1 -0
- package/dist/esm/createHttpStatusSink-DduXvbGr.d.mts +32 -0
- package/dist/esm/createHttpStatusSink-DduXvbGr.d.mts.map +1 -0
- package/dist/esm/index.d.mts +19 -2
- package/dist/esm/index.d.mts.map +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/ssr.d.mts +181 -0
- package/dist/esm/ssr.d.mts.map +1 -0
- package/dist/esm/ssr.mjs +2 -0
- package/dist/esm/ssr.mjs.map +1 -0
- package/dist/esm/useRoute-2ocUdDHc.mjs +2 -0
- package/dist/esm/useRoute-2ocUdDHc.mjs.map +1 -0
- package/package.json +20 -4
- package/src/RouterProvider.ts +45 -39
- package/src/components/Await.ts +47 -0
- package/src/components/ClientOnly.ts +16 -0
- package/src/components/HttpStatusCode.ts +74 -0
- package/src/components/HttpStatusProvider.ts +22 -0
- package/src/components/Link.ts +33 -13
- package/src/components/RouteView/RouteView.ts +30 -51
- package/src/components/RouteView/helpers.ts +33 -2
- package/src/components/ServerOnly.ts +16 -0
- package/src/components/Streamed.ts +31 -0
- package/src/composables/useDeferred.ts +37 -0
- package/src/composables/useIsActiveRoute.ts +33 -3
- package/src/composables/useRoute.ts +11 -5
- package/src/context.ts +4 -0
- package/src/directives/vLink.ts +18 -1
- package/src/index.ts +2 -1
- package/src/ssr.ts +39 -0
- package/src/types.ts +10 -0
- package/src/utils/createHttpStatusSink.ts +31 -0
package/README.md
CHANGED
|
@@ -112,16 +112,16 @@ All composables (`useRouter`, `useRoute`, etc.) and the `v-link` directive work
|
|
|
112
112
|
|
|
113
113
|
## Composables
|
|
114
114
|
|
|
115
|
-
Route state composables return `
|
|
116
|
-
|
|
117
|
-
| Composable | Returns
|
|
118
|
-
| ----------------------- |
|
|
119
|
-
| `useRouter()` | `Router`
|
|
120
|
-
| `useNavigator()` | `Navigator`
|
|
121
|
-
| `useRoute()` | `{ navigator, route:
|
|
122
|
-
| `useRouteNode(name)` | `{ navigator, route:
|
|
123
|
-
| `useRouteUtils()` | `RouteUtils`
|
|
124
|
-
| `useRouterTransition()` | `ShallowRef<RouterTransitionSnapshot>`
|
|
115
|
+
Route state composables return `Readonly<Ref>` values — `useRoute` mirrors a `shallowRef`, `useRouteNode` derives a `computed`, and `useRouterTransition` returns a `ShallowRef` directly. Consumers only need `.value` read access; in templates Vue auto-unwraps refs.
|
|
116
|
+
|
|
117
|
+
| Composable | Returns | Reactive? |
|
|
118
|
+
| ----------------------- | ---------------------------------------------------------------------------- | ---------------------------------------- |
|
|
119
|
+
| `useRouter()` | `Router` | Never |
|
|
120
|
+
| `useNavigator()` | `Navigator` | Never (stable ref, safe to use directly) |
|
|
121
|
+
| `useRoute()` | `{ navigator, route: Readonly<Ref<State>>, previousRoute: Readonly<Ref<State \| undefined>> }` | route/previousRoute on every navigation |
|
|
122
|
+
| `useRouteNode(name)` | `{ navigator, route: Readonly<Ref<State \| undefined>>, previousRoute: Readonly<Ref<State \| undefined>> }` (computed under the hood) | Only when node activates/deactivates |
|
|
123
|
+
| `useRouteUtils()` | `RouteUtils` | Never |
|
|
124
|
+
| `useRouterTransition()` | `ShallowRef<RouterTransitionSnapshot>` | On transition start/end |
|
|
125
125
|
| `useRouteExit(handler, options?)` | `void` — wraps `subscribeLeave` with abort + same-route guards | Never (handler captured in `setup()`) |
|
|
126
126
|
| `useRouteEnter(handler, options?)` | `void` — fires once on nav-driven mount via `watch(route)` + `transition.from` | Never (handler captured in `setup()`) |
|
|
127
127
|
|
|
@@ -246,7 +246,7 @@ In a template:
|
|
|
246
246
|
<Link routeName="settings" hash="account">Account</Link>
|
|
247
247
|
```
|
|
248
248
|
|
|
249
|
-
Tri-state: `undefined` preserves the current hash, `""` clears it, a value sets it. Active class is hash-aware — only the matching tab lights up. Live demo: [`examples/web/react/link-hash/`](../../examples/web/react/link-hash/) —
|
|
249
|
+
Tri-state: `undefined` preserves the current hash, `""` clears it, a value sets it. Active class is hash-aware — only the matching tab lights up. Live demo (React adapter, same API): [`examples/web/react/link-hash/`](../../examples/web/react/link-hash/) — template syntax differs, behavior is identical. See the [Hash Fragment Support](https://github.com/greydragon888/real-router/wiki/Hash) wiki page for the full surface.
|
|
250
250
|
|
|
251
251
|
### `<RouteView>`
|
|
252
252
|
|
|
@@ -281,6 +281,30 @@ h(
|
|
|
281
281
|
// Only matches "users" exactly, not "users.profile"
|
|
282
282
|
```
|
|
283
283
|
|
|
284
|
+
**`<RouteView.Self>`** — renders when the active route name **exactly equals** the parent `<RouteView>`'s `nodeName`. Use for leaf pages where the parent route itself is the destination. Self outranks `<NotFound>` and yields to any activating `<Match>`. First-`<Self>`-wins if multiple are provided.
|
|
285
|
+
|
|
286
|
+
```typescript
|
|
287
|
+
h(
|
|
288
|
+
RouteView,
|
|
289
|
+
{ nodeName: "users" },
|
|
290
|
+
{
|
|
291
|
+
default: () => [
|
|
292
|
+
// Active when route.name === "users" — the "directory index" of the node
|
|
293
|
+
h(RouteView.Self, null, { default: () => h(UsersIndex) }),
|
|
294
|
+
// Active when route.name === "users.profile"
|
|
295
|
+
h(
|
|
296
|
+
RouteView.Match,
|
|
297
|
+
{ segment: "users.profile" },
|
|
298
|
+
{ default: () => h(UserProfile) },
|
|
299
|
+
),
|
|
300
|
+
h(RouteView.NotFound, null, { default: () => h(NotFoundPage) }),
|
|
301
|
+
],
|
|
302
|
+
},
|
|
303
|
+
);
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
`RouteView.Self` also accepts an optional `fallback` prop (same semantics as `RouteView.Match.fallback`) for Suspense integration with `defineAsyncComponent`.
|
|
307
|
+
|
|
284
308
|
**`keepAlive` prop:** Vue's native `<KeepAlive>` preserves component state across navigations. Each segment gets a dedicated wrapper component so `<KeepAlive>` can track them independently.
|
|
285
309
|
|
|
286
310
|
```typescript
|
|
@@ -296,6 +320,37 @@ h(
|
|
|
296
320
|
);
|
|
297
321
|
```
|
|
298
322
|
|
|
323
|
+
**Per-Match `keepAlive`:** `RouteView.Match` also accepts its own `keepAlive` prop for fine-grained control. This lets you keep only specific routes alive without enabling `keepAlive` on the parent `<RouteView>`.
|
|
324
|
+
|
|
325
|
+
```typescript
|
|
326
|
+
h(
|
|
327
|
+
RouteView,
|
|
328
|
+
{ nodeName: "" },
|
|
329
|
+
{
|
|
330
|
+
default: () => [
|
|
331
|
+
// Only UsersPage is kept alive; SettingsPage always remounts
|
|
332
|
+
h(RouteView.Match, { segment: "users", keepAlive: true }, { default: () => h(UsersPage) }),
|
|
333
|
+
h(RouteView.Match, { segment: "settings" }, { default: () => h(SettingsPage) }),
|
|
334
|
+
],
|
|
335
|
+
},
|
|
336
|
+
);
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
In a template:
|
|
340
|
+
|
|
341
|
+
```vue
|
|
342
|
+
<RouteView nodeName="">
|
|
343
|
+
<RouteView.Match segment="users" keepAlive>
|
|
344
|
+
<UsersPage />
|
|
345
|
+
</RouteView.Match>
|
|
346
|
+
<RouteView.Match segment="settings">
|
|
347
|
+
<SettingsPage />
|
|
348
|
+
</RouteView.Match>
|
|
349
|
+
</RouteView>
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
Per-Match `keepAlive` is checked first; if any `Match` child has `keepAlive: true`, the `<KeepAlive>` wrapper is created for that segment even if the parent `<RouteView>` prop is not set.
|
|
353
|
+
|
|
299
354
|
**Lazy loading with `fallback`:** Pass a `fallback` prop (`VNode | (() => VNode)`) to wrap the matched content in Vue's `<Suspense>`. This lets you show a loading state while a `defineAsyncComponent` chunk is fetching. Works with both `keepAlive` and non-`keepAlive` modes.
|
|
300
355
|
|
|
301
356
|
```typescript
|
|
@@ -378,6 +433,31 @@ In a template:
|
|
|
378
433
|
|
|
379
434
|
Auto-resets on next successful navigation. Works with both `<Link>` and imperative `router.navigate()`.
|
|
380
435
|
|
|
436
|
+
### `<ClientOnly>` / `<ServerOnly>`
|
|
437
|
+
|
|
438
|
+
Paired SSR-aware boundaries. `<ClientOnly>` renders the `fallback` slot on the server (and on the client first paint, to match SSR HTML), then swaps in the `default` slot after mount. `<ServerOnly>` is the symmetric inverse.
|
|
439
|
+
|
|
440
|
+
```vue
|
|
441
|
+
<script setup lang="ts">
|
|
442
|
+
import { ClientOnly, ServerOnly } from "@real-router/vue";
|
|
443
|
+
</script>
|
|
444
|
+
|
|
445
|
+
<template>
|
|
446
|
+
<ClientOnly>
|
|
447
|
+
<BrowserApiWidget />
|
|
448
|
+
<template #fallback>
|
|
449
|
+
<Skeleton />
|
|
450
|
+
</template>
|
|
451
|
+
</ClientOnly>
|
|
452
|
+
|
|
453
|
+
<ServerOnly>
|
|
454
|
+
<SeoMetaStrip />
|
|
455
|
+
</ServerOnly>
|
|
456
|
+
</template>
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
Implementation: `ref(false)` + `onMounted(() => mounted.value = true)`. Slots `default` (children) and `fallback`. End-to-end dogfooding lives in [`examples/web/vue/ssr-examples/ssr/`](../../examples/web/vue/ssr-examples/ssr/) (see `e2e/ssr-boundaries.spec.ts`).
|
|
460
|
+
|
|
381
461
|
## Directives
|
|
382
462
|
|
|
383
463
|
### `v-link`
|
|
@@ -560,9 +640,13 @@ Full documentation: [Wiki](https://github.com/greydragon888/real-router/wiki)
|
|
|
560
640
|
|
|
561
641
|
## Examples
|
|
562
642
|
|
|
563
|
-
|
|
643
|
+
23 runnable examples — each is a standalone Vite app. Run: `cd examples/web/vue/basic && pnpm dev`
|
|
644
|
+
|
|
645
|
+
**Routing patterns:** [basic](../../examples/web/vue/basic) · [nested-routes](../../examples/web/vue/nested-routes) · [auth-guards](../../examples/web/vue/auth-guards) · [data-loading](../../examples/web/vue/data-loading) · [lazy-loading](../../examples/web/vue/lazy-loading) · [async-guards](../../examples/web/vue/async-guards) · [hash-routing](../../examples/web/vue/hash-routing) · [persistent-params](../../examples/web/vue/persistent-params) · [error-handling](../../examples/web/vue/error-handling) · [dynamic-routes](../../examples/web/vue/dynamic-routes) · [plugin-installation](../../examples/web/vue/plugin-installation) · [v-link-directive](../../examples/web/vue/v-link-directive) · [keep-alive](../../examples/web/vue/keep-alive) · [search-schema](../../examples/web/vue/search-schema) · [combined](../../examples/web/vue/combined)
|
|
646
|
+
|
|
647
|
+
**Animations:** [view-transitions](../../examples/web/vue/animation-examples/view-transitions) · [route-animations](../../examples/web/vue/animation-examples/route-animations) · [page-animations](../../examples/web/vue/animation-examples/page-animations) · [motion-animations](../../examples/web/vue/animation-examples/motion-animations)
|
|
564
648
|
|
|
565
|
-
|
|
649
|
+
**Server-side rendering:** [ssr](../../examples/web/vue/ssr-examples/ssr) · [ssr-streaming](../../examples/web/vue/ssr-examples/ssr-streaming) · [ssr-mixed](../../examples/web/vue/ssr-examples/ssr-mixed) · [ssg](../../examples/web/vue/ssr-examples/ssg)
|
|
566
650
|
|
|
567
651
|
## Related Packages
|
|
568
652
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//#region src/utils/createHttpStatusSink.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Render-scoped HTTP status sink. Created per request on the server, passed to
|
|
4
|
+
* `<HttpStatusProvider :sink="...">`, and read after `renderToString` /
|
|
5
|
+
* `renderToWebStream` to apply the value to the HTTP response.
|
|
6
|
+
*
|
|
7
|
+
* Last write wins: if the rendered tree mounts more than one
|
|
8
|
+
* `<HttpStatusCode />`, the value reflects the last component that ran during
|
|
9
|
+
* the render pass.
|
|
10
|
+
*
|
|
11
|
+
* No-op on the client — `<HttpStatusCode />` reads the optional injected sink
|
|
12
|
+
* and skips the write when no provider is mounted, so the same component tree
|
|
13
|
+
* can be hydrated without changing behaviour.
|
|
14
|
+
*
|
|
15
|
+
* Constraints:
|
|
16
|
+
* - **Per-request only.** Don't share a sink across requests; the rendered
|
|
17
|
+
* tree mutates `code` in place. Module-level singletons leak status
|
|
18
|
+
* between concurrent requests.
|
|
19
|
+
* - **Don't `Object.freeze` the sink.** The component writes to `.code`;
|
|
20
|
+
* freezing makes the assignment throw under ESM strict mode.
|
|
21
|
+
* - **Hydration symmetry:** mount `<HttpStatusProvider>` on both server and
|
|
22
|
+
* client (with a throwaway client sink). Vue emits `<!--[-->` / `<!--]-->`
|
|
23
|
+
* fragment markers around the provider's slot; an extra provider on one
|
|
24
|
+
* side trips Vue with "Hydration completed but contains mismatches".
|
|
25
|
+
*/
|
|
26
|
+
interface HttpStatusSink {
|
|
27
|
+
code: number | undefined;
|
|
28
|
+
}
|
|
29
|
+
declare function createHttpStatusSink(): HttpStatusSink;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { createHttpStatusSink as n, HttpStatusSink as t };
|
|
32
|
+
//# sourceMappingURL=createHttpStatusSink-XDu5aGhc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createHttpStatusSink-XDu5aGhc.d.ts","names":[],"sources":["../../src/utils/createHttpStatusSink.ts"],"mappings":";;AAwBA;;;;;AAIA;;;;;;;;;;;;;;;;;;UAJiB,cAAA;EACf,IAAA;AAAA;AAAA,iBAGc,oBAAA,CAAA,GAAwB,cAAA"}
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -277,12 +277,29 @@ interface LinkProps<P extends Params = Params> {
|
|
|
277
277
|
activeStrict?: boolean;
|
|
278
278
|
ignoreQueryParams?: boolean;
|
|
279
279
|
target?: string;
|
|
280
|
+
/**
|
|
281
|
+
* URL fragment (#532). Decoded, no leading `#`. Tri-state:
|
|
282
|
+
* - `undefined` (default) — preserves current `state.context.url.hash` on click.
|
|
283
|
+
* - `""` — clears the hash.
|
|
284
|
+
* - `"value"` — sets the hash; click routes through `navigateWithHash`,
|
|
285
|
+
* which auto-adds `force: true, hashChange: true` for same-route hash
|
|
286
|
+
* transitions (bypasses core's SAME_STATES check).
|
|
287
|
+
* Active state is hash-aware when `hash` is set.
|
|
288
|
+
*/
|
|
289
|
+
hash?: string;
|
|
280
290
|
}
|
|
281
291
|
//#endregion
|
|
282
292
|
//#region src/composables/useRoute.d.ts
|
|
283
|
-
|
|
293
|
+
/**
|
|
294
|
+
* Return shape for `useRoute()` — `RouteContext<P>` with `route` narrowed
|
|
295
|
+
* to the non-nullable variant. The composable throws when `route.value`
|
|
296
|
+
* would be `undefined`, so consumers can read `.value.params.x` without a
|
|
297
|
+
* nullable guard. Extracted from inline duplication at two call sites.
|
|
298
|
+
*/
|
|
299
|
+
type UseRouteReturn<P extends Params = Params> = Omit<RouteContext<P>, "route"> & {
|
|
284
300
|
route: Readonly<Ref<State<P>>>;
|
|
285
301
|
};
|
|
302
|
+
declare const useRoute: <P extends Params = Params>() => UseRouteReturn<P>;
|
|
286
303
|
//#endregion
|
|
287
304
|
//#region src/composables/useRouteNode.d.ts
|
|
288
305
|
declare function useRouteNode(nodeName: string): RouteContext;
|
|
@@ -525,5 +542,5 @@ declare const RouterKey: InjectionKey<Router>;
|
|
|
525
542
|
declare const NavigatorKey: InjectionKey<Navigator$1>;
|
|
526
543
|
declare const RouteKey: InjectionKey<RouteContext>;
|
|
527
544
|
//#endregion
|
|
528
|
-
export { Link, type LinkDirectiveValue, type LinkProps, type Navigator, NavigatorKey, type RouteEnterContext, type RouteEnterHandler, type RouteExitContext, type RouteExitHandler, RouteKey, RouteView, type MatchProps as RouteViewMatchProps, type NotFoundProps as RouteViewNotFoundProps, type RouteViewProps, RouterErrorBoundary, type RouterErrorBoundaryProps, RouterKey, RouterProvider, type RouterTransitionSnapshot, type UseRouteEnterOptions, type UseRouteExitOptions, createRouterPlugin, useNavigator, useRoute, useRouteEnter, useRouteExit, useRouteNode, useRouteUtils, useRouter, useRouterTransition, vLink };
|
|
545
|
+
export { Link, type LinkDirectiveValue, type LinkProps, type Navigator, NavigatorKey, type RouteContext, type RouteEnterContext, type RouteEnterHandler, type RouteExitContext, type RouteExitHandler, RouteKey, RouteView, type MatchProps as RouteViewMatchProps, type NotFoundProps as RouteViewNotFoundProps, type RouteViewProps, type SelfProps as RouteViewSelfProps, RouterErrorBoundary, type RouterErrorBoundaryProps, RouterKey, RouterProvider, type RouterTransitionSnapshot, type UseRouteEnterOptions, type UseRouteExitOptions, createRouterPlugin, useNavigator, useRoute, useRouteEnter, useRouteExit, useRouteNode, useRouteUtils, useRouter, useRouterTransition, vLink };
|
|
529
546
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/components/RouteView/types.ts","../../src/components/RouteView/RouteView.ts","../../src/components/Link.ts","../../src/components/RouterErrorBoundary.ts","../../src/directives/vLink.ts","../../src/composables/useRouter.ts","../../src/composables/useNavigator.ts","../../src/composables/useRouteUtils.ts","../../src/types.ts","../../src/composables/useRoute.ts","../../src/composables/useRouteNode.ts","../../src/composables/useRouterTransition.ts","../../src/composables/useRouteExit.ts","../../src/composables/useRouteEnter.ts","../../src/createRouterPlugin.ts","../../../../shared/dom-utils/scroll-restore.ts","../../src/RouterProvider.ts","../../src/context.ts"],"mappings":";;;;;;;UAEiB,cAAA;EAAA,SACN,QAAA;EAAA,SACA,SAAA;AAAA;AAAA,UAGM,UAAA;EAAA,SACN,OAAA;EAAA,SACA,KAAA;EAAA,SACA,QAAA,GAAW,KAAA,UAAe,KAAA;EAAA,SAC1B,SAAA;AAAA;AAAA,UAGM,SAAA;EAPA;EAAA,SASN,QAAA,GAAW,KAAA,UAAe,KAAA;AAAA;AAAA,KAGzB,aAAA,GAAgB,MAAA;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/components/RouteView/types.ts","../../src/components/RouteView/RouteView.ts","../../src/components/Link.ts","../../src/components/RouterErrorBoundary.ts","../../src/directives/vLink.ts","../../src/composables/useRouter.ts","../../src/composables/useNavigator.ts","../../src/composables/useRouteUtils.ts","../../src/types.ts","../../src/composables/useRoute.ts","../../src/composables/useRouteNode.ts","../../src/composables/useRouterTransition.ts","../../src/composables/useRouteExit.ts","../../src/composables/useRouteEnter.ts","../../src/createRouterPlugin.ts","../../../../shared/dom-utils/scroll-restore.ts","../../src/RouterProvider.ts","../../src/context.ts"],"mappings":"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"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`vue`),t=require(`@real-router/core`),n=require(`@real-router/route-utils`),r=require(`@real-router/sources`),i=require(`@real-router/core/api`);function a(){return null}const o=(0,e.defineComponent)({name:`RouteView.Match`,props:{segment:{type:String,required:!0},exact:{type:Boolean,default:!1},fallback:{type:[Object,Function],default:void 0},keepAlive:{type:Boolean,default:!1}},render:a}),s=(0,e.defineComponent)({name:`RouteView.Self`,props:{fallback:{type:[Object,Function],default:void 0}},render:a}),c=(0,e.defineComponent)({name:`RouteView.NotFound`,render:a});function l(e,t,r){return r?e===t:(0,n.startsWithSegment)(e,t)}function u(t){if(Array.isArray(t)){let n=[];for(let r of t)Array.isArray(r)?n.push(...u(r)):(0,e.isVNode)(r)&&n.push(r);return n}return(0,e.isVNode)(t)?[t]:[]}function d(t,n){let r=u(t);for(let t of r)t.type===o||t.type===s||t.type===c?n.push(t):t.type===e.Fragment&&d(t.children,n)}function f(e,t){return e.type===c?(t.notFoundChildren=e.children,!0):e.type===s?(t.selfVNode===null&&(t.selfVNode=e,t.selfFallback=e.props?.fallback),!0):!1}function p(e,t,n){let r=e.props,i=r?.segment??``,a=r?.exact??!1;return{isActive:l(t,n?`${n}.${i}`:i,a),fallback:r?.fallback}}function m(e,n,r,i,a){if(i.selfVNode!==null&&n===r)return e.push(i.selfVNode),i.selfFallback;if(n===t.UNKNOWN_ROUTE&&i.notFoundChildren!==null){let t=a.filter(e=>e.type===c).at(-1);t&&e.push(t)}}function h(e,t,n){let r={selfVNode:null,selfFallback:void 0,notFoundChildren:null},i=!1,a,o=[];for(let s of e){if(f(s,r)||i)continue;let e=p(s,t,n);e.isActive&&(i=!0,a=e.fallback,o.push(s))}return i||(a=m(o,t,n,r,e)),{rendered:o,activeMatchFound:i,fallback:a}}function g(t){let n=(0,e.shallowRef)(t.getSnapshot());return(0,e.onScopeDispose)(t.subscribe(()=>{n.value=t.getSnapshot()})),n}const _=Symbol(`RouterKey`),v=Symbol(`NavigatorKey`),y=Symbol(`RouteKey`),b=()=>{let t=(0,e.inject)(_);if(!t)throw Error(`useRouter must be used within a RouterProvider`);return t};function x(n){let i=b(),a=g((0,r.createRouteNodeSource)(i,n));return{navigator:(0,t.getNavigator)(i),route:(0,e.computed)(()=>a.value.route),previousRoute:(0,e.computed)(()=>a.value.previousRoute)}}function S(e){return e.children?.default?.()??null}function C(t,n){let r=t.get(n);if(r)return r;let i=(0,e.markRaw)((0,e.defineComponent)({name:`KeepAlive-${n}`,setup(e,t){return()=>t.slots.default?.()}}));return t.set(n,i),i}function w(t,n){if(n===void 0)return t;let r=typeof n==`function`?n():n;return(0,e.h)(e.Suspense,{},{default:()=>t,fallback:()=>r})}const ee=(0,e.markRaw)((0,e.defineComponent)({name:`KeepAlive-placeholder`,render(){return null}}));function te(t,n,r){let i=t.props?.segment??`__not-found__`,a=C(n,i),o=S(t)??[];return w((0,e.h)(e.KeepAlive,null,{default:()=>(0,e.h)(a,{key:i},{default:()=>o})}),r)}function T(e){return e===!0||e===``||e===`keep-alive`}function ne(t,n,r){let i=t.props;if(T(i?.keepAlive)&&t.type===o){let r=i?.segment??`__not-found__`,a=C(n,r),o=S(t)??[];return(0,e.h)(e.Fragment,[(0,e.h)(e.KeepAlive,null,{default:()=>(0,e.h)(a,{key:r},{default:()=>o})})])}let a=S(t);return a?(0,e.h)(e.Fragment,[(0,e.h)(e.KeepAlive,null,{default:()=>(0,e.h)(ee)}),w((0,e.h)(e.Fragment,a),r)]):null}const E=(0,e.defineComponent)({name:`RouteView`,props:{nodeName:{type:String,required:!0},keepAlive:{type:Boolean,default:!1}},setup(t,{slots:n}){let r=x(t.nodeName),i=new Map,a=null,l=!1;function u(e,t){return t===a?l:(a=t,l=e.some(e=>e.type===o&&T(e.props?.keepAlive)),l)}return()=>{let a=r.route.value;if(!a)return null;let l=n.default?.(),f=[];d(l,f);let{rendered:p,fallback:m}=h(f,a.name,t.nodeName);if(p.length===0)return null;let g=p[0];if(t.keepAlive)return te(g,i,m);if(g.type!==o&&g.type!==s&&g.type!==c)return null;if(u(f,l))return ne(g,i,m);let _=S(g);return _?w((0,e.h)(e.Fragment,_),m):null}}}),D=Object.assign(E,{Match:o,Self:s,NotFound:c}),re=Object.freeze({}),ie=Object.freeze({}),O=`data-real-router-announcer`;function ae(e,t){let n=t?.prefix??`Navigated to `,r=t?.getAnnouncementText,i=!0,a=!1,o=!1,s=``,c=null,l,u=oe(),d=(e,t)=>{s=e,clearTimeout(l),u.textContent=e,l=setTimeout(()=>{u.textContent=``,s=``},7e3),le(t)},f=setTimeout(()=>{if(a=!0,c!==null&&!o){let e=c;c=null,d(e,document.querySelector(`h1`))}},100),p=e.subscribe(({route:e})=>{if(i){i=!1;return}requestAnimationFrame(()=>{requestAnimationFrame(()=>{if(o)return;let t=document.querySelector(`h1`),i=ce(e,n,r,t);if(!(!i||i===s)){if(!a){c=i;return}d(i,t)}})})});return{destroy(){o=!0,p(),clearTimeout(l),clearTimeout(f),se()}}}function oe(){let e=document.querySelector(`[${O}]`);if(e)return e;let t=document.createElement(`div`);return t.setAttribute(`style`,`position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0`),t.setAttribute(`aria-live`,`assertive`),t.setAttribute(`aria-atomic`,`true`),t.setAttribute(O,``),document.body.prepend(t),t}function se(){document.querySelector(`[${O}]`)?.remove()}function ce(e,t,n,r){if(n)return n(e);let i=(r?.textContent??``).trim(),a=e.name.startsWith(`@@`)?``:e.name;return`${t}${i||document.title||a||globalThis.location.pathname}`}function le(e){e&&(e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`-1`),e.focus({preventScroll:!0}))}const k=Object.freeze({destroy:()=>{}});function ue(e,t){if(globalThis.window===void 0)return k;let n=t?.mode??`restore`;if(n===`native`)return k;let r=t?.anchorScrolling??!0,i=t?.scrollContainer,a=t?.behavior??`auto`,o=t?.storageKey??`real-router:scroll`,s=()=>{try{let e=sessionStorage.getItem(o);return e?JSON.parse(e):{}}catch{return{}}},c=(e,t)=>{try{let n=s();n[e]=t,sessionStorage.setItem(o,JSON.stringify(n))}catch{}},l=history.scrollRestoration;try{history.scrollRestoration=`manual`}catch{}let u=()=>{let e=i?.();return e?e.scrollTop:globalThis.scrollY},d=e=>{let t=i?.();t?t.scrollTo({top:e,left:0,behavior:a}):globalThis.scrollTo({top:e,left:0,behavior:a})},f=e=>{let t=e.context?.url?.hash;if(t!==void 0){if(r&&t.length>0){let e=document.getElementById(t);if(e){e.scrollIntoView({behavior:a});return}}d(0);return}let n=globalThis.location.hash;if(r&&n.length>1){let e;try{e=decodeURIComponent(n.slice(1))}catch{e=n.slice(1)}let t=document.getElementById(e);if(t){t.scrollIntoView({behavior:a});return}}d(0)},p=!1,m=e.subscribe(({route:e,previousRoute:t})=>{let r=e.context.navigation;t&&c(A(t),u()),requestAnimationFrame(()=>{if(!p){if(n===`top`||!r){f(e);return}if(r.navigationType!==`replace`){if(r.direction===`back`||r.navigationType===`traverse`||r.navigationType===`reload`){d(s()[A(e)]??0);return}f(e)}}})}),h=()=>{let t=e.getState();t&&c(A(t),u())};return globalThis.addEventListener(`pagehide`,h),{destroy:()=>{if(!p){p=!0,m(),globalThis.removeEventListener(`pagehide`,h);try{history.scrollRestoration=l}catch{}}}}}function A(e){return`${e.name}:${j(e.params)}`}function j(e){return JSON.stringify(e,M)}function M(e,t){if(typeof t==`object`&&t&&!Array.isArray(t)){let e={},n=Object.keys(t).sort((e,t)=>e.localeCompare(t));for(let r of n)e[r]=t[r];return e}return t}const N=Object.freeze({destroy:()=>{}});function P(e){if(typeof document>`u`||typeof document.startViewTransition!=`function`)return N;let t=null,n=null,r=!1,i=()=>{t?.(),t=null},a=e.subscribeLeave(({signal:e})=>{if(!e.aborted)return r=!1,i(),new Promise(a=>{let o=new Promise(e=>{t=e});e.addEventListener(`abort`,()=>{r||(i(),n?.skipTransition?.(),a())},{once:!0});try{n=document.startViewTransition(()=>(a(),o))}catch{i(),a()}})}),o=e.subscribe(()=>{let e=t;r=!0,t=null,e===null?n=null:setTimeout(()=>{e(),n=null},0)});return{destroy:()=>{a(),o(),n?.skipTransition?.(),n=null,i()}}}function F(e){return e.button===0&&!e.metaKey&&!e.altKey&&!e.ctrlKey&&!e.shiftKey}function I(e){return encodeURI(e).replaceAll(`#`,`%23`)}function L(e,t,n,r){try{let i=r?.hash,a;i!==void 0&&(a=i.startsWith(`#`)?i.slice(1):i);let o=e.buildUrl;if(o){let e=o(t,n,a===void 0?void 0:{hash:a});if(e!==void 0)return e}let s=e.buildPath(t,n);return a?`${s}#${I(a)}`:s}catch{console.error(`[real-router] Route "${t}" is not defined. The element will render without an href attribute.`);return}}function R(e,t,n,r,i){let a={...i};r!==void 0&&(a.hash=r);let o=e.getState();if(o?.name===t&&V(o.params,n)){let e=o.context?.url?.hash??``;e!==(r??e)&&(a.force=!0,a.hashChange=!0)}return e.navigate(t,n,a)}function z(e){return e?e.match(/\S+/g)??[]:[]}function B(e,t,n){if(e&&t){let e=z(t);if(e.length===0)return n??void 0;if(!n)return e.join(` `);let r=z(n),i=new Set(r);for(let t of e)i.has(t)||(i.add(t),r.push(t));return r.join(` `)}return n??void 0}function V(e,t){if(Object.is(e,t))return!0;if(!e||!t)return!1;let n=Object.keys(e);if(n.length!==Object.keys(t).length)return!1;let r=e,i=t;for(let e of n)if(!Object.is(r[e],i[e]))return!1;return!0}function H(e){e&&(e instanceof HTMLAnchorElement||e instanceof HTMLButtonElement||(e.hasAttribute(`role`)||e.setAttribute(`role`,`link`),e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`0`)))}function U(e,t){if(typeof e==`function`){e(t);return}if(Array.isArray(e)){let n=e;for(let e of n)if(typeof e==`function`&&(e(t),t.defaultPrevented))return}}const de=(0,e.defineComponent)({name:`Link`,inheritAttrs:!1,props:{routeName:{type:String,required:!0},routeParams:{type:Object,default:()=>re},routeOptions:{type:Object,default:()=>ie},class:{type:String,default:void 0},activeClassName:{type:String,default:`active`},activeStrict:{type:Boolean,default:!1},ignoreQueryParams:{type:Boolean,default:!0},target:{type:String,default:void 0},hash:{type:String,default:void 0}},setup(t,{slots:n,attrs:i}){let a=b(),o=(0,e.shallowRef)(!1);(0,e.watch)(()=>[t.routeName,t.routeParams,t.activeStrict,t.ignoreQueryParams,t.hash],([e,t,n,i,s],c,l)=>{let u=(0,r.createActiveRouteSource)(a,e,t,s===void 0?{strict:n,ignoreQueryParams:i}:{strict:n,ignoreQueryParams:i,hash:s});o.value=u.getSnapshot(),l(u.subscribe(()=>{o.value=u.getSnapshot()}))},{immediate:!0,flush:`sync`});let s=(0,e.computed)(()=>L(a,t.routeName,t.routeParams,t.hash===void 0?void 0:{hash:t.hash})),c=(0,e.computed)(()=>B(o.value,t.activeClassName,t.class)),l=e=>{i.onClick!==void 0&&i.onClick!==null&&(U(i.onClick,e),e.defaultPrevented)||!F(e)||t.target===`_blank`||(e.preventDefault(),R(a,t.routeName,t.routeParams,t.hash,t.routeOptions).catch(()=>{}))};return()=>{let r={};for(let e of Object.keys(i))e!==`onClick`&&(r[e]=i[e]);return(0,e.h)(`a`,{...r,href:s.value,class:c.value,target:t.target,onClick:l},n.default?.())}}}),fe=(0,e.defineComponent)({name:`RouterErrorBoundary`,props:{fallback:{type:Function,required:!0},onError:{type:Function,default:void 0}},setup(t,{slots:n}){let i=g((0,r.createDismissableError)(b()));return(0,e.watch)(()=>i.value.version,()=>{i.value.error&&t.onError?.(i.value.error,i.value.toRoute,i.value.fromRoute)},{immediate:!0}),()=>{let r=n.default?.()??[],a=i.value.error?t.fallback(i.value.error,i.value.resetError):null;return(0,e.h)(e.Fragment,null,[...r,a])}}}),W=[];function G(e){return W.push(e),()=>{let t=W.lastIndexOf(e);t!==-1&&W.splice(t,1)}}function K(){let e=W.at(-1);if(!e)throw Error(`v-link directive requires a RouterProvider ancestor. Make sure RouterProvider is mounted.`);return e}const q=new WeakMap;function J(e){return e==null?(console.error(`[real-router] v-link directive received null/undefined value. The element will not be wired for navigation.`),!1):typeof e.name==`string`?!0:(console.error("[real-router] v-link directive value is missing a string `name` field. The element will not be wired for navigation."),!1)}function pe(e,t){return n=>{F(n)&&(n.preventDefault(),e.navigate(t.name,t.params??{},t.options??{}).catch(()=>{}))}}function me(e,t,n){return r=>{r.key===`Enter`&&!(n instanceof HTMLButtonElement)&&e.navigate(t.name,t.params??{},t.options??{}).catch(()=>{})}}function Y(e,t,n){let r=pe(t,n),i=me(t,n,e);e.addEventListener(`click`,r),e.addEventListener(`keydown`,i),q.set(e,{click:r,keydown:i})}function X(e){let t=q.get(e);t&&(e.removeEventListener(`click`,t.click),e.removeEventListener(`keydown`,t.keydown),q.delete(e))}const he={mounted(e,t){let n=K();H(e),e.style.cursor=`pointer`,J(t.value)&&Y(e,n,t.value)},updated(e,t){let n=K();X(e),J(t.value)&&Y(e,n,t.value)},beforeUnmount(e){X(e)}},Z=()=>{let t=(0,e.inject)(v);if(!t)throw Error(`useNavigator must be used within a RouterProvider`);return t},ge=()=>(0,n.getRouteUtils)((0,i.getPluginApi)(b()).getTree()),Q=()=>{let t=(0,e.inject)(y);if(!t)throw Error(`useRoute must be used within a RouterProvider`);if(!t.route.value)throw Error(`useRoute called with no active route. Did you forget to await router.start() before rendering, or is the router stopped/disposed?`);return t};function _e(){return g((0,r.getTransitionSource)(b()))}function ve(t,n){let r=b(),i=n?.skipSameRoute??!0;(0,e.onScopeDispose)(r.subscribeLeave(({route:e,nextRoute:n,signal:r})=>{if(!(i&&e.name===n.name)&&!r.aborted)return t({route:e,nextRoute:n,signal:r})}))}function ye(t,n){let{route:r,previousRoute:i}=Q(),a=n?.skipSameRoute??!0,o=null;(0,e.watch)(r,e=>{let n=i.value;e.transition.from&&(a&&e.transition.from===e.name||o===e||!n||(o=e,t({route:e,previousRoute:n})))})}function $(n){let i=(0,t.getNavigator)(n),a=(0,r.createRouteSource)(n),o=a.getSnapshot(),s=(0,e.shallowRef)(o.route),c=(0,e.shallowRef)(o.previousRoute);return{navigator:i,route:s,previousRoute:c,unsubscribe:a.subscribe(()=>{let e=a.getSnapshot();s.value=e.route,c.value=e.previousRoute})}}function be(e){return{install(t){let n=G(e),{navigator:r,route:i,previousRoute:a,unsubscribe:o}=$(e);`onUnmount`in t&&t.onUnmount(()=>{n(),o()}),t.provide(_,e),t.provide(v,r),t.provide(y,{navigator:r,route:i,previousRoute:a})}}}const xe=(0,e.defineComponent)({name:`RouterProvider`,props:{router:{type:Object,required:!0},announceNavigation:{type:Boolean,default:!1},scrollRestoration:{type:Object},viewTransitions:{type:Boolean,default:!1}},setup(t,{slots:n}){(0,e.watch)(()=>[t.router,t.announceNavigation],([e,t],n,r)=>{if(!t)return;let i=ae(e);r(()=>{i.destroy()})},{immediate:!0}),(0,e.watch)(()=>[t.router,t.scrollRestoration!==void 0,t.scrollRestoration?.mode,t.scrollRestoration?.anchorScrolling,t.scrollRestoration?.behavior,t.scrollRestoration?.storageKey],([e,n,r,i,a,o],s,c)=>{if(!n)return;let l=ue(e,{mode:r,anchorScrolling:i,behavior:a,storageKey:o,scrollContainer:t.scrollRestoration?.scrollContainer});c(()=>{l.destroy()})},{immediate:!0}),(0,e.watch)(()=>[t.router,t.viewTransitions],([e,t],n,r)=>{if(!t)return;let i=P(e);r(()=>{i.destroy()})},{immediate:!0});let r=G(t.router),{navigator:i,route:a,previousRoute:o,unsubscribe:s}=$(t.router);return(0,e.onScopeDispose)(()=>{r(),s()}),(0,e.provide)(_,t.router),(0,e.provide)(v,i),(0,e.provide)(y,{navigator:i,route:a,previousRoute:o}),()=>n.default?.()}});exports.Link=de,exports.NavigatorKey=v,exports.RouteKey=y,exports.RouteView=D,exports.RouterErrorBoundary=fe,exports.RouterKey=_,exports.RouterProvider=xe,exports.createRouterPlugin=be,exports.useNavigator=Z,exports.useRoute=Q,exports.useRouteEnter=ye,exports.useRouteExit=ve,exports.useRouteNode=x,exports.useRouteUtils=ge,exports.useRouter=b,exports.useRouterTransition=_e,exports.vLink=he;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./useRoute-BT3SkdOc.js`);let t=require(`vue`),n=require(`@real-router/core`),r=require(`@real-router/route-utils`),i=require(`@real-router/sources`),a=require(`@real-router/core/api`);function o(){return null}const s=(0,t.defineComponent)({name:`RouteView.Match`,props:{segment:{type:String,required:!0},exact:{type:Boolean,default:!1},fallback:{type:[Object,Function],default:void 0},keepAlive:{type:Boolean,default:!1}},render:o}),c=(0,t.defineComponent)({name:`RouteView.Self`,props:{fallback:{type:[Object,Function],default:void 0}},render:o}),l=(0,t.defineComponent)({name:`RouteView.NotFound`,render:o});function u(e,t,n){return n?e===t:(0,r.startsWithSegment)(e,t)}function d(e){return e===!0||e===``||e===`keep-alive`}function f(e){if(Array.isArray(e)){let n=[];for(let r of e)Array.isArray(r)?n.push(...f(r)):(0,t.isVNode)(r)&&n.push(r);return n}return(0,t.isVNode)(e)?[e]:[]}function p(e,n){let r=f(e);for(let e of r)e.type===s||e.type===c||e.type===l?n.push(e):e.type===t.Fragment&&p(e.children,n)}function m(e,t){return e.type===l?(t.notFoundChildren=e.children,!0):e.type===c?(t.selfVNode===null&&(t.selfVNode=e,t.selfFallback=e.props?.fallback),!0):!1}function h(e,t,n){let r=e.props,i=r?.segment??``,a=r?.exact??!1;return{isActive:u(t,n?`${n}.${i}`:i,a),fallback:r?.fallback}}function g(e,t,r,i,a){if(i.selfVNode!==null&&t===r)return e.push(i.selfVNode),i.selfFallback;if(t===n.UNKNOWN_ROUTE&&i.notFoundChildren!==null){let t=a.filter(e=>e.type===l).at(-1);t&&e.push(t)}}function _(e,t,n){let r={selfVNode:null,selfFallback:void 0,notFoundChildren:null},i=!1,a,o=!1,c=[];for(let l of e){if(!o&&l.type===s){let e=l.props;d(e?.keepAlive)&&(o=!0)}if(m(l,r)||i)continue;let e=h(l,t,n);e.isActive&&(i=!0,a=e.fallback,c.push(l))}return i||(a=g(c,t,n,r,e)),{rendered:c,activeMatchFound:i,fallback:a,hasPerMatchKA:o}}function v(e){let n=(0,t.shallowRef)(e.getSnapshot());return(0,t.onScopeDispose)(e.subscribe(()=>{n.value=e.getSnapshot()})),n}const y=()=>{let n=(0,t.inject)(e.a);if(!n)throw Error(`useRouter must be used within a RouterProvider`);return n};function b(e){let r=y(),a=v((0,i.createRouteNodeSource)(r,e));return{navigator:(0,n.getNavigator)(r),route:(0,t.computed)(()=>a.value.route),previousRoute:(0,t.computed)(()=>a.value.previousRoute)}}function x(e){return e.children?.default?.()??null}function S(e,n){let r=e.get(n);if(r)return r;let i=(0,t.markRaw)((0,t.defineComponent)({name:`KeepAlive-${n}`,setup(e,t){return()=>t.slots.default?.()}}));return e.set(n,i),i}function C(e,n){if(n===void 0)return e;let r=typeof n==`function`?n():n;return(0,t.h)(t.Suspense,{},{default:()=>e,fallback:()=>r})}let w=null;function ee(){return w??=(0,t.markRaw)((0,t.defineComponent)({name:`KeepAlive-placeholder`,render(){return null}})),w}function te(e,n,r){let i=e.props?.segment??`__not-found__`,a=S(n,i),o=x(e)??[];return C((0,t.h)(t.KeepAlive,null,{default:()=>(0,t.h)(a,{key:i},{default:()=>o})}),r)}function T(e,n,r){let i=e.props;if(d(i?.keepAlive)&&e.type===s){let r=i?.segment??`__not-found__`,a=S(n,r),o=x(e)??[];return(0,t.h)(t.Fragment,[(0,t.h)(t.KeepAlive,null,{default:()=>(0,t.h)(a,{key:r},{default:()=>o})})])}let a=x(e);return a?(0,t.h)(t.Fragment,[(0,t.h)(t.KeepAlive,null,{default:()=>(0,t.h)(ee())}),C((0,t.h)(t.Fragment,a),r)]):null}const E=(0,t.defineComponent)({name:`RouteView`,props:{nodeName:{type:String,required:!0},keepAlive:{type:Boolean,default:!1}},setup(e,{slots:n}){let r=b(e.nodeName),i=new Map;return()=>{let a=r.route.value;if(!a)return null;let o=n.default?.(),u=[];p(o,u);let{rendered:d,fallback:f,hasPerMatchKA:m}=_(u,a.name,e.nodeName);if(d.length===0)return null;let h=d[0];if(e.keepAlive)return te(h,i,f);if(h.type!==s&&h.type!==c&&h.type!==l)return null;if(m)return T(h,i,f);let g=x(h);return g?C((0,t.h)(t.Fragment,g),f):null}}}),D=Object.assign(E,{Match:s,Self:c,NotFound:l}),ne=Object.freeze({}),re=Object.freeze({}),O=`data-real-router-announcer`,ie=Object.freeze({destroy:()=>{}});function ae(e,t){if(typeof document>`u`)return ie;let n=t?.prefix??`Navigated to `,r=t?.getAnnouncementText,i=!0,a=!1,o=!1,s=``,c=null,l,u=oe(),d=(e,t)=>{s=e,clearTimeout(l),u.textContent=e,l=setTimeout(()=>{u.textContent=``,s=``},7e3),le(t)},f=setTimeout(()=>{if(a=!0,c!==null&&!o){let e=c;c=null,d(e,document.querySelector(`h1`))}},100),p=e.subscribe(({route:e})=>{if(i){i=!1;return}requestAnimationFrame(()=>{requestAnimationFrame(()=>{if(o)return;let t=document.querySelector(`h1`),i=ce(e,n,r,t);if(!(!i||i===s)){if(!a){c=i;return}d(i,t)}})})});return{destroy(){o=!0,p(),clearTimeout(l),clearTimeout(f),se()}}}function oe(){let e=document.querySelector(`[${O}]`);if(e)return e;let t=document.createElement(`div`);return t.setAttribute(`style`,`position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0`),t.setAttribute(`aria-live`,`assertive`),t.setAttribute(`aria-atomic`,`true`),t.setAttribute(O,``),(document.body??document.documentElement).prepend(t),t}function se(){document.querySelector(`[${O}]`)?.remove()}function ce(e,t,n,r){if(n)try{let t=n(e);if(t)return t}catch(e){console.error(`[real-router] getAnnouncementText threw; falling back to default resolution.`,e)}let i=(r?.textContent??``).trim(),a=e.name.startsWith(`@@`)?``:e.name;return`${t}${i||document.title||a||globalThis.location.pathname}`}function le(e){e&&(e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`-1`),e.focus({preventScroll:!0}))}const k=Object.freeze({destroy:()=>{}});function ue(e,t){if(globalThis.window===void 0)return k;let n=t?.mode??`restore`;if(n===`native`)return k;let r=t?.anchorScrolling??!0,i=t?.scrollContainer,a=t?.behavior??`auto`,o=t?.storageKey??`real-router:scroll`,s,c=()=>{if(s!==void 0)return s;try{let e=sessionStorage.getItem(o);s=e?JSON.parse(e):{}}catch{s={}}return s},l=(e,t)=>{try{let n=c();if(n[e]===t)return;n[e]=t,sessionStorage.setItem(o,JSON.stringify(n))}catch{}},u=history.scrollRestoration;try{history.scrollRestoration=`manual`}catch{}let d=()=>{let e=i?.();return e?e.scrollTop:globalThis.scrollY},f=e=>{let t=i?.();t?t.scrollTo({top:e,left:0,behavior:a}):globalThis.scrollTo({top:e,left:0,behavior:a})},p=e=>{let t=e.context?.url?.hash;if(t!==void 0){if(r&&t.length>0){let e=document.getElementById(t);if(e){e.scrollIntoView({behavior:a});return}}f(0);return}let n=globalThis.location.hash;if(r&&n.length>1){let e;try{e=decodeURIComponent(n.slice(1))}catch{e=n.slice(1)}let t=document.getElementById(e);if(t){t.scrollIntoView({behavior:a});return}}f(0)},m=!1,h=!1,g=e=>{try{return j(e)}catch{return h||(h=!0,console.error(`[real-router] scroll-restore: route "${e.name}" has params that cannot be canonicalized (e.g. BigInt or cyclic structure). Scroll position will not be captured or restored for this route.`)),null}},_=e.subscribe(({route:e,previousRoute:t})=>{let r=e.context.navigation;if(t){let e=g(t);e!==null&&l(e,d())}requestAnimationFrame(()=>{if(!m){if(n===`top`||!r){p(e);return}if(r.navigationType!==`replace`){if(r.direction===`back`||r.navigationType===`traverse`||r.navigationType===`reload`){let t=g(e);f(t===null?0:c()[t]??0);return}p(e)}}})}),v=()=>{let t=e.getState();if(t){let e=g(t);e!==null&&l(e,d())}};return globalThis.addEventListener(`pagehide`,v),{destroy:()=>{if(!m){m=!0,_(),globalThis.removeEventListener(`pagehide`,v);try{history.scrollRestoration=u}catch{}}}}}const A=new WeakMap;function j(e){let t=A.get(e);if(t!==void 0)return t;let n=`${e.name}:${M(e.params)}`;return A.set(e,n),n}function M(e){return JSON.stringify(e,N)}function N(e,t){if(typeof t==`function`)return`<fn>`;if(typeof t==`symbol`)return`<sym>`;if(typeof t==`object`&&t&&!Array.isArray(t)){let e=Object.create(null),n=Object.keys(t).sort((e,t)=>e.localeCompare(t));for(let r of n)e[r]=t[r];return e}return t}const P=Object.freeze({destroy:()=>{}});function F(e){if(typeof document>`u`||typeof document.startViewTransition!=`function`)return P;let t=null,n=null,r=!1,i=()=>{t?.(),t=null},a=e.subscribeLeave(({signal:e})=>{if(!e.aborted)return r=!1,i(),new Promise(a=>{let o=new Promise(e=>{t=e});e.addEventListener(`abort`,()=>{r||(i(),n?.skipTransition?.(),a())},{once:!0});try{n=document.startViewTransition(()=>(a(),o))}catch{i(),a()}})}),o=e.subscribe(()=>{let e=t;r=!0,t=null,e===null?n=null:setTimeout(()=>{e(),n=null},0)});return{destroy:()=>{a(),o(),n?.skipTransition?.(),n=null,i()}}}function I(e){return e.button===0&&!e.metaKey&&!e.altKey&&!e.ctrlKey&&!e.shiftKey}const L=/%[\dA-Fa-f]{2}/;function R(e){if(L.test(e))try{return encodeURI(decodeURIComponent(e)).replaceAll(`#`,`%23`)}catch{}return encodeURI(e).replaceAll(`#`,`%23`)}function z(e,t,n,r){try{let i=r?.hash,a;i!==void 0&&(a=i.startsWith(`#`)?i.slice(1):i);let o=e.buildUrl;if(o){let e=o(t,n,a===void 0?void 0:{hash:a});if(typeof e==`string`&&e.length>0)return e}let s=e.buildPath(t,n);if(typeof s!=`string`||s.length===0){console.error(`[real-router] Route "${t}" yielded an empty path. The element will render without an href attribute.`);return}return a?`${s}#${R(a)}`:s}catch{console.error(`[real-router] Route "${t}" is not defined. The element will render without an href attribute.`);return}}function B(e,t,n,r,i){let a={...i};r!==void 0&&(a.hash=r);let o=e.getState();if(o?.name===t&&fe(o.params,n)){let e=o.context?.url?.hash??``;e!==(r??e)&&(a.force=!0,a.hashChange=!0)}return e.navigate(t,n,a)}const V=/\s/,H=/\S+/g;function U(e){return e?V.test(e)?e.match(H)??[]:[e]:[]}function de(e,t,n){if(e&&t){let e=U(t);if(e.length===0)return n??void 0;if(!n)return e.join(` `);let r=U(n),i=new Set(r);for(let t of e)i.has(t)||(i.add(t),r.push(t));return r.join(` `)}return n??void 0}function fe(e,t){if(Object.is(e,t))return!0;if(!e||!t)return!1;let n=Object.keys(e);if(n.length!==Object.keys(t).length)return!1;let r=e,i=t;for(let e of n)if(!Object.prototype.hasOwnProperty.call(t,e)||!Object.is(r[e],i[e]))return!1;return!0}function pe(e){if(!e)return;let t=e.tagName;t===`A`||t===`BUTTON`||(e.hasAttribute(`role`)||e.setAttribute(`role`,`link`),e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`0`))}function me(e,t){if(typeof e==`function`){e(t);return}if(Array.isArray(e)){let n=e;for(let e of n)if(typeof e==`function`&&(e(t),t.defaultPrevented))return}}const he=(0,t.defineComponent)({name:`Link`,inheritAttrs:!1,props:{routeName:{type:String,required:!0},routeParams:{type:Object,default:()=>ne},routeOptions:{type:Object,default:()=>re},class:{type:String,default:void 0},activeClassName:{type:String,default:`active`},activeStrict:{type:Boolean,default:!1},ignoreQueryParams:{type:Boolean,default:!0},target:{type:String,default:void 0},hash:{type:String,default:void 0}},setup(e,{slots:n,attrs:r}){let a=y(),o=(0,t.shallowRef)(!1);(0,t.watch)(()=>[e.routeName,(0,i.canonicalJson)(e.routeParams),e.activeStrict,e.ignoreQueryParams,e.hash],([t,n,r,s,c],l,u)=>{let d=e.routeParams,f=(0,i.createActiveRouteSource)(a,t,d,c===void 0?{strict:r,ignoreQueryParams:s}:{strict:r,ignoreQueryParams:s,hash:c});o.value=f.getSnapshot(),u(f.subscribe(()=>{o.value=f.getSnapshot()}))},{immediate:!0,flush:`sync`});let s=(0,t.computed)(()=>z(a,e.routeName,e.routeParams,e.hash===void 0?void 0:{hash:e.hash})),c=(0,t.computed)(()=>de(o.value,e.activeClassName,e.class)),l=t=>{r.onClick!==void 0&&r.onClick!==null&&(me(r.onClick,t),t.defaultPrevented)||!I(t)||e.target===`_blank`||(t.preventDefault(),B(a,e.routeName,e.routeParams,e.hash,e.routeOptions).catch(()=>{}))};return()=>{let i={...r};return delete i.onClick,(0,t.h)(`a`,{...i,href:s.value,class:c.value,target:e.target,onClick:l},n.default?.())}}}),ge=(0,t.defineComponent)({name:`RouterErrorBoundary`,props:{fallback:{type:Function,required:!0},onError:{type:Function,default:void 0}},setup(e,{slots:n}){let r=v((0,i.createDismissableError)(y()));return(0,t.watch)(()=>r.value.version,()=>{r.value.error&&e.onError?.(r.value.error,r.value.toRoute,r.value.fromRoute)},{immediate:!0}),()=>{let i=n.default?.()??[],a=r.value.error?e.fallback(r.value.error,r.value.resetError):null;return(0,t.h)(t.Fragment,null,[...i,a])}}}),W=[];function G(e){return W.push(e),()=>{let t=W.lastIndexOf(e);t!==-1&&W.splice(t,1)}}function K(){let e=W.at(-1);if(!e)throw Error(`v-link directive requires a RouterProvider ancestor. Make sure RouterProvider is mounted.`);return e}const q=new WeakMap;function J(e){return e==null?(console.error(`[real-router] v-link directive received null/undefined value. The element will not be wired for navigation.`),!1):typeof e.name==`string`?!0:(console.error("[real-router] v-link directive value is missing a string `name` field. The element will not be wired for navigation."),!1)}function _e(e,t){return n=>{I(n)&&(n.preventDefault(),e.navigate(t.name,t.params??{},t.options??{}).catch(()=>{}))}}function ve(e,t,n){return r=>{r.key===`Enter`&&!(n instanceof HTMLButtonElement)&&e.navigate(t.name,t.params??{},t.options??{}).catch(()=>{})}}function Y(e,t,n){let r=_e(t,n),i=ve(t,n,e);e.addEventListener(`click`,r),e.addEventListener(`keydown`,i),q.set(e,{click:r,keydown:i})}function X(e){let t=q.get(e);t&&(e.removeEventListener(`click`,t.click),e.removeEventListener(`keydown`,t.keydown),q.delete(e))}const ye={mounted(e,t){let n=K();pe(e),e.style.cursor=`pointer`,J(t.value)&&Y(e,n,t.value)},updated(e,t){if(t.value===t.oldValue)return;let n=K();X(e),J(t.value)&&Y(e,n,t.value)},beforeUnmount(e){X(e)}},be=()=>{let n=(0,t.inject)(e.r);if(!n)throw Error(`useNavigator must be used within a RouterProvider`);return n},xe=()=>(0,r.getRouteUtils)((0,a.getPluginApi)(y()).getTree());function Se(){return v((0,i.getTransitionSource)(y()))}function Z(e,n){let r=y(),i=n?.skipSameRoute??!0;(0,t.onScopeDispose)(r.subscribeLeave(({route:t,nextRoute:n,signal:r})=>{if(!(i&&t.name===n.name)&&!r.aborted)return e({route:t,nextRoute:n,signal:r})}))}function Ce(n,r){let{route:i,previousRoute:a}=e.t(),o=r?.skipSameRoute??!0,s=null;(0,t.watch)(i,e=>{let t=a.value;e.transition.from&&(o&&e.transition.from===e.name||s===e||!t||(s=e,n({route:e,previousRoute:t})))})}function Q(e){let r=(0,n.getNavigator)(e),a=(0,i.createRouteSource)(e),o=a.getSnapshot(),s=(0,t.shallowRef)(o.route),c=(0,t.shallowRef)(o.previousRoute);return{navigator:r,route:s,previousRoute:c,unsubscribe:a.subscribe(()=>{let e=a.getSnapshot();s.value=e.route,c.value=e.previousRoute})}}function we(t){return{install(n){let r=G(t),{navigator:i,route:a,previousRoute:o,unsubscribe:s}=Q(t);`onUnmount`in n&&n.onUnmount(()=>{r(),s()}),n.provide(e.a,t),n.provide(e.r,i),n.provide(e.i,{navigator:i,route:a,previousRoute:o})}}}function $(e,n){(0,t.watch)(e,(e,t,r)=>{let i=n(e);i&&r(()=>{i.destroy()})},{immediate:!0})}const Te=(0,t.defineComponent)({name:`RouterProvider`,props:{router:{type:Object,required:!0},announceNavigation:{type:Boolean,default:!1},scrollRestoration:{type:Object},viewTransitions:{type:Boolean,default:!1}},setup(n,{slots:r}){$(()=>[n.router,n.announceNavigation],([e,t])=>t?ae(e):void 0),$(()=>[n.router,n.scrollRestoration!==void 0,n.scrollRestoration?.mode,n.scrollRestoration?.anchorScrolling,n.scrollRestoration?.behavior,n.scrollRestoration?.storageKey],([e,t,r,i,a,o])=>{if(t)return ue(e,{mode:r,anchorScrolling:i,behavior:a,storageKey:o,scrollContainer:n.scrollRestoration?.scrollContainer})}),$(()=>[n.router,n.viewTransitions],([e,t])=>t?F(e):void 0);let i=G(n.router),{navigator:a,route:o,previousRoute:s,unsubscribe:c}=Q(n.router);return(0,t.onScopeDispose)(()=>{i(),c()}),(0,t.provide)(e.a,n.router),(0,t.provide)(e.r,a),(0,t.provide)(e.i,{navigator:a,route:o,previousRoute:s}),()=>r.default?.()}});exports.Link=he,exports.NavigatorKey=e.r,exports.RouteKey=e.i,exports.RouteView=D,exports.RouterErrorBoundary=ge,exports.RouterKey=e.a,exports.RouterProvider=Te,exports.createRouterPlugin=we,exports.useNavigator=be,exports.useRoute=e.t,exports.useRouteEnter=Ce,exports.useRouteExit=Z,exports.useRouteNode=b,exports.useRouteUtils=xe,exports.useRouter=y,exports.useRouterTransition=Se,exports.vLink=ye;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|