UNPKG

rwsdk

Version:

Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime

29 lines (28 loc) 1.63 kB
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 {};