@kitbag/router 0.27.0 → 0.29.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.
Files changed (72) hide show
  1. package/dist/components/routerLink.d.ts +1 -0
  2. package/dist/components/viewTransition.d.ts +16 -0
  3. package/dist/components/viewTransition.spec-d.d.ts +1 -0
  4. package/dist/compositions/useViewTransition.d.ts +5 -0
  5. package/dist/kitbag-router.js +2073 -1708
  6. package/dist/kitbag-router.umd.cjs +2 -2
  7. package/dist/main.d.ts +27 -1
  8. package/dist/models/hooks.d.ts +9 -7
  9. package/dist/services/addLoader.d.ts +6 -3
  10. package/dist/services/addRedirect.d.ts +3 -0
  11. package/dist/services/addRedirect.spec.d.ts +1 -0
  12. package/dist/services/addView.d.ts +9 -6
  13. package/dist/services/combineContext.d.ts +2 -0
  14. package/dist/services/createHook.d.ts +7 -0
  15. package/dist/services/createHook.spec-d.d.ts +1 -0
  16. package/dist/services/createHook.spec.d.ts +1 -0
  17. package/dist/services/createLoader.d.ts +7 -0
  18. package/dist/services/createLoader.spec-d.d.ts +1 -0
  19. package/dist/services/createLoader.spec.d.ts +1 -0
  20. package/dist/services/createRoute.d.ts +2 -4
  21. package/dist/services/createRouter.d.ts +2 -2
  22. package/dist/services/createRouterAssets.d.ts +26 -0
  23. package/dist/services/createRouterAssets.spec-d.d.ts +1 -0
  24. package/dist/services/createRouterHistory.d.ts +10 -2
  25. package/dist/services/createRouterHooks.d.ts +4 -2
  26. package/dist/services/createView.d.ts +10 -0
  27. package/dist/services/createView.spec-d.d.ts +1 -0
  28. package/dist/services/createView.spec.d.ts +1 -0
  29. package/dist/services/createViewTransitions.browser.spec.d.ts +1 -0
  30. package/dist/services/createViewTransitions.d.ts +38 -0
  31. package/dist/services/getRouteContext.d.ts +6 -0
  32. package/dist/services/getRoutesForRouter.d.ts +6 -1
  33. package/dist/services/history.d.ts +1 -0
  34. package/dist/services/registerHookContext.spec.d.ts +1 -0
  35. package/dist/services/routeViews.d.ts +7 -0
  36. package/dist/services/toHook.d.ts +3 -0
  37. package/dist/services/urlParser.d.ts +1 -1
  38. package/dist/services/withRouteMethods.d.ts +2 -3
  39. package/dist/tests/navigationBehavior.browser.spec.d.ts +1 -0
  40. package/dist/tests/viewTransitions.browser.spec.d.ts +1 -0
  41. package/dist/types/addLoader.d.ts +7 -4
  42. package/dist/types/addView.d.ts +11 -7
  43. package/dist/types/createRouteOptions.d.ts +17 -65
  44. package/dist/types/hook.d.ts +43 -0
  45. package/dist/types/hooks.d.ts +17 -11
  46. package/dist/types/loader.d.ts +59 -0
  47. package/dist/types/navigation.d.ts +2 -0
  48. package/dist/types/props.d.ts +0 -18
  49. package/dist/types/register.d.ts +2 -2
  50. package/dist/types/resolved.d.ts +4 -0
  51. package/dist/types/route.d.ts +2 -3
  52. package/dist/types/routeContext.d.ts +8 -0
  53. package/dist/types/routeViews.d.ts +5 -7
  54. package/dist/types/routeWithParams.d.ts +1 -1
  55. package/dist/types/router.d.ts +18 -4
  56. package/dist/types/routerPlugin.d.ts +7 -5
  57. package/dist/types/routerPush.d.ts +8 -0
  58. package/dist/types/routerReplace.d.ts +3 -0
  59. package/dist/types/url.d.ts +1 -0
  60. package/dist/types/useLink.d.ts +5 -0
  61. package/dist/types/view.d.ts +58 -0
  62. package/dist/types/viewTransition.d.ts +49 -0
  63. package/dist/utilities/navigation.d.ts +15 -0
  64. package/dist/utilities/promises.d.ts +4 -0
  65. package/dist/utilities/promises.spec.d.ts +1 -0
  66. package/dist/utilities/testHelpers.d.ts +32 -100
  67. package/dist/utilities/viewTransition.d.ts +11 -0
  68. package/dist/utilities/viewTransition.spec.d.ts +1 -0
  69. package/package.json +7 -6
  70. package/dist/services/createRouteRedirects.d.ts +0 -10
  71. package/dist/services/createRouteViews.d.ts +0 -16
  72. /package/dist/{services/createRouteRedirects.spec.d.ts → components/viewTransition.browser.spec.d.ts} +0 -0
package/dist/main.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { RouterAssets } from './services/createRouterAssets';
2
2
  import { RegisteredRouter } from './types/register';
3
- export type { WithHost, WithoutHost, WithParent, WithoutParent, CreateRouteOptions, PropsGetter, RouterViewPropsGetter, CreateRouteProps, ToRoute } from './types/createRouteOptions';
3
+ export type { WithHost, WithoutHost, WithParent, WithoutParent, CreateRouteOptions, ToRoute } from './types/createRouteOptions';
4
4
  export type { RouteAddView, AddViewOptions, AddViewPropsGetter, AddViewPropsCallbackContext } from './types/addView';
5
5
  export type { RouteAddLoader, AddLoaderOptions, LoaderGetter } from './types/addLoader';
