import { ChoiceCore, ChoiceValue } from "./choice-type"; import { ArrayTypeBaseCore, ObjectTypeBaseCore } from "./container-types"; import { DynamicCore, GraphQLCore, GraphQLValue } from "./misc-types"; import { DateRangeStringsCore, DateStringCore, NumberTypeBaseCore, RichBooleanCore } from "./primitive-types"; import { QueryBuilderCore } from "./query-builder-types"; import { CommonTypeBase, ContextDependentConfig, Defaultable, GenericContext } from "./shared-controls"; import { Nullish } from "./type-utils"; /** * `[string, number]` -> `[string | undefined, number | undefined]` */ export type PartialParams

= { [K in keyof P]: P[K] | undefined; }; export type FunctionControlContext

= GenericContext, // Function params, each may be undefined any>; export type FunctionContextConfig

= ContextDependentConfig, R>; export interface TypeBaseDefault extends CommonTypeBase, Defaultable { displayName?: string; /** * Function for whether this prop should be hidden in the right panel, * given the current props for this component */ hidden?: ContextDependentConfig; } export interface PlainStringType

= string> extends TypeBaseDefault, T> { type: "string" | `'${T}'`; } export type StringType

= "string" | PlainStringType | ChoiceType | DateStringType

| DateRangeStringsType

| AnyType

; export interface PlainNumberType

= number> extends TypeBaseDefault, T> { type: "number" | `${number extends T ? number : T}`; } export type NumberType

= PlainNumberType | (TypeBaseDefault, T> & NumberTypeBaseCore>) | ChoiceType | AnyType

; export interface PlainBooleanType

= boolean> extends TypeBaseDefault, T> { type: "boolean" | `${boolean extends T ? boolean : T}`; } export type BooleanType

= PlainBooleanType | (TypeBaseDefault, T> & RichBooleanCore) | ChoiceType | AnyType

; export type GraphQLType

= TypeBaseDefault, any> & GraphQLCore>; export interface PlainNullType

extends TypeBaseDefault, null> { type: "null"; } export type NullType

= PlainNullType

| AnyType

; export interface PlainUndefinedType

extends TypeBaseDefault, undefined> { type: "undefined"; } export type UndefinedType

= PlainUndefinedType

| AnyType

; export type ExtractObjectKeys = keyof T & string; export type ObjectType

= Record> = TypeBaseDefault, T> & ObjectTypeBaseCore, GenericType, ExtractObjectKeys>; export type ArrayType

= TypeBaseDefault, T> & ArrayTypeBaseCore, GenericType>; export type QueryBuilderType

= TypeBaseDefault, any> & QueryBuilderCore>; export interface PlainAnyType

extends TypeBaseDefault, any> { type: "any"; } export type AnyType

= PlainAnyType

; export interface PlainVoidType extends CommonTypeBase { type: "void"; } export type VoidType

= PlainVoidType | AnyType

; type IsAny = 0 extends 1 & T ? true : false; type CommonType

= T extends GraphQLValue ? GraphQLType

: T extends null ? NullType

: T extends undefined ? UndefinedType

: T extends Array ? ArrayType

: T extends object ? ObjectType : AnyType

; type AnyTyping

= T extends string ? StringType : T extends number ? NumberType : T extends boolean ? BooleanType : CommonType; export type ChoiceTypeBase

= TypeBaseDefault, Opt | Opt[]> & ChoiceCore, Opt>; export interface SingleChoiceType

extends ChoiceTypeBase { multiSelect?: false; } export interface MultiChoiceType

extends ChoiceTypeBase { multiSelect: true; } export interface CustomChoiceType

extends ChoiceTypeBase { multiSelect: FunctionContextConfig; } export type ChoiceType

= SingleChoiceType | MultiChoiceType | CustomChoiceType; export type DateStringType

= TypeBaseDefault, string> & DateStringCore; export type DateRangeStringsType

= TypeBaseDefault, [ string, string ]> & DateRangeStringsCore; export interface DynamicType

extends CommonTypeBase, DynamicCore, GenericType> { } export type RestrictedType

= IsAny extends true ? AnyTyping : [ T ] extends [string] ? StringType : [T] extends [number] ? NumberType : [T] extends [boolean] ? BooleanType : T extends string | null | undefined ? Exclude extends string ? StringType : CommonType : T extends number | null | undefined ? Exclude extends number ? NumberType : CommonType : T extends boolean | null | undefined ? Exclude extends boolean ? BooleanType : CommonType : CommonType; export type GenericType

= RestrictedType | DynamicType

| QueryBuilderType

; export interface ParamTypeBase { name: string; } export type ParamType

= ParamTypeBase & GenericType; export type RequiredParam

= ParamTypeBase & ParamType & { isOptional?: false; isRestParameter?: false; }; export type OptionalParam

= ParamTypeBase & ParamType & { isRestParameter?: false; }; export type RestParam

= ParamTypeBase & ParamType & { isOptional?: false; isRestParameter: true; }; type RequiredParams = Partial extends T ? U : T extends [infer F, ...infer R] ? RequiredParams : U; type OptionalParams = T extends [ ...RequiredParams, ...infer R ] ? [...R] : []; type HandleRequiredParams

= R extends [ infer H, ...infer T ] ? [string | RequiredParam, ...HandleRequiredParams] : []; type HandleOptionalParams

= R extends [ infer H, ...infer T ] ? [] | [ string | OptionalParam, ...HandleOptionalParams ] : R extends [] ? [] : R extends Array ? [] | [RestParam] : []; export type HandleParams

= [ ...HandleRequiredParams>, ...HandleOptionalParams>> ]; export type HandleReturnType

= VoidType

| ParamType; export {};