import React from "react";
import { RequestInfo } from "../requestInfo/types";
export type DocumentProps<T extends RequestInfo = RequestInfo> = T & {
    children: React.ReactNode;
};
export type LayoutProps<T extends RequestInfo = RequestInfo> = {
    children?: React.ReactNode;
    requestInfo?: T;
};
export type RwContext = {
    nonce: string;
    Document: React.FC<DocumentProps<any>>;
    rscPayload: boolean;
    ssr: boolean;
    layouts?: React.FC<LayoutProps<any>>[];
};
export type RouteMiddleware<T extends RequestInfo = RequestInfo> = (requestInfo: T) => Response | Promise<Response> | void | Promise<void> | Promise<Response | void>;
type RouteFunction<T extends RequestInfo = RequestInfo> = (requestInfo: T) => Response | Promise<Response>;
type MaybePromise<T> = T | Promise<T>;
type RouteComponent<T extends RequestInfo = RequestInfo> = (requestInfo: T) => MaybePromise<React.JSX.Element | Response>;
type RouteHandler<T extends RequestInfo = RequestInfo> = RouteFunction<T> | RouteComponent<T> | [...RouteMiddleware<T>[], RouteFunction<T> | RouteComponent<T>];
export type Route<T extends RequestInfo = RequestInfo> = RouteMiddleware<T> | RouteDefinition<T> | Array<Route<T>>;
export type RouteDefinition<T extends RequestInfo = RequestInfo> = {
    path: string;
    handler: RouteHandler<T>;
    layouts?: React.FC<LayoutProps<T>>[];
};
export declare function matchPath<T extends RequestInfo = RequestInfo>(routePath: string, requestPath: string): T["params"] | null;
export declare function defineRoutes<T extends RequestInfo = RequestInfo>(routes: Route<T>[]): {
    routes: Route<T>[];
    handle: ({ request, renderPage, getRequestInfo, onError, runWithRequestInfoOverrides, }: {
        request: Request;
        renderPage: (requestInfo: T, Page: React.FC, onError: (error: unknown) => void) => Promise<Response>;
        getRequestInfo: () => T;
        onError: (error: unknown) => void;
        runWithRequestInfoOverrides: <Result>(overrides: Partial<T>, fn: () => Promise<Result>) => Promise<Result>;
    }) => Response | Promise<Response>;
};
export declare function route<T extends RequestInfo = RequestInfo>(path: string, handler: RouteHandler<T>): RouteDefinition<T>;
export declare function index<T extends RequestInfo = RequestInfo>(handler: RouteHandler<T>): RouteDefinition<T>;
export declare function prefix<T extends RequestInfo = RequestInfo>(prefixPath: string, routes: Route<T>[]): Route<T>[];
export declare function layout<T extends RequestInfo = RequestInfo>(LayoutComponent: React.FC<LayoutProps<T>>, routes: Route<T>[]): Route<T>[];
export declare function render<T extends RequestInfo = RequestInfo>(Document: React.FC<DocumentProps<T>>, routes: Route<T>[], 
/**
 * @param options - Configuration options for rendering.
 * @param options.rscPayload - Toggle the RSC payload that's appended to the Document. Disabling this will mean that interactivity no longer works.
 * @param options.ssr - Disable sever side rendering for all these routes. This only allow client side rendering`, which requires `rscPayload` to be enabled.
 */
options?: {
    rscPayload?: boolean;
    ssr?: boolean;
}): Route<T>[];
export declare const isClientReference: (Component: React.FC<any>) => boolean;
export {};
