import { RequestInfo } from "../requestInfo/types";
export type DocumentProps = RequestInfo & {
    children: React.ReactNode;
};
export type RwContext = {
    nonce: string;
    Document: React.FC<DocumentProps>;
};
export type RouteMiddleware = (requestInfo: RequestInfo) => Response | Promise<Response> | void | Promise<void> | Promise<Response | void>;
type RouteFunction = (requestInfo: RequestInfo) => Response | Promise<Response>;
type RouteComponent = (requestInfo: RequestInfo) => JSX.Element | Promise<JSX.Element>;
type RouteHandler = RouteFunction | RouteComponent | [...RouteMiddleware[], RouteFunction | RouteComponent];
export type Route = RouteMiddleware | RouteDefinition | Array<Route>;
export type RouteDefinition = {
    path: string;
    handler: RouteHandler;
};
export declare function defineRoutes(routes: Route[]): {
    routes: Route[];
    handle: ({ request, renderPage, getRequestInfo, runWithRequestInfoOverrides, }: {
        request: Request;
        renderPage: (requestInfo: RequestInfo, Page: React.FC) => Promise<Response>;
        getRequestInfo: () => RequestInfo;
        runWithRequestInfoOverrides: <Result>(overrides: Partial<RequestInfo>, fn: () => Promise<Result>) => Promise<Result>;
    }) => Response | Promise<Response>;
};
export declare function route(path: string, handler: RouteHandler): RouteDefinition;
export declare function index(handler: RouteHandler): RouteDefinition;
export declare function prefix(prefix: string, routes: ReturnType<typeof route>[]): RouteDefinition[];
export declare function render(Document: React.FC<{
    children: React.ReactNode;
}>, routes: Route[]): Route[];
export {};
