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
@@ -4,7 +4,7 @@ import { SnakeCaseTransformer } from './camel-case-transformer.js';
4
4
  import { createCamelCaseMapper, createSnakeCaseMapper, } from './camel-case.js';
5
5
  /**
6
6
  * A plugin that converts snake_case identifiers in the database into
7
- * camelCase in the javascript side.
7
+ * camelCase in the JavaScript side.
8
8
  *
9
9
  * For example let's assume we have a table called `person_table`
10
10
  * with columns `first_name` and `last_name` in the database. When
@@ -44,7 +44,7 @@ import { createCamelCaseMapper, createSnakeCaseMapper, } from './camel-case.js';
44
44
  * ```
45
45
  *
46
46
  * As you can see from the example, __everything__ needs to be defined
47
- * in camelCase in the typescript code: table names, columns, schemas,
47
+ * in camelCase in the TypeScript code: table names, columns, schemas,
48
48
  * __everything__. When using the `CamelCasePlugin` Kysely works as if
49
49
  * the database was defined in camelCase.
50
50
  *
@@ -2,6 +2,20 @@ import { QueryResult } from '../../driver/database-connection.js';
2
2
  import { RootOperationNode } from '../../query-compiler/query-compiler.js';
3
3
  import { UnknownRow } from '../../util/type-utils.js';
4
4
  import { KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs } from '../kysely-plugin.js';
5
+ export interface ParseJSONResultsPluginOptions {
6
+ /**
7
+ * When `'in-place'`, arrays' and objects' values are parsed in-place. This is
8
+ * the most time and space efficient option.
9
+ *
10
+ * This can result in runtime errors if some objects/arrays are readonly.
11
+ *
12
+ * When `'create'`, new arrays and objects are created to avoid such errors.
13
+ *
14
+ * Defaults to `'in-place'`.
15
+ */
16
+ objectStrategy?: ObjectStrategy;
17
+ }
18
+ type ObjectStrategy = 'in-place' | 'create';
5
19
  /**
6
20
  * Parses JSON strings in query results into JSON objects.
7
21
  *
@@ -16,6 +30,9 @@ import { KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs } fro
16
30
  * ```
17
31
  */
18
32
  export declare class ParseJSONResultsPlugin implements KyselyPlugin {
33
+ #private;
34
+ readonly opt: ParseJSONResultsPluginOptions;
35
+ constructor(opt?: ParseJSONResultsPluginOptions);
19
36
  /**
20
37
  * This is called for each query before it is executed. You can modify the query by
21
38
  * transforming its {@link OperationNode} tree provided in {@link PluginTransformQueryArgs.node | args.node}
@@ -53,3 +70,4 @@ export declare class ParseJSONResultsPlugin implements KyselyPlugin {
53
70
  */
54
71
  transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>>;
55
72
  }
