kysely 0.16.11 → 0.17.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) 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-dialect-config.d.ts +19 -0
  4. package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -1
  5. package/dist/cjs/dialect/postgres/postgres-adapter.js +3 -2
  6. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +2 -1
  7. package/dist/cjs/driver/connection-provider.d.ts +1 -1
  8. package/dist/cjs/driver/default-connection-provider.d.ts +1 -1
  9. package/dist/cjs/driver/default-connection-provider.js +2 -2
  10. package/dist/cjs/driver/dummy-driver.d.ts +8 -0
  11. package/dist/cjs/driver/dummy-driver.js +8 -0
  12. package/dist/cjs/driver/single-connection-provider.d.ts +1 -1
  13. package/dist/cjs/driver/single-connection-provider.js +2 -2
  14. package/dist/cjs/index-nodeless.d.ts +2 -0
  15. package/dist/cjs/index-nodeless.js +2 -0
  16. package/dist/cjs/kysely.d.ts +3 -6
  17. package/dist/cjs/kysely.js +30 -41
  18. package/dist/cjs/migration/migrator.js +4 -4
  19. package/dist/cjs/operation-node/operation-node-transformer.js +1 -1
  20. package/dist/cjs/operation-node/raw-node.d.ts +4 -2
  21. package/dist/cjs/operation-node/raw-node.js +8 -2
  22. package/dist/cjs/parser/complex-expression-parser.d.ts +5 -5
  23. package/dist/cjs/parser/complex-expression-parser.js +5 -4
  24. package/dist/cjs/parser/filter-parser.d.ts +9 -9
  25. package/dist/cjs/parser/filter-parser.js +31 -30
  26. package/dist/cjs/parser/group-by-parser.d.ts +1 -2
  27. package/dist/cjs/parser/group-by-parser.js +2 -2
  28. package/dist/cjs/parser/insert-values-parser.d.ts +1 -2
  29. package/dist/cjs/parser/insert-values-parser.js +6 -6
  30. package/dist/cjs/parser/join-parser.d.ts +1 -2
  31. package/dist/cjs/parser/join-parser.js +8 -7
  32. package/dist/cjs/parser/order-by-parser.d.ts +1 -2
  33. package/dist/cjs/parser/order-by-parser.js +4 -4
  34. package/dist/cjs/parser/parse-utils.d.ts +10 -0
  35. package/dist/cjs/parser/parse-utils.js +38 -0
  36. package/dist/cjs/parser/reference-parser.d.ts +2 -3
  37. package/dist/cjs/parser/reference-parser.js +5 -5
  38. package/dist/cjs/parser/select-parser.d.ts +1 -2
  39. package/dist/cjs/parser/select-parser.js +5 -5
  40. package/dist/cjs/parser/table-parser.d.ts +2 -3
  41. package/dist/cjs/parser/table-parser.js +5 -5
  42. package/dist/cjs/parser/update-set-parser.d.ts +1 -2
  43. package/dist/cjs/parser/update-set-parser.js +2 -2
  44. package/dist/cjs/parser/value-parser.d.ts +3 -4
  45. package/dist/cjs/parser/value-parser.js +7 -7
  46. package/dist/cjs/parser/with-parser.d.ts +1 -2
  47. package/dist/cjs/parser/with-parser.js +3 -2
  48. package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.d.ts +2 -1
  49. package/dist/cjs/query-builder/delete-query-builder.d.ts +34 -23
  50. package/dist/cjs/query-builder/delete-query-builder.js +15 -15
  51. package/dist/cjs/query-builder/expression-builder.d.ts +4 -13
  52. package/dist/cjs/query-builder/expression-builder.js +12 -21
  53. package/dist/cjs/query-builder/function-builder.d.ts +2 -6
  54. package/dist/cjs/query-builder/function-builder.js +5 -8
  55. package/dist/cjs/query-builder/insert-query-builder.d.ts +12 -8
  56. package/dist/cjs/query-builder/insert-query-builder.js +8 -7
  57. package/dist/cjs/query-builder/join-builder.d.ts +0 -2
  58. package/dist/cjs/query-builder/join-builder.js +8 -8
  59. package/dist/cjs/query-builder/on-conflict-builder.d.ts +46 -28
  60. package/dist/cjs/query-builder/on-conflict-builder.js +17 -17
  61. package/dist/cjs/query-builder/returning-interface.d.ts +3 -1
  62. package/dist/cjs/query-builder/select-query-builder.d.ts +52 -33
  63. package/dist/cjs/query-builder/select-query-builder.js +28 -26
  64. package/dist/cjs/query-builder/update-query-builder.d.ts +41 -28
  65. package/dist/cjs/query-builder/update-query-builder.js +22 -20
  66. package/dist/cjs/query-builder/where-interface.d.ts +31 -20
  67. package/dist/cjs/query-compiler/default-query-compiler.js +1 -1
  68. package/dist/cjs/query-creator.d.ts +10 -129
  69. package/dist/cjs/query-creator.js +5 -136
  70. package/dist/cjs/query-executor/default-query-executor.d.ts +21 -7
  71. package/dist/cjs/query-executor/default-query-executor.js +17 -19
  72. package/dist/cjs/query-executor/noop-query-executor.d.ts +20 -6
  73. package/dist/cjs/query-executor/noop-query-executor.js +11 -4
  74. package/dist/cjs/query-executor/query-executor-base.d.ts +62 -0
  75. package/dist/cjs/query-executor/query-executor-base.js +46 -0
  76. package/dist/cjs/query-executor/query-executor-provider.d.ts +8 -0
  77. package/dist/cjs/query-executor/query-executor-provider.js +2 -0
  78. package/dist/cjs/query-executor/query-executor.d.ts +20 -13
  79. package/dist/cjs/query-executor/query-executor.js +0 -57
  80. package/dist/cjs/raw-builder/raw-builder.d.ts +42 -11
  81. package/dist/cjs/raw-builder/raw-builder.js +55 -56
  82. package/dist/cjs/raw-builder/sql.d.ts +331 -0
  83. package/dist/cjs/raw-builder/sql.js +161 -0
  84. package/dist/cjs/schema/alter-table-builder.d.ts +42 -8
  85. package/dist/cjs/schema/alter-table-builder.js +20 -0
  86. package/dist/cjs/schema/column-definition-builder.d.ts +22 -8
  87. package/dist/cjs/schema/create-index-builder.d.ts +3 -1
  88. package/dist/cjs/schema/create-index-builder.js +3 -1
  89. package/dist/cjs/schema/create-table-builder.d.ts +7 -3
  90. package/dist/cjs/schema/create-table-builder.js +7 -3
  91. package/dist/cjs/schema/create-view-builder.d.ts +3 -3
  92. package/dist/cjs/schema/create-view-builder.js +3 -3
  93. package/dist/cjs/util/query-id.js +10 -4
  94. package/dist/cjs/util/random-string.js +65 -2
  95. package/dist/cjs/util/type-utils.d.ts +1 -1
  96. package/dist/esm/dialect/mysql/mysql-adapter.js +3 -4
  97. package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +19 -0
  98. package/dist/esm/dialect/mysql/mysql-introspector.js +2 -1
  99. package/dist/esm/dialect/postgres/postgres-adapter.js +3 -2
  100. package/dist/esm/dialect/sqlite/sqlite-introspector.js +2 -1
  101. package/dist/esm/driver/connection-provider.d.ts +1 -1
  102. package/dist/esm/driver/default-connection-provider.d.ts +1 -1
  103. package/dist/esm/driver/default-connection-provider.js +2 -2
  104. package/dist/esm/driver/dummy-driver.d.ts +8 -0
  105. package/dist/esm/driver/dummy-driver.js +8 -0
  106. package/dist/esm/driver/single-connection-provider.d.ts +1 -1
  107. package/dist/esm/driver/single-connection-provider.js +2 -2
  108. package/dist/esm/index-nodeless.d.ts +2 -0
  109. package/dist/esm/index-nodeless.js +2 -0
  110. package/dist/esm/kysely.d.ts +3 -6
  111. package/dist/esm/kysely.js +30 -41
  112. package/dist/esm/migration/migrator.js +4 -4
  113. package/dist/esm/operation-node/operation-node-transformer.js +1 -1
  114. package/dist/esm/operation-node/raw-node.d.ts +4 -2
  115. package/dist/esm/operation-node/raw-node.js +8 -2
  116. package/dist/esm/parser/complex-expression-parser.d.ts +5 -5
  117. package/dist/esm/parser/complex-expression-parser.js +5 -4
  118. package/dist/esm/parser/filter-parser.d.ts +9 -9
  119. package/dist/esm/parser/filter-parser.js +31 -30
  120. package/dist/esm/parser/group-by-parser.d.ts +1 -2
  121. package/dist/esm/parser/group-by-parser.js +2 -2
  122. package/dist/esm/parser/insert-values-parser.d.ts +1 -2
  123. package/dist/esm/parser/insert-values-parser.js +6 -6
  124. package/dist/esm/parser/join-parser.d.ts +1 -2
  125. package/dist/esm/parser/join-parser.js +8 -7
  126. package/dist/esm/parser/order-by-parser.d.ts +1 -2
  127. package/dist/esm/parser/order-by-parser.js +4 -4
  128. package/dist/esm/parser/parse-utils.d.ts +10 -0
  129. package/dist/esm/parser/parse-utils.js +32 -0
  130. package/dist/esm/parser/reference-parser.d.ts +2 -3
  131. package/dist/esm/parser/reference-parser.js +5 -5
  132. package/dist/esm/parser/select-parser.d.ts +1 -2
  133. package/dist/esm/parser/select-parser.js +5 -5
  134. package/dist/esm/parser/table-parser.d.ts +2 -3
  135. package/dist/esm/parser/table-parser.js +5 -5
  136. package/dist/esm/parser/update-set-parser.d.ts +1 -2
  137. package/dist/esm/parser/update-set-parser.js +2 -2
  138. package/dist/esm/parser/value-parser.d.ts +3 -4
  139. package/dist/esm/parser/value-parser.js +7 -7
  140. package/dist/esm/parser/with-parser.d.ts +1 -2
  141. package/dist/esm/parser/with-parser.js +3 -2
  142. package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.d.ts +2 -1
  143. package/dist/esm/query-builder/delete-query-builder.d.ts +34 -23
  144. package/dist/esm/query-builder/delete-query-builder.js +15 -15
  145. package/dist/esm/query-builder/expression-builder.d.ts +4 -13
  146. package/dist/esm/query-builder/expression-builder.js +12 -21
  147. package/dist/esm/query-builder/function-builder.d.ts +2 -6
  148. package/dist/esm/query-builder/function-builder.js +5 -8
  149. package/dist/esm/query-builder/insert-query-builder.d.ts +12 -8
  150. package/dist/esm/query-builder/insert-query-builder.js +8 -7
  151. package/dist/esm/query-builder/join-builder.d.ts +0 -2
  152. package/dist/esm/query-builder/join-builder.js +8 -8
  153. package/dist/esm/query-builder/on-conflict-builder.d.ts +46 -28
  154. package/dist/esm/query-builder/on-conflict-builder.js +17 -17
  155. package/dist/esm/query-builder/returning-interface.d.ts +3 -1
  156. package/dist/esm/query-builder/select-query-builder.d.ts +52 -33
  157. package/dist/esm/query-builder/select-query-builder.js +28 -26
  158. package/dist/esm/query-builder/update-query-builder.d.ts +41 -28
  159. package/dist/esm/query-builder/update-query-builder.js +22 -20
  160. package/dist/esm/query-builder/where-interface.d.ts +31 -20
  161. package/dist/esm/query-compiler/default-query-compiler.js +1 -1
  162. package/dist/esm/query-creator.d.ts +10 -129
  163. package/dist/esm/query-creator.js +5 -136
  164. package/dist/esm/query-executor/default-query-executor.d.ts +21 -7
  165. package/dist/esm/query-executor/default-query-executor.js +17 -19
  166. package/dist/esm/query-executor/noop-query-executor.d.ts +20 -6
  167. package/dist/esm/query-executor/noop-query-executor.js +10 -3
  168. package/dist/esm/query-executor/query-executor-base.d.ts +62 -0
  169. package/dist/esm/query-executor/query-executor-base.js +43 -0
  170. package/dist/esm/query-executor/query-executor-provider.d.ts +8 -0
  171. package/dist/esm/query-executor/query-executor-provider.js +2 -0
  172. package/dist/esm/query-executor/query-executor.d.ts +20 -13
  173. package/dist/esm/query-executor/query-executor.js +1 -55
  174. package/dist/esm/raw-builder/raw-builder.d.ts +42 -11
  175. package/dist/esm/raw-builder/raw-builder.js +56 -57
  176. package/dist/esm/raw-builder/sql.d.ts +331 -0
  177. package/dist/esm/raw-builder/sql.js +159 -0
  178. package/dist/esm/schema/alter-table-builder.d.ts +42 -8
  179. package/dist/esm/schema/alter-table-builder.js +20 -0
  180. package/dist/esm/schema/column-definition-builder.d.ts +22 -8
  181. package/dist/esm/schema/create-index-builder.d.ts +3 -1
  182. package/dist/esm/schema/create-index-builder.js +3 -1
  183. package/dist/esm/schema/create-table-builder.d.ts +7 -3
  184. package/dist/esm/schema/create-table-builder.js +7 -3
  185. package/dist/esm/schema/create-view-builder.d.ts +3 -3
  186. package/dist/esm/schema/create-view-builder.js +3 -3
  187. package/dist/esm/util/query-id.js +10 -4
  188. package/dist/esm/util/random-string.js +65 -2
  189. package/dist/esm/util/type-utils.d.ts +1 -1
  190. package/package.json +14 -14
  191. package/dist/cjs/parser/parse-context.d.ts +0 -55
  192. package/dist/cjs/parser/parse-context.js +0 -50
  193. package/dist/cjs/util/private-symbols.d.ts +0 -5
  194. package/dist/cjs/util/private-symbols.js +0 -8
  195. package/dist/esm/parser/parse-context.d.ts +0 -55
  196. package/dist/esm/parser/parse-context.js +0 -47
  197. package/dist/esm/util/private-symbols.d.ts +0 -5
  198. package/dist/esm/util/private-symbols.js +0 -6
