kysely 0.27.3 → 0.27.5

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 (301) hide show
  1. package/.renovaterc.json +3 -0
  2. package/CONTRIBUTING.md +2 -2
  3. package/README.md +7 -7
  4. package/deno.check.d.ts +86 -0
  5. package/deno.check.json +21 -0
  6. package/dist/cjs/dialect/dialect-adapter-base.d.ts +13 -3
  7. package/dist/cjs/dialect/dialect-adapter-base.js +4 -1
  8. package/dist/cjs/dialect/dialect-adapter.d.ts +16 -2
  9. package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +12 -7
  10. package/dist/cjs/dialect/mssql/mssql-adapter.js +2 -4
  11. package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +83 -55
  12. package/dist/cjs/dialect/mssql/mssql-driver.d.ts +1 -0
  13. package/dist/cjs/dialect/mssql/mssql-driver.js +114 -48
  14. package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +11 -2
  15. package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +4 -0
  16. package/dist/cjs/dialect/mysql/mysql-driver.js +3 -0
  17. package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +11 -2
  18. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +10 -3
  19. package/dist/cjs/dialect/postgres/postgres-driver.js +3 -0
  20. package/dist/cjs/dialect/postgres/postgres-introspector.js +5 -1
  21. package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +11 -2
  22. package/dist/cjs/driver/database-connection.d.ts +3 -1
  23. package/dist/cjs/driver/dummy-driver.d.ts +13 -12
  24. package/dist/cjs/driver/dummy-driver.js +13 -12
  25. package/dist/cjs/dynamic/dynamic-reference-builder.js +2 -2
  26. package/dist/cjs/dynamic/dynamic.d.ts +7 -7
  27. package/dist/cjs/dynamic/dynamic.js +7 -7
  28. package/dist/cjs/expression/expression-builder.d.ts +153 -62
  29. package/dist/cjs/expression/expression-builder.js +2 -3
  30. package/dist/cjs/expression/expression-wrapper.d.ts +92 -23
  31. package/dist/cjs/expression/expression.d.ts +40 -5
  32. package/dist/cjs/expression/expression.js +2 -3
  33. package/dist/cjs/helpers/mssql.d.ts +74 -14
  34. package/dist/cjs/helpers/mssql.js +77 -18
  35. package/dist/cjs/helpers/mysql.d.ts +17 -13
  36. package/dist/cjs/helpers/mysql.js +20 -17
  37. package/dist/cjs/helpers/postgres.d.ts +11 -8
  38. package/dist/cjs/helpers/postgres.js +14 -12
  39. package/dist/cjs/helpers/sqlite.d.ts +41 -16
  40. package/dist/cjs/helpers/sqlite.js +44 -20
  41. package/dist/cjs/index.d.ts +28 -21
  42. package/dist/cjs/index.js +28 -21
  43. package/dist/cjs/kysely.d.ts +100 -42
  44. package/dist/cjs/kysely.js +63 -39
  45. package/dist/cjs/migration/file-migration-provider.d.ts +2 -2
  46. package/dist/cjs/migration/file-migration-provider.js +2 -2
  47. package/dist/cjs/migration/migrator.d.ts +82 -14
  48. package/dist/cjs/migration/migrator.js +82 -14
  49. package/dist/cjs/operation-node/aggregate-function-node.d.ts +4 -0
  50. package/dist/cjs/operation-node/aggregate-function-node.js +9 -0
  51. package/dist/cjs/operation-node/alter-column-node.d.ts +1 -1
  52. package/dist/cjs/operation-node/case-node.d.ts +1 -1
  53. package/dist/cjs/operation-node/column-definition-node.d.ts +1 -0
  54. package/dist/cjs/operation-node/data-type-node.d.ts +2 -2
  55. package/dist/cjs/operation-node/data-type-node.js +17 -3
  56. package/dist/cjs/operation-node/delete-query-node.d.ts +3 -0
  57. package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +4 -4
  58. package/dist/cjs/operation-node/having-node.d.ts +1 -1
  59. package/dist/cjs/operation-node/insert-query-node.d.ts +3 -0
  60. package/dist/cjs/operation-node/merge-query-node.d.ts +3 -0
  61. package/dist/cjs/operation-node/on-node.d.ts +1 -1
  62. package/dist/cjs/operation-node/operation-node-source.js +1 -2
  63. package/dist/cjs/operation-node/operation-node-transformer.d.ts +11 -3
  64. package/dist/cjs/operation-node/operation-node-transformer.js +26 -3
  65. package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
  66. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  67. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  68. package/dist/cjs/operation-node/operator-node.d.ts +3 -3
  69. package/dist/cjs/operation-node/operator-node.js +8 -6
  70. package/dist/cjs/operation-node/output-node.d.ts +13 -0
  71. package/dist/cjs/operation-node/output-node.js +26 -0
  72. package/dist/cjs/operation-node/query-node.d.ts +15 -6
  73. package/dist/cjs/operation-node/query-node.js +17 -0
  74. package/dist/cjs/operation-node/select-query-node.d.ts +1 -1
  75. package/dist/cjs/operation-node/select-query-node.js +6 -8
  76. package/dist/cjs/operation-node/update-query-node.d.ts +3 -0
  77. package/dist/cjs/operation-node/where-node.d.ts +1 -1
  78. package/dist/cjs/parser/binary-operation-parser.js +5 -6
  79. package/dist/cjs/parser/data-type-parser.js +1 -2
  80. package/dist/cjs/parser/default-value-parser.js +1 -2
  81. package/dist/cjs/parser/expression-parser.js +3 -4
  82. package/dist/cjs/parser/fetch-parser.js +1 -2
  83. package/dist/cjs/parser/group-by-parser.js +1 -2
  84. package/dist/cjs/parser/identifier-parser.js +1 -2
  85. package/dist/cjs/parser/insert-values-parser.js +1 -2
  86. package/dist/cjs/parser/join-parser.js +1 -2
  87. package/dist/cjs/parser/merge-parser.js +2 -3
  88. package/dist/cjs/parser/on-commit-action-parse.js +1 -2
  89. package/dist/cjs/parser/on-modify-action-parser.js +1 -2
  90. package/dist/cjs/parser/order-by-parser.js +3 -4
  91. package/dist/cjs/parser/parse-utils.js +4 -5
  92. package/dist/cjs/parser/partition-by-parser.js +1 -2
  93. package/dist/cjs/parser/reference-parser.js +8 -9
  94. package/dist/cjs/parser/returning-parser.d.ts +4 -3
  95. package/dist/cjs/parser/select-parser.js +2 -3
  96. package/dist/cjs/parser/set-operation-parser.js +1 -2
  97. package/dist/cjs/parser/table-parser.js +4 -5
  98. package/dist/cjs/parser/top-parser.js +1 -2
  99. package/dist/cjs/parser/unary-operation-parser.js +3 -4
  100. package/dist/cjs/parser/update-set-parser.js +2 -3
  101. package/dist/cjs/parser/value-parser.js +4 -5
  102. package/dist/cjs/parser/with-parser.js +1 -2
  103. package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +54 -27
  104. package/dist/cjs/plugin/camel-case/camel-case-plugin.js +26 -21
  105. package/dist/cjs/plugin/camel-case/camel-case.js +2 -3
  106. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +29 -7
  107. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
  108. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.js +2 -2
  109. package/dist/cjs/plugin/immediate-value/immediate-value-plugin.d.ts +28 -6
  110. package/dist/cjs/plugin/kysely-plugin.d.ts +28 -6
  111. package/dist/cjs/plugin/noop-plugin.d.ts +28 -6
  112. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +80 -9
  113. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +53 -14
  114. package/dist/cjs/plugin/with-schema/with-schema-plugin.d.ts +28 -6
  115. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +43 -1
  116. package/dist/cjs/query-builder/aggregate-function-builder.js +30 -0
  117. package/dist/cjs/query-builder/delete-query-builder.d.ts +219 -43
  118. package/dist/cjs/query-builder/delete-query-builder.js +95 -31
  119. package/dist/cjs/query-builder/function-module.d.ts +40 -93
  120. package/dist/cjs/query-builder/function-module.js +1 -2
  121. package/dist/cjs/query-builder/insert-query-builder.d.ts +326 -67
  122. package/dist/cjs/query-builder/insert-query-builder.js +212 -61
  123. package/dist/cjs/query-builder/insert-result.d.ts +10 -5
  124. package/dist/cjs/query-builder/insert-result.js +10 -5
  125. package/dist/cjs/query-builder/json-path-builder.d.ts +33 -9
  126. package/dist/cjs/query-builder/json-path-builder.js +8 -5
  127. package/dist/cjs/query-builder/merge-query-builder.d.ts +312 -10
  128. package/dist/cjs/query-builder/merge-query-builder.js +98 -7
  129. package/dist/cjs/query-builder/no-result-error.js +2 -2
  130. package/dist/cjs/query-builder/on-conflict-builder.d.ts +53 -20
  131. package/dist/cjs/query-builder/on-conflict-builder.js +41 -16
  132. package/dist/cjs/query-builder/output-interface.d.ts +138 -0
  133. package/dist/cjs/query-builder/output-interface.js +2 -0
  134. package/dist/cjs/query-builder/returning-interface.d.ts +7 -5
  135. package/dist/cjs/query-builder/select-query-builder-expression.d.ts +8 -0
  136. package/dist/cjs/query-builder/select-query-builder.d.ts +370 -73
  137. package/dist/cjs/query-builder/select-query-builder.js +14 -9
  138. package/dist/cjs/query-builder/update-query-builder.d.ts +225 -31
  139. package/dist/cjs/query-builder/update-query-builder.js +96 -17
  140. package/dist/cjs/query-builder/update-result.d.ts +9 -0
  141. package/dist/cjs/query-builder/update-result.js +9 -0
  142. package/dist/cjs/query-builder/where-interface.d.ts +6 -2
  143. package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -0
  144. package/dist/cjs/query-compiler/default-query-compiler.js +45 -1
  145. package/dist/cjs/query-creator.d.ts +122 -21
  146. package/dist/cjs/query-creator.js +56 -3
  147. package/dist/cjs/raw-builder/raw-builder.d.ts +29 -7
  148. package/dist/cjs/raw-builder/raw-builder.js +1 -2
  149. package/dist/cjs/raw-builder/sql.d.ts +31 -12
  150. package/dist/cjs/schema/alter-column-builder.d.ts +17 -3
  151. package/dist/cjs/schema/alter-column-builder.js +20 -3
  152. package/dist/cjs/schema/alter-table-add-index-builder.d.ts +44 -10
  153. package/dist/cjs/schema/alter-table-add-index-builder.js +27 -10
  154. package/dist/cjs/schema/alter-table-builder.js +1 -2
  155. package/dist/cjs/schema/column-definition-builder.d.ts +286 -24
  156. package/dist/cjs/schema/column-definition-builder.js +288 -24
  157. package/dist/cjs/schema/create-table-builder.d.ts +86 -33
  158. package/dist/cjs/schema/create-table-builder.js +86 -33
  159. package/dist/cjs/util/assert.js +2 -3
  160. package/dist/cjs/util/column-type.d.ts +5 -9
  161. package/dist/cjs/util/compilable.js +1 -2
  162. package/dist/cjs/util/json-object-args.js +1 -2
  163. package/dist/cjs/util/log-once.js +1 -2
  164. package/dist/cjs/util/object-utils.js +38 -26
  165. package/dist/cjs/util/performance-now.js +1 -2
  166. package/dist/cjs/util/prevent-await.js +1 -2
  167. package/dist/cjs/util/query-id.js +1 -2
  168. package/dist/cjs/util/random-string.js +1 -2
  169. package/dist/cjs/util/require-all-props.d.ts +4 -2
  170. package/dist/cjs/util/require-all-props.js +5 -4
  171. package/dist/cjs/util/stack-trace-utils.js +1 -2
  172. package/dist/cjs/util/streamable.d.ts +1 -1
  173. package/dist/cjs/util/type-utils.d.ts +4 -2
  174. package/dist/esm/dialect/dialect-adapter-base.d.ts +13 -3
  175. package/dist/esm/dialect/dialect-adapter-base.js +4 -1
  176. package/dist/esm/dialect/dialect-adapter.d.ts +16 -2
  177. package/dist/esm/dialect/mssql/mssql-adapter.d.ts +12 -7
  178. package/dist/esm/dialect/mssql/mssql-adapter.js +2 -4
  179. package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +83 -55
  180. package/dist/esm/dialect/mssql/mssql-driver.d.ts +1 -0
  181. package/dist/esm/dialect/mssql/mssql-driver.js +114 -48
  182. package/dist/esm/dialect/mysql/mysql-adapter.d.ts +11 -2
  183. package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +4 -0
  184. package/dist/esm/dialect/mysql/mysql-driver.js +3 -0
  185. package/dist/esm/dialect/postgres/postgres-adapter.d.ts +11 -2
  186. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +10 -3
  187. package/dist/esm/dialect/postgres/postgres-driver.js +3 -0
  188. package/dist/esm/dialect/postgres/postgres-introspector.js +5 -1
  189. package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +11 -2
  190. package/dist/esm/driver/database-connection.d.ts +3 -1
  191. package/dist/esm/driver/dummy-driver.d.ts +13 -12
  192. package/dist/esm/driver/dummy-driver.js +13 -12
  193. package/dist/esm/dynamic/dynamic.d.ts +7 -7
  194. package/dist/esm/dynamic/dynamic.js +7 -7
  195. package/dist/esm/expression/expression-builder.d.ts +153 -62
  196. package/dist/esm/expression/expression-wrapper.d.ts +92 -23
  197. package/dist/esm/expression/expression.d.ts +40 -5
  198. package/dist/esm/helpers/mssql.d.ts +74 -14
  199. package/dist/esm/helpers/mssql.js +74 -14
  200. package/dist/esm/helpers/mysql.d.ts +17 -13
  201. package/dist/esm/helpers/mysql.js +17 -13
  202. package/dist/esm/helpers/postgres.d.ts +11 -8
  203. package/dist/esm/helpers/postgres.js +11 -8
  204. package/dist/esm/helpers/sqlite.d.ts +41 -16
  205. package/dist/esm/helpers/sqlite.js +41 -16
  206. package/dist/esm/index.d.ts +28 -21
  207. package/dist/esm/index.js +28 -21
  208. package/dist/esm/kysely.d.ts +100 -42
  209. package/dist/esm/kysely.js +61 -37
  210. package/dist/esm/migration/file-migration-provider.d.ts +2 -2
  211. package/dist/esm/migration/file-migration-provider.js +2 -2
  212. package/dist/esm/migration/migrator.d.ts +82 -14
  213. package/dist/esm/migration/migrator.js +82 -14
  214. package/dist/esm/operation-node/aggregate-function-node.d.ts +4 -0
  215. package/dist/esm/operation-node/aggregate-function-node.js +9 -0
  216. package/dist/esm/operation-node/alter-column-node.d.ts +1 -1
  217. package/dist/esm/operation-node/case-node.d.ts +1 -1
  218. package/dist/esm/operation-node/column-definition-node.d.ts +1 -0
  219. package/dist/esm/operation-node/data-type-node.d.ts +2 -2
  220. package/dist/esm/operation-node/data-type-node.js +15 -1
  221. package/dist/esm/operation-node/delete-query-node.d.ts +3 -0
  222. package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +4 -4
  223. package/dist/esm/operation-node/having-node.d.ts +1 -1
  224. package/dist/esm/operation-node/insert-query-node.d.ts +3 -0
  225. package/dist/esm/operation-node/merge-query-node.d.ts +3 -0
  226. package/dist/esm/operation-node/on-node.d.ts +1 -1
  227. package/dist/esm/operation-node/operation-node-transformer.d.ts +11 -3
  228. package/dist/esm/operation-node/operation-node-transformer.js +26 -3
  229. package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
  230. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  231. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  232. package/dist/esm/operation-node/operator-node.d.ts +3 -3
  233. package/dist/esm/operation-node/operator-node.js +2 -0
  234. package/dist/esm/operation-node/output-node.d.ts +13 -0
  235. package/dist/esm/operation-node/output-node.js +24 -0
  236. package/dist/esm/operation-node/query-node.d.ts +15 -6
  237. package/dist/esm/operation-node/query-node.js +17 -0
  238. package/dist/esm/operation-node/select-query-node.d.ts +1 -1
  239. package/dist/esm/operation-node/select-query-node.js +6 -8
  240. package/dist/esm/operation-node/update-query-node.d.ts +3 -0
  241. package/dist/esm/operation-node/where-node.d.ts +1 -1
  242. package/dist/esm/parser/returning-parser.d.ts +4 -3
  243. package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +54 -27
  244. package/dist/esm/plugin/camel-case/camel-case-plugin.js +26 -21
  245. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +29 -7
  246. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
  247. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.js +2 -2
  248. package/dist/esm/plugin/immediate-value/immediate-value-plugin.d.ts +28 -6
  249. package/dist/esm/plugin/kysely-plugin.d.ts +28 -6
  250. package/dist/esm/plugin/noop-plugin.d.ts +28 -6
  251. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +80 -9
  252. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +53 -14
  253. package/dist/esm/plugin/with-schema/with-schema-plugin.d.ts +28 -6
  254. package/dist/esm/query-builder/aggregate-function-builder.d.ts +43 -1
  255. package/dist/esm/query-builder/aggregate-function-builder.js +30 -0
  256. package/dist/esm/query-builder/delete-query-builder.d.ts +219 -43
  257. package/dist/esm/query-builder/delete-query-builder.js +95 -31
  258. package/dist/esm/query-builder/function-module.d.ts +40 -93
  259. package/dist/esm/query-builder/insert-query-builder.d.ts +326 -67
  260. package/dist/esm/query-builder/insert-query-builder.js +212 -61
  261. package/dist/esm/query-builder/insert-result.d.ts +10 -5
  262. package/dist/esm/query-builder/insert-result.js +10 -5
  263. package/dist/esm/query-builder/json-path-builder.d.ts +33 -9
  264. package/dist/esm/query-builder/json-path-builder.js +8 -5
  265. package/dist/esm/query-builder/merge-query-builder.d.ts +312 -10
  266. package/dist/esm/query-builder/merge-query-builder.js +98 -7
  267. package/dist/esm/query-builder/on-conflict-builder.d.ts +53 -20
  268. package/dist/esm/query-builder/on-conflict-builder.js +41 -16
  269. package/dist/esm/query-builder/output-interface.d.ts +138 -0
  270. package/dist/esm/query-builder/output-interface.js +2 -0
  271. package/dist/esm/query-builder/returning-interface.d.ts +7 -5
  272. package/dist/esm/query-builder/select-query-builder-expression.d.ts +8 -0
  273. package/dist/esm/query-builder/select-query-builder.d.ts +370 -73
  274. package/dist/esm/query-builder/select-query-builder.js +13 -7
  275. package/dist/esm/query-builder/update-query-builder.d.ts +225 -31
  276. package/dist/esm/query-builder/update-query-builder.js +96 -17
  277. package/dist/esm/query-builder/update-result.d.ts +9 -0
  278. package/dist/esm/query-builder/update-result.js +9 -0
  279. package/dist/esm/query-builder/where-interface.d.ts +6 -2
  280. package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -0
  281. package/dist/esm/query-compiler/default-query-compiler.js +45 -1
  282. package/dist/esm/query-creator.d.ts +122 -21
  283. package/dist/esm/query-creator.js +56 -3
  284. package/dist/esm/raw-builder/raw-builder.d.ts +29 -7
  285. package/dist/esm/raw-builder/sql.d.ts +31 -12
  286. package/dist/esm/schema/alter-column-builder.d.ts +17 -3
  287. package/dist/esm/schema/alter-column-builder.js +20 -3
  288. package/dist/esm/schema/alter-table-add-index-builder.d.ts +44 -10
  289. package/dist/esm/schema/alter-table-add-index-builder.js +27 -10
  290. package/dist/esm/schema/alter-table-builder.js +1 -2
  291. package/dist/esm/schema/column-definition-builder.d.ts +286 -24
  292. package/dist/esm/schema/column-definition-builder.js +288 -24
  293. package/dist/esm/schema/create-table-builder.d.ts +86 -33
  294. package/dist/esm/schema/create-table-builder.js +86 -33
  295. package/dist/esm/util/column-type.d.ts +5 -9
  296. package/dist/esm/util/object-utils.js +18 -5
  297. package/dist/esm/util/require-all-props.d.ts +4 -2
  298. package/dist/esm/util/require-all-props.js +4 -2
  299. package/dist/esm/util/streamable.d.ts +1 -1
  300. package/dist/esm/util/type-utils.d.ts +4 -2
  301. package/package.json +30 -24
