@bespunky/angular-zen
Version:
The Angular tools you always wished were there.
42 lines (41 loc) • 3.16 kB
TypeScript
import type { InjectionToken } from '@angular/core';
import type { Route } from '@angular/router';
import type { Join, NoTail } from '@bespunky/typescript-utils';
import type { _NavigatorXToken_, _RouteComposer_ } from '../_navigation-x.symbols';
import type { RouteComposer } from '../route-composer/router-composer';
import type { AutoNavigateRouteMethods } from './auto-navigator-methods.types';
import type { RouteComposerName } from './route-composer.types';
import type { CombinedPath, RouteSegments } from './route-paths.types';
export interface ReadonlyRoute<PathSegment extends string, FriendlyName extends string, Children extends DeepReadonlyRouteChildren | undefined> extends Readonly<Omit<Route, 'path' | 'children'>> {
/**
* ### navigation-x property
*
* Sets the contextual name for the route. This name will replace the method name automatically generated by `useNavigationX()`.
*
* If you have a deep route, for example `theaters/:theaterId/shows/:showId`, the navigation method will automatically be named something like:
* `toTheatersTheaterIdShowsShowId()`.
*
* Specifying `friendlyName: 'ShowDetails'` for example, will make your navigation method receive the name `toShowDetails()`, which is nicer to read
* and gives context as to where you're navigating to.
*
* @type {FriendlyName}
*/
readonly friendlyName?: FriendlyName;
readonly path?: PathSegment;
readonly children?: Children;
}
declare type MaxRouteChildrenDepth = 15;
export declare type DeepReadonlyRouteChildren<Depth extends number = MaxRouteChildrenDepth, Levels extends Array<boolean> = []> = readonly ReadonlyRoute<string, string, Levels['length'] extends Depth ? any : DeepReadonlyRouteChildren<Depth, [...Levels, true]>>[];
export interface WithRouteComposer<Entity, FullPath extends string, Name extends string> {
readonly [_RouteComposer_]: RouteComposer<Entity, FullPath, Name>;
}
export interface WithNavigationX<Route, Entity, Root extends string> {
readonly [_NavigatorXToken_]: InjectionToken<AutoNavigateRouteMethods<Route, Entity, Root>>;
}
export declare type ComposableRoutesArray<RouteArray, Entity, Root extends string> = RouteArray extends readonly [infer First, ...infer Rest] ? First extends ReadonlyRoute<infer Segment, string, any> ? readonly [
ComposableRoute<First, Entity, CombinedPath<Root, Segment>>,
...ComposableRoutesArray<Rest, Entity, Root>
] : [] : [];
export declare type ComposableRoute<Route extends ReadonlyRoute<string, string, DeepReadonlyRouteChildren | undefined>, Entity, Root extends string> = Route extends ReadonlyRoute<infer Segment, infer FriendlyName, infer Children> ? ReadonlyRoute<Segment, FriendlyName, Children> & WithRouteComposer<Entity, CombinedPath<Root, Segment>, RouteComposerName<FriendlyName, CombinedPath<Root, Segment>>> : never;
export declare type NavigationXRoute<ComposableR extends ComposableRoute<any, any, string>> = ComposableR extends ComposableRoute<infer Route, infer Entity, infer Root> ? ComposableR & WithNavigationX<Route, Entity, Join<NoTail<RouteSegments<Root>> & string[], '/'>> : never;
export {};