kysely 0.16.9 → 0.17.1

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 (189) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -2
  3. package/dist/cjs/dialect/mysql/mysql-adapter.js +3 -4
  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 +1 -1
  10. package/dist/cjs/driver/single-connection-provider.d.ts +1 -1
  11. package/dist/cjs/driver/single-connection-provider.js +1 -1
  12. package/dist/cjs/index-nodeless.d.ts +2 -0
  13. package/dist/cjs/index-nodeless.js +2 -0
  14. package/dist/cjs/kysely.d.ts +3 -6
  15. package/dist/cjs/kysely.js +30 -41
  16. package/dist/cjs/migration/migrator.js +4 -4
  17. package/dist/cjs/operation-node/delete-query-node.d.ts +7 -0
  18. package/dist/cjs/operation-node/delete-query-node.js +15 -0
  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/query-builder/delete-query-builder.d.ts +77 -20
  49. package/dist/cjs/query-builder/delete-query-builder.js +81 -14
  50. package/dist/cjs/query-builder/expression-builder.d.ts +4 -13
  51. package/dist/cjs/query-builder/expression-builder.js +12 -21
  52. package/dist/cjs/query-builder/function-builder.d.ts +2 -6
  53. package/dist/cjs/query-builder/function-builder.js +5 -8
  54. package/dist/cjs/query-builder/insert-query-builder.d.ts +11 -9
  55. package/dist/cjs/query-builder/insert-query-builder.js +8 -7
  56. package/dist/cjs/query-builder/join-builder.d.ts +0 -2
  57. package/dist/cjs/query-builder/join-builder.js +8 -8
  58. package/dist/cjs/query-builder/on-conflict-builder.d.ts +24 -20
  59. package/dist/cjs/query-builder/on-conflict-builder.js +17 -17
  60. package/dist/cjs/query-builder/returning-interface.d.ts +2 -2
  61. package/dist/cjs/query-builder/select-query-builder.d.ts +43 -32
  62. package/dist/cjs/query-builder/select-query-builder.js +28 -26
  63. package/dist/cjs/query-builder/update-query-builder.d.ts +29 -25
  64. package/dist/cjs/query-builder/update-query-builder.js +22 -20
  65. package/dist/cjs/query-builder/where-interface.d.ts +20 -16
  66. package/dist/cjs/query-compiler/default-query-compiler.js +16 -7
  67. package/dist/cjs/query-creator.d.ts +24 -138
  68. package/dist/cjs/query-creator.js +19 -145
  69. package/dist/cjs/query-executor/default-query-executor.d.ts +14 -3
  70. package/dist/cjs/query-executor/default-query-executor.js +15 -17
  71. package/dist/cjs/query-executor/noop-query-executor.d.ts +13 -2
  72. package/dist/cjs/query-executor/noop-query-executor.js +9 -2
  73. package/dist/cjs/query-executor/query-executor-provider.d.ts +8 -0
  74. package/dist/cjs/query-executor/query-executor-provider.js +2 -0
  75. package/dist/cjs/query-executor/query-executor.d.ts +14 -6
  76. package/dist/cjs/query-executor/query-executor.js +4 -2
  77. package/dist/cjs/raw-builder/raw-builder.d.ts +42 -11
  78. package/dist/cjs/raw-builder/raw-builder.js +55 -56
  79. package/dist/cjs/raw-builder/sql.d.ts +323 -0
  80. package/dist/cjs/raw-builder/sql.js +153 -0
  81. package/dist/cjs/schema/alter-table-builder.d.ts +20 -8
  82. package/dist/cjs/schema/alter-table-builder.js +3 -3
  83. package/dist/cjs/schema/column-definition-builder.d.ts +20 -8
  84. package/dist/cjs/schema/create-index-builder.d.ts +3 -1
  85. package/dist/cjs/schema/create-index-builder.js +3 -1
  86. package/dist/cjs/schema/create-table-builder.d.ts +6 -2
  87. package/dist/cjs/schema/create-table-builder.js +8 -4
  88. package/dist/cjs/schema/create-view-builder.d.ts +3 -3
  89. package/dist/cjs/schema/create-view-builder.js +3 -3
  90. package/dist/cjs/util/query-id.js +10 -4
  91. package/dist/cjs/util/random-string.js +65 -2
  92. package/dist/esm/dialect/mysql/mysql-adapter.js +3 -4
  93. package/dist/esm/dialect/mysql/mysql-introspector.js +2 -1
  94. package/dist/esm/dialect/postgres/postgres-adapter.js +3 -2
  95. package/dist/esm/dialect/sqlite/sqlite-introspector.js +2 -1
  96. package/dist/esm/driver/connection-provider.d.ts +1 -1
  97. package/dist/esm/driver/default-connection-provider.d.ts +1 -1
  98. package/dist/esm/driver/default-connection-provider.js +1 -1
  99. package/dist/esm/driver/single-connection-provider.d.ts +1 -1
  100. package/dist/esm/driver/single-connection-provider.js +1 -1
  101. package/dist/esm/index-nodeless.d.ts +2 -0
  102. package/dist/esm/index-nodeless.js +2 -0
  103. package/dist/esm/kysely.d.ts +3 -6
  104. package/dist/esm/kysely.js +30 -41
  105. package/dist/esm/migration/migrator.js +4 -4
  106. package/dist/esm/operation-node/delete-query-node.d.ts +7 -0
  107. package/dist/esm/operation-node/delete-query-node.js +15 -0
  108. package/dist/esm/operation-node/operation-node-transformer.js +1 -1
  109. package/dist/esm/operation-node/raw-node.d.ts +4 -2
  110. package/dist/esm/operation-node/raw-node.js +8 -2
  111. package/dist/esm/parser/complex-expression-parser.d.ts +5 -5
  112. package/dist/esm/parser/complex-expression-parser.js +5 -4
  113. package/dist/esm/parser/filter-parser.d.ts +9 -9
  114. package/dist/esm/parser/filter-parser.js +31 -30
  115. package/dist/esm/parser/group-by-parser.d.ts +1 -2
  116. package/dist/esm/parser/group-by-parser.js +2 -2
  117. package/dist/esm/parser/insert-values-parser.d.ts +1 -2
  118. package/dist/esm/parser/insert-values-parser.js +6 -6
  119. package/dist/esm/parser/join-parser.d.ts +1 -2
  120. package/dist/esm/parser/join-parser.js +8 -7
  121. package/dist/esm/parser/order-by-parser.d.ts +1 -2
  122. package/dist/esm/parser/order-by-parser.js +4 -4
  123. package/dist/esm/parser/parse-utils.d.ts +10 -0
  124. package/dist/esm/parser/parse-utils.js +32 -0
  125. package/dist/esm/parser/reference-parser.d.ts +2 -3
  126. package/dist/esm/parser/reference-parser.js +5 -5
  127. package/dist/esm/parser/select-parser.d.ts +1 -2
  128. package/dist/esm/parser/select-parser.js +5 -5
  129. package/dist/esm/parser/table-parser.d.ts +2 -3
  130. package/dist/esm/parser/table-parser.js +5 -5
  131. package/dist/esm/parser/update-set-parser.d.ts +1 -2
  132. package/dist/esm/parser/update-set-parser.js +2 -2
  133. package/dist/esm/parser/value-parser.d.ts +3 -4
  134. package/dist/esm/parser/value-parser.js +7 -7
  135. package/dist/esm/parser/with-parser.d.ts +1 -2
  136. package/dist/esm/parser/with-parser.js +3 -2
  137. package/dist/esm/query-builder/delete-query-builder.d.ts +77 -20
  138. package/dist/esm/query-builder/delete-query-builder.js +81 -14
  139. package/dist/esm/query-builder/expression-builder.d.ts +4 -13
  140. package/dist/esm/query-builder/expression-builder.js +12 -21
  141. package/dist/esm/query-builder/function-builder.d.ts +2 -6
  142. package/dist/esm/query-builder/function-builder.js +5 -8
  143. package/dist/esm/query-builder/insert-query-builder.d.ts +11 -9
  144. package/dist/esm/query-builder/insert-query-builder.js +8 -7
  145. package/dist/esm/query-builder/join-builder.d.ts +0 -2
  146. package/dist/esm/query-builder/join-builder.js +8 -8
  147. package/dist/esm/query-builder/on-conflict-builder.d.ts +24 -20
  148. package/dist/esm/query-builder/on-conflict-builder.js +17 -17
  149. package/dist/esm/query-builder/returning-interface.d.ts +2 -2
  150. package/dist/esm/query-builder/select-query-builder.d.ts +43 -32
  151. package/dist/esm/query-builder/select-query-builder.js +28 -26
  152. package/dist/esm/query-builder/update-query-builder.d.ts +29 -25
  153. package/dist/esm/query-builder/update-query-builder.js +22 -20
  154. package/dist/esm/query-builder/where-interface.d.ts +20 -16
  155. package/dist/esm/query-compiler/default-query-compiler.js +16 -7
  156. package/dist/esm/query-creator.d.ts +24 -138
  157. package/dist/esm/query-creator.js +19 -145
  158. package/dist/esm/query-executor/default-query-executor.d.ts +14 -3
  159. package/dist/esm/query-executor/default-query-executor.js +15 -17
  160. package/dist/esm/query-executor/noop-query-executor.d.ts +13 -2
  161. package/dist/esm/query-executor/noop-query-executor.js +8 -1
  162. package/dist/esm/query-executor/query-executor-provider.d.ts +8 -0
  163. package/dist/esm/query-executor/query-executor-provider.js +2 -0
  164. package/dist/esm/query-executor/query-executor.d.ts +14 -6
  165. package/dist/esm/query-executor/query-executor.js +4 -2
  166. package/dist/esm/raw-builder/raw-builder.d.ts +42 -11
  167. package/dist/esm/raw-builder/raw-builder.js +56 -57
  168. package/dist/esm/raw-builder/sql.d.ts +323 -0
  169. package/dist/esm/raw-builder/sql.js +151 -0
  170. package/dist/esm/schema/alter-table-builder.d.ts +20 -8
  171. package/dist/esm/schema/alter-table-builder.js +3 -3
  172. package/dist/esm/schema/column-definition-builder.d.ts +20 -8
  173. package/dist/esm/schema/create-index-builder.d.ts +3 -1
  174. package/dist/esm/schema/create-index-builder.js +3 -1
  175. package/dist/esm/schema/create-table-builder.d.ts +6 -2
  176. package/dist/esm/schema/create-table-builder.js +8 -4
  177. package/dist/esm/schema/create-view-builder.d.ts +3 -3
  178. package/dist/esm/schema/create-view-builder.js +3 -3
  179. package/dist/esm/util/query-id.js +10 -4
  180. package/dist/esm/util/random-string.js +65 -2
  181. package/package.json +13 -13
  182. package/dist/cjs/parser/parse-context.d.ts +0 -55
  183. package/dist/cjs/parser/parse-context.js +0 -50
  184. package/dist/cjs/util/private-symbols.d.ts +0 -5
  185. package/dist/cjs/util/private-symbols.js +0 -8
  186. package/dist/esm/parser/parse-context.d.ts +0 -55
  187. package/dist/esm/parser/parse-context.js +0 -47
  188. package/dist/esm/util/private-symbols.d.ts +0 -5
  189. package/dist/esm/util/private-symbols.js +0 -6
