import { MutablePropsOf } from '../helper.types'; import { PrimitiveTypes } from '../primitive.types.interface'; import { Clear, ClearArray, ClearObject, ClearObjectArray, Increment, NestedArrayUpdate, NestedUpdate, Pull, PullEach, Push, PushEach, Set } from './update.conditions'; /** * Makes `T` non-readonly (!) properties updateable: * 1. `Primitives` by: Set. * 2. `Optional` properties by: Set, Clear. * 3. `Numbers` properties by: Set, Increment. * 4. `Arrays` by: Push, Set, PushEach, Pull, PullEach, ClearArray. * 5. `Arrays of objects` by: Set, Push, PushEach, Pull, PullEach, ClearObjectArray. * 5. `Nested objects`: by Set, UpdateCriteria, ClearObject. */ export type UpdateCriteria = { [P in keyof T]?: P extends MutablePropsOf ? T[P] extends PrimitiveTypes | undefined ? PrimitiveCompatibleTypes : T[P] extends Array | undefined ? ArrayCompatibletypes : T[P] extends object | undefined ? ObjectCompatibletypes : never : never; }; type PrimitiveCompatibleTypes = T extends PrimitiveTypes ? T extends number ? //number number | Set | Increment : //other types T | Set : T extends PrimitiveTypes | undefined ? Clear : never; type ArrayCompatibletypes = T extends Array ? X extends PrimitiveTypes ? X extends string ? //string or enum array string[] | Set | Push | PushEach | Pull | PullEach : //primitive array X[] | Set | Push | PushEach | Pull | PullEach : X[] | Set | Push | PushEach | Pull | PullEach | NestedArrayUpdate : T extends undefined ? X extends PrimitiveTypes ? ClearArray : ClearObjectArray : never; type ObjectCompatibletypes = T extends object ? //non-nullable object T | Set | NestedUpdate : T extends object | undefined ? ClearObject : never; export {}; //# sourceMappingURL=update.criteria.interface.d.ts.map