kysely 0.9.1 → 0.9.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/dialect/mysql/mysql-driver.js +2 -2
- 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/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 +2 -1
- package/dist/cjs/operation-node/select-query-node.js +10 -2
- 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/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/query-builder/join-builder.js +8 -8
- package/dist/cjs/query-builder/query-builder.js +20 -22
- package/dist/cjs/query-compiler/compiled-query.d.ts +1 -1
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -2
- package/dist/cjs/query-compiler/default-query-compiler.js +2 -2
- package/dist/cjs/util/object-utils.d.ts +11 -11
- package/dist/cjs/util/object-utils.js +1 -1
- package/dist/esm/dialect/mysql/mysql-driver.js +3 -3
- 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/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 +2 -1
- package/dist/esm/operation-node/select-query-node.js +10 -2
- 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/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/query-builder/join-builder.js +8 -8
- package/dist/esm/query-builder/query-builder.js +21 -23
- package/dist/esm/query-compiler/compiled-query.d.ts +1 -1
- package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -2
- package/dist/esm/query-compiler/default-query-compiler.js +2 -2
- package/dist/esm/util/object-utils.d.ts +11 -11
- package/dist/esm/util/object-utils.js +1 -1
- package/package.json +1 -1
|
@@ -107,13 +107,13 @@ class MysqlConnection {
|
|
|
107
107
|
async executeQuery(compiledQuery) {
|
|
108
108
|
const result = await this.#executeQuery(compiledQuery);
|
|
109
109
|
if ((0, object_utils_js_1.isObject)(result) && 'insertId' in result && 'affectedRows' in result) {
|
|
110
|
-
if (result.insertId) {
|
|
110
|
+
if ((0, object_utils_js_1.isNumber)(result.insertId) && result.insertId > 0) {
|
|
111
111
|
return {
|
|
112
112
|
insertedPrimaryKey: result.insertId,
|
|
113
113
|
rows: [],
|
|
114
114
|
};
|
|
115
115
|
}
|
|
116
|
-
else {
|
|
116
|
+
else if ((0, object_utils_js_1.isNumber)(result.affectedRows)) {
|
|
117
117
|
return {
|
|
118
118
|
numUpdatedOrDeletedRows: result.affectedRows,
|
|
119
119
|
rows: [],
|
|
@@ -21,5 +21,6 @@ export declare const JoinNode: Readonly<{
|
|
|
21
21
|
is(node: OperationNode): node is JoinNode;
|
|
22
22
|
create(joinType: JoinType, table: JoinTableNode): JoinNode;
|
|
23
23
|
createWithOn(joinType: JoinType, table: JoinTableNode, on: JoinNodeOnNode): JoinNode;
|
|
24
|
-
cloneWithOn(joinNode: JoinNode,
|
|
24
|
+
cloneWithOn(joinNode: JoinNode, on: JoinNodeOnNode): JoinNode;
|
|
25
|
+
cloneWithOrOn(joinNode: JoinNode, on: JoinNodeOnNode): JoinNode;
|
|
25
26
|
}>;
|
|
@@ -27,14 +27,16 @@ exports.JoinNode = (0, object_utils_js_1.freeze)({
|
|
|
27
27
|
on,
|
|
28
28
|
});
|
|
29
29
|
},
|
|
30
|
-
cloneWithOn(joinNode,
|
|
30
|
+
cloneWithOn(joinNode, on) {
|
|
31
31
|
return (0, object_utils_js_1.freeze)({
|
|
32
32
|
...joinNode,
|
|
33
|
-
on: joinNode.on
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
on: joinNode.on ? and_node_js_1.AndNode.create(joinNode.on, on) : on,
|
|
34
|
+
});
|
|
35
|
+
},
|
|
36
|
+
cloneWithOrOn(joinNode, on) {
|
|
37
|
+
return (0, object_utils_js_1.freeze)({
|
|
38
|
+
...joinNode,
|
|
39
|
+
on: joinNode.on ? or_node_js_1.OrNode.create(joinNode.on, on) : on,
|
|
38
40
|
});
|
|
39
41
|
},
|
|
40
42
|
});
|
|
@@ -16,7 +16,8 @@ export declare const QueryNode: Readonly<{
|
|
|
16
16
|
is(node: OperationNode): node is QueryNode;
|
|
17
17
|
isMutating(node: OperationNode): node is MutatingQueryNode;
|
|
18
18
|
isFilterable(node: OperationNode): node is FilterableQueryNode;
|
|
19
|
-
cloneWithWhere<T extends FilterableQueryNode>(node: T,
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
cloneWithWhere<T extends FilterableQueryNode>(node: T, filter: WhereChildNode): T;
|
|
20
|
+
cloneWithOrWhere<T_1 extends FilterableQueryNode>(node: T_1, filter: WhereChildNode): T_1;
|
|
21
|
+
cloneWithJoin<T_2 extends FilterableQueryNode>(node: T_2, join: JoinNode): T_2;
|
|
22
|
+
cloneWithReturning<T_3 extends MutatingQueryNode>(node: T_3, selections: ReadonlyArray<SelectionNode>): T_3;
|
|
22
23
|
}>;
|
|
@@ -28,11 +28,19 @@ exports.QueryNode = (0, object_utils_js_1.freeze)({
|
|
|
28
28
|
delete_query_node_js_1.DeleteQueryNode.is(node) ||
|
|
29
29
|
update_query_node_js_1.UpdateQueryNode.is(node));
|
|
30
30
|
},
|
|
31
|
-
cloneWithWhere(node,
|
|
31
|
+
cloneWithWhere(node, filter) {
|
|
32
32
|
return (0, object_utils_js_1.freeze)({
|
|
33
33
|
...node,
|
|
34
34
|
where: node.where
|
|
35
|
-
? where_node_js_1.WhereNode.cloneWithFilter(node.where,
|
|
35
|
+
? where_node_js_1.WhereNode.cloneWithFilter(node.where, 'And', filter)
|
|
36
|
+
: where_node_js_1.WhereNode.create(filter),
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
cloneWithOrWhere(node, filter) {
|
|
40
|
+
return (0, object_utils_js_1.freeze)({
|
|
41
|
+
...node,
|
|
42
|
+
where: node.where
|
|
43
|
+
? where_node_js_1.WhereNode.cloneWithFilter(node.where, 'Or', filter)
|
|
36
44
|
: where_node_js_1.WhereNode.create(filter),
|
|
37
45
|
});
|
|
38
46
|
},
|
|
@@ -42,6 +42,7 @@ export declare const SelectQueryNode: Readonly<{
|
|
|
42
42
|
cloneWithGroupByItems(selectNode: SelectQueryNode, items: ReadonlyArray<GroupByItemNode>): SelectQueryNode;
|
|
43
43
|
cloneWithLimit(selectNode: SelectQueryNode, limit: LimitNode): SelectQueryNode;
|
|
44
44
|
cloneWithOffset(selectNode: SelectQueryNode, offset: OffsetNode): SelectQueryNode;
|
|
45
|
-
cloneWithHaving(selectNode: SelectQueryNode,
|
|
45
|
+
cloneWithHaving(selectNode: SelectQueryNode, filter: HavingNodeChild): SelectQueryNode;
|
|
46
|
+
cloneWithOrHaving(selectNode: SelectQueryNode, filter: HavingNodeChild): SelectQueryNode;
|
|
46
47
|
cloneWithDistinct(selectNode: SelectQueryNode): SelectQueryNode;
|
|
47
48
|
}>;
|
|
@@ -72,11 +72,19 @@ exports.SelectQueryNode = (0, object_utils_js_1.freeze)({
|
|
|
72
72
|
offset,
|
|
73
73
|
});
|
|
74
74
|
},
|
|
75
|
-
cloneWithHaving(selectNode,
|
|
75
|
+
cloneWithHaving(selectNode, filter) {
|
|
76
76
|
return (0, object_utils_js_1.freeze)({
|
|
77
77
|
...selectNode,
|
|
78
78
|
having: selectNode.having
|
|
79
|
-
? having_node_js_1.HavingNode.cloneWithFilter(selectNode.having,
|
|
79
|
+
? having_node_js_1.HavingNode.cloneWithFilter(selectNode.having, 'And', filter)
|
|
80
|
+
: having_node_js_1.HavingNode.create(filter),
|
|
81
|
+
});
|
|
82
|
+
},
|
|
83
|
+
cloneWithOrHaving(selectNode, filter) {
|
|
84
|
+
return (0, object_utils_js_1.freeze)({
|
|
85
|
+
...selectNode,
|
|
86
|
+
having: selectNode.having
|
|
87
|
+
? having_node_js_1.HavingNode.cloneWithFilter(selectNode.having, 'Or', filter)
|
|
80
88
|
: having_node_js_1.HavingNode.create(filter),
|
|
81
89
|
});
|
|
82
90
|
},
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { GroupByItemNode } from '../operation-node/group-by-item-node.js';
|
|
2
|
+
import { ParseContext } from './parse-context.js';
|
|
3
|
+
import { ReferenceExpressionOrList } from './reference-parser.js';
|
|
4
|
+
export declare function parseGroupBy(ctx: ParseContext, orderBy: ReferenceExpressionOrList<any, any>): GroupByItemNode[];
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseGroupBy = void 0;
|
|
4
|
+
const group_by_item_node_js_1 = require("../operation-node/group-by-item-node.js");
|
|
5
|
+
const reference_parser_js_1 = require("./reference-parser.js");
|
|
6
|
+
function parseGroupBy(ctx, orderBy) {
|
|
7
|
+
return (0, reference_parser_js_1.parseReferenceExpressionOrList)(ctx, orderBy).map(group_by_item_node_js_1.GroupByItemNode.create);
|
|
8
|
+
}
|
|
9
|
+
exports.parseGroupBy = parseGroupBy;
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { RawNode } from '../operation-node/raw-node.js';
|
|
1
|
+
import { OrderByItemNode } from '../operation-node/order-by-item-node.js';
|
|
3
2
|
import { AnyRawBuilder } from '../util/type-utils.js';
|
|
4
3
|
import { ParseContext } from './parse-context.js';
|
|
5
4
|
import { ReferenceExpression } from './reference-parser.js';
|
|
6
5
|
export declare type OrderByDirection = 'asc' | 'desc';
|
|
7
6
|
export declare type OrderByExpression<DB, TB extends keyof DB, O> = ReferenceExpression<DB, TB> | keyof O;
|
|
8
7
|
export declare type OrderByDirectionExpression = OrderByDirection | AnyRawBuilder;
|
|
9
|
-
export declare function
|
|
10
|
-
export declare function parseOrderByDirectionExpression(expr?: OrderByDirectionExpression): RawNode | undefined;
|
|
8
|
+
export declare function parseOrderBy(ctx: ParseContext, orderBy: OrderByExpression<any, any, any>, direction?: OrderByDirectionExpression): OrderByItemNode;
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.parseOrderBy = void 0;
|
|
4
|
+
const order_by_item_node_js_1 = require("../operation-node/order-by-item-node.js");
|
|
4
5
|
const raw_node_js_1 = require("../operation-node/raw-node.js");
|
|
5
6
|
const reference_parser_js_1 = require("./reference-parser.js");
|
|
7
|
+
function parseOrderBy(ctx, orderBy, direction) {
|
|
8
|
+
return order_by_item_node_js_1.OrderByItemNode.create(parseOrderByExpression(ctx, orderBy), parseOrderByDirectionExpression(direction));
|
|
9
|
+
}
|
|
10
|
+
exports.parseOrderBy = parseOrderBy;
|
|
6
11
|
function parseOrderByExpression(ctx, expr) {
|
|
7
12
|
return (0, reference_parser_js_1.parseReferenceExpression)(ctx, expr);
|
|
8
13
|
}
|
|
9
|
-
exports.parseOrderByExpression = parseOrderByExpression;
|
|
10
14
|
function parseOrderByDirectionExpression(expr) {
|
|
11
15
|
if (!expr) {
|
|
12
16
|
return undefined;
|
|
@@ -18,4 +22,3 @@ function parseOrderByDirectionExpression(expr) {
|
|
|
18
22
|
return expr.toOperationNode();
|
|
19
23
|
}
|
|
20
24
|
}
|
|
21
|
-
exports.parseOrderByDirectionExpression = parseOrderByDirectionExpression;
|
|
@@ -9,7 +9,7 @@ import { RawBuilder } from '../raw-builder/raw-builder.js';
|
|
|
9
9
|
import { QueryBuilder } from '../query-builder/query-builder.js';
|
|
10
10
|
import { ParseContext } from './parse-context.js';
|
|
11
11
|
export declare type ReferenceExpression<DB, TB extends keyof DB> = StringReference<DB, TB> | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB> | DynamicReferenceBuilder<any>;
|
|
12
|
-
export declare type ReferenceExpressionOrList<DB, TB extends keyof DB> = ReferenceExpression<DB, TB> | ReferenceExpression<DB, TB
|
|
12
|
+
export declare type ReferenceExpressionOrList<DB, TB extends keyof DB> = ReferenceExpression<DB, TB> | ReadonlyArray<ReferenceExpression<DB, TB>>;
|
|
13
13
|
export declare type StringReference<DB, TB extends keyof DB> = AnyColumn<DB, TB> | AnyColumnWithTable<DB, TB>;
|
|
14
14
|
export declare type ExtractTypeFromReferenceExpression<DB, TB extends keyof DB, RE> = RE extends string ? ExtractTypeFromStringReference<DB, TB, RE> : RE extends RawBuilder<infer O> ? O : RE extends (qb: any) => RawBuilder<infer O> ? O : RE extends QueryBuilder<any, any, infer O> ? ValueType<O> : RE extends (qb: any) => QueryBuilder<any, any, infer O> ? ValueType<O> : PrimitiveValue;
|
|
15
15
|
declare type ExtractTypeFromStringReference<DB, TB extends keyof DB, S extends string, R = RowType<DB, TB>> = S extends `${infer SC}.${infer T}.${infer C}` ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : S extends `${infer T}.${infer C}` ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : S extends keyof R ? R[S] : PrimitiveValue;
|
|
@@ -9,7 +9,7 @@ const table_node_js_1 = require("../operation-node/table-node.js");
|
|
|
9
9
|
const object_utils_js_1 = require("../util/object-utils.js");
|
|
10
10
|
const query_node_js_1 = require("../operation-node/query-node.js");
|
|
11
11
|
function parseReferenceExpressionOrList(ctx, arg) {
|
|
12
|
-
if (
|
|
12
|
+
if ((0, object_utils_js_1.isReadonlyArray)(arg)) {
|
|
13
13
|
return arg.map((it) => parseReferenceExpression(ctx, it));
|
|
14
14
|
}
|
|
15
15
|
else {
|
|
@@ -13,13 +13,13 @@ class JoinBuilder {
|
|
|
13
13
|
on(...args) {
|
|
14
14
|
return new JoinBuilder({
|
|
15
15
|
...this.#props,
|
|
16
|
-
joinNode: join_node_js_1.JoinNode.cloneWithOn(this.#props.joinNode,
|
|
16
|
+
joinNode: join_node_js_1.JoinNode.cloneWithOn(this.#props.joinNode, (0, filter_parser_js_1.parseOnFilter)(this.#props.parseContext, args)),
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
19
|
orOn(...args) {
|
|
20
20
|
return new JoinBuilder({
|
|
21
21
|
...this.#props,
|
|
22
|
-
joinNode: join_node_js_1.JoinNode.
|
|
22
|
+
joinNode: join_node_js_1.JoinNode.cloneWithOrOn(this.#props.joinNode, (0, filter_parser_js_1.parseOnFilter)(this.#props.parseContext, args)),
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
@@ -31,7 +31,7 @@ class JoinBuilder {
|
|
|
31
31
|
onRef(lhs, op, rhs) {
|
|
32
32
|
return new JoinBuilder({
|
|
33
33
|
...this.#props,
|
|
34
|
-
joinNode: join_node_js_1.JoinNode.cloneWithOn(this.#props.joinNode,
|
|
34
|
+
joinNode: join_node_js_1.JoinNode.cloneWithOn(this.#props.joinNode, (0, filter_parser_js_1.parseReferenceFilter)(this.#props.parseContext, lhs, op, rhs)),
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
@@ -43,7 +43,7 @@ class JoinBuilder {
|
|
|
43
43
|
orOnRef(lhs, op, rhs) {
|
|
44
44
|
return new JoinBuilder({
|
|
45
45
|
...this.#props,
|
|
46
|
-
joinNode: join_node_js_1.JoinNode.
|
|
46
|
+
joinNode: join_node_js_1.JoinNode.cloneWithOrOn(this.#props.joinNode, (0, filter_parser_js_1.parseReferenceFilter)(this.#props.parseContext, lhs, op, rhs)),
|
|
47
47
|
});
|
|
48
48
|
}
|
|
49
49
|
/**
|
|
@@ -55,7 +55,7 @@ class JoinBuilder {
|
|
|
55
55
|
onExists(arg) {
|
|
56
56
|
return new JoinBuilder({
|
|
57
57
|
...this.#props,
|
|
58
|
-
joinNode: join_node_js_1.JoinNode.cloneWithOn(this.#props.joinNode,
|
|
58
|
+
joinNode: join_node_js_1.JoinNode.cloneWithOn(this.#props.joinNode, (0, filter_parser_js_1.parseExistFilter)(this.#props.parseContext, arg)),
|
|
59
59
|
});
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
@@ -67,7 +67,7 @@ class JoinBuilder {
|
|
|
67
67
|
onNotExists(arg) {
|
|
68
68
|
return new JoinBuilder({
|
|
69
69
|
...this.#props,
|
|
70
|
-
joinNode: join_node_js_1.JoinNode.cloneWithOn(this.#props.joinNode,
|
|
70
|
+
joinNode: join_node_js_1.JoinNode.cloneWithOn(this.#props.joinNode, (0, filter_parser_js_1.parseNotExistFilter)(this.#props.parseContext, arg)),
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
73
|
/**
|
|
@@ -79,7 +79,7 @@ class JoinBuilder {
|
|
|
79
79
|
orOnExists(arg) {
|
|
80
80
|
return new JoinBuilder({
|
|
81
81
|
...this.#props,
|
|
82
|
-
joinNode: join_node_js_1.JoinNode.
|
|
82
|
+
joinNode: join_node_js_1.JoinNode.cloneWithOrOn(this.#props.joinNode, (0, filter_parser_js_1.parseExistFilter)(this.#props.parseContext, arg)),
|
|
83
83
|
});
|
|
84
84
|
}
|
|
85
85
|
/**
|
|
@@ -91,7 +91,7 @@ class JoinBuilder {
|
|
|
91
91
|
orOnNotExists(arg) {
|
|
92
92
|
return new JoinBuilder({
|
|
93
93
|
...this.#props,
|
|
94
|
-
joinNode: join_node_js_1.JoinNode.
|
|
94
|
+
joinNode: join_node_js_1.JoinNode.cloneWithOrOn(this.#props.joinNode, (0, filter_parser_js_1.parseNotExistFilter)(this.#props.parseContext, arg)),
|
|
95
95
|
});
|
|
96
96
|
}
|
|
97
97
|
toOperationNode() {
|
|
@@ -6,13 +6,10 @@ const join_parser_js_1 = require("../parser/join-parser.js");
|
|
|
6
6
|
const select_parser_js_1 = require("../parser/select-parser.js");
|
|
7
7
|
const filter_parser_js_1 = require("../parser/filter-parser.js");
|
|
8
8
|
const insert_values_parser_js_1 = require("../parser/insert-values-parser.js");
|
|
9
|
-
const reference_parser_js_1 = require("../parser/reference-parser.js");
|
|
10
|
-
const order_by_item_node_js_1 = require("../operation-node/order-by-item-node.js");
|
|
11
9
|
const select_query_node_js_1 = require("../operation-node/select-query-node.js");
|
|
12
10
|
const insert_query_node_js_1 = require("../operation-node/insert-query-node.js");
|
|
13
11
|
const query_node_js_1 = require("../operation-node/query-node.js");
|
|
14
12
|
const order_by_parser_js_1 = require("../parser/order-by-parser.js");
|
|
15
|
-
const group_by_item_node_js_1 = require("../operation-node/group-by-item-node.js");
|
|
16
13
|
const update_query_node_js_1 = require("../operation-node/update-query-node.js");
|
|
17
14
|
const update_set_parser_js_1 = require("../parser/update-set-parser.js");
|
|
18
15
|
const prevent_await_js_1 = require("../util/prevent-await.js");
|
|
@@ -22,6 +19,7 @@ const on_conflict_parser_js_1 = require("../parser/on-conflict-parser.js");
|
|
|
22
19
|
const object_utils_js_1 = require("../util/object-utils.js");
|
|
23
20
|
const delete_query_node_js_1 = require("../operation-node/delete-query-node.js");
|
|
24
21
|
const on_duplicate_key_node_js_1 = require("../operation-node/on-duplicate-key-node.js");
|
|
22
|
+
const group_by_parser_js_1 = require("../parser/group-by-parser.js");
|
|
25
23
|
/**
|
|
26
24
|
* The main query builder class.
|
|
27
25
|
*
|
|
@@ -46,7 +44,7 @@ class QueryBuilder {
|
|
|
46
44
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
47
45
|
return new QueryBuilder({
|
|
48
46
|
...this.#props,
|
|
49
|
-
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode,
|
|
47
|
+
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseWhereFilter)(this.#props.parseContext, args)),
|
|
50
48
|
});
|
|
51
49
|
}
|
|
52
50
|
/**
|
|
@@ -104,14 +102,14 @@ class QueryBuilder {
|
|
|
104
102
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
105
103
|
return new QueryBuilder({
|
|
106
104
|
...this.#props,
|
|
107
|
-
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode,
|
|
105
|
+
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(this.#props.parseContext, lhs, op, rhs)),
|
|
108
106
|
});
|
|
109
107
|
}
|
|
110
108
|
orWhere(...args) {
|
|
111
109
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
112
110
|
return new QueryBuilder({
|
|
113
111
|
...this.#props,
|
|
114
|
-
queryNode: query_node_js_1.QueryNode.
|
|
112
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseWhereFilter)(this.#props.parseContext, args)),
|
|
115
113
|
});
|
|
116
114
|
}
|
|
117
115
|
/**
|
|
@@ -124,7 +122,7 @@ class QueryBuilder {
|
|
|
124
122
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
125
123
|
return new QueryBuilder({
|
|
126
124
|
...this.#props,
|
|
127
|
-
queryNode: query_node_js_1.QueryNode.
|
|
125
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(this.#props.parseContext, lhs, op, rhs)),
|
|
128
126
|
});
|
|
129
127
|
}
|
|
130
128
|
/**
|
|
@@ -190,7 +188,7 @@ class QueryBuilder {
|
|
|
190
188
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
191
189
|
return new QueryBuilder({
|
|
192
190
|
...this.#props,
|
|
193
|
-
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode,
|
|
191
|
+
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(this.#props.parseContext, arg)),
|
|
194
192
|
});
|
|
195
193
|
}
|
|
196
194
|
/**
|
|
@@ -200,7 +198,7 @@ class QueryBuilder {
|
|
|
200
198
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
201
199
|
return new QueryBuilder({
|
|
202
200
|
...this.#props,
|
|
203
|
-
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode,
|
|
201
|
+
queryNode: query_node_js_1.QueryNode.cloneWithWhere(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(this.#props.parseContext, arg)),
|
|
204
202
|
});
|
|
205
203
|
}
|
|
206
204
|
/**
|
|
@@ -210,7 +208,7 @@ class QueryBuilder {
|
|
|
210
208
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
211
209
|
return new QueryBuilder({
|
|
212
210
|
...this.#props,
|
|
213
|
-
queryNode: query_node_js_1.QueryNode.
|
|
211
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(this.#props.parseContext, arg)),
|
|
214
212
|
});
|
|
215
213
|
}
|
|
216
214
|
/**
|
|
@@ -220,14 +218,14 @@ class QueryBuilder {
|
|
|
220
218
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
221
219
|
return new QueryBuilder({
|
|
222
220
|
...this.#props,
|
|
223
|
-
queryNode: query_node_js_1.QueryNode.
|
|
221
|
+
queryNode: query_node_js_1.QueryNode.cloneWithOrWhere(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(this.#props.parseContext, arg)),
|
|
224
222
|
});
|
|
225
223
|
}
|
|
226
224
|
having(...args) {
|
|
227
225
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
228
226
|
return new QueryBuilder({
|
|
229
227
|
...this.#props,
|
|
230
|
-
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithHaving(this.#props.queryNode,
|
|
228
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithHaving(this.#props.queryNode, (0, filter_parser_js_1.parseHavingFilter)(this.#props.parseContext, args)),
|
|
231
229
|
});
|
|
232
230
|
}
|
|
233
231
|
/**
|
|
@@ -238,14 +236,14 @@ class QueryBuilder {
|
|
|
238
236
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
239
237
|
return new QueryBuilder({
|
|
240
238
|
...this.#props,
|
|
241
|
-
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithHaving(this.#props.queryNode,
|
|
239
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithHaving(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(this.#props.parseContext, lhs, op, rhs)),
|
|
242
240
|
});
|
|
243
241
|
}
|
|
244
242
|
orHaving(...args) {
|
|
245
243
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
246
244
|
return new QueryBuilder({
|
|
247
245
|
...this.#props,
|
|
248
|
-
queryNode: select_query_node_js_1.SelectQueryNode.
|
|
246
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, (0, filter_parser_js_1.parseHavingFilter)(this.#props.parseContext, args)),
|
|
249
247
|
});
|
|
250
248
|
}
|
|
251
249
|
/**
|
|
@@ -256,7 +254,7 @@ class QueryBuilder {
|
|
|
256
254
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
257
255
|
return new QueryBuilder({
|
|
258
256
|
...this.#props,
|
|
259
|
-
queryNode: select_query_node_js_1.SelectQueryNode.
|
|
257
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, (0, filter_parser_js_1.parseReferenceFilter)(this.#props.parseContext, lhs, op, rhs)),
|
|
260
258
|
});
|
|
261
259
|
}
|
|
262
260
|
/**
|
|
@@ -267,7 +265,7 @@ class QueryBuilder {
|
|
|
267
265
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
268
266
|
return new QueryBuilder({
|
|
269
267
|
...this.#props,
|
|
270
|
-
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithHaving(this.#props.queryNode,
|
|
268
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithHaving(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(this.#props.parseContext, arg)),
|
|
271
269
|
});
|
|
272
270
|
}
|
|
273
271
|
/**
|
|
@@ -278,7 +276,7 @@ class QueryBuilder {
|
|
|
278
276
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
279
277
|
return new QueryBuilder({
|
|
280
278
|
...this.#props,
|
|
281
|
-
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithHaving(this.#props.queryNode,
|
|
279
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithHaving(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(this.#props.parseContext, arg)),
|
|
282
280
|
});
|
|
283
281
|
}
|
|
284
282
|
/**
|
|
@@ -289,7 +287,7 @@ class QueryBuilder {
|
|
|
289
287
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
290
288
|
return new QueryBuilder({
|
|
291
289
|
...this.#props,
|
|
292
|
-
queryNode: select_query_node_js_1.SelectQueryNode.
|
|
290
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, (0, filter_parser_js_1.parseExistFilter)(this.#props.parseContext, arg)),
|
|
293
291
|
});
|
|
294
292
|
}
|
|
295
293
|
/**
|
|
@@ -300,7 +298,7 @@ class QueryBuilder {
|
|
|
300
298
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
301
299
|
return new QueryBuilder({
|
|
302
300
|
...this.#props,
|
|
303
|
-
queryNode: select_query_node_js_1.SelectQueryNode.
|
|
301
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, (0, filter_parser_js_1.parseNotExistFilter)(this.#props.parseContext, arg)),
|
|
304
302
|
});
|
|
305
303
|
}
|
|
306
304
|
select(selection) {
|
|
@@ -717,14 +715,14 @@ class QueryBuilder {
|
|
|
717
715
|
assertCanHaveOrderByClause(this.#props.queryNode);
|
|
718
716
|
return new QueryBuilder({
|
|
719
717
|
...this.#props,
|
|
720
|
-
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithOrderByItem(this.#props.queryNode,
|
|
718
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithOrderByItem(this.#props.queryNode, (0, order_by_parser_js_1.parseOrderBy)(this.#props.parseContext, orderBy, direction)),
|
|
721
719
|
});
|
|
722
720
|
}
|
|
723
721
|
groupBy(orderBy) {
|
|
724
722
|
assertCanHaveGroupByClause(this.#props.queryNode);
|
|
725
723
|
return new QueryBuilder({
|
|
726
724
|
...this.#props,
|
|
727
|
-
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithGroupByItems(this.#props.queryNode, (0,
|
|
725
|
+
queryNode: select_query_node_js_1.SelectQueryNode.cloneWithGroupByItems(this.#props.queryNode, (0, group_by_parser_js_1.parseGroupBy)(this.#props.parseContext, orderBy)),
|
|
728
726
|
});
|
|
729
727
|
}
|
|
730
728
|
/**
|
|
@@ -964,7 +962,7 @@ function assertCanHaveUpdates(node) {
|
|
|
964
962
|
}
|
|
965
963
|
function assertCanHaveReturningClause(node) {
|
|
966
964
|
if (!query_node_js_1.QueryNode.isMutating(node)) {
|
|
967
|
-
throw new Error('only
|
|
965
|
+
throw new Error('only insert, delete and update queries can have a returning clause');
|
|
968
966
|
}
|
|
969
967
|
}
|
|
970
968
|
function assertCanHaveOrderByClause(node) {
|
|
@@ -126,10 +126,10 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
126
126
|
protected visitAddConstraint(node: AddConstraintNode): void;
|
|
127
127
|
protected visitDropConstraint(node: DropConstraintNode): void;
|
|
128
128
|
protected append(str: string): void;
|
|
129
|
-
protected appendValue(
|
|
129
|
+
protected appendValue(parameter: unknown): void;
|
|
130
130
|
protected getLeftIdentifierWrapper(): string;
|
|
131
131
|
protected getRightIdentifierWrapper(): string;
|
|
132
132
|
protected getCurrentParameterPlaceholder(): string;
|
|
133
|
-
protected addParameter(parameter:
|
|
133
|
+
protected addParameter(parameter: unknown): void;
|
|
134
134
|
protected appendImmediateValue(value: PrimitiveValue): void;
|
|
135
135
|
}
|
|
@@ -633,8 +633,8 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
633
633
|
append(str) {
|
|
634
634
|
this.#sql += str;
|
|
635
635
|
}
|
|
636
|
-
appendValue(
|
|
637
|
-
this.addParameter(
|
|
636
|
+
appendValue(parameter) {
|
|
637
|
+
this.addParameter(parameter);
|
|
638
638
|
this.append(this.getCurrentParameterPlaceholder());
|
|
639
639
|
}
|
|
640
640
|
getLeftIdentifierWrapper() {
|
|
@@ -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[];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isFunction, isObject } from '../../util/object-utils.js';
|
|
1
|
+
import { isFunction, isNumber, isObject, } from '../../util/object-utils.js';
|
|
2
2
|
const PRIVATE_RELEASE_METHOD = Symbol();
|
|
3
3
|
export class MysqlDriver {
|
|
4
4
|
#config;
|
|
@@ -103,13 +103,13 @@ class MysqlConnection {
|
|
|
103
103
|
async executeQuery(compiledQuery) {
|
|
104
104
|
const result = await this.#executeQuery(compiledQuery);
|
|
105
105
|
if (isObject(result) && 'insertId' in result && 'affectedRows' in result) {
|
|
106
|
-
if (result.insertId) {
|
|
106
|
+
if (isNumber(result.insertId) && result.insertId > 0) {
|
|
107
107
|
return {
|
|
108
108
|
insertedPrimaryKey: result.insertId,
|
|
109
109
|
rows: [],
|
|
110
110
|
};
|
|
111
111
|
}
|
|
112
|
-
else {
|
|
112
|
+
else if (isNumber(result.affectedRows)) {
|
|
113
113
|
return {
|
|
114
114
|
numUpdatedOrDeletedRows: result.affectedRows,
|
|
115
115
|
rows: [],
|
|
@@ -21,5 +21,6 @@ export declare const JoinNode: Readonly<{
|
|
|
21
21
|
is(node: OperationNode): node is JoinNode;
|
|
22
22
|
create(joinType: JoinType, table: JoinTableNode): JoinNode;
|
|
23
23
|
createWithOn(joinType: JoinType, table: JoinTableNode, on: JoinNodeOnNode): JoinNode;
|
|
24
|
-
cloneWithOn(joinNode: JoinNode,
|
|
24
|
+
cloneWithOn(joinNode: JoinNode, on: JoinNodeOnNode): JoinNode;
|
|
25
|
+
cloneWithOrOn(joinNode: JoinNode, on: JoinNodeOnNode): JoinNode;
|
|
25
26
|
}>;
|
|
@@ -24,14 +24,16 @@ export const JoinNode = freeze({
|
|
|
24
24
|
on,
|
|
25
25
|
});
|
|
26
26
|
},
|
|
27
|
-
cloneWithOn(joinNode,
|
|
27
|
+
cloneWithOn(joinNode, on) {
|
|
28
28
|
return freeze({
|
|
29
29
|
...joinNode,
|
|
30
|
-
on: joinNode.on
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
on: joinNode.on ? AndNode.create(joinNode.on, on) : on,
|
|
31
|
+
});
|
|
32
|
+
},
|
|
33
|
+
cloneWithOrOn(joinNode, on) {
|
|
34
|
+
return freeze({
|
|
35
|
+
...joinNode,
|
|
36
|
+
on: joinNode.on ? OrNode.create(joinNode.on, on) : on,
|
|
35
37
|
});
|
|
36
38
|
},
|
|
37
39
|
});
|
|
@@ -16,7 +16,8 @@ export declare const QueryNode: Readonly<{
|
|
|
16
16
|
is(node: OperationNode): node is QueryNode;
|
|
17
17
|
isMutating(node: OperationNode): node is MutatingQueryNode;
|
|
18
18
|
isFilterable(node: OperationNode): node is FilterableQueryNode;
|
|
19
|
-
cloneWithWhere<T extends FilterableQueryNode>(node: T,
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
cloneWithWhere<T extends FilterableQueryNode>(node: T, filter: WhereChildNode): T;
|
|
20
|
+
cloneWithOrWhere<T_1 extends FilterableQueryNode>(node: T_1, filter: WhereChildNode): T_1;
|
|
21
|
+
cloneWithJoin<T_2 extends FilterableQueryNode>(node: T_2, join: JoinNode): T_2;
|
|
22
|
+
cloneWithReturning<T_3 extends MutatingQueryNode>(node: T_3, selections: ReadonlyArray<SelectionNode>): T_3;
|
|
22
23
|
}>;
|
|
@@ -25,11 +25,19 @@ export const QueryNode = freeze({
|
|
|
25
25
|
DeleteQueryNode.is(node) ||
|
|
26
26
|
UpdateQueryNode.is(node));
|
|
27
27
|
},
|
|
28
|
-
cloneWithWhere(node,
|
|
28
|
+
cloneWithWhere(node, filter) {
|
|
29
29
|
return freeze({
|
|
30
30
|
...node,
|
|
31
31
|
where: node.where
|
|
32
|
-
? WhereNode.cloneWithFilter(node.where,
|
|
32
|
+
? WhereNode.cloneWithFilter(node.where, 'And', filter)
|
|
33
|
+
: WhereNode.create(filter),
|
|
34
|
+
});
|
|
35
|
+
},
|
|
36
|
+
cloneWithOrWhere(node, filter) {
|
|
37
|
+
return freeze({
|
|
38
|
+
...node,
|
|
39
|
+
where: node.where
|
|
40
|
+
? WhereNode.cloneWithFilter(node.where, 'Or', filter)
|
|
33
41
|
: WhereNode.create(filter),
|
|
34
42
|
});
|
|
35
43
|
},
|
|
@@ -42,6 +42,7 @@ export declare const SelectQueryNode: Readonly<{
|
|
|
42
42
|
cloneWithGroupByItems(selectNode: SelectQueryNode, items: ReadonlyArray<GroupByItemNode>): SelectQueryNode;
|
|
43
43
|
cloneWithLimit(selectNode: SelectQueryNode, limit: LimitNode): SelectQueryNode;
|
|
44
44
|
cloneWithOffset(selectNode: SelectQueryNode, offset: OffsetNode): SelectQueryNode;
|
|
45
|
-
cloneWithHaving(selectNode: SelectQueryNode,
|
|
45
|
+
cloneWithHaving(selectNode: SelectQueryNode, filter: HavingNodeChild): SelectQueryNode;
|
|
46
|
+
cloneWithOrHaving(selectNode: SelectQueryNode, filter: HavingNodeChild): SelectQueryNode;
|
|
46
47
|
cloneWithDistinct(selectNode: SelectQueryNode): SelectQueryNode;
|
|
47
48
|
}>;
|
|
@@ -69,11 +69,19 @@ export const SelectQueryNode = freeze({
|
|
|
69
69
|
offset,
|
|
70
70
|
});
|
|
71
71
|
},
|
|
72
|
-
cloneWithHaving(selectNode,
|
|
72
|
+
cloneWithHaving(selectNode, filter) {
|
|
73
73
|
return freeze({
|
|
74
74
|
...selectNode,
|
|
75
75
|
having: selectNode.having
|
|
76
|
-
? HavingNode.cloneWithFilter(selectNode.having,
|
|
76
|
+
? HavingNode.cloneWithFilter(selectNode.having, 'And', filter)
|
|
77
|
+
: HavingNode.create(filter),
|
|
78
|
+
});
|
|
79
|
+
},
|
|
80
|
+
cloneWithOrHaving(selectNode, filter) {
|
|
81
|
+
return freeze({
|
|
82
|
+
...selectNode,
|
|
83
|
+
having: selectNode.having
|
|
84
|
+
? HavingNode.cloneWithFilter(selectNode.having, 'Or', filter)
|
|
77
85
|
: HavingNode.create(filter),
|
|
78
86
|
});
|
|
79
87
|
},
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { GroupByItemNode } from '../operation-node/group-by-item-node.js';
|
|
2
|
+
import { ParseContext } from './parse-context.js';
|
|
3
|
+
import { ReferenceExpressionOrList } from './reference-parser.js';
|
|
4
|
+
export declare function parseGroupBy(ctx: ParseContext, orderBy: ReferenceExpressionOrList<any, any>): GroupByItemNode[];
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { GroupByItemNode } from '../operation-node/group-by-item-node.js';
|
|
2
|
+
import { parseReferenceExpressionOrList, } from './reference-parser.js';
|
|
3
|
+
export function parseGroupBy(ctx, orderBy) {
|
|
4
|
+
return parseReferenceExpressionOrList(ctx, orderBy).map(GroupByItemNode.create);
|
|
5
|
+
}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { RawNode } from '../operation-node/raw-node.js';
|
|
1
|
+
import { OrderByItemNode } from '../operation-node/order-by-item-node.js';
|
|
3
2
|
import { AnyRawBuilder } from '../util/type-utils.js';
|
|
4
3
|
import { ParseContext } from './parse-context.js';
|
|
5
4
|
import { ReferenceExpression } from './reference-parser.js';
|
|
6
5
|
export declare type OrderByDirection = 'asc' | 'desc';
|
|
7
6
|
export declare type OrderByExpression<DB, TB extends keyof DB, O> = ReferenceExpression<DB, TB> | keyof O;
|
|
8
7
|
export declare type OrderByDirectionExpression = OrderByDirection | AnyRawBuilder;
|
|
9
|
-
export declare function
|
|
10
|
-
export declare function parseOrderByDirectionExpression(expr?: OrderByDirectionExpression): RawNode | undefined;
|
|
8
|
+
export declare function parseOrderBy(ctx: ParseContext, orderBy: OrderByExpression<any, any, any>, direction?: OrderByDirectionExpression): OrderByItemNode;
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
import { OrderByItemNode } from '../operation-node/order-by-item-node.js';
|
|
1
2
|
import { RawNode } from '../operation-node/raw-node.js';
|
|
2
3
|
import { parseReferenceExpression, } from './reference-parser.js';
|
|
3
|
-
export function
|
|
4
|
+
export function parseOrderBy(ctx, orderBy, direction) {
|
|
5
|
+
return OrderByItemNode.create(parseOrderByExpression(ctx, orderBy), parseOrderByDirectionExpression(direction));
|
|
6
|
+
}
|
|
7
|
+
function parseOrderByExpression(ctx, expr) {
|
|
4
8
|
return parseReferenceExpression(ctx, expr);
|
|
5
9
|
}
|
|
6
|
-
|
|
10
|
+
function parseOrderByDirectionExpression(expr) {
|
|
7
11
|
if (!expr) {
|
|
8
12
|
return undefined;
|
|
9
13
|
}
|
|
@@ -9,7 +9,7 @@ import { RawBuilder } from '../raw-builder/raw-builder.js';
|
|
|
9
9
|
import { QueryBuilder } from '../query-builder/query-builder.js';
|
|
10
10
|
import { ParseContext } from './parse-context.js';
|
|
11
11
|
export declare type ReferenceExpression<DB, TB extends keyof DB> = StringReference<DB, TB> | AnyQueryBuilder | QueryBuilderFactory<DB, TB> | AnyRawBuilder | RawBuilderFactory<DB, TB> | DynamicReferenceBuilder<any>;
|
|
12
|
-
export declare type ReferenceExpressionOrList<DB, TB extends keyof DB> = ReferenceExpression<DB, TB> | ReferenceExpression<DB, TB
|
|
12
|
+
export declare type ReferenceExpressionOrList<DB, TB extends keyof DB> = ReferenceExpression<DB, TB> | ReadonlyArray<ReferenceExpression<DB, TB>>;
|
|
13
13
|
export declare type StringReference<DB, TB extends keyof DB> = AnyColumn<DB, TB> | AnyColumnWithTable<DB, TB>;
|
|
14
14
|
export declare type ExtractTypeFromReferenceExpression<DB, TB extends keyof DB, RE> = RE extends string ? ExtractTypeFromStringReference<DB, TB, RE> : RE extends RawBuilder<infer O> ? O : RE extends (qb: any) => RawBuilder<infer O> ? O : RE extends QueryBuilder<any, any, infer O> ? ValueType<O> : RE extends (qb: any) => QueryBuilder<any, any, infer O> ? ValueType<O> : PrimitiveValue;
|
|
15
15
|
declare type ExtractTypeFromStringReference<DB, TB extends keyof DB, S extends string, R = RowType<DB, TB>> = S extends `${infer SC}.${infer T}.${infer C}` ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : S extends `${infer T}.${infer C}` ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : S extends keyof R ? R[S] : PrimitiveValue;
|
|
@@ -3,10 +3,10 @@ import { ColumnNode } from '../operation-node/column-node.js';
|
|
|
3
3
|
import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
4
4
|
import { ReferenceNode } from '../operation-node/reference-node.js';
|
|
5
5
|
import { TableNode } from '../operation-node/table-node.js';
|
|
6
|
-
import { isFunction, isString } from '../util/object-utils.js';
|
|
6
|
+
import { isFunction, isReadonlyArray, isString, } from '../util/object-utils.js';
|
|
7
7
|
import { QueryNode } from '../operation-node/query-node.js';
|
|
8
8
|
export function parseReferenceExpressionOrList(ctx, arg) {
|
|
9
|
-
if (
|
|
9
|
+
if (isReadonlyArray(arg)) {
|
|
10
10
|
return arg.map((it) => parseReferenceExpression(ctx, it));
|
|
11
11
|
}
|
|
12
12
|
else {
|
|
@@ -10,13 +10,13 @@ export class JoinBuilder {
|
|
|
10
10
|
on(...args) {
|
|
11
11
|
return new JoinBuilder({
|
|
12
12
|
...this.#props,
|
|
13
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode,
|
|
13
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, parseOnFilter(this.#props.parseContext, args)),
|
|
14
14
|
});
|
|
15
15
|
}
|
|
16
16
|
orOn(...args) {
|
|
17
17
|
return new JoinBuilder({
|
|
18
18
|
...this.#props,
|
|
19
|
-
joinNode: JoinNode.
|
|
19
|
+
joinNode: JoinNode.cloneWithOrOn(this.#props.joinNode, parseOnFilter(this.#props.parseContext, args)),
|
|
20
20
|
});
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
@@ -28,7 +28,7 @@ export class JoinBuilder {
|
|
|
28
28
|
onRef(lhs, op, rhs) {
|
|
29
29
|
return new JoinBuilder({
|
|
30
30
|
...this.#props,
|
|
31
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode,
|
|
31
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
@@ -40,7 +40,7 @@ export class JoinBuilder {
|
|
|
40
40
|
orOnRef(lhs, op, rhs) {
|
|
41
41
|
return new JoinBuilder({
|
|
42
42
|
...this.#props,
|
|
43
|
-
joinNode: JoinNode.
|
|
43
|
+
joinNode: JoinNode.cloneWithOrOn(this.#props.joinNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
@@ -52,7 +52,7 @@ export class JoinBuilder {
|
|
|
52
52
|
onExists(arg) {
|
|
53
53
|
return new JoinBuilder({
|
|
54
54
|
...this.#props,
|
|
55
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode,
|
|
55
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
@@ -64,7 +64,7 @@ export class JoinBuilder {
|
|
|
64
64
|
onNotExists(arg) {
|
|
65
65
|
return new JoinBuilder({
|
|
66
66
|
...this.#props,
|
|
67
|
-
joinNode: JoinNode.cloneWithOn(this.#props.joinNode,
|
|
67
|
+
joinNode: JoinNode.cloneWithOn(this.#props.joinNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
70
|
/**
|
|
@@ -76,7 +76,7 @@ export class JoinBuilder {
|
|
|
76
76
|
orOnExists(arg) {
|
|
77
77
|
return new JoinBuilder({
|
|
78
78
|
...this.#props,
|
|
79
|
-
joinNode: JoinNode.
|
|
79
|
+
joinNode: JoinNode.cloneWithOrOn(this.#props.joinNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
82
|
/**
|
|
@@ -88,7 +88,7 @@ export class JoinBuilder {
|
|
|
88
88
|
orOnNotExists(arg) {
|
|
89
89
|
return new JoinBuilder({
|
|
90
90
|
...this.#props,
|
|
91
|
-
joinNode: JoinNode.
|
|
91
|
+
joinNode: JoinNode.cloneWithOrOn(this.#props.joinNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
94
|
toOperationNode() {
|
|
@@ -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,7 @@ 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';
|
|
22
20
|
/**
|
|
23
21
|
* The main query builder class.
|
|
24
22
|
*
|
|
@@ -43,7 +41,7 @@ export class QueryBuilder {
|
|
|
43
41
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
44
42
|
return new QueryBuilder({
|
|
45
43
|
...this.#props,
|
|
46
|
-
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode,
|
|
44
|
+
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseWhereFilter(this.#props.parseContext, args)),
|
|
47
45
|
});
|
|
48
46
|
}
|
|
49
47
|
/**
|
|
@@ -101,14 +99,14 @@ export class QueryBuilder {
|
|
|
101
99
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
102
100
|
return new QueryBuilder({
|
|
103
101
|
...this.#props,
|
|
104
|
-
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode,
|
|
102
|
+
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
105
103
|
});
|
|
106
104
|
}
|
|
107
105
|
orWhere(...args) {
|
|
108
106
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
109
107
|
return new QueryBuilder({
|
|
110
108
|
...this.#props,
|
|
111
|
-
queryNode: QueryNode.
|
|
109
|
+
queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseWhereFilter(this.#props.parseContext, args)),
|
|
112
110
|
});
|
|
113
111
|
}
|
|
114
112
|
/**
|
|
@@ -121,7 +119,7 @@ export class QueryBuilder {
|
|
|
121
119
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
122
120
|
return new QueryBuilder({
|
|
123
121
|
...this.#props,
|
|
124
|
-
queryNode: QueryNode.
|
|
122
|
+
queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
125
123
|
});
|
|
126
124
|
}
|
|
127
125
|
/**
|
|
@@ -187,7 +185,7 @@ export class QueryBuilder {
|
|
|
187
185
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
188
186
|
return new QueryBuilder({
|
|
189
187
|
...this.#props,
|
|
190
|
-
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode,
|
|
188
|
+
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
191
189
|
});
|
|
192
190
|
}
|
|
193
191
|
/**
|
|
@@ -197,7 +195,7 @@ export class QueryBuilder {
|
|
|
197
195
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
198
196
|
return new QueryBuilder({
|
|
199
197
|
...this.#props,
|
|
200
|
-
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode,
|
|
198
|
+
queryNode: QueryNode.cloneWithWhere(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
201
199
|
});
|
|
202
200
|
}
|
|
203
201
|
/**
|
|
@@ -207,7 +205,7 @@ export class QueryBuilder {
|
|
|
207
205
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
208
206
|
return new QueryBuilder({
|
|
209
207
|
...this.#props,
|
|
210
|
-
queryNode: QueryNode.
|
|
208
|
+
queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
211
209
|
});
|
|
212
210
|
}
|
|
213
211
|
/**
|
|
@@ -217,14 +215,14 @@ export class QueryBuilder {
|
|
|
217
215
|
assertCanHaveWhereClause(this.#props.queryNode);
|
|
218
216
|
return new QueryBuilder({
|
|
219
217
|
...this.#props,
|
|
220
|
-
queryNode: QueryNode.
|
|
218
|
+
queryNode: QueryNode.cloneWithOrWhere(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
221
219
|
});
|
|
222
220
|
}
|
|
223
221
|
having(...args) {
|
|
224
222
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
225
223
|
return new QueryBuilder({
|
|
226
224
|
...this.#props,
|
|
227
|
-
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode,
|
|
225
|
+
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseHavingFilter(this.#props.parseContext, args)),
|
|
228
226
|
});
|
|
229
227
|
}
|
|
230
228
|
/**
|
|
@@ -235,14 +233,14 @@ export class QueryBuilder {
|
|
|
235
233
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
236
234
|
return new QueryBuilder({
|
|
237
235
|
...this.#props,
|
|
238
|
-
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode,
|
|
236
|
+
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
239
237
|
});
|
|
240
238
|
}
|
|
241
239
|
orHaving(...args) {
|
|
242
240
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
243
241
|
return new QueryBuilder({
|
|
244
242
|
...this.#props,
|
|
245
|
-
queryNode: SelectQueryNode.
|
|
243
|
+
queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseHavingFilter(this.#props.parseContext, args)),
|
|
246
244
|
});
|
|
247
245
|
}
|
|
248
246
|
/**
|
|
@@ -253,7 +251,7 @@ export class QueryBuilder {
|
|
|
253
251
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
254
252
|
return new QueryBuilder({
|
|
255
253
|
...this.#props,
|
|
256
|
-
queryNode: SelectQueryNode.
|
|
254
|
+
queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseReferenceFilter(this.#props.parseContext, lhs, op, rhs)),
|
|
257
255
|
});
|
|
258
256
|
}
|
|
259
257
|
/**
|
|
@@ -264,7 +262,7 @@ export class QueryBuilder {
|
|
|
264
262
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
265
263
|
return new QueryBuilder({
|
|
266
264
|
...this.#props,
|
|
267
|
-
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode,
|
|
265
|
+
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
268
266
|
});
|
|
269
267
|
}
|
|
270
268
|
/**
|
|
@@ -275,7 +273,7 @@ export class QueryBuilder {
|
|
|
275
273
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
276
274
|
return new QueryBuilder({
|
|
277
275
|
...this.#props,
|
|
278
|
-
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode,
|
|
276
|
+
queryNode: SelectQueryNode.cloneWithHaving(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
279
277
|
});
|
|
280
278
|
}
|
|
281
279
|
/**
|
|
@@ -286,7 +284,7 @@ export class QueryBuilder {
|
|
|
286
284
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
287
285
|
return new QueryBuilder({
|
|
288
286
|
...this.#props,
|
|
289
|
-
queryNode: SelectQueryNode.
|
|
287
|
+
queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseExistFilter(this.#props.parseContext, arg)),
|
|
290
288
|
});
|
|
291
289
|
}
|
|
292
290
|
/**
|
|
@@ -297,7 +295,7 @@ export class QueryBuilder {
|
|
|
297
295
|
assertCanHaveHavingClause(this.#props.queryNode);
|
|
298
296
|
return new QueryBuilder({
|
|
299
297
|
...this.#props,
|
|
300
|
-
queryNode: SelectQueryNode.
|
|
298
|
+
queryNode: SelectQueryNode.cloneWithOrHaving(this.#props.queryNode, parseNotExistFilter(this.#props.parseContext, arg)),
|
|
301
299
|
});
|
|
302
300
|
}
|
|
303
301
|
select(selection) {
|
|
@@ -714,14 +712,14 @@ export class QueryBuilder {
|
|
|
714
712
|
assertCanHaveOrderByClause(this.#props.queryNode);
|
|
715
713
|
return new QueryBuilder({
|
|
716
714
|
...this.#props,
|
|
717
|
-
queryNode: SelectQueryNode.cloneWithOrderByItem(this.#props.queryNode,
|
|
715
|
+
queryNode: SelectQueryNode.cloneWithOrderByItem(this.#props.queryNode, parseOrderBy(this.#props.parseContext, orderBy, direction)),
|
|
718
716
|
});
|
|
719
717
|
}
|
|
720
718
|
groupBy(orderBy) {
|
|
721
719
|
assertCanHaveGroupByClause(this.#props.queryNode);
|
|
722
720
|
return new QueryBuilder({
|
|
723
721
|
...this.#props,
|
|
724
|
-
queryNode: SelectQueryNode.cloneWithGroupByItems(this.#props.queryNode,
|
|
722
|
+
queryNode: SelectQueryNode.cloneWithGroupByItems(this.#props.queryNode, parseGroupBy(this.#props.parseContext, orderBy)),
|
|
725
723
|
});
|
|
726
724
|
}
|
|
727
725
|
/**
|
|
@@ -958,7 +956,7 @@ function assertCanHaveUpdates(node) {
|
|
|
958
956
|
}
|
|
959
957
|
function assertCanHaveReturningClause(node) {
|
|
960
958
|
if (!QueryNode.isMutating(node)) {
|
|
961
|
-
throw new Error('only
|
|
959
|
+
throw new Error('only insert, delete and update queries can have a returning clause');
|
|
962
960
|
}
|
|
963
961
|
}
|
|
964
962
|
function assertCanHaveOrderByClause(node) {
|
|
@@ -126,10 +126,10 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
126
126
|
protected visitAddConstraint(node: AddConstraintNode): void;
|
|
127
127
|
protected visitDropConstraint(node: DropConstraintNode): void;
|
|
128
128
|
protected append(str: string): void;
|
|
129
|
-
protected appendValue(
|
|
129
|
+
protected appendValue(parameter: unknown): void;
|
|
130
130
|
protected getLeftIdentifierWrapper(): string;
|
|
131
131
|
protected getRightIdentifierWrapper(): string;
|
|
132
132
|
protected getCurrentParameterPlaceholder(): string;
|
|
133
|
-
protected addParameter(parameter:
|
|
133
|
+
protected addParameter(parameter: unknown): void;
|
|
134
134
|
protected appendImmediateValue(value: PrimitiveValue): void;
|
|
135
135
|
}
|
|
@@ -630,8 +630,8 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
|
|
|
630
630
|
append(str) {
|
|
631
631
|
this.#sql += str;
|
|
632
632
|
}
|
|
633
|
-
appendValue(
|
|
634
|
-
this.addParameter(
|
|
633
|
+
appendValue(parameter) {
|
|
634
|
+
this.addParameter(parameter);
|
|
635
635
|
this.append(this.getCurrentParameterPlaceholder());
|
|
636
636
|
}
|
|
637
637
|
getLeftIdentifierWrapper() {
|
|
@@ -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];
|