kysely 0.26.0 → 0.26.2

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 (212) hide show
  1. package/README.md +6 -6
  2. package/dist/cjs/dialect/dialect-adapter-base.d.ts +3 -3
  3. package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +3 -2
  4. package/dist/cjs/dialect/mysql/mysql-adapter.js +2 -2
  5. package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +3 -2
  6. package/dist/cjs/dialect/postgres/postgres-adapter.js +2 -2
  7. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +2 -2
  8. package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +4 -2
  9. package/dist/cjs/dialect/sqlite/sqlite-adapter.js +2 -2
  10. package/dist/cjs/driver/runtime-driver.js +17 -2
  11. package/dist/cjs/expression/expression-builder.d.ts +299 -28
  12. package/dist/cjs/expression/expression-builder.js +36 -26
  13. package/dist/cjs/expression/expression-wrapper.d.ts +177 -8
  14. package/dist/cjs/expression/expression-wrapper.js +4 -4
  15. package/dist/cjs/expression/expression.d.ts +64 -1
  16. package/dist/cjs/helpers/mysql.d.ts +11 -8
  17. package/dist/cjs/helpers/mysql.js +21 -32
  18. package/dist/cjs/helpers/postgres.d.ts +8 -5
  19. package/dist/cjs/helpers/postgres.js +8 -5
  20. package/dist/cjs/helpers/sqlite.d.ts +164 -0
  21. package/dist/cjs/helpers/sqlite.js +180 -0
  22. package/dist/cjs/index.d.ts +3 -1
  23. package/dist/cjs/index.js +1 -0
  24. package/dist/cjs/kysely.d.ts +4 -3
  25. package/dist/cjs/kysely.js +1 -1
  26. package/dist/cjs/operation-node/common-table-expression-node.d.ts +4 -0
  27. package/dist/cjs/operation-node/common-table-expression-node.js +6 -0
  28. package/dist/cjs/operation-node/delete-query-node.d.ts +1 -1
  29. package/dist/cjs/operation-node/delete-query-node.js +3 -3
  30. package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
  31. package/dist/cjs/operation-node/operation-node-transformer.js +8 -0
  32. package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
  33. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  34. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  35. package/dist/cjs/operation-node/operator-node.d.ts +3 -3
  36. package/dist/cjs/operation-node/operator-node.js +3 -0
  37. package/dist/cjs/operation-node/order-by-node.d.ts +2 -2
  38. package/dist/cjs/operation-node/order-by-node.js +4 -4
  39. package/dist/cjs/operation-node/over-node.d.ts +1 -1
  40. package/dist/cjs/operation-node/over-node.js +3 -3
  41. package/dist/cjs/operation-node/select-query-node.d.ts +5 -4
  42. package/dist/cjs/operation-node/select-query-node.js +13 -7
  43. package/dist/cjs/operation-node/tuple-node.d.ts +12 -0
  44. package/dist/cjs/operation-node/tuple-node.js +18 -0
  45. package/dist/cjs/parser/binary-operation-parser.d.ts +11 -7
  46. package/dist/cjs/parser/binary-operation-parser.js +35 -46
  47. package/dist/cjs/parser/expression-parser.d.ts +9 -4
  48. package/dist/cjs/parser/join-parser.d.ts +2 -2
  49. package/dist/cjs/parser/join-parser.js +2 -3
  50. package/dist/cjs/parser/order-by-parser.d.ts +6 -2
  51. package/dist/cjs/parser/order-by-parser.js +41 -7
  52. package/dist/cjs/parser/parse-utils.js +2 -2
  53. package/dist/cjs/parser/reference-parser.js +1 -1
  54. package/dist/cjs/parser/select-parser.d.ts +5 -5
  55. package/dist/cjs/parser/set-operation-parser.d.ts +3 -1
  56. package/dist/cjs/parser/set-operation-parser.js +13 -4
  57. package/dist/cjs/parser/tuple-parser.d.ts +47 -0
  58. package/dist/cjs/parser/tuple-parser.js +2 -0
  59. package/dist/cjs/parser/value-parser.d.ts +4 -2
  60. package/dist/cjs/parser/value-parser.js +12 -1
  61. package/dist/cjs/parser/with-parser.d.ts +3 -2
  62. package/dist/cjs/parser/with-parser.js +16 -4
  63. package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +3 -3
  64. package/dist/cjs/plugin/camel-case/camel-case-plugin.js +4 -8
  65. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +13 -0
  66. package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +50 -14
  67. package/dist/cjs/query-builder/aggregate-function-builder.d.ts +5 -5
  68. package/dist/cjs/query-builder/aggregate-function-builder.js +2 -2
  69. package/dist/cjs/query-builder/case-builder.js +8 -4
  70. package/dist/cjs/query-builder/cte-builder.d.ts +20 -0
  71. package/dist/cjs/query-builder/cte-builder.js +39 -0
  72. package/dist/cjs/query-builder/delete-query-builder.d.ts +74 -24
  73. package/dist/cjs/query-builder/delete-query-builder.js +3 -3
  74. package/dist/cjs/query-builder/function-module.d.ts +41 -6
  75. package/dist/cjs/query-builder/function-module.js +3 -0
  76. package/dist/cjs/query-builder/having-interface.d.ts +2 -5
  77. package/dist/cjs/query-builder/insert-query-builder.d.ts +1 -1
  78. package/dist/cjs/query-builder/join-builder.d.ts +2 -6
  79. package/dist/cjs/query-builder/join-builder.js +2 -2
  80. package/dist/cjs/query-builder/json-path-builder.d.ts +60 -4
  81. package/dist/cjs/query-builder/on-conflict-builder.d.ts +143 -44
  82. package/dist/cjs/query-builder/on-conflict-builder.js +4 -4
  83. package/dist/cjs/query-builder/over-builder.js +1 -1
  84. package/dist/cjs/query-builder/select-query-builder.d.ts +245 -86
  85. package/dist/cjs/query-builder/select-query-builder.js +72 -924
  86. package/dist/cjs/query-builder/update-query-builder.d.ts +106 -25
  87. package/dist/cjs/query-builder/update-query-builder.js +2 -2
  88. package/dist/cjs/query-builder/where-interface.d.ts +71 -24
  89. package/dist/cjs/query-compiler/default-query-compiler.d.ts +3 -0
  90. package/dist/cjs/query-compiler/default-query-compiler.js +39 -7
  91. package/dist/cjs/query-creator.d.ts +74 -2
  92. package/dist/cjs/query-creator.js +83 -6
  93. package/dist/cjs/raw-builder/raw-builder.d.ts +88 -49
  94. package/dist/cjs/raw-builder/raw-builder.js +18 -45
  95. package/dist/cjs/raw-builder/sql.js +8 -8
  96. package/dist/cjs/schema/alter-table-builder.d.ts +4 -0
  97. package/dist/cjs/schema/alter-table-builder.js +12 -0
  98. package/dist/cjs/schema/create-index-builder.d.ts +1 -1
  99. package/dist/cjs/schema/create-index-builder.js +1 -1
  100. package/dist/cjs/util/column-type.d.ts +7 -6
  101. package/dist/cjs/util/json-object-args.d.ts +3 -0
  102. package/dist/cjs/util/json-object-args.js +35 -0
  103. package/dist/cjs/util/object-utils.d.ts +1 -0
  104. package/dist/cjs/util/object-utils.js +9 -1
  105. package/dist/cjs/util/type-utils.d.ts +10 -10
  106. package/dist/esm/dialect/dialect-adapter-base.d.ts +3 -3
  107. package/dist/esm/dialect/mysql/mysql-adapter.d.ts +3 -2
  108. package/dist/esm/dialect/mysql/mysql-adapter.js +2 -2
  109. package/dist/esm/dialect/postgres/postgres-adapter.d.ts +3 -2
  110. package/dist/esm/dialect/postgres/postgres-adapter.js +2 -2
  111. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +2 -2
  112. package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +4 -2
  113. package/dist/esm/dialect/sqlite/sqlite-adapter.js +2 -2
  114. package/dist/esm/driver/runtime-driver.js +17 -2
  115. package/dist/esm/expression/expression-builder.d.ts +299 -28
  116. package/dist/esm/expression/expression-builder.js +40 -30
  117. package/dist/esm/expression/expression-wrapper.d.ts +177 -8
  118. package/dist/esm/expression/expression-wrapper.js +5 -5
  119. package/dist/esm/expression/expression.d.ts +64 -1
  120. package/dist/esm/helpers/mysql.d.ts +11 -8
  121. package/dist/esm/helpers/mysql.js +21 -32
  122. package/dist/esm/helpers/postgres.d.ts +8 -5
  123. package/dist/esm/helpers/postgres.js +8 -5
  124. package/dist/esm/helpers/sqlite.d.ts +164 -0
  125. package/dist/esm/helpers/sqlite.js +175 -0
  126. package/dist/esm/index.d.ts +3 -1
  127. package/dist/esm/index.js +1 -0
  128. package/dist/esm/kysely.d.ts +4 -3
  129. package/dist/esm/kysely.js +1 -1
  130. package/dist/esm/operation-node/common-table-expression-node.d.ts +4 -0
  131. package/dist/esm/operation-node/common-table-expression-node.js +6 -0
  132. package/dist/esm/operation-node/delete-query-node.d.ts +1 -1
  133. package/dist/esm/operation-node/delete-query-node.js +3 -3
  134. package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
  135. package/dist/esm/operation-node/operation-node-transformer.js +8 -0
  136. package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
  137. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  138. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  139. package/dist/esm/operation-node/operator-node.d.ts +3 -3
  140. package/dist/esm/operation-node/operator-node.js +3 -0
  141. package/dist/esm/operation-node/order-by-node.d.ts +2 -2
  142. package/dist/esm/operation-node/order-by-node.js +4 -4
  143. package/dist/esm/operation-node/over-node.d.ts +1 -1
  144. package/dist/esm/operation-node/over-node.js +3 -3
  145. package/dist/esm/operation-node/select-query-node.d.ts +5 -4
  146. package/dist/esm/operation-node/select-query-node.js +13 -7
  147. package/dist/esm/operation-node/tuple-node.d.ts +12 -0
  148. package/dist/esm/operation-node/tuple-node.js +16 -0
  149. package/dist/esm/parser/binary-operation-parser.d.ts +11 -7
  150. package/dist/esm/parser/binary-operation-parser.js +36 -47
  151. package/dist/esm/parser/expression-parser.d.ts +9 -4
  152. package/dist/esm/parser/join-parser.d.ts +2 -2
  153. package/dist/esm/parser/join-parser.js +3 -4
  154. package/dist/esm/parser/order-by-parser.d.ts +6 -2
  155. package/dist/esm/parser/order-by-parser.js +40 -7
  156. package/dist/esm/parser/parse-utils.js +3 -3
  157. package/dist/esm/parser/reference-parser.js +1 -1
  158. package/dist/esm/parser/select-parser.d.ts +5 -5
  159. package/dist/esm/parser/set-operation-parser.d.ts +3 -1
  160. package/dist/esm/parser/set-operation-parser.js +11 -2
  161. package/dist/esm/parser/tuple-parser.d.ts +47 -0
  162. package/dist/esm/parser/tuple-parser.js +2 -0
  163. package/dist/esm/parser/value-parser.d.ts +4 -2
  164. package/dist/esm/parser/value-parser.js +10 -1
  165. package/dist/esm/parser/with-parser.d.ts +3 -2
  166. package/dist/esm/parser/with-parser.js +16 -4
  167. package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +3 -3
  168. package/dist/esm/plugin/camel-case/camel-case-plugin.js +5 -9
  169. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +13 -0
  170. package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +51 -15
  171. package/dist/esm/query-builder/aggregate-function-builder.d.ts +5 -5
  172. package/dist/esm/query-builder/aggregate-function-builder.js +3 -3
  173. package/dist/esm/query-builder/case-builder.js +10 -6
  174. package/dist/esm/query-builder/cte-builder.d.ts +20 -0
  175. package/dist/esm/query-builder/cte-builder.js +36 -0
  176. package/dist/esm/query-builder/delete-query-builder.d.ts +74 -24
  177. package/dist/esm/query-builder/delete-query-builder.js +4 -4
  178. package/dist/esm/query-builder/function-module.d.ts +41 -6
  179. package/dist/esm/query-builder/function-module.js +3 -0
  180. package/dist/esm/query-builder/having-interface.d.ts +2 -5
  181. package/dist/esm/query-builder/insert-query-builder.d.ts +1 -1
  182. package/dist/esm/query-builder/join-builder.d.ts +2 -6
  183. package/dist/esm/query-builder/join-builder.js +3 -3
  184. package/dist/esm/query-builder/json-path-builder.d.ts +60 -4
  185. package/dist/esm/query-builder/on-conflict-builder.d.ts +143 -44
  186. package/dist/esm/query-builder/on-conflict-builder.js +5 -5
  187. package/dist/esm/query-builder/over-builder.js +1 -1
  188. package/dist/esm/query-builder/select-query-builder.d.ts +245 -86
  189. package/dist/esm/query-builder/select-query-builder.js +72 -923
  190. package/dist/esm/query-builder/update-query-builder.d.ts +106 -25
  191. package/dist/esm/query-builder/update-query-builder.js +3 -3
  192. package/dist/esm/query-builder/where-interface.d.ts +71 -24
  193. package/dist/esm/query-compiler/default-query-compiler.d.ts +3 -0
  194. package/dist/esm/query-compiler/default-query-compiler.js +39 -7
  195. package/dist/esm/query-creator.d.ts +74 -2
  196. package/dist/esm/query-creator.js +84 -7
  197. package/dist/esm/raw-builder/raw-builder.d.ts +88 -49
  198. package/dist/esm/raw-builder/raw-builder.js +17 -42
  199. package/dist/esm/raw-builder/sql.js +9 -9
  200. package/dist/esm/schema/alter-table-builder.d.ts +4 -0
  201. package/dist/esm/schema/alter-table-builder.js +12 -0
  202. package/dist/esm/schema/create-index-builder.d.ts +1 -1
  203. package/dist/esm/schema/create-index-builder.js +2 -2
  204. package/dist/esm/util/column-type.d.ts +7 -6
  205. package/dist/esm/util/json-object-args.d.ts +3 -0
  206. package/dist/esm/util/json-object-args.js +32 -0
  207. package/dist/esm/util/object-utils.d.ts +1 -0
  208. package/dist/esm/util/object-utils.js +7 -0
  209. package/dist/esm/util/type-utils.d.ts +10 -10
  210. package/helpers/sqlite.d.ts +1 -0
  211. package/helpers/sqlite.js +1 -0
  212. package/package.json +7 -4
