kysely 0.11.1 → 0.12.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 (216) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/dialect/mysql/mysql-query-compiler.d.ts +0 -2
  3. package/dist/cjs/dialect/mysql/mysql-query-compiler.js +0 -6
  4. package/dist/cjs/dialect/postgres/postgres-query-compiler.d.ts +3 -0
  5. package/dist/cjs/dialect/postgres/postgres-query-compiler.js +9 -1
  6. package/dist/cjs/dialect/sqlite/sqlite-adapter.js +6 -2
  7. package/dist/cjs/dialect/sqlite/sqlite-driver.js +7 -7
  8. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.d.ts +2 -2
  9. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.js +6 -6
  10. package/dist/cjs/driver/runtime-driver.js +1 -1
  11. package/dist/cjs/dynamic/dynamic-reference-builder.d.ts +1 -0
  12. package/dist/cjs/dynamic/dynamic-reference-builder.js +9 -1
  13. package/dist/cjs/dynamic/dynamic.d.ts +6 -7
  14. package/dist/cjs/dynamic/dynamic.js +6 -7
  15. package/dist/cjs/index.d.ts +51 -33
  16. package/dist/cjs/index.js +48 -30
  17. package/dist/cjs/kysely.d.ts +39 -15
  18. package/dist/cjs/kysely.js +32 -9
  19. package/dist/cjs/migration/migration.d.ts +2 -2
  20. package/dist/cjs/operation-node/alias-node.d.ts +1 -1
  21. package/dist/cjs/operation-node/create-table-node.d.ts +6 -2
  22. package/dist/cjs/operation-node/create-table-node.js +6 -6
  23. package/dist/cjs/operation-node/create-view-node.d.ts +1 -0
  24. package/dist/cjs/operation-node/insert-query-node.d.ts +4 -4
  25. package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
  26. package/dist/cjs/operation-node/operation-node-transformer.js +11 -1
  27. package/dist/cjs/operation-node/operation-node-utils.d.ts +1 -1
  28. package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
  29. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  30. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  31. package/dist/cjs/operation-node/query-node.d.ts +0 -2
  32. package/dist/cjs/operation-node/query-node.js +0 -10
  33. package/dist/cjs/operation-node/values-node.d.ts +15 -0
  34. package/dist/cjs/operation-node/values-node.js +18 -0
  35. package/dist/cjs/parser/complex-expression-parser.d.ts +9 -0
  36. package/dist/cjs/parser/complex-expression-parser.js +25 -0
  37. package/dist/cjs/parser/filter-parser.d.ts +13 -3
  38. package/dist/cjs/parser/filter-parser.js +56 -62
  39. package/dist/cjs/parser/insert-values-parser.d.ts +7 -10
  40. package/dist/cjs/parser/insert-values-parser.js +31 -39
  41. package/dist/cjs/parser/order-by-parser.d.ts +1 -1
  42. package/dist/cjs/parser/parse-context.d.ts +8 -8
  43. package/dist/cjs/parser/parse-context.js +10 -10
  44. package/dist/cjs/parser/reference-parser.d.ts +8 -7
  45. package/dist/cjs/parser/reference-parser.js +8 -17
  46. package/dist/cjs/parser/returning-parser.d.ts +1 -5
  47. package/dist/cjs/parser/select-parser.d.ts +12 -14
  48. package/dist/cjs/parser/select-parser.js +5 -9
  49. package/dist/cjs/parser/table-parser.d.ts +9 -11
  50. package/dist/cjs/parser/table-parser.js +2 -8
  51. package/dist/cjs/parser/union-parser.d.ts +2 -2
  52. package/dist/cjs/parser/union-parser.js +1 -6
  53. package/dist/cjs/parser/update-set-parser.d.ts +2 -8
  54. package/dist/cjs/parser/update-set-parser.js +6 -26
  55. package/dist/cjs/parser/value-parser.d.ts +9 -6
  56. package/dist/cjs/parser/value-parser.js +7 -30
  57. package/dist/cjs/parser/with-parser.d.ts +6 -3
  58. package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.js +2 -2
  59. package/dist/cjs/query-builder/delete-query-builder.d.ts +102 -0
  60. package/dist/cjs/query-builder/delete-query-builder.js +185 -0
  61. package/dist/cjs/query-builder/expression-builder.d.ts +8 -6
  62. package/dist/cjs/query-builder/expression-builder.js +3 -3
  63. package/dist/cjs/query-builder/function-builder.d.ts +2 -1
  64. package/dist/cjs/query-builder/function-builder.js +2 -1
  65. package/dist/cjs/query-builder/having-interface.d.ts +49 -0
  66. package/dist/cjs/query-builder/having-interface.js +2 -0
  67. package/dist/cjs/query-builder/insert-query-builder.d.ts +439 -0
  68. package/dist/cjs/query-builder/insert-query-builder.js +256 -0
  69. package/dist/cjs/query-builder/insert-result.d.ts +3 -2
  70. package/dist/cjs/query-builder/insert-result.js +3 -2
  71. package/dist/cjs/query-builder/join-builder.d.ts +22 -20
  72. package/dist/cjs/query-builder/join-builder.js +12 -12
  73. package/dist/cjs/query-builder/join-interface.d.ts +133 -0
  74. package/dist/cjs/query-builder/join-interface.js +2 -0
  75. package/dist/cjs/query-builder/no-result-error.d.ts +9 -0
  76. package/dist/cjs/query-builder/no-result-error.js +14 -0
  77. package/dist/cjs/query-builder/returning-interface.d.ts +73 -0
  78. package/dist/cjs/query-builder/returning-interface.js +2 -0
  79. package/dist/cjs/query-builder/select-query-builder.d.ts +711 -0
  80. package/dist/cjs/query-builder/select-query-builder.js +571 -0
  81. package/dist/cjs/query-builder/update-query-builder.d.ts +190 -0
  82. package/dist/cjs/query-builder/update-query-builder.js +279 -0
  83. package/dist/cjs/query-builder/where-interface.d.ts +381 -0
  84. package/dist/cjs/query-builder/where-interface.js +2 -0
  85. package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -0
  86. package/dist/cjs/query-compiler/default-query-compiler.js +22 -5
  87. package/dist/cjs/query-creator.d.ts +42 -40
  88. package/dist/cjs/query-creator.js +33 -28
  89. package/dist/cjs/query-executor/query-executor.d.ts +1 -1
  90. package/dist/cjs/query-executor/query-executor.js +1 -1
  91. package/dist/cjs/raw-builder/raw-builder.d.ts +2 -0
  92. package/dist/cjs/raw-builder/raw-builder.js +6 -0
  93. package/dist/cjs/schema/alter-table-builder.d.ts +2 -2
  94. package/dist/cjs/schema/column-definition-builder.d.ts +27 -20
  95. package/dist/cjs/schema/create-index-builder.d.ts +2 -1
  96. package/dist/cjs/schema/create-index-builder.js +2 -1
  97. package/dist/cjs/schema/create-table-builder.d.ts +26 -9
  98. package/dist/cjs/schema/create-table-builder.js +42 -9
  99. package/dist/cjs/schema/create-view-builder.d.ts +17 -3
  100. package/dist/cjs/schema/create-view-builder.js +25 -16
  101. package/dist/cjs/schema/schema.d.ts +18 -11
  102. package/dist/cjs/schema/schema.js +18 -11
  103. package/dist/cjs/util/dynamic-import.js +1 -1
  104. package/dist/cjs/util/log.d.ts +11 -8
  105. package/dist/cjs/util/log.js +25 -12
  106. package/dist/cjs/util/type-utils.d.ts +7 -7
  107. package/dist/esm/dialect/mysql/mysql-query-compiler.d.ts +0 -2
  108. package/dist/esm/dialect/mysql/mysql-query-compiler.js +0 -6
  109. package/dist/esm/dialect/postgres/postgres-query-compiler.d.ts +3 -0
  110. package/dist/esm/dialect/postgres/postgres-query-compiler.js +9 -1
  111. package/dist/esm/dialect/sqlite/sqlite-adapter.js +6 -2
  112. package/dist/esm/dialect/sqlite/sqlite-driver.js +7 -7
  113. package/dist/esm/dialect/sqlite/sqlite-query-compiler.d.ts +2 -2
  114. package/dist/esm/dialect/sqlite/sqlite-query-compiler.js +6 -6
  115. package/dist/esm/driver/runtime-driver.js +1 -1
  116. package/dist/esm/dynamic/dynamic-reference-builder.d.ts +1 -0
  117. package/dist/esm/dynamic/dynamic-reference-builder.js +7 -0
  118. package/dist/esm/dynamic/dynamic.d.ts +6 -7
  119. package/dist/esm/dynamic/dynamic.js +6 -7
  120. package/dist/esm/index.d.ts +51 -33
  121. package/dist/esm/index.js +48 -30
  122. package/dist/esm/kysely.d.ts +39 -15
  123. package/dist/esm/kysely.js +32 -9
  124. package/dist/esm/migration/migration.d.ts +2 -2
  125. package/dist/esm/operation-node/alias-node.d.ts +1 -1
  126. package/dist/esm/operation-node/create-table-node.d.ts +6 -2
  127. package/dist/esm/operation-node/create-table-node.js +6 -6
  128. package/dist/esm/operation-node/create-view-node.d.ts +1 -0
  129. package/dist/esm/operation-node/insert-query-node.d.ts +4 -4
  130. package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
  131. package/dist/esm/operation-node/operation-node-transformer.js +11 -1
  132. package/dist/esm/operation-node/operation-node-utils.d.ts +1 -1
  133. package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
  134. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  135. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  136. package/dist/esm/operation-node/query-node.d.ts +0 -2
  137. package/dist/esm/operation-node/query-node.js +0 -10
  138. package/dist/esm/operation-node/values-node.d.ts +15 -0
  139. package/dist/esm/operation-node/values-node.js +15 -0
  140. package/dist/esm/parser/complex-expression-parser.d.ts +9 -0
  141. package/dist/esm/parser/complex-expression-parser.js +20 -0
  142. package/dist/esm/parser/filter-parser.d.ts +13 -3
  143. package/dist/esm/parser/filter-parser.js +55 -62
  144. package/dist/esm/parser/insert-values-parser.d.ts +7 -10
  145. package/dist/esm/parser/insert-values-parser.js +31 -38
  146. package/dist/esm/parser/order-by-parser.d.ts +1 -1
  147. package/dist/esm/parser/parse-context.d.ts +8 -8
  148. package/dist/esm/parser/parse-context.js +10 -10
  149. package/dist/esm/parser/reference-parser.d.ts +8 -7
  150. package/dist/esm/parser/reference-parser.js +9 -18
  151. package/dist/esm/parser/returning-parser.d.ts +1 -5
  152. package/dist/esm/parser/select-parser.d.ts +12 -14
  153. package/dist/esm/parser/select-parser.js +6 -10
  154. package/dist/esm/parser/table-parser.d.ts +9 -11
  155. package/dist/esm/parser/table-parser.js +3 -9
  156. package/dist/esm/parser/union-parser.d.ts +2 -2
  157. package/dist/esm/parser/union-parser.js +1 -6
  158. package/dist/esm/parser/update-set-parser.d.ts +2 -8
  159. package/dist/esm/parser/update-set-parser.js +5 -24
  160. package/dist/esm/parser/value-parser.d.ts +9 -6
  161. package/dist/esm/parser/value-parser.js +8 -31
  162. package/dist/esm/parser/with-parser.d.ts +6 -3
  163. package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.js +2 -2
  164. package/dist/esm/query-builder/delete-query-builder.d.ts +102 -0
  165. package/dist/esm/query-builder/delete-query-builder.js +181 -0
  166. package/dist/esm/query-builder/expression-builder.d.ts +8 -6
  167. package/dist/esm/query-builder/expression-builder.js +3 -3
  168. package/dist/esm/query-builder/function-builder.d.ts +2 -1
  169. package/dist/esm/query-builder/function-builder.js +2 -1
  170. package/dist/esm/query-builder/having-interface.d.ts +49 -0
  171. package/dist/esm/query-builder/having-interface.js +1 -0
  172. package/dist/esm/query-builder/insert-query-builder.d.ts +439 -0
  173. package/dist/esm/query-builder/insert-query-builder.js +252 -0
  174. package/dist/esm/query-builder/insert-result.d.ts +3 -2
  175. package/dist/esm/query-builder/insert-result.js +3 -2
  176. package/dist/esm/query-builder/join-builder.d.ts +22 -20
  177. package/dist/esm/query-builder/join-builder.js +12 -12
  178. package/dist/esm/query-builder/join-interface.d.ts +133 -0
  179. package/dist/esm/query-builder/join-interface.js +1 -0
  180. package/dist/esm/query-builder/no-result-error.d.ts +9 -0
  181. package/dist/esm/query-builder/no-result-error.js +10 -0
  182. package/dist/esm/query-builder/returning-interface.d.ts +73 -0
  183. package/dist/esm/query-builder/returning-interface.js +1 -0
  184. package/dist/esm/query-builder/select-query-builder.d.ts +711 -0
  185. package/dist/esm/query-builder/select-query-builder.js +566 -0
  186. package/dist/esm/query-builder/update-query-builder.d.ts +190 -0
  187. package/dist/esm/query-builder/update-query-builder.js +275 -0
  188. package/dist/esm/query-builder/where-interface.d.ts +381 -0
  189. package/dist/esm/query-builder/where-interface.js +1 -0
  190. package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -0
  191. package/dist/esm/query-compiler/default-query-compiler.js +22 -5
  192. package/dist/esm/query-creator.d.ts +42 -40
  193. package/dist/esm/query-creator.js +33 -28
  194. package/dist/esm/query-executor/query-executor.d.ts +1 -1
  195. package/dist/esm/query-executor/query-executor.js +1 -1
  196. package/dist/esm/raw-builder/raw-builder.d.ts +2 -0
  197. package/dist/esm/raw-builder/raw-builder.js +6 -0
  198. package/dist/esm/schema/alter-table-builder.d.ts +2 -2
  199. package/dist/esm/schema/column-definition-builder.d.ts +27 -20
  200. package/dist/esm/schema/create-index-builder.d.ts +2 -1
  201. package/dist/esm/schema/create-index-builder.js +2 -1
  202. package/dist/esm/schema/create-table-builder.d.ts +26 -9
  203. package/dist/esm/schema/create-table-builder.js +43 -10
  204. package/dist/esm/schema/create-view-builder.d.ts +17 -3
  205. package/dist/esm/schema/create-view-builder.js +25 -16
  206. package/dist/esm/schema/schema.d.ts +18 -11
  207. package/dist/esm/schema/schema.js +18 -11
  208. package/dist/esm/util/dynamic-import.js +1 -1
  209. package/dist/esm/util/log.d.ts +11 -8
  210. package/dist/esm/util/log.js +25 -12
  211. package/dist/esm/util/type-utils.d.ts +7 -7
  212. package/package.json +3 -3
  213. package/dist/cjs/query-builder/query-builder.d.ts +0 -1707
  214. package/dist/cjs/query-builder/query-builder.js +0 -1067
  215. package/dist/esm/query-builder/query-builder.d.ts +0 -1707
  216. package/dist/esm/query-builder/query-builder.js +0 -1061
