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.
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/kysely.d.ts +151 -0
- package/dist/cjs/kysely.js +37 -0
- package/dist/cjs/operation-node/common-table-expression-name-node.d.ts +15 -0
- package/dist/cjs/operation-node/common-table-expression-name-node.js +23 -0
- package/dist/cjs/operation-node/common-table-expression-node.d.ts +3 -3
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +9 -0
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/with-node.d.ts +3 -1
- package/dist/cjs/operation-node/with-node.js +2 -1
- package/dist/cjs/parser/with-parser.d.ts +32 -5
- package/dist/cjs/parser/with-parser.js +13 -2
- package/dist/cjs/plugin/with-schema/with-schema-transformer.js +8 -0
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +11 -0
- package/dist/cjs/query-creator.d.ts +27 -3
- package/dist/cjs/query-creator.js +33 -1
- package/dist/cjs/query-executor/default-query-executor.d.ts +19 -0
- package/dist/cjs/query-executor/noop-query-executor.d.ts +19 -0
- package/dist/cjs/raw-builder/raw-builder.js +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/kysely.d.ts +151 -0
- package/dist/esm/kysely.js +37 -0
- package/dist/esm/operation-node/common-table-expression-name-node.d.ts +15 -0
- package/dist/esm/operation-node/common-table-expression-name-node.js +20 -0
- package/dist/esm/operation-node/common-table-expression-node.d.ts +3 -3
- package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-transformer.js +9 -0
- package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-visitor.js +1 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/with-node.d.ts +3 -1
- package/dist/esm/operation-node/with-node.js +2 -1
- package/dist/esm/parser/with-parser.d.ts +32 -5
- package/dist/esm/parser/with-parser.js +13 -2
- package/dist/esm/plugin/with-schema/with-schema-transformer.js +8 -0
- package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -0
- package/dist/esm/query-compiler/default-query-compiler.js +11 -0
- package/dist/esm/query-creator.d.ts +27 -3
- package/dist/esm/query-creator.js +33 -1
- package/dist/esm/query-executor/default-query-executor.d.ts +19 -0
- package/dist/esm/query-executor/noop-query-executor.d.ts +19 -0
- package/dist/esm/raw-builder/raw-builder.js +1 -1
- package/package.json +2 -2
package/dist/cjs/index.d.ts
CHANGED
|
@@ -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);
|
package/dist/cjs/kysely.d.ts
CHANGED
|
@@ -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;
|
package/dist/cjs/kysely.js
CHANGED
|
@@ -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 {
|
|
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:
|
|
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:
|
|
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>) =>
|
|
11
|
-
export declare type
|
|
12
|
-
declare type
|
|
13
|
-
|
|
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(
|
|
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 (
|
|
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
|
-
|
|
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.
|