@real-router/svelte 0.13.1 → 0.13.3

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.
Files changed (41) hide show
  1. package/dist/RouterProvider.svelte +8 -0
  2. package/dist/components/Link.svelte +2 -0
  3. package/dist/components/RouteView.svelte +2 -0
  4. package/dist/dom-utils/link-utils.js +3 -3
  5. package/dist/dom-utils/scroll-spy.js +1 -0
  6. package/package.json +11 -11
  7. package/dist/dom-utils/__test-helpers/expected-fragment.d.ts +0 -30
  8. package/dist/dom-utils/__test-helpers/expected-fragment.js +0 -43
  9. package/dist/dom-utils/__test-helpers/index.d.ts +0 -8
  10. package/dist/dom-utils/__test-helpers/index.js +0 -8
  11. package/src/RouterProvider.svelte +0 -112
  12. package/src/actions/link.svelte.ts +0 -88
  13. package/src/components/Await.svelte +0 -48
  14. package/src/components/ClientOnly.svelte +0 -22
  15. package/src/components/HttpStatusCode.svelte +0 -63
  16. package/src/components/HttpStatusProvider.svelte +0 -45
  17. package/src/components/Lazy.svelte +0 -55
  18. package/src/components/Link.svelte +0 -95
  19. package/src/components/RouteView.helpers.ts +0 -24
  20. package/src/components/RouteView.svelte +0 -35
  21. package/src/components/RouterErrorBoundary.svelte +0 -47
  22. package/src/components/ServerOnly.svelte +0 -22
  23. package/src/components/Streamed.svelte +0 -37
  24. package/src/composables/useDeferred.svelte.ts +0 -41
  25. package/src/composables/useIsActiveRoute.svelte.ts +0 -30
  26. package/src/composables/useNavigator.svelte.ts +0 -6
  27. package/src/composables/useRoute.svelte.ts +0 -25
  28. package/src/composables/useRouteEnter.svelte.ts +0 -120
  29. package/src/composables/useRouteExit.svelte.ts +0 -113
  30. package/src/composables/useRouteNode.svelte.ts +0 -18
  31. package/src/composables/useRouteUtils.svelte.ts +0 -12
  32. package/src/composables/useRouter.svelte.ts +0 -6
  33. package/src/composables/useRouterTransition.svelte.ts +0 -15
  34. package/src/constants.ts +0 -7
  35. package/src/context.ts +0 -24
  36. package/src/createReactiveSource.svelte.ts +0 -21
  37. package/src/createRouteContext.svelte.ts +0 -27
  38. package/src/index.ts +0 -60
  39. package/src/ssr.ts +0 -28
  40. package/src/types.ts +0 -46
  41. package/src/utils/createHttpStatusSink.ts +0 -31