@@ -0,0 +1,151 @@
1
+ /// <reference types="./sql.d.ts" />
2
+ import { IdentifierNode } from '../operation-node/identifier-node.js';
3
+ import { RawNode } from '../operation-node/raw-node.js';
4
+ import { ValueNode } from '../operation-node/value-node.js';
5
+ import { parseStringReference } from '../parser/reference-parser.js';
6
+ import { parseTable } from '../parser/table-parser.js';
7
+ import { parseValueExpression } from '../parser/value-parser.js';
8
+ import { createQueryId } from '../util/query-id.js';
9
+ import { RawBuilder } from './raw-builder.js';
10
+ /**
11
+ * Template tag for creating raw SQL snippets and queries.
12
+ *
13
+ * ```ts
14
+ * import { sql } from 'kysely'
15
+ *
16
+ * const id = 123
17
+ *
18
+ * const snippet = sql<Person[]>`select * from person where id = ${id}`
19
+ * ```
20
+ *
21
+ * Substitutions (the things inside `${}`) are automatically passed to the database
22
+ * as parameters and are NOT interpolated to the SQL string. There's no need to worry
23
+ * about SQL injection vulnerabilities.
24
+ *
25
+ * If you need your substitutions to be interpreted as identifiers, value literals or
26
+ * lists of things, see the {@link Sql.ref}, {@link Sql.table}, {@link Sql.id},
27
+ * {@link Sql.literal}, {@link Sql.raw} and {@link Sql.join} functions.
28
+ *
29
+ * You can pass sql snippets returned by the `sql` tag pretty much anywhere. Whenever
30
+ * something can't be done using the Kysely API, you should be able to drop down to
31
+ * raw SQL using the `sql` tag. Here's an example query that uses raw sql in a bunch
32
+ * of methods:
33
+ *
34
+ * ```ts
35
+ * const persons = await db
36
+ * .selectFrom('person')
37
+ * .select(
38
+ * // If you use `sql` in a select statement, remember to call the `as`
39
+ * // method to give it an alias. Otherwise Kysely is not able to add
40
+ * // the column to the result type.
41
+ * sql<string>`concat(first_name, ' ', last_name)`.as('full_name')
42
+ * )
43
+ * .where(sql`birthdate between ${date1} and ${date2}`)
44
+ * // Here we assume we have list of nicknames for the person
45
+ * // (a list of strings) and we use the PostgreSQL `@>` operator
46
+ * // to test if all of them are valid nicknames for the user.
47
+ * .where('nicknames', '@>', sql`ARRAY[${sql.join(nicknames)}]`)
48
+ * .orderBy(sql`concat(first_name, ' ', last_name)`)
49
+ * .execute()
50
+ * ```
51
+ *
52
+ * The generated SQL (PostgreSQL):
53
+ *
54
+ * ```sql
55
+ * select concat(first_name, ' ', last_name) as "full_name"
56
+ * from "person"
57
+ * where birthdate between $1 and $2
58
+ * and "nicknames" @> ARRAY[$3, $4, $5, $6, $7, $8, $9, $10]
59
+ * order by concate(first_name, ' ', last_name)
60
+ * ```
61
+ *
62
+ * SQL snippets can be executed by calling the `execute` method and passing a `Kysely`
63
+ * instance as the only argument:
64
+ *
65
+ * ```ts
66
+ * const result = await sql<Person[]>`select * from person`.execute(db)
67
+ * ```
68
+ *
69
+ * You can merge other `sql` expressions and queries using substitutions:
70
+ *
71
+ * ```ts
72
+ * const petName = db.selectFrom('pet').select('name').limit(1)
73
+ * const fullName = sql`concat(first_name, ' ', last_name)`
74
+ *
75
+ * sql`
76
+ * select ${fullName} as full_name, ${petName} as pet_name
77
+ * from person
78
+ * `
79
+ * ```
80
+ *
81
+ * Substitutions also handle {@link ExpressionBuilder.ref},
82
+ * {@link DynamicModule.ref} and pretty much anything else you
83
+ * throw at it. Here's an example of calling a function in a
84
+ * type-safe way:
85
+ *
86
+ * ```ts
87
+ * db.selectFrom('person')
88
+ * .select([
89
+ * 'first_name',
90
+ * 'last_name',
91
+ * (eb) => sql<string>`concat(${eb.ref('first_name')}, ' ', ${eb.ref('last_name')})`.as('full_name')
92
+ * ])
93
+ * ```
94
+ *
95
+ * don't know if that amount of ceremony is worth the small increase in
96
+ * type-safety though... But it's possible.
97
+ */
98
+ export const sql = Object.assign((sqlFragments, ...parameters) => {
99
+ return new RawBuilder({
100
+ queryId: createQueryId(),
101
+ rawNode: RawNode.create(sqlFragments, parameters?.map(parseValueExpression) ?? []),
102
+ });
103
+ }, {
104
+ ref(columnReference) {
105
+ return new RawBuilder({
106
+ queryId: createQueryId(),
107
+ rawNode: RawNode.createWithChild(parseStringReference(columnReference)),
108
+ });
109
+ },
110
+ table(tableReference) {
111
+ return new RawBuilder({
112
+ queryId: createQueryId(),
113
+ rawNode: RawNode.createWithChild(parseTable(tableReference)),
114
+ });
115
+ },
116
+ id(...ids) {
117
+ const fragments = new Array(ids.length + 1).fill('.');
118
+ fragments[0] = '';
119
+ fragments[fragments.length - 1] = '';
120
+ return new RawBuilder({
121
+ queryId: createQueryId(),
122
+ rawNode: RawNode.create(fragments, ids.map(IdentifierNode.create)),
123
+ });
124
+ },
125
+ literal(value) {
126
+ return new RawBuilder({
127
+ queryId: createQueryId(),
128
+ rawNode: RawNode.createWithChild(ValueNode.createImmediate(value)),
129
+ });
130
+ },
131
+ raw(sql) {
132
+ return new RawBuilder({
133
+ queryId: createQueryId(),
134
+ rawNode: RawNode.createWithSql(sql),
135
+ });
136
+ },
137
+ join(array, separator = sql `, `) {
138
+ const nodes = new Array(2 * array.length - 1);
139
+ const sep = separator.toOperationNode();
140
+ for (let i = 0; i < array.length; ++i) {
141
+ nodes[2 * i] = parseValueExpression(array[i]);
142
+ if (i !== array.length - 1) {
143
+ nodes[2 * i + 1] = sep;
144
+ }
145
+ }
146
+ return new RawBuilder({
147
+ queryId: createQueryId(),
148
+ rawNode: RawNode.createWithChildren(nodes),
149
+ });
150
+ },
151
+ });
@@ -142,15 +142,17 @@ export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuild
142
142
  * .execute()
