kysely 0.23.4 → 0.24.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 (314) hide show
  1. package/README.md +49 -25
  2. package/dist/cjs/dialect/database-introspector.d.ts +4 -2
  3. package/dist/cjs/dialect/mysql/mysql-adapter.js +2 -2
  4. package/dist/cjs/dialect/mysql/mysql-driver.d.ts +1 -1
  5. package/dist/cjs/dialect/mysql/mysql-driver.js +1 -1
  6. package/dist/cjs/dialect/mysql/mysql-introspector.d.ts +1 -1
  7. package/dist/cjs/dialect/mysql/mysql-introspector.js +19 -13
  8. package/dist/cjs/dialect/postgres/postgres-adapter.js +1 -1
  9. package/dist/cjs/dialect/postgres/postgres-introspector.d.ts +1 -1
  10. package/dist/cjs/dialect/postgres/postgres-introspector.js +3 -1
  11. package/dist/cjs/dialect/sqlite/sqlite-dialect.d.ts +1 -0
  12. package/dist/cjs/dialect/sqlite/sqlite-dialect.js +1 -0
  13. package/dist/cjs/dialect/sqlite/sqlite-introspector.d.ts +1 -1
  14. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +6 -5
  15. package/dist/cjs/driver/runtime-driver.js +4 -2
  16. package/dist/cjs/expression/expression-builder.d.ts +386 -0
  17. package/dist/cjs/expression/expression-builder.js +92 -0
  18. package/dist/cjs/expression/expression-wrapper.d.ts +92 -0
  19. package/dist/cjs/expression/expression-wrapper.js +54 -0
  20. package/dist/cjs/expression/expression.d.ts +1 -1
  21. package/dist/cjs/helpers/postgres.d.ts +133 -0
  22. package/dist/cjs/helpers/postgres.js +141 -0
  23. package/dist/cjs/index.d.ts +4 -3
  24. package/dist/cjs/index.js +4 -2
  25. package/dist/cjs/kysely.d.ts +10 -0
  26. package/dist/cjs/kysely.js +12 -1
  27. package/dist/cjs/migration/file-migration-provider.d.ts +5 -2
  28. package/dist/cjs/migration/migrator.d.ts +5 -2
  29. package/dist/cjs/operation-node/aggregate-function-node.d.ts +3 -2
  30. package/dist/cjs/operation-node/aggregate-function-node.js +2 -2
  31. package/dist/cjs/operation-node/create-index-node.d.ts +2 -0
  32. package/dist/cjs/operation-node/delete-query-node.d.ts +1 -2
  33. package/dist/cjs/operation-node/delete-query-node.js +2 -8
  34. package/dist/cjs/operation-node/function-node.d.ts +13 -0
  35. package/dist/cjs/operation-node/function-node.js +19 -0
  36. package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
  37. package/dist/cjs/operation-node/operation-node-transformer.js +11 -2
  38. package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
  39. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  40. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  41. package/dist/cjs/operation-node/operator-node.d.ts +13 -2
  42. package/dist/cjs/operation-node/operator-node.js +38 -3
  43. package/dist/cjs/operation-node/query-node.d.ts +25 -8
  44. package/dist/cjs/operation-node/query-node.js +9 -2
  45. package/dist/cjs/operation-node/select-query-node.d.ts +0 -1
  46. package/dist/cjs/operation-node/select-query-node.js +0 -6
  47. package/dist/cjs/operation-node/update-query-node.d.ts +0 -1
  48. package/dist/cjs/operation-node/update-query-node.js +0 -6
  49. package/dist/cjs/parser/binary-operation-parser.d.ts +9 -10
  50. package/dist/cjs/parser/binary-operation-parser.js +89 -39
  51. package/dist/cjs/parser/coalesce-parser.d.ts +0 -2
  52. package/dist/cjs/parser/coalesce-parser.js +0 -9
  53. package/dist/cjs/parser/expression-parser.d.ts +7 -3
  54. package/dist/cjs/parser/expression-parser.js +4 -4
  55. package/dist/cjs/parser/group-by-parser.d.ts +3 -2
  56. package/dist/cjs/parser/group-by-parser.js +3 -0
  57. package/dist/cjs/parser/insert-values-parser.d.ts +4 -1
  58. package/dist/cjs/parser/insert-values-parser.js +19 -13
  59. package/dist/cjs/parser/join-parser.js +1 -1
  60. package/dist/cjs/parser/parse-utils.d.ts +0 -2
  61. package/dist/cjs/parser/parse-utils.js +1 -8
  62. package/dist/cjs/parser/returning-parser.d.ts +2 -1
  63. package/dist/cjs/parser/select-parser.d.ts +5 -13
  64. package/dist/cjs/parser/select-parser.js +8 -4
  65. package/dist/cjs/parser/table-parser.d.ts +6 -3
  66. package/dist/cjs/parser/unary-operation-parser.d.ts +5 -2
  67. package/dist/cjs/parser/unary-operation-parser.js +9 -8
  68. package/dist/cjs/parser/update-set-parser.d.ts +4 -1
  69. package/dist/cjs/parser/update-set-parser.js +9 -4
  70. package/dist/cjs/parser/value-parser.d.ts +5 -0
  71. package/dist/cjs/parser/value-parser.js +1 -3
  72. package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +7 -0
  73. package/dist/cjs/plugin/camel-case/camel-case-plugin.js +10 -4
  74. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +1 -1
  75. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
  76. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +40 -113
  77. package/dist/cjs/query-builder/aggregate-function-builder.js +23 -63
  78. package/dist/cjs/query-builder/delete-query-builder.d.ts +224 -205
  79. package/dist/cjs/query-builder/delete-query-builder.js +21 -27
  80. package/dist/cjs/query-builder/delete-result.js +3 -0
  81. package/dist/cjs/query-builder/deprecated-having-expression-builder.d.ts +62 -0
  82. package/dist/cjs/query-builder/deprecated-having-expression-builder.js +2 -0
  83. package/dist/cjs/query-builder/deprecated-on-expression-builder.d.ts +62 -0
  84. package/dist/cjs/query-builder/deprecated-on-expression-builder.js +2 -0
  85. package/dist/cjs/query-builder/deprecated-where-expression-builder.d.ts +62 -0
  86. package/dist/cjs/query-builder/deprecated-where-expression-builder.js +2 -0
  87. package/dist/cjs/query-builder/function-module.d.ts +304 -42
  88. package/dist/cjs/query-builder/function-module.js +44 -208
  89. package/dist/cjs/query-builder/having-interface.d.ts +19 -16
  90. package/dist/cjs/query-builder/insert-query-builder.d.ts +78 -30
  91. package/dist/cjs/query-builder/insert-query-builder.js +21 -30
  92. package/dist/cjs/query-builder/insert-result.js +3 -0
  93. package/dist/cjs/query-builder/join-builder.d.ts +23 -26
  94. package/dist/cjs/query-builder/join-builder.js +17 -22
  95. package/dist/cjs/query-builder/no-result-error.d.ts +1 -0
  96. package/dist/cjs/query-builder/no-result-error.js +5 -1
  97. package/dist/cjs/query-builder/on-conflict-builder.d.ts +158 -276
  98. package/dist/cjs/query-builder/on-conflict-builder.js +52 -36
  99. package/dist/cjs/query-builder/over-builder.d.ts +5 -0
  100. package/dist/cjs/query-builder/over-builder.js +7 -0
  101. package/dist/cjs/query-builder/returning-interface.d.ts +2 -2
  102. package/dist/cjs/query-builder/select-query-builder.d.ts +155 -243
  103. package/dist/cjs/query-builder/select-query-builder.js +333 -78
  104. package/dist/cjs/query-builder/update-query-builder.d.ts +149 -217
  105. package/dist/cjs/query-builder/update-query-builder.js +21 -115
  106. package/dist/cjs/query-builder/update-result.js +3 -0
  107. package/dist/cjs/query-builder/where-interface.d.ts +71 -184
  108. package/dist/cjs/query-compiler/default-query-compiler.d.ts +3 -0
  109. package/dist/cjs/query-compiler/default-query-compiler.js +18 -2
  110. package/dist/cjs/query-creator.d.ts +38 -2
  111. package/dist/cjs/query-creator.js +3 -45
  112. package/dist/cjs/query-executor/query-executor.d.ts +3 -3
  113. package/dist/cjs/raw-builder/raw-builder.d.ts +5 -3
  114. package/dist/cjs/raw-builder/raw-builder.js +13 -7
  115. package/dist/cjs/raw-builder/sql.d.ts +17 -9
  116. package/dist/cjs/raw-builder/sql.js +8 -2
  117. package/dist/cjs/schema/alter-column-builder.d.ts +5 -0
  118. package/dist/cjs/schema/alter-column-builder.js +7 -0
  119. package/dist/cjs/schema/alter-table-add-foreign-key-constraint-builder.d.ts +5 -0
  120. package/dist/cjs/schema/alter-table-add-foreign-key-constraint-builder.js +7 -0
  121. package/dist/cjs/schema/alter-table-drop-constraint-builder.d.ts +5 -0
  122. package/dist/cjs/schema/alter-table-drop-constraint-builder.js +7 -0
  123. package/dist/cjs/schema/column-definition-builder.d.ts +6 -1
  124. package/dist/cjs/schema/column-definition-builder.js +8 -1
  125. package/dist/cjs/schema/create-index-builder.d.ts +51 -9
  126. package/dist/cjs/schema/create-index-builder.js +17 -0
  127. package/dist/cjs/schema/create-schema-builder.d.ts +5 -0
  128. package/dist/cjs/schema/create-schema-builder.js +7 -0
  129. package/dist/cjs/schema/create-table-builder.d.ts +3 -1
  130. package/dist/cjs/schema/create-table-builder.js +3 -1
  131. package/dist/cjs/schema/create-type-builder.d.ts +5 -0
  132. package/dist/cjs/schema/create-type-builder.js +7 -0
  133. package/dist/cjs/schema/create-view-builder.d.ts +5 -0
  134. package/dist/cjs/schema/create-view-builder.js +7 -0
  135. package/dist/cjs/schema/drop-index-builder.d.ts +5 -0
  136. package/dist/cjs/schema/drop-index-builder.js +7 -0
  137. package/dist/cjs/schema/drop-schema-builder.d.ts +5 -0
  138. package/dist/cjs/schema/drop-schema-builder.js +7 -0
  139. package/dist/cjs/schema/drop-table-builder.d.ts +5 -0
  140. package/dist/cjs/schema/drop-table-builder.js +7 -0
  141. package/dist/cjs/schema/drop-type-builder.d.ts +5 -0
  142. package/dist/cjs/schema/drop-type-builder.js +7 -0
  143. package/dist/cjs/schema/drop-view-builder.d.ts +5 -0
  144. package/dist/cjs/schema/drop-view-builder.js +7 -0
  145. package/dist/cjs/schema/foreign-key-constraint-builder.d.ts +5 -0
  146. package/dist/cjs/schema/foreign-key-constraint-builder.js +7 -0
  147. package/dist/cjs/util/compilable.d.ts +1 -0
  148. package/dist/cjs/util/compilable.js +6 -0
  149. package/dist/cjs/util/explainable.d.ts +35 -0
  150. package/dist/cjs/util/log.d.ts +2 -0
  151. package/dist/cjs/util/object-utils.js +1 -1
  152. package/dist/cjs/util/streamable.d.ts +29 -0
  153. package/dist/cjs/util/streamable.js +2 -0
  154. package/dist/cjs/util/type-utils.d.ts +6 -4
  155. package/dist/esm/dialect/database-introspector.d.ts +4 -2
  156. package/dist/esm/dialect/mysql/mysql-adapter.js +2 -2
  157. package/dist/esm/dialect/mysql/mysql-driver.d.ts +1 -1
  158. package/dist/esm/dialect/mysql/mysql-driver.js +1 -1
  159. package/dist/esm/dialect/mysql/mysql-introspector.d.ts +1 -1
  160. package/dist/esm/dialect/mysql/mysql-introspector.js +19 -13
  161. package/dist/esm/dialect/postgres/postgres-adapter.js +1 -1
  162. package/dist/esm/dialect/postgres/postgres-introspector.d.ts +1 -1
  163. package/dist/esm/dialect/postgres/postgres-introspector.js +3 -1
  164. package/dist/esm/dialect/sqlite/sqlite-dialect.d.ts +1 -0
  165. package/dist/esm/dialect/sqlite/sqlite-dialect.js +1 -0
  166. package/dist/esm/dialect/sqlite/sqlite-introspector.d.ts +1 -1
  167. package/dist/esm/dialect/sqlite/sqlite-introspector.js +6 -5
  168. package/dist/esm/driver/runtime-driver.js +4 -2
  169. package/dist/esm/expression/expression-builder.d.ts +386 -0
  170. package/dist/esm/expression/expression-builder.js +88 -0
  171. package/dist/esm/expression/expression-wrapper.d.ts +92 -0
  172. package/dist/esm/expression/expression-wrapper.js +50 -0
  173. package/dist/esm/expression/expression.d.ts +1 -1
  174. package/dist/esm/helpers/postgres.d.ts +133 -0
  175. package/dist/esm/helpers/postgres.js +136 -0
  176. package/dist/esm/index.d.ts +4 -3
  177. package/dist/esm/index.js +2 -1
  178. package/dist/esm/kysely.d.ts +10 -0
  179. package/dist/esm/kysely.js +13 -2
  180. package/dist/esm/migration/file-migration-provider.d.ts +5 -2
  181. package/dist/esm/migration/migrator.d.ts +5 -2
  182. package/dist/esm/operation-node/aggregate-function-node.d.ts +3 -2
  183. package/dist/esm/operation-node/aggregate-function-node.js +2 -2
  184. package/dist/esm/operation-node/create-index-node.d.ts +2 -0
  185. package/dist/esm/operation-node/delete-query-node.d.ts +1 -2
  186. package/dist/esm/operation-node/delete-query-node.js +2 -8
  187. package/dist/esm/operation-node/function-node.d.ts +13 -0
  188. package/dist/esm/operation-node/function-node.js +17 -0
  189. package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
  190. package/dist/esm/operation-node/operation-node-transformer.js +11 -2
  191. package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
  192. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  193. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  194. package/dist/esm/operation-node/operator-node.d.ts +13 -2
  195. package/dist/esm/operation-node/operator-node.js +34 -3
  196. package/dist/esm/operation-node/query-node.d.ts +25 -8
  197. package/dist/esm/operation-node/query-node.js +9 -2
  198. package/dist/esm/operation-node/select-query-node.d.ts +0 -1
  199. package/dist/esm/operation-node/select-query-node.js +0 -6
  200. package/dist/esm/operation-node/update-query-node.d.ts +0 -1
  201. package/dist/esm/operation-node/update-query-node.js +0 -6
  202. package/dist/esm/parser/binary-operation-parser.d.ts +9 -10
  203. package/dist/esm/parser/binary-operation-parser.js +85 -37
  204. package/dist/esm/parser/coalesce-parser.d.ts +0 -2
  205. package/dist/esm/parser/coalesce-parser.js +1 -7
  206. package/dist/esm/parser/expression-parser.d.ts +7 -3
  207. package/dist/esm/parser/expression-parser.js +5 -5
  208. package/dist/esm/parser/group-by-parser.d.ts +3 -2
  209. package/dist/esm/parser/group-by-parser.js +3 -0
  210. package/dist/esm/parser/insert-values-parser.d.ts +4 -1
  211. package/dist/esm/parser/insert-values-parser.js +18 -12
  212. package/dist/esm/parser/join-parser.js +2 -2
  213. package/dist/esm/parser/parse-utils.d.ts +0 -2
  214. package/dist/esm/parser/parse-utils.js +0 -6
  215. package/dist/esm/parser/returning-parser.d.ts +2 -1
  216. package/dist/esm/parser/select-parser.d.ts +5 -13
  217. package/dist/esm/parser/select-parser.js +7 -3
  218. package/dist/esm/parser/table-parser.d.ts +6 -3
  219. package/dist/esm/parser/unary-operation-parser.d.ts +5 -2
  220. package/dist/esm/parser/unary-operation-parser.js +8 -8
  221. package/dist/esm/parser/update-set-parser.d.ts +4 -1
  222. package/dist/esm/parser/update-set-parser.js +7 -2
  223. package/dist/esm/parser/value-parser.d.ts +5 -0
  224. package/dist/esm/parser/value-parser.js +1 -3
  225. package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +7 -0
  226. package/dist/esm/plugin/camel-case/camel-case-plugin.js +10 -4
  227. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +1 -1
  228. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
  229. package/dist/esm/query-builder/aggregate-function-builder.d.ts +40 -113
  230. package/dist/esm/query-builder/aggregate-function-builder.js +24 -64
  231. package/dist/esm/query-builder/delete-query-builder.d.ts +224 -205
  232. package/dist/esm/query-builder/delete-query-builder.js +24 -30
  233. package/dist/esm/query-builder/delete-result.js +3 -0
  234. package/dist/esm/query-builder/deprecated-having-expression-builder.d.ts +62 -0
  235. package/dist/esm/query-builder/deprecated-having-expression-builder.js +2 -0
  236. package/dist/esm/query-builder/deprecated-on-expression-builder.d.ts +62 -0
  237. package/dist/esm/query-builder/deprecated-on-expression-builder.js +2 -0
  238. package/dist/esm/query-builder/deprecated-where-expression-builder.d.ts +62 -0
  239. package/dist/esm/query-builder/deprecated-where-expression-builder.js +2 -0
  240. package/dist/esm/query-builder/function-module.d.ts +304 -42
  241. package/dist/esm/query-builder/function-module.js +43 -207
  242. package/dist/esm/query-builder/having-interface.d.ts +19 -16
  243. package/dist/esm/query-builder/insert-query-builder.d.ts +78 -30
  244. package/dist/esm/query-builder/insert-query-builder.js +25 -34
  245. package/dist/esm/query-builder/insert-result.js +3 -0
  246. package/dist/esm/query-builder/join-builder.d.ts +23 -26
  247. package/dist/esm/query-builder/join-builder.js +18 -23
  248. package/dist/esm/query-builder/no-result-error.d.ts +1 -0
  249. package/dist/esm/query-builder/no-result-error.js +3 -0
  250. package/dist/esm/query-builder/on-conflict-builder.d.ts +158 -276
  251. package/dist/esm/query-builder/on-conflict-builder.js +54 -38
  252. package/dist/esm/query-builder/over-builder.d.ts +5 -0
  253. package/dist/esm/query-builder/over-builder.js +7 -0
  254. package/dist/esm/query-builder/returning-interface.d.ts +2 -2
  255. package/dist/esm/query-builder/select-query-builder.d.ts +155 -243
  256. package/dist/esm/query-builder/select-query-builder.js +337 -82
  257. package/dist/esm/query-builder/update-query-builder.d.ts +149 -217
  258. package/dist/esm/query-builder/update-query-builder.js +25 -119
  259. package/dist/esm/query-builder/update-result.js +3 -0
  260. package/dist/esm/query-builder/where-interface.d.ts +71 -184
  261. package/dist/esm/query-compiler/default-query-compiler.d.ts +3 -0
  262. package/dist/esm/query-compiler/default-query-compiler.js +18 -2
  263. package/dist/esm/query-creator.d.ts +38 -2
  264. package/dist/esm/query-creator.js +3 -45
  265. package/dist/esm/query-executor/query-executor.d.ts +3 -3
  266. package/dist/esm/raw-builder/raw-builder.d.ts +5 -3
  267. package/dist/esm/raw-builder/raw-builder.js +13 -7
  268. package/dist/esm/raw-builder/sql.d.ts +17 -9
  269. package/dist/esm/raw-builder/sql.js +8 -2
  270. package/dist/esm/schema/alter-column-builder.d.ts +5 -0
  271. package/dist/esm/schema/alter-column-builder.js +7 -0
  272. package/dist/esm/schema/alter-table-add-foreign-key-constraint-builder.d.ts +5 -0
  273. package/dist/esm/schema/alter-table-add-foreign-key-constraint-builder.js +7 -0
  274. package/dist/esm/schema/alter-table-drop-constraint-builder.d.ts +5 -0
  275. package/dist/esm/schema/alter-table-drop-constraint-builder.js +7 -0
  276. package/dist/esm/schema/column-definition-builder.d.ts +6 -1
  277. package/dist/esm/schema/column-definition-builder.js +8 -1
  278. package/dist/esm/schema/create-index-builder.d.ts +51 -9
  279. package/dist/esm/schema/create-index-builder.js +17 -0
  280. package/dist/esm/schema/create-schema-builder.d.ts +5 -0
  281. package/dist/esm/schema/create-schema-builder.js +7 -0
  282. package/dist/esm/schema/create-table-builder.d.ts +3 -1
  283. package/dist/esm/schema/create-table-builder.js +3 -1
  284. package/dist/esm/schema/create-type-builder.d.ts +5 -0
  285. package/dist/esm/schema/create-type-builder.js +7 -0
  286. package/dist/esm/schema/create-view-builder.d.ts +5 -0
  287. package/dist/esm/schema/create-view-builder.js +7 -0
  288. package/dist/esm/schema/drop-index-builder.d.ts +5 -0
  289. package/dist/esm/schema/drop-index-builder.js +7 -0
  290. package/dist/esm/schema/drop-schema-builder.d.ts +5 -0
  291. package/dist/esm/schema/drop-schema-builder.js +7 -0
  292. package/dist/esm/schema/drop-table-builder.d.ts +5 -0
  293. package/dist/esm/schema/drop-table-builder.js +7 -0
  294. package/dist/esm/schema/drop-type-builder.d.ts +5 -0
  295. package/dist/esm/schema/drop-type-builder.js +7 -0
  296. package/dist/esm/schema/drop-view-builder.d.ts +5 -0
  297. package/dist/esm/schema/drop-view-builder.js +7 -0
  298. package/dist/esm/schema/foreign-key-constraint-builder.d.ts +5 -0
  299. package/dist/esm/schema/foreign-key-constraint-builder.js +7 -0
  300. package/dist/esm/util/compilable.d.ts +1 -0
  301. package/dist/esm/util/compilable.js +4 -1
  302. package/dist/esm/util/explainable.d.ts +35 -0
  303. package/dist/esm/util/log.d.ts +2 -0
  304. package/dist/esm/util/object-utils.js +1 -1
  305. package/dist/esm/util/streamable.d.ts +29 -0
  306. package/dist/esm/util/streamable.js +2 -0
  307. package/dist/esm/util/type-utils.d.ts +6 -4
  308. package/helpers/postgres.d.ts +1 -0
  309. package/helpers/postgres.js +1 -0
  310. package/package.json +20 -9
  311. package/dist/cjs/query-builder/expression-builder.d.ts +0 -126
  312. package/dist/cjs/query-builder/expression-builder.js +0 -107
  313. package/dist/esm/query-builder/expression-builder.d.ts +0 -126
  314. package/dist/esm/query-builder/expression-builder.js +0 -104
