import { ErrorDeleteFieldMerge, ErrorDeleteFieldUnion, ErrorEmptyUpdate, ErrorUnknownMember, ErrorNonTopLevelDeleteField, ErrorKeyNotExist } from './error'; import { ArrayUnionOrRemove, Delete } from './fieldValues'; import { DeepValue } from './objectFlatten'; import { DeepPartialExceptArray, ReMap, RemoveOptionalNever } from './utils'; export type HandleUnknownMember, Data> = ReMap> & { [K in Exclude]: ErrorUnknownMember extends Data[K] ? never : ErrorUnknownMember; }>; type IsSetDeleteAbleFieldValueValid = Merge extends false ? T : Data extends Delete ? Merge extends true ? Delete extends Extract ? T : string extends Exclude ? ErrorDeleteFieldUnion : Exclude | ErrorDeleteFieldMerge : Merge extends unknown[] ? Delete extends Extract ? T : string extends Exclude ? ErrorDeleteFieldUnion : Exclude | ErrorDeleteFieldMerge : T : T; type ExactOptionalArray = T extends (infer ElementOfBase)[] ? Data extends (infer ElementOfData)[] ? Data extends never[] ? T : ElementOfData extends ElementOfBase ? ExactOptionalArray[] : T : T : T extends Record ? keyof Data extends keyof T ? keyof T extends keyof Data ? { [K in keyof T]-?: ExactOptionalArray; } : T : HandleUnknownMember : T; type ExceptOptionalSub, K, Data, Merge extends boolean | string[], // this is for set merge operation only NoFlatten extends boolean, TopLevel extends boolean> = DeepValue extends infer S ? unknown extends S ? ErrorKeyNotExist : S[] extends (infer BaseKeyElement)[][] | ArrayUnionOrRemove[] ? Data[K & keyof Data] extends (infer DataKeyElement)[] ? Data[K & keyof Data] extends never[] ? DeepPartialExceptArray : DataKeyElement extends BaseKeyElement ? ExactOptionalArray[] : BaseKeyElement[] : IsSetDeleteAbleFieldValueValid : S extends Record ? Data[K & keyof Data] extends infer R ? R extends Record ? ExactOptional : DeepPartialExceptArray : never : Data[K & keyof Data] extends Delete ? NoFlatten extends true ? TopLevel extends false ? ErrorNonTopLevelDeleteField : IsSetDeleteAbleFieldValueValid : IsSetDeleteAbleFieldValueValid : IsSetDeleteAbleFieldValueValid : T[K & keyof T]; export type ExactOptional, Data_ extends Record, Merge extends boolean | string[], // this is for set merge operation only NoFlatten extends boolean, TopLevel extends boolean> = T extends never ? T : RemoveOptionalNever extends infer Data ? Data extends (NoFlatten extends true ? TopLevel extends true ? Record : never : Record) ? ErrorEmptyUpdate | T : keyof Data extends (string extends keyof T ? string | number : keyof T) ? { [K in keyof T]?: K extends keyof Data ? ExceptOptionalSub : string extends K ? ExceptOptionalSub : T[K]; } : HandleUnknownMember, Data> : never; export type RecursivelyReplaceDeleteFieldWithErrorMsg = T extends Record ? Data extends Record ? keyof Data extends (string extends keyof T ? string | number : keyof T) ? { [K in keyof T]: K extends string ? K extends keyof Data ? T[K] extends Record ? Data[K] extends Record ? RecursivelyReplaceDeleteFieldWithErrorMsg : T[K] : Data[K] extends Delete ? Delete extends Extract ? string extends Exclude ? ErrorDeleteFieldMerge : Exclude | ErrorDeleteFieldMerge : ErrorDeleteFieldMerge : T[K] : T[K] : never; } : HandleUnknownMember : T : T; export {};