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
@@ -45,7 +45,7 @@ class QueryBuilder {
45
45
  ensureCanHaveWhereClause(this.#queryNode);
46
46
  return new QueryBuilder({
47
47
  executor: this.#executor,
48
- queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'and', filter_parser_js_1.parseFilterArgs('Where', args)),
48
+ queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'and', filter_parser_js_1.parseFilter('Where', args)),
49
49
  });
50
50
  }
51
51
  /**
@@ -75,7 +75,8 @@ class QueryBuilder {
75
75
  * Usage in a subquery:
76
76
  *
77
77
  * ```ts
78
- * db.selectFrom('person)
78
+ * const persons = await db
79
+ * .selectFrom('person')
79
80
  * .selectAll('person')
80
81
  * .select((qb) => qb
81
82
  * .subQuery('pet')
@@ -84,6 +85,7 @@ class QueryBuilder {
84
85
  * .limit(1)
85
86
  * .as('pet_name')
86
87
  * )
88
+ * .execute()
87
89
  * ```
88
90
  *
89
91
  * The generated SQL (postgresql):
@@ -93,21 +95,22 @@ class QueryBuilder {
93
95
  * select "name"
94
96
  * from "pet"
95
97
  * where "pet"."owner_id" = "person"."id"
96
- * ) as pet_name
97
- * from "person"`
98
+ * limit $1
99
+ * ) as "pet_name"
100
+ * from "person"
98
101
  */
99
102
  whereRef(lhs, op, rhs) {
100
103
  ensureCanHaveWhereClause(this.#queryNode);
101
104
  return new QueryBuilder({
102
105
  executor: this.#executor,
103
- queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'and', filter_parser_js_1.parseReferenceFilterArgs(lhs, op, rhs)),
106
+ queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'and', filter_parser_js_1.parseReferenceFilter(lhs, op, rhs)),
104
107
  });
105
108
  }
106
109
  orWhere(...args) {
107
110
  ensureCanHaveWhereClause(this.#queryNode);
108
111
  return new QueryBuilder({
109
112
  executor: this.#executor,
110
- queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'or', filter_parser_js_1.parseFilterArgs('Where', args)),
113
+ queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'or', filter_parser_js_1.parseFilter('Where', args)),
111
114
  });
112
115
  }
