kysely 0.3.4 → 0.3.9

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 (80) hide show
  1. package/.prettierignore +1 -0
  2. package/README.md +9 -0
  3. package/dist/cjs/dialect/postgres/postgres-driver.js +2 -1
  4. package/dist/cjs/driver/driver-config.d.ts +6 -0
  5. package/dist/cjs/index.d.ts +11 -0
  6. package/dist/cjs/index.js +1 -0
  7. package/dist/cjs/kysely.d.ts +25 -0
  8. package/dist/cjs/kysely.js +27 -0
  9. package/dist/cjs/operation-node/operation-node-transformer.js +2 -1
  10. package/dist/cjs/operation-node/select-query-node.d.ts +4 -2
  11. package/dist/cjs/operation-node/select-query-node.js +9 -1
  12. package/dist/cjs/parser/filter-parser.d.ts +6 -7
  13. package/dist/cjs/parser/filter-parser.js +10 -19
  14. package/dist/cjs/parser/insert-values-parser.d.ts +9 -1
  15. package/dist/cjs/parser/insert-values-parser.js +9 -5
  16. package/dist/cjs/parser/join-parser.d.ts +2 -2
  17. package/dist/cjs/parser/join-parser.js +1 -1
  18. package/dist/cjs/parser/mutation-parser.d.ts +2 -3
  19. package/dist/cjs/parser/reference-parser.d.ts +8 -3
  20. package/dist/cjs/parser/returning-parser.d.ts +2 -2
  21. package/dist/cjs/parser/select-parser.d.ts +6 -5
  22. package/dist/cjs/parser/select-parser.js +1 -1
  23. package/dist/cjs/parser/table-parser.d.ts +2 -2
  24. package/dist/cjs/parser/value-parser.d.ts +6 -7
  25. package/dist/cjs/parser/value-parser.js +3 -1
  26. package/dist/cjs/parser/with-parser.d.ts +2 -1
  27. package/dist/cjs/query-builder/join-builder.d.ts +9 -9
  28. package/dist/cjs/query-builder/join-builder.js +8 -8
  29. package/dist/cjs/query-builder/query-builder.d.ts +202 -106
  30. package/dist/cjs/query-builder/query-builder.js +44 -25
  31. package/dist/cjs/query-builder/type-utils.d.ts +23 -6
  32. package/dist/cjs/query-compiler/default-query-compiler.js +7 -6
  33. package/dist/cjs/query-creator.d.ts +2 -0
  34. package/dist/cjs/query-creator.js +2 -0
  35. package/dist/cjs/schema/alter-table-builder.d.ts +3 -2
  36. package/dist/cjs/schema/column-definition-builder.d.ts +3 -3
  37. package/dist/cjs/util/generated-placeholder.d.ts +3 -0
  38. package/dist/cjs/util/generated-placeholder.js +11 -0
  39. package/dist/cjs/util/object-utils.d.ts +1 -0
  40. package/dist/cjs/util/object-utils.js +2 -1
  41. package/dist/esm/dialect/postgres/postgres-driver.js +2 -1
  42. package/dist/esm/driver/driver-config.d.ts +6 -0
  43. package/dist/esm/index.d.ts +11 -0
  44. package/dist/esm/index.js +1 -0
  45. package/dist/esm/kysely.d.ts +25 -0
  46. package/dist/esm/kysely.js +27 -0
  47. package/dist/esm/operation-node/operation-node-transformer.js +2 -1
  48. package/dist/esm/operation-node/select-query-node.d.ts +4 -2
  49. package/dist/esm/operation-node/select-query-node.js +9 -1
  50. package/dist/esm/parser/filter-parser.d.ts +6 -7
  51. package/dist/esm/parser/filter-parser.js +5 -14
  52. package/dist/esm/parser/insert-values-parser.d.ts +9 -1
  53. package/dist/esm/parser/insert-values-parser.js +7 -3
  54. package/dist/esm/parser/join-parser.d.ts +2 -2
  55. package/dist/esm/parser/join-parser.js +2 -2
  56. package/dist/esm/parser/mutation-parser.d.ts +2 -3
  57. package/dist/esm/parser/reference-parser.d.ts +8 -3
  58. package/dist/esm/parser/reference-parser.js +1 -1
  59. package/dist/esm/parser/returning-parser.d.ts +2 -2
  60. package/dist/esm/parser/select-parser.d.ts +6 -5
  61. package/dist/esm/parser/select-parser.js +2 -2
  62. package/dist/esm/parser/table-parser.d.ts +2 -2
  63. package/dist/esm/parser/value-parser.d.ts +6 -7
  64. package/dist/esm/parser/value-parser.js +4 -2
  65. package/dist/esm/parser/with-parser.d.ts +2 -1
  66. package/dist/esm/query-builder/join-builder.d.ts +9 -9
  67. package/dist/esm/query-builder/join-builder.js +9 -9
  68. package/dist/esm/query-builder/query-builder.d.ts +202 -106
  69. package/dist/esm/query-builder/query-builder.js +46 -27
  70. package/dist/esm/query-builder/type-utils.d.ts +23 -6
  71. package/dist/esm/query-compiler/default-query-compiler.js +7 -6
  72. package/dist/esm/query-creator.d.ts +2 -0
  73. package/dist/esm/query-creator.js +2 -0
  74. package/dist/esm/schema/alter-table-builder.d.ts +3 -2
  75. package/dist/esm/schema/column-definition-builder.d.ts +3 -3
  76. package/dist/esm/util/generated-placeholder.d.ts +3 -0
  77. package/dist/esm/util/generated-placeholder.js +7 -0
  78. package/dist/esm/util/object-utils.d.ts +1 -0
  79. package/dist/esm/util/object-utils.js +1 -1
  80. package/package.json +2 -2