@@ -2,7 +2,7 @@
2
2
  import { AliasNode } from '../operation-node/alias-node.js';
3
3
  import { SelectModifierNode } from '../operation-node/select-modifier-node.js';
4
4
  import { parseJoin, } from '../parser/join-parser.js';
5
- import { parseSelectExpressionOrList, parseSelectAll, } from '../parser/select-parser.js';
5
+ import { parseSelectArg, parseSelectAll, } from '../parser/select-parser.js';
6
6
  import { parseReferenceExpressionOrList, } from '../parser/reference-parser.js';
7
7
  import { SelectQueryNode } from '../operation-node/select-query-node.js';
8
8
  import { QueryNode } from '../operation-node/query-node.js';
@@ -11,12 +11,11 @@ import { preventAwait } from '../util/prevent-await.js';
11
11
  import { LimitNode } from '../operation-node/limit-node.js';
12
12
  import { OffsetNode } from '../operation-node/offset-node.js';
13
13
  import { freeze } from '../util/object-utils.js';
14
- import { parseGroupBy, } from '../parser/group-by-parser.js';
15
- import { NoResultError } from './no-result-error.js';
14
+ import { parseGroupBy } from '../parser/group-by-parser.js';
15
+ import { isNoResultErrorConstructor, NoResultError, } from './no-result-error.js';
16
16
  import { IdentifierNode } from '../operation-node/identifier-node.js';