6
6
  export type { RouteAddAlias, AddAliasOptions } from './types/addAlias';
@@ -8,6 +8,7 @@ export type { AliasTransform, AliasTransformContext } from './types/routeAlias';
8
8
  export type { RouteCallbackContext } from './types/routeCallbackContext';
9
9
  export type { RouteViews } from './types/routeViews';
10
10
  export type { RouteLoader, RouteLoaders } from './types/routeLoaders';
11
+ export type { CreateLoaderOptions, Loader, LoaderCallbackContext } from './types/loader';
11
12
  export type { RejectionHooks, HookRemove, BeforeHookLifecycle, AfterHookLifecycle, HookLifecycle, BeforeEnterHookContext, BeforeEnterHook, AddBeforeEnterHook, BeforeUpdateHookContext, BeforeUpdateHook, AddBeforeUpdateHook, BeforeLeaveHookContext, BeforeLeaveHook, AddBeforeLeaveHook, AfterEnterHookContext, AfterEnterHook, AddAfterEnterHook, AfterUpdateHookContext, AfterUpdateHook, AddAfterUpdateHook, AfterLeaveHookContext, AfterLeaveHook, AddAfterLeaveHook, RejectionHookContext, RejectionHook, AddRejectionHook, ErrorHookContext, ErrorHook, AddErrorHook } from './types/hooks';
12
13
  export * from './types/paramTypes';
13
14
  export * from './types/prefetch';
@@ -34,6 +35,7 @@ export * from './types/routerRoute';
34
35
  export * from './types/urlString';
35
36
  export type { Url, CreateUrlOptions, ParseUrlOptions } from './types/url';
36
37
  export * from './types/useLink';
38
+ export * from './types/viewTransition';
37
39
  export * from './types/navigation';
38
40
  export { DuplicateParamsError } from './errors/duplicateParamsError';
39
41
  export { LoaderDataAccessError } from './errors/loaderDataAccessError';
@@ -45,6 +47,8 @@ export { RouterNotInstalledError } from './errors/routerNotInstalledError';
45
47
  export { UseRouteInvalidError } from './errors/useRouteInvalidError';
46
48
  export { SsrOptionRequiredError } from './errors/ssrOptionRequiredError';
47
49
  export { UnreachableRouteError } from './errors/unreachableRouteError';
50
+ export type { CreateHookOptions, Hook, HookCallbackContext } from './types/hook';
51
+ export type { CreateViewOptions, View, ViewCallbackContext } from './types/view';
48
52
  export { createRoute } from './services/createRoute';
49
53
  export { createRejection } from './services/createRejection';
50
54
  export { createExternalRoute } from './services/createExternalRoute';
@@ -59,6 +63,19 @@ export { literal } from './services/literal';
59
63
  export { createParam } from './services/createParam';
60
64
  export { createRouter } from './services/createRouter';
61
65
  export { createUrl } from './services/createUrl';
66
+ export type { ViewTransitionProps } from './components/viewTransition';
67
+ /**
68
+ * Creates a reusable hook with callbacks typed to the registered router's resolved routes.
69
+ */
70
+ export declare const createHook: RouterAssets<RegisteredRouter>['createHook'];
71
+ /**
72
+ * Creates a reusable view with props callbacks typed to the registered router's resolved routes.
73
+ */
74
+ export declare const createView: RouterAssets<RegisteredRouter>['createView'];
75
+ /**
76
+ * Creates a reusable loader with callbacks typed to the registered router's resolved routes.
77
+ */
78
+ export declare const createLoader: RouterAssets<RegisteredRouter>['createLoader'];
62
79
  /**
63
80
  * Registers a hook that is called before a route is left. Must be called from setup.
64
81
  * This is useful for performing actions or cleanups before navigating away from a route component.
@@ -119,6 +136,8 @@ export declare const RouterView: RouterAssets<RegisteredRouter>['RouterView'];
119
136
  * @group Components
120
137
  */
121
138
  export declare const RouterLink: RouterAssets<RegisteredRouter>['RouterLink'];
139
+ /** Names a shared element for a view transition. @group Components */
140
+ export declare const ViewTransition: new <TElement extends keyof HTMLElementTagNameMap = "span">(props: import('./main').ViewTransitionProps<TElement>) => import('vue').ComponentPublicInstance<import('./main').ViewTransitionProps<TElement>>;
122
141
  /**
123
142
  * A component to render a bar across the top of the page while a navigation is pending, filled by how
124
143
  * much of the navigation's work has settled.
@@ -179,6 +198,13 @@ export declare const useLink: RouterAssets<RegisteredRouter>['useLink'];
179
198
  * @group Compositions
180
199
  */
181
200
  export declare const useRejection: RouterAssets<RegisteredRouter>['useRejection'];
