kysely 0.27.2 → 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 (285) hide show
  1. package/CONTRIBUTING.md +1 -1
  2. package/README.md +7 -7
  3. package/dist/cjs/dialect/database-introspector.d.ts +1 -0
  4. package/dist/cjs/dialect/dialect-adapter-base.d.ts +2 -1
  5. package/dist/cjs/dialect/dialect-adapter-base.js +4 -1
  6. package/dist/cjs/dialect/dialect-adapter.d.ts +5 -0
  7. package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +1 -5
  8. package/dist/cjs/dialect/mssql/mssql-adapter.js +2 -4
  9. package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +46 -26
  10. package/dist/cjs/dialect/mssql/mssql-driver.d.ts +1 -0
  11. package/dist/cjs/dialect/mssql/mssql-driver.js +95 -36
  12. package/dist/cjs/dialect/mssql/mssql-introspector.js +13 -2
  13. package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +4 -0
  14. package/dist/cjs/dialect/mssql/mssql-query-compiler.js +8 -0
  15. package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -0
  16. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +1 -1
  17. package/dist/cjs/dialect/postgres/postgres-driver.js +2 -1
  18. package/dist/cjs/dialect/postgres/postgres-introspector.js +3 -1
  19. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +1 -0
  20. package/dist/cjs/driver/database-connection.d.ts +4 -2
  21. package/dist/cjs/dynamic/dynamic-reference-builder.js +2 -2
  22. package/dist/cjs/dynamic/dynamic.d.ts +1 -1
  23. package/dist/cjs/dynamic/dynamic.js +1 -1
  24. package/dist/cjs/expression/expression-builder.d.ts +31 -5
  25. package/dist/cjs/expression/expression-builder.js +7 -3
  26. package/dist/cjs/expression/expression.js +2 -3
  27. package/dist/cjs/helpers/mssql.js +3 -4
  28. package/dist/cjs/helpers/mysql.d.ts +3 -3
  29. package/dist/cjs/helpers/mysql.js +6 -7
  30. package/dist/cjs/helpers/postgres.d.ts +4 -4
  31. package/dist/cjs/helpers/postgres.js +7 -8
  32. package/dist/cjs/helpers/sqlite.js +3 -4
  33. package/dist/cjs/index.d.ts +31 -18
  34. package/dist/cjs/index.js +30 -17
  35. package/dist/cjs/kysely.d.ts +1 -1
  36. package/dist/cjs/kysely.js +3 -3
  37. package/dist/cjs/operation-node/add-index-node.js +1 -1
  38. package/dist/cjs/operation-node/alter-column-node.d.ts +1 -1
  39. package/dist/cjs/operation-node/case-node.d.ts +1 -1
  40. package/dist/cjs/operation-node/cast-node.d.ts +13 -0
  41. package/dist/cjs/operation-node/cast-node.js +19 -0
  42. package/dist/cjs/operation-node/column-definition-node.d.ts +2 -0
  43. package/dist/cjs/operation-node/data-type-node.d.ts +5 -1
  44. package/dist/cjs/operation-node/data-type-node.js +56 -0
  45. package/dist/cjs/operation-node/delete-query-node.d.ts +6 -0
  46. package/dist/cjs/operation-node/delete-query-node.js +12 -0
  47. package/dist/cjs/operation-node/fetch-node.d.ts +15 -0
  48. package/dist/cjs/operation-node/fetch-node.js +19 -0
  49. package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +4 -4
  50. package/dist/cjs/operation-node/having-node.d.ts +1 -1
  51. package/dist/cjs/operation-node/insert-query-node.d.ts +6 -1
  52. package/dist/cjs/operation-node/insert-query-node.js +5 -0
  53. package/dist/cjs/operation-node/join-node.d.ts +1 -1
  54. package/dist/cjs/operation-node/matched-node.d.ts +13 -0
  55. package/dist/cjs/operation-node/matched-node.js +19 -0
  56. package/dist/cjs/operation-node/merge-query-node.d.ts +27 -0
  57. package/dist/cjs/operation-node/merge-query-node.js +45 -0
  58. package/dist/cjs/operation-node/on-node.d.ts +1 -1
  59. package/dist/cjs/operation-node/operation-node-source.js +1 -2
  60. package/dist/cjs/operation-node/operation-node-transformer.d.ts +12 -0
  61. package/dist/cjs/operation-node/operation-node-transformer.js +62 -0
  62. package/dist/cjs/operation-node/operation-node-visitor.d.ts +12 -0
  63. package/dist/cjs/operation-node/operation-node-visitor.js +6 -0
  64. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  65. package/dist/cjs/operation-node/operator-node.d.ts +3 -3
  66. package/dist/cjs/operation-node/operator-node.js +8 -6
  67. package/dist/cjs/operation-node/output-node.d.ts +13 -0
  68. package/dist/cjs/operation-node/output-node.js +26 -0
  69. package/dist/cjs/operation-node/query-node.d.ts +17 -5
  70. package/dist/cjs/operation-node/query-node.js +24 -1
  71. package/dist/cjs/operation-node/select-query-node.d.ts +6 -0
  72. package/dist/cjs/operation-node/select-query-node.js +12 -0
  73. package/dist/cjs/operation-node/top-node.d.ts +14 -0
  74. package/dist/cjs/operation-node/top-node.js +19 -0
  75. package/dist/cjs/operation-node/update-query-node.d.ts +9 -1
  76. package/dist/cjs/operation-node/update-query-node.js +11 -0
  77. package/dist/cjs/operation-node/where-node.d.ts +1 -1
  78. package/dist/cjs/parser/binary-operation-parser.d.ts +1 -1
  79. package/dist/cjs/parser/binary-operation-parser.js +7 -8
  80. package/dist/cjs/parser/data-type-parser.js +8 -5
  81. package/dist/cjs/parser/default-value-parser.js +1 -2
  82. package/dist/cjs/parser/expression-parser.js +3 -4
  83. package/dist/cjs/parser/fetch-parser.d.ts +2 -0
  84. package/dist/cjs/parser/fetch-parser.js +17 -0
  85. package/dist/cjs/parser/group-by-parser.js +1 -2
  86. package/dist/cjs/parser/identifier-parser.js +1 -2
  87. package/dist/cjs/parser/insert-values-parser.d.ts +3 -3
  88. package/dist/cjs/parser/insert-values-parser.js +1 -2
  89. package/dist/cjs/parser/join-parser.js +1 -2
  90. package/dist/cjs/parser/merge-parser.d.ts +9 -0
  91. package/dist/cjs/parser/merge-parser.js +31 -0
  92. package/dist/cjs/parser/on-commit-action-parse.js +1 -2
  93. package/dist/cjs/parser/on-modify-action-parser.js +1 -2
  94. package/dist/cjs/parser/order-by-parser.js +3 -4
  95. package/dist/cjs/parser/parse-utils.js +4 -5
  96. package/dist/cjs/parser/partition-by-parser.js +1 -2
  97. package/dist/cjs/parser/reference-parser.js +8 -9
  98. package/dist/cjs/parser/returning-parser.d.ts +4 -3
  99. package/dist/cjs/parser/select-parser.js +2 -3
  100. package/dist/cjs/parser/set-operation-parser.js +1 -2
  101. package/dist/cjs/parser/table-parser.d.ts +4 -3
  102. package/dist/cjs/parser/table-parser.js +4 -5
  103. package/dist/cjs/parser/top-parser.d.ts +2 -0
  104. package/dist/cjs/parser/top-parser.js +19 -0
  105. package/dist/cjs/parser/unary-operation-parser.js +3 -4
  106. package/dist/cjs/parser/update-set-parser.js +2 -3
  107. package/dist/cjs/parser/value-parser.js +4 -5
  108. package/dist/cjs/parser/with-parser.js +1 -2
  109. package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +2 -2
  110. package/dist/cjs/plugin/camel-case/camel-case-plugin.js +2 -2
  111. package/dist/cjs/plugin/camel-case/camel-case.js +2 -3
  112. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +18 -0
  113. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +19 -11
  114. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +4 -0
  115. package/dist/cjs/query-builder/delete-query-builder.d.ts +188 -5
  116. package/dist/cjs/query-builder/delete-query-builder.js +139 -5
  117. package/dist/cjs/query-builder/function-module.d.ts +5 -5
  118. package/dist/cjs/query-builder/function-module.js +1 -2
  119. package/dist/cjs/query-builder/insert-query-builder.d.ts +166 -10
  120. package/dist/cjs/query-builder/insert-query-builder.js +107 -10
  121. package/dist/cjs/query-builder/merge-query-builder.d.ts +721 -0
  122. package/dist/cjs/query-builder/merge-query-builder.js +547 -0
  123. package/dist/cjs/query-builder/merge-result.d.ts +4 -0
  124. package/dist/cjs/query-builder/merge-result.js +10 -0
  125. package/dist/cjs/query-builder/no-result-error.js +2 -2
  126. package/dist/cjs/query-builder/on-conflict-builder.d.ts +2 -2
  127. package/dist/cjs/query-builder/output-interface.d.ts +95 -0
  128. package/dist/cjs/query-builder/output-interface.js +2 -0
  129. package/dist/cjs/query-builder/returning-interface.d.ts +2 -0
  130. package/dist/cjs/query-builder/select-query-builder.d.ts +177 -17
  131. package/dist/cjs/query-builder/select-query-builder.js +21 -2
  132. package/dist/cjs/query-builder/update-query-builder.d.ts +175 -10
  133. package/dist/cjs/query-builder/update-query-builder.js +119 -7
  134. package/dist/cjs/query-builder/update-result.d.ts +9 -0
  135. package/dist/cjs/query-builder/update-result.js +9 -0
  136. package/dist/cjs/query-builder/where-interface.d.ts +1 -1
  137. package/dist/cjs/query-compiler/default-query-compiler.d.ts +12 -0
  138. package/dist/cjs/query-compiler/default-query-compiler.js +118 -10
  139. package/dist/cjs/query-compiler/query-compiler.d.ts +2 -1
  140. package/dist/cjs/query-creator.d.ts +96 -5
  141. package/dist/cjs/query-creator.js +63 -1
  142. package/dist/cjs/raw-builder/raw-builder.js +1 -2
  143. package/dist/cjs/raw-builder/sql.d.ts +5 -5
  144. package/dist/cjs/schema/alter-column-builder.js +3 -0
  145. package/dist/cjs/schema/alter-table-add-index-builder.d.ts +1 -1
  146. package/dist/cjs/schema/alter-table-add-index-builder.js +7 -3
  147. package/dist/cjs/schema/alter-table-builder.js +1 -2
  148. package/dist/cjs/schema/column-definition-builder.d.ts +18 -1
  149. package/dist/cjs/schema/column-definition-builder.js +22 -1
  150. package/dist/cjs/util/assert.js +2 -3
  151. package/dist/cjs/util/compilable.js +1 -2
  152. package/dist/cjs/util/infer-result.d.ts +2 -1
  153. package/dist/cjs/util/json-object-args.js +1 -2
  154. package/dist/cjs/util/log-once.js +1 -2
  155. package/dist/cjs/util/object-utils.js +38 -26
  156. package/dist/cjs/util/performance-now.js +1 -2
  157. package/dist/cjs/util/prevent-await.js +1 -2
  158. package/dist/cjs/util/query-id.js +1 -2
  159. package/dist/cjs/util/random-string.js +1 -2
  160. package/dist/cjs/util/require-all-props.js +1 -2
  161. package/dist/cjs/util/stack-trace-utils.js +1 -2
  162. package/dist/cjs/util/type-utils.d.ts +3 -2
  163. package/dist/esm/dialect/database-introspector.d.ts +1 -0
  164. package/dist/esm/dialect/dialect-adapter-base.d.ts +2 -1
  165. package/dist/esm/dialect/dialect-adapter-base.js +4 -1
  166. package/dist/esm/dialect/dialect-adapter.d.ts +5 -0
  167. package/dist/esm/dialect/mssql/mssql-adapter.d.ts +1 -5
  168. package/dist/esm/dialect/mssql/mssql-adapter.js +2 -4
  169. package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +46 -26
  170. package/dist/esm/dialect/mssql/mssql-driver.d.ts +1 -0
  171. package/dist/esm/dialect/mssql/mssql-driver.js +95 -36
  172. package/dist/esm/dialect/mssql/mssql-introspector.js +13 -2
  173. package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +4 -0
  174. package/dist/esm/dialect/mssql/mssql-query-compiler.js +8 -0
  175. package/dist/esm/dialect/mysql/mysql-introspector.js +2 -0
  176. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +1 -1
  177. package/dist/esm/dialect/postgres/postgres-driver.js +2 -1
  178. package/dist/esm/dialect/postgres/postgres-introspector.js +3 -1
  179. package/dist/esm/dialect/sqlite/sqlite-introspector.js +1 -0
  180. package/dist/esm/driver/database-connection.d.ts +4 -2
  181. package/dist/esm/dynamic/dynamic.d.ts +1 -1
  182. package/dist/esm/dynamic/dynamic.js +1 -1
  183. package/dist/esm/expression/expression-builder.d.ts +31 -5
  184. package/dist/esm/expression/expression-builder.js +5 -0
  185. package/dist/esm/helpers/mysql.d.ts +3 -3
  186. package/dist/esm/helpers/mysql.js +3 -3
  187. package/dist/esm/helpers/postgres.d.ts +4 -4
  188. package/dist/esm/helpers/postgres.js +4 -4
  189. package/dist/esm/index.d.ts +31 -18
  190. package/dist/esm/index.js +30 -17
  191. package/dist/esm/kysely.d.ts +1 -1
  192. package/dist/esm/kysely.js +1 -1
  193. package/dist/esm/operation-node/add-index-node.js +1 -1
  194. package/dist/esm/operation-node/alter-column-node.d.ts +1 -1
  195. package/dist/esm/operation-node/case-node.d.ts +1 -1
  196. package/dist/esm/operation-node/cast-node.d.ts +13 -0
  197. package/dist/esm/operation-node/cast-node.js +17 -0
  198. package/dist/esm/operation-node/column-definition-node.d.ts +2 -0
  199. package/dist/esm/operation-node/data-type-node.d.ts +5 -1
  200. package/dist/esm/operation-node/data-type-node.js +55 -0
  201. package/dist/esm/operation-node/delete-query-node.d.ts +6 -0
  202. package/dist/esm/operation-node/delete-query-node.js +12 -0
  203. package/dist/esm/operation-node/fetch-node.d.ts +15 -0
  204. package/dist/esm/operation-node/fetch-node.js +17 -0
  205. package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +4 -4
  206. package/dist/esm/operation-node/having-node.d.ts +1 -1
  207. package/dist/esm/operation-node/insert-query-node.d.ts +6 -1
  208. package/dist/esm/operation-node/insert-query-node.js +5 -0
  209. package/dist/esm/operation-node/join-node.d.ts +1 -1
  210. package/dist/esm/operation-node/matched-node.d.ts +13 -0
  211. package/dist/esm/operation-node/matched-node.js +17 -0
  212. package/dist/esm/operation-node/merge-query-node.d.ts +27 -0
  213. package/dist/esm/operation-node/merge-query-node.js +43 -0
  214. package/dist/esm/operation-node/on-node.d.ts +1 -1
  215. package/dist/esm/operation-node/operation-node-transformer.d.ts +12 -0
  216. package/dist/esm/operation-node/operation-node-transformer.js +62 -0
  217. package/dist/esm/operation-node/operation-node-visitor.d.ts +12 -0
  218. package/dist/esm/operation-node/operation-node-visitor.js +6 -0
  219. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  220. package/dist/esm/operation-node/operator-node.d.ts +3 -3
  221. package/dist/esm/operation-node/operator-node.js +2 -0
  222. package/dist/esm/operation-node/output-node.d.ts +13 -0
  223. package/dist/esm/operation-node/output-node.js +24 -0
  224. package/dist/esm/operation-node/query-node.d.ts +17 -5
  225. package/dist/esm/operation-node/query-node.js +24 -1
  226. package/dist/esm/operation-node/select-query-node.d.ts +6 -0
  227. package/dist/esm/operation-node/select-query-node.js +12 -0
  228. package/dist/esm/operation-node/top-node.d.ts +14 -0
  229. package/dist/esm/operation-node/top-node.js +17 -0
  230. package/dist/esm/operation-node/update-query-node.d.ts +9 -1
  231. package/dist/esm/operation-node/update-query-node.js +11 -0
  232. package/dist/esm/operation-node/where-node.d.ts +1 -1
  233. package/dist/esm/parser/binary-operation-parser.d.ts +1 -1
  234. package/dist/esm/parser/binary-operation-parser.js +2 -2
  235. package/dist/esm/parser/data-type-parser.js +8 -4
  236. package/dist/esm/parser/fetch-parser.d.ts +2 -0
  237. package/dist/esm/parser/fetch-parser.js +15 -0
  238. package/dist/esm/parser/insert-values-parser.d.ts +3 -3
  239. package/dist/esm/parser/merge-parser.d.ts +9 -0
  240. package/dist/esm/parser/merge-parser.js +28 -0
  241. package/dist/esm/parser/returning-parser.d.ts +4 -3
  242. package/dist/esm/parser/table-parser.d.ts +4 -3
  243. package/dist/esm/parser/top-parser.d.ts +2 -0
  244. package/dist/esm/parser/top-parser.js +17 -0
  245. package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +2 -2
  246. package/dist/esm/plugin/camel-case/camel-case-plugin.js +2 -2
  247. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +18 -0
  248. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +19 -11
  249. package/dist/esm/plugin/with-schema/with-schema-transformer.js +4 -0
  250. package/dist/esm/query-builder/delete-query-builder.d.ts +188 -5
  251. package/dist/esm/query-builder/delete-query-builder.js +139 -5
  252. package/dist/esm/query-builder/function-module.d.ts +5 -5
  253. package/dist/esm/query-builder/insert-query-builder.d.ts +166 -10
  254. package/dist/esm/query-builder/insert-query-builder.js +107 -10
  255. package/dist/esm/query-builder/merge-query-builder.d.ts +721 -0
  256. package/dist/esm/query-builder/merge-query-builder.js +541 -0
  257. package/dist/esm/query-builder/merge-result.d.ts +4 -0
  258. package/dist/esm/query-builder/merge-result.js +7 -0
  259. package/dist/esm/query-builder/on-conflict-builder.d.ts +2 -2
  260. package/dist/esm/query-builder/output-interface.d.ts +95 -0
  261. package/dist/esm/query-builder/output-interface.js +2 -0
  262. package/dist/esm/query-builder/returning-interface.d.ts +2 -0
  263. package/dist/esm/query-builder/select-query-builder.d.ts +177 -17
  264. package/dist/esm/query-builder/select-query-builder.js +20 -0
  265. package/dist/esm/query-builder/update-query-builder.d.ts +175 -10
  266. package/dist/esm/query-builder/update-query-builder.js +119 -7
  267. package/dist/esm/query-builder/update-result.d.ts +9 -0
  268. package/dist/esm/query-builder/update-result.js +9 -0
  269. package/dist/esm/query-builder/where-interface.d.ts +1 -1
  270. package/dist/esm/query-compiler/default-query-compiler.d.ts +12 -0
  271. package/dist/esm/query-compiler/default-query-compiler.js +118 -10
  272. package/dist/esm/query-compiler/query-compiler.d.ts +2 -1
  273. package/dist/esm/query-creator.d.ts +96 -5
  274. package/dist/esm/query-creator.js +64 -2
  275. package/dist/esm/raw-builder/sql.d.ts +5 -5
  276. package/dist/esm/schema/alter-column-builder.js +3 -0
  277. package/dist/esm/schema/alter-table-add-index-builder.d.ts +1 -1
  278. package/dist/esm/schema/alter-table-add-index-builder.js +8 -4
  279. package/dist/esm/schema/alter-table-builder.js +1 -2
  280. package/dist/esm/schema/column-definition-builder.d.ts +18 -1
  281. package/dist/esm/schema/column-definition-builder.js +22 -1
  282. package/dist/esm/util/infer-result.d.ts +2 -1
  283. package/dist/esm/util/object-utils.js +18 -5
  284. package/dist/esm/util/type-utils.d.ts +3 -2
  285. package/package.json +26 -24
