import * as vue3 from "vue";
import { Component, PropType } from "vue";
import * as vue_router0 from "vue-router";
import { RouteRecordName, RouteRecordRaw, RouterOptions } from "vue-router";
import * as pinia1 from "pinia";

//#region src/types.d.ts
type IVrxArcoCheckPermission = (permission: any, data: any) => boolean;
interface IVrxArcoRouter {
  /**
   * 静态路由部分
   */
  routes: Readonly<RouteRecordRaw[]>;
  /**
   * 自定义路由创建参数
   * ```ts
   * createRouter({...options})
   * ```
   */
  options?: Omit<Partial<RouterOptions>, 'routes'>;
  /**
   * 动态路由部分
   */
  dynamicRoutes?: RouteRecordRaw[];
  /**
   * 根据从远程获取的权限，筛选每个路由
   * @param route
   * @param permission
   */
  filterDynamicRoutes?: (route: RouteRecordRaw, permission: any) => boolean;
  /**
   * 登陆过期重定向路由 name
   */
  loginExpiredRedirect: string;
  /**
   * 未登陆时 路由通过 name 白名单
   */
  whiteList?: string[];
  /**
   *  页面未找到 路由
   */
  pageNotFound: Omit<RouteRecordRaw, 'path'>;
}
interface IVrxArcAuthentication {
  /**
   * 判断是否已登陆
   */
  isLogin?: () => boolean | Promise<boolean>;
  /**
   * 登陆过期回调
   * 从远程获取权限报错，也会触发该方法
   */
  onLoginExpired?: () => any;
  /**
   * 从远程获取权限
   */
  getPermission?: () => Promise<any> | any;
  /**
   * 用于自定义局部鉴权
   */
  checkPermission?: IVrxArcoCheckPermission;
}
interface IVrxArcoApp {
  /**
   * 根组件
   */
  rootComponent: Component;
  /**
   * 根组件 props
   */
  rootProps?: Record<string, any>;
  /**
   * 渲染根节点
   */
  rootContainer: Element | string;
  /**
   * 路由配置
   */
  router: IVrxArcoRouter;
  /**
   *  路由遍历前后，添加加载状态控制
   * @param value
   */
  loading?: (value: boolean) => any;
  authentication?: IVrxArcAuthentication;
  /**
   * 是否立即初始化 vue app
   *
   * 设置为 false 可以取消默认的 vue app 初始化行为
   * @default true
   */
  immediate?: boolean;
}
//#endregion
//#region src/pinia/usePermissionStore.d.ts
declare const usePermissionStore: pinia1.StoreDefinition<"vrx-permission", {
  dynamicRoutesName: RouteRecordName[];
  dynamicRoutes: RouteRecordRaw[];
  permission: any;
}, {}, {
  setDynamicRoutesName(routesName: Set<RouteRecordName>): void;
}>;
//#endregion
//#region src/permission/component.d.ts
declare const Permission: vue3.DefineComponent<vue3.ExtractPropTypes<{
  data: PropType<any>;
  destroyOnNoPermission: {
    type: BooleanConstructor;
    default: boolean;
  };
}>, () => any[] | undefined, {}, {}, {}, vue3.ComponentOptionsMixin, vue3.ComponentOptionsMixin, {}, string, vue3.PublicProps, Readonly<vue3.ExtractPropTypes<{
  data: PropType<any>;
  destroyOnNoPermission: {
    type: BooleanConstructor;
    default: boolean;
  };
}>> & Readonly<{}>, {
  destroyOnNoPermission: boolean;
}, {}, {}, {}, string, vue3.ComponentProvideOptions, true, {}, any>;
//#endregion
//#region src/index.d.ts
declare const createVrxArcoApp: (options: IVrxArcoApp) => {
  app: vue3.App<Element>;
  router: vue_router0.Router;
  pinia: pinia1.Pinia;
  mount: () => Promise<vue3.ComponentPublicInstance<{}, {}, {}, {}, {}, {}, {}, {}, false, vue3.ComponentOptionsBase<any, any, any, any, any, any, any, any, any, {}, {}, string, {}, {}, {}, string, vue3.ComponentProvideOptions>, {}, {}, "", {}, any>>;
};
//#endregion
export { IVrxArcAuthentication, IVrxArcoApp, IVrxArcoCheckPermission, IVrxArcoRouter, Permission, createVrxArcoApp, usePermissionStore };