import type { AppInstance } from '../startup/AppInstance';
import type { createBrowserRouter, createMemoryRouter } from 'react-router-dom';
import type { TransformOptions } from './utils/transform';
export type RouteItemHandle = {
    title: string;
    i18nKey?: string;
    order: number;
    icon?: string;
    hideInMenu?: boolean;
    hideFooter?: boolean;
    keepAlive?: boolean;
    needLogin?: boolean;
    roles?: Array<string>;
    name?: string;
    [key: string]: unknown;
};
export type RouteItem = {
    layout?: string | ComponentImport | null;
    page?: string | ComponentImport | null;
    loading?: string | ComponentImport | null;
    errors?: string | ComponentImport | null;
    name: string;
    path: string | undefined;
    isGroup?: boolean;
    enableRedirection?: boolean;
    handle: RouteItemHandle;
    children?: RouteItem[];
};
export type RouteMapType = Record<string, () => Promise<any>>;
/**
 * DOM 路由选项类型（从 createBrowserRouter 和 createHashRouter 的参数类型提取）
 */
export type DOMRouterOpts = Parameters<typeof createBrowserRouter>[1];
/**
 * Memory 路由选项类型（从 createMemoryRouter 的参数类型提取）
 */
export type MemoryRouterOpts = Parameters<typeof createMemoryRouter>[1];
/**
 * 路由元数据（兼容 RouteItemHandle）
 *
 * @deprecated 建议直接使用 RouteItem 和 RouteItemHandle
 */
export interface RouteMeta {
    /**
     * 路由标题
     */
    title?: string;
    /**
     * 图标
     */
    icon?: string;
    /**
     * 排序
     */
    order?: number;
    /**
     * 权限标识
     */
    auth?: string | string[];
    /**
     * 是否在菜单中隐藏
     */
    hideInMenu?: boolean;
    /**
     * 是否启用 KeepAlive
     */
    keepAlive?: boolean;
    /**
     * 是否需要登录
     */
    needLogin?: boolean;
    /**
     * 角色列表
     */
    roles?: string[];
    /**
     * 路由名称（唯一标识）
     */
    name?: string;
    /**
     * 其他自定义元数据
     */
    [key: string]: unknown;
}
/**
 * 动态导入函数类型
 *
 * 用于懒加载组件，返回一个 Promise，resolve 后的值为组件模块对象
 * 组件必须使用默认导出（export default）
 */
export type ComponentImport = () => Promise<any>;
/**
 * 路由配置项
 *
 * 与 RouteItem 的区别：
 * - layout、page、loading、errors 可以是组件路径字符串（如 "@/pages/index.ts"）或动态导入函数
 * - 如果使用字符串，系统会自动转换为动态导入函数
 * - 如果使用函数，则直接使用，无需转换
 * - 对应的组件必须默认导出（export default xxxx）
 */
export interface RouteConfig {
    /**
     * 布局组件路径（字符串）或动态导入函数
     *
     * 字符串示例： "@/pages/layout.tsx" 或 "../../pages/layout.tsx"
     * 函数示例： () => import("@/pages/layout.tsx")
     * 组件必须默认导出
     */
    layout?: string | ComponentImport | null;
    /**
     * 页面组件路径（字符串）或动态导入函数
     *
     * 字符串示例： "@/pages/index.tsx" 或 "../../pages/index.tsx"
     * 函数示例： () => import("@/pages/index.tsx")
     * 组件必须默认导出
     */
    page?: string | ComponentImport | null;
    /**
     * 加载组件路径（字符串）或动态导入函数
     *
     * 字符串示例： "@/components/Loading.tsx"
     * 函数示例： () => import("@/components/Loading.tsx")
     * 组件必须默认导出
     */
    loading?: string | ComponentImport | null;
    /**
     * 错误组件路径（字符串）或动态导入函数
     *
     * 字符串示例： "@/pages/error.tsx"
     * 函数示例： () => import("@/pages/error.tsx")
     * 组件必须默认导出
     */
    errors?: string | ComponentImport | null;
    /**
     * 路由名称（唯一标识）
     */
    name: string;
    /**
     * 路由路径
     */
    path: string | undefined;
    /**
     * 是否为路由组
     */
    isGroup?: boolean;
    /**
     * 是否启用重定向
     */
    enableRedirection?: boolean;
    /**
     * 路由元数据
     */
    handle: {
        title: string;
        i18nKey?: string;
        order: number;
        icon?: string;
        hideInMenu?: boolean;
        hideFooter?: boolean;
        keepAlive?: boolean;
        needLogin?: boolean;
        roles?: Array<string>;
        name?: string;
        [key: string]: unknown;
    };
    /**
     * 子路由配置
     */
    children?: RouteConfig[];
}
/**
 * 路由位置信息
 */
