kysely 0.27.4 → 0.27.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.renovaterc.json +3 -0
- package/CONTRIBUTING.md +1 -1
- package/deno.check.d.ts +86 -0
- package/deno.check.json +21 -0
- package/dist/cjs/dialect/dialect-adapter-base.d.ts +11 -2
- package/dist/cjs/dialect/dialect-adapter.d.ts +11 -2
- package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +11 -2
- package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +37 -29
- package/dist/cjs/dialect/mssql/mssql-driver.js +20 -13
- package/dist/cjs/dialect/mysql/mysql-adapter.d.ts +11 -2
- package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +4 -0
- package/dist/cjs/dialect/mysql/mysql-driver.js +3 -0
- package/dist/cjs/dialect/postgres/postgres-adapter.d.ts +11 -2
- package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +10 -3
- package/dist/cjs/dialect/postgres/postgres-driver.js +3 -0
- package/dist/cjs/dialect/postgres/postgres-introspector.js +5 -1
- package/dist/cjs/dialect/sqlite/sqlite-adapter.d.ts +11 -2
- package/dist/cjs/driver/dummy-driver.d.ts +13 -12
- package/dist/cjs/driver/dummy-driver.js +13 -12
- package/dist/cjs/dynamic/dynamic.d.ts +6 -6
- package/dist/cjs/dynamic/dynamic.js +6 -6
- package/dist/cjs/expression/expression-builder.d.ts +152 -61
- package/dist/cjs/expression/expression-wrapper.d.ts +92 -23
- package/dist/cjs/expression/expression.d.ts +40 -5
- package/dist/cjs/helpers/mssql.d.ts +74 -14
- package/dist/cjs/helpers/mssql.js +74 -14
- package/dist/cjs/helpers/mysql.d.ts +14 -10
- package/dist/cjs/helpers/mysql.js +14 -10
- package/dist/cjs/helpers/postgres.d.ts +7 -4
- package/dist/cjs/helpers/postgres.js +7 -4
- package/dist/cjs/helpers/sqlite.d.ts +41 -16
- package/dist/cjs/helpers/sqlite.js +41 -16
- package/dist/cjs/kysely.d.ts +99 -41
- package/dist/cjs/kysely.js +60 -36
- package/dist/cjs/migration/file-migration-provider.d.ts +2 -2
- package/dist/cjs/migration/file-migration-provider.js +2 -2
- package/dist/cjs/migration/migrator.d.ts +82 -14
- package/dist/cjs/migration/migrator.js +82 -14
- package/dist/cjs/operation-node/aggregate-function-node.d.ts +4 -0
- package/dist/cjs/operation-node/aggregate-function-node.js +9 -0
- package/dist/cjs/operation-node/data-type-node.d.ts +1 -1
- package/dist/cjs/operation-node/data-type-node.js +12 -0
- package/dist/cjs/operation-node/delete-query-node.d.ts +1 -0
- package/dist/cjs/operation-node/insert-query-node.d.ts +1 -0
- package/dist/cjs/operation-node/merge-query-node.d.ts +1 -0
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +9 -3
- package/dist/cjs/operation-node/operation-node-transformer.js +14 -3
- package/dist/cjs/operation-node/query-node.d.ts +4 -0
- package/dist/cjs/operation-node/query-node.js +8 -0
- package/dist/cjs/operation-node/select-query-node.d.ts +0 -1
- package/dist/cjs/operation-node/select-query-node.js +0 -8
- package/dist/cjs/operation-node/update-query-node.d.ts +1 -0
- package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +52 -25
- package/dist/cjs/plugin/camel-case/camel-case-plugin.js +24 -19
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +29 -7
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
- package/dist/cjs/plugin/deduplicate-joins/deduplicate-joins-transformer.js +2 -2
- package/dist/cjs/plugin/immediate-value/immediate-value-plugin.d.ts +28 -6
- package/dist/cjs/plugin/kysely-plugin.d.ts +28 -6
- package/dist/cjs/plugin/noop-plugin.d.ts +28 -6
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +62 -9
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +34 -3
- package/dist/cjs/plugin/with-schema/with-schema-plugin.d.ts +28 -6
- package/dist/cjs/query-builder/aggregate-function-builder.d.ts +43 -1
- package/dist/cjs/query-builder/aggregate-function-builder.js +30 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +137 -45
- package/dist/cjs/query-builder/delete-query-builder.js +76 -26
- package/dist/cjs/query-builder/function-module.d.ts +35 -88
- package/dist/cjs/query-builder/insert-query-builder.d.ts +239 -65
- package/dist/cjs/query-builder/insert-query-builder.js +188 -52
- package/dist/cjs/query-builder/insert-result.d.ts +10 -5
- package/dist/cjs/query-builder/insert-result.js +10 -5
- package/dist/cjs/query-builder/json-path-builder.d.ts +33 -9
- package/dist/cjs/query-builder/json-path-builder.js +8 -5
- package/dist/cjs/query-builder/merge-query-builder.d.ts +159 -21
- package/dist/cjs/query-builder/merge-query-builder.js +68 -6
- package/dist/cjs/query-builder/on-conflict-builder.d.ts +51 -18
- package/dist/cjs/query-builder/on-conflict-builder.js +41 -16
- package/dist/cjs/query-builder/output-interface.d.ts +50 -7
- package/dist/cjs/query-builder/returning-interface.d.ts +5 -5
- package/dist/cjs/query-builder/select-query-builder-expression.d.ts +8 -0
- package/dist/cjs/query-builder/select-query-builder.d.ts +295 -63
- package/dist/cjs/query-builder/select-query-builder.js +7 -7
- package/dist/cjs/query-builder/update-query-builder.d.ts +138 -29
- package/dist/cjs/query-builder/update-query-builder.js +75 -10
- package/dist/cjs/query-builder/update-result.d.ts +2 -2
- package/dist/cjs/query-builder/update-result.js +2 -2
- package/dist/cjs/query-builder/where-interface.d.ts +5 -1
- package/dist/cjs/query-compiler/default-query-compiler.js +20 -0
- package/dist/cjs/query-creator.d.ts +66 -18
- package/dist/cjs/query-creator.js +2 -2
- package/dist/cjs/raw-builder/raw-builder.d.ts +29 -7
- package/dist/cjs/raw-builder/sql.d.ts +26 -7
- package/dist/cjs/schema/alter-column-builder.d.ts +17 -3
- package/dist/cjs/schema/alter-column-builder.js +17 -3
- package/dist/cjs/schema/alter-table-add-index-builder.d.ts +43 -9
- package/dist/cjs/schema/alter-table-add-index-builder.js +26 -9
- package/dist/cjs/schema/column-definition-builder.d.ts +283 -26
- package/dist/cjs/schema/column-definition-builder.js +283 -26
- package/dist/cjs/schema/create-table-builder.d.ts +86 -33
- package/dist/cjs/schema/create-table-builder.js +86 -33
- package/dist/cjs/util/column-type.d.ts +5 -9
- package/dist/cjs/util/require-all-props.d.ts +4 -2
- package/dist/cjs/util/require-all-props.js +4 -2
- package/dist/cjs/util/streamable.d.ts +1 -1
- package/dist/cjs/util/type-utils.d.ts +4 -2
- package/dist/esm/dialect/dialect-adapter-base.d.ts +11 -2
- package/dist/esm/dialect/dialect-adapter.d.ts +11 -2
- package/dist/esm/dialect/mssql/mssql-adapter.d.ts +11 -2
- package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +37 -29
- package/dist/esm/dialect/mssql/mssql-driver.js +20 -13
- package/dist/esm/dialect/mysql/mysql-adapter.d.ts +11 -2
- package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +4 -0
- package/dist/esm/dialect/mysql/mysql-driver.js +3 -0
- package/dist/esm/dialect/postgres/postgres-adapter.d.ts +11 -2
- package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +10 -3
- package/dist/esm/dialect/postgres/postgres-driver.js +3 -0
- package/dist/esm/dialect/postgres/postgres-introspector.js +5 -1
- package/dist/esm/dialect/sqlite/sqlite-adapter.d.ts +11 -2
- package/dist/esm/driver/dummy-driver.d.ts +13 -12
- package/dist/esm/driver/dummy-driver.js +13 -12
- package/dist/esm/dynamic/dynamic.d.ts +6 -6
- package/dist/esm/dynamic/dynamic.js +6 -6
- package/dist/esm/expression/expression-builder.d.ts +152 -61
- package/dist/esm/expression/expression-wrapper.d.ts +92 -23
- package/dist/esm/expression/expression.d.ts +40 -5
- package/dist/esm/helpers/mssql.d.ts +74 -14
- package/dist/esm/helpers/mssql.js +74 -14
- package/dist/esm/helpers/mysql.d.ts +14 -10
- package/dist/esm/helpers/mysql.js +14 -10
- package/dist/esm/helpers/postgres.d.ts +7 -4
- package/dist/esm/helpers/postgres.js +7 -4
- package/dist/esm/helpers/sqlite.d.ts +41 -16
- package/dist/esm/helpers/sqlite.js +41 -16
- package/dist/esm/kysely.d.ts +99 -41
- package/dist/esm/kysely.js +60 -36
- package/dist/esm/migration/file-migration-provider.d.ts +2 -2
- package/dist/esm/migration/file-migration-provider.js +2 -2
- package/dist/esm/migration/migrator.d.ts +82 -14
- package/dist/esm/migration/migrator.js +82 -14
- package/dist/esm/operation-node/aggregate-function-node.d.ts +4 -0
- package/dist/esm/operation-node/aggregate-function-node.js +9 -0
- package/dist/esm/operation-node/data-type-node.d.ts +1 -1
- package/dist/esm/operation-node/data-type-node.js +12 -0
- package/dist/esm/operation-node/delete-query-node.d.ts +1 -0
- package/dist/esm/operation-node/insert-query-node.d.ts +1 -0
- package/dist/esm/operation-node/merge-query-node.d.ts +1 -0
- package/dist/esm/operation-node/operation-node-transformer.d.ts +9 -3
- package/dist/esm/operation-node/operation-node-transformer.js +14 -3
- package/dist/esm/operation-node/query-node.d.ts +4 -0
- package/dist/esm/operation-node/query-node.js +8 -0
- package/dist/esm/operation-node/select-query-node.d.ts +0 -1
- package/dist/esm/operation-node/select-query-node.js +0 -8
- package/dist/esm/operation-node/update-query-node.d.ts +1 -0
- package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +52 -25
- package/dist/esm/plugin/camel-case/camel-case-plugin.js +24 -19
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts +29 -7
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.js +1 -1
- package/dist/esm/plugin/deduplicate-joins/deduplicate-joins-transformer.js +2 -2
- package/dist/esm/plugin/immediate-value/immediate-value-plugin.d.ts +28 -6
- package/dist/esm/plugin/kysely-plugin.d.ts +28 -6
- package/dist/esm/plugin/noop-plugin.d.ts +28 -6
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +62 -9
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +34 -3
- package/dist/esm/plugin/with-schema/with-schema-plugin.d.ts +28 -6
- package/dist/esm/query-builder/aggregate-function-builder.d.ts +43 -1
- package/dist/esm/query-builder/aggregate-function-builder.js +30 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +137 -45
- package/dist/esm/query-builder/delete-query-builder.js +76 -26
- package/dist/esm/query-builder/function-module.d.ts +35 -88
- package/dist/esm/query-builder/insert-query-builder.d.ts +239 -65
- package/dist/esm/query-builder/insert-query-builder.js +188 -52
- package/dist/esm/query-builder/insert-result.d.ts +10 -5
- package/dist/esm/query-builder/insert-result.js +10 -5
- package/dist/esm/query-builder/json-path-builder.d.ts +33 -9
- package/dist/esm/query-builder/json-path-builder.js +8 -5
- package/dist/esm/query-builder/merge-query-builder.d.ts +159 -21
- package/dist/esm/query-builder/merge-query-builder.js +68 -6
- package/dist/esm/query-builder/on-conflict-builder.d.ts +51 -18
- package/dist/esm/query-builder/on-conflict-builder.js +41 -16
- package/dist/esm/query-builder/output-interface.d.ts +50 -7
- package/dist/esm/query-builder/returning-interface.d.ts +5 -5
- package/dist/esm/query-builder/select-query-builder-expression.d.ts +8 -0
- package/dist/esm/query-builder/select-query-builder.d.ts +295 -63
- package/dist/esm/query-builder/select-query-builder.js +7 -7
- package/dist/esm/query-builder/update-query-builder.d.ts +138 -29
- package/dist/esm/query-builder/update-query-builder.js +75 -10
- package/dist/esm/query-builder/update-result.d.ts +2 -2
- package/dist/esm/query-builder/update-result.js +2 -2
- package/dist/esm/query-builder/where-interface.d.ts +5 -1
- package/dist/esm/query-compiler/default-query-compiler.js +20 -0
- package/dist/esm/query-creator.d.ts +66 -18
- package/dist/esm/query-creator.js +2 -2
- package/dist/esm/raw-builder/raw-builder.d.ts +29 -7
- package/dist/esm/raw-builder/sql.d.ts +26 -7
- package/dist/esm/schema/alter-column-builder.d.ts +17 -3
- package/dist/esm/schema/alter-column-builder.js +17 -3
- package/dist/esm/schema/alter-table-add-index-builder.d.ts +43 -9
- package/dist/esm/schema/alter-table-add-index-builder.js +26 -9
- package/dist/esm/schema/column-definition-builder.d.ts +283 -26
- package/dist/esm/schema/column-definition-builder.js +283 -26
- package/dist/esm/schema/create-table-builder.d.ts +86 -33
- package/dist/esm/schema/create-table-builder.js +86 -33
- package/dist/esm/util/column-type.d.ts +5 -9
- package/dist/esm/util/require-all-props.d.ts +4 -2
- package/dist/esm/util/require-all-props.js +4 -2
- package/dist/esm/util/streamable.d.ts +1 -1
- package/dist/esm/util/type-utils.d.ts +4 -2
- package/package.json +28 -23
|
@@ -20,16 +20,29 @@ exports.NO_MIGRATIONS = (0, object_utils_js_1.freeze)({ __noMigrations__: true }
|
|
|
20
20
|
* other way.
|
|
21
21
|
*
|
|
22
22
|
* ```ts
|
|
23
|
-
* import { promises as fs } from 'fs'
|
|
24
|
-
* import path from 'path'
|
|
23
|
+
* import { promises as fs } from 'node:fs'
|
|
24
|
+
* import path from 'node:path'
|
|
25
|
+
* import * as Sqlite from 'better-sqlite3'
|
|
26
|
+
* import {
|
|
27
|
+
* FileMigrationProvider,
|
|
28
|
+
* Kysely,
|
|
29
|
+
* Migrator,
|
|
30
|
+
* SqliteDialect
|
|
31
|
+
* } from 'kysely'
|
|
32
|
+
*
|
|
33
|
+
* const db = new Kysely<any>({
|
|
34
|
+
* dialect: new SqliteDialect({
|
|
35
|
+
* database: Sqlite(':memory:')
|
|
36
|
+
* })
|
|
37
|
+
* })
|
|
25
38
|
*
|
|
26
39
|
* const migrator = new Migrator({
|
|
27
40
|
* db,
|
|
28
41
|
* provider: new FileMigrationProvider({
|
|
29
42
|
* fs,
|
|
30
|
-
* path,
|
|
31
43
|
* // Path to the folder that contains all your migrations.
|
|
32
|
-
* migrationFolder: 'some/path/to/migrations'
|
|
44
|
+
* migrationFolder: 'some/path/to/migrations',
|
|
45
|
+
* path,
|
|
33
46
|
* })
|
|
34
47
|
* })
|
|
35
48
|
* ```
|
|
@@ -78,19 +91,18 @@ class Migrator {
|
|
|
78
91
|
* ### Examples
|
|
79
92
|
*
|
|
80
93
|
* ```ts
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
* }),
|
|
86
|
-
* })
|
|
94
|
+
* import { promises as fs } from 'node:fs'
|
|
95
|
+
* import path from 'node:path'
|
|
96
|
+
* import * as Sqlite from 'better-sqlite3'
|
|
97
|
+
* import { FileMigrationProvider, Migrator } from 'kysely'
|
|
87
98
|
*
|
|
88
99
|
* const migrator = new Migrator({
|
|
89
100
|
* db,
|
|
90
|
-
* provider: new FileMigrationProvider(
|
|
91
|
-
*
|
|
92
|
-
* 'some/path/to/migrations'
|
|
93
|
-
*
|
|
101
|
+
* provider: new FileMigrationProvider({
|
|
102
|
+
* fs,
|
|
103
|
+
* migrationFolder: 'some/path/to/migrations',
|
|
104
|
+
* path,
|
|
105
|
+
* })
|
|
94
106
|
* })
|
|
95
107
|
*
|
|
96
108
|
* const { error, results } = await migrator.migrateToLatest()
|
|
@@ -123,6 +135,20 @@ class Migrator {
|
|
|
123
135
|
* ### Examples
|
|
124
136
|
*
|
|
125
137
|
* ```ts
|
|
138
|
+
* import { promises as fs } from 'node:fs'
|
|
139
|
+
* import path from 'node:path'
|
|
140
|
+
* import { FileMigrationProvider, Migrator } from 'kysely'
|
|
141
|
+
*
|
|
142
|
+
* const migrator = new Migrator({
|
|
143
|
+
* db,
|
|
144
|
+
* provider: new FileMigrationProvider({
|
|
145
|
+
* fs,
|
|
146
|
+
* // Path to the folder that contains all your migrations.
|
|
147
|
+
* migrationFolder: 'some/path/to/migrations',
|
|
148
|
+
* path,
|
|
149
|
+
* })
|
|
150
|
+
* })
|
|
151
|
+
*
|
|
126
152
|
* await migrator.migrateTo('some_migration')
|
|
127
153
|
* ```
|
|
128
154
|
*
|
|
@@ -132,6 +158,20 @@ class Migrator {
|
|
|
132
158
|
* you can use a special constant `NO_MIGRATIONS`:
|
|
133
159
|
*
|
|
134
160
|
* ```ts
|
|
161
|
+
* import { promises as fs } from 'node:fs'
|
|
162
|
+
* import path from 'node:path'
|
|
163
|
+
* import { FileMigrationProvider, Migrator, NO_MIGRATIONS } from 'kysely'
|
|
164
|
+
*
|
|
165
|
+
* const migrator = new Migrator({
|
|
166
|
+
* db,
|
|
167
|
+
* provider: new FileMigrationProvider({
|
|
168
|
+
* fs,
|
|
169
|
+
* // Path to the folder that contains all your migrations.
|
|
170
|
+
* migrationFolder: 'some/path/to/migrations',
|
|
171
|
+
* path,
|
|
172
|
+
* })
|
|
173
|
+
* })
|
|
174
|
+
*
|
|
135
175
|
* await migrator.migrateTo(NO_MIGRATIONS)
|
|
136
176
|
* ```
|
|
137
177
|
*/
|
|
@@ -170,6 +210,20 @@ class Migrator {
|
|
|
170
210
|
* ### Examples
|
|
171
211
|
*
|
|
172
212
|
* ```ts
|
|
213
|
+
* import { promises as fs } from 'node:fs'
|
|
214
|
+
* import path from 'node:path'
|
|
215
|
+
* import { FileMigrationProvider, Migrator } from 'kysely'
|
|
216
|
+
*
|
|
217
|
+
* const migrator = new Migrator({
|
|
218
|
+
* db,
|
|
219
|
+
* provider: new FileMigrationProvider({
|
|
220
|
+
* fs,
|
|
221
|
+
* // Path to the folder that contains all your migrations.
|
|
222
|
+
* migrationFolder: 'some/path/to/migrations',
|
|
223
|
+
* path,
|
|
224
|
+
* })
|
|
225
|
+
* })
|
|
226
|
+
*
|
|
173
227
|
* await migrator.migrateUp()
|
|
174
228
|
* ```
|
|
175
229
|
*/
|
|
@@ -187,6 +241,20 @@ class Migrator {
|
|
|
187
241
|
* ### Examples
|
|
188
242
|
*
|
|
189
243
|
* ```ts
|
|
244
|
+
* import { promises as fs } from 'node:fs'
|
|
245
|
+
* import path from 'node:path'
|
|
246
|
+
* import { FileMigrationProvider, Migrator } from 'kysely'
|
|
247
|
+
*
|
|
248
|
+
* const migrator = new Migrator({
|
|
249
|
+
* db,
|
|
250
|
+
* provider: new FileMigrationProvider({
|
|
251
|
+
* fs,
|
|
252
|
+
* // Path to the folder that contains all your migrations.
|
|
253
|
+
* migrationFolder: 'some/path/to/migrations',
|
|
254
|
+
* path,
|
|
255
|
+
* })
|
|
256
|
+
* })
|
|
257
|
+
*
|
|
190
258
|
* await migrator.migrateDown()
|
|
191
259
|
* ```
|
|
192
260
|
*/
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { OperationNode } from './operation-node.js';
|
|
2
2
|
import { OverNode } from './over-node.js';
|
|
3
3
|
import { WhereNode } from './where-node.js';
|
|
4
|
+
import { OrderByNode } from './order-by-node.js';
|
|
5
|
+
import { OrderByItemNode } from './order-by-item-node.js';
|
|
4
6
|
export interface AggregateFunctionNode extends OperationNode {
|
|
5
7
|
readonly kind: 'AggregateFunctionNode';
|
|
6
8
|
readonly func: string;
|
|
7
9
|
readonly aggregated: readonly OperationNode[];
|
|
8
10
|
readonly distinct?: boolean;
|
|
11
|
+
readonly orderBy?: OrderByNode;
|
|
9
12
|
readonly filter?: WhereNode;
|
|
10
13
|
readonly over?: OverNode;
|
|
11
14
|
}
|
|
@@ -16,6 +19,7 @@ export declare const AggregateFunctionNode: Readonly<{
|
|
|
16
19
|
is(node: OperationNode): node is AggregateFunctionNode;
|
|
17
20
|
create(aggregateFunction: string, aggregated?: readonly OperationNode[]): AggregateFunctionNode;
|
|
18
21
|
cloneWithDistinct(aggregateFunctionNode: AggregateFunctionNode): AggregateFunctionNode;
|
|
22
|
+
cloneWithOrderBy(aggregateFunctionNode: AggregateFunctionNode, orderItems: ReadonlyArray<OrderByItemNode>): AggregateFunctionNode;
|
|
19
23
|
cloneWithFilter(aggregateFunctionNode: AggregateFunctionNode, filter: OperationNode): AggregateFunctionNode;
|
|
20
24
|
cloneWithOrFilter(aggregateFunctionNode: AggregateFunctionNode, filter: OperationNode): AggregateFunctionNode;
|
|
21
25
|
cloneWithOver(aggregateFunctionNode: AggregateFunctionNode, over?: OverNode): AggregateFunctionNode;
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.AggregateFunctionNode = void 0;
|
|
4
4
|
const object_utils_js_1 = require("../util/object-utils.js");
|
|
5
5
|
const where_node_js_1 = require("./where-node.js");
|
|
6
|
+
const order_by_node_js_1 = require("./order-by-node.js");
|
|
6
7
|
/**
|
|
7
8
|
* @internal
|
|
8
9
|
*/
|
|
@@ -23,6 +24,14 @@ exports.AggregateFunctionNode = (0, object_utils_js_1.freeze)({
|
|
|
23
24
|
distinct: true,
|
|
24
25
|
});
|
|
25
26
|
},
|
|
27
|
+
cloneWithOrderBy(aggregateFunctionNode, orderItems) {
|
|
28
|
+
return (0, object_utils_js_1.freeze)({
|
|
29
|
+
...aggregateFunctionNode,
|
|
30
|
+
orderBy: aggregateFunctionNode.orderBy
|
|
31
|
+
? order_by_node_js_1.OrderByNode.cloneWithItems(aggregateFunctionNode.orderBy, orderItems)
|
|
32
|
+
: order_by_node_js_1.OrderByNode.create(orderItems),
|
|
33
|
+
});
|
|
34
|
+
},
|
|
26
35
|
cloneWithFilter(aggregateFunctionNode, filter) {
|
|
27
36
|
return (0, object_utils_js_1.freeze)({
|
|
28
37
|
...aggregateFunctionNode,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OperationNode } from './operation-node.js';
|
|
2
|
-
declare const SIMPLE_COLUMN_DATA_TYPES: readonly ["varchar", "char", "text", "integer", "int2", "int4", "int8", "smallint", "bigint", "boolean", "real", "double precision", "float4", "float8", "decimal", "numeric", "binary", "bytea", "date", "datetime", "time", "timetz", "timestamp", "timestamptz", "serial", "bigserial", "uuid", "json", "jsonb", "blob", "varbinary"];
|
|
2
|
+
declare const SIMPLE_COLUMN_DATA_TYPES: readonly ["varchar", "char", "text", "integer", "int2", "int4", "int8", "smallint", "bigint", "boolean", "real", "double precision", "float4", "float8", "decimal", "numeric", "binary", "bytea", "date", "datetime", "time", "timetz", "timestamp", "timestamptz", "serial", "bigserial", "uuid", "json", "jsonb", "blob", "varbinary", "int4range", "int4multirange", "int8range", "int8multirange", "numrange", "nummultirange", "tsrange", "tsmultirange", "tstzrange", "tstzmultirange", "daterange", "datemultirange"];
|
|
3
3
|
type SimpleColumnDataType = (typeof SIMPLE_COLUMN_DATA_TYPES)[number];
|
|
4
4
|
export type ColumnDataType = SimpleColumnDataType | `varchar(${number})` | `char(${number})` | `decimal(${number}, ${number})` | `numeric(${number}, ${number})` | `binary(${number})` | `datetime(${number})` | `time(${number})` | `timetz(${number})` | `timestamp(${number})` | `timestamptz(${number})` | `varbinary(${number})`;
|
|
5
5
|
export type DataTypeParams = Omit<DataTypeNode, 'kind' | 'dataType'>;
|
|
@@ -35,6 +35,18 @@ const SIMPLE_COLUMN_DATA_TYPES = [
|
|
|
35
35
|
'jsonb',
|
|
36
36
|
'blob',
|
|
37
37
|
'varbinary',
|
|
38
|
+
'int4range',
|
|
39
|
+
'int4multirange',
|
|
40
|
+
'int8range',
|
|
41
|
+
'int8multirange',
|
|
42
|
+
'numrange',
|
|
43
|
+
'nummultirange',
|
|
44
|
+
'tsrange',
|
|
45
|
+
'tsmultirange',
|
|
46
|
+
'tstzrange',
|
|
47
|
+
'tstzmultirange',
|
|
48
|
+
'daterange',
|
|
49
|
+
'datemultirange',
|
|
38
50
|
];
|
|
39
51
|
const COLUMN_DATA_TYPE_REGEX = [
|
|
40
52
|
/^varchar\(\d+\)$/,
|
|
@@ -22,6 +22,7 @@ export interface DeleteQueryNode extends OperationNode {
|
|
|
22
22
|
readonly orderBy?: OrderByNode;
|
|
23
23
|
readonly limit?: LimitNode;
|
|
24
24
|
readonly explain?: ExplainNode;
|
|
25
|
+
readonly endModifiers?: ReadonlyArray<OperationNode>;
|
|
25
26
|
readonly top?: TopNode;
|
|
26
27
|
readonly output?: OutputNode;
|
|
27
28
|
}
|
|
@@ -22,6 +22,7 @@ export interface InsertQueryNode extends OperationNode {
|
|
|
22
22
|
readonly replace?: boolean;
|
|
23
23
|
readonly explain?: ExplainNode;
|
|
24
24
|
readonly defaultValues?: boolean;
|
|
25
|
+
readonly endModifiers?: ReadonlyArray<OperationNode>;
|
|
25
26
|
readonly top?: TopNode;
|
|
26
27
|
readonly output?: OutputNode;
|
|
27
28
|
}
|
|
@@ -106,9 +106,12 @@ import { OutputNode } from './output-node.js';
|
|
|
106
106
|
* snake_case, you'd do something like this:
|
|
107
107
|
*
|
|
108
108
|
* ```ts
|
|
109
|
+
* import { type IdentifierNode, OperationNodeTransformer } from 'kysely'
|
|
110
|
+
* import snakeCase from 'lodash/snakeCase'
|
|
111
|
+
*
|
|
109
112
|
* class CamelCaseTransformer extends OperationNodeTransformer {
|
|
110
|
-
* transformIdentifier(node: IdentifierNode): IdentifierNode {
|
|
111
|
-
* node = super.transformIdentifier(node)
|
|
113
|
+
* override transformIdentifier(node: IdentifierNode): IdentifierNode {
|
|
114
|
+
* node = super.transformIdentifier(node)
|
|
112
115
|
*
|
|
113
116
|
* return {
|
|
114
117
|
* ...node,
|
|
@@ -118,7 +121,10 @@ import { OutputNode } from './output-node.js';
|
|
|
118
121
|
* }
|
|
119
122
|
*
|
|
120
123
|
* const transformer = new CamelCaseTransformer()
|
|
121
|
-
*
|
|
124
|
+
*
|
|
125
|
+
* const query = db.selectFrom('person').select(['first_name', 'last_name'])
|
|
126
|
+
*
|
|
127
|
+
* const tree = transformer.transformNode(query.toOperationNode())
|
|
122
128
|
* ```
|
|
123
129
|
*/
|
|
124
130
|
export declare class OperationNodeTransformer {
|
|
@@ -17,9 +17,12 @@ const require_all_props_js_1 = require("../util/require-all-props.js");
|
|
|
17
17
|
* snake_case, you'd do something like this:
|
|
18
18
|
*
|
|
19
19
|
* ```ts
|
|
20
|
+
* import { type IdentifierNode, OperationNodeTransformer } from 'kysely'
|
|
21
|
+
* import snakeCase from 'lodash/snakeCase'
|
|
22
|
+
*
|
|
20
23
|
* class CamelCaseTransformer extends OperationNodeTransformer {
|
|
21
|
-
* transformIdentifier(node: IdentifierNode): IdentifierNode {
|
|
22
|
-
* node = super.transformIdentifier(node)
|
|
24
|
+
* override transformIdentifier(node: IdentifierNode): IdentifierNode {
|
|
25
|
+
* node = super.transformIdentifier(node)
|
|
23
26
|
*
|
|
24
27
|
* return {
|
|
25
28
|
* ...node,
|
|
@@ -29,7 +32,10 @@ const require_all_props_js_1 = require("../util/require-all-props.js");
|
|
|
29
32
|
* }
|
|
30
33
|
*
|
|
31
34
|
* const transformer = new CamelCaseTransformer()
|
|
32
|
-
*
|
|
35
|
+
*
|
|
36
|
+
* const query = db.selectFrom('person').select(['first_name', 'last_name'])
|
|
37
|
+
*
|
|
38
|
+
* const tree = transformer.transformNode(query.toOperationNode())
|
|
33
39
|
* ```
|
|
34
40
|
*/
|
|
35
41
|
class OperationNodeTransformer {
|
|
@@ -263,6 +269,7 @@ class OperationNodeTransformer {
|
|
|
263
269
|
returning: this.transformNode(node.returning),
|
|
264
270
|
onConflict: this.transformNode(node.onConflict),
|
|
265
271
|
onDuplicateKey: this.transformNode(node.onDuplicateKey),
|
|
272
|
+
endModifiers: this.transformNodeList(node.endModifiers),
|
|
266
273
|
with: this.transformNode(node.with),
|
|
267
274
|
ignore: node.ignore,
|
|
268
275
|
replace: node.replace,
|
|
@@ -286,6 +293,7 @@ class OperationNodeTransformer {
|
|
|
286
293
|
joins: this.transformNodeList(node.joins),
|
|
287
294
|
where: this.transformNode(node.where),
|
|
288
295
|
returning: this.transformNode(node.returning),
|
|
296
|
+
endModifiers: this.transformNodeList(node.endModifiers),
|
|
289
297
|
with: this.transformNode(node.with),
|
|
290
298
|
orderBy: this.transformNode(node.orderBy),
|
|
291
299
|
limit: this.transformNode(node.limit),
|
|
@@ -383,6 +391,7 @@ class OperationNodeTransformer {
|
|
|
383
391
|
where: this.transformNode(node.where),
|
|
384
392
|
updates: this.transformNodeList(node.updates),
|
|
385
393
|
returning: this.transformNode(node.returning),
|
|
394
|
+
endModifiers: this.transformNodeList(node.endModifiers),
|
|
386
395
|
with: this.transformNode(node.with),
|
|
387
396
|
explain: this.transformNode(node.explain),
|
|
388
397
|
limit: this.transformNode(node.limit),
|
|
@@ -689,6 +698,7 @@ class OperationNodeTransformer {
|
|
|
689
698
|
kind: 'AggregateFunctionNode',
|
|
690
699
|
aggregated: this.transformNodeList(node.aggregated),
|
|
691
700
|
distinct: node.distinct,
|
|
701
|
+
orderBy: this.transformNode(node.orderBy),
|
|
692
702
|
filter: this.transformNode(node.filter),
|
|
693
703
|
func: node.func,
|
|
694
704
|
over: this.transformNode(node.over),
|
|
@@ -799,6 +809,7 @@ class OperationNodeTransformer {
|
|
|
799
809
|
whens: this.transformNodeList(node.whens),
|
|
800
810
|
with: this.transformNode(node.with),
|
|
801
811
|
top: this.transformNode(node.top),
|
|
812
|
+
endModifiers: this.transformNodeList(node.endModifiers),
|
|
802
813
|
output: this.transformNode(node.output),
|
|
803
814
|
});
|
|
804
815
|
}
|
|
@@ -32,11 +32,15 @@ type HasTop = {
|
|
|
32
32
|
type HasOutput = {
|
|
33
33
|
output?: OutputNode;
|
|
34
34
|
};
|
|
35
|
+
type HasEndModifiers = {
|
|
36
|
+
endModifiers?: ReadonlyArray<OperationNode>;
|
|
37
|
+
};
|
|
35
38
|
/**
|
|
36
39
|
* @internal
|
|
37
40
|
*/
|
|
38
41
|
export declare const QueryNode: Readonly<{
|
|
39
42
|
is(node: OperationNode): node is QueryNode;
|
|
43
|
+
cloneWithEndModifier<T extends HasEndModifiers>(node: T, modifier: OperationNode): T;
|
|
40
44
|
cloneWithWhere<T extends HasWhere>(node: T, operation: OperationNode): T;
|
|
41
45
|
cloneWithJoin<T extends HasJoins>(node: T, join: JoinNode): T;
|
|
42
46
|
cloneWithReturning<T extends HasReturning>(node: T, selections: ReadonlyArray<SelectionNode>): T;
|
|
@@ -22,6 +22,14 @@ exports.QueryNode = (0, object_utils_js_1.freeze)({
|
|
|
22
22
|
delete_query_node_js_1.DeleteQueryNode.is(node) ||
|
|
23
23
|
merge_query_node_js_1.MergeQueryNode.is(node));
|
|
24
24
|
},
|
|
25
|
+
cloneWithEndModifier(node, modifier) {
|
|
26
|
+
return (0, object_utils_js_1.freeze)({
|
|
27
|
+
...node,
|
|
28
|
+
endModifiers: node.endModifiers
|
|
29
|
+
? (0, object_utils_js_1.freeze)([...node.endModifiers, modifier])
|
|
30
|
+
: (0, object_utils_js_1.freeze)([modifier]),
|
|
31
|
+
});
|
|
32
|
+
},
|
|
25
33
|
cloneWithWhere(node, operation) {
|
|
26
34
|
return (0, object_utils_js_1.freeze)({
|
|
27
35
|
...node,
|
|
@@ -46,7 +46,6 @@ export declare const SelectQueryNode: Readonly<{
|
|
|
46
46
|
cloneWithSelections(select: SelectQueryNode, selections: ReadonlyArray<SelectionNode>): SelectQueryNode;
|
|
47
47
|
cloneWithDistinctOn(select: SelectQueryNode, expressions: ReadonlyArray<OperationNode>): SelectQueryNode;
|
|
48
48
|
cloneWithFrontModifier(select: SelectQueryNode, modifier: SelectModifierNode): SelectQueryNode;
|
|
49
|
-
cloneWithEndModifier(select: SelectQueryNode, modifier: SelectModifierNode): SelectQueryNode;
|
|
50
49
|
cloneWithOrderByItems(selectNode: SelectQueryNode, items: ReadonlyArray<OrderByItemNode>): SelectQueryNode;
|
|
51
50
|
cloneWithGroupByItems(selectNode: SelectQueryNode, items: ReadonlyArray<GroupByItemNode>): SelectQueryNode;
|
|
52
51
|
cloneWithLimit(selectNode: SelectQueryNode, limit: LimitNode): SelectQueryNode;
|
|
@@ -50,14 +50,6 @@ exports.SelectQueryNode = (0, object_utils_js_1.freeze)({
|
|
|
50
50
|
: (0, object_utils_js_1.freeze)([modifier]),
|
|
51
51
|
});
|
|
52
52
|
},
|
|
53
|
-
cloneWithEndModifier(select, modifier) {
|
|
54
|
-
return (0, object_utils_js_1.freeze)({
|
|
55
|
-
...select,
|
|
56
|
-
endModifiers: select.endModifiers
|
|
57
|
-
? (0, object_utils_js_1.freeze)([...select.endModifiers, modifier])
|
|
58
|
-
: (0, object_utils_js_1.freeze)([modifier]),
|
|
59
|
-
});
|
|
60
|
-
},
|
|
61
53
|
cloneWithOrderByItems(selectNode, items) {
|
|
62
54
|
return (0, object_utils_js_1.freeze)({
|
|
63
55
|
...selectNode,
|
|
@@ -22,6 +22,7 @@ export interface UpdateQueryNode extends OperationNode {
|
|
|
22
22
|
readonly returning?: ReturningNode;
|
|
23
23
|
readonly with?: WithNode;
|
|
24
24
|
readonly explain?: ExplainNode;
|
|
25
|
+
readonly endModifiers?: ReadonlyArray<OperationNode>;
|
|
25
26
|
readonly limit?: LimitNode;
|
|
26
27
|
readonly top?: TopNode;
|
|
27
28
|
readonly output?: OutputNode;
|
|
@@ -42,38 +42,39 @@ export interface CamelCasePluginOptions {
|
|
|
42
42
|
* using `CamelCasePlugin` we would setup Kysely like this:
|
|
43
43
|
*
|
|
44
44
|
* ```ts
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* lastName: string
|
|
48
|
-
* }
|
|
45
|
+
* import * as Sqlite from 'better-sqlite3'
|
|
46
|
+
* import { CamelCasePlugin, Kysely, SqliteDialect } from 'kysely'
|
|
49
47
|
*
|
|
50
|
-
* interface
|
|
51
|
-
*
|
|
48
|
+
* interface CamelCasedDatabase {
|
|
49
|
+
* userMetadata: {
|
|
50
|
+
* firstName: string
|
|
51
|
+
* lastName: string
|
|
52
|
+
* }
|
|
52
53
|
* }
|
|
53
54
|
*
|
|
54
|
-
* const db = new Kysely<
|
|
55
|
-
* dialect: new
|
|
56
|
-
* database: '
|
|
57
|
-
* host: 'localhost',
|
|
55
|
+
* const db = new Kysely<CamelCasedDatabase>({
|
|
56
|
+
* dialect: new SqliteDialect({
|
|
57
|
+
* database: new Sqlite(':memory:'),
|
|
58
58
|
* }),
|
|
59
|
-
* plugins: [
|
|
60
|
-
* new CamelCasePlugin()
|
|
61
|
-
* ]
|
|
59
|
+
* plugins: [new CamelCasePlugin()],
|
|
62
60
|
* })
|
|
63
61
|
*
|
|
64
|
-
* const person = await db.selectFrom('
|
|
62
|
+
* const person = await db.selectFrom('userMetadata')
|
|
65
63
|
* .where('firstName', '=', 'Arnold')
|
|
66
64
|
* .select(['firstName', 'lastName'])
|
|
67
65
|
* .executeTakeFirst()
|
|
68
66
|
*
|
|
69
|
-
* // generated sql:
|
|
70
|
-
* // select first_name, last_name from person_table where first_name = $1
|
|
71
|
-
*
|
|
72
67
|
* if (person) {
|
|
73
68
|
* console.log(person.firstName)
|
|
74
69
|
* }
|
|
75
70
|
* ```
|
|
76
71
|
*
|
|
72
|
+
* The generated SQL (SQLite):
|
|
73
|
+
*
|
|
74
|
+
* ```sql
|
|
75
|
+
* select "first_name", "last_name" from "user_metadata" where "first_name" = ?
|
|
76
|
+
* ```
|
|
77
|
+
*
|
|
77
78
|
* As you can see from the example, __everything__ needs to be defined
|
|
78
79
|
* in camelCase in the TypeScript code: table names, columns, schemas,
|
|
79
80
|
* __everything__. When using the `CamelCasePlugin` Kysely works as if
|
|
@@ -88,11 +89,15 @@ export interface CamelCasePluginOptions {
|
|
|
88
89
|
* ```ts
|
|
89
90
|
* class MyCamelCasePlugin extends CamelCasePlugin {
|
|
90
91
|
* protected override snakeCase(str: string): string {
|
|
91
|
-
*
|
|
92
|
+
* // ...
|
|
93
|
+
*
|
|
94
|
+
* return str
|
|
92
95
|
* }
|
|
93
96
|
*
|
|
94
97
|
* protected override camelCase(str: string): string {
|
|
95
|
-
*
|
|
98
|
+
* // ...
|
|
99
|
+
*
|
|
100
|
+
* return str
|
|
96
101
|
* }
|
|
97
102
|
* }
|
|
98
103
|
* ```
|
|
@@ -111,19 +116,41 @@ export declare class CamelCasePlugin implements KyselyPlugin {
|
|
|
111
116
|
* can use a `WeakMap` with {@link PluginTransformQueryArgs.queryId | args.queryId} as the key:
|
|
112
117
|
*
|
|
113
118
|
* ```ts
|
|
114
|
-
*
|
|
115
|
-
*
|
|
119
|
+
* import type {
|
|
120
|
+
* KyselyPlugin,
|
|
121
|
+
* QueryResult,
|
|
122
|
+
* RootOperationNode,
|
|
123
|
+
* UnknownRow
|
|
124
|
+
* } from 'kysely'
|
|
125
|
+
*
|
|
126
|
+
* interface MyData {
|
|
127
|
+
* // ...
|
|
128
|
+
* }
|
|
129
|
+
* const data = new WeakMap<any, MyData>()
|
|
116
130
|
*
|
|
131
|
+
* const plugin = {
|
|
117
132
|
* transformQuery(args: PluginTransformQueryArgs): RootOperationNode {
|
|
118
|
-
*
|
|
133
|
+
* const something: MyData = {}
|
|
134
|
+
*
|
|
135
|
+
* // ...
|
|
136
|
+
*
|
|
137
|
+
* data.set(args.queryId, something)
|
|
138
|
+
*
|
|
139
|
+
* // ...
|
|
140
|
+
*
|
|
119
141
|
* return args.node
|
|
120
142
|
* },
|
|
121
143
|
*
|
|
122
|
-
* transformResult(args: PluginTransformResultArgs): QueryResult<UnknownRow
|
|
123
|
-
*
|
|
144
|
+
* async transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>> {
|
|
145
|
+
* // ...
|
|
146
|
+
*
|
|
147
|
+
* const something = data.get(args.queryId)
|
|
148
|
+
*
|
|
149
|
+
* // ...
|
|
150
|
+
*
|
|
124
151
|
* return args.result
|
|
125
152
|
* }
|
|
126
|
-
* }
|
|
153
|
+
* } satisfies KyselyPlugin
|
|
127
154
|
* ```
|
|
128
155
|
*
|
|
129
156
|
* You should use a `WeakMap` instead of a `Map` or some other strong references because `transformQuery`
|
|
@@ -13,38 +13,39 @@ const camel_case_js_1 = require("./camel-case.js");
|
|
|
13
13
|
* using `CamelCasePlugin` we would setup Kysely like this:
|
|
14
14
|
*
|
|
15
15
|
* ```ts
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* lastName: string
|
|
19
|
-
* }
|
|
16
|
+
* import * as Sqlite from 'better-sqlite3'
|
|
17
|
+
* import { CamelCasePlugin, Kysely, SqliteDialect } from 'kysely'
|
|
20
18
|
*
|
|
21
|
-
* interface
|
|
22
|
-
*
|
|
19
|
+
* interface CamelCasedDatabase {
|
|
20
|
+
* userMetadata: {
|
|
21
|
+
* firstName: string
|
|
22
|
+
* lastName: string
|
|
23
|
+
* }
|
|
23
24
|
* }
|
|
24
25
|
*
|
|
25
|
-
* const db = new Kysely<
|
|
26
|
-
* dialect: new
|
|
27
|
-
* database: '
|
|
28
|
-
* host: 'localhost',
|
|
26
|
+
* const db = new Kysely<CamelCasedDatabase>({
|
|
27
|
+
* dialect: new SqliteDialect({
|
|
28
|
+
* database: new Sqlite(':memory:'),
|
|
29
29
|
* }),
|
|
30
|
-
* plugins: [
|
|
31
|
-
* new CamelCasePlugin()
|
|
32
|
-
* ]
|
|
30
|
+
* plugins: [new CamelCasePlugin()],
|
|
33
31
|
* })
|
|
34
32
|
*
|
|
35
|
-
* const person = await db.selectFrom('
|
|
33
|
+
* const person = await db.selectFrom('userMetadata')
|
|
36
34
|
* .where('firstName', '=', 'Arnold')
|
|
37
35
|
* .select(['firstName', 'lastName'])
|
|
38
36
|
* .executeTakeFirst()
|
|
39
37
|
*
|
|
40
|
-
* // generated sql:
|
|
41
|
-
* // select first_name, last_name from person_table where first_name = $1
|
|
42
|
-
*
|
|
43
38
|
* if (person) {
|
|
44
39
|
* console.log(person.firstName)
|
|
45
40
|
* }
|
|
46
41
|
* ```
|
|
47
42
|
*
|
|
43
|
+
* The generated SQL (SQLite):
|
|
44
|
+
*
|
|
45
|
+
* ```sql
|
|
46
|
+
* select "first_name", "last_name" from "user_metadata" where "first_name" = ?
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
48
49
|
* As you can see from the example, __everything__ needs to be defined
|
|
49
50
|
* in camelCase in the TypeScript code: table names, columns, schemas,
|
|
50
51
|
* __everything__. When using the `CamelCasePlugin` Kysely works as if
|
|
@@ -59,11 +60,15 @@ const camel_case_js_1 = require("./camel-case.js");
|
|
|
59
60
|
* ```ts
|
|
60
61
|
* class MyCamelCasePlugin extends CamelCasePlugin {
|
|
61
62
|
* protected override snakeCase(str: string): string {
|
|
62
|
-
*
|
|
63
|
+
* // ...
|
|
64
|
+
*
|
|
65
|
+
* return str
|
|
63
66
|
* }
|
|
64
67
|
*
|
|
65
68
|
* protected override camelCase(str: string): string {
|
|
66
|
-
*
|
|
69
|
+
* // ...
|
|
70
|
+
*
|
|
71
|
+
* return str
|
|
67
72
|
* }
|
|
68
73
|
* }
|
|
69
74
|
* ```
|
|
@@ -5,7 +5,7 @@ import { KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs } fro
|
|
|
5
5
|
/**
|
|
6
6
|
* Plugin that removes duplicate joins from queries.
|
|
7
7
|
*
|
|
8
|
-
* See [this recipe](https://github.com/
|
|
8
|
+
* See [this recipe](https://github.com/kysely-org/kysely/blob/master/site/docs/recipes/0008-deduplicate-joins.md)
|
|
9
9
|
*/
|
|
10
10
|
export declare class DeduplicateJoinsPlugin implements KyselyPlugin {
|
|
11
11
|
#private;
|
|
@@ -19,19 +19,41 @@ export declare class DeduplicateJoinsPlugin implements KyselyPlugin {
|
|
|
19
19
|
* can use a `WeakMap` with {@link PluginTransformQueryArgs.queryId | args.queryId} as the key:
|
|
20
20
|
*
|
|
21
21
|
* ```ts
|
|
22
|
-
*
|
|
23
|
-
*
|
|
22
|
+
* import type {
|
|
23
|
+
* KyselyPlugin,
|
|
24
|
+
* QueryResult,
|
|
25
|
+
* RootOperationNode,
|
|
26
|
+
* UnknownRow
|
|
27
|
+
* } from 'kysely'
|
|
28
|
+
*
|
|
29
|
+
* interface MyData {
|
|
30
|
+
* // ...
|
|
31
|
+
* }
|
|
32
|
+
* const data = new WeakMap<any, MyData>()
|
|
24
33
|
*
|
|
34
|
+
* const plugin = {
|
|
25
35
|
* transformQuery(args: PluginTransformQueryArgs): RootOperationNode {
|
|
26
|
-
*
|
|
36
|
+
* const something: MyData = {}
|
|
37
|
+
*
|
|
38
|
+
* // ...
|
|
39
|
+
*
|
|
40
|
+
* data.set(args.queryId, something)
|
|
41
|
+
*
|
|
42
|
+
* // ...
|
|
43
|
+
*
|
|
27
44
|
* return args.node
|
|
28
45
|
* },
|
|
29
46
|
*
|
|
30
|
-
* transformResult(args: PluginTransformResultArgs): QueryResult<UnknownRow
|
|
31
|
-
*
|
|
47
|
+
* async transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>> {
|
|
48
|
+
* // ...
|
|
49
|
+
*
|
|
50
|
+
* const something = data.get(args.queryId)
|
|
51
|
+
*
|
|
52
|
+
* // ...
|
|
53
|
+
*
|
|
32
54
|
* return args.result
|
|
33
55
|
* }
|
|
34
|
-
* }
|
|
56
|
+
* } satisfies KyselyPlugin
|
|
35
57
|
* ```
|
|
36
58
|
*
|
|
37
59
|
* You should use a `WeakMap` instead of a `Map` or some other strong references because `transformQuery`
|