@@ -7,13 +7,15 @@ import { DeleteQueryNode } from './operation-node/delete-query-node.js';
7
7
  import { InsertQueryNode } from './operation-node/insert-query-node.js';
8
8
  import { SelectQueryNode } from './operation-node/select-query-node.js';
9
9
  import { UpdateQueryNode } from './operation-node/update-query-node.js';
10
- import { parseTable, parseTableExpression, parseTableExpressionOrList, } from './parser/table-parser.js';
10
+ import { parseTable, parseTableExpression, parseTableExpressionOrList, parseAliasedTable, } from './parser/table-parser.js';
11
11
  import { parseCommonTableExpression, } from './parser/with-parser.js';
12
12
  import { WithNode } from './operation-node/with-node.js';
13
13
  import { createQueryId } from './util/query-id.js';
14
14
  import { WithSchemaPlugin } from './plugin/with-schema/with-schema-plugin.js';
15
15
  import { freeze } from './util/object-utils.js';
16
16
  import { parseSelectArg, } from './parser/select-parser.js';
17
+ import { MergeQueryBuilder } from './query-builder/merge-query-builder.js';
18
+ import { MergeQueryNode } from './operation-node/merge-query-node.js';
17
19
  export class QueryCreator {
18
20
  #props;
19
21
  constructor(props) {
@@ -125,29 +127,89 @@ export class QueryCreator {
125
127
  queryNode: UpdateQueryNode.create(parseTableExpression(table), this.#props.withNode),
126
128
  });
127
129
  }
130
+ mergeInto(targetTable) {
131
+ return new MergeQueryBuilder({
132
+ queryId: createQueryId(),
133
+ executor: this.#props.executor,
134
+ queryNode: MergeQueryNode.create(parseAliasedTable(targetTable), this.#props.withNode),
135
+ });
136
+ }
128
137
  /**
129
138
  * Creates a `with` query (Common Table Expression).
130
139
  *
131
140
  * ### Examples
132
141
  *
142
+ * <!-- siteExample("cte", "Simple selects", 10) -->
143
+ *
144
+ * Common table expressions (CTE) are a great way to modularize complex queries.
145
+ * Essentially they allow you to run multiple separate queries within a
146
+ * single roundtrip to the DB.
147
+ *
148
+ * Since CTEs are a part of the main query, query optimizers inside DB
149
+ * engines are able to optimize the overall query. For example, postgres
150
+ * is able to inline the CTEs inside the using queries if it decides it's
151
+ * faster.
152
+ *
133
153
  * ```ts
134
- * await db
154
+ * const result = await db
155
+ * // Create a CTE called `jennifers` that selects all
156
+ * // persons named 'Jennifer'.
135
157
  * .with('jennifers', (db) => db
136
158
  * .selectFrom('person')
137
159
  * .where('first_name', '=', 'Jennifer')
138
160
  * .select(['id', 'age'])
139
161
  * )
162
+ * // Select all rows from the `jennifers` CTE and
163
+ * // further filter it.
140
164
  * .with('adult_jennifers', (db) => db
141
165
  * .selectFrom('jennifers')
142
166
  * .where('age', '>', 18)
143
167
  * .select(['id', 'age'])
144
168
  * )
169
+ * // Finally select all adult jennifers that are
170
+ * // also younger than 60.
145
171
  * .selectFrom('adult_jennifers')
146
172
  * .where('age', '<', 60)
147
173
  * .selectAll()
148
174
  * .execute()
149
175
  * ```
150
176
  *
177
+ * <!-- siteExample("cte", "Inserts, updates and deletions", 20) -->
178
+ *
179
+ * Some databases like postgres also allow you to run other queries than selects
180
+ * in CTEs. On these databases CTEs are extremely powerful:
181
+ *
182
+ * ```ts
183
+ * const result = await db
184
+ * .with('new_person', (db) => db
185
+ * .insertInto('person')
186
+ * .values({
187
+ * first_name: 'Jennifer',
188
+ * age: 35,
189
+ * })
190
+ * .returning('id')
191
+ * )
192
+ * .with('new_pet', (db) => db
193
+ * .insertInto('pet')
194
+ * .values({
195
+ * name: 'Doggo',
196
+ * species: 'dog',
197
+ * is_favorite: true,
198
+ * // Use the id of the person we just inserted.
199
+ * owner_id: db
200
+ * .selectFrom('new_person')
201
+ * .select('id')
202
+ * })
203
+ * .returning('id')
204
+ * )
205
+ * .selectFrom(['new_person', 'new_pet'])
206
+ * .select([
207
+ * 'new_person.id as person_id',
208
+ * 'new_pet.id as pet_id'
209
+ * ])
210
+ * .execute()
211
+ * ```
212
+ *
151
213
  * The CTE name can optionally specify column names in addition to
152
214
  * a name. In that case Kysely requires the expression to retun
153
215
  * rows with the same columns.
@@ -33,12 +33,12 @@ export interface Sql {
33
33
  * // method to give it an alias.
34
34
  * sql<string>`concat(first_name, ' ', last_name)`.as('full_name')
35
35
  * )
36
- * .where(sql`birthdate between ${date1} and ${date2}`)
36
+ * .where(sql<boolean>`birthdate between ${date1} and ${date2}`)
37
37
  * // Here we assume we have list of nicknames for the person
38
38
  * // (a list of strings) and we use the PostgreSQL `@>` operator
39
39
  * // to test if all of them are valid nicknames for the user.
40
- * .where('nicknames', '@>', sql`ARRAY[${sql.join(nicknames)}]`)
41
- * .orderBy(sql`concat(first_name, ' ', last_name)`)
40
+ * .where('nicknames', '@>', sql<string[]>`ARRAY[${sql.join(nicknames)}]`)
41
+ * .orderBy(sql<string>`concat(first_name, ' ', last_name)`)
42
42
  * .execute()
43
43
  * ```
44
44
  *
@@ -63,7 +63,7 @@ export interface Sql {
63
63
  *
64
64
  * ```ts
65
65
  * const petName = db.selectFrom('pet').select('name').limit(1)
66
- * const fullName = sql`concat(first_name, ' ', last_name)`
66
+ * const fullName = sql<string>`concat(first_name, ' ', last_name)`
67
67
  *
68
68
  * sql`
69
69
  * select ${fullName} as full_name, ${petName} as pet_name
@@ -301,7 +301,7 @@ export interface Sql {
301
301
  * return db
302
302
  * .selectFrom('person')
303
303
  * .selectAll()
304
- * .where('nicknames', '@>', sql`ARRAY[${sql.join(nicknames)}]`)
304
+ * .where('nicknames', '@>', sql<string[]>`ARRAY[${sql.join(nicknames)}]`)
305
305
  * .execute()
306
306
  * }
307
307
  * ```
@@ -2,6 +2,7 @@
2
2
  import { AlterColumnNode } from '../operation-node/alter-column-node.js';
3
3
  import { parseDataTypeExpression, } from '../parser/data-type-parser.js';
4
4
  import { parseDefaultValueExpression, } from '../parser/default-value-parser.js';
5
+ import { preventAwait } from '../util/prevent-await.js';
5
6
  export class AlterColumnBuilder {
6
7
  #column;
7
8
  constructor(column) {
@@ -30,6 +31,7 @@ export class AlterColumnBuilder {
30
31
  return func(this);
31
32
  }
32
33
  }
34
+ preventAwait(AlterColumnBuilder, "don't await AlterColumnBuilder instances");
33
35
  /**
34
36
  * Allows us to force consumers to do exactly one alteration to a column.
35
37
  *
@@ -54,3 +56,4 @@ export class AlteredColumnBuilder {
54
56
  return this.#alterColumnNode;
55
57
  }
56
58
  }
59
+ preventAwait(AlteredColumnBuilder, "don't await AlteredColumnBuilder instances");
@@ -72,7 +72,7 @@ export declare class AlterTableAddIndexBuilder implements OperationNodeSource, C
72
72
  * await db.schema
73
73
  * .alterTable('person')
74
74
  * .addIndex('person_first_name_index')
75
- * .expression(sql`(first_name < 'Sami')`)
75
+ * .expression(sql<boolean>`(first_name < 'Sami')`)
76
76
  * .execute()
77
77
  * ```
78
78
  *
@@ -2,7 +2,7 @@
2
2
  import { AddIndexNode } from '../operation-node/add-index-node.js';
3
3
  import { AlterTableNode } from '../operation-node/alter-table-node.js';
4
4
  import { RawNode } from '../operation-node/raw-node.js';
5
- import { parseOrderedColumnName } from '../parser/reference-parser.js';
5
+ import { parseOrderedColumnName, } from '../parser/reference-parser.js';
6
6
  import { freeze } from '../util/object-utils.js';
7
7
  import { preventAwait } from '../util/prevent-await.js';
8
8
  export class AlterTableAddIndexBuilder {
@@ -50,7 +50,9 @@ export class AlterTableAddIndexBuilder {
50
50
  return new AlterTableAddIndexBuilder({
51
51
  ...this.#props,
52
52
  node: AlterTableNode.cloneWithTableProps(this.#props.node, {
53
- addIndex: AddIndexNode.cloneWithColumns(this.#props.node.addIndex, [parseOrderedColumnName(column)]),
53
+ addIndex: AddIndexNode.cloneWithColumns(this.#props.node.addIndex, [
54
+ parseOrderedColumnName(column),
55
+ ]),
54
56
  }),
55
57
  });
56
58
  }
@@ -95,7 +97,7 @@ export class AlterTableAddIndexBuilder {
95
97
  * await db.schema
96
98
  * .alterTable('person')
97
99
  * .addIndex('person_first_name_index')
98
- * .expression(sql`(first_name < 'Sami')`)
100
+ * .expression(sql<boolean>`(first_name < 'Sami')`)
99
101
  * .execute()
100
102
  * ```
101
103
  *
@@ -109,7 +111,9 @@ export class AlterTableAddIndexBuilder {
109
111
  return new AlterTableAddIndexBuilder({
110
112
  ...this.#props,
111
113
  node: AlterTableNode.cloneWithTableProps(this.#props.node, {
112
- addIndex: AddIndexNode.cloneWithColumns(this.#props.node.addIndex, [expression.toOperationNode()]),
114
+ addIndex: AddIndexNode.cloneWithColumns(this.#props.node.addIndex, [
115
+ expression.toOperationNode(),
116
+ ]),
113
117
  }),
114
118
  });
115
119
  }
@@ -200,6 +200,7 @@ export class AlterTableBuilder {
200
200
  return func(this);
201
201
  }
202
202
  }
203
+ preventAwait(AlterTableBuilder, "don't await AlterTableBuilder instances");
203
204
  export class AlterTableColumnAlteringBuilder {
204
205
  #props;
205
206
  constructor(props) {
@@ -248,6 +249,4 @@ export class AlterTableColumnAlteringBuilder {
248
249
  await this.#props.executor.executeQuery(this.compile(), this.#props.queryId);
249
250
  }
250
251
  }
251
- preventAwait(AlterTableBuilder, "don't await AlterTableBuilder instances");
252
- preventAwait(AlterColumnBuilder, "don't await AlterColumnBuilder instances");
253
252
  preventAwait(AlterTableColumnAlteringBuilder, "don't await AlterTableColumnAlteringBuilder instances directly. To execute the query you need to call `execute`");
@@ -14,6 +14,14 @@ export declare class ColumnDefinitionBuilder implements OperationNodeSource {
14
14
  * you can use the `serial` or `bigserial` data type instead.
15
15
  */
16
16
  autoIncrement(): ColumnDefinitionBuilder;
17
+ /**
18
+ * Makes the column an identity column.
19
+ *
20
+ * This only works on some dialects like MS SQL Server (MSSQL).
21
+ *
22
+ * For PostgreSQL's `generated always as identity` use {@link generatedAlwaysAsIdentity}.
23
+ */
24
+ identity(): ColumnDefinitionBuilder;
17
25
  /**
18
26
  * Makes the column the primary key.
19
27
  *
@@ -137,7 +145,11 @@ export declare class ColumnDefinitionBuilder implements OperationNodeSource {
137
145
  */
138
146
  generatedAlwaysAs(expression: Expression<any>): ColumnDefinitionBuilder;
139
147
  /**
140
- * Adds the `generated always as identity` specifier on supported dialects.
148
+ * Adds the `generated always as identity` specifier.
149
+ *
150
+ * This only works on some dialects like PostgreSQL.
151
+ *
152
+ * For MS SQL Server (MSSQL)'s identity column use {@link identity}.
141
153
  */
142
154
  generatedAlwaysAsIdentity(): ColumnDefinitionBuilder;
143
155
  /**
@@ -208,6 +220,11 @@ export declare class ColumnDefinitionBuilder implements OperationNodeSource {
208
220
  * ```
209
221
  */
210
222
  nullsNotDistinct(): ColumnDefinitionBuilder;
223
+ /**
224
+ * Adds `if not exists` specifier.
225
+ * This only works for PostgreSQL.
226
+ */
227
+ ifNotExists(): ColumnDefinitionBuilder;
211
228
  /**
212
229
  * This can be used to add any additional SQL to the end of the column definition.
213
230
  *
@@ -24,6 +24,16 @@ export class ColumnDefinitionBuilder {
24
24
  autoIncrement() {
25
25
  return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { autoIncrement: true }));
26
26
  }
27
+ /**
28
+ * Makes the column an identity column.
29
+ *
30
+ * This only works on some dialects like MS SQL Server (MSSQL).
31
+ *
32
+ * For PostgreSQL's `generated always as identity` use {@link generatedAlwaysAsIdentity}.
33
+ */
34
+ identity() {
35
+ return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { identity: true }));
36
+ }
27
37
  /**
28
38
  * Makes the column the primary key.
29
39
  *
@@ -191,7 +201,11 @@ export class ColumnDefinitionBuilder {
191
201
  }));
192
202
  }
193
203
  /**
194
- * Adds the `generated always as identity` specifier on supported dialects.
204
+ * Adds the `generated always as identity` specifier.
205
+ *
206
+ * This only works on some dialects like PostgreSQL.
207
+ *
208
+ * For MS SQL Server (MSSQL)'s identity column use {@link identity}.
195
209
  */
