@kitbag/router 0.28.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.
- package/dist/kitbag-router.js +1692 -1561
- package/dist/kitbag-router.umd.cjs +2 -2
- package/dist/main.d.ts +15 -0
- package/dist/models/hooks.d.ts +9 -7
- package/dist/services/addLoader.d.ts +6 -3
- package/dist/services/addRedirect.d.ts +3 -0
- package/dist/services/addView.d.ts +7 -4
- package/dist/services/combineContext.d.ts +2 -0
- package/dist/services/createHook.d.ts +7 -0
- package/dist/services/createHook.spec-d.d.ts +1 -0
- package/dist/services/createHook.spec.d.ts +1 -0
- package/dist/services/createLoader.d.ts +7 -0
- package/dist/services/createLoader.spec-d.d.ts +1 -0
- package/dist/services/createLoader.spec.d.ts +1 -0
- package/dist/services/createRouterAssets.d.ts +15 -0
- package/dist/services/createRouterAssets.spec-d.d.ts +1 -0
- package/dist/services/createRouterHooks.d.ts +4 -2
- package/dist/services/createView.d.ts +10 -0
- package/dist/services/createView.spec-d.d.ts +1 -0
- package/dist/services/createView.spec.d.ts +1 -0
- package/dist/services/getRouteContext.d.ts +6 -0
- package/dist/services/getRoutesForRouter.d.ts +6 -1
- package/dist/services/registerHookContext.spec.d.ts +1 -0
- package/dist/services/toHook.d.ts +3 -0
- package/dist/services/urlParser.d.ts +1 -1
- package/dist/services/withRouteMethods.d.ts +2 -3
- package/dist/types/addLoader.d.ts +7 -4
- package/dist/types/addView.d.ts +8 -3
- package/dist/types/createRouteOptions.d.ts +3 -7
- package/dist/types/hook.d.ts +43 -0
- package/dist/types/hooks.d.ts +17 -11
- package/dist/types/loader.d.ts +59 -0
- package/dist/types/register.d.ts +2 -2
- package/dist/types/resolved.d.ts +4 -0
- package/dist/types/routeContext.d.ts +8 -0
- package/dist/types/routeWithParams.d.ts +1 -1
- package/dist/types/router.d.ts +5 -4
- package/dist/types/routerPlugin.d.ts +7 -5
- package/dist/types/url.d.ts +1 -0
- package/dist/types/view.d.ts +58 -0
- package/dist/utilities/testHelpers.d.ts +4 -4
- package/package.json +1 -1
- package/dist/services/createRouteRedirects.d.ts +0 -10
- /package/dist/services/{createRouteRedirects.spec.d.ts → addRedirect.spec.d.ts} +0 -0
package/dist/main.d.ts
CHANGED
|
@@ -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';
|
|
@@ -46,6 +47,8 @@ export { RouterNotInstalledError } from './errors/routerNotInstalledError';
|
|
|
46
47
|
export { UseRouteInvalidError } from './errors/useRouteInvalidError';
|
|
47
48
|
export { SsrOptionRequiredError } from './errors/ssrOptionRequiredError';
|
|
48
49
|
export { UnreachableRouteError } from './errors/unreachableRouteError';
|
|
50
|
+
export type { CreateHookOptions, Hook, HookCallbackContext } from './types/hook';
|
|
51
|
+
export type { CreateViewOptions, View, ViewCallbackContext } from './types/view';
|
|
49
52
|
export { createRoute } from './services/createRoute';
|
|
50
53
|
export { createRejection } from './services/createRejection';
|
|
51
54
|
export { createExternalRoute } from './services/createExternalRoute';
|
|
@@ -61,6 +64,18 @@ export { createParam } from './services/createParam';
|
|
|
61
64
|
export { createRouter } from './services/createRouter';
|
|
62
65
|
export { createUrl } from './services/createUrl';
|
|
63
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'];
|
|
64
79
|
/**
|
|
65
80
|
* Registers a hook that is called before a route is left. Must be called from setup.
|
|
66
81
|
* This is useful for performing actions or cleanups before navigating away from a route component.
|
package/dist/models/hooks.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import {
|
|
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(
|
|
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,
|
|
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;
|
|
@@ -3,6 +3,8 @@ import { AnyPayloadTransformer } from './payload';
|
|
|
3
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.
|
|
@@ -16,25 +18,26 @@ type ViewOptions = {
|
|
|
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
|
|
31
|
+
props?: AddViewPropsGetter<Route, Component>;
|
|
29
32
|
prefetch: PrefetchConfig | undefined;
|
|
30
33
|
transformer: AnyPayloadTransformer | undefined;
|
|
31
34
|
};
|
|
32
|
-
export declare function toView(
|
|
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,
|
|
42
|
+
export declare function addViewToMatch(match: CreatedRouteOptions, view: View): CreatedRouteOptions;
|
|
40
43
|
export {};
|
|
@@ -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,3 +1,6 @@
|
|
|
1
|
+
import { CreateHook } from '../types/hook';
|
|
2
|
+
import { CreateView } from '../types/view';
|
|
3
|
+
import { CreateLoader } from '../types/loader';
|
|
1
4
|
import { ViewTransition } from '../components/viewTransition';
|
|
2
5
|
import { Router, RouterRoutes, RouterRejections } from '../types/router';
|
|
3
6
|
import { InjectionKey } from 'vue';
|
|
@@ -14,6 +17,18 @@ import { createUseRejection } from '../compositions/useRejection';
|
|
|
14
17
|
import { createUseViewTransition } from '../compositions/useViewTransition';
|
|
15
18
|
import { createUseNavigation } from '../compositions/useNavigation';
|
|
16
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>>;
|
|
17
32
|
/**
|
|
18
33
|
* Registers a hook that is called before a route is left. Must be called from setup.
|
|
19
34
|
* This is useful for performing actions or cleanups before navigating away from a route component.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
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,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:
|
|
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);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Route } from '../types/route';
|
|
2
2
|
/**
|
|
3
|
-
* Attaches the
|
|
4
|
-
* rebuilds the route
|
|
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;
|
|
@@ -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[],
|
|
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
|
|
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 {};
|
package/dist/types/addView.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
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
5
|
import { ResolvedRoute, WithData } from './resolved';
|
|
4
6
|
import { CreatedRouteOptions, Route } from './route';
|
|
@@ -83,13 +85,13 @@ type ViewName<TName extends string | undefined> = TName extends string ? TName :
|
|
|
83
85
|
/**
|
|
84
86
|
* Replaces the views on the last match, preserving all ancestors.
|
|
85
87
|
*/
|
|
86
|
-
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'> & {
|
|
87
89
|
views: TNewViews;
|
|
88
90
|
}> extends infer TNext extends CreatedRouteOptions ? [...THead, TNext] : TMatches : TMatches;
|
|
89
91
|
/**
|
|
90
92
|
* The full return type of an `addView` call: the same url with the last match's views replaced.
|
|
91
93
|
*/
|
|
92
|
-
type AddViewReturn<TUrl extends Url, TMatches extends CreatedRouteOptions[],
|
|
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;
|
|
93
95
|
/**
|
|
94
96
|
* Adds a view (component + optional props getter) to a route. Chainable to register multiple views,
|
|
95
97
|
* including named views for named `<router-view />`s.
|
|
@@ -103,6 +105,9 @@ export type RouteAddView<TUrl extends Url = Url, TMatches extends CreatedRouteOp
|
|
|
103
105
|
* @param options - The view's `name`, `props` getter, and `prefetch` config. Required when the
|
|
104
106
|
* component has required props, optional otherwise.
|
|
105
107
|
*/
|
|
106
|
-
addView: <
|
|
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>>;
|
|
107
109
|
};
|
|
110
|
+
type ViewPropsOf<TView extends AnyView> = TView extends {
|
|
111
|
+
props?: AnyFunction<infer TProps>;
|
|
112
|
+
} ? TProps : undefined;
|
|
108
113
|
export {};
|
|
@@ -66,7 +66,7 @@ export type CreateRouteOptions<TName extends string | undefined = string | undef
|
|
|
66
66
|
*/
|
|
67
67
|
parent?: Route;
|
|
68
68
|
/**
|
|
69
|
-
*
|
|
69
|
+
* See [Context](https://kitbag-router.netlify.app/advanced-concepts/context).
|
|
70
70
|
*/
|
|
71
71
|
context?: RouteContext[];
|
|
72
72
|
/**
|
|
@@ -95,15 +95,11 @@ type ToMatch<TOptions extends CreateRouteOptions> = Omit<TOptions, 'meta' | 'nam
|
|
|
95
95
|
* The matches for a route, from greatest ancestor to the route itself. Each carries its own views, so
|
|
96
96
|
* there is no second tuple to keep aligned with this one.
|
|
97
97
|
*/
|
|
98
|
-
type ToMatches<TOptions extends CreateRouteOptions> = TOptions extends
|
|
99
|
-
parent: infer TParent extends Route;
|
|
100
|
-
} ? [...TParent['matches'], ToMatch<TOptions>] : [ToMatch<TOptions>];
|
|
98
|
+
type ToMatches<TOptions extends CreateRouteOptions> = TOptions extends WithParent ? [...TOptions['parent']['matches'], ToMatch<TOptions>] : [ToMatch<TOptions>];
|
|
101
99
|
/**
|
|
102
100
|
* The url a route resolves to, combined with its parent's unless the route is hoisted.
|
|
103
101
|
*/
|
|
104
|
-
export type ToRouteUrl<TOptions extends CreateRouteOptions> = TOptions extends
|
|
105
|
-
parent: infer TParent extends Route;
|
|
106
|
-
} ? TOptions['hoist'] extends true ? ToUrl<TOptions> : CombineUrl<TParent, ToUrl<TOptions>> : ToUrl<TOptions>;
|
|
102
|
+
export type ToRouteUrl<TOptions extends CreateRouteOptions> = TOptions extends WithParent ? TOptions['hoist'] extends true ? ToUrl<TOptions> : CombineUrl<TOptions['parent'], ToUrl<TOptions>> : ToUrl<TOptions>;
|
|
107
103
|
/**
|
|
108
104
|
* The matches for a route, before any views or loaders are added.
|
|
109
105
|
*/
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { RouteContext, RouteContextToRejection, RouteContextToRoute } from './routeContext';
|
|
2
|
+
import { ResolvedRouteUnion } from './resolved';
|
|
3
|
+
import { Route, Routes } from './route';
|
|
4
|
+
import { BeforeHookContext, AfterHookContext } from './hooks';
|
|
5
|
+
import { RouteUpdate } from './routeUpdate';
|
|
6
|
+
import { AnyFunction, MaybePromise } from './utilities';
|
|
7
|
+
export declare const IS_HOOK_SYMBOL: unique symbol;
|
|
8
|
+
export type HookInternal = {
|
|
9
|
+
[IS_HOOK_SYMBOL]: true;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Context provided to a reusable hook, narrowed by whether it runs before or after navigation.
|
|
13
|
+
*/
|
|
14
|
+
export type HookCallbackContext<TContext extends readonly RouteContext[] = [], TRoutes extends Routes = Routes> = {
|
|
15
|
+
from: ResolvedRouteUnion<TRoutes[number]> | null;
|
|
16
|
+
update?: RouteUpdate;
|
|
17
|
+
} & (Omit<BeforeHookContext<Route, RouteContextToRoute<[...TContext]>, RouteContextToRejection<[...TContext]>>, 'update'> | Omit<AfterHookContext<Route, RouteContextToRoute<[...TContext]>, RouteContextToRejection<[...TContext]>>, 'update'>);
|
|
18
|
+
/**
|
|
19
|
+
* Options for a reusable route hook.
|
|
20
|
+
*/
|
|
21
|
+
export type CreateHookOptions<TContext extends readonly RouteContext[] = [], TRoutes extends Routes = Routes> = {
|
|
22
|
+
hook: (route: ResolvedRouteUnion<TRoutes[number]> | null, context: HookCallbackContext<TContext, TRoutes>) => MaybePromise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* See [Context](https://kitbag-router.netlify.app/advanced-concepts/context).
|
|
25
|
+
*/
|
|
26
|
+
context?: TContext;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Creates hooks with callbacks typed to the router's resolved routes.
|
|
30
|
+
*/
|
|
31
|
+
export type CreateHook<TRoutes extends Routes = Routes> = <const TContext extends readonly RouteContext[] = []>(options: CreateHookOptions<TContext, TRoutes>) => Hook<TContext>;
|
|
32
|
+
/**
|
|
33
|
+
* A reusable hook that can be attached before or after a route enters, updates, or leaves.
|
|
34
|
+
*/
|
|
35
|
+
export type Hook<TContext extends readonly RouteContext[] = []> = {
|
|
36
|
+
hook: AnyFunction<MaybePromise<void>>;
|
|
37
|
+
context: TContext;
|
|
38
|
+
};
|
|
39
|
+
export type AnyHook = Hook<readonly RouteContext[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Determines whether a value is a reusable hook.
|
|
42
|
+
*/
|
|
43
|
+
export declare function isHook(value: unknown): value is AnyHook & HookInternal;
|
package/dist/types/hooks.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { AnyHook } from './hook';
|
|
1
2
|
import { Hooks } from '../models/hooks';
|
|
2
3
|
import { RouterResolvedRouteUnion, ResolvedRouteUnion } from './resolved';
|
|
3
|
-
import { MaybePromise } from './utilities';
|
|
4
|
+
import { AnyFunction, MaybePromise } from './utilities';
|
|
4
5
|
import { Route, Routes } from './route';
|
|
5
6
|
import { RouterReject } from './routerReject';
|
|
6
7
|
import { RouterPush } from './routerPush';
|
|
@@ -61,7 +62,7 @@ export type ComponentHook = BeforeEnterHook | BeforeUpdateHook | BeforeLeaveHook
|
|
|
61
62
|
*/
|
|
62
63
|
export type ComponentHookRegistration = {
|
|
63
64
|
lifecycle: HookLifecycle;
|
|
64
|
-
hook: ComponentHook;
|
|
65
|
+
hook: ComponentHook | AnyHook;
|
|
65
66
|
depth: number;
|
|
66
67
|
};
|
|
67
68
|
/**
|
|
@@ -73,6 +74,10 @@ export type AddGlobalHooks = (hooks: Hooks) => void;
|
|
|
73
74
|
* A function to remove a previously added route hook.
|
|
74
75
|
*/
|
|
75
76
|
export type HookRemove = () => void;
|
|
77
|
+
/**
|
|
78
|
+
* Registers an inline callback or a reusable hook definition.
|
|
79
|
+
*/
|
|
80
|
+
export type AddHook<THook extends AnyFunction> = (hook: THook | AnyHook) => HookRemove;
|
|
76
81
|
/**
|
|
77
82
|
* Enumerates the lifecycle events for before route hooks.
|
|
78
83
|
*/
|
|
@@ -85,14 +90,16 @@ export type AfterHookLifecycle = 'onAfterRouteEnter' | 'onAfterRouteUpdate' | 'o
|
|
|
85
90
|
* Union type for all route hook lifecycle events.
|
|
86
91
|
*/
|
|
87
92
|
export type HookLifecycle = BeforeHookLifecycle | AfterHookLifecycle;
|
|
88
|
-
type AfterHookContext<TRoute extends Route, TRoutes extends Routes, TRejections extends Rejections> = {
|
|
93
|
+
export type AfterHookContext<TRoute extends Route, TRoutes extends Routes, TRejections extends Rejections> = {
|
|
94
|
+
lifecycle: 'after';
|
|
89
95
|
reject: RouterReject<TRejections>;
|
|
90
96
|
push: RouterPush<TRoutes>;
|
|
91
97
|
replace: RouterReplace<TRoutes>;
|
|
92
98
|
update: RouteUpdate<ResolvedRouteUnion<TRoute>>;
|
|
93
99
|
signal: AbortSignal;
|
|
94
100
|
};
|
|
95
|
-
type BeforeHookContext<TRouteTo extends Route, TRoutes extends Routes, TRejections extends Rejections> = {
|
|
101
|
+
export type BeforeHookContext<TRouteTo extends Route, TRoutes extends Routes, TRejections extends Rejections> = {
|
|
102
|
+
lifecycle: 'before';
|
|
96
103
|
reject: RouterReject<TRejections>;
|
|
97
104
|
push: RouterPush<TRoutes>;
|
|
98
105
|
replace: RouterReplace<TRoutes>;
|
|
@@ -104,32 +111,32 @@ export type BeforeEnterHookContext<TRoutes extends Routes = Routes, TRejections
|
|
|
104
111
|
from: ResolvedRouteUnion<TRouteFrom> | null;
|
|
105
112
|
};
|
|
106
113
|
export type BeforeEnterHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = (to: ResolvedRouteUnion<TRouteTo>, context: BeforeEnterHookContext<TRoutes, TRejections, TRouteTo, TRouteFrom>) => MaybePromise<void>;
|
|
107
|
-
export type AddBeforeEnterHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> =
|
|
114
|
+
export type AddBeforeEnterHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = AddHook<BeforeEnterHook<TRoutes, TRejections, TRouteTo, TRouteFrom>>;
|
|
108
115
|
export type BeforeUpdateHookContext<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = BeforeHookContext<TRouteTo, TRoutes, TRejections> & {
|
|
109
116
|
from: ResolvedRouteUnion<TRouteFrom> | null;
|
|
110
117
|
};
|
|
111
118
|
export type BeforeUpdateHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = (to: ResolvedRouteUnion<TRouteTo>, context: BeforeUpdateHookContext<TRoutes, TRejections, TRouteTo, TRouteFrom>) => MaybePromise<void>;
|
|
112
|
-
export type AddBeforeUpdateHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> =
|
|
119
|
+
export type AddBeforeUpdateHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = AddHook<BeforeUpdateHook<TRoutes, TRejections, TRouteTo, TRouteFrom>>;
|
|
113
120
|
export type BeforeLeaveHookContext<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = Omit<BeforeHookContext<TRouteTo, TRoutes, TRejections>, 'update'> & {
|
|
114
121
|
from: ResolvedRouteUnion<TRouteFrom>;
|
|
115
122
|
};
|
|
116
123
|
export type BeforeLeaveHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = (to: ResolvedRouteUnion<TRouteTo> | null, context: BeforeLeaveHookContext<TRoutes, TRejections, TRouteTo, TRouteFrom>) => MaybePromise<void>;
|
|
117
|
-
export type AddBeforeLeaveHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> =
|
|
124
|
+
export type AddBeforeLeaveHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = AddHook<BeforeLeaveHook<TRoutes, TRejections, TRouteTo, TRouteFrom>>;
|
|
118
125
|
export type AfterEnterHookContext<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = AfterHookContext<TRouteTo, TRoutes, TRejections> & {
|
|
119
126
|
from: ResolvedRouteUnion<TRouteFrom> | null;
|
|
120
127
|
};
|
|
121
128
|
export type AfterEnterHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = (to: ResolvedRouteUnion<TRouteTo>, context: AfterEnterHookContext<TRoutes, TRejections, TRouteTo, TRouteFrom>) => MaybePromise<void>;
|
|
122
|
-
export type AddAfterEnterHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> =
|
|
129
|
+
export type AddAfterEnterHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = AddHook<AfterEnterHook<TRoutes, TRejections, TRouteTo, TRouteFrom>>;
|
|
123
130
|
export type AfterUpdateHookContext<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = AfterHookContext<TRouteTo, TRoutes, TRejections> & {
|
|
124
131
|
from: ResolvedRouteUnion<TRouteFrom> | null;
|
|
125
132
|
};
|
|
126
133
|
export type AfterUpdateHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = (to: ResolvedRouteUnion<TRouteTo>, context: AfterUpdateHookContext<TRoutes, TRejections, TRouteTo, TRouteFrom>) => MaybePromise<void>;
|
|
127
|
-
export type AddAfterUpdateHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> =
|
|
134
|
+
export type AddAfterUpdateHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = AddHook<AfterUpdateHook<TRoutes, TRejections, TRouteTo, TRouteFrom>>;
|
|
128
135
|
export type AfterLeaveHookContext<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = Omit<AfterHookContext<TRouteTo, TRoutes, TRejections>, 'update'> & {
|
|
129
136
|
from: ResolvedRouteUnion<TRouteFrom>;
|
|
130
137
|
};
|
|
131
138
|
export type AfterLeaveHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = (to: ResolvedRouteUnion<TRouteTo> | null, context: AfterLeaveHookContext<TRoutes, TRejections, TRouteTo, TRouteFrom>) => MaybePromise<void>;
|
|
132
|
-
export type AddAfterLeaveHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> =
|
|
139
|
+
export type AddAfterLeaveHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections, TRouteTo extends Route = TRoutes[number], TRouteFrom extends Route = TRoutes[number]> = AddHook<AfterLeaveHook<TRoutes, TRejections, TRouteTo, TRouteFrom>>;
|
|
133
140
|
export type BeforeHookResponse = CallbackContextSuccess | CallbackContextPush | CallbackContextRedirect | CallbackContextReject | CallbackContextAbort;
|
|
134
141
|
export type AfterHookResponse = CallbackContextSuccess | CallbackContextPush | CallbackContextReject;
|
|
135
142
|
export type HookRunnerContext<TRoutes extends Routes = Routes> = {
|
|
@@ -167,4 +174,3 @@ export type ErrorHookRunnerContext<TRoutes extends Routes = Routes> = {
|
|
|
167
174
|
source: 'props' | 'loader' | 'hook';
|
|
168
175
|
};
|
|
169
176
|
export type ErrorHookRunner = (error: unknown, context: ErrorHookRunnerContext) => void;
|
|
170
|
-
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { TransformerOptions } from '../services/payload';
|
|
2
|
+
import { PrefetchConfig } from './prefetch';
|
|
3
|
+
import { RouteContext, RouteContextToRejection, RouteContextToRoute } from './routeContext';
|
|
4
|
+
import { RouterPush } from './routerPush';
|
|
5
|
+
import { RouterReject } from './routerReject';
|
|
6
|
+
import { RouterReplace } from './routerReplace';
|
|
7
|
+
import { AnyFunction } from './utilities';
|
|
8
|
+
import { ResolvedRouteUnion } from './resolved';
|
|
9
|
+
import { Routes } from './route';
|
|
10
|
+
export declare const IS_LOADER_SYMBOL: unique symbol;
|
|
11
|
+
export type LoaderInternal = {
|
|
12
|
+
[IS_LOADER_SYMBOL]: true;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Navigation helpers available to a reusable loader, typed from its declared context.
|
|
16
|
+
*/
|
|
17
|
+
export type LoaderCallbackContext<TContext extends readonly RouteContext[] = []> = {
|
|
18
|
+
push: RouterPush<RouteContextToRoute<[...TContext]>>;
|
|
19
|
+
replace: RouterReplace<RouteContextToRoute<[...TContext]>>;
|
|
20
|
+
reject: RouterReject<RouteContextToRejection<[...TContext]>>;
|
|
21
|
+
signal: AbortSignal;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Options for a reusable loader that receives the resolved route and its declared context helpers.
|
|
25
|
+
*/
|
|
26
|
+
export type CreateLoaderOptions<TContext extends readonly RouteContext[] = [], TData = unknown, TRoutes extends Routes = Routes> = TransformerOptions<NoInfer<Awaited<TData>>> & {
|
|
27
|
+
/**
|
|
28
|
+
* Loads a value or promise from the resolved route.
|
|
29
|
+
*/
|
|
30
|
+
load: (route: ResolvedRouteUnion<TRoutes[number]>, context: LoaderCallbackContext<TContext>) => TData;
|
|
31
|
+
/**
|
|
32
|
+
* See [Context](https://kitbag-router.netlify.app/advanced-concepts/context).
|
|
33
|
+
*/
|
|
34
|
+
context?: TContext;
|
|
35
|
+
/**
|
|
36
|
+
* Default prefetch behavior, overridable when attaching the loader.
|
|
37
|
+
*/
|
|
38
|
+
prefetch?: PrefetchConfig;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Creates loaders with callbacks typed to the router's resolved routes.
|
|
42
|
+
*/
|
|
43
|
+
export type CreateLoader<TRoutes extends Routes = Routes> = <const TContext extends readonly RouteContext[] = [], TData = unknown>(options: CreateLoaderOptions<TContext, TData, TRoutes>) => Loader<TData, TContext>;
|
|
44
|
+
/**
|
|
45
|
+
* A reusable loader definition, with its context normalized to an array.
|
|
46
|
+
*/
|
|
47
|
+
export type Loader<TData = unknown, TContext extends readonly RouteContext[] = []> = TransformerOptions<Awaited<TData>> & {
|
|
48
|
+
load: AnyFunction<TData>;
|
|
49
|
+
context: TContext;
|
|
50
|
+
prefetch?: PrefetchConfig;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* The runtime shape after a loader's route, context, and return types have been erased.
|
|
54
|
+
*/
|
|
55
|
+
export type AnyLoader = Loader<any, readonly RouteContext[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Determines whether a value is a reusable loader created by `createLoader`.
|
|
58
|
+
*/
|
|
59
|
+
export declare function isLoader(value: unknown): value is AnyLoader & LoaderInternal;
|