143
143
  * ```
144
144
  *
145
- * Raw expressions are also supported:
145
+ * Raw {@link sql} expressions are also supported:
146
146
  *
147
147
  * ```ts
148
+ * import { sql } from 'kysely'
149
+ *
148
150
  * db.schema
149
151
  * .createTable('pet')
150
152
  * .addColumn(
151
153
  * 'number_of_legs',
152
154
  * 'integer',
153
- * (col) => col.defaultTo(db.raw('any SQL here'))
155
+ * (col) => col.defaultTo(sql`any SQL here`)
154
156
  * )
155
157
  * .execute()
156
158
  * ```
@@ -162,10 +164,12 @@ export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuild
162
164
  * ### Examples
163
165
  *
164
166
  * ```ts
167
+ * import { sql } from 'kysely'
168
+ *
165
169
  * db.schema
166
170
  * .createTable('pet')
167
171
  * .addColumn('number_of_legs', 'integer', (col) =>
168
- * col.check(db.raw('number_of_legs < 5'))
172
+ * col.check(sql`number_of_legs < 5`)
169
173
  * )
170
174
  * .execute()
171
175
  * ```
@@ -177,10 +181,12 @@ export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuild
177
181
  * ### Examples
178
182
  *
179
183
  * ```ts
184
+ * import { sql } from 'kysely'
185
+ *
180
186
  * db.schema