196
210
  generatedAlwaysAsIdentity() {
197
211
  return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
@@ -283,6 +297,13 @@ export class ColumnDefinitionBuilder {
283
297
  nullsNotDistinct() {
284
298
  return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { nullsNotDistinct: true }));
285
299
  }
300
+ /**
301
+ * Adds `if not exists` specifier.
302
+ * This only works for PostgreSQL.
303
+ */
304
+ ifNotExists() {
305
+ return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { ifNotExists: true }));
306
+ }
286
307
  /**
287
308
  * This can be used to add any additional SQL to the end of the column definition.
288
309
  *
@@ -1,5 +1,6 @@
1
1
  import { DeleteResult } from '../query-builder/delete-result.js';
2
2
  import { InsertResult } from '../query-builder/insert-result.js';
3
+ import { MergeResult } from '../query-builder/merge-result.js';
3
4
  import { UpdateResult } from '../query-builder/update-result.js';
4
5
  import { CompiledQuery } from '../query-compiler/compiled-query.js';
5
6
  import { Compilable } from './compilable.js';
@@ -43,5 +44,5 @@ import { Simplify } from './type-utils.js';
43
44
  * ```
44
45
  */
45
46
  export type InferResult<C extends Compilable<any> | CompiledQuery<any>> = C extends Compilable<infer O> ? ResolveResult<O> : C extends CompiledQuery<infer O> ? ResolveResult<O> : never;
