@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.
Files changed (44) hide show
  1. package/dist/kitbag-router.js +1692 -1561
  2. package/dist/kitbag-router.umd.cjs +2 -2
  3. package/dist/main.d.ts +15 -0
  4. package/dist/models/hooks.d.ts +9 -7
  5. package/dist/services/addLoader.d.ts +6 -3
  6. package/dist/services/addRedirect.d.ts +3 -0
  7. package/dist/services/addView.d.ts +7 -4
  8. package/dist/services/combineContext.d.ts +2 -0
  9. package/dist/services/createHook.d.ts +7 -0
  10. package/dist/services/createHook.spec-d.d.ts +1 -0
  11. package/dist/services/createHook.spec.d.ts +1 -0
  12. package/dist/services/createLoader.d.ts +7 -0
  13. package/dist/services/createLoader.spec-d.d.ts +1 -0
  14. package/dist/services/createLoader.spec.d.ts +1 -0
  15. package/dist/services/createRouterAssets.d.ts +15 -0
  16. package/dist/services/createRouterAssets.spec-d.d.ts +1 -0
  17. package/dist/services/createRouterHooks.d.ts +4 -2
  18. package/dist/services/createView.d.ts +10 -0
  19. package/dist/services/createView.spec-d.d.ts +1 -0
  20. package/dist/services/createView.spec.d.ts +1 -0
  21. package/dist/services/getRouteContext.d.ts +6 -0
  22. package/dist/services/getRoutesForRouter.d.ts +6 -1
  23. package/dist/services/registerHookContext.spec.d.ts +1 -0
  24. package/dist/services/toHook.d.ts +3 -0
  25. package/dist/services/urlParser.d.ts +1 -1
  26. package/dist/services/withRouteMethods.d.ts +2 -3
  27. package/dist/types/addLoader.d.ts +7 -4
  28. package/dist/types/addView.d.ts +8 -3
  29. package/dist/types/createRouteOptions.d.ts +3 -7
  30. package/dist/types/hook.d.ts +43 -0
  31. package/dist/types/hooks.d.ts +17 -11
  32. package/dist/types/loader.d.ts +59 -0
  33. package/dist/types/register.d.ts +2 -2
  34. package/dist/types/resolved.d.ts +4 -0
  35. package/dist/types/routeContext.d.ts +8 -0
  36. package/dist/types/routeWithParams.d.ts +1 -1
  37. package/dist/types/router.d.ts +5 -4
  38. package/dist/types/routerPlugin.d.ts +7 -5
  39. package/dist/types/url.d.ts +1 -0
  40. package/dist/types/view.d.ts +58 -0
  41. package/dist/utilities/testHelpers.d.ts +4 -4
  42. package/package.json +1 -1
  43. package/dist/services/createRouteRedirects.d.ts +0 -10
  44. /package/dist/services/{createRouteRedirects.spec.d.ts → addRedirect.spec.d.ts} +0 -0
@@ -19,8 +19,8 @@ export interface Register {
19
19
  * Represents the Router property within {@link Register}
20
20
  */
21
21
  export type RegisteredRouter<T = Register> = T extends {
22
- router: infer TRouter;
23
- } ? TRouter : Router;
22
+ router: unknown;
23
+ } ? T['router'] : Router;
24
24
  /**
25
25
  * Represents additional metadata associated with a route, customizable via declaration merging.
26
26
  */
