UNPKG

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