46
- type ResolveResult<O> = O extends InsertResult | UpdateResult | DeleteResult ? O : Simplify<O>[];
47
+ type ResolveResult<O> = O extends InsertResult | UpdateResult | DeleteResult | MergeResult ? O : Simplify<O>[];
47
48
  export {};
@@ -44,11 +44,17 @@ export function isArrayBufferOrView(obj) {
44
44
  return obj instanceof ArrayBuffer || ArrayBuffer.isView(obj);
45
45
  }
46
46
  export function isPlainObject(obj) {
47
- return (isObject(obj) &&
48
- !Array.isArray(obj) &&
49
- !isDate(obj) &&
50
- !isBuffer(obj) &&
51
- !isArrayBufferOrView(obj));
47
+ if (!isObject(obj) || getTag(obj) !== '[object Object]') {
48
+ return false;
49
+ }
50
+ if (Object.getPrototypeOf(obj) === null) {
51
+ return true;
52
+ }
53
+ let proto = obj;
54
+ while (Object.getPrototypeOf(proto) !== null) {
55
+ proto = Object.getPrototypeOf(proto);
56
+ }
57
+ return Object.getPrototypeOf(obj) === proto;
52
58
  }
53
59
  export function getLast(arr) {
54
60
  return arr[arr.length - 1];
@@ -126,3 +132,10 @@ function compareGenericObjects(obj1, obj2) {
126
132
  }
127
133
  return true;
128
134
  }
