| | |
| | | key: { type: T; required: true }; |
| | | }>['key']; |
| | | type ResolvePropType<T> = ResolveProp<T> extends { type: infer V } ? V : ResolveProp<T>; |
| | | type ResolvePropTypeWithReadonly<T> = Readonly<T> extends Readonly<Array<infer A>> |
| | | ? ResolvePropType<A[]> |
| | | : ResolvePropType<T>; |
| | | type ResolvePropTypeWithReadonly<T> = |
| | | Readonly<T> extends Readonly<Array<infer A>> ? ResolvePropType<A[]> : ResolvePropType<T>; |
| | | |
| | | type IfUnknown<T, V> = [unknown] extends [T] ? V : T; |
| | | |
| | |
| | | default?: R extends true |
| | | ? never |
| | | : D extends Record<string, unknown> | Array<any> |
| | | ? () => D |
| | | : (() => D) | D; |
| | | ? () => D |
| | | : (() => D) | D; |
| | | validator?: ((val: any) => val is C) | ((val: any) => boolean); |
| | | }; |
| | | |
| | |
| | | | (T extends PropWrapper<unknown> |
| | | ? T[typeof wrapperKey] |
| | | : [V] extends [never] |
| | | ? ResolvePropTypeWithReadonly<T> |
| | | : never) |
| | | ? ResolvePropTypeWithReadonly<T> |
| | | : never) |
| | | | V |
| | | | C; |
| | | export type BuildPropType<T, V, C> = _BuildPropType< |
| | |
| | | ] |
| | | ? D |
| | | : D extends () => T |
| | | ? ReturnType<D> |
| | | : D; |
| | | ? ReturnType<D> |
| | | : D; |
| | | |
| | | export type BuildPropDefault<T, D, R> = R extends true |
| | | ? { readonly default?: undefined } |
| | |
| | | |
| | | return { |
| | | type: |
| | | typeof type === 'object' && Object.getOwnPropertySymbols(type).includes(wrapperKey) |
| | | typeof type === 'object' && Object.getOwnPropertySymbols(type).includes(wrapperKey) && type |
| | | ? type[wrapperKey] |
| | | : type, |
| | | required: !!required, |
| | |
| | | [K in keyof O]: O[K] extends BuildPropReturn<any, any, any, any, any> |
| | | ? O[K] |
| | | : [O[K]] extends NativePropType |
| | | ? O[K] |
| | | : O[K] extends BuildPropOption<infer T, infer D, infer R, infer V, infer C> |
| | | ? D extends BuildPropType<T, V, C> |
| | | ? BuildPropOption<T, D, R, V, C> |
| | | : never |
| | | : never; |
| | | ? O[K] |
| | | : O[K] extends BuildPropOption<infer T, infer D, infer R, infer V, infer C> |
| | | ? D extends BuildPropType<T, V, C> |
| | | ? BuildPropOption<T, D, R, V, C> |
| | | : never |
| | | : never; |
| | | }, |
| | | >( |
| | | props: O, |
| | |
| | | [K in keyof O]: O[K] extends { [propKey]: boolean } |
| | | ? O[K] |
| | | : [O[K]] extends NativePropType |
| | | ? O[K] |
| | | : O[K] extends BuildPropOption< |
| | | infer T, |
| | | // eslint-disable-next-line @typescript-eslint/no-unused-vars |
| | | infer _D, |
| | | infer R, |
| | | infer V, |
| | | infer C |
| | | > |
| | | ? BuildPropReturn<T, O[K]['default'], R, V, C> |
| | | : never; |
| | | ? O[K] |
| | | : O[K] extends BuildPropOption< |
| | | infer T, |
| | | // eslint-disable-next-line @typescript-eslint/no-unused-vars |
| | | infer _D, |
| | | infer R, |
| | | infer V, |
| | | infer C |
| | | > |
| | | ? BuildPropReturn<T, O[K]['default'], R, V, C> |
| | | : never; |
| | | }; |
| | | |
| | | export const definePropType = <T>(val: any) => ({ [wrapperKey]: val } as PropWrapper<T>); |
| | | export const definePropType = <T>(val: any) => ({ [wrapperKey]: val }) as PropWrapper<T>; |
| | | |
| | | export const keyOf = <T>(arr: T) => Object.keys(arr) as Array<keyof T>; |
| | | export const keyOf = <T extends object>(arr: T) => Object.keys(arr) as Array<keyof T>; |
| | | |
| | | export const mutable = <T extends readonly any[] | Record<string, unknown>>(val: T) => |
| | | val as Mutable<typeof val>; |
| | | |