diff --git a/index.d.ts b/index.d.ts index 05f3cf9..aa436ff 100644 --- a/index.d.ts +++ b/index.d.ts @@ -8,21 +8,26 @@ export function parse(route: RegExp): { pattern: RegExp; } +type KeyRecord = + T extends `${infer P}?` // :id? + ? { [K in P]?: string | undefined } + : T extends `${infer P}.${string}` // :id.ext + ? { [K in P]: string } + : { [K in T]: string }; + export type RouteParams = T extends `${infer Prev}/*/${infer Rest}` - ? RouteParams & { wild: string } & RouteParams - : T extends `${string}:${infer P}?/${infer Rest}` - ? { [K in P]?: string } & RouteParams - : T extends `${string}:${infer P}/${infer Rest}` - ? { [K in P]: string } & RouteParams - : T extends `${string}:${infer P}?` - ? { [K in P]?: string } - : T extends `${string}:${infer P}` - ? { [K in P]: string } - : T extends `${string}*` + ? RouteParams & { wild: string } & RouteParams<`/${Rest}`> + : T extends `:${infer Rest}` + ? RouteParams<`/:${Rest}`> + : T extends `${string}/:${infer P}/${infer Rest}` + ? KeyRecord

& RouteParams<`/${Rest}`> + : T extends `${string}/:${infer P}` + ? KeyRecord

+ : T extends `${string}/*` ? { "*": string } - : T extends `${string}*?` - ? { "*"?: string } + : T extends `${string}/*?` + ? { "*"?: string | undefined } : {}; export function inject(route: T, values: RouteParams): string;