kysely 0.24.2 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/README.md +30 -13
  2. package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +2 -1
  3. package/dist/cjs/dialect/postgres/postgres-introspector.js +4 -1
  4. package/dist/cjs/driver/runtime-driver.js +6 -6
  5. package/dist/cjs/dynamic/dynamic.d.ts +1 -1
  6. package/dist/cjs/dynamic/dynamic.js +1 -1
  7. package/dist/cjs/expression/expression-builder.d.ts +56 -1
  8. package/dist/cjs/expression/expression-builder.js +10 -0
  9. package/dist/cjs/helpers/mysql.d.ts +3 -3
  10. package/dist/cjs/helpers/mysql.js +2 -2
  11. package/dist/cjs/helpers/postgres.d.ts +1 -1
  12. package/dist/cjs/index.d.ts +4 -0
  13. package/dist/cjs/index.js +4 -0
  14. package/dist/cjs/kysely.d.ts +19 -2
  15. package/dist/cjs/kysely.js +28 -1
  16. package/dist/cjs/operation-node/aggregate-function-node.d.ts +3 -7
  17. package/dist/cjs/operation-node/aggregate-function-node.js +1 -1
  18. package/dist/cjs/operation-node/alter-column-node.d.ts +1 -2
  19. package/dist/cjs/operation-node/alter-table-node.d.ts +1 -1
  20. package/dist/cjs/operation-node/alter-table-node.js +1 -2
  21. package/dist/cjs/operation-node/case-node.d.ts +19 -0
  22. package/dist/cjs/operation-node/case-node.js +42 -0
  23. package/dist/cjs/operation-node/create-index-node.d.ts +2 -1
  24. package/dist/cjs/operation-node/create-index-node.js +6 -0
  25. package/dist/cjs/operation-node/data-type-node.d.ts +1 -1
  26. package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -0
  27. package/dist/cjs/operation-node/operation-node-transformer.js +20 -2
  28. package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -0
  29. package/dist/cjs/operation-node/operation-node-visitor.js +2 -0
  30. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  31. package/dist/cjs/operation-node/when-node.d.ts +14 -0
  32. package/dist/cjs/operation-node/when-node.js +24 -0
  33. package/dist/cjs/parser/binary-operation-parser.d.ts +1 -0
  34. package/dist/cjs/parser/binary-operation-parser.js +18 -2
  35. package/dist/cjs/parser/expression-parser.d.ts +2 -1
  36. package/dist/cjs/parser/order-by-parser.d.ts +1 -0
  37. package/dist/cjs/parser/order-by-parser.js +5 -1
  38. package/dist/cjs/parser/reference-parser.d.ts +6 -2
  39. package/dist/cjs/parser/reference-parser.js +16 -1
  40. package/dist/cjs/parser/select-parser.d.ts +4 -4
  41. package/dist/cjs/parser/table-parser.d.ts +5 -4
  42. package/dist/cjs/parser/with-parser.d.ts +4 -3
  43. package/dist/cjs/query-builder/case-builder.d.ts +111 -0
  44. package/dist/cjs/query-builder/case-builder.js +75 -0
  45. package/dist/cjs/query-builder/delete-query-builder.d.ts +55 -13
  46. package/dist/cjs/query-builder/delete-query-builder.js +44 -0
  47. package/dist/cjs/query-builder/function-module.d.ts +36 -5
  48. package/dist/cjs/query-builder/function-module.js +12 -16
  49. package/dist/cjs/query-builder/insert-query-builder.d.ts +44 -3
  50. package/dist/cjs/query-builder/insert-query-builder.js +49 -1
  51. package/dist/cjs/query-builder/select-query-builder.d.ts +54 -13
  52. package/dist/cjs/query-builder/select-query-builder.js +43 -0
  53. package/dist/cjs/query-builder/update-query-builder.d.ts +65 -20
  54. package/dist/cjs/query-builder/update-query-builder.js +47 -0
  55. package/dist/cjs/query-compiler/default-query-compiler.d.ts +4 -0
  56. package/dist/cjs/query-compiler/default-query-compiler.js +30 -3
  57. package/dist/cjs/schema/alter-column-builder.d.ts +2 -2
  58. package/dist/cjs/schema/alter-column-builder.js +2 -2
  59. package/dist/cjs/schema/create-index-builder.d.ts +49 -7
  60. package/dist/cjs/schema/create-index-builder.js +51 -13
  61. package/dist/cjs/schema/schema.js +1 -1
  62. package/dist/cjs/util/column-type.d.ts +3 -2
  63. package/dist/cjs/util/log.d.ts +3 -3
  64. package/dist/cjs/util/log.js +4 -4
  65. package/dist/cjs/util/object-utils.d.ts +2 -1
  66. package/dist/cjs/util/type-utils.d.ts +43 -29
  67. package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +2 -1
  68. package/dist/esm/dialect/postgres/postgres-introspector.js +4 -1
  69. package/dist/esm/driver/runtime-driver.js +6 -6
  70. package/dist/esm/dynamic/dynamic.d.ts +1 -1
  71. package/dist/esm/dynamic/dynamic.js +1 -1
  72. package/dist/esm/expression/expression-builder.d.ts +56 -1
  73. package/dist/esm/expression/expression-builder.js +11 -1
  74. package/dist/esm/helpers/mysql.d.ts +3 -3
  75. package/dist/esm/helpers/mysql.js +2 -2
  76. package/dist/esm/helpers/postgres.d.ts +1 -1
  77. package/dist/esm/index.d.ts +4 -0
  78. package/dist/esm/index.js +4 -0
  79. package/dist/esm/kysely.d.ts +19 -2
  80. package/dist/esm/kysely.js +29 -2
  81. package/dist/esm/operation-node/aggregate-function-node.d.ts +3 -7
  82. package/dist/esm/operation-node/aggregate-function-node.js +1 -1
  83. package/dist/esm/operation-node/alter-column-node.d.ts +1 -2
  84. package/dist/esm/operation-node/alter-table-node.d.ts +1 -1
  85. package/dist/esm/operation-node/alter-table-node.js +1 -2
  86. package/dist/esm/operation-node/case-node.d.ts +19 -0
  87. package/dist/esm/operation-node/case-node.js +40 -0
  88. package/dist/esm/operation-node/create-index-node.d.ts +2 -1
  89. package/dist/esm/operation-node/create-index-node.js +6 -0
  90. package/dist/esm/operation-node/data-type-node.d.ts +1 -1
  91. package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -0
  92. package/dist/esm/operation-node/operation-node-transformer.js +20 -2
  93. package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -0
  94. package/dist/esm/operation-node/operation-node-visitor.js +2 -0
  95. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  96. package/dist/esm/operation-node/when-node.d.ts +14 -0
  97. package/dist/esm/operation-node/when-node.js +22 -0
  98. package/dist/esm/parser/binary-operation-parser.d.ts +1 -0
  99. package/dist/esm/parser/binary-operation-parser.js +16 -1
  100. package/dist/esm/parser/expression-parser.d.ts +2 -1
  101. package/dist/esm/parser/order-by-parser.d.ts +1 -0
  102. package/dist/esm/parser/order-by-parser.js +3 -0
  103. package/dist/esm/parser/reference-parser.d.ts +6 -2
  104. package/dist/esm/parser/reference-parser.js +14 -0
  105. package/dist/esm/parser/select-parser.d.ts +4 -4
  106. package/dist/esm/parser/table-parser.d.ts +5 -4
  107. package/dist/esm/parser/with-parser.d.ts +4 -3
  108. package/dist/esm/query-builder/case-builder.d.ts +111 -0
  109. package/dist/esm/query-builder/case-builder.js +69 -0
  110. package/dist/esm/query-builder/delete-query-builder.d.ts +55 -13
  111. package/dist/esm/query-builder/delete-query-builder.js +44 -0
  112. package/dist/esm/query-builder/function-module.d.ts +36 -5
  113. package/dist/esm/query-builder/function-module.js +13 -17
  114. package/dist/esm/query-builder/insert-query-builder.d.ts +44 -3
  115. package/dist/esm/query-builder/insert-query-builder.js +49 -1
  116. package/dist/esm/query-builder/select-query-builder.d.ts +54 -13
  117. package/dist/esm/query-builder/select-query-builder.js +43 -0
  118. package/dist/esm/query-builder/update-query-builder.d.ts +65 -20
  119. package/dist/esm/query-builder/update-query-builder.js +47 -0
  120. package/dist/esm/query-compiler/default-query-compiler.d.ts +4 -0
  121. package/dist/esm/query-compiler/default-query-compiler.js +30 -3
  122. package/dist/esm/schema/alter-column-builder.d.ts +2 -2
  123. package/dist/esm/schema/alter-column-builder.js +2 -2
  124. package/dist/esm/schema/create-index-builder.d.ts +49 -7
  125. package/dist/esm/schema/create-index-builder.js +52 -14
  126. package/dist/esm/schema/schema.js +1 -1
  127. package/dist/esm/util/column-type.d.ts +3 -2
  128. package/dist/esm/util/log.d.ts +3 -3
  129. package/dist/esm/util/log.js +4 -4
  130. package/dist/esm/util/object-utils.d.ts +2 -1
  131. package/dist/esm/util/type-utils.d.ts +43 -29
  132. package/package.json +1 -1
