import type { RouterConfig, RouteConfig } from '../types';
/**
 * 路径验证配置
 */
export interface PathValidationConfig {
    /**
     * 是否启用路径验证（默认 true）
     */
    enablePathValidation?: boolean;
    /**
     * 允许的路径前缀列表
     * 例如：['@/pages', '@/components', './pages']
     */
    allowedPathPrefixes?: string[];
    /**
     * 最大路径长度（默认 500）
     */
    maxPathLength?: number;
    /**
     * 是否允许绝对路径（默认 false）
     */
    allowAbsolutePaths?: boolean;
}
/**
 * 转换性能配置
 */
export interface TransformPerformanceConfig {
    /**
     * 是否启用缓存（默认 true）
     */
    enableCache?: boolean;
    /**
     * 缓存过期时间（毫秒，默认 5 分钟）
     */
    cacheTTL?: number;
    /**
     * 最大缓存数量（默认 50，LRU 缓存）
     */
    maxCacheSize?: number;
    /**
     * 最大递归深度（默认 100）
     */
    maxRecursionDepth?: number;
    /**
     * 是否启用并行处理（默认 true）
     */
    enableParallelProcessing?: boolean;
    /**
     * 并行处理批次大小（默认 10）
     */
    parallelBatchSize?: number;
}
/**
 * 转换配置选项
 */
export interface TransformOptions {
    /**
     * 路径验证配置
     */
    pathValidation?: PathValidationConfig;
    /**
     * 性能配置
     */
    performance?: TransformPerformanceConfig;
    /**
     * 是否启用调试日志（默认 false）
     */
    enableDebugLog?: boolean;
}
/**
 * 转换后的路由项
 *
 * 与 RouteConfig 的区别：
 * - `page`、`layout`、`errors`、`loading` 字段的值是对应 Map 中的动态导入函数，而不是路径字符串
 * - 这些字段可以直接用于动态加载组件，无需再次查找 Map
 * - 所有组件路径字符串都已转换为对应的动态导入函数
 *
 * @example
 * ```typescript
 * const transformedRoute: TransformedRoute = {
 *   name: 'home',
 *   path: '/',
 *   page: () => import('@/pages/home.tsx'),  // 动态导入函数
 *   handle: { title: '首页', order: 1 },
 * };
 *
 * // 使用动态导入函数加载组件
 * if (transformedRoute.page) {
 *   const pageModule = await transformedRoute.page();
 *   const PageComponent = pageModule?.default;
 * }
 * ```
 */
export interface TransformedRoute {
    /**
     * 页面组件的动态导入函数
     *
     * 如果路由配置中指定了 `page` 路径，则此字段为对应的动态导入函数
     * 如果未指定或为 null，则此字段为 null
     *
     * 调用此函数会返回一个 Promise，resolve 后的值为组件模块对象
     * 组件必须使用默认导出（export default）
     */
    page?: (() => Promise<any>) | null;
    /**
     * 布局组件的动态导入函数
     *
     * 如果路由配置中指定了 `layout` 路径，则此字段为对应的动态导入函数
     * 如果未指定或为 null，则此字段为 null
     *
     * 调用此函数会返回一个 Promise，resolve 后的值为组件模块对象
     * 组件必须使用默认导出（export default）
     */
    layout?: (() => Promise<any>) | null;
    /**
     * 错误组件的动态导入函数
     *
     * 如果路由配置中指定了 `errors` 路径，则此字段为对应的动态导入函数
     * 如果未指定或为 null，则此字段为 null
     *
     * 调用此函数会返回一个 Promise，resolve 后的值为组件模块对象
     * 组件必须使用默认导出（export default）
     */
    errors?: (() => Promise<any>) | null;
    /**
     * 加载组件的动态导入函数
     *
     * 如果路由配置中指定了 `loading` 路径，则此字段为对应的动态导入函数
     * 如果未指定或为 null，则此字段为 null
     *
     * 调用此函数会返回一个 Promise，resolve 后的值为组件模块对象
     * 组件必须使用默认导出（export default）
     */
    loading?: (() => Promise<any>) | null;
    /**
     * 路由名称（唯一标识）
     *
     * 用于标识路由的唯一名称，通常用于路由导航和权限控制
     */
    name: string;
    /**
     * 路由路径
     *
     * URL 路径，例如：'/'、'/about'、'/user/:id'
     * 如果路由是路由组（isGroup: true），则可能为 undefined
     */
    path: string | undefined;
    /**
     * 是否为路由组
     *
     * 路由组用于组织子路由，本身不匹配任何路径
     * 路由组的 path 通常为 undefined
     */
    isGroup?: boolean;
    /**
     * 是否启用重定向
     *
     * 如果为 true，表示此路由用于重定向到其他路由
     */
    enableRedirection?: boolean;
    /**
     * 路由元数据
     *
     * 包含路由的标题、图标、排序、权限等信息
     * 用于菜单生成、权限控制、SEO 等场景
     */
    handle: {
        /**
         * 路由标题
         */
        title: string;
        /**
         * 国际化键名
         * 如果提供，会使用 i18n 系统进行翻译
         */
        i18nKey?: string;
        /**
         * 排序值
         * 用于菜单排序，数值越小越靠前
         */
        order: number;
        /**
         * 图标名称或路径
         */
        icon?: string;
        /**
         * 是否在菜单中隐藏
         */
        hideInMenu?: boolean;
        /**
         * 是否隐藏页脚
         */
        hideFooter?: boolean;
        /**
         * 是否启用 KeepAlive 缓存
         */
        keepAlive?: boolean;
        /**
         * 是否需要登录
         */
        needLogin?: boolean;
        /**
         * 允许访问的角色列表
         */
        roles?: Array<string>;
        /**
         * 路由名称（与 name 字段相同，用于兼容）
         */
        name?: string;
        /**
         * 其他自定义元数据
         */
        [key: string]: unknown;
    };
    /**
     * 子路由配置
     *
     * 如果路由有子路由，则此字段包含转换后的子路由列表
     * 子路由会继承父路由的某些配置（如 layout）
     */
    children?: TransformedRoute[];
}
/**
 * 路由转换结果
 *
 * 包含所有提取的组件路径 Map 和原始路由配置列表
 *
 * @example
 * ```typescript
 * const result: TransformRoutesResult = {
 *   pages: new Map([
 *     ['@/pages/home.tsx', () => import('@/pages/home.tsx')],
 *     ['@/pages/about.tsx', () => import('@/pages/about.tsx')],
 *   ]),
 *   layouts: new Map([
 *     ['@/layouts/MainLayout.tsx', () => import('@/layouts/MainLayout.tsx')],
 *   ]),
 *   errors: new Map(),
 *   loadings: new Map(),
 *   routes: [], // 原始路由配置列表
 * };
 * ```
 */
