kysely 0.27.3 → 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 +2 -2
- package/README.md +7 -7
- package/deno.check.d.ts +86 -0
- package/deno.check.json +21 -0
- package/dist/cjs/dialect/dialect-adapter-base.d.ts +13 -3
- package/dist/cjs/dialect/dialect-adapter-base.js +4 -1
- package/dist/cjs/dialect/dialect-adapter.d.ts +16 -2
- package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +12 -7
- package/dist/cjs/dialect/mssql/mssql-adapter.js +2 -4
- package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +83 -55
- package/dist/cjs/dialect/mssql/mssql-driver.d.ts +1 -0
- package/dist/cjs/dialect/mssql/mssql-driver.js +114 -48
- 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/database-connection.d.ts +3 -1
- package/dist/cjs/driver/dummy-driver.d.ts +13 -12
- package/dist/cjs/driver/dummy-driver.js +13 -12
- package/dist/cjs/dynamic/dynamic-reference-builder.js +2 -2
- package/dist/cjs/dynamic/dynamic.d.ts +7 -7
- package/dist/cjs/dynamic/dynamic.js +7 -7
- package/dist/cjs/expression/expression-builder.d.ts +153 -62
- package/dist/cjs/expression/expression-builder.js +2 -3
- package/dist/cjs/expression/expression-wrapper.d.ts +92 -23
- package/dist/cjs/expression/expression.d.ts +40 -5
- package/dist/cjs/expression/expression.js +2 -3
- package/dist/cjs/helpers/mssql.d.ts +74 -14
- package/dist/cjs/helpers/mssql.js +77 -18
- package/dist/cjs/helpers/mysql.d.ts +17 -13
- package/dist/cjs/helpers/mysql.js +20 -17
- package/dist/cjs/helpers/postgres.d.ts +11 -8
- package/dist/cjs/helpers/postgres.js +14 -12
- package/dist/cjs/helpers/sqlite.d.ts +41 -16
- package/dist/cjs/helpers/sqlite.js +44 -20
- package/dist/cjs/index.d.ts +28 -21
- package/dist/cjs/index.js +28 -21
- package/dist/cjs/kysely.d.ts +100 -42
- package/dist/cjs/kysely.js +63 -39
- 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/alter-column-node.d.ts +1 -1
- package/dist/cjs/operation-node/case-node.d.ts +1 -1
- package/dist/cjs/operation-node/column-definition-node.d.ts +1 -0
- package/dist/cjs/operation-node/data-type-node.d.ts +2 -2
- package/dist/cjs/operation-node/data-type-node.js +17 -3
- package/dist/cjs/operation-node/delete-query-node.d.ts +3 -0
- package/dist/cjs/operation-node/foreign-key-constraint-node.d.ts +4 -4
- package/dist/cjs/operation-node/having-node.d.ts +1 -1
- package/dist/cjs/operation-node/insert-query-node.d.ts +3 -0
- package/dist/cjs/operation-node/merge-query-node.d.ts +3 -0
- package/dist/cjs/operation-node/on-node.d.ts +1 -1
- package/dist/cjs/operation-node/operation-node-source.js +1 -2
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +11 -3
- package/dist/cjs/operation-node/operation-node-transformer.js +26 -3
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/operator-node.d.ts +3 -3
- package/dist/cjs/operation-node/operator-node.js +8 -6
- package/dist/cjs/operation-node/output-node.d.ts +13 -0
- package/dist/cjs/operation-node/output-node.js +26 -0
- package/dist/cjs/operation-node/query-node.d.ts +15 -6
- package/dist/cjs/operation-node/query-node.js +17 -0
- package/dist/cjs/operation-node/select-query-node.d.ts +1 -1
- package/dist/cjs/operation-node/select-query-node.js +6 -8
- package/dist/cjs/operation-node/update-query-node.d.ts +3 -0
- package/dist/cjs/operation-node/where-node.d.ts +1 -1
- package/dist/cjs/parser/binary-operation-parser.js +5 -6
- package/dist/cjs/parser/data-type-parser.js +1 -2
- package/dist/cjs/parser/default-value-parser.js +1 -2
- package/dist/cjs/parser/expression-parser.js +3 -4
- package/dist/cjs/parser/fetch-parser.js +1 -2
- package/dist/cjs/parser/group-by-parser.js +1 -2
- package/dist/cjs/parser/identifier-parser.js +1 -2
- package/dist/cjs/parser/insert-values-parser.js +1 -2
- package/dist/cjs/parser/join-parser.js +1 -2
- package/dist/cjs/parser/merge-parser.js +2 -3
- package/dist/cjs/parser/on-commit-action-parse.js +1 -2
- package/dist/cjs/parser/on-modify-action-parser.js +1 -2
- package/dist/cjs/parser/order-by-parser.js +3 -4
- package/dist/cjs/parser/parse-utils.js +4 -5
- package/dist/cjs/parser/partition-by-parser.js +1 -2
- package/dist/cjs/parser/reference-parser.js +8 -9
- package/dist/cjs/parser/returning-parser.d.ts +4 -3
- package/dist/cjs/parser/select-parser.js +2 -3
- package/dist/cjs/parser/set-operation-parser.js +1 -2
- package/dist/cjs/parser/table-parser.js +4 -5
- package/dist/cjs/parser/top-parser.js +1 -2
- package/dist/cjs/parser/unary-operation-parser.js +3 -4
- package/dist/cjs/parser/update-set-parser.js +2 -3
- package/dist/cjs/parser/value-parser.js +4 -5
- package/dist/cjs/parser/with-parser.js +1 -2
- package/dist/cjs/plugin/camel-case/camel-case-plugin.d.ts +54 -27
- package/dist/cjs/plugin/camel-case/camel-case-plugin.js +26 -21
- package/dist/cjs/plugin/camel-case/camel-case.js +2 -3
- 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 +80 -9
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +53 -14
- 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 +219 -43
- package/dist/cjs/query-builder/delete-query-builder.js +95 -31
- package/dist/cjs/query-builder/function-module.d.ts +40 -93
- package/dist/cjs/query-builder/function-module.js +1 -2
- package/dist/cjs/query-builder/insert-query-builder.d.ts +326 -67
- package/dist/cjs/query-builder/insert-query-builder.js +212 -61
- 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 +312 -10
- package/dist/cjs/query-builder/merge-query-builder.js +98 -7
- package/dist/cjs/query-builder/no-result-error.js +2 -2
- package/dist/cjs/query-builder/on-conflict-builder.d.ts +53 -20
- package/dist/cjs/query-builder/on-conflict-builder.js +41 -16
- package/dist/cjs/query-builder/output-interface.d.ts +138 -0
- package/dist/cjs/query-builder/output-interface.js +2 -0
- package/dist/cjs/query-builder/returning-interface.d.ts +7 -5
- package/dist/cjs/query-builder/select-query-builder-expression.d.ts +8 -0
- package/dist/cjs/query-builder/select-query-builder.d.ts +370 -73
- package/dist/cjs/query-builder/select-query-builder.js +14 -9
- package/dist/cjs/query-builder/update-query-builder.d.ts +225 -31
- package/dist/cjs/query-builder/update-query-builder.js +96 -17
- package/dist/cjs/query-builder/update-result.d.ts +9 -0
- package/dist/cjs/query-builder/update-result.js +9 -0
- package/dist/cjs/query-builder/where-interface.d.ts +6 -2
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +45 -1
- package/dist/cjs/query-creator.d.ts +122 -21
- package/dist/cjs/query-creator.js +56 -3
- package/dist/cjs/raw-builder/raw-builder.d.ts +29 -7
- package/dist/cjs/raw-builder/raw-builder.js +1 -2
- package/dist/cjs/raw-builder/sql.d.ts +31 -12
- package/dist/cjs/schema/alter-column-builder.d.ts +17 -3
- package/dist/cjs/schema/alter-column-builder.js +20 -3
- package/dist/cjs/schema/alter-table-add-index-builder.d.ts +44 -10
- package/dist/cjs/schema/alter-table-add-index-builder.js +27 -10
- package/dist/cjs/schema/alter-table-builder.js +1 -2
- package/dist/cjs/schema/column-definition-builder.d.ts +286 -24
- package/dist/cjs/schema/column-definition-builder.js +288 -24
- 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/assert.js +2 -3
- package/dist/cjs/util/column-type.d.ts +5 -9
- package/dist/cjs/util/compilable.js +1 -2
- package/dist/cjs/util/json-object-args.js +1 -2
- package/dist/cjs/util/log-once.js +1 -2
- package/dist/cjs/util/object-utils.js +38 -26
- package/dist/cjs/util/performance-now.js +1 -2
- package/dist/cjs/util/prevent-await.js +1 -2
- package/dist/cjs/util/query-id.js +1 -2
- package/dist/cjs/util/random-string.js +1 -2
- package/dist/cjs/util/require-all-props.d.ts +4 -2
- package/dist/cjs/util/require-all-props.js +5 -4
- package/dist/cjs/util/stack-trace-utils.js +1 -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 +13 -3
- package/dist/esm/dialect/dialect-adapter-base.js +4 -1
- package/dist/esm/dialect/dialect-adapter.d.ts +16 -2
- package/dist/esm/dialect/mssql/mssql-adapter.d.ts +12 -7
- package/dist/esm/dialect/mssql/mssql-adapter.js +2 -4
- package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +83 -55
- package/dist/esm/dialect/mssql/mssql-driver.d.ts +1 -0
- package/dist/esm/dialect/mssql/mssql-driver.js +114 -48
- 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/database-connection.d.ts +3 -1
- 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 +7 -7
- package/dist/esm/dynamic/dynamic.js +7 -7
- package/dist/esm/expression/expression-builder.d.ts +153 -62
- 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 +17 -13
- package/dist/esm/helpers/mysql.js +17 -13
- package/dist/esm/helpers/postgres.d.ts +11 -8
- package/dist/esm/helpers/postgres.js +11 -8
- package/dist/esm/helpers/sqlite.d.ts +41 -16
- package/dist/esm/helpers/sqlite.js +41 -16
- package/dist/esm/index.d.ts +28 -21
- package/dist/esm/index.js +28 -21
- package/dist/esm/kysely.d.ts +100 -42
- package/dist/esm/kysely.js +61 -37
- 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/alter-column-node.d.ts +1 -1
- package/dist/esm/operation-node/case-node.d.ts +1 -1
- package/dist/esm/operation-node/column-definition-node.d.ts +1 -0
- package/dist/esm/operation-node/data-type-node.d.ts +2 -2
- package/dist/esm/operation-node/data-type-node.js +15 -1
- package/dist/esm/operation-node/delete-query-node.d.ts +3 -0
- package/dist/esm/operation-node/foreign-key-constraint-node.d.ts +4 -4
- package/dist/esm/operation-node/having-node.d.ts +1 -1
- package/dist/esm/operation-node/insert-query-node.d.ts +3 -0
- package/dist/esm/operation-node/merge-query-node.d.ts +3 -0
- package/dist/esm/operation-node/on-node.d.ts +1 -1
- package/dist/esm/operation-node/operation-node-transformer.d.ts +11 -3
- package/dist/esm/operation-node/operation-node-transformer.js +26 -3
- package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-visitor.js +1 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/operator-node.d.ts +3 -3
- package/dist/esm/operation-node/operator-node.js +2 -0
- package/dist/esm/operation-node/output-node.d.ts +13 -0
- package/dist/esm/operation-node/output-node.js +24 -0
- package/dist/esm/operation-node/query-node.d.ts +15 -6
- package/dist/esm/operation-node/query-node.js +17 -0
- package/dist/esm/operation-node/select-query-node.d.ts +1 -1
- package/dist/esm/operation-node/select-query-node.js +6 -8
- package/dist/esm/operation-node/update-query-node.d.ts +3 -0
- package/dist/esm/operation-node/where-node.d.ts +1 -1
- package/dist/esm/parser/returning-parser.d.ts +4 -3
- package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +54 -27
- package/dist/esm/plugin/camel-case/camel-case-plugin.js +26 -21
- 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 +80 -9
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +53 -14
- 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 +219 -43
- package/dist/esm/query-builder/delete-query-builder.js +95 -31
- package/dist/esm/query-builder/function-module.d.ts +40 -93
- package/dist/esm/query-builder/insert-query-builder.d.ts +326 -67
- package/dist/esm/query-builder/insert-query-builder.js +212 -61
- 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 +312 -10
- package/dist/esm/query-builder/merge-query-builder.js +98 -7
- package/dist/esm/query-builder/on-conflict-builder.d.ts +53 -20
- package/dist/esm/query-builder/on-conflict-builder.js +41 -16
- package/dist/esm/query-builder/output-interface.d.ts +138 -0
- package/dist/esm/query-builder/output-interface.js +2 -0
- package/dist/esm/query-builder/returning-interface.d.ts +7 -5
- package/dist/esm/query-builder/select-query-builder-expression.d.ts +8 -0
- package/dist/esm/query-builder/select-query-builder.d.ts +370 -73
- package/dist/esm/query-builder/select-query-builder.js +13 -7
- package/dist/esm/query-builder/update-query-builder.d.ts +225 -31
- package/dist/esm/query-builder/update-query-builder.js +96 -17
- package/dist/esm/query-builder/update-result.d.ts +9 -0
- package/dist/esm/query-builder/update-result.js +9 -0
- package/dist/esm/query-builder/where-interface.d.ts +6 -2
- package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -0
- package/dist/esm/query-compiler/default-query-compiler.js +45 -1
- package/dist/esm/query-creator.d.ts +122 -21
- package/dist/esm/query-creator.js +56 -3
- package/dist/esm/raw-builder/raw-builder.d.ts +29 -7
- package/dist/esm/raw-builder/sql.d.ts +31 -12
- package/dist/esm/schema/alter-column-builder.d.ts +17 -3
- package/dist/esm/schema/alter-column-builder.js +20 -3
- package/dist/esm/schema/alter-table-add-index-builder.d.ts +44 -10
- package/dist/esm/schema/alter-table-add-index-builder.js +27 -10
- package/dist/esm/schema/alter-table-builder.js +1 -2
- package/dist/esm/schema/column-definition-builder.d.ts +286 -24
- package/dist/esm/schema/column-definition-builder.js +288 -24
- 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/object-utils.js +18 -5
- 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 +30 -24
|
@@ -4,47 +4,48 @@ import { SnakeCaseTransformer } from './camel-case-transformer.js';
|
|
|
4
4
|
import { createCamelCaseMapper, createSnakeCaseMapper, } from './camel-case.js';
|
|
5
5
|
/**
|
|
6
6
|
* A plugin that converts snake_case identifiers in the database into
|
|
7
|
-
* camelCase in the
|
|
7
|
+
* camelCase in the JavaScript side.
|
|
8
8
|
*
|
|
9
9
|
* For example let's assume we have a table called `person_table`
|
|
10
10
|
* with columns `first_name` and `last_name` in the database. When
|
|
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
|
-
* in camelCase in the
|
|
48
|
+
* in camelCase in the TypeScript code: table names, columns, schemas,
|
|
48
49
|
* __everything__. When using the `CamelCasePlugin` Kysely works as if
|
|
49
50
|
* the database was defined in camelCase.
|
|
50
51
|
*
|
|
@@ -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
|
* ```
|
|
@@ -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`
|
|
@@ -3,7 +3,7 @@ import { DeduplicateJoinsTransformer } from './deduplicate-joins-transformer.js'
|
|
|
3
3
|
/**
|
|
4
4
|
* Plugin that removes duplicate joins from queries.
|
|
5
5
|
*
|
|
6
|
-
* See [this recipe](https://github.com/
|
|
6
|
+
* See [this recipe](https://github.com/kysely-org/kysely/blob/master/site/docs/recipes/0008-deduplicate-joins.md)
|
|
7
7
|
*/
|
|
8
8
|
export class DeduplicateJoinsPlugin {
|
|
9
9
|
#transformer = new DeduplicateJoinsTransformer();
|
|
@@ -24,8 +24,8 @@ export class DeduplicateJoinsTransformer extends OperationNodeTransformer {
|
|
|
24
24
|
const out = [];
|
|
25
25
|
for (let i = 0; i < joins.length; ++i) {
|
|
26
26
|
let foundDuplicate = false;
|
|
27
|
-
for (let j =
|
|
28
|
-
if (compare(joins[i],
|
|
27
|
+
for (let j = 0; j < out.length; ++j) {
|
|
28
|
+
if (compare(joins[i], out[j])) {
|
|
29
29
|
foundDuplicate = true;
|
|
30
30
|
break;
|
|
31
31
|
}
|
|
@@ -22,19 +22,41 @@ export declare class ImmediateValuePlugin implements KyselyPlugin {
|
|
|
22
22
|
* can use a `WeakMap` with {@link PluginTransformQueryArgs.queryId | args.queryId} as the key:
|
|
23
23
|
*
|
|
24
24
|
* ```ts
|
|
25
|
-
*
|
|
26
|
-
*
|
|
25
|
+
* import type {
|
|
26
|
+
* KyselyPlugin,
|
|
27
|
+
* QueryResult,
|
|
28
|
+
* RootOperationNode,
|
|
29
|
+
* UnknownRow
|
|
30
|
+
* } from 'kysely'
|
|
31
|
+
*
|
|
32
|
+
* interface MyData {
|
|
33
|
+
* // ...
|
|
34
|
+
* }
|
|
35
|
+
* const data = new WeakMap<any, MyData>()
|
|
27
36
|
*
|
|
37
|
+
* const plugin = {
|
|
28
38
|
* transformQuery(args: PluginTransformQueryArgs): RootOperationNode {
|
|
29
|
-
*
|
|
39
|
+
* const something: MyData = {}
|
|
40
|
+
*
|
|
41
|
+
* // ...
|
|
42
|
+
*
|
|
43
|
+
* data.set(args.queryId, something)
|
|
44
|
+
*
|
|
45
|
+
* // ...
|
|
46
|
+
*
|
|
30
47
|
* return args.node
|
|
31
48
|
* },
|
|
32
49
|
*
|
|
33
|
-
* transformResult(args: PluginTransformResultArgs): QueryResult<UnknownRow
|
|
34
|
-
*
|
|
50
|
+
* async transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>> {
|
|
51
|
+
* // ...
|
|
52
|
+
*
|
|
53
|
+
* const something = data.get(args.queryId)
|
|
54
|
+
*
|
|
55
|
+
* // ...
|
|
56
|
+
*
|
|
35
57
|
* return args.result
|
|
36
58
|
* }
|
|
37
|
-
* }
|
|
59
|
+
* } satisfies KyselyPlugin
|
|
38
60
|
* ```
|
|
39
61
|
*
|
|
40
62
|
* You should use a `WeakMap` instead of a `Map` or some other strong references because `transformQuery`
|
|
@@ -13,19 +13,41 @@ export interface KyselyPlugin {
|
|
|
13
13
|
* can use a `WeakMap` with {@link PluginTransformQueryArgs.queryId | args.queryId} as the key:
|
|
14
14
|
*
|
|
15
15
|
* ```ts
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
* import type {
|
|
17
|
+
* KyselyPlugin,
|
|
18
|
+
* QueryResult,
|
|
19
|
+
* RootOperationNode,
|
|
20
|
+
* UnknownRow
|
|
21
|
+
* } from 'kysely'
|
|
22
|
+
*
|
|
23
|
+
* interface MyData {
|
|
24
|
+
* // ...
|
|
25
|
+
* }
|
|
26
|
+
* const data = new WeakMap<any, MyData>()
|
|
18
27
|
*
|
|
28
|
+
* const plugin = {
|
|
19
29
|
* transformQuery(args: PluginTransformQueryArgs): RootOperationNode {
|
|
20
|
-
*
|
|
30
|
+
* const something: MyData = {}
|
|
31
|
+
*
|
|
32
|
+
* // ...
|
|
33
|
+
*
|
|
34
|
+
* data.set(args.queryId, something)
|
|
35
|
+
*
|
|
36
|
+
* // ...
|
|
37
|
+
*
|
|
21
38
|
* return args.node
|
|
22
39
|
* },
|
|
23
40
|
*
|
|
24
|
-
* transformResult(args: PluginTransformResultArgs): QueryResult<UnknownRow
|
|
25
|
-
*
|
|
41
|
+
* async transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>> {
|
|
42
|
+
* // ...
|
|
43
|
+
*
|
|
44
|
+
* const something = data.get(args.queryId)
|
|
45
|
+
*
|
|
46
|
+
* // ...
|
|
47
|
+
*
|
|
26
48
|
* return args.result
|
|
27
49
|
* }
|
|
28
|
-
* }
|
|
50
|
+
* } satisfies KyselyPlugin
|
|
29
51
|
* ```
|
|
30
52
|
*
|
|
31
53
|
* You should use a `WeakMap` instead of a `Map` or some other strong references because `transformQuery`
|
|
@@ -13,19 +13,41 @@ export declare class NoopPlugin implements KyselyPlugin {
|
|
|
13
13
|
* can use a `WeakMap` with {@link PluginTransformQueryArgs.queryId | args.queryId} as the key:
|
|
14
14
|
*
|
|
15
15
|
* ```ts
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
* import type {
|
|
17
|
+
* KyselyPlugin,
|
|
18
|
+
* QueryResult,
|
|
19
|
+
* RootOperationNode,
|
|
20
|
+
* UnknownRow
|
|
21
|
+
* } from 'kysely'
|
|
22
|
+
*
|
|
23
|
+
* interface MyData {
|
|
24
|
+
* // ...
|
|
25
|
+
* }
|
|
26
|
+
* const data = new WeakMap<any, MyData>()
|
|
18
27
|
*
|
|
28
|
+
* const plugin = {
|
|
19
29
|
* transformQuery(args: PluginTransformQueryArgs): RootOperationNode {
|
|
20
|
-
*
|
|
30
|
+
* const something: MyData = {}
|
|
31
|
+
*
|
|
32
|
+
* // ...
|
|
33
|
+
*
|
|
34
|
+
* data.set(args.queryId, something)
|
|
35
|
+
*
|
|
36
|
+
* // ...
|
|
37
|
+
*
|
|
21
38
|
* return args.node
|
|
22
39
|
* },
|
|
23
40
|
*
|
|
24
|
-
* transformResult(args: PluginTransformResultArgs): QueryResult<UnknownRow
|
|
25
|
-
*
|
|
41
|
+
* async transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>> {
|
|
42
|
+
* // ...
|
|
43
|
+
*
|
|
44
|
+
* const something = data.get(args.queryId)
|
|
45
|
+
*
|
|
46
|
+
* // ...
|
|
47
|
+
*
|
|
26
48
|
* return args.result
|
|
27
49
|
* }
|
|
28
|
-
* }
|
|
50
|
+
* } satisfies KyselyPlugin
|
|
29
51
|
* ```
|
|
30
52
|
*
|
|
31
53
|
* You should use a `WeakMap` instead of a `Map` or some other strong references because `transformQuery`
|
|
@@ -2,20 +2,68 @@ import { QueryResult } from '../../driver/database-connection.js';
|
|
|
2
2
|
import { RootOperationNode } from '../../query-compiler/query-compiler.js';
|
|
3
3
|
import { UnknownRow } from '../../util/type-utils.js';
|
|
4
4
|
import { KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs } from '../kysely-plugin.js';
|
|
5
|
+
export interface ParseJSONResultsPluginOptions {
|
|
6
|
+
/**
|
|
7
|
+
* When `'in-place'`, arrays' and objects' values are parsed in-place. This is
|
|
8
|
+
* the most time and space efficient option.
|
|
9
|
+
*
|
|
10
|
+
* This can result in runtime errors if some objects/arrays are readonly.
|
|
11
|
+
*
|
|
12
|
+
* When `'create'`, new arrays and objects are created to avoid such errors.
|
|
13
|
+
*
|
|
14
|
+
* Defaults to `'in-place'`.
|
|
15
|
+
*/
|
|
16
|
+
objectStrategy?: ObjectStrategy;
|
|
17
|
+
}
|
|
18
|
+
type ObjectStrategy = 'in-place' | 'create';
|
|
5
19
|
/**
|
|
6
20
|
* Parses JSON strings in query results into JSON objects.
|
|
7
21
|
*
|
|
8
22
|
* This plugin can be useful with dialects that don't automatically parse
|
|
9
23
|
* JSON into objects and arrays but return JSON strings instead.
|
|
10
24
|
*
|
|
25
|
+
* To apply this plugin globally, pass an instance of it to the `plugins` option
|
|
26
|
+
* when creating a new `Kysely` instance:
|
|
27
|
+
*
|
|
11
28
|
* ```ts
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
29
|
+
* import * as Sqlite from 'better-sqlite3'
|
|
30
|
+
* import { Kysely, ParseJSONResultsPlugin, SqliteDialect } from 'kysely'
|
|
31
|
+
* import type { Database } from 'type-editor' // imaginary module
|
|
32
|
+
*
|
|
33
|
+
* const db = new Kysely<Database>({
|
|
34
|
+
* dialect: new SqliteDialect({
|
|
35
|
+
* database: new Sqlite(':memory:'),
|
|
36
|
+
* }),
|
|
37
|
+
* plugins: [new ParseJSONResultsPlugin()],
|
|
15
38
|
* })
|
|
16
39
|
* ```
|
|
40
|
+
*
|
|
41
|
+
* To apply this plugin to a single query:
|
|
42
|
+
*
|
|
43
|
+
* ```ts
|
|
44
|
+
* import { ParseJSONResultsPlugin } from 'kysely'
|
|
45
|
+
* import { jsonArrayFrom } from 'kysely/helpers/sqlite'
|
|
46
|
+
*
|
|
47
|
+
* const result = await db
|
|
48
|
+
* .selectFrom('person')
|
|
49
|
+
* .select((eb) => [
|
|
50
|
+
* 'id',
|
|
51
|
+
* 'first_name',
|
|
52
|
+
* 'last_name',
|
|
53
|
+
* jsonArrayFrom(
|
|
54
|
+
* eb.selectFrom('pet')
|
|
55
|
+
* .whereRef('owner_id', '=', 'person.id')
|
|
56
|
+
* .select(['name', 'species'])
|
|
57
|
+
* ).as('pets')
|
|
58
|
+
* ])
|
|
59
|
+
* .withPlugin(new ParseJSONResultsPlugin())
|
|
60
|
+
* .execute()
|
|
61
|
+
* ```
|
|
17
62
|
*/
|
|
18
63
|
export declare class ParseJSONResultsPlugin implements KyselyPlugin {
|
|
64
|
+
#private;
|
|
65
|
+
readonly opt: ParseJSONResultsPluginOptions;
|
|
66
|
+
constructor(opt?: ParseJSONResultsPluginOptions);
|
|
19
67
|
/**
|
|
20
68
|
* This is called for each query before it is executed. You can modify the query by
|
|
21
69
|
* transforming its {@link OperationNode} tree provided in {@link PluginTransformQueryArgs.node | args.node}
|
|
@@ -26,19 +74,41 @@ export declare class ParseJSONResultsPlugin implements KyselyPlugin {
|
|
|
26
74
|
* can use a `WeakMap` with {@link PluginTransformQueryArgs.queryId | args.queryId} as the key:
|
|
27
75
|
*
|
|
28
76
|
* ```ts
|
|
29
|
-
*
|
|
30
|
-
*
|
|
77
|
+
* import type {
|
|
78
|
+
* KyselyPlugin,
|
|
79
|
+
* QueryResult,
|
|
80
|
+
* RootOperationNode,
|
|
81
|
+
* UnknownRow
|
|
82
|
+
* } from 'kysely'
|
|
83
|
+
*
|
|
84
|
+
* interface MyData {
|
|
85
|
+
* // ...
|
|
86
|
+
* }
|
|
87
|
+
* const data = new WeakMap<any, MyData>()
|
|
31
88
|
*
|
|
89
|
+
* const plugin = {
|
|
32
90
|
* transformQuery(args: PluginTransformQueryArgs): RootOperationNode {
|
|
33
|
-
*
|
|
91
|
+
* const something: MyData = {}
|
|
92
|
+
*
|
|
93
|
+
* // ...
|
|
94
|
+
*
|
|
95
|
+
* data.set(args.queryId, something)
|
|
96
|
+
*
|
|
97
|
+
* // ...
|
|
98
|
+
*
|
|
34
99
|
* return args.node
|
|
35
100
|
* },
|
|
36
101
|
*
|
|
37
|
-
* transformResult(args: PluginTransformResultArgs): QueryResult<UnknownRow
|
|
38
|
-
*
|
|
102
|
+
* async transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>> {
|
|
103
|
+
* // ...
|
|
104
|
+
*
|
|
105
|
+
* const something = data.get(args.queryId)
|
|
106
|
+
*
|
|
107
|
+
* // ...
|
|
108
|
+
*
|
|
39
109
|
* return args.result
|
|
40
110
|
* }
|
|
41
|
-
* }
|
|
111
|
+
* } satisfies KyselyPlugin
|
|
42
112
|
* ```
|
|
43
113
|
*
|
|
44
114
|
* You should use a `WeakMap` instead of a `Map` or some other strong references because `transformQuery`
|
|
@@ -53,3 +123,4 @@ export declare class ParseJSONResultsPlugin implements KyselyPlugin {
|
|
|
53
123
|
*/
|
|
54
124
|
transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>>;
|
|
55
125
|
}
|
|
126
|
+
export {};
|
|
@@ -6,14 +6,51 @@ import { isPlainObject, isString } from '../../util/object-utils.js';
|
|
|
6
6
|
* This plugin can be useful with dialects that don't automatically parse
|
|
7
7
|
* JSON into objects and arrays but return JSON strings instead.
|
|
8
8
|
*
|
|
9
|
+
* To apply this plugin globally, pass an instance of it to the `plugins` option
|
|
10
|
+
* when creating a new `Kysely` instance:
|
|
11
|
+
*
|
|
9
12
|
* ```ts
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
+
* import * as Sqlite from 'better-sqlite3'
|
|
14
|
+
* import { Kysely, ParseJSONResultsPlugin, SqliteDialect } from 'kysely'
|
|
15
|
+
* import type { Database } from 'type-editor' // imaginary module
|
|
16
|
+
*
|
|
17
|
+
* const db = new Kysely<Database>({
|
|
18
|
+
* dialect: new SqliteDialect({
|
|
19
|
+
* database: new Sqlite(':memory:'),
|
|
20
|
+
* }),
|
|
21
|
+
* plugins: [new ParseJSONResultsPlugin()],
|
|
13
22
|
* })
|
|
14
23
|
* ```
|
|
24
|
+
*
|
|
25
|
+
* To apply this plugin to a single query:
|
|
26
|
+
*
|
|
27
|
+
* ```ts
|
|
28
|
+
* import { ParseJSONResultsPlugin } from 'kysely'
|
|
29
|
+
* import { jsonArrayFrom } from 'kysely/helpers/sqlite'
|
|
30
|
+
*
|
|
31
|
+
* const result = await db
|
|
32
|
+
* .selectFrom('person')
|
|
33
|
+
* .select((eb) => [
|
|
34
|
+
* 'id',
|
|
35
|
+
* 'first_name',
|
|
36
|
+
* 'last_name',
|
|
37
|
+
* jsonArrayFrom(
|
|
38
|
+
* eb.selectFrom('pet')
|
|
39
|
+
* .whereRef('owner_id', '=', 'person.id')
|
|
40
|
+
* .select(['name', 'species'])
|
|
41
|
+
* ).as('pets')
|
|
42
|
+
* ])
|
|
43
|
+
* .withPlugin(new ParseJSONResultsPlugin())
|
|
44
|
+
* .execute()
|
|
45
|
+
* ```
|
|
15
46
|
*/
|
|
16
47
|
export class ParseJSONResultsPlugin {
|
|
48
|
+
opt;
|
|
49
|
+
#objectStrategy;
|
|
50
|
+
constructor(opt = {}) {
|
|
51
|
+
this.opt = opt;
|
|
52
|
+
this.#objectStrategy = opt.objectStrategy || 'in-place';
|
|
53
|
+
}
|
|
17
54
|
// noop
|
|
18
55
|
transformQuery(args) {
|
|
19
56
|
return args.node;
|
|
@@ -21,32 +58,33 @@ export class ParseJSONResultsPlugin {
|
|
|
21
58
|
async transformResult(args) {
|
|
22
59
|
return {
|
|
23
60
|
...args.result,
|
|
24
|
-
rows: parseArray(args.result.rows),
|
|
61
|
+
rows: parseArray(args.result.rows, this.#objectStrategy),
|
|
25
62
|
};
|
|
26
63
|
}
|
|
27
64
|
}
|
|
28
|
-
function parseArray(arr) {
|
|
65
|
+
function parseArray(arr, objectStrategy) {
|
|
66
|
+
const target = objectStrategy === 'create' ? new Array(arr.length) : arr;
|
|
29
67
|
for (let i = 0; i < arr.length; ++i) {
|
|
30
|
-
|
|
68
|
+
target[i] = parse(arr[i], objectStrategy);
|
|
31
69
|
}
|
|
32
|
-
return
|
|
70
|
+
return target;
|
|
33
71
|
}
|
|
34
|
-
function parse(obj) {
|
|
72
|
+
function parse(obj, objectStrategy) {
|
|
35
73
|
if (isString(obj)) {
|
|
36
74
|
return parseString(obj);
|
|
37
75
|
}
|
|
38
76
|
if (Array.isArray(obj)) {
|
|
39
|
-
return parseArray(obj);
|
|
77
|
+
return parseArray(obj, objectStrategy);
|
|
40
78
|
}
|
|
41
79
|
if (isPlainObject(obj)) {
|
|
42
|
-
return parseObject(obj);
|
|
80
|
+
return parseObject(obj, objectStrategy);
|
|
43
81
|
}
|
|
44
82
|
return obj;
|
|
45
83
|
}
|
|
46
84
|
function parseString(str) {
|
|
47
85
|
if (maybeJson(str)) {
|
|
48
86
|
try {
|
|
49
|
-
return parse(JSON.parse(str));
|
|
87
|
+
return parse(JSON.parse(str), 'in-place');
|
|
50
88
|
}
|
|
51
89
|
catch (err) {
|
|
52
90
|
// this catch block is intentionally empty.
|
|
@@ -57,9 +95,10 @@ function parseString(str) {
|
|
|
57
95
|
function maybeJson(value) {
|
|
58
96
|
return value.match(/^[\[\{]/) != null;
|
|
59
97
|
}
|
|
60
|
-
function parseObject(obj) {
|
|
98
|
+
function parseObject(obj, objectStrategy) {
|
|
99
|
+
const target = objectStrategy === 'create' ? {} : obj;
|
|
61
100
|
for (const key in obj) {
|
|
62
|
-
|
|
101
|
+
target[key] = parse(obj[key], objectStrategy);
|
|
63
102
|
}
|
|
64
|
-
return
|
|
103
|
+
return target;
|
|
65
104
|
}
|
|
@@ -15,19 +15,41 @@ export declare class WithSchemaPlugin implements KyselyPlugin {
|
|
|
15
15
|
* can use a `WeakMap` with {@link PluginTransformQueryArgs.queryId | args.queryId} as the key:
|
|
16
16
|
*
|
|
17
17
|
* ```ts
|
|
18
|
-
*
|
|
19
|
-
*
|
|
18
|
+
* import type {
|
|
19
|
+
* KyselyPlugin,
|
|
20
|
+
* QueryResult,
|
|
21
|
+
* RootOperationNode,
|
|
22
|
+
* UnknownRow
|
|
23
|
+
* } from 'kysely'
|
|
24
|
+
*
|
|
25
|
+
* interface MyData {
|
|
26
|
+
* // ...
|
|
27
|
+
* }
|
|
28
|
+
* const data = new WeakMap<any, MyData>()
|
|
20
29
|
*
|
|
30
|
+
* const plugin = {
|
|
21
31
|
* transformQuery(args: PluginTransformQueryArgs): RootOperationNode {
|
|
22
|
-
*
|
|
32
|
+
* const something: MyData = {}
|
|
33
|
+
*
|
|
34
|
+
* // ...
|
|
35
|
+
*
|
|
36
|
+
* data.set(args.queryId, something)
|
|
37
|
+
*
|
|
38
|
+
* // ...
|
|
39
|
+
*
|
|
23
40
|
* return args.node
|
|
24
41
|
* },
|
|
25
42
|
*
|
|
26
|
-
* transformResult(args: PluginTransformResultArgs): QueryResult<UnknownRow
|
|
27
|
-
*
|
|
43
|
+
* async transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>> {
|
|
44
|
+
* // ...
|
|
45
|
+
*
|
|
46
|
+
* const something = data.get(args.queryId)
|
|
47
|
+
*
|
|
48
|
+
* // ...
|
|
49
|
+
*
|
|
28
50
|
* return args.result
|
|
29
51
|
* }
|
|
30
|
-
* }
|
|
52
|
+
* } satisfies KyselyPlugin
|
|
31
53
|
* ```
|
|
32
54
|
*
|
|
33
55
|
* You should use a `WeakMap` instead of a `Map` or some other strong references because `transformQuery`
|
|
@@ -2,10 +2,12 @@ import { AggregateFunctionNode } from '../operation-node/aggregate-function-node
|
|
|
2
2
|
import { AliasNode } from '../operation-node/alias-node.js';
|
|
3
3
|
import { OverBuilder } from './over-builder.js';
|
|
4
4
|
import { AliasableExpression, AliasedExpression, Expression } from '../expression/expression.js';
|
|
5
|
-
import { ReferenceExpression } from '../parser/reference-parser.js';
|
|
5
|
+
import { ReferenceExpression, StringReference } from '../parser/reference-parser.js';
|
|
6
6
|
import { ComparisonOperatorExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
|
|
7
7
|
import { SqlBool } from '../util/type-utils.js';
|
|
8
8
|
import { ExpressionOrFactory } from '../parser/expression-parser.js';
|
|
9
|
+
import { DynamicReferenceBuilder } from '../dynamic/dynamic-reference-builder.js';
|
|
10
|
+
import { OrderByDirectionExpression } from '../parser/order-by-parser.js';
|
|
9
11
|
export declare class AggregateFunctionBuilder<DB, TB extends keyof DB, O = unknown> implements AliasableExpression<O> {
|
|
10
12
|
#private;
|
|
11
13
|
constructor(props: AggregateFunctionBuilderProps);
|
|
@@ -14,11 +16,19 @@ export declare class AggregateFunctionBuilder<DB, TB extends keyof DB, O = unkno
|
|
|
14
16
|
* All expressions need to have this getter for complicated type-related reasons.
|
|
15
17
|
* Simply add this getter for your expression and always return `undefined` from it:
|
|
16
18
|
*
|
|
19
|
+
* ### Examples
|
|
20
|
+
*
|
|
17
21
|
* ```ts
|
|
22
|
+
* import { type Expression, type OperationNode, sql } from 'kysely'
|
|
23
|
+
*
|
|
18
24
|
* class SomeExpression<T> implements Expression<T> {
|
|
19
25
|
* get expressionType(): T | undefined {
|
|
20
26
|
* return undefined
|
|
21
27
|
* }
|
|
28
|
+
*
|
|
29
|
+
* toOperationNode(): OperationNode {
|
|
30
|
+
* return sql`some sql here`.toOperationNode()
|
|
31
|
+
* }
|
|
22
32
|
* }
|
|
23
33
|
* ```
|
|
24
34
|
*
|
|
@@ -75,6 +85,30 @@ export declare class AggregateFunctionBuilder<DB, TB extends keyof DB, O = unkno
|
|
|
75
85
|
* ```
|
|
76
86
|
*/
|
|
77
87
|
distinct(): AggregateFunctionBuilder<DB, TB, O>;
|
|
88
|
+
/**
|
|
89
|
+
* Adds an `order by` clause inside the aggregate function.
|
|
90
|
+
*
|
|
91
|
+
* ### Examples
|
|
92
|
+
*
|
|
93
|
+
* ```ts
|
|
94
|
+
* const result = await db
|
|
95
|
+
* .selectFrom('person')
|
|
96
|
+
* .innerJoin('pet', 'pet.owner_id', 'person.id')
|
|
97
|
+
* .select((eb) =>
|
|
98
|
+
* eb.fn.jsonAgg('pet').orderBy('pet.name').as('person_pets')
|
|
99
|
+
* )
|
|
100
|
+
* .executeTakeFirstOrThrow()
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* The generated SQL (PostgreSQL):
|
|
104
|
+
*
|
|
105
|
+
* ```sql
|
|
106
|
+
* select json_agg("pet" order by "pet"."name") as "person_pets"
|
|
107
|
+
* from "person"
|
|
108
|
+
* inner join "pet" ON "pet"."owner_id" = "person"."id"
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
orderBy<OE extends StringReference<DB, TB> | DynamicReferenceBuilder<any>>(orderBy: OE, direction?: OrderByDirectionExpression): AggregateFunctionBuilder<DB, TB, O>;
|
|
78
112
|
/**
|
|
79
113
|
* Adds a `filter` clause with a nested `where` clause after the function.
|
|
80
114
|
*
|
|
@@ -219,11 +253,19 @@ export declare class AggregateFunctionBuilder<DB, TB extends keyof DB, O = unkno
|
|
|
219
253
|
/**
|
|
220
254
|
* Creates the OperationNode that describes how to compile this expression into SQL.
|
|
221
255
|
*
|
|
256
|
+
* ### Examples
|
|
257
|
+
*
|
|
222
258
|
* If you are creating a custom expression, it's often easiest to use the {@link sql}
|
|
223
259
|
* template tag to build the node:
|
|
224
260
|
*
|
|
225
261
|
* ```ts
|
|
262
|
+
* import { type Expression, type OperationNode, sql } from 'kysely'
|
|
263
|
+
*
|
|
226
264
|
* class SomeExpression<T> implements Expression<T> {
|
|
265
|
+
* get expressionType(): T | undefined {
|
|
266
|
+
* return undefined
|
|
267
|
+
* }
|
|
268
|
+
*
|
|
227
269
|
* toOperationNode(): OperationNode {
|
|
228
270
|
* return sql`some sql here`.toOperationNode()
|
|
229
271
|
* }
|