export interface RouteLocation {
    /**
     * 路径
     */
    path: string;
    /**
     * 路径参数
     */
    params?: Record<string, unknown>;
    /**
     * 查询参数
     */
    query?: Record<string, unknown>;
    /**
     * 路由元数据
     */
    meta?: RouteMeta;
}
/**
 * 导航选项
 */
export interface NavigateOptions {
    /**
     * 是否替换当前历史记录
     */
    replace?: boolean;
    /**
     * 状态数据
     */
    state?: unknown;
    /**
     * 查询参数
     */
    query?: Record<string, unknown>;
}
/**
 * 路由生命周期钩子
 */
export interface RouteLifecycleHooks {
    /**
     * 路由跳转前钩子
     *
     * @param to - 目标路由
     * @param from - 来源路由
     * @returns 如果返回字符串，则跳转到该路径；如果返回 false，则阻止跳转；返回 true 或 undefined 则继续跳转
     */
    beforeEach?: (to: RouteLocation, from?: RouteLocation) => string | false | void | Promise<string | false | void>;
    /**
     * 路由跳转后钩子
     *
     * @param to - 目标路由
     * @param from - 来源路由
     */
    afterEach?: (to: RouteLocation, from?: RouteLocation) => void | Promise<void>;
}
/**
 * 路由模式
 *
 * 对应 react-router-dom 的路由模式：
 * - `browser`: 使用 BrowserRouter（createBrowserRouter）
 * - `hash`: 使用 HashRouter（createHashRouter）
 * - `memory`: 使用 MemoryRouter（createMemoryRouter）
 */
export type RouterMode = 'browser' | 'hash' | 'memory';
/**
 * 应用路由接口
 *
 * 这是框架核心依赖的抽象接口，所有路由实现都必须实现此接口
 */
export interface AppRouter {
    /**
     * 挂载到应用实例
     *
     * @param app - 应用实例
     */
    mount(app: AppInstance): void;
    /**
     * 路由跳转
     *
     * @param to - 目标路径或路由名称
     * @param options - 导航选项
     */
    navigate(to: string, options?: NavigateOptions): void;
    /**
     * 获取当前路由信息
     *
     * @returns 当前路由位置信息
     */
    getCurrentRoute(): RouteLocation;
    /**
     * 销毁路由实例（可选）
     */
    destroy?(): void;
}
/**
 * 路径解析配置
 */
export interface PathResolveConfig {
    /**
     * 项目根目录路径
     *
     * 用于解析相对路径的基准目录。
     * 如果不提供，将使用调用框架的项目根目录（通常为 process.cwd()）。
     *
     * 注意：路径解析主要由构建工具（如 Vite、Webpack）处理，
     * 此配置主要用于文档和错误提示。
     *
     * @example
     * ```typescript
     * router: {
     *   pathResolve: {
     *     basePath: '/path/to/project',
     *   },
     * }
     * ```
     */
    basePath?: string;
    /**
     * 路径别名映射
     *
     * 用于将路径别名（如 @/）映射到实际路径。
     * 如果不提供，将使用构建工具的配置（如 vite.config.ts 中的 resolve.alias）。
     *
     * 注意：路径别名解析主要由构建工具处理，
     * 此配置主要用于文档和错误提示。
     *
     * @example
     * ```typescript
     * router: {
     *   pathResolve: {
     *     pathAliases: {
     *       '@': './src',
     *       '@components': './src/components',
     *     },
     *   },
     * }
     * ```
     */
    pathAliases?: Record<string, string>;
}
/**
 * 路由配置选项
 */
