import type { vsPropKey } from './runtime'; import type { ExtractPropTypes, PropType } from 'vue'; import type { IfNever, UnknownToNever, WritableArray } from './util'; declare type Value = T[keyof T]; /** * Extract the type of a single prop * * @example * ExtractPropType<{ type: StringConstructor }> => string | undefined * ExtractPropType<{ type: StringConstructor, required: true }> => string * ExtractPropType<{ type: BooleanConstructor }> => boolean */ export declare type ExtractPropType = Value>; /** * Extracts types via `ExtractPropTypes`, accepting `PropType`, `XXXConstructor`, `never`... * * @example * ResolvePropType => boolean * ResolvePropType> => T **/ export declare type ResolvePropType = IfNever; required: true; }>>; /** * Merge Type, Value, Validator types * * @example * VsPropMergeType => 1 | "1" // ignores StringConstructor * VsPropMergeType => string | number */ export declare type VsPropMergeType = IfNever, ResolvePropType, never> | UnknownToNever | UnknownToNever; /** * Handling default values for input (constraints) */ export declare type VsPropInputDefault = Required extends true ? never : Default extends Record | Array ? () => Default : (() => Default) | Default; /** * Native prop types, e.g: `BooleanConstructor`, `StringConstructor`, `null`, `undefined`, etc. */ export declare type NativePropType = ((...args: any) => any) | { new (...args: any): any; } | undefined | null; export declare type IfNativePropType = [T] extends [NativePropType] ? Y : N; /** * input prop `buildProp` or `buildProps` (constraints) * * @example * VsPropInput * ⬇️ * { type?: StringConstructor | undefined; required?: true | undefined; values?: readonly "a"[] | undefined; validator?: ((val: any) => boolean) | ((val: any) => val is never) | undefined; default?: undefined; } */ export declare type VsPropInput, Required extends boolean> = { type?: Type; required?: Required; values?: readonly Value[]; validator?: ((val: any) => val is Validator) | ((val: any) => boolean); default?: VsPropInputDefault; }; /** * output prop `buildProp` or `buildProps`. * * @example * VsProp<'a', 'b', true> * ⬇️ * { readonly type: PropType<"a">; readonly required: true; readonly validator: ((val: unknown) => boolean) | undefined; readonly default: "b"; __vsPropKey: true; } */ export declare type VsProp = { readonly type: PropType; readonly required: [Required] extends [true] ? true : false; readonly validator: ((val: unknown) => boolean) | undefined; [vsPropKey]: true; } & IfNever; /** * Determine if it is `VsProp` */ export declare type IfVsProp = T extends { [vsPropKey]: true; } ? Y : N; /** * Converting input to output. */ export declare type VsPropConvert = Input extends VsPropInput ? VsPropFinalized : never; /** * Finalized conversion output */ export declare type VsPropFinalized = VsProp, UnknownToNever, Required>; export {};