kysely 0.26.0 → 0.26.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/README.md +6 -6
- package/dist/cjs/dialect/dialect-adapter-base.d.ts +3 -3
- package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +3 -2
- package/dist/cjs/dialect/mysql/mysql-adapter.js +2 -2
- package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +3 -2
- package/dist/cjs/dialect/postgres/postgres-adapter.js +2 -2
- package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +2 -2
- package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +4 -2
- package/dist/cjs/dialect/sqlite/sqlite-adapter.js +2 -2
- package/dist/cjs/driver/runtime-driver.js +17 -2
- package/dist/cjs/expression/expression-builder.d.ts +299 -28
- package/dist/cjs/expression/expression-builder.js +36 -26
- package/dist/cjs/expression/expression-wrapper.d.ts +177 -8
- package/dist/cjs/expression/expression-wrapper.js +4 -4
- package/dist/cjs/expression/expression.d.ts +64 -1
- package/dist/cjs/helpers/mysql.d.ts +11 -8
- package/dist/cjs/helpers/mysql.js +21 -32
- package/dist/cjs/helpers/postgres.d.ts +8 -5
- package/dist/cjs/helpers/postgres.js +8 -5
- package/dist/cjs/helpers/sqlite.d.ts +164 -0
- package/dist/cjs/helpers/sqlite.js +180 -0
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/kysely.d.ts +4 -3
- package/dist/cjs/kysely.js +1 -1
- package/dist/cjs/operation-node/common-table-expression-node.d.ts +4 -0
- package/dist/cjs/operation-node/common-table-expression-node.js +6 -0
- package/dist/cjs/operation-node/delete-query-node.d.ts +1 -1
- package/dist/cjs/operation-node/delete-query-node.js +3 -3
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +8 -0
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/operator-node.d.ts +3 -3
- package/dist/cjs/operation-node/operator-node.js +3 -0
- package/dist/cjs/operation-node/order-by-node.d.ts +2 -2
- package/dist/cjs/operation-node/order-by-node.js +4 -4
- package/dist/cjs/operation-node/over-node.d.ts +1 -1
- package/dist/cjs/operation-node/over-node.js +3 -3
- package/dist/cjs/operation-node/select-query-node.d.ts +5 -4
- package/dist/cjs/operation-node/select-query-node.js +13 -7
- package/dist/cjs/operation-node/tuple-node.d.ts +12 -0
- package/dist/cjs/operation-node/tuple-node.js +18 -0
- package/dist/cjs/parser/binary-operation-parser.d.ts +11 -7
- package/dist/cjs/parser/binary-operation-parser.js +35 -46
- package/dist/cjs/parser/expression-parser.d.ts +9 -4
- package/dist/cjs/parser/join-parser.d.ts +2 -2
- package/dist/cjs/parser/join-parser.js +2 -3
- package/dist/cjs/parser/order-by-parser.d.ts +6 -2
- package/dist/cjs/parser/order-by-parser.js +41 -7
- package/dist/cjs/parser/parse-utils.js +2 -2
- package/dist/cjs/parser/reference-parser.js +1 -1
- package/dist/cjs/parser/select-parser.d.ts +5 -5
- package/dist/cjs/parser/set-operation-parser.d.ts +3 -1
- package/dist/cjs/parser/set-operation-parser.js +13 -4
- package/dist/cjs/parser/tuple-parser.d.ts +47 -0
- package/dist/cjs/parser/tuple-parser.js +2 -0
- package/dist/cjs/parser/value-parser.d.ts +4 -2
- package/dist/cjs/parser/value-parser.js +12 -1
- package/dist/cjs/parser/with-parser.d.ts +3 -2
- package/dist/cjs/parser/with-parser.js +16 -4
- package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +3 -3
- package/dist/cjs/plugin/camel-case/camel-case-plugin.js +4 -8
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +13 -0
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +50 -14
- package/dist/cjs/query-builder/aggregate-function-builder.d.ts +5 -5
- package/dist/cjs/query-builder/aggregate-function-builder.js +2 -2
- package/dist/cjs/query-builder/case-builder.js +8 -4
- package/dist/cjs/query-builder/cte-builder.d.ts +20 -0
- package/dist/cjs/query-builder/cte-builder.js +39 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +74 -24
- package/dist/cjs/query-builder/delete-query-builder.js +3 -3
- package/dist/cjs/query-builder/function-module.d.ts +41 -6
- package/dist/cjs/query-builder/function-module.js +3 -0
- package/dist/cjs/query-builder/having-interface.d.ts +2 -5
- package/dist/cjs/query-builder/insert-query-builder.d.ts +1 -1
- package/dist/cjs/query-builder/join-builder.d.ts +2 -6
- package/dist/cjs/query-builder/join-builder.js +2 -2
- package/dist/cjs/query-builder/json-path-builder.d.ts +60 -4
- package/dist/cjs/query-builder/on-conflict-builder.d.ts +143 -44
- package/dist/cjs/query-builder/on-conflict-builder.js +4 -4
- package/dist/cjs/query-builder/over-builder.js +1 -1
- package/dist/cjs/query-builder/select-query-builder.d.ts +245 -86
- package/dist/cjs/query-builder/select-query-builder.js +72 -924
- package/dist/cjs/query-builder/update-query-builder.d.ts +106 -25
- package/dist/cjs/query-builder/update-query-builder.js +2 -2
- package/dist/cjs/query-builder/where-interface.d.ts +71 -24
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +3 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +39 -7
- package/dist/cjs/query-creator.d.ts +74 -2
- package/dist/cjs/query-creator.js +83 -6
- package/dist/cjs/raw-builder/raw-builder.d.ts +88 -49
- package/dist/cjs/raw-builder/raw-builder.js +18 -45
- package/dist/cjs/raw-builder/sql.js +8 -8
- package/dist/cjs/schema/alter-table-builder.d.ts +4 -0
- package/dist/cjs/schema/alter-table-builder.js +12 -0
- package/dist/cjs/schema/create-index-builder.d.ts +1 -1
- package/dist/cjs/schema/create-index-builder.js +1 -1
- package/dist/cjs/util/column-type.d.ts +7 -6
- package/dist/cjs/util/json-object-args.d.ts +3 -0
- package/dist/cjs/util/json-object-args.js +35 -0
- package/dist/cjs/util/object-utils.d.ts +1 -0
- package/dist/cjs/util/object-utils.js +9 -1
- package/dist/cjs/util/type-utils.d.ts +10 -10
- package/dist/esm/dialect/dialect-adapter-base.d.ts +3 -3
- package/dist/esm/dialect/mysql/mysql-adapter.d.ts +3 -2
- package/dist/esm/dialect/mysql/mysql-adapter.js +2 -2
- package/dist/esm/dialect/postgres/postgres-adapter.d.ts +3 -2
- package/dist/esm/dialect/postgres/postgres-adapter.js +2 -2
- package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +2 -2
- package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +4 -2
- package/dist/esm/dialect/sqlite/sqlite-adapter.js +2 -2
- package/dist/esm/driver/runtime-driver.js +17 -2
- package/dist/esm/expression/expression-builder.d.ts +299 -28
- package/dist/esm/expression/expression-builder.js +40 -30
- package/dist/esm/expression/expression-wrapper.d.ts +177 -8
- package/dist/esm/expression/expression-wrapper.js +5 -5
- package/dist/esm/expression/expression.d.ts +64 -1
- package/dist/esm/helpers/mysql.d.ts +11 -8
- package/dist/esm/helpers/mysql.js +21 -32
- package/dist/esm/helpers/postgres.d.ts +8 -5
- package/dist/esm/helpers/postgres.js +8 -5
- package/dist/esm/helpers/sqlite.d.ts +164 -0
- package/dist/esm/helpers/sqlite.js +175 -0
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/kysely.d.ts +4 -3
- package/dist/esm/kysely.js +1 -1
- package/dist/esm/operation-node/common-table-expression-node.d.ts +4 -0
- package/dist/esm/operation-node/common-table-expression-node.js +6 -0
- package/dist/esm/operation-node/delete-query-node.d.ts +1 -1
- package/dist/esm/operation-node/delete-query-node.js +3 -3
- package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-transformer.js +8 -0
- package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-visitor.js +1 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/operator-node.d.ts +3 -3
- package/dist/esm/operation-node/operator-node.js +3 -0
- package/dist/esm/operation-node/order-by-node.d.ts +2 -2
- package/dist/esm/operation-node/order-by-node.js +4 -4
- package/dist/esm/operation-node/over-node.d.ts +1 -1
- package/dist/esm/operation-node/over-node.js +3 -3
- package/dist/esm/operation-node/select-query-node.d.ts +5 -4
- package/dist/esm/operation-node/select-query-node.js +13 -7
- package/dist/esm/operation-node/tuple-node.d.ts +12 -0
- package/dist/esm/operation-node/tuple-node.js +16 -0
- package/dist/esm/parser/binary-operation-parser.d.ts +11 -7
- package/dist/esm/parser/binary-operation-parser.js +36 -47
- package/dist/esm/parser/expression-parser.d.ts +9 -4
- package/dist/esm/parser/join-parser.d.ts +2 -2
- package/dist/esm/parser/join-parser.js +3 -4
- package/dist/esm/parser/order-by-parser.d.ts +6 -2
- package/dist/esm/parser/order-by-parser.js +40 -7
- package/dist/esm/parser/parse-utils.js +3 -3
- package/dist/esm/parser/reference-parser.js +1 -1
- package/dist/esm/parser/select-parser.d.ts +5 -5
- package/dist/esm/parser/set-operation-parser.d.ts +3 -1
- package/dist/esm/parser/set-operation-parser.js +11 -2
- package/dist/esm/parser/tuple-parser.d.ts +47 -0
- package/dist/esm/parser/tuple-parser.js +2 -0
- package/dist/esm/parser/value-parser.d.ts +4 -2
- package/dist/esm/parser/value-parser.js +10 -1
- package/dist/esm/parser/with-parser.d.ts +3 -2
- package/dist/esm/parser/with-parser.js +16 -4
- package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +3 -3
- package/dist/esm/plugin/camel-case/camel-case-plugin.js +5 -9
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +13 -0
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +51 -15
- package/dist/esm/query-builder/aggregate-function-builder.d.ts +5 -5
- package/dist/esm/query-builder/aggregate-function-builder.js +3 -3
- package/dist/esm/query-builder/case-builder.js +10 -6
- package/dist/esm/query-builder/cte-builder.d.ts +20 -0
- package/dist/esm/query-builder/cte-builder.js +36 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +74 -24
- package/dist/esm/query-builder/delete-query-builder.js +4 -4
- package/dist/esm/query-builder/function-module.d.ts +41 -6
- package/dist/esm/query-builder/function-module.js +3 -0
- package/dist/esm/query-builder/having-interface.d.ts +2 -5
- package/dist/esm/query-builder/insert-query-builder.d.ts +1 -1
- package/dist/esm/query-builder/join-builder.d.ts +2 -6
- package/dist/esm/query-builder/join-builder.js +3 -3
- package/dist/esm/query-builder/json-path-builder.d.ts +60 -4
- package/dist/esm/query-builder/on-conflict-builder.d.ts +143 -44
- package/dist/esm/query-builder/on-conflict-builder.js +5 -5
- package/dist/esm/query-builder/over-builder.js +1 -1
- package/dist/esm/query-builder/select-query-builder.d.ts +245 -86
- package/dist/esm/query-builder/select-query-builder.js +72 -923
- package/dist/esm/query-builder/update-query-builder.d.ts +106 -25
- package/dist/esm/query-builder/update-query-builder.js +3 -3
- package/dist/esm/query-builder/where-interface.d.ts +71 -24
- package/dist/esm/query-compiler/default-query-compiler.d.ts +3 -0
- package/dist/esm/query-compiler/default-query-compiler.js +39 -7
- package/dist/esm/query-creator.d.ts +74 -2
- package/dist/esm/query-creator.js +84 -7
- package/dist/esm/raw-builder/raw-builder.d.ts +88 -49
- package/dist/esm/raw-builder/raw-builder.js +17 -42
- package/dist/esm/raw-builder/sql.js +9 -9
- package/dist/esm/schema/alter-table-builder.d.ts +4 -0
- package/dist/esm/schema/alter-table-builder.js +12 -0
- package/dist/esm/schema/create-index-builder.d.ts +1 -1
- package/dist/esm/schema/create-index-builder.js +2 -2
- package/dist/esm/util/column-type.d.ts +7 -6
- package/dist/esm/util/json-object-args.d.ts +3 -0
- package/dist/esm/util/json-object-args.js +32 -0
- package/dist/esm/util/object-utils.d.ts +1 -0
- package/dist/esm/util/object-utils.js +7 -0
- package/dist/esm/util/type-utils.d.ts +10 -10
- package/helpers/sqlite.d.ts +1 -0
- package/helpers/sqlite.js +1 -0
- package/package.json +7 -4
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="./query-creator.d.ts" />
|
|
2
|
-
import {
|
|
2
|
+
import { createSelectQueryBuilder, } from './query-builder/select-query-builder.js';
|
|
3
3
|
import { InsertQueryBuilder } from './query-builder/insert-query-builder.js';
|
|
4
4
|
import { DeleteQueryBuilder } from './query-builder/delete-query-builder.js';
|
|
5
5
|
import { UpdateQueryBuilder } from './query-builder/update-query-builder.js';
|
|
@@ -13,16 +13,71 @@ import { WithNode } from './operation-node/with-node.js';
|
|
|
13
13
|
import { createQueryId } from './util/query-id.js';
|
|
14
14
|
import { WithSchemaPlugin } from './plugin/with-schema/with-schema-plugin.js';
|
|
15
15
|
import { freeze } from './util/object-utils.js';
|
|
16
|
+
import { parseSelectArg, } from './parser/select-parser.js';
|
|
16
17
|
export class QueryCreator {
|
|
17
18
|
#props;
|
|
18
19
|
constructor(props) {
|
|
19
20
|
this.#props = freeze(props);
|
|
20
21
|
}
|
|
21
22
|
selectFrom(from) {
|
|
22
|
-
return
|
|
23
|
+
return createSelectQueryBuilder({
|
|
23
24
|
queryId: createQueryId(),
|
|
24
25
|
executor: this.#props.executor,
|
|
25
|
-
queryNode: SelectQueryNode.
|
|
26
|
+
queryNode: SelectQueryNode.createFrom(parseTableExpressionOrList(from), this.#props.withNode),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Creates a `select` query builder without a `from` clause.
|
|
31
|
+
*
|
|
32
|
+
* If you want to create a `select from` query, use the `selectFrom` method instead.
|
|
33
|
+
* This one can be used to create a plain `select` statement without a `from` clause.
|
|
34
|
+
*
|
|
35
|
+
* This method accepts the same inputs as {@link SelectQueryBuilder.select}. See its
|
|
36
|
+
* documentation for more examples.
|
|
37
|
+
*
|
|
38
|
+
* ### Examples
|
|
39
|
+
*
|
|
40
|
+
* ```ts
|
|
41
|
+
* const result = db.select((eb) => [
|
|
42
|
+
* eb.selectFrom('person')
|
|
43
|
+
* .select('id')
|
|
44
|
+
* .where('first_name', '=', 'Jennifer')
|
|
45
|
+
* .limit(1)
|
|
46
|
+
* .as('jennifer_id'),
|
|
47
|
+
*
|
|
48
|
+
* eb.selectFrom('pet')
|
|
49
|
+
* .select('id')
|
|
50
|
+
* .where('name', '=', 'Doggo')
|
|
51
|
+
* .limit(1)
|
|
52
|
+
* .as('doggo_id')
|
|
53
|
+
* ])
|
|
54
|
+
* .executeTakeFirstOrThrow()
|
|
55
|
+
*
|
|
56
|
+
* console.log(result.jennifer_id)
|
|
57
|
+
* console.log(result.doggo_id)
|
|
58
|
+
* ```
|
|
59
|
+
*
|
|
60
|
+
* The generated SQL (PostgreSQL):
|
|
61
|
+
*
|
|
62
|
+
* ```sql
|
|
63
|
+
* select (
|
|
64
|
+
* select "id"
|
|
65
|
+
* from "person"
|
|
66
|
+
* where "first_name" = $1
|
|
67
|
+
* limit $2
|
|
68
|
+
* ) as "jennifer_id", (
|
|
69
|
+
* select "id"
|
|
70
|
+
* from "pet"
|
|
71
|
+
* where "name" = $3
|
|
72
|
+
* limit $4
|
|
73
|
+
* ) as "doggo_id"
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
selectNoFrom(selection) {
|
|
77
|
+
return createSelectQueryBuilder({
|
|
78
|
+
queryId: createQueryId(),
|
|
79
|
+
executor: this.#props.executor,
|
|
80
|
+
queryNode: SelectQueryNode.cloneWithSelections(SelectQueryNode.create(this.#props.withNode), parseSelectArg(selection)),
|
|
26
81
|
});
|
|
27
82
|
}
|
|
28
83
|
/**
|
|
@@ -157,9 +212,26 @@ export class QueryCreator {
|
|
|
157
212
|
* .selectAll()
|
|
158
213
|
* .execute()
|
|
159
214
|
* ```
|
|
215
|
+
*
|
|
216
|
+
* The first argument can also be a callback. The callback is passed
|
|
217
|
+
* a `CTEBuilder` instance that can be used to configure the CTE:
|
|
218
|
+
*
|
|
219
|
+
* ```ts
|
|
220
|
+
* await db
|
|
221
|
+
* .with(
|
|
222
|
+
* (cte) => cte('jennifers').materialized(),
|
|
223
|
+
* (db) => db
|
|
224
|
+
* .selectFrom('person')
|
|
225
|
+
* .where('first_name', '=', 'Jennifer')
|
|
226
|
+
* .select(['id', 'age'])
|
|
227
|
+
* )
|
|
228
|
+
* .selectFrom('jennifers')
|
|
229
|
+
* .selectAll()
|
|
230
|
+
* .execute()
|
|
231
|
+
* ```
|
|
160
232
|
*/
|
|
161
|
-
with(
|
|
162
|
-
const cte = parseCommonTableExpression(
|
|
233
|
+
with(nameOrBuilder, expression) {
|
|
234
|
+
const cte = parseCommonTableExpression(nameOrBuilder, expression);
|
|
163
235
|
return new QueryCreator({
|
|
164
236
|
...this.#props,
|
|
165
237
|
withNode: this.#props.withNode
|
|
@@ -170,10 +242,15 @@ export class QueryCreator {
|
|
|
170
242
|
/**
|
|
171
243
|
* Creates a recursive `with` query (Common Table Expression).
|
|
172
244
|
*
|
|
245
|
+
* Note that recursiveness is a property of the whole `with` statement.
|
|
246
|
+
* You cannot have recursive and non-recursive CTEs in a same `with` statement.
|
|
247
|
+
* Therefore the recursiveness is determined by the **first** `with` or
|
|
248
|
+
* `withRecusive` call you make.
|
|
249
|
+
*
|
|
173
250
|
* See the {@link with} method for examples and more documentation.
|
|
174
251
|
*/
|
|
175
|
-
withRecursive(
|
|
176
|
-
const cte = parseCommonTableExpression(
|
|
252
|
+
withRecursive(nameOrBuilder, expression) {
|
|
253
|
+
const cte = parseCommonTableExpression(nameOrBuilder, expression);
|
|
177
254
|
return new QueryCreator({
|
|
178
255
|
...this.#props,
|
|
179
256
|
withNode: this.#props.withNode
|
|
@@ -1,38 +1,21 @@
|
|
|
1
1
|
import { QueryResult } from '../driver/database-connection.js';
|
|
2
|
-
import { AliasNode } from '../operation-node/alias-node.js';
|
|
3
2
|
import { RawNode } from '../operation-node/raw-node.js';
|
|
4
3
|
import { CompiledQuery } from '../query-compiler/compiled-query.js';
|
|
5
4
|
import { KyselyPlugin } from '../plugin/kysely-plugin.js';
|
|
6
5
|
import { QueryExecutorProvider } from '../query-executor/query-executor-provider.js';
|
|
7
6
|
import { QueryId } from '../util/query-id.js';
|
|
8
|
-
import { AliasedExpression, Expression } from '../expression/expression.js';
|
|
7
|
+
import { AliasableExpression, AliasedExpression, Expression } from '../expression/expression.js';
|
|
9
8
|
/**
|
|
10
9
|
* An instance of this class can be used to create raw SQL snippets or queries.
|
|
11
10
|
*
|
|
12
11
|
* You shouldn't need to create `RawBuilder` instances directly. Instead you should
|
|
13
12
|
* use the {@link sql} template tag.
|
|
14
13
|
*/
|
|
15
|
-
export
|
|
16
|
-
#private;
|
|
17
|
-
constructor(props: RawBuilderProps);
|
|
18
|
-
/** @private */
|
|
14
|
+
export interface RawBuilder<O> extends AliasableExpression<O> {
|
|
19
15
|
/**
|
|
20
|
-
*
|
|
21
|
-
* Simply add this getter for your expression and always return `undefined` from it:
|
|
22
|
-
*
|
|
23
|
-
* ```ts
|
|
24
|
-
* class SomeExpression<T> implements Expression<T> {
|
|
25
|
-
* get expressionType(): T | undefined {
|
|
26
|
-
* return undefined
|
|
27
|
-
* }
|
|
28
|
-
* }
|
|
29
|
-
* ```
|
|
30
|
-
*
|
|
31
|
-
* The getter is needed to make the expression assignable to another expression only
|
|
32
|
-
* if the types `T` are assignable. Without this property (or some other property
|
|
33
|
-
* that references `T`), you could assing `Expression<string>` to `Expression<number>`.
|
|
16
|
+
* @private Without this SelectQueryBuilder extends RawBuilder and things break.
|
|
34
17
|
*/
|
|
35
|
-
get
|
|
18
|
+
get isRawBuilder(): true;
|
|
36
19
|
/**
|
|
37
20
|
* Returns an aliased version of the SQL expression.
|
|
38
21
|
*
|
|
@@ -87,6 +70,62 @@ export declare class RawBuilder<O> implements Expression<O> {
|
|
|
87
70
|
* ```
|
|
88
71
|
*/
|
|
89
72
|
as<A extends string>(alias: A): AliasedRawBuilder<O, A>;
|
|
73
|
+
/**
|
|
74
|
+
* Returns an aliased version of the expression.
|
|
75
|
+
*
|
|
76
|
+
* In addition to slapping `as "the_alias"` at the end of the expression,
|
|
77
|
+
* this method also provides strict typing:
|
|
78
|
+
*
|
|
79
|
+
* ```ts
|
|
80
|
+
* const result = await db
|
|
81
|
+
* .selectFrom('person')
|
|
82
|
+
* .select((eb) =>
|
|
83
|
+
* // `eb.fn<string>` returns an AliasableExpression<string>
|
|
84
|
+
* eb.fn<string>('concat', ['first_name' eb.val(' '), 'last_name']).as('full_name')
|
|
85
|
+
* )
|
|
86
|
+
* .executeTakeFirstOrThrow()
|
|
87
|
+
*
|
|
88
|
+
* // `full_name: string` field exists in the result type.
|
|
89
|
+
* console.log(result.full_name)
|
|
90
|
+
* ```
|
|
91
|
+
*
|
|
92
|
+
* The generated SQL (PostgreSQL):
|
|
93
|
+
*
|
|
94
|
+
* ```ts
|
|
95
|
+
* select
|
|
96
|
+
* concat("first_name", $1, "last_name") as "full_name"
|
|
97
|
+
* from
|
|
98
|
+
* "person"
|
|
99
|
+
* ```
|
|
100
|
+
*
|
|
101
|
+
* You can also pass in a raw SQL snippet (or any expression) but in that case you must
|
|
102
|
+
* provide the alias as the only type argument:
|
|
103
|
+
*
|
|
104
|
+
* ```ts
|
|
105
|
+
* const values = sql<{ a: number, b: string }>`(values (1, 'foo'))`
|
|
106
|
+
*
|
|
107
|
+
* // The alias is `t(a, b)` which specifies the column names
|
|
108
|
+
* // in addition to the table name. We must tell kysely that
|
|
109
|
+
* // columns of the table can be referenced through `t`
|
|
110
|
+
* // by providing an explicit type argument.
|
|
111
|
+
* const aliasedValues = values.as<'t'>(sql`t(a, b)`)
|
|
112
|
+
*
|
|
113
|
+
* await db
|
|
114
|
+
* .insertInto('person')
|
|
115
|
+
* .columns(['first_name', 'last_name'])
|
|
116
|
+
* .expression(
|
|
117
|
+
* db.selectFrom(aliasedValues).select(['t.a', 't.b'])
|
|
118
|
+
* )
|
|
119
|
+
* ```
|
|
120
|
+
*
|
|
121
|
+
* The generated SQL (PostgreSQL):
|
|
122
|
+
*
|
|
123
|
+
* ```ts
|
|
124
|
+
* insert into "person" ("first_name", "last_name")
|
|
125
|
+
* from (values (1, 'foo')) as t(a, b)
|
|
126
|
+
* select "t"."a", "t"."b"
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
90
129
|
as<A extends string>(alias: Expression<any>): AliasedRawBuilder<O, A>;
|
|
91
130
|
/**
|
|
92
131
|
* Change the output type of the raw expression.
|
|
@@ -95,14 +134,31 @@ export declare class RawBuilder<O> implements Expression<O> {
|
|
|
95
134
|
* returns a copy of this `RawBuilder` with a new output type.
|
|
96
135
|
*/
|
|
97
136
|
$castTo<T>(): RawBuilder<T>;
|
|
98
|
-
/**
|
|
99
|
-
* @deprecated Use `$castTo` instead.
|
|
100
|
-
*/
|
|
101
|
-
castTo<T>(): RawBuilder<T>;
|
|
102
137
|
/**
|
|
103
138
|
* Adds a plugin for this SQL snippet.
|
|
104
139
|
*/
|
|
105
140
|
withPlugin(plugin: KyselyPlugin): RawBuilder<O>;
|
|
141
|
+
/**
|
|
142
|
+
* Compiles the builder to a `CompiledQuery`.
|
|
143
|
+
*
|
|
144
|
+
* ### Examples
|
|
145
|
+
*
|
|
146
|
+
* ```ts
|
|
147
|
+
* const { sql } = sql`select * from ${sql.table('person')}`.compile(db)
|
|
148
|
+
* console.log(sql)
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
compile(executorProvider: QueryExecutorProvider): CompiledQuery<O>;
|
|
152
|
+
/**
|
|
153
|
+
* Executes the raw query.
|
|
154
|
+
*
|
|
155
|
+
* ### Examples
|
|
156
|
+
*
|
|
157
|
+
* ```ts
|
|
158
|
+
* const result = await sql`select * from ${sql.table('person')}`.execute(db)
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
execute(executorProvider: QueryExecutorProvider): Promise<QueryResult<O>>;
|
|
106
162
|
/**
|
|
107
163
|
* Creates the OperationNode that describes how to compile this expression into SQL.
|
|
108
164
|
*
|
|
@@ -118,33 +174,16 @@ export declare class RawBuilder<O> implements Expression<O> {
|
|
|
118
174
|
* ```
|
|
119
175
|
*/
|
|
120
176
|
toOperationNode(): RawNode;
|
|
121
|
-
compile(executorProvider: QueryExecutorProvider): CompiledQuery<O>;
|
|
122
|
-
execute(executorProvider: QueryExecutorProvider): Promise<QueryResult<O>>;
|
|
123
|
-
}
|
|
124
|
-
export declare function isRawBuilder(obj: unknown): obj is RawBuilder<unknown>;
|
|
125
|
-
/**
|
|
126
|
-
* {@link RawBuilder} with an alias. The result of calling {@link RawBuilder.as}.
|
|
127
|
-
*/
|
|
128
|
-
export declare class AliasedRawBuilder<O = unknown, A extends string = never> implements AliasedExpression<O, A> {
|
|
129
|
-
#private;
|
|
130
|
-
constructor(rawBuilder: RawBuilder<O>, alias: A | Expression<unknown>);
|
|
131
|
-
/** @private */
|
|
132
|
-
/**
|
|
133
|
-
* Returns the aliased expression.
|
|
134
|
-
*/
|
|
135
|
-
get expression(): Expression<O>;
|
|
136
|
-
/** @private */
|
|
137
|
-
/**
|
|
138
|
-
* Returns the alias.
|
|
139
|
-
*/
|
|
140
|
-
get alias(): A | Expression<unknown>;
|
|
141
|
-
/**
|
|
142
|
-
* Creates the OperationNode that describes how to compile this expression into SQL.
|
|
143
|
-
*/
|
|
144
|
-
toOperationNode(): AliasNode;
|
|
145
177
|
}
|
|
146
178
|
export interface RawBuilderProps {
|
|
147
179
|
readonly queryId: QueryId;
|
|
148
180
|
readonly rawNode: RawNode;
|
|
149
181
|
readonly plugins?: ReadonlyArray<KyselyPlugin>;
|
|
150
182
|
}
|
|
183
|
+
export declare function createRawBuilder<O>(props: RawBuilderProps): RawBuilder<O>;
|
|
184
|
+
/**
|
|
185
|
+
* {@link RawBuilder} with an alias. The result of calling {@link RawBuilder.as}.
|
|
186
|
+
*/
|
|
187
|
+
export interface AliasedRawBuilder<O = unknown, A extends string = never> extends AliasedExpression<O, A> {
|
|
188
|
+
get rawBuilder(): RawBuilder<O>;
|
|
189
|
+
}
|
|
@@ -1,48 +1,29 @@
|
|
|
1
1
|
/// <reference types="./raw-builder.d.ts" />
|
|
2
2
|
import { AliasNode } from '../operation-node/alias-node.js';
|
|
3
3
|
import { preventAwait } from '../util/prevent-await.js';
|
|
4
|
-
import { freeze
|
|
4
|
+
import { freeze } from '../util/object-utils.js';
|
|
5
5
|
import { NOOP_QUERY_EXECUTOR } from '../query-executor/noop-query-executor.js';
|
|
6
6
|
import { IdentifierNode } from '../operation-node/identifier-node.js';
|
|
7
7
|
import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
8
|
-
|
|
9
|
-
* An instance of this class can be used to create raw SQL snippets or queries.
|
|
10
|
-
*
|
|
11
|
-
* You shouldn't need to create `RawBuilder` instances directly. Instead you should
|
|
12
|
-
* use the {@link sql} template tag.
|
|
13
|
-
*/
|
|
14
|
-
export class RawBuilder {
|
|
8
|
+
class RawBuilderImpl {
|
|
15
9
|
#props;
|
|
16
10
|
constructor(props) {
|
|
17
11
|
this.#props = freeze(props);
|
|
18
12
|
}
|
|
19
|
-
/** @private */
|
|
20
13
|
get expressionType() {
|
|
21
14
|
return undefined;
|
|
22
15
|
}
|
|
16
|
+
get isRawBuilder() {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
23
19
|
as(alias) {
|
|
24
|
-
return new
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Change the output type of the raw expression.
|
|
28
|
-
*
|
|
29
|
-
* This method call doesn't change the SQL in any way. This methods simply
|
|
30
|
-
* returns a copy of this `RawBuilder` with a new output type.
|
|
31
|
-
*/
|
|
32
|
-
$castTo() {
|
|
33
|
-
return new RawBuilder({ ...this.#props });
|
|
20
|
+
return new AliasedRawBuilderImpl(this, alias);
|
|
34
21
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
*/
|
|
38
|
-
castTo() {
|
|
39
|
-
return this.$castTo();
|
|
22
|
+
$castTo() {
|
|
23
|
+
return new RawBuilderImpl({ ...this.#props });
|
|
40
24
|
}
|
|
41
|
-
/**
|
|
42
|
-
* Adds a plugin for this SQL snippet.
|
|
43
|
-
*/
|
|
44
25
|
withPlugin(plugin) {
|
|
45
|
-
return new
|
|
26
|
+
return new RawBuilderImpl({
|
|
46
27
|
...this.#props,
|
|
47
28
|
plugins: this.#props.plugins !== undefined
|
|
48
29
|
? freeze([...this.#props.plugins, plugin])
|
|
@@ -74,36 +55,30 @@ export class RawBuilder {
|
|
|
74
55
|
return executor.compileQuery(this.#toOperationNode(executor), this.#props.queryId);
|
|
75
56
|
}
|
|
76
57
|
}
|
|
77
|
-
export function
|
|
78
|
-
return (
|
|
79
|
-
isFunction(obj.as) &&
|
|
80
|
-
isFunction(obj.$castTo) &&
|
|
81
|
-
isFunction(obj.withPlugin) &&
|
|
82
|
-
isFunction(obj.toOperationNode) &&
|
|
83
|
-
isFunction(obj.execute));
|
|
58
|
+
export function createRawBuilder(props) {
|
|
59
|
+
return new RawBuilderImpl(props);
|
|
84
60
|
}
|
|
85
|
-
preventAwait(
|
|
86
|
-
|
|
87
|
-
* {@link RawBuilder} with an alias. The result of calling {@link RawBuilder.as}.
|
|
88
|
-
*/
|
|
89
|
-
export class AliasedRawBuilder {
|
|
61
|
+
preventAwait(RawBuilderImpl, "don't await RawBuilder instances directly. To execute the query you need to call `execute`");
|
|
62
|
+
class AliasedRawBuilderImpl {
|
|
90
63
|
#rawBuilder;
|
|
91
64
|
#alias;
|
|
92
65
|
constructor(rawBuilder, alias) {
|
|
93
66
|
this.#rawBuilder = rawBuilder;
|
|
94
67
|
this.#alias = alias;
|
|
95
68
|
}
|
|
96
|
-
/** @private */
|
|
97
69
|
get expression() {
|
|
98
70
|
return this.#rawBuilder;
|
|
99
71
|
}
|
|
100
|
-
/** @private */
|
|
101
72
|
get alias() {
|
|
102
73
|
return this.#alias;
|
|
103
74
|
}
|
|
75
|
+
get rawBuilder() {
|
|
76
|
+
return this.#rawBuilder;
|
|
77
|
+
}
|
|
104
78
|
toOperationNode() {
|
|
105
79
|
return AliasNode.create(this.#rawBuilder.toOperationNode(), isOperationNodeSource(this.#alias)
|
|
106
80
|
? this.#alias.toOperationNode()
|
|
107
81
|
: IdentifierNode.create(this.#alias));
|
|
108
82
|
}
|
|
109
83
|
}
|
|
84
|
+
preventAwait(AliasedRawBuilderImpl, "don't await AliasedRawBuilder instances directly. AliasedRawBuilder should never be executed directly since it's always a part of another query.");
|
|
@@ -6,21 +6,21 @@ import { parseStringReference } from '../parser/reference-parser.js';
|
|
|
6
6
|
import { parseTable } from '../parser/table-parser.js';
|
|
7
7
|
import { parseValueExpression } from '../parser/value-parser.js';
|
|
8
8
|
import { createQueryId } from '../util/query-id.js';
|
|
9
|
-
import {
|
|
9
|
+
import { createRawBuilder } from './raw-builder.js';
|
|
10
10
|
export const sql = Object.assign((sqlFragments, ...parameters) => {
|
|
11
|
-
return
|
|
11
|
+
return createRawBuilder({
|
|
12
12
|
queryId: createQueryId(),
|
|
13
13
|
rawNode: RawNode.create(sqlFragments, parameters?.map(parseValueExpression) ?? []),
|
|
14
14
|
});
|
|
15
15
|
}, {
|
|
16
16
|
ref(columnReference) {
|
|
17
|
-
return
|
|
17
|
+
return createRawBuilder({
|
|
18
18
|
queryId: createQueryId(),
|
|
19
19
|
rawNode: RawNode.createWithChild(parseStringReference(columnReference)),
|
|
20
20
|
});
|
|
21
21
|
},
|
|
22
22
|
val(value) {
|
|
23
|
-
return
|
|
23
|
+
return createRawBuilder({
|
|
24
24
|
queryId: createQueryId(),
|
|
25
25
|
rawNode: RawNode.createWithChild(parseValueExpression(value)),
|
|
26
26
|
});
|
|
@@ -29,7 +29,7 @@ export const sql = Object.assign((sqlFragments, ...parameters) => {
|
|
|
29
29
|
return this.val(value);
|
|
30
30
|
},
|
|
31
31
|
table(tableReference) {
|
|
32
|
-
return
|
|
32
|
+
return createRawBuilder({
|
|
33
33
|
queryId: createQueryId(),
|
|
34
34
|
rawNode: RawNode.createWithChild(parseTable(tableReference)),
|
|
35
35
|
});
|
|
@@ -38,13 +38,13 @@ export const sql = Object.assign((sqlFragments, ...parameters) => {
|
|
|
38
38
|
const fragments = new Array(ids.length + 1).fill('.');
|
|
39
39
|
fragments[0] = '';
|
|
40
40
|
fragments[fragments.length - 1] = '';
|
|
41
|
-
return
|
|
41
|
+
return createRawBuilder({
|
|
42
42
|
queryId: createQueryId(),
|
|
43
43
|
rawNode: RawNode.create(fragments, ids.map(IdentifierNode.create)),
|
|
44
44
|
});
|
|
45
45
|
},
|
|
46
46
|
lit(value) {
|
|
47
|
-
return
|
|
47
|
+
return createRawBuilder({
|
|
48
48
|
queryId: createQueryId(),
|
|
49
49
|
rawNode: RawNode.createWithChild(ValueNode.createImmediate(value)),
|
|
50
50
|
});
|
|
@@ -53,7 +53,7 @@ export const sql = Object.assign((sqlFragments, ...parameters) => {
|
|
|
53
53
|
return this.lit(value);
|
|
54
54
|
},
|
|
55
55
|
raw(sql) {
|
|
56
|
-
return
|
|
56
|
+
return createRawBuilder({
|
|
57
57
|
queryId: createQueryId(),
|
|
58
58
|
rawNode: RawNode.createWithSql(sql),
|
|
59
59
|
});
|
|
@@ -67,7 +67,7 @@ export const sql = Object.assign((sqlFragments, ...parameters) => {
|
|
|
67
67
|
nodes[2 * i + 1] = sep;
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
|
-
return
|
|
70
|
+
return createRawBuilder({
|
|
71
71
|
queryId: createQueryId(),
|
|
72
72
|
rawNode: RawNode.createWithChildren(nodes),
|
|
73
73
|
});
|
|
@@ -48,6 +48,10 @@ export declare class AlterTableBuilder implements ColumnAlteringInterface {
|
|
|
48
48
|
* is because you can only add one column per `ALTER TABLE` query.
|
|
49
49
|
*/
|
|
50
50
|
addForeignKeyConstraint(constraintName: string, columns: string[], targetTable: string, targetColumns: string[]): AlterTableAddForeignKeyConstraintBuilder;
|
|
51
|
+
/**
|
|
52
|
+
* See {@link CreateTableBuilder.addPrimaryKeyConstraint}
|
|
53
|
+
*/
|
|
54
|
+
addPrimaryKeyConstraint(constraintName: string, columns: string[]): AlterTableExecutor;
|
|
51
55
|
dropConstraint(constraintName: string): AlterTableDropConstraintBuilder;
|
|
52
56
|
/**
|
|
53
57
|
* Calls the given function passing `this` as the only argument.
|
|
@@ -22,6 +22,7 @@ import { AlterColumnBuilder, } from './alter-column-builder.js';
|
|
|
22
22
|
import { AlterTableExecutor } from './alter-table-executor.js';
|
|
23
23
|
import { AlterTableAddForeignKeyConstraintBuilder } from './alter-table-add-foreign-key-constraint-builder.js';
|
|
24
24
|
import { AlterTableDropConstraintBuilder } from './alter-table-drop-constraint-builder.js';
|
|
25
|
+
import { PrimaryConstraintNode } from '../operation-node/primary-constraint-node.js';
|
|
25
26
|
/**
|
|
26
27
|
* This builder can be used to create a `alter table` query.
|
|
27
28
|
*/
|
|
@@ -114,6 +115,17 @@ export class AlterTableBuilder {
|
|
|
114
115
|
constraintBuilder: new ForeignKeyConstraintBuilder(ForeignKeyConstraintNode.create(columns.map(ColumnNode.create), parseTable(targetTable), targetColumns.map(ColumnNode.create), constraintName)),
|
|
115
116
|
});
|
|
116
117
|
}
|
|
118
|
+
/**
|
|
119
|
+
* See {@link CreateTableBuilder.addPrimaryKeyConstraint}
|
|
120
|
+
*/
|
|
121
|
+
addPrimaryKeyConstraint(constraintName, columns) {
|
|
122
|
+
return new AlterTableExecutor({
|
|
123
|
+
...this.#props,
|
|
124
|
+
node: AlterTableNode.cloneWithTableProps(this.#props.node, {
|
|
125
|
+
addConstraint: AddConstraintNode.create(PrimaryConstraintNode.create(columns, constraintName)),
|
|
126
|
+
}),
|
|
127
|
+
});
|
|
128
|
+
}
|
|
117
129
|
dropConstraint(constraintName) {
|
|
118
130
|
return new AlterTableDropConstraintBuilder({
|
|
119
131
|
...this.#props,
|
|
@@ -133,7 +133,7 @@ export declare class CreateIndexBuilder<C = never> implements OperationNodeSourc
|
|
|
133
133
|
*/
|
|
134
134
|
where(lhs: C | Expression<any>, op: ComparisonOperatorExpression, rhs: unknown): CreateIndexBuilder<C>;
|
|
135
135
|
where(factory: (qb: ExpressionBuilder<ShallowRecord<string, ShallowRecord<C & string, any>>, string>) => Expression<SqlBool>): CreateIndexBuilder<C>;
|
|
136
|
-
where(expression: Expression<
|
|
136
|
+
where(expression: Expression<SqlBool>): CreateIndexBuilder<C>;
|
|
137
137
|
/**
|
|
138
138
|
* Simply calls the provided function passing `this` as the only argument. `$call` returns
|
|
139
139
|
* what the provided function returns.
|
|
@@ -5,7 +5,7 @@ import { parseOrderedColumnName, } from '../parser/reference-parser.js';
|
|
|
5
5
|
import { parseTable } from '../parser/table-parser.js';
|
|
6
6
|
import { preventAwait } from '../util/prevent-await.js';
|
|
7
7
|
import { freeze } from '../util/object-utils.js';
|
|
8
|
-
import {
|
|
8
|
+
import { parseValueBinaryOperationOrExpression, } from '../parser/binary-operation-parser.js';
|
|
9
9
|
import { QueryNode } from '../operation-node/query-node.js';
|
|
10
10
|
import { ImmediateValueTransformer } from '../plugin/immediate-value/immediate-value-transformer.js';
|
|
11
11
|
export class CreateIndexBuilder {
|
|
@@ -148,7 +148,7 @@ export class CreateIndexBuilder {
|
|
|
148
148
|
const transformer = new ImmediateValueTransformer();
|
|
149
149
|
return new CreateIndexBuilder({
|
|
150
150
|
...this.#props,
|
|
151
|
-
node: QueryNode.cloneWithWhere(this.#props.node, transformer.transformNode(
|
|
151
|
+
node: QueryNode.cloneWithWhere(this.#props.node, transformer.transformNode(parseValueBinaryOperationOrExpression(args))),
|
|
152
152
|
});
|
|
153
153
|
}
|
|
154
154
|
/**
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DrainOuterGeneric } from './type-utils.js';
|
|
1
2
|
/**
|
|
2
3
|
* This type can be used to specify a different type for
|
|
3
4
|
* select, insert and update operations.
|
|
@@ -123,9 +124,9 @@ export type UpdateKeys<R> = {
|
|
|
123
124
|
* // }
|
|
124
125
|
* ```
|
|
125
126
|
*/
|
|
126
|
-
export type Selectable<R> = {
|
|
127
|
+
export type Selectable<R> = DrainOuterGeneric<{
|
|
127
128
|
[K in NonNeverSelectKeys<R>]: SelectType<R[K]>;
|
|
128
|
-
}
|
|
129
|
+
}>;
|
|
129
130
|
/**
|
|
130
131
|
* Given a table interface, extracts the insert type from all
|
|
131
132
|
* {@link ColumnType} types.
|
|
@@ -147,11 +148,11 @@ export type Selectable<R> = {
|
|
|
147
148
|
* // }
|
|
148
149
|
* ```
|
|
149
150
|
*/
|
|
150
|
-
export type Insertable<R> = {
|
|
151
|
+
export type Insertable<R> = DrainOuterGeneric<{
|
|
151
152
|
[K in NonNullableInsertKeys<R>]: InsertType<R[K]>;
|
|
152
153
|
} & {
|
|
153
154
|
[K in NullableInsertKeys<R>]?: InsertType<R[K]>;
|
|
154
|
-
}
|
|
155
|
+
}>;
|
|
155
156
|
/**
|
|
156
157
|
* Given a table interface, extracts the update type from all
|
|
157
158
|
* {@link ColumnType} types.
|
|
@@ -172,7 +173,7 @@ export type Insertable<R> = {
|
|
|
172
173
|
* // }
|
|
173
174
|
* ```
|
|
174
175
|
*/
|
|
175
|
-
export type Updateable<R> = {
|
|
176
|
+
export type Updateable<R> = DrainOuterGeneric<{
|
|
176
177
|
[K in UpdateKeys<R>]?: UpdateType<R[K]>;
|
|
177
|
-
}
|
|
178
|
+
}>;
|
|
178
179
|
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/// <reference types="./json-object-args.d.ts" />
|
|
2
|
+
import { ExpressionWrapper } from '../expression/expression-wrapper.js';
|
|
3
|
+
import { AliasNode } from '../operation-node/alias-node.js';
|
|
4
|
+
import { ColumnNode } from '../operation-node/column-node.js';
|
|
5
|
+
import { IdentifierNode } from '../operation-node/identifier-node.js';
|
|
6
|
+
import { ReferenceNode } from '../operation-node/reference-node.js';
|
|
7
|
+
import { TableNode } from '../operation-node/table-node.js';
|
|
8
|
+
import { ValueNode } from '../operation-node/value-node.js';
|
|
9
|
+
export function getJsonObjectArgs(node, table) {
|
|
10
|
+
const args = [];
|
|
11
|
+
for (const { selection: s } of node.selections ?? []) {
|
|
12
|
+
if (ReferenceNode.is(s) && ColumnNode.is(s.column)) {
|
|
13
|
+
args.push(colName(s.column.column.name), colRef(table, s.column.column.name));
|
|
14
|
+
}
|
|
15
|
+
else if (ColumnNode.is(s)) {
|
|
16
|
+
args.push(colName(s.column.name), colRef(table, s.column.name));
|
|
17
|
+
}
|
|
18
|
+
else if (AliasNode.is(s) && IdentifierNode.is(s.alias)) {
|
|
19
|
+
args.push(colName(s.alias.name), colRef(table, s.alias.name));
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
throw new Error(`can't extract column names from the select query node`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return args;
|
|
26
|
+
}
|
|
27
|
+
function colName(col) {
|
|
28
|
+
return new ExpressionWrapper(ValueNode.createImmediate(col));
|
|
29
|
+
}
|
|
30
|
+
function colRef(table, col) {
|
|
31
|
+
return new ExpressionWrapper(ReferenceNode.create(ColumnNode.create(col), TableNode.create(table)));
|
|
32
|
+
}
|
|
@@ -13,6 +13,7 @@ export declare function isBuffer(obj: unknown): obj is {
|
|
|
13
13
|
export declare function isFunction(obj: unknown): obj is Function;
|
|
14
14
|
export declare function isObject(obj: unknown): obj is ShallowRecord<string, unknown>;
|
|
15
15
|
export declare function isArrayBufferOrView(obj: unknown): obj is ArrayBuffer | ArrayBufferView;
|
|
16
|
+
export declare function isPlainObject(obj: unknown): obj is Record<string, unknown>;
|
|
16
17
|
export declare function getLast<T>(arr: ArrayLike<T>): T | undefined;
|
|
17
18
|
export declare function freeze<T>(obj: T): Readonly<T>;
|
|
18
19
|
export declare function asArray<T>(arg: T | T[]): T[];
|
|
@@ -43,6 +43,13 @@ export function isObject(obj) {
|
|
|
43
43
|
export function isArrayBufferOrView(obj) {
|
|
44
44
|
return obj instanceof ArrayBuffer || ArrayBuffer.isView(obj);
|
|
45
45
|
}
|
|
46
|
+
export function isPlainObject(obj) {
|
|
47
|
+
return (isObject(obj) &&
|
|
48
|
+
!Array.isArray(obj) &&
|
|
49
|
+
!isDate(obj) &&
|
|
50
|
+
!isBuffer(obj) &&
|
|
51
|
+
!isArrayBufferOrView(obj));
|
|
52
|
+
}
|
|
46
53
|
export function getLast(arr) {
|
|
47
54
|
return arr[arr.length - 1];
|
|
48
55
|
}
|