kysely 0.16.11 → 0.17.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 (170) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/dialect/mysql/mysql-adapter.js +3 -4
  3. package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -1
  4. package/dist/cjs/dialect/postgres/postgres-adapter.js +3 -2
  5. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +2 -1
  6. package/dist/cjs/index-nodeless.d.ts +2 -0
  7. package/dist/cjs/index-nodeless.js +2 -0
  8. package/dist/cjs/kysely.d.ts +3 -6
  9. package/dist/cjs/kysely.js +7 -12
  10. package/dist/cjs/migration/migrator.js +4 -4
  11. package/dist/cjs/operation-node/operation-node-transformer.js +1 -1
  12. package/dist/cjs/operation-node/raw-node.d.ts +4 -2
  13. package/dist/cjs/operation-node/raw-node.js +8 -2
  14. package/dist/cjs/parser/complex-expression-parser.d.ts +5 -5
  15. package/dist/cjs/parser/complex-expression-parser.js +5 -4
  16. package/dist/cjs/parser/filter-parser.d.ts +9 -9
  17. package/dist/cjs/parser/filter-parser.js +31 -30
  18. package/dist/cjs/parser/group-by-parser.d.ts +1 -2
  19. package/dist/cjs/parser/group-by-parser.js +2 -2
  20. package/dist/cjs/parser/insert-values-parser.d.ts +1 -2
  21. package/dist/cjs/parser/insert-values-parser.js +6 -6
  22. package/dist/cjs/parser/join-parser.d.ts +1 -2
  23. package/dist/cjs/parser/join-parser.js +8 -7
  24. package/dist/cjs/parser/order-by-parser.d.ts +1 -2
  25. package/dist/cjs/parser/order-by-parser.js +4 -4
  26. package/dist/cjs/parser/parse-utils.d.ts +10 -0
  27. package/dist/cjs/parser/parse-utils.js +38 -0
  28. package/dist/cjs/parser/reference-parser.d.ts +2 -3
  29. package/dist/cjs/parser/reference-parser.js +5 -5
  30. package/dist/cjs/parser/select-parser.d.ts +1 -2
  31. package/dist/cjs/parser/select-parser.js +5 -5
  32. package/dist/cjs/parser/table-parser.d.ts +2 -3
  33. package/dist/cjs/parser/table-parser.js +5 -5
  34. package/dist/cjs/parser/update-set-parser.d.ts +1 -2
  35. package/dist/cjs/parser/update-set-parser.js +2 -2
  36. package/dist/cjs/parser/value-parser.d.ts +3 -4
  37. package/dist/cjs/parser/value-parser.js +7 -7
  38. package/dist/cjs/parser/with-parser.d.ts +1 -2
  39. package/dist/cjs/parser/with-parser.js +3 -2
  40. package/dist/cjs/query-builder/delete-query-builder.d.ts +23 -19
  41. package/dist/cjs/query-builder/delete-query-builder.js +15 -15
  42. package/dist/cjs/query-builder/expression-builder.d.ts +4 -13
  43. package/dist/cjs/query-builder/expression-builder.js +12 -21
  44. package/dist/cjs/query-builder/function-builder.d.ts +2 -6
  45. package/dist/cjs/query-builder/function-builder.js +5 -8
  46. package/dist/cjs/query-builder/insert-query-builder.d.ts +12 -8
  47. package/dist/cjs/query-builder/insert-query-builder.js +8 -7
  48. package/dist/cjs/query-builder/join-builder.d.ts +0 -2
  49. package/dist/cjs/query-builder/join-builder.js +8 -8
  50. package/dist/cjs/query-builder/on-conflict-builder.d.ts +24 -20
  51. package/dist/cjs/query-builder/on-conflict-builder.js +17 -17
  52. package/dist/cjs/query-builder/returning-interface.d.ts +3 -1
  53. package/dist/cjs/query-builder/select-query-builder.d.ts +41 -29
  54. package/dist/cjs/query-builder/select-query-builder.js +28 -26
  55. package/dist/cjs/query-builder/update-query-builder.d.ts +30 -24
  56. package/dist/cjs/query-builder/update-query-builder.js +22 -20
  57. package/dist/cjs/query-builder/where-interface.d.ts +20 -16
  58. package/dist/cjs/query-compiler/default-query-compiler.js +1 -1
  59. package/dist/cjs/query-creator.d.ts +10 -129
  60. package/dist/cjs/query-creator.js +5 -136
  61. package/dist/cjs/query-executor/default-query-executor.d.ts +8 -1
  62. package/dist/cjs/query-executor/default-query-executor.js +13 -13
  63. package/dist/cjs/query-executor/noop-query-executor.d.ts +8 -0
  64. package/dist/cjs/query-executor/noop-query-executor.js +8 -1
  65. package/dist/cjs/query-executor/query-executor-provider.d.ts +8 -0
  66. package/dist/cjs/query-executor/query-executor-provider.js +2 -0
  67. package/dist/cjs/query-executor/query-executor.d.ts +7 -0
  68. package/dist/cjs/raw-builder/raw-builder.d.ts +42 -11
  69. package/dist/cjs/raw-builder/raw-builder.js +55 -56
  70. package/dist/cjs/raw-builder/sql.d.ts +323 -0
  71. package/dist/cjs/raw-builder/sql.js +153 -0
  72. package/dist/cjs/schema/alter-table-builder.d.ts +20 -8
  73. package/dist/cjs/schema/column-definition-builder.d.ts +20 -8
  74. package/dist/cjs/schema/create-index-builder.d.ts +3 -1
  75. package/dist/cjs/schema/create-index-builder.js +3 -1
  76. package/dist/cjs/schema/create-table-builder.d.ts +6 -2
  77. package/dist/cjs/schema/create-table-builder.js +6 -2
  78. package/dist/cjs/schema/create-view-builder.d.ts +3 -3
  79. package/dist/cjs/schema/create-view-builder.js +3 -3
  80. package/dist/cjs/util/query-id.js +10 -4
  81. package/dist/cjs/util/random-string.js +65 -2
  82. package/dist/esm/dialect/mysql/mysql-adapter.js +3 -4
  83. package/dist/esm/dialect/mysql/mysql-introspector.js +2 -1
  84. package/dist/esm/dialect/postgres/postgres-adapter.js +3 -2
  85. package/dist/esm/dialect/sqlite/sqlite-introspector.js +2 -1
  86. package/dist/esm/index-nodeless.d.ts +2 -0
  87. package/dist/esm/index-nodeless.js +2 -0
  88. package/dist/esm/kysely.d.ts +3 -6
  89. package/dist/esm/kysely.js +7 -12
  90. package/dist/esm/migration/migrator.js +4 -4
  91. package/dist/esm/operation-node/operation-node-transformer.js +1 -1
  92. package/dist/esm/operation-node/raw-node.d.ts +4 -2
  93. package/dist/esm/operation-node/raw-node.js +8 -2
  94. package/dist/esm/parser/complex-expression-parser.d.ts +5 -5
  95. package/dist/esm/parser/complex-expression-parser.js +5 -4
  96. package/dist/esm/parser/filter-parser.d.ts +9 -9
  97. package/dist/esm/parser/filter-parser.js +31 -30
  98. package/dist/esm/parser/group-by-parser.d.ts +1 -2
  99. package/dist/esm/parser/group-by-parser.js +2 -2
  100. package/dist/esm/parser/insert-values-parser.d.ts +1 -2
  101. package/dist/esm/parser/insert-values-parser.js +6 -6
  102. package/dist/esm/parser/join-parser.d.ts +1 -2
  103. package/dist/esm/parser/join-parser.js +8 -7
  104. package/dist/esm/parser/order-by-parser.d.ts +1 -2
  105. package/dist/esm/parser/order-by-parser.js +4 -4
  106. package/dist/esm/parser/parse-utils.d.ts +10 -0
  107. package/dist/esm/parser/parse-utils.js +32 -0
  108. package/dist/esm/parser/reference-parser.d.ts +2 -3
  109. package/dist/esm/parser/reference-parser.js +5 -5
  110. package/dist/esm/parser/select-parser.d.ts +1 -2
  111. package/dist/esm/parser/select-parser.js +5 -5
  112. package/dist/esm/parser/table-parser.d.ts +2 -3
  113. package/dist/esm/parser/table-parser.js +5 -5
  114. package/dist/esm/parser/update-set-parser.d.ts +1 -2
  115. package/dist/esm/parser/update-set-parser.js +2 -2
  116. package/dist/esm/parser/value-parser.d.ts +3 -4
  117. package/dist/esm/parser/value-parser.js +7 -7
  118. package/dist/esm/parser/with-parser.d.ts +1 -2
  119. package/dist/esm/parser/with-parser.js +3 -2
  120. package/dist/esm/query-builder/delete-query-builder.d.ts +23 -19
  121. package/dist/esm/query-builder/delete-query-builder.js +15 -15
  122. package/dist/esm/query-builder/expression-builder.d.ts +4 -13
  123. package/dist/esm/query-builder/expression-builder.js +12 -21
  124. package/dist/esm/query-builder/function-builder.d.ts +2 -6
  125. package/dist/esm/query-builder/function-builder.js +5 -8
  126. package/dist/esm/query-builder/insert-query-builder.d.ts +12 -8
  127. package/dist/esm/query-builder/insert-query-builder.js +8 -7
  128. package/dist/esm/query-builder/join-builder.d.ts +0 -2
  129. package/dist/esm/query-builder/join-builder.js +8 -8
  130. package/dist/esm/query-builder/on-conflict-builder.d.ts +24 -20
  131. package/dist/esm/query-builder/on-conflict-builder.js +17 -17
  132. package/dist/esm/query-builder/returning-interface.d.ts +3 -1
  133. package/dist/esm/query-builder/select-query-builder.d.ts +41 -29
  134. package/dist/esm/query-builder/select-query-builder.js +28 -26
  135. package/dist/esm/query-builder/update-query-builder.d.ts +30 -24
  136. package/dist/esm/query-builder/update-query-builder.js +22 -20
  137. package/dist/esm/query-builder/where-interface.d.ts +20 -16
  138. package/dist/esm/query-compiler/default-query-compiler.js +1 -1
  139. package/dist/esm/query-creator.d.ts +10 -129
  140. package/dist/esm/query-creator.js +5 -136
  141. package/dist/esm/query-executor/default-query-executor.d.ts +8 -1
  142. package/dist/esm/query-executor/default-query-executor.js +13 -13
  143. package/dist/esm/query-executor/noop-query-executor.d.ts +8 -0
  144. package/dist/esm/query-executor/noop-query-executor.js +7 -0
  145. package/dist/esm/query-executor/query-executor-provider.d.ts +8 -0
  146. package/dist/esm/query-executor/query-executor-provider.js +2 -0
  147. package/dist/esm/query-executor/query-executor.d.ts +7 -0
  148. package/dist/esm/raw-builder/raw-builder.d.ts +42 -11
  149. package/dist/esm/raw-builder/raw-builder.js +56 -57
  150. package/dist/esm/raw-builder/sql.d.ts +323 -0
  151. package/dist/esm/raw-builder/sql.js +151 -0
  152. package/dist/esm/schema/alter-table-builder.d.ts +20 -8
  153. package/dist/esm/schema/column-definition-builder.d.ts +20 -8
  154. package/dist/esm/schema/create-index-builder.d.ts +3 -1
  155. package/dist/esm/schema/create-index-builder.js +3 -1
  156. package/dist/esm/schema/create-table-builder.d.ts +6 -2
  157. package/dist/esm/schema/create-table-builder.js +6 -2
  158. package/dist/esm/schema/create-view-builder.d.ts +3 -3
  159. package/dist/esm/schema/create-view-builder.js +3 -3
  160. package/dist/esm/util/query-id.js +10 -4
  161. package/dist/esm/util/random-string.js +65 -2
  162. package/package.json +13 -13
  163. package/dist/cjs/parser/parse-context.d.ts +0 -55
  164. package/dist/cjs/parser/parse-context.js +0 -50
  165. package/dist/cjs/util/private-symbols.d.ts +0 -5
  166. package/dist/cjs/util/private-symbols.js +0 -8
  167. package/dist/esm/parser/parse-context.d.ts +0 -55
  168. package/dist/esm/parser/parse-context.js +0 -47
  169. package/dist/esm/util/private-symbols.d.ts +0 -5
  170. package/dist/esm/util/private-symbols.js +0 -6