@@ -6,7 +6,7 @@ import { SelectExpression, SelectArg } from '../parser/select-parser.js';
6
6
  import { ReturningRow } from '../parser/returning-parser.js';
7
7
  import { ReferenceExpression } from '../parser/reference-parser.js';
8
8
  import { QueryNode } from '../operation-node/query-node.js';
9
- import { MergePartial, Nullable, SimplifyResult, SimplifySingleResult } from '../util/type-utils.js';
9
+ import { DrainOuterGeneric, NarrowPartial, Nullable, ShallowRecord, SimplifyResult, SimplifySingleResult } from '../util/type-utils.js';
10
10
  import { UpdateQueryNode } from '../operation-node/update-query-node.js';
11
11
  import { UpdateObject, UpdateObjectFactory } from '../parser/update-set-parser.js';
12
12
  import { Compilable } from '../util/compilable.js';
@@ -533,10 +533,10 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
533
533
  *
534
534
  * const result = await db
535
535
  * .updateTable('person')
536
- * .set(({ selectFrom, ref, fn }) => ({
537
- * first_name: 'Jennifer',
536
+ * .set(({ selectFrom, ref, fn, bxp }) => ({
537
+ * first_name: selectFrom('person').select('first_name').limit(1),
538
538
  * middle_name: ref('first_name'),
539
- * age: selectFrom('person').select(fn.avg('age')),
539
+ * age: bxp('age', '+', 1),
540
540
  * last_name: sql`${'Ani'} || ${'ston'}`,
541
541
  * }))
542
542
  * .where('id', '=', 1)
@@ -549,11 +549,11 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
549
549
  *
550
550
  * ```sql
551
551
  * update "person" set
552
- * "first_name" = $1,
552
+ * "first_name" = (select "first_name" from "person" limit $1),
553
553
  * "middle_name" = "first_name",
554
- * "age" = (select avg(age) from "person"),
555
- * "last_name" = $2 || $3
556
- * where "id" = $4
554
+ * "age" = "age" + $2,
555
+ * "last_name" = $3 || $4
556
+ * where "id" = $5
557
557
  * ```
558
558
  */
559
559
  set(update: UpdateObject<DB, TB, UT>): UpdateQueryBuilder<DB, UT, TB, O>;
@@ -687,11 +687,11 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
687
687
  * }
688
688
  * ```
689
689
  */
690
- $if<O2>(condition: boolean, func: (qb: this) => UpdateQueryBuilder<DB, UT, TB, O2>): UpdateQueryBuilder<DB, UT, TB, O2 extends UpdateResult ? UpdateResult : O extends UpdateResult ? Partial<O2> : MergePartial<O, O2>>;
690
+ $if<O2>(condition: boolean, func: (qb: this) => UpdateQueryBuilder<DB, UT, TB, O2>): O2 extends UpdateResult ? UpdateQueryBuilder<DB, UT, TB, UpdateResult> : O2 extends O & infer E ? UpdateQueryBuilder<DB, UT, TB, O & Partial<E>> : UpdateQueryBuilder<DB, UT, TB, Partial<O2>>;
691
691
  /**
692
692
  * @deprecated Use `$if` instead
693
693
  */
694
- if<O2>(condition: boolean, func: (qb: this) => UpdateQueryBuilder<DB, UT, TB, O2>): UpdateQueryBuilder<DB, UT, TB, O2 extends UpdateResult ? UpdateResult : O extends UpdateResult ? Partial<O2> : MergePartial<O, O2>>;
694
+ if<O2>(condition: boolean, func: (qb: this) => UpdateQueryBuilder<DB, UT, TB, O2>): O2 extends UpdateResult ? UpdateQueryBuilder<DB, UT, TB, UpdateResult> : O2 extends O & infer E ? UpdateQueryBuilder<DB, UT, TB, O & Partial<E>> : UpdateQueryBuilder<DB, UT, TB, Partial<O2>>;
695
695
  /**
696
696
  * Change the output type of the query.
697
697
  *
@@ -703,6 +703,51 @@ export declare class UpdateQueryBuilder<DB, UT extends keyof DB, TB extends keyo
703
703
  * @deprecated Use `$castTo` instead.
704
704
  */
705
705
  castTo<T>(): UpdateQueryBuilder<DB, UT, TB, T>;
706
+ /**
707
+ * Narrows (parts of) the output type of the query.
708
+ *
709
+ * Kysely tries to be as type-safe as possible, but in some cases we have to make
710
+ * compromises for better maintainability and compilation performance. At present,
711
+ * Kysely doesn't narrow the output type of the query based on {@link set} input
712
+ * when using {@link where} and/or {@link returning} or {@link returningAll}.
713
+ *
714
+ * This utility method is very useful for these situations, as it removes unncessary
715
+ * runtime assertion/guard code. Its input type is limited to the output type
716
+ * of the query, so you can't add a column that doesn't exist, or change a column's
717
+ * type to something that doesn't exist in its union type.
718
+ *
719
+ * ### Examples
720
+ *
721
+ * Turn this code:
722
+ *
723
+ * ```ts
724
+ * const person = await db.updateTable('person')
725
+ * .set({ deletedAt: now })
726
+ * .where('id', '=', id)
727
+ * .where('nullable_column', 'is not', null)
728
+ * .returningAll()
729
+ * .executeTakeFirstOrThrow()
730
+ *
731
+ * if (person.nullable_column) {
732
+ * functionThatExpectsPersonWithNonNullValue(person)
733
+ * }
734
+ * ```
735
+ *
736
+ * Into this:
737
+ *
738
+ * ```ts
739
+ * const person = await db.updateTable('person')
740
+ * .set({ deletedAt: now })
741
+ * .where('id', '=', id)
742
+ * .where('nullable_column', 'is not', null)
743
+ * .returningAll()
744
+ * .$narrowType<{ deletedAt: Date; nullable_column: string }>()
745
+ * .executeTakeFirstOrThrow()
746
+ *
747
+ * functionThatExpectsPersonWithNonNullValue(person)
748
+ * ```
749
+ */
750
+ $narrowType<T>(): UpdateQueryBuilder<DB, UT, TB, NarrowPartial<O, T>>;
706
751
  /**
707
752
  * Asserts that query's output row type equals the given type `T`.
708
753
  *
@@ -847,23 +892,23 @@ export interface UpdateQueryBuilderProps {
847
892
  readonly executor: QueryExecutor;
848
893
  }
849
894
  export declare type UpdateQueryBuilderWithInnerJoin<DB, UT extends keyof DB, TB extends keyof DB, O, TE extends TableExpression<DB, TB>> = TE extends `${infer T} as ${infer A}` ? T extends keyof DB ? InnerJoinedBuilder<DB, UT, TB, O, A, DB[T]> : never : TE extends keyof DB ? UpdateQueryBuilder<DB, UT, TB | TE, O> : TE extends AliasedExpression<infer QO, infer QA> ? InnerJoinedBuilder<DB, UT, TB, O, QA, QO> : TE extends (qb: any) => AliasedExpression<infer QO, infer QA> ? InnerJoinedBuilder<DB, UT, TB, O, QA, QO> : never;
850
- declare type InnerJoinedBuilder<DB, UT extends keyof DB, TB extends keyof DB, O, A extends string, R> = A extends keyof DB ? UpdateQueryBuilder<InnerJoinedDB<DB, A, R>, UT, TB | A, O> : UpdateQueryBuilder<DB & Record<A, R>, UT, TB | A, O>;
851
- declare type InnerJoinedDB<DB, A extends string, R> = {
895
+ declare type InnerJoinedBuilder<DB, UT extends keyof DB, TB extends keyof DB, O, A extends string, R> = A extends keyof DB ? UpdateQueryBuilder<InnerJoinedDB<DB, A, R>, UT, TB | A, O> : UpdateQueryBuilder<DB & ShallowRecord<A, R>, UT, TB | A, O>;
896
+ declare type InnerJoinedDB<DB, A extends string, R> = DrainOuterGeneric<{
852
897
  [C in keyof DB | A]: C extends A ? R : C extends keyof DB ? DB[C] : never;
853
- };
898
+ }>;
854
899
  export declare type UpdateQueryBuilderWithLeftJoin<DB, UT extends keyof DB, TB extends keyof DB, O, TE extends TableExpression<DB, TB>> = TE extends `${infer T} as ${infer A}` ? T extends keyof DB ? LeftJoinedBuilder<DB, UT, TB, O, A, DB[T]> : never : TE extends keyof DB ? LeftJoinedBuilder<DB, UT, TB, O, TE, DB[TE]> : TE extends AliasedExpression<infer QO, infer QA> ? LeftJoinedBuilder<DB, UT, TB, O, QA, QO> : TE extends (qb: any) => AliasedExpression<infer QO, infer QA> ? LeftJoinedBuilder<DB, UT, TB, O, QA, QO> : never;
855
- declare type LeftJoinedBuilder<DB, UT extends keyof DB, TB extends keyof DB, O, A extends keyof any, R> = A extends keyof DB ? UpdateQueryBuilder<LeftJoinedDB<DB, A, R>, UT, TB | A, O> : UpdateQueryBuilder<DB & Record<A, Nullable<R>>, UT, TB | A, O>;
856
- declare type LeftJoinedDB<DB, A extends keyof any, R> = {
900
+ declare type LeftJoinedBuilder<DB, UT extends keyof DB, TB extends keyof DB, O, A extends keyof any, R> = A extends keyof DB ? UpdateQueryBuilder<LeftJoinedDB<DB, A, R>, UT, TB | A, O> : UpdateQueryBuilder<DB & ShallowRecord<A, Nullable<R>>, UT, TB | A, O>;
901
+ declare type LeftJoinedDB<DB, A extends keyof any, R> = DrainOuterGeneric<{
857
902
  [C in keyof DB | A]: C extends A ? Nullable<R> : C extends keyof DB ? DB[C] : never;
858
- };
903
+ }>;
859
904
  export declare type UpdateQueryBuilderWithRightJoin<DB, UT extends keyof DB, TB extends keyof DB, O, TE extends TableExpression<DB, TB>> = TE extends `${infer T} as ${infer A}` ? T extends keyof DB ? RightJoinedBuilder<DB, UT, TB, O, A, DB[T]> : never : TE extends keyof DB ? RightJoinedBuilder<DB, UT, TB, O, TE, DB[TE]> : TE extends AliasedExpression<infer QO, infer QA> ? RightJoinedBuilder<DB, UT, TB, O, QA, QO> : TE extends (qb: any) => AliasedExpression<infer QO, infer QA> ? RightJoinedBuilder<DB, UT, TB, O, QA, QO> : never;
860
905
  declare type RightJoinedBuilder<DB, UT extends keyof DB, TB extends keyof DB, O, A extends keyof any, R> = UpdateQueryBuilder<RightJoinedDB<DB, TB, A, R>, UT, TB | A, O>;
861
- declare type RightJoinedDB<DB, TB extends keyof DB, A extends keyof any, R> = {
906
+ declare type RightJoinedDB<DB, TB extends keyof DB, A extends keyof any, R> = DrainOuterGeneric<{
862
907
  [C in keyof DB | A]: C extends A ? R : C extends TB ? Nullable<DB[C]> : C extends keyof DB ? DB[C] : never;
863
- };
908
+ }>;
864
909
  export declare type UpdateQueryBuilderWithFullJoin<DB, UT extends keyof DB, TB extends keyof DB, O, TE extends TableExpression<DB, TB>> = TE extends `${infer T} as ${infer A}` ? T extends keyof DB ? OuterJoinedBuilder<DB, UT, TB, O, A, DB[T]> : never : TE extends keyof DB ? OuterJoinedBuilder<DB, UT, TB, O, TE, DB[TE]> : TE extends AliasedExpression<infer QO, infer QA> ? OuterJoinedBuilder<DB, UT, TB, O, QA, QO> : TE extends (qb: any) => AliasedExpression<infer QO, infer QA> ? OuterJoinedBuilder<DB, UT, TB, O, QA, QO> : never;
865
910
  declare type OuterJoinedBuilder<DB, UT extends keyof DB, TB extends keyof DB, O, A extends keyof any, R> = UpdateQueryBuilder<OuterJoinedBuilderDB<DB, TB, A, R>, UT, TB | A, O>;
866
- declare type OuterJoinedBuilderDB<DB, TB extends keyof DB, A extends keyof any, R> = {
911
+ declare type OuterJoinedBuilderDB<DB, TB extends keyof DB, A extends keyof any, R> = DrainOuterGeneric<{
867
912
  [C in keyof DB | A]: C extends A ? Nullable<R> : C extends TB ? Nullable<DB[C]> : C extends keyof DB ? DB[C] : never;
868
- };
913
+ }>;
869
914
  export {};
@@ -215,6 +215,53 @@ export class UpdateQueryBuilder {
215
215
  castTo() {
216
216
  return this.$castTo();
217
217
  }
218
+ /**
219
+ * Narrows (parts of) the output type of the query.
220
+ *
221
+ * Kysely tries to be as type-safe as possible, but in some cases we have to make
222
+ * compromises for better maintainability and compilation performance. At present,
223
+ * Kysely doesn't narrow the output type of the query based on {@link set} input
224
+ * when using {@link where} and/or {@link returning} or {@link returningAll}.
225
+ *
226
+ * This utility method is very useful for these situations, as it removes unncessary
227
+ * runtime assertion/guard code. Its input type is limited to the output type
228
+ * of the query, so you can't add a column that doesn't exist, or change a column's
229
+ * type to something that doesn't exist in its union type.
230
+ *
231
+ * ### Examples
232
+ *
233
+ * Turn this code:
234
+ *
235
+ * ```ts
236
+ * const person = await db.updateTable('person')
237
+ * .set({ deletedAt: now })
238
+ * .where('id', '=', id)
239
+ * .where('nullable_column', 'is not', null)
240
+ * .returningAll()
241
+ * .executeTakeFirstOrThrow()
242
+ *
243
+ * if (person.nullable_column) {
244
+ * functionThatExpectsPersonWithNonNullValue(person)
245
+ * }
246
+ * ```
247
+ *
248
+ * Into this:
249
+ *
250
+ * ```ts
251
+ * const person = await db.updateTable('person')
252
+ * .set({ deletedAt: now })
253
+ * .where('id', '=', id)
254
+ * .where('nullable_column', 'is not', null)
255
+ * .returningAll()
256
+ * .$narrowType<{ deletedAt: Date; nullable_column: string }>()
257
+ * .executeTakeFirstOrThrow()
258
+ *
259
+ * functionThatExpectsPersonWithNonNullValue(person)
260
+ * ```
261
+ */
262
+ $narrowType() {
263
+ return new UpdateQueryBuilder(this.#props);
264
+ }
218
265
  /**
219
266
  * Asserts that query's output row type equals the given type `T`.
220
267
  *
@@ -81,6 +81,8 @@ import { BinaryOperationNode } from '../operation-node/binary-operation-node.js'
81
81
  import { UnaryOperationNode } from '../operation-node/unary-operation-node.js';
82
82
  import { UsingNode } from '../operation-node/using-node.js';
83
83
  import { FunctionNode } from '../operation-node/function-node.js';
84
+ import { CaseNode } from '../operation-node/case-node.js';
85
+ import { WhenNode } from '../operation-node/when-node.js';
84
86
  export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
85
87
  #private;
86
88
  protected get numParameters(): number;
@@ -170,6 +172,8 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
170
172
  protected isMinusOperator(node: OperationNode): node is OperatorNode;
171
173
  protected visitUsing(node: UsingNode): void;
172
174
  protected visitFunction(node: FunctionNode): void;
175
+ protected visitCase(node: CaseNode): void;
176
+ protected visitWhen(node: WhenNode): void;
173
177
  protected append(str: string): void;
174
178
  protected appendValue(parameter: unknown): void;
175
179
  protected getLeftIdentifierWrapper(): string;
@@ -546,9 +546,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
546
546
  this.append(' using ');
547
547
  this.visitNode(node.using);
548
548
  }
549
- if (node.expression) {
549
+ if (node.columns) {
550
550
  this.append(' (');
551
- this.visitNode(node.expression);
551
+ this.compileList(node.columns);
552
552
  this.append(')');
553
553
  }
554
554
  if (node.where) {
@@ -867,7 +867,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
867
867
  if (node.distinct) {
868
868
  this.append('distinct ');
869
869
  }
870
- this.visitNode(node.aggregated);
870
+ this.compileList(node.aggregated);
871
871
  this.append(')');
872
872
  if (node.filter) {
873
873
  this.append(' filter(');
@@ -926,6 +926,33 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
926
926
  this.compileList(node.arguments);
927
927
  this.append(')');
928
928
  }
929
+ visitCase(node) {
930
+ this.append('case');
931
+ if (node.value) {
932
+ this.append(' ');
933
+ this.visitNode(node.value);
934
+ }
935
+ if (node.when) {
936
+ this.append(' ');
937
+ this.compileList(node.when, ' ');
938
+ }
939
+ if (node.else) {
940
+ this.append(' else ');
941
+ this.visitNode(node.else);
942
+ }
943
+ this.append(' end');
944
+ if (node.isStatement) {
945
+ this.append(' case');
946
+ }
947
+ }
948
+ visitWhen(node) {
949
+ this.append('when ');
950
+ this.visitNode(node.condition);
951
+ if (node.result) {
952
+ this.append(' then ');
953
+ this.visitNode(node.result);
954
+ }
955
+ }
929
956
  append(str) {
930
957
  this.#sql += str;
931
958
  }
@@ -1,11 +1,11 @@
1
1
  import { AlterColumnNode } from '../operation-node/alter-column-node.js';
2
- import { ColumnDataType } from '../operation-node/data-type-node.js';
3
2
  import { OperationNodeSource } from '../operation-node/operation-node-source.js';
3
+ import { DataTypeExpression } from '../parser/data-type-parser.js';
4
4
  import { DefaultValueExpression } from '../parser/default-value-parser.js';
5
5
  export declare class AlterColumnBuilder {
6
6
  protected readonly alterColumnNode: AlterColumnNode;
7
7
  constructor(alterColumnNode: AlterColumnNode);
8
- setDataType(dataType: ColumnDataType): AlteredColumnBuilder;
8
+ setDataType(dataType: DataTypeExpression): AlteredColumnBuilder;
9
9
  setDefault(value: DefaultValueExpression): AlteredColumnBuilder;
10
10
  dropDefault(): AlteredColumnBuilder;
11
11
  setNotNull(): AlteredColumnBuilder;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="./alter-column-builder.d.ts" />
2
2
  import { AlterColumnNode } from '../operation-node/alter-column-node.js';
3
- import { DataTypeNode, } from '../operation-node/data-type-node.js';
3
+ import { parseDataTypeExpression, } from '../parser/data-type-parser.js';
4
4
  import { parseDefaultValueExpression, } from '../parser/default-value-parser.js';
5
5
  export class AlterColumnBuilder {
6
6
  alterColumnNode;
@@ -9,7 +9,7 @@ export class AlterColumnBuilder {
9
9
  }
10
10
  setDataType(dataType) {
11
11
  return new AlteredColumnBuilder(AlterColumnNode.cloneWith(this.alterColumnNode, {
12
- dataType: DataTypeNode.create(dataType),
12
+ dataType: parseDataTypeExpression(dataType),
13
13
  }));
14
14
  }
15
15
  setDefault(value) {
@@ -1,5 +1,6 @@
1
1
  import { CreateIndexNode, IndexType } from '../operation-node/create-index-node.js';
2
2
  import { OperationNodeSource } from '../operation-node/operation-node-source.js';
3
+ import { ExtractColumnNameFromOrderedColumnName, OrderedColumnName } from '../parser/reference-parser.js';
3
4
  import { CompiledQuery } from '../query-compiler/compiled-query.js';
4
5
  import { Compilable } from '../util/compilable.js';
5
6
  import { QueryExecutor } from '../query-executor/query-executor.js';
@@ -7,7 +8,7 @@ import { QueryId } from '../util/query-id.js';
7
8
  import { Expression } from '../expression/expression.js';
8
9
  import { ComparisonOperatorExpression } from '../parser/binary-operation-parser.js';
9
10
  import { ExpressionBuilder } from '../expression/expression-builder.js';
10
- import { SqlBool } from '../util/type-utils.js';
11
+ import { ShallowRecord, SqlBool } from '../util/type-utils.js';
11
12
  export declare class CreateIndexBuilder<C = never> implements OperationNodeSource, Compilable {
12
13
  #private;
13
14
  constructor(props: CreateIndexBuilderProps);
@@ -26,17 +27,52 @@ export declare class CreateIndexBuilder<C = never> implements OperationNodeSourc
26
27
  */
27
28
  on(table: string): CreateIndexBuilder<C>;
28
29
  /**
29
- * Specifies the column for the index.
30
+ * Adds a column to the index.
30
31
  *
31
- * Also see the `expression` for specifying an arbitrary expression.
32
+ * Also see {@link columns} for adding multiple columns at once or {@link expression}
33
+ * for specifying an arbitrary expression.
34
+ *
35
+ * ### Examples
36
+ *
37
+ * ```ts
38
+ * await db.schema
39
+ * .createIndex('person_first_name_and_age_index')
40
+ * .on('person')
41
+ * .column('first_name')
42
+ * .column('age desc')
43
+ * .execute()
44
+ * ```
45
+ *
46
+ * The generated SQL (PostgreSQL):
47
+ *
48
+ * ```sql
49
+ * create index "person_first_name_and_age_index" on "person" ("first_name", "age" desc)
50
+ * ```
32
51
  */
33
- column<CL extends string>(column: CL): CreateIndexBuilder<C | CL>;
52
+ column<CL extends string>(column: OrderedColumnName<CL>): CreateIndexBuilder<C | ExtractColumnNameFromOrderedColumnName<CL>>;
34
53
  /**
35
54
  * Specifies a list of columns for the index.
36
55
  *
37
- * Also see the `expression` for specifying an arbitrary expression.
56
+ * Also see {@link column} for adding a single column or {@link expression} for
57
+ * specifying an arbitrary expression.
58
+ *
59
+ * ### Examples
60
+ *
61
+ * ```ts
62
+ * await db.schema
63
+ * .createIndex('person_first_name_and_age_index')
64
+ * .on('person')
65
+ * .columns(['first_name', 'age desc'])
66
+ * .execute()
67
+ * ```
68
+ *
69
+ * The generated SQL (PostgreSQL):
70
+ *
71
+ * ```sql
72
+ * create index "person_first_name_and_age_index" on "person" ("first_name", "age" desc)
73
+ * ```
38
74
  */
39
- columns<CL extends string>(columns: CL[]): CreateIndexBuilder<C | CL>;
75
+ columns<CL extends string>(columns: OrderedColumnName<CL>[]): CreateIndexBuilder<C | ExtractColumnNameFromOrderedColumnName<CL>>;
40
76
  /**
41
77
  * Specifies an arbitrary expression for the index.
42
78
  *
@@ -51,6 +87,12 @@ export declare class CreateIndexBuilder<C = never> implements OperationNodeSourc
51
87
  * .expression(sql`first_name COLLATE "fi_FI"`)
52
88
  * .execute()
53
89
  * ```
90
+ *
91
+ * The generated SQL (PostgreSQL):
92
+ *
93
+ * ```sql
94
+ * create index "person_first_name_index" on "person" (first_name COLLATE "fi_FI")
95
+ * ```
54
96
  */
55
97
  expression(expression: Expression<any>): CreateIndexBuilder<C>;
56
98
  /**
@@ -90,7 +132,7 @@ export declare class CreateIndexBuilder<C = never> implements OperationNodeSourc
90
132
  * Parameters are always sent as literals due to database restrictions.
91
133
  */
92
134
  where(lhs: C | Expression<any>, op: ComparisonOperatorExpression, rhs: unknown): CreateIndexBuilder<C>;
93
- where(factory: (qb: ExpressionBuilder<Record<string, Record<C & string, any>>, string>) => Expression<SqlBool>): CreateIndexBuilder<C>;
135
+ where(factory: (qb: ExpressionBuilder<ShallowRecord<string, ShallowRecord<C & string, any>>, string>) => Expression<SqlBool>): CreateIndexBuilder<C>;
94
136
  where(expression: Expression<any>): CreateIndexBuilder<C>;
95
137
  /**
96
138
  * Simply calls the provided function passing `this` as the only argument. `$call` returns
@@ -1,8 +1,7 @@
1
1
  /// <reference types="./create-index-builder.d.ts" />
2
2
  import { CreateIndexNode, } from '../operation-node/create-index-node.js';
3
- import { ListNode } from '../operation-node/list-node.js';
4
3
  import { RawNode } from '../operation-node/raw-node.js';
5
- import { parseColumnName } from '../parser/reference-parser.js';
4
+ import { parseOrderedColumnName, } from '../parser/reference-parser.js';
6
5
  import { parseTable } from '../parser/table-parser.js';
7
6
  import { preventAwait } from '../util/prevent-await.js';
8
7
  import { freeze } from '../util/object-utils.js';
@@ -50,29 +49,62 @@ export class CreateIndexBuilder {
50
49
  });
51
50
  }
52
51
  /**
53
- * Specifies the column for the index.
52
+ * Adds a column to the index.
54
53
  *
55
- * Also see the `expression` for specifying an arbitrary expression.
54
+ * Also see {@link columns} for adding multiple columns at once or {@link expression}
55
+ * for specifying an arbitrary expression.
56
+ *
57
+ * ### Examples
58
+ *
59
+ * ```ts
60
+ * await db.schema
61
+ * .createIndex('person_first_name_and_age_index')
62
+ * .on('person')
63
+ * .column('first_name')
64
+ * .column('age desc')
65
+ * .execute()
66
+ * ```
67
+ *
68
+ * The generated SQL (PostgreSQL):
69
+ *
70
+ * ```sql
71
+ * create index "person_first_name_and_age_index" on "person" ("first_name", "age" desc)
72
+ * ```
56
73
  */
57
74
  column(column) {
58
75
  return new CreateIndexBuilder({
59
76
  ...this.#props,
60
- node: CreateIndexNode.cloneWith(this.#props.node, {
61
- expression: parseColumnName(column),
62
- }),
77
+ node: CreateIndexNode.cloneWithColumns(this.#props.node, [
78
+ parseOrderedColumnName(column),
79
+ ]),
63
80
  });
64
81
  }
