kysely 0.24.2 → 0.25.0
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 +30 -13
- package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +2 -1
- package/dist/cjs/dialect/postgres/postgres-introspector.js +4 -1
- package/dist/cjs/driver/runtime-driver.js +6 -6
- package/dist/cjs/dynamic/dynamic.d.ts +1 -1
- package/dist/cjs/dynamic/dynamic.js +1 -1
- package/dist/cjs/expression/expression-builder.d.ts +56 -1
- package/dist/cjs/expression/expression-builder.js +10 -0
- package/dist/cjs/helpers/mysql.d.ts +3 -3
- package/dist/cjs/helpers/mysql.js +2 -2
- package/dist/cjs/helpers/postgres.d.ts +1 -1
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +4 -0
- package/dist/cjs/kysely.d.ts +19 -2
- package/dist/cjs/kysely.js +28 -1
- package/dist/cjs/operation-node/aggregate-function-node.d.ts +3 -7
- package/dist/cjs/operation-node/aggregate-function-node.js +1 -1
- package/dist/cjs/operation-node/alter-column-node.d.ts +1 -2
- package/dist/cjs/operation-node/alter-table-node.d.ts +1 -1
- package/dist/cjs/operation-node/alter-table-node.js +1 -2
- package/dist/cjs/operation-node/case-node.d.ts +19 -0
- package/dist/cjs/operation-node/case-node.js +42 -0
- package/dist/cjs/operation-node/create-index-node.d.ts +2 -1
- package/dist/cjs/operation-node/create-index-node.js +6 -0
- package/dist/cjs/operation-node/data-type-node.d.ts +1 -1
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +20 -2
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +2 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/when-node.d.ts +14 -0
- package/dist/cjs/operation-node/when-node.js +24 -0
- package/dist/cjs/parser/binary-operation-parser.d.ts +1 -0
- package/dist/cjs/parser/binary-operation-parser.js +18 -2
- package/dist/cjs/parser/expression-parser.d.ts +2 -1
- package/dist/cjs/parser/order-by-parser.d.ts +1 -0
- package/dist/cjs/parser/order-by-parser.js +5 -1
- package/dist/cjs/parser/reference-parser.d.ts +6 -2
- package/dist/cjs/parser/reference-parser.js +16 -1
- package/dist/cjs/parser/select-parser.d.ts +4 -4
- package/dist/cjs/parser/table-parser.d.ts +5 -4
- package/dist/cjs/parser/with-parser.d.ts +4 -3
- package/dist/cjs/query-builder/case-builder.d.ts +111 -0
- package/dist/cjs/query-builder/case-builder.js +75 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +55 -13
- package/dist/cjs/query-builder/delete-query-builder.js +44 -0
- package/dist/cjs/query-builder/function-module.d.ts +36 -5
- package/dist/cjs/query-builder/function-module.js +12 -16
- package/dist/cjs/query-builder/insert-query-builder.d.ts +44 -3
- package/dist/cjs/query-builder/insert-query-builder.js +49 -1
- package/dist/cjs/query-builder/select-query-builder.d.ts +54 -13
- package/dist/cjs/query-builder/select-query-builder.js +43 -0
- package/dist/cjs/query-builder/update-query-builder.d.ts +65 -20
- package/dist/cjs/query-builder/update-query-builder.js +47 -0
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +4 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +30 -3
- package/dist/cjs/schema/alter-column-builder.d.ts +2 -2
- package/dist/cjs/schema/alter-column-builder.js +2 -2
- package/dist/cjs/schema/create-index-builder.d.ts +49 -7
- package/dist/cjs/schema/create-index-builder.js +51 -13
- package/dist/cjs/schema/schema.js +1 -1
- package/dist/cjs/util/column-type.d.ts +3 -2
- package/dist/cjs/util/log.d.ts +3 -3
- package/dist/cjs/util/log.js +4 -4
- package/dist/cjs/util/object-utils.d.ts +2 -1
- package/dist/cjs/util/type-utils.d.ts +43 -29
- package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +2 -1
- package/dist/esm/dialect/postgres/postgres-introspector.js +4 -1
- package/dist/esm/driver/runtime-driver.js +6 -6
- package/dist/esm/dynamic/dynamic.d.ts +1 -1
- package/dist/esm/dynamic/dynamic.js +1 -1
- package/dist/esm/expression/expression-builder.d.ts +56 -1
- package/dist/esm/expression/expression-builder.js +11 -1
- package/dist/esm/helpers/mysql.d.ts +3 -3
- package/dist/esm/helpers/mysql.js +2 -2
- package/dist/esm/helpers/postgres.d.ts +1 -1
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/kysely.d.ts +19 -2
- package/dist/esm/kysely.js +29 -2
- package/dist/esm/operation-node/aggregate-function-node.d.ts +3 -7
- package/dist/esm/operation-node/aggregate-function-node.js +1 -1
- package/dist/esm/operation-node/alter-column-node.d.ts +1 -2
- package/dist/esm/operation-node/alter-table-node.d.ts +1 -1
- package/dist/esm/operation-node/alter-table-node.js +1 -2
- package/dist/esm/operation-node/case-node.d.ts +19 -0
- package/dist/esm/operation-node/case-node.js +40 -0
- package/dist/esm/operation-node/create-index-node.d.ts +2 -1
- package/dist/esm/operation-node/create-index-node.js +6 -0
- package/dist/esm/operation-node/data-type-node.d.ts +1 -1
- package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -0
- package/dist/esm/operation-node/operation-node-transformer.js +20 -2
- package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -0
- package/dist/esm/operation-node/operation-node-visitor.js +2 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/when-node.d.ts +14 -0
- package/dist/esm/operation-node/when-node.js +22 -0
- package/dist/esm/parser/binary-operation-parser.d.ts +1 -0
- package/dist/esm/parser/binary-operation-parser.js +16 -1
- package/dist/esm/parser/expression-parser.d.ts +2 -1
- package/dist/esm/parser/order-by-parser.d.ts +1 -0
- package/dist/esm/parser/order-by-parser.js +3 -0
- package/dist/esm/parser/reference-parser.d.ts +6 -2
- package/dist/esm/parser/reference-parser.js +14 -0
- package/dist/esm/parser/select-parser.d.ts +4 -4
- package/dist/esm/parser/table-parser.d.ts +5 -4
- package/dist/esm/parser/with-parser.d.ts +4 -3
- package/dist/esm/query-builder/case-builder.d.ts +111 -0
- package/dist/esm/query-builder/case-builder.js +69 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +55 -13
- package/dist/esm/query-builder/delete-query-builder.js +44 -0
- package/dist/esm/query-builder/function-module.d.ts +36 -5
- package/dist/esm/query-builder/function-module.js +13 -17
- package/dist/esm/query-builder/insert-query-builder.d.ts +44 -3
- package/dist/esm/query-builder/insert-query-builder.js +49 -1
- package/dist/esm/query-builder/select-query-builder.d.ts +54 -13
- package/dist/esm/query-builder/select-query-builder.js +43 -0
- package/dist/esm/query-builder/update-query-builder.d.ts +65 -20
- package/dist/esm/query-builder/update-query-builder.js +47 -0
- package/dist/esm/query-compiler/default-query-compiler.d.ts +4 -0
- package/dist/esm/query-compiler/default-query-compiler.js +30 -3
- package/dist/esm/schema/alter-column-builder.d.ts +2 -2
- package/dist/esm/schema/alter-column-builder.js +2 -2
- package/dist/esm/schema/create-index-builder.d.ts +49 -7
- package/dist/esm/schema/create-index-builder.js +52 -14
- package/dist/esm/schema/schema.js +1 -1
- package/dist/esm/util/column-type.d.ts +3 -2
- package/dist/esm/util/log.d.ts +3 -3
- package/dist/esm/util/log.js +4 -4
- package/dist/esm/util/object-utils.d.ts +2 -1
- package/dist/esm/util/type-utils.d.ts +43 -29
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
[](https://stand-with-ukraine.pp.ua)
|
|
2
2
|
|
|
3
|
-
[](https://discord.gg/xyBJ3GwvAm)
|
|
3
|
+
[](https://discord.gg/xyBJ3GwvAm)
|
|
4
4
|
[](https://github.com/koskimas/kysely)
|
|
5
|
+
[](https://github.com/kysely-org/kysely/blob/master/LICENSE)
|
|
6
|
+
[](https://github.com/kysely-org/kysely/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc)
|
|
7
|
+
[](https://github.com/kysely-org/kysely/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc)
|
|
8
|
+
[](https://snyk.io/advisor/npm-package/kysely)
|
|
9
|
+
[](https://www.npmjs.com/package/kysely)
|
|
10
|
+
[](https://bundlephobia.com/package/kysely)
|
|
11
|
+
[](https://twitter.com/kysely_)
|
|
5
12
|
|
|
6
13
|
# [Kysely](https://kysely-org.github.io/kysely/index.html)
|
|
7
14
|
|
|
@@ -73,14 +80,16 @@ for [3rd party dialects](https://kysely-org.github.io/kysely/interfaces/Dialect.
|
|
|
73
80
|
|
|
74
81
|
### 3rd party dialects
|
|
75
82
|
|
|
76
|
-
- [AWS Data API](https://github.com/serverless-stack/kysely-data-api)
|
|
77
83
|
- [PlanetScale Serverless Driver](https://github.com/depot/kysely-planetscale)
|
|
78
|
-
- [
|
|
79
|
-
- [
|
|
84
|
+
- [Cloudflare D1](https://github.com/aidenwallis/kysely-d1)
|
|
85
|
+
- [AWS RDS Data API](https://github.com/serverless-stack/kysely-data-api)
|
|
80
86
|
- [SurrealDB](https://github.com/igalklebanov/kysely-surrealdb)
|
|
81
|
-
- [sqld](https://github.com/libsql/kysely-libsql)
|
|
82
87
|
- [Neon](https://github.com/seveibar/kysely-neon)
|
|
83
88
|
- [AWS S3 Select](https://github.com/igalklebanov/kysely-s3-select)
|
|
89
|
+
- [libSQL/sqld](https://github.com/libsql/kysely-libsql)
|
|
90
|
+
- [SingleStore Data API](https://github.com/igalklebanov/kysely-singlestore)
|
|
91
|
+
- [Postgres.js](https://github.com/igalklebanov/kysely-postgres-js)
|
|
92
|
+
- [Fetch driver](https://github.com/andersgee/kysely-fetch-driver)
|
|
84
93
|
|
|
85
94
|
# Minimal example
|
|
86
95
|
|
|
@@ -186,7 +195,7 @@ type UpdateablePerson = Updateable<PersonTable>
|
|
|
186
195
|
|
|
187
196
|
# Playground
|
|
188
197
|
|
|
189
|
-
[@wirekang](https://github.com/wirekang) has created a [playground for Kysely](https://
|
|
198
|
+
[@wirekang](https://github.com/wirekang) has created a [playground for Kysely](https://kyse.link). You can use to quickly test stuff out and for creating code examples for your issues, PRs and discord messages.
|
|
190
199
|
|
|
191
200
|
# Generating types
|
|
192
201
|
|
|
@@ -587,10 +596,18 @@ that aren't possible at this point of the project. Knex was also originally writ
|
|
|
587
596
|
the typescript typings were added afterwards. That always leads to compromises in the types. Designing
|
|
588
597
|
a library for typescript from the ground up produces much better and simpler types.
|
|
589
598
|
|
|
590
|
-
#
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
599
|
+
# Contributors
|
|
600
|
+
|
|
601
|
+
<p align="center">
|
|
602
|
+
<a href="https://github.com/kysely-org/kysely/graphs/contributors">
|
|
603
|
+
<img src="https://contrib.rocks/image?repo=kysely-org/kysely" />
|
|
604
|
+
</a>
|
|
605
|
+
</br>
|
|
606
|
+
<span>Want to contribute? Check out our <a href="./CONTRIBUTING.md" >contribution guidelines</a>.</span>
|
|
607
|
+
</p>
|
|
608
|
+
|
|
609
|
+
<p align="center">
|
|
610
|
+
<a href="https://vercel.com/?utm_source=kysely&utm_campaign=oss">
|
|
611
|
+
<img src="https://kysely.dev/img/powered-by-vercel.svg" alt="Powered by Vercel" />
|
|
612
|
+
</a>
|
|
613
|
+
</p>
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DatabaseConnection } from '../../driver/database-connection.js';
|
|
2
|
+
import { ShallowRecord } from '../../util/type-utils.js';
|
|
2
3
|
/**
|
|
3
4
|
* Config for the MySQL dialect.
|
|
4
5
|
*
|
|
@@ -48,4 +49,4 @@ export interface MysqlOkPacket {
|
|
|
48
49
|
affectedRows: number;
|
|
49
50
|
insertId: number;
|
|
50
51
|
}
|
|
51
|
-
export declare type MysqlQueryResult = MysqlOkPacket |
|
|
52
|
+
export declare type MysqlQueryResult = MysqlOkPacket | ShallowRecord<string, unknown>[];
|
|
@@ -50,7 +50,10 @@ class PostgresIntrospector {
|
|
|
50
50
|
.as('auto_incrementing'),
|
|
51
51
|
])
|
|
52
52
|
// r == normal table
|
|
53
|
-
.where(
|
|
53
|
+
.where(({ cmpr, or }) => or([
|
|
54
|
+
cmpr('c.relkind', '=', 'r'),
|
|
55
|
+
cmpr('c.relkind', '=', 'v'),
|
|
56
|
+
]))
|
|
54
57
|
.where('ns.nspname', '!~', '^pg_')
|
|
55
58
|
.where('ns.nspname', '!=', 'information_schema')
|
|
56
59
|
// No system columns
|
|
@@ -76,24 +76,24 @@ class RuntimeDriver {
|
|
|
76
76
|
return await executeQuery.call(connection, compiledQuery);
|
|
77
77
|
}
|
|
78
78
|
catch (error) {
|
|
79
|
-
this.#logError(error, compiledQuery, startTime);
|
|
79
|
+
await this.#logError(error, compiledQuery, startTime);
|
|
80
80
|
throw error;
|
|
81
81
|
}
|
|
82
82
|
finally {
|
|
83
|
-
this.#logQuery(compiledQuery, startTime);
|
|
83
|
+
await this.#logQuery(compiledQuery, startTime);
|
|
84
84
|
}
|
|
85
85
|
};
|
|
86
86
|
}
|
|
87
|
-
#logError(error, compiledQuery, startTime) {
|
|
88
|
-
this.#log.error(() => ({
|
|
87
|
+
async #logError(error, compiledQuery, startTime) {
|
|
88
|
+
await this.#log.error(() => ({
|
|
89
89
|
level: 'error',
|
|
90
90
|
error,
|
|
91
91
|
query: compiledQuery,
|
|
92
92
|
queryDurationMillis: this.#calculateDurationMillis(startTime),
|
|
93
93
|
}));
|
|
94
94
|
}
|
|
95
|
-
#logQuery(compiledQuery, startTime) {
|
|
96
|
-
this.#log.query(() => ({
|
|
95
|
+
async #logQuery(compiledQuery, startTime) {
|
|
96
|
+
await this.#log.query(() => ({
|
|
97
97
|
level: 'query',
|
|
98
98
|
query: compiledQuery,
|
|
99
99
|
queryDurationMillis: this.#calculateDurationMillis(startTime),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
|
|
2
2
|
import { TableExpression, From, FromTables, ExtractTableAlias, AnyAliasedTable, PickTableWithAlias } from '../parser/table-parser.js';
|
|
3
3
|
import { FunctionModule } from '../query-builder/function-module.js';
|
|
4
|
-
import { ExtractTypeFromReferenceExpression, ReferenceExpression, StringReference } from '../parser/reference-parser.js';
|
|
4
|
+
import { ExtractTypeFromReferenceExpression, ReferenceExpression, SimpleReferenceExpression, StringReference } from '../parser/reference-parser.js';
|
|
5
5
|
import { QueryExecutor } from '../query-executor/query-executor.js';
|
|
6
6
|
import { BinaryOperatorExpression, ComparisonOperatorExpression, OperandValueExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
|
|
7
7
|
import { Expression } from './expression.js';
|
|
@@ -9,6 +9,7 @@ import { ExpressionWrapper } from './expression-wrapper.js';
|
|
|
9
9
|
import { ComparisonOperator, UnaryOperator } from '../operation-node/operator-node.js';
|
|
10
10
|
import { SqlBool } from '../util/type-utils.js';
|
|
11
11
|
import { ExtractTypeFromValueExpressionOrList } from '../parser/value-parser.js';
|
|
12
|
+
import { CaseBuilder } from '../query-builder/case-builder.js';
|
|
12
13
|
export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
13
14
|
/**
|
|
14
15
|
* Returns a {@link FunctionModule} that can be used to write type safe function
|
|
@@ -91,6 +92,60 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
|
|
|
91
92
|
selectFrom<TE extends keyof DB & string>(from: TE): SelectQueryBuilder<DB, TB | ExtractTableAlias<DB, TE>, {}>;
|
|
92
93
|
selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, TB | ExtractTableAlias<DB, TE>, {}>;
|
|
93
94
|
selectFrom<TE extends TableExpression<DB, TB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
|
|
95
|
+
/**
|
|
96
|
+
* Creates a `case` statement/operator.
|
|
97
|
+
*
|
|
98
|
+
* ### Examples
|
|
99
|
+
*
|
|
100
|
+
* Kitchen sink example with 2 flavors of `case` operator:
|
|
101
|
+
*
|
|
102
|
+
* ```ts
|
|
103
|
+
* import { sql } from 'kysely'
|
|
104
|
+
*
|
|
105
|
+
* const { title, name } = await db
|
|
106
|
+
* .selectFrom('person')
|
|
107
|
+
* .where('id', '=', '123')
|
|
108
|
+
* .select((eb) => [
|
|
109
|
+
* eb.fn.coalesce('last_name', 'first_name').as('name'),
|
|
110
|
+
* eb
|
|
111
|
+
* .case()
|
|
112
|
+
* .when('gender', '=', 'male')
|
|
113
|
+
* .then('Mr.')
|
|
114
|
+
* .when('gender', '=', 'female')
|
|
115
|
+
* .then(
|
|
116
|
+
* eb
|
|
117
|
+
* .case('martialStatus')
|
|
118
|
+
* .when('single')
|
|
119
|
+
* .then('Ms.')
|
|
120
|
+
* .else('Mrs.')
|
|
121
|
+
* .end()
|
|
122
|
+
* )
|
|
123
|
+
* .end()
|
|
124
|
+
* .as('title'),
|
|
125
|
+
* ])
|
|
126
|
+
* .executeTakeFirstOrThrow()
|
|
127
|
+
* ```
|
|
128
|
+
*
|
|
129
|
+
* The generated SQL (PostgreSQL):
|
|
130
|
+
*
|
|
131
|
+
* ```sql
|
|
132
|
+
* select
|
|
133
|
+
* coalesce("last_name", "first_name") as "name",
|
|
134
|
+
* case
|
|
135
|
+
* when "gender" = $1 then $2
|
|
136
|
+
* when "gender" = $3 then
|
|
137
|
+
* case "martialStatus"
|
|
138
|
+
* when $4 then $5
|
|
139
|
+
* else $6
|
|
140
|
+
* end
|
|
141
|
+
* end as "title"
|
|
142
|
+
* from "person"
|
|
143
|
+
* where "id" = $7
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
case(): CaseBuilder<DB, TB>;
|
|
147
|
+
case<C extends SimpleReferenceExpression<DB, TB>>(column: C): CaseBuilder<DB, TB, ExtractTypeFromReferenceExpression<DB, TB, C>>;
|
|
148
|
+
case<O>(expression: Expression<O>): CaseBuilder<DB, TB, O>;
|
|
94
149
|
/**
|
|
95
150
|
* This can be used to reference columns.
|
|
96
151
|
*
|
|
@@ -17,6 +17,9 @@ const unary_operation_parser_js_1 = require("../parser/unary-operation-parser.js
|
|
|
17
17
|
const value_parser_js_1 = require("../parser/value-parser.js");
|
|
18
18
|
const noop_query_executor_js_1 = require("../query-executor/noop-query-executor.js");
|
|
19
19
|
const value_node_js_1 = require("../operation-node/value-node.js");
|
|
20
|
+
const case_builder_js_1 = require("../query-builder/case-builder.js");
|
|
21
|
+
const case_node_js_1 = require("../operation-node/case-node.js");
|
|
22
|
+
const object_utils_js_1 = require("../util/object-utils.js");
|
|
20
23
|
function createExpressionBuilder(executor = noop_query_executor_js_1.NOOP_QUERY_EXECUTOR) {
|
|
21
24
|
function unary(op, expr) {
|
|
22
25
|
return new expression_wrapper_js_1.ExpressionWrapper((0, unary_operation_parser_js_1.parseUnaryOperation)(op, expr));
|
|
@@ -32,6 +35,13 @@ function createExpressionBuilder(executor = noop_query_executor_js_1.NOOP_QUERY_
|
|
|
32
35
|
queryNode: select_query_node_js_1.SelectQueryNode.create((0, table_parser_js_1.parseTableExpressionOrList)(table)),
|
|
33
36
|
});
|
|
34
37
|
},
|
|
38
|
+
case(reference) {
|
|
39
|
+
return new case_builder_js_1.CaseBuilder({
|
|
40
|
+
node: case_node_js_1.CaseNode.create((0, object_utils_js_1.isUndefined)(reference)
|
|
41
|
+
? undefined
|
|
42
|
+
: (0, reference_parser_js_1.parseReferenceExpression)(reference)),
|
|
43
|
+
});
|
|
44
|
+
},
|
|
35
45
|
ref(reference) {
|
|
36
46
|
return new expression_wrapper_js_1.ExpressionWrapper((0, reference_parser_js_1.parseStringReference)(reference));
|
|
37
47
|
},
|
|
@@ -3,7 +3,7 @@ import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
|
|
|
3
3
|
import { RawBuilder } from '../raw-builder/raw-builder.js';
|
|
4
4
|
import { Simplify } from '../util/type-utils.js';
|
|
5
5
|
/**
|
|
6
|
-
* A MySQL helper for aggregating a subquery
|
|
6
|
+
* A MySQL helper for aggregating a subquery into a JSON array.
|
|
7
7
|
*
|
|
8
8
|
* NOTE: This helper is only guaranteed to fully work with the built-in `MysqlDialect`.
|
|
9
9
|
* While the produced SQL is compatibe with all MySQL databases, some 3rd party dialects
|
|
@@ -49,7 +49,7 @@ import { Simplify } from '../util/type-utils.js';
|
|
|
49
49
|
*/
|
|
50
50
|
export declare function jsonArrayFrom<O>(expr: SelectQueryBuilder<any, any, O>): RawBuilder<Simplify<O>[]>;
|
|
51
51
|
/**
|
|
52
|
-
* A MySQL helper for turning a subquery
|
|
52
|
+
* A MySQL helper for turning a subquery into a JSON object.
|
|
53
53
|
*
|
|
54
54
|
* The subquery must only return one row.
|
|
55
55
|
*
|
|
@@ -95,7 +95,7 @@ export declare function jsonArrayFrom<O>(expr: SelectQueryBuilder<any, any, O>):
|
|
|
95
95
|
* from `person`
|
|
96
96
|
* ```
|
|
97
97
|
*/
|
|
98
|
-
export declare function jsonObjectFrom<O>(expr: SelectQueryBuilder<any, any, O>): RawBuilder<Simplify<O
|
|
98
|
+
export declare function jsonObjectFrom<O>(expr: SelectQueryBuilder<any, any, O>): RawBuilder<Simplify<O> | null>;
|
|
99
99
|
/**
|
|
100
100
|
* The MySQL `json_object` function.
|
|
101
101
|
*
|
|
@@ -7,7 +7,7 @@ const identifier_node_js_1 = require("../operation-node/identifier-node.js");
|
|
|
7
7
|
const reference_node_js_1 = require("../operation-node/reference-node.js");
|
|
8
8
|
const sql_js_1 = require("../raw-builder/sql.js");
|
|
9
9
|
/**
|
|
10
|
-
* A MySQL helper for aggregating a subquery
|
|
10
|
+
* A MySQL helper for aggregating a subquery into a JSON array.
|
|
11
11
|
*
|
|
12
12
|
* NOTE: This helper is only guaranteed to fully work with the built-in `MysqlDialect`.
|
|
13
13
|
* While the produced SQL is compatibe with all MySQL databases, some 3rd party dialects
|
|
@@ -56,7 +56,7 @@ function jsonArrayFrom(expr) {
|
|
|
56
56
|
}
|
|
57
57
|
exports.jsonArrayFrom = jsonArrayFrom;
|
|
58
58
|
/**
|
|
59
|
-
* A MySQL helper for turning a subquery
|
|
59
|
+
* A MySQL helper for turning a subquery into a JSON object.
|
|
60
60
|
*
|
|
61
61
|
* The subquery must only return one row.
|
|
62
62
|
*
|
|
@@ -88,7 +88,7 @@ export declare function jsonArrayFrom<O>(expr: Expression<O>): RawBuilder<Simpli
|
|
|
88
88
|
* from "person"
|
|
89
89
|
* ```
|
|
90
90
|
*/
|
|
91
|
-
export declare function jsonObjectFrom<O>(expr: Expression<O>): RawBuilder<Simplify<O
|
|
91
|
+
export declare function jsonObjectFrom<O>(expr: Expression<O>): RawBuilder<Simplify<O> | null>;
|
|
92
92
|
/**
|
|
93
93
|
* The PostgreSQL `json_build_object` function.
|
|
94
94
|
*
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export * from './kysely.js';
|
|
|
2
2
|
export * from './query-creator.js';
|
|
3
3
|
export * from './expression/expression.js';
|
|
4
4
|
export { ExpressionBuilder, expressionBuilder, } from './expression/expression-builder.js';
|
|
5
|
+
export * from './expression/expression-wrapper.js';
|
|
5
6
|
export * from './query-builder/where-interface.js';
|
|
6
7
|
export * from './query-builder/returning-interface.js';
|
|
7
8
|
export * from './query-builder/having-interface.js';
|
|
@@ -17,6 +18,7 @@ export * from './query-builder/delete-result.js';
|
|
|
17
18
|
export * from './query-builder/update-result.js';
|
|
18
19
|
export * from './query-builder/on-conflict-builder.js';
|
|
19
20
|
export * from './query-builder/aggregate-function-builder.js';
|
|
21
|
+
export * from './query-builder/case-builder.js';
|
|
20
22
|
export * from './raw-builder/raw-builder.js';
|
|
21
23
|
export * from './raw-builder/sql.js';
|
|
22
24
|
export * from './query-executor/query-executor.js';
|
|
@@ -83,6 +85,7 @@ export * from './operation-node/alias-node.js';
|
|
|
83
85
|
export * from './operation-node/alter-column-node.js';
|
|
84
86
|
export * from './operation-node/alter-table-node.js';
|
|
85
87
|
export * from './operation-node/and-node.js';
|
|
88
|
+
export * from './operation-node/case-node.js';
|
|
86
89
|
export * from './operation-node/check-constraint-node.js';
|
|
87
90
|
export * from './operation-node/column-definition-node.js';
|
|
88
91
|
export * from './operation-node/column-node.js';
|
|
@@ -148,6 +151,7 @@ export * from './operation-node/update-query-node.js';
|
|
|
148
151
|
export * from './operation-node/value-list-node.js';
|
|
149
152
|
export * from './operation-node/value-node.js';
|
|
150
153
|
export * from './operation-node/values-node.js';
|
|
154
|
+
export * from './operation-node/when-node.js';
|
|
151
155
|
export * from './operation-node/where-node.js';
|
|
152
156
|
export * from './operation-node/with-node.js';
|
|
153
157
|
export * from './operation-node/explain-node.js';
|
package/dist/cjs/index.js
CHANGED
|
@@ -20,6 +20,7 @@ __exportStar(require("./query-creator.js"), exports);
|
|
|
20
20
|
__exportStar(require("./expression/expression.js"), exports);
|
|
21
21
|
var expression_builder_js_1 = require("./expression/expression-builder.js");
|
|
22
22
|
Object.defineProperty(exports, "expressionBuilder", { enumerable: true, get: function () { return expression_builder_js_1.expressionBuilder; } });
|
|
23
|
+
__exportStar(require("./expression/expression-wrapper.js"), exports);
|
|
23
24
|
__exportStar(require("./query-builder/where-interface.js"), exports);
|
|
24
25
|
__exportStar(require("./query-builder/returning-interface.js"), exports);
|
|
25
26
|
__exportStar(require("./query-builder/having-interface.js"), exports);
|
|
@@ -35,6 +36,7 @@ __exportStar(require("./query-builder/delete-result.js"), exports);
|
|
|
35
36
|
__exportStar(require("./query-builder/update-result.js"), exports);
|
|
36
37
|
__exportStar(require("./query-builder/on-conflict-builder.js"), exports);
|
|
37
38
|
__exportStar(require("./query-builder/aggregate-function-builder.js"), exports);
|
|
39
|
+
__exportStar(require("./query-builder/case-builder.js"), exports);
|
|
38
40
|
__exportStar(require("./raw-builder/raw-builder.js"), exports);
|
|
39
41
|
__exportStar(require("./raw-builder/sql.js"), exports);
|
|
40
42
|
__exportStar(require("./query-executor/query-executor.js"), exports);
|
|
@@ -101,6 +103,7 @@ __exportStar(require("./operation-node/alias-node.js"), exports);
|
|
|
101
103
|
__exportStar(require("./operation-node/alter-column-node.js"), exports);
|
|
102
104
|
__exportStar(require("./operation-node/alter-table-node.js"), exports);
|
|
103
105
|
__exportStar(require("./operation-node/and-node.js"), exports);
|
|
106
|
+
__exportStar(require("./operation-node/case-node.js"), exports);
|
|
104
107
|
__exportStar(require("./operation-node/check-constraint-node.js"), exports);
|
|
105
108
|
__exportStar(require("./operation-node/column-definition-node.js"), exports);
|
|
106
109
|
__exportStar(require("./operation-node/column-node.js"), exports);
|
|
@@ -166,6 +169,7 @@ __exportStar(require("./operation-node/update-query-node.js"), exports);
|
|
|
166
169
|
__exportStar(require("./operation-node/value-list-node.js"), exports);
|
|
167
170
|
__exportStar(require("./operation-node/value-node.js"), exports);
|
|
168
171
|
__exportStar(require("./operation-node/values-node.js"), exports);
|
|
172
|
+
__exportStar(require("./operation-node/when-node.js"), exports);
|
|
169
173
|
__exportStar(require("./operation-node/where-node.js"), exports);
|
|
170
174
|
__exportStar(require("./operation-node/with-node.js"), exports);
|
|
171
175
|
__exportStar(require("./operation-node/explain-node.js"), exports);
|
package/dist/cjs/kysely.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ import { QueryResult } from './driver/database-connection.js';
|
|
|
13
13
|
import { CompiledQuery } from './query-compiler/compiled-query.js';
|
|
14
14
|
import { QueryId } from './util/query-id.js';
|
|
15
15
|
import { Compilable } from './util/compilable.js';
|
|
16
|
+
import { CaseBuilder } from './query-builder/case-builder.js';
|
|
17
|
+
import { Expression } from './expression/expression.js';
|
|
16
18
|
/**
|
|
17
19
|
* The main Kysely class.
|
|
18
20
|
*
|
|
@@ -75,6 +77,13 @@ export declare class Kysely<DB> extends QueryCreator<DB> implements QueryExecuto
|
|
|
75
77
|
* Returns a {@link DatabaseIntrospector | database introspector}.
|
|
76
78
|
*/
|
|
77
79
|
get introspection(): DatabaseIntrospector;
|
|
80
|
+
/**
|
|
81
|
+
* Creates a `case` statement/operator.
|
|
82
|
+
*
|
|
83
|
+
* See {@link ExpressionBuilder.case} for more information.
|
|
84
|
+
*/
|
|
85
|
+
case(): CaseBuilder<DB, keyof DB>;
|
|
86
|
+
case<V>(value: Expression<V>): CaseBuilder<DB, keyof DB, V>;
|
|
78
87
|
/**
|
|
79
88
|
* Returns a {@link FunctionModule} that can be used to write type safe function
|
|
80
89
|
* calls.
|
|
@@ -138,7 +147,7 @@ export declare class Kysely<DB> extends QueryCreator<DB> implements QueryExecuto
|
|
|
138
147
|
* name: 'Catto',
|
|
139
148
|
* species: 'cat'
|
|
140
149
|
* })
|
|
141
|
-
* .
|
|
150
|
+
* .returningAll()
|
|
142
151
|
* .executeTakeFirst()
|
|
143
152
|
* })
|
|
144
153
|
* ```
|
|
@@ -180,6 +189,10 @@ export declare class Kysely<DB> extends QueryCreator<DB> implements QueryExecuto
|
|
|
180
189
|
* Returns a copy of this Kysely instance without any plugins.
|
|
181
190
|
*/
|
|
182
191
|
withoutPlugins(): Kysely<DB>;
|
|
192
|
+
/**
|
|
193
|
+
* @override
|
|
194
|
+
*/
|
|
195
|
+
withSchema(schema: string): Kysely<DB>;
|
|
183
196
|
/**
|
|
184
197
|
* Returns a copy of this Kysely instance with tables added to its
|
|
185
198
|
* database type.
|
|
@@ -279,7 +292,7 @@ export declare class Transaction<DB> extends Kysely<DB> {
|
|
|
279
292
|
* name: 'Catto',
|
|
280
293
|
* species: 'cat'
|
|
281
294
|
* })
|
|
282
|
-
* .
|
|
295
|
+
* .returningAll()
|
|
283
296
|
* .executeTakeFirst()
|
|
284
297
|
* })
|
|
285
298
|
* ```
|
|
@@ -327,6 +340,10 @@ export declare class Transaction<DB> extends Kysely<DB> {
|
|
|
327
340
|
* Returns a copy of this Kysely instance without any plugins.
|
|
328
341
|
*/
|
|
329
342
|
withoutPlugins(): Transaction<DB>;
|
|
343
|
+
/**
|
|
344
|
+
* @override
|
|
345
|
+
*/
|
|
346
|
+
withSchema(schema: string): Transaction<DB>;
|
|
330
347
|
/**
|
|
331
348
|
* Returns a copy of this Kysely instance with tables added to its
|
|
332
349
|
* database type.
|
package/dist/cjs/kysely.js
CHANGED
|
@@ -15,6 +15,10 @@ const function_module_js_1 = require("./query-builder/function-module.js");
|
|
|
15
15
|
const log_js_1 = require("./util/log.js");
|
|
16
16
|
const query_id_js_1 = require("./util/query-id.js");
|
|
17
17
|
const compilable_js_1 = require("./util/compilable.js");
|
|
18
|
+
const case_builder_js_1 = require("./query-builder/case-builder.js");
|
|
19
|
+
const case_node_js_1 = require("./operation-node/case-node.js");
|
|
20
|
+
const expression_parser_js_1 = require("./parser/expression-parser.js");
|
|
21
|
+
const with_schema_plugin_js_1 = require("./plugin/with-schema/with-schema-plugin.js");
|
|
18
22
|
/**
|
|
19
23
|
* The main Kysely class.
|
|
20
24
|
*
|
|
@@ -108,6 +112,11 @@ class Kysely extends query_creator_js_1.QueryCreator {
|
|
|
108
112
|
get introspection() {
|
|
109
113
|
return this.#props.dialect.createIntrospector(this.withoutPlugins());
|
|
110
114
|
}
|
|
115
|
+
case(value) {
|
|
116
|
+
return new case_builder_js_1.CaseBuilder({
|
|
117
|
+
node: case_node_js_1.CaseNode.create((0, object_utils_js_1.isUndefined)(value) ? undefined : (0, expression_parser_js_1.parseExpression)(value)),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
111
120
|
/**
|
|
112
121
|
* Returns a {@link FunctionModule} that can be used to write type safe function
|
|
113
122
|
* calls.
|
|
@@ -173,7 +182,7 @@ class Kysely extends query_creator_js_1.QueryCreator {
|
|
|
173
182
|
* name: 'Catto',
|
|
174
183
|
* species: 'cat'
|
|
175
184
|
* })
|
|
176
|
-
* .
|
|
185
|
+
* .returningAll()
|
|
177
186
|
* .executeTakeFirst()
|
|
178
187
|
* })
|
|
179
188
|
* ```
|
|
@@ -229,6 +238,15 @@ class Kysely extends query_creator_js_1.QueryCreator {
|
|
|
229
238
|
executor: this.#props.executor.withoutPlugins(),
|
|
230
239
|
});
|
|
231
240
|
}
|
|
241
|
+
/**
|
|
242
|
+
* @override
|
|
243
|
+
*/
|
|
244
|
+
withSchema(schema) {
|
|
245
|
+
return new Kysely({
|
|
246
|
+
...this.#props,
|
|
247
|
+
executor: this.#props.executor.withPluginAtFront(new with_schema_plugin_js_1.WithSchemaPlugin(schema)),
|
|
248
|
+
});
|
|
249
|
+
}
|
|
232
250
|
/**
|
|
233
251
|
* Returns a copy of this Kysely instance with tables added to its
|
|
234
252
|
* database type.
|
|
@@ -330,6 +348,15 @@ class Transaction extends Kysely {
|
|
|
330
348
|
executor: this.#props.executor.withoutPlugins(),
|
|
331
349
|
});
|
|
332
350
|
}
|
|
351
|
+
/**
|
|
352
|
+
* @override
|
|
353
|
+
*/
|
|
354
|
+
withSchema(schema) {
|
|
355
|
+
return new Transaction({
|
|
356
|
+
...this.#props,
|
|
357
|
+
executor: this.#props.executor.withPluginAtFront(new with_schema_plugin_js_1.WithSchemaPlugin(schema)),
|
|
358
|
+
});
|
|
359
|
+
}
|
|
333
360
|
withTables() {
|
|
334
361
|
return new Transaction({ ...this.#props });
|
|
335
362
|
}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import { OperationNode } from './operation-node.js';
|
|
2
2
|
import { OverNode } from './over-node.js';
|
|
3
|
-
import { SelectionNode } from './selection-node.js';
|
|
4
|
-
import { SimpleReferenceExpressionNode } from './simple-reference-expression-node.js';
|
|
5
3
|
import { WhereNode } from './where-node.js';
|
|
6
|
-
declare type AggregateFunction = 'avg' | 'count' | 'max' | 'min' | 'sum';
|
|
7
4
|
export interface AggregateFunctionNode extends OperationNode {
|
|
8
5
|
readonly kind: 'AggregateFunctionNode';
|
|
9
|
-
readonly func:
|
|
10
|
-
readonly aggregated:
|
|
6
|
+
readonly func: string;
|
|
7
|
+
readonly aggregated: readonly OperationNode[];
|
|
11
8
|
readonly distinct?: boolean;
|
|
12
9
|
readonly filter?: WhereNode;
|
|
13
10
|
readonly over?: OverNode;
|
|
@@ -17,10 +14,9 @@ export interface AggregateFunctionNode extends OperationNode {
|
|
|
17
14
|
*/
|
|
18
15
|
export declare const AggregateFunctionNode: Readonly<{
|
|
19
16
|
is(node: OperationNode): node is AggregateFunctionNode;
|
|
20
|
-
create(aggregateFunction:
|
|
17
|
+
create(aggregateFunction: string, aggregated?: readonly OperationNode[]): AggregateFunctionNode;
|
|
21
18
|
cloneWithDistinct(aggregateFunctionNode: AggregateFunctionNode): AggregateFunctionNode;
|
|
22
19
|
cloneWithFilter(aggregateFunctionNode: AggregateFunctionNode, filter: OperationNode): AggregateFunctionNode;
|
|
23
20
|
cloneWithOrFilter(aggregateFunctionNode: AggregateFunctionNode, filter: OperationNode): AggregateFunctionNode;
|
|
24
21
|
cloneWithOver(aggregateFunctionNode: AggregateFunctionNode, over?: OverNode): AggregateFunctionNode;
|
|
25
22
|
}>;
|
|
26
|
-
export {};
|
|
@@ -10,7 +10,7 @@ exports.AggregateFunctionNode = (0, object_utils_js_1.freeze)({
|
|
|
10
10
|
is(node) {
|
|
11
11
|
return node.kind === 'AggregateFunctionNode';
|
|
12
12
|
},
|
|
13
|
-
create(aggregateFunction, aggregated) {
|
|
13
|
+
create(aggregateFunction, aggregated = []) {
|
|
14
14
|
return (0, object_utils_js_1.freeze)({
|
|
15
15
|
kind: 'AggregateFunctionNode',
|
|
16
16
|
func: aggregateFunction,
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { OperationNode } from './operation-node.js';
|
|
2
2
|
import { ColumnNode } from './column-node.js';
|
|
3
|
-
import { DataTypeNode } from './data-type-node.js';
|
|
4
3
|
import { RawNode } from './raw-node.js';
|
|
5
4
|
export declare type AlterColumnNodeProps = Omit<AlterColumnNode, 'kind' | 'column'>;
|
|
6
5
|
export interface AlterColumnNode extends OperationNode {
|
|
7
6
|
readonly kind: 'AlterColumnNode';
|
|
8
7
|
readonly column: ColumnNode;
|
|
9
|
-
readonly dataType?:
|
|
8
|
+
readonly dataType?: OperationNode;
|
|
10
9
|
readonly dataTypeExpression?: RawNode;
|
|
11
10
|
readonly setDefault?: OperationNode;
|
|
12
11
|
readonly dropDefault?: true;
|
|
@@ -24,7 +24,7 @@ export interface AlterTableNode extends OperationNode {
|
|
|
24
24
|
*/
|
|
25
25
|
export declare const AlterTableNode: Readonly<{
|
|
26
26
|
is(node: OperationNode): node is AlterTableNode;
|
|
27
|
-
create(table:
|
|
27
|
+
create(table: TableNode): AlterTableNode;
|
|
28
28
|
cloneWithTableProps(node: AlterTableNode, props: AlterTableNodeTableProps): AlterTableNode;
|
|
29
29
|
cloneWithColumnAlteration(node: AlterTableNode, columnAlteration: AlterTableColumnAlterationNode): AlterTableNode;
|
|
30
30
|
}>;
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AlterTableNode = void 0;
|
|
4
4
|
const object_utils_js_1 = require("../util/object-utils.js");
|
|
5
|
-
const table_node_js_1 = require("./table-node.js");
|
|
6
5
|
/**
|
|
7
6
|
* @internal
|
|
8
7
|
*/
|
|
@@ -13,7 +12,7 @@ exports.AlterTableNode = (0, object_utils_js_1.freeze)({
|
|
|
13
12
|
create(table) {
|
|
14
13
|
return (0, object_utils_js_1.freeze)({
|
|
15
14
|
kind: 'AlterTableNode',
|
|
16
|
-
table
|
|
15
|
+
table,
|
|
17
16
|
});
|
|
18
17
|
},
|
|
19
18
|
cloneWithTableProps(node, props) {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { OperationNode } from './operation-node.js';
|
|
2
|
+
import { WhenNode } from './when-node.js';
|
|
3
|
+
export interface CaseNode extends OperationNode {
|
|
4
|
+
readonly kind: 'CaseNode';
|
|
5
|
+
readonly value?: OperationNode;
|
|
6
|
+
readonly when?: ReadonlyArray<WhenNode>;
|
|
7
|
+
readonly else?: OperationNode;
|
|
8
|
+
readonly isStatement?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
export declare const CaseNode: Readonly<{
|
|
14
|
+
is(node: OperationNode): node is CaseNode;
|
|
15
|
+
create(value?: OperationNode): CaseNode;
|
|
16
|
+
cloneWithWhen(caseNode: CaseNode, when: WhenNode): CaseNode;
|
|
17
|
+
cloneWithThen(caseNode: CaseNode, then: OperationNode): CaseNode;
|
|
18
|
+
cloneWith(caseNode: CaseNode, props: Partial<Pick<CaseNode, 'else' | 'isStatement'>>): CaseNode;
|
|
19
|
+
}>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CaseNode = void 0;
|
|
4
|
+
const object_utils_js_1 = require("../util/object-utils.js");
|
|
5
|
+
const when_node_js_1 = require("./when-node.js");
|
|
6
|
+
/**
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
exports.CaseNode = (0, object_utils_js_1.freeze)({
|
|
10
|
+
is(node) {
|
|
11
|
+
return node.kind === 'CaseNode';
|
|
12
|
+
},
|
|
13
|
+
create(value) {
|
|
14
|
+
return (0, object_utils_js_1.freeze)({
|
|
15
|
+
kind: 'CaseNode',
|
|
16
|
+
value,
|
|
17
|
+
});
|
|
18
|
+
},
|
|
19
|
+
cloneWithWhen(caseNode, when) {
|
|
20
|
+
return (0, object_utils_js_1.freeze)({
|
|
21
|
+
...caseNode,
|
|
22
|
+
when: (0, object_utils_js_1.freeze)(caseNode.when ? [...caseNode.when, when] : [when]),
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
cloneWithThen(caseNode, then) {
|
|
26
|
+
return (0, object_utils_js_1.freeze)({
|
|
27
|
+
...caseNode,
|
|
28
|
+
when: caseNode.when
|
|
29
|
+
? (0, object_utils_js_1.freeze)([
|
|
30
|
+
...caseNode.when.slice(0, -1),
|
|
31
|
+
when_node_js_1.WhenNode.cloneWithResult(caseNode.when[caseNode.when.length - 1], then),
|
|
32
|
+
])
|
|
33
|
+
: undefined,
|
|
34
|
+
});
|
|
35
|
+
},
|
|
36
|
+
cloneWith(caseNode, props) {
|
|
37
|
+
return (0, object_utils_js_1.freeze)({
|
|
38
|
+
...caseNode,
|
|
39
|
+
...props,
|
|
40
|
+
});
|
|
41
|
+
},
|
|
42
|
+
});
|