global.d.ts 2.6 KB
import type {
  ComponentPublicInstance,
  ComponentRenderProxy,
  FunctionalComponent,
  VNode,
  VNodeChild,
  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

  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>
  type ReadonlyRecordable<T> = Readonly<Record<string, T>>
  type Indexable<T> = Record<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_GLOB_USE_MOCK: boolean
    VITE_USE_PWA: boolean
    VITE_GLOB_PUBLIC_PATH: string
    VITE_PROXY: [string, string][]
    VITE_GLOB_APP_TITLE: string
    VITE_GLOB_APP_SHORT_NAME: string
    VITE_USE_CDN: boolean
    VITE_GLOB_DROP_CONSOLE: boolean
    VITE_GLOB_BUILD_COMPRESS: 'gzip' | 'brotli' | 'none'
    VITE_GLOB_BUILD_COMPRESS_DELETE_ORIGIN_FILE: boolean
    VITE_LEGACY: boolean
    VITE_GLOB_USE_IMAGEMIN: boolean
    VITE_GENERATE_UI: string
    VITE_GLOB_CONTENT_SECURITY_POLICY: boolean
    VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME: number
    VITE_GLOB_ALARM_NOTIFY_DURATION: number
  }

  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
    }

    type IntrinsicElements = Record<string, any>
    type IntrinsicAttributes = Record<string, any>
  }

  type AwaitToResult<T> = Awaited<ReturnType<T>>
}

declare module 'vue' {
  export type JSXComponent<Props = any> =
    | { new(): ComponentPublicInstance<Props> }
    | FunctionalComponent<Props>
}