import { IfAny, UnpackList } from "./utils.js"; import { ItemType } from "./schema.js"; import { HasNestedFields, QueryFields } from "./fields.js"; import { QueryDeep } from "./deep.js"; import { QueryFilter } from "./filters.js"; import { AggregationTypes, GroupByFields } from "./aggregate.js"; //#region src/types/query.d.ts /** * All query options available */ interface Query { readonly fields?: IfAny)[], QueryFields> | undefined; filter?: IfAny, QueryFilter> | undefined; search?: string | undefined; sort?: IfAny | QuerySort[]> | undefined; limit?: number | undefined; offset?: number | undefined; page?: number | undefined; deep?: IfAny, QueryDeep> | undefined; backlink?: boolean | undefined; readonly alias?: IfAny, QueryAlias> | undefined; } /** * All query options with an additional version query option for readItem and readSingleton */ interface QueryItem extends Query { readonly version?: string | undefined; readonly versionRaw?: boolean | undefined; } /** * All query options with additional aggregate, version, and custom property options */ type ExtendedQuery = Query & { aggregate?: Partial>; groupBy?: (string | GroupByFields)[]; version?: string | undefined; versionRaw?: boolean | undefined; } & Record; /** * All query options with an additional concurrentIndexCreation query option for updating fields with indexes */ interface FieldQuery extends Query { readonly concurrentIndexCreation?: boolean; } /** * Returns Item types that are available in the root Schema */ type ExtractItem = Extract, ItemType>; /** * Returns the relation type from the current item by key */ type ExtractRelation = Key$1 extends keyof Item ? ExtractItem : never; /** * Merge union of optional objects */ type MergeRelationalFields = Exclude, string> extends infer RelatedFields ? { [Key in RelatedFields extends any ? keyof RelatedFields : never]-?: Exclude } : never; /** * Merge separate relational objects together */ type MergeFields = HasNestedFields extends never ? Extract, string> : Extract, string> | MergeRelationalFields; /** * Query sort * TODO expand to relational sorting (same object notation as fields i guess) */ type QuerySort<_Schema, Item> = UnpackList extends infer FlatItem ? { [Field in keyof FlatItem]: Field | `-${Field & string}` }[keyof FlatItem] : never; type MergeObjects = object extends A ? (object extends B ? A & B : A) : object extends B ? B : never; /** * Alias object * * TODO somehow include these aliases in the Field Types!! */ type QueryAlias<_Schema, Item> = Record; //#endregion export { ExtendedQuery, ExtractItem, ExtractRelation, FieldQuery, MergeFields, MergeObjects, MergeRelationalFields, Query, QueryAlias, QueryItem, QuerySort }; //# sourceMappingURL=query.d.ts.map