17
- import { ExplainNode } from '../operation-node/explain-node.js';
18
17
  import { parseSetOperation } from '../parser/set-operation-parser.js';
19
- import { parseHaving, parseReferentialFilter, parseWhere, } from '../parser/binary-operation-parser.js';
18
+ import { parseHaving, parseReferentialComparison, parseWhere, } from '../parser/binary-operation-parser.js';
20
19
  import { parseExists, parseNotExists, } from '../parser/unary-operation-parser.js';
21
20
  export class SelectQueryBuilder {
22
21
  #props;
@@ -36,7 +35,7 @@ export class SelectQueryBuilder {
36
35
  whereRef(lhs, op, rhs) {
37
36
  return new SelectQueryBuilder({
38
37
  ...this.#props,
39
- queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseReferentialFilter(lhs, op, rhs)),
38
+ queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseReferentialComparison(lhs, op, rhs)),
40
39
  });
41
40
  }
42
41
  orWhere(...args) {
@@ -48,7 +47,7 @@ export class SelectQueryBuilder {
48
47
  orWhereRef(lhs, op, rhs) {
49
48
  return new SelectQueryBuilder({
50
49
  ...this.#props,
51
- queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseReferentialFilter(lhs, op, rhs)),
50
+ queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseReferentialComparison(lhs, op, rhs)),
52
51
  });
53
52
  }