@@ -1,95 +0,0 @@
1
- <script lang="ts">
2
- import { useIsActiveRoute } from "../composables/useIsActiveRoute.svelte";
3
- import { useRouter } from "../composables/useRouter.svelte";
4
- import { EMPTY_OPTIONS, EMPTY_PARAMS, NOOP } from "../constants";
5
- import {
6
- shouldNavigate,
7
- buildHref,
8
- buildActiveClassName,
9
- navigateWithHash,
10
- } from "../dom-utils";
11
-
12
- import type { NavigationOptions, Params } from "@real-router/core";
13
- import type { Snippet } from "svelte";
14
-
15
- let {
16
- routeName,
17
- routeParams = EMPTY_PARAMS,
18
- routeOptions = EMPTY_OPTIONS,
19
- class: className = undefined,
20
- activeClassName = "active",
21
- activeStrict = false,
22
- ignoreQueryParams = true,
23
- hash = undefined,
24
- target = undefined,
25
- children = undefined,
26
- onclick: userOnClick = undefined,
27
- ...restProps
28
- }: {
29
- routeName: string;
30
- routeParams?: Params;
31
- routeOptions?: NavigationOptions;
32
- class?: string;
33
- activeClassName?: string;
34
- activeStrict?: boolean;
35
- ignoreQueryParams?: boolean;
36
- /**
37
- * URL fragment (decoded form, no leading "#") (#532).
38
- * - omitted/`undefined` → preserve current fragment on same-route navigation
39
- * - `""` → clear fragment
40
- * - non-empty → set fragment
41
- */
42
- hash?: string;
43
- target?: string;
44
- children?: Snippet;
45
- onclick?: (evt: MouseEvent) => void;
46
- [key: string]: unknown;
47
- } = $props();
48
-
49
- const router = useRouter();
50
- // Hash-aware active (#532): tab links sharing routeName but differing in
51
- // hash should only light up the matching variant.
52
- const activeState = useIsActiveRoute(
53
- routeName,
54
- routeParams,
55
- activeStrict,
56
- ignoreQueryParams,
57
- hash,
58
- );
59
-
60
- const href = $derived(
61
- buildHref(
62
- router,
63
- routeName,
64
- routeParams,
65
- hash !== undefined ? { hash } : undefined,
66
- ),
67
- );
68
-
69
- const finalClassName = $derived(
70
- buildActiveClassName(activeState.current, activeClassName, className),
71
- );
72
-
73
- function handleClick(evt: MouseEvent) {
74
- if (userOnClick) {
75
- userOnClick(evt);
76
-
77
- if (evt.defaultPrevented) {
78
- return;
79
- }
80
- }
81
-
82
- if (!shouldNavigate(evt) || target === "_blank") {
83
- return;
84
- }
85
-
86
- evt.preventDefault();
87
- navigateWithHash(router, routeName, routeParams, hash, routeOptions).catch(
88
- NOOP,
89
- );
90
- }
91
- </script>
92
-
93
- <a {href} class={finalClassName} {target} onclick={handleClick} {...restProps}>
94
- {@render children?.()}
95
- </a>
@@ -1,24 +0,0 @@
1
- import { startsWithSegment } from "@real-router/route-utils";
2
-
3
- // Snippet names reserved by RouteView for non-segment slots. Iteration in
4
- // `getActiveSegment` skips these so they don't accidentally match a route.
5
- const RESERVED_SLOT_NAMES = new Set(["self", "notFound"]);
6
-
7
- export function getActiveSegment(
8
- routeName: string,
9
- node: string,
10
- snippets: Record<string, unknown>,
11
- ): string {
12
- const prefix = node ? `${node}.` : "";
13
-
14
- for (const segment in snippets) {
15
- if (RESERVED_SLOT_NAMES.has(segment)) {
16
- continue;
17
- }
18
- if (startsWithSegment(routeName, prefix + segment)) {
19
- return segment;
20
- }
21
- }
22
-
23
- return "";
24
- }
@@ -1,35 +0,0 @@
1
- <script lang="ts">
2
- import { UNKNOWN_ROUTE } from "@real-router/core";
3
-
4
- import { useRouteNode } from "../composables/useRouteNode.svelte";
5
- import { getActiveSegment } from "./RouteView.helpers";
6
-
7
- import type { Snippet } from "svelte";
8
-
9
- let {
10
- nodeName,
11
- self,
12
- notFound,
13
- ...segmentSnippets
14
- }: {
15
- nodeName: string;
16
- self?: Snippet;
17
- notFound?: Snippet;
18
- [key: string]: Snippet | string | undefined;
19
- } = $props();
20
-
21
- const routeContext = useRouteNode(nodeName);
22
- </script>
23
-
24
- {#if routeContext.route.current}
25
- {@const route = routeContext.route.current}
26
- {@const segment = getActiveSegment(route.name, nodeName, segmentSnippets)}
27
- {#if segment}
28
- {@const snippet = segmentSnippets[segment] as Snippet}
29
- {@render snippet()}
30
- {:else if self && route.name === nodeName}
31
- {@render self()}
32
- {:else if route.name === UNKNOWN_ROUTE && notFound}
33
- {@render notFound()}
34
- {/if}
35
- {/if}
@@ -1,47 +0,0 @@
1
- <script lang="ts">
2
- import { createDismissableError } from "@real-router/sources";
3
- import { untrack } from "svelte";
4
-
5
- import { useRouter } from "../composables/useRouter.svelte";
6
- import { createReactiveSource } from "../createReactiveSource.svelte";
7
-
8
- import type { RouterError, State } from "@real-router/core";
9
- import type { Snippet } from "svelte";
10
-
11
- interface Props {
12
- children: Snippet;
13
- fallback: Snippet<[RouterError, () => void]>;
14
- onError?: (
15
- error: RouterError,
16
- toRoute: State | null,
17
- fromRoute: State | null,
18
- ) => void;
19
- }
20
-
21
- let { children, fallback, onError }: Props = $props();
22
-
23
- const router = useRouter();
24
- const snapshot = createReactiveSource(createDismissableError(router));
25
-
26
- $effect(() => {
27
- const snap = snapshot.current;
28
- if (!snap.error) return;
29
-
30
- const { error, toRoute, fromRoute } = snap;
31
- untrack(() => {
32
- try {
33
- onError?.(error, toRoute, fromRoute);
34
- } catch (callbackError) {
35
- console.error(
36
- "[real-router] RouterErrorBoundary onError handler threw:",
37
- callbackError,
38
- );
39
- }
40
- });
41
- });
42
- </script>
43
-
44
- {@render children?.()}
45
- {#if snapshot.current.error}
46
- {@render fallback(snapshot.current.error, snapshot.current.resetError)}
47
- {/if}
@@ -1,22 +0,0 @@
1
- <script lang="ts">
2
- import type { Snippet } from "svelte";
3
-
4
- interface Props {
5
- children: Snippet;
6
- fallback?: Snippet;
7
- }
8
-
9
- let { children, fallback }: Props = $props();
10
-
11
- let mounted = $state(false);
12
-
13
- $effect(() => {
14
- mounted = true;
15
- });
16
- </script>
17
-
18
- {#if !mounted}
19
- {@render children()}
20
- {:else if fallback}
21
- {@render fallback()}
22
- {/if}
@@ -1,37 +0,0 @@
1
- <!--
2
- @component
3
- Cross-adapter alias for Svelte's `{#await}` boundary. Renders the `fallback`
4
- snippet while a `pending` Promise prop is unresolved, then `children` (with
5
- the resolved value) once it settles. Symmetric naming with the
6
- React/Preact/Solid/Vue/Angular `<Streamed>` components — pick `<Streamed>`
7
- for cross-framework consistency, or use `{#await}` directly when team
8
- conventions prefer that.
9
-
10
- Svelte 5 has **no progressive HTTP-flush** in SSR (one TCP frame, late-
11
- resolving promises ship in the final body) — the `{#await}` block on the
12
- client retains its native streaming-after-hydration semantics. See
13
- `examples/web/svelte/ssr-examples/ssr-streaming/README.md` for the
14
- end-to-end story.
15
- -->
16
- <script lang="ts" generics="T">
17
- import type { Snippet } from "svelte";
18
-
19
- interface Props {
20
- /** Promise to await — typically `useDeferred(key)`. */
21
- pending: Promise<T>;
22
- /** Render snippet for the resolved value. */
23
- children: Snippet<[T]>;
24
- /** Snippet shown while the promise is pending. */
25
- fallback?: Snippet;
26
- }
27
-
28
- let { pending, children, fallback }: Props = $props();
29
- </script>
30
-
31
- {#await pending}
32
- {#if fallback}
33
- {@render fallback()}
34
- {/if}
35
- {:then value}
36
- {@render children(value)}
37
- {/await}
@@ -1,41 +0,0 @@
1
- import { useRoute } from "./useRoute.svelte";
2
-
3
- interface DeferredContext {
4
- ssrDataDeferred?: Record<string, Promise<unknown>>;
5
- }
6
-
7
- const NEVER_PROMISE = new Promise<never>(() => {
8
- // Intentionally never resolves — surfaces a forever-pending {#await} block
9
- // when a key is requested that the loader never declared.
10
- });
11
-
12
- /**
13
- * Read a deferred promise published by `defer({ deferred: { <key>: Promise } })`
14
- * inside an SSR data loader. Returns the Promise — feed straight into Svelte's
15
- * native `{#await}` block, or use `<Await name="key">` (this package) for the
16
- * cross-adapter shape.
17
- *
18
- * ```svelte
19
- * <script>
20
- * import { useDeferred } from "@real-router/svelte/ssr";
21
- * const reviewsPromise = useDeferred("reviews");
22
- * </script>
23
- *
24
- * {#await reviewsPromise}
25
- * <Spinner />
26
- * {:then reviews}
27
- * <ReviewList items={reviews} />
28
- * {/await}
29
- * ```
30
- *
31
- * Returns a forever-pending promise when the key is missing — surfaces
32
- * loader/consumer key drift as a visible {#await} loading state rather than
33
- * a silent runtime error.
34
- */
35
- export function useDeferred<T = unknown>(key: string): Promise<T> {
36
- const { route } = useRoute();
37
- const context = route.current.context as DeferredContext;
38
- const deferred = context.ssrDataDeferred;
39
-
40
- return (deferred?.[key] ?? NEVER_PROMISE) as Promise<T>;
41
- }
@@ -1,30 +0,0 @@
1
- import { createActiveRouteSource } from "@real-router/sources";
2
-
3
- import { createReactiveSource } from "../createReactiveSource.svelte";
4
- import { useRouter } from "./useRouter.svelte";
5
-
6
- import type { Params } from "@real-router/core";
7
-
8
- export function useIsActiveRoute(
9
- routeName: string,
10
- params: Params | undefined,
11
- strict: boolean,
12
- ignoreQueryParams: boolean,
13
- hash?: string,
14
- ) {
15
- const router = useRouter();
16
-
17
- // The `hash` argument (#532) participates in the cache key when defined.
18
- // exactOptionalPropertyTypes forbids `{ hash: undefined }` literally — we
19
- // conditionally include the key only when a value is provided.
20
- const source = createActiveRouteSource(
21
- router,
22
- routeName,
23
- params,
24
- hash === undefined
25
- ? { strict, ignoreQueryParams }
26
- : { strict, ignoreQueryParams, hash },
27
- );
28
-
29
- return createReactiveSource(source);
30
- }
@@ -1,6 +0,0 @@
1
- import { NAVIGATOR_KEY, getContextOrThrow } from "../context";
2
-
3
- import type { Navigator } from "@real-router/core";
4
-
5
- export const useNavigator = (): Navigator =>
6
- getContextOrThrow<Navigator>(NAVIGATOR_KEY, "useNavigator");
@@ -1,25 +0,0 @@
1
- import { ROUTE_KEY, getContextOrThrow } from "../context";
2
-
3
- import type { RouteContext } from "../types";
4
- import type { Params, State } from "@real-router/core";
5
-
6
- /**
7
- * `useRoute()`'s return type: same shape as `RouteContext<P>` but with
8
- * `route.current` narrowed to non-nullable `State<P>` (the composable's
9
- * `if (!ctx.route.current) throw` guard makes this safe).
10
- */
11
- type ActiveRouteContext<P extends Params> = Omit<RouteContext<P>, "route"> & {
12
- route: { readonly current: State<P> };
13
- };
14
-
15
- export const useRoute = <P extends Params = Params>(): ActiveRouteContext<P> => {
16
- const ctx = getContextOrThrow<RouteContext>(ROUTE_KEY, "useRoute");
17
-
18
- if (!ctx.route.current) {
19
- throw new Error(
20
- "useRoute called with no active route. Did you forget to await router.start() before rendering, or is the router stopped/disposed?",
21
- );
22
- }
23
-
24
- return ctx as ActiveRouteContext<P>;
25
- };
@@ -1,120 +0,0 @@
1
- import { useRoute } from "./useRoute.svelte";
2
-
3
- import type { State } from "@real-router/core";
4
-
5
- export interface RouteEnterContext {
6
- /** The route that was just activated. */
7
- route: State;
8
- /** The route that was active immediately before this navigation. */
9
- previousRoute: State;
10
- }
11
-
12
- export type RouteEnterHandler = (context: RouteEnterContext) => void;
13
-
14
- export interface UseRouteEnterOptions {
15
- /**
16
- * Skip the handler when `route.name === previousRoute.name`
17
- * (sort/filter/query-only navigations on the same route). Default:
18
- * `true`. Symmetric with `useRouteExit`'s same-name option.
19
- */
20
- skipSameRoute?: boolean;
21
- }
22
-
23
- /**
24
- * Fire `handler` once when the component mounts as a result of a
25
- * navigation. Mirror of `useRouteExit` for the entry side.
26
- *
27
- * What this composable covers that an ad-hoc `$effect` + `useRoute()`
28
- * doesn't:
29
- *
30
- * - **Skip-initial**: handler is skipped when there is no
31
- * `route.transition.from` (i.e. first-load mount). Most consumers
32
- * want to fire side effects only on real navigations, not on
33
- * hydration.
34
- * - **Same-route skip** (default): handler is skipped when
35
- * `route.transition.from === route.name`. Sort/filter/query-only
36
- * navigations re-run the effect (because the `route` reference
37
- * changes), but they are not "entries" in the animation / analytics
38
- * sense. Opt out with `skipSameRoute: false`.
39
- * - **Mount-time `route` / `previousRoute` snapshot**: handler receives
40
- * the values that were live at the moment of effect activation.
41
- *
42
- * **Handler reactivity (Svelte):** Svelte composables run **once** at
43
- * component init; `handler` is captured in closure at the call site. To
44
- * vary behavior over time, read `$state` / `$derived` values inside the
45
- * handler body.
46
- *
47
- * @example Direction-aware entry animation
48
- * ```svelte
49
- * <script lang="ts">
50
- * import { useRouteEnter } from "@real-router/svelte";
51
- * let el: HTMLDivElement;
52
- *
53
- * useRouteEnter(({ route }) => {
54
- * const direction = route.context.browser?.direction;
55
- * el?.classList.add(
56
- * direction === "back" ? "slide-from-left" : "slide-from-right",
57
- * );
58
- * });
59
- * </script>
60
- * ```
61
- *
62
- * @example Analytics page-enter event (skip-initial built-in)
63
- * ```svelte
64
- * <script lang="ts">
65
- * useRouteEnter(({ route, previousRoute }) => {
66
- * analytics.track("page_enter", {
67
- * route: route.name,
68
- * from: previousRoute.name,
69
- * });
70
- * });
71
- * </script>
72
- * ```
73
- */
74
- export function useRouteEnter(
75
- handler: RouteEnterHandler,
76
- options?: UseRouteEnterOptions,
77
- ): void {
78
- const { route, previousRoute } = useRoute();
79
- const skipSameRoute = options?.skipSameRoute ?? true;
80
- let lastHandledRoute: State | null = null;
81
-
82
- $effect(() => {
83
- const currentRoute = route.current;
84
- const prev = previousRoute.current;
85
-
86
- // Early-exit guards, top-down:
87
- //
88
- // - **Defensive**: `route.current` may be undefined during SSR or
89
- // pre-start hydration. Not testable from vitest, v8-ignored.
90
- // - **Skip-initial**: `state.transition.from` is undefined only
91
- // for the very first state committed by `router.start()`.
92
- // - **Skip-same-route**: query-only navigations have
93
- // `transition.from === route.name`. Opt-out via
94
- // `skipSameRoute: false`.
95
- // - **Defensive dedupe + missing `previousRoute`**: same `route`
96
- // ref between `$effect` re-runs is unexpected (createSubscriber
97
- // only fires on real reference changes); `!prev` is unreachable
98
- // once `transition.from` is set (core populates them together).
99
- // Both kept for parity with React; v8-ignored.
100
- /* v8 ignore start */
101
- if (!currentRoute) {
102
- return;
103
- }
104
- /* v8 ignore stop */
105
- if (!currentRoute.transition.from) {
106
- return;
107
- }
108
- if (skipSameRoute && currentRoute.transition.from === currentRoute.name) {
109
- return;
110
- }
111
- /* v8 ignore start */
112
- if (lastHandledRoute === currentRoute || !prev) {
113
- return;
114
- }
115
- /* v8 ignore stop */
116
-
117
- lastHandledRoute = currentRoute;
118
- handler({ route: currentRoute, previousRoute: prev });
119
- });
120
- }
@@ -1,113 +0,0 @@
1
- import { onDestroy } from "svelte";
2
-
3
- import { useRouter } from "./useRouter.svelte";
4
-
5
- import type { State } from "@real-router/core";
6
-
7
- export interface RouteExitContext {
8
- /** The route being left. */
9
- route: State;
10
- /** The route being navigated to. */
11
- nextRoute: State;
12
- /**
13
- * AbortSignal that fires when this navigation is superseded by a later
14
- * one (rapid clicks). Already filtered: when the handler runs,
15
- * `signal.aborted` is guaranteed to be `false`. Use
16
- * `signal.addEventListener("abort", cleanup, { once: true })` for
17
- * cleanup that must run on cancellation.
18
- */
19
- signal: AbortSignal;
20
- }
21
-
22
- export interface UseRouteExitOptions {
23
- /**
24
- * Skip the handler when `route.name === nextRoute.name`
25
- * (sort/filter/query-only navigations on the same route). Default:
26
- * `true`.
27
- */
28
- skipSameRoute?: boolean;
29
- }
30
-
31
- export type RouteExitHandler = (
32
- context: RouteExitContext,
33
- ) => void | Promise<void>;
34
-
35
- /**
36
- * Subscribe to the router's leave-window with the universal guards baked
37
- * in. Wraps `router.subscribeLeave` so consumers don't repeat the same
38
- * boilerplate every time:
39
- *
40
- * - **Reentrant abort pre-check**: if `signal.aborted` is already `true`
41
- * when the handler would run (rapid navigation superseded a slower
42
- * one), the handler is skipped entirely.
43
- * - **Same-route skip**: by default, `route.name === nextRoute.name`
44
- * short-circuits the handler — query-only navigations skip the work.
45
- * Opt out with `skipSameRoute: false`.
46
- *
47
- * Cleanup is bound to the component via `onDestroy`. Must be called
48
- * during component initialization (synchronous in `<script>`).
49
- *
50
- * If the handler returns a Promise, the router blocks on it. If the
51
- * Promise resolves, navigation proceeds. If it rejects, the router emits
52
- * `TRANSITION_CANCELLED`.
53
- *
54
- * **Handler reactivity (Svelte):** Svelte composables run **once** at
55
- * component init; `handler` is captured in closure at the call site. To
56
- * vary behavior over time, read `$state` / `$derived` values inside the
57
- * handler body — do not rely on swapping the handler reference.
58
- *
59
- * @example Animation
60
- * ```svelte
61
- * <script lang="ts">
62
- * import { useRouteExit } from "@real-router/svelte";
63
- * let el: HTMLDivElement;
64
- *
65
- * useRouteExit(async ({ signal }) => {
66
- * if (!el) return;
67
- * el.classList.add("fade-out");
68
- * const cleanup = () => el.classList.remove("fade-out");
69
- * signal.addEventListener("abort", cleanup, { once: true });
70
- * try {
71
- * el.getBoundingClientRect();
72
- * await Promise.allSettled(el.getAnimations().map((a) => a.finished));
73
- * } finally {
74
- * cleanup();
75
- * }
76
- * });
77
- * </script>
78
- *
79
- * <div bind:this={el}>...</div>
80
- * ```
81
- *
82
- * @example Reading rich transition metadata via `nextRoute.transition`
83
- * ```svelte
84
- * <script lang="ts">
85
- * useRouteExit(({ nextRoute }) => {
86
- * if (nextRoute.transition.segments.deactivated.includes("products")) {
87
- * productCache.clear();
88
- * }
89
- * });
90
- * </script>
91
- * ```
92
- */
93
- export function useRouteExit(
94
- handler: RouteExitHandler,
95
- options?: UseRouteExitOptions,
96
- ): void {
97
- const router = useRouter();
98
- const skipSameRoute = options?.skipSameRoute ?? true;
99
-
100
- const off = router.subscribeLeave(({ route, nextRoute, signal }) => {
101
- if (skipSameRoute && route.name === nextRoute.name) {
102
- return;
103
- }
104
-
105
- if (signal.aborted) {
106
- return;
107
- }
108
-
109
- return handler({ route, nextRoute, signal });
110
- });
111
-
112
- onDestroy(off);
113
- }
@@ -1,18 +0,0 @@
1
- import { getNavigator } from "@real-router/core";
2
- import { createRouteNodeSource } from "@real-router/sources";
3
-
4
- import { createReactiveSource } from "../createReactiveSource.svelte";
5
- import { createRouteContext } from "../createRouteContext.svelte";
6
- import { useRouter } from "./useRouter.svelte";
7
-
8
- import type { RouteContext } from "../types";
9
-
10
- export function useRouteNode(nodeName: string): RouteContext {
11
- const router = useRouter();
12
- const navigator = getNavigator(router);
13
-
14
- const source = createRouteNodeSource(router, nodeName);
15
- const reactive = createReactiveSource(source);
16
-
17
- return createRouteContext(navigator, reactive);
18
- }
@@ -1,12 +0,0 @@
1
- import { getPluginApi } from "@real-router/core/api";
2
- import { getRouteUtils } from "@real-router/route-utils";
3
-
4
- import { useRouter } from "./useRouter.svelte";
5
-
6
- import type { RouteUtils } from "@real-router/route-utils";
7
-
8
- export const useRouteUtils = (): RouteUtils => {
9
- const router = useRouter();
10
-
11
- return getRouteUtils(getPluginApi(router).getTree());
12
- };
@@ -1,6 +0,0 @@
1
- import { ROUTER_KEY, getContextOrThrow } from "../context";
2
-
3
- import type { Router } from "@real-router/core";
4
-
5
- export const useRouter = (): Router =>
6
- getContextOrThrow<Router>(ROUTER_KEY, "useRouter");
@@ -1,15 +0,0 @@
1
- import { getTransitionSource } from "@real-router/sources";
2
-
3
- import { createReactiveSource } from "../createReactiveSource.svelte";
4
- import { useRouter } from "./useRouter.svelte";
5
-
6
- import type { RouterTransitionSnapshot } from "@real-router/sources";
7
-
8
- export function useRouterTransition(): {
9
- readonly current: RouterTransitionSnapshot;
10
- } {
11
- const router = useRouter();
12
- const source = getTransitionSource(router);
13
-
14
- return createReactiveSource(source);
15
- }
package/src/constants.ts DELETED
@@ -1,7 +0,0 @@
1
- import type { NavigationOptions, Params } from "@real-router/core";
2
-
3
- export const EMPTY_PARAMS: Params = Object.freeze({});
4
-
5
- export const EMPTY_OPTIONS: NavigationOptions = Object.freeze({});
6
-
7
- export const NOOP = (): void => {};