kysely 0.24.2 → 0.26.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 (351) hide show
  1. package/README.md +31 -567
  2. package/dist/cjs/dialect/database-introspector.d.ts +1 -1
  3. package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +2 -1
  4. package/dist/cjs/dialect/mysql/mysql-driver.js +5 -1
  5. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +1 -1
  6. package/dist/cjs/dialect/postgres/postgres-introspector.js +1 -1
  7. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +1 -1
  8. package/dist/cjs/driver/database-connection.d.ts +6 -0
  9. package/dist/cjs/driver/driver.d.ts +1 -1
  10. package/dist/cjs/driver/runtime-driver.js +6 -6
  11. package/dist/cjs/dynamic/dynamic.d.ts +1 -1
  12. package/dist/cjs/dynamic/dynamic.js +1 -1
  13. package/dist/cjs/expression/expression-builder.d.ts +263 -109
  14. package/dist/cjs/expression/expression-builder.js +38 -7
  15. package/dist/cjs/expression/expression-wrapper.d.ts +296 -5
  16. package/dist/cjs/expression/expression-wrapper.js +70 -2
  17. package/dist/cjs/helpers/mysql.d.ts +3 -3
  18. package/dist/cjs/helpers/mysql.js +2 -2
  19. package/dist/cjs/helpers/postgres.d.ts +31 -19
  20. package/dist/cjs/helpers/postgres.js +30 -18
  21. package/dist/cjs/index.d.ts +10 -0
  22. package/dist/cjs/index.js +10 -0
  23. package/dist/cjs/kysely.d.ts +42 -15
  24. package/dist/cjs/kysely.js +41 -10
  25. package/dist/cjs/migration/file-migration-provider.js +2 -2
  26. package/dist/cjs/operation-node/aggregate-function-node.d.ts +3 -7
  27. package/dist/cjs/operation-node/aggregate-function-node.js +1 -1
  28. package/dist/cjs/operation-node/alter-column-node.d.ts +3 -5
  29. package/dist/cjs/operation-node/alter-column-node.js +2 -7
  30. package/dist/cjs/operation-node/alter-table-node.d.ts +3 -3
  31. package/dist/cjs/operation-node/alter-table-node.js +1 -2
  32. package/dist/cjs/operation-node/case-node.d.ts +19 -0
  33. package/dist/cjs/operation-node/case-node.js +42 -0
  34. package/dist/cjs/operation-node/column-definition-node.d.ts +1 -1
  35. package/dist/cjs/operation-node/constraint-node.d.ts +1 -1
  36. package/dist/cjs/operation-node/create-index-node.d.ts +4 -3
  37. package/dist/cjs/operation-node/create-index-node.js +6 -0
  38. package/dist/cjs/operation-node/create-schema-node.d.ts +1 -1
  39. package/dist/cjs/operation-node/create-table-node.d.ts +2 -2
  40. package/dist/cjs/operation-node/create-type-node.d.ts +1 -1
  41. package/dist/cjs/operation-node/create-view-node.d.ts +1 -1
  42. package/dist/cjs/operation-node/data-type-node.d.ts +2 -2
  43. package/dist/cjs/operation-node/drop-constraint-node.d.ts +1 -1
  44. package/dist/cjs/operation-node/drop-index-node.d.ts +1 -1
  45. package/dist/cjs/operation-node/drop-schema-node.d.ts +1 -1
  46. package/dist/cjs/operation-node/drop-table-node.d.ts +1 -1
  47. package/dist/cjs/operation-node/drop-type-node.d.ts +1 -1
  48. package/dist/cjs/operation-node/drop-view-node.d.ts +1 -1
  49. package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +1 -1
  50. package/dist/cjs/operation-node/generated-node.d.ts +1 -1
  51. package/dist/cjs/operation-node/insert-query-node.d.ts +1 -1
  52. package/dist/cjs/operation-node/join-node.d.ts +1 -2
  53. package/dist/cjs/operation-node/join-node.js +0 -8
  54. package/dist/cjs/operation-node/json-operator-chain-node.d.ts +16 -0
  55. package/dist/cjs/operation-node/json-operator-chain-node.js +25 -0
  56. package/dist/cjs/operation-node/json-path-leg-node.d.ts +14 -0
  57. package/dist/cjs/operation-node/json-path-leg-node.js +19 -0
  58. package/dist/cjs/operation-node/json-path-node.d.ts +16 -0
  59. package/dist/cjs/operation-node/json-path-node.js +25 -0
  60. package/dist/cjs/operation-node/json-reference-node.d.ts +17 -0
  61. package/dist/cjs/operation-node/json-reference-node.js +25 -0
  62. package/dist/cjs/operation-node/on-conflict-node.d.ts +1 -1
  63. package/dist/cjs/operation-node/on-duplicate-key-node.d.ts +1 -1
  64. package/dist/cjs/operation-node/operation-node-transformer.d.ts +12 -0
  65. package/dist/cjs/operation-node/operation-node-transformer.js +53 -3
  66. package/dist/cjs/operation-node/operation-node-visitor.d.ts +12 -0
  67. package/dist/cjs/operation-node/operation-node-visitor.js +6 -0
  68. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  69. package/dist/cjs/operation-node/operator-node.d.ts +13 -9
  70. package/dist/cjs/operation-node/operator-node.js +12 -2
  71. package/dist/cjs/operation-node/query-node.d.ts +9 -10
  72. package/dist/cjs/operation-node/query-node.js +0 -8
  73. package/dist/cjs/operation-node/reference-node.d.ts +2 -2
  74. package/dist/cjs/operation-node/reference-node.js +1 -1
  75. package/dist/cjs/operation-node/references-node.d.ts +1 -1
  76. package/dist/cjs/operation-node/select-modifier-node.d.ts +1 -1
  77. package/dist/cjs/operation-node/select-query-node.d.ts +0 -1
  78. package/dist/cjs/operation-node/select-query-node.js +0 -8
  79. package/dist/cjs/operation-node/selection-node.d.ts +1 -1
  80. package/dist/cjs/operation-node/set-operation-node.d.ts +1 -1
  81. package/dist/cjs/operation-node/simple-reference-expression-node.d.ts +1 -1
  82. package/dist/cjs/operation-node/update-query-node.d.ts +1 -1
  83. package/dist/cjs/operation-node/values-node.d.ts +1 -1
  84. package/dist/cjs/operation-node/when-node.d.ts +14 -0
  85. package/dist/cjs/operation-node/when-node.js +24 -0
  86. package/dist/cjs/operation-node/with-node.d.ts +1 -1
  87. package/dist/cjs/parser/binary-operation-parser.d.ts +9 -11
  88. package/dist/cjs/parser/binary-operation-parser.js +40 -103
  89. package/dist/cjs/parser/coalesce-parser.d.ts +1 -1
  90. package/dist/cjs/parser/data-type-parser.d.ts +1 -1
  91. package/dist/cjs/parser/default-value-parser.d.ts +1 -1
  92. package/dist/cjs/parser/expression-parser.d.ts +6 -5
  93. package/dist/cjs/parser/group-by-parser.d.ts +2 -2
  94. package/dist/cjs/parser/insert-values-parser.d.ts +4 -4
  95. package/dist/cjs/parser/join-parser.d.ts +4 -4
  96. package/dist/cjs/parser/order-by-parser.d.ts +4 -3
  97. package/dist/cjs/parser/order-by-parser.js +5 -1
  98. package/dist/cjs/parser/partition-by-parser.d.ts +2 -2
  99. package/dist/cjs/parser/reference-parser.d.ts +16 -8
  100. package/dist/cjs/parser/reference-parser.js +43 -16
  101. package/dist/cjs/parser/returning-parser.d.ts +2 -2
  102. package/dist/cjs/parser/select-parser.d.ts +9 -9
  103. package/dist/cjs/parser/table-parser.d.ts +14 -13
  104. package/dist/cjs/parser/unary-operation-parser.d.ts +1 -1
  105. package/dist/cjs/parser/update-set-parser.d.ts +3 -3
  106. package/dist/cjs/parser/update-set-parser.js +1 -3
  107. package/dist/cjs/parser/value-parser.d.ts +4 -4
  108. package/dist/cjs/parser/with-parser.d.ts +14 -9
  109. package/dist/cjs/plugin/camel-case/camel-case.d.ts +1 -1
  110. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +42 -0
  111. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +32 -0
  112. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +22 -6
  113. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +5 -38
  114. package/dist/cjs/query-builder/aggregate-function-builder.js +4 -59
  115. package/dist/cjs/query-builder/case-builder.d.ts +111 -0
  116. package/dist/cjs/query-builder/case-builder.js +75 -0
  117. package/dist/cjs/query-builder/delete-query-builder.d.ts +130 -63
  118. package/dist/cjs/query-builder/delete-query-builder.js +42 -59
  119. package/dist/cjs/query-builder/delete-result.d.ts +1 -2
  120. package/dist/cjs/query-builder/delete-result.js +2 -8
  121. package/dist/cjs/query-builder/function-module.d.ts +78 -69
  122. package/dist/cjs/query-builder/function-module.js +12 -16
  123. package/dist/cjs/query-builder/having-interface.d.ts +2 -35
  124. package/dist/cjs/query-builder/insert-query-builder.d.ts +99 -47
  125. package/dist/cjs/query-builder/insert-query-builder.js +57 -26
  126. package/dist/cjs/query-builder/insert-result.d.ts +3 -4
  127. package/dist/cjs/query-builder/insert-result.js +5 -14
  128. package/dist/cjs/query-builder/join-builder.d.ts +2 -35
  129. package/dist/cjs/query-builder/join-builder.js +1 -56
  130. package/dist/cjs/query-builder/json-path-builder.d.ts +212 -0
  131. package/dist/cjs/query-builder/json-path-builder.js +191 -0
  132. package/dist/cjs/query-builder/no-result-error.d.ts +1 -1
  133. package/dist/cjs/query-builder/on-conflict-builder.d.ts +144 -73
  134. package/dist/cjs/query-builder/on-conflict-builder.js +2 -111
  135. package/dist/cjs/query-builder/over-builder.d.ts +2 -2
  136. package/dist/cjs/query-builder/over-builder.js +1 -1
  137. package/dist/cjs/query-builder/returning-interface.d.ts +1 -1
  138. package/dist/cjs/query-builder/select-query-builder.d.ts +184 -138
  139. package/dist/cjs/query-builder/select-query-builder.js +64 -130
  140. package/dist/cjs/query-builder/update-query-builder.d.ts +143 -71
  141. package/dist/cjs/query-builder/update-query-builder.js +47 -60
  142. package/dist/cjs/query-builder/update-result.d.ts +3 -3
  143. package/dist/cjs/query-builder/update-result.js +5 -9
  144. package/dist/cjs/query-builder/where-interface.d.ts +73 -38
  145. package/dist/cjs/query-compiler/compiled-query.d.ts +1 -1
  146. package/dist/cjs/query-compiler/compiled-query.js +2 -2
  147. package/dist/cjs/query-compiler/default-query-compiler.d.ts +12 -0
  148. package/dist/cjs/query-compiler/default-query-compiler.js +67 -5
  149. package/dist/cjs/query-compiler/query-compiler.d.ts +1 -1
  150. package/dist/cjs/query-creator.d.ts +4 -2
  151. package/dist/cjs/schema/alter-column-builder.d.ts +13 -7
  152. package/dist/cjs/schema/alter-column-builder.js +20 -22
  153. package/dist/cjs/schema/alter-table-builder.d.ts +0 -4
  154. package/dist/cjs/schema/alter-table-builder.js +2 -9
  155. package/dist/cjs/schema/column-definition-builder.d.ts +1 -1
  156. package/dist/cjs/schema/column-definition-builder.js +1 -2
  157. package/dist/cjs/schema/create-index-builder.d.ts +49 -7
  158. package/dist/cjs/schema/create-index-builder.js +52 -14
  159. package/dist/cjs/schema/create-table-builder.d.ts +2 -6
  160. package/dist/cjs/schema/create-table-builder.js +0 -6
  161. package/dist/cjs/schema/schema.d.ts +1 -2
  162. package/dist/cjs/schema/schema.js +2 -3
  163. package/dist/cjs/util/column-type.d.ts +21 -16
  164. package/dist/cjs/util/explainable.d.ts +1 -1
  165. package/dist/cjs/util/infer-result.d.ts +2 -2
  166. package/dist/cjs/util/log.d.ts +6 -6
  167. package/dist/cjs/util/log.js +4 -4
  168. package/dist/cjs/util/object-utils.d.ts +2 -1
  169. package/dist/cjs/util/require-all-props.d.ts +1 -1
  170. package/dist/cjs/util/type-utils.d.ts +54 -40
  171. package/dist/esm/dialect/database-introspector.d.ts +1 -1
  172. package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +2 -1
  173. package/dist/esm/dialect/mysql/mysql-driver.js +5 -1
  174. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +1 -1
  175. package/dist/esm/dialect/postgres/postgres-introspector.js +1 -1
  176. package/dist/esm/dialect/sqlite/sqlite-introspector.js +1 -1
  177. package/dist/esm/driver/database-connection.d.ts +6 -0
  178. package/dist/esm/driver/driver.d.ts +1 -1
  179. package/dist/esm/driver/runtime-driver.js +6 -6
  180. package/dist/esm/dynamic/dynamic.d.ts +1 -1
  181. package/dist/esm/dynamic/dynamic.js +1 -1
  182. package/dist/esm/expression/expression-builder.d.ts +263 -109
  183. package/dist/esm/expression/expression-builder.js +40 -9
  184. package/dist/esm/expression/expression-wrapper.d.ts +296 -5
  185. package/dist/esm/expression/expression-wrapper.js +67 -1
  186. package/dist/esm/helpers/mysql.d.ts +3 -3
  187. package/dist/esm/helpers/mysql.js +2 -2
  188. package/dist/esm/helpers/postgres.d.ts +31 -19
  189. package/dist/esm/helpers/postgres.js +30 -18
  190. package/dist/esm/index.d.ts +10 -0
  191. package/dist/esm/index.js +10 -0
  192. package/dist/esm/kysely.d.ts +42 -15
  193. package/dist/esm/kysely.js +42 -11
  194. package/dist/esm/operation-node/aggregate-function-node.d.ts +3 -7
  195. package/dist/esm/operation-node/aggregate-function-node.js +1 -1
  196. package/dist/esm/operation-node/alter-column-node.d.ts +3 -5
  197. package/dist/esm/operation-node/alter-column-node.js +2 -7
  198. package/dist/esm/operation-node/alter-table-node.d.ts +3 -3
  199. package/dist/esm/operation-node/alter-table-node.js +1 -2
  200. package/dist/esm/operation-node/case-node.d.ts +19 -0
  201. package/dist/esm/operation-node/case-node.js +40 -0
  202. package/dist/esm/operation-node/column-definition-node.d.ts +1 -1
  203. package/dist/esm/operation-node/constraint-node.d.ts +1 -1
  204. package/dist/esm/operation-node/create-index-node.d.ts +4 -3
  205. package/dist/esm/operation-node/create-index-node.js +6 -0
  206. package/dist/esm/operation-node/create-schema-node.d.ts +1 -1
  207. package/dist/esm/operation-node/create-table-node.d.ts +2 -2
  208. package/dist/esm/operation-node/create-type-node.d.ts +1 -1
  209. package/dist/esm/operation-node/create-view-node.d.ts +1 -1
  210. package/dist/esm/operation-node/data-type-node.d.ts +2 -2
  211. package/dist/esm/operation-node/drop-constraint-node.d.ts +1 -1
  212. package/dist/esm/operation-node/drop-index-node.d.ts +1 -1
  213. package/dist/esm/operation-node/drop-schema-node.d.ts +1 -1
  214. package/dist/esm/operation-node/drop-table-node.d.ts +1 -1
  215. package/dist/esm/operation-node/drop-type-node.d.ts +1 -1
  216. package/dist/esm/operation-node/drop-view-node.d.ts +1 -1
  217. package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +1 -1
  218. package/dist/esm/operation-node/generated-node.d.ts +1 -1
  219. package/dist/esm/operation-node/insert-query-node.d.ts +1 -1
  220. package/dist/esm/operation-node/join-node.d.ts +1 -2
  221. package/dist/esm/operation-node/join-node.js +0 -8
  222. package/dist/esm/operation-node/json-operator-chain-node.d.ts +16 -0
  223. package/dist/esm/operation-node/json-operator-chain-node.js +23 -0
  224. package/dist/esm/operation-node/json-path-leg-node.d.ts +14 -0
  225. package/dist/esm/operation-node/json-path-leg-node.js +17 -0
  226. package/dist/esm/operation-node/json-path-node.d.ts +16 -0
  227. package/dist/esm/operation-node/json-path-node.js +23 -0
  228. package/dist/esm/operation-node/json-reference-node.d.ts +17 -0
  229. package/dist/esm/operation-node/json-reference-node.js +23 -0
  230. package/dist/esm/operation-node/on-conflict-node.d.ts +1 -1
  231. package/dist/esm/operation-node/on-duplicate-key-node.d.ts +1 -1
  232. package/dist/esm/operation-node/operation-node-transformer.d.ts +12 -0
  233. package/dist/esm/operation-node/operation-node-transformer.js +53 -3
  234. package/dist/esm/operation-node/operation-node-visitor.d.ts +12 -0
  235. package/dist/esm/operation-node/operation-node-visitor.js +6 -0
  236. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  237. package/dist/esm/operation-node/operator-node.d.ts +13 -9
  238. package/dist/esm/operation-node/operator-node.js +10 -1
  239. package/dist/esm/operation-node/query-node.d.ts +9 -10
  240. package/dist/esm/operation-node/query-node.js +0 -8
  241. package/dist/esm/operation-node/reference-node.d.ts +2 -2
  242. package/dist/esm/operation-node/reference-node.js +1 -1
  243. package/dist/esm/operation-node/references-node.d.ts +1 -1
  244. package/dist/esm/operation-node/select-modifier-node.d.ts +1 -1
  245. package/dist/esm/operation-node/select-query-node.d.ts +0 -1
  246. package/dist/esm/operation-node/select-query-node.js +0 -8
  247. package/dist/esm/operation-node/selection-node.d.ts +1 -1
  248. package/dist/esm/operation-node/set-operation-node.d.ts +1 -1
  249. package/dist/esm/operation-node/simple-reference-expression-node.d.ts +1 -1
  250. package/dist/esm/operation-node/update-query-node.d.ts +1 -1
  251. package/dist/esm/operation-node/values-node.d.ts +1 -1
  252. package/dist/esm/operation-node/when-node.d.ts +14 -0
  253. package/dist/esm/operation-node/when-node.js +22 -0
  254. package/dist/esm/operation-node/with-node.d.ts +1 -1
  255. package/dist/esm/parser/binary-operation-parser.d.ts +9 -11
  256. package/dist/esm/parser/binary-operation-parser.js +38 -99
  257. package/dist/esm/parser/coalesce-parser.d.ts +1 -1
  258. package/dist/esm/parser/data-type-parser.d.ts +1 -1
  259. package/dist/esm/parser/default-value-parser.d.ts +1 -1
  260. package/dist/esm/parser/expression-parser.d.ts +6 -5
  261. package/dist/esm/parser/group-by-parser.d.ts +2 -2
  262. package/dist/esm/parser/insert-values-parser.d.ts +4 -4
  263. package/dist/esm/parser/join-parser.d.ts +4 -4
  264. package/dist/esm/parser/order-by-parser.d.ts +4 -3
  265. package/dist/esm/parser/order-by-parser.js +3 -0
  266. package/dist/esm/parser/partition-by-parser.d.ts +2 -2
  267. package/dist/esm/parser/reference-parser.d.ts +16 -8
  268. package/dist/esm/parser/reference-parser.js +40 -15
  269. package/dist/esm/parser/returning-parser.d.ts +2 -2
  270. package/dist/esm/parser/select-parser.d.ts +9 -9
  271. package/dist/esm/parser/table-parser.d.ts +14 -13
  272. package/dist/esm/parser/unary-operation-parser.d.ts +1 -1
  273. package/dist/esm/parser/update-set-parser.d.ts +3 -3
  274. package/dist/esm/parser/update-set-parser.js +2 -4
  275. package/dist/esm/parser/value-parser.d.ts +4 -4
  276. package/dist/esm/parser/with-parser.d.ts +14 -9
  277. package/dist/esm/plugin/camel-case/camel-case.d.ts +1 -1
  278. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +42 -0
  279. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +29 -0
  280. package/dist/esm/plugin/with-schema/with-schema-transformer.js +22 -6
  281. package/dist/esm/query-builder/aggregate-function-builder.d.ts +5 -38
  282. package/dist/esm/query-builder/aggregate-function-builder.js +5 -60
  283. package/dist/esm/query-builder/case-builder.d.ts +111 -0
  284. package/dist/esm/query-builder/case-builder.js +69 -0
  285. package/dist/esm/query-builder/delete-query-builder.d.ts +130 -63
  286. package/dist/esm/query-builder/delete-query-builder.js +43 -60
  287. package/dist/esm/query-builder/delete-result.d.ts +1 -2
  288. package/dist/esm/query-builder/delete-result.js +2 -8
  289. package/dist/esm/query-builder/function-module.d.ts +78 -69
  290. package/dist/esm/query-builder/function-module.js +13 -17
  291. package/dist/esm/query-builder/having-interface.d.ts +2 -35
  292. package/dist/esm/query-builder/insert-query-builder.d.ts +99 -47
  293. package/dist/esm/query-builder/insert-query-builder.js +57 -26
  294. package/dist/esm/query-builder/insert-result.d.ts +3 -4
  295. package/dist/esm/query-builder/insert-result.js +5 -14
  296. package/dist/esm/query-builder/join-builder.d.ts +2 -35
  297. package/dist/esm/query-builder/join-builder.js +2 -57
  298. package/dist/esm/query-builder/json-path-builder.d.ts +212 -0
  299. package/dist/esm/query-builder/json-path-builder.js +186 -0
  300. package/dist/esm/query-builder/no-result-error.d.ts +1 -1
  301. package/dist/esm/query-builder/on-conflict-builder.d.ts +144 -73
  302. package/dist/esm/query-builder/on-conflict-builder.js +3 -112
  303. package/dist/esm/query-builder/over-builder.d.ts +2 -2
  304. package/dist/esm/query-builder/over-builder.js +1 -1
  305. package/dist/esm/query-builder/returning-interface.d.ts +1 -1
  306. package/dist/esm/query-builder/select-query-builder.d.ts +184 -138
  307. package/dist/esm/query-builder/select-query-builder.js +65 -131
  308. package/dist/esm/query-builder/update-query-builder.d.ts +143 -71
  309. package/dist/esm/query-builder/update-query-builder.js +48 -61
  310. package/dist/esm/query-builder/update-result.d.ts +3 -3
  311. package/dist/esm/query-builder/update-result.js +5 -9
  312. package/dist/esm/query-builder/where-interface.d.ts +73 -38
  313. package/dist/esm/query-compiler/compiled-query.d.ts +1 -1
  314. package/dist/esm/query-compiler/compiled-query.js +2 -2
  315. package/dist/esm/query-compiler/default-query-compiler.d.ts +12 -0
  316. package/dist/esm/query-compiler/default-query-compiler.js +67 -5
  317. package/dist/esm/query-compiler/query-compiler.d.ts +1 -1
  318. package/dist/esm/query-creator.d.ts +4 -2
  319. package/dist/esm/schema/alter-column-builder.d.ts +13 -7
  320. package/dist/esm/schema/alter-column-builder.js +20 -22
  321. package/dist/esm/schema/alter-table-builder.d.ts +0 -4
  322. package/dist/esm/schema/alter-table-builder.js +2 -9
  323. package/dist/esm/schema/column-definition-builder.d.ts +1 -1
  324. package/dist/esm/schema/column-definition-builder.js +1 -2
  325. package/dist/esm/schema/create-index-builder.d.ts +49 -7
  326. package/dist/esm/schema/create-index-builder.js +54 -16
  327. package/dist/esm/schema/create-table-builder.d.ts +2 -6
  328. package/dist/esm/schema/create-table-builder.js +0 -6
  329. package/dist/esm/schema/schema.d.ts +1 -2
  330. package/dist/esm/schema/schema.js +2 -3
  331. package/dist/esm/util/column-type.d.ts +21 -16
  332. package/dist/esm/util/explainable.d.ts +1 -1
  333. package/dist/esm/util/infer-result.d.ts +2 -2
  334. package/dist/esm/util/log.d.ts +6 -6
  335. package/dist/esm/util/log.js +4 -4
  336. package/dist/esm/util/object-utils.d.ts +2 -1
  337. package/dist/esm/util/require-all-props.d.ts +1 -1
  338. package/dist/esm/util/type-utils.d.ts +54 -40
  339. package/package.json +25 -23
  340. package/dist/cjs/query-builder/deprecated-having-expression-builder.d.ts +0 -62
  341. package/dist/cjs/query-builder/deprecated-having-expression-builder.js +0 -2
  342. package/dist/cjs/query-builder/deprecated-on-expression-builder.d.ts +0 -62
  343. package/dist/cjs/query-builder/deprecated-on-expression-builder.js +0 -2
  344. package/dist/cjs/query-builder/deprecated-where-expression-builder.d.ts +0 -62
  345. package/dist/cjs/query-builder/deprecated-where-expression-builder.js +0 -2
  346. package/dist/esm/query-builder/deprecated-having-expression-builder.d.ts +0 -62
  347. package/dist/esm/query-builder/deprecated-having-expression-builder.js +0 -2
  348. package/dist/esm/query-builder/deprecated-on-expression-builder.d.ts +0 -62
  349. package/dist/esm/query-builder/deprecated-on-expression-builder.js +0 -2
  350. package/dist/esm/query-builder/deprecated-where-expression-builder.d.ts +0 -62
  351. package/dist/esm/query-builder/deprecated-where-expression-builder.js +0 -2