135
+ const toString = Object.prototype.toString;
136
+ function getTag(value) {
137
+ if (value == null) {
138
+ return value === undefined ? '[object Undefined]' : '[object Null]';
139
+ }
140
+ return toString.call(value);
141
+ }
@@ -2,6 +2,7 @@ import { InsertResult } from '../query-builder/insert-result.js';
2
2
  import { DeleteResult } from '../query-builder/delete-result.js';
3
3
  import { UpdateResult } from '../query-builder/update-result.js';
4
4
  import { KyselyTypeError } from './type-error.js';
5
+ import { MergeResult } from '../query-builder/merge-result.js';
5
6
  /**
6
7
  * Given a database type and a union of table names in that db, returns
7
8
  * a union type with all possible column names.
@@ -88,8 +89,8 @@ export type AnyAliasedColumnWithTable<DB, TB extends keyof DB> = `${AnyColumnWit
88
89
  * Extracts the item type of an array.
89
90
  */
90
91
  export type ArrayItemType<T> = T extends ReadonlyArray<infer I> ? I : never;
91
- export type SimplifySingleResult<O> = O extends InsertResult ? O : O extends DeleteResult ? O : O extends UpdateResult ? O : Simplify<O> | undefined;
92
- export type SimplifyResult<O> = O extends InsertResult ? O : O extends DeleteResult ? O : O extends UpdateResult ? O : Simplify<O>;
92
+ export type SimplifySingleResult<O> = O extends InsertResult ? O : O extends DeleteResult ? O : O extends UpdateResult ? O : O extends MergeResult ? O : Simplify<O> | undefined;
93
+ export type SimplifyResult<O> = O extends InsertResult ? O : O extends DeleteResult ? O : O extends UpdateResult ? O : O extends MergeResult ? O : Simplify<O>;
93
94
  export type Simplify<T> = DrainOuterGeneric<{
94
95
  [K in keyof T]: T[K];
95
96
  } & {}>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kysely",
