import * as vue from 'vue';
import { ComponentPublicInstance, ComponentCustomProperties, ComponentInternalInstance, App, Component, Slots, ref, reactive, computed, watch, toRefs, toValue, toRaw, shallowRef, shallowReactive, markRaw, onMounted, onUnmounted, nextTick, onUpdated, AsyncComponentLoader, ComponentOptions, DefineComponent, AsyncComponentOptions, Directive, h, render, VNode } from 'vue';
import { Router, RouteLocationNormalizedLoadedGeneric } from 'vue-router';
import { Message, LoadingOptions } from 'element-plus';
import * as mitt from 'mitt';
import { AxiosInstance } from 'axios';

export type CompInstanceType = ComponentPublicInstance & Record<string, any> | null
export type GlobalPropertiesType = ComponentCustomProperties & Record<string, any>
export type AppRouterType = Router | undefined
export type AppRouteType = RouteLocationNormalizedLoadedGeneric | undefined
export type ElMessageType = Message | undefined
export type ElLoadingType = ((options?: LoadingOptions) => any) | undefined

export interface CurrentInstanceType {
    instance: ComponentInternalInstance,
    app: App,
    globalProperties: ComponentCustomProperties & Record<string, any>,
    proxy: CompInstanceType
}

export type ObjectType = {
    [key: string | number | symbol]: any
}

export type CompPropsType = ObjectType
export type CompStylesType = ObjectType

export type CompType = 
    | 'page' 
    | 'container' 
    | 'layout' 
    | 'component'

export type protocolType =
    | 'http' 
    | 'https'
    | 'ws'

export type MethodType =
    | 'get' | 'GET'
    | 'delete' | 'DELETE'
    | 'head' | 'HEAD'
    | 'options' | 'OPTIONS'
    | 'post' | 'POST'
    | 'put' | 'PUT'
    | 'patch' | 'PATCH'
    | 'purge' | 'PURGE'
    | 'link' | 'LINK'
    | 'unlink' | 'UNLINK'

export type ResponseType =
    | 'arraybuffer'
    | 'blob'
    | 'document'
    | 'json'
    | 'text'
    | 'stream'

export type ContentType = 
    | 'application/json'
    | 'multipart/form-data' 
    | 'application/x-www-form-urlencoded' 
    | 'application/octet-stream' 
    | 'text/plain' 
    | 'text/html' 
    | 'text/xml'

export interface CompBaseType {
    component: string,
    version: string,
    type: CompType,
    name: string, 
    id: string
}

export type EventType = 
    | 'onSetup'
    | 'onBeforeMount'
    | 'onMounted' 
    | 'onBeforeUnmount' 
    | 'onUnmounted' 
    | 'onBeforeUpdate' 
    | 'onUpdated' 
    | 'onActivated'
    | 'onDeactivated'
    | 'onClick'
    | 'onDblClick'
    | 'onContextMenu'
    | 'onMouseOver'
    | 'onMouseOut'
    | 'onMouseEnter'
    | 'onMouseLeave'
    | 'onMouseMove'
    | 'other'

export interface CompEventsType {
    type: EventType
    value: string | null
}

export interface DataFilterType {
    enabled: boolean,
    value: string | null
}

export interface CompDataSourceType {
    dsName?: string,
    type?: 'static' | 'dynamic',
    data?: string | null
    id?: string | null,
    protocol?: protocolType | null,
    hostPort?: string | null,
    url?: string | null,
    abUrl?: boolean,
    method?: MethodType | null,
    params?: string | null,
    headers?: string | null,
    contentType?: ContentType | null,
    timeout?: number | null,
    serializeParams?: boolean | null,
    dataFilter?: DataFilterType | null,
    responseType?: ResponseType | null
}

export interface RouteMetaType {
    title: string,
    useTitle: boolean,
    [key: string | number | symbol]: unknown
}

export interface CompNodeType extends CompBaseType {
    compId: string,
    isVisible: boolean,
    isRender: boolean,
    isRename?: boolean,
    properties?: CompPropsType,
    styles?: CompStylesType,
    events?: CompEventsType[],
    dataSource?: CompDataSourceType[],
    children: CompNodeType[]
}