@@ -105,4 +105,8 @@ export type RouterResolvedRouteUnion<TRoutes extends Routes> = {
105
105
  * type ResolvedUnion = ResolvedRouteUnion<RouteUnion> // ResolvedRoute<RouteA> | ResolvedRoute<RouteB>
106
106
  */
107
107
  export type ResolvedRouteUnion<TRoute extends Route> = TRoute extends Route ? ResolvedRoute<TRoute> : never;
108
+ /**
109
+ * Converts a route union to resolved routes with their corresponding loader data.
110
+ */
111
+ export type ResolvedRouteWithDataUnion<TRoute extends Route> = TRoute extends Route ? ResolvedRoute<TRoute> & WithData<TRoute> : never;
108
112
  export {};
@@ -3,6 +3,14 @@ import { Rejection, Rejections } from './rejection';
3
3
  import { GenericRoute, Route, Routes } from './route';
4
4
  export type RouteContext = GenericRoute | Rejection;
5
5
  export type ToRouteContext<TContext extends RouteContext[] | readonly RouteContext[] | undefined> = TContext extends RouteContext[] ? TContext : [];
6
+ /**
7
+ * Adds context to an options type while preserving its existing properties and context.
8
+ */
9
+ export type WithRouteContext<TOptions extends {
10
+ context?: RouteContext[];
11
+ }, TContext extends RouteContext[]> = TContext extends [] ? TOptions : Omit<TOptions, 'context'> & {
12
+ context: [...ToRouteContext<TOptions['context']>, ...TContext];
13
+ };
6
14
  export type ExtractRouteContext<TOptions extends CreateRouteOptions> = TOptions extends {
7
15
  context: infer TContext extends RouteContext[];
8
16
  } ? TOptions extends {
@@ -2,4 +2,4 @@ import { Route, Routes } from './route';
2
2
  import { RoutesName, RoutesMap } from './routesMap';
3
3
  import { UrlParamsWriting } from './url';
4
4
  export type RouteGetByKey<TRoutes extends Routes, TKey extends RoutesName<TRoutes>> = RoutesMap<TRoutes>[TKey];
5
- export type RouteParamsByKey<TRoutes extends Routes, TKey extends string> = RouteGetByKey<TRoutes, TKey> extends Route ? UrlParamsWriting<RouteGetByKey<TRoutes, TKey>> : Record<string, unknown>;
5
+ export type RouteParamsByKey<TRoutes extends Routes, TKey extends string> = TKey extends string ? RouteGetByKey<TRoutes, TKey> extends Route ? UrlParamsWriting<RouteGetByKey<TRoutes, TKey>> : Record<string, unknown> : never;
@@ -6,7 +6,7 @@ import { RouterRoute } from './routerRoute';
6
6
  import { AddBeforeEnterHook, AddBeforeUpdateHook, AddBeforeLeaveHook, AddAfterEnterHook, AddAfterUpdateHook, AddAfterLeaveHook, AddErrorHook, AddRejectionHook } from './hooks';
7
7
  import { PrefetchConfig } from './prefetch';
8
8
  import { ResolvedRoute } from './resolved';
9
- import { Route, Routes } from './route';
9
+ import { Routes } from './route';
10
10
  import { RouterPush } from './routerPush';
11
11
  import { RouterReplace } from './routerReplace';
12
12
  import { RouterResolve, RouterResolveOptions } from './routerResolve';
@@ -256,7 +256,8 @@ export type Router<TRoutes extends Routes = any, TOptions extends RouterOptions
256
256
  */
257
257
  render: () => Promise<ServerRenderResponse>;
258
258
  /**
259
- * Stops the router. Tears down the history listener and ignores any navigation still in flight or started afterwards.
259
+ * Stops the router. Releases history listeners and context subscriptions and ignores any navigation
260
+ * still in flight or started afterwards. Called automatically when the Vue app unmounts.
260
261
  */
261
262
  stop: () => void;
262
263
  /**
@@ -278,6 +279,6 @@ export type Router<TRoutes extends Routes = any, TOptions extends RouterOptions
278
279
  export type RouterRouteUnion<TRoutes extends Routes> = {
279
280
  [K in keyof TRoutes]: TRoutes[K]['name'] extends '' ? never : RouterRoute<ResolvedRoute<TRoutes[K]>>;
280
281
  }[number];
281
- export type RouterRoutes<TRouter extends Router> = TRouter extends Router<infer TRoutes extends Routes> ? TRoutes : Routes;
282
+ export type RouterRoutes<TRouter extends Router> = TRouter extends Router<infer TRoutes extends Routes, any, infer TPlugin extends RouterPlugin> ? Routes extends TRoutes | TPlugin['routes'] ? Routes : TRoutes | TPlugin['routes'] : Routes;
282
283
  export type RouterRejections<TRouter extends Router> = TRouter extends Router<any, infer TOptions extends RouterOptions, infer TPlugins extends RouterPlugin> ? ExtractRejections<TOptions> | ExtractRejections<TPlugins> : [];
283
- export type RouterRouteName<TRouter extends Router> = TRouter extends Router<infer TRoutes extends Routes> ? RoutesName<TRoutes> : RoutesName<Route[]>;
284
+ export type RouterRouteName<TRouter extends Router> = RoutesName<RouterRoutes<TRouter>>;
@@ -1,4 +1,4 @@
1
- import { HookRemove } from './hooks';
1
+ import { AddHook, HookRemove } from './hooks';
2
2
  import { Routes } from './route';
3
3
  import { Rejections } from './rejection';
4
4
  import { Hooks } from '../models/hooks';
@@ -30,6 +30,7 @@ export type RouterPlugin<TRoutes extends Routes = Routes, TRejections extends Re
30
30
  rejections: TRejections;
31
31
  };
32
32
  type PluginBeforeRouteHookContext<TRoutes extends Routes, TRejections extends Rejections> = {
33
+ lifecycle: 'before';
33
34
  from: ResolvedRoute | null;
34
35
  reject: RouterReject<TRejections>;
35
36
  push: RouterPush<TRoutes>;
@@ -37,6 +38,7 @@ type PluginBeforeRouteHookContext<TRoutes extends Routes, TRejections extends Re
37
38
  abort: CallbackContextAbort;
38
39
  };
39
40
  type PluginAfterRouteHookContext<TRoutes extends Routes, TRejections extends Rejections> = {
41
+ lifecycle: 'after';
40
42
  from: ResolvedRoute | null;
41
43
  reject: RouterReject<TRejections>;
42
44
  push: RouterPush<TRoutes>;
@@ -44,12 +46,12 @@ type PluginAfterRouteHookContext<TRoutes extends Routes, TRejections extends Rej
44
46
  };
45
47
  export type PluginBeforeRouteHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections> = (to: ResolvedRoute, context: PluginBeforeRouteHookContext<TRoutes, TRejections>) => MaybePromise<void>;
46
48
  export type PluginBeforeRouteLeaveHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections> = (to: ResolvedRoute | null, context: PluginBeforeRouteHookContext<TRoutes, TRejections>) => MaybePromise<void>;
47
- type AddPluginBeforeRouteLeaveHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections> = (hook: PluginBeforeRouteLeaveHook<TRoutes, TRejections>) => HookRemove;
49
+ type AddPluginBeforeRouteLeaveHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections> = AddHook<PluginBeforeRouteLeaveHook<TRoutes, TRejections>>;
48
50
  export type PluginAfterRouteLeaveHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections> = (to: ResolvedRoute | null, context: PluginAfterRouteHookContext<TRoutes, TRejections>) => MaybePromise<void>;
49
- type AddPluginAfterRouteLeaveHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections> = (hook: PluginAfterRouteLeaveHook<TRoutes, TRejections>) => HookRemove;
51
+ type AddPluginAfterRouteLeaveHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections> = AddHook<PluginAfterRouteLeaveHook<TRoutes, TRejections>>;
50
52
  export type PluginAfterRouteHook<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections> = (to: ResolvedRoute, context: PluginAfterRouteHookContext<TRoutes, TRejections>) => MaybePromise<void>;
51
- type AddPluginBeforeRouteHook<TRoutes extends Routes, TRejections extends Rejections> = (hook: PluginBeforeRouteHook<TRoutes, TRejections>) => HookRemove;
52
- type AddPluginAfterRouteHook<TRoutes extends Routes, TRejections extends Rejections> = (hook: PluginAfterRouteHook<TRoutes, TRejections>) => HookRemove;
53
+ type AddPluginBeforeRouteHook<TRoutes extends Routes, TRejections extends Rejections> = AddHook<PluginBeforeRouteHook<TRoutes, TRejections>>;
54
+ type AddPluginAfterRouteHook<TRoutes extends Routes, TRejections extends Rejections> = AddHook<PluginAfterRouteHook<TRoutes, TRejections>>;
53
55
  export type PluginErrorHookContext<TRoutes extends Routes = Routes, TRejections extends Rejections = Rejections> = {
54
56
  to: ResolvedRoute | null;
55
57
  from: ResolvedRoute | null;
@@ -9,6 +9,7 @@ export type UrlInternal = {
9
9
  [IS_URL_SYMBOL]: true;
10
10
  schema: Record<string, UrlPart>;
11
11
  params: {};
12
+ isMatch: (url: string, options?: ParseUrlOptions) => boolean;
12
13
  };
13
14
  export type CreateUrlOptions = {
14
15
  host?: string | UrlPart | undefined;
@@ -0,0 +1,58 @@
1
+ import { Component } from 'vue';
2
+ import { ComponentProps } from '../services/component';
3
+ import { TransformerOptions } from '../services/payload';
4
+ import { PrefetchConfig } from './prefetch';
5
+ import { RouteContext, RouteContextToRejection, RouteContextToRoute } from './routeContext';
6
+ import { ResolvedRouteWithDataUnion } from './resolved';
7
+ import { Routes } from './route';
8
+ import { RouterPush } from './routerPush';
9
+ import { RouterReplace } from './routerReplace';
10
+ import { RouterReject } from './routerReject';
11
+ import { AnyFunction, MaybePromise } from './utilities';
12
+ export declare const IS_VIEW_SYMBOL: unique symbol;
13
+ export type ViewInternal = {
14
+ [IS_VIEW_SYMBOL]: true;
15
+ };
16
+ /**
17
+ * Navigation helpers available to a reusable view from its declared context.
18
+ */
19
+ export type ViewCallbackContext<TContext extends readonly RouteContext[] = []> = {
20
+ push: RouterPush<RouteContextToRoute<[...TContext]>>;
21
+ replace: RouterReplace<RouteContextToRoute<[...TContext]>>;
22
+ reject: RouterReject<RouteContextToRejection<[...TContext]>>;
23
+ signal: AbortSignal;
24
+ };
25
+ export type ViewPropsGetter<TContext extends readonly RouteContext[], TProps, TRoutes extends Routes = Routes> = (route: ResolvedRouteWithDataUnion<TRoutes[number]>, context: ViewCallbackContext<TContext>) => TProps;
26
+ /**
27
+ * Options for a reusable component and its props getter.
28
+ */
29
+ export type CreateViewOptions<TComponent extends Component = Component, TContext extends readonly RouteContext[] = [], TProps extends MaybePromise<ComponentProps<TComponent>> | undefined = undefined, TRoutes extends Routes = Routes> = TransformerOptions<NoInfer<Awaited<TProps>>> & {
30
+ component: TComponent;
31
+ /**
32
+ * See [Context](https://kitbag-router.netlify.app/advanced-concepts/context).
33
+ */
34
+ context?: TContext;
35
+ prefetch?: PrefetchConfig;
36
+ } & (Partial<ComponentProps<TComponent>> extends ComponentProps<TComponent> ? {
37
+ props?: ViewPropsGetter<TContext, TProps extends undefined ? MaybePromise<ComponentProps<TComponent>> : TProps, TRoutes>;
38
+ } : {
39
+ props: ViewPropsGetter<TContext, TProps extends undefined ? MaybePromise<ComponentProps<TComponent>> : TProps, TRoutes>;
40
+ });
41
+ /**
42
+ * Creates views with props callbacks typed to the router's resolved routes and loader data.
43
+ */
44
+ export type CreateView<TRoutes extends Routes = Routes> = <TComponent extends Component, const TContext extends readonly RouteContext[] = [], TProps extends MaybePromise<ComponentProps<TComponent>> | undefined = undefined>(options: CreateViewOptions<TComponent, TContext, TProps, TRoutes>) => View<TProps, TContext>;
45
+ /**
46
+ * A reusable view definition with its props getter's result and declared context.
47
+ */
48
+ export type View<TProps = unknown, TContext extends readonly RouteContext[] = []> = TransformerOptions<Awaited<TProps>> & {
49
+ component: Component;
50
+ props?: AnyFunction<TProps>;
51
+ context: TContext;
52
+ prefetch?: PrefetchConfig;
53
+ };
54
+ export type AnyView = View<any, readonly RouteContext[]>;
55
+ /**
56
+ * Determines whether a value is a reusable view.
57
+ */
58
+ export declare function isView(value: unknown): value is AnyView & ViewInternal;
@@ -86,8 +86,8 @@ export declare const routes: readonly [import('../types/routeWithMethods').Route
86
86
  meta: Readonly<{}>;
87
87
  id: string;
88
88
  name: "parentA.childB";
89
- loaders: {};
90
89
  readonly path: "/childB/[paramD]";
90
+ loaders: {};
91
91
  views: {
92
92
  default: import('../types/routeViews').RouteView;
93
93
  };
@@ -142,8 +142,8 @@ export declare const routes: readonly [import('../types/routeWithMethods').Route
142
142
  meta: Readonly<{}>;
143
143
  id: string;
144
144
  name: "parentA.childA.grandChildA";
145
- loaders: {};
146
145
  readonly path: "/[paramC]";
146
+ loaders: {};
147
147
  views: {
148
148
  default: import('../types/routeViews').RouteView;
149
149
  };
@@ -154,8 +154,8 @@ export declare const routes: readonly [import('../types/routeWithMethods').Route
154
154
  meta: Readonly<{}>;
155
155
  id: string;
156
156
  name: "parentB";
157
- loaders: {};
158
157
  readonly path: "/parentB";
158
+ loaders: {};
159
159
  views: {
160
160
  default: import('../types/routeViews').RouteView;
161
161
  };
@@ -166,8 +166,8 @@ export declare const routes: readonly [import('../types/routeWithMethods').Route
166
166
  meta: Readonly<{}>;
167
167
  id: string;
168
168
  name: "parentC";
169
- loaders: {};
170
169
  readonly path: "/";
170
+ loaders: {};
171
171
  views: {
172
172
  default: import('../types/routeViews').RouteView;
173
173
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kitbag/router",
3
3
  "private": false,
4
- "version": "0.28.0",
4
+ "version": "0.29.0",
5
5
  "license": "MIT",
6
6
  "bugs": {
7
7
  "url": "https://github.com/kitbagjs/router/issues"
@@ -1,10 +0,0 @@
1
- import { RouteRedirects } from '../types/redirects';
2
- import { Route } from '../types/route';
3
- type CreateRouteRedirectsContext = {
4
- /**
5
- * The to route for the redirectFrom callback and the from route for the redirectTo callback.
6
- */
7
- getRoute: () => Route;
8
- };
9
- export declare function createRouteRedirects({ getRoute }: CreateRouteRedirectsContext): RouteRedirects;
10
- export {};