kysely 0.16.3 → 0.16.7

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 (150) hide show
  1. package/README.md +122 -9
  2. package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +205 -0
  3. package/dist/cjs/dialect/mysql/mysql-dialect-config.js +2 -0
  4. package/dist/cjs/dialect/mysql/mysql-dialect.d.ts +1 -205
  5. package/dist/cjs/dialect/mysql/mysql-dialect.js +2 -1
  6. package/dist/cjs/dialect/mysql/mysql-driver.d.ts +1 -1
  7. package/dist/cjs/dialect/mysql/mysql-driver.js +11 -3
  8. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +103 -0
  9. package/dist/cjs/dialect/postgres/postgres-dialect-config.js +2 -0
  10. package/dist/cjs/dialect/postgres/postgres-dialect.d.ts +1 -103
  11. package/dist/cjs/dialect/postgres/postgres-dialect.js +2 -1
  12. package/dist/cjs/dialect/postgres/postgres-driver.d.ts +1 -1
  13. package/dist/cjs/dialect/postgres/postgres-driver.js +12 -3
  14. package/dist/cjs/dialect/sqlite/sqlite-dialect-config.d.ts +43 -0
  15. package/dist/cjs/dialect/sqlite/sqlite-dialect-config.js +2 -0
  16. package/dist/cjs/dialect/sqlite/sqlite-dialect.d.ts +1 -43
  17. package/dist/cjs/dialect/sqlite/sqlite-dialect.js +2 -1
  18. package/dist/cjs/dialect/sqlite/sqlite-driver.d.ts +1 -1
  19. package/dist/cjs/dialect/sqlite/sqlite-driver.js +11 -3
  20. package/dist/cjs/driver/dummy-driver.d.ts +68 -0
  21. package/dist/cjs/driver/dummy-driver.js +62 -0
  22. package/dist/cjs/driver/runtime-driver.d.ts +1 -1
  23. package/dist/cjs/driver/runtime-driver.js +30 -33
  24. package/dist/cjs/index-nodeless.d.ts +2 -0
  25. package/dist/cjs/index-nodeless.js +2 -0
  26. package/dist/cjs/index.d.ts +3 -0
  27. package/dist/cjs/index.js +3 -0
  28. package/dist/cjs/kysely.d.ts +8 -6
  29. package/dist/cjs/kysely.js +8 -6
  30. package/dist/cjs/migration/migrator.d.ts +2 -2
  31. package/dist/cjs/operation-node/primitive-value-list-node.d.ts +2 -3
  32. package/dist/cjs/operation-node/value-node.d.ts +3 -4
  33. package/dist/cjs/parser/complex-expression-parser.d.ts +1 -0
  34. package/dist/cjs/parser/complex-expression-parser.js +5 -1
  35. package/dist/cjs/parser/default-value-parser.d.ts +2 -3
  36. package/dist/cjs/parser/default-value-parser.js +2 -2
  37. package/dist/cjs/parser/insert-values-parser.js +4 -3
  38. package/dist/cjs/parser/reference-parser.d.ts +2 -3
  39. package/dist/cjs/parser/value-parser.d.ts +2 -3
  40. package/dist/cjs/parser/value-parser.js +6 -7
  41. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +48 -0
  42. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.js +19 -0
  43. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.d.ts +9 -0
  44. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.js +42 -0
  45. package/dist/cjs/plugin/{immediate-value.ts → immediate-value}/immediate-value-plugin.d.ts +0 -0
  46. package/dist/cjs/plugin/{immediate-value.ts → immediate-value}/immediate-value-plugin.js +0 -0
  47. package/dist/cjs/plugin/{immediate-value.ts → immediate-value}/immediate-value-transformer.d.ts +0 -0
  48. package/dist/cjs/plugin/{immediate-value.ts → immediate-value}/immediate-value-transformer.js +0 -0
  49. package/dist/cjs/query-builder/delete-query-builder.d.ts +51 -9
  50. package/dist/cjs/query-builder/delete-query-builder.js +56 -8
  51. package/dist/cjs/query-builder/expression-builder.d.ts +1 -1
  52. package/dist/cjs/query-builder/expression-builder.js +2 -2
  53. package/dist/cjs/query-builder/function-builder.d.ts +29 -5
  54. package/dist/cjs/query-builder/function-builder.js +31 -7
  55. package/dist/cjs/query-builder/insert-query-builder.d.ts +53 -11
  56. package/dist/cjs/query-builder/insert-query-builder.js +58 -10
  57. package/dist/cjs/query-builder/select-query-builder.d.ts +58 -16
  58. package/dist/cjs/query-builder/select-query-builder.js +64 -15
  59. package/dist/cjs/query-builder/update-query-builder.d.ts +52 -9
  60. package/dist/cjs/query-builder/update-query-builder.js +57 -8
  61. package/dist/cjs/query-compiler/default-query-compiler.d.ts +1 -2
  62. package/dist/cjs/query-creator.d.ts +2 -2
  63. package/dist/cjs/query-creator.js +2 -2
  64. package/dist/cjs/schema/alter-table-builder.d.ts +30 -4
  65. package/dist/cjs/schema/alter-table-builder.js +2 -5
  66. package/dist/cjs/schema/column-definition-builder.d.ts +27 -2
  67. package/dist/cjs/schema/create-view-builder.js +1 -1
  68. package/dist/cjs/util/log.d.ts +1 -0
  69. package/dist/cjs/util/log.js +3 -0
  70. package/dist/cjs/util/object-utils.d.ts +5 -5
  71. package/dist/cjs/util/object-utils.js +52 -11
  72. package/dist/cjs/util/type-utils.d.ts +21 -0
  73. package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +205 -0
  74. package/dist/esm/dialect/mysql/mysql-dialect-config.js +2 -0
  75. package/dist/esm/dialect/mysql/mysql-dialect.d.ts +1 -205
  76. package/dist/esm/dialect/mysql/mysql-dialect.js +2 -1
  77. package/dist/esm/dialect/mysql/mysql-driver.d.ts +1 -1
  78. package/dist/esm/dialect/mysql/mysql-driver.js +12 -4
  79. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +103 -0
  80. package/dist/esm/dialect/postgres/postgres-dialect-config.js +2 -0
  81. package/dist/esm/dialect/postgres/postgres-dialect.d.ts +1 -103
  82. package/dist/esm/dialect/postgres/postgres-dialect.js +2 -1
  83. package/dist/esm/dialect/postgres/postgres-driver.d.ts +1 -1
  84. package/dist/esm/dialect/postgres/postgres-driver.js +12 -3
  85. package/dist/esm/dialect/sqlite/sqlite-dialect-config.d.ts +43 -0
  86. package/dist/esm/dialect/sqlite/sqlite-dialect-config.js +2 -0
  87. package/dist/esm/dialect/sqlite/sqlite-dialect.d.ts +1 -43
  88. package/dist/esm/dialect/sqlite/sqlite-dialect.js +2 -1
  89. package/dist/esm/dialect/sqlite/sqlite-driver.d.ts +1 -1
  90. package/dist/esm/dialect/sqlite/sqlite-driver.js +12 -4
  91. package/dist/esm/driver/dummy-driver.d.ts +68 -0
  92. package/dist/esm/driver/dummy-driver.js +59 -0
  93. package/dist/esm/driver/runtime-driver.d.ts +1 -1
  94. package/dist/esm/driver/runtime-driver.js +29 -32
  95. package/dist/esm/index-nodeless.d.ts +2 -0
  96. package/dist/esm/index-nodeless.js +2 -0
  97. package/dist/esm/index.d.ts +3 -0
  98. package/dist/esm/index.js +3 -0
  99. package/dist/esm/kysely.d.ts +8 -6
  100. package/dist/esm/kysely.js +8 -6
  101. package/dist/esm/migration/migrator.d.ts +2 -2
  102. package/dist/esm/operation-node/primitive-value-list-node.d.ts +2 -3
  103. package/dist/esm/operation-node/value-node.d.ts +3 -4
  104. package/dist/esm/parser/complex-expression-parser.d.ts +1 -0
  105. package/dist/esm/parser/complex-expression-parser.js +3 -0
  106. package/dist/esm/parser/default-value-parser.d.ts +2 -3
  107. package/dist/esm/parser/default-value-parser.js +2 -2
  108. package/dist/esm/parser/insert-values-parser.js +5 -4
  109. package/dist/esm/parser/reference-parser.d.ts +2 -3
  110. package/dist/esm/parser/reference-parser.js +1 -1
  111. package/dist/esm/parser/value-parser.d.ts +2 -3
  112. package/dist/esm/parser/value-parser.js +8 -9
  113. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +48 -0
  114. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.js +16 -0
  115. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.d.ts +9 -0
  116. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.js +39 -0
  117. package/dist/esm/plugin/{immediate-value.ts → immediate-value}/immediate-value-plugin.d.ts +0 -0
  118. package/dist/esm/plugin/{immediate-value.ts → immediate-value}/immediate-value-plugin.js +0 -0
  119. package/dist/esm/plugin/{immediate-value.ts → immediate-value}/immediate-value-transformer.d.ts +0 -0
  120. package/dist/esm/plugin/{immediate-value.ts → immediate-value}/immediate-value-transformer.js +0 -0
  121. package/dist/esm/query-builder/delete-query-builder.d.ts +51 -9
  122. package/dist/esm/query-builder/delete-query-builder.js +56 -8
  123. package/dist/esm/query-builder/expression-builder.d.ts +1 -1
  124. package/dist/esm/query-builder/expression-builder.js +1 -1
  125. package/dist/esm/query-builder/function-builder.d.ts +29 -5
  126. package/dist/esm/query-builder/function-builder.js +31 -7
  127. package/dist/esm/query-builder/insert-query-builder.d.ts +53 -11
  128. package/dist/esm/query-builder/insert-query-builder.js +58 -10
  129. package/dist/esm/query-builder/select-query-builder.d.ts +58 -16
  130. package/dist/esm/query-builder/select-query-builder.js +64 -15
  131. package/dist/esm/query-builder/update-query-builder.d.ts +52 -9
  132. package/dist/esm/query-builder/update-query-builder.js +57 -8
  133. package/dist/esm/query-compiler/default-query-compiler.d.ts +1 -2
  134. package/dist/esm/query-creator.d.ts +2 -2
  135. package/dist/esm/query-creator.js +2 -2
  136. package/dist/esm/schema/alter-table-builder.d.ts +30 -4
  137. package/dist/esm/schema/alter-table-builder.js +2 -5
  138. package/dist/esm/schema/column-definition-builder.d.ts +27 -2
  139. package/dist/esm/schema/create-view-builder.js +1 -1
  140. package/dist/esm/util/log.d.ts +1 -0
  141. package/dist/esm/util/log.js +3 -0
  142. package/dist/esm/util/object-utils.d.ts +5 -5
  143. package/dist/esm/util/object-utils.js +50 -9
  144. package/dist/esm/util/type-utils.d.ts +21 -0
  145. package/package.json +11 -5
  146. package/.prettierignore +0 -1
  147. package/dist/cjs/util/dynamic-import.d.ts +0 -2
  148. package/dist/cjs/util/dynamic-import.js +0 -32
  149. package/dist/esm/util/dynamic-import.d.ts +0 -2
  150. package/dist/esm/util/dynamic-import.js +0 -28