@@ -69,7 +69,7 @@ export declare class DynamicModule {
69
69
  *
70
70
  * const [person] = await db.selectFrom('person')
71
71
  * .select([
72
- * ref<PossibleColumns>(columnFromUserInput)
72
+ * ref<PossibleColumns>(columnFromUserInput),
73
73
  * 'id'
74
74
  * ])
75
75
  * .execute()
@@ -70,7 +70,7 @@ export class DynamicModule {
70
70
  *
71
71
  * const [person] = await db.selectFrom('person')
72
72
  * .select([
73
- * ref<PossibleColumns>(columnFromUserInput)
73
+ * ref<PossibleColumns>(columnFromUserInput),
74
74
  * 'id'
75
75
  * ])
76
76
  * .execute()
@@ -1,15 +1,87 @@
1
1
  import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
2
2
  import { TableExpression, From, FromTables, ExtractTableAlias, AnyAliasedTable, PickTableWithAlias } from '../parser/table-parser.js';
3
3
  import { FunctionModule } from '../query-builder/function-module.js';
4
- import { ExtractTypeFromReferenceExpression, ReferenceExpression, StringReference } from '../parser/reference-parser.js';
4
+ import { ExtractTypeFromReferenceExpression, ReferenceExpression, SimpleReferenceExpression, StringReference } from '../parser/reference-parser.js';
5
5
  import { QueryExecutor } from '../query-executor/query-executor.js';
6
6
  import { BinaryOperatorExpression, ComparisonOperatorExpression, OperandValueExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
7
7
  import { Expression } from './expression.js';
8
8
  import { ExpressionWrapper } from './expression-wrapper.js';
9
- import { ComparisonOperator, UnaryOperator } from '../operation-node/operator-node.js';
9
+ import { ComparisonOperator, JSONOperatorWith$, UnaryOperator } from '../operation-node/operator-node.js';
10
10
  import { SqlBool } from '../util/type-utils.js';
11
11
  import { ExtractTypeFromValueExpressionOrList } from '../parser/value-parser.js';
12
+ import { CaseBuilder } from '../query-builder/case-builder.js';
13
+ import { JSONPathBuilder } from '../query-builder/json-path-builder.js';
12
14
  export interface ExpressionBuilder<DB, TB extends keyof DB> {
15
+ /**
16
+ * Creates a binary expression.
17
+ *
18
+ * This function returns an {@link Expression} and can be used pretty much anywhere.
19
+ * See the examples for a couple of possible use cases.
20
+ *
21
+ * ### Examples
22
+ *
23
+ * In the following example `eb` is used to increment an integer column:
24
+ *
25
+ * ```ts
26
+ * db.updateTable('person')
27
+ * .set((eb) => ({
28
+ * age: eb('age', '+', 1)
29
+ * }))
30
+ * .where('id', '=', id)
31
+ * ```
32
+ *
33
+ * The generated SQL (PostgreSQL):
34
+ *
35
+ * ```sql
36
+ * update "person"
37
+ * set "age" = "age" + $1
38
+ * where "id" = $2
39
+ * ```
40
+ *
41
+ * By default the third argument is a value. {@link ref} can be used to
42
+ * pass in a column reference instead:
43
+ *
44
+ * ```ts
45
+ * db.updateTable('person')
46
+ * .set((eb) => ({
47
+ * age: eb('age', '+', eb.ref('age'))
48
+ * }))
49
+ * .where('id', '=', id)
50
+ * ```
51
+ *
52
+ * The generated SQL (PostgreSQL):
53
+ *
54
+ * ```sql
55
+ * update "person"
56
+ * set "age" = "age" + "age"
57
+ * where "id" = $1
58
+ * ```
59
+ */
60
+ <RE extends ReferenceExpression<DB, TB>, OP extends BinaryOperatorExpression>(lhs: RE, op: OP, rhs: OperandValueExpressionOrList<DB, TB, RE>): ExpressionWrapper<DB, TB, OP extends ComparisonOperator ? SqlBool : ExtractTypeFromReferenceExpression<DB, TB, RE>>;
61
+ /**
62
+ * Returns a copy of `this` expression builder, for destructuring purposes.
63
+ *
64
+ * ### Examples
65
+ *
66
+ * ```ts
67
+ * db.selectFrom('person')
68
+ * .where(({ eb, exists, selectFrom }) =>
69
+ * eb('first_name', '=', 'Jennifer').and(
70
+ * exists(selectFrom('pet').whereRef('owner_id', '=', 'person.id').select('pet.id'))
71
+ * )
72
+ * )
73
+ * .selectAll()
74
+ * ```
75
+ *
76
+ * The generated SQL (PostgreSQL):
77
+ *
78
+ * ```sql
79
+ * select * from "person" where "first_name" = $1 and exists (
80
+ * select "pet.id" from "pet" where "owner_id" = "person.id"
81
+ * )
82
+ * ```
83
+ */
84
+ eb: ExpressionBuilder<DB, TB>;
13
85
  /**
14
86
  * Returns a {@link FunctionModule} that can be used to write type safe function
15
87
  * calls.
@@ -27,7 +99,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
27
99
  * eb.fn.count('pet.id').as('pet_count')
28
100
  * ])
29
101
  * .groupBy('person.id')
30
- * .having(count('pet.id'), '>', 10)
102
+ * .having((eb) => eb.fn.count('pet.id'), '>', 10)
31
103
  * .execute()
32
104
  * ```
33
105
  *
@@ -92,25 +164,82 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
92
164
  selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, TB | ExtractTableAlias<DB, TE>, {}>;
93
165
  selectFrom<TE extends TableExpression<DB, TB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
94
166
  /**
95
- * This can be used to reference columns.
167
+ * Creates a `case` statement/operator.
168
+ *
169
+ * ### Examples
170
+ *
171
+ * Kitchen sink example with 2 flavors of `case` operator:
172
+ *
173
+ * ```ts
174
+ * import { sql } from 'kysely'
175
+ *
176
+ * const { title, name } = await db
177
+ * .selectFrom('person')
178
+ * .where('id', '=', '123')
179
+ * .select((eb) => [
180
+ * eb.fn.coalesce('last_name', 'first_name').as('name'),
181
+ * eb
182
+ * .case()
183
+ * .when('gender', '=', 'male')
184
+ * .then('Mr.')
185
+ * .when('gender', '=', 'female')
186
+ * .then(
187
+ * eb
188
+ * .case('martialStatus')
189
+ * .when('single')
190
+ * .then('Ms.')
191
+ * .else('Mrs.')
192
+ * .end()
193
+ * )
194
+ * .end()
195
+ * .as('title'),
196
+ * ])
197
+ * .executeTakeFirstOrThrow()
198
+ * ```
199
+ *
200
+ * The generated SQL (PostgreSQL):
201
+ *
202
+ * ```sql
203
+ * select
204
+ * coalesce("last_name", "first_name") as "name",
205
+ * case
206
+ * when "gender" = $1 then $2
207
+ * when "gender" = $3 then
208
+ * case "martialStatus"
209
+ * when $4 then $5
210
+ * else $6
211
+ * end
212
+ * end as "title"
213
+ * from "person"
214
+ * where "id" = $7
215
+ * ```
216
+ */
217
+ case(): CaseBuilder<DB, TB>;
218
+ case<C extends SimpleReferenceExpression<DB, TB>>(column: C): CaseBuilder<DB, TB, ExtractTypeFromReferenceExpression<DB, TB, C>>;
219
+ case<O>(expression: Expression<O>): CaseBuilder<DB, TB, O>;
220
+ /**
221
+ * This method can be used to reference columns within the query's context. For
222
+ * a non-type-safe version of this method see {@link sql}'s version.
223
+ *
224
+ * Additionally, this method can be used to reference nested JSON properties or
225
+ * array elements. See {@link JSONPathBuilder} for more information.
96
226
  *
97
227
  * ### Examples
98
228
  *
99
- * By default the third argument of {@link bxp} and {@link cmpr} is a value.
229
+ * By default the third argument of binary expressions is a value.
100
230
  * This function can be used to pass in a column reference instead:
101
231
  *
102
232
  * ```ts
103
233
  * db.selectFrom('person')
104
234
  * .selectAll('person')
105
- * .where(({ or, cmpr, ref }) => or([
106
- * cmpr('first_name', '=', ref('last_name')),
107
- * cmpr('first_name', '=', ref('middle_name'))
235
+ * .where((eb) => eb.or([
236
+ * eb('first_name', '=', eb.ref('last_name')),
237
+ * eb('first_name', '=', eb.ref('middle_name'))
108
238
  * ]))
109
239
  * ```
110
240
  *
111
- * In the next example we use the `ref` method to reference
112
- * columns of the virtual table `excluded` in a type-safe way
113
- * to create an upsert operation:
241
+ * In the next example we use the `ref` method to reference columns of the virtual
242
+ * table `excluded` in a type-safe way to create an upsert operation:
114
243
  *
115
244
  * ```ts
116
245
  * db.insertInto('person')
@@ -124,142 +253,126 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
124
253
  * )
125
254
  * ```
126
255
  *
127
- * In the next example we use `ref` in a raw sql expression. Unless you
128
- * want to be as type-safe as possible, this is probably overkill:
256
+ * In the next example we use `ref` in a raw sql expression. Unless you want
257
+ * to be as type-safe as possible, this is probably overkill:
129
258
  *
130
259
  * ```ts
131
260
  * db.update('pet').set((eb) => ({
132
261
  * name: sql`concat(${eb.ref('pet.name')}, ${suffix})`
133
262
  * }))
134
263
  * ```
135
- */
136
- ref<RE extends StringReference<DB, TB>>(reference: RE): ExpressionWrapper<ExtractTypeFromReferenceExpression<DB, TB, RE>>;
137
- /**
138
- * Returns a value expression.
139
264
  *
140
- * This can be used to pass in a value where a reference is taken by default.
265
+ * In the next example we use `ref` to reference a nested JSON property:
141
266
  *
142
- * This function returns an {@link Expression} and can be used pretty much anywhere.
267
+ * ```ts
268
+ * db.selectFrom('person')
269
+ * .where(({ cmpr, ref }) => cmpr(
270
+ * ref('address', '->').key('state').key('abbr'),
271
+ * '=',
272
+ * 'CA'
273
+ * ))
274
+ * .selectAll()
275
+ * ```
143
276
  *
144
- * ### Examples
277
+ * The generated SQL (PostgreSQL):
145
278
  *
146
- * The {@link cmpr} function takes a reference by default as the first argument. `val` could
147
- * be used to pass in a value instead:
279
+ * ```sql
280
+ * select * from "person" where "address"->'state'->'abbr' = $1
281
+ * ```
282
+ *
283
+ * You can also compile to a JSON path expression by using the `->$`or `->>$` operator:
148
284
  *
149
285
  * ```ts
150
- * cmpr(val(38), '=', ref('age'))
286
+ * db.selectFrom('person')
287
+ * .select(({ ref }) =>
288
+ * ref('experience', '->$')
289
+ * .at('last')
290
+ * .key('title')
291
+ * .as('current_job')
292
+ * )
151
293
  * ```
152
294
  *
153
- * The generated SQL (PostgreSQL):
295
+ * The generated SQL (MySQL):
154
296
  *
155
297
  * ```sql
156
- * $1 = "age"
298
+ * select `experience`->'$[last].title' as `current_job` from `person`
157
299
  * ```
158
300
  */
159
- val<VE>(value: VE): ExpressionWrapper<ExtractTypeFromValueExpressionOrList<VE>>;
301
+ ref<RE extends StringReference<DB, TB>>(reference: RE): ExpressionWrapper<DB, TB, ExtractTypeFromReferenceExpression<DB, TB, RE>>;
302
+ ref<RE extends StringReference<DB, TB>>(reference: RE, op: JSONOperatorWith$): JSONPathBuilder<ExtractTypeFromReferenceExpression<DB, TB, RE>>;
160
303
  /**
161
- * Creates a binary comparison expression.
304
+ * Returns a value expression.
162
305
  *
163
- * This function returns an {@link Expression} and can be used pretty much anywhere.
164
- * See the examples for a couple of possible use cases.
306
+ * This can be used to pass in a value where a reference is taken by default.
165
307
  *
166
- * @see {@link bxp}
308
+ * This function returns an {@link Expression} and can be used pretty much anywhere.
167
309
  *
168
310
  * ### Examples
169
311
  *
170
- * In this example we use `cmpr` and {@link or} to create a `WHERE expr1 OR expr2 OR expr3`
171
- * statement:
312
+ * Binary expressions take a reference by default as the first argument. `val` could
313
+ * be used to pass in a value instead:
172
314
  *
173
315
  * ```ts
174
- * db.selectFrom('person')
175
- * .selectAll('person')
176
- * .where(({ or, cmpr }) => or([
177
- * cmpr('first_name', '=', 'Jennifer'),
178
- * cmpr('fist_name', '=', 'Arnold'),
179
- * cmpr('fist_name', '=', 'Sylvester')
180
- * ]))
316
+ * eb(val(38), '=', ref('age'))
181
317
  * ```
182
318
  *
183
319
  * The generated SQL (PostgreSQL):
184
320
  *
185
321
  * ```sql
186
- * select "person".*
187
- * from "person"
188
- * where "first_name" = $1
189
- * or "first_name" = $2
190
- * or "first_name" = $3
322
+ * $1 = "age"
191
323
  * ```
324
+ */
325
+ val<VE>(value: VE): ExpressionWrapper<DB, TB, ExtractTypeFromValueExpressionOrList<VE>>;
326
+ /**
327
+ * @deprecated Use the expression builder as a function instead.
192
328
  *
193
- * By default the third argument is a value. {@link ref} can be used to
194
- * pass in a column reference instead:
329
+ * Before:
195
330
  *
196
331
  * ```ts
197
- * db.selectFrom('person')
198
- * .selectAll('person')
199
- * .where(({ or, cmpr, ref }) => or([
200
- * cmpr('first_name', '=', ref('last_name')),
201
- * cmpr('first_name', '=', ref('middle_name'))
202
- * ]))
332
+ * where((eb) => eb.cmpr('first_name', '=', 'Jennifer'))
203
333
  * ```
204
334
  *
205
- * The generated SQL (PostgreSQL):
335
+ * After:
206
336
  *
207
- * ```sql
208
- * select "person".*
209
- * from "person"
210
- * where "first_name" = "last_name"
211
- * or "first_name" = "middle_name"
337
+ * ```ts
338
+ * where((eb) => eb('first_name', '=', 'Jennifer'))
212
339
  * ```
213
- */
214
- cmpr<O extends SqlBool = SqlBool, RE extends ReferenceExpression<DB, TB> = ReferenceExpression<DB, TB>>(lhs: RE, op: ComparisonOperatorExpression, rhs: OperandValueExpressionOrList<DB, TB, RE>): ExpressionWrapper<O>;
215
- /**
216
- * Creates a binary expression.
217
- *
218
- * See {@link cmpr} for creating binary comparison operations.
219
- *
220
- * This function returns an {@link Expression} and can be used pretty much anywhere.
221
- * See the examples for a couple of possible use cases.
222
340
  *
223
- * ### Examples
224
- *
225
- * In the following example `bxp` is used to increment an integer column:
341
+ * or
226
342
  *
227
343
  * ```ts
228
- * db.updateTable('person')
229
- * .set((eb) => ({
230
- * age: eb.bxp('age', '+', 1)
231
- * }))
232
- * .where('id', '=', id)
344
+ * where(({ eb }) => eb('first_name', '=', 'Jennifer'))
233
345
  * ```
346
+ */
347
+ cmpr<O extends SqlBool = SqlBool, RE extends ReferenceExpression<DB, TB> = ReferenceExpression<DB, TB>>(lhs: RE, op: ComparisonOperatorExpression, rhs: OperandValueExpressionOrList<DB, TB, RE>): ExpressionWrapper<DB, TB, O>;
348
+ /**
349
+ * @deprecated Use the expression builder as a function instead.
234
350
  *
235
- * The generated SQL (PostgreSQL):
351
+ * Before:
236
352
  *
237
- * ```sql
238
- * update "person"
239
- * set "age" = "age" + $1
240
- * where "id" = $2
353
+ * ```ts
354
+ * set((eb) => ({
355
+ * age: eb.bxp('age', '+', 10)
356
+ * }))
241
357
  * ```
242
358
  *
243
- * By default the third argument is a value. {@link ref} can be used to
244
- * pass in a column reference instead:
359
+ * After:
245
360
  *
246
361
  * ```ts
247
- * db.updateTable('person')
248
- * .set((eb) => ({
249
- * age: eb.bxp('age', '+', eb.ref('age'))
250
- * }))
251
- * .where('id', '=', id)
362
+ * set((eb) => ({
363
+ * age: eb('age', '+', 10)
364
+ * }))
252
365
  * ```
253
366
  *
254
- * The generated SQL (PostgreSQL):
367
+ * or
255
368
  *
256
- * ```sql
257
- * update "person"
258
- * set "age" = "age" + "age"
259
- * where "id" = $1
369
+ * ```ts
370
+ * set(({ eb }) => ({
371
+ * age: eb('age', '+', 10)
372
+ * }))
260
373
  * ```
261
374
  */
262
- bxp<RE extends ReferenceExpression<DB, TB>, OP extends BinaryOperatorExpression>(lhs: RE, op: OP, rhs: OperandValueExpression<DB, TB, RE>): ExpressionWrapper<OP extends ComparisonOperator ? SqlBool : ExtractTypeFromReferenceExpression<DB, TB, RE>>;
375
+ bxp<RE extends ReferenceExpression<DB, TB>, OP extends BinaryOperatorExpression>(lhs: RE, op: OP, rhs: OperandValueExpression<DB, TB, RE>): ExpressionWrapper<DB, TB, OP extends ComparisonOperator ? SqlBool : ExtractTypeFromReferenceExpression<DB, TB, RE>>;
263
376
  /**
264
377
  * Creates an unary expression.
265
378
  *
@@ -285,7 +398,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
285
398
  * from "person"
286
399
  * ```
287
400
  */
288
- unary<RE extends ReferenceExpression<DB, TB>>(op: UnaryOperator, expr: RE): ExpressionWrapper<ExtractTypeFromReferenceExpression<DB, TB, RE>>;
401
+ unary<RE extends ReferenceExpression<DB, TB>>(op: UnaryOperator, expr: RE): ExpressionWrapper<DB, TB, ExtractTypeFromReferenceExpression<DB, TB, RE>>;
289
402
  /**
290
403
  * Creates a `not` operation.
291
404
  *
@@ -293,7 +406,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
293
406
  *
294
407
  * @see {@link unary}
295
408
  */
296
- not<RE extends ReferenceExpression<DB, TB>>(expr: RE): ExpressionWrapper<ExtractTypeFromReferenceExpression<DB, TB, RE>>;
409
+ not<RE extends ReferenceExpression<DB, TB>>(expr: RE): ExpressionWrapper<DB, TB, ExtractTypeFromReferenceExpression<DB, TB, RE>>;
297
410
  /**
298
411
  * Creates an `exists` operation.
299
412
  *
@@ -301,7 +414,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
301
414
  *
302
415
  * @see {@link unary}
303
416
  */
304
- exists<RE extends ReferenceExpression<DB, TB>>(expr: RE): ExpressionWrapper<SqlBool>;
417
+ exists<RE extends ReferenceExpression<DB, TB>>(expr: RE): ExpressionWrapper<DB, TB, SqlBool>;
305
418
  /**
306
419
  * Creates a negation operation.
307
420
  *
@@ -309,7 +422,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
309
422
  *
310
423
  * @see {@link unary}
311
424
  */
312
- neg<RE extends ReferenceExpression<DB, TB>>(expr: RE): ExpressionWrapper<ExtractTypeFromReferenceExpression<DB, TB, RE>>;
425
+ neg<RE extends ReferenceExpression<DB, TB>>(expr: RE): ExpressionWrapper<DB, TB, ExtractTypeFromReferenceExpression<DB, TB, RE>>;
313
426
  /**
314
427
  * Combines two or more expressions using the logical `and` operator.
315
428
  *
@@ -318,16 +431,16 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
318
431
  *
319
432
  * ### Examples
320
433
  *
321
- * In this example we use `and` with {@link cmpr} to create a `WHERE expr1 AND expr2 AND expr3`
434
+ * In this example we use `and` to create a `WHERE expr1 AND expr2 AND expr3`
322
435
  * statement:
323
436
  *
324
437
  * ```ts
325
438
  * db.selectFrom('person')
326
439
  * .selectAll('person')
327
- * .where(({ and, cmpr }) => and([
328
- * cmpr('first_name', '=', 'Jennifer'),
329
- * cmpr('fist_name', '=', 'Arnold'),
330
- * cmpr('fist_name', '=', 'Sylvester')
440
+ * .where((eb) => eb.and([
441
+ * eb('first_name', '=', 'Jennifer'),
442
+ * eb('fist_name', '=', 'Arnold'),
443
+ * eb('fist_name', '=', 'Sylvester')
331
444
  * ]))
332
445
  * ```
333
446
  *
@@ -341,7 +454,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
341
454
  * and "first_name" = $3
342
455
  * ```
343
456
  */
344
- and(expres: ReadonlyArray<Expression<SqlBool>>): ExpressionWrapper<SqlBool>;
457
+ and(exprs: ReadonlyArray<Expression<SqlBool>>): ExpressionWrapper<DB, TB, SqlBool>;
345
458
  /**
346
459
  * Combines two or more expressions using the logical `or` operator.
347
460
  *
@@ -350,16 +463,16 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
350
463
  *
351
464
  * ### Examples
352
465
  *
353
- * In this example we use `or` with {@link cmpr} to create a `WHERE expr1 OR expr2 OR expr3`
466
+ * In this example we use `or` to create a `WHERE expr1 OR expr2 OR expr3`
354
467
  * statement:
355
468
  *
356
469
  * ```ts
357
470
  * db.selectFrom('person')
358
471
  * .selectAll('person')
359
- * .where(({ or, cmpr }) => or([
360
- * cmpr('first_name', '=', 'Jennifer'),
361
- * cmpr('fist_name', '=', 'Arnold'),
362
- * cmpr('fist_name', '=', 'Sylvester')
472
+ * .where((eb) => or([
473
+ * eb('first_name', '=', 'Jennifer'),
474
+ * eb('fist_name', '=', 'Arnold'),
475
+ * eb('fist_name', '=', 'Sylvester')
363
476
  * ]))
364
477
  * ```
365
478
  *
@@ -373,7 +486,48 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
373
486
  * or "first_name" = $3
374
487
  * ```
375
488
  */
376
- or(expres: ReadonlyArray<Expression<SqlBool>>): ExpressionWrapper<SqlBool>;
489
+ or(exprs: ReadonlyArray<Expression<SqlBool>>): ExpressionWrapper<DB, TB, SqlBool>;
490
+ /**
491
+ * Wraps the expression in parentheses.
492
+ *
493
+ * ### Examples
494
+ *
495
+ * ```ts
496
+ * db.selectFrom('person')
497
+ * .selectAll('person')
498
+ * .where((eb) => eb(eb.parens('age', '+', 1), '/', 100), '<', 0.1))
499
+ * ```
500
+ *
501
+ * The generated SQL (PostgreSQL):
502
+ *
503
+ * ```sql
504
+ * select "person".*
505
+ * from "person"
506
+ * where ("age" + $1) / $2 < $3
507
+ * ```
508
+ *
509
+ * You can also pass in any expression as the only argument:
510
+ *
511
+ * ```ts
512
+ * db.selectFrom('person')
513
+ * .selectAll('person')
514
+ * .where((eb) => parens(
515
+ * eb('age', '=', 1).or('age', '=', 2))
516
+ * ).and(
517
+ * eb('first_name', '=', 'Jennifer').or('first_name', '=', 'Arnold')
518
+ * ))
519
+ * ```
520
+ *
521
+ * The generated SQL (PostgreSQL):
522
+ *
523
+ * ```sql
524
+ * select "person".*
525
+ * from "person"
526
+ * where ("age" = $1 or "age" = $2) and ("first_name" = $3 or "first_name" = $4)
527
+ * ```
528
+ */
529
+ parens<RE extends ReferenceExpression<DB, TB>, OP extends BinaryOperatorExpression>(lhs: RE, op: OP, rhs: OperandValueExpressionOrList<DB, TB, RE>): ExpressionWrapper<DB, TB, OP extends ComparisonOperator ? SqlBool : ExtractTypeFromReferenceExpression<DB, TB, RE>>;
530
+ parens<T>(expr: Expression<T>): ExpressionWrapper<DB, TB, T>;
377
531
  /**
378
532
  * See {@link QueryCreator.withSchema}
379
533
  *
@@ -5,8 +5,8 @@ import { parseTableExpressionOrList, } from '../parser/table-parser.js';
5
5
  import { WithSchemaPlugin } from '../plugin/with-schema/with-schema-plugin.js';
6
6
  import { createQueryId } from '../util/query-id.js';
7
7
  import { createFunctionModule, } from '../query-builder/function-module.js';
8
- import { parseStringReference, } from '../parser/reference-parser.js';
9
- import { parseValueBinaryOperation, } from '../parser/binary-operation-parser.js';
8
+ import { parseJSONReference, parseReferenceExpression, parseStringReference, } from '../parser/reference-parser.js';
9
+ import { parseValueBinaryOperation, parseValueBinaryOperationOrExpression, } from '../parser/binary-operation-parser.js';
10
10
  import { AndNode } from '../operation-node/and-node.js';
11
11
  import { OrNode } from '../operation-node/or-node.js';
12
12
  import { ParensNode } from '../operation-node/parens-node.js';
@@ -15,14 +15,20 @@ import { parseUnaryOperation } from '../parser/unary-operation-parser.js';
15
15
  import { parseValueExpressionOrList, } from '../parser/value-parser.js';
16
16
  import { NOOP_QUERY_EXECUTOR } from '../query-executor/noop-query-executor.js';
17
17
  import { ValueNode } from '../operation-node/value-node.js';
18
+ import { CaseBuilder } from '../query-builder/case-builder.js';
19
+ import { CaseNode } from '../operation-node/case-node.js';
20
+ import { isUndefined } from '../util/object-utils.js';
21
+ import { JSONPathBuilder } from '../query-builder/json-path-builder.js';
18
22
  export function createExpressionBuilder(executor = NOOP_QUERY_EXECUTOR) {
23
+ function binary(lhs, op, rhs) {
24
+ return new ExpressionWrapper(parseValueBinaryOperation(lhs, op, rhs));
25
+ }
19
26
  function unary(op, expr) {
20
27
  return new ExpressionWrapper(parseUnaryOperation(op, expr));
21
28
  }
22
- return {
23
- get fn() {
24
- return createFunctionModule();
25
- },
29
+ const eb = Object.assign(binary, {
30
+ fn: undefined,
31
+ eb: undefined,
26
32
  selectFrom(table) {
27
33
  return new SelectQueryBuilder({
28
34
  queryId: createQueryId(),
@@ -30,15 +36,27 @@ export function createExpressionBuilder(executor = NOOP_QUERY_EXECUTOR) {
30
36
  queryNode: SelectQueryNode.create(parseTableExpressionOrList(table)),
31
37
  });
32
38
  },
33
- ref(reference) {
34
- return new ExpressionWrapper(parseStringReference(reference));
39
+ case(reference) {
40
+ return new CaseBuilder({
41
+ node: CaseNode.create(isUndefined(reference)
42
+ ? undefined
43
+ : parseReferenceExpression(reference)),
44
+ });
45
+ },
46
+ ref(reference, op) {
47
+ if (isUndefined(op)) {
48
+ return new ExpressionWrapper(parseStringReference(reference));
49
+ }
50
+ return new JSONPathBuilder(parseJSONReference(reference, op));
35
51
  },
36
52
  val(value) {
37
53
  return new ExpressionWrapper(parseValueExpressionOrList(value));
38
54
  },
55
+ // @deprecated
39
56
  cmpr(lhs, op, rhs) {
40
57
  return new ExpressionWrapper(parseValueBinaryOperation(lhs, op, rhs));
41
58
  },
59
+ // @deprecated
42
60
  bxp(lhs, op, rhs) {
43
61
  return new ExpressionWrapper(parseValueBinaryOperation(lhs, op, rhs));
44
62
  },
@@ -78,10 +96,23 @@ export function createExpressionBuilder(executor = NOOP_QUERY_EXECUTOR) {
78
96
  }
79
97
  return new ExpressionWrapper(ParensNode.create(node));
80
98
  },
99
+ parens(...args) {
100
+ const node = parseValueBinaryOperationOrExpression(args);
101
+ if (ParensNode.is(node)) {
102
+ // No double wrapping.
103
+ return new ExpressionWrapper(node);
104
+ }
105
+ else {
106
+ return new ExpressionWrapper(ParensNode.create(node));
107
+ }
108
+ },
81
109
  withSchema(schema) {
82
110
  return createExpressionBuilder(executor.withPluginAtFront(new WithSchemaPlugin(schema)));
83
111
  },
84
- };
112
+ });
113
+ eb.fn = createFunctionModule();
114
+ eb.eb = eb;
115
+ return eb;
85
116
  }
86
117
  export function expressionBuilder(_) {
87
118
  return createExpressionBuilder();