113
116
  /**
@@ -120,7 +123,7 @@ class QueryBuilder {
120
123
  ensureCanHaveWhereClause(this.#queryNode);
121
124
  return new QueryBuilder({
122
125
  executor: this.#executor,
123
- queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'or', filter_parser_js_1.parseReferenceFilterArgs(lhs, op, rhs)),
126
+ queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'or', filter_parser_js_1.parseReferenceFilter(lhs, op, rhs)),
124
127
  });
125
128
  }
126
129
  /**
@@ -132,7 +135,8 @@ class QueryBuilder {
132
135
  * The query below selets all persons that own a pet named Catto:
133
136
  *
134
137
  * ```ts
135
- * db.selectFrom('person')
138
+ * const persons = await db
139
+ * .selectFrom('person')
136
140
  * .selectAll()
137
141
  * .whereExists((qb) => qb
138
142
  * .subQuery('pet')
@@ -140,6 +144,7 @@ class QueryBuilder {
140
144
  * .whereRef('person.id', '=', 'pet.owner_id')
141
145
  * .where('pet.name', '=', 'Catto')
142
146
  * )
147
+ * .execute()
143
148
  * ```
144
149
  *
145
150
  * The generated SQL (postgresql):
@@ -184,7 +189,7 @@ class QueryBuilder {
184
189
  ensureCanHaveWhereClause(this.#queryNode);
185
190
  return new QueryBuilder({
186
191
  executor: this.#executor,
187
- queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'and', filter_parser_js_1.parseExistsFilterArgs('exists', arg)),
192
+ queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'and', filter_parser_js_1.parseExistExpression('exists', arg)),
188
193
  });
189
194
  }
190
195
  /**
@@ -194,7 +199,7 @@ class QueryBuilder {
194
199
  ensureCanHaveWhereClause(this.#queryNode);
195
200
  return new QueryBuilder({
196
201
  executor: this.#executor,
197
- queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'and', filter_parser_js_1.parseExistsFilterArgs('not exists', arg)),
202
+ queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'and', filter_parser_js_1.parseExistExpression('not exists', arg)),
198
203
  });
199
204
  }
200
205
  /**
@@ -204,7 +209,7 @@ class QueryBuilder {
204
209
  ensureCanHaveWhereClause(this.#queryNode);
205
210
  return new QueryBuilder({
206
211
  executor: this.#executor,
207
- queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'or', filter_parser_js_1.parseExistsFilterArgs('exists', arg)),
212
+ queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'or', filter_parser_js_1.parseExistExpression('exists', arg)),
208
213
  });
209
214
  }
210
215
  /**
@@ -214,14 +219,14 @@ class QueryBuilder {
214
219
  ensureCanHaveWhereClause(this.#queryNode);
215
220
  return new QueryBuilder({
216
221
  executor: this.#executor,
217
- queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'or', filter_parser_js_1.parseExistsFilterArgs('not exists', arg)),
222
+ queryNode: query_node_js_1.queryNode.cloneWithWhere(this.#queryNode, 'or', filter_parser_js_1.parseExistExpression('not exists', arg)),
218
223
  });
219
224
  }
220
225
  having(...args) {
221
226
  ensureCanHaveHavingClause(this.#queryNode);
222
227
  return new QueryBuilder({
223
228
  executor: this.#executor,
224
- queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'and', filter_parser_js_1.parseFilterArgs('Having', args)),
229
+ queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'and', filter_parser_js_1.parseFilter('Having', args)),
225
230
  });
226
231
  }
227
232
  /**
@@ -232,14 +237,14 @@ class QueryBuilder {
232
237
  ensureCanHaveHavingClause(this.#queryNode);
233
238
  return new QueryBuilder({
234
239
  executor: this.#executor,
235
- queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'and', filter_parser_js_1.parseReferenceFilterArgs(lhs, op, rhs)),
240
+ queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'and', filter_parser_js_1.parseReferenceFilter(lhs, op, rhs)),
236
241
  });
237
242
  }
238
243
  orHaving(...args) {
239
244
  ensureCanHaveHavingClause(this.#queryNode);
240
245
  return new QueryBuilder({
241
246
  executor: this.#executor,
242
- queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'or', filter_parser_js_1.parseFilterArgs('Having', args)),
247
+ queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'or', filter_parser_js_1.parseFilter('Having', args)),
243
248
  });
244
249
  }
245
250
  /**
@@ -250,7 +255,7 @@ class QueryBuilder {
250
255
  ensureCanHaveHavingClause(this.#queryNode);
251
256
  return new QueryBuilder({
252
257
  executor: this.#executor,
253
- queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'or', filter_parser_js_1.parseReferenceFilterArgs(lhs, op, rhs)),
258
+ queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'or', filter_parser_js_1.parseReferenceFilter(lhs, op, rhs)),
254
259
  });
255
260
  }
256
261
  /**
@@ -261,7 +266,7 @@ class QueryBuilder {
261
266
  ensureCanHaveHavingClause(this.#queryNode);
262
267
  return new QueryBuilder({
263
268
  executor: this.#executor,
264
- queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'and', filter_parser_js_1.parseExistsFilterArgs('exists', arg)),
269
+ queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'and', filter_parser_js_1.parseExistExpression('exists', arg)),
265
270
  });
266
271
  }
267
272
  /**
@@ -272,7 +277,7 @@ class QueryBuilder {
272
277
  ensureCanHaveHavingClause(this.#queryNode);
273
278
  return new QueryBuilder({
274
279
  executor: this.#executor,
275
- queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'and', filter_parser_js_1.parseExistsFilterArgs('not exists', arg)),
280
+ queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'and', filter_parser_js_1.parseExistExpression('not exists', arg)),
276
281
  });
277
282
  }
278
283
  /**
@@ -283,7 +288,7 @@ class QueryBuilder {
283
288
  ensureCanHaveHavingClause(this.#queryNode);
284
289
  return new QueryBuilder({
285
290
  executor: this.#executor,
286
- queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'or', filter_parser_js_1.parseExistsFilterArgs('exists', arg)),
291
+ queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'or', filter_parser_js_1.parseExistExpression('exists', arg)),
287
292
  });
288
293
  }
289
294
  /**
@@ -294,7 +299,7 @@ class QueryBuilder {
294
299
  ensureCanHaveHavingClause(this.#queryNode);
295
300
  return new QueryBuilder({
296
301
  executor: this.#executor,
297
- queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'or', filter_parser_js_1.parseExistsFilterArgs('not exists', arg)),
302
+ queryNode: select_query_node_js_1.selectQueryNode.cloneWithHaving(this.#queryNode, 'or', filter_parser_js_1.parseExistExpression('not exists', arg)),
298
303
  });
299
304
  }
300
305
  select(selection) {
@@ -312,13 +317,27 @@ class QueryBuilder {
312
317
  });
313
318
  }
314
319
  /**
320
+ * Makes the selection distinct.
315
321
  *
322
+ * @example
323
+ * ```ts
324
+ * await db.selectFrom('person')
325
+ * .select('first_name')
326
+ * .distinct()
327
+ * .execute()
328
+ * ```
329
+ *
330
+ * The generated SQL (postgresql):
331
+ *
332
+ * ```sql
333
+ * select distinct "first_name" from "person"
334
+ * ```
316
335
  */