73
+ export {};
@@ -14,6 +14,12 @@ import { isPlainObject, isString } from '../../util/object-utils.js';
14
14
  * ```
15
15
  */
16
16
  export class ParseJSONResultsPlugin {
17
+ opt;
18
+ #objectStrategy;
19
+ constructor(opt = {}) {
20
+ this.opt = opt;
21
+ this.#objectStrategy = opt.objectStrategy || 'in-place';
22
+ }
17
23
  // noop
18
24
  transformQuery(args) {
19
25
  return args.node;
@@ -21,32 +27,33 @@ export class ParseJSONResultsPlugin {
21
27
  async transformResult(args) {
22
28
  return {
23
29
  ...args.result,
24
- rows: parseArray(args.result.rows),
30
+ rows: parseArray(args.result.rows, this.#objectStrategy),
25
31
  };
26
32
  }
27
33
  }
28
- function parseArray(arr) {
34
+ function parseArray(arr, objectStrategy) {
35
+ const target = objectStrategy === 'create' ? new Array(arr.length) : arr;
29
36
  for (let i = 0; i < arr.length; ++i) {
30
- arr[i] = parse(arr[i]);
37
+ target[i] = parse(arr[i], objectStrategy);
31
38
  }
32
- return arr;
39
+ return target;
33
40
  }
34
- function parse(obj) {
41
+ function parse(obj, objectStrategy) {
35
42
  if (isString(obj)) {
36
43
  return parseString(obj);
37
44
  }
38
45
  if (Array.isArray(obj)) {
39
- return parseArray(obj);
46
+ return parseArray(obj, objectStrategy);
40
47
  }
41
48
  if (isPlainObject(obj)) {
42
- return parseObject(obj);
49
+ return parseObject(obj, objectStrategy);
43
50
  }
44
51
  return obj;
45
52
  }
46
53
  function parseString(str) {
47
54
  if (maybeJson(str)) {
48
55
  try {
49
- return parse(JSON.parse(str));
56
+ return parse(JSON.parse(str), 'in-place');
50
57
  }
51
58
  catch (err) {
52
59
  // this catch block is intentionally empty.
@@ -57,9 +64,10 @@ function parseString(str) {
57
64
  function maybeJson(value) {
58
65
  return value.match(/^[\[\{]/) != null;
59
66
  }
60
- function parseObject(obj) {
67
+ function parseObject(obj, objectStrategy) {
68
+ const target = objectStrategy === 'create' ? {} : obj;
61
69
  for (const key in obj) {
62
- obj[key] = parse(obj[key]);
70
+ target[key] = parse(obj[key], objectStrategy);
63
71
  }
64
- return obj;
72
+ return target;
65
73
  }
@@ -24,7 +24,8 @@ import { KyselyTypeError } from '../util/type-error.js';
24
24
  import { Streamable } from '../util/streamable.js';
25
25
  import { ExpressionOrFactory } from '../parser/expression-parser.js';
26
26
  import { ValueExpression } from '../parser/value-parser.js';
27
- export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable<O>, Explainable, Streamable<O> {
27
+ import { OutputCallback, OutputExpression, OutputInterface, SelectExpressionFromOutputCallback, SelectExpressionFromOutputExpression } from './output-interface.js';
28
+ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, ReturningInterface<DB, TB, O>, OutputInterface<DB, TB, O, 'deleted'>, OperationNodeSource, Compilable<O>, Explainable, Streamable<O> {
28
29
  #private;
29
30
  constructor(props: DeleteQueryBuilderProps);
30
31
  /**
@@ -289,7 +290,7 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
289
290
  * .selectFrom('person')
290
291
  * .selectAll()
291
292
  * .where(
292
- * sql`coalesce(first_name, last_name)`,
293
+ * sql<string>`coalesce(first_name, last_name)`,
293
294
  * 'like',
294
295
  * '%' + name + '%',
295
296
  * )
@@ -799,9 +800,92 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
799
800
  /**
800
801
  * Adds a `returning *` to an insert/update/delete query on databases
801
802
  * that support `returning` such as PostgreSQL.
803
+ *
804
+ * Also see the {@link returning} method.
802
805
  */
803
806
  returningAll<T extends TB>(table: T): DeleteQueryBuilder<DB, TB, ReturningAllRow<DB, T, O>>;
804
807
  returningAll(): DeleteQueryBuilder<DB, TB, ReturningAllRow<DB, TB, O>>;
808
+ /**
809
+ * Allows you to return data from modified rows.
810
+ *
811
+ * On supported databases like MS SQL Server (MSSQL), this method can be chained
812
+ * to `insert`, `update`, `delete` and `merge` queries to return data.
813
+ *
814
+ * Also see the {@link outputAll} method.
815
+ *
816
+ * ### Examples
817
+ *
818
+ * Return one column:
819
+ *
820
+ * ```ts
821
+ * const { id } = await db
822
+ * .insertInto('person')
823
+ * .output('inserted.id')
824
+ * .values({
825
+ * first_name: 'Jennifer',
826
+ * last_name: 'Aniston'
827
+ * })
828
+ * .executeTakeFirst()
829
+ * ```
830
+ *
831
+ * Return multiple columns:
832
+ *
833
+ * ```ts
834
+ * const { id, first_name } = await db
835
+ * .updateTable('person')
836
+ * .set({ first_name: 'John', last_name: 'Doe' })
837
+ * .output([
838
+ * 'deleted.first_name as old_first_name',
839
+ * 'deleted.last_name as old_last_name',
840
+ * 'inserted.first_name as new_first_name',
841
+ * 'inserted.last_name as new_last_name',
842
+ * ])
843
+ * .where('created_at', '<', new Date())
844
+ * .executeTakeFirst()
845
+ * ```
846
+ *
847
+ * Return arbitrary expressions:
848
+ *
849
+ * ```ts
850
+ * import { sql } from 'kysely'
851
+ *
852
+ * const { id, full_name } = await db
853
+ * .deleteFrom('person')
854
+ * .output((eb) => sql<string>`concat(${eb.ref('deleted.first_name')}, ' ', ${eb.ref('deleted.last_name')})`.as('full_name')
855
+ * .where('created_at', '<', new Date())
856
+ * .executeTakeFirst()
857
+ * ```
858
+ *
859
+ * Return the action performed on the row:
860
+ *
861
+ * ```ts
862
+ * await db
863
+ * .mergeInto('person')
864
+ * .using('pet', 'pet.owner_id', 'person.id')
865
+ * .whenMatched()
866
+ * .thenDelete()
867
+ * .whenNotMatched()
868
+ * .thenInsertValues({
869
+ * first_name: 'John',
870
+ * last_name: 'Doe',
871
+ * gender: 'male'
872
+ * })
873
+ * .output([
874
+ * 'inserted.id as inserted_id',
875
+ * 'deleted.id as deleted_id',
876
+ * ])
877
+ * ```
878
+ */
879
+ output<OE extends OutputExpression<DB, TB, 'deleted'>>(selections: readonly OE[]): DeleteQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>>;
880
+ output<CB extends OutputCallback<DB, TB, 'deleted'>>(callback: CB): DeleteQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputCallback<CB>>>;
881
+ output<OE extends OutputExpression<DB, TB, 'deleted'>>(selection: OE): DeleteQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SelectExpressionFromOutputExpression<OE>>>;
882
+ /**
883
+ * Adds an `output {prefix}.*` to an `insert`/`update`/`delete`/`merge` query on databases
884
+ * that support `output` such as MS SQL Server (MSSQL).
885
+ *
886
+ * Also see the {@link output} method.
887
+ */
888
+ outputAll(table: 'deleted'): DeleteQueryBuilder<DB, TB, ReturningAllRow<DB, TB, O>>;
805
889
  /**
806
890
  * Clears all `returning` clauses from the query.
807
891
  *
@@ -1026,17 +1110,17 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
1026
1110
  /**
1027
1111
  * Asserts that query's output row type equals the given type `T`.
1028
1112
  *
1029
- * This method can be used to simplify excessively complex types to make typescript happy
1113
+ * This method can be used to simplify excessively complex types to make TypeScript happy
1030
1114
  * and much faster.
1031
1115
  *
1032
1116
  * Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
1033
- * for typescript and you get errors like this:
1117
+ * for TypeScript and you get errors like this:
1034
1118
  *
1035
1119
  * ```
1036
1120
  * error TS2589: Type instantiation is excessively deep and possibly infinite.
1037
1121
  * ```
1038
1122
  *
1039
- * In these case you can often use this method to help typescript a little bit. When you use this
1123
+ * In these case you can often use this method to help TypeScript a little bit. When you use this
1040
1124
  * method to assert the output type of a query, Kysely can drop the complex output type that
1041
1125
  * consists of multiple nested helper types and replace it with the simple asserted type.
1042
1126
  *
@@ -123,6 +123,18 @@ export class DeleteQueryBuilder {
123
123
  queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectAll(table)),
124
124
  });
125
125
  }
126
+ output(args) {
127
+ return new DeleteQueryBuilder({
128
+ ...this.#props,
129
+ queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectArg(args)),
130
+ });
131
+ }
132
+ outputAll(table) {
133
+ return new DeleteQueryBuilder({
134
+ ...this.#props,
135
+ queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectAll(table)),
136
+ });
137
+ }
126
138
  /**
127
139
  * Clears all `returning` clauses from the query.
128
140
  *
@@ -385,17 +397,17 @@ export class DeleteQueryBuilder {
385
397
  /**
386
398
  * Asserts that query's output row type equals the given type `T`.
387
399
  *
388
- * This method can be used to simplify excessively complex types to make typescript happy
400
+ * This method can be used to simplify excessively complex types to make TypeScript happy
389
401
  * and much faster.
390
402
  *
391
403
  * Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
392
- * for typescript and you get errors like this:
404
+ * for TypeScript and you get errors like this:
393
405
  *
394
406
  * ```
395
407
  * error TS2589: Type instantiation is excessively deep and possibly infinite.
396
408
  * ```
397
409
  *
398
- * In these case you can often use this method to help typescript a little bit. When you use this
410
+ * In these case you can often use this method to help TypeScript a little bit. When you use this
399
411
  * method to assert the output type of a query, Kysely can drop the complex output type that
400
412
  * consists of multiple nested helper types and replace it with the simple asserted type.
401
413
  *
@@ -448,9 +460,11 @@ export class DeleteQueryBuilder {
448
460
  */
449
461
  async execute() {
450
462
  const compiledQuery = this.compile();
451
- const query = compiledQuery.query;
452
463
  const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
453
- if (this.#props.executor.adapter.supportsReturning && query.returning) {
464
+ const { adapter } = this.#props.executor;
465
+ const query = compiledQuery.query;
466
+ if ((query.returning && adapter.supportsReturning) ||
467
+ (query.output && adapter.supportsOutput)) {
454
468
  return result.rows;
455
469
  }
456
470
  return [
@@ -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
  *
@@ -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
  *
@@ -138,11 +138,10 @@ export class InsertQueryBuilder {
138
138
  * .insertInto('person')
139
139
  * .values(({ ref, selectFrom, fn }) => ({
140
140
  * first_name: 'Jennifer',
141
- * last_name: sql`concat(${ani}, ${ston})`,
141
+ * last_name: sql<string>`>concat(${ani}, ${ston})`,
142
142
  * middle_name: ref('first_name'),
143
143
  * age: selectFrom('person')
144
- * .select(fn.avg<number>('age')
145
- * .as('avg_age')),
144
+ * .select(fn.avg<number>('age').as('avg_age')),
146
145
  * }))
147
146
  * .executeTakeFirst()
148
147
  * ```
@@ -226,7 +225,9 @@ export class InsertQueryBuilder {
226
225
  *
227
226
  * <!-- siteExample("insert", "Insert subquery", 50) -->
228
227
  *
229
- * You can create an `INSERT INTO SELECT FROM` query using the `expression` method:
228
+ * You can create an `INSERT INTO SELECT FROM` query using the `expression` method.
229
+ * This API doesn't follow our WYSIWYG principles and might be a bit difficult to
230
+ * remember. The reasons for this design stem from implementation difficulties.
230
231
  *
231
232
  * ```ts
232
233
  * const result = await db.insertInto('person')
@@ -423,7 +424,7 @@ export class InsertQueryBuilder {
423
424
  * species: 'cat',
424
425
  * })
425
426
  * .onConflict((oc) => oc
426
- * .expression(sql`lower(name)`)
427
+ * .expression(sql<string>`lower(name)`)
427
428
  * .doUpdateSet({ species: 'hamster' })
428
429
  * )
429
430
  * .execute()
@@ -553,6 +554,18 @@ export class InsertQueryBuilder {
553
554
  queryNode: QueryNode.cloneWithReturning(this.#props.queryNode, parseSelectAll()),
554
555
  });
555
556
  }
557
+ output(args) {
558
+ return new InsertQueryBuilder({
559
+ ...this.#props,
560
+ queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectArg(args)),
561
+ });
562
+ }
563
+ outputAll(table) {
564
+ return new InsertQueryBuilder({
565
+ ...this.#props,
566
+ queryNode: QueryNode.cloneWithOutput(this.#props.queryNode, parseSelectAll(table)),
567
+ });
568
+ }
556
569
  /**
557
570
  * Clears all `returning` clauses from the query.
558
571
  *
@@ -701,17 +714,17 @@ export class InsertQueryBuilder {
701
714
  /**
702
715
  * Asserts that query's output row type equals the given type `T`.
703
716
  *
704
- * This method can be used to simplify excessively complex types to make typescript happy
717
+ * This method can be used to simplify excessively complex types to make TypeScript happy
705
718
  * and much faster.
706
719
  *
707
720
  * Kysely uses complex type magic to achieve its type safety. This complexity is sometimes too much
708
- * for typescript and you get errors like this:
721
+ * for TypeScript and you get errors like this:
709
722
  *
710
723
  * ```
711
724
  * error TS2589: Type instantiation is excessively deep and possibly infinite.
712
725
  * ```
713
726
  *
714
- * In these case you can often use this method to help typescript a little bit. When you use this
727
+ * In these case you can often use this method to help TypeScript a little bit. When you use this
715
728
  * method to assert the output type of a query, Kysely can drop the complex output type that
716
729
  * consists of multiple nested helper types and replace it with the simple asserted type.
717
730
  *
@@ -764,9 +777,11 @@ export class InsertQueryBuilder {
764
777
  */
765
778
  async execute() {
766
779
  const compiledQuery = this.compile();
767
- const query = compiledQuery.query;
768
780
  const result = await this.#props.executor.executeQuery(compiledQuery, this.#props.queryId);
769
- if (this.#props.executor.adapter.supportsReturning && query.returning) {
781
+ const { adapter } = this.#props.executor;
782
+ const query = compiledQuery.query;
783
+ if ((query.returning && adapter.supportsReturning) ||
784
+ (query.output && adapter.supportsOutput)) {
770
785
  return result.rows;
771
786
  }
772
787
  return [