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
@@ -0,0 +1,164 @@
1
+ import { Expression } from '../expression/expression.js';
2
+ import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
3
+ import { RawBuilder } from '../raw-builder/raw-builder.js';
4
+ import { Simplify } from '../util/type-utils.js';
5
+ /**
6
+ * A SQLite helper for aggregating a subquery into a JSON array.
7
+ *
8
+ * NOTE: This helper only works correctly if you've installed the `ParseJSONResultsPlugin`.
9
+ * Otherwise the nested selections will be returned as JSON strings.
10
+ *
11
+ * The plugin can be installed like this:
12
+ *
13
+ * ```ts
14
+ * const db = new Kysely({
15
+ * dialect: new SqliteDialect(config),
16
+ * plugins: [new ParseJSONResultsPlugin()]
17
+ * })
18
+ * ```
19
+ *
20
+ * ### Examples
21
+ *
22
+ * ```ts
23
+ * const result = await db
24
+ * .selectFrom('person')
25
+ * .select((eb) => [
26
+ * 'id',
27
+ * jsonArrayFrom(
28
+ * eb.selectFrom('pet')
29
+ * .select(['pet.id as pet_id', 'pet.name'])
30
+ * .whereRef('pet.owner_id', '=', 'person.id')
31
+ * .orderBy('pet.name')
32
+ * ).as('pets')
33
+ * ])
34
+ * .execute()
35
+ *
36
+ * result[0].id
37
+ * result[0].pets[0].pet_id
38
+ * result[0].pets[0].name
39
+ * ```
40
+ *
41
+ * The generated SQL (SQLite):
42
+ *
43
+ * ```sql
44
+ * select "id", (
45
+ * select coalesce(json_group_array(json_object(
46
+ * 'pet_id', "agg"."pet_id",
47
+ * 'name', "agg"."name"
48
+ * )), '[]') from (
49
+ * select "pet"."id" as "pet_id", "pet"."name"
50
+ * from "pet"
51
+ * where "pet"."owner_id" = "person"."id"
52
+ * order by "pet"."name"
53
+ * ) as "agg"
54
+ * ) as "pets"
55
+ * from "person"
56
+ * ```
57
+ */
58
+ export declare function jsonArrayFrom<O>(expr: SelectQueryBuilder<any, any, O>): RawBuilder<Simplify<O>[]>;
59
+ /**
60
+ * A SQLite helper for turning a subquery into a JSON object.
61
+ *
62
+ * The subquery must only return one row.
63
+ *
64
+ * NOTE: This helper only works correctly if you've installed the `ParseJSONResultsPlugin`.
65
+ * Otherwise the nested selections will be returned as JSON strings.
66
+ *
67
+ * The plugin can be installed like this:
68
+ *
69
+ * ```ts
70
+ * const db = new Kysely({
71
+ * dialect: new SqliteDialect(config),
72
+ * plugins: [new ParseJSONResultsPlugin()]
73
+ * })
74
+ * ```
75
+ *
76
+ * ### Examples
77
+ *
78
+ * ```ts
79
+ * const result = await db
80
+ * .selectFrom('person')
81
+ * .select((eb) => [
82
+ * 'id',
83
+ * jsonObjectFrom(
84
+ * eb.selectFrom('pet')
85
+ * .select(['pet.id as pet_id', 'pet.name'])
86
+ * .whereRef('pet.owner_id', '=', 'person.id')
87
+ * .where('pet.is_favorite', '=', true)
88
+ * ).as('favorite_pet')
89
+ * ])
90
+ * .execute()
91
+ *
92
+ * result[0].id
93
+ * result[0].favorite_pet.pet_id
94
+ * result[0].favorite_pet.name
95
+ * ```
96
+ *
97
+ * The generated SQL (SQLite):
98
+ *
99
+ * ```sql
100
+ * select "id", (
101
+ * select json_object(
102
+ * 'pet_id', "obj"."pet_id",
103
+ * 'name', "obj"."name"
104
+ * ) from (
105
+ * select "pet"."id" as "pet_id", "pet"."name"
106
+ * from "pet"
107
+ * where "pet"."owner_id" = "person"."id"
108
+ * and "pet"."is_favorite" = ?
109
+ * ) as obj
110
+ * ) as "favorite_pet"
111
+ * from "person";
112
+ * ```
113
+ */
114
+ export declare function jsonObjectFrom<O>(expr: SelectQueryBuilder<any, any, O>): RawBuilder<Simplify<O> | null>;
115
+ /**
116
+ * The SQLite `json_object` function.
117
+ *
118
+ * NOTE: This helper only works correctly if you've installed the `ParseJSONResultsPlugin`.
119
+ * Otherwise the nested selections will be returned as JSON strings.
120
+ *
121
+ * The plugin can be installed like this:
122
+ *
123
+ * ```ts
124
+ * const db = new Kysely({
125
+ * dialect: new SqliteDialect(config),
126
+ * plugins: [new ParseJSONResultsPlugin()]
127
+ * })
128
+ * ```
129
+ *
130
+ * ### Examples
131
+ *
132
+ * ```ts
133
+ * const result = await db
134
+ * .selectFrom('person')
135
+ * .select((eb) => [
136
+ * 'id',
137
+ * jsonBuildObject({
138
+ * first: eb.ref('first_name'),
139
+ * last: eb.ref('last_name'),
140
+ * full: sql<string>`first_name || ' ' || last_name`
141
+ * }).as('name')
142
+ * ])
143
+ * .execute()
144
+ *
145
+ * result[0].id
146
+ * result[0].name.first
147
+ * result[0].name.last
148
+ * result[0].name.full
149
+ * ```
150
+ *
151
+ * The generated SQL (SQLite):
152
+ *
153
+ * ```sql
154
+ * select "id", json_object(
155
+ * 'first', first_name,
156
+ * 'last', last_name,
157
+ * 'full', "first_name" || ' ' || "last_name"
158
+ * ) as "name"
159
+ * from "person"
160
+ * ```
161
+ */
162
+ export declare function jsonBuildObject<O extends Record<string, Expression<unknown>>>(obj: O): RawBuilder<Simplify<{
163
+ [K in keyof O]: O[K] extends Expression<infer V> ? V : never;
164
+ }>>;
@@ -0,0 +1,175 @@
1
+ /// <reference types="./sqlite.d.ts" />
2
+ import { sql } from '../raw-builder/sql.js';
3
+ import { getJsonObjectArgs } from '../util/json-object-args.js';
4
+ /**
5
+ * A SQLite helper for aggregating a subquery into a JSON array.
6
+ *
7
+ * NOTE: This helper only works correctly if you've installed the `ParseJSONResultsPlugin`.
8
+ * Otherwise the nested selections will be returned as JSON strings.
9
+ *
10
+ * The plugin can be installed like this:
11
+ *
12
+ * ```ts
13
+ * const db = new Kysely({
14
+ * dialect: new SqliteDialect(config),
15
+ * plugins: [new ParseJSONResultsPlugin()]
16
+ * })
17
+ * ```
18
+ *
19
+ * ### Examples
20
+ *
21
+ * ```ts
22
+ * const result = await db
23
+ * .selectFrom('person')
24
+ * .select((eb) => [
25
+ * 'id',
26
+ * jsonArrayFrom(
27
+ * eb.selectFrom('pet')
28
+ * .select(['pet.id as pet_id', 'pet.name'])
29
+ * .whereRef('pet.owner_id', '=', 'person.id')
30
+ * .orderBy('pet.name')
31
+ * ).as('pets')
32
+ * ])
33
+ * .execute()
34
+ *
35
+ * result[0].id
36
+ * result[0].pets[0].pet_id
37
+ * result[0].pets[0].name
38
+ * ```
39
+ *
40
+ * The generated SQL (SQLite):
41
+ *
42
+ * ```sql
43
+ * select "id", (
44
+ * select coalesce(json_group_array(json_object(
45
+ * 'pet_id', "agg"."pet_id",
46
+ * 'name', "agg"."name"
47
+ * )), '[]') from (
48
+ * select "pet"."id" as "pet_id", "pet"."name"
49
+ * from "pet"
50
+ * where "pet"."owner_id" = "person"."id"
51
+ * order by "pet"."name"
52
+ * ) as "agg"
53
+ * ) as "pets"
54
+ * from "person"
55
+ * ```
56
+ */
57
+ export function jsonArrayFrom(expr) {
58
+ return sql `(select coalesce(json_group_array(json_object(${sql.join(getSqliteJsonObjectArgs(expr.toOperationNode(), 'agg'))})), '[]') from ${expr} as agg)`;
59
+ }
60
+ /**
61
+ * A SQLite helper for turning a subquery into a JSON object.
62
+ *
63
+ * The subquery must only return one row.
64
+ *
65
+ * NOTE: This helper only works correctly if you've installed the `ParseJSONResultsPlugin`.
66
+ * Otherwise the nested selections will be returned as JSON strings.
67
+ *
68
+ * The plugin can be installed like this:
69
+ *
70
+ * ```ts
71
+ * const db = new Kysely({
72
+ * dialect: new SqliteDialect(config),
73
+ * plugins: [new ParseJSONResultsPlugin()]
74
+ * })
75
+ * ```
76
+ *
77
+ * ### Examples
78
+ *
79
+ * ```ts
80
+ * const result = await db
81
+ * .selectFrom('person')
82
+ * .select((eb) => [
83
+ * 'id',
84
+ * jsonObjectFrom(
85
+ * eb.selectFrom('pet')
86
+ * .select(['pet.id as pet_id', 'pet.name'])
87
+ * .whereRef('pet.owner_id', '=', 'person.id')
88
+ * .where('pet.is_favorite', '=', true)
89
+ * ).as('favorite_pet')
90
+ * ])
91
+ * .execute()
92
+ *
93
+ * result[0].id
94
+ * result[0].favorite_pet.pet_id
95
+ * result[0].favorite_pet.name
96
+ * ```
97
+ *
98
+ * The generated SQL (SQLite):
99
+ *
100
+ * ```sql
101
+ * select "id", (
102
+ * select json_object(
103
+ * 'pet_id', "obj"."pet_id",
104
+ * 'name', "obj"."name"
105
+ * ) from (
106
+ * select "pet"."id" as "pet_id", "pet"."name"
107
+ * from "pet"
108
+ * where "pet"."owner_id" = "person"."id"
109
+ * and "pet"."is_favorite" = ?
110
+ * ) as obj
111
+ * ) as "favorite_pet"
112
+ * from "person";
113
+ * ```
114
+ */
115
+ export function jsonObjectFrom(expr) {
116
+ return sql `(select json_object(${sql.join(getSqliteJsonObjectArgs(expr.toOperationNode(), 'obj'))}) from ${expr} as obj)`;
117
+ }
118
+ /**
119
+ * The SQLite `json_object` function.
120
+ *
121
+ * NOTE: This helper only works correctly if you've installed the `ParseJSONResultsPlugin`.
122
+ * Otherwise the nested selections will be returned as JSON strings.
123
+ *
124
+ * The plugin can be installed like this:
125
+ *
126
+ * ```ts
127
+ * const db = new Kysely({
128
+ * dialect: new SqliteDialect(config),
129
+ * plugins: [new ParseJSONResultsPlugin()]
130
+ * })
131
+ * ```
132
+ *
133
+ * ### Examples
134
+ *
135
+ * ```ts
136
+ * const result = await db
137
+ * .selectFrom('person')
138
+ * .select((eb) => [
139
+ * 'id',
140
+ * jsonBuildObject({
141
+ * first: eb.ref('first_name'),
142
+ * last: eb.ref('last_name'),
143
+ * full: sql<string>`first_name || ' ' || last_name`
144
+ * }).as('name')
145
+ * ])
146
+ * .execute()
147
+ *
148
+ * result[0].id
149
+ * result[0].name.first
150
+ * result[0].name.last
151
+ * result[0].name.full
152
+ * ```
153
+ *
154
+ * The generated SQL (SQLite):
155
+ *
156
+ * ```sql
157
+ * select "id", json_object(
158
+ * 'first', first_name,
159
+ * 'last', last_name,
160
+ * 'full', "first_name" || ' ' || "last_name"
161
+ * ) as "name"
162
+ * from "person"
163
+ * ```
164
+ */
165
+ export function jsonBuildObject(obj) {
166
+ return sql `json_object(${sql.join(Object.keys(obj).flatMap((k) => [sql.lit(k), obj[k]]))})`;
167
+ }
168
+ function getSqliteJsonObjectArgs(node, table) {
169
+ try {
170
+ return getJsonObjectArgs(node, table);
171
+ }
172
+ catch {
173
+ throw new Error('SQLite jsonArrayFrom and jsonObjectFrom functions can only handle explicit selections due to limitations of the json_object function. selectAll() is not allowed in the subquery.');
174
+ }
175
+ }
@@ -170,6 +170,7 @@ export * from './operation-node/json-reference-node.js';
170
170
  export * from './operation-node/json-path-leg-node.js';