@@ -10,7 +10,6 @@ import { AnyRawBuilder, MergePartial, SingleResultType } from '../util/type-util
10
10
  import { Compilable } from '../util/compilable.js';
11
11
  import { QueryExecutor } from '../query-executor/query-executor.js';
12
12
  import { QueryId } from '../util/query-id.js';
13
- import { ParseContext } from '../parser/parse-context.js';
14
13
  import { KyselyPlugin } from '../plugin/kysely-plugin.js';
15
14
  import { WhereInterface } from './where-interface.js';
16
15
  import { JoinInterface } from './join-interface.js';
@@ -47,7 +46,13 @@ export declare class DeleteQueryBuilder<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
50
+ *
51
+ * ```ts
52
+ * sql`your operator`
53
+ * ```
54
+ *
55
+ * The next example uses the `>` operator:
51
56
  *
52
57
  * ```ts
53
58
  * const persons = await db
@@ -63,8 +68,8 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
63
68
  * select * from "person" where "id" > $1
64
69
  * ```
65
70
  *
66
- * The `where` methods don't change the type of the query. You can add
67
- * conditional `where`s easily by doing something like this:
71
+ * `where` methods don't change the type of the query. You can add
72
+ * conditional statements easily by doing something like this:
68
73
  *
69
74
  * ```ts
70
75
  * let query = db
@@ -72,6 +77,8 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
72
77
  * .selectAll()
73
78
  *
74
79
  * if (firstName) {
80
+ * // The query builder is immutable. Remember to reassign
81
+ * // the result back to the query variable.
75
82
  * query = query.where('first_name', '=', firstName)
76
83
  * }
77
84
  *
@@ -79,8 +86,7 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
79
86
  * ```