54
53
  whereExists(arg) {
@@ -84,7 +83,7 @@ export class SelectQueryBuilder {
84
83
  havingRef(lhs, op, rhs) {
85
84
  return new SelectQueryBuilder({
86
85
  ...this.#props,
87
- queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseReferentialFilter(lhs, op, rhs)),
86
+ queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseReferentialComparison(lhs, op, rhs)),
88
87
  });
89
88
  }
90
89
  orHaving(...args) {
@@ -96,7 +95,7 @@ export class SelectQueryBuilder {
96
95
  orHavingRef(lhs, op, rhs) {
97
96
  return new SelectQueryBuilder({
98
97
  ...this.#props,
99
- queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseReferentialFilter(lhs, op, rhs)),
98
+ queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseReferentialComparison(lhs, op, rhs)),
100
99
  });
101
100
  }
102
101
  havingExists(arg) {
@@ -105,12 +104,21 @@ export class SelectQueryBuilder {
105
104
  queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseExists(arg)),
106
105
  });
107
106
  }
107
+ /**
108
+ * @deprecated Use {@link havingNotExists} instead.
109
+ */
108
110
  havingNotExist(arg) {
109
111
  return new SelectQueryBuilder({
110
112
  ...this.#props,
111
113
  queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseNotExists(arg)),
112
114
  });
