import { FieldPreset, Ref } from "./../schemas/base"; declare type If = Condition extends true ? Then : Else; declare type IsLiteral = T extends object ? false : true; declare type RejectByValue = { [Key in keyof Base]: Base[Key] extends Value ? never : Key; }; declare type RejectedKeys = RejectByValue[keyof Base]; declare type OmitByValue = Pick>; export declare type OmitNever = OmitByValue; export declare type Selector = { [Key in keyof ModelSchema["fields"]]?: boolean | {} | If, boolean, // TODO: functions ModelSchema["fields"][Key] extends Array ? (boolean | (T extends D2ModelSchemaBase ? Selector : never)) : ModelSchema["fields"][Key] extends D2ModelSchemaBase ? Selector : ModelSchema["fields"][Key]>; } & { [K in FieldPreset]?: boolean; }; export declare type ValidateSameKeys = Exclude extends never ? ModelSelector : { error: "Unknown keys in selector"; keys: Exclude; }; export declare type SelectedPickValidated = SM extends ValidateSameKeys> ? SelectedPick : never; export interface D2ModelSchemaBase { name: string; model: object; fields: { [s: string]: any; }; fieldPresets: { [FieldPresetK in FieldPreset]: { [s: string]: any; }; }; } declare type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never; export declare type SelectedPick> = UnionToIntersection & SelectedPickFields; declare type GetValues = UnionToIntersection; declare type SelectorKey = ModelSelector[K] extends object ? Model["fields"][K] extends Array ? T extends D2ModelSchemaBase ? SelectedPickValidated[] : T[] : (Model["fields"][K] extends D2ModelSchemaBase ? SelectedPickValidated : Model["fields"][K]) : ModelSelector[K] extends true ? (IsLiteral extends true ? Model["fields"][K] : GetTrueSelectionOnNonLiteral) : never; declare type GetTrueSelectionOnNonLiteral = SchemaValue extends Array ? (T extends { fieldPresets: any; } ? Ref[] : T[]) : SchemaValue extends { fieldPresets: any; } ? Ref : SchemaValue; declare type Function = { rename: { name: "rename"; to: string; }; size: { name: "size"; }; }; export declare type SelectedPickFields> = GetValues<{ [Key in keyof ModelSelector & keyof Model["fields"]]: ModelSelector[Key] extends { $fn: Function[keyof Function]; } ? ApplyFunction : { [K in Key]: SelectorKey; }; }>; declare type ApplyFunction, Key extends keyof ModelSelector & keyof Model["fields"]> = ModelSelector[Key] extends { $fn: Function["rename"]; } ? { [K in ModelSelector[Key]["$fn"]["to"]]: SelectorKey; } : ModelSelector[Key] extends { $fn: Function["size"]; } ? { [K in Key]: number; } : never; export declare type Get = Key extends keyof Obj ? Obj[Key] : never; export declare type GetFields = Get; export {};