kysely 0.27.5 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/CODE_OF_CONDUCT.md +183 -0
  2. package/FUNDING.md +25 -0
  3. package/README.md +182 -3
  4. package/deno.check.d.ts +7 -0
  5. package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +26 -16
  6. package/dist/cjs/dialect/mssql/mssql-driver.d.ts +6 -3
  7. package/dist/cjs/dialect/mssql/mssql-driver.js +33 -19
  8. package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +2 -0
  9. package/dist/cjs/dialect/mssql/mssql-query-compiler.js +11 -0
  10. package/dist/cjs/dialect/mysql/mysql-driver.d.ts +4 -0
  11. package/dist/cjs/dialect/mysql/mysql-driver.js +27 -12
  12. package/dist/cjs/dialect/postgres/postgres-driver.d.ts +4 -0
  13. package/dist/cjs/dialect/postgres/postgres-driver.js +28 -18
  14. package/dist/cjs/dialect/postgres/postgres-introspector.js +7 -17
  15. package/dist/cjs/dialect/sqlite/sqlite-driver.d.ts +4 -0
  16. package/dist/cjs/dialect/sqlite/sqlite-driver.js +19 -13
  17. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +66 -44
  18. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.d.ts +2 -0
  19. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.js +4 -0
  20. package/dist/cjs/driver/database-connection.d.ts +0 -4
  21. package/dist/cjs/driver/driver.d.ts +17 -0
  22. package/dist/cjs/driver/driver.js +13 -1
  23. package/dist/cjs/driver/dummy-driver.d.ts +3 -0
  24. package/dist/cjs/driver/dummy-driver.js +9 -0
  25. package/dist/cjs/driver/runtime-driver.d.ts +4 -0
  26. package/dist/cjs/driver/runtime-driver.js +43 -3
  27. package/dist/cjs/expression/expression-builder.d.ts +9 -10
  28. package/dist/cjs/helpers/postgres.d.ts +48 -0
  29. package/dist/cjs/helpers/postgres.js +50 -0
  30. package/dist/cjs/index.d.ts +13 -2
  31. package/dist/cjs/index.js +13 -2
  32. package/dist/cjs/kysely.d.ts +339 -2
  33. package/dist/cjs/kysely.js +465 -11
  34. package/dist/cjs/migration/migrator.d.ts +16 -1
  35. package/dist/cjs/migration/migrator.js +14 -4
  36. package/dist/cjs/operation-node/aggregate-function-node.d.ts +2 -1
  37. package/dist/cjs/operation-node/aggregate-function-node.js +4 -3
  38. package/dist/cjs/operation-node/alter-table-node.d.ts +3 -1
  39. package/dist/cjs/operation-node/collate-node.d.ts +13 -0
  40. package/dist/cjs/operation-node/collate-node.js +19 -0
  41. package/dist/cjs/operation-node/constraint-node.d.ts +1 -1
  42. package/dist/cjs/operation-node/create-type-node.d.ts +1 -1
  43. package/dist/cjs/operation-node/create-type-node.js +1 -1
  44. package/dist/cjs/operation-node/delete-query-node.d.ts +8 -2
  45. package/dist/cjs/operation-node/delete-query-node.js +11 -15
  46. package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +4 -0
  47. package/dist/cjs/operation-node/insert-query-node.d.ts +3 -0
  48. package/dist/cjs/operation-node/join-node.d.ts +1 -1
  49. package/dist/cjs/operation-node/merge-query-node.d.ts +2 -0
  50. package/dist/cjs/operation-node/operation-node-transformer.d.ts +106 -97
  51. package/dist/cjs/operation-node/operation-node-transformer.js +352 -312
  52. package/dist/cjs/operation-node/operation-node-visitor.d.ts +9 -1
  53. package/dist/cjs/operation-node/operation-node-visitor.js +4 -0
  54. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  55. package/dist/cjs/operation-node/or-action-node.d.ts +12 -0
  56. package/dist/cjs/operation-node/or-action-node.js +18 -0
  57. package/dist/cjs/operation-node/order-by-item-node.d.ts +5 -0
  58. package/dist/cjs/operation-node/order-by-item-node.js +6 -0
  59. package/dist/cjs/operation-node/primary-key-constraint-node.d.ts +29 -0
  60. package/dist/cjs/operation-node/{primary-constraint-node.js → primary-key-constraint-node.js} +11 -2
  61. package/dist/cjs/operation-node/query-node.d.ts +7 -0
  62. package/dist/cjs/operation-node/query-node.js +15 -0
  63. package/dist/cjs/operation-node/refresh-materialized-view-node.d.ts +17 -0
  64. package/dist/cjs/operation-node/refresh-materialized-view-node.js +25 -0
  65. package/dist/cjs/operation-node/rename-constraint-node.d.ts +14 -0
  66. package/dist/cjs/operation-node/rename-constraint-node.js +20 -0
  67. package/dist/cjs/operation-node/select-query-node.d.ts +8 -2
  68. package/dist/cjs/operation-node/select-query-node.js +11 -15
  69. package/dist/cjs/operation-node/unique-constraint-node.d.ts +2 -0
  70. package/dist/cjs/operation-node/update-query-node.d.ts +3 -4
  71. package/dist/cjs/operation-node/update-query-node.js +5 -2
  72. package/dist/cjs/parser/collate-parser.d.ts +1 -0
  73. package/dist/cjs/parser/collate-parser.js +2 -0
  74. package/dist/cjs/parser/delete-from-parser.d.ts +5 -0
  75. package/dist/cjs/parser/delete-from-parser.js +2 -0
  76. package/dist/cjs/parser/insert-values-parser.js +3 -1
  77. package/dist/cjs/parser/join-parser.d.ts +1 -1
  78. package/dist/cjs/parser/join-parser.js +7 -1
  79. package/dist/cjs/parser/merge-into-parser.d.ts +5 -0
  80. package/dist/cjs/parser/merge-into-parser.js +2 -0
  81. package/dist/cjs/parser/order-by-parser.d.ts +18 -5
  82. package/dist/cjs/parser/order-by-parser.js +24 -14
  83. package/dist/cjs/parser/savepoint-parser.d.ts +4 -0
  84. package/dist/cjs/parser/savepoint-parser.js +11 -0
  85. package/dist/cjs/parser/select-from-parser.d.ts +4 -0
  86. package/dist/cjs/parser/select-from-parser.js +2 -0
  87. package/dist/cjs/parser/table-parser.d.ts +2 -5
  88. package/dist/cjs/parser/update-parser.d.ts +5 -0
  89. package/dist/cjs/parser/update-parser.js +2 -0
  90. package/dist/cjs/parser/update-set-parser.d.ts +7 -4
  91. package/dist/cjs/plugin/camel-case/camel-case-plugin.js +1 -1
  92. package/dist/cjs/plugin/camel-case/camel-case-transformer.d.ts +2 -1
  93. package/dist/cjs/plugin/camel-case/camel-case-transformer.js +2 -2
  94. package/dist/cjs/plugin/camel-case/camel-case.js +4 -1
  95. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
  96. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.d.ts +4 -3
  97. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.js +6 -6
  98. package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists-plugin.d.ts +211 -0
  99. package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists-plugin.js +162 -0
  100. package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists-transformer.d.ts +8 -0
  101. package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists-transformer.js +29 -0
  102. package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists.d.ts +44 -0
  103. package/dist/cjs/plugin/handle-empty-in-lists/handle-empty-in-lists.js +66 -0
  104. package/dist/cjs/plugin/immediate-value/immediate-value-plugin.js +1 -1
  105. package/dist/cjs/plugin/immediate-value/immediate-value-transformer.d.ts +2 -0
  106. package/dist/cjs/plugin/immediate-value/immediate-value-transformer.js +6 -4
  107. package/dist/cjs/plugin/with-schema/with-schema-plugin.js +1 -1
  108. package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +8 -3
  109. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +45 -14
  110. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +83 -5
  111. package/dist/cjs/query-builder/aggregate-function-builder.js +15 -27
  112. package/dist/cjs/query-builder/cte-builder.js +0 -2
  113. package/dist/cjs/query-builder/delete-query-builder.d.ts +36 -47
  114. package/dist/cjs/query-builder/delete-query-builder.js +12 -78
  115. package/dist/cjs/query-builder/function-module.d.ts +31 -4
  116. package/dist/cjs/query-builder/insert-query-builder.d.ts +161 -6
  117. package/dist/cjs/query-builder/insert-query-builder.js +197 -10
  118. package/dist/cjs/query-builder/join-builder.js +0 -2
  119. package/dist/cjs/query-builder/merge-query-builder.d.ts +145 -3
  120. package/dist/cjs/query-builder/merge-query-builder.js +28 -7
  121. package/dist/cjs/query-builder/on-conflict-builder.js +0 -4
  122. package/dist/cjs/query-builder/order-by-interface.d.ts +176 -0
  123. package/dist/cjs/query-builder/order-by-interface.js +2 -0
  124. package/dist/cjs/query-builder/order-by-item-builder.d.ts +43 -0
  125. package/dist/cjs/query-builder/order-by-item-builder.js +75 -0
  126. package/dist/cjs/query-builder/over-builder.d.ts +43 -6
  127. package/dist/cjs/query-builder/over-builder.js +8 -25
  128. package/dist/cjs/query-builder/returning-interface.d.ts +20 -3
  129. package/dist/cjs/query-builder/select-query-builder.d.ts +279 -98
  130. package/dist/cjs/query-builder/select-query-builder.js +26 -26
  131. package/dist/cjs/query-builder/update-query-builder.d.ts +88 -9
  132. package/dist/cjs/query-builder/update-query-builder.js +17 -15
  133. package/dist/cjs/query-compiler/compiled-query.d.ts +2 -0
  134. package/dist/cjs/query-compiler/compiled-query.js +2 -0
  135. package/dist/cjs/query-compiler/default-query-compiler.d.ts +17 -2
  136. package/dist/cjs/query-compiler/default-query-compiler.js +97 -2
  137. package/dist/cjs/query-compiler/query-compiler.d.ts +4 -2
  138. package/dist/cjs/query-creator.d.ts +23 -25
  139. package/dist/cjs/query-creator.js +280 -8
  140. package/dist/cjs/query-executor/default-query-executor.d.ts +2 -1
  141. package/dist/cjs/query-executor/default-query-executor.js +2 -2
  142. package/dist/cjs/query-executor/query-executor-base.js +7 -25
  143. package/dist/cjs/raw-builder/raw-builder.js +0 -3
  144. package/dist/cjs/raw-builder/sql.d.ts +4 -4
  145. package/dist/cjs/raw-builder/sql.js +1 -1
  146. package/dist/cjs/schema/alter-column-builder.js +0 -3
  147. package/dist/cjs/schema/alter-table-add-foreign-key-constraint-builder.d.ts +4 -0
  148. package/dist/cjs/schema/alter-table-add-foreign-key-constraint-builder.js +24 -2
  149. package/dist/cjs/schema/alter-table-add-index-builder.js +0 -2
  150. package/dist/cjs/schema/alter-table-builder.d.ts +7 -3
  151. package/dist/cjs/schema/alter-table-builder.js +21 -10
  152. package/dist/cjs/schema/alter-table-drop-constraint-builder.js +0 -2
  153. package/dist/cjs/schema/alter-table-executor.js +0 -2
  154. package/dist/cjs/schema/check-constraint-builder.d.ts +13 -0
  155. package/dist/cjs/schema/check-constraint-builder.js +20 -0
  156. package/dist/cjs/schema/column-definition-builder.js +0 -2
  157. package/dist/cjs/schema/create-index-builder.js +1 -3
  158. package/dist/cjs/schema/create-schema-builder.js +0 -2
  159. package/dist/cjs/schema/create-table-builder.d.ts +5 -4
  160. package/dist/cjs/schema/create-table-builder.js +9 -7
  161. package/dist/cjs/schema/create-type-builder.d.ts +1 -1
  162. package/dist/cjs/schema/create-type-builder.js +0 -2
  163. package/dist/cjs/schema/create-view-builder.js +0 -2
  164. package/dist/cjs/schema/drop-index-builder.js +0 -2
  165. package/dist/cjs/schema/drop-schema-builder.js +0 -2
  166. package/dist/cjs/schema/drop-table-builder.js +0 -2
  167. package/dist/cjs/schema/drop-type-builder.js +0 -2
  168. package/dist/cjs/schema/drop-view-builder.js +0 -2
  169. package/dist/cjs/schema/foreign-key-constraint-builder.d.ts +9 -0
  170. package/dist/cjs/schema/foreign-key-constraint-builder.js +16 -2
  171. package/dist/cjs/schema/primary-key-constraint-builder.d.ts +17 -0
  172. package/dist/cjs/schema/primary-key-constraint-builder.js +37 -0
  173. package/dist/cjs/schema/refresh-materialized-view-builder.d.ts +47 -0
  174. package/dist/cjs/schema/refresh-materialized-view-builder.js +75 -0
  175. package/dist/cjs/schema/schema.d.ts +14 -0
  176. package/dist/cjs/schema/schema.js +21 -0
  177. package/dist/cjs/schema/unique-constraint-builder.d.ts +10 -1
  178. package/dist/cjs/schema/unique-constraint-builder.js +26 -5
  179. package/dist/cjs/util/infer-result.d.ts +1 -1
  180. package/dist/cjs/util/log.d.ts +1 -0
  181. package/dist/cjs/util/log.js +3 -2
  182. package/dist/cjs/util/provide-controlled-connection.d.ts +7 -0
  183. package/dist/cjs/util/provide-controlled-connection.js +24 -0
  184. package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +26 -16
  185. package/dist/esm/dialect/mssql/mssql-driver.d.ts +6 -3
  186. package/dist/esm/dialect/mssql/mssql-driver.js +33 -19
  187. package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +2 -0
  188. package/dist/esm/dialect/mssql/mssql-query-compiler.js +11 -0
  189. package/dist/esm/dialect/mysql/mysql-driver.d.ts +4 -0
  190. package/dist/esm/dialect/mysql/mysql-driver.js +27 -12
  191. package/dist/esm/dialect/postgres/postgres-driver.d.ts +4 -0
  192. package/dist/esm/dialect/postgres/postgres-driver.js +28 -18
  193. package/dist/esm/dialect/postgres/postgres-introspector.js +7 -17
  194. package/dist/esm/dialect/sqlite/sqlite-driver.d.ts +4 -0
  195. package/dist/esm/dialect/sqlite/sqlite-driver.js +19 -13
  196. package/dist/esm/dialect/sqlite/sqlite-introspector.js +66 -44
  197. package/dist/esm/dialect/sqlite/sqlite-query-compiler.d.ts +2 -0
  198. package/dist/esm/dialect/sqlite/sqlite-query-compiler.js +4 -0
  199. package/dist/esm/driver/database-connection.d.ts +0 -4
  200. package/dist/esm/driver/driver.d.ts +17 -0
  201. package/dist/esm/driver/driver.js +11 -0
  202. package/dist/esm/driver/dummy-driver.d.ts +3 -0
  203. package/dist/esm/driver/dummy-driver.js +9 -0
  204. package/dist/esm/driver/runtime-driver.d.ts +4 -0
  205. package/dist/esm/driver/runtime-driver.js +43 -3
  206. package/dist/esm/expression/expression-builder.d.ts +9 -10
  207. package/dist/esm/helpers/postgres.d.ts +48 -0
  208. package/dist/esm/helpers/postgres.js +49 -0
  209. package/dist/esm/index.d.ts +13 -2
  210. package/dist/esm/index.js +11 -1
  211. package/dist/esm/kysely.d.ts +339 -2
  212. package/dist/esm/kysely.js +461 -10
  213. package/dist/esm/migration/migrator.d.ts +16 -1
  214. package/dist/esm/migration/migrator.js +14 -4
  215. package/dist/esm/operation-node/aggregate-function-node.d.ts +2 -1
  216. package/dist/esm/operation-node/aggregate-function-node.js +4 -3
  217. package/dist/esm/operation-node/alter-table-node.d.ts +3 -1
  218. package/dist/esm/operation-node/collate-node.d.ts +13 -0
  219. package/dist/esm/operation-node/collate-node.js +17 -0
  220. package/dist/esm/operation-node/constraint-node.d.ts +1 -1
  221. package/dist/esm/operation-node/create-type-node.d.ts +1 -1
  222. package/dist/esm/operation-node/create-type-node.js +1 -1
  223. package/dist/esm/operation-node/delete-query-node.d.ts +8 -2
  224. package/dist/esm/operation-node/delete-query-node.js +11 -15
  225. package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +4 -0
  226. package/dist/esm/operation-node/insert-query-node.d.ts +3 -0
  227. package/dist/esm/operation-node/join-node.d.ts +1 -1
  228. package/dist/esm/operation-node/merge-query-node.d.ts +2 -0
  229. package/dist/esm/operation-node/operation-node-transformer.d.ts +106 -97
  230. package/dist/esm/operation-node/operation-node-transformer.js +352 -312
  231. package/dist/esm/operation-node/operation-node-visitor.d.ts +9 -1
  232. package/dist/esm/operation-node/operation-node-visitor.js +4 -0
  233. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  234. package/dist/esm/operation-node/or-action-node.d.ts +12 -0
  235. package/dist/esm/operation-node/or-action-node.js +16 -0
  236. package/dist/esm/operation-node/order-by-item-node.d.ts +5 -0
  237. package/dist/esm/operation-node/order-by-item-node.js +6 -0
  238. package/dist/esm/operation-node/primary-key-constraint-node.d.ts +29 -0
  239. package/dist/esm/operation-node/{primary-constraint-node.js → primary-key-constraint-node.js} +11 -2
  240. package/dist/esm/operation-node/query-node.d.ts +7 -0
  241. package/dist/esm/operation-node/query-node.js +15 -0
  242. package/dist/esm/operation-node/refresh-materialized-view-node.d.ts +17 -0
  243. package/dist/esm/operation-node/refresh-materialized-view-node.js +23 -0
  244. package/dist/esm/operation-node/rename-constraint-node.d.ts +14 -0
  245. package/dist/esm/operation-node/rename-constraint-node.js +18 -0
  246. package/dist/esm/operation-node/select-query-node.d.ts +8 -2
  247. package/dist/esm/operation-node/select-query-node.js +11 -15
  248. package/dist/esm/operation-node/unique-constraint-node.d.ts +2 -0
  249. package/dist/esm/operation-node/update-query-node.d.ts +3 -4
  250. package/dist/esm/operation-node/update-query-node.js +5 -2
  251. package/dist/esm/parser/collate-parser.d.ts +1 -0
  252. package/dist/esm/parser/collate-parser.js +2 -0
  253. package/dist/esm/parser/delete-from-parser.d.ts +5 -0
  254. package/dist/esm/parser/delete-from-parser.js +2 -0
  255. package/dist/esm/parser/insert-values-parser.js +3 -1
  256. package/dist/esm/parser/join-parser.d.ts +1 -1
  257. package/dist/esm/parser/join-parser.js +7 -1
  258. package/dist/esm/parser/merge-into-parser.d.ts +5 -0
  259. package/dist/esm/parser/merge-into-parser.js +2 -0
  260. package/dist/esm/parser/order-by-parser.d.ts +18 -5
  261. package/dist/esm/parser/order-by-parser.js +27 -17
  262. package/dist/esm/parser/savepoint-parser.d.ts +4 -0
  263. package/dist/esm/parser/savepoint-parser.js +9 -0
  264. package/dist/esm/parser/select-from-parser.d.ts +4 -0
  265. package/dist/esm/parser/select-from-parser.js +2 -0
  266. package/dist/esm/parser/table-parser.d.ts +2 -5
  267. package/dist/esm/parser/update-parser.d.ts +5 -0
  268. package/dist/esm/parser/update-parser.js +2 -0
  269. package/dist/esm/parser/update-set-parser.d.ts +7 -4
  270. package/dist/esm/plugin/camel-case/camel-case-plugin.js +1 -1
  271. package/dist/esm/plugin/camel-case/camel-case-transformer.d.ts +2 -1
  272. package/dist/esm/plugin/camel-case/camel-case-transformer.js +2 -2
  273. package/dist/esm/plugin/camel-case/camel-case.js +4 -1
  274. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
  275. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.d.ts +4 -3
  276. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.js +6 -6
  277. package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists-plugin.d.ts +211 -0
  278. package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists-plugin.js +159 -0
  279. package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists-transformer.d.ts +8 -0
  280. package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists-transformer.js +26 -0
  281. package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists.d.ts +44 -0
  282. package/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists.js +63 -0
  283. package/dist/esm/plugin/immediate-value/immediate-value-plugin.js +1 -1
  284. package/dist/esm/plugin/immediate-value/immediate-value-transformer.d.ts +2 -0
  285. package/dist/esm/plugin/immediate-value/immediate-value-transformer.js +6 -4
  286. package/dist/esm/plugin/with-schema/with-schema-plugin.js +1 -1
  287. package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +8 -3
  288. package/dist/esm/plugin/with-schema/with-schema-transformer.js +45 -14
  289. package/dist/esm/query-builder/aggregate-function-builder.d.ts +83 -5
  290. package/dist/esm/query-builder/aggregate-function-builder.js +15 -27
  291. package/dist/esm/query-builder/cte-builder.js +0 -2
  292. package/dist/esm/query-builder/delete-query-builder.d.ts +36 -47
  293. package/dist/esm/query-builder/delete-query-builder.js +12 -78
  294. package/dist/esm/query-builder/function-module.d.ts +31 -4
  295. package/dist/esm/query-builder/insert-query-builder.d.ts +161 -6
  296. package/dist/esm/query-builder/insert-query-builder.js +197 -10
  297. package/dist/esm/query-builder/join-builder.js +0 -2
  298. package/dist/esm/query-builder/merge-query-builder.d.ts +145 -3
  299. package/dist/esm/query-builder/merge-query-builder.js +29 -8
  300. package/dist/esm/query-builder/on-conflict-builder.js +0 -4
  301. package/dist/esm/query-builder/order-by-interface.d.ts +176 -0
  302. package/dist/esm/query-builder/order-by-interface.js +2 -0
  303. package/dist/esm/query-builder/order-by-item-builder.d.ts +43 -0
  304. package/dist/esm/query-builder/order-by-item-builder.js +72 -0
  305. package/dist/esm/query-builder/over-builder.d.ts +43 -6
  306. package/dist/esm/query-builder/over-builder.js +8 -25
  307. package/dist/esm/query-builder/returning-interface.d.ts +20 -3
  308. package/dist/esm/query-builder/select-query-builder.d.ts +279 -98
  309. package/dist/esm/query-builder/select-query-builder.js +26 -26
  310. package/dist/esm/query-builder/update-query-builder.d.ts +88 -9
  311. package/dist/esm/query-builder/update-query-builder.js +17 -15
  312. package/dist/esm/query-compiler/compiled-query.d.ts +2 -0
  313. package/dist/esm/query-compiler/compiled-query.js +2 -0
  314. package/dist/esm/query-compiler/default-query-compiler.d.ts +17 -2
  315. package/dist/esm/query-compiler/default-query-compiler.js +97 -2
  316. package/dist/esm/query-compiler/query-compiler.d.ts +4 -2
  317. package/dist/esm/query-creator.d.ts +23 -25
  318. package/dist/esm/query-creator.js +281 -9
  319. package/dist/esm/query-executor/default-query-executor.d.ts +2 -1
  320. package/dist/esm/query-executor/default-query-executor.js +2 -2
  321. package/dist/esm/query-executor/query-executor-base.js +7 -25
  322. package/dist/esm/raw-builder/raw-builder.js +0 -3
  323. package/dist/esm/raw-builder/sql.d.ts +4 -4
  324. package/dist/esm/raw-builder/sql.js +1 -1
  325. package/dist/esm/schema/alter-column-builder.js +0 -3
  326. package/dist/esm/schema/alter-table-add-foreign-key-constraint-builder.d.ts +4 -0
  327. package/dist/esm/schema/alter-table-add-foreign-key-constraint-builder.js +24 -2
  328. package/dist/esm/schema/alter-table-add-index-builder.js +0 -2
  329. package/dist/esm/schema/alter-table-builder.d.ts +7 -3
  330. package/dist/esm/schema/alter-table-builder.js +22 -11
  331. package/dist/esm/schema/alter-table-drop-constraint-builder.js +0 -2
  332. package/dist/esm/schema/alter-table-executor.js +0 -2
  333. package/dist/esm/schema/check-constraint-builder.d.ts +13 -0
  334. package/dist/esm/schema/check-constraint-builder.js +17 -0
  335. package/dist/esm/schema/column-definition-builder.js +0 -2
  336. package/dist/esm/schema/create-index-builder.js +1 -3
  337. package/dist/esm/schema/create-schema-builder.js +0 -2
  338. package/dist/esm/schema/create-table-builder.d.ts +5 -4
  339. package/dist/esm/schema/create-table-builder.js +10 -8
  340. package/dist/esm/schema/create-type-builder.d.ts +1 -1
  341. package/dist/esm/schema/create-type-builder.js +0 -2
  342. package/dist/esm/schema/create-view-builder.js +0 -2
  343. package/dist/esm/schema/drop-index-builder.js +0 -2
  344. package/dist/esm/schema/drop-schema-builder.js +0 -2
  345. package/dist/esm/schema/drop-table-builder.js +0 -2
  346. package/dist/esm/schema/drop-type-builder.js +0 -2
  347. package/dist/esm/schema/drop-view-builder.js +0 -2
  348. package/dist/esm/schema/foreign-key-constraint-builder.d.ts +9 -0
  349. package/dist/esm/schema/foreign-key-constraint-builder.js +16 -2
  350. package/dist/esm/schema/primary-key-constraint-builder.d.ts +17 -0
  351. package/dist/esm/schema/primary-key-constraint-builder.js +34 -0
  352. package/dist/esm/schema/refresh-materialized-view-builder.d.ts +47 -0
  353. package/dist/esm/schema/refresh-materialized-view-builder.js +72 -0
  354. package/dist/esm/schema/schema.d.ts +14 -0
  355. package/dist/esm/schema/schema.js +21 -0
  356. package/dist/esm/schema/unique-constraint-builder.d.ts +10 -1
  357. package/dist/esm/schema/unique-constraint-builder.js +26 -5
  358. package/dist/esm/util/infer-result.d.ts +1 -1
  359. package/dist/esm/util/log.d.ts +1 -0
  360. package/dist/esm/util/log.js +3 -2
  361. package/dist/esm/util/provide-controlled-connection.d.ts +7 -0
  362. package/dist/esm/util/provide-controlled-connection.js +22 -0
  363. package/outdated-typescript.d.ts +5 -0
  364. package/package.json +16 -2
  365. package/CONTRIBUTING.md +0 -70
  366. package/dist/cjs/operation-node/primary-constraint-node.d.ts +0 -15
  367. package/dist/cjs/util/prevent-await.d.ts +0 -1
  368. package/dist/cjs/util/prevent-await.js +0 -13
  369. package/dist/esm/operation-node/primary-constraint-node.d.ts +0 -15
  370. package/dist/esm/util/prevent-await.d.ts +0 -1
  371. package/dist/esm/util/prevent-await.js +0 -11
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TransactionBuilder = exports.ConnectionBuilder = exports.Transaction = exports.Kysely = void 0;
3
+ exports.Command = exports.ControlledTransaction = exports.ControlledTransactionBuilder = exports.TransactionBuilder = exports.ConnectionBuilder = exports.Transaction = exports.Kysely = void 0;
4
4
  exports.isKyselyProps = isKyselyProps;