export interface RouteRecordType {
    path: string,
    name: string,
    meta: RouteMetaType
}

export interface PagesType extends RouteRecordType {
    componentTree: CompNodeType[]
}

export interface AppSchemaType {
    version: string,
    id: string,
    name: string,
    plugins: ObjectType[],
    themes: string,
    pages: Record<string, PagesType>
}

export interface CompRefPropsType {
    name: string,
    compId: string,
    version: string,
    properties: CompPropsType,
    styles: CompStylesType,
    events: CompEventsType[],
    dataSource: CompDataSourceType[],
    fn?: Function
}

/**
 * 引擎内置的组件数据源请求库
 * @description ⚠️ 基于 `Promise` 的 `HTTP` 网络请求库，`useDataSourceRequest` 函数仅限在开发组件模式中接入数据源调用。
 * @param dsConfig 数据源配置项
 * @param customParams 自定义请求参数
 * @returns 返回一个任何值的 `Promise`
*/
declare function useDataSourceRequest(dsConfig: CompDataSourceType, customParams?: Record<string, any>): Promise<any>;

/**
 * @author: zzh
 * @description: KLWeb-App ElDialog Hooks，支持 Service 方式。
*/

export type DefineAttrsType = {
    /**
     * 是否显示 Dialog
     * @default false
    */
    modelValue?: boolean;
    /**
     * Dialog 对话框的标题，也可通过具名 `slot` 传入
     * @default 'Dialog Title'
    */
    title?: string;
    /**
     * 对话框的宽度
     * @default '600px'
    */
    width?: string | number;
    /**
     * 对话框内容插槽组件。当使用 `service` 方式时，如 `contentModule` 为一个 `defineAsyncComponent` 定义的异步组件，则需要结合 `targetFlag` 声明该组件名。
     * @default —
    */
    contentModule?: Component;
    /**
     * 对话框内容插槽组件绑定属性对象
     * @default —
    */
    contentAttrs?: Record<string, any>;
    /**
     * 对话框扩展插槽 `header`、`title`、`footer`（此属性只对 `service` 方式有效）
     * @default —
    */
    slots?: Slots;
    /**
     * 对话框是否支持鼠标拖拽调节大小
     * @default false
    */
    isResize?: boolean;
    /**
     * 对话框附加标识，主要区分不同业务 `Dialog`，显示或关闭 `Dialog` 返回 `targetFlag` 的值
     * @default —
    */
    targetFlag?: string | number;
    /**
     * 对话框互斥标识，仅互斥其它带有相同标识的 `Dialog`
     * @default —
    */
    mutexFlag?: string;
    /**
     * 是否显示 Dialog Header
     * @default true
    */
    showHeader?: boolean;
    /**
     * 是否需要遮罩层
     * @default true
    */
    modal?: boolean;
    /**
     * 遮罩层鼠标事件是否生效
     * @default true
    */
    modalEvent?: boolean;
    /**
     * 遮罩的自定义类名
     * @default —
    */
    modalClass?: string;
    /**
     * 对话框内容组件是否强制更新（此属性对 `service` 方式无效）
     * @default undefined
    */
    forceUpdateKey?: string | number;
    /**
     * 是否为全屏 Dialog
     * @default false
    */
    fullscreen?: boolean;
    /**
     * Dialog CSS 中的 `margin-top` 值
     * @default '15vh''
    */
    top?: string;
    /**
     * Dialog 自身是否插入至 `body` 元素上。嵌套的 Dialog 必须指定该属性并赋值为 `true`（此属性对 `service` 方式无效）
     * @default true
    */
    appendToBody?: boolean;
    /**
     * 是否在 Dialog 出现时将 `body` 滚动锁定
     * @default true
    */
    lockScroll?: boolean;
    /**
     * Dialog 打开的延时时间，单位毫秒
     * @default 0
    */
    openDelay?: number;
    /**
     * Dialog 关闭的延时时间，单位毫秒
     * @default 0
    */
    closeDelay?: number;
    /**
     * 是否可以通过点击 `modal` 关闭 Dialog (当 `modalEvent` 为 `false` 时无效)
     * @default true
    */
    closeOnClickModal?: boolean;
    /**
     * 是否可以通过按下 `ESC` 关闭 Dialog
     * @default true
    */
    closeOnPressEscape?: boolean;
    /**
     * 是否显示关闭按钮
     * @default true
    */
    showClose?: boolean;
    /**
     * 为 Dialog 启用可拖拽功能
     * @default true
    */
    draggable?: boolean;
    /**
     * 允许拖拽 Dialog 超出可视窗口区域界线（此属性只对 `service` 方式有效）
     * @default true
    */
    isDragOut?: boolean;
    /**
     * 允许拖拽 Dialog 超出可视窗口区域界线最低限制值（此属性只对 `service` 方式且 `isDragOut` 为 `true` 时有效）
     * @default 20
    */
    dragOutLimitValue?: number;
    /**
     * 是否让 Dialog 的 `header` 和 `footer` 部分居中排列
     * @default false
    */
    center?: boolean;
    /**
     * 是否水平垂直对齐对话框
     * @default false
    */
    alignCenter?: boolean;
    /**
     * 当关闭 Dialog 时，销毁其中的元素
     * @default true
    */
    destroyOnClose?: boolean;
    /**
     * 自定义关闭图标
     * @default `Close`
    */
    closeIcon?: string | Component;
    /**
    * Dialog 的自定义类名
    * @default —
   */
    class?: string;
    /**
    * Dialog 的自定义内联样式
    * @default —
   */
    style?: string | Record<string, any> | any[];
    /**
     * 和原生的 CSS 的 `z-index` 相同，改变 `z` 轴的顺序
     * @default —
    */
    zIndex?: number;
    /**
     * header 的 `aria-level` 属性
     * @default '2'
    */
    headerAriaLevel?: string;
};
export type CallbackType = {
    event?: string;
    targetFlag?: string | number;
    emitParams?: any;
};
export type Callback = (cb?: CallbackType) => void;
export interface ServicePropsType {
    dialogProps: DefineAttrsType | undefined | null;
    contentProps: Record<string, any> | undefined | null;
}
export type CacheServicePropsType = Record<string, ServicePropsType>;
export interface ServiceReturnType extends ServicePropsType {
    cacheServiceProps?: CacheServicePropsType;
    close?: (emitParams?: any) => void;
}
/**
 * @param attributes ElDialog 属性项
 * @see https://element-plus.gitee.io/zh-CN/component/dialog.html#attributes-1
 * @example
 * ```js
 * const __useDialog = new useDialog();
 * const { dialogAttrs, contentModule, contentAttrs } = __useDialog;
 * // 打开弹窗
 * __useDialog.show({
 *      title: '弹窗标题',
 *      width: 600,
 *      contentModule: '组件模块',
        contentAttrs: '绑定属性对象'
 * }, cb => { // Callback })
 * // 关闭弹窗
 * __useDialog.close(cb => {
 *      // Callback
 * })
 * ```
*/
declare class useDialog implements DefineAttrsType {
    defineAttrs: DefineAttrsType;
    dialogAttrs: DefineAttrsType;
    contentModule: Component;
    contentAttrs: Record<string, any>;
    forceUpdateKey: any;
    cacheServiceProps: CacheServicePropsType;
    constructor(attributes?: DefineAttrsType);
    /**
     * 显示弹窗
     * @param attributes ElDialog 属性项
     * @callback 回调函数
    */
    show(attributes?: DefineAttrsType, callback?: Callback): void;
    /**
     * 关闭弹窗
     * @callback 回调函数
    */
    close(callback?: Callback): void;
    /**
     * 服务式 Dialog（扩展能力）
     * @param attributes ElDialog 属性项
     * @returns 返回一个 `Promise`（当前的 Dialog Props Proxy 对象）
     * @callback 回调函数
    */
    service(attributes?: DefineAttrsType, callback?: Callback): Promise<ServiceReturnType>;
    setDialogExtraStyles(dialogAttrs: DefineAttrsType): void;
}

