/** length of const array or tuple */ export type Length = T["length"]; /** build a tuple with length L, and type T */ export type Tuple = R extends { length: L } ? R : Tuple; /** adds two constant positive whole number types */ export type Add = Length<[...Tuple, ...Tuple]>; /** subtracts one constant positive whole number type from another */ export type Subtract = Tuple extends [...infer U, ...Tuple] ? Length : never; /** type of the last element of a readonly array or tuple */ export type Last = A[Subtract, 1>]; /** type of the first element of a readonly array or tuple */ export type First = A[Length]; /** * Extract the prop types of a vue 2 component. This is an alternative to `ExtractPropTypes`, which has unreliable behavior in vue 2. * @example * type MyComponentPropsType = GetComponentPropTypes; */ export type GetComponentPropTypes< T extends import("vue/types/v3-component-public-instance").ComponentPublicInstanceConstructor, > = InstanceType["$props"]; /** Convert snake case string literal to camel case string literal */ export type SnakeToCamelCase = S extends `${infer T}_${infer U}` ? `${T}${Capitalize>}` : S; /** Convert camel case string literal to snake case string literal */ export type CamelToSnakeCase = S extends `${infer T}${infer U}` ? `${T extends Capitalize ? "_" : ""}${Lowercase}${CamelToSnakeCase}` : S; /** Converts an object type or interface to the same type with camel case keys */ export type AsCamelCase = T extends Array ? T : T extends object ? { [K in keyof T as SnakeToCamelCase]: AsCamelCase; } : T; /** Converts an object type or interface to the same type with snake case keys */ export type AsSnakeCase = T extends Array ? T : T extends object ? { [K in keyof T as CamelToSnakeCase]: AsSnakeCase; } : T;