5
5
  const schema_js_1 = require("./schema/schema.js");
6
6
  const dynamic_js_1 = require("./dynamic/dynamic.js");
@@ -11,7 +11,6 @@ const object_utils_js_1 = require("./util/object-utils.js");
11
11
  const runtime_driver_js_1 = require("./driver/runtime-driver.js");
12
12
  const single_connection_provider_js_1 = require("./driver/single-connection-provider.js");
13
13
  const driver_js_1 = require("./driver/driver.js");
14
- const prevent_await_js_1 = require("./util/prevent-await.js");
15
14
  const function_module_js_1 = require("./query-builder/function-module.js");
16
15
  const log_js_1 = require("./util/log.js");
17
16
  const query_id_js_1 = require("./util/query-id.js");
@@ -20,6 +19,9 @@ const case_builder_js_1 = require("./query-builder/case-builder.js");
20
19
  const case_node_js_1 = require("./operation-node/case-node.js");
21
20
  const expression_parser_js_1 = require("./parser/expression-parser.js");
22
21
  const with_schema_plugin_js_1 = require("./plugin/with-schema/with-schema-plugin.js");
22
+ const provide_controlled_connection_js_1 = require("./util/provide-controlled-connection.js");
23
+ // @ts-ignore
24
+ Symbol.asyncDispose ??= Symbol('Symbol.asyncDispose');
23
25
  /**
24
26
  * The main Kysely class.
25
27
  *
@@ -176,6 +178,9 @@ class Kysely extends query_creator_js_1.QueryCreator {
176
178
  * of type {@link Transaction} which inherits {@link Kysely}. Any query
177
179
  * started through the transaction object is executed inside the transaction.
178
180
  *
181
+ * To run a controlled transaction, allowing you to commit and rollback manually,
182
+ * use {@link startTransaction} instead.
183
+ *
179
184
  * ### Examples
180
185
  *
181
186
  * <!-- siteExample("transactions", "Simple transaction", 10) -->
@@ -230,6 +235,120 @@ class Kysely extends query_creator_js_1.QueryCreator {
230
235
  transaction() {
231
236
  return new TransactionBuilder({ ...this.#props });
232
237
  }
238
+ /**
239
+ * Creates a {@link ControlledTransactionBuilder} that can be used to run queries inside a controlled transaction.
240
+ *
241
+ * The returned {@link ControlledTransactionBuilder} can be used to configure the transaction.
242
+ * The {@link ControlledTransactionBuilder.execute} method can then be called
243
+ * to start the transaction and return a {@link ControlledTransaction}.
244
+ *
245
+ * A {@link ControlledTransaction} allows you to commit and rollback manually,
246
+ * execute savepoint commands. It extends {@link Transaction} which extends {@link Kysely},
247
+ * so you can run queries inside the transaction. Once the transaction is committed,
248
+ * or rolled back, it can't be used anymore - all queries will throw an error.
249
+ * This is to prevent accidentally running queries outside the transaction - where
250
+ * atomicity is not guaranteed anymore.
251
+ *
252
+ * ### Examples
253
+ *
254
+ * <!-- siteExample("transactions", "Controlled transaction", 11) -->
255
+ *
256
+ * A controlled transaction allows you to commit and rollback manually, execute
257
+ * savepoint commands, and queries in general.
258
+ *
259
+ * In this example we start a transaction, use it to insert two rows and then commit
260
+ * the transaction. If an error is thrown, we catch it and rollback the transaction.
261
+ *
262
+ * ```ts
263
+ * const trx = await db.startTransaction().execute()
264
+ *
265
+ * try {
266
+ * const jennifer = await trx.insertInto('person')
267
+ * .values({
268
+ * first_name: 'Jennifer',
269
+ * last_name: 'Aniston',
270
+ * age: 40,
271
+ * })
272
+ * .returning('id')
273
+ * .executeTakeFirstOrThrow()
274
+ *
275
+ * const catto = await trx.insertInto('pet')
276
+ * .values({
277
+ * owner_id: jennifer.id,
278
+ * name: 'Catto',
279
+ * species: 'cat',
280
+ * is_favorite: false,
281
+ * })
282
+ * .returningAll()
283
+ * .executeTakeFirstOrThrow()
284
+ *
285
+ * await trx.commit().execute()
286
+ *
287
+ * // ...
288
+ * } catch (error) {
289
+ * await trx.rollback().execute()
290
+ * }
291
+ * ```
292
+ *
293
+ * <!-- siteExample("transactions", "Controlled transaction /w savepoints", 12) -->
294
+ *
295
+ * A controlled transaction allows you to commit and rollback manually, execute
296
+ * savepoint commands, and queries in general.
297
+ *
298
+ * In this example we start a transaction, insert a person, create a savepoint,
299
+ * try inserting a toy and a pet, and if an error is thrown, we rollback to the
300
+ * savepoint. Eventually we release the savepoint, insert an audit record and
301
+ * commit the transaction. If an error is thrown, we catch it and rollback the
302
+ * transaction.
303
+ *
304
+ * ```ts
305
+ * const trx = await db.startTransaction().execute()
306
+ *
307
+ * try {
308
+ * const jennifer = await trx
309
+ * .insertInto('person')
310
+ * .values({
311
+ * first_name: 'Jennifer',
312
+ * last_name: 'Aniston',
313
+ * age: 40,
314
+ * })
315
+ * .returning('id')
316
+ * .executeTakeFirstOrThrow()
317
+ *
318
+ * const trxAfterJennifer = await trx.savepoint('after_jennifer').execute()
319
+ *
320
+ * try {
321
+ * const catto = await trxAfterJennifer
322
+ * .insertInto('pet')
323
+ * .values({
324
+ * owner_id: jennifer.id,
325
+ * name: 'Catto',
326
+ * species: 'cat',
327
+ * })
328
+ * .returning('id')
329
+ * .executeTakeFirstOrThrow()
330
+ *
331
+ * await trxAfterJennifer
332
+ * .insertInto('toy')
333
+ * .values({ name: 'Bone', price: 1.99, pet_id: catto.id })
334
+ * .execute()
335
+ * } catch (error) {
336
+ * await trxAfterJennifer.rollbackToSavepoint('after_jennifer').execute()
337
+ * }
338
+ *
339
+ * await trxAfterJennifer.releaseSavepoint('after_jennifer').execute()
340
+ *
341
+ * await trx.insertInto('audit').values({ action: 'added Jennifer' }).execute()
342
+ *
343
+ * await trx.commit().execute()
344
+ * } catch (error) {
345
+ * await trx.rollback().execute()
346
+ * }
347
+ * ```
348
+ */
349
+ startTransaction() {
350
+ return new ControlledTransactionBuilder({ ...this.#props });
351
+ }
233
352
  /**
234
353
  * Provides a kysely instance bound to a single database connection.
235
354
  *
@@ -345,6 +464,9 @@ class Kysely extends query_creator_js_1.QueryCreator {
345
464
  const compiledQuery = (0, compilable_js_1.isCompilable)(query) ? query.compile() : query;
346
465
  return this.getExecutor().executeQuery(compiledQuery, queryId);
347
466
  }
467
+ async [Symbol.asyncDispose]() {
468
+ await this.destroy();
469
+ }
348
470
  }
349
471
  exports.Kysely = Kysely;
350
472
  class Transaction extends Kysely {
@@ -415,12 +537,17 @@ class ConnectionBuilder {
415
537
  }
416
538
  }
417
539
  exports.ConnectionBuilder = ConnectionBuilder;
418
- (0, prevent_await_js_1.preventAwait)(ConnectionBuilder, "don't await ConnectionBuilder instances directly. To execute the query you need to call the `execute` method");
419
540
  class TransactionBuilder {
420
541
  #props;
421
542
  constructor(props) {
422
543
  this.#props = (0, object_utils_js_1.freeze)(props);
423
544
  }
545
+ setAccessMode(accessMode) {
546
+ return new TransactionBuilder({
547
+ ...this.#props,
548
+ accessMode,
549
+ });
550
+ }
424
551
  setIsolationLevel(isolationLevel) {
425
552
  return new TransactionBuilder({
426
553
  ...this.#props,
@@ -428,9 +555,9 @@ class TransactionBuilder {
428
555
  });
429
556
  }
430
557
  async execute(callback) {
431
- const { isolationLevel, ...kyselyProps } = this.#props;
432
- const settings = { isolationLevel };
433
- validateTransactionSettings(settings);
558
+ const { isolationLevel, accessMode, ...kyselyProps } = this.#props;
559
+ const settings = { isolationLevel, accessMode };
560
+ (0, driver_js_1.validateTransactionSettings)(settings);
434
561
  return this.#props.executor.provideConnection(async (connection) => {
435
562
  const executor = this.#props.executor.withConnectionProvider(new single_connection_provider_js_1.SingleConnectionProvider(connection));
436
563
  const transaction = new Transaction({
@@ -451,10 +578,337 @@ class TransactionBuilder {
451
578
  }
452
579
  }
453
580
  exports.TransactionBuilder = TransactionBuilder;
454
- (0, prevent_await_js_1.preventAwait)(TransactionBuilder, "don't await TransactionBuilder instances directly. To execute the transaction you need to call the `execute` method");
455
- function validateTransactionSettings(settings) {
456
- if (settings.isolationLevel &&
457
- !driver_js_1.TRANSACTION_ISOLATION_LEVELS.includes(settings.isolationLevel)) {
458
- throw new Error(`invalid transaction isolation level ${settings.isolationLevel}`);
581
+ class ControlledTransactionBuilder {
582
+ #props;
583
+ constructor(props) {
584
+ this.#props = (0, object_utils_js_1.freeze)(props);
585
+ }
586
+ setAccessMode(accessMode) {
587
+ return new ControlledTransactionBuilder({
588
+ ...this.#props,
589
+ accessMode,
590
+ });
591
+ }
592
+ setIsolationLevel(isolationLevel) {
593
+ return new ControlledTransactionBuilder({
594
+ ...this.#props,
595
+ isolationLevel,
596
+ });
597
+ }
598
+ async execute() {
599
+ const { isolationLevel, accessMode, ...props } = this.#props;
600
+ const settings = { isolationLevel, accessMode };
601
+ (0, driver_js_1.validateTransactionSettings)(settings);
602
+ const connection = await (0, provide_controlled_connection_js_1.provideControlledConnection)(this.#props.executor);
603
+ await this.#props.driver.beginTransaction(connection.connection, settings);
604
+ return new ControlledTransaction({
605
+ ...props,
606
+ connection,
607
+ executor: this.#props.executor.withConnectionProvider(new single_connection_provider_js_1.SingleConnectionProvider(connection.connection)),
608
+ });
609
+ }
610
+ }
611
+ exports.ControlledTransactionBuilder = ControlledTransactionBuilder;
612
+ class ControlledTransaction extends Transaction {
613
+ #props;
614
+ #compileQuery;
615
+ #state;
616
+ constructor(props) {
617
+ const state = { isCommitted: false, isRolledBack: false };
618
+ props = {
619
+ ...props,
620
+ executor: new NotCommittedOrRolledBackAssertingExecutor(props.executor, state),
621
+ };
622
+ const { connection, ...transactionProps } = props;
623
+ super(transactionProps);
624
+ this.#props = (0, object_utils_js_1.freeze)(props);
625
+ this.#state = state;
626
+ const queryId = (0, query_id_js_1.createQueryId)();
627
+ this.#compileQuery = (node) => props.executor.compileQuery(node, queryId);
628
+ }
629
+ get isCommitted() {
630
+ return this.#state.isCommitted;
631
+ }
632
+ get isRolledBack() {
633
+ return this.#state.isRolledBack;
634
+ }
635
+ /**
636
+ * Commits the transaction.
637
+ *
638
+ * See {@link rollback}.
639
+ *
640
+ * ### Examples
641
+ *
642
+ * ```ts
643
+ * import type { Kysely } from 'kysely'
644
+ * import type { Database } from 'type-editor' // imaginary module
645
+ *
646
+ * const trx = await db.startTransaction().execute()
647
+ *
648
+ * try {
649
+ * await doSomething(trx)
650
+ *
651
+ * await trx.commit().execute()
652
+ * } catch (error) {
653
+ * await trx.rollback().execute()
654
+ * }
655
+ *
656
+ * async function doSomething(kysely: Kysely<Database>) {}
657
+ * ```
658
+ */
659
+ commit() {
660
+ assertNotCommittedOrRolledBack(this.#state);
661
+ return new Command(async () => {
662
+ await this.#props.driver.commitTransaction(this.#props.connection.connection);
663
+ this.#state.isCommitted = true;
664
+ this.#props.connection.release();
665
+ });
666
+ }
667
+ /**
668
+ * Rolls back the transaction.
669
+ *
670
+ * See {@link commit} and {@link rollbackToSavepoint}.
671
+ *
672
+ * ### Examples
673
+ *
674
+ * ```ts
675
+ * import type { Kysely } from 'kysely'
676
+ * import type { Database } from 'type-editor' // imaginary module
677
+ *
678
+ * const trx = await db.startTransaction().execute()
679
+ *
680
+ * try {
681
+ * await doSomething(trx)
682
+ *
683
+ * await trx.commit().execute()
684
+ * } catch (error) {
685
+ * await trx.rollback().execute()
686
+ * }
687
+ *
688
+ * async function doSomething(kysely: Kysely<Database>) {}
689
+ * ```
690
+ */
691
+ rollback() {
692
+ assertNotCommittedOrRolledBack(this.#state);
693
+ return new Command(async () => {
694
+ await this.#props.driver.rollbackTransaction(this.#props.connection.connection);
695
+ this.#state.isRolledBack = true;
696
+ this.#props.connection.release();
697
+ });
698
+ }
699
+ /**
700
+ * Creates a savepoint with a given name.
701
+ *
702
+ * See {@link rollbackToSavepoint} and {@link releaseSavepoint}.
703
+ *
704
+ * For a type-safe experience, you should use the returned instance from now on.
705
+ *
706
+ * ### Examples
707
+ *
708
+ * ```ts
709
+ * import type { Kysely } from 'kysely'
710
+ * import type { Database } from 'type-editor' // imaginary module
711
+ *
712
+ * const trx = await db.startTransaction().execute()
713
+ *
714
+ * await insertJennifer(trx)
715
+ *
716
+ * const trxAfterJennifer = await trx.savepoint('after_jennifer').execute()
717
+ *
718
+ * try {
719
+ * await doSomething(trxAfterJennifer)
720
+ * } catch (error) {
721
+ * await trxAfterJennifer.rollbackToSavepoint('after_jennifer').execute()
722
+ * }
723
+ *
724
+ * async function insertJennifer(kysely: Kysely<Database>) {}
725
+ * async function doSomething(kysely: Kysely<Database>) {}
726
+ * ```
727
+ */
728
+ savepoint(savepointName) {
729
+ assertNotCommittedOrRolledBack(this.#state);
730
+ return new Command(async () => {
731
+ await this.#props.driver.savepoint?.(this.#props.connection.connection, savepointName, this.#compileQuery);
732
+ return new ControlledTransaction({ ...this.#props });
733
+ });
734
+ }
735
+ /**
736
+ * Rolls back to a savepoint with a given name.
737
+ *
738
+ * See {@link savepoint} and {@link releaseSavepoint}.
739
+ *
740
+ * You must use the same instance returned by {@link savepoint}, or
741
+ * escape the type-check by using `as any`.
742
+ *
743
+ * ### Examples
744
+ *
745
+ * ```ts
746
+ * import type { Kysely } from 'kysely'
747
+ * import type { Database } from 'type-editor' // imaginary module
748
+ *
749
+ * const trx = await db.startTransaction().execute()
750
+ *
751
+ * await insertJennifer(trx)
752
+ *
753
+ * const trxAfterJennifer = await trx.savepoint('after_jennifer').execute()
754
+ *
755
+ * try {
756
+ * await doSomething(trxAfterJennifer)
757
+ * } catch (error) {
758
+ * await trxAfterJennifer.rollbackToSavepoint('after_jennifer').execute()
759
+ * }
760
+ *
761
+ * async function insertJennifer(kysely: Kysely<Database>) {}
762
+ * async function doSomething(kysely: Kysely<Database>) {}
763
+ * ```
764
+ */
765
+ rollbackToSavepoint(savepointName) {
766
+ assertNotCommittedOrRolledBack(this.#state);
767
+ return new Command(async () => {
768
+ await this.#props.driver.rollbackToSavepoint?.(this.#props.connection.connection, savepointName, this.#compileQuery);
769
+ return new ControlledTransaction({ ...this.#props });
770
+ });
771
+ }
772
+ /**
773
+ * Releases a savepoint with a given name.
774
+ *
775
+ * See {@link savepoint} and {@link rollbackToSavepoint}.
776
+ *
777
+ * You must use the same instance returned by {@link savepoint}, or
778
+ * escape the type-check by using `as any`.
779
+ *
780
+ * ### Examples
781
+ *
782
+ * ```ts
783
+ * import type { Kysely } from 'kysely'
784
+ * import type { Database } from 'type-editor' // imaginary module
785
+ *
786
+ * const trx = await db.startTransaction().execute()
787
+ *
788
+ * await insertJennifer(trx)
789
+ *
790
+ * const trxAfterJennifer = await trx.savepoint('after_jennifer').execute()
791
+ *
792
+ * try {
793
+ * await doSomething(trxAfterJennifer)
794
+ * } catch (error) {
795
+ * await trxAfterJennifer.rollbackToSavepoint('after_jennifer').execute()
796
+ * }
797
+ *
798
+ * await trxAfterJennifer.releaseSavepoint('after_jennifer').execute()
799
+ *
800
+ * await doSomethingElse(trx)
801
+ *
802
+ * async function insertJennifer(kysely: Kysely<Database>) {}
803
+ * async function doSomething(kysely: Kysely<Database>) {}
804
+ * async function doSomethingElse(kysely: Kysely<Database>) {}
805
+ * ```
806
+ */
807
+ releaseSavepoint(savepointName) {
808
+ assertNotCommittedOrRolledBack(this.#state);
809
+ return new Command(async () => {
810
+ await this.#props.driver.releaseSavepoint?.(this.#props.connection.connection, savepointName, this.#compileQuery);
811
+ return new ControlledTransaction({ ...this.#props });
812
+ });
813
+ }
814
+ withPlugin(plugin) {
815
+ return new ControlledTransaction({
816
+ ...this.#props,
817
+ executor: this.#props.executor.withPlugin(plugin),
818
+ });
819
+ }
820
+ withoutPlugins() {
821
+ return new ControlledTransaction({
822
+ ...this.#props,
823
+ executor: this.#props.executor.withoutPlugins(),
824
+ });
825
+ }
826
+ withSchema(schema) {
827
+ return new ControlledTransaction({
828
+ ...this.#props,
829
+ executor: this.#props.executor.withPluginAtFront(new with_schema_plugin_js_1.WithSchemaPlugin(schema)),
830
+ });
831
+ }
832
+ withTables() {
833
+ return new ControlledTransaction({ ...this.#props });
834
+ }
835
+ }
836
+ exports.ControlledTransaction = ControlledTransaction;
837
+ class Command {
838
+ #cb;
839
+ constructor(cb) {
840
+ this.#cb = cb;
841
+ }
842
+ /**
843
+ * Executes the command.
844
+ */
845
+ async execute() {
846
+ return await this.#cb();
847
+ }
848
+ }
849
+ exports.Command = Command;
850
+ function assertNotCommittedOrRolledBack(state) {
851
+ if (state.isCommitted) {
852
+ throw new Error('Transaction is already committed');
853
+ }
854
+ if (state.isRolledBack) {
855
+ throw new Error('Transaction is already rolled back');
856
+ }
857
+ }
858
+ /**
859
+ * An executor wrapper that asserts that the transaction state is not committed
860
+ * or rolled back when a query is executed.
861
+ *
862
+ * @internal
863
+ */
864
+ class NotCommittedOrRolledBackAssertingExecutor {
865
+ #executor;
866
+ #state;
867
+ constructor(executor, state) {
868
+ if (executor instanceof NotCommittedOrRolledBackAssertingExecutor) {
869
+ this.#executor = executor.#executor;
870
+ }
871
+ else {
872
+ this.#executor = executor;
873
+ }
874
+ this.#state = state;
875
+ }
876
+ get adapter() {
877
+ return this.#executor.adapter;
878
+ }
879
+ get plugins() {
880
+ return this.#executor.plugins;
881
+ }
882
+ transformQuery(node, queryId) {
883
+ return this.#executor.transformQuery(node, queryId);
884
+ }
885
+ compileQuery(node, queryId) {
886
+ return this.#executor.compileQuery(node, queryId);
887
+ }
888
+ provideConnection(consumer) {
889
+ return this.#executor.provideConnection(consumer);
890
+ }
891
+ executeQuery(compiledQuery, queryId) {
892
+ assertNotCommittedOrRolledBack(this.#state);
893
+ return this.#executor.executeQuery(compiledQuery, queryId);
894
+ }
895
+ stream(compiledQuery, chunkSize, queryId) {
896
+ assertNotCommittedOrRolledBack(this.#state);
897
+ return this.#executor.stream(compiledQuery, chunkSize, queryId);
898
+ }
899
+ withConnectionProvider(connectionProvider) {
900
+ return new NotCommittedOrRolledBackAssertingExecutor(this.#executor.withConnectionProvider(connectionProvider), this.#state);
901
+ }
902
+ withPlugin(plugin) {
903
+ return new NotCommittedOrRolledBackAssertingExecutor(this.#executor.withPlugin(plugin), this.#state);
904
+ }
905
+ withPlugins(plugins) {
906
+ return new NotCommittedOrRolledBackAssertingExecutor(this.#executor.withPlugins(plugins), this.#state);
907
+ }
908
+ withPluginAtFront(plugin) {
909
+ return new NotCommittedOrRolledBackAssertingExecutor(this.#executor.withPluginAtFront(plugin), this.#state);
910
+ }
911
+ withoutPlugins() {
912
+ return new NotCommittedOrRolledBackAssertingExecutor(this.#executor.withoutPlugins(), this.#state);
459
913
  }
460
914
  }
@@ -271,7 +271,7 @@ export interface MigratorProps {
271
271
  *
272
272
  * When false, migrations must be run in their exact alpha-numeric order.
273
273
  * This is checked against the migrations already run in the database
274
- * (`migrationTableName'). This ensures your migrations are always run in
274
+ * (`migrationTableName`). This ensures your migrations are always run in
275
275
  * the same order and is the safest option.
276
276
  *
277
277
  * When true, migrations are still run in alpha-numeric order, but
@@ -280,6 +280,21 @@ export interface MigratorProps {
280
280
  * order.
281
281
  */
282
282
  readonly allowUnorderedMigrations?: boolean;
283
+ /**
284
+ * A function that compares migration names, used when sorting migrations in
285
+ * ascending order.
286
+ *
287
+ * Default is `name0.localeCompare(name1)`.
288
+ */
289
+ readonly nameComparator?: (name0: string, name1: string) => number;
290
+ /**
291
+ * When `true`, don't run migrations in transactions even if the dialect supports transactional DDL.
292
+ *
293
+ * Default is `false`.
294
+ *
295
+ * This is useful when some migrations include queries that would fail otherwise.
296
+ */
297
+ readonly disableTransactions?: boolean;
283
298
  }
284
299
  /**
285
300
  * All migration methods ({@link Migrator.migrateTo | migrateTo},
@@ -63,6 +63,7 @@ class Migrator {
63
63
  .withPlugin(this.#schemaPlugin)
64
64
  .selectFrom(this.#migrationTable)
65
65
  .select(['name', 'timestamp'])
66
+ .$narrowType()
66
67
  .execute()
67
68
  : [];
68
69
  const migrations = await this.#resolveMigrations();
@@ -425,7 +426,7 @@ class Migrator {
425
426
  await adapter.releaseMigrationLock(db, lockOptions);
426
427
  }
427
428
  };
428
- if (adapter.supportsTransactionalDdl) {
429
+ if (adapter.supportsTransactionalDdl && !this.#props.disableTransactions) {
429
430
  return this.#props.db.transaction().execute(run);
430
431
  }
431
432
  else {
@@ -465,10 +466,19 @@ class Migrator {
465
466
  const executedMigrations = await db
466
467
  .withPlugin(this.#schemaPlugin)
467
468
  .selectFrom(this.#migrationTable)
468
- .select('name')
469
- .orderBy(['timestamp', 'name'])
469
+ .select(['name', 'timestamp'])
470
+ .$narrowType()
470
471
  .execute();
471
- return executedMigrations.map((it) => it.name);
472
+ const nameComparator = this.#props.nameComparator || ((a, b) => a.localeCompare(b));
473
+ return (executedMigrations
474
+ // https://github.com/kysely-org/kysely/issues/843
475
+ .sort((a, b) => {
476
+ if (a.timestamp === b.timestamp) {
477
+ return nameComparator(a.name, b.name);
478
+ }
479
+ return (new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
480
+ })
481
+ .map((it) => it.name));
472
482
  }
473
483
  #ensureNoMissingMigrations(migrations, executedMigrations) {
474
484
  // Ensure all executed migrations exist in the `migrations` list.
@@ -9,6 +9,7 @@ export interface AggregateFunctionNode extends OperationNode {
9
9
  readonly aggregated: readonly OperationNode[];
10
10
  readonly distinct?: boolean;
11
11
  readonly orderBy?: OrderByNode;
12
+ readonly withinGroup?: OrderByNode;
12
13
  readonly filter?: WhereNode;
13
14
  readonly over?: OverNode;
14
15
  }
@@ -19,7 +20,7 @@ export declare const AggregateFunctionNode: Readonly<{
19
20
  is(node: OperationNode): node is AggregateFunctionNode;
20
21
  create(aggregateFunction: string, aggregated?: readonly OperationNode[]): AggregateFunctionNode;
21
22
  cloneWithDistinct(aggregateFunctionNode: AggregateFunctionNode): AggregateFunctionNode;
22
- cloneWithOrderBy(aggregateFunctionNode: AggregateFunctionNode, orderItems: ReadonlyArray<OrderByItemNode>): AggregateFunctionNode;
23
+ cloneWithOrderBy(aggregateFunctionNode: AggregateFunctionNode, orderItems: ReadonlyArray<OrderByItemNode>, withinGroup?: boolean): AggregateFunctionNode;
23
24
  cloneWithFilter(aggregateFunctionNode: AggregateFunctionNode, filter: OperationNode): AggregateFunctionNode;
24
25
  cloneWithOrFilter(aggregateFunctionNode: AggregateFunctionNode, filter: OperationNode): AggregateFunctionNode;
25
26
  cloneWithOver(aggregateFunctionNode: AggregateFunctionNode, over?: OverNode): AggregateFunctionNode;
@@ -24,11 +24,12 @@ exports.AggregateFunctionNode = (0, object_utils_js_1.freeze)({
24
24
  distinct: true,
25
25
  });
26
26
  },
27
- cloneWithOrderBy(aggregateFunctionNode, orderItems) {
27
+ cloneWithOrderBy(aggregateFunctionNode, orderItems, withinGroup = false) {
28
+ const prop = withinGroup ? 'withinGroup' : 'orderBy';
28
29
  return (0, object_utils_js_1.freeze)({
29
30
  ...aggregateFunctionNode,
30
- orderBy: aggregateFunctionNode.orderBy
31
- ? order_by_node_js_1.OrderByNode.cloneWithItems(aggregateFunctionNode.orderBy, orderItems)
31
+ [prop]: aggregateFunctionNode[prop]
32
+ ? order_by_node_js_1.OrderByNode.cloneWithItems(aggregateFunctionNode[prop], orderItems)
32
33
  : order_by_node_js_1.OrderByNode.create(orderItems),
33
34
  });
34
35
  },
@@ -10,7 +10,8 @@ import { DropConstraintNode } from './drop-constraint-node.js';
10
10
  import { ModifyColumnNode } from './modify-column-node.js';
11
11
  import { DropIndexNode } from './drop-index-node.js';
12
12
  import { AddIndexNode } from './add-index-node.js';
13
- export type AlterTableNodeTableProps = Pick<AlterTableNode, 'renameTo' | 'setSchema' | 'addConstraint' | 'dropConstraint' | 'addIndex' | 'dropIndex'>;
13
+ import { RenameConstraintNode } from './rename-constraint-node.js';
14
+ export type AlterTableNodeTableProps = Pick<AlterTableNode, 'renameTo' | 'setSchema' | 'addConstraint' | 'dropConstraint' | 'addIndex' | 'dropIndex' | 'renameConstraint'>;
14
15
  export type AlterTableColumnAlterationNode = RenameColumnNode | AddColumnNode | DropColumnNode | AlterColumnNode | ModifyColumnNode;
15
16
  export interface AlterTableNode extends OperationNode {
16
17
  readonly kind: 'AlterTableNode';
@@ -20,6 +21,7 @@ export interface AlterTableNode extends OperationNode {
20
21
  readonly columnAlterations?: ReadonlyArray<AlterTableColumnAlterationNode>;
21
22
  readonly addConstraint?: AddConstraintNode;
22
23
  readonly dropConstraint?: DropConstraintNode;
24
+ readonly renameConstraint?: RenameConstraintNode;
23
25
  readonly addIndex?: AddIndexNode;
24
26
  readonly dropIndex?: DropIndexNode;
25
27
  }
@@ -0,0 +1,13 @@
1
+ import { IdentifierNode } from './identifier-node.js';
2
+ import { OperationNode } from './operation-node.js';
3
+ export interface CollateNode extends OperationNode {
4
+ readonly kind: 'CollateNode';
5
+ readonly collation: IdentifierNode;
6
+ }
7
+ /**
8
+ * @internal
9
+ */
10
+ export declare const CollateNode: {
11
+ is(node: OperationNode): node is CollateNode;
12
+ create(collation: string): CollateNode;
13
+ };