declare const eventBus: mitt.Emitter<Record<mitt.EventType, unknown>>;

declare const appSchema: vue.Ref<{
    version: string;
    id: string;
    name: string;
    plugins: ObjectType[];
    themes: string;
    pages: Record<string, PagesType>;
} | null, AppSchemaType | {
    version: string;
    id: string;
    name: string;
    plugins: ObjectType[];
    themes: string;
    pages: Record<string, PagesType>;
} | null>;
declare const compTree: vue.Ref<CompNodeType[] | undefined, CompNodeType[] | undefined>;
declare let appInstance: App;
/**
 * 暴露应用实例
 * @param app App 实例
 * @returns 无返回值
*/
declare function useExposeAppInstance(app: App): void;
/**
 * 获取应用实例底层元信息对象
 * @returns 返回 `App` 实例对象
*/
declare function useGetAppInstance(): App;
/**
 * 获取当前应用 `Schema` 响应式数据
 * @returns 返回一个 `AppSchemaType` 类型的 `Schema` 数据对象 或 `null`
*/
declare function useGetAppSchema(): AppSchemaType | null;
/**
 * 引擎内置的应用程序事件总线
 * @description 💡 引擎内置事件总线 `Event-bus`，它的核心原理是基于发布/订阅模式，提供简单的 `API`，使得开发者可以在应用程序中轻松地创建和管理事件。
 * @returns 返回一个事件总线实例对象
*/
declare function useEventBus(): typeof eventBus;
/**
 * 获取应用当前页面的组件树
 * @returns 返回应用当前页面的组件树或 `undefined`
*/
declare function useGetCompTree(): CompNodeType[] | undefined;
/**
 * 根据给定的路由 `path` 获取页面的组件树
 * @param path 当前路由路径
 * @returns 返回指定页面路径的组件树数组或一个空数组
*/
declare function useGetCompTreeByPath(path: string): CompNodeType[];
/**
 * 获取当前应用的路由实例对象
 * @returns 返回路由实例对象或 `undefined`
*/
declare function useGetAppRouter(): AppRouterType;
/**
 * 获取应用当前路由信息对象
 * @returns 返回当前路由信息对象或 `undefined`
*/
declare function useGetAppRoute(): AppRouteType;
/**
 * 注册一个应用全局属性对象，在其它组件实例内可直接调用
 * @param key 要注册的属性键名
 * @param target 被注册绑定对象, 接受一个泛型类型为 `T` 的参数
 * @returns 无返回值
*/
declare function useRegGlobalProperties<T>(key: string, target: T): void;
/**
 * 获取当前应用的全局属性对象
 * @returns 返回当前应用全局属性对象
*/
declare function useGetGlobalProperties(): GlobalPropertiesType;
/**
 * 接受一个内部值，返回一个响应式的、可更改的 `ref` 对象，此对象只有一个指向其内部值的属性 `.value`
 * @returns 返回一个 `ref` 函数
*/
declare function useRef(): typeof ref;
/**
 * 返回一个对象的响应式代理
 * @returns 返回一个 `reactive` 函数
*/
declare function useReactive(): typeof reactive;
/**
 * 计算属性，接受一个 `getter` 函数，返回一个只读的响应式 `ref` 对象
 * @description 💡 该 `ref` 通过 `.value` 暴露 `getter` 函数的返回值，它也可以接受一个带有 `get` 和 `set` 函数的对象来创建一个可写的 `ref` 对象。[了解更多](https://cn.vuejs.org/api/reactivity-core#computed)
 * @returns 返回一个 `computed` 函数
*/
declare function useComputed(): typeof computed;
/**
 * 侦听一个或多个响应式数据源，并在数据源变化时调用所给的回调函数
 * @description 💡 `watch()` 默认是懒侦听的，即仅在侦听源发生变化时才执行回调函数。[了解更多](https://cn.vuejs.org/api/reactivity-core#watch)
 * @returns 返回一个 `watch` 函数
*/
declare function useWatch(): typeof watch;
/**
 * 将一个响应式对象转换为一个普通对象，这个普通对象的每个属性都是指向源对象相应属性的 `ref`
 * @description 💡 每个单独的 ref 都是使用 `toRef()` 创建的。[了解更多](https://cn.vuejs.org/api/reactivity-utilities#torefs)
 * @returns 返回一个 `toRefs` 函数
*/
declare function useToRefs(): typeof toRefs;
/**
 * 将值、`refs` 或 `getters` 规范化为值
 * @description 💡 这与 `unref()` 类似，不同的是此函数也会规范化 `getter` 函数。如果参数是一个 `getter`，它将会被调用并且返回它的返回值。[了解更多](https://cn.vuejs.org/api/reactivity-utilities#tovalue)
 * @returns 返回一个 `toValue` 函数
*/
declare function useToValue(): typeof toValue;
/**
 * 根据一个 `Vue` 创建的代理返回其原始对象
 * @description 💡 `toRaw()` 可以返回由 `reactive()`、`readonly()`、`shallowReactive()` 或者 `shallowReadonly()` 创建的代理对应的原始对象。[了解更多](https://cn.vuejs.org/api/reactivity-advanced#toraw)
 * @returns 返回一个 `toRaw` 函数
*/
declare function useToRaw(): typeof toRaw;
/**
 * `ref()` 的浅层作用形式
 * @description 💡 `shallowRef()` 常常用于对大型数据结构的性能优化或是与外部的状态管理系统集成。[了解更多](https://cn.vuejs.org/api/reactivity-advanced#shallowref)
 * @returns 返回一个 `shallowRef` 函数
*/
declare function useShallowRef(): typeof shallowRef;
/**
 * `reactive()` 的浅层作用形式
 * @description 💡 和 `reactive()` 不同，这里没有深层级的转换：一个浅层响应式对象里只有根级别的属性是响应式的。[了解更多](https://cn.vuejs.org/api/reactivity-advanced#shallowreactive)
 * @returns 返回一个 `shallowReactive` 函数
*/
declare function useShallowReactive(): typeof shallowReactive;
/**
 * 将一个对象标记为不可被转为代理，返回该对象本身
 * @returns 返回一个 `markRaw` 函数
*/
declare function useMarkRaw(): typeof markRaw;
/**
 * 注册一个回调函数，在组件挂载完成后执行
 * @returns 返回一个 `onMounted` 函数
*/
declare function useOnMounted(): typeof onMounted;
/**
 * 注册一个回调函数，在组件实例被卸载之后调用
 * @returns 返回一个 `onUnmounted` 函数
*/
declare function useOnUnmounted(): typeof onUnmounted;
/**
 * 等待下一次 `DOM` 更新刷新的工具方法
 * @description 💡 `nextTick()` 可以在状态改变后立即使用，以等待 `DOM` 更新完成。
 * @returns 返回一个 `nextTick` 函数
*/
declare function useNextTick(): typeof nextTick;
/**
 * 注册一个回调函数，在组件因为响应式状态变更而更新其 `DOM` 树之后调用
 * @returns 返回一个 `onUpdated` 函数
*/
declare function useOnUpdated(): typeof onUpdated;
/**
 * 获取当前组件内部实例
 * @description ⚠️ 使用 `useGetCurrentInstance` 函数仅在组件 `setup` 或生命周期钩子函数内生效。
 * @returns 返回当前组件内部实例，包含： `instance`、`app`、`globalProperties`、`proxy`
*/
declare function useGetCurrentInstance(): CurrentInstanceType;
/**
 * 根据给定的组件 ID 外部获取组件实例
 * @description 💡 如一个组件使用了 `<script setup>` ，则默认是私有的，外部无法访问到该组件中的任何东西，除非该组件在其中通过 `defineExpose` 宏显式暴露。
 * @param compId 目标组件 `ID`
 * @param delay 延迟时间，默认：`0` 毫秒，由于组件树渲染的遍历机制，如目标组件未渲染完成，则无法获取到实例，可传入 `300` 毫秒或更大的毫秒数延迟获取
 * @returns 返回一个 `CompInstanceType` 类型的组件实例的 `Promise`
*/
declare function useGetCompRef(compId: string, delay?: number): Promise<CompInstanceType>;
/**
* 根据给定的组件 `ID` 获取组件实例响应属性（`props`）对象
* @description ️⚠️ 通过 `useGetCompRefProps` 函数获取到的组件属性对象（`props`）是响应式的，但修改 `props` 属性值仅是组件实例内部响应，并不会同步更新其对应的 `schema` 元数据，如需更新组件元数据可用 `useGetCompNode` 函数获取组件元数据进行更新。
* @param compId 目标组件 `ID`
* @param delay 延迟时间，默认：`0` 毫秒，由于组件树渲染的遍历机制，如目标组件未渲染完成，则无法获取到实例，可传入 `300` 毫秒或更大的毫秒数延迟获取
* @returns 返回一个 `CompRefPropsType` 类型的组件实例属性对象或无任何值的 `Promise`
*/
declare function useGetCompRefProps(compId: string, delay?: number): Promise<CompRefPropsType | void>;
/**
 * 根据给定的组件 `ID` 获取组件节点元数据响应对象
 * @param compId  目标组件 `ID`
 * @returns 返回一个 `CompNodeType` 类型的组件元数据或 `null`
*/
declare function useGetCompNode(compId: string): CompNodeType | null;
/**
 * 从组件树 `compTree` 中删除组件节点元数据，并返回该组件节点元数据对象
 * @param compId 目标组件 `ID`
 * @returns 返回一个 `CompNodeType` 类型的组件元数据或 `null`
*/
declare function useRemoveCompNode(compId: string): CompNodeType | null;
/**
 * 根据给定的组件 `ID` 重新渲染单文件组件实例。
 * @param compId 目标组件 `ID`
 * @returns 无返回值
*/
declare function useReloadCompNode(compId: string): void;
/**
 * 禁止渲染给定的组件 `ID` 的组件实例
 * @param compId 目标组件 `ID`
 * @returns 无返回值
*/
declare function useUnrenderCompNode(compId: string): void;
/**
 * 根据给定的组件名称解析模块对应的异步 `loader`
 * @param compName 组件名称
 * @returns 返回一个组件模块异步 `loader`，如：`() => import('/src/components/index.mjs')`，或返回 `null`
 */