171
171
  export * from './operation-node/json-path-node.js';
172
172
  export * from './operation-node/json-operator-chain-node.js';
173
+ export * from './operation-node/tuple-node.js';
173
174
  export * from './util/column-type.js';
174
175
  export * from './util/compilable.js';
175
176
  export * from './util/explainable.js';
@@ -186,5 +187,6 @@ export { JoinReferenceExpression, JoinCallbackExpression, } from './parser/join-
186
187
  export { InsertObject } from './parser/insert-values-parser.js';
187
188
  export { UpdateObject } from './parser/update-set-parser.js';
188
189
  export { OrderByExpression, OrderByDirectionExpression, } from './parser/order-by-parser.js';
189
- export { ComparisonOperatorExpression, OperandValueExpression, OperandValueExpressionOrList, } from './parser/binary-operation-parser.js';
190
+ export { ComparisonOperatorExpression, OperandValueExpression, OperandValueExpressionOrList, FilterObject, } from './parser/binary-operation-parser.js';
190
191
  export { ExistsExpression } from './parser/unary-operation-parser.js';
192
+ export { OperandExpression, ExpressionOrFactory, } from './parser/expression-parser.js';
package/dist/esm/index.js CHANGED
@@ -171,6 +171,7 @@ export * from './operation-node/json-reference-node.js';
171
171
  export * from './operation-node/json-path-leg-node.js';