export interface RouterConfig {
    /**
     * 是否启用路由
     *
     * - `true`: 启用内置路由（默认）
     * - `false`: 禁用内置路由，使用自定义路由
     * - `'disabled'`: 完全禁用路由
     *
     * @default true
     */
    enabled?: boolean | 'disabled';
    /**
     * 路由配置列表
     *
     * 使用 RouteConfig 类型
     *
     * 注意：RouteConfig 中的 layout、page、loading、errors 可以是：
     * - 组件路径字符串：系统会自动转换为动态导入函数
     * - 动态导入函数：直接使用，无需转换
     *
     * 路径字符串可以是：
     * - 相对路径：如 `"./pages/index.tsx"`、`"../components/Layout.tsx"`
     * - 路径别名：如 `"@/pages/index.tsx"`（需要在构建工具中配置，如 vite.config.ts）
     * - 绝对路径：如 `"/src/pages/index.tsx"`（不推荐）
     *
     * 动态导入函数示例：
     * - `() => import("./pages/index.tsx")`
     * - `() => import("@/pages/index.tsx")`
     *
     * 路径解析由构建工具（如 Vite、Webpack）处理，框架会在运行时验证组件是否有默认导出。
     */
    routes?: RouteConfig[] | (() => Promise<RouteConfig[]>);
    /**
     * 路由模式
     *
     * - `browser`: 使用 BrowserRouter（createBrowserRouter）- 默认
     * - `hash`: 使用 HashRouter（createHashRouter）
     * - `memory`: 使用 MemoryRouter（createMemoryRouter）
     *
     * @default 'browser'
     */
    mode?: RouterMode;
    /**
     * 路由选项
     *
     * 传递给 react-router-dom 的路由创建方法的选项
     * - `browser` 和 `hash` 模式使用 `DOMRouterOpts`
     * - `memory` 模式使用 `MemoryRouterOpts`
     */
    options?: DOMRouterOpts | MemoryRouterOpts;
    /**
     * 路径解析配置
     *
     * 用于配置路径解析选项，主要用于文档和错误提示。
     * 实际的路径解析由构建工具（如 Vite、Webpack）处理。
     */
    pathResolve?: PathResolveConfig;
    /**
     * 转换选项
     *
     * 用于配置转换选项，主要用于转换路由配置。
     */
    transformOptions?: TransformOptions;
    /**
     * 路由生命周期钩子
     */
    hooks?: RouteLifecycleHooks;
    /**
     * 是否启用配置验证（默认 true）
     *
     * 如果为 false，将跳过路由配置的 Zod 验证
     */
    enableValidation?: boolean;
    /**
     * 默认路由错误组件
     *
     * 当路由配置中的 `errors` 为空时，将使用此组件作为错误边界。
     * 如果不提供，将使用框架内置的 `RouteErrorBoundary` 组件。
     *
     * 组件必须使用默认导出（export default）。
     *
     * @example
     * ```typescript
     * router: {
     *   defaultRouteErrorComponent: () => import('./components/CustomErrorBoundary'),
     *   routes: [
     *     {
     *       name: 'home',
     *       path: '/',
     *       page: './pages/Home',
     *       // errors 为空时，将使用 defaultRouteErrorComponent
     *     },
     *   ],
     * },
     * ```
     */
    defaultRouteErrorComponent?: ComponentImport;
    /**
     * 默认路由加载组件
     *
     * 当路由配置中的 `loading` 为空时，将使用此组件作为加载指示器。
     * 如果不提供，将使用 antd 的 `Spin` 组件。
     *
     * 组件必须使用默认导出（export default）。
     *
     * @example
     * ```typescript
     * router: {
     *   defaultRouteLoadingComponent: () => import('./components/CustomLoading'),
     *   routes: [
     *     {
     *       name: 'home',
     *       path: '/',
     *       page: './pages/Home',
     *       // loading 为空时，将使用 defaultRouteLoadingComponent
     *     },
     *   ],
     * },
     * ```
     */
    defaultRouteLoadingComponent?: ComponentImport;
}
//# sourceMappingURL=types.d.ts.map