3
- "version": "0.27.2",
3
+ "version": "0.27.4",
4
4
  "description": "Type safe SQL query builder",
5
5
  "repository": {
6
6
  "type": "git",
@@ -40,20 +40,21 @@
40
40
  },
41
41
  "scripts": {
42
42
  "clean": "rm -rf dist & rm -rf test/node/dist & rm -rf test/browser/bundle.js & rm -rf helpers",
43
- "test": "npm run build && npm run test:node:build && npm run test:node:run && npm run test:typings && npm run test:esmimports",
43
+ "test": "npm run build && npm run test:node:build && npm run test:node:run && npm run test:typings && npm run test:esmimports && npm run test:exports",
44
44
  "test:node:build": "tsc -p test/node",
45
45
  "test:node": "npm run build && npm run test:node:build && npm run test:node:run",
46
46
  "test:node:run": "mocha --timeout 15000 test/node/dist/**/*.test.js",
47
47
  "test:browser:build": "rm -rf test/browser/bundle.js && esbuild test/browser/main.ts --bundle --outfile=test/browser/bundle.js",
48
48
  "test:browser": "npm run build && npm run test:browser:build && node test/browser/test.js",
49
- "test:bun": "npm run build && cd test/bun && bun install && bun run test",
49
+ "test:bun": "npm run build && bun link && cd test/bun && bun install && bun run test",
50
50
  "test:cloudflare-workers": "npm run build && cd test/cloudflare-workers && npm ci && npm test",
51
51
  "test:deno": "npm run build && deno run --allow-env --allow-read --allow-net test/deno/local.test.ts && deno run --allow-env --allow-read --allow-net test/deno/cdn.test.ts",
52
52
  "test:typings": "tsd test/typings",
53
53
  "test:esmimports": "node scripts/check-esm-imports.js",
54
54
  "test:esbuild": "esbuild --bundle --platform=node --external:pg-native dist/esm/index.js --outfile=/dev/null",
55
+ "test:exports": "node scripts/check-exports.js",
55
56
  "prettier": "prettier --write 'src/**/*.ts' 'test/**/*.ts'",
56
- "build": "npm run clean && npm run build:esm && npm run build:cjs && npm run script:module-fixup && npm run script:copy-interface-doc",
57
+ "build": "npm run clean && (npm run build:esm & npm run build:cjs) && npm run script:module-fixup && npm run script:copy-interface-doc",
57
58
  "build:esm": "tsc -p tsconfig.json && npm run script:add-deno-type-references",
58
59
  "build:cjs": "tsc -p tsconfig-cjs.json",
59
60
  "script:module-fixup": "node scripts/module-fixup.js",
@@ -69,31 +70,32 @@
69
70
  "Igal Klebanov <igalklebanov@gmail.com>"
70
71
  ],
