UNPKG

vasille-router

Version:

The first Developer eXperience Orientated front-end framework (router library).

34 lines (33 loc) 1.71 kB
import { Fragment } from "vasille"; export type NoParams = NonNullable<unknown>; export type RemoveTail<S extends string, Tail extends string> = S extends `${infer P}${Tail}` ? P : S; export type GetRouteParameter<S extends string> = RemoveTail<RemoveTail<S, `/${string}`>, `-${string}`>; export type RouteParameters<Route extends string> = string extends Route ? NoParams : Route extends `${string}:${infer Rest}` ? (GetRouteParameter<Rest> extends never ? NoParams : GetRouteParameter<Rest> extends `${infer ParamName}?` ? { [P in ParamName]?: string; } : { [P in GetRouteParameter<Rest>]: string; }) & (Rest extends `${GetRouteParameter<Rest>}${infer Next}` ? RouteParameters<Next> : unknown) : NoParams; export type QueryParams = { [k: string]: string | string[]; }; export type ScreenProps<Route extends string> = { url: string; path: string; params: RouteParameters<Route>; query: QueryParams; hash: string; }; export type Screen<Node, Element, TagOptions extends object, Route extends string> = (props: ScreenProps<Route>, ctx: Fragment<Node, Element, TagOptions>) => Promise<void>; export type Answer<Node, Element, TagOptions extends object, Route extends string, Extras extends object> = { screen: Screen<Node, Element, TagOptions, Route>; minAccessLevel?: number; } & Extras; export type Routing<Node, Element, TagOptions extends object, RoutePath extends string, Extras extends object> = { self?: Answer<Node, Element, TagOptions, RoutePath, Extras>; static: { [k: string]: Routing<Node, Element, TagOptions, RoutePath, Extras>; }; dynamic: { [k: string]: Routing<Node, Element, TagOptions, RoutePath, Extras>; }; };