65
82
  /**
66
83
  * Specifies a list of columns for the index.
67
84
  *
68
- * Also see the `expression` for specifying an arbitrary expression.
85
+ * Also see {@link column} for adding a single column or {@link expression} for
86
+ * specifying an arbitrary expression.
87
+ *
88
+ * ### Examples
89
+ *
90
+ * ```ts
91
+ * await db.schema
92
+ * .createIndex('person_first_name_and_age_index')
93
+ * .on('person')
94
+ * .columns(['first_name', 'age desc'])
95
+ * .execute()
96
+ * ```
97
+ *
98
+ * The generated SQL (PostgreSQL):
99
+ *
100
+ * ```sql
101
+ * create index "person_first_name_and_age_index" on "person" ("first_name", "age" desc)
102
+ * ```
69
103
  */
70
104
  columns(columns) {
71
105
  return new CreateIndexBuilder({
72
106
  ...this.#props,
73
- node: CreateIndexNode.cloneWith(this.#props.node, {
74
- expression: ListNode.create(columns.map(parseColumnName)),
75
- }),
107
+ node: CreateIndexNode.cloneWithColumns(this.#props.node, columns.map(parseOrderedColumnName)),
76
108
  });
77
109
  }
78
110
  /**
@@ -89,13 +121,19 @@ export class CreateIndexBuilder {
89
121
  * .expression(sql`first_name COLLATE "fi_FI"`)
90
122
  * .execute()
91
123
  * ```
124
+ *
125
+ * The generated SQL (PostgreSQL):
126
+ *
127
+ * ```sql
128
+ * create index "person_first_name_index" on "person" (first_name COLLATE "fi_FI")
129
+ * ```
92
130
  */
