UNPKG

66.9 kBTypeScriptView Raw
1// Originally based on contributions to DefinitelyTyped:
2// Definitions by: Qubo <https://github.com/tkQubo>
3// Pablo Rodríguez <https://github.com/MeLlamoPablo>
4// Matt R. Wilson <https://github.com/mastermatt>
5// Satana Charuwichitratana <https://github.com/micksatana>
6// Shrey Jain <https://github.com/shreyjain1994>
7// TypeScript Version: 3.7
8
9/// <reference types="node" />
10
11import tarn = require('tarn');
12import events = require('events');
13import stream = require('stream');
14import ResultTypes = require('./result');
15
16import { ConnectionOptions } from "tls";
17
18// # Generic type-level utilities
19
20// If T is object then make it a partial otherwise fallback to any
21//
22// This is primarily to prevent type incompatibilities where target can be unknown.
23// While unknown can be assigned to any, Partial<unknown> can't be.
24type SafePartial<T> = Partial<AnyOrUnknownToOther<T, {}>>;
25
26type MaybeArray<T> = T | T[];
27
28type StrKey<T> = string & keyof T;
29
30// If T is unknown then convert to any, else retain original
31type UnknownToAny<T> = unknown extends T ? any : T;
32type AnyToUnknown<T> = unknown extends T ? unknown : T;
33type AnyOrUnknownToOther<T1, T2> = unknown extends T1 ? T2 : T1;
34
35// Intersection conditionally applied only when TParams is non-empty
36// This is primarily to keep the signatures more intuitive.
37type AugmentParams<TTarget, TParams> = TParams extends {}
38 ? keyof TParams extends never
39 ? TTarget
40 : {} & TTarget & TParams
41 : TTarget;
42
43// Check if provided keys (expressed as a single or union type) are members of TBase
44type AreKeysOf<TBase, TKeys> = Boxed<TKeys> extends Boxed<keyof TBase>
45 ? true
46 : false;
47
48// https://stackoverflow.com/a/50375286/476712
49type UnionToIntersection<U> = (U extends any
50 ? (k: U) => void
51 : never) extends ((k: infer I) => void)
52 ? I
53 : never;
54
55type ComparisonOperator = '=' | '>' | '>=' | '<' | '<=' | '<>';
56
57// If T is an array, get the type of member, else fall back to never
58type ArrayMember<T> = T extends (infer M)[] ? M : never;
59
60// If T is an array, get the type of member, else retain original
61type UnwrapArrayMember<T> = T extends (infer M)[] ? M : T;
62
63// Wrap a type in a container, making it an object type.
64// This is primarily useful in circumventing special handling of union/intersection in typescript
65interface Boxed<T> {
66 _value: T;
67}
68
69// If T can't be assigned to TBase fallback to an alternate type TAlt
70type IncompatibleToAlt<T, TBase, TAlt> = T extends TBase ? T : TAlt;
71
72type ArrayIfAlready<T1, T2> = T1 extends any[] ? T2[] : T2;
73
74// Boxing is necessary to prevent distribution of conditional types:
75// https://lorefnon.tech/2019/05/02/using-boxing-to-prevent-distribution-of-conditional-types/
76type PartialOrAny<TBase, TKeys> = Boxed<TKeys> extends Boxed<never>
77 ? {}
78 : Boxed<TKeys> extends Boxed<keyof TBase>
79 ? SafePick<TBase, TKeys & keyof TBase>
80 : any;
81
82// Retain the association of original keys with aliased keys at type level
83// to facilitates type-safe aliasing for object syntax
84type MappedAliasType<TBase, TAliasMapping> = {} & {
85 [K in keyof TAliasMapping]: TAliasMapping[K] extends keyof TBase
86 ? TBase[TAliasMapping[K]]
87 : any
88};
89
90// Container type for situations when we want a partial/intersection eventually
91// but the keys being selected or additional properties being augmented are not
92// all known at once and we would want to effectively build up a partial/intersection
93// over multiple steps.
94type DeferredKeySelection<
95 // The base of selection. In intermediate stages this may be unknown.
96 // If it remains unknown at the point of resolution, the selection will fall back to any
97 TBase,
98 // Union of keys to be selected
99 // In intermediate stages this may be never.
100 TKeys extends string,
101 // Changes how the resolution should behave if TKeys is never.
102 // If true, then we assume that some keys were selected, and if TKeys is never, we will fall back to any.
103 // If false, and TKeys is never, then we select TBase in its entirety
104 THasSelect extends true | false = false,
105 // Mapping of aliases <key in result> -> <key in TBase>
106 TAliasMapping extends {} = {},
107 // If enabled, then instead of extracting a partial, during resolution
108 // we will pick just a single property.
109 TSingle extends boolean = false,
110 // Extra props which will be intersected with the result
111 TIntersectProps extends {} = {},
112 // Extra props which will be unioned with the result
113 TUnionProps = never
114> = {
115 // These properties are not actually used, but exist simply because
116 // typescript doesn't end up happy when type parameters are unused
117 _base: TBase;
118 _hasSelection: THasSelect;
119 _keys: TKeys;
120 _aliases: TAliasMapping;
121 _single: TSingle;
122 _intersectProps: TIntersectProps;
123 _unionProps: TUnionProps;
124};
125
126// An companion namespace for DeferredKeySelection which provides type operators
127// to build up participants of intersection/partial over multiple invocations
128// and for final resolution.
129//
130// While the comments use wordings such as replacement and addition, it is important
131// to keep in mind that types are always immutable and all type operators return new altered types.
132declare namespace DeferredKeySelection {
133 type Any = DeferredKeySelection<any, any, any, any, any, any, any>;
134
135 // Replace the Base if already a deferred selection.
136 // If not, create a new deferred selection with specified base.
137 type SetBase<TSelection, TBase> = TSelection extends DeferredKeySelection<
138 any,
139 infer TKeys,
140 infer THasSelect,
141 infer TAliasMapping,
142 infer TSingle,
143 infer TIntersectProps,
144 infer TUnionProps
145 >
146 ? DeferredKeySelection<TBase, TKeys, THasSelect, TAliasMapping, TSingle, TIntersectProps, TUnionProps>
147 : DeferredKeySelection<TBase, never>;
148
149 // If TSelection is already a deferred selection, then replace the base with TBase
150 // If unknown, create a new deferred selection with TBase as the base
151 // Else, retain original
152 //
153 // For practical reasons applicable to current context, we always return arrays of
154 // deferred selections. So, this particular operator may not be useful in generic contexts.
155 type ReplaceBase<TSelection, TBase> = UnwrapArrayMember<
156 TSelection
157 > extends DeferredKeySelection.Any
158 ? ArrayIfAlready<TSelection, DeferredKeySelection.SetBase<UnwrapArrayMember<TSelection>, TBase>>
159 : unknown extends UnwrapArrayMember<TSelection>
160 ? ArrayIfAlready<TSelection, DeferredKeySelection.SetBase<unknown, TBase>>
161 : TSelection;
162
163 // Type operators to substitute individual type parameters:
164
165 type SetSingle<
166 TSelection,
167 TSingle extends boolean
168 > = TSelection extends DeferredKeySelection<
169 infer TBase,
170 infer TKeys,
171 infer THasSelect,
172 infer TAliasMapping,
173 any,
174 infer TIntersectProps,
175 infer TUnionProps
176 >
177 ? DeferredKeySelection<TBase, TKeys, THasSelect, TAliasMapping, TSingle, TIntersectProps, TUnionProps>
178 : never;
179
180 type AddKey<
181 TSelection,
182 TKey extends string
183 > = TSelection extends DeferredKeySelection<
184 infer TBase,
185 infer TKeys,
186 any,
187 infer TAliasMapping,
188 infer TSingle,
189 infer TIntersectProps,
190 infer TUnionProps
191 >
192 ? DeferredKeySelection<TBase, TKeys | TKey, true, TAliasMapping, TSingle, TIntersectProps, TUnionProps>
193 : DeferredKeySelection<unknown, TKey, true>;
194
195 type AddAliases<TSelection, T> = TSelection extends DeferredKeySelection<
196 infer TBase,
197 infer TKeys,
198 infer THasSelect,
199 infer TAliasMapping,
200 infer TSingle,
201 infer TIntersectProps,
202 infer TUnionProps
203 >
204 ? DeferredKeySelection<TBase, TKeys, THasSelect, TAliasMapping & T, TSingle, TIntersectProps, TUnionProps>
205 : DeferredKeySelection<unknown, never, false, T>;
206
207 type AddUnionMember<TSelection, T> = TSelection extends DeferredKeySelection<
208 infer TBase,
209 infer TKeys,
210 infer THasSelect,
211 infer TAliasMapping,
212 infer TSingle,
213 infer TIntersectProps,
214 infer TUnionProps
215 >
216 ? DeferredKeySelection<TBase, TKeys, THasSelect, TAliasMapping, TSingle, TIntersectProps, TUnionProps | T>
217 : DeferredKeySelection<TSelection, never, false, {}, false, {}, T>;
218
219 // Convenience utility to set base, keys and aliases in a single type
220 // application
221 type Augment<T, TBase, TKey extends string, TAliasMapping = {}> = AddAliases<
222 AddKey<SetBase<T, TBase>, TKey>,
223 TAliasMapping
224 >;
225
226 // Core resolution logic -- Refer to docs for DeferredKeySelection for specifics
227 type ResolveOne<TSelection> = TSelection extends DeferredKeySelection<
228 infer TBase,
229 infer TKeys,
230 infer THasSelect,
231 infer TAliasMapping,
232 infer TSingle,
233 infer TIntersectProps,
234 infer TUnionProps
235 >
236 ? UnknownToAny<
237 // ^ We convert final result to any if it is unknown for backward compatibility.
238 // Historically knex typings have been liberal with returning any and changing
239 // default return type to unknown would be a major breaking change for users.
240 //
241 // So we compromise on type safety here and return any.
242 AugmentParams<
243 AnyToUnknown<TBase> extends {}
244 // ^ Conversion of any -> unknown is needed here to prevent distribution
245 // of any over the conditional
246 ? TSingle extends true
247 ? TKeys extends keyof TBase
248 ? TBase[TKeys]
249 : any
250 : AugmentParams<
251 true extends THasSelect ? PartialOrAny<TBase, TKeys> : TBase,
252 MappedAliasType<TBase, TAliasMapping>
253 >
254 : unknown,
255 TIntersectProps
256 > | TUnionProps
257 >
258 : TSelection;
259
260 type Resolve<TSelection> = TSelection extends DeferredKeySelection.Any
261 ? ResolveOne<TSelection>
262 : TSelection extends DeferredKeySelection.Any[]
263 ? ResolveOne<TSelection[0]>[]
264 : TSelection extends (infer I)[]
265 ? UnknownToAny<I>[]
266 : UnknownToAny<TSelection>;
267}
268
269type AggregationQueryResult<TResult, TIntersectProps2> = ArrayIfAlready<
270 TResult,
271 UnwrapArrayMember<TResult> extends DeferredKeySelection<
272 infer TBase,
273 infer TKeys,
274 infer THasSelect,
275 infer TAliasMapping,
276 infer TSingle,
277 infer TIntersectProps,
278 infer TUnionProps
279 >
280 ? true extends THasSelect
281 ? DeferredKeySelection<TBase, TKeys, THasSelect, TAliasMapping, TSingle, TIntersectProps & TIntersectProps2, TUnionProps>
282 : DeferredKeySelection<{}, never, true, {}, false, TIntersectProps2>
283 : TIntersectProps2
284>;
285
286// Convenience alias and associated companion namespace for working
287// with DeferredSelection having TSingle=true.
288//
289// When TSingle=true in DeferredSelection, then we are effectively
290// deferring an index access operation (TBase[TKey]) over a potentially
291// unknown initial type of TBase and potentially never initial type of TKey
292
293type DeferredIndex<TBase, TKey extends string> = DeferredKeySelection<TBase, TKey, false, {}, true>;
294
295declare namespace DeferredIndex {
296 type Augment<
297 T,
298 TBase,
299 TKey extends string,
300 TAliasMapping = {}
301 > = DeferredKeySelection.SetSingle<
302 DeferredKeySelection.AddKey<DeferredKeySelection.SetBase<T, TBase>, TKey>,
303 true
304 >;
305}
306
307// If we have more categories of deferred selection in future,
308// this will combine all of them
309type ResolveResult<S> = DeferredKeySelection.Resolve<S>;
310
311// # Type-aliases for common type combinations
312
313type Callback = Function;
314type Client = Function;
315
316type Dict<T = any> = { [k: string]: T; };
317
318type SafePick<T, K extends keyof T> = T extends {} ? Pick<T, K> : any;
319
320type TableOptions = PgTableOptions;
321
322interface PgTableOptions {
323 only?: boolean;
324}
325
326interface Knex<TRecord extends {} = any, TResult = unknown[]>
327 extends Knex.QueryInterface<TRecord, TResult>, events.EventEmitter {
328 <TRecord2 = TRecord, TResult2 = DeferredKeySelection<TRecord2, never>[]>(
329 tableName?: Knex.TableDescriptor | Knex.AliasDict,
330 options?: TableOptions
331 ): Knex.QueryBuilder<TRecord2, TResult2>;
332 VERSION: string;
333 __knex__: string;
334
335 raw: Knex.RawBuilder<TRecord>;
336
337 transactionProvider(
338 config?: any
339 ): () => Promise<Knex.Transaction>;
340 transaction(
341 transactionScope?: null,
342 config?: any
343 ): Promise<Knex.Transaction>;
344 transaction<T>(
345 transactionScope: (trx: Knex.Transaction) => Promise<T> | Promise<T> | void,
346 config?: any
347 ): Promise<T>;
348 initialize(config?: Knex.Config): void;
349 destroy(callback: Function): void;
350 destroy(): Promise<void>;
351 batchInsert(
352 tableName: Knex.TableDescriptor,
353 data: readonly any[],
354 chunkSize?: number
355 ): Knex.QueryBuilder<TRecord, {}>;
356 schema: Knex.SchemaBuilder;
357 queryBuilder<TRecord2 = TRecord, TResult2 = TResult>(): Knex.QueryBuilder<
358 TRecord2,
359 TResult2
360 >;
361
362 client: any;
363 migrate: Knex.Migrator;
364 seed: Knex.Seeder;
365 fn: Knex.FunctionHelper;
366 ref: Knex.RefBuilder;
367}
368
369declare function Knex<TRecord extends {} = any, TResult = unknown[]>(
370 config: Knex.Config | string
371): Knex<TRecord, TResult>;
372
373declare namespace Knex {
374 //
375 // Utility Types
376 //
377
378 type Value =
379 | string
380 | number
381 | boolean
382 | null
383 | Date
384 | Array<string>
385 | Array<number>
386 | Array<Date>
387 | Array<boolean>
388 | Buffer
389 | Knex.Raw;
390
391 interface ValueDict extends Dict<Value | Knex.QueryBuilder> {}
392 interface AliasDict extends Dict<string> {}
393
394 type ColumnDescriptor<TRecord, TResult> =
395 | string
396 | Knex.Raw
397 | Knex.QueryBuilder<TRecord, TResult>
398 | Dict<string>;
399
400 type InferrableColumnDescriptor<TRecord extends {}> =
401 | keyof TRecord
402 | Knex.Ref<any, any>
403 | Dict<keyof TRecord>;
404
405 type TableDescriptor = string | Knex.Raw | Knex.QueryBuilder;
406
407 type Lookup<TRegistry extends {}, TKey extends string, TDefault = never> =
408 TKey extends keyof TRegistry ?
409 TRegistry[TKey] :
410 TDefault;
411
412 type MaybeRawColumn<TColumn> = TColumn | Raw<TColumn>;
413
414 type MaybeRawRecord<TRecord> = {
415 [K in keyof TRecord]: MaybeRawColumn<TRecord[K]>
416 };
417
418 type DbColumn<TColumn> = Readonly<MaybeRawColumn<TColumn>>;
419
420 type DbRecord<TRecord> = Readonly<SafePartial<MaybeRawRecord<TRecord>>>;
421
422 type DbRecordArr<TRecord> = Readonly<MaybeArray<DbRecord<TRecord>>>;
423
424 //
425 // QueryInterface
426 //
427
428 interface QueryInterface<TRecord extends {} = any, TResult = any> {
429 select: Select<TRecord, TResult>;
430 as: As<TRecord, TResult>;
431 columns: Select<TRecord, TResult>;
432 column: Select<TRecord, TResult>;
433 from: Table<TRecord, TResult>;
434 into: Table<TRecord, TResult>;
435 table: Table<TRecord, TResult>;
436 distinct: Distinct<TRecord, TResult>;
437 distinctOn: DistinctOn<TRecord, TResult>;
438
439 // Joins
440 join: Join<TRecord, TResult>;
441 joinRaw: JoinRaw<TRecord, TResult>;
442 innerJoin: Join<TRecord, TResult>;
443 leftJoin: Join<TRecord, TResult>;
444 leftOuterJoin: Join<TRecord, TResult>;
445 rightJoin: Join<TRecord, TResult>;
446 rightOuterJoin: Join<TRecord, TResult>;
447 outerJoin: Join<TRecord, TResult>;
448 fullOuterJoin: Join<TRecord, TResult>;
449 crossJoin: Join<TRecord, TResult>;
450
451 // Withs
452 with: With<TRecord, TResult>;
453 withRecursive: With<TRecord, TResult>;
454 withRaw: WithRaw<TRecord, TResult>;
455 withSchema: WithSchema<TRecord, TResult>;
456 withWrapped: WithWrapped<TRecord, TResult>;
457
458 // Wheres
459 where: Where<TRecord, TResult>;
460 andWhere: Where<TRecord, TResult>;
461 orWhere: Where<TRecord, TResult>;
462 whereNot: Where<TRecord, TResult>;
463 andWhereNot: Where<TRecord, TResult>;
464 orWhereNot: Where<TRecord, TResult>;
465 whereRaw: WhereRaw<TRecord, TResult>;
466 orWhereRaw: WhereRaw<TRecord, TResult>;
467 andWhereRaw: WhereRaw<TRecord, TResult>;
468 whereWrapped: WhereWrapped<TRecord, TResult>;
469 havingWrapped: WhereWrapped<TRecord, TResult>;
470 whereExists: WhereExists<TRecord, TResult>;
471 orWhereExists: WhereExists<TRecord, TResult>;
472 whereNotExists: WhereExists<TRecord, TResult>;
473 orWhereNotExists: WhereExists<TRecord, TResult>;
474 whereIn: WhereIn<TRecord, TResult>;
475 orWhereIn: WhereIn<TRecord, TResult>;
476 whereNotIn: WhereIn<TRecord, TResult>;
477 orWhereNotIn: WhereIn<TRecord, TResult>;
478 whereNull: WhereNull<TRecord, TResult>;
479 orWhereNull: WhereNull<TRecord, TResult>;
480 whereNotNull: WhereNull<TRecord, TResult>;
481 orWhereNotNull: WhereNull<TRecord, TResult>;
482 whereBetween: WhereBetween<TRecord, TResult>;
483 orWhereBetween: WhereBetween<TRecord, TResult>;
484 andWhereBetween: WhereBetween<TRecord, TResult>;
485 whereNotBetween: WhereBetween<TRecord, TResult>;
486 orWhereNotBetween: WhereBetween<TRecord, TResult>;
487 andWhereNotBetween: WhereBetween<TRecord, TResult>;
488
489 // Group by
490 groupBy: GroupBy<TRecord, TResult>;
491 groupByRaw: RawQueryBuilder<TRecord, TResult>;
492
493 // Order by
494 orderBy: OrderBy<TRecord, TResult>;
495 orderByRaw: RawQueryBuilder<TRecord, TResult>;
496
497 // Intersect
498 intersect: Intersect<TRecord, TResult>;
499
500 // Union
501 union: Union<TRecord, TResult>;
502 unionAll: Union<TRecord, TResult>;
503
504 // Having
505 having: Having<TRecord, TResult>;
506 andHaving: Having<TRecord, TResult>;
507 havingRaw: RawQueryBuilder<TRecord, TResult>;
508 orHaving: Having<TRecord, TResult>;
509 orHavingRaw: RawQueryBuilder<TRecord, TResult>;
510 havingIn: HavingRange<TRecord, TResult>;
511 orHavingNotBetween: HavingRange<TRecord, TResult>;
512 havingNotBetween: HavingRange<TRecord, TResult>;
513 orHavingBetween: HavingRange<TRecord, TResult>;
514 havingBetween: HavingRange<TRecord, TResult>;
515
516 // Clear
517 clearSelect(): QueryBuilder<
518 TRecord,
519 UnwrapArrayMember<TResult> extends DeferredKeySelection<
520 infer TBase,
521 infer TKeys,
522 true,
523 any,
524 any,
525 any,
526 any
527 >
528 ? DeferredKeySelection<TBase, never>[]
529 : TResult
530 >;
531 clearWhere(): QueryBuilder<TRecord, TResult>;
532 clearGroup(): QueryBuilder<TRecord, TResult>;
533 clearOrder(): QueryBuilder<TRecord, TResult>;
534 clearHaving(): QueryBuilder<TRecord, TResult>;
535 clearCounters(): QueryBuilder<TRecord, TResult>;
536
537 // Paging
538 offset(offset: number): QueryBuilder<TRecord, TResult>;
539 limit(limit: number): QueryBuilder<TRecord, TResult>;
540
541 // Aggregation
542 count: AsymmetricAggregation<TRecord, TResult, Lookup<ResultTypes.Registry, "Count", number | string>>;
543 countDistinct: AsymmetricAggregation<TRecord, TResult, Lookup<ResultTypes.Registry, "Count", number | string>>;
544 min: TypePreservingAggregation<TRecord, TResult>;
545 max: TypePreservingAggregation<TRecord, TResult>;
546 sum: TypePreservingAggregation<TRecord, TResult>;
547 sumDistinct: TypePreservingAggregation<TRecord, TResult>;
548 avg: TypePreservingAggregation<TRecord, TResult>;
549 avgDistinct: TypePreservingAggregation<TRecord, TResult>;
550
551 increment(
552 columnName: keyof TRecord,
553 amount?: number
554 ): QueryBuilder<TRecord, number>;
555 increment(
556 columnName: string,
557 amount?: number
558 ): QueryBuilder<TRecord, number>;
559
560 decrement(
561 columnName: keyof TRecord,
562 amount?: number
563 ): QueryBuilder<TRecord, number>;
564 decrement(
565 columnName: string,
566 amount?: number
567 ): QueryBuilder<TRecord, number>;
568
569 // Others
570 first: Select<TRecord, DeferredKeySelection.AddUnionMember<UnwrapArrayMember<TResult>, undefined>>;
571
572 pluck<K extends keyof TRecord>(
573 column: K
574 ): QueryBuilder<TRecord, TRecord[K][]>;
575 pluck<TResult2 extends {}>(column: string): QueryBuilder<TRecord, TResult2>;
576
577 insert(
578 data: DbRecordArr<TRecord>,
579 returning: '*'
580 ): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>;
581 insert<
582 TKey extends StrKey<TRecord>,
583 TResult2 = DeferredIndex.Augment<
584 UnwrapArrayMember<TResult>,
585 TRecord,
586 TKey
587 >[]
588 >(
589 data: DbRecordArr<TRecord>,
590 returning: TKey
591 ): QueryBuilder<TRecord, TResult2>;
592 insert<
593 TKey extends StrKey<TRecord>,
594 TResult2 = DeferredKeySelection.Augment<
595 UnwrapArrayMember<TResult>,
596 TRecord,
597 TKey
598 >[]
599 >(
600 data: DbRecordArr<TRecord>,
601 returning: readonly TKey[]
602 ): QueryBuilder<TRecord, TResult2>;
603 insert<
604 TKey extends string,
605 TResult2 = DeferredIndex.Augment<
606 UnwrapArrayMember<TResult>,
607 TRecord,
608 TKey
609 >[]
610 >(
611 data: DbRecordArr<TRecord>,
612 returning: TKey
613 ): QueryBuilder<TRecord, TResult2>;
614 insert<
615 TKey extends string,
616 TResult2 = DeferredIndex.Augment<
617 UnwrapArrayMember<TResult>,
618 TRecord,
619 TKey
620 >[]
621 >(
622 data: DbRecordArr<TRecord>,
623 returning: readonly TKey[]
624 ): QueryBuilder<TRecord, TResult2>;
625 insert<TResult2 = number[]>(
626 data: DbRecordArr<TRecord>
627 ): QueryBuilder<TRecord, TResult2>;
628
629 modify<TRecord2 extends {} = any, TResult2 extends {} = any>(
630 callback: QueryCallbackWithArgs<TRecord, any>,
631 ...args: any[]
632 ): QueryBuilder<TRecord2, TResult2>;
633 update<
634 K1 extends StrKey<TRecord>,
635 K2 extends StrKey<TRecord>,
636 TResult2 = DeferredIndex.Augment<
637 UnwrapArrayMember<TResult>,
638 TRecord,
639 K2
640 >[]
641 >(
642 columnName: K1,
643 value: DbColumn<TRecord[K1]>,
644 returning: K2
645 ): QueryBuilder<TRecord, TResult2>;
646 update<
647 K1 extends StrKey<TRecord>,
648 K2 extends StrKey<TRecord>,
649 TResult2 = DeferredKeySelection.Augment<
650 UnwrapArrayMember<TResult>,
651 TRecord,
652 K2
653 >[]
654 >(
655 columnName: K1,
656 value: DbColumn<TRecord[K1]>,
657 returning: readonly K2[]
658 ): QueryBuilder<TRecord, TResult2>;
659 update<K extends keyof TRecord>(
660 columnName: K,
661 value: DbColumn<TRecord[K]>
662 ): QueryBuilder<TRecord, number>;
663 update<TResult2 = SafePartial<TRecord>[]>(
664 columnName: string,
665 value: Value,
666 returning: string | readonly string[]
667 ): QueryBuilder<TRecord, TResult2>;
668 update(
669 data: DbRecordArr<TRecord>,
670 returning: '*'
671 ): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>;
672 update<
673 TKey extends StrKey<TRecord>,
674 TResult2 = DeferredIndex.Augment<
675 UnwrapArrayMember<TResult>,
676 TRecord,
677 TKey
678 >[]
679 >(
680 data: DbRecordArr<TRecord>,
681 returning: TKey
682 ): QueryBuilder<TRecord, TResult2>;
683 update<
684 TKey extends StrKey<TRecord>,
685 TResult2 = DeferredKeySelection.Augment<
686 UnwrapArrayMember<TResult>,
687 TRecord,
688 TKey
689 >[]
690 >(
691 data: DbRecordArr<TRecord>,
692 returning: readonly TKey[]
693 ): QueryBuilder<TRecord, TResult2>;
694 update<
695 TKey extends string = string,
696 TResult2 extends {}[] = DeferredKeySelection.Augment<
697 UnwrapArrayMember<TResult>,
698 TRecord,
699 TKey
700 >[]
701 >(
702 data: DbRecordArr<TRecord>,
703 returning: TKey | readonly TKey[]
704 ): QueryBuilder<TRecord, TResult2>;
705 update<
706 TKey extends string,
707 TResult2 extends {}[] = DeferredKeySelection.Augment<
708 UnwrapArrayMember<TResult>,
709 TRecord,
710 TKey
711 >[]
712 >(
713 data: DbRecordArr<TRecord>,
714 returning: readonly TKey[]
715 ): QueryBuilder<TRecord, TResult2>;
716 update<TResult2 = number>(
717 data: DbRecordArr<TRecord>
718 ): QueryBuilder<TRecord, TResult2>;
719
720 update<TResult2 = number>(columnName: string, value: Value): QueryBuilder<TRecord, TResult2>;
721
722 returning(column: '*'): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>;
723 returning<
724 TKey extends StrKey<TRecord>,
725 TResult2 = DeferredIndex.Augment<
726 UnwrapArrayMember<TResult>,
727 TRecord,
728 TKey
729 >[]
730 >(
731 column: TKey
732 ): QueryBuilder<TRecord, TResult2>;
733 returning<
734 TKey extends StrKey<TRecord>,
735 TResult2 = DeferredKeySelection.SetSingle<
736 DeferredKeySelection.Augment<UnwrapArrayMember<TResult>, TRecord, TKey>,
737 false
738 >[]
739 >(
740 columns: readonly TKey[]
741 ): QueryBuilder<TRecord, TResult2>;
742 returning<TResult2 = SafePartial<TRecord>[]>(
743 column: string | readonly string[]
744 ): QueryBuilder<TRecord, TResult2>;
745
746 del(
747 returning: '*'
748 ): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>;
749 del<
750 TKey extends StrKey<TRecord>,
751 TResult2 = DeferredIndex.Augment<
752 UnwrapArrayMember<TResult>,
753 TRecord,
754 TKey
755 >[]
756 >(
757 returning: TKey
758 ): QueryBuilder<TRecord, TResult2>;
759 del<
760 TKey extends StrKey<TRecord>,
761 TResult2 = DeferredKeySelection.Augment<
762 UnwrapArrayMember<TResult>,
763 TRecord,
764 TKey
765 >[]
766 >(
767 returning: readonly TKey[]
768 ): QueryBuilder<TRecord, TResult2[]>;
769 del<TResult2 = SafePartial<TRecord>[]>(
770 returning: string | readonly string[]
771 ): QueryBuilder<TRecord, TResult2>;
772 del<TResult2 = number>(): QueryBuilder<TRecord, TResult2>;
773
774 delete(
775 returning: '*'
776 ): QueryBuilder<TRecord, DeferredKeySelection<TRecord, never>[]>;
777 delete<
778 TKey extends StrKey<TRecord>,
779 TResult2 = DeferredIndex.Augment<
780 UnwrapArrayMember<TResult>,
781 TRecord,
782 TKey
783 >[]
784 >(
785 returning: TKey
786 ): QueryBuilder<TRecord, TResult2>;
787 delete<
788 TKey extends StrKey<TRecord>,
789 TResult2 = DeferredKeySelection.Augment<
790 UnwrapArrayMember<TResult>,
791 TRecord,
792 TKey
793 >[]
794 >(
795 returning: readonly TKey[]
796 ): QueryBuilder<TRecord, TResult2>;
797 delete<TResult2 = any>(
798 returning: string | readonly string[]
799 ): QueryBuilder<TRecord, TResult2>;
800 delete<TResult2 = number>(): QueryBuilder<TRecord, TResult2>;
801
802 truncate(): QueryBuilder<TRecord, void>;
803 }
804
805 interface As<TRecord, TResult> {
806 (columnName: keyof TRecord): QueryBuilder<TRecord, TResult>;
807 (columnName: string): QueryBuilder<TRecord, TResult>;
808 }
809
810 type IntersectAliases<AliasUT> =
811 UnionToIntersection<
812 IncompatibleToAlt<
813 AliasUT extends (infer I)[]
814 ? I extends Ref<any, infer TMapping>
815 ? TMapping
816 : I
817 : never,
818 Dict,
819 {}
820 >
821 >;
822
823 interface AliasQueryBuilder<TRecord extends {} = any, TResult = unknown[]> {
824 <
825 AliasUT extends InferrableColumnDescriptor<TRecord>[],
826 TResult2 = ArrayIfAlready<TResult, DeferredKeySelection.Augment<
827 UnwrapArrayMember<TResult>,
828 TRecord,
829 IncompatibleToAlt<ArrayMember<AliasUT>, string, never>,
830 IntersectAliases<AliasUT>
831 >>
832 >(
833 ...aliases: AliasUT
834 ): QueryBuilder<TRecord, TResult2>;
835
836 <
837 AliasUT extends InferrableColumnDescriptor<TRecord>[],
838 TResult2 = ArrayIfAlready<TResult, DeferredKeySelection.Augment<
839 UnwrapArrayMember<TResult>,
840 TRecord,
841 IncompatibleToAlt<ArrayMember<AliasUT>, string, never>,
842 IntersectAliases<AliasUT>
843 >>
844 >(
845 aliases: AliasUT
846 ): QueryBuilder<TRecord, TResult2>;
847
848 <
849 AliasUT extends (Dict | string)[],
850 TResult2 = ArrayIfAlready<TResult, DeferredKeySelection.Augment<
851 UnwrapArrayMember<TResult>,
852 TRecord,
853 IncompatibleToAlt<ArrayMember<AliasUT>, string, never>,
854 IntersectAliases<AliasUT>
855 >>
856 >(
857 ...aliases: AliasUT
858 ): QueryBuilder<TRecord, TResult2>;
859
860 <
861 AliasUT extends (Dict | string)[],
862 TResult2 = ArrayIfAlready<TResult, DeferredKeySelection.Augment<
863 UnwrapArrayMember<TResult>,
864 TRecord,
865 IncompatibleToAlt<ArrayMember<AliasUT>, string, never>,
866 IntersectAliases<AliasUT>
867 >>
868 >(
869 aliases: AliasUT
870 ): QueryBuilder<TRecord, TResult2>;
871 }
872
873 interface Select<TRecord extends {} = any, TResult = unknown[]>
874 extends AliasQueryBuilder<TRecord, TResult>,
875 ColumnNameQueryBuilder<TRecord, TResult> {
876 (): QueryBuilder<TRecord, TResult>;
877
878 <TResult2 = ArrayIfAlready<TResult, any>, TInnerRecord = any, TInnerResult = any>(
879 ...subQueryBuilders: readonly QueryBuilder<TInnerRecord, TInnerResult>[]
880 ): QueryBuilder<TRecord, TResult2>;
881
882 <TResult2 = ArrayIfAlready<TResult, any>, TInnerRecord = any, TInnerResult = any>(
883 subQueryBuilders: readonly QueryBuilder<TInnerRecord, TInnerResult>[]
884 ): QueryBuilder<TRecord, TResult2>;
885 }
886
887 interface Table<TRecord extends {} = any, TResult extends {} = any> {
888 <
889 TRecord2 = unknown,
890 TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
891 >(
892 tableName: TableDescriptor | AliasDict,
893 options?: TableOptions
894 ): QueryBuilder<TRecord2, TResult2>;
895 <
896 TRecord2 = unknown,
897 TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
898 >(
899 callback: Function,
900 options?: TableOptions
901 ): QueryBuilder<TRecord2, TResult2>;
902 <
903 TRecord2 = unknown,
904 TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
905 >(
906 raw: Raw,
907 options?: TableOptions
908 ): QueryBuilder<TRecord2, TResult2>;
909 }
910
911 interface Distinct<TRecord extends {}, TResult = {}[]>
912 extends ColumnNameQueryBuilder<TRecord, TResult> {}
913
914 interface DistinctOn<TRecord extends {}, TResult = {}[]> {
915 <ColNameUT extends keyof TRecord>(
916 ...columnNames: readonly ColNameUT[]
917 ): QueryBuilder<TRecord, TResult>;
918
919 <ColNameUT extends keyof TRecord>(
920 columnNames: readonly ColNameUT[]
921 ): QueryBuilder<TRecord, TResult>;
922
923 (...columnNames: readonly string[]): QueryBuilder<TRecord, TResult>;
924 (columnNames: readonly string[]): QueryBuilder<TRecord, TResult>;
925 }
926
927 interface JoinCallback {
928 (this: JoinClause, join: JoinClause): void;
929 }
930
931 interface Join<TRecord extends {} = any, TResult = unknown[]> {
932 <
933 TJoinTargetRecord extends {} = any,
934 TRecord2 extends {} = TRecord & TJoinTargetRecord,
935 TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
936 >(
937 raw: Raw
938 ): QueryBuilder<TRecord2, TResult2>;
939 <
940 TJoinTargetRecord extends {} = any,
941 TRecord2 extends {} = TRecord & TJoinTargetRecord,
942 TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
943 >(
944 tableName: TableDescriptor | AliasDict | QueryCallback,
945 clause: JoinCallback
946 ): QueryBuilder<TRecord2, TResult2>;
947 <
948 TJoinTargetRecord extends {} = any,
949 TRecord2 extends {} = TRecord & TJoinTargetRecord,
950 TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
951 >(
952 tableName: TableDescriptor | AliasDict | QueryCallback,
953 columns: { [key: string]: string | number | boolean | Raw }
954 ): QueryBuilder<TRecord2, TResult2>;
955 <
956 TJoinTargetRecord extends {} = any,
957 TRecord2 extends {} = TRecord & TJoinTargetRecord,
958 TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
959 >(
960 tableName: TableDescriptor | AliasDict | QueryCallback,
961 raw: Raw
962 ): QueryBuilder<TRecord2, TResult2>;
963 <
964 TJoinTargetRecord extends {} = any,
965 TRecord2 extends {} = TRecord & TJoinTargetRecord,
966 TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
967 >(
968 tableName: TableDescriptor | AliasDict | QueryCallback,
969 column1: string,
970 column2: string
971 ): QueryBuilder<TRecord2, TResult2>;
972 <
973 TJoinTargetRecord extends {} = any,
974 TRecord2 extends {} = TRecord & TJoinTargetRecord,
975 TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
976 >(
977 tableName: TableDescriptor | AliasDict | QueryCallback,
978 column1: string,
979 raw: Raw
980 ): QueryBuilder<TRecord2, TResult2>;
981 <
982 TJoinTargetRecord extends {} = any,
983 TRecord2 extends {} = TRecord & TJoinTargetRecord,
984 TResult2 = DeferredKeySelection.ReplaceBase<TResult, TRecord2>
985 >(
986 tableName: TableDescriptor | AliasDict | QueryCallback,
987 column1: string,
988 operator: string,
989 column2: string
990 ): QueryBuilder<TRecord2, TResult2>;
991 }
992
993 interface JoinClause {
994 on(raw: Raw): JoinClause;
995 on(callback: JoinCallback): JoinClause;
996 on(columns: { [key: string]: string | Raw }): JoinClause;
997 on(column1: string, column2: string): JoinClause;
998 on(column1: string, raw: Raw): JoinClause;
999 on(column1: string, operator: string, column2: string | Raw): JoinClause;
1000 andOn(raw: Raw): JoinClause;
1001 andOn(callback: JoinCallback): JoinClause;
1002 andOn(columns: { [key: string]: string | Raw }): JoinClause;
1003 andOn(column1: string, column2: string): JoinClause;
1004 andOn(column1: string, raw: Raw): JoinClause;
1005 andOn(column1: string, operator: string, column2: string | Raw): JoinClause;
1006 orOn(raw: Raw): JoinClause;
1007 orOn(callback: JoinCallback): JoinClause;
1008 orOn(columns: { [key: string]: string | Raw }): JoinClause;
1009 orOn(column1: string, column2: string): JoinClause;
1010 orOn(column1: string, raw: Raw): JoinClause;
1011 orOn(column1: string, operator: string, column2: string | Raw): JoinClause;
1012 onIn(column1: string, values: readonly any[]): JoinClause;
1013 andOnIn(column1: string, values: readonly any[]): JoinClause;
1014 orOnIn(column1: string, values: readonly any[]): JoinClause;
1015 onNotIn(column1: string, values: readonly any[]): JoinClause;
1016 andOnNotIn(column1: string, values: readonly any[]): JoinClause;
1017 orOnNotIn(column1: string, values: readonly any[]): JoinClause;
1018 onNull(column1: string): JoinClause;
1019 andOnNull(column1: string): JoinClause;
1020 orOnNull(column1: string): JoinClause;
1021 onNotNull(column1: string): JoinClause;
1022 andOnNotNull(column1: string): JoinClause;
1023 orOnNotNull(column1: string): JoinClause;
1024 onExists(callback: QueryCallback): JoinClause;
1025 andOnExists(callback: QueryCallback): JoinClause;
1026 orOnExists(callback: QueryCallback): JoinClause;
1027 onNotExists(callback: QueryCallback): JoinClause;
1028 andOnNotExists(callback: QueryCallback): JoinClause;
1029 orOnNotExists(callback: QueryCallback): JoinClause;
1030 onBetween(column1: string, range: readonly [any, any]): JoinClause;
1031 andOnBetween(column1: string, range: readonly [any, any]): JoinClause;
1032 orOnBetween(column1: string, range: readonly [any, any]): JoinClause;
1033 onNotBetween(column1: string, range: readonly [any, any]): JoinClause;
1034 andOnNotBetween(column1: string, range: readonly [any, any]): JoinClause;
1035 orOnNotBetween(column1: string, range: readonly [any, any]): JoinClause;
1036 using(
1037 column: string | readonly string[] | Raw | { [key: string]: string | Raw }
1038 ): JoinClause;
1039 type(type: string): JoinClause;
1040 }
1041
1042 interface JoinRaw<TRecord = any, TResult = unknown[]> {
1043 (tableName: string, binding?: Value | ValueDict): QueryBuilder<
1044 TRecord,
1045 TResult
1046 >;
1047 }
1048
1049 interface With<TRecord = any, TResult = unknown[]>
1050 extends WithRaw<TRecord, TResult>,
1051 WithWrapped<TRecord, TResult> {}
1052
1053 interface WithRaw<TRecord = any, TResult = unknown[]> {
1054 (alias: string, raw: Raw | QueryBuilder): QueryBuilder<TRecord, TResult>;
1055 (alias: string, sql: string, bindings?: readonly Value[] | Object): QueryBuilder<
1056 TRecord,
1057 TResult
1058 >;
1059 }
1060
1061 interface WithSchema<TRecord = any, TResult = unknown[]> {
1062 (schema: string): QueryBuilder<TRecord, TResult>;
1063 }
1064
1065 interface WithWrapped<TRecord = any, TResult = unknown[]> {
1066 (alias: string, queryBuilder: QueryBuilder): QueryBuilder<TRecord, TResult>;
1067 (
1068 alias: string,
1069 callback: (queryBuilder: QueryBuilder) => any
1070 ): QueryBuilder<TRecord, TResult>;
1071 }
1072
1073 interface Where<TRecord = any, TResult = unknown>
1074 extends WhereRaw<TRecord, TResult>,
1075 WhereWrapped<TRecord, TResult>,
1076 WhereNull<TRecord, TResult> {
1077 (raw: Raw): QueryBuilder<TRecord, TResult>;
1078
1079 (callback: QueryCallback): QueryBuilder<TRecord, TResult>;
1080
1081 (object: DbRecord<TRecord>): QueryBuilder<TRecord, TResult>;
1082
1083 (object: Readonly<Object>): QueryBuilder<TRecord, TResult>;
1084
1085 <T extends keyof TRecord>(
1086 columnName: T,
1087 value: DbColumn<TRecord[T]> | null
1088 ): QueryBuilder<TRecord, TResult>;
1089
1090 (columnName: string, value: Value | null): QueryBuilder<TRecord, TResult>;
1091
1092 <T extends keyof TRecord>(
1093 columnName: T,
1094 operator: ComparisonOperator,
1095 value: DbColumn<TRecord[T]> | null
1096 ): QueryBuilder<TRecord, TResult>;
1097
1098 (columnName: string, operator: string, value: Value | null): QueryBuilder<
1099 TRecord,
1100 TResult
1101 >;
1102
1103 <T extends keyof TRecord, TRecordInner, TResultInner>(
1104 columnName: T,
1105 operator: ComparisonOperator,
1106 value: QueryBuilder<TRecordInner, TResultInner>
1107 ): QueryBuilder<TRecord, TResult>;
1108
1109 <TRecordInner, TResultInner>(
1110 columnName: string,
1111 operator: string,
1112 value: QueryBuilder<TRecordInner, TResultInner>
1113 ): QueryBuilder<TRecord, TResult>;
1114
1115 (left: Raw, operator: string, right: Value | null): QueryBuilder<
1116 TRecord,
1117 TResult
1118 >;
1119
1120 <TRecordInner, TResultInner>(
1121 left: Raw,
1122 operator: string,
1123 right: QueryBuilder<TRecordInner, TResultInner>
1124 ): QueryBuilder<TRecord, TResult>;
1125 }
1126
1127 interface WhereRaw<TRecord = any, TResult = unknown[]>
1128 extends RawQueryBuilder<TRecord, TResult> {
1129 (condition: boolean): QueryBuilder<TRecord, TResult>;
1130 }
1131
1132 interface WhereWrapped<TRecord = any, TResult = unknown[]> {
1133 (callback: QueryCallback): QueryBuilder<TRecord, TResult>;
1134 }
1135
1136 interface WhereNull<TRecord = any, TResult = unknown[]> {
1137 (columnName: keyof TRecord): QueryBuilder<TRecord, TResult>;
1138 (columnName: string): QueryBuilder<TRecord, TResult>;
1139 }
1140
1141 interface WhereBetween<TRecord = any, TResult = unknown[]> {
1142 <K extends keyof TRecord>(
1143 columnName: K,
1144 range: readonly [DbColumn<TRecord[K]>, DbColumn<TRecord[K]>]
1145 ): QueryBuilder<TRecord, TResult>;
1146 (columnName: string, range: readonly [Value, Value]): QueryBuilder<TRecord, TResult>;
1147 }
1148
1149 interface WhereExists<TRecord = any, TResult = unknown[]> {
1150 (callback: QueryCallback): QueryBuilder<TRecord, TResult>;
1151 <TRecordInner, TResultInner>(
1152 query: QueryBuilder<TRecordInner, TResultInner>
1153 ): QueryBuilder<TRecord, TResult>;
1154 }
1155
1156 interface WhereIn<TRecord = any, TResult = unknown[]> {
1157 <K extends keyof TRecord>(
1158 columnName: K,
1159 values: readonly DbColumn<TRecord[K]>[] | QueryCallback
1160 ): QueryBuilder<TRecord, TResult>;
1161 (columnName: string, values: readonly Value[] | QueryCallback): QueryBuilder<
1162 TRecord,
1163 TResult
1164 >;
1165 <K extends keyof TRecord>(
1166 columnNames: readonly K[],
1167 values: readonly (readonly DbColumn<TRecord[K]>[])[] | QueryCallback
1168 ): QueryBuilder<TRecord, TResult>;
1169 (columnNames: readonly string[], values: readonly Value[][] | QueryCallback): QueryBuilder<
1170 TRecord,
1171 TResult
1172 >;
1173 <K extends keyof TRecord, TRecordInner, TResultInner>(
1174 columnName: K,
1175 values: QueryBuilder<TRecordInner, TRecord[K]>
1176 ): QueryBuilder<TRecord, TResult>;
1177 <TRecordInner, TResultInner>(
1178 columnName: string,
1179 values: QueryBuilder<TRecordInner, TResultInner>
1180 ): QueryBuilder<TRecord, TResult>;
1181 <K extends keyof TRecord, TRecordInner, TResultInner>(
1182 columnNames: readonly K[],
1183 values: QueryBuilder<TRecordInner, TRecord[K]>
1184 ): QueryBuilder<TRecord, TResult>;
1185 <TRecordInner, TResultInner>(
1186 columnNames: readonly string[],
1187 values: QueryBuilder<TRecordInner, TResultInner>
1188 ): QueryBuilder<TRecord, TResult>;
1189 }
1190
1191 // Note: Attempting to unify AsymmetricAggregation & TypePreservingAggregation
1192 // by extracting out a common base interface will not work because order of overloads
1193 // is significant.
1194
1195 interface AsymmetricAggregation<TRecord = any, TResult = unknown[], TValue = any> {
1196 <TResult2 = AggregationQueryResult<TResult, Dict<TValue>>>(
1197 ...columnNames: readonly (keyof TRecord)[]
1198 ): QueryBuilder<TRecord, TResult2>;
1199 <
1200 TAliases extends {} = Record<string, string | string[] | Knex.Raw>,
1201 TResult2 = AggregationQueryResult<TResult, {[k in keyof TAliases]?: TValue}>
1202 >(aliases: TAliases): QueryBuilder<TRecord, TResult2>;
1203 <TResult2 = AggregationQueryResult<TResult, Dict<TValue>>>(
1204 ...columnNames: ReadonlyArray<Readonly<Record<string, string | string[] | Knex.Raw>> | Knex.Raw | string>
1205 ): QueryBuilder<TRecord, TResult2>;
1206 }
1207
1208 interface TypePreservingAggregation<TRecord = any, TResult = unknown[], TValue = any> {
1209 <
1210 TKey extends keyof TRecord,
1211 TResult2 = AggregationQueryResult<TResult, Dict<TRecord[TKey]>>
1212 >(
1213 ...columnNames: readonly TKey[]
1214 ): QueryBuilder<TRecord, TResult2>;
1215 <
1216 TAliases extends {} = Readonly<Record<string, string | string[] | Knex.Raw>>,
1217 TResult2 = AggregationQueryResult<TResult, {
1218 // We have optional here because in most dialects aggregating by multiple keys simultaneously
1219 // causes rest of the keys to be dropped and only first to be considered
1220 [K in keyof TAliases]?: K extends keyof TRecord ?
1221 TRecord[K] :
1222 TValue
1223 }>
1224 >(aliases: TAliases): QueryBuilder<TRecord, TResult2>;
1225 <TResult2 = AggregationQueryResult<TResult, Dict<TValue>>>(
1226 ...columnNames: ReadonlyArray<Readonly<Record<string, string | readonly string[] | Knex.Raw>> | Knex.Raw | string>
1227 ): QueryBuilder<TRecord, TResult2>;
1228 }
1229
1230 interface GroupBy<TRecord = any, TResult = unknown[]>
1231 extends RawQueryBuilder<TRecord, TResult>,
1232 ColumnNameQueryBuilder<TRecord, TResult> {}
1233
1234 interface OrderBy<TRecord = any, TResult = unknown[]> {
1235 (columnName: keyof TRecord | QueryBuilder, order?: 'asc' | 'desc'): QueryBuilder<
1236 TRecord,
1237 TResult
1238 >;
1239 (columnName: string | QueryBuilder, order?: string): QueryBuilder<TRecord, TResult>;
1240 (
1241 columnDefs: Array<
1242 keyof TRecord | Readonly<{
1243 column: keyof TRecord | QueryBuilder;
1244 order?: 'asc' | 'desc'
1245 }>
1246 >
1247 ): QueryBuilder<TRecord, TResult>;
1248 (
1249 columnDefs: Array<string | Readonly<{
1250 column: string | QueryBuilder;
1251 order?: string;
1252 }>>
1253 ): QueryBuilder<TRecord, TResult>;
1254 }
1255
1256 interface Intersect<TRecord = any, TResult = unknown[]> {
1257 (
1258 callback: MaybeArray<QueryCallback | QueryBuilder<TRecord> | Raw>,
1259 wrap?: boolean
1260 ): QueryBuilder<TRecord, TResult>;
1261 (
1262 ...callbacks: readonly (QueryCallback | Raw | QueryBuilder<TRecord>)[]
1263 ): QueryBuilder<TRecord, TResult>;
1264 }
1265
1266 interface Union<TRecord = any, TResult = unknown[]>
1267 extends Intersect<TRecord, TResult> {}
1268
1269 interface Having<TRecord = any, TResult = unknown[]>
1270 extends WhereWrapped<TRecord, TResult> {
1271 <K extends keyof TRecord>(
1272 column: K,
1273 operator: ComparisonOperator,
1274 value: DbColumn<TRecord[K]>
1275 ): QueryBuilder<TRecord, TResult>;
1276
1277 (
1278 column: string | Raw,
1279 operator: string,
1280 value: Value | QueryBuilder | null
1281 ): QueryBuilder<TRecord, TResult>;
1282
1283 (raw: Raw): QueryBuilder<
1284 TRecord,
1285 TResult
1286 >;
1287 }
1288
1289 interface HavingRange<TRecord = any, TResult = unknown[]> {
1290 <K extends keyof TRecord>(
1291 columnName: K,
1292 values: readonly DbColumn<TRecord[K]>[]
1293 ): QueryBuilder<TRecord, TResult>;
1294 (columnName: string, values: readonly Value[]): QueryBuilder<TRecord, TResult>;
1295 }
1296
1297 // commons
1298
1299 interface ColumnNameQueryBuilder<TRecord = any, TResult = unknown[]> {
1300 // When all columns are known to be keys of original record,
1301 // we can extend our selection by these columns
1302 (columnName: '*'): QueryBuilder<
1303 TRecord,
1304 ArrayIfAlready<TResult, DeferredKeySelection<TRecord, string>>
1305 >;
1306
1307 <
1308 ColNameUT extends keyof TRecord,
1309 TResult2 = DeferredKeySelection.Augment<
1310 UnwrapArrayMember<TResult>,
1311 TRecord,
1312 ColNameUT & string
1313 >[]
1314 >(
1315 ...columnNames: readonly ColNameUT[]
1316 ): QueryBuilder<TRecord, TResult2>;
1317
1318 <
1319 ColNameUT extends keyof TRecord,
1320 TResult2 = DeferredKeySelection.Augment<
1321 UnwrapArrayMember<TResult>,
1322 TRecord,
1323 ColNameUT & string
1324 >[]
1325 >(
1326 columnNames: readonly ColNameUT[]
1327 ): QueryBuilder<TRecord, TResult2>;
1328
1329 // For non-inferrable column selection, we will allow consumer to
1330 // specify result type and if not widen the result to entire record type with any omissions permitted
1331 <
1332 TResult2 = DeferredKeySelection.Augment<
1333 UnwrapArrayMember<TResult>,
1334 SafePartial<TRecord>,
1335 keyof TRecord & string
1336 >[]
1337 >(
1338 ...columnNames: readonly ColumnDescriptor<TRecord, TResult>[]
1339 ): QueryBuilder<TRecord, TResult2>;
1340
1341 <
1342 TResult2 = DeferredKeySelection.Augment<
1343 UnwrapArrayMember<TResult>,
1344 SafePartial<TRecord>,
1345 keyof TRecord & string
1346 >[]
1347 >(
1348 columnNames: readonly ColumnDescriptor<TRecord, TResult>[]
1349 ): QueryBuilder<TRecord, TResult2>;
1350 }
1351
1352 type RawBinding = Value | QueryBuilder;
1353
1354 interface RawQueryBuilder<TRecord = any, TResult = unknown[]> {
1355 <TResult2 = TResult>(
1356 sql: string,
1357 bindings?: readonly RawBinding[] | ValueDict | RawBinding
1358 ): QueryBuilder<TRecord, TResult2>;
1359 <TResult2 = TResult>(raw: Raw<TResult2>): QueryBuilder<
1360 TRecord,
1361 TResult2
1362 >;
1363 }
1364
1365 // Raw
1366
1367 interface Raw<TResult = any>
1368 extends events.EventEmitter,
1369 ChainableInterface<ResolveResult<TResult>> {
1370 timeout(ms: number, options?: {cancel?: boolean}): Raw<TResult>;
1371 wrap<TResult2 = TResult>(before: string, after: string): Raw<TResult>;
1372 toSQL(): Sql;
1373 queryContext(context: any): Raw<TResult>;
1374 queryContext(): any;
1375 }
1376
1377 interface RawBuilder<TRecord extends {} = any, TResult = any> {
1378 <TResult2 = TResult>(value: Value): Raw<TResult2>;
1379 <TResult2 = TResult>(sql: string, ...bindings: readonly RawBinding[]): Raw<TResult2>;
1380 <TResult2 = TResult>(sql: string, bindings: readonly RawBinding[] | ValueDict): Raw<TResult2>;
1381 }
1382
1383 const RefMemberTag: unique symbol;
1384
1385 interface Ref<TSrc extends string, TMapping extends {}> extends Raw<string> {
1386 // TypeScript can behave weirdly if type parameters are not
1387 // actually used in the members of type.
1388 //
1389 // See: https://github.com/knex/knex/issues/3932
1390 //
1391 // We simply need to propagate the type context so that we can extract
1392 // them later, but we just add a "phantom" property so that typescript
1393 // doesn't think that these parameters are unused
1394 //
1395 // Because unique symbol is used here, there is no way to actually
1396 // access this at runtime
1397 [RefMemberTag]: {
1398 src: TSrc,
1399 mapping: TMapping
1400 };
1401 withSchema(schema: string): this;
1402 as<TAlias extends string>(alias: TAlias): Ref<TSrc, {[K in TAlias]: TSrc}>;
1403 }
1404
1405 interface RefBuilder {
1406 <TSrc extends string>(src: TSrc): Ref<TSrc, {[K in TSrc]: TSrc}>;
1407 }
1408
1409 //
1410 // QueryBuilder
1411 //
1412
1413 type QueryCallback<TRecord = any, TResult = unknown[]> = (
1414 this: QueryBuilder<TRecord, TResult>,
1415 builder: QueryBuilder<TRecord, TResult>
1416 ) => void;
1417
1418 type QueryCallbackWithArgs<TRecord = any, TResult = unknown[]> = (
1419 this: QueryBuilder<TRecord, TResult>,
1420 builder: QueryBuilder<TRecord, TResult>,
1421 ...args: any[]
1422 ) => void;
1423
1424 interface QueryBuilder<
1425 TRecord extends {} = any,
1426 TResult = any
1427 >
1428 extends QueryInterface<TRecord, TResult>,
1429 ChainableInterface<ResolveResult<TResult>> {
1430 client: Client;
1431 or: QueryBuilder<TRecord, TResult>;
1432 not: QueryBuilder<TRecord, TResult>;
1433 and: QueryBuilder<TRecord, TResult>;
1434
1435 // TODO: Promise?
1436 columnInfo(column?: keyof TRecord): Promise<ColumnInfo>;
1437
1438 forUpdate(...tableNames: string[]): QueryBuilder<TRecord, TResult>;
1439 forUpdate(tableNames: readonly string[]): QueryBuilder<TRecord, TResult>;
1440
1441 forShare(...tableNames: string[]): QueryBuilder<TRecord, TResult>;
1442 forShare(tableNames: readonly string[]): QueryBuilder<TRecord, TResult>;
1443
1444 skipLocked(): QueryBuilder<TRecord, TResult>;
1445 noWait(): QueryBuilder<TRecord, TResult>;
1446
1447 toSQL(): Sql;
1448
1449 on(event: string, callback: Function): QueryBuilder<TRecord, TResult>;
1450
1451 queryContext(context: any): QueryBuilder<TRecord, TResult>;
1452 queryContext(): any;
1453
1454 clone(): QueryBuilder<TRecord, TResult>;
1455 timeout(ms: number, options?: {cancel?: boolean}): QueryBuilder<TRecord, TResult>;
1456 }
1457
1458 interface Sql {
1459 method: string;
1460 options: any;
1461 bindings: readonly Value[];
1462 sql: string;
1463 toNative(): SqlNative;
1464 }
1465
1466 interface SqlNative {
1467 bindings: readonly Value[];
1468 sql: string;
1469 }
1470
1471 //
1472 // Chainable interface
1473 //
1474
1475 type ExposedPromiseKeys =
1476 | "then"
1477 | "catch"
1478 | "finally";
1479
1480 interface StringTagSupport {
1481 readonly [Symbol.toStringTag]: string;
1482 }
1483 interface ChainableInterface<T = any> extends Pick<Promise<T>, keyof Promise<T> & ExposedPromiseKeys>, StringTagSupport {
1484 toQuery(): string;
1485 options(options: Readonly<{ [key: string]: any }>): this;
1486 connection(connection: any): this;
1487 debug(enabled: boolean): this;
1488 transacting(trx: Transaction): this;
1489 stream(handler: (readable: stream.PassThrough) => any): Promise<any>;
1490 stream(
1491 options: Readonly<{ [key: string]: any }>,
1492 handler: (readable: stream.PassThrough) => any
1493 ): Promise<any>;
1494 stream(options?: Readonly<{ [key: string]: any }>): stream.PassThrough;
1495 pipe<T extends NodeJS.WritableStream>(
1496 writable: T,
1497 options?: Readonly<{ [key: string]: any }>
1498 ): stream.PassThrough;
1499 asCallback(callback: Function): Promise<T>;
1500 }
1501
1502 interface Transaction<TRecord extends {} = any, TResult = any>
1503 extends Knex<TRecord, TResult> {
1504 executionPromise: Promise<TResult>;
1505 isCompleted: () => boolean;
1506
1507 query<TRecord extends {} = any, TResult = void>(
1508 conn: any,
1509 sql: any,
1510 status: any,
1511 value: any
1512 ): QueryBuilder<TRecord, TResult>;
1513 savepoint<T = any>(
1514 transactionScope: (trx: Transaction) => any
1515 ): Promise<T>;
1516 commit(value?: any): QueryBuilder<TRecord, TResult>;
1517 rollback(error?: any): QueryBuilder<TRecord, TResult>;
1518 }
1519
1520 //
1521 // Schema builder
1522 //
1523
1524 interface SchemaBuilder extends ChainableInterface<void> {
1525 createTable(
1526 tableName: string,
1527 callback: (tableBuilder: CreateTableBuilder) => any
1528 ): SchemaBuilder;
1529 createTableIfNotExists(
1530 tableName: string,
1531 callback: (tableBuilder: CreateTableBuilder) => any
1532 ): SchemaBuilder;
1533 createSchema(schemaName: string): SchemaBuilder;
1534 createSchemaIfNotExists(schemaName: string): SchemaBuilder;
1535 alterTable(
1536 tableName: string,
1537 callback: (tableBuilder: CreateTableBuilder) => any
1538 ): SchemaBuilder;
1539 renameTable(oldTableName: string, newTableName: string): Promise<void>;
1540 dropTable(tableName: string): SchemaBuilder;
1541 hasTable(tableName: string): Promise<boolean>;
1542 hasColumn(tableName: string, columnName: string): Promise<boolean>;
1543 table(
1544 tableName: string,
1545 callback: (tableBuilder: AlterTableBuilder) => any
1546 ): Promise<void>;
1547 dropTableIfExists(tableName: string): SchemaBuilder;
1548 dropSchema(schemaName: string): SchemaBuilder;
1549 dropSchemaIfExists(schemaName: string): SchemaBuilder;
1550 raw(statement: string): SchemaBuilder;
1551 withSchema(schemaName: string): SchemaBuilder;
1552 queryContext(context: any): SchemaBuilder;
1553 toString(): string;
1554 toSQL(): Sql;
1555 }
1556
1557 interface TableBuilder {
1558 increments(columnName?: string): ColumnBuilder;
1559 bigIncrements(columnName?: string): ColumnBuilder;
1560 dropColumn(columnName: string): TableBuilder;
1561 dropColumns(...columnNames: string[]): TableBuilder;
1562 renameColumn(from: string, to: string): ColumnBuilder;
1563 integer(columnName: string, length?: number): ColumnBuilder;
1564 bigInteger(columnName: string): ColumnBuilder;
1565 text(columnName: string, textType?: string): ColumnBuilder;
1566 string(columnName: string, length?: number): ColumnBuilder;
1567 float(
1568 columnName: string,
1569 precision?: number,
1570 scale?: number
1571 ): ColumnBuilder;
1572 double(
1573 columnName: string,
1574 precision?: number,
1575 scale?: number
1576 ): ColumnBuilder;
1577 decimal(
1578 columnName: string,
1579 precision?: number | null,
1580 scale?: number
1581 ): ColumnBuilder;
1582 boolean(columnName: string): ColumnBuilder;
1583 date(columnName: string): ColumnBuilder;
1584 dateTime(columnName: string, options?: Readonly<{useTz?: boolean, precision?: number}>): ColumnBuilder;
1585 time(columnName: string): ColumnBuilder;
1586 timestamp(columnName: string, options?: Readonly<{useTz?: boolean, precision?: number}>): ColumnBuilder;
1587 /** @deprecated */
1588 timestamp(columnName: string, withoutTz?: boolean, precision?: number): ColumnBuilder;
1589 timestamps(
1590 useTimestampType?: boolean,
1591 makeDefaultNow?: boolean
1592 ): ColumnBuilder;
1593 binary(columnName: string, length?: number): ColumnBuilder;
1594 enum(
1595 columnName: string,
1596 values: readonly Value[],
1597 options?: EnumOptions
1598 ): ColumnBuilder;
1599 enu(
1600 columnName: string,
1601 values: readonly Value[],
1602 options?: EnumOptions
1603 ): ColumnBuilder;
1604 json(columnName: string): ColumnBuilder;
1605 jsonb(columnName: string): ColumnBuilder;
1606 uuid(columnName: string): ColumnBuilder;
1607 comment(val: string): TableBuilder;
1608 specificType(columnName: string, type: string): ColumnBuilder;
1609 primary(columnNames: readonly string[], constraintName?: string): TableBuilder;
1610 index(
1611 columnNames: string | readonly (string | Raw)[],
1612 indexName?: string,
1613 indexType?: string
1614 ): TableBuilder;
1615 unique(columnNames: readonly (string | Raw)[], indexName?: string): TableBuilder;
1616 foreign(column: string, foreignKeyName?: string): ForeignConstraintBuilder;
1617 foreign(
1618 columns: readonly string[],
1619 foreignKeyName?: string
1620 ): MultikeyForeignConstraintBuilder;
1621 dropForeign(columnNames: readonly string[], foreignKeyName?: string): TableBuilder;
1622 dropUnique(columnNames: readonly (string | Raw)[], indexName?: string): TableBuilder;
1623 dropPrimary(constraintName?: string): TableBuilder;
1624 dropIndex(columnNames: string | readonly (string | Raw)[], indexName?: string): TableBuilder;
1625 dropTimestamps(): ColumnBuilder;
1626 queryContext(context: any): TableBuilder;
1627 }
1628
1629 interface CreateTableBuilder extends TableBuilder {
1630 engine(val: string): CreateTableBuilder;
1631 charset(val: string): CreateTableBuilder;
1632 collate(val: string): CreateTableBuilder;
1633 inherits(val: string): CreateTableBuilder;
1634 }
1635
1636 interface AlterTableBuilder extends TableBuilder {}
1637
1638 interface ColumnBuilder {
1639 index(indexName?: string): ColumnBuilder;
1640 primary(constraintName?: string): ColumnBuilder;
1641 unique(indexName?: string): ColumnBuilder;
1642 references(columnName: string): ReferencingColumnBuilder;
1643 onDelete(command: string): ColumnBuilder;
1644 onUpdate(command: string): ColumnBuilder;
1645 defaultTo(value: Value | null): ColumnBuilder;
1646 unsigned(): ColumnBuilder;
1647 notNullable(): ColumnBuilder;
1648 nullable(): ColumnBuilder;
1649 comment(value: string): ColumnBuilder;
1650 alter(): ColumnBuilder;
1651 queryContext(context: any): ColumnBuilder;
1652 }
1653
1654 interface ForeignConstraintBuilder {
1655 references(columnName: string): ReferencingColumnBuilder;
1656 }
1657
1658 interface MultikeyForeignConstraintBuilder {
1659 references(columnNames: readonly string[]): ReferencingColumnBuilder;
1660 }
1661
1662 interface PostgreSqlColumnBuilder extends ColumnBuilder {
1663 index(indexName?: string, indexType?: string): ColumnBuilder;
1664 }
1665
1666 interface ReferencingColumnBuilder extends ColumnBuilder {
1667 inTable(tableName: string): ColumnBuilder;
1668 }
1669
1670 interface AlterColumnBuilder extends ColumnBuilder {}
1671
1672 interface MySqlAlterColumnBuilder extends AlterColumnBuilder {
1673 first(): AlterColumnBuilder;
1674 after(columnName: string): AlterColumnBuilder;
1675 }
1676
1677 //
1678 // Configurations
1679 //
1680
1681 interface ColumnInfo {
1682 defaultValue: Value;
1683 type: string;
1684 maxLength: number;
1685 nullable: boolean;
1686 }
1687
1688 interface Config<SV extends {} = any> {
1689 debug?: boolean;
1690 client?: string | typeof Client;
1691 dialect?: string;
1692 version?: string;
1693 connection?: string | StaticConnectionConfig | ConnectionConfigProvider;
1694 pool?: PoolConfig;
1695 migrations?: MigratorConfig;
1696 postProcessResponse?: (result: any, queryContext: any) => any;
1697 wrapIdentifier?: (
1698 value: string,
1699 origImpl: (value: string) => string,
1700 queryContext: any
1701 ) => string;
1702 seeds?: SeedsConfig<SV>;
1703 acquireConnectionTimeout?: number;
1704 useNullAsDefault?: boolean;
1705 searchPath?: string | readonly string[];
1706 asyncStackTraces?: boolean;
1707 log?: Logger;
1708 }
1709
1710 type StaticConnectionConfig =
1711 | ConnectionConfig
1712 | MariaSqlConnectionConfig
1713 | MySqlConnectionConfig
1714 | MsSqlConnectionConfig
1715 | OracleDbConnectionConfig
1716 | PgConnectionConfig
1717 | RedshiftConnectionConfig
1718 | Sqlite3ConnectionConfig
1719 | SocketConnectionConfig;
1720
1721 type ConnectionConfigProvider = SyncConnectionConfigProvider | AsyncConnectionConfigProvider;
1722 type SyncConnectionConfigProvider = () => StaticConnectionConfig;
1723 type AsyncConnectionConfigProvider = () => Promise<StaticConnectionConfig>;
1724
1725 interface ConnectionConfig {
1726 host: string;
1727 user: string;
1728 password: string;
1729 database: string;
1730 domain?: string;
1731 instanceName?: string;
1732 debug?: boolean;
1733 requestTimeout?: number;
1734 }
1735
1736 // Config object for mssql: see https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/mssql/index.d.ts
1737 interface MsSqlConnectionConfig {
1738 driver?: string;
1739 user?: string;
1740 password?: string;
1741 server: string;
1742 port?: number;
1743 domain?: string;
1744 database: string;
1745 connectionTimeout?: number;
1746 requestTimeout?: number;
1747 stream?: boolean;
1748 parseJSON?: boolean;
1749 expirationChecker?(): boolean;
1750 options?: Readonly<{
1751 encrypt?: boolean;
1752 instanceName?: string;
1753 useUTC?: boolean;
1754 tdsVersion?: string;
1755 appName?: string;
1756 abortTransactionOnError?: boolean;
1757 trustedConnection?: boolean;
1758 enableArithAbort?: boolean;
1759 }>;
1760 pool?: Readonly<{
1761 min?: number;
1762 max?: number;
1763 idleTimeoutMillis?: number;
1764 maxWaitingClients?: number;
1765 testOnBorrow?: boolean;
1766 acquireTimeoutMillis?: number;
1767 fifo?: boolean;
1768 priorityRange?: number;
1769 autostart?: boolean;
1770 evictionRunIntervalMillis?: number;
1771 numTestsPerRun?: number;
1772 softIdleTimeoutMillis?: number;
1773 Promise?: any;
1774 }>;
1775 }
1776
1777 // Config object for mariasql: https://github.com/mscdex/node-mariasql#client-methods
1778 interface MariaSqlConnectionConfig {
1779 user?: string;
1780 password?: string;
1781 host?: string;
1782 port?: number;
1783 unixSocket?: string;
1784 protocol?: string;
1785 db?: string;
1786 keepQueries?: boolean;
1787 multiStatements?: boolean;
1788 connTimeout?: number;
1789 pingInterval?: number;
1790 secureAuth?: boolean;
1791 compress?: boolean;
1792 ssl?: boolean | MariaSslConfiguration;
1793 local_infile?: boolean;
1794 read_default_file?: string;
1795 read_default_group?: string;
1796 charset?: string;
1797 streamHWM?: number;
1798 expirationChecker?(): boolean;
1799 }
1800
1801 interface MariaSslConfiguration {
1802 key?: string;
1803 cert?: string;
1804 ca?: string;
1805 capath?: string;
1806 cipher?: string;
1807 rejectUnauthorized?: boolean;
1808 expirationChecker?(): boolean;
1809 }
1810
1811 // Config object for mysql: https://github.com/mysqljs/mysql#connection-options
1812 interface MySqlConnectionConfig {
1813 host?: string;
1814 port?: number;
1815 localAddress?: string;
1816 socketPath?: string;
1817 user?: string;
1818 password?: string;
1819 database?: string;
1820 charset?: string;
1821 timezone?: string;
1822 connectTimeout?: number;
1823 stringifyObjects?: boolean;
1824 insecureAuth?: boolean;
1825 typeCast?: any;
1826 queryFormat?: (query: string, values: any) => string;
1827 supportBigNumbers?: boolean;
1828 bigNumberStrings?: boolean;
1829 dateStrings?: boolean;
1830 debug?: boolean;
1831 trace?: boolean;
1832 multipleStatements?: boolean;
1833 flags?: string;
1834 ssl?: string | MariaSslConfiguration;
1835 decimalNumbers?: boolean;
1836 expirationChecker?(): boolean;
1837 }
1838
1839 interface OracleDbConnectionConfig {
1840 host: string;
1841 user: string;
1842 password?: string;
1843 database?: string;
1844 domain?: string;
1845 instanceName?: string;
1846 debug?: boolean;
1847 requestTimeout?: number;
1848 connectString?: string;
1849 expirationChecker?(): boolean;
1850 }
1851
1852 // Config object for pg: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/pg/index.d.ts
1853 interface PgConnectionConfig {
1854 user?: string;
1855 database?: string;
1856 password?: string;
1857 port?: number;
1858 host?: string;
1859 connectionString?: string;
1860 keepAlive?: boolean;
1861 stream?: stream.Duplex;
1862 statement_timeout?: false | number;
1863 connectionTimeoutMillis?: number;
1864 keepAliveInitialDelayMillis?: number;
1865 ssl?: boolean | ConnectionOptions;
1866 }
1867
1868 type RedshiftConnectionConfig = PgConnectionConfig;
1869
1870 /** Used with SQLite3 adapter */
1871 interface Sqlite3ConnectionConfig {
1872 filename: string;
1873 debug?: boolean;
1874 expirationChecker?(): boolean;
1875 }
1876
1877 interface SocketConnectionConfig {
1878 socketPath: string;
1879 user: string;
1880 password: string;
1881 database: string;
1882 debug?: boolean;
1883 expirationChecker?(): boolean;
1884 }
1885
1886 interface PoolConfig {
1887 name?: string;
1888 afterCreate?: Function;
1889 min?: number;
1890 max?: number;
1891 refreshIdle?: boolean;
1892 idleTimeoutMillis?: number;
1893 reapIntervalMillis?: number;
1894 returnToHead?: boolean;
1895 priorityRange?: number;
1896 log?: (message: string, logLevel: string) => void;
1897
1898 // generic-pool v3 configs
1899 maxWaitingClients?: number;
1900 testOnBorrow?: boolean;
1901 acquireTimeoutMillis?: number;
1902 fifo?: boolean;
1903 autostart?: boolean;
1904 evictionRunIntervalMillis?: number;
1905 numTestsPerRun?: number;
1906 softIdleTimeoutMillis?: number;
1907 Promise?: any;
1908 }
1909
1910 type LogFn = (message: any) => void;
1911
1912 interface Logger {
1913 warn?: LogFn;
1914 error?: LogFn;
1915 debug?: LogFn;
1916 inspectionDepth?: number;
1917 enableColors?: boolean;
1918 deprecate?: (method: string, alternative: string) => void;
1919 }
1920
1921 interface Migration {
1922 up: (knex: Knex) => PromiseLike<any>;
1923 down?: (kenx: Knex) => PromiseLike<any>;
1924 }
1925
1926 interface MigrationSource<TMigrationSpec> {
1927 getMigrations(loadExtensions: readonly string[]): Promise<TMigrationSpec[]>;
1928 getMigrationName(migration: TMigrationSpec): string;
1929 getMigration(migration: TMigrationSpec): Migration;
1930 }
1931
1932 interface MigratorConfig {
1933 database?: string;
1934 directory?: string | readonly string[];
1935 extension?: string;
1936 stub?: string;
1937 tableName?: string;
1938 schemaName?: string;
1939 disableTransactions?: boolean;
1940 disableMigrationsListValidation?: boolean;
1941 sortDirsSeparately?: boolean;
1942 loadExtensions?: readonly string[];
1943 migrationSource?: MigrationSource<unknown>;
1944 }
1945
1946 interface SeedsConfig<V extends {} = any> {
1947 directory?: string;
1948 extension?: string;
1949 loadExtensions?: readonly string[];
1950 stub?: string;
1951 variables?: V;
1952 }
1953
1954 interface Migrator {
1955 make(name: string, config?: MigratorConfig): Promise<string>;
1956 latest(config?: MigratorConfig): Promise<any>;
1957 rollback(config?: MigratorConfig, all?: boolean): Promise<any>;
1958 status(config?: MigratorConfig): Promise<number>;
1959 currentVersion(config?: MigratorConfig): Promise<string>;
1960 list(config?: MigratorConfig): Promise<any>;
1961 up(config?: MigratorConfig): Promise<any>;
1962 down(config?: MigratorConfig): Promise<any>;
1963 forceFreeMigrationsLock(config?: MigratorConfig): Promise<any>;
1964 }
1965
1966 interface SeederConfig {
1967 extension?: string;
1968 directory?: string | string[];
1969 loadExtensions?: readonly string[];
1970 specific?: string;
1971 recursive?: boolean;
1972 sortDirsSeparately?: boolean;
1973 }
1974
1975 class Seeder {
1976 constructor(knex: Knex);
1977 setConfig(config: SeederConfig): SeederConfig;
1978 run(config?: SeederConfig): Promise<[string[]]>;
1979 make(name: string, config?: SeederConfig): Promise<string>;
1980 }
1981
1982 interface FunctionHelper {
1983 now(precision?: number): Raw;
1984 }
1985
1986 interface EnumOptions {
1987 useNative: boolean;
1988 existingType?: boolean;
1989 schemaName?: string;
1990 enumName: string;
1991 }
1992
1993 //
1994 // Clients
1995 //
1996
1997 class Client extends events.EventEmitter {
1998 constructor(config: Config);
1999 config: Config;
2000 dialect: string;
2001 driverName: string;
2002 connectionSettings: object;
2003
2004 acquireRawConnection(): Promise<any>;
2005 destroyRawConnection(connection: any): Promise<void>;
2006 validateConnection(connection: any): Promise<boolean>;
2007 logger: Logger;
2008 version?: string;
2009 connectionConfigProvider: any;
2010 connectionConfigExpirationChecker: null | (() => boolean);
2011 valueForUndefined: any;
2012 formatter(builder: any): any;
2013 queryBuilder(): QueryBuilder;
2014 queryCompiler(builder: any): any;
2015 schemaBuilder(): SchemaBuilder;
2016 schemaCompiler(builder: SchemaBuilder): any;
2017 tableBuilder(type: any, tableName: any, fn: any): TableBuilder;
2018 tableCompiler(tableBuilder: any): any;
2019 columnBuilder(tableBuilder: any, type: any, args: any): ColumnBuilder;
2020 columnCompiler(tableBuilder: any, columnBuilder: any): any;
2021 runner(builder: any): any;
2022 transaction(container: any, config: any, outerTx: any): Transaction;
2023 raw(...args: any[]): any;
2024 ref(...args: any[]): Ref<any, any>;
2025 query(connection: any, obj: any): any;
2026 stream(connection: any, obj: any, stream: any, options: any): any;
2027 prepBindings(bindings: any): any;
2028 positionBindings(sql: any): any;
2029 postProcessResponse(resp: any, queryContext: any): any;
2030 wrapIdentifier(value: any, queryContext: any): any;
2031 customWrapIdentifier(value: any, origImpl: any, queryContext: any): any;
2032 wrapIdentifierImpl(value: any): string;
2033 initializeDriver(): void;
2034 driver: any;
2035 poolDefaults(): {
2036 min: number;
2037 max: number;
2038 propagateCreateError: boolean;
2039 };
2040 getPoolSettings(poolConfig: any): any;
2041 initializePool(config?: {}): void;
2042 pool: tarn.Pool<any> | undefined;
2043 acquireConnection(): any;
2044 releaseConnection(connection: any): any;
2045 destroy(callback: any): any;
2046 database(): any;
2047 canCancelQuery: boolean;
2048 assertCanCancelQuery(): void;
2049 cancelQuery(): void;
2050 }
2051
2052 class QueryBuilder {
2053 static extend(
2054 methodName: string,
2055 fn: <TRecord extends {} = any, TResult = unknown[]>(
2056 this: QueryBuilder<TRecord, TResult>,
2057 ...args: any[]
2058 ) => QueryBuilder<TRecord, TResult>
2059 ): void;
2060 }
2061
2062 export class KnexTimeoutError extends Error {}
2063}
2064
2065export = Knex;