import * as Knex from 'knex'; export declare function unflatten(o: any): any; export declare class TypedKnex { private knex; constructor(knex: Knex); query(tableClass: new () => T): ITypedQueryBuilder; } export declare function registerBeforeInsertTransform(f: (item: T, typedQueryBuilder: TypedQueryBuilder<{}, {}>) => T): void; export declare function registerBeforeUpdateTransform(f: (item: T, typedQueryBuilder: TypedQueryBuilder<{}, {}>) => T): void; export interface ITypedQueryBuilder { where: IWhere; andWhere: IWhere; orWhere: IWhere; whereNot: IWhere; selectColumns: ISelectColumns; selectColumn: ISelectColumn; orderBy: IKeysAsParametersReturnQueryBuider; innerJoinColumn: IKeysAsParametersReturnQueryBuider; leftOuterJoinColumn: IKeysAsParametersReturnQueryBuider; whereColumns: IWhereCompareTwoColumns; whereNull: IKeysAsParametersReturnQueryBuider; whereNotNull: IKeysAsParametersReturnQueryBuider; innerJoinTable: IJoinTable; leftOuterJoinTable: IJoinTable; leftOuterJoinTableOnFunction: IJoinTableMultipleOnClauses; selectRaw: ISelectRaw; findById: IFindById; whereIn: IWhereIn; whereNotIn: IWhereIn; whereBetween: IWhereBetween; whereNotBetween: IWhereBetween; whereExists: IWhereExists; orWhereExists: IWhereExists; whereNotExists: IWhereExists; orWhereNotExists: IWhereExists; groupBy: IGroupBy; having: IHaving; limit(value: number): ITypedQueryBuilder; offset(value: number): ITypedQueryBuilder; firstItemOrNull(): Promise; firstItem(): Promise; list(): Promise; useKnexQueryBuilder(f: (query: Knex.QueryBuilder) => void): void; toQuery(): string; insert(newObject: Partial): Promise; countResult(): Promise; delById(id: string): Promise; update(id: string, item: Partial): Promise; whereRaw(sql: string, ...bindings: string[]): ITypedQueryBuilder; havingIn(): void; havingNotIn(): void; havingNull(): void; havingNotNull(): void; havingExists(): void; havingNotExists(): void; havingRaw(): void; havingBetween(): void; havingNotBetween(): void; union(): void; unionAll(): void; returningColumn(): void; returningColumns(): void; transacting(trx: Knex.Transaction): void; minColumn(): void; countColumn(): void; countDistinctColumn(): void; maxColumn(): void; sumColumn(): void; sumDistinctColumn(): void; avgColumn(): void; avgDistinctColumn(): void; minResult(): void; countDistinctResult(): void; maxResult(): void; sumResult(): void; sumDistinctResult(): void; avgResult(): void; avgDistinctResult(): void; increment(): void; decrement(): void; truncate(): void; clearSelect(): void; clearWhere(): void; clearOrder(): void; distinct(): void; clone(): void; beginTransaction(): Promise; groupByRaw(): void; } export declare type TransformAll = { [Key in keyof T]: IT; }; export declare type FilterObjectsOnly = { [K in keyof T]: T[K] extends object ? K : never; }[keyof T]; export declare type FilterNonObjects = { [K in keyof T]: T[K] extends object ? never : K; }[keyof T]; export declare type ObjectToPrimitive = T extends String ? string : T extends Number ? number : T extends Boolean ? boolean : never; export declare type Operator = '=' | '!=' | '>' | '<' | string; export interface IConstructor { new (...args: any[]): T; } export declare type AddPropertyWithType, NewKeyType> = Original & Pick, NewKey>; export interface IKeysAsArguments { (key1: K1, key2: K2, key3: K3, ...keys: string[]): Return; (key1: K1, key2: K2, key3: K3): Return; (key1: K1, key2: K2): Return; (key1: K): Return; } export interface IKeysAsParametersReturnQueryBuider extends IKeysAsArguments> { } export declare type TypeWithIndexerOf = { [key: string]: T; }; export interface IJoinTable { , L1K1 extends keyof AddPropertyWithType, L2K1 extends keyof AddPropertyWithType, L2K2 extends keyof AddPropertyWithType[L2K1]>(newPropertyKey: NewPropertyKey, newPropertyClass: new () => NewPropertyType, column1: [L1K1] | [L2K1, L2K2], operator: Operator, column2: [L1K1] | [L2K1, L2K2]): ITypedQueryBuilder, Row>; } export interface IJoinOnClause { onColumns: (column1: [L1K1] | [L2K1, L2K2], operator: Operator, column2: [L1K1] | [L2K1, L2K2]) => IJoinOnClause; onNull: IKeysAsParametersReturnQueryBuider>; } interface IReferencedColumn { } export interface IJoinTableMultipleOnClauses { >(newPropertyKey: NewPropertyKey, newPropertyClass: new () => NewPropertyType, on: (join: IJoinOnClause>) => void): ITypedQueryBuilder, Row>; } export interface IWhereCompareTwoColumns { (column1: [L1K1] | [L2K1, L2K2], operator: Operator, column2: [L1K1] | [L2K1, L2K2] | IReferencedColumn): ITypedQueryBuilder; } export interface IGroupBy { (key1: K1, key2: K2, key3: K3, ...keys: string[]): ITypedQueryBuilder; (key1: K1, key2: K2, key3: K3): ITypedQueryBuilder; (key1: K1, key2: K2): ITypedQueryBuilder; (key1: K): ITypedQueryBuilder; } export interface ISelectRaw { >(name: TName, returnType: IConstructor, query: string): ITypedQueryBuilder>, TName> & Row>; } export interface ISelectColumn { (key1: K1, key2: K2, key3: K3, ...keys: string[]): ITypedQueryBuilder, TransformAll, TransformAll, any>>> & Row>; (key1: K1, key2: K2, key3: K3): ITypedQueryBuilder, TransformAll, Pick>> & Row>; (key1: K1, key2: K2): ITypedQueryBuilder, Pick> & Row>; (key1: K): ITypedQueryBuilder & Row>; } export interface IReferenceColumn { (key1: K1, key2: K2, key3: K3, ...keys: string[]): IReferencedColumn; (key1: K1, key2: K2, key3: K3): IReferencedColumn; (key1: K1, key2: K2): IReferencedColumn; (key1: K): IReferencedColumn; } export interface ISelectColumns { , K2 extends FilterNonObjects>(key1: K1, keys2: K2[]): ITypedQueryBuilder, Pick> & Prev>; >(keys: K[]): ITypedQueryBuilder & Row>; } export interface IFindById { , K2 extends FilterNonObjects>(id: string, key1: K1, keys2: K2[]): Promise<(TransformAll, Pick> & Prev) | void>; >(id: string, keys: K[]): Promise<(Pick & Row) | void>; } export interface IHaving { >(key1: K, operator: Operator, value: Model[K]): ITypedQueryBuilder; >(key1: K1, key2: K2, operator: Operator, value: Model[K1][K2]): ITypedQueryBuilder; >(key1: K1, key2: K2, key3: K3, operator: Operator, value: Model[K1][K2][K3]): ITypedQueryBuilder; (key1: K1, key2: K2, key3: K3, ...keysOperratorAndValue: any[]): ITypedQueryBuilder; } export interface IWhere { >(key1: K, value: Model[K]): ITypedQueryBuilder; >(key1: K1, key2: K2, value: Model[K1][K2]): ITypedQueryBuilder; >(key1: K1, key2: K2, key3: K3, value: Model[K1][K2][K3]): ITypedQueryBuilder; (key1: K1, key2: K2, key3: K3, ...keysAndValues: any[]): ITypedQueryBuilder; } export interface IWhereIn { >(key1: K, value: Model[K][]): ITypedQueryBuilder; >(key1: K1, key2: K2, value: Model[K1][K2][]): ITypedQueryBuilder; >(key1: K1, key2: K2, key3: K3, value: Model[K1][K2][K3][]): ITypedQueryBuilder; (key1: K1, key2: K2, key3: K3, ...keysAndValues: any[]): ITypedQueryBuilder; } export interface IWhereBetween { >(key1: K, range: [Model[K], Model[K]]): ITypedQueryBuilder; >(key1: K1, key2: K2, range: [Model[K1][K2], Model[K1][K2]]): ITypedQueryBuilder; >(key1: K1, key2: K2, key3: K3, range: [Model[K1][K2][K3], Model[K1][K2][K3]]): ITypedQueryBuilder; (key1: K1, key2: K2, key3: K3, ...keysAndValues: any[]): ITypedQueryBuilder; } export interface IWhereExists { (subQueryModel: new () => SubQueryModel, code: (subQuery: ITypedQueryBuilder, parent: ISelectColumn) => void): ITypedQueryBuilder; } export declare class TypedQueryBuilder implements ITypedQueryBuilder { private tableClass; private knex; columns: { name: string; }[]; private queryBuilder; private tableName; private extraJoinedProperties; constructor(tableClass: new () => ModelType, knex: Knex, queryBuilder?: Knex.QueryBuilder); delById(id: string): Promise; insert(newObject: Partial): Promise; insertItems(items: Partial[]): Promise; update(id: string, item: Partial): Promise; updateItems(items: { id: string; data: Partial; }[]): Promise; limit(value: number): any; offset(value: number): any; findById(id: string, columns: (keyof ModelType)[]): Promise; countResult(): Promise; firstItemOrNull(): Promise; firstItem(): Promise; selectColumn(): any; selectColumns(): any; orderBy(): any; list(): Promise; selectRaw(): any; innerJoinColumn(): this; leftOuterJoinColumn(): this; innerJoinTable(): this; leftOuterJoinTableOnFunction(): this; leftOuterJoinTable(): this; whereColumns(): this; toQuery(): string; whereNull(): this; whereNotNull(): this; where(): this; whereNot(): this; andWhere(): this; orWhere(): this; whereIn(): this; whereNotIn(): this; whereBetween(): this; whereNotBetween(): this; callQueryCallbackFunction(functionName: string, typeOfSubQuery: any, functionToCall: any): void; whereExists(): this; orWhereExists(): this; whereNotExists(): this; orWhereNotExists(): this; whereRaw(sql: string, ...bindings: string[]): this; having(): this; havingIn(): this; havingNotIn(): this; havingNull(): this; havingNotNull(): this; havingExists(): void; havingNotExists(): void; havingRaw(): void; havingBetween(): this; havingNotBetween(): this; union(): void; unionAll(): void; returningColumn(): void; returningColumns(): void; transacting(trx: Knex.Transaction): void; minColumn(): void; countColumn(): void; countDistinctColumn(): void; maxColumn(): void; sumColumn(): void; sumDistinctColumn(): void; avgColumn(): void; avgDistinctColumn(): void; minResult(): void; countDistinctResult(): void; maxResult(): void; sumResult(): void; sumDistinctResult(): void; avgResult(): void; avgDistinctResult(): void; increment(): this; decrement(): this; truncate(): void; clearSelect(): void; clearWhere(): void; clearOrder(): void; distinct(): void; clone(): void; beginTransaction(): Promise; groupBy(): this; groupByRaw(): void; useKnexQueryBuilder(f: (query: Knex.QueryBuilder) => void): void; private joinColumn; private getColumnNameFromArgumentsIgnoringLastParameter; private getColumnNameFromArgumentsIgnoringLastTwoParameters; private getColumnName; private getColumnSelectAlias; } export {};