201
+ /**
202
+ * A composition to access the view transition in flight, if any.
203
+ *
204
+ * @returns The router's view transition state.
205
+ * @group Compositions
206
+ */
207
+ export declare const useViewTransition: RouterAssets<RegisteredRouter>['useViewTransition'];
182
208
  /**
183
209
  * A composition to access the navigation under way: whether one is pending, which routes it leaves and
184
210
  * leads to, and how much of the work it waits on has settled.
@@ -1,13 +1,15 @@
1
- import { AfterEnterHook, AfterLeaveHook, AfterUpdateHook, BeforeEnterHook, BeforeLeaveHook, BeforeUpdateHook, ErrorHook, RejectionHook } from '../types/hooks';
1
+ import { AnyHook } from '../types/hook';
2
+ import { ComponentHook, AfterEnterHook, AfterLeaveHook, AfterUpdateHook, BeforeEnterHook, BeforeLeaveHook, BeforeUpdateHook, ErrorHook, RejectionHook } from '../types/hooks';
2
3
  import { RedirectHook } from '../types/redirects';
3
4
  export declare class Hooks {
5
+ onHookAdded: Set<(hook: ComponentHook | AnyHook) => void>;
4
6
  redirects: Set<RedirectHook>;
5
- onBeforeRouteEnter: Set<BeforeEnterHook>;
6
- onBeforeRouteUpdate: Set<BeforeUpdateHook>;
7
- onBeforeRouteLeave: Set<BeforeLeaveHook>;
8
- onAfterRouteEnter: Set<AfterEnterHook>;
9
- onAfterRouteUpdate: Set<AfterUpdateHook>;
10
- onAfterRouteLeave: Set<AfterLeaveHook>;
7
+ onBeforeRouteEnter: Set<AnyHook | BeforeEnterHook>;
8
+ onBeforeRouteUpdate: Set<AnyHook | BeforeUpdateHook>;
9
+ onBeforeRouteLeave: Set<AnyHook | BeforeLeaveHook>;
10
+ onAfterRouteEnter: Set<AnyHook | AfterEnterHook>;
11
+ onAfterRouteUpdate: Set<AnyHook | AfterUpdateHook>;
12
+ onAfterRouteLeave: Set<AnyHook | AfterLeaveHook>;
11
13
  onError: Set<ErrorHook>;
12
14
  onRejection: Set<RejectionHook>;
13
15
  }
@@ -2,6 +2,8 @@ import { AnyPayloadTransformer } from './payload';
2
2
  import { PrefetchConfig } from '../types/prefetch';
3
3
  import { CreatedRouteOptions, Route } from '../types/route';
4
4
  import { AnyFunction } from '../types/utilities';
5
+ import { AnyLoader } from '../types/loader';
6
+ import { RouteContext } from '../types/routeContext';
5
7
  export declare const DEFAULT_LOADER_NAME = "default";
6
8
  /**
7
9
  * The loose runtime shape of the `addLoader` options. Purposely wide: the name type each
@@ -15,7 +17,7 @@ type LoaderOptions = {
15
17
  /**
16
18
  * The runtime arguments accepted by `addLoader`.
17
19
  */
18
- type AddLoaderParameters = [load: AnyFunction, options?: LoaderOptions];
20
+ type AddLoaderParameters = [load: AnyFunction | AnyLoader, options?: LoaderOptions];
19
21
  /**
20
22
  * The loose runtime signature of the `addLoader` method. Purposely wide: it returns Route rather than the
21
23
  * refined chainable route each `RouteAddLoader` overload describes.
@@ -26,15 +28,16 @@ type Loader = {
26
28
  load: AnyFunction;
27
29
  prefetch: PrefetchConfig | undefined;
28
30
  transformer: AnyPayloadTransformer | undefined;
31
+ context?: readonly RouteContext[];
29
32
  };
30
- export declare function toLoader(load: AnyFunction, options: LoaderOptions | undefined): Loader;
33
+ export declare function toLoader(source: AnyFunction | AnyLoader, options: LoaderOptions | undefined): Loader;
31
34
  /**
32
35
  * Returns a new match with the loader merged into its loaders under the loader's name.
33
36
  *
34
37
  * Matches are `markRaw` so that making a route reactive does not turn its loaders into reactive proxies.
35
38
  * Spreading a match drops that, so the rebuilt one is marked again.
36
39
  */
37
- export declare function addLoaderToMatch(match: CreatedRouteOptions, { name, load, prefetch, transformer }: Loader): CreatedRouteOptions;
40
+ export declare function addLoaderToMatch(match: CreatedRouteOptions, loader: Loader): CreatedRouteOptions;
38
41
  /**
39
42
  * A route's data combines the loaders of every match, so a name an ancestor already uses would be
40
43
  * ambiguous. Adding a loader the route itself already has is an override, and allowed.
@@ -0,0 +1,3 @@
1
+ import { RouteRedirectCallback, RouteRedirectOptions } from '../types/redirects';
2
+ import { Route } from '../types/route';
3
+ export declare function addRedirect<TRouteFrom extends Route, TRouteTo extends Route>(from: TRouteFrom, to: TRouteTo, convertParams?: RouteRedirectCallback<TRouteTo, TRouteFrom>, options?: RouteRedirectOptions): void;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,40 +1,43 @@
1
1
  import { Component } from 'vue';
2
2
  import { AnyPayloadTransformer } from './payload';
3
- import { PropsGetter } from '../types/createRouteOptions';
3
+ import { AddViewPropsGetter } from '../types/addView';
4
4
  import { PrefetchConfig } from '../types/prefetch';
5
5
  import { CreatedRouteOptions, Route } from '../types/route';
6
+ import { AnyView } from '../types/view';
7
+ import { RouteContext } from '../types/routeContext';
6
8
  /**
7
9
  * The loose runtime shape of the `addView` options. Purposely wide: the getter and name types each
8
10
  * `RouteAddView` describes are refined per route and component.
9
11
  */
10
12
  type ViewOptions = {
11
13
  name?: string;
12
- props?: PropsGetter;
14
+ props?: AddViewPropsGetter<Route, Component>;
13
15
  prefetch?: PrefetchConfig;
14
16
  transformer?: AnyPayloadTransformer;
15
17
  };
16
18
  /**
17
19
  * The runtime arguments accepted by `addView`.
18
20
  */
