import type { Prop } from 'vue'; export type PropConstructor = (new (...args: any[]) => T & Record) | (() => T) | PropMethod; type PropMethod = [T] extends [ ((...args: any) => any) | undefined ] ? { new (): TConstructor; (): T; readonly prototype: TConstructor; } : never; type Data = Record; export type PropType = PropConstructor | Array>; export interface PropOptions { type?: PropType | true | null; required?: boolean; default?: D | DefaultFactory | null | undefined | Record; validator?: (value: T, props: Data) => boolean; } type DefaultFactory = (props: Data) => T | null | undefined; export type ValidatorFunction = (value: T) => boolean; export interface VueTypeValidateDef> extends VueTypeBaseDef { readonly validate: (fn: V) => this & { validator: V; }; } export type VueProp = VueTypeBaseDef | PropOptions; export interface VueTypeBaseDef, U = T extends NativeType ? T : () => T> extends PropOptions { _vueTypes_name: string; type?: PropType; readonly def: (def?: D) => this & { default: U; }; readonly isRequired: this & { required: true; }; } export type DefaultType = T extends NativeType ? T : DefaultFactory; export type NativeType = string | boolean | number | null | undefined | Function; export type VueTypeDef = VueTypeBaseDef; export interface VueTypeShape extends VueTypeBaseDef>, () => Partial> { readonly loose: VueTypeLooseShape; } export interface VueTypeLooseShape extends VueTypeBaseDef>>, () => Partial & Record> { readonly loose: VueTypeLooseShape; readonly _vueTypes_isLoose: true; } export interface WrappedFn { (...args: any[]): any; __original: (...args: any[]) => any; } export type InferPropType = [T] extends [null] ? NullAsAny extends true ? any : null : [T] extends [{ type: null | true; }] ? any : [T] extends [ObjectConstructor | { type: ObjectConstructor; }] ? Record : [T] extends [BooleanConstructor | { type: BooleanConstructor; }] ? boolean : [T] extends [DateConstructor | { type: DateConstructor; }] ? Date : [T] extends [Array | { type: Array; }] ? U extends DateConstructor ? Date | InferPropType : InferPropType : [T] extends [Prop] ? unknown extends V ? IfAny : V : T; export type IfAny = 0 extends 1 & T ? Y : N; export {};