@@ -12,7 +12,6 @@ import { MutationObject } from '../parser/update-set-parser.js';
12
12
  import { Compilable } from '../util/compilable.js';
13
13
  import { QueryExecutor } from '../query-executor/query-executor.js';
14
14
  import { QueryId } from '../util/query-id.js';
15
- import { ParseContext } from '../parser/parse-context.js';
16
15
  import { UpdateResult } from './update-result.js';
17
16
  import { KyselyPlugin } from '../plugin/kysely-plugin.js';
18
17
  import { WhereInterface } from './where-interface.js';
@@ -47,7 +46,7 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
47
46
  * ```
48
47
  *
49
48
  * Operator can be any supported operator or if the typings don't support it
50
- * you can always use `db.raw('your operator')`.
49
+ * you can always use `sql\`your operator\``.
51
50
  *
52
51
  * ```ts
53
52
  * const persons = await db
@@ -117,7 +116,7 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
117
116
  *
118
117
  * A `where in` query can be built by using the `in` operator and an array
119
118
  * of values. The values in the array can also be subqueries or raw
120
- * instances.
119
+ * {@link sql} expressions.
121
120
  *
122
121
  * ```ts
123
122
  * const persons = await db
@@ -133,15 +132,17 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
133
132
  * select * from "person" where "id" in ($1, $2, $3)