19
- type AddViewParameters = [component: Component, options?: ViewOptions];
21
+ type AddViewParameters = [component: Component | AnyView, options?: ViewOptions];
20
22
  /**
21
23
  * The loose runtime signature of the `addView` method. Purposely wide: it returns Route rather than the
22
24
  * refined chainable route each `RouteAddView` overload describes.
23
25
  */
24
26
  export type AddView = (...args: AddViewParameters) => Route;
25
27
  type View = {
28
+ context?: readonly RouteContext[];
26
29
  name: string;
27
30
  component: Component;
28
- props: PropsGetter | undefined;
31
+ props?: AddViewPropsGetter<Route, Component>;
29
32
  prefetch: PrefetchConfig | undefined;
30
33
  transformer: AnyPayloadTransformer | undefined;
31
34
  };
32
- export declare function toView(component: Component, options: ViewOptions | undefined): View;
35
+ export declare function toView(source: Component | AnyView, options: ViewOptions | undefined): View;
33
36
  /**
34
37
  * Returns a new match with the view merged into its views under the view's name.
35
38
  *
36
39
  * Matches are `markRaw` so that making a route reactive does not turn its components into reactive
37
40
  * proxies. Spreading a match drops that, so the rebuilt one is marked again.
38
41
  */
39
- export declare function addViewToMatch(match: CreatedRouteOptions, { name, component, props, prefetch, transformer }: View): CreatedRouteOptions;
42
+ export declare function addViewToMatch(match: CreatedRouteOptions, view: View): CreatedRouteOptions;
40
43
  export {};
@@ -0,0 +1,2 @@
1
+ import { RouteContext } from '../types/routeContext';
2
+ export declare function combineContext(parent?: readonly RouteContext[], child?: readonly RouteContext[]): RouteContext[];
@@ -0,0 +1,7 @@
1
+ import { RouteContext } from '../types/routeContext';
2
+ import { CreateHookOptions, Hook } from '../types/hook';
3
+ import { Routes } from '../types/route';
4
+ /**
5
+ * Creates a reusable hook with navigation helpers from its declared context.
6
+ */
7
+ export declare function createHook<const TContext extends readonly RouteContext[] = [], TRoutes extends Routes = Routes>(options: CreateHookOptions<TContext, TRoutes>): Hook<TContext>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import { Routes } from '../types/route';
2
+ import { CreateLoaderOptions, Loader } from '../types/loader';
3
+ import { RouteContext } from '../types/routeContext';
4
+ /**
5
+ * Creates a reusable loader that receives the resolved route when an attached route is loaded.
6
+ */
7
+ export declare function createLoader<const TContext extends readonly RouteContext[] = [], TData = unknown, TRoutes extends Routes = Routes>(options: CreateLoaderOptions<TContext, TData, TRoutes>): Loader<TData, TContext>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,3 @@
1
- import { CreateRouteOptions, PropsGetter, CreateRouteProps, ToRouteMatches, ToRouteUrl, RouterViewPropsGetter } from '../types/createRouteOptions';
1
+ import { CreateRouteOptions, ToRouteMatches, ToRouteUrl } from '../types/createRouteOptions';
2
2
  import { RouteWithMethods } from '../types/routeWithMethods';
3
- type CreateRouteWithProps<TOptions extends CreateRouteOptions, TProps extends CreateRouteProps<TOptions>> = CreateRouteProps<TOptions> extends RouterViewPropsGetter<TOptions> ? [props?: RouterViewPropsGetter<TOptions>] : CreateRouteProps<TOptions> extends PropsGetter<TOptions> ? Partial<ReturnType<CreateRouteProps<TOptions>>> extends ReturnType<CreateRouteProps<TOptions>> ? [props?: TProps] : [props: TProps] : Partial<CreateRouteProps<TOptions>> extends CreateRouteProps<TOptions> ? [props?: TProps] : [props: TProps];
4
- export declare function createRoute<const TOptions extends CreateRouteOptions, const TProps extends CreateRouteProps<TOptions>>(options: TOptions, ...args: CreateRouteWithProps<TOptions, TProps>): RouteWithMethods<ToRouteUrl<TOptions>, ToRouteMatches<TOptions, TProps>>;
5
- export {};
3
+ export declare function createRoute<const TOptions extends CreateRouteOptions>(options: TOptions): RouteWithMethods<ToRouteUrl<TOptions>, ToRouteMatches<TOptions>>;
@@ -17,8 +17,8 @@ import { EmptyRouterPlugin, RouterPlugin } from '../types/routerPlugin';
17
17
  * const About = { template: '<div>About</div>' }
18
18
  *
19
19
  * export const routes = [
20
- * createRoute({ name: 'home', path: '/', component: Home }),
21
- * createRoute({ name: 'path', path: '/about', component: About }),
20
+ * createRoute({ name: 'home', path: '/' }).addView(Home),
21
+ * createRoute({ name: 'path', path: '/about' }).addView(About),
22
22
  * ] as const
23
23
  *
24
24
  * const router = createRouter(routes)
@@ -1,3 +1,7 @@
1
+ import { CreateHook } from '../types/hook';
2
+ import { CreateView } from '../types/view';
3
+ import { CreateLoader } from '../types/loader';
4
+ import { ViewTransition } from '../components/viewTransition';
1
5
  import { Router, RouterRoutes, RouterRejections } from '../types/router';
2
6
  import { InjectionKey } from 'vue';
3
7
  import { createRouterView } from '../components/routerView';
@@ -10,8 +14,21 @@ import { createUseLink } from '../compositions/useLink';
10
14
  import { createIsRoute } from '../guards/routes';
11
15
  import { AddBeforeLeaveHook, AddBeforeUpdateHook, AddAfterLeaveHook, AddAfterUpdateHook } from '../types/hooks';
