kysely 0.27.3 → 0.27.4

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 (211) hide show
  1. package/CONTRIBUTING.md +1 -1
  2. package/README.md +7 -7
  3. package/dist/cjs/dialect/dialect-adapter-base.d.ts +2 -1
  4. package/dist/cjs/dialect/dialect-adapter-base.js +4 -1
  5. package/dist/cjs/dialect/dialect-adapter.d.ts +5 -0
  6. package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +1 -5
  7. package/dist/cjs/dialect/mssql/mssql-adapter.js +2 -4
  8. package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +46 -26
  9. package/dist/cjs/dialect/mssql/mssql-driver.d.ts +1 -0
  10. package/dist/cjs/dialect/mssql/mssql-driver.js +95 -36
  11. package/dist/cjs/dialect/postgres/postgres-introspector.js +1 -1
  12. package/dist/cjs/driver/database-connection.d.ts +3 -1
  13. package/dist/cjs/dynamic/dynamic-reference-builder.js +2 -2
  14. package/dist/cjs/dynamic/dynamic.d.ts +1 -1
  15. package/dist/cjs/dynamic/dynamic.js +1 -1
  16. package/dist/cjs/expression/expression-builder.d.ts +2 -2
  17. package/dist/cjs/expression/expression-builder.js +2 -3
  18. package/dist/cjs/expression/expression.js +2 -3
  19. package/dist/cjs/helpers/mssql.js +3 -4
  20. package/dist/cjs/helpers/mysql.d.ts +3 -3
  21. package/dist/cjs/helpers/mysql.js +6 -7
  22. package/dist/cjs/helpers/postgres.d.ts +4 -4
  23. package/dist/cjs/helpers/postgres.js +7 -8
  24. package/dist/cjs/helpers/sqlite.js +3 -4
  25. package/dist/cjs/index.d.ts +28 -21
  26. package/dist/cjs/index.js +28 -21
  27. package/dist/cjs/kysely.d.ts +1 -1
  28. package/dist/cjs/kysely.js +3 -3
  29. package/dist/cjs/operation-node/alter-column-node.d.ts +1 -1
  30. package/dist/cjs/operation-node/case-node.d.ts +1 -1
  31. package/dist/cjs/operation-node/column-definition-node.d.ts +1 -0
  32. package/dist/cjs/operation-node/data-type-node.d.ts +2 -2
  33. package/dist/cjs/operation-node/data-type-node.js +5 -3
  34. package/dist/cjs/operation-node/delete-query-node.d.ts +2 -0
  35. package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +4 -4
  36. package/dist/cjs/operation-node/having-node.d.ts +1 -1
  37. package/dist/cjs/operation-node/insert-query-node.d.ts +2 -0
  38. package/dist/cjs/operation-node/merge-query-node.d.ts +2 -0
  39. package/dist/cjs/operation-node/on-node.d.ts +1 -1
  40. package/dist/cjs/operation-node/operation-node-source.js +1 -2
  41. package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
  42. package/dist/cjs/operation-node/operation-node-transformer.js +12 -0
  43. package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
  44. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  45. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  46. package/dist/cjs/operation-node/operator-node.d.ts +3 -3
  47. package/dist/cjs/operation-node/operator-node.js +8 -6
  48. package/dist/cjs/operation-node/output-node.d.ts +13 -0
  49. package/dist/cjs/operation-node/output-node.js +26 -0
  50. package/dist/cjs/operation-node/query-node.d.ts +11 -6
  51. package/dist/cjs/operation-node/query-node.js +9 -0
  52. package/dist/cjs/operation-node/select-query-node.d.ts +1 -0
  53. package/dist/cjs/operation-node/select-query-node.js +6 -0
  54. package/dist/cjs/operation-node/update-query-node.d.ts +2 -0
  55. package/dist/cjs/operation-node/where-node.d.ts +1 -1
  56. package/dist/cjs/parser/binary-operation-parser.js +5 -6
  57. package/dist/cjs/parser/data-type-parser.js +1 -2
  58. package/dist/cjs/parser/default-value-parser.js +1 -2
  59. package/dist/cjs/parser/expression-parser.js +3 -4
  60. package/dist/cjs/parser/fetch-parser.js +1 -2
  61. package/dist/cjs/parser/group-by-parser.js +1 -2
  62. package/dist/cjs/parser/identifier-parser.js +1 -2
  63. package/dist/cjs/parser/insert-values-parser.js +1 -2
  64. package/dist/cjs/parser/join-parser.js +1 -2
  65. package/dist/cjs/parser/merge-parser.js +2 -3
  66. package/dist/cjs/parser/on-commit-action-parse.js +1 -2
  67. package/dist/cjs/parser/on-modify-action-parser.js +1 -2
  68. package/dist/cjs/parser/order-by-parser.js +3 -4
  69. package/dist/cjs/parser/parse-utils.js +4 -5
  70. package/dist/cjs/parser/partition-by-parser.js +1 -2
  71. package/dist/cjs/parser/reference-parser.js +8 -9
  72. package/dist/cjs/parser/returning-parser.d.ts +4 -3
  73. package/dist/cjs/parser/select-parser.js +2 -3
  74. package/dist/cjs/parser/set-operation-parser.js +1 -2
  75. package/dist/cjs/parser/table-parser.js +4 -5
  76. package/dist/cjs/parser/top-parser.js +1 -2
  77. package/dist/cjs/parser/unary-operation-parser.js +3 -4
  78. package/dist/cjs/parser/update-set-parser.js +2 -3
  79. package/dist/cjs/parser/value-parser.js +4 -5
  80. package/dist/cjs/parser/with-parser.js +1 -2
  81. package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +2 -2
  82. package/dist/cjs/plugin/camel-case/camel-case-plugin.js +2 -2
  83. package/dist/cjs/plugin/camel-case/camel-case.js +2 -3
  84. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +18 -0
  85. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +19 -11
  86. package/dist/cjs/query-builder/delete-query-builder.d.ts +89 -5
  87. package/dist/cjs/query-builder/delete-query-builder.js +19 -5
  88. package/dist/cjs/query-builder/function-module.d.ts +5 -5
  89. package/dist/cjs/query-builder/function-module.js +1 -2
  90. package/dist/cjs/query-builder/insert-query-builder.d.ts +95 -10
  91. package/dist/cjs/query-builder/insert-query-builder.js +25 -10
  92. package/dist/cjs/query-builder/merge-query-builder.d.ts +167 -3
  93. package/dist/cjs/query-builder/merge-query-builder.js +30 -1
  94. package/dist/cjs/query-builder/no-result-error.js +2 -2
  95. package/dist/cjs/query-builder/on-conflict-builder.d.ts +2 -2
  96. package/dist/cjs/query-builder/output-interface.d.ts +95 -0
  97. package/dist/cjs/query-builder/output-interface.js +2 -0
  98. package/dist/cjs/query-builder/returning-interface.d.ts +2 -0
  99. package/dist/cjs/query-builder/select-query-builder.d.ts +76 -11
  100. package/dist/cjs/query-builder/select-query-builder.js +7 -2
  101. package/dist/cjs/query-builder/update-query-builder.d.ts +95 -10
  102. package/dist/cjs/query-builder/update-query-builder.js +21 -7
  103. package/dist/cjs/query-builder/update-result.d.ts +9 -0
  104. package/dist/cjs/query-builder/update-result.js +9 -0
  105. package/dist/cjs/query-builder/where-interface.d.ts +1 -1
  106. package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -0
  107. package/dist/cjs/query-compiler/default-query-compiler.js +25 -1
  108. package/dist/cjs/query-creator.d.ts +56 -3
  109. package/dist/cjs/query-creator.js +54 -1
  110. package/dist/cjs/raw-builder/raw-builder.js +1 -2
  111. package/dist/cjs/raw-builder/sql.d.ts +5 -5
  112. package/dist/cjs/schema/alter-column-builder.js +3 -0
  113. package/dist/cjs/schema/alter-table-add-index-builder.d.ts +1 -1
  114. package/dist/cjs/schema/alter-table-add-index-builder.js +1 -1
  115. package/dist/cjs/schema/alter-table-builder.js +1 -2
  116. package/dist/cjs/schema/column-definition-builder.d.ts +5 -0
  117. package/dist/cjs/schema/column-definition-builder.js +7 -0
  118. package/dist/cjs/util/assert.js +2 -3
  119. package/dist/cjs/util/compilable.js +1 -2
  120. package/dist/cjs/util/json-object-args.js +1 -2
  121. package/dist/cjs/util/log-once.js +1 -2
  122. package/dist/cjs/util/object-utils.js +38 -26
  123. package/dist/cjs/util/performance-now.js +1 -2
  124. package/dist/cjs/util/prevent-await.js +1 -2
  125. package/dist/cjs/util/query-id.js +1 -2
  126. package/dist/cjs/util/random-string.js +1 -2
  127. package/dist/cjs/util/require-all-props.js +1 -2
  128. package/dist/cjs/util/stack-trace-utils.js +1 -2
  129. package/dist/esm/dialect/dialect-adapter-base.d.ts +2 -1
  130. package/dist/esm/dialect/dialect-adapter-base.js +4 -1
  131. package/dist/esm/dialect/dialect-adapter.d.ts +5 -0
  132. package/dist/esm/dialect/mssql/mssql-adapter.d.ts +1 -5
  133. package/dist/esm/dialect/mssql/mssql-adapter.js +2 -4
  134. package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +46 -26
  135. package/dist/esm/dialect/mssql/mssql-driver.d.ts +1 -0
  136. package/dist/esm/dialect/mssql/mssql-driver.js +95 -36
  137. package/dist/esm/dialect/postgres/postgres-introspector.js +1 -1
  138. package/dist/esm/driver/database-connection.d.ts +3 -1
  139. package/dist/esm/dynamic/dynamic.d.ts +1 -1
  140. package/dist/esm/dynamic/dynamic.js +1 -1
  141. package/dist/esm/expression/expression-builder.d.ts +2 -2
  142. package/dist/esm/helpers/mysql.d.ts +3 -3
  143. package/dist/esm/helpers/mysql.js +3 -3
  144. package/dist/esm/helpers/postgres.d.ts +4 -4
  145. package/dist/esm/helpers/postgres.js +4 -4
  146. package/dist/esm/index.d.ts +28 -21
  147. package/dist/esm/index.js +28 -21
  148. package/dist/esm/kysely.d.ts +1 -1
  149. package/dist/esm/kysely.js +1 -1
  150. package/dist/esm/operation-node/alter-column-node.d.ts +1 -1
  151. package/dist/esm/operation-node/case-node.d.ts +1 -1
  152. package/dist/esm/operation-node/column-definition-node.d.ts +1 -0
  153. package/dist/esm/operation-node/data-type-node.d.ts +2 -2
  154. package/dist/esm/operation-node/data-type-node.js +3 -1
  155. package/dist/esm/operation-node/delete-query-node.d.ts +2 -0
  156. package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +4 -4
  157. package/dist/esm/operation-node/having-node.d.ts +1 -1
  158. package/dist/esm/operation-node/insert-query-node.d.ts +2 -0
  159. package/dist/esm/operation-node/merge-query-node.d.ts +2 -0
  160. package/dist/esm/operation-node/on-node.d.ts +1 -1
  161. package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
  162. package/dist/esm/operation-node/operation-node-transformer.js +12 -0
  163. package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
  164. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  165. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  166. package/dist/esm/operation-node/operator-node.d.ts +3 -3
  167. package/dist/esm/operation-node/operator-node.js +2 -0
  168. package/dist/esm/operation-node/output-node.d.ts +13 -0
  169. package/dist/esm/operation-node/output-node.js +24 -0
  170. package/dist/esm/operation-node/query-node.d.ts +11 -6
  171. package/dist/esm/operation-node/query-node.js +9 -0
  172. package/dist/esm/operation-node/select-query-node.d.ts +1 -0
  173. package/dist/esm/operation-node/select-query-node.js +6 -0
  174. package/dist/esm/operation-node/update-query-node.d.ts +2 -0
  175. package/dist/esm/operation-node/where-node.d.ts +1 -1
  176. package/dist/esm/parser/returning-parser.d.ts +4 -3
  177. package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +2 -2
  178. package/dist/esm/plugin/camel-case/camel-case-plugin.js +2 -2
  179. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +18 -0
  180. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +19 -11
  181. package/dist/esm/query-builder/delete-query-builder.d.ts +89 -5
  182. package/dist/esm/query-builder/delete-query-builder.js +19 -5
  183. package/dist/esm/query-builder/function-module.d.ts +5 -5
  184. package/dist/esm/query-builder/insert-query-builder.d.ts +95 -10
  185. package/dist/esm/query-builder/insert-query-builder.js +25 -10
  186. package/dist/esm/query-builder/merge-query-builder.d.ts +167 -3
  187. package/dist/esm/query-builder/merge-query-builder.js +30 -1
  188. package/dist/esm/query-builder/on-conflict-builder.d.ts +2 -2
  189. package/dist/esm/query-builder/output-interface.d.ts +95 -0
  190. package/dist/esm/query-builder/output-interface.js +2 -0
  191. package/dist/esm/query-builder/returning-interface.d.ts +2 -0
  192. package/dist/esm/query-builder/select-query-builder.d.ts +76 -11
  193. package/dist/esm/query-builder/select-query-builder.js +6 -0
  194. package/dist/esm/query-builder/update-query-builder.d.ts +95 -10
  195. package/dist/esm/query-builder/update-query-builder.js +21 -7
  196. package/dist/esm/query-builder/update-result.d.ts +9 -0
  197. package/dist/esm/query-builder/update-result.js +9 -0
  198. package/dist/esm/query-builder/where-interface.d.ts +1 -1
  199. package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -0
  200. package/dist/esm/query-compiler/default-query-compiler.js +25 -1
  201. package/dist/esm/query-creator.d.ts +56 -3
  202. package/dist/esm/query-creator.js +54 -1
  203. package/dist/esm/raw-builder/sql.d.ts +5 -5
  204. package/dist/esm/schema/alter-column-builder.js +3 -0
  205. package/dist/esm/schema/alter-table-add-index-builder.d.ts +1 -1
  206. package/dist/esm/schema/alter-table-add-index-builder.js +1 -1
  207. package/dist/esm/schema/alter-table-builder.js +1 -2
  208. package/dist/esm/schema/column-definition-builder.d.ts +5 -0
  209. package/dist/esm/schema/column-definition-builder.js +7 -0
  210. package/dist/esm/util/object-utils.js +18 -5
  211. package/package.json +7 -6
