/// <reference types="vite/client" />

declare module '*.vue' {
  import type { DefineComponent } from 'vue'
  const component: DefineComponent<Record<string, unknown>, Record<string, unknown>, unknown>
  export default component
}

// Vue-facing-decorator type declarations
declare module 'vue-facing-decorator' {
  import { ComponentOptions } from 'vue'
  
  export interface ComponentOptionsWithProps<T = Record<string, unknown>> extends ComponentOptions<T> {
    props?: Record<string, unknown>
  }
  
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  export function Component(options?: any): any
  export function toNative<T>(component: T): T
  
  export class Vue {
    $emit(event: string, ...args: unknown[]): void
    $props: Record<string, unknown>
    $data: Record<string, unknown>
    $refs: Record<string, unknown>
    $slots: Record<string, unknown>
    $scopedSlots: Record<string, unknown>
    $attrs: Record<string, unknown>
    $listeners: Record<string, unknown>
    $parent: Vue | null
    $root: Vue
    $children: Vue[]
    $el: Element | undefined
    $options: ComponentOptions
    $isServer: boolean
    $ssrContext: Record<string, unknown>
    $vnode: Record<string, unknown>
    $createElement: (...args: unknown[]) => unknown
    $mount: (elementOrSelector?: string | Element) => Vue
    $forceUpdate: () => void
    $destroy: () => void
    $nextTick: (callback?: () => void) => Promise<void>
    $set: (target: Record<string, unknown>, key: string | number, value: unknown) => void
    $delete: (target: Record<string, unknown>, key: string | number) => void
    $watch: (expOrFn: string | ((...args: unknown[]) => unknown), callback: (...args: unknown[]) => unknown, options?: Record<string, unknown>) => (...args: unknown[]) => unknown
    $on: (event: string | string[], callback: (...args: unknown[]) => unknown) => Vue
    $once: (event: string | string[], callback: (...args: unknown[]) => unknown) => Vue
    $off: (event?: string | string[], callback?: (...args: unknown[]) => unknown) => Vue
  }
  
  export function Prop(options?: Record<string, unknown>): PropertyDecorator
  export function Emit(event?: string): MethodDecorator
  export function Watch(path: string, options?: Record<string, unknown>): MethodDecorator
  export function Inject(key?: string | symbol): PropertyDecorator
  export function Provide(key?: string | symbol): PropertyDecorator
  export function Model(event?: string, options?: Record<string, unknown>): PropertyDecorator
  export function Ref(refKey?: string): PropertyDecorator
}
