kysely 0.9.1 → 0.9.5
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/dialect/mysql/mysql-dialect.d.ts +11 -0
- package/dist/cjs/dialect/mysql/mysql-dialect.js +7 -0
- package/dist/cjs/dialect/mysql/mysql-driver.js +2 -2
- package/dist/cjs/dialect/postgres/postgres-dialect.d.ts +13 -1
- package/dist/cjs/dialect/postgres/postgres-dialect.js +10 -0
- package/dist/cjs/dialect/postgres/postgres-driver.js +2 -2
- package/dist/cjs/dialect/postgres/postgres-query-compiler.js +1 -1
- package/dist/cjs/driver/runtime-driver.d.ts +3 -2
- package/dist/cjs/driver/runtime-driver.js +57 -4
- package/dist/cjs/index.d.ts +2 -1
- package/dist/cjs/kysely.d.ts +31 -9
- package/dist/cjs/kysely.js +25 -9
- package/dist/cjs/migration/migration.d.ts +32 -0
- package/dist/cjs/operation-node/join-node.d.ts +2 -1
- package/dist/cjs/operation-node/join-node.js +8 -6
- 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 +61 -59
- package/dist/cjs/operation-node/operation-node-visitor.js +1 -316
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/query-node.d.ts +4 -3
- package/dist/cjs/operation-node/query-node.js +10 -2
- package/dist/cjs/operation-node/select-query-node.d.ts +5 -1
- package/dist/cjs/operation-node/select-query-node.js +18 -2
- package/dist/cjs/operation-node/union-node.d.ts +16 -0
- package/dist/cjs/operation-node/union-node.js +19 -0
- package/dist/cjs/parser/group-by-parser.d.ts +4 -0
- package/dist/cjs/parser/group-by-parser.js +9 -0
- package/dist/cjs/parser/insert-values-parser.d.ts +1 -1
- package/dist/cjs/parser/join-parser.d.ts +4 -4
- package/dist/cjs/parser/order-by-parser.d.ts +2 -4
- package/dist/cjs/parser/order-by-parser.js +6 -3
- package/dist/cjs/parser/reference-parser.d.ts +1 -1
- package/dist/cjs/parser/reference-parser.js +1 -1
- package/dist/cjs/parser/union-parser.d.ts +5 -0
- package/dist/cjs/parser/union-parser.js +13 -0
- package/dist/cjs/parser/value-parser.d.ts +1 -1
- package/dist/cjs/plugin/camel-case/camel-case-plugin.js +5 -116
- package/dist/cjs/plugin/camel-case/camel-case-transformer.d.ts +8 -0
- package/dist/cjs/plugin/camel-case/camel-case-transformer.js +19 -0
- package/dist/cjs/plugin/camel-case/camel-case.d.ts +15 -0
- package/dist/cjs/plugin/camel-case/camel-case.js +109 -0
- package/dist/cjs/plugin/kysely-plugin.d.ts +1 -1
- package/dist/cjs/query-builder/join-builder.js +8 -8
- package/dist/cjs/query-builder/query-builder.d.ts +65 -1
- package/dist/cjs/query-builder/query-builder.js +103 -22
- package/dist/cjs/query-compiler/compiled-query.d.ts +1 -1
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +7 -2
- package/dist/cjs/query-compiler/default-query-compiler.js +20 -3
- package/dist/cjs/query-executor/default-query-executor.d.ts +1 -0
- package/dist/cjs/query-executor/default-query-executor.js +6 -0
- package/dist/cjs/query-executor/noop-query-executor.d.ts +1 -0
- package/dist/cjs/query-executor/noop-query-executor.js +3 -0
- package/dist/cjs/query-executor/query-executor.d.ts +9 -4
- package/dist/cjs/util/log.d.ts +19 -0
- package/dist/cjs/util/log.js +37 -0
- package/dist/cjs/util/object-utils.d.ts +11 -11
- package/dist/cjs/util/object-utils.js +1 -1
- package/dist/cjs/util/random-string.js +6 -3
- package/dist/cjs/util/type-utils.d.ts +4 -4
- package/dist/esm/dialect/mysql/mysql-dialect.d.ts +11 -0
- package/dist/esm/dialect/mysql/mysql-dialect.js +7 -0
- package/dist/esm/dialect/mysql/mysql-driver.js +3 -3
- package/dist/esm/dialect/postgres/postgres-dialect.d.ts +13 -1
- package/dist/esm/dialect/postgres/postgres-dialect.js +10 -0
- package/dist/esm/dialect/postgres/postgres-driver.js +2 -2
- package/dist/esm/dialect/postgres/postgres-query-compiler.js +1 -1
- package/dist/esm/driver/runtime-driver.d.ts +3 -2
- package/dist/esm/driver/runtime-driver.js +57 -4
- package/dist/esm/index.d.ts +2 -1
- package/dist/esm/kysely.d.ts +31 -9
- package/dist/esm/kysely.js +25 -9
- package/dist/esm/migration/migration.d.ts +32 -0
- package/dist/esm/operation-node/join-node.d.ts +2 -1
- package/dist/esm/operation-node/join-node.js +8 -6
- 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 +61 -59
- package/dist/esm/operation-node/operation-node-visitor.js +1 -316
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/query-node.d.ts +4 -3
- package/dist/esm/operation-node/query-node.js +10 -2
- package/dist/esm/operation-node/select-query-node.d.ts +5 -1
- package/dist/esm/operation-node/select-query-node.js +18 -2
- package/dist/esm/operation-node/union-node.d.ts +16 -0
- package/dist/esm/operation-node/union-node.js +16 -0
- package/dist/esm/parser/group-by-parser.d.ts +4 -0
- package/dist/esm/parser/group-by-parser.js +5 -0
- package/dist/esm/parser/insert-values-parser.d.ts +1 -1
- package/dist/esm/parser/join-parser.d.ts +4 -4
- package/dist/esm/parser/order-by-parser.d.ts +2 -4
- package/dist/esm/parser/order-by-parser.js +6 -2
- package/dist/esm/parser/reference-parser.d.ts +1 -1
- package/dist/esm/parser/reference-parser.js +2 -2
- package/dist/esm/parser/union-parser.d.ts +5 -0
- package/dist/esm/parser/union-parser.js +9 -0
- package/dist/esm/parser/value-parser.d.ts +1 -1
- package/dist/esm/plugin/camel-case/camel-case-plugin.js +4 -115
- package/dist/esm/plugin/camel-case/camel-case-transformer.d.ts +8 -0
- package/dist/esm/plugin/camel-case/camel-case-transformer.js +15 -0
- package/dist/esm/plugin/camel-case/camel-case.d.ts +15 -0
- package/dist/esm/plugin/camel-case/camel-case.js +104 -0
- package/dist/esm/plugin/kysely-plugin.d.ts +1 -1
- package/dist/esm/query-builder/join-builder.js +8 -8
- package/dist/esm/query-builder/query-builder.d.ts +65 -1
- package/dist/esm/query-builder/query-builder.js +104 -23
- package/dist/esm/query-compiler/compiled-query.d.ts +1 -1
- package/dist/esm/query-compiler/default-query-compiler.d.ts +7 -2
- package/dist/esm/query-compiler/default-query-compiler.js +20 -3
- package/dist/esm/query-executor/default-query-executor.d.ts +1 -0
- package/dist/esm/query-executor/default-query-executor.js +6 -0
- package/dist/esm/query-executor/noop-query-executor.d.ts +1 -0
- package/dist/esm/query-executor/noop-query-executor.js +3 -0
- package/dist/esm/query-executor/query-executor.d.ts +9 -4
- package/dist/esm/util/log.d.ts +19 -0
- package/dist/esm/util/log.js +33 -0
- package/dist/esm/util/object-utils.d.ts +11 -11
- package/dist/esm/util/object-utils.js +1 -1
- package/dist/esm/util/random-string.js +6 -3
- package/dist/esm/util/type-utils.d.ts +4 -4
- package/package.json +1 -1
|
@@ -3,13 +3,10 @@ import { parseJoin, } from '../parser/join-parser.js';
|
|
|
3
3
|
import { parseSelectExpressionOrList, parseSelectAll, } from '../parser/select-parser.js';
|
|
4
4
|
import { parseExistFilter, parseReferenceFilter, parseWhereFilter, parseHavingFilter, parseNotExistFilter, } from '../parser/filter-parser.js';
|
|
5
5
|
import { parseInsertObjectOrList, } from '../parser/insert-values-parser.js';
|
|
6
|
-
import { parseReferenceExpressionOrList, } from '../parser/reference-parser.js';
|
|
7
|
-
import { OrderByItemNode } from '../operation-node/order-by-item-node.js';
|
|
8
6
|
import { SelectQueryNode } from '../operation-node/select-query-node.js';
|
|
9
7
|
import { InsertQueryNode } from '../operation-node/insert-query-node.js';
|
|
10
8
|
import { QueryNode, } from '../operation-node/query-node.js';
|
|
11
|
-
import {
|
|
12
|
-
import { GroupByItemNode } from '../operation-node/group-by-item-node.js';
|
|
9
|
+
import { parseOrderBy, } from '../parser/order-by-parser.js';
|
|
13
10
|
import { UpdateQueryNode } from '../operation-node/update-query-node.js';
|
|
14
11
|
import { parseUpdateObject, } from '../parser/update-set-parser.js';
|
|
15
12
|
import { preventAwait } from '../util/prevent-await.js';
|
|
@@ -19,6 +16,8 @@ import { parseOnConflictDoNothing, parseOnConflictUpdate, } from '../parser/on-c
|
|
|
19
16
|
import { freeze } from '../util/object-utils.js';
|
|
20
17
|
import { DeleteQueryNode } from '../operation-node/delete-query-node.js';
|
|
21
18
|
import { OnDuplicateKeyNode } from '../operation-node/on-duplicate-key-node.js';
|
|
19
|
+
import { parseGroupBy } from '../parser/group-by-parser.js';
|
|
20
|
+
import { parseUnion } from '../parser/union-parser.js';
|
|
22
21
|
/**
|
|
23
22
|
* The main query builder class.
|
|
24
23
|
*
|
|
@@ -43,7 +42,7 @@ export class QueryBuilder {
|
|
|
43
42
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
44
43
|
return new QueryBuilder({
|
|
45
44
|
...this.#props,
|
|
46
|
-
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode,
|
|
45
|
+
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseWhereFilter(this.#props.parseContext, args)),
|
|
47
46
|
});
|
|
48
47
|
}
|
|
49
48
|
/**
|
|
@@ -101,14 +100,14 @@ export class QueryBuilder {
|
|
|
101
100
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
102
101
|
return new QueryBuilder({
|
|
103
102
|
...this.#props,
|
|
104
|
-
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode,
|
|
103
|
+
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
105
104
|
});
|
|
106
105
|
}
|
|
107
106
|
orWhere(...args) {
|
|
108
107
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
109
108
|
return new QueryBuilder({
|
|
110
109
|
...this.#props,
|
|
111
|
-
queryNode: QueryNode.
|
|
110
|
+
queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseWhereFilter(this.#props.parseContext, args)),
|
|
112
111
|
});
|
|
113
112
|
}
|
|
114
113
|
/**
|
|
@@ -121,7 +120,7 @@ export class QueryBuilder {
|
|
|
121
120
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
122
121
|
return new QueryBuilder({
|
|
123
122
|
...this.#props,
|
|
124
|
-
queryNode: QueryNode.
|
|
123
|
+
queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
125
124
|
});
|
|
126
125
|
}
|
|
127
126
|
/**
|
|
@@ -187,7 +186,7 @@ export class QueryBuilder {
|
|
|
187
186
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
188
187
|
return new QueryBuilder({
|
|
189
188
|
...this.#props,
|
|
190
|
-
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode,
|
|
189
|
+
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
191
190
|
});
|
|
192
191
|
}
|
|
193
192
|
/**
|
|
@@ -197,7 +196,7 @@ export class QueryBuilder {
|
|
|
197
196
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
198
197
|
return new QueryBuilder({
|
|
199
198
|
...this.#props,
|
|
200
|
-
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode,
|
|
199
|
+
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
201
200
|
});
|
|
202
201
|
}
|
|
203
202
|
/**
|
|
@@ -207,7 +206,7 @@ export class QueryBuilder {
|
|
|
207
206
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
208
207
|
return new QueryBuilder({
|
|
209
208
|
...this.#props,
|
|
210
|
-
queryNode: QueryNode.
|
|
209
|
+
queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
211
210
|
});
|
|
212
211
|
}
|
|
213
212
|
/**
|
|
@@ -217,14 +216,14 @@ export class QueryBuilder {
|
|
|
217
216
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
218
217
|
return new QueryBuilder({
|
|
219
218
|
...this.#props,
|
|
220
|
-
queryNode: QueryNode.
|
|
219
|
+
queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
221
220
|
});
|
|
222
221
|
}
|
|
223
222
|
having(...args) {
|
|
224
223
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
225
224
|
return new QueryBuilder({
|
|
226
225
|
...this.#props,
|
|
227
|
-
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode,
|
|
226
|
+
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseHavingFilter(this.#props.parseContext, args)),
|
|
228
227
|
});
|
|
229
228
|
}
|
|
230
229
|
/**
|
|
@@ -235,14 +234,14 @@ export class QueryBuilder {
|
|
|
235
234
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
236
235
|
return new QueryBuilder({
|
|
237
236
|
...this.#props,
|
|
238
|
-
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode,
|
|
237
|
+
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
239
238
|
});
|
|
240
239
|
}
|
|
241
240
|
orHaving(...args) {
|
|
242
241
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
243
242
|
return new QueryBuilder({
|
|
244
243
|
...this.#props,
|
|
245
|
-
queryNode: SelectQueryNode.
|
|
244
|
+
queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseHavingFilter(this.#props.parseContext, args)),
|
|
246
245
|
});
|
|
247
246
|
}
|
|
248
247
|
/**
|
|
@@ -253,7 +252,7 @@ export class QueryBuilder {
|
|
|
253
252
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
254
253
|
return new QueryBuilder({
|
|
255
254
|
...this.#props,
|
|
256
|
-
queryNode: SelectQueryNode.
|
|
255
|
+
queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
257
256
|
});
|
|
258
257
|
}
|
|
259
258
|
/**
|
|
@@ -264,7 +263,7 @@ export class QueryBuilder {
|
|
|
264
263
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
265
264
|
return new QueryBuilder({
|
|
266
265
|
...this.#props,
|
|
267
|
-
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode,
|
|
266
|
+
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
268
267
|
});
|
|
269
268
|
}
|
|
270
269
|
/**
|
|
@@ -275,7 +274,7 @@ export class QueryBuilder {
|
|
|
275
274
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
276
275
|
return new QueryBuilder({
|
|
277
276
|
...this.#props,
|
|
278
|
-
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode,
|
|
277
|
+
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
279
278
|
});
|
|
280
279
|
}
|
|
281
280
|
/**
|
|
@@ -286,7 +285,7 @@ export class QueryBuilder {
|
|
|
286
285
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
287
286
|
return new QueryBuilder({
|
|
288
287
|
...this.#props,
|
|
289
|
-
queryNode: SelectQueryNode.
|
|
288
|
+
queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
290
289
|
});
|
|
291
290
|
}
|
|
292
291
|
/**
|
|
@@ -297,7 +296,7 @@ export class QueryBuilder {
|
|
|
297
296
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
298
297
|
return new QueryBuilder({
|
|
299
298
|
...this.#props,
|
|
300
|
-
queryNode: SelectQueryNode.
|
|
299
|
+
queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
301
300
|
});
|
|
302
301
|
}
|
|
303
302
|
select(selection) {
|
|
@@ -714,14 +713,14 @@ export class QueryBuilder {
|
|
|
714
713
|
assertCanHaveOrderByClause(this.#props.queryNode);
|
|
715
714
|
return new QueryBuilder({
|
|
716
715
|
...this.#props,
|
|
717
|
-
queryNode: SelectQueryNode.cloneWithOrderByItem(this.#props.queryNode,
|
|
716
|
+
queryNode: SelectQueryNode.cloneWithOrderByItem(this.#props.queryNode, parseOrderBy(this.#props.parseContext, orderBy, direction)),
|
|
718
717
|
});
|
|
719
718
|
}
|
|
720
719
|
groupBy(orderBy) {
|
|
721
720
|
assertCanHaveGroupByClause(this.#props.queryNode);
|
|
722
721
|
return new QueryBuilder({
|
|
723
722
|
...this.#props,
|
|
724
|
-
queryNode: SelectQueryNode.cloneWithGroupByItems(this.#props.queryNode,
|
|
723
|
+
queryNode: SelectQueryNode.cloneWithGroupByItems(this.#props.queryNode, parseGroupBy(this.#props.parseContext, orderBy)),
|
|
725
724
|
});
|
|
726
725
|
}
|
|
727
726
|
/**
|
|
@@ -776,6 +775,83 @@ export class QueryBuilder {
|
|
|
776
775
|
queryNode: SelectQueryNode.cloneWithOffset(this.#props.queryNode, OffsetNode.create(offset)),
|
|
777
776
|
});
|
|
778
777
|
}
|
|
778
|
+
/**
|
|
779
|
+
* Combines another select query or raw expression to this query using `union`.
|
|
780
|
+
*
|
|
781
|
+
* The output row type of the combined query must match `this` query.
|
|
782
|
+
*
|
|
783
|
+
* @xample
|
|
784
|
+
* ```ts
|
|
785
|
+
* db.selectFrom('person')
|
|
786
|
+
* .select(['id', 'first_name as name'])
|
|
787
|
+
* .union(db.selectFrom('pet').select(['id', 'name']))
|
|
788
|
+
* .orderBy('name')
|
|
789
|
+
* ```
|
|
790
|
+
*/
|
|
791
|
+
union(expression) {
|
|
792
|
+
assertCanHaveUnion(this.#props.queryNode);
|
|
793
|
+
return new QueryBuilder({
|
|
794
|
+
...this.#props,
|
|
795
|
+
queryNode: SelectQueryNode.cloneWithUnion(this.#props.queryNode, parseUnion(expression, false)),
|
|
796
|
+
});
|
|
797
|
+
}
|
|
798
|
+
/**
|
|
799
|
+
* Combines another select query or raw expression to this query using `union all`.
|
|
800
|
+
*
|
|
801
|
+
* The output row type of the combined query must match `this` query.
|
|
802
|
+
*
|
|
803
|
+
* @xample
|
|
804
|
+
* ```ts
|
|
805
|
+
* db.selectFrom('person')
|
|
806
|
+
* .select(['id', 'first_name as name'])
|
|
807
|
+
* .unionAll(db.selectFrom('pet').select(['id', 'name']))
|
|
808
|
+
* .orderBy('name')
|
|
809
|
+
* ```
|
|
810
|
+
*/
|
|
811
|
+
unionAll(expression) {
|
|
812
|
+
assertCanHaveUnion(this.#props.queryNode);
|
|
813
|
+
return new QueryBuilder({
|
|
814
|
+
...this.#props,
|
|
815
|
+
queryNode: SelectQueryNode.cloneWithUnion(this.#props.queryNode, parseUnion(expression, true)),
|
|
816
|
+
});
|
|
817
|
+
}
|
|
818
|
+
/**
|
|
819
|
+
* Simply calls the given function passing `this` as the only argument.
|
|
820
|
+
*
|
|
821
|
+
* This method can be useful when adding optional method calls:
|
|
822
|
+
*
|
|
823
|
+
* @example
|
|
824
|
+
* ```ts
|
|
825
|
+
* db.selectFrom('person')
|
|
826
|
+
* .selectAll()
|
|
827
|
+
* .call((qb) => {
|
|
828
|
+
* if (something) {
|
|
829
|
+
* return qb.where('something', '=', something)
|
|
830
|
+
* } else {
|
|
831
|
+
* return qb.where('somethingElse', '=', somethingElse)
|
|
832
|
+
* }
|
|
833
|
+
* })
|
|
834
|
+
* .execute()
|
|
835
|
+
* ```
|
|
836
|
+
*
|
|
837
|
+
* The next example uses a helper funtion `log` to log a query:
|
|
838
|
+
*
|
|
839
|
+
* @example
|
|
840
|
+
* ```ts
|
|
841
|
+
* function log<T extends AnyQueryBuilder>(qb: T): T {
|
|
842
|
+
* console.log(qb.compile())
|
|
843
|
+
* return qb
|
|
844
|
+
* }
|
|
845
|
+
*
|
|
846
|
+
* db.selectFrom('person')
|
|
847
|
+
* .selectAll()
|
|
848
|
+
* .call(log)
|
|
849
|
+
* .execute()
|
|
850
|
+
* ```
|
|
851
|
+
*/
|
|
852
|
+
call(func) {
|
|
853
|
+
return func(this);
|
|
854
|
+
}
|
|
779
855
|
/**
|
|
780
856
|
* Gives an alias for the query. This method is only useful for sub queries.
|
|
781
857
|
*
|
|
@@ -958,7 +1034,7 @@ function assertCanHaveUpdates(node) {
|
|
|
958
1034
|
}
|
|
959
1035
|
function assertCanHaveReturningClause(node) {
|
|
960
1036
|
if (!QueryNode.isMutating(node)) {
|
|
961
|
-
throw new Error('only
|
|
1037
|
+
throw new Error('only insert, delete and update queries can have a returning clause');
|
|
962
1038
|
}
|
|
963
1039
|
}
|
|
964
1040
|
function assertCanHaveOrderByClause(node) {
|
|
@@ -981,3 +1057,8 @@ function assertCanHaveOffset(node) {
|
|
|
981
1057
|
throw new Error('only a select query can have an offset');
|
|
982
1058
|
}
|
|
983
1059
|
}
|
|
1060
|
+
function assertCanHaveUnion(node) {
|
|
1061
|
+
if (!SelectQueryNode.is(node)) {
|
|
1062
|
+
throw new Error('only a select query can have an union');
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
@@ -60,6 +60,8 @@ import { ForeignKeyConstraintNode } from '../operation-node/foreign-key-constrai
|
|
|
60
60
|
import { ColumnDefinitionNode } from '../operation-node/column-definition-node.js';
|
|
61
61
|
import { ModifyColumnNode } from '../operation-node/modify-column-node.js';
|
|
62
62
|
import { OnDuplicateKeyNode } from '../operation-node/on-duplicate-key-node.js';
|
|
63
|
+
import { ColumnNode } from '../operation-node/column-node.js';
|
|
64
|
+
import { UnionNode } from '../operation-node/union-node.js';
|
|
63
65
|
export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
|
|
64
66
|
#private;
|
|
65
67
|
protected get numParameters(): number;
|
|
@@ -67,6 +69,8 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
67
69
|
protected getSql(): string;
|
|
68
70
|
protected visitSelectQuery(node: SelectQueryNode): void;
|
|
69
71
|
protected visitFrom(node: FromNode): void;
|
|
72
|
+
protected visitSelection(node: SelectionNode): void;
|
|
73
|
+
protected visitColumn(node: ColumnNode): void;
|
|
70
74
|
protected compileDistinctOn(selections: ReadonlyArray<SelectionNode>): void;
|
|
71
75
|
protected compileList(nodes: ReadonlyArray<OperationNode>, separator?: string): void;
|
|
72
76
|
protected visitWhere(node: WhereNode): void;
|
|
@@ -125,11 +129,12 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
125
129
|
protected visitModifyColumn(node: ModifyColumnNode): void;
|
|
126
130
|
protected visitAddConstraint(node: AddConstraintNode): void;
|
|
127
131
|
protected visitDropConstraint(node: DropConstraintNode): void;
|
|
132
|
+
protected visitUnion(node: UnionNode): void;
|
|
128
133
|
protected append(str: string): void;
|
|
129
|
-
protected appendValue(
|
|
134
|
+
protected appendValue(parameter: unknown): void;
|
|
130
135
|
protected getLeftIdentifierWrapper(): string;
|
|
131
136
|
protected getRightIdentifierWrapper(): string;
|
|
132
137
|
protected getCurrentParameterPlaceholder(): string;
|
|
133
|
-
protected addParameter(parameter:
|
|
138
|
+
protected addParameter(parameter: unknown): void;
|
|
134
139
|
protected appendImmediateValue(value: PrimitiveValue): void;
|
|
135
140
|
}
|
|
@@ -14,7 +14,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
14
14
|
this.visitNode(node);
|
|
15
15
|
return freeze({
|
|
16
16
|
sql: this.getSql(),
|
|
17
|
-
parameters: this.#parameters,
|
|
17
|
+
parameters: [...this.#parameters],
|
|
18
18
|
});
|
|
19
19
|
}
|
|
20
20
|
getSql() {
|
|
@@ -60,6 +60,10 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
60
60
|
this.append(' ');
|
|
61
61
|
this.visitNode(node.having);
|
|
62
62
|
}
|
|
63
|
+
if (node.union) {
|
|
64
|
+
this.append(' ');
|
|
65
|
+
this.compileList(node.union, ' ');
|
|
66
|
+
}
|
|
63
67
|
if (node.orderBy) {
|
|
64
68
|
this.append(' ');
|
|
65
69
|
this.visitNode(node.orderBy);
|
|
@@ -86,6 +90,12 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
86
90
|
this.append('from ');
|
|
87
91
|
this.compileList(node.froms);
|
|
88
92
|
}
|
|
93
|
+
visitSelection(node) {
|
|
94
|
+
this.visitNode(node.selection);
|
|
95
|
+
}
|
|
96
|
+
visitColumn(node) {
|
|
97
|
+
this.visitNode(node.column);
|
|
98
|
+
}
|
|
89
99
|
compileDistinctOn(selections) {
|
|
90
100
|
this.append('distinct on (');
|
|
91
101
|
this.compileList(selections);
|
|
@@ -627,11 +637,18 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
627
637
|
this.append('drop constraint ');
|
|
628
638
|
this.visitNode(node.constraintName);
|
|
629
639
|
}
|
|
640
|
+
visitUnion(node) {
|
|
641
|
+
this.append('union ');
|
|
642
|
+
if (node.all) {
|
|
643
|
+
this.append('all ');
|
|
644
|
+
}
|
|
645
|
+
this.visitNode(node.union);
|
|
646
|
+
}
|
|
630
647
|
append(str) {
|
|
631
648
|
this.#sql += str;
|
|
632
649
|
}
|
|
633
|
-
appendValue(
|
|
634
|
-
this.addParameter(
|
|
650
|
+
appendValue(parameter) {
|
|
651
|
+
this.addParameter(parameter);
|
|
635
652
|
this.append(this.getCurrentParameterPlaceholder());
|
|
636
653
|
}
|
|
637
654
|
getLeftIdentifierWrapper() {
|
|
@@ -9,6 +9,7 @@ export declare class DefaultQueryExecutor extends QueryExecutor {
|
|
|
9
9
|
constructor(compiler: QueryCompiler, connectionProvider: ConnectionProvider, plugins?: KyselyPlugin[]);
|
|
10
10
|
compileQuery(node: RootOperationNode): CompiledQuery;
|
|
11
11
|
protected executeQueryImpl<R>(compiledQuery: CompiledQuery): Promise<QueryResult<R>>;
|
|
12
|
+
withPlugin(plugin: KyselyPlugin): DefaultQueryExecutor;
|
|
12
13
|
withPluginAtFront(plugin: KyselyPlugin): DefaultQueryExecutor;
|
|
13
14
|
withConnectionProvider(connectionProvider: ConnectionProvider): QueryExecutor;
|
|
14
15
|
withoutPlugins(): QueryExecutor;
|
|
@@ -15,6 +15,12 @@ export class DefaultQueryExecutor extends QueryExecutor {
|
|
|
15
15
|
return connection.executeQuery(compiledQuery);
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
|
+
withPlugin(plugin) {
|
|
19
|
+
return new DefaultQueryExecutor(this.#compiler, this.#connectionProvider, [
|
|
20
|
+
...this.plugins,
|
|
21
|
+
plugin,
|
|
22
|
+
]);
|
|
23
|
+
}
|
|
18
24
|
withPluginAtFront(plugin) {
|
|
19
25
|
return new DefaultQueryExecutor(this.#compiler, this.#connectionProvider, [
|
|
20
26
|
plugin,
|
|
@@ -11,6 +11,7 @@ export declare class NoopQueryExecutor extends QueryExecutor {
|
|
|
11
11
|
compileQuery(): CompiledQuery;
|
|
12
12
|
protected executeQueryImpl<R>(): Promise<QueryResult<R>>;
|
|
13
13
|
withConnectionProvider(): QueryExecutor;
|
|
14
|
+
withPlugin(plugin: KyselyPlugin): NoopQueryExecutor;
|
|
14
15
|
withPluginAtFront(plugin: KyselyPlugin): NoopQueryExecutor;
|
|
15
16
|
withoutPlugins(): QueryExecutor;
|
|
16
17
|
}
|
|
@@ -14,6 +14,9 @@ export class NoopQueryExecutor extends QueryExecutor {
|
|
|
14
14
|
withConnectionProvider() {
|
|
15
15
|
throw new Error('this query cannot have a connection provider');
|
|
16
16
|
}
|
|
17
|
+
withPlugin(plugin) {
|
|
18
|
+
return new NoopQueryExecutor([...this.plugins, plugin]);
|
|
19
|
+
}
|
|
17
20
|
withPluginAtFront(plugin) {
|
|
18
21
|
return new NoopQueryExecutor([plugin, ...this.plugins]);
|
|
19
22
|
}
|
|
@@ -35,15 +35,20 @@ export declare abstract class QueryExecutor {
|
|
|
35
35
|
* Executes a compiled query.
|
|
36
36
|
*/
|
|
37
37
|
protected abstract executeQueryImpl<R>(compiledQuery: CompiledQuery, queryId: QueryId): Promise<QueryResult<R>>;
|
|
38
|
+
/**
|
|
39
|
+
* Returns a copy of this executor with a new connection provider.
|
|
40
|
+
*/
|
|
41
|
+
abstract withConnectionProvider(connectionProvider: ConnectionProvider): QueryExecutor;
|
|
38
42
|
/**
|
|
39
43
|
* Returns a copy of this executor with a plugin added as the
|
|
40
|
-
*
|
|
44
|
+
* last plugin.
|
|
41
45
|
*/
|
|
42
|
-
abstract
|
|
46
|
+
abstract withPlugin(plugin: KyselyPlugin): QueryExecutor;
|
|
43
47
|
/**
|
|
44
|
-
* Returns a copy of this executor with a
|
|
48
|
+
* Returns a copy of this executor with a plugin added as the
|
|
49
|
+
* first plugin.
|
|
45
50
|
*/
|
|
46
|
-
abstract
|
|
51
|
+
abstract withPluginAtFront(plugin: KyselyPlugin): QueryExecutor;
|
|
47
52
|
/**
|
|
48
53
|
* Returns a copy of this executor without any plugins.
|
|
49
54
|
*/
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ArrayItemType } from './type-utils.js';
|
|
2
|
+
export declare const LOG_LEVELS: readonly ["query", "error"];
|
|
3
|
+
export declare type LogLevel = ArrayItemType<typeof LOG_LEVELS>;
|
|
4
|
+
export declare class Log {
|
|
5
|
+
#private;
|
|
6
|
+
constructor(levels: ReadonlyArray<LogLevel>);
|
|
7
|
+
query(getEvent: () => QueryLogEvent): void;
|
|
8
|
+
error(getEvent: () => ErrorLogEvent): void;
|
|
9
|
+
}
|
|
10
|
+
export declare type LogEvent = QueryLogEvent | ErrorLogEvent;
|
|
11
|
+
export interface QueryLogEvent {
|
|
12
|
+
readonly level: 'query';
|
|
13
|
+
readonly sql: string;
|
|
14
|
+
readonly queryDurationMillis: number;
|
|
15
|
+
}
|
|
16
|
+
export interface ErrorLogEvent {
|
|
17
|
+
readonly level: 'error';
|
|
18
|
+
readonly error: unknown;
|
|
19
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { freeze } from './object-utils.js';
|
|
2
|
+
export const LOG_LEVELS = ['query', 'error'];
|
|
3
|
+
export class Log {
|
|
4
|
+
#levels;
|
|
5
|
+
constructor(levels) {
|
|
6
|
+
this.#levels = freeze({
|
|
7
|
+
query: levels.includes('query'),
|
|
8
|
+
error: levels.includes('error'),
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
query(getEvent) {
|
|
12
|
+
if (this.#levels.query) {
|
|
13
|
+
this.#defaultQuery(getEvent());
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
error(getEvent) {
|
|
17
|
+
if (this.#levels.error) {
|
|
18
|
+
this.#defaultError(getEvent());
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
#defaultQuery(event) {
|
|
22
|
+
console.log(`kysely:query: ${event.sql}`);
|
|
23
|
+
console.log(`kysely:query: duration: ${event.queryDurationMillis.toFixed(1)}ms`);
|
|
24
|
+
}
|
|
25
|
+
#defaultError(event) {
|
|
26
|
+
if (event.error instanceof Error) {
|
|
27
|
+
console.error(`kysely:error: ${event.error.stack ?? event.error.message}`);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.error(`kysely:error: ${event}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
export declare type PrimitiveValue = string | number | boolean | null | Date | Buffer | BigInt;
|
|
3
|
-
export declare function isEmpty(obj: ArrayLike<
|
|
4
|
-
export declare function isString(obj:
|
|
5
|
-
export declare function isNumber(obj:
|
|
6
|
-
export declare function isBoolean(obj:
|
|
7
|
-
export declare function isNull(obj:
|
|
8
|
-
export declare function isDate(obj:
|
|
9
|
-
export declare function isBuffer(obj:
|
|
10
|
-
export declare function isBigInt(obj:
|
|
11
|
-
export declare function isPrimitive(obj:
|
|
12
|
-
export declare function isFunction(obj:
|
|
13
|
-
export declare function isObject(obj:
|
|
3
|
+
export declare function isEmpty(obj: ArrayLike<unknown> | string | object | Buffer): boolean;
|
|
4
|
+
export declare function isString(obj: unknown): obj is string;
|
|
5
|
+
export declare function isNumber(obj: unknown): obj is number;
|
|
6
|
+
export declare function isBoolean(obj: unknown): obj is boolean;
|
|
7
|
+
export declare function isNull(obj: unknown): obj is null;
|
|
8
|
+
export declare function isDate(obj: unknown): obj is Date;
|
|
9
|
+
export declare function isBuffer(obj: unknown): obj is Buffer;
|
|
10
|
+
export declare function isBigInt(obj: unknown): obj is BigInt;
|
|
11
|
+
export declare function isPrimitive(obj: unknown): obj is PrimitiveValue;
|
|
12
|
+
export declare function isFunction(obj: unknown): obj is Function;
|
|
13
|
+
export declare function isObject(obj: unknown): obj is Record<string, unknown>;
|
|
14
14
|
export declare function getLast<T>(arr: ArrayLike<T>): T | undefined;
|
|
15
15
|
export declare function freeze<T>(obj: T): Readonly<T>;
|
|
16
16
|
export declare function asArray<T>(arg: T | T[]): T[];
|
|
@@ -41,7 +41,7 @@ export function isFunction(obj) {
|
|
|
41
41
|
return typeof obj === 'function';
|
|
42
42
|
}
|
|
43
43
|
export function isObject(obj) {
|
|
44
|
-
return
|
|
44
|
+
return typeof obj === 'object' && obj !== null;
|
|
45
45
|
}
|
|
46
46
|
export function getLast(arr) {
|
|
47
47
|
return arr[arr.length - 1];
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
const CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
2
2
|
export function randomString(length) {
|
|
3
|
-
let chars =
|
|
3
|
+
let chars = '';
|
|
4
4
|
for (let i = 0; i < length; ++i) {
|
|
5
|
-
chars
|
|
5
|
+
chars += randomChar();
|
|
6
6
|
}
|
|
7
|
-
return chars
|
|
7
|
+
return chars;
|
|
8
|
+
}
|
|
9
|
+
function randomChar() {
|
|
10
|
+
return CHARS[Math.floor(Math.random() * CHARS.length)];
|
|
8
11
|
}
|
|
@@ -136,19 +136,19 @@ export declare type RawBuilderFactory<DB, TB extends keyof DB> = (qb: Expression
|
|
|
136
136
|
export declare type AliasedRawBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) => AnyAliasedRawBuilder;
|
|
137
137
|
export interface InsertResultTypeTag {
|
|
138
138
|
/** @internal */
|
|
139
|
-
__isInsertResultTypeTag__: true;
|
|
139
|
+
readonly __isInsertResultTypeTag__: true;
|
|
140
140
|
}
|
|
141
141
|
export interface DeleteResultTypeTag {
|
|
142
142
|
/** @internal */
|
|
143
|
-
__isDeleteResultTypeTag__: true;
|
|
143
|
+
readonly __isDeleteResultTypeTag__: true;
|
|
144
144
|
}
|
|
145
145
|
export interface UpdateResultTypeTag {
|
|
146
146
|
/** @internal */
|
|
147
|
-
__isUpdateResultTypeTag__: true;
|
|
147
|
+
readonly __isUpdateResultTypeTag__: true;
|
|
148
148
|
}
|
|
149
149
|
export interface GeneratedPlaceholder {
|
|
150
150
|
/** @internal */
|
|
151
|
-
__isGeneratedPlaceholder__: true;
|
|
151
|
+
readonly __isGeneratedPlaceholder__: true;
|
|
152
152
|
}
|
|
153
153
|
export declare type ManyResultRowType<O> = O extends InsertResultTypeTag ? number | undefined : O extends DeleteResultTypeTag ? number : O extends UpdateResultTypeTag ? number : O;
|
|
154
154
|
export declare type SingleResultRowType<O> = O extends InsertResultTypeTag ? number | undefined : O extends DeleteResultTypeTag ? number : O extends UpdateResultTypeTag ? number : O | undefined;
|