181
187
  * .createTable('person')
182
188
  * .addColumn('full_name', 'varchar(255)',
183
- * (col) => col.generatedAlwaysAs(db.raw("concat(first_name, ' ', last_name)"))
189
+ * (col) => col.generatedAlwaysAs(sql`concat(first_name, ' ', last_name)`)
184
190
  * )
185
191
  * .execute()
186
192
  * ```
@@ -300,15 +306,17 @@ export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBu
300
306
  * .execute()
301
307
  * ```
302
308
  *
303
- * Raw expressions are also supported:
309
+ * Raw {@link sql} expressions are also supported:
304
310
  *
305
311
  * ```ts
312
+ * import { sql } from 'kysely'
313
+ *
306
314
  * db.schema
307
315
  * .createTable('pet')
308
316
  * .addColumn(
309
317
  * 'number_of_legs',
310
318
  * 'integer',
311
- * (col) => col.defaultTo(db.raw('any SQL here'))
319
+ * (col) => col.defaultTo(sql`any SQL here`)
312
320
  * )
313
321
  * .execute()
314
322
  * ```
@@ -320,10 +328,12 @@ export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBu
320
328
  * ### Examples
321
329
  *
322
330
  * ```ts
331
+ * import { sql } from 'kysely'
332
+ *
323
333
  * db.schema
324
334
  * .createTable('pet')
325
335
  * .addColumn('number_of_legs', 'integer', (col) =>
326
- * col.check(db.raw('number_of_legs < 5'))
336
+ * col.check(sql`number_of_legs < 5`)
327
337
  * )
328
338
  * .execute()
329
339
  * ```