declare function useResolveAsyncCompLoader(compName: string): AsyncComponentLoader | null;
/**
 * 定义一个局部组件
 * @param ComponentOptions 组件选项对象
 * @returns 返回该组件选项对象本身
 */
declare function useDefineComponent(component: ComponentOptions): DefineComponent;
/**
 * 定义一个异步组件，它在运行时是懒加载的
 * @param source 接受一个异步加载函数（如：`() => import('/src/components/index.mjs')`），或是对加载行为进行更具体定制的一个选项对象
 * @returns 返回一个 `Component` 类型的单文件组件（`SFC`）
 */
declare function useDefineAsyncComponent(source: AsyncComponentLoader | AsyncComponentOptions): Component;
/**
 * 注册应用全局性组件
 * @param compName 组件名称
 * @param source 接受一个 `Component` 类型的组件或一个异步组件 `loader`（如：`() => import('/src/components/index.mjs')`）
 * @returns 无返回值
 */
declare function useRegGlobalComponent(compName: string, source: Component | AsyncComponentLoader): void;
/**
 * 根据给定的名称解析已全局注册的组件
 * @description ⚠️ 使用 `useResolveComponent` 函数必须在 `setup()` 或渲染函数内调用。
 * @param compName 组件名称
 * @returns 返回一个 `Component` 类型的单文件组件（`SFC`），如未解析到则返回组件名字符串
 */
