declare type Unpacked<T> = T extends (infer U)[] ? U : T extends (...args: any[]) => infer U ? U : T extends Promise<infer U> ? U : T;
declare type SpecialUnpack<T> = T extends (...args: any[]) => infer U ? U : T extends Promise<infer U> ? U : T;
declare type ToUnpackModel<T extends {}> = {
    [K in keyof T]: SpecialUnpack<T[K]>;
};
declare type PropertyName<T, F> = {
    [K in keyof T]: T[K] extends F ? K : never;
}[keyof T];
declare type NonNullPropertyNames<T extends {}> = {
    [K in keyof T]: SpecialUnpack<T[K]> extends void | null | undefined ? never : K;
}[keyof T];
declare type PrimitiveTypes = string | number | boolean | string[] | number[] | boolean[];
declare type PrimitivePropertyNames<T> = PropertyName<T, PrimitiveTypes>;
declare type ObjectPropertyNames<T> = {
    [K in keyof T]: T[K] extends Function ? never : Unpacked<T[K]> extends object ? K : never;
}[keyof T];
declare type FunctionPropertyNameOnReturnType<T, U> = {
    [K in keyof T]: T[K] extends (...args: any[]) => any ? (ReturnType<T[K]> extends U ? K : never) : never;
}[keyof T];
declare type PrimitiveFunctionPropertyNames<T> = FunctionPropertyNameOnReturnType<T, PrimitiveTypes>;
declare type FunctionPropertyNames<T> = {
    [K in keyof T]: T[K] extends (...args: any[]) => any ? (ReturnType<T[K]> extends object ? K : never) : never;
}[keyof T];
export declare class Query<TData extends {}> {
    private Prefix;
    private Indent;
    private Fields;
    private ObjectFields;
    private SimpleFunctionFields;
    private FunctionFields;
    constructor(Prefix?: string, Indent?: number);
    IncludeField(Key: PrimitivePropertyNames<TData>): this;
    IncludeObject<TCol extends ObjectPropertyNames<TData>, TIncl extends Unpacked<TData[TCol]>>(Key: TCol, Include: (q: Query<TIncl>) => any): this;
    IncludeSimpleFunction<TCol extends PrimitiveFunctionPropertyNames<TData>>(Key: TCol, ...args: [string, any][]): this;
    IncludeFunction<TCol extends FunctionPropertyNames<TData>>(Key: TCol, Include: (q: Query<Unpacked<TData[TCol]>>) => any, ...args: [string, any][]): this;
    ToQuery(): string;
}
export declare type ToGraphQLModel<T> = ToUnpackModel<ToUnpackModel<Pick<T, NonNullPropertyNames<T>>>>;
export {};