@@ -335,10 +345,12 @@ export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBu
335
345
  * ### Examples
336
346
  *
337
347
  * ```ts
348
+ * import { sql } from 'kysely'
349
+ *
338
350
  * db.schema
339
351
  * .createTable('person')
340
352
  * .addColumn('full_name', 'varchar(255)',
341
- * (col) => col.generatedAlwaysAs(db.raw("concat(first_name, ' ', last_name)"))
353
+ * (col) => col.generatedAlwaysAs(sql`concat(first_name, ' ', last_name)`)
342
354
  * )
343
355
  * .execute()
344
356
  * ```
@@ -7,7 +7,6 @@ import { DataTypeNode, } from '../operation-node/data-type-node.js';
7
7
  import { DropColumnNode } from '../operation-node/drop-column-node.js';
8
8
  import { IdentifierNode } from '../operation-node/identifier-node.js';
9
9
  import { RenameColumnNode } from '../operation-node/rename-column-node.js';
10
- import { TableNode } from '../operation-node/table-node.js';
11
10
  import { freeze } from '../util/object-utils.js';
12
11
  import { preventAwait } from '../util/prevent-await.js';
13
12
  import { ColumnDefinitionBuilder, } from './column-definition-builder.js';
@@ -20,6 +19,7 @@ import { CheckConstraintNode } from '../operation-node/check-constraint-node.js'
20
19
  import { ForeignKeyConstraintNode } from '../operation-node/foreign-key-constraint-node.js';
21
20
  import { ColumnNode } from '../operation-node/column-node.js';
22
21
  import { parseDefaultValueExpression, } from '../parser/default-value-parser.js';
22
+ import { parseTable } from '../parser/table-parser.js';
23
23
  /**
24
24
  * This builder can be used to create a `alter table` query.
25
25
  */
@@ -32,7 +32,7 @@ export class AlterTableBuilder {
32
32
  return new AlterTableExecutor({
33
33
  ...this.#props,
34
34
  alterTableNode: AlterTableNode.cloneWith(this.#props.alterTableNode, {
35
- renameTo: TableNode.create(newTableName),
35
+ renameTo: parseTable(newTableName),
36
36
  }),
37
37
  });
38
38
  }
@@ -102,7 +102,7 @@ export class AlterTableBuilder {
102
102
  addForeignKeyConstraint(constraintName, columns, targetTable, targetColumns) {
103
103
  return new AlterTableAddForeignKeyConstraintBuilder({
104
104
  ...this.#props,
105
- constraintBuilder: new ForeignKeyConstraintBuilder(ForeignKeyConstraintNode.create(columns.map(ColumnNode.create), TableNode.create(targetTable), targetColumns.map(ColumnNode.create), constraintName)),
105
+ constraintBuilder: new ForeignKeyConstraintBuilder(ForeignKeyConstraintNode.create(columns.map(ColumnNode.create), parseTable(targetTable), targetColumns.map(ColumnNode.create), constraintName)),
106
106
  });
107
107
  }
108
108
  }