@@ -11,24 +11,22 @@ export class MssqlDriver {
11
11
  #pool;
12
12
  constructor(config) {
13
13
  this.#config = freeze({ ...config });
14
- this.#pool = new this.#config.tarn.Pool({
15
- ...this.#config.tarn.options,
14
+ const { tarn, tedious } = this.#config;
15
+ const { validateConnections, ...poolOptions } = tarn.options;
16
+ this.#pool = new tarn.Pool({
17
+ ...poolOptions,
16
18
  create: async () => {
17
- const connection = await this.#config.tedious.connectionFactory();
18
- await new Promise((resolve, reject) => connection.connect((error) => {
19
- if (error)
20
- reject(error);
21
- else
22
- resolve(undefined);
23
- }));
24
- return new MssqlConnection(connection, this.#config.tedious);
19
+ const connection = await tedious.connectionFactory();
20
+ return await new MssqlConnection(connection, tedious).connect();
25
21
  },
26
22
  destroy: async (connection) => {
27
23
  await connection[PRIVATE_DESTROY_METHOD]();
28
24
  },
29
25
  // @ts-ignore `tarn` accepts a function that returns a promise here, but
30
26
  // the types are not aligned and it type errors.
31
- validate: (connection) => connection.validate(),
27
+ validate: validateConnections === false
28
+ ? undefined
29
+ : (connection) => connection.validate(),
32
30
  });
33
31
  }
