import { App, InjectionKey } from 'vue';
import { Router, RouteRecordName, RouteMeta } from 'vue-router';
import { ProjectSchema, PageFile, BlockFile, Service, BlockSchema, NodeFromPlugin, Base } from '@vtj/core';
import { ContextMode } from '../constants';
import { CreateRendererOptions } from '../render';
import { ProvideAdapter } from './defaults';
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>>;
    globals?: Record<string, any>;
    materialPath?: string;
    nodeEnv?: NodeEnv;
    install?: (app: App) => void;
    routeAppendTo?: RouteRecordName;
    pageRouteName?: string;
    routeMeta?: RouteMeta;
}
export declare enum NodeEnv {
    Production = "production",
    Development = "development"
}
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>;
    service: Service;
    project: ProjectSchema | null;
    components: Record<string, any>;
    nodeEnv: NodeEnv;
    private router;
    private materialPath;
    private urlDslCaches;
    constructor(options: ProviderOptions);
    createMock(func: (...args: any) => any): (...args: any[]) => Promise<any>;
    load(project: ProjectSchema): Promise<void>;
    initMock(global?: any): void;
    private loadDependencies;
    private loadAssets;
    private initRouter;
    install(app: App): void;
    getFile(id: string): PageFile | BlockFile | null;
    getPage(id: string): PageFile | null;
    getHomepage(): PageFile | null;
    getDsl(id: string): Promise<BlockSchema | null>;
    getDslByUrl(url: string): Promise<BlockSchema | null>;
    createDslRenderer(dsl: BlockSchema, opts?: Partial<CreateRendererOptions>): {
        renderer: any;
        context: Context;
    };
    getRenderComponent(id: string, output?: (file: BlockFile | PageFile) => void): Promise<any>;
    defineUrlSchemaComponent(url: string, name?: string): any;
    definePluginComponent(from: NodeFromPlugin): any;
}
export declare function createProvider(options: ProviderOptions): {
    provider: Provider;
    onReady: (callback: () => void) => void;
};
export interface UseProviderOptions {
    id?: string;
    version?: string;
}
export declare function useProvider(options?: UseProviderOptions): Provider;