@@ -83,15 +83,17 @@ export interface ColumnDefinitionBuilderInterface {
83
83
  * .execute()
84
84
  * ```
85
85
  *
86
- * Raw expressions are also supported:
86
+ * Raw {@link sql} expressions are also supported:
87
87
  *
88
88
  * ```ts
89
+ * import { sql } from 'kysely'
90
+ *
89
91
  * db.schema
90
92
  * .createTable('pet')
91
93
  * .addColumn(
92
94
  * 'number_of_legs',
93
95
  * 'integer',
94
- * (col) => col.defaultTo(db.raw('any SQL here'))
96
+ * (col) => col.defaultTo(sql`any SQL here`)
95
97
  * )
96
98
  * .execute()
97
99
  * ```
@@ -103,10 +105,12 @@ export interface ColumnDefinitionBuilderInterface {
103
105
  * ### Examples
104
106
  *
105
107
  * ```ts
108
+ * import { sql } from 'kysely'
109
+ *
106
110
  * db.schema
107
111
  * .createTable('pet')
108
112
  * .addColumn('number_of_legs', 'integer', (col) =>
109
- * col.check(db.raw('number_of_legs < 5'))
113
+ * col.check(sql`number_of_legs < 5`)
110
114
  * )
111
115
  * .execute()
112
116
  * ```
@@ -118,10 +122,12 @@ export interface ColumnDefinitionBuilderInterface {
118
122
  * ### Examples
119
123
  *
120
124
  * ```ts
125
+ * import { sql } from 'kysely'
126
+ *
121
127
  * db.schema
122
128
  * .createTable('person')
123
129
  * .addColumn('full_name', 'varchar(255)',
124
- * (col) => col.generatedAlwaysAs(db.raw("concat(first_name, ' ', last_name)"))
130
+ * (col) => col.generatedAlwaysAs(sql`concat(first_name, ' ', last_name)`)
125
131
  * )
126
132
  * .execute()
127
133
  * ```
@@ -235,15 +241,17 @@ export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderI
235
241
  * .execute()
236
242
  * ```
237
243
  *
238
- * Raw expressions are also supported:
244
+ * Raw {@link sql} expressions are also supported:
239
245
  *
240
246
  * ```ts
247
+ * import { sql } from 'kysely'
248
+ *
241
249
  * db.schema
242
250
  * .createTable('pet')
243
251
  * .addColumn(
244
252
  * 'number_of_legs',
245
253
  * 'integer',
246
- * (col) => col.defaultTo(db.raw('any SQL here'))
254
+ * (col) => col.defaultTo(sql`any SQL here`)
247
255
  * )
248
256
  * .execute()
249
257
  * ```
@@ -255,10 +263,12 @@ export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderI
255
263
  * ### Examples
256
264
  *
257
265
  * ```ts
266
+ * import { sql } from 'kysely'
267
+ *
258
268
  * db.schema
259
269
  * .createTable('pet')
260
270
  * .addColumn('number_of_legs', 'integer', (col) =>
261
- * col.check(db.raw('number_of_legs < 5'))
271
+ * col.check(sql`number_of_legs < 5`)
262
272
  * )
263
273
  * .execute()
264
274
  * ```
@@ -270,10 +280,12 @@ export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderI
270
280
  * ### Examples
271
281
  *
272
282
  * ```ts
283
+ * import { sql } from 'kysely'
284
+ *
273
285
  * db.schema
274
286
  * .createTable('person')
275
287
  * .addColumn('full_name', 'varchar(255)',
276
- * (col) => col.generatedAlwaysAs(db.raw("concat(first_name, ' ', last_name)"))
288
+ * (col) => col.generatedAlwaysAs(sql`concat(first_name, ' ', last_name)`)
277
289
  * )
278
290
  * .execute()
279
291
  * ```
@@ -34,10 +34,12 @@ export declare class CreateIndexBuilder implements OperationNodeSource, Compilab
34
34
  * ### Examples
35
35
  *
36
36
  * ```ts
37
+ * import { sql } from 'kysely'
38
+ *
37
39
  * await db.schema
38
40
  * .createIndex('person_first_name_index')
39
41
  * .on('person')
40
- * .expression(db.raw('first_name COLLATE "fi_FI"'))
42
+ * .expression(sql`first_name COLLATE "fi_FI"`)
41
43
  * .execute()
42
44
  * ```
43
45
  */
@@ -65,10 +65,12 @@ export class CreateIndexBuilder {
65
65
  * ### Examples
66
66
  *
67
67
  * ```ts
68
+ * import { sql } from 'kysely'
69
+ *
68
70
  * await db.schema
69
71
  * .createIndex('person_first_name_index')
70
72
  * .on('person')
71
- * .expression(db.raw('first_name COLLATE "fi_FI"'))
73
+ * .expression(sql`first_name COLLATE "fi_FI"`)
72
74
  * .execute()
73
75
  * ```
74
76
  */
@@ -39,13 +39,15 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
39
39
  * ### Examples
40
40
  *
41
41
  * ```ts
42
+ * import { sql } from 'kysely'
43
+ *
42
44
  * await db.schema
43
45
  * .createTable('person')
44
46
  * .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
45
47
  * .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
46
48
  * .addColumn('last_name', 'varchar(255)')
47
49
  * .addColumn('bank_balance', 'numeric(8, 2)')
48
- * .addColumn('data', db.raw('customtype'))
50
+ * .addColumn('data', sql`customtype`)
49
51
  * .addColumn('parent_id', 'integer', (col) =>
50
52
  * col.references('person.id').onDelete('cascade'))
51
53
  * )
@@ -111,7 +113,9 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
111
113
  * ### Examples
112
114
  *
113
115
  * ```ts
114
- * addCheckConstraint('check_legs', db.raw('number_of_legs < 5'))
116
+ * import { sql } from 'kysely'
117
+ *
118
+ * addCheckConstraint('check_legs', sql`number_of_legs < 5`)
115
119
  * ```
116
120
  */
117
121
  addCheckConstraint(constraintName: string, checkExpression: AnyRawBuilder): CreateTableBuilder<TB, C>;
@@ -6,12 +6,12 @@ import { ColumnDefinitionBuilder } from './column-definition-builder.js';
6
6
  import { freeze, noop } from '../util/object-utils.js';
7
7
  import { ForeignKeyConstraintNode } from '../operation-node/foreign-key-constraint-node.js';
8
8
  import { ColumnNode } from '../operation-node/column-node.js';
9
- import { TableNode } from '../operation-node/table-node.js';
10
9
  import { ForeignKeyConstraintBuilder } from './foreign-key-constraint-builder.js';
11
10
  import { parseDataTypeExpression, } from '../parser/data-type-parser.js';
12
11
  import { PrimaryConstraintNode } from '../operation-node/primary-constraint-node.js';
13
12
  import { UniqueConstraintNode } from '../operation-node/unique-constraint-node.js';
14
13
  import { CheckConstraintNode } from '../operation-node/check-constraint-node.js';
14
+ import { parseTable } from '../parser/table-parser.js';
15
15
  /**
16
16
  * This builder can be used to create a `create table` query.
17
17
  */
@@ -66,13 +66,15 @@ export class CreateTableBuilder {
66
66
  * ### Examples
67
67
  *
68
68
  * ```ts
69
+ * import { sql } from 'kysely'
70
+ *
69
71
  * await db.schema
70
72
  * .createTable('person')
71
73
  * .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
72
74
  * .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
73
75
  * .addColumn('last_name', 'varchar(255)')
74
76
  * .addColumn('bank_balance', 'numeric(8, 2)')
75
- * .addColumn('data', db.raw('customtype'))
77
+ * .addColumn('data', sql`customtype`)
76
78
  * .addColumn('parent_id', 'integer', (col) =>
77
79
  * col.references('person.id').onDelete('cascade'))
78
80
  * )
@@ -154,7 +156,9 @@ export class CreateTableBuilder {
154
156
  * ### Examples
155
157
  *
156
158
  * ```ts
157
- * addCheckConstraint('check_legs', db.raw('number_of_legs < 5'))
159
+ * import { sql } from 'kysely'
160
+ *
161
+ * addCheckConstraint('check_legs', sql`number_of_legs < 5`)
158
162
  * ```
159
163
  */
160
164
  addCheckConstraint(constraintName, checkExpression) {
@@ -193,7 +197,7 @@ export class CreateTableBuilder {
193
197
  * ```
194
198
  */
195
199
  addForeignKeyConstraint(constraintName, columns, targetTable, targetColumns, build = noop) {
196
- const builder = build(new ForeignKeyConstraintBuilder(ForeignKeyConstraintNode.create(columns.map(ColumnNode.create), TableNode.create(targetTable), targetColumns.map(ColumnNode.create), constraintName)));
200
+ const builder = build(new ForeignKeyConstraintBuilder(ForeignKeyConstraintNode.create(columns.map(ColumnNode.create), parseTable(targetTable), targetColumns.map(ColumnNode.create), constraintName)));
197
201
  return new CreateTableBuilder({
198
202
  ...this.#props,
199
203
  createTableNode: CreateTableNode.cloneWithConstraint(this.#props.createTableNode, builder.toOperationNode()),
@@ -26,9 +26,9 @@ export declare class CreateViewBuilder implements OperationNodeSource, Compilabl
26
26
  *
27
27
  * WARNING!
28
28
  * Some dialects don't support parameterized queries in DDL statements and therefore
29
- * the query or `raw` expression passed here is interpolated into a single string
30
- * opening an SQL injection vulnerability. DO NOT pass unchecked user input into
31
- * the query or `raw` expression passed to this method!
29
+ * the query or raw {@link sql } expression passed here is interpolated into a single
30
+ * string opening an SQL injection vulnerability. DO NOT pass unchecked user input
31
+ * into the query or raw expression passed to this method!
32
32
  */
33
33
  as(query: AnySelectQueryBuilder | AnyRawBuilder): CreateViewBuilder;
34
34
  toOperationNode(): CreateViewNode;
@@ -62,9 +62,9 @@ export class CreateViewBuilder {
62
62
  *
63
63
  * WARNING!
64
64
  * Some dialects don't support parameterized queries in DDL statements and therefore
65
- * the query or `raw` expression passed here is interpolated into a single string
66
- * opening an SQL injection vulnerability. DO NOT pass unchecked user input into
67
- * the query or `raw` expression passed to this method!
65
+ * the query or raw {@link sql } expression passed here is interpolated into a single
66
+ * string opening an SQL injection vulnerability. DO NOT pass unchecked user input
67
+ * into the query or raw expression passed to this method!
68
68
  */
69
69
  as(query) {
70
70
  const queryNode = query
@@ -1,8 +1,14 @@
1
1
  /// <reference types="./query-id.d.ts" />
2
- import { freeze } from './object-utils.js';
3
2
  import { randomString } from './random-string.js';
4
3
  export function createQueryId() {
5
- return freeze({
6
- queryId: randomString(8),
7
- });
4
+ return new LazyQueryId();
5
+ }
6
+ class LazyQueryId {
7
+ #queryId;
8
+ get queryId() {
9
+ if (this.#queryId === undefined) {
10
+ this.#queryId = randomString(8);
11
+ }
12
+ return this.#queryId;
13
+ }
8
14
  }
@@ -1,5 +1,68 @@
1
1
  /// <reference types="./random-string.d.ts" />
2
- const CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
2
+ const CHARS = [
3
+ 'A',
4
+ 'B',
5
+ 'C',
6
+ 'D',
7
+ 'E',
8
+ 'F',
9
+ 'G',
10
+ 'H',
11
+ 'I',
12
+ 'J',
13
+ 'K',
14
+ 'L',
15
+ 'M',
16
+ 'N',
17
+ 'O',
18
+ 'P',
19
+ 'Q',
20
+ 'R',
21
+ 'S',
22
+ 'T',
23
+ 'U',
24
+ 'V',
25
+ 'W',
26
+ 'X',
27
+ 'Y',
28
+ 'Z',
29
+ 'a',
30
+ 'b',
31
+ 'c',
32
+ 'd',
33
+ 'e',
34
+ 'f',
35
+ 'g',
36
+ 'h',
37
+ 'i',
38
+ 'j',
39
+ 'k',
40
+ 'l',
41
+ 'm',
42
+ 'n',
43
+ 'o',
44
+ 'p',
45
+ 'q',
46
+ 'r',
47
+ 's',
48
+ 't',
49
+ 'u',
50
+ 'v',
51
+ 'w',
52
+ 'x',
53
+ 'y',
54
+ 'z',
55
+ '0',
56
+ '1',
57
+ '2',
58
+ '3',
59
+ '4',
60
+ '5',
61
+ '6',
62
+ '7',
63
+ '8',
64
+ '9',
65
+ ];
3
66
  export function randomString(length) {
4
67
  let chars = '';
5
68
  for (let i = 0; i < length; ++i) {
@@ -8,5 +71,5 @@ export function randomString(length) {
8
71
  return chars;
9
72
  }
10
73
  function randomChar() {
11
- return CHARS[Math.floor(Math.random() * CHARS.length)];
74
+ return CHARS[~~(Math.random() * CHARS.length)];
12
75
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kysely",
3
- "version": "0.16.9",
3
+ "version": "0.17.1",
4
4
  "description": "Type safe SQL query builder",
5
5
  "repository": {
6
6
  "type": "git",
@@ -47,22 +47,22 @@
47
47
  "@types/node": "^16.11.9"
48
48
  },
49
49
  "devDependencies": {
50
- "@types/better-sqlite3": "^7.4.1",
50
+ "@types/better-sqlite3": "^7.4.2",
51
51
  "@types/chai": "^4.3.0",
52
52
  "@types/chai-subset": "^1.3.3",
53
- "@types/mocha": "^9.0.0",
54
- "@types/pg": "^8.6.1",
55
- "better-sqlite3": "^7.4.5",
56
- "chai": "^4.3.4",
53
+ "@types/mocha": "^9.1.0",
54
+ "@types/pg": "^8.6.4",
55
+ "better-sqlite3": "^7.5.0",
56
+ "chai": "^4.3.6",
57
57
  "chai-subset": "^1.6.0",
58
- "esbuild": "^0.14.11",
59
- "mocha": "^9.1.3",
58
+ "esbuild": "^0.14.22",
59
+ "mocha": "^9.2.0",
60
60
  "mysql2": "^2.3.3",
61
- "pg": "^8.7.1",
62
- "playwright": "^1.17.2",
61
+ "pg": "^8.7.3",
62
+ "playwright": "^1.19.1",
63
63
  "prettier": "^2.5.1",
64
- "tsd": "^0.19.0",
65
- "typedoc": "^0.22.10",
66
- "typescript": "4.5.3"
64
+ "tsd": "^0.19.1",
65
+ "typedoc": "^0.22.11",
66
+ "typescript": "4.5.5"
67
67
  }
68
68
  }