kysely 0.12.1 → 0.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/cjs/index.d.ts +1 -0
  2. package/dist/cjs/index.js +1 -0
  3. package/dist/cjs/kysely.d.ts +151 -0
  4. package/dist/cjs/kysely.js +37 -0
  5. package/dist/cjs/operation-node/common-table-expression-name-node.d.ts +15 -0
  6. package/dist/cjs/operation-node/common-table-expression-name-node.js +23 -0
  7. package/dist/cjs/operation-node/common-table-expression-node.d.ts +3 -3
  8. package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
  9. package/dist/cjs/operation-node/operation-node-transformer.js +9 -0
  10. package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
  11. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  12. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  13. package/dist/cjs/operation-node/with-node.d.ts +3 -1
  14. package/dist/cjs/operation-node/with-node.js +2 -1
  15. package/dist/cjs/parser/with-parser.d.ts +32 -5
  16. package/dist/cjs/parser/with-parser.js +13 -2
  17. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +8 -0
  18. package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -0
  19. package/dist/cjs/query-compiler/default-query-compiler.js +11 -0
  20. package/dist/cjs/query-creator.d.ts +27 -3
  21. package/dist/cjs/query-creator.js +33 -1
  22. package/dist/cjs/query-executor/default-query-executor.d.ts +19 -0
  23. package/dist/cjs/query-executor/noop-query-executor.d.ts +19 -0
  24. package/dist/cjs/raw-builder/raw-builder.js +1 -1
  25. package/dist/esm/index.d.ts +1 -0
  26. package/dist/esm/index.js +1 -0
  27. package/dist/esm/kysely.d.ts +151 -0
  28. package/dist/esm/kysely.js +37 -0
  29. package/dist/esm/operation-node/common-table-expression-name-node.d.ts +15 -0
  30. package/dist/esm/operation-node/common-table-expression-name-node.js +20 -0
  31. package/dist/esm/operation-node/common-table-expression-node.d.ts +3 -3
  32. package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
  33. package/dist/esm/operation-node/operation-node-transformer.js +9 -0
  34. package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
  35. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  36. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  37. package/dist/esm/operation-node/with-node.d.ts +3 -1
  38. package/dist/esm/operation-node/with-node.js +2 -1
  39. package/dist/esm/parser/with-parser.d.ts +32 -5
  40. package/dist/esm/parser/with-parser.js +13 -2
  41. package/dist/esm/plugin/with-schema/with-schema-transformer.js +8 -0
  42. package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -0
  43. package/dist/esm/query-compiler/default-query-compiler.js +11 -0
  44. package/dist/esm/query-creator.d.ts +27 -3
  45. package/dist/esm/query-creator.js +33 -1
  46. package/dist/esm/query-executor/default-query-executor.d.ts +19 -0
  47. package/dist/esm/query-executor/noop-query-executor.d.ts +19 -0
  48. package/dist/esm/raw-builder/raw-builder.js +1 -1
  49. package/package.json +2 -2
@@ -73,6 +73,7 @@ export * from './operation-node/column-definition-node.js';
73
73
  export * from './operation-node/column-node.js';
74
74
  export * from './operation-node/column-update-node.js';
75
75
  export * from './operation-node/common-table-expression-node.js';
76
+ export * from './operation-node/common-table-expression-name-node.js';
76
77
  export * from './operation-node/constraint-node.js';
77
78
  export * from './operation-node/create-index-node.js';
78
79
  export * from './operation-node/create-schema-node.js';
package/dist/cjs/index.js CHANGED
@@ -85,6 +85,7 @@ __exportStar(require("./operation-node/column-definition-node.js"), exports);
85
85
  __exportStar(require("./operation-node/column-node.js"), exports);
86
86
  __exportStar(require("./operation-node/column-update-node.js"), exports);
87
87
  __exportStar(require("./operation-node/common-table-expression-node.js"), exports);
88
+ __exportStar(require("./operation-node/common-table-expression-name-node.js"), exports);
88
89
  __exportStar(require("./operation-node/constraint-node.js"), exports);
89
90
  __exportStar(require("./operation-node/create-index-node.js"), exports);
90
91
  __exportStar(require("./operation-node/create-schema-node.js"), exports);
