import * as React from "react"; import * as url from "url"; type UrlLike = url.UrlObject | url.Url; type EventName = 'routeChangeStart' | 'routeChangeComplete' | 'routeChangeError' | 'beforeHistoryChange' | 'hashChangeStart' | 'hashChangeComplete'; interface RouteChangeError { cancelled: boolean; } type EventHandler = (url: string) => any; type ErrorEventHandler = (err: RouteChangeError, url: string) => any; export interface EventChangeOptions { shallow?: boolean; [key: string]: any; } export type PopStateCallback = (state: any) => boolean | undefined; export type RouterCallback = () => void; export interface DefaultQuery { [key: string]: | boolean | boolean[] | number | number[] | string | string[]; } export interface RouterProps { // url property fields readonly pathname: string; readonly route: string; readonly asPath?: string; readonly query?: Q; // property fields readonly components: { [key: string]: { Component: React.ComponentType; err: any }; }; // core method fields back(): void; beforePopState(cb: PopStateCallback): boolean; prefetch(url: string): Promise>; push( url: string | UrlLike, as?: string | UrlLike, options?: EventChangeOptions, ): Promise; reload(route: string): Promise; replace( url: string | UrlLike, as?: string | UrlLike, options?: EventChangeOptions, ): Promise; // events (deprecated soonish) onAppUpdated?(nextRoute: string): void; onBeforeHistoryChange?(as: string): void; onHashChangeStart?(url: string): void; onHashChangeComplete?(url: string): void; onRouteChangeComplete?(url: string): void; onRouteChangeError?(error: RouteChangeError, url: string): void; onRouteChangeStart?(url: string): void; // events API (6.1.1+) readonly events: { on: (eventName: EventName, handler: EventHandler | ErrorEventHandler) => void; off: (eventName: EventName, handler: (url: string) => any) => void; }; } export interface SingletonRouter extends RouterProps { router: RouterProps | null; readyCallbacks: RouterCallback[]; ready(cb: RouterCallback): void; } export interface WithRouterProps { router: SingletonRouter; } // Manually disabling the no-unnecessary-generics rule so users can // retain type inference if they warp their component in withRouter // without defining props explicitly export function withRouter( // tslint:disable-next-line:no-unnecessary-generics Component: React.ComponentType>, ): React.ComponentType; declare const Router: SingletonRouter; export default Router;