172
172
  export * from './operation-node/json-path-node.js';
173
173
  export * from './operation-node/json-operator-chain-node.js';
174
+ export * from './operation-node/tuple-node.js';
174
175
  export * from './util/column-type.js';
175
176
  export * from './util/compilable.js';
176
177
  export * from './util/explainable.js';
@@ -15,6 +15,7 @@ import { QueryId } from './util/query-id.js';
15
15
  import { Compilable } from './util/compilable.js';
16
16
  import { CaseBuilder } from './query-builder/case-builder.js';
17
17
  import { Expression } from './expression/expression.js';
18
+ import { DrainOuterGeneric } from './util/type-utils.js';
18
19
  /**
19
20
  * The main Kysely class.
20
21
  *
@@ -38,7 +39,7 @@ import { Expression } from './expression/expression.js';
38
39
  * id: Generated<number>
39
40
  * owner_id: number
40
41
  * name: string
41
- * species 'cat' | 'dog'
42
+ * species: 'cat' | 'dog'
42
43
  * }
43
44
  *
44
45
  * interface Database {
@@ -228,7 +229,7 @@ export declare class Kysely<DB> extends QueryCreator<DB> implements QueryExecuto
228
229
  * .execute()
229
230
  * ```
230
231
  */
231
- withTables<T extends Record<string, Record<string, any>>>(): Kysely<DB & T>;
232
+ withTables<T extends Record<string, Record<string, any>>>(): Kysely<DrainOuterGeneric<DB & T>>;
232
233
  /**
233
234
  * Releases all resources and disconnects from the database.
234
235
  *
@@ -385,7 +386,7 @@ export declare class Transaction<DB> extends Kysely<DB> {
385
386
  * .execute()
386
387
  * ```
387
388
  */
