vasille-router
Version:
The framework designed to build bulletproof frontends (router library).
33 lines (32 loc) • 1.74 kB
TypeScript
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<S, `/${string}`>;
export type RouteParameters<Route extends string> = string extends Route ? NoParams : Route extends `${string}/*` ? RouteParameters<RemoveTail<Route, "/*">> & {
"*": string;
} : Route extends `${string}*${string}` ? NoParams : Route extends `${string}/(${infer Rest})` | `${string}/(${infer Rest})/${string}` ? (GetRouteParameter<Rest> extends never ? NoParams : {
[P in GetRouteParameter<Rest>]: string;
}) & (Rest extends `${GetRouteParameter<Rest>}${infer Next}` ? RouteParameters<Next> : unknown) : NoParams;
export type QueryParams = {
[k: 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>;
} & 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>;
};
};