71
72
  "devDependencies": {
72
- "@types/better-sqlite3": "^7.6.4",
73
- "@types/chai": "^4.3.5",
74
- "@types/chai-as-promised": "^7.1.5",
75
- "@types/chai-subset": "^1.3.3",
76
- "@types/mocha": "^10.0.1",
73
+ "@types/better-sqlite3": "^7.6.8",
74
+ "@types/chai": "^4.3.11",
75
+ "@types/chai-as-promised": "^7.1.8",
76
+ "@types/chai-subset": "^1.3.5",
77
+ "@types/mocha": "^10.0.6",
77
78
  "@types/node": "^18.15.11",
78
- "@types/pg": "^8.10.2",
79
- "@types/pg-cursor": "^2.7.0",
80
- "@types/sinon": "^10.0.15",
79
+ "@types/pg": "^8.10.9",
80
+ "@types/pg-cursor": "^2.7.2",
81
+ "@types/sinon": "^17.0.2",
81
82
  "@types/tedious": "^4.0.9",
82
- "better-sqlite3": "^8.4.0",
83
- "chai": "^4.3.7",
83
+ "better-sqlite3": "^9.6.0",
84
+ "chai": "^4.4.0",
84
85
  "chai-as-promised": "^7.1.1",
85
86
  "chai-subset": "^1.6.0",
86
- "esbuild": "^0.17.19",
87
+ "esbuild": "^0.19.11",
88
+ "lodash": "^4.17.21",
87
89
  "mocha": "^10.2.0",
88
- "mysql2": "^3.3.3",
89
- "pg": "^8.11.0",
90
- "pg-cursor": "^2.10.0",
91
- "playwright": "^1.34.3",
92
- "prettier": "^2.8.8",
93
- "sinon": "^15.1.0",
90
+ "mysql2": "^3.6.5",
91
+ "pg": "^8.11.3",
92
+ "pg-cursor": "^2.10.3",
93
+ "playwright": "^1.40.1",
94
+ "prettier": "^3.1.1",
95
+ "sinon": "^17.0.1",
94
96
  "tarn": "^3.0.2",
95
- "tedious": "^16.4.0",
96
- "tsd": "^0.28.1",
97
- "typescript": "^5.2.2"
97
+ "tedious": "^18.2.0",
98
+ "tsd": "^0.30.3",
99
+ "typescript": "^5.5.2"
98
100
  }
99
101
  }