134
133
  * ```
135
134
  *
136
- * If everything else fails, you can always pass {@link Kysely.raw | raw}
135
+ * If everything else fails, you can always use the {@link sql} tag
137
136
  * as any of the arguments, including the operator:
138
137
  *
139
138
  * ```ts
139
+ * import { sql } from 'kysely'
140
+ *
140
141
  * const persons = await db
141
142
  * .selectFrom('person')
142
143
  * .selectAll()
143
144
  * .where(
144
- * db.raw('coalesce(first_name, last_name)'),
145
+ * sql`coalesce(first_name, last_name)`,
145
146
  * 'like',
146
147
  * '%' + name + '%',
147
148
  * )
@@ -176,24 +177,25 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
176
177
  * ```
177
178
  *
178
179
  * In all examples above the columns were known at compile time
179
- * (except for the `raw` expressions). By default kysely only allows
180
- * you to refer to columns that exist in the database **and** can be
181
- * referred to in the current query and context.
180
+ * (except for the raw {@link sql} expressions). By default kysely only
181
+ * allows you to refer to columns that exist in the database **and**
182
+ * can be referred to in the current query and context.
182
183
  *
183
184
  * Sometimes you may want to refer to columns that come from the user
184
185
  * input and thus are not available at compile time.
185
186
  *
186
- * You have two options, `db.raw` or `db.dynamic`. The example below
187
+ * You have two options, the {@link sql} tag or `db.dynamic`. The example below
187
188
  * uses both:
188
189
  *
189
190
  * ```ts