@@ -207,6 +207,38 @@ export declare class Kysely<DB> extends QueryCreator<DB> {
207
207
  * Returns a copy of this Kysely instance without any plugins.
208
208
  */
209
209
  withoutPlugins(): Kysely<DB>;
210
+ /**
211
+ * Returns a copy of this Kysely instance with tables added to its
212
+ * database type.
213
+ *
214
+ * This method only modifies the types and doesn't affect any of the
215
+ * executed queries in any way.
216
+ *
217
+ * ### Examples
218
+ *
219
+ * The following example adds and uses a temporary table:
220
+ *
221
+ * @example
222
+ * ```ts
223
+ * await db.schema
224
+ * .createTable('temp_table')
225
+ * .temporary()
226
+ * .addColumn('some_column', 'integer')
227
+ * .execute()
228
+ *
229
+ * const tempDb = db.withTables<{
230
+ * temp_table: {
231
+ * some_column: number
232
+ * }
233
+ * }>()
234
+ *
235
+ * await tempDb
236
+ * .insertInto('temp_table')
237
+ * .values({ some_column: 100 })
238
+ * .execute()
239
+ * ```
240
+ */
241
+ withTables<T extends Record<string, Record<string, any>>>(): Kysely<DB & T>;
210
242
  /**
211
243
  * Releases all resources and disconnects from the database.
212
244
  *
@@ -223,13 +255,132 @@ export declare class Kysely<DB> extends QueryCreator<DB> {
223
255
  export declare class Transaction<DB> extends Kysely<DB> {
224
256
  #private;
225
257
  constructor(props: KyselyProps);
258
+ /**
259
+ * Returns true if this `Kysely` instance is a transaction.
260
+ *
261
+ * You can also use `db instanceof Transaction`.
262
+ */
226
263
  get isTransaction(): true;
264
+ /**
265
+ * Returns the {@link MigrationModule} module for managing and running migrations.
266
+ */
227
267
  get migration(): MigrationModule;
268
+ /**
269
+ * Creates a {@link TransactionBuilder} that can be used to run queries inside a transaction.
270
+ *
271
+ * The returned {@link TransactionBuilder} can be used to configure the transaction. The
272
+ * {@link TransactionBuilder.execute} method can then be called to run the transaction.
273
+ * {@link TransactionBuilder.execute} takes a function that is run inside the
274
+ * transaction. If the function throws, the transaction is rolled back. Otherwise
275
+ * the transaction is committed.
276
+ *
277
+ * The callback function passed to the {@link TransactionBuilder.execute | execute}
278
+ * method gets the transaction object as its only argument. The transaction is
279
+ * of type {@link Transaction} which inherits {@link Kysely}. Any query
280
+ * started through the transaction object is executed inside the transaction.
281
+ *
282
+ * ### Examples
283
+ *
284
+ * ```ts
285
+ * const catto = await db.transaction().execute(async (trx) => {
286
+ * const jennifer = await trx.insertInto('person')
287
+ * .values({
288
+ * id: db.generated,
289
+ * first_name: 'Jennifer',
290
+ * last_name: 'Aniston',
291
+ * })
292
+ * .returning('id')
293
+ * .executeTakeFirstOrThrow()
294
+ *
295
+ * await someFunction(trx, jennifer)
296
+ *
297
+ * return await trx.insertInto('pet')
298
+ * .values({
299
+ * id: db.generated,
300
+ * user_id: jennifer.id,
301
+ * name: 'Catto',
302
+ * species: 'cat'
303
+ * })
304
+ * .returning('*')
305
+ * .executeTakeFirst()
306
+ * })
307
+ * ```
308
+ *
309
+ * Setting the isolation level:
310
+ *
311
+ * ```ts
312
+ * await db
313
+ * .transaction()
314
+ * .setIsolationLevel('serializable')
315
+ * .execute(async (trx) => {
316
+ * await doStuff(trx)
317
+ * })
318
+ * ```
319
+ */
228
320
  transaction(): TransactionBuilder<DB>;
321
+ /**
322
+ * Provides a kysely instance bound to a single database connection.
323
+ *
324
+ * ### Examples
325
+ *
326
+ * ```ts
327
+ * await db
328
+ * .connection()
329
+ * .execute(async (db) => {
330
+ * // `db` is an instance of `Kysely` that's bound to a single
331
+ * // database connection. All queries executed through `db` use
332
+ * // the same connection.
333
+ * await doStuff(db)
334
+ * })
335
+ * ```
336
+ */
229
337
  connection(): ConnectionBuilder<DB>;
338
+ /**
339
+ * Releases all resources and disconnects from the database.
340
+ *
341
+ * You need to call this when you are done using the `Kysely` instance.
342
+ */
230
343
  destroy(): Promise<void>;
344
+ /**
345
+ * Returns a copy of this Kysely instance with the given plugin installed.
346
+ */
231
347
  withPlugin(plugin: KyselyPlugin): Transaction<DB>;
348
+ /**
349
+ * Returns a copy of this Kysely instance without any plugins.
350
+ */
232
351
  withoutPlugins(): Transaction<DB>;
352
+ /**
353
+ * Returns a copy of this Kysely instance with tables added to its
354
+ * database type.
355
+ *
356
+ * This method only modifies the types and doesn't affect any of the
357
+ * executed queries in any way.
358
+ *
359
+ * ### Examples
360
+ *
361
+ * The following example adds and uses a temporary table:
362
+ *
363
+ * @example
364
+ * ```ts
365
+ * await db.schema
366
+ * .createTable('temp_table')
367
+ * .temporary()
368
+ * .addColumn('some_column', 'integer')
369
+ * .execute()
370
+ *
371
+ * const tempDb = db.withTables<{
372
+ * temp_table: {
373
+ * some_column: number
374
+ * }
375
+ * }>()
376
+ *
377
+ * await tempDb
378
+ * .insertInto('temp_table')
379
+ * .values({ some_column: 100 })
380
+ * .execute()
381
+ * ```
382
+ */
383
+ withTables<T extends Record<string, Record<string, any>>>(): Transaction<DB & T>;
233
384
  }
