@extclp/vexip-ui
Version:
A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good
151 lines (150 loc) • 6.77 kB
TypeScript
import { App, CSSProperties, ComponentObjectPropsOptions, MaybeRef, PropType } from 'vue';
import { LocaleConfig, LocaleNames } from './locale';
import { AnyFunction, EnsureValue, Expand, MaybeFunction, VoidFunction } from './types';
export type PropsOptions = Record<string, Record<string, unknown>>;
interface PropsConfig<T = any> {
/**
* The default value of the prop
*/
default: T | (() => T) | null;
/**
* Whether the prop is a function type
*
* @default false
*/
isFunc?: boolean;
/**
* Whether the prop is not configurable
*
* @default false
*/
static?: boolean;
/**
* Whether the prop is required
*
* @default false
*/
required?: boolean;
/**
* The validator for the prop, decide whether the value of the prop is valid
*
* @param value the value of the prop
*/
validator?: (value: T) => any;
}
type PropsConfigOptions<T> = {
[K in keyof T]?: PropsConfig<EnsureValue<T[K]>> | EnsureValue<T[K]> | (() => EnsureValue<T[K]>) | null;
};
export declare const PROVIDED_PROPS = "__vxp-provided-props";
/**
* Provide a props config for under components.
*
* @param props props config
* @param app the app of Vue, will use app.provide if specify
*/
export declare function configProps<T>(props: MaybeRef<T>, app?: App): void;
export declare function useProps<T extends Record<string, any>>(name: string, sourceProps: T, config?: PropsConfigOptions<T>): { [P in keyof T]-?: Exclude<T[P], undefined>; };
export declare function useHookProps<T extends Record<any, any>>(props: T, defaults: {
[K in keyof T]: T[K] | null;
}): { [P in keyof T]-?: Exclude<T[P], undefined>; };
export declare const booleanProp: {
type: BooleanConstructor;
default: null;
};
export declare const booleanStringProp: {
type: (BooleanConstructor | StringConstructor)[];
default: null;
};
export declare const booleanNumberProp: {
type: (NumberConstructor | BooleanConstructor)[];
default: null;
};
type CommonExcludedProps = 'inherit' | 'value' | 'checked' | 'active' | 'visible' | 'label' | 'options' | 'name';
type ExcludeProps<P, E extends string = never, I extends string = never> = Exclude<CommonExcludedProps, I> | Exclude<E, I> | (P extends I ? never : P extends `on${Capitalize<string>}` ? P : never);
type PostProps<T, E extends string> = Omit<{
[P in keyof T]: MaybeFunction<T[P]>;
}, E>;
/**
* Create a configurable props
*
* @param T the type of import('vue').ExtractPropTypes
* @param E the props should force exclude
* @param I the props should force include
*/
export type ConfigurableProps<T, E extends string = never, I extends string = never> = PostProps<{
[P in keyof T]?: P extends I ? T[P] : P extends `on${Capitalize<string>}` ? never : T[Exclude<P, CommonExcludedProps | E>];
}, ExcludeProps<keyof T, E, I>>;
type VexipProps<T> = {
[P in keyof T]: T[P] extends PropType<infer I> ? PropType<I & {}> : T[P] extends {
type: PropType<infer I>;
} ? PropType<I & {}> : T[P];
};
export declare function wrapProps<T extends ComponentObjectPropsOptions>(props: T): Expand<T>;
export declare function buildProps<T extends ComponentObjectPropsOptions>(props: T): Expand<VexipProps<{
inherit: {
type: BooleanConstructor;
default: null;
};
} & T>>;
export declare function omitProps<T extends ComponentObjectPropsOptions, K extends keyof T>(props: T, keys: K[]): Expand<Omit<T, K>>;
export declare function omitProps<T extends ComponentObjectPropsOptions, K extends keyof T, E extends ComponentObjectPropsOptions>(props: T, keys: K[], extra: E): Expand<Omit<T, K> & E>;
export type ComponentSize = 'small' | 'default' | 'large';
export declare const sizeProp: PropType<ComponentSize>;
export declare function createSizeProp(defaultValue?: MaybeRef<ComponentSize>): {
default: () => ComponentSize;
validator: (value: ComponentSize) => boolean;
};
export type ComponentState = 'default' | 'success' | 'error' | 'warning';
export declare const stateProp: PropType<ComponentState>;
export declare function createStateProp(defaultValue?: MaybeRef<ComponentState>): {
default: () => ComponentState;
validator: (value: ComponentState) => boolean;
};
type MaybeArray<T> = T | T[];
export type ClassType = string | Record<string, any> | Array<string | Record<string, any>>;
export type StyleType = string | CSSProperties | Array<string | CSSProperties>;
export declare const classProp: PropType<ClassType>;
export declare const styleProp: PropType<StyleType>;
type ForceBoolean<T> = true extends T ? Exclude<T, boolean> | boolean : false extends T ? Exclude<T, boolean> | boolean : T;
type ForceBooleanDeep<T> = T extends unknown ? {
[K in keyof T]: ForceBoolean<T[K]>;
} : never;
type SplitAndCombo<T, O = T> = T extends unknown ? [T] | (SplitAndCombo<Exclude<O, T>> extends infer U extends any[] ? U extends U ? [ForceBoolean<T | U[number]>] : never : never) : never;
type GenerateEvent<T extends any[], Others extends any[], R = any> = T extends unknown ? Others extends never ? (value: T[0]) => R : (value: T[0], ...args: Others) => R : never;
/**
* Split and combo the first parameter of the given function
*
* @example
* ```ts
* // origin function
* type Fn = (value: string | number | boolean) => void
*
* // after transform
* type After =
* | ((value: string | number | boolean) => void)
* | ((value: string | number) => void)
* | ((value: string | boolean) => void)
* | ((value: number | boolean) => void)
* | ((value: string) => void)
* | ((value: number) => void)
* | ((value: boolean) => void)
* ```
*/
export type EventListener<T extends AnyFunction> = Expand<ForceBooleanDeep<SplitAndCombo<Parameters<T>[0]>>> extends infer F extends any[] ? Parameters<T> extends [unknown, ...infer Others] ? GenerateEvent<F, Others, ReturnType<T>> : GenerateEvent<F, never, ReturnType<T>> : never;
export declare function eventProp<F extends AnyFunction = VoidFunction>(): PropType<MaybeArray<F>>;
export declare function emitEvent<A extends any[]>(handlers: MaybeArray<(...args: A) => void> | undefined, ...args: A): void;
export declare function localeProp<N extends LocaleNames>(_name: N): PropType<Partial<LocaleConfig[N]>>;
export declare const valueProp: {
type: (NumberConstructor | BooleanConstructor | StringConstructor)[];
default: null;
};
export declare const valuesProp: {
type: PropType<MaybeArray<string | number | boolean>>;
default: null;
};
export declare const iconProp: (ObjectConstructor | FunctionConstructor)[];
export declare function createIconProp(defaultValue?: Record<any, any> | AnyFunction | null): {
isFunc: boolean;
default: AnyFunction | Record<any, any> | null;
};
export {};