80
87
  *
81
88
  * This is true for basically all methods execpt the `select` and
82
- * `returning` methods, which DO change the return type of the
83
- * query.
89
+ * `returning`, that __do__ change the return type of the query.
84
90
  *
85
91
  * Both the first and third argument can also be subqueries.
86
92
  * A subquery is defined by passing a function and calling
@@ -117,7 +123,7 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
117
123
  *
118
124
  * A `where in` query can be built by using the `in` operator and an array
119
125
  * of values. The values in the array can also be subqueries or raw
120
- * instances.
126
+ * {@link sql} expressions.
121
127
  *
122
128
  * ```ts
123
129
  * const persons = await db
@@ -133,15 +139,17 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
133
139
  * select * from "person" where "id" in ($1, $2, $3)
134
140
  * ```
135
141
  *
136
- * If everything else fails, you can always pass {@link Kysely.raw | raw}
142
+ * If everything else fails, you can always use the {@link sql} tag
137
143
  * as any of the arguments, including the operator:
138
144
  *
139
145
  * ```ts
146
+ * import { sql } from 'kysely'
147
+ *
140
148
  * const persons = await db
141
149
  * .selectFrom('person')
142
150
  * .selectAll()
143
151
  * .where(
144
- * db.raw('coalesce(first_name, last_name)'),
152
+ * sql`coalesce(first_name, last_name)`,
145
153
  * 'like',
146
154
  * '%' + name + '%',
147
155
  * )
@@ -176,24 +184,25 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
176
184
  * ```
