Global table definitions v2 (#4100)

This commit is contained in:
Arturs Vonda 2020-11-01 13:15:58 +02:00 committed by GitHub
parent 4cfb3ea17b
commit ce0002d106
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 1580 additions and 62 deletions

View File

@ -188,7 +188,8 @@
"CHANGELOG.md",
"scripts/*",
"types/index.d.ts",
"types/result.d.ts"
"types/result.d.ts",
"types/tables.d.ts"
],
"license": "MIT",
"tonicExampleFilename": "scripts/runkit-example.js",

177
types/index.d.ts vendored
View File

@ -13,6 +13,8 @@ import events = require('events');
import stream = require('stream');
import ResultTypes = require('./result');
import { Tables } from './tables';
import { ConnectionOptions } from "tls";
// # Generic type-level utilities
@ -258,12 +260,12 @@ declare namespace DeferredKeySelection {
: TSelection;
type Resolve<TSelection> = TSelection extends DeferredKeySelection.Any
? ResolveOne<TSelection>
? Knex.ResolveTableType<ResolveOne<TSelection>>
: TSelection extends DeferredKeySelection.Any[]
? ResolveOne<TSelection[0]>[]
? Knex.ResolveTableType<ResolveOne<TSelection[0]>>[]
: TSelection extends (infer I)[]
? UnknownToAny<I>[]
: UnknownToAny<TSelection>;
? UnknownToAny<Knex.ResolveTableType<I>>[]
: UnknownToAny<Knex.ResolveTableType<TSelection>>;
}
type AggregationQueryResult<TResult, TIntersectProps2> = ArrayIfAlready<
@ -325,6 +327,10 @@ interface PgTableOptions {
interface Knex<TRecord extends {} = any, TResult = unknown[]>
extends Knex.QueryInterface<TRecord, TResult>, events.EventEmitter {
<TTable extends Knex.TableNames>(
tableName: TTable,
options?: TableOptions
): Knex.QueryBuilder<Knex.TableType<TTable>, DeferredKeySelection<Knex.ResolveTableType<Knex.TableType<TTable>>, never>[]>;
<TRecord2 = TRecord, TResult2 = DeferredKeySelection<TRecord2, never>[]>(
tableName?: Knex.TableDescriptor | Knex.AliasDict,
options?: TableOptions
@ -342,7 +348,7 @@ interface Knex<TRecord extends {} = any, TResult = unknown[]>
config?: any
): Promise<Knex.Transaction>;
transaction<T>(
transactionScope: (trx: Knex.Transaction) => Promise<T> | Promise<T> | void,
transactionScope: (trx: Knex.Transaction) => Promise<T> | void,
config?: any
): Promise<T>;
initialize(config?: Knex.Config): void;
@ -421,6 +427,22 @@ declare namespace Knex {
type DbRecordArr<TRecord> = Readonly<MaybeArray<DbRecord<TRecord>>>;
export type CompositeTableType<TBase, TInsert = TBase, TUpdate = Partial<TInsert>> = {
base: TBase,
insert: TInsert,
update: TUpdate,
};
type TableNames = keyof Tables;
type TableInterfaceScope = keyof CompositeTableType<unknown>;
type TableType<TTable extends keyof Tables> = Tables[TTable];
type ResolveTableType<TCompositeTableType, TScope extends TableInterfaceScope = 'base'> = TCompositeTableType extends CompositeTableType<unknown>
? TCompositeTableType[TScope]
: TCompositeTableType;
interface OnConflictQueryBuilder<TRecord, TResult> {
ignore(): QueryInterface<TRecord, TResult>;
merge(data?: DbRecord<TRecord>): QueryInterface<TRecord, TResult>;
@ -582,29 +604,29 @@ declare namespace Knex {
pluck<TResult2 extends {}>(column: string): QueryBuilder<TRecord, TResult2>;
insert(
data: DbRecordArr<TRecord>,
data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'insert'> : DbRecordArr<TRecord>,
returning: '*'
): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>;
insert<
TKey extends StrKey<TRecord>,
TKey extends StrKey<ResolveTableType<TRecord>>,
TResult2 = DeferredIndex.Augment<
UnwrapArrayMember<TResult>,
TRecord,
ResolveTableType<TRecord>,
TKey
>[]
>(
data: DbRecordArr<TRecord>,
data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'insert'> : DbRecordArr<TRecord>,
returning: TKey
): QueryBuilder<TRecord, TResult2>;
insert<
TKey extends StrKey<TRecord>,
TKey extends StrKey<ResolveTableType<TRecord>>,
TResult2 = DeferredKeySelection.Augment<
UnwrapArrayMember<TResult>,
TRecord,
ResolveTableType<TRecord>,
TKey
>[]
>(
data: DbRecordArr<TRecord>,
data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'insert'> : DbRecordArr<TRecord>,
returning: readonly TKey[]
): QueryBuilder<TRecord, TResult2>;
insert<
@ -615,7 +637,7 @@ declare namespace Knex {
TKey
>[]
>(
data: DbRecordArr<TRecord>,
data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'insert'> : DbRecordArr<TRecord>,
returning: TKey
): QueryBuilder<TRecord, TResult2>;
insert<
@ -626,11 +648,11 @@ declare namespace Knex {
TKey
>[]
>(
data: DbRecordArr<TRecord>,
data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'insert'> : DbRecordArr<TRecord>,
returning: readonly TKey[]
): QueryBuilder<TRecord, TResult2>;
insert<TResult2 = number[]>(
data: DbRecordArr<TRecord>
data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'insert'> : DbRecordArr<TRecord>
): QueryBuilder<TRecord, TResult2>;
modify<TRecord2 extends {} = any, TResult2 extends {} = any>(
@ -638,29 +660,29 @@ declare namespace Knex {
...args: any[]
): QueryBuilder<TRecord2, TResult2>;
update<
K1 extends StrKey<TRecord>,
K2 extends StrKey<TRecord>,
K1 extends StrKey<ResolveTableType<TRecord, 'update'>>,
K2 extends StrKey<ResolveTableType<TRecord>>,
TResult2 = DeferredIndex.Augment<
UnwrapArrayMember<TResult>,
TRecord,
ResolveTableType<TRecord>,
K2
>[]
>(
columnName: K1,
value: DbColumn<TRecord[K1]>,
value: DbColumn<ResolveTableType<TRecord, 'update'>[K1]>,
returning: K2
): QueryBuilder<TRecord, TResult2>;
update<
K1 extends StrKey<TRecord>,
K2 extends StrKey<TRecord>,
K1 extends StrKey<ResolveTableType<TRecord, 'update'>>,
K2 extends StrKey<ResolveTableType<TRecord>>,
TResult2 = DeferredKeySelection.Augment<
UnwrapArrayMember<TResult>,
TRecord,
ResolveTableType<TRecord>,
K2
>[]
>(
columnName: K1,
value: DbColumn<TRecord[K1]>,
value: DbColumn<ResolveTableType<TRecord, 'update'>[K1]>,
returning: readonly K2[]
): QueryBuilder<TRecord, TResult2>;
update<K extends keyof TRecord>(
@ -677,25 +699,25 @@ declare namespace Knex {
returning: '*'
): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>;
update<
TKey extends StrKey<TRecord>,
TKey extends StrKey<ResolveTableType<TRecord>>,
TResult2 = DeferredIndex.Augment<
UnwrapArrayMember<TResult>,
TRecord,
ResolveTableType<TRecord>,
TKey
>[]
>(
data: DbRecordArr<TRecord>,
data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'update'> : DbRecordArr<TRecord>,
returning: TKey
): QueryBuilder<TRecord, TResult2>;
update<
TKey extends StrKey<TRecord>,
TKey extends StrKey<ResolveTableType<TRecord>>,
TResult2 = DeferredKeySelection.Augment<
UnwrapArrayMember<TResult>,
TRecord,
ResolveTableType<TRecord>,
TKey
>[]
>(
data: DbRecordArr<TRecord>,
data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'update'> : DbRecordArr<TRecord>,
returning: readonly TKey[]
): QueryBuilder<TRecord, TResult2>;
update<
@ -706,7 +728,7 @@ declare namespace Knex {
TKey
>[]
>(
data: DbRecordArr<TRecord>,
data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'update'> : DbRecordArr<TRecord>,
returning: TKey | readonly TKey[]
): QueryBuilder<TRecord, TResult2>;
update<
@ -717,30 +739,30 @@ declare namespace Knex {
TKey
>[]
>(
data: DbRecordArr<TRecord>,
data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'update'> : DbRecordArr<TRecord>,
returning: readonly TKey[]
): QueryBuilder<TRecord, TResult2>;
update<TResult2 = number>(
data: DbRecordArr<TRecord>
data: TRecord extends CompositeTableType<unknown> ? ResolveTableType<TRecord, 'update'> : DbRecordArr<TRecord>
): QueryBuilder<TRecord, TResult2>;
update<TResult2 = number>(columnName: string, value: Value): QueryBuilder<TRecord, TResult2>;
returning(column: '*'): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>;
returning<
TKey extends StrKey<TRecord>,
TKey extends StrKey<ResolveTableType<TRecord>>,
TResult2 = DeferredIndex.Augment<
UnwrapArrayMember<TResult>,
TRecord,
ResolveTableType<TRecord>,
TKey
>[]
>(
column: TKey
): QueryBuilder<TRecord, TResult2>;
returning<
TKey extends StrKey<TRecord>,
TKey extends StrKey<ResolveTableType<TRecord>>,
TResult2 = DeferredKeySelection.SetSingle<
DeferredKeySelection.Augment<UnwrapArrayMember<TResult>, TRecord, TKey>,
DeferredKeySelection.Augment<UnwrapArrayMember<TResult>, ResolveTableType<TRecord>, TKey>,
false
>[]
>(
@ -802,10 +824,10 @@ declare namespace Knex {
returning: '*'
): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>;
delete<
TKey extends StrKey<TRecord>,
TKey extends StrKey<ResolveTableType<TRecord>>,
TResult2 = DeferredIndex.Augment<
UnwrapArrayMember<TResult>,
TRecord,
ResolveTableType<TRecord>,
TKey
>[]
>(
@ -849,10 +871,10 @@ declare namespace Knex {
interface AliasQueryBuilder<TRecord extends {} = any, TResult = unknown[]> {
<
AliasUT extends InferrableColumnDescriptor<TRecord>[],
AliasUT extends InferrableColumnDescriptor<ResolveTableType<TRecord>>[],
TResult2 = ArrayIfAlready<TResult, DeferredKeySelection.Augment<
UnwrapArrayMember<TResult>,
TRecord,
ResolveTableType<TRecord>,
IncompatibleToAlt<ArrayMember<AliasUT>, string, never>,
IntersectAliases<AliasUT>
>>
@ -861,10 +883,10 @@ declare namespace Knex {
): QueryBuilder<TRecord, TResult2>;
<
AliasUT extends InferrableColumnDescriptor<TRecord>[],
AliasUT extends InferrableColumnDescriptor<ResolveTableType<TRecord>>[],
TResult2 = ArrayIfAlready<TResult, DeferredKeySelection.Augment<
UnwrapArrayMember<TResult>,
TRecord,
ResolveTableType<TRecord>,
IncompatibleToAlt<ArrayMember<AliasUT>, string, never>,
IntersectAliases<AliasUT>
>>
@ -876,7 +898,7 @@ declare namespace Knex {
AliasUT extends (Dict | string)[],
TResult2 = ArrayIfAlready<TResult, DeferredKeySelection.Augment<
UnwrapArrayMember<TResult>,
TRecord,
ResolveTableType<TRecord>,
IncompatibleToAlt<ArrayMember<AliasUT>, string, never>,
IntersectAliases<AliasUT>
>>
@ -912,6 +934,14 @@ declare namespace Knex {
}
interface Table<TRecord extends {} = any, TResult extends {} = any> {
<
TTable extends TableNames,
TRecord2 = TableType<TTable>,
TResult2 = DeferredKeySelection.ReplaceBase<TResult, ResolveTableType<TRecord2>>
>(
tableName: TTable,
options?: TableOptions
): QueryBuilder<TRecord2, TResult2>;
<
TRecord2 = unknown,
TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
@ -963,6 +993,14 @@ declare namespace Knex {
>(
raw: Raw
): QueryBuilder<TRecord2, TResult2>;
<
TTable extends TableNames,
TRecord2 = ResolveTableType<TRecord> & ResolveTableType<TableType<TTable>>,
TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
>(
tableName: TTable,
clause: JoinCallback
): QueryBuilder<TRecord2, TResult2>;
<
TJoinTargetRecord extends {} = any,
TRecord2 extends {} = TRecord & TJoinTargetRecord,
@ -987,6 +1025,15 @@ declare namespace Knex {
tableName: TableDescriptor | AliasDict | QueryCallback,
raw: Raw
): QueryBuilder<TRecord2, TResult2>;
<
TTable extends TableNames,
TRecord2 = ResolveTableType<TRecord> & ResolveTableType<TableType<TTable>>,
TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
>(
tableName: TTable,
column1: string,
column2: string
): QueryBuilder<TRecord2, TResult2>;
<
TJoinTargetRecord extends {} = any,
TRecord2 extends {} = TRecord & TJoinTargetRecord,
@ -1005,6 +1052,16 @@ declare namespace Knex {
column1: string,
raw: Raw
): QueryBuilder<TRecord2, TResult2>;
<
TTable extends TableNames,
TRecord2 = ResolveTableType<TRecord> & ResolveTableType<TableType<TTable>>,
TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
>(
tableName: TTable,
column1: string,
operator: string,
column2: string
): QueryBuilder<TRecord2, TResult2>;
<
TJoinTargetRecord extends {} = any,
TRecord2 extends {} = TRecord & TJoinTargetRecord,
@ -1105,21 +1162,21 @@ declare namespace Knex {
(callback: QueryCallback<TRecord, TResult>): QueryBuilder<TRecord, TResult>;
(object: DbRecord<TRecord>): QueryBuilder<TRecord, TResult>;
(object: DbRecord<ResolveTableType<TRecord>>): QueryBuilder<TRecord, TResult>;
(object: Readonly<Object>): QueryBuilder<TRecord, TResult>;
<T extends keyof TRecord>(
<T extends keyof ResolveTableType<TRecord>>(
columnName: T,
value: DbColumn<TRecord[T]> | null
value: DbColumn<ResolveTableType<TRecord>[T]> | null
): QueryBuilder<TRecord, TResult>;
(columnName: string, value: Value | null): QueryBuilder<TRecord, TResult>;
<T extends keyof TRecord>(
<T extends keyof ResolveTableType<TRecord>>(
columnName: T,
operator: ComparisonOperator,
value: DbColumn<TRecord[T]> | null
value: DbColumn<ResolveTableType<TRecord>[T]> | null
): QueryBuilder<TRecord, TResult>;
(columnName: string, operator: string, value: Value | null): QueryBuilder<
@ -1127,7 +1184,7 @@ declare namespace Knex {
TResult
>;
<T extends keyof TRecord, TRecordInner, TResultInner>(
<T extends keyof ResolveTableType<TRecord>, TRecordInner, TResultInner>(
columnName: T,
operator: ComparisonOperator,
value: QueryBuilder<TRecordInner, TResultInner>
@ -1181,17 +1238,17 @@ declare namespace Knex {
}
interface WhereIn<TRecord = any, TResult = unknown[]> {
<K extends keyof TRecord>(
<K extends keyof ResolveTableType<TRecord>>(
columnName: K,
values: readonly DbColumn<TRecord[K]>[] | QueryCallback
values: readonly DbColumn<ResolveTableType<TRecord>[K]>[] | QueryCallback
): QueryBuilder<TRecord, TResult>;
(columnName: string, values: readonly Value[] | QueryCallback): QueryBuilder<
TRecord,
TResult
>;
<K extends keyof TRecord>(
<K extends keyof ResolveTableType<TRecord>>(
columnNames: readonly K[],
values: readonly (readonly DbColumn<TRecord[K]>[])[] | QueryCallback
values: readonly (readonly DbColumn<ResolveTableType<TRecord>[K]>[])[] | QueryCallback
): QueryBuilder<TRecord, TResult>;
(columnNames: readonly string[], values: readonly Value[][] | QueryCallback): QueryBuilder<
TRecord,
@ -1221,7 +1278,7 @@ declare namespace Knex {
interface AsymmetricAggregation<TRecord = any, TResult = unknown[], TValue = any> {
<TResult2 = AggregationQueryResult<TResult, Dict<TValue>>>(
...columnNames: readonly (keyof TRecord)[]
...columnNames: readonly (keyof ResolveTableType<TRecord>)[]
): QueryBuilder<TRecord, TResult2>;
<
TAliases extends {} = Record<string, string | string[] | Knex.Raw>,
@ -1234,8 +1291,8 @@ declare namespace Knex {
interface TypePreservingAggregation<TRecord = any, TResult = unknown[], TValue = any> {
<
TKey extends keyof TRecord,
TResult2 = AggregationQueryResult<TResult, Dict<TRecord[TKey]>>
TKey extends keyof ResolveTableType<TRecord>,
TResult2 = AggregationQueryResult<TResult, Dict<ResolveTableType<TRecord>[TKey]>>
>(
...columnNames: readonly TKey[]
): QueryBuilder<TRecord, TResult2>;
@ -1332,10 +1389,10 @@ declare namespace Knex {
>;
<
ColNameUT extends keyof TRecord,
ColNameUT extends keyof ResolveTableType<TRecord>,
TResult2 = DeferredKeySelection.Augment<
UnwrapArrayMember<TResult>,
TRecord,
ResolveTableType<TRecord>,
ColNameUT & string
>[]
>(
@ -1343,10 +1400,10 @@ declare namespace Knex {
): QueryBuilder<TRecord, TResult2>;
<
ColNameUT extends keyof TRecord,
ColNameUT extends keyof ResolveTableType<TRecord>,
TResult2 = DeferredKeySelection.Augment<
UnwrapArrayMember<TResult>,
TRecord,
ResolveTableType<TRecord>,
ColNameUT & string
>[]
>(

4
types/tables.d.ts vendored Normal file
View File

@ -0,0 +1,4 @@
// Placeholder interface for Table -> Record mapping
// Allows to define the mapping of tables and interfaces in one place
// and to have correct types when using `knex.from('table')`
export interface Tables {}

File diff suppressed because it is too large Load Diff