diff --git a/types/index.d.ts b/types/index.d.ts index fe2f1ab074..e4429595de 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -30,6 +30,11 @@ 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 + : never; +type UnknownOrCurlyCurlyToAny = [UnknownToAny | CurlyCurlyToAny][0]; type AnyToUnknown = unknown extends T ? unknown : T; type AnyOrUnknownToOther = unknown extends T1 ? T2 : T1; @@ -193,7 +198,7 @@ declare namespace DeferredKeySelection { ? DeferredKeySelection : DeferredKeySelection; - type AddAliases = TSelection extends DeferredKeySelection< + type AddAliases = TSelection extends DeferredKeySelection< infer TBase, infer TKeys, infer THasSelect, @@ -219,7 +224,7 @@ declare namespace DeferredKeySelection { // Convenience utility to set base, keys and aliases in a single type // application - type Augment = AddAliases< + type Augment = AddAliases< AddKey, TKey>, TAliasMapping >; @@ -234,7 +239,7 @@ declare namespace DeferredKeySelection { infer TIntersectProps, infer TUnionProps > - ? UnknownToAny< + ? 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. @@ -263,11 +268,11 @@ declare namespace DeferredKeySelection { : TSelection extends DeferredKeySelection.Any[] ? Knex.ResolveTableType>[] : TSelection extends (infer I)[] - ? UnknownToAny>[] - : UnknownToAny>; + ? UnknownOrCurlyCurlyToAny>[] + : UnknownOrCurlyCurlyToAny>; } -type AggregationQueryResult = ArrayIfAlready< +type AggregationQueryResult = ArrayIfAlready< TResult, UnwrapArrayMember extends DeferredKeySelection< infer TBase, @@ -313,7 +318,7 @@ export interface Knex tableName: TTable, options?: TableOptions ): Knex.QueryBuilder, DeferredKeySelection>, never>[]>; - []>( + []>( tableName?: Knex.TableDescriptor | Knex.AliasDict, options?: TableOptions ): Knex.QueryBuilder; @@ -340,7 +345,7 @@ export interface Knex destroy(callback: Function): void; destroy(): Promise; - batchInsert( + batchInsert( tableName: Knex.TableDescriptor, data: TRecord2 extends Knex.CompositeTableType ? ReadonlyArray> @@ -349,7 +354,7 @@ export interface Knex ): Knex.BatchInsertBuilder; schema: Knex.SchemaBuilder; - queryBuilder(): Knex.QueryBuilder< + queryBuilder(): Knex.QueryBuilder< TRecord2, TResult2 >; @@ -405,7 +410,7 @@ export declare namespace Knex { interface ValueDict extends Dict {} interface AliasDict extends Dict {} - type ColumnDescriptor = + type ColumnDescriptor = | string | Knex.Raw | Knex.QueryBuilder @@ -452,7 +457,7 @@ export declare namespace Knex { ? TCompositeTableType[TScope] : TCompositeTableType; - interface OnConflictQueryBuilder { + interface OnConflictQueryBuilder { ignore(): QueryBuilder; merge(mergeColumns?: (keyof TRecord)[]): QueryBuilder; merge(data?: Extract>, object>): QueryBuilder; @@ -1026,7 +1031,7 @@ export declare namespace Knex { truncate(): QueryBuilder; } - interface As { + interface As { (columnName: keyof TRecord): QueryBuilder; (columnName: string): QueryBuilder; } @@ -1042,7 +1047,7 @@ export declare namespace Knex { Dict, {} > - >; + > & {}; // filters out `null` and `undefined` interface AliasQueryBuilder { < @@ -1099,11 +1104,11 @@ export declare namespace Knex { ColumnNameQueryBuilder { (): QueryBuilder; - , TInnerRecord = any, TInnerResult = any>( + , TInnerRecord extends {} = any, TInnerResult = any>( ...subQueryBuilders: readonly QueryBuilder[] ): QueryBuilder; - , TInnerRecord = any, TInnerResult = any>( + , TInnerRecord extends {} = any, TInnerResult = any>( subQueryBuilders: readonly QueryBuilder[] ): QueryBuilder; } @@ -1115,53 +1120,53 @@ export declare namespace Knex { singleValue?: boolean; } - interface JsonExtract { + interface JsonExtract { (column: string | Raw | QueryBuilder, path: string, alias?: string, singleValue?: boolean): QueryBuilder; (column: JsonExtraction[] | any[][], singleValue?: boolean): QueryBuilder; } - interface JsonSet { + interface JsonSet { (column: string | Raw | QueryBuilder, path: string, value: any, alias?: string): QueryBuilder; } - interface JsonInsert { + interface JsonInsert { (column: string | Raw | QueryBuilder, path: string, value: any, alias?: string): QueryBuilder; } - interface JsonRemove { + interface JsonRemove { (column: string | Raw | QueryBuilder, path: string, alias?: string): QueryBuilder; } - interface HintComment { + interface HintComment { (hint: string): QueryBuilder; (hints: readonly string[]): QueryBuilder; } - interface Table { + interface Table { < TTable extends TableNames, - TRecord2 = TableType, + TRecord2 extends {} = TableType, TResult2 = DeferredKeySelection.ReplaceBase> >( tableName: TTable, options?: TableOptions ): QueryBuilder; < - TRecord2 = unknown, + TRecord2 extends {} = {}, TResult2 = DeferredKeySelection.ReplaceBase >( tableName: TableDescriptor | AliasDict, options?: TableOptions ): QueryBuilder; < - TRecord2 = unknown, + TRecord2 extends {} = {}, TResult2 = DeferredKeySelection.ReplaceBase >( callback: Function, options?: TableOptions ): QueryBuilder; < - TRecord2 = unknown, + TRecord2 extends {} = {}, TResult2 = DeferredKeySelection.ReplaceBase >( raw: Raw, @@ -1199,7 +1204,7 @@ export declare namespace Knex { ): QueryBuilder; < TTable extends TableNames, - TRecord2 = ResolveTableType & + TRecord2 extends {} = ResolveTableType & ResolveTableType>, TResult2 = DeferredKeySelection.ReplaceBase >( @@ -1236,7 +1241,7 @@ export declare namespace Knex { TKey1 extends StrKey>> & StrKey, TKey2 extends StrKey>>, TRecord1 = ResolveTableType, - TRecord2 = TRecord1 & ResolveTableType>, + TRecord2 extends {} = TRecord1 & ResolveTableType>, TResult2 = DeferredKeySelection.ReplaceBase >( tableName: TTable2, @@ -1249,7 +1254,7 @@ export declare namespace Knex { TKey1 extends StrKey>> & StrKey, TKey2 extends StrKey>>, TRecord1 = ResolveTableType, - TRecord2 = TRecord1 & ResolveTableType>, + TRecord2 extends {} = TRecord1 & ResolveTableType>, TResult2 = DeferredKeySelection.ReplaceBase >( tableName: TTable2, @@ -1280,7 +1285,7 @@ export declare namespace Knex { TKey1 extends StrKey>> & StrKey, TKey2 extends StrKey>>, TRecord1 = ResolveTableType, - TRecord2 = TRecord1 & ResolveTableType>, + TRecord2 extends {} = TRecord1 & ResolveTableType>, TResult2 = DeferredKeySelection.ReplaceBase >( tableName: TTable2, @@ -1294,7 +1299,7 @@ export declare namespace Knex { TKey1 extends StrKey>> & StrKey, TKey2 extends StrKey>>, TRecord1 = ResolveTableType, - TRecord2 = TRecord1 & ResolveTableType>, + TRecord2 extends {} = TRecord1 & ResolveTableType>, TResult2 = DeferredKeySelection.ReplaceBase >( tableName: TTable2, @@ -1371,22 +1376,22 @@ export declare namespace Knex { type(type: string): JoinClause; } - interface JoinRaw { + interface JoinRaw { (tableName: string, binding?: Value | Value[] | ValueDict): QueryBuilder< TRecord, TResult >; } - interface Using { + interface Using { (tables: string[]): QueryBuilder; } - interface With + interface With extends WithRaw, WithWrapped {} - interface WithRaw { + interface WithRaw { (alias: string, raw: Raw | QueryBuilder): QueryBuilder; (alias: string, sql: string, bindings?: readonly Value[] | Object): QueryBuilder< TRecord, @@ -1399,11 +1404,11 @@ export declare namespace Knex { >; } - interface WithSchema { + interface WithSchema { (schema: string): QueryBuilder; } - interface WithWrapped { + interface WithWrapped { (alias: string, queryBuilder: QueryBuilder): QueryBuilder; ( alias: string, @@ -1417,7 +1422,7 @@ export declare namespace Knex { ): QueryBuilder; } - interface Where + interface Where extends WhereRaw, WhereWrapped, WhereNull { @@ -1447,13 +1452,13 @@ export declare namespace Knex { TResult >; - , TRecordInner, TResultInner>( + , TRecordInner extends {}, TResultInner>( columnName: T, operator: ComparisonOperator, value: QueryBuilder ): QueryBuilder; - ( + ( columnName: string, operator: string, value: QueryBuilder @@ -1464,28 +1469,28 @@ export declare namespace Knex { TResult >; - ( + ( left: Raw, operator: string, right: QueryBuilder ): QueryBuilder; } - interface WhereRaw + interface WhereRaw extends RawQueryBuilder { (condition: boolean): QueryBuilder; } - interface WhereWrapped { + interface WhereWrapped { (callback: QueryCallback): QueryBuilder; } - interface WhereNull { + interface WhereNull { (columnName: keyof TRecord): QueryBuilder; (columnName: string): QueryBuilder; } - interface WhereBetween { + interface WhereBetween { ( columnName: K, range: readonly [DbColumn, DbColumn] @@ -1493,22 +1498,22 @@ export declare namespace Knex { (columnName: string, range: readonly [Value, Value]): QueryBuilder; } - interface WhereExists { + interface WhereExists { (callback: QueryCallback): QueryBuilder; - ( + ( query: QueryBuilder ): QueryBuilder; } - interface WhereJsonObject { + interface WhereJsonObject { (columnName: keyof TRecord, value: any): QueryBuilder; } - interface WhereJsonPath { + interface WhereJsonPath { (columnName: keyof TRecord, jsonPath: string, operator: string, value: any): QueryBuilder; } - interface WhereIn { + interface WhereIn { >( columnName: K, values: readonly DbColumn[K]>[] | QueryCallback @@ -1525,19 +1530,19 @@ export declare namespace Knex { TRecord, TResult >; - ( + ( columnName: K, values: QueryBuilder ): QueryBuilder; - ( + ( columnName: string, values: Value[] | QueryBuilder ): QueryBuilder; - ( + ( columnNames: readonly K[], values: QueryBuilder ): QueryBuilder; - ( + ( columnNames: readonly string[], values: QueryBuilder ): QueryBuilder; @@ -1547,7 +1552,7 @@ export declare namespace Knex { // by extracting out a common base interface will not work because order of overloads // is significant. - interface AsymmetricAggregation { + interface AsymmetricAggregation { < TOptions extends { "as": string }, TResult2 = AggregationQueryResult @@ -1567,7 +1572,7 @@ export declare namespace Knex { ): QueryBuilder; } - interface TypePreservingAggregation { + interface TypePreservingAggregation { < TKey extends keyof ResolveTableType, TOptions extends { "as": string }, @@ -1599,7 +1604,7 @@ export declare namespace Knex { ): QueryBuilder; } - interface AnalyticFunction { + interface AnalyticFunction { < TAlias extends string, TResult2 = AggregationQueryResult @@ -1617,11 +1622,11 @@ export declare namespace Knex { >; } - interface GroupBy + interface GroupBy extends RawQueryBuilder, ColumnNameQueryBuilder {} - interface OrderBy { + interface OrderBy { (columnName: keyof TRecord | QueryBuilder, order?: 'asc' | 'desc', nulls?: 'first' | 'last'): QueryBuilder< TRecord, TResult @@ -1645,10 +1650,10 @@ export declare namespace Knex { ): QueryBuilder; } - interface PartitionBy + interface PartitionBy extends OrderBy {} - interface Intersect { + interface Intersect { ( callback: MaybeArray | Raw>, wrap?: boolean @@ -1658,10 +1663,10 @@ export declare namespace Knex { ): QueryBuilder; } - interface Union + interface Union extends Intersect {} - interface Having + interface Having extends WhereWrapped { ( column: K, @@ -1681,7 +1686,7 @@ export declare namespace Knex { >; } - interface HavingRange { + interface HavingRange { ( columnName: K, values: readonly DbColumn[] @@ -1691,7 +1696,7 @@ export declare namespace Knex { // commons - interface ColumnNameQueryBuilder { + interface ColumnNameQueryBuilder { // When all columns are known to be keys of original record, // we can extend our selection by these columns (columnName: '*'): QueryBuilder< @@ -1746,7 +1751,7 @@ export declare namespace Knex { type RawBinding = Value | QueryBuilder; - interface RawQueryBuilder { + interface RawQueryBuilder { ( sql: string, bindings?: readonly RawBinding[] | ValueDict | RawBinding @@ -1834,12 +1839,12 @@ export declare namespace Knex { // QueryBuilder // - type QueryCallback = ( + type QueryCallback = ( this: QueryBuilder, builder: QueryBuilder ) => void; - type QueryCallbackWithArgs = ( + type QueryCallbackWithArgs = ( this: QueryBuilder, builder: QueryBuilder, ...args: any[]