@@ -1,8 +1,8 @@
1
1
  import { aliasNode } from '../operation-node/alias-node.js';
2
2
  import { parseJoinArgs, } from '../parser/join-parser.js';
3
3
  import { parseSelectExpressionOrList, parseSelectAllArgs, } from '../parser/select-parser.js';
4
- import { parseFilterArgs, parseExistsFilterArgs, parseReferenceFilterArgs, } from '../parser/filter-parser.js';
5
- import { parseInsertValuesArgs } from '../parser/insert-values-parser.js';
4
+ import { parseFilter, parseExistExpression, parseReferenceFilter, } from '../parser/filter-parser.js';
5
+ import { parseInsertObjectOrList, } from '../parser/insert-values-parser.js';
6
6
  import { parseColumnName, parseReferenceExpression, parseReferenceExpressionOrList, } from '../parser/reference-parser.js';
7
7
  import { orderByItemNode, } from '../operation-node/order-by-item-node.js';
8
8
  import { selectQueryNode, } from '../operation-node/select-query-node.js';
@@ -42,7 +42,7 @@ export class QueryBuilder {
42
42
  ensureCanHaveWhereClause(this.#queryNode);
43
43
  return new QueryBuilder({
44
44
  executor: this.#executor,
45
- queryNode: queryNode.cloneWithWhere(this.#queryNode, 'and', parseFilterArgs('Where', args)),
45
+ queryNode: queryNode.cloneWithWhere(this.#queryNode, 'and', parseFilter('Where', args)),
46
46
  });
47
47
  }
48
48
  /**
@@ -72,7 +72,8 @@ export class QueryBuilder {
72
72
  * Usage in a subquery:
73
73
  *
74
74
  * ```ts
75
- * db.selectFrom('person)
75
+ * const persons = await db
76
+ * .selectFrom('person')
76
77
  * .selectAll('person')
77
78
  * .select((qb) => qb
78
79
  * .subQuery('pet')
@@ -81,6 +82,7 @@ export class QueryBuilder {
81
82
  * .limit(1)
82
83
  * .as('pet_name')
83
84
  * )
85
+ * .execute()
84
86
  * ```
85
87
  *
86
88
  * The generated SQL (postgresql):
@@ -90,21 +92,22 @@ export class QueryBuilder {
90
92
  * select "name"
91
93
  * from "pet"
92
94
  * where "pet"."owner_id" = "person"."id"
93
- * ) as pet_name
94
- * from "person"`
95
+ * limit $1
96
+ * ) as "pet_name"
97
+ * from "person"
95
98
  */
96
99
  whereRef(lhs, op, rhs) {
97
100
  ensureCanHaveWhereClause(this.#queryNode);
98
101
  return new QueryBuilder({
99
102
  executor: this.#executor,
100
- queryNode: queryNode.cloneWithWhere(this.#queryNode, 'and', parseReferenceFilterArgs(lhs, op, rhs)),
103
+ queryNode: queryNode.cloneWithWhere(this.#queryNode, 'and', parseReferenceFilter(lhs, op, rhs)),
101
104
  });
102
105
  }
103
106
  orWhere(...args) {
104
107
  ensureCanHaveWhereClause(this.#queryNode);
105
108
  return new QueryBuilder({
106
109
  executor: this.#executor,
107
- queryNode: queryNode.cloneWithWhere(this.#queryNode, 'or', parseFilterArgs('Where', args)),
110
+ queryNode: queryNode.cloneWithWhere(this.#queryNode, 'or', parseFilter('Where', args)),
108
111
  });
109
112
  }
110
113
  /**
@@ -117,7 +120,7 @@ export class QueryBuilder {
117
120
  ensureCanHaveWhereClause(this.#queryNode);
118
121
  return new QueryBuilder({
119
122
  executor: this.#executor,
120
- queryNode: queryNode.cloneWithWhere(this.#queryNode, 'or', parseReferenceFilterArgs(lhs, op, rhs)),
123
+ queryNode: queryNode.cloneWithWhere(this.#queryNode, 'or', parseReferenceFilter(lhs, op, rhs)),
121
124
  });
122
125
  }
123
126
  /**
@@ -129,7 +132,8 @@ export class QueryBuilder {
129
132
  * The query below selets all persons that own a pet named Catto:
130
133
  *
131
134
  * ```ts
132
- * db.selectFrom('person')
135
+ * const persons = await db
136
+ * .selectFrom('person')
133
137
  * .selectAll()
134
138
  * .whereExists((qb) => qb
135
139
  * .subQuery('pet')
@@ -137,6 +141,7 @@ export class QueryBuilder {
137
141
  * .whereRef('person.id', '=', 'pet.owner_id')
138
142
  * .where('pet.name', '=', 'Catto')
139
143
  * )
144
+ * .execute()
140
145
  * ```
141
146
  *
142
147
  * The generated SQL (postgresql):
@@ -181,7 +186,7 @@ export class QueryBuilder {
181
186
  ensureCanHaveWhereClause(this.#queryNode);
182
187
  return new QueryBuilder({
183
188
  executor: this.#executor,
184
- queryNode: queryNode.cloneWithWhere(this.#queryNode, 'and', parseExistsFilterArgs('exists', arg)),
189
+ queryNode: queryNode.cloneWithWhere(this.#queryNode, 'and', parseExistExpression('exists', arg)),
185
190
  });
186
191
  }
187
192
  /**
@@ -191,7 +196,7 @@ export class QueryBuilder {
191
196
  ensureCanHaveWhereClause(this.#queryNode);
192
197
  return new QueryBuilder({
193
198
  executor: this.#executor,
194
- queryNode: queryNode.cloneWithWhere(this.#queryNode, 'and', parseExistsFilterArgs('not exists', arg)),
199
+ queryNode: queryNode.cloneWithWhere(this.#queryNode, 'and', parseExistExpression('not exists', arg)),
195
200
  });
196
201
  }
197
202
  /**
@@ -201,7 +206,7 @@ export class QueryBuilder {
201
206
  ensureCanHaveWhereClause(this.#queryNode);
202
207
  return new QueryBuilder({
203
208
  executor: this.#executor,
204
- queryNode: queryNode.cloneWithWhere(this.#queryNode, 'or', parseExistsFilterArgs('exists', arg)),
209
+ queryNode: queryNode.cloneWithWhere(this.#queryNode, 'or', parseExistExpression('exists', arg)),
205
210
  });
206
211
  }
207
212
  /**
@@ -211,14 +216,14 @@ export class QueryBuilder {
211
216
  ensureCanHaveWhereClause(this.#queryNode);
212
217
  return new QueryBuilder({
213
218
  executor: this.#executor,
214
- queryNode: queryNode.cloneWithWhere(this.#queryNode, 'or', parseExistsFilterArgs('not exists', arg)),
219
+ queryNode: queryNode.cloneWithWhere(this.#queryNode, 'or', parseExistExpression('not exists', arg)),
215
220
  });
216
221
  }
217
222
  having(...args) {
218
223
  ensureCanHaveHavingClause(this.#queryNode);
219
224
  return new QueryBuilder({
220
225
  executor: this.#executor,
221
- queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'and', parseFilterArgs('Having', args)),
226
+ queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'and', parseFilter('Having', args)),
222
227
  });
223
228
  }
224
229
  /**
@@ -229,14 +234,14 @@ export class QueryBuilder {
229
234
  ensureCanHaveHavingClause(this.#queryNode);
230
235
  return new QueryBuilder({
231
236
  executor: this.#executor,
232
- queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'and', parseReferenceFilterArgs(lhs, op, rhs)),
237
+ queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'and', parseReferenceFilter(lhs, op, rhs)),
233
238
  });
234
239
  }
235
240
  orHaving(...args) {
236
241
  ensureCanHaveHavingClause(this.#queryNode);
237
242
  return new QueryBuilder({
238
243
  executor: this.#executor,
239
- queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'or', parseFilterArgs('Having', args)),
244
+ queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'or', parseFilter('Having', args)),
240
245
  });
241
246
  }
242
247
  /**
@@ -247,7 +252,7 @@ export class QueryBuilder {
247
252
  ensureCanHaveHavingClause(this.#queryNode);
248
253
  return new QueryBuilder({
249
254
  executor: this.#executor,
250
- queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'or', parseReferenceFilterArgs(lhs, op, rhs)),
255
+ queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'or', parseReferenceFilter(lhs, op, rhs)),
251
256
  });
252
257
  }
253
258
  /**
@@ -258,7 +263,7 @@ export class QueryBuilder {
258
263
  ensureCanHaveHavingClause(this.#queryNode);
259
264
  return new QueryBuilder({
260
265
  executor: this.#executor,
261
- queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'and', parseExistsFilterArgs('exists', arg)),
266
+ queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'and', parseExistExpression('exists', arg)),
262
267
  });
263
268
  }
264
269
  /**
@@ -269,7 +274,7 @@ export class QueryBuilder {
269
274
  ensureCanHaveHavingClause(this.#queryNode);
270
275
  return new QueryBuilder({
271
276
  executor: this.#executor,
272
- queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'and', parseExistsFilterArgs('not exists', arg)),
277
+ queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'and', parseExistExpression('not exists', arg)),
273
278
  });
274
279
  }
275
280
  /**
@@ -280,7 +285,7 @@ export class QueryBuilder {
280
285
  ensureCanHaveHavingClause(this.#queryNode);
281
286
  return new QueryBuilder({
282
287
  executor: this.#executor,
283
- queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'or', parseExistsFilterArgs('exists', arg)),
288
+ queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'or', parseExistExpression('exists', arg)),
284
289
  });
285
290
  }
286
291
  /**
@@ -291,7 +296,7 @@ export class QueryBuilder {
291
296
  ensureCanHaveHavingClause(this.#queryNode);
292
297
  return new QueryBuilder({
293
298
  executor: this.#executor,
294
- queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'or', parseExistsFilterArgs('not exists', arg)),
299
+ queryNode: selectQueryNode.cloneWithHaving(this.#queryNode, 'or', parseExistExpression('not exists', arg)),
295
300
  });
296
301
  }
297
302
  select(selection) {
@@ -309,13 +314,27 @@ export class QueryBuilder {
309
314
  });
310
315
  }
311
316
  /**
317
+ * Makes the selection distinct.
312
318
  *
319
+ * @example
320
+ * ```ts
321
+ * await db.selectFrom('person')
322
+ * .select('first_name')
323
+ * .distinct()
324
+ * .execute()
325
+ * ```
326
+ *
327
+ * The generated SQL (postgresql):
328
+ *
329
+ * ```sql
330
+ * select distinct "first_name" from "person"
331
+ * ```
313
332
  */
314
333
  distinct() {
315
334
  ensureCanHaveSelectClause(this.#queryNode);
316
335
  return new QueryBuilder({
317
336
  executor: this.#executor,
318
- queryNode: selectQueryNode.cloneWithModifier(this.#queryNode, 'Distinct'),
337
+ queryNode: selectQueryNode.cloneWithDistinct(this.#queryNode),
319
338
  });
320
339
  }
321
340
  /**
@@ -417,7 +436,7 @@ export class QueryBuilder {
417
436
  ensureCanHaveInsertValues(this.#queryNode);
418
437
  return new QueryBuilder({
419
438
  executor: this.#executor,
420
- queryNode: insertQueryNode.cloneWithColumnsAndValues(this.#queryNode, ...parseInsertValuesArgs(args)),
439
+ queryNode: insertQueryNode.cloneWithColumnsAndValues(this.#queryNode, ...parseInsertObjectOrList(args)),
421
440
  });
422
441
  }
423
442
  onConflictDoNothing(columns) {
@@ -435,7 +454,7 @@ export class QueryBuilder {
435
454
  });
436
455
  }
437
456
  /**
438
- * Sets the values to update for an `updateTable` query.
457
+ * Sets the values to update for an {@link Kysely.updateTable | update} query.
439
458
  *
440
459
  * This method takes an object whose keys are column names and values are
441
460
  * values to update. In addition to the column's type, the values can be `raw`
@@ -466,7 +485,7 @@ export class QueryBuilder {
466
485
  * ```
467
486
  *
468
487
  * @example
469
- * On postgresql you need to chain `returning` to the query to get
488
+ * On postgresql you ca chain `returning` to the query to get
470
489
  * the updated rows' columns (or any other expression) as the
471
490
  * return value:
472
491
  *
@@ -479,7 +498,7 @@ export class QueryBuilder {
479
498
  * })
480
499
  * .where('id', '=', 1)
481
500
  * .returning('id')
482
- * .executeTakeFirst()
501
+ * .executeTakeFirstOrThrow()
483
502
  *
484
503
  * row.id
485
504
  * ```
@@ -40,7 +40,7 @@ export declare type RowType<DB, TB extends keyof DB> = UnionToIntersection<DB[TB
40
40
  */
41
41
  export declare type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
42
42
  /**
43
- * Given a database type and a union of table name in that db returns
43
+ * Given a database type and a union of table names in that db, returns
44
44
  * a union type with all possible column names.
45
45
  *
46
46
  * Example:
@@ -74,7 +74,7 @@ export declare type AnyColumn<DB, TB extends keyof DB> = {
74
74
  [T in TB]: keyof DB[T];
75
75
  }[TB];
76
76
  /**
77
- * Given a database type and a union of table names in that db returns
77
+ * Given a database type and a union of table names in that db, returns
78
78
  * a union type with all possible `table`.`column` combinations.
79
79
  *
80
80
  * Example:
@@ -107,29 +107,46 @@ export declare type AnyColumn<DB, TB extends keyof DB> = {
107
107
  export declare type AnyColumnWithTable<DB, TB extends keyof DB> = {
108
108
  [T in TB]: T extends string ? keyof DB[T] extends string ? `${T}.${keyof DB[T]}` : never : never;
109
109
  }[TB];
110
+ /**
111
+ * Just like {@link AnyColumn} but with a ` as <string>` suffix.
112
+ */
110
113
  export declare type AnyAliasedColumn<DB, TB extends keyof DB> = {
111
114
  [T in TB]: T extends string ? keyof DB[T] extends string ? `${keyof DB[T]} as ${string}` : never : never;
112
115
  }[TB];
113
- export declare type AnyAliasedColumnWithTable<DB, TB extends keyof DB> = `${AnyColumnWithTable<DB, TB>} as ${string}`;
114
116
  /**
115
- * Extracts an array item type.
117
+ * Just like {@link AnyColumnWithTable} but with a ` as <string>` suffix.
118
+ */
119
+ export declare type AnyAliasedColumnWithTable<DB, TB extends keyof DB> = {
120
+ [T in TB]: T extends string ? keyof DB[T] extends string ? `${T}.${keyof DB[T]} as ${string}` : never : never;
121
+ }[TB];
122
+ /**
123
+ * Extracts the item type of an array.
116
124
  */
117
125
  export declare type ArrayItemType<T> = T extends ReadonlyArray<infer I> ? I : never;
118
126
  export declare type AnyQueryBuilder = QueryBuilder<any, any, any>;
119
127
  export declare type AnyAliasedQueryBuilder = AliasedQueryBuilder<any, any, any, any>;
128
+ export declare type AnyRawBuilder = RawBuilder<any>;
129
+ export declare type AnyAliasedRawBuilder = AliasedRawBuilder<any, any>;
120
130
  export declare type QueryBuilderFactory<DB, TB extends keyof DB> = (qb: SubQueryBuilder<DB, TB>) => QueryBuilder<any, any, any>;
121
131
  export declare type AliasedQueryBuilderFactory<DB, TB extends keyof DB> = (qb: SubQueryBuilder<DB, TB>) => AnyAliasedQueryBuilder;
122
- export declare type RawBuilderFactory<DB, TB extends keyof DB> = (qb: SubQueryBuilder<DB, TB>) => RawBuilder<any>;
123
- export declare type AliasedRawBuilderFactory<DB, TB extends keyof DB> = (qb: SubQueryBuilder<DB, TB>) => AliasedRawBuilder<any, any>;
132
+ export declare type RawBuilderFactory<DB, TB extends keyof DB> = (qb: SubQueryBuilder<DB, TB>) => AnyRawBuilder;
133
+ export declare type AliasedRawBuilderFactory<DB, TB extends keyof DB> = (qb: SubQueryBuilder<DB, TB>) => AnyAliasedRawBuilder;
124
134
  export interface InsertResultTypeTag {
135
+ /** @internal */
125
136
  __isInsertResultTypeTag__: true;
126
137
  }
127
138
  export interface DeleteResultTypeTag {
139
+ /** @internal */
128
140
  __isDeleteResultTypeTag__: true;
129
141
  }
130
142
  export interface UpdateResultTypeTag {
143
+ /** @internal */
131
144
  __isUpdateResultTypeTag__: true;
132
145
  }
146
+ export interface GeneratedPlaceholder {
147
+ /** @internal */
148
+ __isGeneratedPlaceholder__: true;
149
+ }
133
150
  export declare type ManyResultRowType<O> = O extends InsertResultTypeTag ? number | undefined : O extends DeleteResultTypeTag ? number : O extends UpdateResultTypeTag ? number : O;
134
151
  export declare type SingleResultRowType<O> = O extends InsertResultTypeTag ? number | undefined : O extends DeleteResultTypeTag ? number : O extends UpdateResultTypeTag ? number : O | undefined;
135
152
  export declare type NonEmptySingleResultRowType<O> = O extends InsertResultTypeTag ? number : O extends DeleteResultTypeTag ? number : O extends UpdateResultTypeTag ? number : O;
@@ -35,8 +35,8 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
35
35
  this.compileDistinctOn(node.distinctOnSelections);
36
36
  this.append(' ');
37
37
  }
38
- if (node.modifier === 'Distinct') {
39
- this.append(SELECT_MODIFIER_SQL[node.modifier]);
38
+ if (node.isDistinct) {
39
+ this.append('distinct');
40
40
  this.append(' ');
41
41
  }
42
42
  if (node.selections) {
@@ -72,9 +72,11 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
72
72
  this.append(' ');
73
73
  this.visitNode(node.offset);
74
74
  }
75
- if (node.modifier) {
76
- this.append(' ');
77
- this.append(SELECT_MODIFIER_SQL[node.modifier]);
75
+ if (node.modifiers) {
76
+ node.modifiers.forEach((modifier) => {
77
+ this.append(' ');
78
+ this.append(SELECT_MODIFIER_SQL[modifier]);
79
+ });
78
80
  }
79
81
  if (isSubQuery) {
80
82
  this.append(')');
@@ -622,7 +624,6 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
622
624
  }
623
625
  }
624
626
  const SELECT_MODIFIER_SQL = {
625
- Distinct: 'distinct',
626
627
  ForKeyShare: 'for key share',
627
628
  ForNoKeyUpdate: 'for no key update',
628
629
  ForUpdate: 'for update',
@@ -138,6 +138,7 @@ export declare class QueryCreator<DB> {
138
138
  * const maybePrimaryKey: number | undefined = await db
139
139
  * .insertInto('person')
140
140
  * .values({
141
+ * id: db.generated,
141
142
  * first_name: 'Jennifer',
142
143
  * last_name: 'Aniston'
143
144
  * })
@@ -151,6 +152,7 @@ export declare class QueryCreator<DB> {
151
152
  * const { id } = await db
152
153
  * .insertInto('person')
153
154
  * .values({
155
+ * id: db.generated,
154
156
  * first_name: 'Jennifer',
155
157
  * last_name: 'Aniston'
156
158
  * })
@@ -40,6 +40,7 @@ export class QueryCreator {
40
40
  * const maybePrimaryKey: number | undefined = await db
41
41
  * .insertInto('person')
42
42
  * .values({
43
+ * id: db.generated,
43
44
  * first_name: 'Jennifer',
44
45
  * last_name: 'Aniston'
45
46
  * })
@@ -53,6 +54,7 @@ export class QueryCreator {
53
54
  * const { id } = await db
54
55
  * .insertInto('person')
55
56
  * .values({
57
+ * id: db.generated,
56
58
  * first_name: 'Jennifer',
57
59
  * last_name: 'Aniston'
58
60
  * })
@@ -9,6 +9,7 @@ import { Compilable } from '../util/compilable.js';
9
9
  import { PrimitiveValue } from '../util/object-utils.js';
10
10
  import { QueryExecutor } from '../query-executor/query-executor.js';
11
11
  import { ColumnDefinitionBuilder, ColumnDefinitionBuilderInterface } from './column-definition-builder.js';
12
+ import { AnyRawBuilder } from '../query-builder/type-utils.js';
12
13
  export declare class AlterTableBuilder {
13
14
  #private;
14
15
  constructor(args: AlterTableBuilderConstructorArgs);
@@ -23,7 +24,7 @@ export declare class AlterColumnBuilder {
23
24
  #private;
24
25
  constructor(args: AlterColumnBuilderConstructorArgs);
25
26
  setDataType(dataType: ColumnDataType): AlterTableExecutor;
26
- setDefault(value: PrimitiveValue | RawBuilder<any>): AlterTableExecutor;
27
+ setDefault(value: PrimitiveValue | AnyRawBuilder): AlterTableExecutor;
27
28
  dropDefault(): AlterTableExecutor;
28
29
  setNotNull(): AlterTableExecutor;
29
30
  dropNotNull(): AlterTableExecutor;
@@ -44,7 +45,7 @@ export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuild
44
45
  onDelete(onDelete: OnDelete): AlterTableAddColumnBuilder;
45
46
  unique(): AlterTableAddColumnBuilder;
46
47
  notNull(): AlterTableAddColumnBuilder;
47
- defaultTo(value: PrimitiveValue | RawBuilder<any>): AlterTableAddColumnBuilder;
48
+ defaultTo(value: PrimitiveValue | AnyRawBuilder): AlterTableAddColumnBuilder;
48
49
  check(sql: string): AlterTableAddColumnBuilder;
49
50
  toOperationNode(): AlterTableNode;
50
51
  compile(): CompiledQuery;
@@ -1,8 +1,8 @@
1
1
  import { OperationNodeSource } from '../operation-node/operation-node-source.js';
2
2
  import { OnDelete } from '../operation-node/references-node.js';
3
- import { RawBuilder } from '../raw-builder/raw-builder.js';
4
3
  import { PrimitiveValue } from '../util/object-utils.js';
5
4
  import { ColumnDefinitionNode } from '../operation-node/column-definition-node.js';
5
+ import { AnyRawBuilder } from '../query-builder/type-utils.js';
6
6
  export interface ColumnDefinitionBuilderInterface<R> {
7
7
  /**
8
8
  * Makes the column automatically incrementing.
@@ -51,7 +51,7 @@ export interface ColumnDefinitionBuilderInterface<R> {
51
51
  * .execute()
52
52
  * ```
53
53
  */
54
- defaultTo(value: PrimitiveValue | RawBuilder<any>): R;
54
+ defaultTo(value: PrimitiveValue | AnyRawBuilder): R;
55
55
  /**
56
56
  * Adds a check constraint for the column.
57
57
  *
@@ -74,7 +74,7 @@ export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderI
74
74
  onDelete(onDelete: OnDelete): ColumnDefinitionBuilder;
75
75
  unique(): ColumnDefinitionBuilder;
76
76
  notNull(): ColumnDefinitionBuilder;
77
- defaultTo(value: PrimitiveValue | RawBuilder<any>): ColumnDefinitionBuilder;
77
+ defaultTo(value: PrimitiveValue | AnyRawBuilder): ColumnDefinitionBuilder;
78
78
  check(sql: string): ColumnDefinitionBuilder;
79
79
  toOperationNode(): ColumnDefinitionNode;
80
80
  }
@@ -0,0 +1,3 @@
1
+ import { GeneratedPlaceholder } from '../query-builder/type-utils';
2
+ export declare const generatedPlaceholder: GeneratedPlaceholder;
3
+ export declare function isGeneratedPlaceholder(obj: unknown): obj is GeneratedPlaceholder;
@@ -0,0 +1,7 @@
1
+ import { freeze, isObject } from './object-utils';
2
+ export const generatedPlaceholder = freeze({
3
+ __isGeneratedPlaceholder__: true,
4
+ });
5
+ export function isGeneratedPlaceholder(obj) {
6
+ return isObject(obj) && obj.__isGeneratedPlaceholder__ === true;
7
+ }
@@ -15,3 +15,4 @@ export declare function getLast<T>(arr: ArrayLike<T>): T | undefined;
15
15
  export declare function freeze<T>(obj: T): Readonly<T>;
16
16
  export declare function asArray<T>(arg: T | T[]): T[];
17
17
  export declare function asReadonlyArray<T>(arg: T | ReadonlyArray<T>): ReadonlyArray<T>;
18
+ export declare function isReadonlyArray(arg: unknown): arg is ReadonlyArray<unknown>;
@@ -65,6 +65,6 @@ export function asReadonlyArray(arg) {
65
65
  return freeze([arg]);
66
66
  }
67
67
  }
68
- function isReadonlyArray(arg) {
68
+ export function isReadonlyArray(arg) {
69
69
  return Array.isArray(arg);
70
70
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kysely",
3
- "version": "0.3.4",
3
+ "version": "0.3.9",
4
4
  "description": "Type safe SQL query builder",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,7 +24,7 @@
24
24
  "build": "npm run clean && npm run build:esm && npm run build:cjs && ./module-fixup.sh",
25
25
  "build:esm": "tsc -p tsconfig.json",
26
26
  "build:cjs": "tsc -p tsconfig-cjs.json",
27
- "docs:build": "typedoc --excludePrivate --excludeInternal src/index.ts && npm run docs:postprocess",
27
+ "docs:build": "typedoc --excludePrivate --excludeInternal --customCss ./docs-theme.css src/index.ts && npm run docs:postprocess",
28
28
  "docs:postprocess": "node post-process-docs.js",
29
29
  "prepublish": "npm run build"
30
30
  },