import type { ComponentRenderProxy, VNode, VNodeChild, ComponentPublicInstance, FunctionalComponent, PropType as VuePropType } from 'vue';



declare global {

  const __APP_INFO__: {

    pkg: {

      name: string;

      version: string;

      dependencies: Recordable<string>;

      devDependencies: Recordable<string>;

    };

    lastBuildTime: string;

  };

  // declare interface Window {

  //   // Global vue app instance

  //   __APP__: App<Element>;

  // }



  // vue

  declare type PropType<T> = VuePropType<T>;

  declare type VueNode = VNodeChild | JSX.Element | JSX.IntrinsicElements;



  export type Writable<T> = {

    -readonly [P in keyof T]: T[P];

  };



  declare type Nullable<T> = T | null;

  declare type NonNullable<T> = T extends null | undefined ? never : T;

  declare type Recordable<T = any> = Record<string, T>;

  declare type ReadonlyRecordable<T = any> = {

    readonly [key: string]: T;

  };

  declare type Indexable<T = any> = {

    [key: string]: T;

  };

  declare type DeepPartial<T> = {

    [P in keyof T]?: DeepPartial<T[P]>;

  };

  declare type TimeoutHandle = ReturnType<typeof setTimeout>;

  declare type IntervalHandle = ReturnType<typeof setInterval>;



  declare interface ChangeEvent extends Event {

    target: HTMLInputElement;

  }



  declare interface WheelEvent {

    path?: EventTarget[];

  }

  interface ImportMetaEnv extends ViteEnv {

    __: unknown;

  }



  declare interface ViteEnv {

    VITE_PORT: number;

    VITE_USE_MOCK: boolean;

    VITE_PUBLIC_PATH: string;

    VITE_PROXY: [string, string][];

    VITE_GLOB_APP_TITLE: string;

    VITE_GLOB_APP_SHORT_NAME: string;

    VITE_USE_CDN: boolean;

    VITE_BUILD_COMPRESS: 'gzip' | 'brotli' | 'none';

    VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE: boolean;

    // 【JEECG作为乾坤子应用】乾坤子应用名,主应用注册时AppName需保持一致

    VITE_GLOB_QIANKUN_MICRO_APP_NAME?: string;

    // 【JEECG作为乾坤子应用】非必填,需与qiankun主应用注册子应用时填写的 entry 保持一致

    VITE_GLOB_QIANKUN_MICRO_APP_ENTRY?: string;

    // 当前运行在什么平台

    VITE_GLOB_RUN_PLATFORM?: 'web' | 'electron';

  }



  declare function parseInt(s: string | number, radix?: number): number;



  declare function parseFloat(string: string | number): number;



  namespace JSX {

    // tslint:disable no-empty-interface

    type Element = VNode;

    // tslint:disable no-empty-interface

    type ElementClass = ComponentRenderProxy;

    interface ElementAttributesProperty {

      $props: any;

    }

    interface IntrinsicElements {

      [elem: string]: any;

    }

    interface IntrinsicAttributes {

      [elem: string]: any;

    }

  }

}



declare module 'vue' {

  export type JSXComponent<Props = any> = { new (): ComponentPublicInstance<Props> } | FunctionalComponent<Props>;

}