import { IfEquals } from '../helper.types'; import { PrimitiveTypes } from '../primitive.types.interface'; import { ArrayDoesNotExist, ArrayExists, Contains, DoesNotContain, DoesNotEndWith, DoesNotEqual, DoesNotExist, DoesNotHaveElement, DoesNotStartWith, EndsWith, Equals, Exists, HasAllElements, HasAnyOfTheElements, HasElement, HasElementThatMatches, HasNoElementThatMatches, HasNoneOfTheElements, IsGreaterThan, IsGreaterThanOrEqual, IsLesserThan, IsLesserThanOrEqual, IsNoneOfTheValues, IsOneOfTheValues, NestedCriteria, ObjectArrayDoesNotExist, ObjectArrayExists, ObjectDoesNotExist, ObjectExists, StartsWith } from './search.conditions'; /** * Makes `T` properties searchable. * 1. `Primitives` by: value, Equals, DoesNotEqual, IsOneOfTheValues, IsNoneOfTheValues. * 2. `Optional` properties additionally by: Exists, DoesNotExists. * 3. `Strings` additionally by: StartsWith, EndsWith, Contains, DoesNotStartWith, DoesNotEndWith, DoesNotContain. * 4. `Numbers` and `Dates` additionally by: IsGreaterThan, IsLesserThan, IsLesserThanOrEqual, IsGreaterThanOrEqual. * 5. `Arrays of primitives` by: value, Equals, DoesNotEqual, HasElement, DoesNotHaveElement, HasAnyOfTheElements, HasNoneOfTheElements, HasAllElements. * 6. `Arrays of objects` by: HasElementThatMatches, ObjectArrayExists, ObjectArrayDoesNotExist. * 7. `Nested objects` by: NestedCriteria, ObjectExists, ObjectDoesNotExist. */ export type SearchCriteria = { [P in keyof T]?: T[P] extends PrimitiveTypes | undefined ? PrimitiveCompatibleTypes : T[P] extends Array | undefined ? X extends PrimitiveTypes ? ArrayCompatibletypes : ObjectArrayCompatibletypes : ObjectCompatibletypes; }; export type PrimitiveCompatibleTypes = T extends PrimitiveTypes ? T extends string ? StringCompatibleTypes : T extends number ? NumberCompatibleTypes : T extends Date ? DateCompatibleTypes : T extends boolean ? BooleanCompatibleTypes : //other types T | Equals | DoesNotEqual : T extends PrimitiveTypes | undefined ? //nullable types Exists | DoesNotExist : never; type StringCompatibleTypes = IfEquals extends never ? //enum T | Equals | DoesNotEqual | IsOneOfTheValues | IsNoneOfTheValues : string | Equals | DoesNotEqual | StartsWith | DoesNotStartWith | EndsWith | DoesNotEndWith | Contains | DoesNotContain | IsOneOfTheValues | IsNoneOfTheValues; type NumberCompatibleTypes = IfEquals extends never ? //enum T | Equals | DoesNotEqual | IsOneOfTheValues | IsNoneOfTheValues : number | Equals | DoesNotEqual | IsGreaterThan | IsGreaterThanOrEqual | IsLesserThan | IsLesserThanOrEqual | IsOneOfTheValues | IsNoneOfTheValues; type DateCompatibleTypes = T extends Date ? Date | Equals | DoesNotEqual | IsGreaterThan | IsGreaterThanOrEqual | IsLesserThan | IsLesserThanOrEqual | IsOneOfTheValues | IsNoneOfTheValues : never; type BooleanCompatibleTypes = T extends boolean ? boolean | Equals | DoesNotEqual : never; type ArrayCompatibletypes = T extends Array ? X[] | Equals | DoesNotEqual | HasElement | DoesNotHaveElement | HasAnyOfTheElements | HasNoneOfTheElements | HasAllElements : T extends Array | undefined ? ArrayExists | ArrayDoesNotExist : never; type ObjectArrayCompatibletypes = T extends Array ? //non-nullable array HasElementThatMatches | HasNoElementThatMatches : T extends Array | undefined ? ObjectArrayExists | ObjectArrayDoesNotExist : never; type ObjectCompatibletypes = T extends object ? NestedCriteria : T extends object | undefined ? ObjectExists | ObjectDoesNotExist : never; export {}; //# sourceMappingURL=search.criteria.interface.d.ts.map