@@ -0,0 +1,439 @@
1
+ import { OperationNodeSource } from '../operation-node/operation-node-source.js';
2
+ import { CompiledQuery } from '../query-compiler/compiled-query.js';
3
+ import { SelectExpression } from '../parser/select-parser.js';
4
+ import { InsertObject } from '../parser/insert-values-parser.js';
5
+ import { InsertQueryNode } from '../operation-node/insert-query-node.js';
6
+ import { AnyColumn, SingleResultType } from '../util/type-utils.js';
7
+ import { MutationObject } from '../parser/update-set-parser.js';
8
+ import { Compilable } from '../util/compilable.js';
9
+ import { QueryExecutor } from '../query-executor/query-executor.js';
10
+ import { QueryId } from '../util/query-id.js';
11
+ import { OnConflictConstraintTarget } from '../parser/on-conflict-parser.js';
12
+ import { ParseContext } from '../parser/parse-context.js';
13
+ import { KyselyPlugin } from '../plugin/kysely-plugin.js';
14
+ import { ReturningRow } from '../parser/returning-parser.js';
15
+ import { NoResultErrorConstructor } from './no-result-error.js';
16
+ import { ComplexExpression } from '../parser/complex-expression-parser.js';
17
+ import { ReturningInterface } from './returning-interface.js';
18
+ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements ReturningInterface<DB, TB, O>, OperationNodeSource, Compilable {
19
+ #private;
20
+ constructor(props: InsertQueryBuilderProps);
21
+ /**
22
+ * Sets the values to insert for an {@link Kysely.insertInto | insert} query.
23
+ *
24
+ * This method takes an object whose keys are column names and values are
25
+ * values to insert. In addition to the column's type, the values can be
26
+ * {@link Kysely.raw | raw} instances, select queries or the
27
+ * {@link Kysely.generated | generated} placeholder.
28
+ *
29
+ * You must provide all values defined by the interface of the table you
30
+ * are inserting into. Values that are generated by the database like auto incrementing
31
+ * identifiers can be marked with the {@link Kysely.generated} placeholder unless you
32
+ * want to insert a specific value instead of the generated default.
33
+ *
34
+ * The return value of an `insert` query is an instance of {@link InsertResult}. The
35
+ * {@link InsertResult.insertId | insertId} field holds the auto incremented primary
36
+ * key if the database returned one.
37
+ *
38
+ * On PostgreSQL and some other dialects, you need to call `returning` to get
39
+ * something out of the query.
40
+ *
41
+ * Also see the {@link expression} method for inserting the result of a select
42
+ * query or any other expression.
43
+ *
44
+ * ### Examples
45
+ *
46
+ * Insert a row into `person`:
47
+ * ```ts
48
+ * const id = await db
49
+ * .insertInto('person')
50
+ * .values({
51
+ * id: db.generated,
52
+ * first_name: 'Jennifer',
53
+ * last_name: 'Aniston'
54
+ * })
55
+ * .executeTakeFirstOrThrow()
56
+ * ```
57
+ *
58
+ * The generated SQL (PostgreSQL):
59
+ *
60
+ * ```sql
61
+ * insert into "person" ("first_name", "last_name") values ($1, $2)
62
+ * ```
63
+ *
64
+ * On dialects that support it (for example PostgreSQL) you can insert multiple
65
+ * rows by providing an array. Note that the return value is once again very
66
+ * dialect-specific. Some databases may only return the id of the *last* inserted
67
+ * row and some return nothing at all unless you call `returning`.
68
+ *
69
+ * ```ts
70
+ * await db
71
+ * .insertInto('person')
72
+ * .values([{
73
+ * id: db.generated,
74
+ * first_name: 'Jennifer',
75
+ * last_name: 'Aniston'
76
+ * }, {
77
+ * id: db.generated,
78
+ * first_name: 'Arnold',
79
+ * last_name: 'Schwarzenegger',
80
+ * }])
81
+ * .execute()
82
+ * ```
83
+ *
84
+ * The generated SQL (PostgreSQL):
85
+ *
86
+ * ```sql
87
+ * insert into "person" ("first_name", "last_name") values (($1, $2), ($3, $4))
88
+ * ```
89
+ *
90
+ * On PostgreSQL you need to chain `returning` to the query to get
91
+ * the inserted row's columns (or any other expression) as the
92
+ * return value:
93
+ *
94
+ * ```ts
95
+ * const row = await db
96
+ * .insertInto('person')
97
+ * .values({
98
+ * id: db.generated,
99
+ * first_name: 'Jennifer',
100
+ * last_name: 'Aniston'
101
+ * })
102
+ * .returning('id')
103
+ * .executeTakeFirstOrThrow()
104
+ *
105
+ * row.id
106
+ * ```
107
+ *
108
+ * The generated SQL (PostgreSQL):
109
+ *
110
+ * ```sql
111
+ * insert into "person" ("first_name", "last_name") values ($1, $2) returning "id"
112
+ * ```
113
+ *
114
+ * In addition to primitives, the values can also be `raw` expressions or
115
+ * select queries:
116
+ *
117
+ * ```ts
118
+ * const result = await db
119
+ * .insertInto('person')
120
+ * .values({
121
+ * id: db.generated,
122
+ * first_name: 'Jennifer',
123
+ * last_name: db.raw('? || ?', ['Ani', 'ston']),
124
+ * age: db.selectFrom('person').select(raw('avg(age)')),
125
+ * })
126
+ * .executeTakeFirst()
127
+ *
128
+ * console.log(result.insertId)
129
+ * ```
130
+ *
131
+ * The generated SQL (PostgreSQL):
132
+ *
133
+ * ```sql
134
+ * insert into "person" ("first_name", "last_name", "age")
135
+ * values ($1, $2 || $3, (select avg(age) from "person"))
136
+ * ```
137
+ *
138
+ * You can also use the callback version of subqueries or raw expressions:
139
+ *
140
+ * ```ts
141
+ * db.with('jennifer', (db) => db
142
+ * .selectFrom('person')
143
+ * .where('first_name', '=', 'Jennifer')
144
+ * .select(['id', 'first_name', 'gender'])
145
+ * .limit(1)
146
+ * ).insertInto('pet').values({
147
+ * id: db.generated,
148
+ * owner_id: (eb) => eb.selectFrom('jennifer').select('id'),
149
+ * name: (eb) => eb.selectFrom('jennifer').select('first_name'),
150
+ * species: 'cat',
151
+ * })
152
+ * ```
153
+ */
154
+ values(row: InsertObject<DB, TB>): InsertQueryBuilder<DB, TB, O>;
155
+ values(row: ReadonlyArray<InsertObject<DB, TB>>): InsertQueryBuilder<DB, TB, O>;
156
+ /**
157
+ * Sets the columns to insert.
158
+ *
159
+ * The {@link values} method sets both the columns and the values and this method
160
+ * is not needed. But if you are using the {@link expression} method, you can use
161
+ * this method to set the columns to insert.
162
+ *
163
+ * ### Examples
164
+ *
165
+ * ```ts
166
+ * db.insertInto('person')
167
+ * .columns(['first_name'])
168
+ * .expression((eb) => eb.selectFrom('pet').select('pet.name'))
169
+ * ```
170
+ *
171
+ * The generated SQL (PostgreSQL):
172
+ *
173
+ * ```sql
174
+ * insert into "person" ("first_name")
175
+ * select "pet"."name" from "pet"
176
+ * ```
177
+ */
178
+ columns(columns: ReadonlyArray<keyof DB[TB] & string>): InsertQueryBuilder<DB, TB, O>;
179
+ /**
180
+ * Insert an arbitrary expression. For example the result of a select query.
181
+ *
182
+ * ### Examples
183
+ *
184
+ * ```ts
185
+ * db.insertInto('person')
186
+ * .columns(['first_name'])
187
+ * .expression((eb) => eb.selectFrom('pet').select('pet.name'))
188
+ * ```
189
+ *
190
+ * The generated SQL (PostgreSQL):
191
+ *
192
+ * ```sql
193
+ * insert into "person" ("first_name")
194
+ * select "pet"."name" from "pet"
195
+ * ```
196
+ */
197
+ expression(expression: ComplexExpression<DB, TB>): InsertQueryBuilder<DB, TB, O>;
198
+ /**
199
+ * Ignores the insert if the column or constraint given as the first
200
+ * argument conflicts with the current rows in the database. The
201
+ * default behavior without this method call is to throw an error.
202
+ *
203
+ * For example if a table has a field `name` that has a unique constraint
204
+ * and you try to insert a row with a `name` that already exists in the
205
+ * database, calling `onConflictDoNothing('name')` will ignore the conflict
206
+ * and do nothing. By default the query would throw.
207
+ *
208
+ * Only some dialects like PostgreSQL and SQLite implement the `on conflict`
209
+ * statement. On MySQL you should use the {@link ignore} method to achieve
210
+ * similar results.
211
+ *
212
+ * Also see the {@link InsertQueryBuilder.onConflictUpdate | onConflictUpdate}
213
+ * method if you want to perform an update in case of a conflict (upsert).
214
+ *
215
+ * ### Examples
216
+ *
217
+ * ```ts
218
+ * await db
219
+ * .insertInto('pet')
220
+ * .values({
221
+ * id: db.generated,
222
+ * name: 'Catto',
223
+ * species: 'cat',
224
+ * })
225
+ * .onConflictDoNothing('name')
226
+ * .execute()
227
+ * ```
228
+ *
229
+ * The generated SQL (PostgreSQL):
230
+ *
231
+ * ```sql
232
+ * insert into "pet" ("name", "species")
233
+ * values ($1, $2)
234
+ * on conflict ("name") do nothing
235
+ * ```
236
+ *
237
+ * You can provide the name of the constraint instead of a column name
238
+ *
239
+ * ```ts
240
+ * await db
241
+ * .insertInto('pet')
242
+ * .values({
243
+ * id: db.generated,
244
+ * name: 'Catto',
245
+ * species: 'cat',
246
+ * })
247
+ * .onConflictDoNothing({
248
+ * constraint: 'pet_name_key'
249
+ * })
250
+ * .execute()
251
+ * ```
252
+ *
253
+ * The generated SQL (PostgreSQL):
254
+ *
255
+ * ```sql
256
+ * insert into "pet" ("name", "species")
257
+ * values ($1, $2)
258
+ * on conflict on constraint "pet_name_key"
259
+ * do nothing
260
+ * ```
261
+ */
262
+ onConflictDoNothing(column: AnyColumn<DB, TB>): InsertQueryBuilder<DB, TB, O>;
263
+ onConflictDoNothing(columns: ReadonlyArray<AnyColumn<DB, TB>>): InsertQueryBuilder<DB, TB, O>;
264
+ onConflictDoNothing(constraint: OnConflictConstraintTarget): InsertQueryBuilder<DB, TB, O>;
265
+ /**
266
+ * Changes an `insert into` query to an `insert ignore into` query.
267
+ *
268
+ * If you use the ignore modifier, ignorable errors that occur while executing the
269
+ * insert statement are ignored. For example, without ignore, a row that duplicates
270
+ * an existing unique index or primary key value in the table causes a duplicate-key
271
+ * error and the statement is aborted. With ignore, the row is discarded and no error
272
+ * occurs.
273
+ *
274
+ * This is only supported on some dialects like MySQL. On most dialects you should
275
+ * use the {@link onConflictDoNothing} method.
276
+ *
277
+ * ### Examples
278
+ *
279
+ * ```ts
280
+ * await db.insertInto('person')
281
+ * .ignore()
282
+ * .values(values)
283
+ * .execute()
284
+ * ```
285
+ */
286
+ ignore(): InsertQueryBuilder<DB, TB, O>;
287
+ /**
288
+ * Ignores an insert if the column or constraint given as the first
289
+ * argument conflicts with the current rows in the database and
290
+ * performs an update on the conflicting row instead. This method
291
+ * can be used to implement an upsert operation.
292
+ *
293
+ * For example if a table has a field `name` that has a unique constraint
294
+ * and you try to insert a row with a `name` that already exists in the
295
+ * database, calling `onConfictUpdate('name', { species: 'hamster' })`
296
+ * will set the conflicting row's `species` field to value `'hamster'`.
297
+ * By default the query would throw.
298
+ *
299
+ * The second argument (updates) can be anything the {@link UpdateQueryBuilder.set | set}
300
+ * method accepts.
301
+ *
302
+ * The `on conflict do update` statement is only implemented by some dialects
303
+ * like PostgreSQL and SQLite. On MySQL you should use the {@link onDuplicateKeyUpdate}
304
+ * method instead.
305
+ *
306
+ * Also see the {@link InsertQueryBuilder.onConflictDoNothing | onConflictDoNothing}
307
+ * method.
308
+ *
309
+ * ### Examples
310
+ *
311
+ * ```ts
312
+ * await db
313
+ * .insertInto('pet')
314
+ * .values({
315
+ * id: db.generated,
316
+ * name: 'Catto',
317
+ * species: 'cat',
318
+ * })
319
+ * .onConflictUpdate('name', { species: 'hamster' })
320
+ * .execute()
321
+ * ```
322
+ *
323
+ * The generated SQL (PostgreSQL):
324
+ *
325
+ * ```sql
326
+ * insert into "pet" ("name", "species")
327
+ * values ($1, $2)
328
+ * on conflict ("name") do update set "species" = $3
329
+ * ```
330
+ *
331
+ * You can provied the name of the constraint instead of a column name
332
+ *
333
+ * ```ts
334
+ * await db
335
+ * .insertInto('pet')
336
+ * .values({
337
+ * id: db.generated,
338
+ * name: 'Catto',
339
+ * species: 'cat',
340
+ * })
341
+ * .onConflictUpdate(
342
+ * { constraint: 'pet_name_key' },
343
+ * { species: 'hamster' }
344
+ * )
345
+ * .execute()
346
+ * ```
347
+ *
348
+ * The generated SQL (PostgreSQL):
349
+ *
350
+ * ```sql
351
+ * insert into "pet" ("name", "species")
352
+ * values ($1, $2)
353
+ * on conflict on constraint "pet_name_key"
354
+ * do update set "species" = $3
355
+ * ```
356
+ */
357
+ onConflictUpdate(column: AnyColumn<DB, TB>, updates: MutationObject<DB, TB>): InsertQueryBuilder<DB, TB, O>;
358
+ onConflictUpdate(columns: ReadonlyArray<AnyColumn<DB, TB>>, updates: MutationObject<DB, TB>): InsertQueryBuilder<DB, TB, O>;
359
+ onConflictUpdate(constraint: OnConflictConstraintTarget, updates: MutationObject<DB, TB>): InsertQueryBuilder<DB, TB, O>;
360
+ /**
361
+ * Adds `on duplicate key update` to the query.
362
+ *
363
+ * If you specify `on duplicate key update`, and a row is inserted that would cause
364
+ * a duplicate value in a unique index or primary key, an update of the old row occurs.
365
+ *
366
+ * This is only implemented by some dialects like MySQL. On most dialects you should
367
+ * use {@link onConflictUpdate} instead.
368
+ *
369
+ * ### Examples
370
+ *
371
+ * ```ts
372
+ * await db
373
+ * .insertInto('person')
374
+ * .values(values)
375
+ * .onDuplicateKeyUpdate({ species: 'hamster' })
376
+ * ```
377
+ */
378
+ onDuplicateKeyUpdate(updates: MutationObject<DB, TB>): InsertQueryBuilder<DB, TB, O>;
379
+ returning<SE extends SelectExpression<DB, TB>>(selections: ReadonlyArray<SE>): InsertQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SE>>;
380
+ returning<SE extends SelectExpression<DB, TB>>(selection: SE): InsertQueryBuilder<DB, TB, ReturningRow<DB, TB, O, SE>>;
381
+ returningAll(): InsertQueryBuilder<DB, TB, DB[TB]>;
382
+ /**
383
+ * Simply calls the given function passing `this` as the only argument.
384
+ *
385
+ * This method can be useful when adding optional method calls:
386
+ *
387
+ * ### Examples
388
+ *
389
+ * ```ts
390
+ * db.insertInto('person')
391
+ * .selectAll()
392
+ * .call((qb) => {
393
+ * if (something) {
394
+ * return qb.onConflictDoNothing('something')
395
+ * } else {
396
+ * return qb.onConflictDoNothing('something_else')
397
+ * }
398
+ * })
399
+ * .execute()
400
+ * ```
401
+ */
402
+ call<T>(func: (qb: this) => T): T;
403
+ /**
404
+ * Change the output type of the query.
405
+ *
406
+ * You should only use this method as the last resort if the types
407
+ * don't support your use case.
408
+ */
409
+ castTo<T>(): InsertQueryBuilder<DB, TB, T>;
410
+ withPlugin(plugin: KyselyPlugin): InsertQueryBuilder<DB, TB, O>;
411
+ toOperationNode(): InsertQueryNode;
412
+ compile(): CompiledQuery;
413
+ /**
414
+ * Executes the query and returns an array of rows.
415
+ *
416
+ * Also see the {@link executeTakeFirst} and {@link executeTakeFirstOrThrow} methods.
417
+ */
418
+ execute(): Promise<O[]>;
419
+ /**
420
+ * Executes the query and returns the first result or undefined if
421
+ * the query returned no result.
422
+ */
423
+ executeTakeFirst(): Promise<SingleResultType<O>>;
424
+ /**
425
+ * Executes the query and returns the first result or throws if
426
+ * the query returned no result.
427
+ *
428
+ * By default an instance of {@link NoResultError} is thrown, but you can
429
+ * provide a custom error class as the only argument to throw a different
430
+ * error.
431
+ */
432
+ executeTakeFirstOrThrow(errorConstructor?: NoResultErrorConstructor): Promise<O>;
433
+ }
434
+ export interface InsertQueryBuilderProps {
435
+ readonly queryId: QueryId;
436
+ readonly queryNode: InsertQueryNode;
437
+ readonly executor: QueryExecutor;
438
+ readonly parseContext: ParseContext;
439
+ }
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InsertQueryBuilder = void 0;
4
+ const select_parser_js_1 = require("../parser/select-parser.js");
5
+ const insert_values_parser_js_1 = require("../parser/insert-values-parser.js");
6
+ const insert_query_node_js_1 = require("../operation-node/insert-query-node.js");
7
+ const query_node_js_1 = require("../operation-node/query-node.js");
8
+ const update_set_parser_js_1 = require("../parser/update-set-parser.js");
9
+ const prevent_await_js_1 = require("../util/prevent-await.js");
10
+ const on_conflict_parser_js_1 = require("../parser/on-conflict-parser.js");
11
+ const object_utils_js_1 = require("../util/object-utils.js");
12
+ const on_duplicate_key_node_js_1 = require("../operation-node/on-duplicate-key-node.js");
13
+ const insert_result_js_1 = require("./insert-result.js");
14
+ const no_result_error_js_1 = require("./no-result-error.js");
15
+ const complex_expression_parser_js_1 = require("../parser/complex-expression-parser.js");
16
+ const column_node_js_1 = require("../operation-node/column-node.js");
17
+ class InsertQueryBuilder {
18
+ #props;
19
+ constructor(props) {
20
+ this.#props = (0, object_utils_js_1.freeze)(props);
21
+ }
22
+ values(args) {
23
+ const [columns, values] = (0, insert_values_parser_js_1.parseInsertObjectOrList)(this.#props.parseContext, args);
24
+ return new InsertQueryBuilder({
25
+ ...this.#props,
26
+ queryNode: insert_query_node_js_1.InsertQueryNode.cloneWith(this.#props.queryNode, {
27
+ columns,
28
+ values,
29
+ }),
30
+ });
31
+ }
32
+ /**
33
+ * Sets the columns to insert.
34
+ *
35
+ * The {@link values} method sets both the columns and the values and this method
36
+ * is not needed. But if you are using the {@link expression} method, you can use
37
+ * this method to set the columns to insert.
38
+ *
39
+ * ### Examples
40
+ *
41
+ * ```ts
42
+ * db.insertInto('person')
43
+ * .columns(['first_name'])
44
+ * .expression((eb) => eb.selectFrom('pet').select('pet.name'))
45
+ * ```
46
+ *
47
+ * The generated SQL (PostgreSQL):
48
+ *
49
+ * ```sql
50
+ * insert into "person" ("first_name")
51
+ * select "pet"."name" from "pet"
52
+ * ```
53
+ */
54
+ columns(columns) {
55
+ return new InsertQueryBuilder({
56
+ ...this.#props,
57
+ queryNode: insert_query_node_js_1.InsertQueryNode.cloneWith(this.#props.queryNode, {
58
+ columns: (0, object_utils_js_1.freeze)(columns.map(column_node_js_1.ColumnNode.create)),
59
+ }),
60
+ });
61
+ }
62
+ /**
63
+ * Insert an arbitrary expression. For example the result of a select query.
64
+ *
65
+ * ### Examples
66
+ *
67
+ * ```ts
68
+ * db.insertInto('person')
69
+ * .columns(['first_name'])
70
+ * .expression((eb) => eb.selectFrom('pet').select('pet.name'))
71
+ * ```
72
+ *
73
+ * The generated SQL (PostgreSQL):
74
+ *
75
+ * ```sql
76
+ * insert into "person" ("first_name")
77
+ * select "pet"."name" from "pet"
78
+ * ```
79
+ */
80
+ expression(expression) {
81
+ return new InsertQueryBuilder({
82
+ ...this.#props,
83
+ queryNode: insert_query_node_js_1.InsertQueryNode.cloneWith(this.#props.queryNode, {
84
+ values: (0, complex_expression_parser_js_1.parseComplexExpression)(this.#props.parseContext, expression),
85
+ }),
86
+ });
87
+ }
88
+ onConflictDoNothing(target) {
89
+ return new InsertQueryBuilder({
90
+ ...this.#props,
91
+ queryNode: insert_query_node_js_1.InsertQueryNode.cloneWith(this.#props.queryNode, {
92
+ onConflict: (0, on_conflict_parser_js_1.parseOnConflictDoNothing)(target),
93
+ }),
94
+ });
95
+ }
96
+ /**
97
+ * Changes an `insert into` query to an `insert ignore into` query.
98
+ *
99
+ * If you use the ignore modifier, ignorable errors that occur while executing the
100
+ * insert statement are ignored. For example, without ignore, a row that duplicates
101
+ * an existing unique index or primary key value in the table causes a duplicate-key
102
+ * error and the statement is aborted. With ignore, the row is discarded and no error
103
+ * occurs.
104
+ *
105
+ * This is only supported on some dialects like MySQL. On most dialects you should
106
+ * use the {@link onConflictDoNothing} method.
107
+ *
108
+ * ### Examples
109
+ *
110
+ * ```ts
111
+ * await db.insertInto('person')
112
+ * .ignore()
113
+ * .values(values)
114
+ * .execute()
115
+ * ```
116
+ */
117
+ ignore() {
118
+ return new InsertQueryBuilder({
119
+ ...this.#props,
120
+ queryNode: insert_query_node_js_1.InsertQueryNode.cloneWith(this.#props.queryNode, {
121
+ ignore: true,
122
+ }),
123
+ });
124
+ }
125
+ onConflictUpdate(target, updates) {
126
+ return new InsertQueryBuilder({
127
+ ...this.#props,
128
+ queryNode: insert_query_node_js_1.InsertQueryNode.cloneWith(this.#props.queryNode, {
129
+ onConflict: (0, on_conflict_parser_js_1.parseOnConflictUpdate)(this.#props.parseContext, target, updates),
130
+ }),
131
+ });
132
+ }
133
+ /**
134
+ * Adds `on duplicate key update` to the query.
135
+ *
136
+ * If you specify `on duplicate key update`, and a row is inserted that would cause
137
+ * a duplicate value in a unique index or primary key, an update of the old row occurs.
138
+ *
139
+ * This is only implemented by some dialects like MySQL. On most dialects you should
140
+ * use {@link onConflictUpdate} instead.
141
+ *
142
+ * ### Examples
143
+ *
144
+ * ```ts
145
+ * await db
146
+ * .insertInto('person')
147
+ * .values(values)
148
+ * .onDuplicateKeyUpdate({ species: 'hamster' })
149
+ * ```
150
+ */
151
+ onDuplicateKeyUpdate(updates) {
152
+ return new InsertQueryBuilder({
153
+ ...this.#props,
154
+ queryNode: insert_query_node_js_1.InsertQueryNode.cloneWith(this.#props.queryNode, {
155
+ onDuplicateKey: on_duplicate_key_node_js_1.OnDuplicateKeyNode.create((0, update_set_parser_js_1.parseUpdateObject)(this.#props.parseContext, updates)),
156
+ }),
157
+ });
158
+ }
159
+ returning(selection) {
160
+ return new InsertQueryBuilder({
161
+ ...this.#props,
162
+ queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectExpressionOrList)(this.#props.parseContext, selection)),
163
+ });
164
+ }
165
+ returningAll() {
166
+ return new InsertQueryBuilder({
167
+ ...this.#props,
168
+ queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectAll)()),
169
+ });
170
+ }
171
+ /**
172
+ * Simply calls the given function passing `this` as the only argument.
173
+ *
174
+ * This method can be useful when adding optional method calls:
175
+ *
176
+ * ### Examples
177
+ *
178
+ * ```ts
179
+ * db.insertInto('person')
180
+ * .selectAll()
181
+ * .call((qb) => {
182
+ * if (something) {
183
+ * return qb.onConflictDoNothing('something')
184
+ * } else {
185
+ * return qb.onConflictDoNothing('something_else')
186
+ * }
187
+ * })
188
+ * .execute()
189
+ * ```
190
+ */
191
+ call(func) {
192
+ return func(this);
193
+ }
194
+ /**
195
+ * Change the output type of the query.
196
+ *
197
+ * You should only use this method as the last resort if the types
198
+ * don't support your use case.
199
+ */
200
+ castTo() {
201
+ return new InsertQueryBuilder(this.#props);
202
+ }
203
+ withPlugin(plugin) {
204
+ return new InsertQueryBuilder({
205
+ ...this.#props,
206
+ executor: this.#props.executor.withPlugin(plugin),
207
+ });
208
+ }
209
+ toOperationNode() {
210
+ return this.#props.executor.transformQuery(this.#props.queryNode, this.#props.queryId);
211
+ }
212
+ compile() {
213
+ return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
214
+ }
215
+ /**
216
+ * Executes the query and returns an array of rows.
217
+ *
218
+ * Also see the {@link executeTakeFirst} and {@link executeTakeFirstOrThrow} methods.
219
+ */
220
+ async execute() {
221
+ const compildQuery = this.compile();
222
+ const query = compildQuery.query;
223
+ const result = await this.#props.executor.executeQuery(compildQuery, this.#props.queryId);
224
+ if (this.#props.parseContext.adapter.supportsReturning && query.returning) {
225
+ return result.rows;
226
+ }
227
+ else {
228
+ return [new insert_result_js_1.InsertResult(result.insertId)];
229
+ }
230
+ }
231
+ /**
232
+ * Executes the query and returns the first result or undefined if
233
+ * the query returned no result.
234
+ */
235
+ async executeTakeFirst() {
236
+ const [result] = await this.execute();
237
+ return result;
238
+ }
239
+ /**
240
+ * Executes the query and returns the first result or throws if
241
+ * the query returned no result.
242
+ *
243
+ * By default an instance of {@link NoResultError} is thrown, but you can
244
+ * provide a custom error class as the only argument to throw a different
245
+ * error.
246
+ */
247
+ async executeTakeFirstOrThrow(errorConstructor = no_result_error_js_1.NoResultError) {
248
+ const result = await this.executeTakeFirst();
249
+ if (result === undefined) {
250
+ throw new errorConstructor(this.toOperationNode());
251
+ }
252
+ return result;
253
+ }
254
+ }
255
+ exports.InsertQueryBuilder = InsertQueryBuilder;
256
+ (0, prevent_await_js_1.preventAwait)(InsertQueryBuilder, "don't await InsertQueryBuilder instances directly. To execute the query you need to call `execute` or `executeTakeFirst`.");