import { App, InjectionKey } from 'vue';
import { Router, RouteRecordName, RouteMeta } from 'vue-router';
import { ProjectSchema, PageFile, BlockFile, Service, BlockSchema, NodeFromPlugin, GlobalConfig, I18nConfig, EnvConfig, Base } from '@vtj/core';
import { ContextMode } from '../constants';
import { CreateRendererOptions } from '../render';
import { ProvideAdapter } from './defaults';
import { InitGlobalsOptions } from './globals';
import { MenuDataItem } from '@vtj/ui';
import { Context } from '..';
export declare const providerKey: InjectionKey<Provider>;
export interface ProviderOptions {
    service: Service;
    project?: Partial<ProjectSchema>;
    modules?: Record<string, () => Promise<any>>;
    mode?: ContextMode;
    adapter?: Partial<ProvideAdapter>;
    router?: Router;
    dependencies?: Record<string, () => Promise<any>>;
    materials?: Record<string, () => Promise<any>>;
    libraryOptions?: Record<string, any>;
    globals?: Record<string, any>;
    materialPath?: string;
    nodeEnv?: NodeEnv;
    install?: (app: App) => void;
    routeAppendTo?: RouteRecordName;
    pageRouteName?: string;
    routeMeta?: RouteMeta;
    enhance?: (app: App, provider: Provider) => void;
    vtjDir?: string;
    vtjRawDir?: string;
    enableStaticRoute?: boolean;
}
export declare enum NodeEnv {
    Production = "production",
    Development = "development"
}
/**
 * Provider 类是应用的核心提供者，负责:
 * - 管理项目配置和状态
 * - 加载依赖和资源
 * - 初始化路由
 * - 提供全局API和服务
 */
export declare class Provider extends Base {
    options: ProviderOptions;
    mode: ContextMode;
    globals: Record<string, any>;
    modules: Record<string, () => Promise<any>>;
    adapter: ProvideAdapter;
    apis: Record<string, (...args: any[]) => Promise<any>>;
    dependencies: Record<string, () => Promise<any>>;
    materials: Record<string, () => Promise<any>>;
    library: Record<string, any>;
    libraryLocales: Record<string, any>;
    libraryLocaleMap: Record<string, string>;
    service: Service;
    project: ProjectSchema | null;
    components: Record<string, any>;
    nodeEnv: NodeEnv;
    env: Record<string, string>;
    private router;
    private materialPath;
    private urlDslCaches;
    errorHandler: ((err: any) => void) | null;
    /**
     * 创建Provider实例
     * @param options 配置选项
     */
    constructor(options: ProviderOptions);
    createMock(func: (...args: any) => any): (...args: any[]) => Promise<any>;
    /**
     * 加载项目配置并初始化
     * 1. 从模块或服务加载项目配置
     * 2. 根据运行模式加载依赖或资源
     * 3. 初始化Mock数据
     * 4. 创建API接口
     * 5. 初始化路由(非uniapp平台)
     * @param project 项目配置
     */
    load(project: ProjectSchema): Promise<void>;
    initMock(global?: any): void;
    private loadDependencies;
    private loadAssets;
    private initRouter;
    private setErrorHandler;
    /**
     * Vue 插件安装方法
     * 1. 安装所有第三方库插件
     * 2. 执行自定义安装函数(如果提供)
     * 3. 安装访问适配器
     * 4. 提供全局 Provider 实例
     * 5. 设计模式下设置错误处理器
     * 6. 执行增强函数(如果提供)
     * @param app Vue 应用实例
     */
    install(app: App): void;
    getFile(id: string): PageFile | BlockFile | null;
    getPage(id: string): PageFile | null;
    getFirstPage(): PageFile | null;
    getMenus(name?: string, prefix?: string): MenuDataItem[];
    getHomepage(): PageFile | null;
    getDsl(id: string): Promise<BlockSchema | null>;
    getDslByUrl(url: string): Promise<BlockSchema | null>;
    /**
     * 创建 DSL 渲染器
     * 1. 合并默认选项和自定义选项
     * 2. 创建 DSL 加载器
     * 3. 返回渲染器实例
     * @param dsl 区块 DSL 配置
     * @param opts 渲染选项
     * @returns 渲染器实例
     */
    createDslRenderer(dsl: BlockSchema, opts?: Partial<CreateRendererOptions>): {
        renderer: any;
        context: Context;
    };
    /**
     * 获取渲染组件
     * 1. 根据ID查找文件(页面或区块)
     * 2. 如果找到文件且提供了output回调，则调用它
     * 3. 尝试从模块缓存加载原始Vue组件
     * 4. 如果找不到原始组件，则获取DSL并创建渲染器
     * @param id 文件ID
     * @param output 找到文件时的回调函数
     * @returns Promise<Vue组件>
     */
    getRenderComponent(id: string, output?: (file: BlockFile | PageFile) => void): Promise<any>;
    /**
     * 定义基于URL的异步组件
     * 1. 根据URL获取DSL配置
     * 2. 如果获取成功，设置组件名称
     * 3. 创建并返回DSL渲染器
     * @param url DSL配置URL
     * @param name 可选的自定义组件名称
     * @returns Vue异步组件
     */
    defineUrlSchemaComponent(url: string, name?: string): any;
    /**
     * 定义基于插件的异步组件
     * 1. 根据插件来源获取插件实例
     * 2. 返回插件组件
     * @param from 插件来源配置
     * @returns Vue异步组件
     */
    definePluginComponent(from: NodeFromPlugin): any;
    /**
     * 设置应用全局
     * @param css
     * @param win
     */
    initGlobals(globals: GlobalConfig, options: Partial<InitGlobalsOptions>): void;
    initI18n(app: App, libs: Record<string, any>, i18n?: I18nConfig): void;
    initEnv(envConfig?: EnvConfig[]): void;
}
/**
 * 创建 Provider 实例
 * @param options Provider 配置选项
 * @returns 包含 provider 实例和 onReady 回调的对象
 */
export declare function createProvider(options: ProviderOptions): {
    provider: Provider;
    onReady: (callback: () => void) => void;
};
export interface UseProviderOptions {
    id?: string;
    version?: string;
}
/**
 * 在组件中使用 Provider 实例
 * 1. 从Vue上下文中获取注入的Provider
 * 2. 开发环境下检查组件版本一致性
 * @param options 使用选项
 * @returns Provider 实例
 * @throws 如果找不到Provider会抛出错误
 */
export declare function useProvider(options?: UseProviderOptions): Provider;
