kysely 0.27.4 → 0.27.6
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/CODE_OF_CONDUCT.md +183 -0
- package/CONTRIBUTING.md +121 -23
- package/FUNDING.md +25 -0
- package/README.md +13 -2
- 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/dialect/sqlite/sqlite-introspector.js +66 -44
- 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 +154 -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 +90 -15
- package/dist/cjs/migration/migrator.js +95 -17
- 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/parser/insert-values-parser.js +3 -1
- 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/camel-case/camel-case.js +4 -1
- 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/plugin/with-schema/with-schema-transformer.d.ts +4 -0
- package/dist/cjs/plugin/with-schema/with-schema-transformer.js +26 -0
- 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 +27 -8
- 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/dialect/sqlite/sqlite-introspector.js +66 -44
- 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 +154 -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 +90 -15
- package/dist/esm/migration/migrator.js +95 -17
- 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/parser/insert-values-parser.js +3 -1
- 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/camel-case/camel-case.js +4 -1
- 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/plugin/with-schema/with-schema-transformer.d.ts +4 -0
- package/dist/esm/plugin/with-schema/with-schema-transformer.js +26 -0
- 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 +27 -8
- 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
|
@@ -18,16 +18,29 @@ export const NO_MIGRATIONS = freeze({ __noMigrations__: true });
|
|
|
18
18
|
* other way.
|
|
19
19
|
*
|
|
20
20
|
* ```ts
|
|
21
|
-
* import { promises as fs } from 'fs'
|
|
22
|
-
* import path from 'path'
|
|
21
|
+
* import { promises as fs } from 'node:fs'
|
|
22
|
+
* import path from 'node:path'
|
|
23
|
+
* import * as Sqlite from 'better-sqlite3'
|
|
24
|
+
* import {
|
|
25
|
+
* FileMigrationProvider,
|
|
26
|
+
* Kysely,
|
|
27
|
+
* Migrator,
|
|
28
|
+
* SqliteDialect
|
|
29
|
+
* } from 'kysely'
|
|
30
|
+
*
|
|
31
|
+
* const db = new Kysely<any>({
|
|
32
|
+
* dialect: new SqliteDialect({
|
|
33
|
+
* database: Sqlite(':memory:')
|
|
34
|
+
* })
|
|
35
|
+
* })
|
|
23
36
|
*
|
|
24
37
|
* const migrator = new Migrator({
|
|
25
38
|
* db,
|
|
26
39
|
* provider: new FileMigrationProvider({
|
|
27
40
|
* fs,
|
|
28
|
-
* path,
|
|
29
41
|
* // Path to the folder that contains all your migrations.
|
|
30
|
-
* migrationFolder: 'some/path/to/migrations'
|
|
42
|
+
* migrationFolder: 'some/path/to/migrations',
|
|
43
|
+
* path,
|
|
31
44
|
* })
|
|
32
45
|
* })
|
|
33
46
|
* ```
|
|
@@ -48,6 +61,7 @@ export class Migrator {
|
|
|
48
61
|
.withPlugin(this.#schemaPlugin)
|
|
49
62
|
.selectFrom(this.#migrationTable)
|
|
50
63
|
.select(['name', 'timestamp'])
|
|
64
|
+
.$narrowType()
|
|
51
65
|
.execute()
|
|
52
66
|
: [];
|
|
53
67
|
const migrations = await this.#resolveMigrations();
|
|
@@ -76,19 +90,18 @@ export class Migrator {
|
|
|
76
90
|
* ### Examples
|
|
77
91
|
*
|
|
78
92
|
* ```ts
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
* }),
|
|
84
|
-
* })
|
|
93
|
+
* import { promises as fs } from 'node:fs'
|
|
94
|
+
* import path from 'node:path'
|
|
95
|
+
* import * as Sqlite from 'better-sqlite3'
|
|
96
|
+
* import { FileMigrationProvider, Migrator } from 'kysely'
|
|
85
97
|
*
|
|
86
98
|
* const migrator = new Migrator({
|
|
87
99
|
* db,
|
|
88
|
-
* provider: new FileMigrationProvider(
|
|
89
|
-
*
|
|
90
|
-
* 'some/path/to/migrations'
|
|
91
|
-
*
|
|
100
|
+
* provider: new FileMigrationProvider({
|
|
101
|
+
* fs,
|
|
102
|
+
* migrationFolder: 'some/path/to/migrations',
|
|
103
|
+
* path,
|
|
104
|
+
* })
|
|
92
105
|
* })
|
|
93
106
|
*
|
|
94
107
|
* const { error, results } = await migrator.migrateToLatest()
|
|
@@ -121,6 +134,20 @@ export class Migrator {
|
|
|
121
134
|
* ### Examples
|
|
122
135
|
*
|
|
123
136
|
* ```ts
|
|
137
|
+
* import { promises as fs } from 'node:fs'
|
|
138
|
+
* import path from 'node:path'
|
|
139
|
+
* import { FileMigrationProvider, Migrator } from 'kysely'
|
|
140
|
+
*
|
|
141
|
+
* const migrator = new Migrator({
|
|
142
|
+
* db,
|
|
143
|
+
* provider: new FileMigrationProvider({
|
|
144
|
+
* fs,
|
|
145
|
+
* // Path to the folder that contains all your migrations.
|
|
146
|
+
* migrationFolder: 'some/path/to/migrations',
|
|
147
|
+
* path,
|
|
148
|
+
* })
|
|
149
|
+
* })
|
|
150
|
+
*
|
|
124
151
|
* await migrator.migrateTo('some_migration')
|
|
125
152
|
* ```
|
|
126
153
|
*
|
|
@@ -130,6 +157,20 @@ export class Migrator {
|
|
|
130
157
|
* you can use a special constant `NO_MIGRATIONS`:
|
|
131
158
|
*
|
|
132
159
|
* ```ts
|
|
160
|
+
* import { promises as fs } from 'node:fs'
|
|
161
|
+
* import path from 'node:path'
|
|
162
|
+
* import { FileMigrationProvider, Migrator, NO_MIGRATIONS } from 'kysely'
|
|
163
|
+
*
|
|
164
|
+
* const migrator = new Migrator({
|
|
165
|
+
* db,
|
|
166
|
+
* provider: new FileMigrationProvider({
|
|
167
|
+
* fs,
|
|
168
|
+
* // Path to the folder that contains all your migrations.
|
|
169
|
+
* migrationFolder: 'some/path/to/migrations',
|
|
170
|
+
* path,
|
|
171
|
+
* })
|
|
172
|
+
* })
|
|
173
|
+
*
|
|
133
174
|
* await migrator.migrateTo(NO_MIGRATIONS)
|
|
134
175
|
* ```
|
|
135
176
|
*/
|
|
@@ -168,6 +209,20 @@ export class Migrator {
|
|
|
168
209
|
* ### Examples
|
|
169
210
|
*
|
|
170
211
|
* ```ts
|
|
212
|
+
* import { promises as fs } from 'node:fs'
|
|
213
|
+
* import path from 'node:path'
|
|
214
|
+
* import { FileMigrationProvider, Migrator } from 'kysely'
|
|
215
|
+
*
|
|
216
|
+
* const migrator = new Migrator({
|
|
217
|
+
* db,
|
|
218
|
+
* provider: new FileMigrationProvider({
|
|
219
|
+
* fs,
|
|
220
|
+
* // Path to the folder that contains all your migrations.
|
|
221
|
+
* migrationFolder: 'some/path/to/migrations',
|
|
222
|
+
* path,
|
|
223
|
+
* })
|
|
224
|
+
* })
|
|
225
|
+
*
|
|
171
226
|
* await migrator.migrateUp()
|
|
172
227
|
* ```
|
|
173
228
|
*/
|
|
@@ -185,6 +240,20 @@ export class Migrator {
|
|
|
185
240
|
* ### Examples
|
|
186
241
|
*
|
|
187
242
|
* ```ts
|
|
243
|
+
* import { promises as fs } from 'node:fs'
|
|
244
|
+
* import path from 'node:path'
|
|
245
|
+
* import { FileMigrationProvider, Migrator } from 'kysely'
|
|
246
|
+
*
|
|
247
|
+
* const migrator = new Migrator({
|
|
248
|
+
* db,
|
|
249
|
+
* provider: new FileMigrationProvider({
|
|
250
|
+
* fs,
|
|
251
|
+
* // Path to the folder that contains all your migrations.
|
|
252
|
+
* migrationFolder: 'some/path/to/migrations',
|
|
253
|
+
* path,
|
|
254
|
+
* })
|
|
255
|
+
* })
|
|
256
|
+
*
|
|
188
257
|
* await migrator.migrateDown()
|
|
189
258
|
* ```
|
|
190
259
|
*/
|
|
@@ -395,10 +464,19 @@ export class Migrator {
|
|
|
395
464
|
const executedMigrations = await db
|
|
396
465
|
.withPlugin(this.#schemaPlugin)
|
|
397
466
|
.selectFrom(this.#migrationTable)
|
|
398
|
-
.select('name')
|
|
399
|
-
|
|
467
|
+
.select(['name', 'timestamp'])
|
|
468
|
+
.$narrowType()
|
|
400
469
|
.execute();
|
|
401
|
-
|
|
470
|
+
const nameComparator = this.#props.nameComparator || ((a, b) => a.localeCompare(b));
|
|
471
|
+
return (executedMigrations
|
|
472
|
+
// https://github.com/kysely-org/kysely/issues/843
|
|
473
|
+
.sort((a, b) => {
|
|
474
|
+
if (a.timestamp === b.timestamp) {
|
|
475
|
+
return nameComparator(a.name, b.name);
|
|
476
|
+
}
|
|
477
|
+
return (new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
478
|
+
})
|
|
479
|
+
.map((it) => it.name));
|
|
402
480
|
}
|
|
403
481
|
#ensureNoMissingMigrations(migrations, executedMigrations) {
|
|
404
482
|
// Ensure all executed migrations exist in the `migrations` list.
|
|
@@ -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;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="./aggregate-function-node.d.ts" />
|
|
2
2
|
import { freeze } from '../util/object-utils.js';
|
|
3
3
|
import { WhereNode } from './where-node.js';
|
|
4
|
+
import { OrderByNode } from './order-by-node.js';
|
|
4
5
|
/**
|
|
5
6
|
* @internal
|
|
6
7
|
*/
|
|
@@ -21,6 +22,14 @@ export const AggregateFunctionNode = freeze({
|
|
|
21
22
|
distinct: true,
|
|
22
23
|
});
|
|
23
24
|
},
|
|
25
|
+
cloneWithOrderBy(aggregateFunctionNode, orderItems) {
|
|
26
|
+
return freeze({
|
|
27
|
+
...aggregateFunctionNode,
|
|
28
|
+
orderBy: aggregateFunctionNode.orderBy
|
|
29
|
+
? OrderByNode.cloneWithItems(aggregateFunctionNode.orderBy, orderItems)
|
|
30
|
+
: OrderByNode.create(orderItems),
|
|
31
|
+
});
|
|
32
|
+
},
|
|
24
33
|
cloneWithFilter(aggregateFunctionNode, filter) {
|
|
25
34
|
return freeze({
|
|
26
35
|
...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'>;
|
|
@@ -32,6 +32,18 @@ const SIMPLE_COLUMN_DATA_TYPES = [
|
|
|
32
32
|
'jsonb',
|
|
33
33
|
'blob',
|
|
34
34
|
'varbinary',
|
|
35
|
+
'int4range',
|
|
36
|
+
'int4multirange',
|
|
37
|
+
'int8range',
|
|
38
|
+
'int8multirange',
|
|
39
|
+
'numrange',
|
|
40
|
+
'nummultirange',
|
|
41
|
+
'tsrange',
|
|
42
|
+
'tsmultirange',
|
|
43
|
+
'tstzrange',
|
|
44
|
+
'tstzmultirange',
|
|
45
|
+
'daterange',
|
|
46
|
+
'datemultirange',
|
|
35
47
|
];
|
|
36
48
|
const COLUMN_DATA_TYPE_REGEX = [
|
|
37
49
|
/^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 {
|
|
@@ -15,9 +15,12 @@ import { requireAllProps } from '../util/require-all-props.js';
|
|
|
15
15
|
* snake_case, you'd do something like this:
|
|
16
16
|
*
|
|
17
17
|
* ```ts
|
|
18
|
+
* import { type IdentifierNode, OperationNodeTransformer } from 'kysely'
|
|
19
|
+
* import snakeCase from 'lodash/snakeCase'
|
|
20
|
+
*
|
|
18
21
|
* class CamelCaseTransformer extends OperationNodeTransformer {
|
|
19
|
-
* transformIdentifier(node: IdentifierNode): IdentifierNode {
|
|
20
|
-
* node = super.transformIdentifier(node)
|
|
22
|
+
* override transformIdentifier(node: IdentifierNode): IdentifierNode {
|
|
23
|
+
* node = super.transformIdentifier(node)
|
|
21
24
|
*
|
|
22
25
|
* return {
|
|
23
26
|
* ...node,
|
|
@@ -27,7 +30,10 @@ import { requireAllProps } from '../util/require-all-props.js';
|
|
|
27
30
|
* }
|
|
28
31
|
*
|
|
29
32
|
* const transformer = new CamelCaseTransformer()
|
|
30
|
-
*
|
|
33
|
+
*
|
|
34
|
+
* const query = db.selectFrom('person').select(['first_name', 'last_name'])
|
|
35
|
+
*
|
|
36
|
+
* const tree = transformer.transformNode(query.toOperationNode())
|
|
31
37
|
* ```
|
|
32
38
|
*/
|
|
33
39
|
export class OperationNodeTransformer {
|
|
@@ -261,6 +267,7 @@ export class OperationNodeTransformer {
|
|
|
261
267
|
returning: this.transformNode(node.returning),
|
|
262
268
|
onConflict: this.transformNode(node.onConflict),
|
|
263
269
|
onDuplicateKey: this.transformNode(node.onDuplicateKey),
|
|
270
|
+
endModifiers: this.transformNodeList(node.endModifiers),
|
|
264
271
|
with: this.transformNode(node.with),
|
|
265
272
|
ignore: node.ignore,
|
|
266
273
|
replace: node.replace,
|
|
@@ -284,6 +291,7 @@ export class OperationNodeTransformer {
|
|
|
284
291
|
joins: this.transformNodeList(node.joins),
|
|
285
292
|
where: this.transformNode(node.where),
|
|
286
293
|
returning: this.transformNode(node.returning),
|
|
294
|
+
endModifiers: this.transformNodeList(node.endModifiers),
|
|
287
295
|
with: this.transformNode(node.with),
|
|
288
296
|
orderBy: this.transformNode(node.orderBy),
|
|
289
297
|
limit: this.transformNode(node.limit),
|
|
@@ -381,6 +389,7 @@ export class OperationNodeTransformer {
|
|
|
381
389
|
where: this.transformNode(node.where),
|
|
382
390
|
updates: this.transformNodeList(node.updates),
|
|
383
391
|
returning: this.transformNode(node.returning),
|
|
392
|
+
endModifiers: this.transformNodeList(node.endModifiers),
|
|
384
393
|
with: this.transformNode(node.with),
|
|
385
394
|
explain: this.transformNode(node.explain),
|
|
386
395
|
limit: this.transformNode(node.limit),
|
|
@@ -687,6 +696,7 @@ export class OperationNodeTransformer {
|
|
|
687
696
|
kind: 'AggregateFunctionNode',
|
|
688
697
|
aggregated: this.transformNodeList(node.aggregated),
|
|
689
698
|
distinct: node.distinct,
|
|
699
|
+
orderBy: this.transformNode(node.orderBy),
|
|
690
700
|
filter: this.transformNode(node.filter),
|
|
691
701
|
func: node.func,
|
|
692
702
|
over: this.transformNode(node.over),
|
|
@@ -797,6 +807,7 @@ export class OperationNodeTransformer {
|
|
|
797
807
|
whens: this.transformNodeList(node.whens),
|
|
798
808
|
with: this.transformNode(node.with),
|
|
799
809
|
top: this.transformNode(node.top),
|
|
810
|
+
endModifiers: this.transformNodeList(node.endModifiers),
|
|
800
811
|
output: this.transformNode(node.output),
|
|
801
812
|
});
|
|
802
813
|
}
|
|
@@ -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;
|
|
@@ -20,6 +20,14 @@ export const QueryNode = freeze({
|
|
|
20
20
|
DeleteQueryNode.is(node) ||
|
|
21
21
|
MergeQueryNode.is(node));
|
|
22
22
|
},
|
|
23
|
+
cloneWithEndModifier(node, modifier) {
|
|
24
|
+
return freeze({
|
|
25
|
+
...node,
|
|
26
|
+
endModifiers: node.endModifiers
|
|
27
|
+
? freeze([...node.endModifiers, modifier])
|
|
28
|
+
: freeze([modifier]),
|
|
29
|
+
});
|
|
30
|
+
},
|
|
23
31
|
cloneWithWhere(node, operation) {
|
|
24
32
|
return freeze({
|
|
25
33
|
...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;
|
|
@@ -48,14 +48,6 @@ export const SelectQueryNode = freeze({
|
|
|
48
48
|
: freeze([modifier]),
|
|
49
49
|
});
|
|
50
50
|
},
|
|
51
|
-
cloneWithEndModifier(select, modifier) {
|
|
52
|
-
return freeze({
|
|
53
|
-
...select,
|
|
54
|
-
endModifiers: select.endModifiers
|
|
55
|
-
? freeze([...select.endModifiers, modifier])
|
|
56
|
-
: freeze([modifier]),
|
|
57
|
-
});
|
|
58
|
-
},
|
|
59
51
|
cloneWithOrderByItems(selectNode, items) {
|
|
60
52
|
return freeze({
|
|
61
53
|
...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;
|
|
@@ -40,9 +40,11 @@ function parseRowValues(row, columns) {
|
|
|
40
40
|
length: columns.size,
|
|
41
41
|
});
|
|
42
42
|
let hasUndefinedOrComplexColumns = false;
|
|
43
|
+
let indexedRowColumns = rowColumns.length;
|
|
43
44
|
for (const col of rowColumns) {
|
|
44
45
|
const columnIdx = columns.get(col);
|
|
45
46
|
if (isUndefined(columnIdx)) {
|
|
47
|
+
indexedRowColumns--;
|
|
46
48
|
continue;
|
|
47
49
|
}
|
|
48
50
|
const value = row[col];
|
|
@@ -51,7 +53,7 @@ function parseRowValues(row, columns) {
|
|
|
51
53
|
}
|
|
52
54
|
rowValues[columnIdx] = value;
|
|
53
55
|
}
|
|
54
|
-
const hasMissingColumns =
|
|
56
|
+
const hasMissingColumns = indexedRowColumns < columns.size;
|
|
55
57
|
if (hasMissingColumns || hasUndefinedOrComplexColumns) {
|
|
56
58
|
const defaultValue = DefaultInsertValueNode.create();
|
|
57
59
|
return ValueListNode.create(rowValues.map((it) => isUndefined(it) ? defaultValue : parseValueExpression(it)));
|
|
@@ -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`
|
|
@@ -11,38 +11,39 @@ import { createCamelCaseMapper, createSnakeCaseMapper, } from './camel-case.js';
|
|
|
11
11
|
* using `CamelCasePlugin` we would setup Kysely like this:
|
|
12
12
|
*
|
|
13
13
|
* ```ts
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* lastName: string
|
|
17
|
-
* }
|
|
14
|
+
* import * as Sqlite from 'better-sqlite3'
|
|
15
|
+
* import { CamelCasePlugin, Kysely, SqliteDialect } from 'kysely'
|
|
18
16
|
*
|
|
19
|
-
* interface
|
|
20
|
-
*
|
|
17
|
+
* interface CamelCasedDatabase {
|
|
18
|
+
* userMetadata: {
|
|
19
|
+
* firstName: string
|
|
20
|
+
* lastName: string
|
|
21
|
+
* }
|
|
21
22
|
* }
|
|
22
23
|
*
|
|
23
|
-
* const db = new Kysely<
|
|
24
|
-
* dialect: new
|
|
25
|
-
* database: '
|
|
26
|
-
* host: 'localhost',
|
|
24
|
+
* const db = new Kysely<CamelCasedDatabase>({
|
|
25
|
+
* dialect: new SqliteDialect({
|
|
26
|
+
* database: new Sqlite(':memory:'),
|
|
27
27
|
* }),
|
|
28
|
-
* plugins: [
|
|
29
|
-
* new CamelCasePlugin()
|
|
30
|
-
* ]
|
|
28
|
+
* plugins: [new CamelCasePlugin()],
|
|
31
29
|
* })
|
|
32
30
|
*
|
|
33
|
-
* const person = await db.selectFrom('
|
|
31
|
+
* const person = await db.selectFrom('userMetadata')
|
|
34
32
|
* .where('firstName', '=', 'Arnold')
|
|
35
33
|
* .select(['firstName', 'lastName'])
|
|
36
34
|
* .executeTakeFirst()
|
|
37
35
|
*
|
|
38
|
-
* // generated sql:
|
|
39
|
-
* // select first_name, last_name from person_table where first_name = $1
|
|
40
|
-
*
|
|
41
36
|
* if (person) {
|
|
42
37
|
* console.log(person.firstName)
|
|
43
38
|
* }
|
|
44
39
|
* ```
|
|
45
40
|
*
|
|
41
|
+
* The generated SQL (SQLite):
|
|
42
|
+
*
|
|
43
|
+
* ```sql
|
|
44
|
+
* select "first_name", "last_name" from "user_metadata" where "first_name" = ?
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
46
47
|
* As you can see from the example, __everything__ needs to be defined
|
|
47
48
|
* in camelCase in the TypeScript code: table names, columns, schemas,
|
|
48
49
|
* __everything__. When using the `CamelCasePlugin` Kysely works as if
|
|
@@ -57,11 +58,15 @@ import { createCamelCaseMapper, createSnakeCaseMapper, } from './camel-case.js';
|
|
|
57
58
|
* ```ts
|
|
58
59
|
* class MyCamelCasePlugin extends CamelCasePlugin {
|
|
59
60
|
* protected override snakeCase(str: string): string {
|
|
60
|
-
*
|
|
61
|
+
* // ...
|
|
62
|
+
*
|
|
63
|
+
* return str
|
|
61
64
|
* }
|
|
62
65
|
*
|
|
63
66
|
* protected override camelCase(str: string): string {
|
|
64
|
-
*
|
|
67
|
+
* // ...
|
|
68
|
+
*
|
|
69
|
+
* return str
|
|
65
70
|
* }
|
|
66
71
|
* }
|
|
67
72
|
* ```
|
|
@@ -20,7 +20,10 @@ export function createSnakeCaseMapper({ upperCase = false, underscoreBeforeDigit
|
|
|
20
20
|
// If underScoreBeforeDigits is true then, well, insert an underscore
|
|
21
21
|
// before digits :). Only the first digit gets an underscore if
|
|
22
22
|
// there are multiple.
|
|
23
|
-
if (underscoreBeforeDigits &&
|
|
23
|
+
if (underscoreBeforeDigits &&
|
|
24
|
+
isDigit(char) &&
|
|
25
|
+
!isDigit(prevChar) &&
|
|
26
|
+
!out.endsWith('_')) {
|
|
24
27
|
out += '_' + char;
|
|
25
28
|
continue;
|
|
26
29
|
}
|