kysely 0.27.4 → 0.27.5
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.
- package/.renovaterc.json +3 -0
- package/CONTRIBUTING.md +1 -1
- package/deno.check.d.ts +86 -0
- package/deno.check.json +21 -0
- package/dist/cjs/dialect/dialect-adapter-base.d.ts +11 -2
- package/dist/cjs/dialect/dialect-adapter.d.ts +11 -2
- package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +11 -2
- package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +37 -29
- package/dist/cjs/dialect/mssql/mssql-driver.js +20 -13
- package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +11 -2
- package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +4 -0
- package/dist/cjs/dialect/mysql/mysql-driver.js +3 -0
- package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +11 -2
- package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +10 -3
- package/dist/cjs/dialect/postgres/postgres-driver.js +3 -0
- package/dist/cjs/dialect/postgres/postgres-introspector.js +5 -1
- package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +11 -2
- package/dist/cjs/driver/dummy-driver.d.ts +13 -12
- package/dist/cjs/driver/dummy-driver.js +13 -12
- package/dist/cjs/dynamic/dynamic.d.ts +6 -6
- package/dist/cjs/dynamic/dynamic.js +6 -6
- package/dist/cjs/expression/expression-builder.d.ts +152 -61
- package/dist/cjs/expression/expression-wrapper.d.ts +92 -23
- package/dist/cjs/expression/expression.d.ts +40 -5
- package/dist/cjs/helpers/mssql.d.ts +74 -14
- package/dist/cjs/helpers/mssql.js +74 -14
- package/dist/cjs/helpers/mysql.d.ts +14 -10
- package/dist/cjs/helpers/mysql.js +14 -10
- package/dist/cjs/helpers/postgres.d.ts +7 -4
- package/dist/cjs/helpers/postgres.js +7 -4
- package/dist/cjs/helpers/sqlite.d.ts +41 -16
- package/dist/cjs/helpers/sqlite.js +41 -16
- package/dist/cjs/kysely.d.ts +99 -41
- package/dist/cjs/kysely.js +60 -36
- package/dist/cjs/migration/file-migration-provider.d.ts +2 -2
- package/dist/cjs/migration/file-migration-provider.js +2 -2
- package/dist/cjs/migration/migrator.d.ts +82 -14
- package/dist/cjs/migration/migrator.js +82 -14
- package/dist/cjs/operation-node/aggregate-function-node.d.ts +4 -0
- package/dist/cjs/operation-node/aggregate-function-node.js +9 -0
- package/dist/cjs/operation-node/data-type-node.d.ts +1 -1
- package/dist/cjs/operation-node/data-type-node.js +12 -0
- package/dist/cjs/operation-node/delete-query-node.d.ts +1 -0
- package/dist/cjs/operation-node/insert-query-node.d.ts +1 -0
- package/dist/cjs/operation-node/merge-query-node.d.ts +1 -0
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +9 -3
- package/dist/cjs/operation-node/operation-node-transformer.js +14 -3
- package/dist/cjs/operation-node/query-node.d.ts +4 -0
- package/dist/cjs/operation-node/query-node.js +8 -0
- package/dist/cjs/operation-node/select-query-node.d.ts +0 -1
- package/dist/cjs/operation-node/select-query-node.js +0 -8
- package/dist/cjs/operation-node/update-query-node.d.ts +1 -0
- package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +52 -25
- package/dist/cjs/plugin/camel-case/camel-case-plugin.js +24 -19
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +29 -7
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.js +2 -2
- package/dist/cjs/plugin/immediate-value/immediate-value-plugin.d.ts +28 -6
- package/dist/cjs/plugin/kysely-plugin.d.ts +28 -6
- package/dist/cjs/plugin/noop-plugin.d.ts +28 -6
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +62 -9
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +34 -3
- package/dist/cjs/plugin/with-schema/with-schema-plugin.d.ts +28 -6
- package/dist/cjs/query-builder/aggregate-function-builder.d.ts +43 -1
- package/dist/cjs/query-builder/aggregate-function-builder.js +30 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +137 -45
- package/dist/cjs/query-builder/delete-query-builder.js +76 -26
- package/dist/cjs/query-builder/function-module.d.ts +35 -88
- package/dist/cjs/query-builder/insert-query-builder.d.ts +239 -65
- package/dist/cjs/query-builder/insert-query-builder.js +188 -52
- package/dist/cjs/query-builder/insert-result.d.ts +10 -5
- package/dist/cjs/query-builder/insert-result.js +10 -5
- package/dist/cjs/query-builder/json-path-builder.d.ts +33 -9
- package/dist/cjs/query-builder/json-path-builder.js +8 -5
- package/dist/cjs/query-builder/merge-query-builder.d.ts +159 -21
- package/dist/cjs/query-builder/merge-query-builder.js +68 -6
- package/dist/cjs/query-builder/on-conflict-builder.d.ts +51 -18
- package/dist/cjs/query-builder/on-conflict-builder.js +41 -16
- package/dist/cjs/query-builder/output-interface.d.ts +50 -7
- package/dist/cjs/query-builder/returning-interface.d.ts +5 -5
- package/dist/cjs/query-builder/select-query-builder-expression.d.ts +8 -0
- package/dist/cjs/query-builder/select-query-builder.d.ts +295 -63
- package/dist/cjs/query-builder/select-query-builder.js +7 -7
- package/dist/cjs/query-builder/update-query-builder.d.ts +138 -29
- package/dist/cjs/query-builder/update-query-builder.js +75 -10
- package/dist/cjs/query-builder/update-result.d.ts +2 -2
- package/dist/cjs/query-builder/update-result.js +2 -2
- package/dist/cjs/query-builder/where-interface.d.ts +5 -1
- package/dist/cjs/query-compiler/default-query-compiler.js +20 -0
- package/dist/cjs/query-creator.d.ts +66 -18
- package/dist/cjs/query-creator.js +2 -2
- package/dist/cjs/raw-builder/raw-builder.d.ts +29 -7
- package/dist/cjs/raw-builder/sql.d.ts +26 -7
- package/dist/cjs/schema/alter-column-builder.d.ts +17 -3
- package/dist/cjs/schema/alter-column-builder.js +17 -3
- package/dist/cjs/schema/alter-table-add-index-builder.d.ts +43 -9
- package/dist/cjs/schema/alter-table-add-index-builder.js +26 -9
- package/dist/cjs/schema/column-definition-builder.d.ts +283 -26
- package/dist/cjs/schema/column-definition-builder.js +283 -26
- package/dist/cjs/schema/create-table-builder.d.ts +86 -33
- package/dist/cjs/schema/create-table-builder.js +86 -33
- package/dist/cjs/util/column-type.d.ts +5 -9
- package/dist/cjs/util/require-all-props.d.ts +4 -2
- package/dist/cjs/util/require-all-props.js +4 -2
- package/dist/cjs/util/streamable.d.ts +1 -1
- package/dist/cjs/util/type-utils.d.ts +4 -2
- package/dist/esm/dialect/dialect-adapter-base.d.ts +11 -2
- package/dist/esm/dialect/dialect-adapter.d.ts +11 -2
- package/dist/esm/dialect/mssql/mssql-adapter.d.ts +11 -2
- package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +37 -29
- package/dist/esm/dialect/mssql/mssql-driver.js +20 -13
- package/dist/esm/dialect/mysql/mysql-adapter.d.ts +11 -2
- package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +4 -0
- package/dist/esm/dialect/mysql/mysql-driver.js +3 -0
- package/dist/esm/dialect/postgres/postgres-adapter.d.ts +11 -2
- package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +10 -3
- package/dist/esm/dialect/postgres/postgres-driver.js +3 -0
- package/dist/esm/dialect/postgres/postgres-introspector.js +5 -1
- package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +11 -2
- package/dist/esm/driver/dummy-driver.d.ts +13 -12
- package/dist/esm/driver/dummy-driver.js +13 -12
- package/dist/esm/dynamic/dynamic.d.ts +6 -6
- package/dist/esm/dynamic/dynamic.js +6 -6
- package/dist/esm/expression/expression-builder.d.ts +152 -61
- package/dist/esm/expression/expression-wrapper.d.ts +92 -23
- package/dist/esm/expression/expression.d.ts +40 -5
- package/dist/esm/helpers/mssql.d.ts +74 -14
- package/dist/esm/helpers/mssql.js +74 -14
- package/dist/esm/helpers/mysql.d.ts +14 -10
- package/dist/esm/helpers/mysql.js +14 -10
- package/dist/esm/helpers/postgres.d.ts +7 -4
- package/dist/esm/helpers/postgres.js +7 -4
- package/dist/esm/helpers/sqlite.d.ts +41 -16
- package/dist/esm/helpers/sqlite.js +41 -16
- package/dist/esm/kysely.d.ts +99 -41
- package/dist/esm/kysely.js +60 -36
- package/dist/esm/migration/file-migration-provider.d.ts +2 -2
- package/dist/esm/migration/file-migration-provider.js +2 -2
- package/dist/esm/migration/migrator.d.ts +82 -14
- package/dist/esm/migration/migrator.js +82 -14
- package/dist/esm/operation-node/aggregate-function-node.d.ts +4 -0
- package/dist/esm/operation-node/aggregate-function-node.js +9 -0
- package/dist/esm/operation-node/data-type-node.d.ts +1 -1
- package/dist/esm/operation-node/data-type-node.js +12 -0
- package/dist/esm/operation-node/delete-query-node.d.ts +1 -0
- package/dist/esm/operation-node/insert-query-node.d.ts +1 -0
- package/dist/esm/operation-node/merge-query-node.d.ts +1 -0
- package/dist/esm/operation-node/operation-node-transformer.d.ts +9 -3
- package/dist/esm/operation-node/operation-node-transformer.js +14 -3
- package/dist/esm/operation-node/query-node.d.ts +4 -0
- package/dist/esm/operation-node/query-node.js +8 -0
- package/dist/esm/operation-node/select-query-node.d.ts +0 -1
- package/dist/esm/operation-node/select-query-node.js +0 -8
- package/dist/esm/operation-node/update-query-node.d.ts +1 -0
- package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +52 -25
- package/dist/esm/plugin/camel-case/camel-case-plugin.js +24 -19
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +29 -7
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.js +2 -2
- package/dist/esm/plugin/immediate-value/immediate-value-plugin.d.ts +28 -6
- package/dist/esm/plugin/kysely-plugin.d.ts +28 -6
- package/dist/esm/plugin/noop-plugin.d.ts +28 -6
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +62 -9
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +34 -3
- package/dist/esm/plugin/with-schema/with-schema-plugin.d.ts +28 -6
- package/dist/esm/query-builder/aggregate-function-builder.d.ts +43 -1
- package/dist/esm/query-builder/aggregate-function-builder.js +30 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +137 -45
- package/dist/esm/query-builder/delete-query-builder.js +76 -26
- package/dist/esm/query-builder/function-module.d.ts +35 -88
- package/dist/esm/query-builder/insert-query-builder.d.ts +239 -65
- package/dist/esm/query-builder/insert-query-builder.js +188 -52
- package/dist/esm/query-builder/insert-result.d.ts +10 -5
- package/dist/esm/query-builder/insert-result.js +10 -5
- package/dist/esm/query-builder/json-path-builder.d.ts +33 -9
- package/dist/esm/query-builder/json-path-builder.js +8 -5
- package/dist/esm/query-builder/merge-query-builder.d.ts +159 -21
- package/dist/esm/query-builder/merge-query-builder.js +68 -6
- package/dist/esm/query-builder/on-conflict-builder.d.ts +51 -18
- package/dist/esm/query-builder/on-conflict-builder.js +41 -16
- package/dist/esm/query-builder/output-interface.d.ts +50 -7
- package/dist/esm/query-builder/returning-interface.d.ts +5 -5
- package/dist/esm/query-builder/select-query-builder-expression.d.ts +8 -0
- package/dist/esm/query-builder/select-query-builder.d.ts +295 -63
- package/dist/esm/query-builder/select-query-builder.js +7 -7
- package/dist/esm/query-builder/update-query-builder.d.ts +138 -29
- package/dist/esm/query-builder/update-query-builder.js +75 -10
- package/dist/esm/query-builder/update-result.d.ts +2 -2
- package/dist/esm/query-builder/update-result.js +2 -2
- package/dist/esm/query-builder/where-interface.d.ts +5 -1
- package/dist/esm/query-compiler/default-query-compiler.js +20 -0
- package/dist/esm/query-creator.d.ts +66 -18
- package/dist/esm/query-creator.js +2 -2
- package/dist/esm/raw-builder/raw-builder.d.ts +29 -7
- package/dist/esm/raw-builder/sql.d.ts +26 -7
- package/dist/esm/schema/alter-column-builder.d.ts +17 -3
- package/dist/esm/schema/alter-column-builder.js +17 -3
- package/dist/esm/schema/alter-table-add-index-builder.d.ts +43 -9
- package/dist/esm/schema/alter-table-add-index-builder.js +26 -9
- package/dist/esm/schema/column-definition-builder.d.ts +283 -26
- package/dist/esm/schema/column-definition-builder.js +283 -26
- package/dist/esm/schema/create-table-builder.d.ts +86 -33
- package/dist/esm/schema/create-table-builder.js +86 -33
- package/dist/esm/util/column-type.d.ts +5 -9
- package/dist/esm/util/require-all-props.d.ts +4 -2
- package/dist/esm/util/require-all-props.js +4 -2
- package/dist/esm/util/streamable.d.ts +1 -1
- package/dist/esm/util/type-utils.d.ts +4 -2
- package/package.json +28 -23
|
@@ -138,7 +138,7 @@ export class InsertQueryBuilder {
|
|
|
138
138
|
* .insertInto('person')
|
|
139
139
|
* .values(({ ref, selectFrom, fn }) => ({
|
|
140
140
|
* first_name: 'Jennifer',
|
|
141
|
-
* last_name: sql<string
|
|
141
|
+
* last_name: sql<string>`concat(${ani}, ${ston})`,
|
|
142
142
|
* middle_name: ref('first_name'),
|
|
143
143
|
* age: selectFrom('person')
|
|
144
144
|
* .select(fn.avg<number>('age').as('avg_age')),
|
|
@@ -166,7 +166,7 @@ export class InsertQueryBuilder {
|
|
|
166
166
|
* You can also use the callback version of subqueries or raw expressions:
|
|
167
167
|
*
|
|
168
168
|
* ```ts
|
|
169
|
-
* db.with('jennifer', (db) => db
|
|
169
|
+
* await db.with('jennifer', (db) => db
|
|
170
170
|
* .selectFrom('person')
|
|
171
171
|
* .where('first_name', '=', 'Jennifer')
|
|
172
172
|
* .select(['id', 'first_name', 'gender'])
|
|
@@ -176,6 +176,24 @@ export class InsertQueryBuilder {
|
|
|
176
176
|
* name: eb.selectFrom('jennifer').select('first_name'),
|
|
177
177
|
* species: 'cat',
|
|
178
178
|
* }))
|
|
179
|
+
* .execute()
|
|
180
|
+
* ```
|
|
181
|
+
*
|
|
182
|
+
* The generated SQL (PostgreSQL):
|
|
183
|
+
*
|
|
184
|
+
* ```sql
|
|
185
|
+
* with "jennifer" as (
|
|
186
|
+
* select "id", "first_name", "gender"
|
|
187
|
+
* from "person"
|
|
188
|
+
* where "first_name" = $1
|
|
189
|
+
* limit $2
|
|
190
|
+
* )
|
|
191
|
+
* insert into "pet" ("owner_id", "name", "species")
|
|
192
|
+
* values (
|
|
193
|
+
* (select "id" from "jennifer"),
|
|
194
|
+
* (select "first_name" from "jennifer"),
|
|
195
|
+
* $3
|
|
196
|
+
* )
|
|
179
197
|
* ```
|
|
180
198
|
*/
|
|
181
199
|
values(insert) {
|
|
@@ -198,9 +216,10 @@ export class InsertQueryBuilder {
|
|
|
198
216
|
* ### Examples
|
|
199
217
|
*
|
|
200
218
|
* ```ts
|
|
201
|
-
* db.insertInto('person')
|
|
219
|
+
* await db.insertInto('person')
|
|
202
220
|
* .columns(['first_name'])
|
|
203
221
|
* .expression((eb) => eb.selectFrom('pet').select('pet.name'))
|
|
222
|
+
* .execute()
|
|
204
223
|
* ```
|
|
205
224
|
*
|
|
206
225
|
* The generated SQL (PostgreSQL):
|
|
@@ -268,6 +287,12 @@ export class InsertQueryBuilder {
|
|
|
268
287
|
* .defaultValues()
|
|
269
288
|
* .execute()
|
|
270
289
|
* ```
|
|
290
|
+
*
|
|
291
|
+
* The generated SQL (PostgreSQL):
|
|
292
|
+
*
|
|
293
|
+
* ```sql
|
|
294
|
+
* insert into "person" default values
|
|
295
|
+
* ```
|
|
271
296
|
*/
|
|
272
297
|
defaultValues() {
|
|
273
298
|
return new InsertQueryBuilder({
|
|
@@ -277,6 +302,37 @@ export class InsertQueryBuilder {
|
|
|
277
302
|
}),
|
|
278
303
|
});
|
|
279
304
|
}
|
|
305
|
+
/**
|
|
306
|
+
* This can be used to add any additional SQL to the end of the query.
|
|
307
|
+
*
|
|
308
|
+
* ### Examples
|
|
309
|
+
*
|
|
310
|
+
* ```ts
|
|
311
|
+
* import { sql } from 'kysely'
|
|
312
|
+
*
|
|
313
|
+
* await db.insertInto('person')
|
|
314
|
+
* .values({
|
|
315
|
+
* first_name: 'John',
|
|
316
|
+
* last_name: 'Doe',
|
|
317
|
+
* gender: 'male',
|
|
318
|
+
* })
|
|
319
|
+
* .modifyEnd(sql`-- This is a comment`)
|
|
320
|
+
* .execute()
|
|
321
|
+
* ```
|
|
322
|
+
*
|
|
323
|
+
* The generated SQL (MySQL):
|
|
324
|
+
*
|
|
325
|
+
* ```sql
|
|
326
|
+
* insert into `person` ("first_name", "last_name", "gender")
|
|
327
|
+
* values (?, ?, ?) -- This is a comment
|
|
328
|
+
* ```
|
|
329
|
+
*/
|
|
330
|
+
modifyEnd(modifier) {
|
|
331
|
+
return new InsertQueryBuilder({
|
|
332
|
+
...this.#props,
|
|
333
|
+
queryNode: QueryNode.cloneWithEndModifier(this.#props.queryNode, modifier.toOperationNode()),
|
|
334
|
+
});
|
|
335
|
+
}
|
|
280
336
|
/**
|
|
281
337
|
* Changes an `insert into` query to an `insert ignore into` query.
|
|
282
338
|
*
|
|
@@ -294,9 +350,19 @@ export class InsertQueryBuilder {
|
|
|
294
350
|
* ```ts
|
|
295
351
|
* await db.insertInto('person')
|
|
296
352
|
* .ignore()
|
|
297
|
-
* .values(
|
|
353
|
+
* .values({
|
|
354
|
+
* first_name: 'John',
|
|
355
|
+
* last_name: 'Doe',
|
|
356
|
+
* gender: 'female',
|
|
357
|
+
* })
|
|
298
358
|
* .execute()
|
|
299
359
|
* ```
|
|
360
|
+
*
|
|
361
|
+
* The generated SQL (MySQL):
|
|
362
|
+
*
|
|
363
|
+
* ```sql
|
|
364
|
+
* insert ignore into `person` ("first_name", "last_name", "gender") values (?, ?, ?)
|
|
365
|
+
* ```
|
|
300
366
|
*/
|
|
301
367
|
ignore() {
|
|
302
368
|
return new InsertQueryBuilder({
|
|
@@ -316,6 +382,8 @@ export class InsertQueryBuilder {
|
|
|
316
382
|
* Insert the first 5 rows:
|
|
317
383
|
*
|
|
318
384
|
* ```ts
|
|
385
|
+
* import { sql } from 'kysely'
|
|
386
|
+
*
|
|
319
387
|
* await db.insertInto('person')
|
|
320
388
|
* .top(5)
|
|
321
389
|
* .columns(['first_name', 'gender'])
|
|
@@ -334,6 +402,8 @@ export class InsertQueryBuilder {
|
|
|
334
402
|
* Insert the first 50 percent of rows:
|
|
335
403
|
*
|
|
336
404
|
* ```ts
|
|
405
|
+
* import { sql } from 'kysely'
|
|
406
|
+
*
|
|
337
407
|
* await db.insertInto('person')
|
|
338
408
|
* .top(50, 'percent')
|
|
339
409
|
* .columns(['first_name', 'gender'])
|
|
@@ -369,6 +439,7 @@ export class InsertQueryBuilder {
|
|
|
369
439
|
* .values({
|
|
370
440
|
* name: 'Catto',
|
|
371
441
|
* species: 'cat',
|
|
442
|
+
* owner_id: 3,
|
|
372
443
|
* })
|
|
373
444
|
* .onConflict((oc) => oc
|
|
374
445
|
* .column('name')
|
|
@@ -380,10 +451,10 @@ export class InsertQueryBuilder {
|
|
|
380
451
|
* The generated SQL (PostgreSQL):
|
|
381
452
|
*
|
|
382
453
|
* ```sql
|
|
383
|
-
* insert into "pet" ("name", "species")
|
|
384
|
-
* values ($1, $2)
|
|
454
|
+
* insert into "pet" ("name", "species", "owner_id")
|
|
455
|
+
* values ($1, $2, $3)
|
|
385
456
|
* on conflict ("name")
|
|
386
|
-
* do update set "species" = $
|
|
457
|
+
* do update set "species" = $4
|
|
387
458
|
* ```
|
|
388
459
|
*
|
|
389
460
|
* You can provide the name of the constraint instead of a column name:
|
|
@@ -394,6 +465,7 @@ export class InsertQueryBuilder {
|
|
|
394
465
|
* .values({
|
|
395
466
|
* name: 'Catto',
|
|
396
467
|
* species: 'cat',
|
|
468
|
+
* owner_id: 3,
|
|
397
469
|
* })
|
|
398
470
|
* .onConflict((oc) => oc
|
|
399
471
|
* .constraint('pet_name_key')
|
|
@@ -405,10 +477,10 @@ export class InsertQueryBuilder {
|
|
|
405
477
|
* The generated SQL (PostgreSQL):
|
|
406
478
|
*
|
|
407
479
|
* ```sql
|
|
408
|
-
* insert into "pet" ("name", "species")
|
|
409
|
-
* values ($1, $2)
|
|
480
|
+
* insert into "pet" ("name", "species", "owner_id")
|
|
481
|
+
* values ($1, $2, $3)
|
|
410
482
|
* on conflict on constraint "pet_name_key"
|
|
411
|
-
* do update set "species" = $
|
|
483
|
+
* do update set "species" = $4
|
|
412
484
|
* ```
|
|
413
485
|
*
|
|
414
486
|
* You can also specify an expression as the conflict target in case
|
|
@@ -422,6 +494,7 @@ export class InsertQueryBuilder {
|
|
|
422
494
|
* .values({
|
|
423
495
|
* name: 'Catto',
|
|
424
496
|
* species: 'cat',
|
|
497
|
+
* owner_id: 3,
|
|
425
498
|
* })
|
|
426
499
|
* .onConflict((oc) => oc
|
|
427
500
|
* .expression(sql<string>`lower(name)`)
|
|
@@ -433,10 +506,10 @@ export class InsertQueryBuilder {
|
|
|
433
506
|
* The generated SQL (PostgreSQL):
|
|
434
507
|
*
|
|
435
508
|
* ```sql
|
|
436
|
-
* insert into "pet" ("name", "species")
|
|
437
|
-
* values ($1, $2)
|
|
509
|
+
* insert into "pet" ("name", "species", "owner_id")
|
|
510
|
+
* values ($1, $2, $3)
|
|
438
511
|
* on conflict (lower(name))
|
|
439
|
-
* do update set "species" = $
|
|
512
|
+
* do update set "species" = $4
|
|
440
513
|
* ```
|
|
441
514
|
*
|
|
442
515
|
* You can add a filter for the update statement like this:
|
|
@@ -447,11 +520,12 @@ export class InsertQueryBuilder {
|
|
|
447
520
|
* .values({
|
|
448
521
|
* name: 'Catto',
|
|
449
522
|
* species: 'cat',
|
|
523
|
+
* owner_id: 3,
|
|
450
524
|
* })
|
|
451
525
|
* .onConflict((oc) => oc
|
|
452
526
|
* .column('name')
|
|
453
527
|
* .doUpdateSet({ species: 'hamster' })
|
|
454
|
-
* .where('excluded.name', '!=', 'Catto'
|
|
528
|
+
* .where('excluded.name', '!=', 'Catto')
|
|
455
529
|
* )
|
|
456
530
|
* .execute()
|
|
457
531
|
* ```
|
|
@@ -459,11 +533,11 @@ export class InsertQueryBuilder {
|
|
|
459
533
|
* The generated SQL (PostgreSQL):
|
|
460
534
|
*
|
|
461
535
|
* ```sql
|
|
462
|
-
* insert into "pet" ("name", "species")
|
|
463
|
-
* values ($1, $2)
|
|
536
|
+
* insert into "pet" ("name", "species", "owner_id")
|
|
537
|
+
* values ($1, $2, $3)
|
|
464
538
|
* on conflict ("name")
|
|
465
|
-
* do update set "species" = $
|
|
466
|
-
* where "excluded"."name" != $
|
|
539
|
+
* do update set "species" = $4
|
|
540
|
+
* where "excluded"."name" != $5
|
|
467
541
|
* ```
|
|
468
542
|
*
|
|
469
543
|
* You can create an `on conflict do nothing` clauses like this:
|
|
@@ -474,6 +548,7 @@ export class InsertQueryBuilder {
|
|
|
474
548
|
* .values({
|
|
475
549
|
* name: 'Catto',
|
|
476
550
|
* species: 'cat',
|
|
551
|
+
* owner_id: 3,
|
|
477
552
|
* })
|
|
478
553
|
* .onConflict((oc) => oc
|
|
479
554
|
* .column('name')
|
|
@@ -485,8 +560,8 @@ export class InsertQueryBuilder {
|
|
|
485
560
|
* The generated SQL (PostgreSQL):
|
|
486
561
|
*
|
|
487
562
|
* ```sql
|
|
488
|
-
* insert into "pet" ("name", "species")
|
|
489
|
-
* values ($1, $2)
|
|
563
|
+
* insert into "pet" ("name", "species", "owner_id")
|
|
564
|
+
* values ($1, $2, $3)
|
|
490
565
|
* on conflict ("name") do nothing
|
|
491
566
|
* ```
|
|
492
567
|
*
|
|
@@ -495,8 +570,13 @@ export class InsertQueryBuilder {
|
|
|
495
570
|
* `ExpressionBuilder`:
|
|
496
571
|
*
|
|
497
572
|
* ```ts
|
|
498
|
-
* db.insertInto('person')
|
|
499
|
-
* .values(
|
|
573
|
+
* await db.insertInto('person')
|
|
574
|
+
* .values({
|
|
575
|
+
* id: 1,
|
|
576
|
+
* first_name: 'John',
|
|
577
|
+
* last_name: 'Doe',
|
|
578
|
+
* gender: 'male',
|
|
579
|
+
* })
|
|
500
580
|
* .onConflict(oc => oc
|
|
501
581
|
* .column('id')
|
|
502
582
|
* .doUpdateSet({
|
|
@@ -504,6 +584,18 @@ export class InsertQueryBuilder {
|
|
|
504
584
|
* last_name: (eb) => eb.ref('excluded.last_name')
|
|
505
585
|
* })
|
|
506
586
|
* )
|
|
587
|
+
* .execute()
|
|
588
|
+
* ```
|
|
589
|
+
*
|
|
590
|
+
* The generated SQL (PostgreSQL):
|
|
591
|
+
*
|
|
592
|
+
* ```sql
|
|
593
|
+
* insert into "person" ("id", "first_name", "last_name", "gender")
|
|
594
|
+
* values ($1, $2, $3, $4)
|
|
595
|
+
* on conflict ("id")
|
|
596
|
+
* do update set
|
|
597
|
+
* "first_name" = "excluded"."first_name",
|
|
598
|
+
* "last_name" = "excluded"."last_name"
|
|
507
599
|
* ```
|
|
508
600
|
*/
|
|
509
601
|
onConflict(callback) {
|
|
@@ -530,8 +622,22 @@ export class InsertQueryBuilder {
|
|
|
530
622
|
* ```ts
|
|
531
623
|
* await db
|
|
532
624
|
* .insertInto('person')
|
|
533
|
-
* .values(
|
|
534
|
-
*
|
|
625
|
+
* .values({
|
|
626
|
+
* id: 1,
|
|
627
|
+
* first_name: 'John',
|
|
628
|
+
* last_name: 'Doe',
|
|
629
|
+
* gender: 'male',
|
|
630
|
+
* })
|
|
631
|
+
* .onDuplicateKeyUpdate({ updated_at: new Date().toISOString() })
|
|
632
|
+
* .execute()
|
|
633
|
+
* ```
|
|
634
|
+
*
|
|
635
|
+
* The generated SQL (MySQL):
|
|
636
|
+
*
|
|
637
|
+
* ```sql
|
|
638
|
+
* insert into `person` (`id`, `first_name`, `last_name`, `gender`)
|
|
639
|
+
* values (?, ?, ?, ?)
|
|
640
|
+
* on duplicate key update `updated_at` = ?
|
|
535
641
|
* ```
|
|
536
642
|
*/
|
|
537
643
|
onDuplicateKeyUpdate(update) {
|
|
@@ -572,16 +678,17 @@ export class InsertQueryBuilder {
|
|
|
572
678
|
* ### Examples
|
|
573
679
|
*
|
|
574
680
|
* ```ts
|
|
575
|
-
* db.insertInto('person')
|
|
576
|
-
* .values({ first_name: 'James', last_name: 'Smith',
|
|
681
|
+
* await db.insertInto('person')
|
|
682
|
+
* .values({ first_name: 'James', last_name: 'Smith', gender: 'male' })
|
|
577
683
|
* .returning(['first_name'])
|
|
578
684
|
* .clearReturning()
|
|
685
|
+
* .execute()
|
|
579
686
|
* ```
|
|
580
687
|
*
|
|
581
688
|
* The generated SQL(PostgreSQL):
|
|
582
689
|
*
|
|
583
690
|
* ```sql
|
|
584
|
-
* insert into "person" ("
|
|
691
|
+
* insert into "person" ("first_name", "last_name", "gender") values ($1, $2, $3)
|
|
585
692
|
* ```
|
|
586
693
|
*/
|
|
587
694
|
clearReturning() {
|
|
@@ -602,13 +709,15 @@ export class InsertQueryBuilder {
|
|
|
602
709
|
* The next example uses a helper function `log` to log a query:
|
|
603
710
|
*
|
|
604
711
|
* ```ts
|
|
712
|
+
* import type { Compilable } from 'kysely'
|
|
713
|
+
*
|
|
605
714
|
* function log<T extends Compilable>(qb: T): T {
|
|
606
715
|
* console.log(qb.compile())
|
|
607
716
|
* return qb
|
|
608
717
|
* }
|
|
609
718
|
*
|
|
610
|
-
* db.
|
|
611
|
-
* .
|
|
719
|
+
* await db.insertInto('person')
|
|
720
|
+
* .values({ first_name: 'John', last_name: 'Doe', gender: 'male' })
|
|
612
721
|
* .$call(log)
|
|
613
722
|
* .execute()
|
|
614
723
|
* ```
|
|
@@ -629,7 +738,9 @@ export class InsertQueryBuilder {
|
|
|
629
738
|
* ### Examples
|
|
630
739
|
*
|
|
631
740
|
* ```ts
|
|
632
|
-
*
|
|
741
|
+
* import type { NewPerson } from 'type-editor' // imaginary module
|
|
742
|
+
*
|
|
743
|
+
* async function insertPerson(values: NewPerson, returnLastName: boolean) {
|
|
633
744
|
* return await db
|
|
634
745
|
* .insertInto('person')
|
|
635
746
|
* .values(values)
|
|
@@ -644,11 +755,11 @@ export class InsertQueryBuilder {
|
|
|
644
755
|
* the code. In the example above the return type of the `insertPerson` function is:
|
|
645
756
|
*
|
|
646
757
|
* ```ts
|
|
647
|
-
* {
|
|
758
|
+
* Promise<{
|
|
648
759
|
* id: number
|
|
649
760
|
* first_name: string
|
|
650
761
|
* last_name?: string
|
|
651
|
-
* }
|
|
762
|
+
* }>
|
|
652
763
|
* ```
|
|
653
764
|
*/
|
|
654
765
|
$if(condition, func) {
|
|
@@ -686,23 +797,41 @@ export class InsertQueryBuilder {
|
|
|
686
797
|
* Turn this code:
|
|
687
798
|
*
|
|
688
799
|
* ```ts
|
|
800
|
+
* import type { Person } from 'type-editor' // imaginary module
|
|
801
|
+
*
|
|
689
802
|
* const person = await db.insertInto('person')
|
|
690
|
-
* .values({
|
|
803
|
+
* .values({
|
|
804
|
+
* first_name: 'John',
|
|
805
|
+
* last_name: 'Doe',
|
|
806
|
+
* gender: 'male',
|
|
807
|
+
* nullable_column: 'hell yeah!'
|
|
808
|
+
* })
|
|
691
809
|
* .returningAll()
|
|
692
810
|
* .executeTakeFirstOrThrow()
|
|
693
811
|
*
|
|
694
|
-
* if (
|
|
812
|
+
* if (isWithNoNullValue(person)) {
|
|
695
813
|
* functionThatExpectsPersonWithNonNullValue(person)
|
|
696
814
|
* }
|
|
815
|
+
*
|
|
816
|
+
* function isWithNoNullValue(person: Person): person is Person & { nullable_column: string } {
|
|
817
|
+
* return person.nullable_column != null
|
|
818
|
+
* }
|
|
697
819
|
* ```
|
|
698
820
|
*
|
|
699
821
|
* Into this:
|
|
700
822
|
*
|
|
701
823
|
* ```ts
|
|
824
|
+
* import type { NotNull } from 'kysely'
|
|
825
|
+
*
|
|
702
826
|
* const person = await db.insertInto('person')
|
|
703
|
-
* .values({
|
|
827
|
+
* .values({
|
|
828
|
+
* first_name: 'John',
|
|
829
|
+
* last_name: 'Doe',
|
|
830
|
+
* gender: 'male',
|
|
831
|
+
* nullable_column: 'hell yeah!'
|
|
832
|
+
* })
|
|
704
833
|
* .returningAll()
|
|
705
|
-
* .$narrowType<{ nullable_column:
|
|
834
|
+
* .$narrowType<{ nullable_column: NotNull }>()
|
|
706
835
|
* .executeTakeFirstOrThrow()
|
|
707
836
|
*
|
|
708
837
|
* functionThatExpectsPersonWithNonNullValue(person)
|
|
@@ -734,22 +863,29 @@ export class InsertQueryBuilder {
|
|
|
734
863
|
* ### Examples
|
|
735
864
|
*
|
|
736
865
|
* ```ts
|
|
737
|
-
*
|
|
738
|
-
*
|
|
739
|
-
*
|
|
740
|
-
*
|
|
741
|
-
* .
|
|
742
|
-
*
|
|
743
|
-
*
|
|
744
|
-
*
|
|
745
|
-
*
|
|
746
|
-
*
|
|
747
|
-
* .
|
|
748
|
-
*
|
|
749
|
-
*
|
|
750
|
-
*
|
|
751
|
-
*
|
|
752
|
-
*
|
|
866
|
+
* import type { NewPerson, NewPet, Species } from 'type-editor' // imaginary module
|
|
867
|
+
*
|
|
868
|
+
* async function insertPersonAndPet(person: NewPerson, pet: Omit<NewPet, 'owner_id'>) {
|
|
869
|
+
* return await db
|
|
870
|
+
* .with('new_person', (qb) => qb
|
|
871
|
+
* .insertInto('person')
|
|
872
|
+
* .values(person)
|
|
873
|
+
* .returning('id')
|
|
874
|
+
* .$assertType<{ id: number }>()
|
|
875
|
+
* )
|
|
876
|
+
* .with('new_pet', (qb) => qb
|
|
877
|
+
* .insertInto('pet')
|
|
878
|
+
* .values((eb) => ({
|
|
879
|
+
* owner_id: eb.selectFrom('new_person').select('id'),
|
|
880
|
+
* ...pet
|
|
881
|
+
* }))
|
|
882
|
+
* .returning(['name as pet_name', 'species'])
|
|
883
|
+
* .$assertType<{ pet_name: string, species: Species }>()
|
|
884
|
+
* )
|
|
885
|
+
* .selectFrom(['new_person', 'new_pet'])
|
|
886
|
+
* .selectAll()
|
|
887
|
+
* .executeTakeFirstOrThrow()
|
|
888
|
+
* }
|
|
753
889
|
* ```
|
|
754
890
|
*/
|
|
755
891
|
$assertType() {
|
|
@@ -13,12 +13,17 @@
|
|
|
13
13
|
* ### Examples
|
|
14
14
|
*
|
|
15
15
|
* ```ts
|
|
16
|
-
*
|
|
17
|
-
* .insertInto('person')
|
|
18
|
-
* .values(person)
|
|
19
|
-
* .executeTakeFirst()
|
|
16
|
+
* import type { NewPerson } from 'type-editor' // imaginary module
|
|
20
17
|
*
|
|
21
|
-
*
|
|
18
|
+
* async function insertPerson(person: NewPerson) {
|
|
19
|
+
* const result = await db
|
|
20
|
+
* .insertInto('person')
|
|
21
|
+
* .values(person)
|
|
22
|
+
* .executeTakeFirstOrThrow()
|
|
23
|
+
*
|
|
24
|
+
* console.log(result.insertId) // relevant on MySQL
|
|
25
|
+
* console.log(result.numInsertedOrUpdatedRows) // always relevant
|
|
26
|
+
* }
|
|
22
27
|
* ```
|
|
23
28
|
*/
|
|
24
29
|
export declare class InsertResult {
|
|
@@ -14,12 +14,17 @@
|
|
|
14
14
|
* ### Examples
|
|
15
15
|
*
|
|
16
16
|
* ```ts
|
|
17
|
-
*
|
|
18
|
-
* .insertInto('person')
|
|
19
|
-
* .values(person)
|
|
20
|
-
* .executeTakeFirst()
|
|
17
|
+
* import type { NewPerson } from 'type-editor' // imaginary module
|
|
21
18
|
*
|
|
22
|
-
*
|
|
19
|
+
* async function insertPerson(person: NewPerson) {
|
|
20
|
+
* const result = await db
|
|
21
|
+
* .insertInto('person')
|
|
22
|
+
* .values(person)
|
|
23
|
+
* .executeTakeFirstOrThrow()
|
|
24
|
+
*
|
|
25
|
+
* console.log(result.insertId) // relevant on MySQL
|
|
26
|
+
* console.log(result.numInsertedOrUpdatedRows) // always relevant
|
|
27
|
+
* }
|
|
23
28
|
* ```
|
|
24
29
|
*/
|
|
25
30
|
export class InsertResult {
|
|
@@ -18,9 +18,12 @@ export declare class JSONPathBuilder<S, O = S> {
|
|
|
18
18
|
* ### Examples
|
|
19
19
|
*
|
|
20
20
|
* ```ts
|
|
21
|
-
* db.selectFrom('person')
|
|
22
|
-
*
|
|
23
|
-
* )
|
|
21
|
+
* await db.selectFrom('person')
|
|
22
|
+
* .select(eb =>
|
|
23
|
+
* eb.ref('nicknames', '->').at(0).as('primary_nickname')
|
|
24
|
+
* )
|
|
25
|
+
* .execute()
|
|
26
|
+
* ```
|
|
24
27
|
*
|
|
25
28
|
* The generated SQL (PostgreSQL):
|
|
26
29
|
*
|
|
@@ -130,11 +133,19 @@ export declare class TraversedJSONPathBuilder<S, O> extends JSONPathBuilder<S, O
|
|
|
130
133
|
* All expressions need to have this getter for complicated type-related reasons.
|
|
131
134
|
* Simply add this getter for your expression and always return `undefined` from it:
|
|
132
135
|
*
|
|
136
|
+
* ### Examples
|
|
137
|
+
*
|
|
133
138
|
* ```ts
|
|
139
|
+
* import { type Expression, type OperationNode, sql } from 'kysely'
|
|
140
|
+
*
|
|
134
141
|
* class SomeExpression<T> implements Expression<T> {
|
|
135
142
|
* get expressionType(): T | undefined {
|
|
136
143
|
* return undefined
|
|
137
144
|
* }
|
|
145
|
+
*
|
|
146
|
+
* toOperationNode(): OperationNode {
|
|
147
|
+
* return sql`some sql here`.toOperationNode()
|
|
148
|
+
* }
|
|
138
149
|
* }
|
|
139
150
|
* ```
|
|
140
151
|
*
|
|
@@ -163,7 +174,7 @@ export declare class TraversedJSONPathBuilder<S, O> extends JSONPathBuilder<S, O
|
|
|
163
174
|
*
|
|
164
175
|
* The generated SQL (PostgreSQL):
|
|
165
176
|
*
|
|
166
|
-
* ```
|
|
177
|
+
* ```sql
|
|
167
178
|
* select "first_name" = $1 as "is_jennifer"
|
|
168
179
|
* from "person"
|
|
169
180
|
* ```
|
|
@@ -172,6 +183,8 @@ export declare class TraversedJSONPathBuilder<S, O> extends JSONPathBuilder<S, O
|
|
|
172
183
|
/**
|
|
173
184
|
* Returns an aliased version of the expression.
|
|
174
185
|
*
|
|
186
|
+
* ### Examples
|
|
187
|
+
*
|
|
175
188
|
* In addition to slapping `as "the_alias"` at the end of the expression,
|
|
176
189
|
* this method also provides strict typing:
|
|
177
190
|
*
|
|
@@ -180,7 +193,7 @@ export declare class TraversedJSONPathBuilder<S, O> extends JSONPathBuilder<S, O
|
|
|
180
193
|
* .selectFrom('person')
|
|
181
194
|
* .select((eb) =>
|
|
182
195
|
* // `eb.fn<string>` returns an AliasableExpression<string>
|
|
183
|
-
* eb.fn<string>('concat', ['first_name' eb.val(' '), 'last_name']).as('full_name')
|
|
196
|
+
* eb.fn<string>('concat', ['first_name', eb.val(' '), 'last_name']).as('full_name')
|
|
184
197
|
* )
|
|
185
198
|
* .executeTakeFirstOrThrow()
|
|
186
199
|
*
|
|
@@ -190,7 +203,7 @@ export declare class TraversedJSONPathBuilder<S, O> extends JSONPathBuilder<S, O
|
|
|
190
203
|
*
|
|
191
204
|
* The generated SQL (PostgreSQL):
|
|
192
205
|
*
|
|
193
|
-
* ```
|
|
206
|
+
* ```sql
|
|
194
207
|
* select
|
|
195
208
|
* concat("first_name", $1, "last_name") as "full_name"
|
|
196
209
|
* from
|
|
@@ -201,6 +214,8 @@ export declare class TraversedJSONPathBuilder<S, O> extends JSONPathBuilder<S, O
|
|
|
201
214
|
* provide the alias as the only type argument:
|
|
202
215
|
*
|
|
203
216
|
* ```ts
|
|
217
|
+
* import { sql } from 'kysely'
|
|
218
|
+
*
|
|
204
219
|
* const values = sql<{ a: number, b: string }>`(values (1, 'foo'))`
|
|
205
220
|
*
|
|
206
221
|
* // The alias is `t(a, b)` which specifies the column names
|
|
@@ -215,11 +230,12 @@ export declare class TraversedJSONPathBuilder<S, O> extends JSONPathBuilder<S, O
|
|
|
215
230
|
* .expression(
|
|
216
231
|
* db.selectFrom(aliasedValues).select(['t.a', 't.b'])
|
|
217
232
|
* )
|
|
233
|
+
* .execute()
|
|
218
234
|
* ```
|
|
219
235
|
*
|
|
220
236
|
* The generated SQL (PostgreSQL):
|
|
221
237
|
*
|
|
222
|
-
* ```
|
|
238
|
+
* ```sql
|
|
223
239
|
* insert into "person" ("first_name", "last_name")
|
|
224
240
|
* from (values (1, 'foo')) as t(a, b)
|
|
225
241
|
* select "t"."a", "t"."b"
|
|
@@ -232,16 +248,24 @@ export declare class TraversedJSONPathBuilder<S, O> extends JSONPathBuilder<S, O
|
|
|
232
248
|
* This method call doesn't change the SQL in any way. This methods simply
|
|
233
249
|
* returns a copy of this `JSONPathBuilder` with a new output type.
|
|
234
250
|
*/
|
|
235
|
-
$castTo<
|
|
236
|
-
$notNull():
|
|
251
|
+
$castTo<O2>(): TraversedJSONPathBuilder<S, O2>;
|
|
252
|
+
$notNull(): TraversedJSONPathBuilder<S, Exclude<O, null>>;
|
|
237
253
|
/**
|
|
238
254
|
* Creates the OperationNode that describes how to compile this expression into SQL.
|
|
239
255
|
*
|
|
256
|
+
* ### Examples
|
|
257
|
+
*
|
|
240
258
|
* If you are creating a custom expression, it's often easiest to use the {@link sql}
|
|
241
259
|
* template tag to build the node:
|
|
242
260
|
*
|
|
243
261
|
* ```ts
|
|
262
|
+
* import { type Expression, type OperationNode, sql } from 'kysely'
|
|
263
|
+
*
|
|
244
264
|
* class SomeExpression<T> implements Expression<T> {
|
|
265
|
+
* get expressionType(): T | undefined {
|
|
266
|
+
* return undefined
|
|
267
|
+
* }
|
|
268
|
+
*
|
|
245
269
|
* toOperationNode(): OperationNode {
|
|
246
270
|
* return sql`some sql here`.toOperationNode()
|
|
247
271
|
* }
|
|
@@ -24,9 +24,12 @@ export class JSONPathBuilder {
|
|
|
24
24
|
* ### Examples
|
|
25
25
|
*
|
|
26
26
|
* ```ts
|
|
27
|
-
* db.selectFrom('person')
|
|
28
|
-
*
|
|
29
|
-
* )
|
|
27
|
+
* await db.selectFrom('person')
|
|
28
|
+
* .select(eb =>
|
|
29
|
+
* eb.ref('nicknames', '->').at(0).as('primary_nickname')
|
|
30
|
+
* )
|
|
31
|
+
* .execute()
|
|
32
|
+
* ```
|
|
30
33
|
*
|
|
31
34
|
* The generated SQL (PostgreSQL):
|
|
32
35
|
*
|
|
@@ -160,10 +163,10 @@ export class TraversedJSONPathBuilder extends JSONPathBuilder {
|
|
|
160
163
|
* returns a copy of this `JSONPathBuilder` with a new output type.
|
|
161
164
|
*/
|
|
162
165
|
$castTo() {
|
|
163
|
-
return new
|
|
166
|
+
return new TraversedJSONPathBuilder(this.#node);
|
|
164
167
|
}
|
|
165
168
|
$notNull() {
|
|
166
|
-
return new
|
|
169
|
+
return new TraversedJSONPathBuilder(this.#node);
|
|
167
170
|
}
|
|
168
171
|
toOperationNode() {
|
|
169
172
|
return this.#node;
|