177
185
  *
178
186
  * 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.
187
+ * (except for the raw {@link sql} expressions). By default kysely only
188
+ * allows you to refer to columns that exist in the database **and**
189
+ * can be referred to in the current query and context.
182
190
  *
183
191
  * Sometimes you may want to refer to columns that come from the user
184
192
  * input and thus are not available at compile time.
185
193
  *
186
- * You have two options, `db.raw` or `db.dynamic`. The example below
194
+ * You have two options, the {@link sql} tag or `db.dynamic`. The example below
187
195
  * uses both:
188
196
  *
189
197
  * ```ts
198
+ * import { sql } from 'kysely'
190
199
  * const { ref } = db.dynamic
191
200
  *
192
201
  * const persons = await db
193
202
  * .selectFrom('person')
194
203
  * .selectAll()
195
204
  * .where(ref(columnFromUserInput), '=', 1)
196
- * .orWhere(db.raw('??', [columnFromUserInput]), '=', 2)
205
+ * .orWhere(sql.id(columnFromUserInput), '=', 2)
197
206
  * .execute()
198
207
  * ```
199
208
  */
@@ -327,13 +336,14 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
327
336
  /**
328
337
  * Adds a `where exists` clause to the query.
329
338
  *
330
- * You can either use a subquery or a raw instance.
339
+ * You can either use a subquery or a raw {@link sql} snippet.
331
340
  *
332
341
  * ### Examples
333
342
  *
334
343
  * The query below selets all persons that own a pet named Catto:
335
344
  *
336
345
  * ```ts
346
+ * const petName = 'Catto'
337
347
  * const persons = await db
338
348
  * .selectFrom('person')
339
349
  * .selectAll()
@@ -341,7 +351,7 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
341
351
  * .selectFrom('pet')
342
352
  * .select('pet.id')
343
353
  * .whereRef('person.id', '=', 'pet.owner_id')
344
- * .where('pet.name', '=', 'Catto')
354
+ * .where('pet.name', '=', petName)
345
355
  * )
346
356
  * .execute()
347
357
  * ```
@@ -358,16 +368,16 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
358
368
  * )
359
369
  * ```
360
370
  *
361
- * The same query as in the previous example but with using raw:
371
+ * The same query as in the previous example but with using raw {@link sql}:
362
372
  *
363
373
  * ```ts
374
+ * import { sql } from 'kysely'
375
+ *
376
+ * const petName = 'Catto'
364
377
  * db.selectFrom('person')
365
378
  * .selectAll()
366
379
  * .whereExists(
367
- * db.raw(
368
- * '(select pet.id from pet where person.id = pet.owner_id and pet.name = ?)',
369
- * ['Catto']
370
- * )
380
+ * sql`(select pet.id from pet where person.id = pet.owner_id and pet.name = ${petName})`
371
381
  * )
372
382
  * ```
373
383
  *
@@ -565,6 +575,8 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
565
575
  * Return arbitrary expressions:
566
576
  *
567
577
  * ```ts
578
+ * import { sql } from 'kysely'
579
+ *
568
580
  * const { id, full_name, first_pet_id } = await db
569
581
  * .insertInto('person')
570
582
  * .values({
@@ -573,7 +585,7 @@ export declare class DeleteQueryBuilder<DB, TB extends keyof DB, O> implements W
573
585
  * })
574
586
  * .returning([
575
587
  * 'id as id',
576
- * db.raw<string>(`concat(first_name, ' ', last_name)`).as('full_name'),
588
+ * sql<string>`concat(first_name, ' ', last_name)`.as('full_name'),
577
589
  * (qb) => qb.selectFrom('pets').select('pet.id').limit(1).as('first_pet_id')
578
590
  * ])
579
591
  * .executeTakeFirst()
@@ -736,5 +748,4 @@ export interface DeleteQueryBuilderProps {
736
748
  readonly queryId: QueryId;
737
749
  readonly queryNode: DeleteQueryNode;
738
750
  readonly executor: QueryExecutor;
739
- readonly parseContext: ParseContext;
740
751
  }
@@ -20,79 +20,79 @@ class DeleteQueryBuilder {
20
20
  where(...args) {
21
21
  return new DeleteQueryBuilder({
22
22
  ...this.#props,
23
- queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseWhereFilter)(this.#props.parseContext, args)),
23
+ queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseWhereFilter)(args)),
24
24
  });
25
25
  }
26
26
  whereRef(lhs, op, rhs) {
27
27
  return new DeleteQueryBuilder({
28
28
  ...this.#props,
29
- queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(this.#props.parseContext, lhs, op, rhs)),
29
+ queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(lhs, op, rhs)),
30
30
  });
31
31
  }
32
32
  orWhere(...args) {
33
33
  return new DeleteQueryBuilder({
34
34
  ...this.#props,
35
- queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseWhereFilter)(this.#props.parseContext, args)),
35
+ queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseWhereFilter)(args)),
36
36
  });
37
37
  }
38
38
  orWhereRef(lhs, op, rhs) {
39
39
  return new DeleteQueryBuilder({
40
40
  ...this.#props,
41
- queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(this.#props.parseContext, lhs, op, rhs)),
41
+ queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(lhs, op, rhs)),
42
42
  });
43
43
  }
44
44
  whereExists(arg) {
45
45
  return new DeleteQueryBuilder({
46
46
  ...this.#props,
47
- queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(this.#props.parseContext, arg)),
47
+ queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(arg)),
48
48
  });
49
49
  }
50
50
  whereNotExists(arg) {
51
51
  return new DeleteQueryBuilder({
52
52
  ...this.#props,
53
- queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(this.#props.parseContext, arg)),
53
+ queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(arg)),
54
54
  });
55
55
  }
56
56
  orWhereExists(arg) {
57
57
  return new DeleteQueryBuilder({
58
58
  ...this.#props,
59
- queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(this.#props.parseContext, arg)),
59
+ queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(arg)),
60
60
  });
61
61
  }
62
62
  orWhereNotExists(arg) {
63
63
  return new DeleteQueryBuilder({
64
64
  ...this.#props,
65
- queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(this.#props.parseContext, arg)),
65
+ queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(arg)),
66
66
  });
67
67
  }
68
68
  innerJoin(...args) {
69
69
  return new DeleteQueryBuilder({
70
70
  ...this.#props,
71
- queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)(this.#props.parseContext, 'InnerJoin', args)),
71
+ queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('InnerJoin', args)),
72
72
  });
73
73
  }
74
74
  leftJoin(...args) {
75
75
  return new DeleteQueryBuilder({
76
76
  ...this.#props,
77
- queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)(this.#props.parseContext, 'LeftJoin', args)),
77
+ queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('LeftJoin', args)),
78
78
  });
79
79
  }
80
80
  rightJoin(...args) {
81
81
  return new DeleteQueryBuilder({
82
82
  ...this.#props,
83
- queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)(this.#props.parseContext, 'RightJoin', args)),
83
+ queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('RightJoin', args)),
84
84
  });
85
85
  }
86
86
  fullJoin(...args) {
87
87
  return new DeleteQueryBuilder({
88
88
  ...this.#props,
89
- queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)(this.#props.parseContext, 'FullJoin', args)),
89
+ queryNode: query_node_js_1.QueryNode.cloneWithJoin(this.#props.queryNode, (0, join_parser_js_1.parseJoin)('FullJoin', args)),
90
90
  });
91
91
  }
92
92
  returning(selection) {
93
93
  return new DeleteQueryBuilder({
94
94
  ...this.#props,
95
- queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectExpressionOrList)(this.#props.parseContext, selection)),
95
+ queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectExpressionOrList)(selection)),
96
96
  });
97
97
  }
98
98
  returningAll() {
@@ -138,7 +138,7 @@ class DeleteQueryBuilder {
138
138
  orderBy(orderBy, direction) {
139
139
  return new DeleteQueryBuilder({
140
140
  ...this.#props,
141
- queryNode: delete_query_node_js_1.DeleteQueryNode.cloneWithOrderByItem(this.#props.queryNode, (0, order_by_parser_js_1.parseOrderBy)(this.#props.parseContext, orderBy, direction)),
141
+ queryNode: delete_query_node_js_1.DeleteQueryNode.cloneWithOrderByItem(this.#props.queryNode, (0, order_by_parser_js_1.parseOrderBy)(orderBy, direction)),
142
142
  });
143
143
  }
144
144
  /**
@@ -265,7 +265,7 @@ class DeleteQueryBuilder {
265
265
  const compildQuery = this.compile();
266
266
  const query = compildQuery.query;
267
267
  const result = await this.#props.executor.executeQuery(compildQuery, this.#props.queryId);
268
- if (this.#props.parseContext.adapter.supportsReturning && query.returning) {
268
+ if (this.#props.executor.adapter.supportsReturning && query.returning) {
269
269
  return result.rows;
270
270
  }
271
271
  else {
@@ -1,10 +1,9 @@
1
1
  import { SelectQueryBuilder } from './select-query-builder.js';
2
2
  import { TableExpression, TableExpressionDatabase, TableExpressionTables } from '../parser/table-parser.js';
3
- import { NoopQueryExecutor } from '../query-executor/noop-query-executor.js';
4
- import { ParseContext } from '../parser/parse-context.js';
5
3
  import { FunctionBuilder } from './function-builder.js';
6
4
  import { ExtractTypeFromReferenceExpression, StringReference } from '../parser/reference-parser.js';
7
5
  import { RawBuilder } from '../raw-builder/raw-builder.js';
6
+ import { QueryExecutor } from '../query-executor/query-executor.js';
8
7
  export declare class ExpressionBuilder<DB, TB extends keyof DB> {
9
8
  #private;
10
9
  constructor(props: ExpressionBuilderProps);
@@ -90,10 +89,6 @@ export declare class ExpressionBuilder<DB, TB extends keyof DB> {
90
89
  * See {@link QueryCreator.withSchema}
91
90
  */