34
32
  async init() {
@@ -60,6 +58,10 @@ class MssqlConnection {
60
58
  constructor(connection, tedious) {
61
59
  this.#connection = connection;
62
60
  this.#tedious = tedious;
61
+ this.#connection.on('error', console.error);
62
+ this.#connection.once('end', () => {
63
+ this.#connection.off('error', console.error);
64
+ });
63
65
  }
64
66
  async beginTransaction(settings) {
65
67
  const { isolationLevel } = settings;
@@ -80,10 +82,28 @@ class MssqlConnection {
80
82
  resolve(undefined);
81
83
  }));
82
84
  }
85
+ async connect() {
86
+ await new Promise((resolve, reject) => {
87
+ this.#connection.connect((error) => {
88
+ if (error) {
89
+ console.error(error);
90
+ reject(error);
91
+ }
92
+ else {
93
+ resolve(undefined);
94
+ }
95
+ });
96
+ });
97
+ return this;
98
+ }
83
99
  async executeQuery(compiledQuery) {
84
100
  try {
85
101
  const deferred = new Deferred();
86
- const request = new MssqlRequest(this.#tedious, compiledQuery, deferred);
102
+ const request = new MssqlRequest({
103
+ compiledQuery,
104
+ tedious: this.#tedious,
105
+ onDone: deferred,
106
+ });
87
107
  this.#connection.execSql(request.request);
88
108
  const { rowCount, rows } = await deferred.promise;
89
109
  return {
@@ -107,11 +127,15 @@ class MssqlConnection {
107
127
  if (!Number.isInteger(chunkSize) || chunkSize <= 0) {
108
128
  throw new Error('chunkSize must be a positive integer');
109
129
  }
110
- const request = new MssqlRequest(this.#tedious, compiledQuery);
130
+ const request = new MssqlRequest({
131
+ compiledQuery,
132
+ streamChunkSize: chunkSize,
133
+ tedious: this.#tedious,
134
+ });
111
135
  this.#connection.execSql(request.request);
112
136
  try {
113
137
  while (true) {
114
- const rows = await request.readChunk(chunkSize);
138
+ const rows = await request.readChunk();
115
139
  if (rows.length === 0) {
116
140
  break;
117
141
  }
@@ -122,13 +146,17 @@ class MssqlConnection {
122
146
  }
123
147
  }
124
148
  finally {
125
- this.#connection.cancel();
149
+ await this.#cancelRequest(request);
126
150
  }
127
151
  }
128
152
  async validate() {
129
153
  try {
130
154
  const deferred = new Deferred();
131
- const request = new MssqlRequest(this.#tedious, CompiledQuery.raw('select 1'), deferred);
155
+ const request = new MssqlRequest({
156
+ compiledQuery: CompiledQuery.raw('select 1'),
157
+ onDone: deferred,
158
+ tedious: this.#tedious,
159
+ });
132
160
  this.#connection.execSql(request.request);
133
161
  await deferred.promise;
134
162
  return true;
@@ -152,16 +180,29 @@ class MssqlConnection {
152
180
  }
153
181
  return tediousIsolationLevel;
154
182
  }
155
- [PRIVATE_RELEASE_METHOD]() {
156
- return new Promise((resolve, reject) => {
157
- this.#connection.reset((error) => {
158
- if (error)
159
- reject(error);
160
- else
161
- resolve(undefined);
162
- });
183
+ #cancelRequest(request) {
184
+ return new Promise((resolve) => {
185
+ request.request.once('requestCompleted', resolve);
186
+ const wasCanceled = this.#connection.cancel();
187
+ if (!wasCanceled) {
188
+ request.request.off('requestCompleted', resolve);
189
+ resolve(undefined);
190
+ }
163
191
  });
164
192
  }
193
+ async [PRIVATE_RELEASE_METHOD]() {
194
+ // TODO: flip this to `if (!this.#tedious.resetConnectionOnRelease) {}` in a future PR.
195
+ if (this.#tedious.resetConnectionOnRelease !== false) {
196
+ await new Promise((resolve, reject) => {
197
+ this.#connection.reset((error) => {
198
+ if (error)
199
+ reject(error);
200
+ else
201
+ resolve(undefined);
202
+ });
203
+ });
204
+ }
205
+ }
165
206
  [PRIVATE_DESTROY_METHOD]() {
166
207
  return new Promise((resolve) => {
167
208
  this.#connection.once('end', () => {
@@ -174,42 +215,62 @@ class MssqlConnection {
174
215
  class MssqlRequest {
175
216
  #request;
176
217
  #rows;
218
+ #streamChunkSize;
219
+ #subscribers;
177
220
  #tedious;
178
- #completed;
179
221
  #error;
180
222
  #rowCount;
181
- constructor(tedious, compiledQuery, onDone) {
182
- this.#completed = false;
223
+ constructor(props) {
224
+ const { compiledQuery, onDone, streamChunkSize, tedious } = props;
183
225
  this.#rows = [];
226
+ this.#streamChunkSize = streamChunkSize;
227
+ this.#subscribers = {};
184
228
  this.#tedious = tedious;
185
- const { parameters, sql } = compiledQuery;
186
- this.#request = new this.#tedious.Request(sql, (err, rowCount) => {
229
+ if (onDone) {
230
+ const subscriptionKey = 'onDone';
231
+ this.#subscribers[subscriptionKey] = (event, error) => {
232
+ if (event === 'chunkReady') {
233
+ return;
234
+ }
235
+ delete this.#subscribers[subscriptionKey];
236
+ if (event === 'error') {
237
+ onDone.reject(error);
238
+ }
239
+ else {
240
+ onDone.resolve({
241
+ rowCount: this.#rowCount,
242
+ rows: this.#rows,
243
+ });
244
+ }
245
+ };
246
+ }
247
+ this.#request = new this.#tedious.Request(compiledQuery.sql, (err, rowCount) => {
187
248
  if (err) {
188
- this.#error = err instanceof AggregateError ? err.errors : err;
189
- onDone?.reject(this.#error);
249
+ Object.values(this.#subscribers).forEach((subscriber) => subscriber('error', err instanceof AggregateError ? err.errors : err));
190
250
  }
191
251
  else {
192
252
  this.#rowCount = rowCount;
193
253
  }
194
254
  });
195
- this.#addParametersToRequest(parameters);
196
- this.#attachListeners(onDone);
255
+ this.#addParametersToRequest(compiledQuery.parameters);
256
+ this.#attachListeners();
197
257
  }
198
258
  get request() {
199
259
  return this.#request;
200
260
  }
201
- readChunk(chunkSize) {
261
+ readChunk() {
262
+ const subscriptionKey = this.readChunk.name;
202
263
  return new Promise((resolve, reject) => {
203
- const interval = setInterval(() => {
204
- if (this.#error) {
205
- clearInterval(interval);
206
- reject(this.#error);
264
+ this.#subscribers[subscriptionKey] = (event, error) => {
265
+ delete this.#subscribers[subscriptionKey];
266
+ if (event === 'error') {
267
+ reject(error);
207
268
  }
208
- else if (this.#completed || this.#rows.length >= chunkSize) {
209
- clearInterval(interval);
210
- resolve(this.#rows.splice(0, chunkSize));
269
+ else {
270
+ resolve(this.#rows.splice(0, this.#streamChunkSize));
211
271
  }
212
- }, 0);
272
+ };
273
+ this.#request.resume();
213
274
  });
214
275
  }
215
276
  #addParametersToRequest(parameters) {
@@ -218,22 +279,27 @@ class MssqlRequest {
218
279
  this.#request.addParameter(String(i + 1), this.#getTediousDataType(parameter), parameter);
219
280
  }
220
281
  }
221
- #attachListeners(onDone) {
282
+ #attachListeners() {
283
+ const pauseAndEmitChunkReady = this.#streamChunkSize
284
+ ? () => {
285
+ if (this.#streamChunkSize <= this.#rows.length) {
286
+ this.#request.pause();
287
+ Object.values(this.#subscribers).forEach((subscriber) => subscriber('chunkReady'));
288
+ }
289
+ }
290
+ : () => { };
222
291
  const rowListener = (columns) => {
223
292
  const row = {};
224
293
  for (const column of columns) {
225
294
  row[column.metadata.colName] = column.value;
226
295
  }
227
296
  this.#rows.push(row);
297
+ pauseAndEmitChunkReady();
228
298
  };
229
299
  this.#request.on('row', rowListener);
230
300
  this.#request.once('requestCompleted', () => {
231
- this.#completed = true;
301
+ Object.values(this.#subscribers).forEach((subscriber) => subscriber('completed'));
232
302
  this.#request.off('row', rowListener);
233
- onDone?.resolve({
234
- rowCount: this.#rowCount,
235
- rows: this.#rows,
236
- });
237
303
  });
238
304
  }
239
305
  #getTediousDataType(value) {
@@ -33,8 +33,13 @@ export declare class MysqlAdapter extends DialectAdapterBase {
33
33
  * have explicit locks but supports `FOR UPDATE` row locks and transactional DDL:
34
34
  *
35
35
  * ```ts
36
- * {
37
- * async acquireMigrationLock(db, options): Promise<void> {
36
+ * import { DialectAdapterBase, type MigrationLockOptions, Kysely } from 'kysely'
37
+ *
38
+ * export class MyAdapter extends DialectAdapterBase {
39
+ * override async acquireMigrationLock(
40
+ * db: Kysely<any>,
41
+ * options: MigrationLockOptions
42
+ * ): Promise<void> {
38
43
  * const queryDb = options.lockTableSchema
39
44
  * ? db.withSchema(options.lockTableSchema)
40
45
  * : db
@@ -50,6 +55,10 @@ export declare class MysqlAdapter extends DialectAdapterBase {
50
55
  * .forUpdate()
51
56
  * .execute()
52
57
  * }
58
+ *
59
+ * override async releaseMigrationLock() {
60
+ * // noop
61
+ * }
53
62
  * }
54
63
  * ```
55
64
  *
@@ -17,6 +17,10 @@ export interface MysqlDialectConfig {
17
17
  * Called once for each created connection.
18
18
  */
19
19
  onCreateConnection?: (connection: DatabaseConnection) => Promise<void>;
20
+ /**
21
+ * Called every time a connection is acquired from the connection pool.
22
+ */
23
+ onReserveConnection?: (connection: DatabaseConnection) => Promise<void>;
20
24
  }
21
25
  /**
22
26
  * This interface is the subset of mysql2 driver's `Pool` class that
@@ -28,6 +28,9 @@ export class MysqlDriver {
28
28
  await this.#config.onCreateConnection(connection);
29
29
  }
30
30
  }
31
+ if (this.#config?.onReserveConnection) {
32
+ await this.#config.onReserveConnection(connection);
33
+ }
31
34
  return connection;
32
35
  }
33
36
  async #acquireConnection() {
@@ -33,8 +33,13 @@ export declare class PostgresAdapter extends DialectAdapterBase {
33
33
  * have explicit locks but supports `FOR UPDATE` row locks and transactional DDL:
34
34
  *
35
35
  * ```ts
36
- * {
37
- * async acquireMigrationLock(db, options): Promise<void> {
36
+ * import { DialectAdapterBase, type MigrationLockOptions, Kysely } from 'kysely'
37
+ *
38
+ * export class MyAdapter extends DialectAdapterBase {
39
+ * override async acquireMigrationLock(
40
+ * db: Kysely<any>,
41
+ * options: MigrationLockOptions
42
+ * ): Promise<void> {
38
43
  * const queryDb = options.lockTableSchema
39
44
  * ? db.withSchema(options.lockTableSchema)
40
45
  * : db
@@ -50,6 +55,10 @@ export declare class PostgresAdapter extends DialectAdapterBase {
50
55
  * .forUpdate()
51
56
  * .execute()
52
57
  * }
58
+ *
59
+ * override async releaseMigrationLock() {
60
+ * // noop
61
+ * }
53
62
  * }
54
63
  * ```
55
64
  *
@@ -13,13 +13,16 @@ export interface PostgresDialectConfig {
13
13
  pool: PostgresPool | (() => Promise<PostgresPool>);
14
14
  /**
15
15
  * https://github.com/brianc/node-postgres/tree/master/packages/pg-cursor
16
+ *
16
17
  * ```ts
18
+ * import { PostgresDialect } from 'kysely'
19
+ * import { Pool } from 'pg'
17
20
  * import Cursor from 'pg-cursor'
18
- * // or
19
- * import * as Cursor from 'pg-cursor'
21
+ * // or import * as Cursor from 'pg-cursor'
20
22
  *
21
23
  * new PostgresDialect({
22
- * cursor: Cursor
24
+ * cursor: Cursor,
25
+ * pool: new Pool('postgres://localhost:5432/mydb')
23
26
  * })
24
27
  * ```
25
28
  */
@@ -28,6 +31,10 @@ export interface PostgresDialectConfig {
28
31
  * Called once for each created connection.
29
32
  */
30
33
  onCreateConnection?: (connection: DatabaseConnection) => Promise<void>;
34
+ /**
35
+ * Called every time a connection is acquired from the pool.
36
+ */
37
+ onReserveConnection?: (connection: DatabaseConnection) => Promise<void>;
31
38
  }
32
39
  /**
33
40
  * This interface is the subset of pg driver's `Pool` class that
@@ -30,6 +30,9 @@ export class PostgresDriver {
30
30
  await this.#config.onCreateConnection(connection);
31
31
  }
32
32
  }
33
+ if (this.#config.onReserveConnection) {
34
+ await this.#config.onReserveConnection(connection);
35
+ }
33
36
  return connection;
34
37
  }
35
38
  async beginTransaction(connection, settings) {
@@ -49,7 +49,11 @@ export class PostgresIntrospector {
49
49
  .as('auto_incrementing'),
50
50
  ])
51
51
  // r == normal table
52
- .where((eb) => eb.or([eb('c.relkind', '=', 'r'), eb('c.relkind', '=', 'v')]))
52
+ .where((eb) => eb.or([
53
+ eb('c.relkind', '=', 'r'),
54
+ eb('c.relkind', '=', 'v'),
55
+ eb('c.relkind', '=', 'p'),
56
+ ]))
53
57
  .where('ns.nspname', '!~', '^pg_')
54
58
  .where('ns.nspname', '!=', 'information_schema')
55
59
  // No system columns
@@ -33,8 +33,13 @@ export declare class SqliteAdapter extends DialectAdapterBase {
33
33
  * have explicit locks but supports `FOR UPDATE` row locks and transactional DDL:
34
34
  *
35
35
  * ```ts
36
- * {
37
- * async acquireMigrationLock(db, options): Promise<void> {
36
+ * import { DialectAdapterBase, type MigrationLockOptions, Kysely } from 'kysely'
37
+ *
38
+ * export class MyAdapter extends DialectAdapterBase {
39
+ * override async acquireMigrationLock(
40
+ * db: Kysely<any>,
41
+ * options: MigrationLockOptions
42
+ * ): Promise<void> {
38
43
  * const queryDb = options.lockTableSchema
39
44
  * ? db.withSchema(options.lockTableSchema)
40
45
  * : db
@@ -50,6 +55,10 @@ export declare class SqliteAdapter extends DialectAdapterBase {
50
55
  * .forUpdate()
51
56
  * .execute()
52
57
  * }
58
+ *
59
+ * override async releaseMigrationLock() {
60
+ * // noop
61
+ * }
53
62
  * }
54
63
  * ```
55
64
  *
@@ -21,7 +21,9 @@ export interface QueryResult<O> {
21
21
  /**
22
22
  * This is defined for update queries and contains the number of rows
23
23
  * the query changed.
24
- * This is optional and only provided by some drivers like node-mysql2.
24
+ *
25
+ * This is **optional** and only provided in dialects such as MySQL.
26
+ * You would probably use {@link numAffectedRows} in most cases.
25
27
  */
26
28
  readonly numChangedRows?: bigint;
27
29
  /**
@@ -10,20 +10,21 @@ import { Driver } from './driver.js';
10
10
  * This example creates a Kysely instance for building postgres queries:
11
11
  *
12
12
  * ```ts
13
+ * import {
14
+ * DummyDriver,
15
+ * Kysely,
16
+ * PostgresAdapter,
17
+ * PostgresIntrospector,
18
+ * PostgresQueryCompiler
19
+ * } from 'kysely'
20
+ * import type { Database } from 'type-editor' // imaginary module
21
+ *
13
22
  * const db = new Kysely<Database>({
14
23
  * dialect: {
15
- * createAdapter() {
16
- * return new PostgresAdapter()
17
- * },
18
- * createDriver() {
19
- * return new DummyDriver()
20
- * },
21
- * createIntrospector(db: Kysely<any>) {
22
- * return new PostgresIntrospector(db)
23
- * },
24
- * createQueryCompiler() {
25
- * return new PostgresQueryCompiler()
26
- * },
24
+ * createAdapter: () => new PostgresAdapter(),
25
+ * createDriver: () => new DummyDriver(),
26
+ * createIntrospector: (db: Kysely<any>) => new PostgresIntrospector(db),
27
+ * createQueryCompiler: () => new PostgresQueryCompiler(),
27
28
  * },
28
29
  * })
29
30
  * ```
@@ -9,20 +9,21 @@
9
9
  * This example creates a Kysely instance for building postgres queries:
10
10
  *
11
11
  * ```ts
12
+ * import {
13
+ * DummyDriver,
14
+ * Kysely,
15
+ * PostgresAdapter,
16
+ * PostgresIntrospector,
17
+ * PostgresQueryCompiler
18
+ * } from 'kysely'
19
+ * import type { Database } from 'type-editor' // imaginary module
20
+ *
12
21
  * const db = new Kysely<Database>({
13
22
  * dialect: {
14
- * createAdapter() {
15
- * return new PostgresAdapter()
16
- * },
17
- * createDriver() {
18
- * return new DummyDriver()
19
- * },
20
- * createIntrospector(db: Kysely<any>) {
21
- * return new PostgresIntrospector(db)
22
- * },
23
- * createQueryCompiler() {
24
- * return new PostgresQueryCompiler()
25
- * },
23
+ * createAdapter: () => new PostgresAdapter(),
24
+ * createDriver: () => new DummyDriver(),
25
+ * createIntrospector: (db: Kysely<any>) => new PostgresIntrospector(db),
26
+ * createQueryCompiler: () => new PostgresQueryCompiler(),
26
27
  * },
27
28
  * })
28
29
  * ```
@@ -5,7 +5,7 @@ export declare class DynamicModule {
5
5
  *
6
6
  * Kysely is built in a way that by default you can't refer to tables or columns
7
7
  * that are not actually visible in the current query and context. This is all
8
- * done by typescript at compile time, which means that you need to know the
8
+ * done by TypeScript at compile time, which means that you need to know the
9
9
  * columns and tables at compile time. This is not always the case of course.
10
10
  *
11
11
  * This method is meant to be used in those cases where the column names
@@ -61,11 +61,11 @@ export declare class DynamicModule {
61
61
  * const { ref } = db.dynamic
62
62
  *
63
63
  * // Some column name provided by the user. Value not known at compile time.
64
- * const columnFromUserInput = req.query.select;
64
+ * const columnFromUserInput: PossibleColumns = 'birthdate';
65
65
  *
66
66
  * // A type that lists all possible values `columnFromUserInput` can have.
67
67
  * // You can use `keyof Person` if any column of an interface is allowed.
68
- * type PossibleColumns = 'last_name' | 'first_name' | 'birth_date'
68
+ * type PossibleColumns = 'last_name' | 'first_name' | 'birthdate'
69
69
  *
70
70
  * const [person] = await db.selectFrom('person')
71
71
  * .select([
@@ -77,12 +77,12 @@ export declare class DynamicModule {
77
77
  * // The resulting type contains all `PossibleColumns` as optional fields
78
78
  * // because we cannot know which field was actually selected before
79
79
  * // running the code.
80
- * const lastName: string | undefined = person.last_name
81
- * const firstName: string | undefined = person.first_name
82
- * const birthDate: string | undefined = person.birth_date
80
+ * const lastName: string | null | undefined = person?.last_name
81
+ * const firstName: string | undefined = person?.first_name
82
+ * const birthDate: Date | null | undefined = person?.birthdate
83
83
  *
84
84
  * // The result type also contains the compile time selection `id`.
85
- * person.id
85
+ * person?.id
86
86
  * ```
87
87
  */
88
88
  ref<R extends string = never>(reference: string): DynamicReferenceBuilder<R>;
@@ -6,7 +6,7 @@ export class DynamicModule {
6
6
  *
7
7
  * Kysely is built in a way that by default you can't refer to tables or columns
8
8
  * that are not actually visible in the current query and context. This is all
9
- * done by typescript at compile time, which means that you need to know the
9
+ * done by TypeScript at compile time, which means that you need to know the
10
10
  * columns and tables at compile time. This is not always the case of course.
11
11
  *
12
12
  * This method is meant to be used in those cases where the column names
@@ -62,11 +62,11 @@ export class DynamicModule {
62
62
  * const { ref } = db.dynamic
63
63
  *
64
64
  * // Some column name provided by the user. Value not known at compile time.
65
- * const columnFromUserInput = req.query.select;
65
+ * const columnFromUserInput: PossibleColumns = 'birthdate';
66
66
  *
67
67
  * // A type that lists all possible values `columnFromUserInput` can have.
68
68
  * // You can use `keyof Person` if any column of an interface is allowed.
69
- * type PossibleColumns = 'last_name' | 'first_name' | 'birth_date'
69
+ * type PossibleColumns = 'last_name' | 'first_name' | 'birthdate'
70
70
  *
71
71
  * const [person] = await db.selectFrom('person')
72
72
  * .select([
@@ -78,12 +78,12 @@ export class DynamicModule {
78
78
  * // The resulting type contains all `PossibleColumns` as optional fields
79
79
  * // because we cannot know which field was actually selected before
80
80
  * // running the code.
81
- * const lastName: string | undefined = person.last_name
82
- * const firstName: string | undefined = person.first_name
83
- * const birthDate: string | undefined = person.birth_date
81
+ * const lastName: string | null | undefined = person?.last_name
82
+ * const firstName: string | undefined = person?.first_name
83
+ * const birthDate: Date | null | undefined = person?.birthdate
84
84
  *
85
85
  * // The result type also contains the compile time selection `id`.
86
- * person.id
86
+ * person?.id
87
87
  * ```
88
88
  */
89
89
  ref(reference) {