@@ -1,4 +1,3 @@
1
- import { AliasNode } from '../operation-node/alias-node.js';
2
1
  import { CompiledQuery } from '../query-compiler/compiled-query.js';
3
2
  import { JoinCallbackExpression, JoinReferenceExpression } from '../parser/join-parser.js';
4
3
  import { TableExpression } from '../parser/table-parser.js';
@@ -6,43 +5,26 @@ import { SelectExpression, Selection, SelectArg, AllSelection } from '../parser/
6
5
  import { ReferenceExpression } from '../parser/reference-parser.js';
7
6
  import { SelectQueryNode } from '../operation-node/select-query-node.js';
8
7
  import { QueryNode } from '../operation-node/query-node.js';
9
- import { DrainOuterGeneric, NarrowPartial, Nullable, ShallowRecord, Simplify, SimplifySingleResult } from '../util/type-utils.js';
10
- import { OrderByDirectionExpression, OrderByExpression } from '../parser/order-by-parser.js';
8
+ import { DrainOuterGeneric, NarrowPartial, Nullable, ShallowRecord, Simplify, SimplifySingleResult, SqlBool } from '../util/type-utils.js';
9
+ import { OrderByDirectionExpression, OrderByExpression, DirectedOrderByStringReference, UndirectedOrderByExpression } from '../parser/order-by-parser.js';
11
10
  import { Compilable } from '../util/compilable.js';