declare function useResolveComponent(compName: string): Component | string;
/**
 * 注册应用全局性指令
 * @param name 指令名称
 * @param directive 接受一个 `Directive` 类型的指令定义
 * @returns 无返回值
 */
declare function useRegGlobalDirective(name: string, directive: Directive): void;
/**
 * 根据给定的名称解析已全局注册的指令
 * @description ⚠️ 使用 `useResolveDirective` 函数必须在 `setup()` 或渲染函数内调用。
 * @param name 指令名称
 * @returns 返回一个 `Directive` 类型的指令，如未解析到则返回 `undefined`
 */
declare function useResolveDirective(name: string): Directive | undefined;
/**
 * 创建一个 `vnode` 虚拟节点的渲染函数
 * @description 💡 在开发 `JSX` / `TSX` 组件模式中，可通过 `useCreateVnode` 函数创建一个 `vnode` 虚拟节点渲染视图，其语法与 `Vue` 提供的 `h` 渲染函数一致。[了解更多](https://cn.vuejs.org/guide/extras/render-function.html)
 * @returns 返回一个 `h` 函数
 */
declare function useCreateVnode(): typeof h;
/**
 * 用于编程式地创建组件虚拟 `DOM` 树的函数
 * @description 💡 `render` 函数是字符串模板的一种替代，可以使你利用 `JavaScript` 的丰富表达力来完全编程式地声明组件最终的渲染输出。
 * @returns 返回一个 `render` 函数
 */