@@ -106,7 +106,7 @@ export interface FunctionModule<DB, TB extends keyof DB> {
106
106
  * ```ts
107
107
  * db.selectFrom('person')
108
108
  * .selectAll('person')
109
- * .where(sql`upper(first_name)`, '=', 'JENNIFER')
109
+ * .where(sql<string>`upper(first_name)`, '=', 'JENNIFER')
110
110
  * ```
111
111
  */
112
112
  <O, RE extends ReferenceExpression<DB, TB> = ReferenceExpression<DB, TB>>(name: string, args?: ReadonlyArray<RE>): ExpressionWrapper<DB, TB, O>;
@@ -173,7 +173,7 @@ export interface FunctionModule<DB, TB extends keyof DB> {
173
173
  * If this function is used in a `select` statement, the type of the selected
174
174
  * expression will be `number | string` by default. This is because Kysely can't know the
175
175
  * type the db driver outputs. Sometimes the output can be larger than the largest
176
- * javascript number and a string is returned instead. Most drivers allow you
176
+ * JavaScript number and a string is returned instead. Most drivers allow you
177
177
  * to configure the output type of large numbers and Kysely can't know if you've
178
178
  * done so.
179
179
  *
@@ -292,7 +292,7 @@ export interface FunctionModule<DB, TB extends keyof DB> {
292
292
  * If this function is used in a `select` statement, the type of the selected
293
293
  * expression will be `number | string | bigint` by default. This is because
294
294
  * Kysely can't know the type the db driver outputs. Sometimes the output can
295
- * be larger than the largest javascript number and a string is returned instead.
295
+ * be larger than the largest JavaScript number and a string is returned instead.
296
296
  * Most drivers allow you to configure the output type of large numbers and Kysely
297
297
  * can't know if you've done so.
298
298
  *
@@ -344,7 +344,7 @@ export interface FunctionModule<DB, TB extends keyof DB> {
344
344
  * If this is used in a `select` statement, the type of the selected expression
345
345
  * will be `number | string | bigint` by default. This is because Kysely
346
346
  * can't know the type the db driver outputs. Sometimes the output can be larger
347
- * than the largest javascript number and a string is returned instead. Most
347
+ * than the largest JavaScript number and a string is returned instead. Most
348
348
  * drivers allow you to configure the output type of large numbers and Kysely
349
349
  * can't know if you've done so.
350
350
  *
@@ -513,7 +513,7 @@ export interface FunctionModule<DB, TB extends keyof DB> {
513
513
  * If this function is used in a `select` statement, the type of the selected
514
514
  * expression will be `number | string` by default. This is because Kysely can't know the
515
515
  * type the db driver outputs. Sometimes the output can be larger than the largest
516
- * javascript number and a string is returned instead. Most drivers allow you
516
+ * JavaScript number and a string is returned instead. Most drivers allow you
517
517
  * to configure the output type of large numbers and Kysely can't know if you've
518
518
  * done so.
519
519
  *
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createFunctionModule = void 0;
3
+ exports.createFunctionModule = createFunctionModule;
4
4
  const expression_wrapper_js_1 = require("../expression/expression-wrapper.js");
5
5
  const aggregate_function_node_js_1 = require("../operation-node/aggregate-function-node.js");
6
6
  const function_node_js_1 = require("../operation-node/function-node.js");
@@ -60,4 +60,3 @@ function createFunctionModule() {
60
60
  },
61
61
  });
62
62
  }
63
- exports.createFunctionModule = createFunctionModule;
@@ -11,7 +11,7 @@ import { QueryExecutor } from '../query-executor/query-executor.js';
11
11
  import { QueryId } from '../util/query-id.js';
12
12
  import { InsertResult } from './insert-result.js';
13
13
  import { KyselyPlugin } from '../plugin/kysely-plugin.js';
14
- import { ReturningCallbackRow, ReturningRow } from '../parser/returning-parser.js';
14
+ import { ReturningAllRow, ReturningCallbackRow, ReturningRow } from '../parser/returning-parser.js';
15
15
  import { NoResultErrorConstructor } from './no-result-error.js';
16
16
  import { ExpressionOrFactory } from '../parser/expression-parser.js';
17
17
  import { ReturningInterface } from './returning-interface.js';
@@ -21,7 +21,8 @@ import { Explainable, ExplainFormat } from '../util/explainable.js';
21
21
  import { Expression } from '../expression/expression.js';
22
22
  import { KyselyTypeError } from '../util/type-error.js';
23
23
  import { Streamable } from '../util/streamable.js';
24
- export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable<O>, Explainable, Streamable<O> {
24
+ import { OutputCallback, OutputExpression, OutputInterface, SelectExpressionFromOutputCallback, SelectExpressionFromOutputExpression } from './output-interface.js';
25
+ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements ReturningInterface<DB, TB, O>, OutputInterface<DB, TB, O, 'inserted'>, OperationNodeSource, Compilable<O>, Explainable, Streamable<O> {
25
26
  #private;
26
27
  constructor(props: InsertQueryBuilderProps);
27
28
  /**
@@ -143,11 +144,10 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
143
144
  * .insertInto('person')
144
145
  * .values(({ ref, selectFrom, fn }) => ({
145
146
  * first_name: 'Jennifer',
146
- * last_name: sql`concat(${ani}, ${ston})`,
147
+ * last_name: sql<string>`>concat(${ani}, ${ston})`,
147
148
  * middle_name: ref('first_name'),
148
149
  * age: selectFrom('person')
149
- * .select(fn.avg<number>('age')
150
- * .as('avg_age')),
150
+ * .select(fn.avg<number>('age').as('avg_age')),
151
151
  * }))
152
152
  * .executeTakeFirst()
153
153
  * ```
@@ -215,7 +215,9 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
215
215
  *
216
216
  * <!-- siteExample("insert", "Insert subquery", 50) -->
217
217
  *
218
- * You can create an `INSERT INTO SELECT FROM` query using the `expression` method:
218
+ * You can create an `INSERT INTO SELECT FROM` query using the `expression` method.
219
+ * This API doesn't follow our WYSIWYG principles and might be a bit difficult to
220
+ * remember. The reasons for this design stem from implementation difficulties.
219
221
  *
220
222
  * ```ts
221
223
  * const result = await db.insertInto('person')
@@ -386,7 +388,7 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
386
388
  * species: 'cat',
387
389
  * })
388
390
  * .onConflict((oc) => oc
389
- * .expression(sql`lower(name)`)
391
+ * .expression(sql<string>`lower(name)`)
390
392
  * .doUpdateSet({ species: 'hamster' })
391
393
  * )
392
394
  * .execute()
@@ -553,8 +555,91 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
553
555
  /**
554
556
  * Adds a `returning *` to an insert/update/delete query on databases
555
557
  * that support `returning` such as PostgreSQL.
558
+ *
559
+ * Also see the {@link returning} method.
556
560
  */
557
561
  returningAll(): InsertQueryBuilder<DB, TB, Selectable<DB[TB]>>;
562
+ /**
563
+ * Allows you to return data from modified rows.
564
+ *
565
+ * On supported databases like MS SQL Server (MSSQL), this method can be chained
566
+ * to `insert`, `update`, `delete` and `merge` queries to return data.
567
+ *
568
+ * Also see the {@link outputAll} method.
569
+ *
570
+ * ### Examples
571
+ *
572
+ * Return one column:
573
+ *
574
+ * ```ts
575
+ * const { id } = await db
576
+ * .insertInto('person')
577
+ * .output('inserted.id')
578
+ * .values({
579
+ * first_name: 'Jennifer',
580
+ * last_name: 'Aniston'
581
+ * })
582
+ * .executeTakeFirst()
583
+ * ```
584
+ *
585
+ * Return multiple columns:
586
+ *
587
+ * ```ts
588
+ * const { id, first_name } = await db
589
+ * .updateTable('person')
590
+ * .set({ first_name: 'John', last_name: 'Doe' })
591
+ * .output([
592
+ * 'deleted.first_name as old_first_name',
593
+ * 'deleted.last_name as old_last_name',
594
+ * 'inserted.first_name as new_first_name',
595
+ * 'inserted.last_name as new_last_name',
596
+ * ])
597
+ * .where('created_at', '<', new Date())
598
+ * .executeTakeFirst()
599
+ * ```
600
+ *
601
+ * Return arbitrary expressions:
602
+ *
603
+ * ```ts
604
+ * import { sql } from 'kysely'
605
+ *
606
+ * const { id, full_name } = await db
607
+ * .deleteFrom('person')
608
+ * .output((eb) => sql<string>`concat(${eb.ref('deleted.first_name')}, ' ', ${eb.ref('deleted.last_name')})`.as('full_name')
609
+ * .where('created_at', '<', new Date())
610
+ * .executeTakeFirst()
611
+ * ```
612
+ *
613
+ * Return the action performed on the row:
614
+ *
615
+ * ```ts
616
+ * await db
617
+ * .mergeInto('person')
618
+ * .using('pet', 'pet.owner_id', 'person.id')
619
+ * .whenMatched()
620
+ * .thenDelete()
621
+ * .whenNotMatched()
622
+ * .thenInsertValues({
623
+ * first_name: 'John',
624
+ * last_name: 'Doe',
625
+ * gender: 'male'
626
+ * })
627
+ * .output([
628
+ * 'inserted.id as inserted_id',
629
+ * 'deleted.id as deleted_id',
630
+ * ])
631
+ * ```
632
+ */
633
+ output<OE extends OutputExpression<DB, TB, 'inserted'>>(selections: readonly OE[]): InsertQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>>;
634
+ output<CB extends OutputCallback<DB, TB, 'inserted'>>(callback: CB): InsertQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputCallback<CB>>>;
635
+ output<OE extends OutputExpression<DB, TB, 'inserted'>>(selection: OE): InsertQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>>;
636
+ /**
637
+ * Adds an `output {prefix}.*` to an `insert`/`update`/`delete`/`merge` query on databases
638
+ * that support `output` such as MS SQL Server (MSSQL).
639
+ *
640
+ * Also see the {@link output} method.
641
+ */
642
+ outputAll(table: 'inserted'): InsertQueryBuilder<DB, TB, ReturningAllRow<DB, TB, O>>;
558
643
  /**
559
644
  * Clears all `returning` clauses from the query.
560
645
  *
@@ -685,17 +770,17 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
685
770
  /**
686
771
  * Asserts that query's output row type equals the given type `T`.
687
772
  *
688
- * This method can be used to simplify excessively complex types to make typescript happy
773
+ * This method can be used to simplify excessively complex types to make TypeScript happy
689
774
  * and much faster.
690
775
  *
691
776
  * Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
692
- * for typescript and you get errors like this:
777
+ * for TypeScript and you get errors like this:
693
778
  *
694
779
  * ```
695
780
  * error TS2589: Type instantiation is excessively deep and possibly infinite.
696
781
  * ```
697
782
  *
698
- * In these case you can often use this method to help typescript a little bit. When you use this
783
+ * In these case you can often use this method to help TypeScript a little bit. When you use this
699
784
  * method to assert the output type of a query, Kysely can drop the complex output type that
700
785
  * consists of multiple nested helper types and replace it with the simple asserted type.
701
786
  *
@@ -140,11 +140,10 @@ class InsertQueryBuilder {
140
140
  * .insertInto('person')
141
141
  * .values(({ ref, selectFrom, fn }) => ({
142
142
  * first_name: 'Jennifer',
143
- * last_name: sql`concat(${ani}, ${ston})`,
143
+ * last_name: sql<string>`>concat(${ani}, ${ston})`,
144
144
  * middle_name: ref('first_name'),
145
145
  * age: selectFrom('person')
146
- * .select(fn.avg<number>('age')
147
- * .as('avg_age')),
146
+ * .select(fn.avg<number>('age').as('avg_age')),
148
147
  * }))
149
148
  * .executeTakeFirst()
150
149
  * ```
@@ -228,7 +227,9 @@ class InsertQueryBuilder {
228
227
  *
229
228
  * <!-- siteExample("insert", "Insert subquery", 50) -->
230
229
  *
231
- * You can create an `INSERT INTO SELECT FROM` query using the `expression` method:
230
+ * You can create an `INSERT INTO SELECT FROM` query using the `expression` method.
231
+ * This API doesn't follow our WYSIWYG principles and might be a bit difficult to
232
+ * remember. The reasons for this design stem from implementation difficulties.
232
233
  *
233
234
  * ```ts
234
235
  * const result = await db.insertInto('person')
@@ -425,7 +426,7 @@ class InsertQueryBuilder {
425
426
  * species: 'cat',
426
427
  * })
427
428
  * .onConflict((oc) => oc
428
- * .expression(sql`lower(name)`)
429
+ * .expression(sql<string>`lower(name)`)
429
430
  * .doUpdateSet({ species: 'hamster' })
430
431
  * )
431
432
  * .execute()
@@ -555,6 +556,18 @@ class InsertQueryBuilder {
555
556
  queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)()),
556
557
  });
557
558
  }
559
+ output(args) {
560
+ return new InsertQueryBuilder({
561
+ ...this.#props,
562
+ queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectArg)(args)),
563
+ });
564
+ }
565
+ outputAll(table) {
566
+ return new InsertQueryBuilder({
567
+ ...this.#props,
568
+ queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)(table)),
569
+ });
570
+ }
558
571
  /**
559
572
  * Clears all `returning` clauses from the query.
560
573
  *
@@ -703,17 +716,17 @@ class InsertQueryBuilder {
703
716
  /**
704
717
  * Asserts that query's output row type equals the given type `T`.
705
718
  *
706
- * This method can be used to simplify excessively complex types to make typescript happy
719
+ * This method can be used to simplify excessively complex types to make TypeScript happy
707
720
  * and much faster.
708
721
  *
709
722
  * Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
710
- * for typescript and you get errors like this:
723
+ * for TypeScript and you get errors like this:
711
724
  *
712
725
  * ```
713
726
  * error TS2589: Type instantiation is excessively deep and possibly infinite.
714
727
  * ```
715
728
  *
716
- * In these case you can often use this method to help typescript a little bit. When you use this
729
+ * In these case you can often use this method to help TypeScript a little bit. When you use this
717
730
  * method to assert the output type of a query, Kysely can drop the complex output type that
718
731
  * consists of multiple nested helper types and replace it with the simple asserted type.
719
732
  *
@@ -766,9 +779,11 @@ class InsertQueryBuilder {
766
779
  */
767
780
  async execute() {
768
781
  const compiledQuery = this.compile();
769
- const query = compiledQuery.query;
770
782
  const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
771
- if (this.#props.executor.adapter.supportsReturning && query.returning) {
783
+ const { adapter } = this.#props.executor;
784
+ const query = compiledQuery.query;
785
+ if ((query.returning && adapter.supportsReturning) ||
786
+ (query.output && adapter.supportsOutput)) {
772
787
  return result.rows;
773
788
  }
774
789
  return [
@@ -7,6 +7,7 @@ import { ExpressionOrFactory } from '../parser/expression-parser.js';
7
7
  import { InsertObjectOrList, InsertObjectOrListFactory } from '../parser/insert-values-parser.js';
8
8
  import { JoinCallbackExpression, JoinReferenceExpression } from '../parser/join-parser.js';
9
9
  import { ReferenceExpression } from '../parser/reference-parser.js';
10
+ import { ReturningAllRow, ReturningRow } from '../parser/returning-parser.js';
10
11
  import { TableExpression } from '../parser/table-parser.js';
11
12
  import { ExtractUpdateTypeFromReferenceExpression, UpdateObject, UpdateObjectFactory } from '../parser/update-set-parser.js';
12
13
  import { ValueExpression } from '../parser/value-parser.js';
@@ -17,8 +18,9 @@ import { QueryId } from '../util/query-id.js';
17
18
  import { ShallowRecord, SimplifyResult, SimplifySingleResult, SqlBool } from '../util/type-utils.js';
18
19
  import { MergeResult } from './merge-result.js';
19
20
  import { NoResultErrorConstructor } from './no-result-error.js';
21
+ import { OutputCallback, OutputExpression, OutputInterface, OutputPrefix, SelectExpressionFromOutputCallback, SelectExpressionFromOutputExpression } from './output-interface.js';
20
22
  import { UpdateQueryBuilder } from './update-query-builder.js';
21
- export declare class MergeQueryBuilder<DB, TT extends keyof DB, O> {
23
+ export declare class MergeQueryBuilder<DB, TT extends keyof DB, O> implements OutputInterface<DB, TT, O> {
22
24
  #private;
23
25
  constructor(props: MergeQueryBuilderProps);
24
26
  /**
@@ -96,13 +98,94 @@ export declare class MergeQueryBuilder<DB, TT extends keyof DB, O> {
96
98
  */
97
99
  using<TE extends TableExpression<DB, TT>, K1 extends JoinReferenceExpression<DB, TT, TE>, K2 extends JoinReferenceExpression<DB, TT, TE>>(sourceTable: TE, k1: K1, k2: K2): ExtractWheneableMergeQueryBuilder<DB, TT, TE, O>;
98
100
  using<TE extends TableExpression<DB, TT>, FN extends JoinCallbackExpression<DB, TT, TE>>(sourceTable: TE, callback: FN): ExtractWheneableMergeQueryBuilder<DB, TT, TE, O>;
101
+ /**
102
+ * Allows you to return data from modified rows.
103
+ *
104
+ * On supported databases like MS SQL Server (MSSQL), this method can be chained
105
+ * to `insert`, `update`, `delete` and `merge` queries to return data.
106
+ *
107
+ * Also see the {@link outputAll} method.
108
+ *
109
+ * ### Examples
110
+ *
111
+ * Return one column:
112
+ *
113
+ * ```ts
114
+ * const { id } = await db
115
+ * .insertInto('person')
116
+ * .output('inserted.id')
117
+ * .values({
118
+ * first_name: 'Jennifer',
119
+ * last_name: 'Aniston'
120
+ * })
121
+ * .executeTakeFirst()
122
+ * ```
123
+ *
124
+ * Return multiple columns:
125
+ *
126
+ * ```ts
127
+ * const { id, first_name } = await db
128
+ * .updateTable('person')
129
+ * .set({ first_name: 'John', last_name: 'Doe' })
130
+ * .output([
131
+ * 'deleted.first_name as old_first_name',
132
+ * 'deleted.last_name as old_last_name',
133
+ * 'inserted.first_name as new_first_name',
134
+ * 'inserted.last_name as new_last_name',
135
+ * ])
136
+ * .where('created_at', '<', new Date())
137
+ * .executeTakeFirst()
138
+ * ```
139
+ *
140
+ * Return arbitrary expressions:
141
+ *
142
+ * ```ts
143
+ * import { sql } from 'kysely'
144
+ *
145
+ * const { id, full_name } = await db
146
+ * .deleteFrom('person')
147
+ * .output((eb) => sql<string>`concat(${eb.ref('deleted.first_name')}, ' ', ${eb.ref('deleted.last_name')})`.as('full_name')
148
+ * .where('created_at', '<', new Date())
149
+ * .executeTakeFirst()
150
+ * ```
151
+ *
152
+ * Return the action performed on the row:
153
+ *
154
+ * ```ts
155
+ * await db
156
+ * .mergeInto('person')
157
+ * .using('pet', 'pet.owner_id', 'person.id')
158
+ * .whenMatched()
159
+ * .thenDelete()
160
+ * .whenNotMatched()
161
+ * .thenInsertValues({
162
+ * first_name: 'John',
163
+ * last_name: 'Doe',
164
+ * gender: 'male'
165
+ * })
166
+ * .output([
167
+ * 'inserted.id as inserted_id',
168
+ * 'deleted.id as deleted_id',
169
+ * ])
170
+ * ```
171
+ */
172
+ output<OE extends OutputExpression<DB, TT>>(selections: readonly OE[]): MergeQueryBuilder<DB, TT, ReturningRow<DB, TT, O, SelectExpressionFromOutputExpression<OE>>>;
173
+ output<CB extends OutputCallback<DB, TT>>(callback: CB): MergeQueryBuilder<DB, TT, ReturningRow<DB, TT, O, SelectExpressionFromOutputCallback<CB>>>;
174
+ output<OE extends OutputExpression<DB, TT>>(selection: OE): MergeQueryBuilder<DB, TT, ReturningRow<DB, TT, O, SelectExpressionFromOutputExpression<OE>>>;
175
+ /**
176
+ * Adds an `output {prefix}.*` to an `insert`/`update`/`delete`/`merge` query on databases
177
+ * that support `output` such as MS SQL Server (MSSQL).
178
+ *
179
+ * Also see the {@link output} method.
180
+ */
181
+ outputAll(table: OutputPrefix): MergeQueryBuilder<DB, TT, ReturningAllRow<DB, TT, O>>;
99
182
  }
100
183
  export interface MergeQueryBuilderProps {
101
184
  readonly queryId: QueryId;
102
185
  readonly queryNode: MergeQueryNode;
103
186
  readonly executor: QueryExecutor;
104
187
  }
105
- export declare class WheneableMergeQueryBuilder<DB, TT extends keyof DB, ST extends keyof DB, O> implements Compilable<O>, OperationNodeSource {
188
+ export declare class WheneableMergeQueryBuilder<DB, TT extends keyof DB, ST extends keyof DB, O> implements Compilable<O>, OutputInterface<DB, TT, O>, OperationNodeSource {
106
189
  #private;
107
190
  constructor(props: MergeQueryBuilderProps);
108
191
  /**
@@ -275,6 +358,87 @@ export declare class WheneableMergeQueryBuilder<DB, TT extends keyof DB, ST exte
275
358
  * the target table, and not from source table and returns a {@link MatchedThenableMergeQueryBuilder}.
276
359
  */
277
360
  whenNotMatchedBySourceAndRef<LRE extends ReferenceExpression<DB, TT>, RRE extends ReferenceExpression<DB, TT>>(lhs: LRE, op: ComparisonOperatorExpression, rhs: RRE): MatchedThenableMergeQueryBuilder<DB, TT, ST, TT, O>;
361
+ /**
362
+ * Allows you to return data from modified rows.
363
+ *
364
+ * On supported databases like MS SQL Server (MSSQL), this method can be chained
365
+ * to `insert`, `update`, `delete` and `merge` queries to return data.
366
+ *
367
+ * Also see the {@link outputAll} method.
368
+ *
369
+ * ### Examples
370
+ *
371
+ * Return one column:
372
+ *
373
+ * ```ts
374
+ * const { id } = await db
375
+ * .insertInto('person')
376
+ * .output('inserted.id')
377
+ * .values({
378
+ * first_name: 'Jennifer',
379
+ * last_name: 'Aniston'
380
+ * })
381
+ * .executeTakeFirst()
382
+ * ```
383
+ *
384
+ * Return multiple columns:
385
+ *
386
+ * ```ts
387
+ * const { id, first_name } = await db
388
+ * .updateTable('person')
389
+ * .set({ first_name: 'John', last_name: 'Doe' })
390
+ * .output([
391
+ * 'deleted.first_name as old_first_name',
392
+ * 'deleted.last_name as old_last_name',
393
+ * 'inserted.first_name as new_first_name',
394
+ * 'inserted.last_name as new_last_name',
395
+ * ])
396
+ * .where('created_at', '<', new Date())
397
+ * .executeTakeFirst()
398
+ * ```
399
+ *
400
+ * Return arbitrary expressions:
401
+ *
402
+ * ```ts
403
+ * import { sql } from 'kysely'
404
+ *
405
+ * const { id, full_name } = await db
406
+ * .deleteFrom('person')
407
+ * .output((eb) => sql<string>`concat(${eb.ref('deleted.first_name')}, ' ', ${eb.ref('deleted.last_name')})`.as('full_name')
408
+ * .where('created_at', '<', new Date())
409
+ * .executeTakeFirst()
410
+ * ```
411
+ *
412
+ * Return the action performed on the row:
413
+ *
414
+ * ```ts
415
+ * await db
416
+ * .mergeInto('person')
417
+ * .using('pet', 'pet.owner_id', 'person.id')
418
+ * .whenMatched()
419
+ * .thenDelete()
420
+ * .whenNotMatched()
421
+ * .thenInsertValues({
422
+ * first_name: 'John',
423
+ * last_name: 'Doe',
424
+ * gender: 'male'
425
+ * })
426
+ * .output([
427
+ * 'inserted.id as inserted_id',
428
+ * 'deleted.id as deleted_id',
429
+ * ])
430
+ * ```
431
+ */
432
+ output<OE extends OutputExpression<DB, TT>>(selections: readonly OE[]): WheneableMergeQueryBuilder<DB, TT, ST, ReturningRow<DB, TT, O, SelectExpressionFromOutputExpression<OE>>>;
433
+ output<CB extends OutputCallback<DB, TT>>(callback: CB): WheneableMergeQueryBuilder<DB, TT, ST, ReturningRow<DB, TT, O, SelectExpressionFromOutputCallback<CB>>>;
434
+ output<OE extends OutputExpression<DB, TT>>(selection: OE): WheneableMergeQueryBuilder<DB, TT, ST, ReturningRow<DB, TT, O, SelectExpressionFromOutputExpression<OE>>>;
435
+ /**
436
+ * Adds an `output {prefix}.*` to an `insert`/`update`/`delete`/`merge` query on databases
437
+ * that support `output` such as MS SQL Server (MSSQL).
438
+ *
439
+ * Also see the {@link output} method.
440
+ */
441
+ outputAll(table: OutputPrefix): WheneableMergeQueryBuilder<DB, TT, ST, ReturningAllRow<DB, TT, O>>;
278
442
  /**
279
443
  * Simply calls the provided function passing `this` as the only argument. `$call` returns
280
444
  * what the provided function returns.
@@ -337,7 +501,7 @@ export declare class WheneableMergeQueryBuilder<DB, TT extends keyof DB, ST exte
337
501
  */
338
502
  $if<O2>(condition: boolean, func: (qb: this) => WheneableMergeQueryBuilder<any, any, any, O2>): O2 extends MergeResult ? WheneableMergeQueryBuilder<DB, TT, ST, MergeResult> : O2 extends O & infer E ? WheneableMergeQueryBuilder<DB, TT, ST, O & Partial<E>> : WheneableMergeQueryBuilder<DB, TT, ST, Partial<O2>>;
339
503
  toOperationNode(): MergeQueryNode;
340
- compile(): CompiledQuery<never>;
504
+ compile(): CompiledQuery<O>;
341
505
  /**
342
506
  * Executes the query and returns an array of rows.
343
507
  *
@@ -8,6 +8,7 @@ const update_query_node_js_1 = require("../operation-node/update-query-node.js")
8
8
  const insert_values_parser_js_1 = require("../parser/insert-values-parser.js");
9
9
  const join_parser_js_1 = require("../parser/join-parser.js");
10
10
  const merge_parser_js_1 = require("../parser/merge-parser.js");
11
+ const select_parser_js_1 = require("../parser/select-parser.js");
11
12
  const top_parser_js_1 = require("../parser/top-parser.js");
12
13
  const noop_query_executor_js_1 = require("../query-executor/noop-query-executor.js");
13
14
  const object_utils_js_1 = require("../util/object-utils.js");
@@ -79,6 +80,18 @@ class MergeQueryBuilder {
79
80
  queryNode: merge_query_node_js_1.MergeQueryNode.cloneWithUsing(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('Using', args)),
80
81
  });
81
82
  }
83
+ output(args) {
84
+ return new MergeQueryBuilder({
85
+ ...this.#props,
86
+ queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectArg)(args)),
87
+ });
88
+ }
89
+ outputAll(table) {
90
+ return new MergeQueryBuilder({
91
+ ...this.#props,
92
+ queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)(table)),
93
+ });
94
+ }
82
95
  }
83
96
  exports.MergeQueryBuilder = MergeQueryBuilder;
84
97
  (0, prevent_await_js_1.preventAwait)(MergeQueryBuilder, "don't await MergeQueryBuilder instances directly. To execute the query you need to call `execute` when available.");
@@ -217,6 +230,18 @@ class WheneableMergeQueryBuilder {
217
230
  whenNotMatchedBySourceAndRef(lhs, op, rhs) {
218
231
  return this.#whenNotMatched([lhs, op, rhs], true, true);
219
232
  }
233
+ output(args) {
234
+ return new WheneableMergeQueryBuilder({
235
+ ...this.#props,
236
+ queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectArg)(args)),
237
+ });
238
+ }
239
+ outputAll(table) {
240
+ return new WheneableMergeQueryBuilder({
241
+ ...this.#props,
242
+ queryNode: query_node_js_1.QueryNode.cloneWithOutput(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)(table)),
243
+ });
244
+ }
220
245
  #whenNotMatched(args, refRight = false, bySource = false) {
221
246
  const props = {
222
247
  ...this.#props,
@@ -301,7 +326,7 @@ class WheneableMergeQueryBuilder {
301
326
  return this.#props.executor.transformQuery(this.#props.queryNode, this.#props.queryId);
302
327
  }
303
328
  compile() {
304
- return this.#props.executor.compileQuery(this.#props.queryNode, this.#props.queryId);
329
+ return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
305
330
  }
306
331
  /**
307
332
  * Executes the query and returns an array of rows.
@@ -311,6 +336,10 @@ class WheneableMergeQueryBuilder {
311
336
  async execute() {
312
337
  const compiledQuery = this.compile();
313
338
  const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
339
+ if (compiledQuery.query.output &&
340
+ this.#props.executor.adapter.supportsOutput) {
341
+ return result.rows;
342
+ }
314
343
  return [new merge_result_js_1.MergeResult(result.numAffectedRows)];
315
344
  }
316
345
  /**
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isNoResultErrorConstructor = exports.NoResultError = void 0;
3
+ exports.NoResultError = void 0;
4
+ exports.isNoResultErrorConstructor = isNoResultErrorConstructor;
4
5
  class NoResultError extends Error {
5
6
  /**
6
7
  * The operation node tree of the query that was executed.
@@ -15,4 +16,3 @@ exports.NoResultError = NoResultError;
15
16
  function isNoResultErrorConstructor(fn) {
16
17
  return Object.prototype.hasOwnProperty.call(fn, 'prototype');
17
18
  }
18
- exports.isNoResultErrorConstructor = isNoResultErrorConstructor;
@@ -303,7 +303,7 @@ export declare class OnConflictBuilder<DB, TB extends keyof DB> implements Where
303
303
  * .selectFrom('person')
304
304
  * .selectAll()
305
305
  * .where(
306
- * sql`coalesce(first_name, last_name)`,
306
+ * sql<string>`coalesce(first_name, last_name)`,
307
307
  * 'like',
308
308
  * '%' + name + '%',
309
309
  * )
@@ -767,7 +767,7 @@ export declare class OnConflictUpdateBuilder<DB, TB extends keyof DB> implements
767
767
  * .selectFrom('person')
768
768
  * .selectAll()
769
769
  * .where(
770
- * sql`coalesce(first_name, last_name)`,
770
+ * sql<string>`coalesce(first_name, last_name)`,
771
771
  * 'like',
772
772
  * '%' + name + '%',
773
773
  * )