kysely 0.28.1 → 0.28.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/deno.check.d.ts +3 -0
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +2 -1
- package/dist/cjs/dynamic/dynamic-table-builder.d.ts +16 -0
- package/dist/cjs/dynamic/dynamic-table-builder.js +46 -0
- package/dist/cjs/dynamic/dynamic.d.ts +36 -1
- package/dist/cjs/dynamic/dynamic.js +37 -0
- package/dist/cjs/kysely.d.ts +1 -1
- package/dist/cjs/parser/table-parser.d.ts +4 -3
- package/dist/cjs/parser/table-parser.js +4 -0
- package/dist/cjs/query-builder/order-by-interface.d.ts +0 -18
- package/dist/cjs/query-builder/select-query-builder.d.ts +0 -18
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +2 -1
- package/dist/esm/dynamic/dynamic-table-builder.d.ts +16 -0
- package/dist/esm/dynamic/dynamic-table-builder.js +41 -0
- package/dist/esm/dynamic/dynamic.d.ts +36 -1
- package/dist/esm/dynamic/dynamic.js +37 -0
- package/dist/esm/kysely.d.ts +1 -1
- package/dist/esm/parser/table-parser.d.ts +4 -3
- package/dist/esm/parser/table-parser.js +4 -0
- package/dist/esm/query-builder/order-by-interface.d.ts +0 -18
- package/dist/esm/query-builder/select-query-builder.d.ts +0 -18
- package/package.json +2 -2
package/deno.check.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export interface Database {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
interface AuditTable {
|
|
23
|
+
id: Generated<number>
|
|
23
24
|
action: string
|
|
24
25
|
}
|
|
25
26
|
|
|
@@ -63,11 +64,13 @@ interface ToyTable {
|
|
|
63
64
|
}
|
|
64
65
|
|
|
65
66
|
interface WineTable {
|
|
67
|
+
id: Generated<number>
|
|
66
68
|
name: string
|
|
67
69
|
stock: number
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
interface WineStockChangeTable {
|
|
73
|
+
id: Generated<number>
|
|
71
74
|
stock_delta: number
|
|
72
75
|
wine_name: string
|
|
73
76
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AliasNode } from '../operation-node/alias-node.js';
|
|
2
|
+
import { OperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
3
|
+
export declare class DynamicTableBuilder<T extends string> {
|
|
4
|
+
#private;
|
|
5
|
+
get table(): T;
|
|
6
|
+
constructor(table: T);
|
|
7
|
+
as<A extends string>(alias: A): AliasedDynamicTableBuilder<T, A>;
|
|
8
|
+
}
|
|
9
|
+
export declare class AliasedDynamicTableBuilder<T extends string, A extends string> implements OperationNodeSource {
|
|
10
|
+
#private;
|
|
11
|
+
get table(): T;
|
|
12
|
+
get alias(): A;
|
|
13
|
+
constructor(table: T, alias: A);
|
|
14
|
+
toOperationNode(): AliasNode;
|
|
15
|
+
}
|
|
16
|
+
export declare function isAliasedDynamicTableBuilder(obj: unknown): obj is AliasedDynamicTableBuilder<any, any>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AliasedDynamicTableBuilder = exports.DynamicTableBuilder = void 0;
|
|
4
|
+
exports.isAliasedDynamicTableBuilder = isAliasedDynamicTableBuilder;
|
|
5
|
+
const alias_node_js_1 = require("../operation-node/alias-node.js");
|
|
6
|
+
const identifier_node_js_1 = require("../operation-node/identifier-node.js");
|
|
7
|
+
const operation_node_source_js_1 = require("../operation-node/operation-node-source.js");
|
|
8
|
+
const table_parser_js_1 = require("../parser/table-parser.js");
|
|
9
|
+
const object_utils_js_1 = require("../util/object-utils.js");
|
|
10
|
+
class DynamicTableBuilder {
|
|
11
|
+
#table;
|
|
12
|
+
get table() {
|
|
13
|
+
return this.#table;
|
|
14
|
+
}
|
|
15
|
+
constructor(table) {
|
|
16
|
+
this.#table = table;
|
|
17
|
+
}
|
|
18
|
+
as(alias) {
|
|
19
|
+
return new AliasedDynamicTableBuilder(this.#table, alias);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.DynamicTableBuilder = DynamicTableBuilder;
|
|
23
|
+
class AliasedDynamicTableBuilder {
|
|
24
|
+
#table;
|
|
25
|
+
#alias;
|
|
26
|
+
get table() {
|
|
27
|
+
return this.#table;
|
|
28
|
+
}
|
|
29
|
+
get alias() {
|
|
30
|
+
return this.#alias;
|
|
31
|
+
}
|
|
32
|
+
constructor(table, alias) {
|
|
33
|
+
this.#table = table;
|
|
34
|
+
this.#alias = alias;
|
|
35
|
+
}
|
|
36
|
+
toOperationNode() {
|
|
37
|
+
return alias_node_js_1.AliasNode.create((0, table_parser_js_1.parseTable)(this.#table), identifier_node_js_1.IdentifierNode.create(this.#alias));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.AliasedDynamicTableBuilder = AliasedDynamicTableBuilder;
|
|
41
|
+
function isAliasedDynamicTableBuilder(obj) {
|
|
42
|
+
return ((0, object_utils_js_1.isObject)(obj) &&
|
|
43
|
+
(0, operation_node_source_js_1.isOperationNodeSource)(obj) &&
|
|
44
|
+
(0, object_utils_js_1.isString)(obj.table) &&
|
|
45
|
+
(0, object_utils_js_1.isString)(obj.alias));
|
|
46
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DynamicReferenceBuilder } from './dynamic-reference-builder.js';
|
|
2
|
-
|
|
2
|
+
import { DynamicTableBuilder } from './dynamic-table-builder.js';
|
|
3
|
+
export declare class DynamicModule<DB> {
|
|
3
4
|
/**
|
|
4
5
|
* Creates a dynamic reference to a column that is not know at compile time.
|
|
5
6
|
*
|
|
@@ -86,4 +87,38 @@ export declare class DynamicModule {
|
|
|
86
87
|
* ```
|
|
87
88
|
*/
|
|
88
89
|
ref<R extends string = never>(reference: string): DynamicReferenceBuilder<R>;
|
|
90
|
+
/**
|
|
91
|
+
* Creates a table reference to a table that's not fully known at compile time.
|
|
92
|
+
*
|
|
93
|
+
* The type `T` is allowed to be a union of multiple tables.
|
|
94
|
+
*
|
|
95
|
+
* <!-- siteExample("select", "Generic find query", 130) -->
|
|
96
|
+
*
|
|
97
|
+
* A generic type-safe helper function for finding a row by a column value:
|
|
98
|
+
*
|
|
99
|
+
* ```ts
|
|
100
|
+
* import { SelectType } from 'kysely'
|
|
101
|
+
* import { Database } from 'type-editor'
|
|
102
|
+
*
|
|
103
|
+
* async function getRowByColumn<
|
|
104
|
+
* T extends keyof Database,
|
|
105
|
+
* C extends keyof Database[T] & string,
|
|
106
|
+
* V extends SelectType<Database[T][C]>,
|
|
107
|
+
* >(t: T, c: C, v: V) {
|
|
108
|
+
* // We need to use the dynamic module since the table name
|
|
109
|
+
* // is not known at compile time.
|
|
110
|
+
* const { table, ref } = db.dynamic
|
|
111
|
+
*
|
|
112
|
+
* return await db
|
|
113
|
+
* .selectFrom(table(t).as('t'))
|
|
114
|
+
* .selectAll()
|
|
115
|
+
* .where(ref(c), '=', v)
|
|
116
|
+
* .orderBy('t.id')
|
|
117
|
+
* .executeTakeFirstOrThrow()
|
|
118
|
+
* }
|
|
119
|
+
*
|
|
120
|
+
* const person = await getRowByColumn('person', 'first_name', 'Arnold')
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
table<T extends keyof DB & string>(table: T): DynamicTableBuilder<T>;
|
|
89
124
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DynamicModule = void 0;
|
|
4
4
|
const dynamic_reference_builder_js_1 = require("./dynamic-reference-builder.js");
|
|
5
|
+
const dynamic_table_builder_js_1 = require("./dynamic-table-builder.js");
|
|
5
6
|
class DynamicModule {
|
|
6
7
|
/**
|
|
7
8
|
* Creates a dynamic reference to a column that is not know at compile time.
|
|
@@ -91,5 +92,41 @@ class DynamicModule {
|
|
|
91
92
|
ref(reference) {
|
|
92
93
|
return new dynamic_reference_builder_js_1.DynamicReferenceBuilder(reference);
|
|
93
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Creates a table reference to a table that's not fully known at compile time.
|
|
97
|
+
*
|
|
98
|
+
* The type `T` is allowed to be a union of multiple tables.
|
|
99
|
+
*
|
|
100
|
+
* <!-- siteExample("select", "Generic find query", 130) -->
|
|
101
|
+
*
|
|
102
|
+
* A generic type-safe helper function for finding a row by a column value:
|
|
103
|
+
*
|
|
104
|
+
* ```ts
|
|
105
|
+
* import { SelectType } from 'kysely'
|
|
106
|
+
* import { Database } from 'type-editor'
|
|
107
|
+
*
|
|
108
|
+
* async function getRowByColumn<
|
|
109
|
+
* T extends keyof Database,
|
|
110
|
+
* C extends keyof Database[T] & string,
|
|
111
|
+
* V extends SelectType<Database[T][C]>,
|
|
112
|
+
* >(t: T, c: C, v: V) {
|
|
113
|
+
* // We need to use the dynamic module since the table name
|
|
114
|
+
* // is not known at compile time.
|
|
115
|
+
* const { table, ref } = db.dynamic
|
|
116
|
+
*
|
|
117
|
+
* return await db
|
|
118
|
+
* .selectFrom(table(t).as('t'))
|
|
119
|
+
* .selectAll()
|
|
120
|
+
* .where(ref(c), '=', v)
|
|
121
|
+
* .orderBy('t.id')
|
|
122
|
+
* .executeTakeFirstOrThrow()
|
|
123
|
+
* }
|
|
124
|
+
*
|
|
125
|
+
* const person = await getRowByColumn('person', 'first_name', 'Arnold')
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
table(table) {
|
|
129
|
+
return new dynamic_table_builder_js_1.DynamicTableBuilder(table);
|
|
130
|
+
}
|
|
94
131
|
}
|
|
95
132
|
exports.DynamicModule = DynamicModule;
|
package/dist/cjs/kysely.d.ts
CHANGED
|
@@ -65,7 +65,7 @@ export declare class Kysely<DB> extends QueryCreator<DB> implements QueryExecuto
|
|
|
65
65
|
* The {@link DynamicModule} module can be used to bypass strict typing and
|
|
66
66
|
* passing in dynamic values for the queries.
|
|
67
67
|
*/
|
|
68
|
-
get dynamic(): DynamicModule
|
|
68
|
+
get dynamic(): DynamicModule<DB>;
|
|
69
69
|
/**
|
|
70
70
|
* Returns a {@link DatabaseIntrospector | database introspector}.
|
|
71
71
|
*/
|
|
@@ -4,7 +4,8 @@ import { AliasedExpressionOrFactory } from './expression-parser.js';
|
|
|
4
4
|
import { OperationNode } from '../operation-node/operation-node.js';
|
|
5
5
|
import { AliasedExpression } from '../expression/expression.js';
|
|
6
6
|
import { DrainOuterGeneric } from '../util/type-utils.js';
|
|
7
|
-
|
|
7
|
+
import { AliasedDynamicTableBuilder } from '../dynamic/dynamic-table-builder.js';
|
|
8
|
+
export type TableExpression<DB, TB extends keyof DB> = AnyAliasedTable<DB> | AnyTable<DB> | AliasedExpressionOrFactory<DB, TB> | AliasedDynamicTableBuilder<any, any>;
|
|
8
9
|
export type TableExpressionOrList<DB, TB extends keyof DB> = TableExpression<DB, TB> | ReadonlyArray<TableExpression<DB, TB>>;
|
|
9
10
|
export type SimpleTableReference<DB> = AnyAliasedTable<DB> | AnyTable<DB>;
|
|
10
11
|
export type AnyAliasedTable<DB> = `${AnyTable<DB>} as ${string}`;
|
|
@@ -14,8 +15,8 @@ export type From<DB, TE> = DrainOuterGeneric<{
|
|
|
14
15
|
}>;
|
|
15
16
|
export type FromTables<DB, TB extends keyof DB, TE> = DrainOuterGeneric<TB | ExtractAliasFromTableExpression<DB, TE>>;
|
|
16
17
|
export type ExtractTableAlias<DB, TE> = TE extends `${string} as ${infer TA}` ? TA extends keyof DB ? TA : never : TE extends keyof DB ? TE : never;
|
|
17
|
-
type ExtractAliasFromTableExpression<DB, TE> = TE extends string ? TE extends `${string} as ${infer TA}` ? TA : TE extends keyof DB ? TE : never : TE extends AliasedExpression<any, infer QA> ? QA : TE extends (qb: any) => AliasedExpression<any, infer QA> ? QA : never;
|
|
18
|
-
type ExtractRowTypeFromTableExpression<DB, TE, A extends keyof any> = TE extends `${infer T} as ${infer TA}` ? TA extends A ? T extends keyof DB ? DB[T] : never : never : TE extends A ? TE extends keyof DB ? DB[TE] : never : TE extends AliasedExpression<infer O, infer QA> ? QA extends A ? O : never : TE extends (qb: any) => AliasedExpression<infer O, infer QA> ? QA extends A ? O : never : never;
|
|
18
|
+
type ExtractAliasFromTableExpression<DB, TE> = TE extends string ? TE extends `${string} as ${infer TA}` ? TA : TE extends keyof DB ? TE : never : TE extends AliasedExpression<any, infer QA> ? QA : TE extends (qb: any) => AliasedExpression<any, infer QA> ? QA : TE extends AliasedDynamicTableBuilder<any, infer DA> ? DA : never;
|
|
19
|
+
type ExtractRowTypeFromTableExpression<DB, TE, A extends keyof any> = TE extends `${infer T} as ${infer TA}` ? TA extends A ? T extends keyof DB ? DB[T] : never : never : TE extends A ? TE extends keyof DB ? DB[TE] : never : TE extends AliasedExpression<infer O, infer QA> ? QA extends A ? O : never : TE extends (qb: any) => AliasedExpression<infer O, infer QA> ? QA extends A ? O : never : TE extends AliasedDynamicTableBuilder<infer T, infer DA> ? DA extends A ? T extends keyof DB ? DB[T] : never : never : never;
|
|
19
20
|
export declare function parseTableExpressionOrList(table: TableExpressionOrList<any, any>): OperationNode[];
|
|
20
21
|
export declare function parseTableExpression(table: TableExpression<any, any>): OperationNode;
|
|
21
22
|
export declare function parseAliasedTable(from: string): TableNode | AliasNode;
|
|
@@ -9,6 +9,7 @@ const alias_node_js_1 = require("../operation-node/alias-node.js");
|
|
|
9
9
|
const table_node_js_1 = require("../operation-node/table-node.js");
|
|
10
10
|
const expression_parser_js_1 = require("./expression-parser.js");
|
|
11
11
|
const identifier_node_js_1 = require("../operation-node/identifier-node.js");
|
|
12
|
+
const dynamic_table_builder_js_1 = require("../dynamic/dynamic-table-builder.js");
|
|
12
13
|
function parseTableExpressionOrList(table) {
|
|
13
14
|
if ((0, object_utils_js_1.isReadonlyArray)(table)) {
|
|
14
15
|
return table.map((it) => parseTableExpression(it));
|
|
@@ -21,6 +22,9 @@ function parseTableExpression(table) {
|
|
|
21
22
|
if ((0, object_utils_js_1.isString)(table)) {
|
|
22
23
|
return parseAliasedTable(table);
|
|
23
24
|
}
|
|
25
|
+
else if ((0, dynamic_table_builder_js_1.isAliasedDynamicTableBuilder)(table)) {
|
|
26
|
+
return table.toOperationNode();
|
|
27
|
+
}
|
|
24
28
|
else {
|
|
25
29
|
return (0, expression_parser_js_1.parseAliasedExpression)(table);
|
|
26
30
|
}
|
|
@@ -40,24 +40,6 @@ export interface OrderByInterface<DB, TB extends keyof DB, O> {
|
|
|
40
40
|
* order by "id", "fn" desc
|
|
41
41
|
* ```
|
|
42
42
|
*
|
|
43
|
-
* Multiple columns/expressions per call:
|
|
44
|
-
*
|
|
45
|
-
* ```ts
|
|
46
|
-
* await db
|
|
47
|
-
* .selectFrom('person')
|
|
48
|
-
* .select('person.first_name as fn')
|
|
49
|
-
* .orderBy(['id', 'fn'])
|
|
50
|
-
* .execute()
|
|
51
|
-
* ```
|
|
52
|
-
*
|
|
53
|
-
* The generated SQL (PostgreSQL):
|
|
54
|
-
*
|
|
55
|
-
* ```sql
|
|
56
|
-
* select "person"."first_name" as "fn"
|
|
57
|
-
* from "person"
|
|
58
|
-
* order by "id", "fn"
|
|
59
|
-
* ```
|
|
60
|
-
*
|
|
61
43
|
* Building advanced modifiers:
|
|
62
44
|
*
|
|
63
45
|
* ```ts
|
|
@@ -1246,24 +1246,6 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1246
1246
|
* order by "id", "fn" desc
|
|
1247
1247
|
* ```
|
|
1248
1248
|
*
|
|
1249
|
-
* Multiple columns/expressions per call:
|
|
1250
|
-
*
|
|
1251
|
-
* ```ts
|
|
1252
|
-
* await db
|
|
1253
|
-
* .selectFrom('person')
|
|
1254
|
-
* .select('person.first_name as fn')
|
|
1255
|
-
* .orderBy(['id', 'fn'])
|
|
1256
|
-
* .execute()
|
|
1257
|
-
* ```
|
|
1258
|
-
*
|
|
1259
|
-
* The generated SQL (PostgreSQL):
|
|
1260
|
-
*
|
|
1261
|
-
* ```sql
|
|
1262
|
-
* select "person"."first_name" as "fn"
|
|
1263
|
-
* from "person"
|
|
1264
|
-
* order by "id", "fn"
|
|
1265
|
-
* ```
|
|
1266
|
-
*
|
|
1267
1249
|
* Building advanced modifiers:
|
|
1268
1250
|
*
|
|
1269
1251
|
* ```ts
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AliasNode } from '../operation-node/alias-node.js';
|
|
2
|
+
import { OperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
3
|
+
export declare class DynamicTableBuilder<T extends string> {
|
|
4
|
+
#private;
|
|
5
|
+
get table(): T;
|
|
6
|
+
constructor(table: T);
|
|
7
|
+
as<A extends string>(alias: A): AliasedDynamicTableBuilder<T, A>;
|
|
8
|
+
}
|
|
9
|
+
export declare class AliasedDynamicTableBuilder<T extends string, A extends string> implements OperationNodeSource {
|
|
10
|
+
#private;
|
|
11
|
+
get table(): T;
|
|
12
|
+
get alias(): A;
|
|
13
|
+
constructor(table: T, alias: A);
|
|
14
|
+
toOperationNode(): AliasNode;
|
|
15
|
+
}
|
|
16
|
+
export declare function isAliasedDynamicTableBuilder(obj: unknown): obj is AliasedDynamicTableBuilder<any, any>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/// <reference types="./dynamic-table-builder.d.ts" />
|
|
2
|
+
import { AliasNode } from '../operation-node/alias-node.js';
|
|
3
|
+
import { IdentifierNode } from '../operation-node/identifier-node.js';
|
|
4
|
+
import { isOperationNodeSource, } from '../operation-node/operation-node-source.js';
|
|
5
|
+
import { parseTable } from '../parser/table-parser.js';
|
|
6
|
+
import { isObject, isString } from '../util/object-utils.js';
|
|
7
|
+
export class DynamicTableBuilder {
|
|
8
|
+
#table;
|
|
9
|
+
get table() {
|
|
10
|
+
return this.#table;
|
|
11
|
+
}
|
|
12
|
+
constructor(table) {
|
|
13
|
+
this.#table = table;
|
|
14
|
+
}
|
|
15
|
+
as(alias) {
|
|
16
|
+
return new AliasedDynamicTableBuilder(this.#table, alias);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class AliasedDynamicTableBuilder {
|
|
20
|
+
#table;
|
|
21
|
+
#alias;
|
|
22
|
+
get table() {
|
|
23
|
+
return this.#table;
|
|
24
|
+
}
|
|
25
|
+
get alias() {
|
|
26
|
+
return this.#alias;
|
|
27
|
+
}
|
|
28
|
+
constructor(table, alias) {
|
|
29
|
+
this.#table = table;
|
|
30
|
+
this.#alias = alias;
|
|
31
|
+
}
|
|
32
|
+
toOperationNode() {
|
|
33
|
+
return AliasNode.create(parseTable(this.#table), IdentifierNode.create(this.#alias));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function isAliasedDynamicTableBuilder(obj) {
|
|
37
|
+
return (isObject(obj) &&
|
|
38
|
+
isOperationNodeSource(obj) &&
|
|
39
|
+
isString(obj.table) &&
|
|
40
|
+
isString(obj.alias));
|
|
41
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DynamicReferenceBuilder } from './dynamic-reference-builder.js';
|
|
2
|
-
|
|
2
|
+
import { DynamicTableBuilder } from './dynamic-table-builder.js';
|
|
3
|
+
export declare class DynamicModule<DB> {
|
|
3
4
|
/**
|
|
4
5
|
* Creates a dynamic reference to a column that is not know at compile time.
|
|
5
6
|
*
|
|
@@ -86,4 +87,38 @@ export declare class DynamicModule {
|
|
|
86
87
|
* ```
|
|
87
88
|
*/
|
|
88
89
|
ref<R extends string = never>(reference: string): DynamicReferenceBuilder<R>;
|
|
90
|
+
/**
|
|
91
|
+
* Creates a table reference to a table that's not fully known at compile time.
|
|
92
|
+
*
|
|
93
|
+
* The type `T` is allowed to be a union of multiple tables.
|
|
94
|
+
*
|
|
95
|
+
* <!-- siteExample("select", "Generic find query", 130) -->
|
|
96
|
+
*
|
|
97
|
+
* A generic type-safe helper function for finding a row by a column value:
|
|
98
|
+
*
|
|
99
|
+
* ```ts
|
|
100
|
+
* import { SelectType } from 'kysely'
|
|
101
|
+
* import { Database } from 'type-editor'
|
|
102
|
+
*
|
|
103
|
+
* async function getRowByColumn<
|
|
104
|
+
* T extends keyof Database,
|
|
105
|
+
* C extends keyof Database[T] & string,
|
|
106
|
+
* V extends SelectType<Database[T][C]>,
|
|
107
|
+
* >(t: T, c: C, v: V) {
|
|
108
|
+
* // We need to use the dynamic module since the table name
|
|
109
|
+
* // is not known at compile time.
|
|
110
|
+
* const { table, ref } = db.dynamic
|
|
111
|
+
*
|
|
112
|
+
* return await db
|
|
113
|
+
* .selectFrom(table(t).as('t'))
|
|
114
|
+
* .selectAll()
|
|
115
|
+
* .where(ref(c), '=', v)
|
|
116
|
+
* .orderBy('t.id')
|
|
117
|
+
* .executeTakeFirstOrThrow()
|
|
118
|
+
* }
|
|
119
|
+
*
|
|
120
|
+
* const person = await getRowByColumn('person', 'first_name', 'Arnold')
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
table<T extends keyof DB & string>(table: T): DynamicTableBuilder<T>;
|
|
89
124
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference types="./dynamic.d.ts" />
|
|
2
2
|
import { DynamicReferenceBuilder } from './dynamic-reference-builder.js';
|
|
3
|
+
import { DynamicTableBuilder } from './dynamic-table-builder.js';
|
|
3
4
|
export class DynamicModule {
|
|
4
5
|
/**
|
|
5
6
|
* Creates a dynamic reference to a column that is not know at compile time.
|
|
@@ -89,4 +90,40 @@ export class DynamicModule {
|
|
|
89
90
|
ref(reference) {
|
|
90
91
|
return new DynamicReferenceBuilder(reference);
|
|
91
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Creates a table reference to a table that's not fully known at compile time.
|
|
95
|
+
*
|
|
96
|
+
* The type `T` is allowed to be a union of multiple tables.
|
|
97
|
+
*
|
|
98
|
+
* <!-- siteExample("select", "Generic find query", 130) -->
|
|
99
|
+
*
|
|
100
|
+
* A generic type-safe helper function for finding a row by a column value:
|
|
101
|
+
*
|
|
102
|
+
* ```ts
|
|
103
|
+
* import { SelectType } from 'kysely'
|
|
104
|
+
* import { Database } from 'type-editor'
|
|
105
|
+
*
|
|
106
|
+
* async function getRowByColumn<
|
|
107
|
+
* T extends keyof Database,
|
|
108
|
+
* C extends keyof Database[T] & string,
|
|
109
|
+
* V extends SelectType<Database[T][C]>,
|
|
110
|
+
* >(t: T, c: C, v: V) {
|
|
111
|
+
* // We need to use the dynamic module since the table name
|
|
112
|
+
* // is not known at compile time.
|
|
113
|
+
* const { table, ref } = db.dynamic
|
|
114
|
+
*
|
|
115
|
+
* return await db
|
|
116
|
+
* .selectFrom(table(t).as('t'))
|
|
117
|
+
* .selectAll()
|
|
118
|
+
* .where(ref(c), '=', v)
|
|
119
|
+
* .orderBy('t.id')
|
|
120
|
+
* .executeTakeFirstOrThrow()
|
|
121
|
+
* }
|
|
122
|
+
*
|
|
123
|
+
* const person = await getRowByColumn('person', 'first_name', 'Arnold')
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
table(table) {
|
|
127
|
+
return new DynamicTableBuilder(table);
|
|
128
|
+
}
|
|
92
129
|
}
|
package/dist/esm/kysely.d.ts
CHANGED
|
@@ -65,7 +65,7 @@ export declare class Kysely<DB> extends QueryCreator<DB> implements QueryExecuto
|
|
|
65
65
|
* The {@link DynamicModule} module can be used to bypass strict typing and
|
|
66
66
|
* passing in dynamic values for the queries.
|
|
67
67
|
*/
|
|
68
|
-
get dynamic(): DynamicModule
|
|
68
|
+
get dynamic(): DynamicModule<DB>;
|
|
69
69
|
/**
|
|
70
70
|
* Returns a {@link DatabaseIntrospector | database introspector}.
|
|
71
71
|
*/
|
|
@@ -4,7 +4,8 @@ import { AliasedExpressionOrFactory } from './expression-parser.js';
|
|
|
4
4
|
import { OperationNode } from '../operation-node/operation-node.js';
|
|
5
5
|
import { AliasedExpression } from '../expression/expression.js';
|
|
6
6
|
import { DrainOuterGeneric } from '../util/type-utils.js';
|
|
7
|
-
|
|
7
|
+
import { AliasedDynamicTableBuilder } from '../dynamic/dynamic-table-builder.js';
|
|
8
|
+
export type TableExpression<DB, TB extends keyof DB> = AnyAliasedTable<DB> | AnyTable<DB> | AliasedExpressionOrFactory<DB, TB> | AliasedDynamicTableBuilder<any, any>;
|
|
8
9
|
export type TableExpressionOrList<DB, TB extends keyof DB> = TableExpression<DB, TB> | ReadonlyArray<TableExpression<DB, TB>>;
|
|
9
10
|
export type SimpleTableReference<DB> = AnyAliasedTable<DB> | AnyTable<DB>;
|
|
10
11
|
export type AnyAliasedTable<DB> = `${AnyTable<DB>} as ${string}`;
|
|
@@ -14,8 +15,8 @@ export type From<DB, TE> = DrainOuterGeneric<{
|
|
|
14
15
|
}>;
|
|
15
16
|
export type FromTables<DB, TB extends keyof DB, TE> = DrainOuterGeneric<TB | ExtractAliasFromTableExpression<DB, TE>>;
|
|
16
17
|
export type ExtractTableAlias<DB, TE> = TE extends `${string} as ${infer TA}` ? TA extends keyof DB ? TA : never : TE extends keyof DB ? TE : never;
|
|
17
|
-
type ExtractAliasFromTableExpression<DB, TE> = TE extends string ? TE extends `${string} as ${infer TA}` ? TA : TE extends keyof DB ? TE : never : TE extends AliasedExpression<any, infer QA> ? QA : TE extends (qb: any) => AliasedExpression<any, infer QA> ? QA : never;
|
|
18
|
-
type ExtractRowTypeFromTableExpression<DB, TE, A extends keyof any> = TE extends `${infer T} as ${infer TA}` ? TA extends A ? T extends keyof DB ? DB[T] : never : never : TE extends A ? TE extends keyof DB ? DB[TE] : never : TE extends AliasedExpression<infer O, infer QA> ? QA extends A ? O : never : TE extends (qb: any) => AliasedExpression<infer O, infer QA> ? QA extends A ? O : never : never;
|
|
18
|
+
type ExtractAliasFromTableExpression<DB, TE> = TE extends string ? TE extends `${string} as ${infer TA}` ? TA : TE extends keyof DB ? TE : never : TE extends AliasedExpression<any, infer QA> ? QA : TE extends (qb: any) => AliasedExpression<any, infer QA> ? QA : TE extends AliasedDynamicTableBuilder<any, infer DA> ? DA : never;
|
|
19
|
+
type ExtractRowTypeFromTableExpression<DB, TE, A extends keyof any> = TE extends `${infer T} as ${infer TA}` ? TA extends A ? T extends keyof DB ? DB[T] : never : never : TE extends A ? TE extends keyof DB ? DB[TE] : never : TE extends AliasedExpression<infer O, infer QA> ? QA extends A ? O : never : TE extends (qb: any) => AliasedExpression<infer O, infer QA> ? QA extends A ? O : never : TE extends AliasedDynamicTableBuilder<infer T, infer DA> ? DA extends A ? T extends keyof DB ? DB[T] : never : never : never;
|
|
19
20
|
export declare function parseTableExpressionOrList(table: TableExpressionOrList<any, any>): OperationNode[];
|
|
20
21
|
export declare function parseTableExpression(table: TableExpression<any, any>): OperationNode;
|
|
21
22
|
export declare function parseAliasedTable(from: string): TableNode | AliasNode;
|
|
@@ -4,6 +4,7 @@ import { AliasNode } from '../operation-node/alias-node.js';
|
|
|
4
4
|
import { TableNode } from '../operation-node/table-node.js';
|
|
5
5
|
import { parseAliasedExpression, } from './expression-parser.js';
|
|
6
6
|
import { IdentifierNode } from '../operation-node/identifier-node.js';
|
|
7
|
+
import { isAliasedDynamicTableBuilder, } from '../dynamic/dynamic-table-builder.js';
|
|
7
8
|
export function parseTableExpressionOrList(table) {
|
|
8
9
|
if (isReadonlyArray(table)) {
|
|
9
10
|
return table.map((it) => parseTableExpression(it));
|
|
@@ -16,6 +17,9 @@ export function parseTableExpression(table) {
|
|
|
16
17
|
if (isString(table)) {
|
|
17
18
|
return parseAliasedTable(table);
|
|
18
19
|
}
|
|
20
|
+
else if (isAliasedDynamicTableBuilder(table)) {
|
|
21
|
+
return table.toOperationNode();
|
|
22
|
+
}
|
|
19
23
|
else {
|
|
20
24
|
return parseAliasedExpression(table);
|
|
21
25
|
}
|
|
@@ -40,24 +40,6 @@ export interface OrderByInterface<DB, TB extends keyof DB, O> {
|
|
|
40
40
|
* order by "id", "fn" desc
|
|
41
41
|
* ```
|
|
42
42
|
*
|
|
43
|
-
* Multiple columns/expressions per call:
|
|
44
|
-
*
|
|
45
|
-
* ```ts
|
|
46
|
-
* await db
|
|
47
|
-
* .selectFrom('person')
|
|
48
|
-
* .select('person.first_name as fn')
|
|
49
|
-
* .orderBy(['id', 'fn'])
|
|
50
|
-
* .execute()
|
|
51
|
-
* ```
|
|
52
|
-
*
|
|
53
|
-
* The generated SQL (PostgreSQL):
|
|
54
|
-
*
|
|
55
|
-
* ```sql
|
|
56
|
-
* select "person"."first_name" as "fn"
|
|
57
|
-
* from "person"
|
|
58
|
-
* order by "id", "fn"
|
|
59
|
-
* ```
|
|
60
|
-
*
|
|
61
43
|
* Building advanced modifiers:
|
|
62
44
|
*
|
|
63
45
|
* ```ts
|
|
@@ -1246,24 +1246,6 @@ export interface SelectQueryBuilder<DB, TB extends keyof DB, O> extends WhereInt
|
|
|
1246
1246
|
* order by "id", "fn" desc
|
|
1247
1247
|
* ```
|
|
1248
1248
|
*
|
|
1249
|
-
* Multiple columns/expressions per call:
|
|
1250
|
-
*
|
|
1251
|
-
* ```ts
|
|
1252
|
-
* await db
|
|
1253
|
-
* .selectFrom('person')
|
|
1254
|
-
* .select('person.first_name as fn')
|
|
1255
|
-
* .orderBy(['id', 'fn'])
|
|
1256
|
-
* .execute()
|
|
1257
|
-
* ```
|
|
1258
|
-
*
|
|
1259
|
-
* The generated SQL (PostgreSQL):
|
|
1260
|
-
*
|
|
1261
|
-
* ```sql
|
|
1262
|
-
* select "person"."first_name" as "fn"
|
|
1263
|
-
* from "person"
|
|
1264
|
-
* order by "id", "fn"
|
|
1265
|
-
* ```
|
|
1266
|
-
*
|
|
1267
1249
|
* Building advanced modifiers:
|
|
1268
1250
|
*
|
|
1269
1251
|
* ```ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kysely",
|
|
3
|
-
"version": "0.28.
|
|
3
|
+
"version": "0.28.2",
|
|
4
4
|
"description": "Type safe SQL query builder",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
"sinon": "^19.0.2",
|
|
114
114
|
"tarn": "^3.0.2",
|
|
115
115
|
"tedious": "^19.0.0",
|
|
116
|
-
"tsd": "^0.
|
|
116
|
+
"tsd": "^0.32.0",
|
|
117
117
|
"tsx": "^4.19.1",
|
|
118
118
|
"typescript": "^5.6.3"
|
|
119
119
|
}
|