92
91
  withSchema(schema: string): ExpressionBuilder<DB, TB>;
93
- /**
94
- * See {@link QueryCreator.raw}.
95
- */
96
- raw<T = unknown>(sql: string, parameters?: unknown[]): RawBuilder<T>;
97
92
  /**
98
93
  * This can be used to reference columns.
99
94
  *
@@ -115,21 +110,17 @@ export declare class ExpressionBuilder<DB, TB extends keyof DB> {
115
110
  * )
116
111
  * ```
117
112
  *
118
- * In the next example we use `ref` in a raw expression. Unless you
113
+ * In the next example we use `ref` in a raw sql expression. Unless you
119
114
  * want to be as type-safe as possible, this is probably overkill:
120
115
  *
121
116
  * ```ts
122
117
  * db.update('pet').set({
123
- * name: (eb) => eb.raw('concat(?, ?)', [
124
- * eb.ref('pet.name'),
125
- * suffix,
126
- * ])
118
+ * name: (eb) => sql`concat(${eb.ref('pet.name')}, ${suffix})`
127
119
  * })
128
120
  * ```
129
121
  */
130
122
  ref<RE extends StringReference<DB, TB>>(reference: RE): RawBuilder<ExtractTypeFromReferenceExpression<DB, TB, RE>>;