93
131
  expression(expression) {
94
132
  return new CreateIndexBuilder({
95
133
  ...this.#props,
96
- node: CreateIndexNode.cloneWith(this.#props.node, {
97
- expression: expression.toOperationNode(),
98
- }),
134
+ node: CreateIndexNode.cloneWithColumns(this.#props.node, [
135
+ expression.toOperationNode(),
136
+ ]),
99
137
  });
100
138
  }
101
139
  using(indexType) {
@@ -200,7 +200,7 @@ export class SchemaModule {
200
200
  return new AlterTableBuilder({
201
201
  queryId: createQueryId(),
202
202
  executor: this.#executor,
203
- node: AlterTableNode.create(table),
203
+ node: AlterTableNode.create(parseTable(table)),
204
204
  });
205
205
  }
206
206
  /**
@@ -1,3 +1,4 @@
1
+ import { DrainOuterGeneric } from './type-utils.js';
1
2
  /**
2
3
  * This type can be used to specify a different type for
3
4
  * select, insert and update operations.
@@ -118,9 +119,9 @@ export declare type UpdateKeys<R> = {
118
119
  * // }
119
120
  * ```
120
121
  */
121
- export declare type Selectable<R> = {
122
+ export declare type Selectable<R> = DrainOuterGeneric<{
122
123
  [K in NonNeverSelectKeys<R>]: SelectType<R[K]>;
123
- };
124
+ }>;
124
125
  /**
125
126
  * Given a table interface, extracts the insert type from all
126
127
  * {@link ColumnType} types.
@@ -14,12 +14,12 @@ export interface ErrorLogEvent {
14
14
  readonly queryDurationMillis: number;
15
15
  }
16
16
  export declare type LogEvent = QueryLogEvent | ErrorLogEvent;
17
- export declare type Logger = (event: LogEvent) => void;
17
+ export declare type Logger = (event: LogEvent) => void | Promise<void>;
18
18
  export declare type LogConfig = ReadonlyArray<LogLevel> | Logger;
19
19
  export declare class Log {
20
20
  #private;
21
21
  constructor(config: LogConfig);
22
22
  isLevelEnabled(level: LogLevel): boolean;
23
- query(getEvent: () => QueryLogEvent): void;
24
- error(getEvent: () => ErrorLogEvent): void;
23
+ query(getEvent: () => QueryLogEvent): Promise<void>;
24
+ error(getEvent: () => ErrorLogEvent): Promise<void>;
25
25
  }
@@ -23,14 +23,14 @@ export class Log {
23
23
  isLevelEnabled(level) {
24
24
  return this.#levels[level];
25
25
  }
26
- query(getEvent) {
26
+ async query(getEvent) {
27
27
  if (this.#levels.query) {
28
- this.#logger(getEvent());
28
+ await this.#logger(getEvent());
29
29
  }
30
30
  }
31
- error(getEvent) {
31
+ async error(getEvent) {
32
32
  if (this.#levels.error) {
33
- this.#logger(getEvent());
33
+ await this.#logger(getEvent());
34
34
  }
35
35
  }
36
36
  }
@@ -1,3 +1,4 @@
1
+ import { ShallowRecord } from './type-utils.js';
1
2
  export declare function isEmpty(obj: ArrayLike<unknown> | string | object): boolean;
2
3
  export declare function isUndefined(obj: unknown): obj is undefined;
3
4
  export declare function isString(obj: unknown): obj is string;
@@ -10,7 +11,7 @@ export declare function isBuffer(obj: unknown): obj is {
10
11
  length: number;
11
12
  };
12
13
  export declare function isFunction(obj: unknown): obj is Function;
13
- export declare function isObject(obj: unknown): obj is Record<string, unknown>;
14
+ export declare function isObject(obj: unknown): obj is ShallowRecord<string, unknown>;
14
15
  export declare function isArrayBufferOrView(obj: unknown): obj is ArrayBuffer | ArrayBufferView;
15
16
  export declare function getLast<T>(arr: ArrayLike<T>): T | undefined;
16
17
  export declare function freeze<T>(obj: T): Readonly<T>;