export interface TransformRoutesResult {
    /**
     * 页面组件路径 Map
     *
     * key: 组件路径字符串（如 '@/pages/home.tsx'）
     * value: 动态导入函数，调用后返回 Promise，resolve 后的值为组件模块对象
     *
     * 用于存储所有路由配置中出现的页面组件路径
     * 相同的路径只会存储一次，避免重复创建动态导入函数
     */
    pages: Map<string, () => Promise<any>>;
    /**
     * 布局组件路径 Map
     *
     * key: 组件路径字符串（如 '@/layouts/MainLayout.tsx'）
     * value: 动态导入函数，调用后返回 Promise，resolve 后的值为组件模块对象
     *
     * 用于存储所有路由配置中出现的布局组件路径
     * 相同的路径只会存储一次，避免重复创建动态导入函数
     */
    layouts: Map<string, () => Promise<any>>;
    /**
     * 错误组件路径 Map
     *
     * key: 组件路径字符串（如 '@/components/ErrorBoundary.tsx'）
     * value: 动态导入函数，调用后返回 Promise，resolve 后的值为组件模块对象
     *
     * 用于存储所有路由配置中出现的错误组件路径
     * 相同的路径只会存储一次，避免重复创建动态导入函数
     */
    errors: Map<string, () => Promise<any>>;
    /**
     * 加载组件路径 Map
     *
     * key: 组件路径字符串（如 '@/components/Loading.tsx'）
     * value: 动态导入函数，调用后返回 Promise，resolve 后的值为组件模块对象
     *
     * 用于存储所有路由配置中出现的加载组件路径
     * 相同的路径只会存储一次，避免重复创建动态导入函数
     */
    loadings: Map<string, () => Promise<any>>;
    routes: RouteConfig[];
}
/**
 * 转换路由配置：提取组件路径到 Map 中，返回原始路由配置
 *
 * 此函数是路由转换的核心函数，主要完成以下任务：
 * 1. 递归提取路由配置中的所有组件路径（page、layout、errors、loading）
 * 2. 将组件路径字符串转换为动态导入函数
 * 3. 将动态导入函数存储在对应的 Map 中，key 为路径字符串，确保不重复
 * 4. 返回原始路由配置列表，不进行转换
 *
 * @param routes - 路由配置列表，可以是：
 *   - 路由配置数组（RouteConfig[]）
 *   - 返回路由配置数组的异步函数（() => Promise<RouteConfig[]>）
 *   支持异步函数是为了支持动态加载路由配置（如从服务器获取）
 * @param options - 转换配置选项
 * @returns 包含以下内容的结果对象：
 *   - `pages`: 页面组件路径到动态导入函数的 Map
 *   - `layouts`: 布局组件路径到动态导入函数的 Map
 *   - `errors`: 错误组件路径到动态导入函数的 Map
 *   - `loadings`: 加载组件路径到动态导入函数的 Map
 *   - `routes`: 原始路由配置列表，不进行转换
 *
 * @remarks
 * - 如果 `routes` 为 null、undefined 或空数组，返回空结果对象
 * - 如果 `routes` 是函数但返回的不是数组，返回空结果对象
 * - 相同的组件路径只会创建一个动态导入函数，存储在 Map 中复用
 * - 路由配置保持原始格式，组件路径仍为字符串
 * - 支持嵌套路由，会递归处理所有层级的子路由
 * - 支持缓存，相同配置会直接返回缓存结果
 *
 * @example
 * ```typescript
 * // 示例 1: 使用数组配置
 * const result = await transformRoutes([
 *   {
 *     name: 'home',
 *     path: '/',
 *     page: '@/pages/home.tsx',
 *     errors: '@/pages/error.tsx',
 *     handle: { title: '首页', order: 1 },
 *   },
 * ]);
 *
 * // 示例 2: 使用异步函数配置
 * const result = await transformRoutes(async () => {
 *   const response = await fetch('/api/routes');
 *   return response.json();
 * });
 *
 * // 示例 3: 使用配置选项
 * const result = await transformRoutes(routes, {
 *   pathValidation: {
 *     enablePathValidation: true,
 *     allowedPathPrefixes: ['@/pages', '@/components'],
 *   },
 *   performance: {
 *     enableCache: true,
 *     cacheTTL: 10 * 60 * 1000, // 10 分钟
 *   },
 * });
 * ```
 */
export declare function transformRoutes(routes: RouterConfig['routes'], options?: TransformOptions): Promise<TransformRoutesResult>;
//# sourceMappingURL=transform.d.ts.map