declare function useRender(): typeof render;
/**
 * 引擎内置的动态加载/渲染单文件组件（`SFC`）函数
 * @description 💡 在开发 `JSX` / `TSX` 组件模式中，通过 `useResolveVnode` 函数可将一个组件解析为一个 `vnode` 动态渲染，其语法与 `Vue` 提供的 `h` 渲染函数一致。[了解更多](https://cn.vuejs.org/guide/extras/render-function.html)
 * @param component 接受一个 `Component` 类型的单文件组件（`SFC`）或一个组件模块名字符串（如全局注册组件，则传入该组件的注册名）
 * @param props 属性
 * @param slots 插槽
 * @returns 返回一个 `vnode` 或 `null`
*/
declare function useResolveVnode(component: Component | string, props?: ObjectType, slots?: ObjectType): VNode | null;
/**
 * 注册组件生命周期钩子函数内的执行事件或鼠标事件
 * @description ⚠️ `useRegCompEvents` 函数仅限用于开发组件模式中，在 `setup` 内执行自动完成组件实例的事件注册。
 * @returns 无返回值
*/
declare function useRegCompEvents(): void;
/**
 * 引擎内置的通用 `HTTP` 请求库
 * @description ⚠️ `useRequest` 和 `useDataSourceRequest` 的区别：两者都是基于 `Axios` 封装，`useRequest` 函数可在开发组件模式和组装编排模式中调用，`useDataSourceRequest` 函数仅限在开发组件模式中接入数据源调用。[了解 Axios](https://axios-http.com/zh/)
 * @returns 返回一个 `Axios` 实例
*/
declare function useRequest(): AxiosInstance;
/**
 * 全局 `ElMessage` 消息提示，常用于主动操作后的反馈提示
 * @see https://element-plus.org/zh-CN/component/message.html
 * @returns 返回一个 `ElMessage` 实例
*/
declare function useMessage(): ElMessageType;
/**
 * 全局 `ElLoading` 数据加载状态动效
 * @see https://element-plus.org/zh-CN/component/loading.html
 * @returns 返回一个 `ElLoading` 实例
*/
declare function useLoading(): ElLoadingType;

export { appInstance, appSchema, compTree, useComputed, useCreateVnode, useDataSourceRequest, useDefineAsyncComponent, useDefineComponent, useDialog, useEventBus, useExposeAppInstance, useGetAppInstance, useGetAppRoute, useGetAppRouter, useGetAppSchema, useGetCompNode, useGetCompRef, useGetCompRefProps, useGetCompTree, useGetCompTreeByPath, useGetCurrentInstance, useGetGlobalProperties, useLoading, useMarkRaw, useMessage, useNextTick, useOnMounted, useOnUnmounted, useOnUpdated, useReactive, useRef, useRegCompEvents, useRegGlobalComponent, useRegGlobalDirective, useRegGlobalProperties, useReloadCompNode, useRemoveCompNode, useRender, useRequest, useResolveAsyncCompLoader, useResolveComponent, useResolveDirective, useResolveVnode, useShallowReactive, useShallowRef, useToRaw, useToRefs, useToValue, useUnrenderCompNode, useWatch };
