UNPKG

@vuesax-alpha/nightly

Version:
104 lines (103 loc) 3.79 kB
import type { vsPropKey } from './runtime'; import type { ExtractPropTypes, PropType } from 'vue'; import type { IfNever, UnknownToNever, WritableArray } from './util'; declare type Value<T> = 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<T extends object> = Value<ExtractPropTypes<{ key: T; }>>; /** * Extracts types via `ExtractPropTypes`, accepting `PropType<T>`, `XXXConstructor`, `never`... * * @example * ResolvePropType<BooleanConstructor> => boolean * ResolvePropType<PropType<T>> => T **/ export declare type ResolvePropType<T> = IfNever<T, never, ExtractPropType<{ type: WritableArray<T>; required: true; }>>; /** * Merge Type, Value, Validator types * * @example * VsPropMergeType<StringConstructor, '1', 1> => 1 | "1" // ignores StringConstructor * VsPropMergeType<StringConstructor, never, number> => string | number */ export declare type VsPropMergeType<Type, Value, Validator> = IfNever<UnknownToNever<Value>, ResolvePropType<Type>, never> | UnknownToNever<Value> | UnknownToNever<Validator>; /** * Handling default values for input (constraints) */ export declare type VsPropInputDefault<Required extends boolean, Default> = Required extends true ? never : Default extends Record<string, unknown> | Array<any> ? () => 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, Y, N> = [T] extends [NativePropType] ? Y : N; /** * input prop `buildProp` or `buildProps` (constraints) * * @example * VsPropInput<StringConstructor, 'a', never, never, true> * ⬇️ * { 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<Type, Value, Validator, Default extends VsPropMergeType<Type, Value, Validator>, Required extends boolean> = { type?: Type; required?: Required; values?: readonly Value[]; validator?: ((val: any) => val is Validator) | ((val: any) => boolean); default?: VsPropInputDefault<Required, Default>; }; /** * 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<Type, Default, Required> = { readonly type: PropType<Type>; readonly required: [Required] extends [true] ? true : false; readonly validator: ((val: unknown) => boolean) | undefined; [vsPropKey]: true; } & IfNever<Default, unknown, { readonly default: Default; }>; /** * Determine if it is `VsProp` */ export declare type IfVsProp<T, Y, N> = T extends { [vsPropKey]: true; } ? Y : N; /** * Converting input to output. */ export declare type VsPropConvert<Input> = Input extends VsPropInput<infer Type, infer Value, infer Validator, any, infer Required> ? VsPropFinalized<Type, Value, Validator, Input['default'], Required> : never; /** * Finalized conversion output */ export declare type VsPropFinalized<Type, Value, Validator, Default, Required> = VsProp<VsPropMergeType<Type, Value, Validator>, UnknownToNever<Default>, Required>; export {};