import React, { ComponentType } from 'react';
import { BrowserRouterProps, HashRouterProps, MemoryRouterProps, RouteObject } from 'react-router-dom';
import { Application } from './Application';
export interface BrowserRouterOptions extends Omit<BrowserRouterProps, 'children'> {
    type?: 'browser';
}
export interface HashRouterOptions extends Omit<HashRouterProps, 'children'> {
    type?: 'hash';
}
export interface MemoryRouterOptions extends Omit<MemoryRouterProps, 'children'> {
    type?: 'memory';
}
export type RouterOptions = (HashRouterOptions | BrowserRouterOptions | MemoryRouterOptions) & {
    renderComponent?: RenderComponentType;
};
export type ComponentTypeAndString<T = any> = ComponentType<T> | string;
export interface RouteType extends Omit<RouteObject, 'children' | 'Component'> {
    Component?: ComponentTypeAndString;
}
export type RenderComponentType = (Component: ComponentTypeAndString, props?: any) => React.ReactNode;
export declare class RouterManager {
    protected routes: Record<string, RouteType>;
    protected options: RouterOptions;
    app: Application;
    constructor(options: RouterOptions, app: Application);
    /**
     * @internal
     */
    getRoutesTree(): RouteObject[];
    getRoutes(): Record<string, RouteType>;
    setType(type: RouterOptions['type']): void;
    getBasename(): string;
    setBasename(basename: string): void;
    /**
     * @internal
     */
    getRouterComponent(): ({ BaseLayout, }: {
        BaseLayout?: ComponentType<any>;
        children?: React.ReactNode;
    }) => React.JSX.Element;
    add(name: string, route: RouteType): void;
    get(name: string): RouteType;
    has(name: string): boolean;
    remove(name: string): void;
}
export declare function createRouterManager(options?: RouterOptions, app?: Application): RouterManager;