@@ -5,6 +5,9 @@ import { createQueryId } from '../util/query-id.js';
5
5
  /**
6
6
  * Helpers for type safe SQL function calls.
7
7
  *
8
+ * You can always use {@link Kysely.raw} to call functions and build arbitrary
9
+ * expressions. This module simply has shortcuts for most common function calls.
10
+ *
8
11
  * ### Examples
9
12
  *
10
13
  * ```ts
@@ -43,15 +46,36 @@ export class FunctionBuilder {
43
46
  }
44
47
  /**
45
48
  * Calls the `max` function for the column given as the argument.
49
+ *
50
+ * ### Examples
51
+ *
52
+ * ```ts
53
+ * const { max } = db.fn
54
+ *
55
+ * db.selectFrom('toy')
56
+ * .select(max('price').as('max_price'))
57
+ * .execute()
58
+ * ```
46
59
  */
47
- min(column) {
48
- return this.#oneArgFunction('min', column);
60
+ max(column) {
61
+ return this.#oneArgFunction('max', column);
49
62
  }
50
63
  /**
51
64
  * Calls the `min` function for the column given as the argument.
65
+ *
66
+ * ### Examples
67
+ *
68
+ * ```ts
69
+ * const { min } = db.fn
70
+ *
71
+ * db.selectFrom('toy')
72
+ * .select(min('price').as('min_price'))
73
+ * .execute()
74
+ * ```
75
+ *
52
76
  */
53
- max(column) {
54
- return this.#oneArgFunction('max', column);
77
+ min(column) {
78
+ return this.#oneArgFunction('min', column);
55
79
  }
56
80
  /**
57
81
  * Calls the `avg` function for the column given as the argument.
@@ -70,7 +94,7 @@ export class FunctionBuilder {
70
94
  * const { avg } = db.fn
71
95
  *
72
96
  * db.selectFrom('toy')
73
- * .select(avg<number>('price'))
97
+ * .select(avg<number>('price').as('avg_price'))
74
98
  * .execute()
75
99
  * ```
76
100
  */
@@ -94,7 +118,7 @@ export class FunctionBuilder {
94
118
  * const { sum } = db.fn
95
119
  *
96
120
  * db.selectFrom('toy')
97
- * .select(sum<number>('price'))
121
+ * .select(sum<number>('price').as('total_price'))
98
122
  * .execute()
99
123
  * ```
100
124
  */
@@ -118,7 +142,7 @@ export class FunctionBuilder {
118
142
  * const { count } = db.fn
119
143
  *
120
144
  * db.selectFrom('toy')
121
- * .select(count<number>('price'))
145
+ * .select(count<number>('id').as('num_toys'))
122
146
  * .execute()
123
147
  * ```
124
148
  */
@@ -3,12 +3,13 @@ import { CompiledQuery } from '../query-compiler/compiled-query.js';
3
3
  import { SelectExpression } from '../parser/select-parser.js';
4
4
  import { InsertObject } from '../parser/insert-values-parser.js';
5
5
  import { InsertQueryNode } from '../operation-node/insert-query-node.js';
6
- import { SingleResultType } from '../util/type-utils.js';
6
+ import { MergePartial, SingleResultType } from '../util/type-utils.js';
7
7
  import { MutationObject } from '../parser/update-set-parser.js';
8
8
  import { Compilable } from '../util/compilable.js';
9
9
  import { QueryExecutor } from '../query-executor/query-executor.js';
10
10
  import { QueryId } from '../util/query-id.js';
11
11
  import { ParseContext } from '../parser/parse-context.js';
12
+ import { InsertResult } from './insert-result.js';
12
13
  import { KyselyPlugin } from '../plugin/kysely-plugin.js';
13
14
  import { ReturningRow } from '../parser/returning-parser.js';
14
15
  import { NoResultErrorConstructor } from './no-result-error.js';
@@ -448,24 +449,62 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
448
449
  /**
449
450
  * Simply calls the given function passing `this` as the only argument.
450
451
  *
451
- * This method can be useful when adding optional method calls:
452
+ * If you want to conditionally call a method on `this`, see
453
+ * the {@link if} method.
452
454
  *
453
455
  * ### Examples
454
456
  *
457
+ * The next example uses a helper funtion `log` to log a query:
458
+ *
455
459
  * ```ts
456
- * db.insertInto('person')
457
- * .selectAll()
458
- * .call((qb) => {
459
- * if (something) {
460
- * return qb.onConflict((oc) => oc.column('something').doNothing())
461
- * } else {
462
- * return qb.onConflict((oc) => oc.column('something_else').doNothing())
463
- * }
464
- * })
460
+ * function log<T extends Compilable>(qb: T): T {
461
+ * console.log(qb.compile())
462
+ * return qb
463
+ * }
464
+ *
465
+ * db.updateTable('person')
466
+ * .set(values)
467
+ * .call(log)
465
468
  * .execute()
466
469
  * ```
467
470
  */
468
471
  call<T>(func: (qb: this) => T): T;
472
+ /**
473
+ * Call `func(this)` if `condition` is true.
474
+ *
475
+ * This method is especially handy with optional selects. Any `returning` or `returningAll`
476
+ * method calls add columns as optional fields to the output type when called inside
477
+ * the `func` callback. This is because we can't know if those selections were actually
478
+ * made before running the code.
479
+ *
480
+ * You can also call any other methods inside the callback.
481
+ *
482
+ * ### Examples
483
+ *
484
+ * ```ts
485
+ * async function insertPerson(values: InsertablePerson, returnLastName: boolean) {
486
+ * return await db
487
+ * .insertInto('person')
488
+ * .values(values)
489
+ * .returning(['id', 'first_name'])
490
+ * .if(returnLastName, (qb) => qb.returning('last_name'))
491
+ * .executeTakeFirstOrThrow()
492
+ * }
493
+ * ```
494
+ *
495
+ * Any selections added inside the `if` callback will be added as optional fields to the
496
+ * output type since we can't know if the selections were actually made before running
497
+ * the code. In the example above the return type of the `insertPerson` function is:
498
+ *
499
+ * ```ts
500
+ * {
501
+ * id: number
502
+ * first_name: string
503
+ * last_name?: string
504
+ * }
505
+ * ```
506
+ */
507
+ if<O2>(condition: boolean, func: (qb: this) => InsertQueryBuilder<DB, TB, O2>): InsertQueryBuilder<DB, TB, O2 extends InsertResult ? InsertResult : O extends InsertResult ? Partial<O2> : MergePartial<O, O2>>;
469
508
  /**
470
509
  * Change the output type of the query.
471
510
  *
@@ -473,6 +512,9 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
473
512
  * don't support your use case.
474
513
  */
475
514
  castTo<T>(): InsertQueryBuilder<DB, TB, T>;
515
+ /**
516
+ * Returns a copy of this InsertQueryBuilder instance with the given plugin installed.
517
+ */
476
518
  withPlugin(plugin: KyselyPlugin): InsertQueryBuilder<DB, TB, O>;
477
519
  toOperationNode(): InsertQueryNode;
478
520
  compile(): CompiledQuery;
@@ -315,26 +315,71 @@ export class InsertQueryBuilder {
315
315
  /**
316
316
  * Simply calls the given function passing `this` as the only argument.
317
317
  *
318
- * This method can be useful when adding optional method calls:
318
+ * If you want to conditionally call a method on `this`, see
319
+ * the {@link if} method.
319
320
  *
320
321
  * ### Examples
321
322
  *
323
+ * The next example uses a helper funtion `log` to log a query:
324
+ *
322
325
  * ```ts
323
- * db.insertInto('person')
324
- * .selectAll()
325
- * .call((qb) => {
326
- * if (something) {
327
- * return qb.onConflict((oc) => oc.column('something').doNothing())
328
- * } else {
329
- * return qb.onConflict((oc) => oc.column('something_else').doNothing())
330
- * }
331
- * })
326
+ * function log<T extends Compilable>(qb: T): T {
327
+ * console.log(qb.compile())
328
+ * return qb
329
+ * }
330
+ *
331
+ * db.updateTable('person')
332
+ * .set(values)
333
+ * .call(log)
332
334
  * .execute()
333
335
  * ```
334
336
  */
335
337
  call(func) {
336
338
  return func(this);
337
339
  }
340
+ /**
341
+ * Call `func(this)` if `condition` is true.
342
+ *
343
+ * This method is especially handy with optional selects. Any `returning` or `returningAll`
344
+ * method calls add columns as optional fields to the output type when called inside
345
+ * the `func` callback. This is because we can't know if those selections were actually
346
+ * made before running the code.
347
+ *
348
+ * You can also call any other methods inside the callback.
349
+ *
350
+ * ### Examples
351
+ *
352
+ * ```ts
353
+ * async function insertPerson(values: InsertablePerson, returnLastName: boolean) {
354
+ * return await db
355
+ * .insertInto('person')
356
+ * .values(values)
357
+ * .returning(['id', 'first_name'])
358
+ * .if(returnLastName, (qb) => qb.returning('last_name'))
359
+ * .executeTakeFirstOrThrow()
360
+ * }
361
+ * ```
362
+ *
363
+ * Any selections added inside the `if` callback will be added as optional fields to the
364
+ * output type since we can't know if the selections were actually made before running
365
+ * the code. In the example above the return type of the `insertPerson` function is:
366
+ *
367
+ * ```ts
368
+ * {
369
+ * id: number
370
+ * first_name: string
371
+ * last_name?: string
372
+ * }
373
+ * ```
374
+ */
375
+ if(condition, func) {
376
+ if (condition) {
377
+ return func(this);
378
+ }
379
+ return new InsertQueryBuilder({
380
+ ...this.#props,
381
+ });
382
+ }
338
383
  /**
339
384
  * Change the output type of the query.
340
385
  *
@@ -344,6 +389,9 @@ export class InsertQueryBuilder {
344
389
  castTo() {
345
390
  return new InsertQueryBuilder(this.#props);
346
391
  }
392
+ /**
393
+ * Returns a copy of this InsertQueryBuilder instance with the given plugin installed.
394
+ */
347
395
  withPlugin(plugin) {
348
396
  return new InsertQueryBuilder({
349
397
  ...this.#props,
@@ -7,7 +7,7 @@ import { SelectExpression, QueryBuilderWithSelection, SelectAllQueryBuilder } fr
7
7
  import { ExistsExpression, FilterOperator, FilterValueExpressionOrList, WhereGrouper, HavingGrouper } from '../parser/filter-parser.js';
8
8
  import { ReferenceExpression } from '../parser/reference-parser.js';
9
9
  import { SelectQueryNode } from '../operation-node/select-query-node.js';
10
- import { AnyRawBuilder, SingleResultType } from '../util/type-utils.js';
10
+ import { AnyRawBuilder, MergePartial, SingleResultType } from '../util/type-utils.js';
11
11
  import { OrderByDirectionExpression, OrderByExpression } from '../parser/order-by-parser.js';
12
12
  import { Compilable } from '../util/compilable.js';
13
13
  import { QueryExecutor } from '../query-executor/query-executor.js';
@@ -1116,27 +1116,15 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1116
1116
  /**
1117
1117
  * Simply calls the given function passing `this` as the only argument.
1118
1118
  *
1119
- * This method can be useful when adding optional method calls:
1119
+ * If you want to conditionally call a method on `this`, see
1120
+ * the {@link if} method.
1120
1121
  *
1121
1122
  * ### Examples
1122
1123
  *
1123
- * ```ts
1124
- * db.selectFrom('person')
1125
- * .selectAll()
1126
- * .call((qb) => {
1127
- * if (something) {
1128
- * return qb.where('something', '=', something)
1129
- * } else {
1130
- * return qb.where('somethingElse', '=', somethingElse)
1131
- * }
1132
- * })
1133
- * .execute()
1134
- * ```
1135
- *
1136
1124
  * The next example uses a helper funtion `log` to log a query:
1137
1125
  *
1138
1126
  * ```ts
1139
- * function log<T extends AnyQueryBuilder>(qb: T): T {
1127
+ * function log<T extends Compilable>(qb: T): T {
1140
1128
  * console.log(qb.compile())
1141
1129
  * return qb
1142
1130
  * }
@@ -1148,6 +1136,57 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1148
1136
  * ```
1149
1137
  */
1150
1138
  call<T>(func: (qb: this) => T): T;
1139
+ /**
1140
+ * Call `func(this)` if `condition` is true.
1141
+ *
1142
+ * This method is especially handy with optional selects. Any `select` or `selectAll`
1143
+ * method calls add columns as optional fields to the output type when called inside
1144
+ * the `func` callback. This is because we can't know if those selections were actually
1145
+ * made before running the code.
1146
+ *
1147
+ * Also see [this recipe](https://github.com/koskimas/kysely/tree/master/recipes/conditional-selects.md)
1148
+ *
1149
+ * ### Examples
1150
+ *
1151
+ * ```ts
1152
+ * async function getPerson(id: number, withLastName: boolean) {
1153
+ * return await db
1154
+ * .selectFrom('person')
1155
+ * .select(['id', 'first_name'])
1156
+ * .if(withLastName, (qb) => qb.select('last_name'))
1157
+ * .where('id', '=', id)
1158
+ * .executeTakeFirstOrThrow()
1159
+ * }
1160
+ * ```
1161
+ *
1162
+ * Any selections added inside the `if` callback will be added as optional fields to the
1163
+ * output type since we can't know if the selections were actually made before running
1164
+ * the code. In the example above the return type of the `getPerson` function is:
1165
+ *
1166
+ * ```ts
1167
+ * {
1168
+ * id: number
1169
+ * first_name: string
1170
+ * last_name?: string
1171
+ * }
1172
+ * ```
1173
+ *
1174
+ * You can also call any other methods inside the callback:
1175
+ *
1176
+ * ```ts
1177
+ * const { count } = db.fn
1178
+ *
1179
+ * db.selectFrom('person')
1180
+ * .select('person.id')
1181
+ * .if(filterByFirstName, (qb) => qb.where('first_name', '=', firstName))
1182
+ * .if(filterByPetCount, (qb) => qb
1183
+ * .innerJoin('pet', 'pet.owner_id', 'person.id')
1184
+ * .having(count('pet.id'), '>', petCountLimit)
1185
+ * .groupBy('person.id')
1186
+ * )
1187
+ * ```
1188
+ */
1189
+ if<O2 extends O>(condition: boolean, func: (qb: this) => SelectQueryBuilder<DB, TB, O2>): SelectQueryBuilder<DB, TB, MergePartial<O, O2>>;
1151
1190
  /**
1152
1191
  * Gives an alias for the query. This method is only useful for sub queries.
1153
1192
  *
@@ -1173,6 +1212,9 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1173
1212
  * don't support your use case.
1174
1213
  */
1175
1214
  castTo<T>(): SelectQueryBuilder<DB, TB, T>;
1215
+ /**
1216
+ * Returns a copy of this SelectQueryBuilder instance with the given plugin installed.
1217
+ */
1176
1218
  withPlugin(plugin: KyselyPlugin): SelectQueryBuilder<DB, TB, O>;
1177
1219
  toOperationNode(): SelectQueryNode;
1178
1220
  compile(): CompiledQuery;
@@ -425,27 +425,15 @@ export class SelectQueryBuilder {
425
425
  /**
426
426
  * Simply calls the given function passing `this` as the only argument.
427
427
  *
428
- * This method can be useful when adding optional method calls:
428
+ * If you want to conditionally call a method on `this`, see
429
+ * the {@link if} method.
429
430
  *
430
431
  * ### Examples
431
432
  *
432
- * ```ts
433
- * db.selectFrom('person')
434
- * .selectAll()
435
- * .call((qb) => {
436
- * if (something) {
437
- * return qb.where('something', '=', something)
438
- * } else {
439
- * return qb.where('somethingElse', '=', somethingElse)
440
- * }
441
- * })
442
- * .execute()
443
- * ```
444
- *
445
433
  * The next example uses a helper funtion `log` to log a query:
446
434
  *
447
435
  * ```ts
448
- * function log<T extends AnyQueryBuilder>(qb: T): T {
436
+ * function log<T extends Compilable>(qb: T): T {
449
437
  * console.log(qb.compile())
450
438
  * return qb
451
439
  * }
@@ -459,6 +447,64 @@ export class SelectQueryBuilder {
459
447
  call(func) {
460
448
  return func(this);
461
449
  }
450
+ /**
451
+ * Call `func(this)` if `condition` is true.
452
+ *
453
+ * This method is especially handy with optional selects. Any `select` or `selectAll`
454
+ * method calls add columns as optional fields to the output type when called inside
455
+ * the `func` callback. This is because we can't know if those selections were actually
456
+ * made before running the code.
457
+ *
458
+ * Also see [this recipe](https://github.com/koskimas/kysely/tree/master/recipes/conditional-selects.md)
459
+ *
460
+ * ### Examples
461
+ *
462
+ * ```ts
463
+ * async function getPerson(id: number, withLastName: boolean) {
464
+ * return await db
465
+ * .selectFrom('person')
466
+ * .select(['id', 'first_name'])
467
+ * .if(withLastName, (qb) => qb.select('last_name'))
468
+ * .where('id', '=', id)
469
+ * .executeTakeFirstOrThrow()
470
+ * }
471
+ * ```
472
+ *
473
+ * Any selections added inside the `if` callback will be added as optional fields to the
474
+ * output type since we can't know if the selections were actually made before running
475
+ * the code. In the example above the return type of the `getPerson` function is:
476
+ *
477
+ * ```ts
478
+ * {
479
+ * id: number
480
+ * first_name: string
481
+ * last_name?: string
482
+ * }
483
+ * ```
484
+ *
485
+ * You can also call any other methods inside the callback:
486
+ *
487
+ * ```ts
488
+ * const { count } = db.fn
489
+ *
490
+ * db.selectFrom('person')
491
+ * .select('person.id')
492
+ * .if(filterByFirstName, (qb) => qb.where('first_name', '=', firstName))
493
+ * .if(filterByPetCount, (qb) => qb
494
+ * .innerJoin('pet', 'pet.owner_id', 'person.id')
495
+ * .having(count('pet.id'), '>', petCountLimit)
496
+ * .groupBy('person.id')
497
+ * )
498
+ * ```
499
+ */
500
+ if(condition, func) {
501
+ if (condition) {
502
+ return func(this);
503
+ }
504
+ return new SelectQueryBuilder({
505
+ ...this.#props,
506
+ });
507
+ }
462
508
  /**
463
509
  * Gives an alias for the query. This method is only useful for sub queries.
464
510
  *
@@ -488,6 +534,9 @@ export class SelectQueryBuilder {
488
534
  castTo() {
489
535
  return new SelectQueryBuilder(this.#props);
490
536
  }
537
+ /**
538
+ * Returns a copy of this SelectQueryBuilder instance with the given plugin installed.
539
+ */
491
540
  withPlugin(plugin) {
492
541
  return new SelectQueryBuilder({
493
542
  ...this.#props,
@@ -6,13 +6,14 @@ import { SelectExpression } from '../parser/select-parser.js';
6
6
  import { ExistsExpression, FilterOperator, FilterValueExpressionOrList, WhereGrouper } from '../parser/filter-parser.js';
7
7
  import { ReturningRow } from '../parser/returning-parser.js';
8
8
  import { ReferenceExpression } from '../parser/reference-parser.js';
9
- import { AnyRawBuilder, SingleResultType } from '../util/type-utils.js';
9
+ import { AnyRawBuilder, MergePartial, SingleResultType } from '../util/type-utils.js';
10
10
  import { UpdateQueryNode } from '../operation-node/update-query-node.js';
11
11
  import { MutationObject } from '../parser/update-set-parser.js';
12
12
  import { Compilable } from '../util/compilable.js';
13
13
  import { QueryExecutor } from '../query-executor/query-executor.js';
14
14
  import { QueryId } from '../util/query-id.js';
15
15
  import { ParseContext } from '../parser/parse-context.js';
16
+ import { UpdateResult } from './update-result.js';
16
17
  import { KyselyPlugin } from '../plugin/kysely-plugin.js';
17
18
  import { WhereInterface } from './where-interface.js';
18
19
  import { JoinInterface } from './join-interface.js';
@@ -676,24 +677,63 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
676
677
  /**
677
678
  * Simply calls the given function passing `this` as the only argument.
678
679
  *
679
- * This method can be useful when adding optional method calls:
680
+ * If you want to conditionally call a method on `this`, see
681
+ * the {@link if} method.
680
682
  *
681
683
  * ### Examples
682
684
  *
685
+ * The next example uses a helper funtion `log` to log a query:
686
+ *
683
687
  * ```ts
688
+ * function log<T extends Compilable>(qb: T): T {
689
+ * console.log(qb.compile())
690
+ * return qb
691
+ * }
692
+ *
684
693
  * db.updateTable('person')
685
694
  * .set(values)
686
- * .call((qb) => {
687
- * if (something) {
688
- * return qb.where('something', '=', something)
689
- * } else {
690
- * return qb.where('somethingElse', '=', somethingElse)
691
- * }
692
- * })
695
+ * .call(log)
693
696
  * .execute()
694
697
  * ```
695
698
  */
696
699
  call<T>(func: (qb: this) => T): T;
700
+ /**
701
+ * Call `func(this)` if `condition` is true.
702
+ *
703
+ * This method is especially handy with optional selects. Any `returning` or `returningAll`
704
+ * method calls add columns as optional fields to the output type when called inside
705
+ * the `func` callback. This is because we can't know if those selections were actually
706
+ * made before running the code.
707
+ *
708
+ * You can also call any other methods inside the callback.
709
+ *
710
+ * ### Examples
711
+ *
712
+ * ```ts
713
+ * async function updatePerson(id: number, updates: UpdateablePerson, returnLastName: boolean) {
714
+ * return await db
715
+ * .updateTable('person')
716
+ * .set(updates)
717
+ * .where('id', '=', id)
718
+ * .returning(['id', 'first_name'])
719
+ * .if(returnLastName, (qb) => qb.returning('last_name'))
720
+ * .executeTakeFirstOrThrow()
721
+ * }
722
+ * ```
723
+ *
724
+ * Any selections added inside the `if` callback will be added as optional fields to the
725
+ * output type since we can't know if the selections were actually made before running
726
+ * the code. In the example above the return type of the `updatePerson` function is:
727
+ *
728
+ * ```ts
729
+ * {
730
+ * id: number
731
+ * first_name: string
732
+ * last_name?: string
733
+ * }
734
+ * ```
735
+ */
736
+ if<O2>(condition: boolean, func: (qb: this) => UpdateQueryBuilder<DB, TB, O2>): UpdateQueryBuilder<DB, TB, O2 extends UpdateResult ? UpdateResult : O extends UpdateResult ? Partial<O2> : MergePartial<O, O2>>;
697
737
  /**
698
738
  * Change the output type of the query.
699
739
  *
@@ -701,6 +741,9 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
701
741
  * don't support your use case.
702
742
  */
703
743
  castTo<T>(): UpdateQueryBuilder<DB, TB, T>;
744
+ /**
745
+ * Returns a copy of this UpdateQueryBuilder instance with the given plugin installed.
746
+ */
704
747
  withPlugin(plugin: KyselyPlugin): UpdateQueryBuilder<DB, TB, O>;
705
748
  toOperationNode(): UpdateQueryNode;
706
749
  compile(): CompiledQuery;
@@ -192,26 +192,72 @@ export class UpdateQueryBuilder {
192
192
  /**
193
193
  * Simply calls the given function passing `this` as the only argument.
194
194
  *
195
- * This method can be useful when adding optional method calls:
195
+ * If you want to conditionally call a method on `this`, see
196
+ * the {@link if} method.
196
197
  *
197
198
  * ### Examples
198
199
  *
200
+ * The next example uses a helper funtion `log` to log a query:
201
+ *
199
202
  * ```ts
203
+ * function log<T extends Compilable>(qb: T): T {
204
+ * console.log(qb.compile())
205
+ * return qb
206
+ * }
207
+ *
200
208
  * db.updateTable('person')
201
209
  * .set(values)
202
- * .call((qb) => {
203
- * if (something) {
204
- * return qb.where('something', '=', something)
205
- * } else {
206
- * return qb.where('somethingElse', '=', somethingElse)
207
- * }
208
- * })
210
+ * .call(log)
209
211
  * .execute()
210
212
  * ```
211
213
  */
212
214
  call(func) {
213
215
  return func(this);
214
216
  }
217
+ /**
218
+ * Call `func(this)` if `condition` is true.
219
+ *
220
+ * This method is especially handy with optional selects. Any `returning` or `returningAll`
221
+ * method calls add columns as optional fields to the output type when called inside
222
+ * the `func` callback. This is because we can't know if those selections were actually
223
+ * made before running the code.
224
+ *
225
+ * You can also call any other methods inside the callback.
226
+ *
227
+ * ### Examples
228
+ *
229
+ * ```ts
230
+ * async function updatePerson(id: number, updates: UpdateablePerson, returnLastName: boolean) {
231
+ * return await db
232
+ * .updateTable('person')
233
+ * .set(updates)
234
+ * .where('id', '=', id)
235
+ * .returning(['id', 'first_name'])
236
+ * .if(returnLastName, (qb) => qb.returning('last_name'))
237
+ * .executeTakeFirstOrThrow()
238
+ * }
239
+ * ```
240
+ *
241
+ * Any selections added inside the `if` callback will be added as optional fields to the
242
+ * output type since we can't know if the selections were actually made before running
243
+ * the code. In the example above the return type of the `updatePerson` function is:
244
+ *
245
+ * ```ts
246
+ * {
247
+ * id: number
248
+ * first_name: string
249
+ * last_name?: string
250
+ * }
251
+ * ```
252
+ */
253
+ if(condition, func) {
254
+ if (condition) {
255
+ return func(this);
256
+ }
257
+ return new UpdateQueryBuilder({
258
+ ...this.#props,
259
+ });
260
+ }
215
261
  /**
216
262
  * Change the output type of the query.
217
263
  *
@@ -221,6 +267,9 @@ export class UpdateQueryBuilder {
221
267
  castTo() {
222
268
  return new UpdateQueryBuilder(this.#props);
223
269
  }
270
+ /**
271
+ * Returns a copy of this UpdateQueryBuilder instance with the given plugin installed.
272
+ */
224
273
  withPlugin(plugin) {
225
274
  return new UpdateQueryBuilder({
226
275
  ...this.#props,
@@ -44,7 +44,6 @@ import { ValueNode } from '../operation-node/value-node.js';
44
44
  import { WhereNode } from '../operation-node/where-node.js';
45
45
  import { CommonTableExpressionNode } from '../operation-node/common-table-expression-node.js';
46
46
  import { WithNode } from '../operation-node/with-node.js';
47
- import { PrimitiveValue } from '../util/object-utils.js';
48
47
  import { CompiledQuery } from './compiled-query.js';
49
48
  import { RootOperationNode, QueryCompiler } from './query-compiler.js';
50
49
  import { HavingNode } from '../operation-node/having-node.js';
@@ -150,5 +149,5 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
150
149
  protected getRightIdentifierWrapper(): string;
151
150
  protected getCurrentParameterPlaceholder(): string;
152
151
  protected addParameter(parameter: unknown): void;
153
- protected appendImmediateValue(value: PrimitiveValue): void;
152
+ protected appendImmediateValue(value: unknown): void;
154
153
  }