113
115
  }
116
+ havingNotExists(arg) {
117
+ return new SelectQueryBuilder({
118
+ ...this.#props,
119
+ queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseNotExists(arg)),
120
+ });
121
+ }
114
122
  orHavingExists(arg) {
115
123
  return new SelectQueryBuilder({
116
124
  ...this.#props,
@@ -123,10 +131,199 @@ export class SelectQueryBuilder {
123
131
  queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseNotExists(arg)),
124
132
  });
125
133
  }
134
+ /**
135
+ * Adds a select statement to the query.
136
+ *
137
+ * When a column (or any expression) is selected, Kysely adds its type to the return
138
+ * type of the query. Kysely is smart enough to parse the selection names and types
139
+ * from aliased columns, subqueries, raw expressions etc.
140
+ *
141
+ * Kysely only allows you to select columns and expressions that exist and would
142
+ * produce valid SQL. However, Kysely is not perfect and there may be cases where
143
+ * the type inference doesn't work and you need to override it. You can always
144
+ * use the {@link Kysely.dynamic | dynamic} module and the {@link sql} tag
145
+ * to override the types.
146
+ *
147
+ * Select calls are additive. Calling `select('id').select('first_name')` is the
148
+ * same as calling `select(['id', 'first_name'])`.
149
+ *
150
+ * To select all columns of the query or specific tables see the
151
+ * {@link selectAll} method.
152
+ *
153
+ * See the {@link $if} method if you are looking for a way to add selections
154
+ * based on a runtime condition.
155
+ *
156
+ * ### Examples
157
+ *
158
+ * Select a single column:
159
+ *
160
+ * ```ts
161
+ * const persons = await db
162
+ * .selectFrom('person')
163
+ * .select('id')
164
+ * .where('first_name', '=', 'Arnold')
165
+ * .execute()
166
+ *
167
+ * persons[0].id
168
+ * ```
169
+ *
170
+ * The generated SQL (PostgreSQL):
171
+ *
172
+ * ```sql
173
+ * select "id" from "person" where "first_name" = $1
174
+ * ```
175
+ *
176
+ * Select a single column and specify a table:
177
+ *
178
+ * ```ts
179
+ * const persons = await db
180
+ * .selectFrom(['person', 'pet'])
181
+ * .select('person.id')
182
+ * .execute()
183
+ *
184
+ * persons[0].id
185
+ * ```
186
+ *
187
+ * The generated SQL (PostgreSQL):
188
+ *
189
+ * ```sql
190
+ * select "person"."id" from "person", "pet"
191
+ * ```
192
+ *
193
+ * Select multiple columns:
194
+ *
195
+ * ```ts
196
+ * const persons = await db
197
+ * .selectFrom('person')
198
+ * .select(['person.id', 'first_name'])
199
+ * .execute()
200
+ *
201
+ * persons[0].id
202
+ * persons[0].first_name
203
+ * ```
204
+ *
205
+ * The generated SQL (PostgreSQL):
206
+ *
207
+ * ```sql
208
+ * select "person"."id", "first_name" from "person"
209
+ * ```
210
+ *
211
+ * Aliased selections:
212
+ *
213
+ * ```ts
214
+ * const persons = await db
215
+ * .selectFrom('person')
216
+ * .select([
217
+ * 'person.first_name as fn',
218
+ * 'person.last_name as ln'
219
+ * ])
220
+ * .execute()
221
+ *
222
+ * persons[0].fn
223
+ * persons[0].ln
224
+ * ```
225
+ *
226
+ * The generated SQL (PostgreSQL):
227
+ *
228
+ * ```sql
229
+ * select
230
+ * "person"."first_name" as "fn",
231
+ * "person"."last_name" as "ln"
232
+ * from "person"
233
+ * ```
234
+ *
235
+ * You can also select arbitrary expression including subqueries and raw sql snippets.
236
+ * When you do that, you need to give a name for the selections using the {@link as} method:
237
+ *
238
+ * ```ts
239
+ * import { sql } from 'kysely'
240
+ *
241
+ * const persons = await db.selectFrom('person')
242
+ * .select(({ selectFrom, or, cmpr }) => [
243
+ * // Select a correlated subquery
244
+ * selectFrom('pet')
245
+ * .whereRef('person.id', '=', 'pet.owner_id')
246
+ * .select('pet.name')
247
+ * .orderBy('pet.name')
248
+ * .limit(1)
249
+ * .as('first_pet_name'),
250
+ *
251
+ * // Build and select an expression using the expression builder
252
+ * or([
253
+ * cmpr('first_name', '=', 'Jennifer'),
254
+ * cmpr('first_name', '=', 'Arnold')
255
+ * ]).as('is_jennifer_or_arnold'),
256
+ *
257
+ * // Select a raw sql expression
258
+ * sql<string>`concat(first_name, ' ', last_name)`.as('full_name')
259
+ * ])
260
+ * .execute()
261
+ *
262
+ * persons[0].first_pet_name
263
+ * persons[0].is_jennifer_or_arnold
264
+ * persons[0].full_name
265
+ * ```
266
+ *
267
+ * The generated SQL (PostgreSQL):
268
+ *
269
+ * ```sql
270
+ * select
271
+ * (
272
+ * select "pet"."name"
273
+ * from "pet"
274
+ * where "person"."id" = "pet"."owner_id"
275
+ * order by "pet"."name"
276
+ * limit $1
277
+ * ) as "pet_name",
278
+ * ("first_name" = $2 or "first_name" = $3) as "jennifer_or_arnold",
279
+ * concat(first_name, ' ', last_name) as "full_name"
280
+ * from "person"
281
+ * ```
282
+ *
283
+ * In case you use the {@link sql} tag you need to specify the type of the expression
284
+ * (in this example `string`).
285
+ *
286
+ * All the examples above assume you know the column names at compile time.
287
+ * While it's better to build your code like that (that way you also know
288
+ * the types) sometimes it's not possible or you just prefer to write more
289
+ * dynamic code.
290
+ * <br><br>
291
+ * In this example, we use the `dynamic` module's methods to add selections
292
+ * dynamically:
293
+ *
294
+ * ```ts
295
+ * const { ref } = db.dynamic
296
+ *
297
+ * // Some column name provided by the user. Value not known at compile time.
298
+ * const columnFromUserInput = req.query.select;
299
+ *
300
+ * // A type that lists all possible values `columnFromUserInput` can have.
301
+ * // You can use `keyof Person` if any column of an interface is allowed.
302
+ * type PossibleColumns = 'last_name' | 'first_name' | 'birth_date'
303
+ *
304
+ * const spersons = await db
305
+ * .selectFrom('person')
306
+ * .select([
307
+ * ref<PossibleColumns>(columnFromUserInput)
308
+ * 'id'
309
+ * ])
310
+ * .execute()
311
+ *
312
+ * // The resulting type contains all `PossibleColumns` as optional fields
313
+ * // because we cannot know which field was actually selected before
314
+ * // running the code.
315
+ * const lastName: string | undefined = persons[0].last_name
316
+ * const firstName: string | undefined = persons[0].first_name
317
+ * const birthDate: string | undefined = persons[0].birth_date
318
+ *
319
+ * // The result type also contains the compile time selection `id`.
320
+ * persons[0].id
321
+ * ```
322
+ */
126
323
  select(selection) {
127
324
  return new SelectQueryBuilder({
128
325
  ...this.#props,
129
- queryNode: SelectQueryNode.cloneWithSelections(this.#props.queryNode, parseSelectExpressionOrList(selection)),
326
+ queryNode: SelectQueryNode.cloneWithSelections(this.#props.queryNode, parseSelectArg(selection)),
130
327
  });
131
328
  }
132
329
  distinctOn(selection) {
@@ -346,7 +543,7 @@ export class SelectQueryBuilder {
346
543
  * await db
347
544
  * .selectFrom('person')
348
545
  * .selectAll()
349
- * .orderBy((qb) => qb.selectFrom('pet')
546
+ * .orderBy((eb) => eb.selectFrom('pet')
350
547
  * .select('pet.name')
351
548
  * .whereRef('pet.owner_id', '=', 'person.id')
352
549
  * .limit(1)
@@ -402,6 +599,104 @@ export class SelectQueryBuilder {
402
599
  queryNode: SelectQueryNode.cloneWithOrderByItem(this.#props.queryNode, parseOrderBy(orderBy, direction)),
403
600
  });
404
601
  }
602
+ /**
603
+ * Adds a `group by` clause to the query.
604
+ *
605
+ * ### Examples
606
+ *
607
+ * ```ts
608
+ * import { sql } from 'kysely'
609
+ *
610
+ * await db
611
+ * .selectFrom('person')
612
+ * .select([
613
+ * 'first_name',
614
+ * sql`max(id)`.as('max_id')
615
+ * ])
616
+ * .groupBy('first_name')
617
+ * .execute()
618
+ * ```
619
+ *
620
+ * The generated SQL (PostgreSQL):
621
+ *
622
+ * ```sql
623
+ * select "first_name", max(id)
624
+ * from "person"
625
+ * group by "first_name"
626
+ * ```
627
+ *
628
+ * `groupBy` also accepts an array:
629
+ *
630
+ * ```ts
631
+ * import { sql } from 'kysely'
632
+ *
633
+ * await db
634
+ * .selectFrom('person')
635
+ * .select([
636
+ * 'first_name',
637
+ * 'last_name',
638
+ * sql`max(id)`.as('max_id')
639
+ * ])
640
+ * .groupBy([
641
+ * 'first_name',
642
+ * 'last_name'
643
+ * ])
644
+ * .execute()
645
+ * ```
646
+ *
647
+ * The generated SQL (PostgreSQL):
648
+ *
649
+ * ```sql
650
+ * select "first_name", "last_name", max(id)
651
+ * from "person"
652
+ * group by "first_name", "last_name"
653
+ * ```
654
+ *
655
+ * The group by expressions can also be subqueries or
656
+ * raw sql expressions:
657
+ *
658
+ * ```ts
659
+ * import { sql } from 'kysely'
660
+ *
661
+ * await db
662
+ * .selectFrom('person')
663
+ * .select([
664
+ * 'first_name',
665
+ * 'last_name',
666
+ * sql`max(id)`.as('max_id')
667
+ * ])
668
+ * .groupBy([
669
+ * sql`concat(first_name, last_name)`,
670
+ * (qb) => qb.selectFrom('pet').select('id').limit(1)
671
+ * ])
672
+ * .execute()
673
+ * ```
674
+ *
675
+ * `dynamic.ref` can be used to refer to columns not known at
676
+ * compile time:
677
+ *
678
+ * ```ts
679
+ * async function someQuery(groupBy: string) {
680
+ * const { ref } = db.dynamic
681
+ *
682
+ * return await db
683
+ * .selectFrom('person')
684
+ * .select('first_name')
685
+ * .groupBy(ref(groupBy))
686
+ * .execute()
687
+ * }
688
+ *
689
+ * someQuery('first_name')
690
+ * ```
691
+ *
692
+ * The generated SQL (PostgreSQL):
693
+ *
694
+ * ```sql
695
+ * select "first_name"
696
+ * from "person"
697
+ * group by "first_name"
698
+ * ```
699
+ */
405
700
  groupBy(groupBy) {
406
701
  return new SelectQueryBuilder({
407
702
  ...this.#props,
@@ -610,7 +905,7 @@ export class SelectQueryBuilder {
610
905
  * db.selectFrom('person')
611
906
  * .select(['id', 'first_name'])
612
907
  * .clearSelect()
613
- * .select(['id','gender'])
908
+ * .select(['id', 'gender'])
614
909
  * ```
615
910
  *
616
911
  * The generated SQL(PostgreSQL):
@@ -705,7 +1000,8 @@ export class SelectQueryBuilder {
705
1000
  });
706
1001
  }
707
1002
  /**
708
- * Simply calls the given function passing `this` as the only argument.
1003
+ * Simply calls the provided function passing `this` as the only argument. `$call` returns
1004
+ * what the provided function returns.
709
1005
  *
710
1006
  * If you want to conditionally call a method on `this`, see
711
1007
  * the {@link $if} method.
@@ -738,12 +1034,29 @@ export class SelectQueryBuilder {
738
1034
  /**
739
1035
  * Call `func(this)` if `condition` is true.
740
1036
  *
741
- * This method is especially handy with optional selects. Any `select` or `selectAll`
742
- * method calls add columns as optional fields to the output type when called inside
743
- * the `func` callback. This is because we can't know if those selections were actually
744
- * made before running the code.
1037
+ * NOTE: This method has an impact on typescript performance and it should only be used
1038
+ * when necessary. Remember that you can call most methods like `where` conditionally
1039
+ * like this:
1040
+ *
1041
+ * ```ts
1042
+ * let query = db.selectFrom('person').selectAll()
1043
+ *
1044
+ * if (firstName) {
1045
+ * query = query.where('first_name', '=', firstName)
1046
+ * }
1047
+ *
1048
+ * if (lastName) {
1049
+ * query = query.where('last_name', '=', lastName)
1050
+ * }
1051
+ *
1052
+ * const result = await query.execute()
1053
+ * ```
1054
+ *
1055
+ * This method is mainly useful with optional selects. Any `select` or `selectAll`
1056
+ * method called inside the callback add optional fields to the result type. This is
1057
+ * because we can't know if those selections were actually made before running the code.
745
1058
  *
746
- * Also see [this recipe](https://github.com/koskimas/kysely/tree/master/recipes/conditional-selects.md)
1059
+ * Also see [this recipe](https://github.com/koskimas/kysely/tree/master/site/docs/recipes/conditional-selects.md)
747
1060
  *
748
1061
  * ### Examples
749
1062
  *
@@ -900,42 +1213,19 @@ export class SelectQueryBuilder {
900
1213
  * the query returned no result.
901
1214
  *
902
1215
  * By default an instance of {@link NoResultError} is thrown, but you can
903
- * provide a custom error class as the only argument to throw a different
1216
+ * provide a custom error class, or callback to throw a different
904
1217
  * error.
905
1218
  */
906
1219
  async executeTakeFirstOrThrow(errorConstructor = NoResultError) {
907
1220
  const result = await this.executeTakeFirst();
908
1221
  if (result === undefined) {
909
- throw new errorConstructor(this.toOperationNode());
1222
+ const error = isNoResultErrorConstructor(errorConstructor)
1223
+ ? new errorConstructor(this.toOperationNode())
1224
+ : errorConstructor(this.toOperationNode());
1225
+ throw error;
910
1226
  }
911
1227
  return result;
912
1228
  }
913
- /**
914
- * Executes the query and streams the rows.
915
- *
916
- * The optional argument `chunkSize` defines how many rows to fetch from the database
917
- * at a time. It only affects some dialects like PostgreSQL that support it.
918
- *
919
- * ### Examples
920
- *
921
- * ```ts
922
- * const stream = db.
923
- * .selectFrom('person')
924
- * .select(['first_name', 'last_name'])
925
- * .where('gender', '=', 'other')
926
- * .stream()
927
- *
928
- * for await (const person of stream) {
929
- * console.log(person.first_name)
930
- *
931
- * if (person.last_name === 'Something') {
932
- * // Breaking or returning before the stream has ended will release
933
- * // the database connection and invalidate the stream.
934
- * break
935
- * }
936
- * }
937
- * ```
938
- */
939
1229
  async *stream(chunkSize = 100) {
940
1230
  const compiledQuery = this.compile();
941
1231
  const stream = this.#props.executor.stream(compiledQuery, chunkSize, this.#props.queryId);
@@ -943,45 +1233,10 @@ export class SelectQueryBuilder {
943
1233
  yield* item.rows;
944
1234
  }
945
1235
  }
946
- /**
947
- * Executes query with `explain` statement before `select` keyword.
948
- *
949
- * ```ts
950
- * const explained = await db
951
- * .selectFrom('person')
952
- * .where('gender', '=', 'female')
953
- * .selectAll()
954
- * .explain('json')
955
- * ```
956
- *
957
- * The generated SQL (MySQL):
958
- *
959
- * ```sql
960
- * explain format=json select * from `person` where `gender` = ?
961
- * ```
962
- *
963
- * You can also execute `explain analyze` statements.
964
- *
965
- * ```ts
966
- * import { sql } from 'kysely'
967
- *
968
- * const explained = await db
969
- * .selectFrom('person')
970
- * .where('gender', '=', 'female')
971
- * .selectAll()
972
- * .explain('json', sql`analyze`)
973
- * ```
974
- *
975
- * The generated SQL (PostgreSQL):
976
- *
977
- * ```sql
978
- * explain (analyze, format json) select * from "person" where "gender" = $1
979
- * ```
980
- */
981
1236
  async explain(format, options) {
982
1237
  const builder = new SelectQueryBuilder({
983
1238
  ...this.#props,
984
- queryNode: SelectQueryNode.cloneWithExplain(this.#props.queryNode, ExplainNode.create(format, options?.toOperationNode())),
1239
+ queryNode: QueryNode.cloneWithExplain(this.#props.queryNode, format, options),
985
1240
  });
986
1241
  return await builder.execute();
987
1242
  }