12
16
  import { createUseRejection } from '../compositions/useRejection';
17
+ import { createUseViewTransition } from '../compositions/useViewTransition';
13
18
  import { createUseNavigation } from '../compositions/useNavigation';
14
19
  export type RouterAssets<TRouter extends Router> = {
20
+ /**
21
+ * Creates a reusable hook with callbacks typed to this router's resolved routes.
22
+ */
23
+ createHook: CreateHook<RouterRoutes<TRouter>>;
24
+ /**
25
+ * Creates a reusable view with props callbacks typed to this router's resolved routes and loader data.
26
+ */
27
+ createView: CreateView<RouterRoutes<TRouter>>;
28
+ /**
29
+ * Creates a reusable loader with callbacks typed to this router's resolved routes.
30
+ */
31
+ createLoader: CreateLoader<RouterRoutes<TRouter>>;
15
32
  /**
16
33
  * Registers a hook that is called before a route is left. Must be called from setup.
17
34
  * This is useful for performing actions or cleanups before navigating away from a route component.
@@ -72,6 +89,8 @@ export type RouterAssets<TRouter extends Router> = {
72
89
  * @group Components
73
90
  */
74
91
  RouterLink: ReturnType<typeof createRouterLink<TRouter>>;
92
+ /** Names a shared element for a view transition. @group Components */
93
+ ViewTransition: typeof ViewTransition;
75
94
  /**
76
95
  * A component to render a bar across the top of the page while a navigation is pending, filled by how
77
96
  * much of the navigation's work has settled.
@@ -132,6 +151,13 @@ export type RouterAssets<TRouter extends Router> = {
132
151
  * @group Compositions
133
152
  */
134
153
  useRejection: ReturnType<typeof createUseRejection<TRouter>>;
154
+ /**
155
+ * A composition to access the view transition in flight, if any.
156
+ *
157
+ * @returns The router's view transition state.
158
+ * @group Compositions
159
+ */
160
+ useViewTransition: ReturnType<typeof createUseViewTransition<TRouter>>;
135
161
  /**
136
162
  * A composition to access the navigation under way: whether one is pending, which routes it leaves and
137
163
  * leads to, and how much of the work it waits on has settled.
@@ -0,0 +1 @@
1
+ export {};
@@ -1,4 +1,4 @@
1
- import { History, Listener } from './history';
1
+ import { History, Update } from './history';
2
2
  type NavigationPushOptions = {
3
3
  replace?: boolean;
4
4
  state?: unknown;
@@ -12,8 +12,16 @@ type RouterHistory = History & {
12
12
  stopListening: () => void;
13
13
  };
14
14
  export type RouterHistoryMode = 'auto' | 'browser' | 'memory' | 'hash';
15
+ /** Called by the router while the traversal navigation is active. */
16
+ export type RouterHistoryTraversal = {
17
+ commit: () => void;
18
+ restore: () => void;
19
+ };
20
+ type RouterHistoryUpdate = Update & {
21
+ traversal?: RouterHistoryTraversal;
22
+ };
15
23
  type RouterHistoryOptions = {
16
- listener: Listener;
24
+ listener: (event: RouterHistoryUpdate) => void;
17
25
  mode?: RouterHistoryMode;
18
26
  };
19
27
  export declare function createRouterHistory({ mode, listener }: RouterHistoryOptions): RouterHistory;
@@ -1,4 +1,5 @@
1
- import { AddGlobalHooks, AddComponentHook, AfterHookRunner, BeforeHookRunner, AddBeforeEnterHook, AddBeforeUpdateHook, AddBeforeLeaveHook, AddAfterEnterHook, AddAfterUpdateHook, AddAfterLeaveHook, ErrorHookRunner, AddErrorHook, RejectionHookRunner, AddRejectionHook } from '../types/hooks';
1
+ import { AnyHook } from '../types/hook';
2
+ import { ComponentHook, AddGlobalHooks, AddComponentHook, AfterHookRunner, BeforeHookRunner, AddBeforeEnterHook, AddBeforeUpdateHook, AddBeforeLeaveHook, AddAfterEnterHook, AddAfterUpdateHook, AddAfterLeaveHook, ErrorHookRunner, AddErrorHook, RejectionHookRunner, AddRejectionHook } from '../types/hooks';
2
3
  import { HasVueAppStore } from './createVueAppStore';
3
4
  import { RedirectStatus } from '../types/router';
4
5
  export declare const getRouterHooksKey: (routerKey: import('vue').InjectionKey<import('../types/router').Router>) => import('vue').InjectionKey<RouterHooks>;
@@ -20,6 +21,7 @@ export type RouterHooks = HasVueAppStore & {
20
21
  };
21
22
  type RouterHooksOptions = {
22
23
  redirectStatus: RedirectStatus;
24
+ onHookAdded?: (hook: ComponentHook | AnyHook) => void;
23
25
  };
24
- export declare function createRouterHooks({ redirectStatus }: RouterHooksOptions): RouterHooks;
26
+ export declare function createRouterHooks({ redirectStatus, onHookAdded }: RouterHooksOptions): RouterHooks;
25
27
  export {};
@@ -0,0 +1,10 @@
1
+ import { Routes } from '../types/route';
2
+ import { Component } from 'vue';
3
+ import { ComponentProps } from './component';
4
+ import { MaybePromise } from '../types/utilities';
5
+ import { RouteContext } from '../types/routeContext';
6
+ import { CreateViewOptions, View } from '../types/view';
7
+ /**
8
+ * Creates a reusable view that receives the resolved route when computing its props.
9
+ */
10
+ export declare function createView<TComponent extends Component, const TContext extends readonly RouteContext[] = [], TProps extends MaybePromise<ComponentProps<TComponent>> | undefined = undefined, TRoutes extends Routes = Routes>(options: CreateViewOptions<TComponent, TContext, TProps, TRoutes>): View<TProps, TContext>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,38 @@
1
+ import { ResolvedRoute } from '../types/resolved';
2
+ import { RouterViewTransition, ViewTransitionTypes } from '../types/viewTransition';
3
+ export type PendingViewTransition = {
4
+ to: ResolvedRoute;
5
+ from: ResolvedRoute;
6
+ types: ViewTransitionTypes;
7
+ };
8
+ export type ViewTransitions = {
9
+ /**
10
+ * The transition in flight, as the router exposes it.
11
+ */
12
+ viewTransition: RouterViewTransition;
13
+ /**
14
+ * Records the navigation about to transition, ahead of its data loading, so the page being left can
15
+ * prepare before it is captured.
16
+ */
17
+ prepare: (navigation: PendingViewTransition) => void;
18
+ /**
19
+ * Forgets a prepared navigation that was superseded before it transitioned, unless a newer one has
20
+ * taken over the state since.
21
+ */
22
+ cancel: (navigation: PendingViewTransition) => void;
23
+ /**
24
+ * Forgets the transition in flight, for a navigation that commits without one.
25
+ */
26
+ reset: () => void;
27
+ /**
28
+ * Runs the update inside a view transition. Resolves after the update and Vue flush, ahead of the animation.
29
+ */
30
+ start: (update: () => void | Promise<unknown>) => Promise<void>;
31
+ };
32
+ /**
33
+ * Owns the one transition the document runs at a time. Starting another while the first has not yet run
34
+ * its callback leaves the browser free to run the two callbacks in either order, so a navigation arriving
35
+ * then takes over the pending callback instead. Once the callback has run the browser skips the old
36
+ * animation on its own.
37
+ */
38
+ export declare function createViewTransitions(): ViewTransitions;
@@ -0,0 +1,6 @@
1
+ import { Route } from '../types/route';
2
+ import { RouteContext } from '../types/routeContext';
3
+ /**
4
+ * Collects a route's context, including loaders and views merged during attachment, and its hooks' context.
5
+ */
6
+ export declare function getRouteContext(route: Route): RouteContext[];
@@ -2,6 +2,9 @@ import { Route, RouteInternal, Routes } from '../types/route';
2
2
  import { RouterPlugin } from '../types/routerPlugin';
3
3
  import { BuiltInRejectionType, Rejection, RejectionInternal } from '../types/rejection';
4
4
  import { RouterOptions } from '../types/router';
5
+ import { AnyHook } from '../types/hook';
6
+ import { ComponentHook } from '../types/hooks';
7
+ import { RouteContext } from '../types/routeContext';
5
8
  /**
6
9
  * Takes in routes and plugins and returns a list of routes with the base route inserted if provided.
7
10
  * Also checks for duplicate names and unreachable paths in the routes.
@@ -17,11 +20,13 @@ export declare function getRoutesForRouter(routes: Routes | Routes[], plugins?:
17
20
  meta: Record<string, unknown>;
18
21
  state: Record<string, import('../main').Param>;
19
22
  prefetch?: import('../main').PrefetchConfig;
20
- context: import('../types/routeContext').RouteContext[];
23
+ context: RouteContext[];
21
24
  } & RouteInternal)[];
22
25
  rejections: (Pick<import('../types/rejection').RejectionOptions<string>, "type" | "status"> & {
23
26
  getTitle: import('../types/routeTitle').GetTitleCallback;
24
27
  } & RejectionInternal)[];
28
+ addHookContext: (hook: ComponentHook | AnyHook) => void;
29
+ stop: () => void;
25
30
  getRouteByName: (type: string) => Route | undefined;
26
31
  getRejectionByType: {
27
32
  (type: BuiltInRejectionType): (Rejection & RejectionInternal);
@@ -23,6 +23,7 @@ export interface Transition extends Update {
23
23
  export type Blocker = (tx: Transition) => void;
24
24
  export type To = string | Partial<Path>;
25
25
  export interface History {
26
+ readonly index: number | null;
26
27
  readonly action: Action;
27
28
  readonly location: Location;
28
29
  createHref: (to: To) => string;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import { RouteViews } from '../types/routeViews';
2
+ export declare const DEFAULT_VIEW_NAME = "default";
3
+ /**
4
+ * The names of the views that have a props getter. A view without one is never computed, so waiting on it
5
+ * would never settle.
6
+ */
7
+ export declare function viewNamesWithProps(views: RouteViews): string[];
@@ -0,0 +1,3 @@
1
+ import { AnyHook } from '../types/hook';
2
+ import { AnyFunction } from '../types/utilities';
3
+ export declare function toHook<THook extends AnyFunction>(hook: THook | AnyHook): THook | AnyHook['hook'];
@@ -1,6 +1,6 @@
1
1
  import { QuerySource } from '../types/querySource';
2
2
  import { UrlString } from '../types/urlString';
3
- type UrlParts = {
3
+ export type UrlParts = {
4
4
  host?: string;
5
5
  path: string;
6
6
  query: URLSearchParams;
@@ -1,7 +1,6 @@
1
1
  import { Route } from '../types/route';
2
2
  /**
3
- * Attaches the chainable, immutable route methods — `addView`, `addLoader`, and `addAlias`. Each call
4
- * rebuilds the route's own (last) match, or its aliases, and returns a new route with the methods
5
- * re-attached, so none mutates the route it was called on, and chaining one never drops another.
3
+ * Attaches methods and callbacks to the current route copy. Chaining a view, loader, or alias
4
+ * rebuilds the route and reattaches its methods.
6
5
  */
7
6
  export declare function withRouteMethods<TRoute extends Route>(route: TRoute): TRoute;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -6,7 +6,9 @@ import { CreatedRouteOptions, Route } from './route';
6
6
  import { RouteCallbackContext } from './routeCallbackContext';
7
7
  import { RouteLoader, RouteLoaders } from './routeLoaders';
8
8
  import { Url } from './url';
9
- import { Identity, LastInArray } from './utilities';
9
+ import { AnyFunction, Identity, LastInArray } from './utilities';
10
+ import { AnyLoader } from './loader';
11
+ import { RouteContext, WithRouteContext } from './routeContext';
10
12
  /**
11
13
  * The getter for a loader added via `addLoader`. Receives the same two arguments as an `addView` props
12
14
  * getter, except that its route carries no data: a route's data includes what the loader itself is
@@ -47,13 +49,13 @@ type LoaderName<TName extends string | undefined> = TName extends string ? TName
47
49
  /**
48
50
  * Replaces the loaders on the last match, preserving all ancestors.
49
51
  */
50
- type ReplaceLastMatchLoaders<TMatches extends CreatedRouteOptions[], TNewLoaders extends RouteLoaders> = TMatches extends [...infer THead extends CreatedRouteOptions[], infer TLast extends CreatedRouteOptions] ? Identity<Omit<TLast, 'loaders'> & {
52
+ type ReplaceLastMatchLoaders<TMatches extends CreatedRouteOptions[], TNewLoaders extends RouteLoaders, TContext extends RouteContext[]> = TMatches extends [...infer THead extends CreatedRouteOptions[], infer TLast extends CreatedRouteOptions] ? Identity<Omit<WithRouteContext<TLast, TContext>, 'loaders'> & {
51
53
  loaders: TNewLoaders;
52
54
  }> extends infer TNext extends CreatedRouteOptions ? [...THead, TNext] : TMatches : TMatches;
53
55
  /**
54
56
  * The full return type of an `addLoader` call: the same url with the last match's loaders replaced.
55
57
  */
56
- type AddLoaderReturn<TUrl extends Url, TMatches extends CreatedRouteOptions[], TNewLoaders extends RouteLoaders> = ReplaceLastMatchLoaders<TMatches, TNewLoaders> extends infer TNext extends CreatedRouteOptions[] ? RouteWithMethods<TUrl, TNext> : never;
58
+ type AddLoaderReturn<TUrl extends Url, TMatches extends CreatedRouteOptions[], TName extends string | undefined, TData, TContext extends RouteContext[] = []> = ReplaceLastMatchLoaders<TMatches, AddLoaderLoaders<CurrentMatchLoaders<TMatches>, TName, TData>, TContext> extends infer TNext extends CreatedRouteOptions[] ? RouteWithMethods<TUrl, TNext> : never;
57
59
  /**
58
60
  * Adds a loader to a route. Chainable to register multiple loaders, each exposed under its own name on
59
61
  * the resolved route's `data`.
@@ -65,6 +67,7 @@ export type RouteAddLoader<TUrl extends Url = Url, TMatches extends CreatedRoute
65
67
  * @param load - The loader callback. Receives the resolved route and a context object.
66
68
  * @param options - The loader's `name` and `prefetch` config.
67
69
  */
68
- addLoader: <const TName extends string | undefined = undefined, const TGetter extends LoaderGetter<Route<TUrl, TMatches>> = LoaderGetter<Route<TUrl, TMatches>>>(load: TGetter, options?: AddLoaderOptions<TName, Awaited<ReturnType<TGetter>>>) => AddLoaderReturn<TUrl, TMatches, AddLoaderLoaders<CurrentMatchLoaders<TMatches>, TName, ReturnType<TGetter>>>;
70
+ addLoader: <const TSource extends LoaderGetter<Route<TUrl, TMatches>> | AnyLoader, const TName extends string | undefined = undefined>(load: TSource, options?: AddLoaderOptions<TName, Awaited<LoaderDataOf<TSource>>>) => AddLoaderReturn<TUrl, TMatches, TName, LoaderDataOf<TSource>, TSource extends AnyLoader ? [...TSource['context']] : []>;
69
71
  };
72
+ type LoaderDataOf<TSource extends AnyFunction | AnyLoader> = ReturnType<TSource extends AnyLoader ? TSource['load'] : Extract<TSource, AnyFunction>>;
70
73
  export {};
@@ -1,6 +1,7 @@
1
1
  import { Component } from 'vue';
2
+ import { AnyView } from './view';
3
+ import { RouteContext, WithRouteContext } from './routeContext';
2
4
  import { ComponentProps } from '../services/component';
3
- import { ComponentPropsAreOptional, PropsGetter } from './createRouteOptions';
4
5
  import { ResolvedRoute, WithData } from './resolved';
5
6
  import { CreatedRouteOptions, Route } from './route';
6
7
  import { RouteCallbackContext } from './routeCallbackContext';
@@ -11,8 +12,7 @@ import { RouteView, RouteViews } from './routeViews';
11
12
  import { Url } from './url';
12
13
  import { AnyFunction, Identity, LastInArray, MaybePromise } from './utilities';
13
14
  /**
14
- * The props getter for a view added via `addView`. Receives the same two arguments as the
15
- * `createRoute` props callback: the resolved route and a context object.
15
+ * The props getter for a view added via `addView`. Receives the resolved route and a context object.
16
16
  */
17
17
  export type AddViewPropsGetter<TRoute extends Route, TComponent extends Component> = (route: ResolvedRoute<TRoute> & WithData<TRoute>, context: AddViewPropsCallbackContext<TRoute>) => MaybePromise<ComponentProps<TComponent>>;
18
18
  /**
@@ -20,6 +20,7 @@ export type AddViewPropsGetter<TRoute extends Route, TComponent extends Componen
20
20
  * callbacks attached to a route.
21
21
  */
22
22
  export type AddViewPropsCallbackContext<TRoute extends Route> = RouteCallbackContext<TRoute>;
23
+ type ComponentPropsAreOptional<TComponent extends Component> = Partial<ComponentProps<TComponent>> extends ComponentProps<TComponent> ? true : false;
23
24
  /**
24
25
  * When the getter is omitted the default type param resolves to the wide getter type, which then
25
26
  * "extends" itself and collapses to undefined. When a getter is provided its return type is kept — the
@@ -32,7 +33,7 @@ type NewViewProps<TRoute extends Route, TComponent extends Component, TGetter ex
32
33
  * @template TName - The view's name, inferred from the `name` option.
33
34
  * @template TGetter - The view's props getter, inferred from the `props` option.
34
35
  */
35
- export type AddViewOptions<TName extends string | undefined = string, TGetter = PropsGetter> = TransformerOptions<PayloadValueOf<TGetter>> & {
36
+ export type AddViewOptions<TName extends string | undefined = string, TGetter = AddViewPropsGetter<Route, Component>> = TransformerOptions<PayloadValueOf<TGetter>> & {
36
37
  /**
37
38
  * The name of the view, rendered by `<router-view name="..." />`. Defaults to the unnamed view.
38
39
  */
@@ -84,13 +85,13 @@ type ViewName<TName extends string | undefined> = TName extends string ? TName :
84
85
  /**
85
86
  * Replaces the views on the last match, preserving all ancestors.
86
87
  */
87
- type ReplaceLastMatchViews<TMatches extends CreatedRouteOptions[], TNewViews extends RouteViews> = TMatches extends [...infer THead extends CreatedRouteOptions[], infer TLast extends CreatedRouteOptions] ? Identity<Omit<TLast, 'views'> & {
88
+ type ReplaceLastMatchViews<TMatches extends CreatedRouteOptions[], TNewViews extends RouteViews, TContext extends RouteContext[]> = TMatches extends [...infer THead extends CreatedRouteOptions[], infer TLast extends CreatedRouteOptions] ? Identity<Omit<WithRouteContext<TLast, TContext>, 'views'> & {
88
89
  views: TNewViews;
89
90
  }> extends infer TNext extends CreatedRouteOptions ? [...THead, TNext] : TMatches : TMatches;
90
91
  /**
91
92
  * The full return type of an `addView` call: the same url with the last match's views replaced.
92
93
  */
93
- type AddViewReturn<TUrl extends Url, TMatches extends CreatedRouteOptions[], TNewProps extends RouteViews> = ReplaceLastMatchViews<TMatches, TNewProps> extends infer TNext extends CreatedRouteOptions[] ? RouteWithMethods<TUrl, TNext> : never;
94
+ type AddViewReturn<TUrl extends Url, TMatches extends CreatedRouteOptions[], TName extends string | undefined, TProps, TContext extends RouteContext[] = []> = ReplaceLastMatchViews<TMatches, AddViewProps<CurrentMatchViews<TMatches>, TName, TProps>, TContext> extends infer TNext extends CreatedRouteOptions[] ? RouteWithMethods<TUrl, TNext> : never;
94
95
  /**
95
96
  * Adds a view (component + optional props getter) to a route. Chainable to register multiple views,
96
97
  * including named views for named `<router-view />`s.
@@ -104,6 +105,9 @@ export type RouteAddView<TUrl extends Url = Url, TMatches extends CreatedRouteOp
104
105
  * @param options - The view's `name`, `props` getter, and `prefetch` config. Required when the
105
106
  * component has required props, optional otherwise.
106
107
  */
107
- addView: <TComponent extends Component, const TName extends string | undefined = undefined, const TGetter extends AddViewPropsGetter<Route<TUrl, TMatches>, TComponent> = AddViewPropsGetter<Route<TUrl, TMatches>, TComponent>>(component: TComponent, ...options: AddViewArgs<TComponent, TName, TGetter>) => AddViewReturn<TUrl, TMatches, AddViewProps<CurrentMatchViews<TMatches>, TName, NewViewProps<Route<TUrl, TMatches>, TComponent, TGetter>>>;
108
+ addView: <TSource extends Component | AnyView, const TName extends string | undefined = undefined, const TGetter extends AddViewPropsGetter<Route<TUrl, TMatches>, Extract<TSource, Component>> = AddViewPropsGetter<Route<TUrl, TMatches>, Extract<TSource, Component>>>(source: TSource, ...options: TSource extends AnyView ? [options?: Omit<AddViewOptions<TName, AnyFunction<ViewPropsOf<TSource>>>, 'props'>] : AddViewArgs<Extract<TSource, Component>, TName, TGetter>) => TSource extends AnyView ? AddViewReturn<TUrl, TMatches, TName, ViewPropsOf<TSource>, [...TSource['context']]> : AddViewReturn<TUrl, TMatches, TName, NewViewProps<Route<TUrl, TMatches>, Extract<TSource, Component>, TGetter>>;
108
109
  };
110
+ type ViewPropsOf<TView extends AnyView> = TView extends {
111
+ props?: AnyFunction<infer TProps>;
112
+ } ? TProps : undefined;
109
113
  export {};