131
123
  }
132
124
  export interface ExpressionBuilderProps {
133
- readonly executor: NoopQueryExecutor;
134
- readonly parseContext: ParseContext;
125
+ readonly executor: QueryExecutor;
135
126
  }
@@ -6,9 +6,11 @@ const select_query_node_js_1 = require("../operation-node/select-query-node.js")
6
6
  const table_parser_js_1 = require("../parser/table-parser.js");
7
7
  const with_schema_plugin_js_1 = require("../plugin/with-schema/with-schema-plugin.js");
8
8
  const query_id_js_1 = require("../util/query-id.js");
9
- const object_utils_js_1 = require("../util/object-utils.js");
10
9
  const function_builder_js_1 = require("./function-builder.js");
10
+ const reference_parser_js_1 = require("../parser/reference-parser.js");
11
11
  const raw_builder_js_1 = require("../raw-builder/raw-builder.js");
12
+ const object_utils_js_1 = require("../util/object-utils.js");
13
+ const raw_node_js_1 = require("../operation-node/raw-node.js");
12
14
  class ExpressionBuilder {
13
15
  #props;
14
16
  constructor(props) {
@@ -46,14 +48,13 @@ class ExpressionBuilder {
46
48
  * ```
47
49
  */
48
50
  get fn() {
49
- return new function_builder_js_1.FunctionBuilder({ executor: this.#props.executor });
51
+ return new function_builder_js_1.FunctionBuilder();
50
52
  }
51
53
  selectFrom(table) {
52
54
  return new select_query_builder_js_1.SelectQueryBuilder({
53
55
  queryId: (0, query_id_js_1.createQueryId)(),
54
56
  executor: this.#props.executor,
55
- parseContext: this.#props.parseContext,
56
- queryNode: select_query_node_js_1.SelectQueryNode.create((0, table_parser_js_1.parseTableExpressionOrList)(this.#props.parseContext, table)),
57
+ queryNode: select_query_node_js_1.SelectQueryNode.create((0, table_parser_js_1.parseTableExpressionOrList)(table)),
57
58
  });
58
59
  }
59
60
  /**
@@ -65,17 +66,6 @@ class ExpressionBuilder {
65
66
  executor: this.#props.executor.withPluginAtFront(new with_schema_plugin_js_1.WithSchemaPlugin(schema)),
66
67
  });
67
68
  }
68
- /**
69
- * See {@link QueryCreator.raw}.
70
- */
71
- raw(sql, parameters) {
72
- return new raw_builder_js_1.RawBuilder({
73
- queryId: (0, query_id_js_1.createQueryId)(),
74
- executor: this.#props.executor,
75
- sql,
76
- parameters,
77
- });
78
- }
79
69
  /**
80
70
  * This can be used to reference columns.
81
71
  *
@@ -97,20 +87,21 @@ class ExpressionBuilder {
97
87
  * )
98
88
  * ```
99
89
  *
100
- * In the next example we use `ref` in a raw expression. Unless you
90
+ * In the next example we use `ref` in a raw sql expression. Unless you
101
91
  * want to be as type-safe as possible, this is probably overkill:
102
92
  *
103
93
  * ```ts
104
94
  * db.update('pet').set({
105
- * name: (eb) => eb.raw('concat(?, ?)', [
106
- * eb.ref('pet.name'),
107
- * suffix,
108
- * ])
95
+ * name: (eb) => sql`concat(${eb.ref('pet.name')}, ${suffix})`
109
96
  * })
110
97
  * ```
111
98
  */
112
99
  ref(reference) {
113
- return this.raw('??', [reference]);
100
+ return new raw_builder_js_1.RawBuilder({
101
+ queryId: (0, query_id_js_1.createQueryId)(),
102
+ plugins: this.#props.executor.plugins,
103
+ rawNode: raw_node_js_1.RawNode.createWithChild((0, reference_parser_js_1.parseStringReference)(reference)),
104
+ });
114
105
  }
115
106
  }
116
107
  exports.ExpressionBuilder = ExpressionBuilder;
@@ -1,10 +1,9 @@
1
1
  import { StringReference, ExtractTypeFromReferenceExpression } from '../parser/reference-parser.js';
2
- import { QueryExecutor } from '../query-executor/query-executor.js';
3
2
  import { RawBuilder } from '../raw-builder/raw-builder.js';
4
3
  /**
5
4
  * Helpers for type safe SQL function calls.
6
5
  *
7
- * You can always use {@link Kysely.raw} to call functions and build arbitrary
6
+ * You can always use the {@link sql} tag to call functions and build arbitrary
8
7
  * expressions. This module simply has shortcuts for most common function calls.
9
8
  *
10
9
  * ### Examples
@@ -35,7 +34,7 @@ import { RawBuilder } from '../raw-builder/raw-builder.js';
35
34
  */
36
35
  export declare class FunctionBuilder<DB, TB extends keyof DB> {
37
36
  #private;
38
- constructor(props: FunctionBuilderProps);
37
+ constructor();
39
38
  /**
40
39
  * Calls the `max` function for the column given as the argument.
41
40
  *
@@ -132,6 +131,3 @@ export declare class FunctionBuilder<DB, TB extends keyof DB> {
132
131
  */
133
132
  count<O extends number | string | bigint, C extends StringReference<DB, TB> = any>(column: C): RawBuilder<O>;
134
133
  }
135
- export interface FunctionBuilderProps {
136
- readonly executor: QueryExecutor;
137
- }
@@ -1,13 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FunctionBuilder = void 0;
4
+ const raw_node_js_1 = require("../operation-node/raw-node.js");
5
+ const reference_parser_js_1 = require("../parser/reference-parser.js");
4
6
  const raw_builder_js_1 = require("../raw-builder/raw-builder.js");
5
- const object_utils_js_1 = require("../util/object-utils.js");
6
7
  const query_id_js_1 = require("../util/query-id.js");
7
8
  /**
8
9
  * Helpers for type safe SQL function calls.
9
10
  *
10
- * You can always use {@link Kysely.raw} to call functions and build arbitrary
11
+ * You can always use the {@link sql} tag to call functions and build arbitrary
11
12
  * expressions. This module simply has shortcuts for most common function calls.
12
13
  *
13
14
  * ### Examples
@@ -37,9 +38,7 @@ const query_id_js_1 = require("../util/query-id.js");
37
38
  * ```
38
39
  */
39
40
  class FunctionBuilder {
40
- #props;
41
- constructor(props) {
42
- this.#props = (0, object_utils_js_1.freeze)(props);
41
+ constructor() {
43
42
  this.min = this.min.bind(this);
44
43
  this.max = this.max.bind(this);
45
44
  this.avg = this.avg.bind(this);
@@ -154,9 +153,7 @@ class FunctionBuilder {
154
153
  #oneArgFunction(fn, column) {
155
154
  return new raw_builder_js_1.RawBuilder({
156
155
  queryId: (0, query_id_js_1.createQueryId)(),
157
- executor: this.#props.executor,
158
- sql: `${fn}(??)`,
159
- parameters: [column],
156
+ rawNode: raw_node_js_1.RawNode.create([`${fn}(`, ')'], [(0, reference_parser_js_1.parseStringReference)(column)]),
160
157
  });
161
158
  }
162
159
  }
@@ -8,7 +8,6 @@ import { MutationObject } from '../parser/update-set-parser.js';
8
8
  import { Compilable } from '../util/compilable.js';
9
9
  import { QueryExecutor } from '../query-executor/query-executor.js';
10
10
  import { QueryId } from '../util/query-id.js';
11
- import { ParseContext } from '../parser/parse-context.js';
12
11
  import { InsertResult } from './insert-result.js';
13
12
  import { KyselyPlugin } from '../plugin/kysely-plugin.js';
14
13
  import { ReturningRow } from '../parser/returning-parser.js';
@@ -25,7 +24,7 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
25
24
  *
26
25
  * This method takes an object whose keys are column names and values are
27
26
  * values to insert. In addition to the column's type, the values can be
28
- * {@link Kysely.raw | raw} instances or select queries.
27
+ * raw {@link sql} snippets or select queries.
29
28
  *
30
29
  * You must provide all fields you haven't explicitly marked as nullable
31
30
  * or optional using {@link Generated} or {@link ColumnType}.
@@ -106,16 +105,18 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
106
105
  * insert into "person" ("first_name", "last_name") values ($1, $2) returning "id"
107
106
  * ```
108
107
  *
109
- * In addition to primitives, the values can also be `raw` expressions or
108
+ * In addition to primitives, the values can also be raw sql expressions or
110
109
  * select queries:
111
110
  *
112
111
  * ```ts
112
+ * import { sql } from 'kysely'
113
+ *
113
114
  * const result = await db
114
115
  * .insertInto('person')
115
116
  * .values({
116
117
  * first_name: 'Jennifer',
117
- * last_name: db.raw('? || ?', ['Ani', 'ston']),
118
- * age: db.selectFrom('person').select(raw('avg(age)')),
118
+ * last_name: sql`${'Ani'} || ${'ston'}`,
119
+ * age: db.selectFrom('person').select(sql`avg(age)`),
119
120
  * })
120
121
  * .executeTakeFirst()
121
122
  *
@@ -271,6 +272,8 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
271
272
  * the unique index is an expression index:
272
273
  *
273
274
  * ```ts
275
+ * import { sql } from 'kysely'
276
+ *
274
277
  * await db
275
278
  * .insertInto('pet')
276
279
  * .values({
@@ -278,7 +281,7 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
278
281
  * species: 'cat',
279
282
  * })
280
283
  * .onConflict((oc) => oc
281
- * .expression(db.raw('lower(name)'))
284
+ * .expression(sql`lower(name)`)
282
285
  * .doUpdateSet({ species: 'hamster' })
283
286
  * )
284
287
  * .execute()
@@ -423,6 +426,8 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
423
426
  * Return arbitrary expressions:
424
427
  *
425
428
  * ```ts
429
+ * import { sql } from 'kysely'
430
+ *
426
431
  * const { id, full_name, first_pet_id } = await db
427
432
  * .insertInto('person')
428
433
  * .values({
@@ -431,7 +436,7 @@ export declare class InsertQueryBuilder<DB, TB extends keyof DB, O> implements R
431
436
  * })
432
437
  * .returning([
433
438
  * 'id as id',
434
- * db.raw<string>(`concat(first_name, ' ', last_name)`).as('full_name'),
439
+ * sql<string>`concat(first_name, ' ', last_name)`.as('full_name'),
435
440
  * (qb) => qb.selectFrom('pets').select('pet.id').limit(1).as('first_pet_id')
436
441
  * ])
437
442
  * .executeTakeFirst()
@@ -541,5 +546,4 @@ export interface InsertQueryBuilderProps {
541
546
  readonly queryId: QueryId;
542
547
  readonly queryNode: InsertQueryNode;
543
548
  readonly executor: QueryExecutor;
544
- readonly parseContext: ParseContext;
545
549
  }
@@ -21,7 +21,7 @@ class InsertQueryBuilder {
21
21
  this.#props = (0, object_utils_js_1.freeze)(props);
22
22
  }
23
23
  values(args) {
24
- const [columns, values] = (0, insert_values_parser_js_1.parseInsertObjectOrList)(this.#props.parseContext, args);
24
+ const [columns, values] = (0, insert_values_parser_js_1.parseInsertObjectOrList)(args);
25
25
  return new InsertQueryBuilder({
26
26
  ...this.#props,
27
27
  queryNode: insert_query_node_js_1.InsertQueryNode.cloneWith(this.#props.queryNode, {
@@ -82,7 +82,7 @@ class InsertQueryBuilder {
82
82
  return new InsertQueryBuilder({
83
83
  ...this.#props,
84
84
  queryNode: insert_query_node_js_1.InsertQueryNode.cloneWith(this.#props.queryNode, {
85
- values: (0, complex_expression_parser_js_1.parseComplexExpression)(this.#props.parseContext, expression),
85
+ values: (0, complex_expression_parser_js_1.parseComplexExpression)(expression),
86
86
  }),
87
87
  });
88
88
  }
@@ -176,6 +176,8 @@ class InsertQueryBuilder {
176
176
  * the unique index is an expression index:
177
177
  *
178
178
  * ```ts
179
+ * import { sql } from 'kysely'
180
+ *
179
181
  * await db
180
182
  * .insertInto('pet')
181
183
  * .values({
@@ -183,7 +185,7 @@ class InsertQueryBuilder {
183
185
  * species: 'cat',
184
186
  * })
185
187
  * .onConflict((oc) => oc
186
- * .expression(db.raw('lower(name)'))
188
+ * .expression(sql`lower(name)`)
187
189
  * .doUpdateSet({ species: 'hamster' })
188
190
  * )
189
191
  * .execute()
@@ -271,7 +273,6 @@ class InsertQueryBuilder {
271
273
  queryNode: insert_query_node_js_1.InsertQueryNode.cloneWith(this.#props.queryNode, {
272
274
  onConflict: callback(new on_conflict_builder_js_1.OnConflictBuilder({
273
275
  onConflictNode: on_conflict_node_js_1.OnConflictNode.create(),
274
- parseContext: this.#props.parseContext,
275
276
  })).toOperationNode(),
276
277
  }),
277
278
  });
@@ -298,14 +299,14 @@ class InsertQueryBuilder {
298
299
  return new InsertQueryBuilder({
299
300
  ...this.#props,
300
301
  queryNode: insert_query_node_js_1.InsertQueryNode.cloneWith(this.#props.queryNode, {
301
- onDuplicateKey: on_duplicate_key_node_js_1.OnDuplicateKeyNode.create((0, update_set_parser_js_1.parseUpdateObject)(this.#props.parseContext, updates)),
302
+ onDuplicateKey: on_duplicate_key_node_js_1.OnDuplicateKeyNode.create((0, update_set_parser_js_1.parseUpdateObject)(updates)),
302
303
  }),
303
304
  });
304
305
  }
305
306
  returning(selection) {
306
307
  return new InsertQueryBuilder({
307
308
  ...this.#props,
308
- queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectExpressionOrList)(this.#props.parseContext, selection)),
309
+ queryNode: query_node_js_1.QueryNode.cloneWithReturning(this.#props.queryNode, (0, select_parser_js_1.parseSelectExpressionOrList)(selection)),
309
310
  });
310
311
  }
311
312
  returningAll() {
@@ -415,7 +416,7 @@ class InsertQueryBuilder {
415
416
  const compildQuery = this.compile();
416
417
  const query = compildQuery.query;
417
418
  const result = await this.#props.executor.executeQuery(compildQuery, this.#props.queryId);
418
- if (this.#props.parseContext.adapter.supportsReturning && query.returning) {
419
+ if (this.#props.executor.adapter.supportsReturning && query.returning) {
419
420
  return result.rows;
420
421
  }
421
422
  else {
@@ -1,7 +1,6 @@
1
1
  import { JoinNode } from '../operation-node/join-node.js';
2
2
  import { OperationNodeSource } from '../operation-node/operation-node-source.js';
3
3
  import { ExistsExpression, FilterOperator, FilterValueExpressionOrList } from '../parser/filter-parser.js';
4
- import { ParseContext } from '../parser/parse-context.js';
5
4
  import { ReferenceExpression } from '../parser/reference-parser.js';
6
5
  import { AnyRawBuilder } from '../util/type-utils.js';
7
6
  export declare class JoinBuilder<DB, TB extends keyof DB> implements OperationNodeSource {
@@ -71,5 +70,4 @@ export declare class JoinBuilder<DB, TB extends keyof DB> implements OperationNo
71
70
  }
72
71
  export interface JoinBuilderProps {
73
72
  readonly joinNode: JoinNode;
74
- readonly parseContext: ParseContext;
75
73
  }