191
+ * import { sql } from 'kysely'
190
192
  * const { ref } = db.dynamic
191
193
  *
192
194
  * const persons = await db
193
195
  * .selectFrom('person')
194
196
  * .selectAll()
195
197
  * .where(ref(columnFromUserInput), '=', 1)
196
- * .orWhere(db.raw('??', [columnFromUserInput]), '=', 2)
198
+ * .orWhere(sql.id(columnFromUserInput), '=', 2)
197
199
  * .execute()
198
200
  * ```
199
201
  */
@@ -327,13 +329,14 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
327
329
  /**
328
330
  * Adds a `where exists` clause to the query.
329
331
  *
330
- * You can either use a subquery or a raw instance.
332
+ * You can either use a subquery or a raw {@link sql} snippet.
331
333
  *
332
334
  * ### Examples
333
335
  *
334
336
  * The query below selets all persons that own a pet named Catto:
335
337
  *
336
338
  * ```ts
339
+ * const petName = 'Catto'
337
340
  * const persons = await db
338
341
  * .selectFrom('person')
339
342
  * .selectAll()
@@ -341,7 +344,7 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
341
344
  * .selectFrom('pet')
342
345
  * .select('pet.id')
343
346
  * .whereRef('person.id', '=', 'pet.owner_id')
344
- * .where('pet.name', '=', 'Catto')
347
+ * .where('pet.name', '=', petName)
345
348
  * )
346
349
  * .execute()
347
350
  * ```
@@ -358,16 +361,16 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
358
361
  * )
359
362
  * ```
360
363
  *
361
- * The same query as in the previous example but with using raw:
364
+ * The same query as in the previous example but with using raw {@link sql}:
362
365
  *
363
366
  * ```ts
367
+ * import { sql } from 'kysely'
368
+ *
369
+ * const petName = 'Catto'
364
370
  * db.selectFrom('person')
365
371
  * .selectAll()
366
372
  * .whereExists(
367
- * db.raw(
368
- * '(select pet.id from pet where person.id = pet.owner_id and pet.name = ?)',
369
- * ['Catto']
370
- * )
373
+ * sql`(select pet.id from pet where person.id = pet.owner_id and pet.name = ${petName})`
371
374
  * )
372
375
  * ```
373
376
  *
@@ -526,8 +529,8 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
526
529
  * Sets the values to update for an {@link Kysely.updateTable | update} query.
527
530
  *
528
531
  * This method takes an object whose keys are column names and values are
529
- * values to update. In addition to the column's type, the values can be `raw`
530
- * instances or select queries.
532
+ * values to update. In addition to the column's type, the values can be
533
+ * raw {@link sql} snippets or select queries.
531
534
  *
532
535
  * The return value of an update query is an instance of {@link UpdateResult}.
533
536
  * You can use the {@link returning} method on supported databases to get out
@@ -580,16 +583,18 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
580
583
  * update "person" set "first_name" = $1, "last_name" = $2 where "id" = $3 returning "id"
581
584
  * ```
582
585
  *
583
- * In addition to primitives, the values can also be `raw` expressions or
586
+ * In addition to primitives, the values can also be raw sql expressions or
584
587
  * select queries:
585
588
  *
586
589
  * ```ts
590
+ * import { sql } from 'kysely'
591
+ *
587
592
  * const result = await db
588
593
  * .updateTable('person')
589
594
  * .set({
590
595
  * first_name: 'Jennifer',
591
- * last_name: db.raw('? || ?', ['Ani', 'ston']),
592
- * age: db.selectFrom('person').select(raw('avg(age)')),
596
+ * last_name: sql`${'Ani'} || ${'ston'}`,
597
+ * age: db.selectFrom('person').select(sql`avg(age)`),
593
598
  * })
594
599
  * .where('id', '=', 1)
595
600
  * .executeTakeFirst()
@@ -651,6 +656,8 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
651
656
  * Return arbitrary expressions:
652
657
  *