317
336
  distinct() {
318
337
  ensureCanHaveSelectClause(this.#queryNode);
319
338
  return new QueryBuilder({
320
339
  executor: this.#executor,
321
- queryNode: select_query_node_js_1.selectQueryNode.cloneWithModifier(this.#queryNode, 'Distinct'),
340
+ queryNode: select_query_node_js_1.selectQueryNode.cloneWithDistinct(this.#queryNode),
322
341
  });
323
342
  }
324
343
  /**
@@ -420,7 +439,7 @@ class QueryBuilder {
420
439
  ensureCanHaveInsertValues(this.#queryNode);
421
440
  return new QueryBuilder({
422
441
  executor: this.#executor,
423
- queryNode: insert_query_node_js_1.insertQueryNode.cloneWithColumnsAndValues(this.#queryNode, ...insert_values_parser_js_1.parseInsertValuesArgs(args)),
442
+ queryNode: insert_query_node_js_1.insertQueryNode.cloneWithColumnsAndValues(this.#queryNode, ...insert_values_parser_js_1.parseInsertObjectOrList(args)),
424
443
  });
425
444
  }
426
445
  onConflictDoNothing(columns) {
@@ -438,7 +457,7 @@ class QueryBuilder {
438
457
  });
439
458
  }
440
459
  /**
441
- * Sets the values to update for an `updateTable` query.
460
+ * Sets the values to update for an {@link Kysely.updateTable | update} query.
442
461
  *
443
462
  * This method takes an object whose keys are column names and values are
444
463
  * values to update. In addition to the column's type, the values can be `raw`
@@ -469,7 +488,7 @@ class QueryBuilder {
469
488
  * ```
470
489
  *
471
490
  * @example
472
- * On postgresql you need to chain `returning` to the query to get
491
+ * On postgresql you ca chain `returning` to the query to get
473
492
  * the updated rows' columns (or any other expression) as the
474
493
  * return value:
475
494
  *
@@ -482,7 +501,7 @@ class QueryBuilder {
482
501
  * })
483
502
  * .where('id', '=', 1)
484
503
  * .returning('id')
485
- * .executeTakeFirst()
504
+ * .executeTakeFirstOrThrow()
486
505
  *
487
506
  * row.id
488
507
  * ```
@@ -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;
@@ -38,8 +38,8 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
38
38
  this.compileDistinctOn(node.distinctOnSelections);
39
39
  this.append(' ');
40
40
  }
41
- if (node.modifier === 'Distinct') {
42
- this.append(SELECT_MODIFIER_SQL[node.modifier]);
41
+ if (node.isDistinct) {
42
+ this.append('distinct');
43
43
  this.append(' ');
44
44
  }
45
45
  if (node.selections) {
@@ -75,9 +75,11 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
75
75
  this.append(' ');
76
76
  this.visitNode(node.offset);
77
77
  }
78
- if (node.modifier) {
79
- this.append(' ');
80
- this.append(SELECT_MODIFIER_SQL[node.modifier]);
78
+ if (node.modifiers) {
79
+ node.modifiers.forEach((modifier) => {
80
+ this.append(' ');
81
+ this.append(SELECT_MODIFIER_SQL[modifier]);
82
+ });
81
83
  }
82
84
  if (isSubQuery) {
83
85
  this.append(')');
@@ -626,7 +628,6 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
626
628
  }
627
629
  exports.DefaultQueryCompiler = DefaultQueryCompiler;
628
630
  const SELECT_MODIFIER_SQL = {
629
- Distinct: 'distinct',
630
631
  ForKeyShare: 'for key share',
631
632
  ForNoKeyUpdate: 'for no key update',
632
633
  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
  * })
@@ -43,6 +43,7 @@ class QueryCreator {
43
43
  * const maybePrimaryKey: number | undefined = await db
44
44
  * .insertInto('person')
45
45
  * .values({
46
+ * id: db.generated,
46
47
  * first_name: 'Jennifer',
47
48
  * last_name: 'Aniston'
48
49
  * })
@@ -56,6 +57,7 @@ class QueryCreator {
56
57
  * const { id } = await db
57
58
  * .insertInto('person')
58
59
  * .values({
60
+ * id: db.generated,
59
61
  * first_name: 'Jennifer',
60
62
  * last_name: 'Aniston'
61
63
  * })
@@ -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,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isGeneratedPlaceholder = exports.generatedPlaceholder = void 0;
4
+ const object_utils_1 = require("./object-utils");
5
+ exports.generatedPlaceholder = object_utils_1.freeze({
6
+ __isGeneratedPlaceholder__: true,
7
+ });
8
+ function isGeneratedPlaceholder(obj) {
9
+ return object_utils_1.isObject(obj) && obj.__isGeneratedPlaceholder__ === true;
10
+ }
11
+ exports.isGeneratedPlaceholder = isGeneratedPlaceholder;
@@ -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>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.asReadonlyArray = exports.asArray = exports.freeze = exports.getLast = exports.isObject = exports.isFunction = exports.isPrimitive = exports.isBigInt = exports.isBuffer = exports.isDate = exports.isNull = exports.isBoolean = exports.isNumber = exports.isString = exports.isEmpty = void 0;
3
+ exports.isReadonlyArray = exports.asReadonlyArray = exports.asArray = exports.freeze = exports.getLast = exports.isObject = exports.isFunction = exports.isPrimitive = exports.isBigInt = exports.isBuffer = exports.isDate = exports.isNull = exports.isBoolean = exports.isNumber = exports.isString = exports.isEmpty = void 0;
4
4
  function isEmpty(obj) {
5
5
  if (Array.isArray(obj) || isString(obj) || Buffer.isBuffer(obj)) {
6
6
  return obj.length === 0;
@@ -86,3 +86,4 @@ exports.asReadonlyArray = asReadonlyArray;
86
86
  function isReadonlyArray(arg) {
87
87
  return Array.isArray(arg);
88
88
  }
89
+ exports.isReadonlyArray = isReadonlyArray;
@@ -23,6 +23,7 @@ export class PostgresDriver extends Driver {
23
23
  port: cfg.port,
24
24
  user: cfg.user,
25
25
  password: cfg.password,
26
+ ssl: cfg.ssl,
26
27
  // Pool options.
27
28
  connectionTimeoutMillis: cfg.pool.connectionTimeoutMillis,
28
29
  idleTimeoutMillis: cfg.pool.idleTimeoutMillis,
@@ -59,7 +60,7 @@ export class PostgresDriver extends Driver {
59
60
  async function importPgPool() {
60
61
  try {
61
62
  // For this to work with both esm and cjs modules we need
62
- // this hacky craph here.
63
+ // this hacky crap here.
63
64
  const pg = (await import('pg'));
64
65
  if (isFunction(pg.Pool)) {
65
66
  return pg.Pool;
@@ -1,3 +1,5 @@
1
+ /// <reference types="node" />
2
+ import { SecureContextOptions } from 'tls';
1
3
  import { DatabaseConnection } from './database-connection.js';
2
4
  export interface DriverConfig {
3
5
  /**
@@ -24,6 +26,10 @@ export interface DriverConfig {
24
26
  * Connection pooling config.
25
27
  */
26
28
  pool?: PoolConfig;
29
+ /**
30
+ * Optional SSL configuration.
31
+ */
32
+ ssl?: SecureContextOptions;
27
33
  }
28
34
  export interface PoolConfig {
29
35
  /**
@@ -95,4 +95,15 @@ export * from './operation-node/offset-node.js';
95
95
  export * from './operation-node//on-conflict-node.js';
96
96
  export * from './operation-node/operation-node.js';
97
97
  export * from './operation-node/operation-node-source.js';
98
+ export * from './operation-node/order-by-node.js';
98
99
  export * from './util/compilable.js';
100
+ export { AnyColumn } from './query-builder/type-utils.js';
101
+ export { SelectExpression, SelectExpressionOrList, } from './parser/select-parser';
102
+ export { ReferenceExpression, ReferenceExpressionOrList, } from './parser/reference-parser';
103
+ export { ValueExpression, ValueExpressionOrList } from './parser/value-parser';
104
+ export { ExistsExpression, FilterOperator } from './parser/filter-parser';
105
+ export { TableExpression } from './parser/table-parser';
106
+ export { JoinReferenceExpression, JoinCallbackExpression, } from './parser/join-parser';
107
+ export { InsertObject } from './parser/insert-values-parser';
108
+ export { MutationObject } from './parser/mutation-parser';
109
+ export { OrderByExpression } from './parser/order-by-parser';
package/dist/esm/index.js CHANGED
@@ -95,4 +95,5 @@ export * from './operation-node/offset-node.js';
95
95
  export * from './operation-node//on-conflict-node.js';
96
96
  export * from './operation-node/operation-node.js';
97
97
  export * from './operation-node/operation-node-source.js';
98
+ export * from './operation-node/order-by-node.js';
98
99
  export * from './util/compilable.js';
@@ -8,6 +8,7 @@ import { MigrationModule } from './migration/migration.js';
8
8
  import { QueryExecutor } from './query-executor/query-executor.js';
9
9
  import { QueryCreator } from './query-creator.js';
10
10
  import { KyselyPlugin } from './plugin/plugin.js';
11
+ import { GeneratedPlaceholder } from './query-builder/type-utils.js';
11
12
  /**
12
13
  * The main Kysely class.
13
14
  *
@@ -62,6 +63,30 @@ export declare class Kysely<DB> extends QueryCreator<DB> {
62
63
  * passing in dynamic values for the queries.
63
64
  */
64
65
  get dynamic(): DynamicModule;
66
+ /**
67
+ * A value to be used in place of columns that are generated in the database
68
+ * when inserting rows.
69
+ *
70
+ * @example
71
+ * In this example the `Person` table has non-null properties `id` and `created_at`
72
+ * which are both automatically genereted by the database. Since their types are
73
+ * `number` and `string` respectively instead of `number | null` and `string | null`
74
+ * the `values` method requires you to give a value for them. the `generated`
75
+ * placeholder can be used in these cases.
76
+ *
77
+ * ```ts
78
+ * await db.insertInto('person')
79
+ * .values({
80
+ * id: db.generated,
81
+ * created_at: db.generated,
82
+ * first_name: 'Jennifer',
83
+ * last_name: 'Aniston',
84
+ * gender: 'female'
85
+ * })
86
+ * .execute()
87
+ * ```
88
+ */
89
+ get generated(): GeneratedPlaceholder;
65
90
  /**
66
91
  * Starts a transaction. If the callback throws the transaction is rolled back,
67
92
  * otherwise it's committed.
@@ -8,6 +8,7 @@ import { INTERNAL_DRIVER_ACQUIRE_CONNECTION, INTERNAL_DRIVER_ENSURE_DESTROY, INT
8
8
  import { MigrationModule } from './migration/migration.js';
9
9
  import { DefaultQueryExecutor, } from './query-executor/query-executor.js';
10
10
  import { QueryCreator } from './query-creator.js';
11
+ import { generatedPlaceholder } from './util/generated-placeholder.js';
11
12
  /**
12
13
  * The main Kysely class.
13
14
  *
@@ -94,6 +95,32 @@ export class Kysely extends QueryCreator {
94
95
  get dynamic() {
95
96
  return new DynamicModule();
96
97
  }
98
+ /**
99
+ * A value to be used in place of columns that are generated in the database
100
+ * when inserting rows.
101
+ *
102
+ * @example
103
+ * In this example the `Person` table has non-null properties `id` and `created_at`
104
+ * which are both automatically genereted by the database. Since their types are
105
+ * `number` and `string` respectively instead of `number | null` and `string | null`
106
+ * the `values` method requires you to give a value for them. the `generated`
107
+ * placeholder can be used in these cases.
108
+ *
109
+ * ```ts
110
+ * await db.insertInto('person')
111
+ * .values({
112
+ * id: db.generated,
113
+ * created_at: db.generated,
114
+ * first_name: 'Jennifer',
115
+ * last_name: 'Aniston',
116
+ * gender: 'female'
117
+ * })
118
+ * .execute()
119
+ * ```
120
+ */
121
+ get generated() {
122
+ return generatedPlaceholder;
123
+ }
97
124
  /**
98
125
  * Starts a transaction. If the callback throws the transaction is rolled back,
99
126
  * otherwise it's committed.
@@ -109,11 +109,12 @@ export class OperationNodeTransformer {
109
109
  from: this.transformNode(node.from),
110
110
  selections: this.transformNodeList(node.selections),
111
111
  distinctOnSelections: this.transformNodeList(node.distinctOnSelections),
112
+ isDistinct: node.isDistinct,
112
113
  joins: this.transformNodeList(node.joins),
113
114
  groupBy: this.transformNode(node.groupBy),
114
115
  orderBy: this.transformNode(node.orderBy),
115
116
  where: this.transformNode(node.where),
116
- modifier: node.modifier,
117
+ modifiers: node.modifiers,
117
118
  limit: this.transformNode(node.limit),
118
119
  offset: this.transformNode(node.offset),
119
120
  with: this.transformNode(node.with),
@@ -12,17 +12,18 @@ import { OrderByNode } from './order-by-node.js';
12
12
  import { SelectionNode } from './selection-node.js';
13
13
  import { WhereNode } from './where-node.js';
14
14
  import { WithNode } from './with-node.js';
15
- export declare type SelectModifier = 'Distinct' | 'ForUpdate' | 'ForNoKeyUpdate' | 'ForShare' | 'ForKeyShare' | 'NoWait' | 'SkipLocked';
15
+ export declare type SelectModifier = 'ForUpdate' | 'ForNoKeyUpdate' | 'ForShare' | 'ForKeyShare' | 'NoWait' | 'SkipLocked';
16
16
  export interface SelectQueryNode extends OperationNode {
17
17
  readonly kind: 'SelectQueryNode';
18
18
  readonly from: FromNode;
19
19
  readonly selections?: ReadonlyArray<SelectionNode>;
20
20
  readonly distinctOnSelections?: ReadonlyArray<SelectionNode>;
21
+ readonly isDistinct?: boolean;
21
22
  readonly joins?: ReadonlyArray<JoinNode>;
22
23
  readonly groupBy?: GroupByNode;
23
24
  readonly orderBy?: OrderByNode;
24
25
  readonly where?: WhereNode;
25
- readonly modifier?: SelectModifier;
26
+ readonly modifiers?: ReadonlyArray<SelectModifier>;
26
27
  readonly limit?: LimitNode;
27
28
  readonly offset?: OffsetNode;
28
29
  readonly with?: WithNode;
@@ -42,4 +43,5 @@ export declare const selectQueryNode: Readonly<{
42
43
  cloneWithLimit(selectNode: SelectQueryNode, limit: LimitNode): SelectQueryNode;
43
44
  cloneWithOffset(selectNode: SelectQueryNode, offset: OffsetNode): SelectQueryNode;
44
45
  cloneWithHaving(selectNode: SelectQueryNode, op: 'and' | 'or', filter: HavingNodeChild): SelectQueryNode;
46
+ cloneWithDistinct(selectNode: SelectQueryNode): SelectQueryNode;
45
47
  }>;