// Minimum TypeScript Version: 4.1 // tslint:disable:no-unnecessary-generics import { AnchorHTMLAttributes, FunctionComponent, RefAttributes, ComponentType, ReactNode, ReactElement, MouseEventHandler, } from "react"; import { Path, PathPattern, BaseLocationHook, HookReturnValue, HookNavigationOptions, BaseSearchHook, } from "./location-hook.js"; import { BrowserLocationHook, BrowserSearchHook, } from "./use-browser-location.js"; import { Parser, RouterObject, RouterOptions } from "./router.js"; // these files only export types, so we can re-export them as-is // in TS 5.0 we'll be able to use `export type * from ...` export * from "./location-hook.js"; export * from "./router.js"; import { RouteParams } from "regexparam"; export type StringRouteParams = RouteParams & { [param: number]: string | undefined; }; export type RegexRouteParams = { [key: string | number]: string | undefined }; /** * Route patterns and parameters */ export interface DefaultParams { readonly [paramName: string | number]: string | undefined; } export type Params = T; export type MatchWithParams = [ true, Params ]; export type NoMatch = [false, null]; export type Match = | MatchWithParams | NoMatch; /* * Components: */ export interface RouteComponentProps { params: T; } export interface RouteProps< T extends DefaultParams | undefined = undefined, RoutePath extends PathPattern = PathPattern > { children?: | (( params: T extends DefaultParams ? T : RoutePath extends string ? StringRouteParams : RegexRouteParams ) => ReactNode) | ReactNode; path?: RoutePath; component?: ComponentType< RouteComponentProps< T extends DefaultParams ? T : RoutePath extends string ? StringRouteParams : RegexRouteParams > >; nest?: boolean; } export function Route< T extends DefaultParams | undefined = undefined, RoutePath extends PathPattern = PathPattern >(props: RouteProps): ReturnType; /* * Components: & */ export type NavigationalProps< H extends BaseLocationHook = BrowserLocationHook > = ({ to: Path; href?: never } | { href: Path; to?: never }) & HookNavigationOptions; export type RedirectProps = NavigationalProps & { children?: never; }; export function Redirect( props: RedirectProps, context?: any ): null; type AsChildProps = | ({ asChild?: false } & DefaultElementProps) | ({ asChild: true } & ComponentProps); type HTMLLinkAttributes = Omit< AnchorHTMLAttributes, "className" > & { className?: string | undefined | ((isActive: boolean) => string | undefined); }; export type LinkProps = NavigationalProps & AsChildProps< { children: ReactElement; onClick?: MouseEventHandler }, HTMLLinkAttributes & RefAttributes >; export function Link( props: LinkProps, context?: any ): ReturnType; /* * Components: */ export interface SwitchProps { location?: string; children: ReactNode; } export const Switch: FunctionComponent; /* * Components: */ export type RouterProps = RouterOptions & { children: ReactNode; }; export const Router: FunctionComponent; /* * Hooks */ export function useRouter(): RouterObject; export function useRoute< T extends DefaultParams | undefined = undefined, RoutePath extends PathPattern = PathPattern >( pattern: RoutePath ): Match< T extends DefaultParams ? T : RoutePath extends string ? StringRouteParams : RegexRouteParams >; export function useLocation< H extends BaseLocationHook = BrowserLocationHook >(): HookReturnValue; export function useSearch< H extends BaseSearchHook = BrowserSearchHook >(): ReturnType; export function useParams(): T extends string ? StringRouteParams : T extends undefined ? DefaultParams : T; /* * Helpers */ export function matchRoute< T extends DefaultParams | undefined = undefined, RoutePath extends PathPattern = PathPattern >( parser: Parser, pattern: RoutePath, path: string, loose?: boolean ): Match< T extends DefaultParams ? T : RoutePath extends string ? StringRouteParams : RegexRouteParams >; // tslint:enable:no-unnecessary-generics