653
658
  * ```ts
659
+ * import { sql } from 'kysely'
660
+ *
654
661
  * const { id, full_name, first_pet_id } = await db
655
662
  * .insertInto('person')
656
663
  * .values({
@@ -659,7 +666,7 @@ export declare class UpdateQueryBuilder<DB, TB extends keyof DB, O> implements W
659
666
  * })
660
667
  * .returning([
661
668
  * 'id as id',
662
- * db.raw<string>(`concat(first_name, ' ', last_name)`).as('full_name'),
669
+ * sql<string>`concat(first_name, ' ', last_name)`.as('full_name'),
663
670
  * (qb) => qb.selectFrom('pets').select('pet.id').limit(1).as('first_pet_id')
664
671
  * ])
665
672
  * .executeTakeFirst()
@@ -770,5 +777,4 @@ export interface UpdateQueryBuilderProps {
770
777
  readonly queryId: QueryId;
771
778
  readonly queryNode: UpdateQueryNode;
772
779
  readonly executor: QueryExecutor;
773
- readonly parseContext: ParseContext;
774
780
  }
@@ -19,81 +19,81 @@ class UpdateQueryBuilder {
19
19
  where(...args) {
20
20
  return new UpdateQueryBuilder({
21
21
  ...this.#props,
22
- queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseWhereFilter)(this.#props.parseContext, args)),
22
+ queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseWhereFilter)(args)),
23
23
  });
24
24
  }
25
25
  whereRef(lhs, op, rhs) {
26
26
  return new UpdateQueryBuilder({
27
27
  ...this.#props,
28
- queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(this.#props.parseContext, lhs, op, rhs)),
28
+ queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(lhs, op, rhs)),
29
29
  });
30
30
  }
31
31
  orWhere(...args) {
32
32
  return new UpdateQueryBuilder({
33
33
  ...this.#props,
34
- queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseWhereFilter)(this.#props.parseContext, args)),
34
+ queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseWhereFilter)(args)),
35
35
  });
36
36
  }
37
37
  orWhereRef(lhs, op, rhs) {
38
38
  return new UpdateQueryBuilder({
39
39
  ...this.#props,
40
- queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(this.#props.parseContext, lhs, op, rhs)),
40
+ queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(lhs, op, rhs)),
41
41
  });
42
42
  }
43
43
  whereExists(arg) {
44
44
  return new UpdateQueryBuilder({
45
45
  ...this.#props,
46
- queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(this.#props.parseContext, arg)),
46
+ queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(arg)),
47
47
  });
48
48
  }
49
49
  whereNotExists(arg) {
50
50
  return new UpdateQueryBuilder({
51
51
  ...this.#props,
52
- queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(this.#props.parseContext, arg)),
52
+ queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(arg)),
53
53
  });
54
54
  }
55
55
  orWhereExists(arg) {
56
56
  return new UpdateQueryBuilder({
57
57
  ...this.#props,
58
- queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(this.#props.parseContext, arg)),
58
+ queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(arg)),
59
59
  });
60
60
  }
61
61
  orWhereNotExists(arg) {
62
62
  return new UpdateQueryBuilder({
63
63
  ...this.#props,
64
- queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(this.#props.parseContext, arg)),
64
+ queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(arg)),
65
65
  });
66
66
  }
67
67
  innerJoin(...args) {
68
68
  return new UpdateQueryBuilder({
69
69
  ...this.#props,
70
- queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)(this.#props.parseContext, 'InnerJoin', args)),
70
+ queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('InnerJoin', args)),
71
71
  });
72
72
  }
73
73
  leftJoin(...args) {
74
74
  return new UpdateQueryBuilder({
75
75
  ...this.#props,
76
- queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)(this.#props.parseContext, 'LeftJoin', args)),
76
+ queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('LeftJoin', args)),
77
77
  });
78
78
  }
79
79
  rightJoin(...args) {
80
80
  return new UpdateQueryBuilder({
81
81
  ...this.#props,
82
- queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)(this.#props.parseContext, 'RightJoin', args)),
82
+ queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('RightJoin', args)),
83
83
  });
84
84
  }
85
85
  fullJoin(...args) {
86
86
  return new UpdateQueryBuilder({
87
87
  ...this.#props,
88
- queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)(this.#props.parseContext, 'FullJoin', args)),
88
+ queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('FullJoin', args)),
89
89
  });
90
90
  }
91
91
  /**
92
92
  * Sets the values to update for an {@link Kysely.updateTable | update} query.
93
93
  *
94
94
  * This method takes an object whose keys are column names and values are
95
- * values to update. In addition to the column's type, the values can be `raw`
96
- * instances or select queries.
95
+ * values to update. In addition to the column's type, the values can be
96
+ * raw {@link sql} snippets or select queries.
97
97
  *
98
98
  * The return value of an update query is an instance of {@link UpdateResult}.
99
99
  * You can use the {@link returning} method on supported databases to get out
@@ -146,16 +146,18 @@ class UpdateQueryBuilder {
146
146
  * update "person" set "first_name" = $1, "last_name" = $2 where "id" = $3 returning "id"
147
147
  * ```
148
148
  *
149
- * In addition to primitives, the values can also be `raw` expressions or
149
+ * In addition to primitives, the values can also be raw sql expressions or
150
150
  * select queries:
151
151
  *