388
- withTables<T extends Record<string, Record<string, any>>>(): Transaction<DB & T>;
389
+ withTables<T extends Record<string, Record<string, any>>>(): Transaction<DrainOuterGeneric<DB & T>>;
389
390
  }
390
391
  export interface KyselyProps {
391
392
  readonly config: KyselyConfig;
@@ -40,7 +40,7 @@ import { WithSchemaPlugin } from './plugin/with-schema/with-schema-plugin.js';
40
40
  * id: Generated<number>
41
41
  * owner_id: number
42
42
  * name: string
43
- * species 'cat' | 'dog'
43
+ * species: 'cat' | 'dog'
44
44
  * }
45
45
  *
46
46
  * interface Database {
@@ -1,8 +1,10 @@
1
1
  import { CommonTableExpressionNameNode } from './common-table-expression-name-node.js';
2
2
  import { OperationNode } from './operation-node.js';
3
+ type CommonTableExpressionNodeProps = Pick<CommonTableExpressionNode, 'materialized'>;
3
4
  export interface CommonTableExpressionNode extends OperationNode {
4
5
  readonly kind: 'CommonTableExpressionNode';
5
6
  readonly name: CommonTableExpressionNameNode;
7
+ readonly materialized?: boolean;
6
8
  readonly expression: OperationNode;
7
9
  }
8
10
  /**
@@ -11,4 +13,6 @@ export interface CommonTableExpressionNode extends OperationNode {
11
13
  export declare const CommonTableExpressionNode: Readonly<{
12
14
  is(node: OperationNode): node is CommonTableExpressionNode;
13
15
  create(name: CommonTableExpressionNameNode, expression: OperationNode): CommonTableExpressionNode;
16
+ cloneWith(node: CommonTableExpressionNode, props: CommonTableExpressionNodeProps): CommonTableExpressionNode;
14
17
  }>;
18
+ export {};
@@ -14,4 +14,10 @@ export const CommonTableExpressionNode = freeze({
14
14
  expression,
15
15
  });
16
16
  },
17
+ cloneWith(node, props) {
18
+ return freeze({
19
+ ...node,
20
+ ...props,
21
+ });
22
+ },
17
23
  });
@@ -27,7 +27,7 @@ export interface DeleteQueryNode extends OperationNode {
27
27
  export declare const DeleteQueryNode: Readonly<{
28
28
  is(node: OperationNode): node is DeleteQueryNode;
29
29
  create(fromItems: OperationNode[], withNode?: WithNode): DeleteQueryNode;
30
- cloneWithOrderByItem(deleteNode: DeleteQueryNode, item: OrderByItemNode): DeleteQueryNode;
30
+ cloneWithOrderByItems(deleteNode: DeleteQueryNode, items: ReadonlyArray<OrderByItemNode>): DeleteQueryNode;
31
31
  cloneWithLimit(deleteNode: DeleteQueryNode, limit: LimitNode): DeleteQueryNode;
32
32
  cloneWithUsing(deleteNode: DeleteQueryNode, tables: OperationNode[]): DeleteQueryNode;
33
33
  }>;
@@ -17,12 +17,12 @@ export const DeleteQueryNode = freeze({
17
17
  ...(withNode && { with: withNode }),
18
18
  });
19
19
  },
20
- cloneWithOrderByItem(deleteNode, item) {
20
+ cloneWithOrderByItems(deleteNode, items) {
21
21
  return freeze({
22
22
  ...deleteNode,
23
23
  orderBy: deleteNode.orderBy
24
- ? OrderByNode.cloneWithItem(deleteNode.orderBy, item)
25
- : OrderByNode.create(item),
24
+ ? OrderByNode.cloneWithItems(deleteNode.orderBy, items)
25
+ : OrderByNode.create(items),
26
26
  });
27
27
  },
28
28
  cloneWithLimit(deleteNode, limit) {
@@ -84,6 +84,7 @@ import { JSONReferenceNode } from './json-reference-node.js';
84
84
  import { JSONPathNode } from './json-path-node.js';
85
85
  import { JSONPathLegNode } from './json-path-leg-node.js';
86
86
  import { JSONOperatorChainNode } from './json-operator-chain-node.js';
87
+ import { TupleNode } from './tuple-node.js';
87
88
  /**
88
89
  * Transforms an operation node tree into another one.
89
90
  *
@@ -197,6 +198,7 @@ export declare class OperationNodeTransformer {
197
198
  protected transformJSONPath(node: JSONPathNode): JSONPathNode;
198
199
  protected transformJSONPathLeg(node: JSONPathLegNode): JSONPathLegNode;
199
200
  protected transformJSONOperatorChain(node: JSONOperatorChainNode): JSONOperatorChainNode;
201
+ protected transformTuple(node: TupleNode): TupleNode;
200
202
  protected transformDataType(node: DataTypeNode): DataTypeNode;
201
203
  protected transformSelectAll(node: SelectAllNode): SelectAllNode;
202
204
  protected transformIdentifier(node: IdentifierNode): IdentifierNode;
@@ -118,6 +118,7 @@ export class OperationNodeTransformer {
118
118
  JSONPathNode: this.transformJSONPath.bind(this),
119
119
  JSONPathLegNode: this.transformJSONPathLeg.bind(this),
120
120
  JSONOperatorChainNode: this.transformJSONOperatorChain.bind(this),
121
+ TupleNode: this.transformTuple.bind(this),
121
122
  });
122
123
  transformNode(node) {
123
124
  if (!node) {
@@ -489,6 +490,7 @@ export class OperationNodeTransformer {
489
490
  return requireAllProps({
490
491
  kind: 'CommonTableExpressionNode',
491
492
  name: this.transformNode(node.name),
493
+ materialized: node.materialized,
492
494
  expression: this.transformNode(node.expression),
493
495
  });
494
496
  }
@@ -755,6 +757,12 @@ export class OperationNodeTransformer {
755
757
  values: this.transformNodeList(node.values),
756
758
  });
757
759
  }
760
+ transformTuple(node) {
761
+ return requireAllProps({
762
+ kind: 'TupleNode',
763
+ values: this.transformNodeList(node.values),
764
+ });
765
+ }
758
766
  transformDataType(node) {
759
767
  // An Object.freezed leaf node. No need to clone.
760
768
  return node;
@@ -84,6 +84,7 @@ import { JSONReferenceNode } from './json-reference-node.js';
84
84
  import { JSONPathNode } from './json-path-node.js';
85
85
  import { JSONPathLegNode } from './json-path-leg-node.js';
86
86
  import { JSONOperatorChainNode } from './json-operator-chain-node.js';
87
+ import { TupleNode } from './tuple-node.js';
87
88
  export declare abstract class OperationNodeVisitor {
88
89
  #private;
89
90
  protected readonly nodeStack: OperationNode[];
@@ -174,4 +175,5 @@ export declare abstract class OperationNodeVisitor {
174
175
  protected abstract visitJSONPath(node: JSONPathNode): void;
175
176
  protected abstract visitJSONPathLeg(node: JSONPathLegNode): void;
176
177
  protected abstract visitJSONOperatorChain(node: JSONOperatorChainNode): void;
178
+ protected abstract visitTuple(node: TupleNode): void;
177
179
  }
@@ -91,6 +91,7 @@ export class OperationNodeVisitor {
91
91
  JSONPathNode: this.visitJSONPath.bind(this),
92
92
  JSONPathLegNode: this.visitJSONPathLeg.bind(this),
93
93
  JSONOperatorChainNode: this.visitJSONOperatorChain.bind(this),
94
+ TupleNode: this.visitTuple.bind(this),
94
95
  });
95
96
  visitNode = (node) => {
96
97
  this.nodeStack.push(node);
@@ -1,4 +1,4 @@
1
- export type OperationNodeKind = 'IdentifierNode' | 'SchemableIdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode' | 'SelectModifierNode' | 'CreateTypeNode' | 'DropTypeNode' | 'ExplainNode' | 'DefaultInsertValueNode' | 'AggregateFunctionNode' | 'OverNode' | 'PartitionByNode' | 'PartitionByItemNode' | 'SetOperationNode' | 'BinaryOperationNode' | 'UnaryOperationNode' | 'UsingNode' | 'FunctionNode' | 'CaseNode' | 'WhenNode' | 'JSONReferenceNode' | 'JSONPathNode' | 'JSONPathLegNode' | 'JSONOperatorChainNode';
1
+ export type OperationNodeKind = 'IdentifierNode' | 'SchemableIdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode' | 'SelectModifierNode' | 'CreateTypeNode' | 'DropTypeNode' | 'ExplainNode' | 'DefaultInsertValueNode' | 'AggregateFunctionNode' | 'OverNode' | 'PartitionByNode' | 'PartitionByItemNode' | 'SetOperationNode' | 'BinaryOperationNode' | 'UnaryOperationNode' | 'UsingNode' | 'FunctionNode' | 'CaseNode' | 'WhenNode' | 'JSONReferenceNode' | 'JSONPathNode' | 'JSONPathLegNode' | 'JSONOperatorChainNode' | 'TupleNode';
2
2
  export interface OperationNode {
3
3
  readonly kind: OperationNodeKind;
4
4
  }
@@ -1,11 +1,11 @@
1
1
  import { OperationNode } from './operation-node.js';
2
- export declare const COMPARISON_OPERATORS: readonly ["=", "==", "!=", "<>", ">", ">=", "<", "<=", "in", "not in", "is", "is not", "like", "not like", "match", "ilike", "not ilike", "@>", "<@", "?", "?&", "!<", "!>", "<=>", "!~", "~", "~*", "!~*", "@@", "@@@", "!!", "<->", "regexp"];
2
+ export declare const COMPARISON_OPERATORS: readonly ["=", "==", "!=", "<>", ">", ">=", "<", "<=", "in", "not in", "is", "is not", "like", "not like", "match", "ilike", "not ilike", "@>", "<@", "&&", "?", "?&", "!<", "!>", "<=>", "!~", "~", "~*", "!~*", "@@", "@@@", "!!", "<->", "regexp"];
3
3
  export declare const ARITHMETIC_OPERATORS: readonly ["+", "-", "*", "/", "%", "^", "&", "|", "#", "<<", ">>"];
4
4
  export declare const JSON_OPERATORS: readonly ["->", "->>"];
5
- export declare const BINARY_OPERATORS: readonly ["=", "==", "!=", "<>", ">", ">=", "<", "<=", "in", "not in", "is", "is not", "like", "not like", "match", "ilike", "not ilike", "@>", "<@", "?", "?&", "!<", "!>", "<=>", "!~", "~", "~*", "!~*", "@@", "@@@", "!!", "<->", "regexp", "+", "-", "*", "/", "%", "^", "&", "|", "#", "<<", ">>", "&&", "||"];
5
+ export declare const BINARY_OPERATORS: readonly ["=", "==", "!=", "<>", ">", ">=", "<", "<=", "in", "not in", "is", "is not", "like", "not like", "match", "ilike", "not ilike", "@>", "<@", "&&", "?", "?&", "!<", "!>", "<=>", "!~", "~", "~*", "!~*", "@@", "@@@", "!!", "<->", "regexp", "+", "-", "*", "/", "%", "^", "&", "|", "#", "<<", ">>", "&&", "||"];
6
6
  export declare const UNARY_FILTER_OPERATORS: readonly ["exists", "not exists"];
7
7
  export declare const UNARY_OPERATORS: readonly ["not", "-", "exists", "not exists"];
8
- export declare const OPERATORS: readonly ["=", "==", "!=", "<>", ">", ">=", "<", "<=", "in", "not in", "is", "is not", "like", "not like", "match", "ilike", "not ilike", "@>", "<@", "?", "?&", "!<", "!>", "<=>", "!~", "~", "~*", "!~*", "@@", "@@@", "!!", "<->", "regexp", "+", "-", "*", "/", "%", "^", "&", "|", "#", "<<", ">>", "&&", "||", "->", "->>", "not", "-", "exists", "not exists"];
8
+ export declare const OPERATORS: readonly ["=", "==", "!=", "<>", ">", ">=", "<", "<=", "in", "not in", "is", "is not", "like", "not like", "match", "ilike", "not ilike", "@>", "<@", "&&", "?", "?&", "!<", "!>", "<=>", "!~", "~", "~*", "!~*", "@@", "@@@", "!!", "<->", "regexp", "+", "-", "*", "/", "%", "^", "&", "|", "#", "<<", ">>", "&&", "||", "->", "->>", "not", "-", "exists", "not exists", "between", "between symmetric"];
9
9
  export type ComparisonOperator = (typeof COMPARISON_OPERATORS)[number];
10
10
  export type ArithmeticOperator = (typeof ARITHMETIC_OPERATORS)[number];
11
11
  export type JSONOperator = (typeof JSON_OPERATORS)[number];
@@ -20,6 +20,7 @@ export const COMPARISON_OPERATORS = [
20
20
  'not ilike',
21
21
  '@>',
22
22
  '<@',
23
+ '&&',
23
24
  '?',
24
25
  '?&',
25
26
  '!<',
@@ -61,6 +62,8 @@ export const OPERATORS = [
61
62
  ...BINARY_OPERATORS,
62
63
  ...JSON_OPERATORS,
63
64
  ...UNARY_OPERATORS,
65
+ 'between',
66
+ 'between symmetric',
64
67
  ];
65
68
  /**
66
69
  * @internal
@@ -9,6 +9,6 @@ export interface OrderByNode extends OperationNode {
9
9
  */
10
10
  export declare const OrderByNode: Readonly<{
11
11
  is(node: OperationNode): node is OrderByNode;
12
- create(item: OrderByItemNode): OrderByNode;
13
- cloneWithItem(orderBy: OrderByNode, item: OrderByItemNode): OrderByNode;
12
+ create(items: ReadonlyArray<OrderByItemNode>): OrderByNode;
13
+ cloneWithItems(orderBy: OrderByNode, items: ReadonlyArray<OrderByItemNode>): OrderByNode;
14
14
  }>;
@@ -7,16 +7,16 @@ export const OrderByNode = freeze({
7
7
  is(node) {
8
8
  return node.kind === 'OrderByNode';
9
9
  },
10
- create(item) {
10
+ create(items) {
11
11
  return freeze({
12
12
  kind: 'OrderByNode',
13
- items: freeze([item]),
13
+ items: freeze([...items]),
14
14
  });
15
15
  },
16
- cloneWithItem(orderBy, item) {
16
+ cloneWithItems(orderBy, items) {
17
17
  return freeze({
18
18
  ...orderBy,
19
- items: freeze([...orderBy.items, item]),
19
+ items: freeze([...orderBy.items, ...items]),
20
20
  });
21
21
  },
22
22
  });
@@ -14,6 +14,6 @@ export interface OverNode extends OperationNode {
14
14
  export declare const OverNode: Readonly<{
15
15
  is(node: OperationNode): node is OverNode;
16
16
  create(): OverNode;
17
- cloneWithOrderByItem(overNode: OverNode, item: OrderByItemNode): OverNode;
17
+ cloneWithOrderByItems(overNode: OverNode, items: ReadonlyArray<OrderByItemNode>): OverNode;
18
18
  cloneWithPartitionByItems(overNode: OverNode, items: ReadonlyArray<PartitionByItemNode>): OverNode;
19
19
  }>;
@@ -14,12 +14,12 @@ export const OverNode = freeze({
14
14
  kind: 'OverNode',
15
15
  });
16
16
  },
17
- cloneWithOrderByItem(overNode, item) {
17
+ cloneWithOrderByItems(overNode, items) {
18
18
  return freeze({
19
19
  ...overNode,
20
20
  orderBy: overNode.orderBy
21
- ? OrderByNode.cloneWithItem(overNode.orderBy, item)
22
- : OrderByNode.create(item),
21
+ ? OrderByNode.cloneWithItems(overNode.orderBy, items)
22
+ : OrderByNode.create(items),
23
23
  });
24
24
  },
25
25
  cloneWithPartitionByItems(overNode, items) {