rwsdk
Version:
Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime
29 lines (28 loc) • 1.63 kB
TypeScript
import type { RouteDefinition, RouteMiddleware } from "./router";
type PathParams<Path extends string> = Path extends `${string}:${infer Param}/${infer Rest}` ? {
[K in Param]: string;
} & PathParams<Rest> : Path extends `${string}:${infer Param}` ? {
[K in Param]: string;
} : Path extends `${string}*${infer Rest}` ? {
$0: string;
} & PathParams<Rest> : Path extends `${string}*` ? {
$0: string;
} : {};
type ParamsForPath<Path extends string> = PathParams<Path> extends Record<string, never> ? undefined : PathParams<Path>;
export type LinkFunction<Paths extends string> = {
<Path extends Paths>(path: Path, params?: ParamsForPath<Path>): string;
};
type RoutePaths<Value> = Value extends RouteDefinition<infer Path, any> ? Path : Value extends readonly (infer Item)[] ? RouteArrayPaths<Value> : Value extends RouteMiddleware<any> ? never : never;
type RouteArrayPaths<Routes extends readonly any[]> = number extends Routes["length"] ? RoutePaths<Routes[number]> : Routes extends readonly [infer Head, ...infer Tail] ? RoutePaths<Head> | RouteArrayPaths<Tail> : never;
type AppRoutes<App> = App extends {
__rwRoutes: infer Routes;
} ? Routes : never;
export type AppRoutePaths<App> = RoutePaths<AppRoutes<App>>;
export type AppLink<App> = LinkFunction<AppRoutePaths<App>>;
export declare function linkFor<App>(): AppLink<App>;
export declare function createLinks<App>(_app?: App): AppLink<App>;
export declare function defineLinks<App extends {
__rwRoutes: any;
}>(): AppLink<App>;
export declare function defineLinks<const T extends readonly string[]>(routes: T): LinkFunction<T[number]>;
export {};