152
152
  * ```ts
153
+ * import { sql } from 'kysely'
154
+ *
153
155
  * const result = await db
154
156
  * .updateTable('person')
155
157
  * .set({
156
158
  * first_name: 'Jennifer',
157
- * last_name: db.raw('? || ?', ['Ani', 'ston']),
158
- * age: db.selectFrom('person').select(raw('avg(age)')),
159
+ * last_name: sql`${'Ani'} || ${'ston'}`,
160
+ * age: db.selectFrom('person').select(sql`avg(age)`),
159
161
  * })
160
162
  * .where('id', '=', 1)
161
163
  * .executeTakeFirst()
@@ -176,13 +178,13 @@ class UpdateQueryBuilder {
176
178
  set(row) {
177
179
  return new UpdateQueryBuilder({
178
180
  ...this.#props,
179
- queryNode: update_query_node_js_1.UpdateQueryNode.cloneWithUpdates(this.#props.queryNode, (0, update_set_parser_js_1.parseUpdateObject)(this.#props.parseContext, row)),
181
+ queryNode: update_query_node_js_1.UpdateQueryNode.cloneWithUpdates(this.#props.queryNode, (0, update_set_parser_js_1.parseUpdateObject)(row)),
180
182
  });
181
183
  }
182
184
  returning(selection) {
183
185
  return new UpdateQueryBuilder({
184
186
  ...this.#props,
185
- queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectExpressionOrList)(this.#props.parseContext, selection)),
187
+ queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectExpressionOrList)(selection)),
186
188
  });
187
189
  }
188
190
  returningAll() {
@@ -293,7 +295,7 @@ class UpdateQueryBuilder {
293
295
  const compildQuery = this.compile();
294
296
  const query = compildQuery.query;
295
297
  const result = await this.#props.executor.executeQuery(compildQuery, this.#props.queryId);
296
- if (this.#props.parseContext.adapter.supportsReturning && query.returning) {
298
+ if (this.#props.executor.adapter.supportsReturning && query.returning) {
297
299
  return result.rows;
298
300
  }
299
301
  else {
@@ -26,7 +26,7 @@ export interface WhereInterface<DB, TB extends keyof DB> {
26
26
  * ```
27
27
  *
28
28
  * Operator can be any supported operator or if the typings don't support it
29
- * you can always use `db.raw('your operator')`.
29
+ * you can always use `sql\`your operator\``.
30
30
  *
31
31
  * ```ts
32
32
  * const persons = await db
@@ -96,7 +96,7 @@ export interface WhereInterface<DB, TB extends keyof DB> {
96
96
  *
97
97
  * A `where in` query can be built by using the `in` operator and an array
98
98
  * of values. The values in the array can also be subqueries or raw
99
- * instances.
99
+ * {@link sql} expressions.
100
100
  *
101
101
  * ```ts
102
102
  * const persons = await db