12
11
  import { QueryExecutor } from '../query-executor/query-executor.js';
13
12
  import { QueryId } from '../util/query-id.js';
14
13
  import { GroupByArg } from '../parser/group-by-parser.js';
15
14
  import { KyselyPlugin } from '../plugin/kysely-plugin.js';
16
- import { WhereExpressionFactory, WhereInterface } from './where-interface.js';
15
+ import { WhereInterface } from './where-interface.js';
17
16
  import { NoResultErrorConstructor } from './no-result-error.js';
18
- import { HavingExpressionFactory, HavingInterface } from './having-interface.js';
17
+ import { HavingInterface } from './having-interface.js';
19
18
  import { Explainable, ExplainFormat } from '../util/explainable.js';
20
- import { AliasedExpression, Expression } from '../expression/expression.js';
19
+ import { SetOperandExpression } from '../parser/set-operation-parser.js';
20
+ import { AliasableExpression, AliasedExpression, Expression } from '../expression/expression.js';
21
21
  import { ComparisonOperatorExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
22
22
  import { KyselyTypeError } from '../util/type-error.js';
23
23
  import { Selectable } from '../util/column-type.js';
24
24
  import { Streamable } from '../util/streamable.js';
25
- export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements WhereInterface<DB, TB>, HavingInterface<DB, TB>, Expression<O>, Compilable<O>, Explainable, Streamable<O> {
26
- #private;
27
- constructor(props: SelectQueryBuilderProps);
28
- /** @private */
29
- /**
30
- * All expressions need to have this getter for complicated type-related reasons.
31
- * Simply add this getter for your expression and always return `undefined` from it:
32
- *
33
- * ```ts
34
- * class SomeExpression<T> implements Expression<T> {
35
- * get expressionType(): T | undefined {
36
- * return undefined
37
- * }
38
- * }
39
- * ```
40
- *
41
- * The getter is needed to make the expression assignable to another expression only
42
- * if the types `T` are assignable. Without this property (or some other property
43
- * that references `T`), you could assing `Expression<string>` to `Expression<number>`.
44
- */
45
- get expressionType(): O | undefined;
25
+ import { ExpressionOrFactory } from '../parser/expression-parser.js';
26
+ import { ExpressionWrapper } from '../expression/expression-wrapper.js';
27
+ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInterface<DB, TB>, HavingInterface<DB, TB>, AliasableExpression<O>, Compilable<O>, Explainable, Streamable<O> {
46
28
  /**
47
29
  * Adds a `where` expression to the query.
48
30
  *
@@ -96,24 +78,53 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
96
78
  * select * from "person" where "id" in ($1, $2, $3)
97
79
  * ```
98
80
  *
99
- * <!-- siteExample("where", "OR where", 30) -->
81
+ * <!-- siteExample("where", "Object filter", 30) -->
100
82
  *
101
- * To combine conditions using `OR`, you can use the expression builder:
83
+ * You can use the `and` function to create a simple equality
84
+ * filter using an object
102
85
  *
103
86
  * ```ts
104
87
  * const persons = await db
105
88
  * .selectFrom('person')
106
89
  * .selectAll()
107
- * .where(({ or, and, cmpr }) => or([
108
- * and([
109
- * cmpr('first_name', '=', 'Jennifer'),
110
- * cmpr('last_name', '=', 'Aniston')
111
- * ]),
112
- * and([
113
- * cmpr('first_name', '=', 'Sylvester'),
114
- * cmpr('last_name', '=', 'Stallone')
115
- * ])
90
+ * .where((eb) => eb.and({
91
+ * first_name: 'Jennifer',
92
+ * last_name: eb.ref('first_name')
93
+ * }))
94
+ * .execute()
95
+ * ```
96
+ *
97
+ * The generated SQL (PostgreSQL):
98
+ *
99
+ * ```sql
100
+ * select *
101
+ * from "person"
102
+ * where (
103
+ * "first_name" = $1
104
+ * and "last_name" = "first_name"
105
+ * )
106
+ * ```
107
+ *
108
+ * <!-- siteExample("where", "OR where", 40) -->
109
+ *
110
+ * To combine conditions using `OR`, you can use the expression builder.
111
+ * There are two ways to create `OR` expressions. Both are shown in this
112
+ * example:
113
+ *
114
+ * ```ts
115
+ * const persons = await db
116
+ * .selectFrom('person')
117
+ * .selectAll()
118
+ * // 1. Using the `or` method on the expression builder:
119
+ * .where((eb) => eb.or([
120
+ * eb('first_name', '=', 'Jennifer'),
121
+ * eb('first_name', '=', 'Sylvester')
116
122
  * ]))
123
+ * // 2. Chaining expressions using the `or` method on the
124
+ * // created expressions:
125
+ * .where((eb) =>
126
+ * eb('last_name', '=', 'Aniston').or('last_name', '=', 'Stallone')
127
+ * )
117
128
  * .execute()
118
129
  * ```
119
130
  *
@@ -123,19 +134,23 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
123
134
  * select *
124
135
  * from "person"
125
136
  * where (
126
- * ("first_name" = $1 AND "last_name" = $2)
127
- * OR
128
- * ("first_name" = $3 AND "last_name" = $4)
137
+ * ("first_name" = $1 or "first_name" = $2)
138
+ * and
139
+ * ("last_name" = $3 or "last_name" = $4)
129
140
  * )
130
141
  * ```
131
142
  *
132
- * <!-- siteExample("where", "Conditional where calls", 40) -->
143
+ * <!-- siteExample("where", "Conditional where calls", 50) -->
133
144
  *
134
145
  * You can add expressions conditionally like this:
135
146
  *
136
147
  * ```ts
148
+ * import { Expression, SqlBool } from 'kysely'
149
+ *
137
150
  * const firstName: string | undefined = 'Jennifer'
138
151
  * const lastName: string | undefined = 'Aniston'
152
+ * const under18 = true
153
+ * const over60 = true
139
154
  *
140
155
  * let query = db
141
156
  * .selectFrom('person')
@@ -151,6 +166,23 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
151
166
  * query = query.where('last_name', '=', lastName)
152
167
  * }
153
168
  *
169
+ * if (under18 || over60) {
170
+ * // Conditional OR expressions can be added like this.
171
+ * query = query.where((eb) => {
172
+ * const ors: Expression<SqlBool>[] = []
173
+ *
174
+ * if (under18) {
175
+ * ors.push(eb('age', '<', 18))
176
+ * }
177
+ *
178
+ * if (over60) {
179
+ * ors.push(eb('age', '>', 60))
180
+ * }
181
+ *
182
+ * return eb.or(ors)
183
+ * })
184
+ * }
185
+ *
154
186
  * const persons = await query.execute()
155
187
  * ```
156
188
  *
@@ -203,7 +235,7 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
203
235
  * select * from "person" where "id" in ($1, $2, $3)
204
236
  * ```
205
237
  *
206
- * <!-- siteExample("where", "Complex where clause", 50) -->
238
+ * <!-- siteExample("where", "Complex where clause", 60) -->
207
239
  *
208
240
  * For complex `where` expressions you can pass in a single callback and
209
241
  * use the `ExpressionBuilder` to build your expression:
@@ -215,10 +247,10 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
215
247
  * const persons = await db
216
248
  * .selectFrom('person')
217
249
  * .selectAll('person')
218
- * .where(({ cmpr, or, and, not, exists, selectFrom }) => and([
250
+ * .where(({ eb, or, and, not, exists, selectFrom }) => and([
219
251
  * or([
220
- * cmpr('first_name', '=', firstName),
221
- * cmpr('age', '<', maxAge)
252
+ * eb('first_name', '=', firstName),
253
+ * eb('age', '<', maxAge)
222
254
  * ]),
223
255
  * not(exists(
224
256
  * selectFrom('pet')
@@ -293,8 +325,7 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
293
325
  * ```
294
326
  */
295
327
  where<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: ComparisonOperatorExpression, rhs: OperandValueExpressionOrList<DB, TB, RE>): SelectQueryBuilder<DB, TB, O>;
296
- where(factory: WhereExpressionFactory<DB, TB>): SelectQueryBuilder<DB, TB, O>;
297
- where(expression: Expression<any>): SelectQueryBuilder<DB, TB, O>;
328
+ where(expression: ExpressionOrFactory<DB, TB, SqlBool>): SelectQueryBuilder<DB, TB, O>;
298
329
  /**
299
330
  * Adds a `where` clause where both sides of the operator are references
300
331
  * to columns.
@@ -352,8 +383,7 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
352
383
  * instead of a `where` statement.
353
384
  */
354
385
  having<RE extends ReferenceExpression<DB, TB>>(lhs: RE, op: ComparisonOperatorExpression, rhs: OperandValueExpressionOrList<DB, TB, RE>): SelectQueryBuilder<DB, TB, O>;
355
- having(factory: HavingExpressionFactory<DB, TB>): SelectQueryBuilder<DB, TB, O>;
356
- having(expression: Expression<any>): SelectQueryBuilder<DB, TB, O>;
386
+ having(expression: ExpressionOrFactory<DB, TB, SqlBool>): SelectQueryBuilder<DB, TB, O>;
357
387
  /**
358
388
  * Just like {@link WhereInterface.whereRef | whereRef} but adds a `having` statement
359
389
  * instead of a `where` statement.
@@ -467,7 +497,7 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
467
497
  * import { sql } from 'kysely'
468
498
  *
469
499
  * const persons = await db.selectFrom('person')
470
- * .select(({ selectFrom, or, cmpr }) => [
500
+ * .select(({ eb, selectFrom, or }) => [
471
501
  * // Select a correlated subquery
472
502
  * selectFrom('pet')
473
503
  * .whereRef('person.id', '=', 'pet.owner_id')
@@ -479,8 +509,8 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
479
509
  * // Build and select an expression using
480
510
  * // the expression builder
481
511
  * or([
482
- * cmpr('first_name', '=', 'Jennifer'),
483
- * cmpr('first_name', '=', 'Arnold')
512
+ * eb('first_name', '=', 'Jennifer'),
513
+ * eb('first_name', '=', 'Arnold')
484
514
  * ]).as('is_jennifer_or_arnold'),
485
515
  *
486
516
  * // Select a raw sql expression
@@ -717,7 +747,7 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
717
747
  * ```
718
748
  */
719
749
  selectAll<T extends TB>(table: ReadonlyArray<T>): SelectQueryBuilder<DB, TB, O & AllSelection<DB, T>>;
720
- selectAll<T extends TB>(table: T): SelectQueryBuilder<DB, TB, Selectable<DB[T]>>;
750
+ selectAll<T extends TB>(table: T): SelectQueryBuilder<DB, TB, O & Selectable<DB[T]>>;
721
751
  selectAll(): SelectQueryBuilder<DB, TB, O & AllSelection<DB, TB>>;
722
752
  /**
723
753
  * Joins another table to the query using an inner join.
@@ -894,14 +924,28 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
894
924
  /**
895
925
  * Adds an `order by` clause to the query.
896
926
  *
897
- * `orderBy` calls are additive. To order by multiple columns, call `orderBy`
898
- * multiple times.
927
+ * `orderBy` calls are additive. Meaning, additional `orderBy` calls append to
928
+ * the existing order by clause.
899
929
  *
900
- * The first argument is the expression to order by and the second is the
901
- * order (`asc` or `desc`).
930
+ * In a single call you can add a single column/expression or multiple columns/expressions.
931
+ *
932
+ * Single column/expression calls can have 1-2 arguments. The first argument is
933
+ * the expression to order by (optionally including the direction) while the second
934
+ * optional argument is the direction (`asc` or `desc`).
902
935
  *
903
936
  * ### Examples
904
937
  *
938
+ * Single column/expression per call:
939
+ *
940
+ * ```ts
941
+ * await db
942
+ * .selectFrom('person')
943
+ * .select('person.first_name as fn')
944
+ * .orderBy('id')
945
+ * .orderBy('fn desc')
946
+ * .execute()
947
+ * ```
948
+ *
905
949
  * ```ts
906
950
  * await db
907
951
  * .selectFrom('person')
@@ -919,6 +963,16 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
919
963
  * order by "id" asc, "fn" desc
920
964
  * ```
921
965
  *
966
+ * Multiple columns/expressions per call:
967
+ *
968
+ * ```ts
969
+ * await db
970
+ * .selectFrom('person')
971
+ * .select('person.first_name as fn')
972
+ * .orderBy(['id', 'fn desc'])
973
+ * .execute()
974
+ * ```
975
+ *
922
976
  * The order by expression can also be a raw sql expression or a subquery
923
977
  * in addition to column references:
924
978
  *
@@ -978,7 +1032,9 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
978
1032
  * order by "fn" asc
979
1033
  * ```
980
1034
  */
981
- orderBy(orderBy: OrderByExpression<DB, TB, O>, direction?: OrderByDirectionExpression): SelectQueryBuilder<DB, TB, O>;
1035
+ orderBy(orderBy: UndirectedOrderByExpression<DB, TB, O>, direction?: OrderByDirectionExpression): SelectQueryBuilder<DB, TB, O>;
1036
+ orderBy(ref: DirectedOrderByStringReference<DB, TB, O>): SelectQueryBuilder<DB, TB, O>;
1037
+ orderBy(refs: ReadonlyArray<OrderByExpression<DB, TB, O>>): SelectQueryBuilder<DB, TB, O>;
982
1038
  /**
983
1039
  * Adds a `group by` clause to the query.
984
1040
  *
@@ -1132,8 +1188,20 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1132
1188
  * .union(db.selectFrom('pet').select(['id', 'name']))
1133
1189
  * .orderBy('name')
1134
1190
  * ```
1191
+ *
1192
+ * You can provide a callback to get an expression builder.
1193
+ * In the following example, this allows us to wrap the query in parentheses:
1194
+ *
1195
+ * ```ts
1196
+ * db.selectFrom('person')
1197
+ * .select(['id', 'first_name as name'])
1198
+ * .union((eb) => eb.parens(
1199
+ * eb.selectFrom('pet').select(['id', 'name'])
1200
+ * ))
1201
+ * .orderBy('name')
1202
+ * ```
1135
1203
  */
1136
- union(expression: Expression<O>): SelectQueryBuilder<DB, TB, O>;
1204
+ union(expression: SetOperandExpression<DB, O>): SelectQueryBuilder<DB, TB, O>;
1137
1205
  /**
1138
1206
  * Combines another select query or raw expression to this query using `union all`.
1139
1207
  *
@@ -1147,8 +1215,20 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1147
1215
  * .unionAll(db.selectFrom('pet').select(['id', 'name']))
1148
1216
  * .orderBy('name')
1149
1217
  * ```
1218
+ *
1219
+ * You can provide a callback to get an expression builder.
1220
+ * In the following example, this allows us to wrap the query in parentheses:
1221
+ *
1222
+ * ```ts
1223
+ * db.selectFrom('person')
1224
+ * .select(['id', 'first_name as name'])
1225
+ * .unionAll((eb) => eb.parens(
1226
+ * eb.selectFrom('pet').select(['id', 'name'])
1227
+ * ))
1228
+ * .orderBy('name')
1229
+ * ```
1150
1230
  */
1151
- unionAll(expression: Expression<O>): SelectQueryBuilder<DB, TB, O>;
1231
+ unionAll(expression: SetOperandExpression<DB, O>): SelectQueryBuilder<DB, TB, O>;
1152
1232
  /**
1153
1233
  * Combines another select query or raw expression to this query using `intersect`.
1154
1234
  *
@@ -1162,8 +1242,20 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1162
1242
  * .intersect(db.selectFrom('pet').select(['id', 'name']))
1163
1243
  * .orderBy('name')
1164
1244
  * ```
1245
+ *
1246
+ * You can provide a callback to get an expression builder.
1247
+ * In the following example, this allows us to wrap the query in parentheses:
1248
+ *
1249
+ * ```ts
1250
+ * db.selectFrom('person')
1251
+ * .select(['id', 'first_name as name'])
1252
+ * .intersect((eb) => eb.parens(
1253
+ * eb.selectFrom('pet').select(['id', 'name'])
1254
+ * ))
1255
+ * .orderBy('name')
1256
+ * ```
1165
1257
  */
1166
- intersect(expression: Expression<O>): SelectQueryBuilder<DB, TB, O>;
1258
+ intersect(expression: SetOperandExpression<DB, O>): SelectQueryBuilder<DB, TB, O>;
1167
1259
  /**
1168
1260
  * Combines another select query or raw expression to this query using `intersect all`.
1169
1261
  *
@@ -1177,8 +1269,20 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1177
1269
  * .intersectAll(db.selectFrom('pet').select(['id', 'name']))
1178
1270
  * .orderBy('name')
1179
1271
  * ```
1272
+ *
1273
+ * You can provide a callback to get an expression builder.
1274
+ * In the following example, this allows us to wrap the query in parentheses:
1275
+ *
1276
+ * ```ts
1277
+ * db.selectFrom('person')
1278
+ * .select(['id', 'first_name as name'])
1279
+ * .intersectAll((eb) => eb.parens(
1280
+ * eb.selectFrom('pet').select(['id', 'name'])
1281
+ * ))
1282
+ * .orderBy('name')
1283
+ * ```
1180
1284
  */
1181
- intersectAll(expression: Expression<O>): SelectQueryBuilder<DB, TB, O>;
1285
+ intersectAll(expression: SetOperandExpression<DB, O>): SelectQueryBuilder<DB, TB, O>;
1182
1286
  /**
1183
1287
  * Combines another select query or raw expression to this query using `except`.
1184
1288
  *
@@ -1192,8 +1296,20 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1192
1296
  * .except(db.selectFrom('pet').select(['id', 'name']))
1193
1297
  * .orderBy('name')
1194
1298
  * ```
1299
+ *
1300
+ * You can provide a callback to get an expression builder.
1301
+ * In the following example, this allows us to wrap the query in parentheses:
1302
+ *
1303
+ * ```ts
1304
+ * db.selectFrom('person')
1305
+ * .select(['id', 'first_name as name'])
1306
+ * .except((eb) => eb.parens(
1307
+ * eb.selectFrom('pet').select(['id', 'name'])
1308
+ * ))
1309
+ * .orderBy('name')
1310
+ * ```
1195
1311
  */
1196
- except(expression: Expression<O>): SelectQueryBuilder<DB, TB, O>;
1312
+ except(expression: SetOperandExpression<DB, O>): SelectQueryBuilder<DB, TB, O>;
1197
1313
  /**
1198
1314
  * Combines another select query or raw expression to this query using `except all`.
1199
1315
  *
@@ -1207,8 +1323,20 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1207
1323
  * .exceptAll(db.selectFrom('pet').select(['id', 'name']))
1208
1324
  * .orderBy('name')
1209
1325
  * ```
1326
+ *
1327
+ * You can provide a callback to get an expression builder.
1328
+ * In the following example, this allows us to wrap the query in parentheses:
1329
+ *
1330
+ * ```ts
1331
+ * db.selectFrom('person')
1332
+ * .select(['id', 'first_name as name'])
1333
+ * .exceptAll((eb) => eb.parens(
1334
+ * eb.selectFrom('pet').select(['id', 'name'])
1335
+ * ))
1336
+ * .orderBy('name')
1337
+ * ```
1210
1338
  */
1211
- exceptAll(expression: Expression<O>): SelectQueryBuilder<DB, TB, O>;
1339
+ exceptAll(expression: SetOperandExpression<DB, O>): SelectQueryBuilder<DB, TB, O>;
1212
1340
  /**
1213
1341
  * Gives an alias for the query. This method is only useful for sub queries.
1214
1342
  *
@@ -1414,7 +1542,7 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1414
1542
  * )
1415
1543
  * ```
1416
1544
  */
1417
- $if<O2>(condition: boolean, func: (qb: this) => SelectQueryBuilder<DB, TB, O & O2>): SelectQueryBuilder<DB, TB, O & Partial<O2>>;
1545
+ $if<O2>(condition: boolean, func: (qb: this) => SelectQueryBuilder<any, any, O & O2>): SelectQueryBuilder<DB, TB, O & Partial<O2>>;
1418
1546
  /**
1419
1547
  * Change the output type of the query.
1420
1548
  *
@@ -1422,6 +1550,54 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1422
1550
  * don't support your use case.
1423
1551
  */
1424
1552
  $castTo<T>(): SelectQueryBuilder<DB, TB, T>;
1553
+ /**
1554
+ * Changes the output type from an object to a tuple.
1555
+ *
1556
+ * This doesn't affect the generated SQL in any way. This function is
1557
+ * just a necessary evil when you need to convert a query's output
1558
+ * record type to a tuple type. Typescript doesn't currently offer
1559
+ * tools to do this automatically (without insane hackery).
1560
+ *
1561
+ * The returned object can no longer be executed. It can only be used
1562
+ * as a subquery.
1563
+ *
1564
+ * ### Examples
1565
+ *
1566
+ * ```ts
1567
+ * const result = await db
1568
+ * .selectFrom('person')
1569
+ * .selectAll('person')
1570
+ * .where(({ eb, refTuple, selectFrom }) => eb(
1571
+ * refTuple('first_name', 'last_name'),
1572
+ * 'in',
1573
+ * selectFrom('pet')
1574
+ * .select(['name', 'species'])
1575
+ * .where('pet.species', '!=', 'cat')
1576
+ * .$asTuple('name', 'species')
1577
+ * ))
1578
+ * ```
1579
+ *
1580
+ * The generated SQL(PostgreSQL):
1581
+ *
1582
+ * ```sql
1583
+ * select
1584
+ * "person".*
1585
+ * from
1586
+ * "person"
1587
+ * where
1588
+ * ("first_name", "last_name")
1589
+ * in
1590
+ * (
1591
+ * select "name", "species"
1592
+ * from "pet"
1593
+ * where "pet"."species" != $1
1594
+ * )
1595
+ * ```
1596
+ */
1597
+ $asTuple<K1 extends keyof O, K2 extends Exclude<keyof O, K1>>(key1: K1, key2: K2): keyof O extends K1 | K2 ? ExpressionWrapper<DB, TB, [O[K1], O[K2]]> : KyselyTypeError<'$asTuple() call failed: All selected columns must be provided as arguments'>;
1598
+ $asTuple<K1 extends keyof O, K2 extends Exclude<keyof O, K1>, K3 extends Exclude<keyof O, K1 | K2>>(key1: K1, key2: K2, key3: K3): keyof O extends K1 | K2 | K3 ? ExpressionWrapper<DB, TB, [O[K1], O[K2], O[K3]]> : KyselyTypeError<'$asTuple() call failed: All selected columns must be provided as arguments'>;
1599
+ $asTuple<K1 extends keyof O, K2 extends Exclude<keyof O, K1>, K3 extends Exclude<keyof O, K1 | K2>, K4 extends Exclude<keyof O, K1 | K2 | K3>>(key1: K1, key2: K2, key3: K3, key4: K4): keyof O extends K1 | K2 | K3 | K4 ? ExpressionWrapper<DB, TB, [O[K1], O[K2], O[K3], O[K4]]> : KyselyTypeError<'$asTuple() call failed: All selected columns must be provided as arguments'>;
1600
+ $asTuple<K1 extends keyof O, K2 extends Exclude<keyof O, K1>, K3 extends Exclude<keyof O, K1 | K2>, K4 extends Exclude<keyof O, K1 | K2 | K3>, K5 extends Exclude<keyof O, K1 | K2 | K3 | K4>>(key1: K1, key2: K2, key3: K3, key4: K4, key5: K5): keyof O extends K1 | K2 | K3 | K4 | K5 ? ExpressionWrapper<DB, TB, [O[K1], O[K2], O[K3], O[K4], O[K5]]> : KyselyTypeError<'$asTuple() call failed: All selected columns must be provided as arguments'>;
1425
1601
  /**
1426
1602
  * Narrows (parts of) the output type of the query.
1427
1603
  *
@@ -1607,31 +1783,14 @@ export declare class SelectQueryBuilder<DB, TB extends keyof DB, O> implements W
1607
1783
  */
1608
1784
  explain<ER extends Record<string, any> = Record<string, any>>(format?: ExplainFormat, options?: Expression<any>): Promise<ER[]>;
1609
1785
  }
1786
+ export declare function createSelectQueryBuilder<DB, TB extends keyof DB, O>(props: SelectQueryBuilderProps): SelectQueryBuilder<DB, TB, O>;
1610
1787
  export interface SelectQueryBuilderProps {
1611
1788
  readonly queryId: QueryId;
1612
1789
  readonly queryNode: SelectQueryNode;
1613
1790
  readonly executor: QueryExecutor;
1614
1791
  }
1615
- /**
1616
- * {@link SelectQueryBuilder} with an alias. The result of calling {@link SelectQueryBuilder.as}.
1617
- */
1618
- export declare class AliasedSelectQueryBuilder<DB, TB extends keyof DB, O = undefined, A extends string = never> implements AliasedExpression<O, A> {
1619
- #private;
1620
- constructor(queryBuilder: SelectQueryBuilder<DB, TB, O>, alias: A);
1621
- /** @private */
1622
- /**
1623
- * Returns the aliased expression.
1624
- */
1625
- get expression(): Expression<O>;
1626
- /** @private */
1627
- /**
1628
- * Returns the alias.
1629
- */
1630
- get alias(): A;
1631
- /**
1632
- * Creates the OperationNode that describes how to compile this expression into SQL.
1633
- */
1634
- toOperationNode(): AliasNode;
1792
+ export interface AliasedSelectQueryBuilder<DB, TB extends keyof DB, O = undefined, A extends string = never> extends AliasedExpression<O, A> {
1793
+ get selectQueryBuilder(): SelectQueryBuilder<DB, TB, O>;
1635
1794
  }
1636
1795
  export type SelectQueryBuilderWithInnerJoin<DB, TB extends keyof DB, O, TE extends TableExpression<DB, TB>> = TE extends `${infer T} as ${infer A}` ? T extends keyof DB ? InnerJoinedBuilder<DB, TB, O, A, DB[T]> : never : TE extends keyof DB ? SelectQueryBuilder<DB, TB | TE, O> : TE extends AliasedExpression<infer QO, infer QA> ? InnerJoinedBuilder<DB, TB, O, QA, QO> : TE extends (qb: any) => AliasedExpression<infer QO, infer QA> ? InnerJoinedBuilder<DB, TB, O, QA, QO> : never;
1637
1796
  type InnerJoinedBuilder<DB, TB extends keyof DB, O, A extends string, R> = A extends keyof DB ? SelectQueryBuilder<InnerJoinedDB<DB, A, R>, TB | A, O> : SelectQueryBuilder<DB & ShallowRecord<A, R>, TB | A, O>;