import type { RouteDefinition } from "@solidjs/router"; /** * Refine a Type * @example * ```ts * type Refined = Refine<{ foo: string, bar: unknown[] }, { foo: `${number}` }> * // ^? { foo: `${number}`, bar: unknown[] } * ``` */ export type Refine> = { [k in keyof T]: T[k] & P[k]; }; /** * Prettify helper * @see https://www.totaltypescript.com/concepts/the-prettify-helper */ export type Prettify = { [k in keyof T]: T[k]; } & unknown; // SHOULD be: import type { MatchFilter } from "@solidjs/router"; // but `@solidjs/router` does NOT expose this type type MatchFilter = NonNullable< NonNullable[string] >; // The `matchFilters` of a RouteDefinition describes its Params type RD$matchFilters = NonNullable< RD["matchFilters"] >; // Convert MatchFilter to string value type MF$toString = MF extends readonly string[] ? MF[number] : MF extends RegExp ? `${string}` : MF extends (s: string) => boolean ? `${string}` : never; // Params of a RouteDefinition {[keyof matchFilters]: `${any}`} type RD$Params = { [k in NonNullable>]: MF$toString< RD$matchFilters[k] >; }; // Refine a defined RouteDefinition type RD$RouteParams< RD extends RouteDefinition, tRD extends RouteDefinition = RouteDefinition > = Refine, RD$Params>; /** * @example * ```ts * const path = "/:aNumberParam"; * type TRouteDefinition = RouteDefinition; * * type TParams = RouteDefinitionParams; * // or with Refined param Type * type TParams = RouteDefinitionParams; * const params = useParams(); * // ^? Type is { aNumberParam: `${number}` } * ``` */ export type RouteDefinitionParams< RD extends RouteDefinition, P extends Partial> = NonNullable > = Prettify, P>>;