234
385
  export interface KyselyProps {
235
386
  readonly config: KyselyConfig;
@@ -261,6 +261,40 @@ class Kysely extends query_creator_js_1.QueryCreator {
261
261
  executor: this.#props.executor.withoutPlugins(),
262
262
  });
263
263
  }
264
+ /**
265
+ * Returns a copy of this Kysely instance with tables added to its
266
+ * database type.
267
+ *
268
+ * This method only modifies the types and doesn't affect any of the
269
+ * executed queries in any way.
270
+ *
271
+ * ### Examples
272
+ *
273
+ * The following example adds and uses a temporary table:
274
+ *
275
+ * @example
276
+ * ```ts
277
+ * await db.schema
278
+ * .createTable('temp_table')
279
+ * .temporary()
280
+ * .addColumn('some_column', 'integer')
281
+ * .execute()
282
+ *
283
+ * const tempDb = db.withTables<{
284
+ * temp_table: {
285
+ * some_column: number
286
+ * }
287
+ * }>()
288
+ *
289
+ * await tempDb
290
+ * .insertInto('temp_table')
291
+ * .values({ some_column: 100 })
292
+ * .execute()
293
+ * ```
294
+ */
295
+ withTables() {
296
+ return new Kysely({ ...this.#props });
297
+ }
264
298
  /**
265
299
  * Releases all resources and disconnects from the database.
266
300
  *
@@ -315,6 +349,9 @@ class Transaction extends Kysely {
315
349
  executor: this.#props.executor.withoutPlugins(),
316
350
  });
317
351
  }
352
+ withTables() {
353
+ return new Transaction({ ...this.#props });
354
+ }
318
355
  }
319
356
  exports.Transaction = Transaction;
320
357
  function isKyselyProps(obj) {
@@ -0,0 +1,15 @@
1
+ import { ColumnNode } from './column-node.js';
2
+ import { OperationNode } from './operation-node.js';
3
+ import { TableNode } from './table-node.js';
4
+ export interface CommonTableExpressionNameNode extends OperationNode {
5
+ readonly kind: 'CommonTableExpressionNameNode';
6
+ readonly table: TableNode;
7
+ readonly columns?: ReadonlyArray<ColumnNode>;
8
+ }
9
+ /**
10
+ * @internal
11
+ */
12
+ export declare const CommonTableExpressionNameNode: Readonly<{
13
+ is(node: OperationNode): node is CommonTableExpressionNameNode;
14
+ create(tableName: string, columnNames?: readonly string[] | undefined): CommonTableExpressionNameNode;
15
+ }>;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CommonTableExpressionNameNode = void 0;
4
+ const object_utils_js_1 = require("../util/object-utils.js");
5
+ const column_node_js_1 = require("./column-node.js");
6
+ const table_node_js_1 = require("./table-node.js");
7
+ /**
8
+ * @internal
9
+ */
10
+ exports.CommonTableExpressionNameNode = (0, object_utils_js_1.freeze)({
11
+ is(node) {
12
+ return node.kind === 'CommonTableExpressionNameNode';
13
+ },
14
+ create(tableName, columnNames) {
15
+ return (0, object_utils_js_1.freeze)({
16
+ kind: 'CommonTableExpressionNameNode',
17
+ table: table_node_js_1.TableNode.create(tableName),
18
+ columns: columnNames
19
+ ? (0, object_utils_js_1.freeze)(columnNames.map(column_node_js_1.ColumnNode.create))
20
+ : undefined,
21
+ });
22
+ },
23
+ });
@@ -1,10 +1,10 @@
1
- import { IdentifierNode } from './identifier-node.js';
1
+ import { CommonTableExpressionNameNode } from './common-table-expression-name-node.js';
2
2
  import { OperationNode } from './operation-node.js';
3
3
  import { QueryNode } from './query-node.js';
4
4
  import { RawNode } from './raw-node.js';
5
5
  export interface CommonTableExpressionNode extends OperationNode {
6
6
  readonly kind: 'CommonTableExpressionNode';
7
- readonly name: IdentifierNode;
7
+ readonly name: CommonTableExpressionNameNode;
8
8
  readonly expression: QueryNode | RawNode;
9
9
  }
10
10
  /**
@@ -12,5 +12,5 @@ export interface CommonTableExpressionNode extends OperationNode {
12
12
  */
13
13
  export declare const CommonTableExpressionNode: Readonly<{
14
14
  is(node: OperationNode): node is CommonTableExpressionNode;
15
- create(name: IdentifierNode, expression: QueryNode | RawNode): CommonTableExpressionNode;
15
+ create(name: CommonTableExpressionNameNode, expression: QueryNode | RawNode): CommonTableExpressionNode;
16
16
  }>;
@@ -44,6 +44,7 @@ import { ReferencesNode } from './references-node.js';
44
44
  import { CheckConstraintNode } from './check-constraint-node.js';
45
45
  import { WithNode } from './with-node.js';
46
46
  import { CommonTableExpressionNode } from './common-table-expression-node.js';
47
+ import { CommonTableExpressionNameNode } from './common-table-expression-name-node.js';
47
48
  import { HavingNode } from './having-node.js';
48
49
  import { CreateSchemaNode } from './create-schema-node.js';
49
50
  import { DropSchemaNode } from './drop-schema-node.js';
@@ -142,6 +143,7 @@ export declare class OperationNodeTransformer {
142
143
  protected transformCheckConstraint(node: CheckConstraintNode): CheckConstraintNode;
143
144
  protected transformWith(node: WithNode): WithNode;
144
145
  protected transformCommonTableExpression(node: CommonTableExpressionNode): CommonTableExpressionNode;
146
+ protected transformCommonTableExpressionName(node: CommonTableExpressionNameNode): CommonTableExpressionNameNode;
145
147
  protected transformHaving(node: HavingNode): HavingNode;
146
148
  protected transformCreateSchema(node: CreateSchemaNode): CreateSchemaNode;
147
149
  protected transformDropSchema(node: DropSchemaNode): DropSchemaNode;
@@ -81,6 +81,7 @@ class OperationNodeTransformer {
81
81
  CheckConstraintNode: this.transformCheckConstraint.bind(this),
82
82
  WithNode: this.transformWith.bind(this),
83
83
  CommonTableExpressionNode: this.transformCommonTableExpression.bind(this),
84
+ CommonTableExpressionNameNode: this.transformCommonTableExpressionName.bind(this),
84
85
  HavingNode: this.transformHaving.bind(this),
85
86
  CreateSchemaNode: this.transformCreateSchema.bind(this),
86
87
  DropSchemaNode: this.transformDropSchema.bind(this),
@@ -447,6 +448,7 @@ class OperationNodeTransformer {
447
448
  return {
448
449
  kind: 'WithNode',
449
450
  expressions: this.transformNodeList(node.expressions),
451
+ recursive: node.recursive,
450
452
  };
451
453
  }
452
454
  transformCommonTableExpression(node) {
@@ -456,6 +458,13 @@ class OperationNodeTransformer {
456
458
  expression: this.transformNode(node.expression),
457
459
  };
458
460
  }
461
+ transformCommonTableExpressionName(node) {
462
+ return {
463
+ kind: 'CommonTableExpressionNameNode',
464
+ table: this.transformNode(node.table),
465
+ columns: this.transformNodeList(node.columns),
466
+ };
467
+ }
459
468
  transformHaving(node) {
460
469
  return {
461
470
  kind: 'HavingNode',
@@ -44,6 +44,7 @@ import { ReferencesNode } from './references-node.js';
44
44
  import { CheckConstraintNode } from './check-constraint-node.js';
45
45
  import { WithNode } from './with-node.js';
46
46
  import { CommonTableExpressionNode } from './common-table-expression-node.js';
47
+ import { CommonTableExpressionNameNode } from './common-table-expression-name-node.js';
47
48
  import { HavingNode } from './having-node.js';
48
49
  import { CreateSchemaNode } from './create-schema-node.js';
49
50
  import { DropSchemaNode } from './drop-schema-node.js';
@@ -110,6 +111,7 @@ export declare abstract class OperationNodeVisitor {
110
111
  protected abstract visitCheckConstraint(node: CheckConstraintNode): void;
111
112
  protected abstract visitWith(node: WithNode): void;
112
113
  protected abstract visitCommonTableExpression(node: CommonTableExpressionNode): void;
114
+ protected abstract visitCommonTableExpressionName(node: CommonTableExpressionNameNode): void;
113
115
  protected abstract visitHaving(node: HavingNode): void;
114
116
  protected abstract visitCreateSchema(node: CreateSchemaNode): void;
115
117
  protected abstract visitDropSchema(node: DropSchemaNode): void;
@@ -55,6 +55,7 @@ class OperationNodeVisitor {
55
55
  CheckConstraintNode: this.visitCheckConstraint.bind(this),
56
56
  WithNode: this.visitWith.bind(this),
57
57
  CommonTableExpressionNode: this.visitCommonTableExpression.bind(this),
58
+ CommonTableExpressionNameNode: this.visitCommonTableExpressionName.bind(this),
58
59
  HavingNode: this.visitHaving.bind(this),
59
60
  CreateSchemaNode: this.visitCreateSchema.bind(this),
60
61
  DropSchemaNode: this.visitDropSchema.bind(this),
@@ -1,4 +1,4 @@
1
- export declare type OperationNodeKind = 'IdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedAlwaysAsNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode';
1
+ export declare type OperationNodeKind = 'IdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedAlwaysAsNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode';
2
2
  export interface OperationNode {
3
3
  readonly kind: OperationNodeKind;
4
4
  }
@@ -1,14 +1,16 @@
1
1
  import { OperationNode } from './operation-node.js';
2
2
  import { CommonTableExpressionNode } from './common-table-expression-node.js';
3
+ export declare type WithNodeParams = Omit<WithNode, 'kind' | 'expressions'>;
3
4
  export interface WithNode extends OperationNode {
4
5
  readonly kind: 'WithNode';
5
6
  readonly expressions: ReadonlyArray<CommonTableExpressionNode>;
7
+ readonly recursive?: boolean;
6
8
  }
7
9
  /**
8
10
  * @internal
9
11
  */
10
12
  export declare const WithNode: Readonly<{
11
13
  is(node: OperationNode): node is WithNode;
12
- create(expression: CommonTableExpressionNode): WithNode;
14
+ create(expression: CommonTableExpressionNode, params?: WithNodeParams | undefined): WithNode;
13
15
  cloneWithExpression(withNode: WithNode, expression: CommonTableExpressionNode): WithNode;
14
16
  }>;
@@ -9,10 +9,11 @@ exports.WithNode = (0, object_utils_js_1.freeze)({
9
9
  is(node) {
10
10
  return node.kind === 'WithNode';
11
11
  },
12
- create(expression) {
12
+ create(expression, params) {
13
13
  return (0, object_utils_js_1.freeze)({
14
14
  kind: 'WithNode',
15
15
  expressions: (0, object_utils_js_1.freeze)([expression]),
16
+ ...params,
16
17
  });
17
18
  },
18
19
  cloneWithExpression(withNode, expression) {
@@ -5,10 +5,37 @@ import { InsertQueryBuilder } from '../query-builder/insert-query-builder.js';
5
5
  import { CommonTableExpressionNode } from '../operation-node/common-table-expression-node.js';
6
6
  import { QueryCreator } from '../query-creator.js';
7
7
  import { RawBuilder } from '../raw-builder/raw-builder.js';
8
- import { AnyRawBuilder } from '../util/type-utils.js';
9
8
  import { ParseContext } from './parse-context.js';
10
- export declare type CommonTableExpression<DB> = (creator: QueryCreator<DB>) => SelectQueryBuilder<DB, any, any> | InsertQueryBuilder<DB, any, any> | UpdateQueryBuilder<DB, any, any> | DeleteQueryBuilder<DB, any, any> | AnyRawBuilder;
11
- export declare type QueryCreatorWithCommonTableExpression<DB, N extends string, E extends CommonTableExpression<DB>> = QueryCreator<DB & Record<N, ExtractRowTypeFromCommonTableExpression<E>>>;
12
- declare type ExtractRowTypeFromCommonTableExpression<E> = E extends (creator: QueryCreator<any>) => infer Q ? Q extends SelectQueryBuilder<any, any, infer QO> ? QO : Q extends InsertQueryBuilder<any, any, infer QO> ? QO : Q extends UpdateQueryBuilder<any, any, infer QO> ? QO : Q extends DeleteQueryBuilder<any, any, infer QO> ? QO : Q extends RawBuilder<infer RO> ? RO : never : never;
13
- export declare function parseCommonTableExpression(ctx: ParseContext, name: string, expression: CommonTableExpression<any>): CommonTableExpressionNode;
9
+ export declare type CommonTableExpression<DB, CN extends string> = (creator: QueryCreator<DB>) => CommonTableExpressionOutput<DB, CN>;
10
+ export declare type RecursiveCommonTableExpression<DB, CN extends string> = (creator: QueryCreator<DB & Record<ExtractTableFromCommonTableExpressionName<CN>, ExtractRowFromCommonTableExpressionName<CN>>>) => CommonTableExpressionOutput<DB, CN>;
11
+ export declare type QueryCreatorWithCommonTableExpression<DB, CN extends string, CTE> = QueryCreator<DB & Record<ExtractTableFromCommonTableExpressionName<CN>, ExtractRowFromCommonTableExpression<CTE>>>;
12
+ declare type CommonTableExpressionOutput<DB, CN extends string> = SelectQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | InsertQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | UpdateQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | DeleteQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | RawBuilder<ExtractRowFromCommonTableExpressionName<CN>>;
13
+ /**
14
+ * Given a common CommonTableExpression CTE extracts the row type from it.
15
+ *
16
+ * For example a CTE `(db) => db.selectFrom('person').select(['id', 'first_name'])`
17
+ * would result in `Pick<Person, 'id' | 'first_name'>`.
18
+ */
19
+ declare type ExtractRowFromCommonTableExpression<CTE> = CTE extends (creator: QueryCreator<any>) => infer Q ? Q extends SelectQueryBuilder<any, any, infer QO> ? QO : Q extends InsertQueryBuilder<any, any, infer QO> ? QO : Q extends UpdateQueryBuilder<any, any, infer QO> ? QO : Q extends DeleteQueryBuilder<any, any, infer QO> ? QO : Q extends RawBuilder<infer RO> ? RO : never : never;
20
+ /**
21
+ * Extracts 'person' from a string like 'person(id, first_name)'.
22
+ */
23
+ declare type ExtractTableFromCommonTableExpressionName<CN extends string> = CN extends `${infer TB}(${string})` ? TB : CN;
24
+ /**
25
+ * Parses a string like 'person(id, first_name)' into a type:
26
+ *
27
+ * {
28
+ * id: any,
29
+ * first_name: any
30
+ * }
31
+ *
32
+ */
33
+ declare type ExtractRowFromCommonTableExpressionName<CN extends string> = CN extends `${string}(${infer CL})` ? {
34
+ [C in ExtractColumnNamesFromColumnList<CL>]: any;
35
+ } : Record<string, any>;
36
+ /**
37
+ * Parses a string like 'id, first_name' into a type 'id' | 'first_name'
38
+ */
39
+ declare type ExtractColumnNamesFromColumnList<R extends string> = R extends `${infer C}, ${infer RS}` ? C | ExtractColumnNamesFromColumnList<RS> : R;
40
+ export declare function parseCommonTableExpression(ctx: ParseContext, name: string, expression: CommonTableExpression<any, any>): CommonTableExpressionNode;
14
41
  export {};
@@ -1,10 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseCommonTableExpression = void 0;
4
- const identifier_node_js_1 = require("../operation-node/identifier-node.js");
5
4
  const common_table_expression_node_js_1 = require("../operation-node/common-table-expression-node.js");
5
+ const common_table_expression_name_node_js_1 = require("../operation-node/common-table-expression-name-node.js");
6
6
  function parseCommonTableExpression(ctx, name, expression) {
7
7
  const builder = expression(ctx.createQueryCreator());
8
- return common_table_expression_node_js_1.CommonTableExpressionNode.create(identifier_node_js_1.IdentifierNode.create(name), builder.toOperationNode());
8
+ return common_table_expression_node_js_1.CommonTableExpressionNode.create(parseCommonTableExpressionName(name), builder.toOperationNode());
9
9
  }
10
10
  exports.parseCommonTableExpression = parseCommonTableExpression;
11
+ function parseCommonTableExpressionName(name) {
12
+ if (name.includes('(')) {
13
+ const parts = name.split(/[\(\)]/);
14
+ const table = parts[0];
15
+ const columns = parts[1].split(',').map((it) => it.trim());
16
+ return common_table_expression_name_node_js_1.CommonTableExpressionNameNode.create(table, columns);
17
+ }
18
+ else {
19
+ return common_table_expression_name_node_js_1.CommonTableExpressionNameNode.create(name);
20
+ }
21
+ }
@@ -82,6 +82,9 @@ class WithSchemaTransformer extends operation_node_transformer_js_1.OperationNod
82
82
  if ('joins' in node && node.joins) {
83
83
  this.#collectTablesFromJoins(node.joins, tables);
84
84
  }
85
+ if ('with' in node && node.with) {
86
+ this.#removeCommonTableExpressionTables(node.with, tables);
87
+ }
85
88
  return tables;
86
89
  }
87
90
  #collectTablesFromTableExpressionNodes(nodes, tables) {
@@ -104,5 +107,10 @@ class WithSchemaTransformer extends operation_node_transformer_js_1.OperationNod
104
107
  tables.add(table.table.identifier);
105
108
  }
106
109
  }
110
+ #removeCommonTableExpressionTables(node, tables) {
111
+ for (const expr of node.expressions) {
112
+ tables.delete(expr.name.table.table.identifier);
113
+ }
114
+ }
107
115
  }
108
116
  exports.WithSchemaTransformer = WithSchemaTransformer;
@@ -68,6 +68,7 @@ import { GeneratedAlwaysAsNode } from '../operation-node/generated-always-as-nod
68
68
  import { DefaultValueNode } from '../operation-node/default-value-node.js';
69
69
  import { OnNode } from '../operation-node/on-node.js';
70
70
  import { ValuesNode } from '../operation-node/values-node.js';
71
+ import { CommonTableExpressionNameNode } from '../operation-node/common-table-expression-name-node.js';
71
72
  export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
72
73
  #private;
73
74
  protected get numParameters(): number;
@@ -129,6 +130,7 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
129
130
  protected visitList(node: ListNode): void;
130
131
  protected visitWith(node: WithNode): void;
131
132
  protected visitCommonTableExpression(node: CommonTableExpressionNode): void;
133
+ protected visitCommonTableExpressionName(node: CommonTableExpressionNameNode): void;
132
134
  protected visitAlterTable(node: AlterTableNode): void;
133
135
  protected visitAddColumn(node: AddColumnNode): void;
134
136
  protected visitRenameColumn(node: RenameColumnNode): void;
@@ -573,6 +573,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
573
573
  }
574
574
  visitWith(node) {
575
575
  this.append('with ');
576
+ if (node.recursive) {
577
+ this.append('recursive ');
578
+ }
576
579
  this.compileList(node.expressions);
577
580
  }
578
581
  visitCommonTableExpression(node) {
@@ -580,6 +583,14 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
580
583
  this.append(' as ');
581
584
  this.visitNode(node.expression);
582
585
  }
586
+ visitCommonTableExpressionName(node) {
587
+ this.visitNode(node.table);
588
+ if (node.columns) {
589
+ this.append('(');
590
+ this.compileList(node.columns);
591
+ this.append(')');
592
+ }
593
+ }
583
594
  visitAlterTable(node) {
584
595
  this.append('alter table ');
585
596
  this.visitNode(node.table);
@@ -5,7 +5,7 @@ import { UpdateQueryBuilder } from './query-builder/update-query-builder.js';
5
5
  import { TableExpression, TableExpressionDatabase, TableExpressionTables, TableReference } from './parser/table-parser.js';
6
6
  import { QueryExecutor } from './query-executor/query-executor.js';
7
7
  import { RawBuilder } from './raw-builder/raw-builder.js';
8
- import { CommonTableExpression, QueryCreatorWithCommonTableExpression } from './parser/with-parser.js';
8
+ import { CommonTableExpression, QueryCreatorWithCommonTableExpression, RecursiveCommonTableExpression } from './parser/with-parser.js';
9
9
  import { WithNode } from './operation-node/with-node.js';
10
10
  import { ParseContext } from './parser/parse-context.js';
11
11
  import { InsertResult } from './query-builder/insert-result.js';
@@ -206,7 +206,7 @@ export declare class QueryCreator<DB> {
206
206
  */
207
207
  updateTable<TR extends TableReference<DB>>(table: TR): UpdateQueryBuilder<TableExpressionDatabase<DB, TR>, TableExpressionTables<DB, never, TR>, UpdateResult>;
208
208
  /**
209
- * Creates a `with` query (common table expressions).
209
+ * Creates a `with` query (Common Table Expression).
210
210
  *
211
211
  * ### Examples
212
212
  *
@@ -227,8 +227,32 @@ export declare class QueryCreator<DB> {
227
227
  * .selectAll()
228
228
  * .execute()
229
229
  * ```
230
+ *
231
+ * The CTE name can optionally specify column names in addition to
232
+ * a name. In that case Kysely requires the expression to retun
233
+ * rows with the same columns.
234
+ *
235
+ * ```ts
236
+ * await db
237
+ * .with('jennifers(id, age)', (db) => db
238
+ * .selectFrom('person')
239
+ * .where('first_name', '=', 'Jennifer')
240
+ * // This is ok since we return columns with the same
241
+ * // names as specified by `jennifers(id, age)`.
242
+ * .select(['id', 'age'])
243
+ * )
244
+ * .selectFrom('jennifers')
245
+ * .selectAll()
246
+ * .execute()
247
+ * ```
248
+ */
249
+ with<N extends string, E extends CommonTableExpression<DB, N>>(name: N, expression: E): QueryCreatorWithCommonTableExpression<DB, N, E>;
250
+ /**
251
+ * Creates a recursive `with` query (Common Table Expression).
252
+ *
253
+ * See the {@link with} method for examples and more documentation.
230
254
  */
231
- with<N extends string, E extends CommonTableExpression<DB>>(name: N, expression: E): QueryCreatorWithCommonTableExpression<DB, N, E>;
255
+ withRecursive<N extends string, E extends RecursiveCommonTableExpression<DB, N>>(name: N, expression: E): QueryCreatorWithCommonTableExpression<DB, N, E>;
232
256
  /**
233
257
  * Sets the schema to be used for all table references that don't explicitly
234
258
  * specify a schema.