import { IfNever, UnpackList } from "./utils.js"; import { ItemType, RelationalFields, RemoveRelationships } from "./schema.js"; import { FunctionFields } from "./functions.js"; import { ExtractItem } from "./query.js"; //#region src/types/fields.d.ts /** * Fields querying, including nested relational fields */ type QueryFields = WrapQueryFields>>; /** * Wrap array of fields */ type WrapQueryFields = readonly ("*" | keyof UnpackList | NestedFields | FunctionFields>)[]; /** * Object of nested relational fields in a given Item with it's own fields available for selection */ type QueryFieldsRelational = IfNever, never, { [Key in RelationalFields]?: Extract> extends infer RelatedCollection ? RelatedCollection extends any[] ? HasManyToAnyRelation extends never ? QueryFields : ManyToAnyFields : QueryFields : never }>; /** * Deal with many-to-any relational fields */ type ManyToAnyFields = ExtractItem extends infer TItem ? TItem extends object ? "collection" extends keyof TItem ? "item" extends keyof TItem ? WrapQueryFields>, "item"> & { item?: { [Collection in keyof Schema as Collection extends TItem["collection"] ? Collection : never]?: QueryFields }; }> : never : never : never : never; /** * Determine whether a field definition has a many-to-any relation * TODO try making this dynamic somehow instead of relying on "item" as key */ type HasManyToAnyRelation = UnpackList extends infer TItem ? TItem extends object ? "collection" extends keyof TItem ? "item" extends keyof TItem ? true : never : never : never : never; /** * Returns true if the Fields has any nested field */ type HasNestedFields = UnpackList extends infer Field ? (Field extends object ? true : never) : never; /** * Return all keys if Fields is undefined or contains '*' */ type FieldsWildcard = unknown extends Fields ? keyof Item : UnpackList extends infer Field ? Field extends undefined ? keyof Item : Field extends "*" ? keyof Item : Field extends string ? Field : never : never; /** * Returns the relational fields from the fields list */ type PickRelationalFields = MergeRelations extends infer Field ? (Field extends object ? Field : never) : never>; type MergeRelations = { [Key in AllKeys]: PickType }; type PickType> = T extends { [k in K]?: any } ? T[K] : undefined; type AllKeys = T extends any ? keyof T : never; /** * Extract the required fields from an item */ type PickFlatFields = Extract extends never ? never : Pick, Extract>; /** * Extract a specific literal type from a collection */ type LiteralFields = { [Key in keyof Item]: Extract[] extends never[] ? never : Key }[keyof Item]; //#endregion export { FieldsWildcard, HasManyToAnyRelation, HasNestedFields, LiteralFields, ManyToAnyFields, PickFlatFields, PickRelationalFields, QueryFields, QueryFieldsRelational, WrapQueryFields }; //# sourceMappingURL=fields.d.ts.map