diff --git a/test-tsd/querybuilder.test-d.ts b/test-tsd/querybuilder.test-d.ts index 5cae719483..6a0da10b39 100644 --- a/test-tsd/querybuilder.test-d.ts +++ b/test-tsd/querybuilder.test-d.ts @@ -11,17 +11,17 @@ const knexInstance = knex(clientConfig); declare module '../types' { namespace Knex { interface QueryBuilder { - customSelect( + customSelect ( value: number - ): Knex.QueryBuilder; + ): Promise>; } } } knex.QueryBuilder.extend('customSelect', function (value: number) { - return this.select(this.client.raw(`${value} as value`)); + return new Promise((r) => r(this.select(this.client.raw(`${value} as value`)))); }); const main = async () => { - expectType(await knexInstance('users').customSelect(42)); + expectType(await (await knexInstance('users').customSelect(42))); }; diff --git a/types/index.d.ts b/types/index.d.ts index 77dda90515..65a40027ec 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -13,8 +13,8 @@ import ResultTypes = require('./result'); import { Tables } from './tables'; -import { ConnectionOptions } from "tls"; -import { Stream } from "stream"; +import { ConnectionOptions } from 'tls'; +import { Stream } from 'stream'; // # Generic type-level utilities @@ -30,9 +30,10 @@ type StrKey = string & keyof T; // If T is unknown then convert to any, else retain original type UnknownToAny = unknown extends T ? any : T; -type CurlyCurlyToAny = T extends unknown ? // distribute - (() => U extends T ? 0 : 1) extends - (() => U extends {} ? 0 : 1) ? any : T +type CurlyCurlyToAny = T extends unknown // distribute + ? (() => U extends T ? 0 : 1) extends () => U extends {} ? 0 : 1 + ? any + : T : never; type UnknownOrCurlyCurlyToAny = [UnknownToAny | CurlyCurlyToAny][0]; type AnyToUnknown = unknown extends T ? unknown : T; @@ -42,8 +43,8 @@ type AnyOrUnknownToOther = unknown extends T1 ? T2 : T1; // This is primarily to keep the signatures more intuitive. type AugmentParams = TParams extends {} ? keyof TParams extends never - ? TTarget - : {} & TTarget & TParams + ? TTarget + : {} & TTarget & TParams : TTarget; // Check if provided keys (expressed as a single or union type) are members of TBase @@ -52,9 +53,9 @@ type AreKeysOf = Boxed extends Boxed : false; // https://stackoverflow.com/a/50375286/476712 -type UnionToIntersection = (U extends any - ? (k: U) => void - : never) extends ((k: infer I) => void) +type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ( + k: infer I +) => void ? I : never; @@ -89,8 +90,8 @@ type PartialOrAny = Boxed extends Boxed // to facilitates type-safe aliasing for object syntax type MappedAliasType = {} & { [K in keyof TAliasMapping]: TAliasMapping[K] extends keyof TBase - ? TBase[TAliasMapping[K]] - : any + ? TBase[TAliasMapping[K]] + : any; }; // Container type for situations when we want a partial/intersection eventually @@ -117,17 +118,17 @@ type DeferredKeySelection< TIntersectProps extends {} = {}, // Extra props which will be unioned with the result TUnionProps = never - > = { - // These properties are not actually used, but exist simply because - // typescript doesn't end up happy when type parameters are unused - _base: TBase; - _hasSelection: THasSelect; - _keys: TKeys; - _aliases: TAliasMapping; - _single: TSingle; - _intersectProps: TIntersectProps; - _unionProps: TUnionProps; - }; +> = { + // These properties are not actually used, but exist simply because + // typescript doesn't end up happy when type parameters are unused + _base: TBase; + _hasSelection: THasSelect; + _keys: TKeys; + _aliases: TAliasMapping; + _single: TSingle; + _intersectProps: TIntersectProps; + _unionProps: TUnionProps; +}; // An companion namespace for DeferredKeySelection which provides type operators // to build up participants of intersection/partial over multiple invocations @@ -149,7 +150,15 @@ declare namespace DeferredKeySelection { infer TIntersectProps, infer TUnionProps > - ? DeferredKeySelection + ? DeferredKeySelection< + TBase, + TKeys, + THasSelect, + TAliasMapping, + TSingle, + TIntersectProps, + TUnionProps + > : DeferredKeySelection; // If TSelection is already a deferred selection, then replace the base with TBase @@ -158,47 +167,68 @@ declare namespace DeferredKeySelection { // // For practical reasons applicable to current context, we always return arrays of // deferred selections. So, this particular operator may not be useful in generic contexts. - type ReplaceBase = UnwrapArrayMember< - TSelection - > extends DeferredKeySelection.Any - ? ArrayIfAlready, TBase>> - : unknown extends UnwrapArrayMember - ? ArrayIfAlready> - : TSelection; + type ReplaceBase = + UnwrapArrayMember extends DeferredKeySelection.Any + ? ArrayIfAlready< + TSelection, + DeferredKeySelection.SetBase, TBase> + > + : unknown extends UnwrapArrayMember + ? ArrayIfAlready> + : TSelection; // Type operators to substitute individual type parameters: type SetSingle< TSelection, TSingle extends boolean - > = TSelection extends DeferredKeySelection< - infer TBase, - infer TKeys, - infer THasSelect, - infer TAliasMapping, - any, - infer TIntersectProps, - infer TUnionProps - > - ? DeferredKeySelection + > = TSelection extends DeferredKeySelection< + infer TBase, + infer TKeys, + infer THasSelect, + infer TAliasMapping, + any, + infer TIntersectProps, + infer TUnionProps + > + ? DeferredKeySelection< + TBase, + TKeys, + THasSelect, + TAliasMapping, + TSingle, + TIntersectProps, + TUnionProps + > : never; type AddKey< TSelection, TKey extends string - > = TSelection extends DeferredKeySelection< - infer TBase, - infer TKeys, - any, - infer TAliasMapping, - infer TSingle, - infer TIntersectProps, - infer TUnionProps - > - ? DeferredKeySelection + > = TSelection extends DeferredKeySelection< + infer TBase, + infer TKeys, + any, + infer TAliasMapping, + infer TSingle, + infer TIntersectProps, + infer TUnionProps + > + ? DeferredKeySelection< + TBase, + TKeys | TKey, + true, + TAliasMapping, + TSingle, + TIntersectProps, + TUnionProps + > : DeferredKeySelection; - type AddAliases = TSelection extends DeferredKeySelection< + type AddAliases< + TSelection, + T extends {} + > = TSelection extends DeferredKeySelection< infer TBase, infer TKeys, infer THasSelect, @@ -207,7 +237,15 @@ declare namespace DeferredKeySelection { infer TIntersectProps, infer TUnionProps > - ? DeferredKeySelection + ? DeferredKeySelection< + TBase, + TKeys, + THasSelect, + TAliasMapping & T, + TSingle, + TIntersectProps, + TUnionProps + > : DeferredKeySelection; type AddUnionMember = TSelection extends DeferredKeySelection< @@ -219,15 +257,25 @@ declare namespace DeferredKeySelection { infer TIntersectProps, infer TUnionProps > - ? DeferredKeySelection + ? DeferredKeySelection< + TBase, + TKeys, + THasSelect, + TAliasMapping, + TSingle, + TIntersectProps, + TUnionProps | T + > : DeferredKeySelection; // Convenience utility to set base, keys and aliases in a single type // application - type Augment = AddAliases< - AddKey, TKey>, - TAliasMapping - >; + type Augment< + T, + TBase, + TKey extends string, + TAliasMapping extends {} = {} + > = AddAliases, TKey>, TAliasMapping>; // Core resolution logic -- Refer to docs for DeferredKeySelection for specifics type ResolveOne = TSelection extends DeferredKeySelection< @@ -240,27 +288,30 @@ declare namespace DeferredKeySelection { infer TUnionProps > ? UnknownOrCurlyCurlyToAny< - // ^ We convert final result to any if it is unknown for backward compatibility. - // Historically knex typings have been liberal with returning any and changing - // default return type to unknown would be a major breaking change for users. - // - // So we compromise on type safety here and return any. - AugmentParams< - AnyToUnknown extends {} - // ^ Conversion of any -> unknown is needed here to prevent distribution - // of any over the conditional - ? TSingle extends true - ? TKeys extends keyof TBase - ? TBase[TKeys] - : any - : AugmentParams< - true extends THasSelect ? PartialOrAny : TBase, - MappedAliasType - > - : unknown, - TIntersectProps - > | TUnionProps - > + // ^ We convert final result to any if it is unknown for backward compatibility. + // Historically knex typings have been liberal with returning any and changing + // default return type to unknown would be a major breaking change for users. + // + // So we compromise on type safety here and return any. + | AugmentParams< + AnyToUnknown extends {} + ? // ^ Conversion of any -> unknown is needed here to prevent distribution + // of any over the conditional + TSingle extends true + ? TKeys extends keyof TBase + ? TBase[TKeys] + : any + : AugmentParams< + true extends THasSelect + ? PartialOrAny + : TBase, + MappedAliasType + > + : unknown, + TIntersectProps + > + | TUnionProps + > : TSelection; type Resolve = TSelection extends DeferredKeySelection.Any @@ -272,7 +323,10 @@ declare namespace DeferredKeySelection { : UnknownOrCurlyCurlyToAny>; } -type AggregationQueryResult = ArrayIfAlready< +type AggregationQueryResult< + TResult, + TIntersectProps2 extends {} +> = ArrayIfAlready< TResult, UnwrapArrayMember extends DeferredKeySelection< infer TBase, @@ -283,10 +337,18 @@ type AggregationQueryResult = ArrayIfAlrea infer TIntersectProps, infer TUnionProps > - ? true extends THasSelect - ? DeferredKeySelection - : DeferredKeySelection<{}, never, true, {}, false, TIntersectProps2> - : TIntersectProps2 + ? true extends THasSelect + ? DeferredKeySelection< + TBase, + TKeys, + THasSelect, + TAliasMapping, + TSingle, + TIntersectProps & TIntersectProps2, + TUnionProps + > + : DeferredKeySelection<{}, never, true, {}, false, TIntersectProps2> + : TIntersectProps2 >; // If we have more categories of deferred selection in future, @@ -298,7 +360,7 @@ type ResolveResult = DeferredKeySelection.Resolve; type Callback = Function; type Client = Function; -type Dict = { [k: string]: T; }; +type Dict = { [k: string]: T }; type SafePick = T extends {} ? Pick : any; @@ -313,12 +375,19 @@ interface DMLOptions { } export interface Knex - extends Knex.QueryInterface, events.EventEmitter { + extends Knex.QueryInterface, + events.EventEmitter { ( tableName: TTable, options?: TableOptions - ): Knex.QueryBuilder, DeferredKeySelection>, never>[]>; - []>( + ): Knex.QueryBuilder< + Knex.TableType, + DeferredKeySelection>, never>[] + >; + < + TRecord2 extends {} = TRecord, + TResult2 = DeferredKeySelection[] + >( tableName?: Knex.TableDescriptor | Knex.AliasDict, options?: TableOptions ): Knex.QueryBuilder; @@ -330,9 +399,7 @@ export interface Knex transactionProvider( config?: Knex.TransactionConfig ): Knex.TransactionProvider; - transaction( - config?: Knex.TransactionConfig - ): Promise; + transaction(config?: Knex.TransactionConfig): Promise; transaction( transactionScope?: null, config?: Knex.TransactionConfig @@ -350,14 +417,14 @@ export interface Knex data: TRecord2 extends Knex.CompositeTableType ? ReadonlyArray> : ReadonlyArray>, - chunkSize?: number, + chunkSize?: number ): Knex.BatchInsertBuilder; schema: Knex.SchemaBuilder; - queryBuilder(): Knex.QueryBuilder< - TRecord2, - TResult2 - >; + queryBuilder< + TRecord2 extends {} = TRecord, + TResult2 = TResult + >(): Knex.QueryBuilder; client: any; migrate: Knex.Migrator; @@ -380,44 +447,37 @@ export declare namespace knex { fn: ( this: Knex.QueryBuilder, ...args: any[] - ) => Knex.QueryBuilder + ) => + | Knex.QueryBuilder + | Promise< + | Knex.QueryBuilder + | DeferredKeySelection.Resolve + > ): void; } class TableBuilder { - static extend( + static extend( methodName: string, - fn: ( - this: Knex.TableBuilder, - ...args: any[] - ) => Knex.TableBuilder + fn: (this: T, ...args: any[]) => B ): void; } class ViewBuilder { - static extend( + static extend( methodName: string, - fn: ( - this: Knex.ViewBuilder, - ...args: any[] - ) => Knex.ViewBuilder + fn: (this: T, ...args: any[]) => B ): void; } class SchemaBuilder { - static extend( + static extend( methodName: string, - fn: ( - this: Knex.SchemaBuilder, - ...args: any[] - ) => Knex.SchemaBuilder + fn: (this: T, ...args: any[]) => B ): void; } class ColumnBuilder { - static extend( + static extend( methodName: string, - fn: ( - this: Knex.ColumnBuilder, - ...args: any[] - ) => Knex.ColumnBuilder + fn: (this: T, ...args: any[]) => B ): void; } @@ -460,15 +520,16 @@ export declare namespace Knex { type TableDescriptor = string | Knex.Raw | Knex.QueryBuilder; - type Lookup = - TKey extends keyof TRegistry ? - TRegistry[TKey] : - TDefault; + type Lookup< + TRegistry extends {}, + TKey extends string, + TDefault = never + > = TKey extends keyof TRegistry ? TRegistry[TKey] : TDefault; type MaybeRawColumn = TColumn | Raw; type MaybeRawRecord = { - [K in keyof TRecord]: MaybeRawColumn + [K in keyof TRecord]: MaybeRawColumn; }; type DbColumn = Readonly>; @@ -477,11 +538,16 @@ export declare namespace Knex { type DbRecordArr = Readonly>>; - export type CompositeTableType, TUpsert = Partial> = { - base: TBase, - insert: TInsert, - update: TUpdate, - upsert: TUpsert, + export type CompositeTableType< + TBase, + TInsert = TBase, + TUpdate = Partial, + TUpsert = Partial + > = { + base: TBase; + insert: TInsert; + update: TUpdate; + upsert: TUpsert; }; type TableNames = keyof Tables; @@ -490,20 +556,40 @@ export declare namespace Knex { type TableType = Tables[TTable]; - type ResolveTableType = TCompositeTableType extends CompositeTableType + type ResolveTableType< + TCompositeTableType, + TScope extends TableInterfaceScope = 'base' + > = TCompositeTableType extends CompositeTableType ? TCompositeTableType[TScope] : TCompositeTableType; interface OnConflictQueryBuilder { ignore(): QueryBuilder; merge(mergeColumns?: (keyof TRecord)[]): QueryBuilder; - merge(data?: Extract>, object>): QueryBuilder; + merge( + data?: Extract>, object> + ): QueryBuilder; } // // QueryInterface // - type ClearStatements = "with" | "select" | "columns" | "hintComments" | "where" | "union" | "using" | "join" | "group" | "order" | "having" | "limit" | "offset" | "counter" | "counters"; + type ClearStatements = + | 'with' + | 'select' + | 'columns' + | 'hintComments' + | 'where' + | 'union' + | 'using' + | 'join' + | 'group' + | 'order' + | 'having' + | 'limit' + | 'offset' + | 'counter' + | 'counters'; interface QueryInterface { select: Select; @@ -655,8 +741,8 @@ export declare namespace Knex { any, any > - ? DeferredKeySelection[] - : TResult + ? DeferredKeySelection[] + : TResult >; clearWhere(): QueryBuilder; clearGroup(): QueryBuilder; @@ -666,12 +752,26 @@ export declare namespace Knex { clear(statement: ClearStatements): QueryBuilder; // Paging - offset(offset: number, options?: boolean | Readonly<{skipBinding?: boolean}>): QueryBuilder; - limit(limit: number, options?: string | Readonly<{skipBinding?: boolean}>): QueryBuilder; + offset( + offset: number, + options?: boolean | Readonly<{ skipBinding?: boolean }> + ): QueryBuilder; + limit( + limit: number, + options?: string | Readonly<{ skipBinding?: boolean }> + ): QueryBuilder; // Aggregation - count: AsymmetricAggregation>; - countDistinct: AsymmetricAggregation>; + count: AsymmetricAggregation< + TRecord, + TResult, + Lookup + >; + countDistinct: AsymmetricAggregation< + TRecord, + TResult, + Lookup + >; min: TypePreservingAggregation; max: TypePreservingAggregation; sum: TypePreservingAggregation; @@ -703,7 +803,10 @@ export declare namespace Knex { rowNumber: AnalyticFunction; // Others - first: Select, undefined>>; + first: Select< + TRecord, + DeferredKeySelection.AddUnionMember, undefined> + >; pluck( column: K @@ -712,7 +815,9 @@ export declare namespace Knex { insert( data: TRecord extends CompositeTableType - ? ResolveTableType | ReadonlyArray> + ? + | ResolveTableType + | ReadonlyArray> : DbRecordArr | ReadonlyArray>, returning: '*', options?: DMLOptions @@ -726,7 +831,9 @@ export declare namespace Knex { >[] >( data: TRecord extends CompositeTableType - ? ResolveTableType | ReadonlyArray> + ? + | ResolveTableType + | ReadonlyArray> : DbRecordArr | ReadonlyArray>, returning: TKey, options?: DMLOptions @@ -740,7 +847,9 @@ export declare namespace Knex { >[] >( data: TRecord extends CompositeTableType - ? ResolveTableType | ReadonlyArray> + ? + | ResolveTableType + | ReadonlyArray> : DbRecordArr | ReadonlyArray>, returning: readonly TKey[], options?: DMLOptions @@ -754,7 +863,9 @@ export declare namespace Knex { >[] >( data: TRecord extends CompositeTableType - ? ResolveTableType | ReadonlyArray> + ? + | ResolveTableType + | ReadonlyArray> : DbRecordArr | ReadonlyArray>, returning: TKey, options?: DMLOptions @@ -768,20 +879,26 @@ export declare namespace Knex { >[] >( data: TRecord extends CompositeTableType - ? ResolveTableType | ReadonlyArray> + ? + | ResolveTableType + | ReadonlyArray> : DbRecordArr | ReadonlyArray>, returning: readonly TKey[], options?: DMLOptions ): QueryBuilder; insert( data: TRecord extends CompositeTableType - ? ResolveTableType | ReadonlyArray> + ? + | ResolveTableType + | ReadonlyArray> : DbRecordArr | ReadonlyArray> ): QueryBuilder; upsert( data: TRecord extends CompositeTableType - ? ResolveTableType | ReadonlyArray> + ? + | ResolveTableType + | ReadonlyArray> : DbRecordArr | ReadonlyArray>, returning: '*', options?: DMLOptions @@ -792,10 +909,12 @@ export declare namespace Knex { UnwrapArrayMember, ResolveTableType, TKey - >[] - >( + >[] + >( data: TRecord extends CompositeTableType - ? ResolveTableType | ReadonlyArray> + ? + | ResolveTableType + | ReadonlyArray> : DbRecordArr | ReadonlyArray>, returning: TKey, options?: DMLOptions @@ -806,10 +925,12 @@ export declare namespace Knex { UnwrapArrayMember, ResolveTableType, TKey - >[] - >( + >[] + >( data: TRecord extends CompositeTableType - ? ResolveTableType | ReadonlyArray> + ? + | ResolveTableType + | ReadonlyArray> : DbRecordArr | ReadonlyArray>, returning: readonly TKey[], options?: DMLOptions @@ -820,10 +941,12 @@ export declare namespace Knex { UnwrapArrayMember, TRecord, TKey - >[] - >( + >[] + >( data: TRecord extends CompositeTableType - ? ResolveTableType | ReadonlyArray> + ? + | ResolveTableType + | ReadonlyArray> : DbRecordArr | ReadonlyArray>, returning: TKey, options?: DMLOptions @@ -834,17 +957,21 @@ export declare namespace Knex { UnwrapArrayMember, TRecord, TKey - >[] - >( + >[] + >( data: TRecord extends CompositeTableType - ? ResolveTableType | ReadonlyArray> + ? + | ResolveTableType + | ReadonlyArray> : DbRecordArr | ReadonlyArray>, returning: readonly TKey[], options?: DMLOptions ): QueryBuilder; upsert( data: TRecord extends CompositeTableType - ? ResolveTableType | ReadonlyArray> + ? + | ResolveTableType + | ReadonlyArray> : DbRecordArr | ReadonlyArray> ): QueryBuilder; @@ -903,7 +1030,9 @@ export declare namespace Knex { TKey >[] >( - data: TRecord extends CompositeTableType ? ResolveTableType : DbRecordArr, + data: TRecord extends CompositeTableType + ? ResolveTableType + : DbRecordArr, returning: TKey, options?: DMLOptions ): QueryBuilder; @@ -915,7 +1044,9 @@ export declare namespace Knex { TKey >[] >( - data: TRecord extends CompositeTableType ? ResolveTableType : DbRecordArr, + data: TRecord extends CompositeTableType + ? ResolveTableType + : DbRecordArr, returning: readonly TKey[], options?: DMLOptions ): QueryBuilder; @@ -927,7 +1058,9 @@ export declare namespace Knex { TKey >[] >( - data: TRecord extends CompositeTableType ? ResolveTableType : DbRecordArr, + data: TRecord extends CompositeTableType + ? ResolveTableType + : DbRecordArr, returning: TKey | readonly TKey[], options?: DMLOptions ): QueryBuilder; @@ -939,17 +1072,27 @@ export declare namespace Knex { TKey >[] >( - data: TRecord extends CompositeTableType ? ResolveTableType : DbRecordArr, + data: TRecord extends CompositeTableType + ? ResolveTableType + : DbRecordArr, returning: readonly TKey[], options?: DMLOptions ): QueryBuilder; update( - data: TRecord extends CompositeTableType ? ResolveTableType : DbRecordArr + data: TRecord extends CompositeTableType + ? ResolveTableType + : DbRecordArr ): QueryBuilder; - update(columnName: string, value: Value): QueryBuilder; + update( + columnName: string, + value: Value + ): QueryBuilder; - returning(column: '*', options?: DMLOptions): QueryBuilder[]>; + returning( + column: '*', + options?: DMLOptions + ): QueryBuilder[]>; returning< TKey extends StrKey>, TResult2 = DeferredKeySelection.Augment< @@ -964,7 +1107,11 @@ export declare namespace Knex { returning< TKey extends StrKey>, TResult2 = DeferredKeySelection.SetSingle< - DeferredKeySelection.Augment, ResolveTableType, TKey>, + DeferredKeySelection.Augment< + UnwrapArrayMember, + ResolveTableType, + TKey + >, false >[] >( @@ -976,28 +1123,18 @@ export declare namespace Knex { options?: DMLOptions ): QueryBuilder; - onConflict< - TKey extends StrKey> - >( + onConflict>>( column: TKey ): OnConflictQueryBuilder; - onConflict< - TKey extends StrKey> - >( + onConflict>>( columns: readonly TKey[] ): OnConflictQueryBuilder; - onConflict( - columns: string - ): OnConflictQueryBuilder; + onConflict(columns: string): OnConflictQueryBuilder; - onConflict( - columns: string[] - ): OnConflictQueryBuilder; + onConflict(columns: string[]): OnConflictQueryBuilder; - onConflict( - raw: Raw - ): OnConflictQueryBuilder; + onConflict(raw: Raw): OnConflictQueryBuilder; onConflict(): OnConflictQueryBuilder; @@ -1073,79 +1210,98 @@ export declare namespace Knex { (columnName: string): QueryBuilder; } - type IntersectAliases = - UnionToIntersection< - IncompatibleToAlt< - AliasUT extends (infer I)[] + type IntersectAliases = UnionToIntersection< + IncompatibleToAlt< + AliasUT extends (infer I)[] ? I extends Ref - ? TMapping - : I + ? TMapping + : I : never, - Dict, - {} - > - > & {}; // filters out `null` and `undefined` + Dict, + {} + > + > & {}; // filters out `null` and `undefined` interface AliasQueryBuilder { < AliasUT extends InferrableColumnDescriptor>[], - TResult2 = ArrayIfAlready, - ResolveTableType, - IncompatibleToAlt, string, never>, - IntersectAliases - >> - >( + TResult2 = ArrayIfAlready< + TResult, + DeferredKeySelection.Augment< + UnwrapArrayMember, + ResolveTableType, + IncompatibleToAlt, string, never>, + IntersectAliases + > + > + >( ...aliases: AliasUT ): QueryBuilder; < AliasUT extends InferrableColumnDescriptor>[], - TResult2 = ArrayIfAlready, - ResolveTableType, - IncompatibleToAlt, string, never>, - IntersectAliases - >> - >( + TResult2 = ArrayIfAlready< + TResult, + DeferredKeySelection.Augment< + UnwrapArrayMember, + ResolveTableType, + IncompatibleToAlt, string, never>, + IntersectAliases + > + > + >( aliases: AliasUT ): QueryBuilder; < AliasUT extends (Dict | string)[], - TResult2 = ArrayIfAlready, - ResolveTableType, - IncompatibleToAlt, string, never>, - IntersectAliases - >> - >( + TResult2 = ArrayIfAlready< + TResult, + DeferredKeySelection.Augment< + UnwrapArrayMember, + ResolveTableType, + IncompatibleToAlt, string, never>, + IntersectAliases + > + > + >( ...aliases: AliasUT ): QueryBuilder; < AliasUT extends (Dict | string)[], - TResult2 = ArrayIfAlready, - TRecord, - IncompatibleToAlt, string, never>, - IntersectAliases - >> - >( + TResult2 = ArrayIfAlready< + TResult, + DeferredKeySelection.Augment< + UnwrapArrayMember, + TRecord, + IncompatibleToAlt, string, never>, + IntersectAliases + > + > + >( aliases: AliasUT ): QueryBuilder; } interface Select extends AliasQueryBuilder, - ColumnNameQueryBuilder { + ColumnNameQueryBuilder { (): QueryBuilder; - , TInnerRecord extends {} = any, TInnerResult = any>( + < + TResult2 = ArrayIfAlready, + TInnerRecord extends {} = any, + TInnerResult = any + >( ...subQueryBuilders: readonly QueryBuilder[] ): QueryBuilder; - , TInnerRecord extends {} = any, TInnerResult = any>( + < + TResult2 = ArrayIfAlready, + TInnerRecord extends {} = any, + TInnerResult = any + >( subQueryBuilders: readonly QueryBuilder[] ): QueryBuilder; } @@ -1158,20 +1314,42 @@ export declare namespace Knex { } interface JsonExtract { - (column: string | Raw | QueryBuilder, path: string, alias?: string, singleValue?: boolean): QueryBuilder; - (column: JsonExtraction[] | any[][], singleValue?: boolean): QueryBuilder; + ( + column: string | Raw | QueryBuilder, + path: string, + alias?: string, + singleValue?: boolean + ): QueryBuilder; + (column: JsonExtraction[] | any[][], singleValue?: boolean): QueryBuilder< + TRecord, + TResult + >; } interface JsonSet { - (column: string | Raw | QueryBuilder, path: string, value: any, alias?: string): QueryBuilder; + ( + column: string | Raw | QueryBuilder, + path: string, + value: any, + alias?: string + ): QueryBuilder; } interface JsonInsert { - (column: string | Raw | QueryBuilder, path: string, value: any, alias?: string): QueryBuilder; + ( + column: string | Raw | QueryBuilder, + path: string, + value: any, + alias?: string + ): QueryBuilder; } interface JsonRemove { - (column: string | Raw | QueryBuilder, path: string, alias?: string): QueryBuilder; + ( + column: string | Raw | QueryBuilder, + path: string, + alias?: string + ): QueryBuilder; } interface HintComment { @@ -1183,29 +1361,32 @@ export declare namespace Knex { < TTable extends TableNames, TRecord2 extends {} = TableType, - TResult2 = DeferredKeySelection.ReplaceBase> - >( + TResult2 = DeferredKeySelection.ReplaceBase< + TResult, + ResolveTableType + > + >( tableName: TTable, options?: TableOptions ): QueryBuilder; < TRecord2 extends {} = {}, TResult2 = DeferredKeySelection.ReplaceBase - >( + >( tableName: TableDescriptor | AliasDict, options?: TableOptions ): QueryBuilder; < TRecord2 extends {} = {}, TResult2 = DeferredKeySelection.ReplaceBase - >( + >( callback: Function, options?: TableOptions ): QueryBuilder; < TRecord2 extends {} = {}, TResult2 = DeferredKeySelection.ReplaceBase - >( + >( raw: Raw, options?: TableOptions ): QueryBuilder; @@ -1236,15 +1417,15 @@ export declare namespace Knex { TJoinTargetRecord extends {} = any, TRecord2 extends {} = TRecord & TJoinTargetRecord, TResult2 = DeferredKeySelection.ReplaceBase - >( + >( raw: Raw ): QueryBuilder; < TTable extends TableNames, TRecord2 extends {} = ResolveTableType & - ResolveTableType>, + ResolveTableType>, TResult2 = DeferredKeySelection.ReplaceBase - >( + >( tableName: TTable, clause: JoinCallback ): QueryBuilder; @@ -1252,7 +1433,7 @@ export declare namespace Knex { TJoinTargetRecord extends {} = any, TRecord2 extends {} = TRecord & TJoinTargetRecord, TResult2 = DeferredKeySelection.ReplaceBase - >( + >( tableName: TableDescriptor | AliasDict | QueryCallback, clause: JoinCallback ): QueryBuilder; @@ -1260,7 +1441,7 @@ export declare namespace Knex { TJoinTargetRecord extends {} = any, TRecord2 extends {} = TRecord & TJoinTargetRecord, TResult2 = DeferredKeySelection.ReplaceBase - >( + >( tableName: TableDescriptor | AliasDict | QueryCallback, columns: { [key: string]: string | number | boolean | Raw } ): QueryBuilder; @@ -1268,19 +1449,20 @@ export declare namespace Knex { TJoinTargetRecord extends {} = any, TRecord2 extends {} = TRecord & TJoinTargetRecord, TResult2 = DeferredKeySelection.ReplaceBase - >( + >( tableName: TableDescriptor | AliasDict | QueryCallback, raw: Raw ): QueryBuilder; < TTable1 extends TableNames, TTable2 extends TableNames, - TKey1 extends StrKey>> & StrKey, + TKey1 extends StrKey>> & + StrKey, TKey2 extends StrKey>>, TRecord1 = ResolveTableType, TRecord2 extends {} = TRecord1 & ResolveTableType>, TResult2 = DeferredKeySelection.ReplaceBase - >( + >( tableName: TTable2, column1: `${TTable1}.${TKey1}`, column2: `${TTable2}.${TKey2}` @@ -1288,12 +1470,13 @@ export declare namespace Knex { < TTable1 extends TableNames, TTable2 extends TableNames, - TKey1 extends StrKey>> & StrKey, + TKey1 extends StrKey>> & + StrKey, TKey2 extends StrKey>>, TRecord1 = ResolveTableType, TRecord2 extends {} = TRecord1 & ResolveTableType>, TResult2 = DeferredKeySelection.ReplaceBase - >( + >( tableName: TTable2, column1: `${TTable2}.${TKey2}`, column2: `${TTable1}.${TKey1}` @@ -1302,7 +1485,7 @@ export declare namespace Knex { TJoinTargetRecord extends {} = any, TRecord2 extends {} = TRecord & TJoinTargetRecord, TResult2 = DeferredKeySelection.ReplaceBase - >( + >( tableName: TableDescriptor | AliasDict | QueryCallback, column1: string, column2: string @@ -1311,7 +1494,7 @@ export declare namespace Knex { TJoinTargetRecord extends {} = any, TRecord2 extends {} = TRecord & TJoinTargetRecord, TResult2 = DeferredKeySelection.ReplaceBase - >( + >( tableName: TableDescriptor | AliasDict | QueryCallback, column1: string, raw: Raw @@ -1319,12 +1502,13 @@ export declare namespace Knex { < TTable1 extends TableNames, TTable2 extends TableNames, - TKey1 extends StrKey>> & StrKey, + TKey1 extends StrKey>> & + StrKey, TKey2 extends StrKey>>, TRecord1 = ResolveTableType, TRecord2 extends {} = TRecord1 & ResolveTableType>, TResult2 = DeferredKeySelection.ReplaceBase - >( + >( tableName: TTable2, column1: `${TTable1}.${TKey1}`, operator: string, @@ -1333,22 +1517,23 @@ export declare namespace Knex { < TTable1 extends TableNames, TTable2 extends TableNames, - TKey1 extends StrKey>> & StrKey, + TKey1 extends StrKey>> & + StrKey, TKey2 extends StrKey>>, TRecord1 = ResolveTableType, TRecord2 extends {} = TRecord1 & ResolveTableType>, TResult2 = DeferredKeySelection.ReplaceBase - >( + >( tableName: TTable2, column1: `${TTable2}.${TKey2}`, operator: string, - column2: `${TTable1}.${TKey1}`, + column2: `${TTable1}.${TKey1}` ): QueryBuilder; < TJoinTargetRecord extends {} = any, TRecord2 extends {} = TRecord & TJoinTargetRecord, TResult2 = DeferredKeySelection.ReplaceBase - >( + >( tableName: TableDescriptor | AliasDict | QueryCallback, column1: string, operator: string, @@ -1405,8 +1590,18 @@ export declare namespace Knex { onNotBetween(column1: string, range: readonly [any, any]): JoinClause; andOnNotBetween(column1: string, range: readonly [any, any]): JoinClause; orOnNotBetween(column1: string, range: readonly [any, any]): JoinClause; - onJsonPathEquals(columnFirst: string, jsonPathFirst: string, columnSecond: string, jsonPathSecond: string): JoinClause; - orOnJsonPathEquals(columnFirst: string, jsonPathFirst: string, columnSecond: string, jsonPathSecond: string): JoinClause; + onJsonPathEquals( + columnFirst: string, + jsonPathFirst: string, + columnSecond: string, + jsonPathSecond: string + ): JoinClause; + orOnJsonPathEquals( + columnFirst: string, + jsonPathFirst: string, + columnSecond: string, + jsonPathSecond: string + ): JoinClause; using( column: string | readonly string[] | Raw | { [key: string]: string | Raw } ): JoinClause; @@ -1426,19 +1621,26 @@ export declare namespace Knex { interface With extends WithRaw, - WithWrapped {} + WithWrapped {} interface WithRaw { (alias: string, raw: Raw | QueryBuilder): QueryBuilder; - (alias: string, sql: string, bindings?: readonly Value[] | Object): QueryBuilder< - TRecord, - TResult - >; - (alias: string, columnList: string[], raw: Raw | QueryBuilder): QueryBuilder; - (alias: string, columnList: string[], sql: string, bindings?: readonly Value[] | Object): QueryBuilder< - TRecord, - TResult - >; + ( + alias: string, + sql: string, + bindings?: readonly Value[] | Object + ): QueryBuilder; + ( + alias: string, + columnList: string[], + raw: Raw | QueryBuilder + ): QueryBuilder; + ( + alias: string, + columnList: string[], + sql: string, + bindings?: readonly Value[] | Object + ): QueryBuilder; } interface WithSchema { @@ -1451,7 +1653,11 @@ export declare namespace Knex { alias: string, callback: (queryBuilder: QueryBuilder) => any ): QueryBuilder; - (alias: string, columnList: string[], queryBuilder: QueryBuilder): QueryBuilder; + ( + alias: string, + columnList: string[], + queryBuilder: QueryBuilder + ): QueryBuilder; ( alias: string, columnList: string[], @@ -1461,13 +1667,16 @@ export declare namespace Knex { interface Where extends WhereRaw, - WhereWrapped, - WhereNull { + WhereWrapped, + WhereNull { (raw: Raw): QueryBuilder; (callback: QueryCallback): QueryBuilder; - (object: DbRecord>): QueryBuilder; + (object: DbRecord>): QueryBuilder< + TRecord, + TResult + >; (object: Readonly): QueryBuilder; @@ -1489,7 +1698,11 @@ export declare namespace Knex { TResult >; - , TRecordInner extends {}, TResultInner>( + < + T extends keyof ResolveTableType, + TRecordInner extends {}, + TResultInner + >( columnName: T, operator: ComparisonOperator, value: QueryBuilder @@ -1532,7 +1745,10 @@ export declare namespace Knex { columnName: K, range: readonly [DbColumn, DbColumn] ): QueryBuilder; - (columnName: string, range: readonly [Value, Value]): QueryBuilder; + (columnName: string, range: readonly [Value, Value]): QueryBuilder< + TRecord, + TResult + >; } interface WhereExists { @@ -1547,7 +1763,12 @@ export declare namespace Knex { } interface WhereJsonPath { - (columnName: keyof TRecord, jsonPath: string, operator: string, value: any): QueryBuilder; + ( + columnName: keyof TRecord, + jsonPath: string, + operator: string, + value: any + ): QueryBuilder; } interface WhereIn { @@ -1555,18 +1776,20 @@ export declare namespace Knex { columnName: K, values: readonly DbColumn[K]>[] | QueryCallback ): QueryBuilder; - (columnName: string, values: readonly Value[] | QueryCallback): QueryBuilder< - TRecord, - TResult - >; + ( + columnName: string, + values: readonly Value[] | QueryCallback + ): QueryBuilder; >( columnNames: readonly K[], - values: readonly (readonly DbColumn[K]>[])[] | QueryCallback + values: + | readonly (readonly DbColumn[K]>[])[] + | QueryCallback + ): QueryBuilder; + ( + columnNames: readonly string[], + values: readonly Value[][] | QueryCallback ): QueryBuilder; - (columnNames: readonly string[], values: readonly Value[][] | QueryCallback): QueryBuilder< - TRecord, - TResult - >; ( columnName: K, values: QueryBuilder @@ -1589,11 +1812,18 @@ export declare namespace Knex { // by extracting out a common base interface will not work because order of overloads // is significant. - interface AsymmetricAggregation { + interface AsymmetricAggregation< + TRecord extends {} = any, + TResult = unknown[], + TValue = any + > { < - TOptions extends { "as": string }, - TResult2 = AggregationQueryResult - >( + TOptions extends { as: string }, + TResult2 = AggregationQueryResult< + TResult, + { [k in TOptions['as']]: TValue } + > + >( columnName: Readonly>, options: Readonly ): QueryBuilder; @@ -1602,88 +1832,133 @@ export declare namespace Knex { ): QueryBuilder; < TAliases extends {} = Record, - TResult2 = AggregationQueryResult - >(aliases: TAliases): QueryBuilder; + TResult2 = AggregationQueryResult< + TResult, + { [k in keyof TAliases]?: TValue } + > + >( + aliases: TAliases + ): QueryBuilder; >>( - ...columnNames: ReadonlyArray> | Knex.Raw | string> + ...columnNames: ReadonlyArray< + | Readonly> + | Knex.Raw + | string + > ): QueryBuilder; } - interface TypePreservingAggregation { + interface TypePreservingAggregation< + TRecord extends {} = any, + TResult = unknown[], + TValue = any + > { < TKey extends keyof ResolveTableType, - TOptions extends { "as": string }, - TResult2 = AggregationQueryResult[TKey] - }> - >( + TOptions extends { as: string }, + TResult2 = AggregationQueryResult< + TResult, + { + [k in TOptions['as']]: ResolveTableType[TKey]; + } + > + >( columnName: Readonly, options: Readonly ): QueryBuilder; < TKey extends keyof ResolveTableType, - TResult2 = AggregationQueryResult[TKey]>> - >( + TResult2 = AggregationQueryResult< + TResult, + Dict[TKey]> + > + >( ...columnNames: readonly TKey[] ): QueryBuilder; < - TAliases extends {} = Readonly>, - TResult2 = AggregationQueryResult - >(aliases: TAliases): QueryBuilder; + TAliases extends {} = Readonly< + Record + >, + TResult2 = AggregationQueryResult< + TResult, + { + // We have optional here because in most dialects aggregating by multiple keys simultaneously + // causes rest of the keys to be dropped and only first to be considered + [K in keyof TAliases]?: K extends keyof TRecord ? TRecord[K] : TValue; + } + > + >( + aliases: TAliases + ): QueryBuilder; >>( - ...columnNames: ReadonlyArray> | Knex.Raw | string> + ...columnNames: ReadonlyArray< + | Readonly> + | Knex.Raw + | string + > ): QueryBuilder; } interface AnalyticFunction { < TAlias extends string, - TResult2 = AggregationQueryResult - >(alias: TAlias, raw: Raw | QueryCallback): QueryBuilder; + TResult2 = AggregationQueryResult + >( + alias: TAlias, + raw: Raw | QueryCallback + ): QueryBuilder; < TAlias extends string, TKey extends keyof ResolveTableType, - TResult2 = AggregationQueryResult - >(alias: TAlias, - orderBy: TKey | TKey[] | { columnName: TKey, order?: 'asc' | 'desc', nulls?: 'first' | 'last' }, - partitionBy?: TKey | TKey[] | { columnName: TKey, order?: 'asc' | 'desc' }): - QueryBuilder< - TRecord, - TResult2 - >; + TResult2 = AggregationQueryResult + >( + alias: TAlias, + orderBy: + | TKey + | TKey[] + | { + columnName: TKey; + order?: 'asc' | 'desc'; + nulls?: 'first' | 'last'; + }, + partitionBy?: TKey | TKey[] | { columnName: TKey; order?: 'asc' | 'desc' } + ): QueryBuilder; } interface GroupBy extends RawQueryBuilder, - ColumnNameQueryBuilder {} + ColumnNameQueryBuilder {} interface OrderBy { - (columnName: keyof TRecord | QueryBuilder, order?: 'asc' | 'desc', nulls?: 'first' | 'last'): QueryBuilder< - TRecord, - TResult - >; - (columnName: string | QueryBuilder, order?: string, nulls?: string): QueryBuilder; + ( + columnName: keyof TRecord | QueryBuilder, + order?: 'asc' | 'desc', + nulls?: 'first' | 'last' + ): QueryBuilder; + ( + columnName: string | QueryBuilder, + order?: string, + nulls?: string + ): QueryBuilder; ( columnDefs: Array< - keyof TRecord | Readonly<{ - column: keyof TRecord | QueryBuilder; - order?: 'asc' | 'desc', - nulls?: 'first' | 'last' - }> + | keyof TRecord + | Readonly<{ + column: keyof TRecord | QueryBuilder; + order?: 'asc' | 'desc'; + nulls?: 'first' | 'last'; + }> > ): QueryBuilder; ( - columnDefs: Array> + columnDefs: Array< + | string + | Readonly<{ + column: string | QueryBuilder; + order?: string; + nulls?: string; + }> + > ): QueryBuilder; } @@ -1717,10 +1992,7 @@ export declare namespace Knex { value: Value | QueryBuilder | null ): QueryBuilder; - (raw: Raw): QueryBuilder< - TRecord, - TResult - >; + (raw: Raw): QueryBuilder; } interface HavingRange { @@ -1728,12 +2000,18 @@ export declare namespace Knex { columnName: K, values: readonly DbColumn[] ): QueryBuilder; - (columnName: string, values: readonly Value[]): QueryBuilder; + (columnName: string, values: readonly Value[]): QueryBuilder< + TRecord, + TResult + >; } // commons - interface ColumnNameQueryBuilder { + interface ColumnNameQueryBuilder< + TRecord extends {} = any, + TResult = unknown[] + > { // When all columns are known to be keys of original record, // we can extend our selection by these columns (columnName: '*'): QueryBuilder< @@ -1748,7 +2026,7 @@ export declare namespace Knex { ResolveTableType, ColNameUT & string >[] - >( + >( ...columnNames: readonly ColNameUT[] ): QueryBuilder; @@ -1759,7 +2037,7 @@ export declare namespace Knex { ResolveTableType, ColNameUT & string >[] - >( + >( columnNames: readonly ColNameUT[] ): QueryBuilder; @@ -1771,7 +2049,7 @@ export declare namespace Knex { SafePartial, keyof TRecord & string >[] - >( + >( ...columnNames: readonly ColumnDescriptor[] ): QueryBuilder; @@ -1781,7 +2059,7 @@ export declare namespace Knex { SafePartial, keyof TRecord & string >[] - >( + >( columnNames: readonly ColumnDescriptor[] ): QueryBuilder; } @@ -1793,18 +2071,15 @@ export declare namespace Knex { sql: string, bindings?: readonly RawBinding[] | ValueDict | RawBinding ): QueryBuilder; - (raw: Raw): QueryBuilder< - TRecord, - TResult2 - >; + (raw: Raw): QueryBuilder; } // Raw interface Raw extends events.EventEmitter, - ChainableInterface> { - timeout(ms: number, options?: {cancel?: boolean}): Raw; + ChainableInterface> { + timeout(ms: number, options?: { cancel?: boolean }): Raw; wrap(before: string, after: string): Raw; toSQL(): Sql; queryContext(context: any): Raw; @@ -1813,8 +2088,14 @@ export declare namespace Knex { interface RawBuilder { (value: Value): Raw; - (sql: string, ...bindings: readonly RawBinding[]): Raw; - (sql: string, bindings: readonly RawBinding[] | ValueDict): Raw; + ( + sql: string, + ...bindings: readonly RawBinding[] + ): Raw; + ( + sql: string, + bindings: readonly RawBinding[] | ValueDict + ): Raw; } const RefMemberTag: unique symbol; @@ -1832,21 +2113,26 @@ export declare namespace Knex { // Because unique symbol is used here, there is no way to actually // access this at runtime [RefMemberTag]: { - src: TSrc, - mapping: TMapping + src: TSrc; + mapping: TMapping; }; withSchema(schema: string): this; - as(alias: TAlias): Ref; + as( + alias: TAlias + ): Ref; } interface RefBuilder { - (src: TSrc): Ref; + (src: TSrc): Ref; } - interface BatchInsertBuilder extends Promise> { + interface BatchInsertBuilder + extends Promise> { transacting(trx: Transaction): this; // see returning methods from QueryInterface - returning(column: '*'): BatchInsertBuilder[]>; + returning( + column: '*' + ): BatchInsertBuilder[]>; returning< TKey extends StrKey>, TResult2 = DeferredKeySelection.Augment< @@ -1860,7 +2146,11 @@ export declare namespace Knex { returning< TKey extends StrKey>, TResult2 = DeferredKeySelection.SetSingle< - DeferredKeySelection.Augment, ResolveTableType, TKey>, + DeferredKeySelection.Augment< + UnwrapArrayMember, + ResolveTableType, + TKey + >, false >[] >( @@ -1868,7 +2158,9 @@ export declare namespace Knex { ): BatchInsertBuilder; // if data with specific type passed, exclude this method returning[]>( - column: unknown extends TRecord ? string | readonly (string | Raw)[] | Raw: never + column: unknown extends TRecord + ? string | readonly (string | Raw)[] | Raw + : never ): BatchInsertBuilder; } @@ -1887,20 +2179,21 @@ export declare namespace Knex { ...args: any[] ) => void; - interface QueryBuilder< - TRecord extends {} = any, - TResult = any - > + interface QueryBuilder extends QueryInterface, - ChainableInterface> { + ChainableInterface> { client: Client; or: QueryBuilder; not: QueryBuilder; and: QueryBuilder; // TODO: Promise? - columnInfo(column: keyof DeferredKeySelection.Resolve): Promise; - columnInfo(): Promise, ColumnInfo>>; + columnInfo( + column: keyof DeferredKeySelection.Resolve + ): Promise; + columnInfo(): Promise< + Record, ColumnInfo> + >; forUpdate(...tableNames: string[]): QueryBuilder; forUpdate(tableNames: readonly string[]): QueryBuilder; @@ -1909,7 +2202,9 @@ export declare namespace Knex { forShare(tableNames: readonly string[]): QueryBuilder; forNoKeyUpdate(...tableNames: string[]): QueryBuilder; - forNoKeyUpdate(tableNames: readonly string[]): QueryBuilder; + forNoKeyUpdate( + tableNames: readonly string[] + ): QueryBuilder; forKeyShare(...tableNames: string[]): QueryBuilder; forKeyShare(tableNames: readonly string[]): QueryBuilder; @@ -1925,7 +2220,10 @@ export declare namespace Knex { queryContext(): any; clone(): QueryBuilder; - timeout(ms: number, options?: {cancel?: boolean}): QueryBuilder; + timeout( + ms: number, + options?: { cancel?: boolean } + ): QueryBuilder; } interface Sql { @@ -1945,16 +2243,20 @@ export declare namespace Knex { // Chainable interface // - type ExposedPromiseKeys = - | "then" - | "catch" - | "finally"; + type ExposedPromiseKeys = 'then' | 'catch' | 'finally'; interface StringTagSupport { readonly [Symbol.toStringTag]: string; } - interface ChainableInterface extends Pick, keyof Promise & ExposedPromiseKeys>, StringTagSupport { - generateDdlCommands(): Promise<{ pre: string[], sql: string[], check: string | null, post: string[] }>; + interface ChainableInterface + extends Pick, keyof Promise & ExposedPromiseKeys>, + StringTagSupport { + generateDdlCommands(): Promise<{ + pre: string[]; + sql: string[]; + check: string | null; + post: string[]; + }>; toQuery(): string; options(options: Readonly<{ [key: string]: any }>): this; connection(connection: any): this; @@ -1965,7 +2267,9 @@ export declare namespace Knex { options: Readonly<{ [key: string]: any }>, handler: (readable: stream.PassThrough) => any ): Promise; - stream(options?: Readonly<{ [key: string]: any }>): stream.PassThrough & AsyncIterable>; + stream( + options?: Readonly<{ [key: string]: any }> + ): stream.PassThrough & AsyncIterable>; pipe( writable: T, options?: Readonly<{ [key: string]: any }> @@ -1974,7 +2278,12 @@ export declare namespace Knex { } // Not all of these are possible for all drivers, notably, sqlite doesn't support any of these - type IsolationLevels = 'read uncommitted' | 'read committed' | 'snapshot' | 'repeatable read' | 'serializable'; + type IsolationLevels = + | 'read uncommitted' + | 'read committed' + | 'snapshot' + | 'repeatable read' + | 'serializable'; interface TransactionConfig { isolationLevel?: IsolationLevels; userParams?: Record; @@ -1993,9 +2302,7 @@ export declare namespace Knex { status: any, value: any ): QueryBuilder; - savepoint( - transactionScope: (trx: Transaction) => any - ): Promise; + savepoint(transactionScope: (trx: Transaction) => any): Promise; commit(value?: any): QueryBuilder; rollback(error?: any): QueryBuilder; } @@ -2020,7 +2327,10 @@ export declare namespace Knex { viewName: string, callback: (viewBuilder: ViewBuilder) => any ): SchemaBuilder; - refreshMaterializedView(viewName: string, concurrently?: boolean): SchemaBuilder; + refreshMaterializedView( + viewName: string, + concurrently?: boolean + ): SchemaBuilder; dropView(viewName: string): SchemaBuilder; dropViewIfExists(viewName: string): SchemaBuilder; dropMaterializedView(viewName: string): SchemaBuilder; @@ -2114,19 +2424,36 @@ export declare namespace Knex { ): ColumnBuilder; boolean(columnName: string): ColumnBuilder; date(columnName: string): ColumnBuilder; - dateTime(columnName: string, options?: Readonly<{useTz?: boolean, precision?: number}>): ColumnBuilder; - datetime(columnName: string, options?: Readonly<{useTz?: boolean, precision?: number}>): ColumnBuilder; + dateTime( + columnName: string, + options?: Readonly<{ useTz?: boolean; precision?: number }> + ): ColumnBuilder; + datetime( + columnName: string, + options?: Readonly<{ useTz?: boolean; precision?: number }> + ): ColumnBuilder; time(columnName: string): ColumnBuilder; - timestamp(columnName: string, options?: Readonly<{useTz?: boolean, precision?: number}>): ColumnBuilder; + timestamp( + columnName: string, + options?: Readonly<{ useTz?: boolean; precision?: number }> + ): ColumnBuilder; /** @deprecated */ - timestamp(columnName: string, withoutTz?: boolean, precision?: number): ColumnBuilder; + timestamp( + columnName: string, + withoutTz?: boolean, + precision?: number + ): ColumnBuilder; timestamps( useTimestamps?: boolean, defaultToNow?: boolean, useCamelCase?: boolean ): ColumnBuilder; timestamps( - options?: Readonly<{useTimestamps?: boolean, defaultToNow?: boolean, useCamelCase?: boolean}> + options?: Readonly<{ + useTimestamps?: boolean; + defaultToNow?: boolean; + useCamelCase?: boolean; + }> ): void; geometry(columnName: string): ColumnBuilder; geography(columnName: string): ColumnBuilder; @@ -2134,22 +2461,34 @@ export declare namespace Knex { binary(columnName: string, length?: number): ColumnBuilder; enum( columnName: string, - values: (readonly Value[]) | null, + values: readonly Value[] | null, options?: EnumOptions ): ColumnBuilder; enu( columnName: string, - values: (readonly Value[]) | null, + values: readonly Value[] | null, options?: EnumOptions ): ColumnBuilder; json(columnName: string): ColumnBuilder; jsonb(columnName: string): ColumnBuilder; - uuid(columnName: string, options?: Readonly<{useBinaryUuid?: boolean, primaryKey?: boolean}>): ColumnBuilder; + uuid( + columnName: string, + options?: Readonly<{ useBinaryUuid?: boolean; primaryKey?: boolean }> + ): ColumnBuilder; comment(val: string): void; specificType(columnName: string, type: string): ColumnBuilder; - primary(columnNames: readonly string[], options?: Readonly<{constraintName?: string, deferrable?: deferrableType}>): TableBuilder; + primary( + columnNames: readonly string[], + options?: Readonly<{ + constraintName?: string; + deferrable?: deferrableType; + }> + ): TableBuilder; /** @deprecated */ - primary(columnNames: readonly string[], constraintName?: string): TableBuilder; + primary( + columnNames: readonly string[], + constraintName?: string + ): TableBuilder; index( columnNames: string | readonly (string | Raw)[], indexName?: string, @@ -2158,23 +2497,51 @@ export declare namespace Knex { index( columnNames: string | readonly (string | Raw)[], indexName?: string, - options?: Readonly<{indexType?: string, storageEngineIndexType?: storageEngineIndexType, predicate?: QueryBuilder}> + options?: Readonly<{ + indexType?: string; + storageEngineIndexType?: storageEngineIndexType; + predicate?: QueryBuilder; + }> ): TableBuilder; setNullable(column: string): TableBuilder; dropNullable(column: string): TableBuilder; - unique(columnNames: readonly (string | Raw)[], options?: Readonly<{indexName?: string, storageEngineIndexType?: string, deferrable?: deferrableType, useConstraint?: boolean}>): TableBuilder; + unique( + columnNames: readonly (string | Raw)[], + options?: Readonly<{ + indexName?: string; + storageEngineIndexType?: string; + deferrable?: deferrableType; + useConstraint?: boolean; + }> + ): TableBuilder; /** @deprecated */ - unique(columnNames: readonly (string | Raw)[], indexName?: string): TableBuilder; + unique( + columnNames: readonly (string | Raw)[], + indexName?: string + ): TableBuilder; foreign(column: string, foreignKeyName?: string): ForeignConstraintBuilder; foreign( columns: readonly string[], foreignKeyName?: string ): MultikeyForeignConstraintBuilder; - check(checkPredicate: string, bindings?: Record, constraintName?: string): TableBuilder; - dropForeign(columnNames: string | readonly string[], foreignKeyName?: string): TableBuilder; - dropUnique(columnNames: readonly (string | Raw)[], indexName?: string): TableBuilder; + check( + checkPredicate: string, + bindings?: Record, + constraintName?: string + ): TableBuilder; + dropForeign( + columnNames: string | readonly string[], + foreignKeyName?: string + ): TableBuilder; + dropUnique( + columnNames: readonly (string | Raw)[], + indexName?: string + ): TableBuilder; dropPrimary(constraintName?: string): TableBuilder; - dropIndex(columnNames: string | readonly (string | Raw)[], indexName?: string): TableBuilder; + dropIndex( + columnNames: string | readonly (string | Raw)[], + indexName?: string + ): TableBuilder; dropTimestamps(useCamelCase?: boolean): TableBuilder; dropChecks(checkConstraintNames: string | string[]): TableBuilder; queryContext(context: any): TableBuilder; @@ -2213,11 +2580,18 @@ export declare namespace Knex { interface ColumnBuilder { index(indexName?: string): ColumnBuilder; - primary(options?: Readonly<{constraintName?: string, deferrable?: deferrableType}>): ColumnBuilder; + primary( + options?: Readonly<{ + constraintName?: string; + deferrable?: deferrableType; + }> + ): ColumnBuilder; /** @deprecated */ primary(constraintName?: string): ColumnBuilder; - unique(options?: Readonly<{indexName?: string, deferrable?: deferrableType}>): ColumnBuilder; + unique( + options?: Readonly<{ indexName?: string; deferrable?: deferrableType }> + ): ColumnBuilder; /** @deprecated */ unique(indexName?: string): ColumnBuilder; references(columnName: string): ReferencingColumnBuilder; @@ -2226,7 +2600,9 @@ export declare namespace Knex { notNullable(): ColumnBuilder; nullable(): ColumnBuilder; comment(value: string): ColumnBuilder; - alter(options?: Readonly<{alterNullable?: boolean, alterType?: boolean}>): ColumnBuilder; + alter( + options?: Readonly<{ alterNullable?: boolean; alterType?: boolean }> + ): ColumnBuilder; queryContext(context: any): ColumnBuilder; after(columnName: string): ColumnBuilder; first(): ColumnBuilder; @@ -2234,8 +2610,15 @@ export declare namespace Knex { checkNegative(constraintName?: string): ColumnBuilder; checkIn(values: string[], constraintName?: string): ColumnBuilder; checkNotIn(values: string[], constraintName?: string): ColumnBuilder; - checkBetween(values: any[] | any[][], constraintName?: string): ColumnBuilder; - checkLength(operator: lengthOperator, length: number, constraintName?: string): ColumnBuilder; + checkBetween( + values: any[] | any[][], + constraintName?: string + ): ColumnBuilder; + checkLength( + operator: lengthOperator, + length: number, + constraintName?: string + ): ColumnBuilder; checkRegex(regex: string, constraintName?: string): ColumnBuilder; } @@ -2250,7 +2633,7 @@ export declare namespace Knex { interface PostgreSqlColumnBuilder extends ColumnBuilder { index( indexName?: string, - options?: Readonly<{indexType?: string, predicate?: QueryBuilder}> + options?: Readonly<{ indexType?: string; predicate?: QueryBuilder }> ): ColumnBuilder; index(indexName?: string, indexType?: string): ColumnBuilder; } @@ -2258,28 +2641,33 @@ export declare namespace Knex { interface SqlLiteColumnBuilder extends ColumnBuilder { index( indexName?: string, - options?: Readonly<{predicate?: QueryBuilder}> + options?: Readonly<{ predicate?: QueryBuilder }> ): ColumnBuilder; } interface MsSqlColumnBuilder extends ColumnBuilder { index( indexName?: string, - options?: Readonly<{predicate?: QueryBuilder}> + options?: Readonly<{ predicate?: QueryBuilder }> ): ColumnBuilder; } interface MySqlColumnBuilder extends ColumnBuilder { index( indexName?: string, - options?: Readonly<{indexType?: string, storageEngineIndexType?: storageEngineIndexType}> + options?: Readonly<{ + indexType?: string; + storageEngineIndexType?: storageEngineIndexType; + }> ): ColumnBuilder; } // patched ColumnBuilder methods to return ReferencingColumnBuilder with new methods // relies on ColumnBuilder returning only ColumnBuilder type ReferencingColumnBuilder = { - [K in keyof ColumnBuilder]: (...args: Parameters) => ReferencingColumnBuilder; + [K in keyof ColumnBuilder]: ( + ...args: Parameters + ) => ReferencingColumnBuilder; } & { inTable(tableName: string): ReferencingColumnBuilder; deferrable(type: deferrableType): ReferencingColumnBuilder; @@ -2340,9 +2728,11 @@ export declare namespace Knex { | Sqlite3ConnectionConfig | SocketConnectionConfig; - type ConnectionConfigProvider = SyncConnectionConfigProvider | AsyncConnectionConfigProvider; - type SyncConnectionConfigProvider = () => StaticConnectionConfig; - type AsyncConnectionConfigProvider = () => Promise; + type ConnectionConfigProvider = + | SyncConnectionConfigProvider + | AsyncConnectionConfigProvider; + type SyncConnectionConfigProvider = () => StaticConnectionConfig; + type AsyncConnectionConfigProvider = () => Promise; interface ConnectionConfig { host: string; @@ -2486,7 +2876,12 @@ export declare namespace Knex { abortTransactionOnError?: boolean; trustedConnection?: boolean; enableArithAbort?: boolean; - isolationLevel?: 'READ_UNCOMMITTED' | 'READ_COMMITTED' | 'REPEATABLE_READ' | 'SERIALIZABLE' | 'SNAPSHOT'; + isolationLevel?: + | 'READ_UNCOMMITTED' + | 'READ_COMMITTED' + | 'REPEATABLE_READ' + | 'SERIALIZABLE' + | 'SNAPSHOT'; maxRetriesOnTransientErrors?: number; multiSubnetFailover?: boolean; packetSize?: number; @@ -2574,11 +2969,13 @@ export declare namespace Knex { // Config object for mysql2: https://github.com/sidorares/node-mysql2/blob/master/lib/connection_config.js // Some options for connection pooling and MySQL server API are excluded. interface MySql2ConnectionConfig extends MySqlConnectionConfig { - authPlugins?: {[pluginName: string]: (pluginMetadata: any) => ((pluginData: any) => any)}; + authPlugins?: { + [pluginName: string]: (pluginMetadata: any) => (pluginData: any) => any; + }; authSwitchHandler?: (data: any, callback: () => void) => any; charsetNumber?: number; compress?: boolean; - connectAttributes?: {[attrNames: string]: any}; + connectAttributes?: { [attrNames: string]: any }; enableKeepAlive?: boolean; keepAliveInitialDelay?: number; maxPreparedStatements?: number; @@ -2628,7 +3025,7 @@ export declare namespace Knex { type PgGetTypeParser = (oid: number, format: string) => any; interface PgCustomTypesConfig { - getTypeParser: PgGetTypeParser; + getTypeParser: PgGetTypeParser; } type RedshiftConnectionConfig = PgConnectionConfig; @@ -2786,7 +3183,12 @@ export declare namespace Knex { queryCompiler(builder: any): any; schemaBuilder(): SchemaBuilder; schemaCompiler(builder: SchemaBuilder): any; - tableBuilder(type: any, tableName: any, tableNameLike: any, fn: any): TableBuilder; + tableBuilder( + type: any, + tableName: any, + tableNameLike: any, + fn: any + ): TableBuilder; tableCompiler(tableBuilder: any): any; columnBuilder(tableBuilder: any, type: any, args: any): ColumnBuilder; columnCompiler(tableBuilder: any, columnBuilder: any): any;