@@ -112,15 +112,17 @@ export interface WhereInterface<DB, TB extends keyof DB> {
112
112
  * select * from "person" where "id" in ($1, $2, $3)
113
113
  * ```
114
114
  *
115
- * If everything else fails, you can always pass {@link Kysely.raw | raw}
115
+ * If everything else fails, you can always use the {@link sql} tag
116
116
  * as any of the arguments, including the operator:
117
117
  *
118
118
  * ```ts
119
+ * import { sql } from 'kysely'
120
+ *
119
121
  * const persons = await db
120
122
  * .selectFrom('person')
121
123
  * .selectAll()
122
124
  * .where(
123
- * db.raw('coalesce(first_name, last_name)'),
125
+ * sql`coalesce(first_name, last_name)`,
124
126
  * 'like',
125
127
  * '%' + name + '%',
126
128
  * )
@@ -155,24 +157,25 @@ export interface WhereInterface<DB, TB extends keyof DB> {
155
157
  * ```
156
158
  *
157
159
  * In all examples above the columns were known at compile time
158
- * (except for the `raw` expressions). By default kysely only allows
159
- * you to refer to columns that exist in the database **and** can be
160
- * referred to in the current query and context.
160
+ * (except for the raw {@link sql} expressions). By default kysely only
161
+ * allows you to refer to columns that exist in the database **and**
162
+ * can be referred to in the current query and context.
161
163
  *
162
164
  * Sometimes you may want to refer to columns that come from the user
163
165
  * input and thus are not available at compile time.
164
166
  *
165
- * You have two options, `db.raw` or `db.dynamic`. The example below
167
+ * You have two options, the {@link sql} tag or `db.dynamic`. The example below
166
168
  * uses both:
167
169
  *
168
170
  * ```ts
171
+ * import { sql } from 'kysely'
169
172
  * const { ref } = db.dynamic
170
173
  *
171
174
  * const persons = await db
172
175
  * .selectFrom('person')
173
176
  * .selectAll()
174
177
  * .where(ref(columnFromUserInput), '=', 1)
175
- * .orWhere(db.raw('??', [columnFromUserInput]), '=', 2)
178
+ * .orWhere(sql.id(columnFromUserInput), '=', 2)
176
179
  * .execute()
177
180
  * ```
178
181
  */
@@ -306,13 +309,14 @@ export interface WhereInterface<DB, TB extends keyof DB> {
306
309
  /**
307
310
  * Adds a `where exists` clause to the query.
308
311
  *
309
- * You can either use a subquery or a raw instance.
312
+ * You can either use a subquery or a raw {@link sql} snippet.
310
313
  *
311
314
  * ### Examples
312
315
  *
313
316
  * The query below selets all persons that own a pet named Catto:
314
317
  *
315
318
  * ```ts
319
+ * const petName = 'Catto'
316
320
  * const persons = await db
317
321
  * .selectFrom('person')
318
322
  * .selectAll()
@@ -320,7 +324,7 @@ export interface WhereInterface<DB, TB extends keyof DB> {
320
324
  * .selectFrom('pet')
321
325
  * .select('pet.id')
322
326
  * .whereRef('person.id', '=', 'pet.owner_id')
323
- * .where('pet.name', '=', 'Catto')
327
+ * .where('pet.name', '=', petName)
324
328
  * )
325
329
  * .execute()
326
330
  * ```
@@ -337,16 +341,16 @@ export interface WhereInterface<DB, TB extends keyof DB> {
337
341
  * )
338
342
  * ```
339
343
  *
340
- * The same query as in the previous example but with using raw:
344
+ * The same query as in the previous example but with using raw {@link sql}:
341
345
  *
342
346
  * ```ts
347
+ * import { sql } from 'kysely'
348
+ *
349
+ * const petName = 'Catto'
343
350
  * db.selectFrom('person')
344
351
  * .selectAll()
345
352
  * .whereExists(
346
- * db.raw(
347
- * '(select pet.id from pet where person.id = pet.owner_id and pet.name = ?)',
348
- * ['Catto']
349
- * )
353
+ * sql`(select pet.id from pet where person.id = pet.owner_id and pet.name = ${petName})`
350
354
  * )
351
355
  * ```
352
356
  *
@@ -293,7 +293,7 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
293
293
  this.visitNode(node.on);
294
294
  }
295
295
  visitRaw(node) {
296
- const { sqlFragments, params } = node;
296
+ const { sqlFragments, parameters: params } = node;
297
297
  for (let i = 0; i < sqlFragments.length; ++i) {
298
298
  this.append(sqlFragments[i]);
299
299
  if (params.length > i) {
@@ -4,10 +4,8 @@ import { DeleteQueryBuilder } from './query-builder/delete-query-builder.js';
4
4
  import { UpdateQueryBuilder } from './query-builder/update-query-builder.js';
5
5
  import { TableExpression, TableExpressionDatabase, TableExpressionTables, TableReference } from './parser/table-parser.js';
6
6
  import { QueryExecutor } from './query-executor/query-executor.js';
7
- import { RawBuilder } from './raw-builder/raw-builder.js';
8
7
  import { CommonTableExpression, QueryCreatorWithCommonTableExpression, RecursiveCommonTableExpression } from './parser/with-parser.js';
9
8
  import { WithNode } from './operation-node/with-node.js';
10
- import { ParseContext } from './parser/parse-context.js';
11
9
  import { InsertResult } from './query-builder/insert-result.js';
12
10
  import { DeleteResult } from './query-builder/delete-result.js';
13
11
  import { UpdateResult } from './query-builder/update-result.js';
@@ -73,9 +71,10 @@ export declare class QueryCreator<DB> {
73
71
  * Create a select query from raw sql:
74
72
  *
75
73
  * ```ts
76
- * const items = await db.selectFrom(
77
- * db.raw<{ one: number }>('(select 1 as one)').as('q')
78
- * )
74
+ * import { sql } from 'kysely'
75
+ *
76
+ * const items = await db
77
+ * .selectFrom(sql<{ one: number }>`(select 1 as one)`.as('q'))
79
78
  * .select('q.one')
80
79
  * .execute()
81
80
  *
@@ -91,18 +90,20 @@ export declare class QueryCreator<DB> {
91
90
  * ) as q
92
91
  * ```
93
92
  *
94
- * When you use `raw` you need to also provide the result type of the
95
- * raw segment / query so that Kysely can figure out what columns are
96
- * available for the query.
93
+ * When you use the `sql` tag you need to also provide the result type of the
94
+ * raw snippet / query so that Kysely can figure out what columns are
95
+ * available for the rest of the query.
97
96
  *
98
97
  * The `selectFrom` method also accepts an array for multiple tables. All
99
98
  * the above examples can also be used in an array.
100
99
  *
101
100
  * ```ts
101
+ * import { sql } from 'kysely'
102
+ *
102
103
  * const items = await db.selectFrom([
103
104
  * 'person as p',
104
105
  * db.selectFrom('pet').select('pet.species').as('a'),
105
- * db.raw<{ one: number }>('(select 1 as one)').as('q')
106
+ * sql<{ one: number }>`(select 1 as one)`.as('q')
106
107
  * ])
107
108
  * .select(['p.id', 'a.species', 'q.one'])
108
109
  * .execute()
@@ -299,128 +300,8 @@ export declare class QueryCreator<DB> {
299
300
  * ```
300
301
  */
301
302
  withSchema(schema: string): QueryCreator<DB>;
302
- /**
303
- * Provides a way to pass arbitrary SQL into your query and executing completely
304
- * raw queries.
305
- *
306
- * You can use the strings `?` and `??` in the `sql` to bind parameters such as
307
- * user input to the SQL. You should never EVER concatenate untrusted user
308
- * input to the SQL string to avoid injection vulnerabilities. Instead use `?`
309
- * in place of a value and pass the actual value in the `parameters` list. See
310
- * the examples below.
311
- *
312
- * You should only use `raw` when there is no other way to get the job done. This is
313
- * because Kysely is not able to use type inference when you use raw SQL. For example
314
- * Kysely won't be able to automatically provide you with the correct query result
315
- * type. However, there are ways to manually provide types when you use `raw` in most
316
- * cases. See the examples below.
317
- *
318
- * Raw builder instances can be passed to pretty much anywhere: `select`, `where`,
319
- * `*Join`, `groupBy`, `orderBy` etc. Just try it. If the method accepts it, it works.
320
- *
321
- * ### Examples
322
- *
323
- * Example of using `raw` in a select statement:
324
- *
325
- * ```ts
326
- * const [person] = await db.selectFrom('person')
327
- * .select(db.raw<string>('concat(first_name, ' ', last_name)').as('name'))
328
- * .where('id', '=', 1)
329
- * .execute()
330
- *
331
- * console.log(person.name)
332
- * ```
333
- *
334
- * The generated SQL (PostgreSQL):
335
- *
336
- * ```sql
337
- * select concat(first_name, ' ', last_name) as "name"
338
- * from "person" where "id" = 1
339
- * ```
340
- *
341
- * The above example selects computed column `name` by concatenating the first name
342
- * and last name together.
343
- *
344
- * There are couple of things worth noticing:
345
- *
346
- * 1. You need to provide the output type of your SQL segment for the `raw` method
347
- * so that Kysely knows what type to give for the `name` column. In this case it's
348
- * a `string` since that's the output type of the `concat` function in SQL.
349
- *
350
- * 2. You need to give an alias for the selection using the `as` method so that
351
- * Kysely is able to add a column to the output type. The alias needs to be
352
- * known at compile time! If you pass a string variable whose value is not known
353
- * at compile time, there is no way for Kysely or typescript to add a column to
354
- * the output type. In this case you need to use the `castTo` method on the query
355
- * to specify a return type for the query.
356
- *
357
- * We could've also used a `??` placeholder to provide `first_name` and `last_name` like
358
- * this:
359
- *
360
- * ```ts
361
- * db.raw<string>('concat(??, ' ', ??)', ['first_name', 'last_name'])
362
- * ```
363
- *
364
- * or this:
365
- *
366
- * ```ts
367
- * db.raw<string>('concat(??, ' ', ??)', ['person.first_name', 'person.last_name'])
368
- * ```
369
- *
370
- * But it's often cleaner to just write the column names in the SQL. Again remember to
371
- * never concatenate column names or any other untrusted user input to the SQL string or you
372
- * are going to create an injection vulnerability. All user input should go to the parameters
373
- * array, never to the SQL string directly. But if the column names or values are trusted
374
- * and known at compile time, there is no reason to use parameters.
375
- *
376
- * Example of using `raw` in `where`:
377
- *
378
- * ```ts
379
- * function getPersonsOlderThan(ageLimit: number) {
380
- * return await db.selectFrom('person')
381
- * .selectAll()
382
- * .where(
383
- * db.raw('now() - birth_date'),
384
- * '>',
385
- * db.raw('interval ? year', [ageLimit.toString()])
386
- * )
387
- * .execute()
388
- * }
389
- * ```
390
- *
391
- * The generated SQL (PostgreSQL):
392
- *
393
- * ```sql
394
- * select * from "person" where now() - birth_date > interval $1 year
395
- * ```
396
- *
397
- * The function in the above example returns people that are older than the given number of
398
- * years. The number of years in this example is an untrusted user input, and therefore we use
399
- * a `?` placeholder for it.
400
- *
401
- * Example of creating a completely raw query from scratch:
402
- *
403
- * ```ts
404
- * const result = await db.raw<Person>('select p.* from person p').execute()
405
- * const persons = result.rows
406
- * ```
407
- *
408
- * For a raw query, you need to specify the type of the returned __row__. In
409
- * this case we know the resulting items will be of type `Person` se specify that.
410
- * The result of `execute()` method is always an array. In this case the type of
411
- * the `persons` variable is `Person[]`.
412
- *
413
- * @param sql - The raw SQL. Special strings `?` and `??` can be used as parameter
414
- * placeholders. `?` for values and `??` for identifiers such as column names
415
- * or `column.table` references.
416
- *
417
- * @param params - The parameters that will be bound to the `?` and `??` placeholders in
418
- * the sql string.
419
- */
420
- raw<T = unknown>(sql: string, parameters?: unknown[]): RawBuilder<T>;
421
303
  }
422
304
  export interface QueryCreatorProps {
423
305
  readonly executor: QueryExecutor;
424
- readonly parseContext: ParseContext;
425
306
  readonly withNode?: WithNode;
426
307
  }