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
|
@@ -3,6 +3,7 @@ import { ExplainNode } from './explain-node.js';
|
|
|
3
3
|
import { OnConflictNode } from './on-conflict-node.js';
|
|
4
4
|
import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
|
|
5
5
|
import { OperationNode } from './operation-node.js';
|
|
6
|
+
import { OutputNode } from './output-node.js';
|
|
6
7
|
import { ReturningNode } from './returning-node.js';
|
|
7
8
|
import { TableNode } from './table-node.js';
|
|
8
9
|
import { TopNode } from './top-node.js';
|
|
@@ -21,7 +22,9 @@ export interface InsertQueryNode extends OperationNode {
|
|
|
21
22
|
readonly replace?: boolean;
|
|
22
23
|
readonly explain?: ExplainNode;
|
|
23
24
|
readonly defaultValues?: boolean;
|
|
25
|
+
readonly endModifiers?: ReadonlyArray<OperationNode>;
|
|
24
26
|
readonly top?: TopNode;
|
|
27
|
+
readonly output?: OutputNode;
|
|
25
28
|
}
|
|
26
29
|
/**
|
|
27
30
|
* @internal
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AliasNode } from './alias-node.js';
|
|
2
2
|
import { JoinNode } from './join-node.js';
|
|
3
3
|
import { OperationNode } from './operation-node.js';
|
|
4
|
+
import { OutputNode } from './output-node.js';
|
|
4
5
|
import { TableNode } from './table-node.js';
|
|
5
6
|
import { TopNode } from './top-node.js';
|
|
6
7
|
import { WhenNode } from './when-node.js';
|
|
@@ -12,6 +13,8 @@ export interface MergeQueryNode extends OperationNode {
|
|
|
12
13
|
readonly whens?: ReadonlyArray<WhenNode>;
|
|
13
14
|
readonly with?: WithNode;
|
|
14
15
|
readonly top?: TopNode;
|
|
16
|
+
readonly output?: OutputNode;
|
|
17
|
+
readonly endModifiers?: ReadonlyArray<OperationNode>;
|
|
15
18
|
}
|
|
16
19
|
/**
|
|
17
20
|
* @internal
|
|
@@ -9,5 +9,5 @@ export interface OnNode extends OperationNode {
|
|
|
9
9
|
export declare const OnNode: Readonly<{
|
|
10
10
|
is(node: OperationNode): node is OnNode;
|
|
11
11
|
create(filter: OperationNode): OnNode;
|
|
12
|
-
cloneWithOperation(onNode: OnNode, operator:
|
|
12
|
+
cloneWithOperation(onNode: OnNode, operator: "And" | "Or", operation: OperationNode): OnNode;
|
|
13
13
|
}>;
|
|
@@ -91,6 +91,7 @@ import { AddIndexNode } from './add-index-node.js';
|
|
|
91
91
|
import { CastNode } from './cast-node.js';
|
|
92
92
|
import { FetchNode } from './fetch-node.js';
|
|
93
93
|
import { TopNode } from './top-node.js';
|
|
94
|
+
import { OutputNode } from './output-node.js';
|
|
94
95
|
/**
|
|
95
96
|
* Transforms an operation node tree into another one.
|
|
96
97
|
*
|
|
@@ -105,9 +106,12 @@ import { TopNode } from './top-node.js';
|
|
|
105
106
|
* snake_case, you'd do something like this:
|
|
106
107
|
*
|
|
107
108
|
* ```ts
|
|
109
|
+
* import { type IdentifierNode, OperationNodeTransformer } from 'kysely'
|
|
110
|
+
* import snakeCase from 'lodash/snakeCase'
|
|
111
|
+
*
|
|
108
112
|
* class CamelCaseTransformer extends OperationNodeTransformer {
|
|
109
|
-
* transformIdentifier(node: IdentifierNode): IdentifierNode {
|
|
110
|
-
* node = super.transformIdentifier(node)
|
|
113
|
+
* override transformIdentifier(node: IdentifierNode): IdentifierNode {
|
|
114
|
+
* node = super.transformIdentifier(node)
|
|
111
115
|
*
|
|
112
116
|
* return {
|
|
113
117
|
* ...node,
|
|
@@ -117,7 +121,10 @@ import { TopNode } from './top-node.js';
|
|
|
117
121
|
* }
|
|
118
122
|
*
|
|
119
123
|
* const transformer = new CamelCaseTransformer()
|
|
120
|
-
*
|
|
124
|
+
*
|
|
125
|
+
* const query = db.selectFrom('person').select(['first_name', 'last_name'])
|
|
126
|
+
*
|
|
127
|
+
* const tree = transformer.transformNode(query.toOperationNode())
|
|
121
128
|
* ```
|
|
122
129
|
*/
|
|
123
130
|
export declare class OperationNodeTransformer {
|
|
@@ -211,6 +218,7 @@ export declare class OperationNodeTransformer {
|
|
|
211
218
|
protected transformCast(node: CastNode): CastNode;
|
|
212
219
|
protected transformFetch(node: FetchNode): FetchNode;
|
|
213
220
|
protected transformTop(node: TopNode): TopNode;
|
|
221
|
+
protected transformOutput(node: OutputNode): OutputNode;
|
|
214
222
|
protected transformDataType(node: DataTypeNode): DataTypeNode;
|
|
215
223
|
protected transformSelectAll(node: SelectAllNode): SelectAllNode;
|
|
216
224
|
protected transformIdentifier(node: IdentifierNode): IdentifierNode;
|
|
@@ -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 {
|
|
@@ -125,6 +131,7 @@ export class OperationNodeTransformer {
|
|
|
125
131
|
CastNode: this.transformCast.bind(this),
|
|
126
132
|
FetchNode: this.transformFetch.bind(this),
|
|
127
133
|
TopNode: this.transformTop.bind(this),
|
|
134
|
+
OutputNode: this.transformOutput.bind(this),
|
|
128
135
|
});
|
|
129
136
|
transformNode(node) {
|
|
130
137
|
if (!node) {
|
|
@@ -260,12 +267,14 @@ export class OperationNodeTransformer {
|
|
|
260
267
|
returning: this.transformNode(node.returning),
|
|
261
268
|
onConflict: this.transformNode(node.onConflict),
|
|
262
269
|
onDuplicateKey: this.transformNode(node.onDuplicateKey),
|
|
270
|
+
endModifiers: this.transformNodeList(node.endModifiers),
|
|
263
271
|
with: this.transformNode(node.with),
|
|
264
272
|
ignore: node.ignore,
|
|
265
273
|
replace: node.replace,
|
|
266
274
|
explain: this.transformNode(node.explain),
|
|
267
275
|
defaultValues: node.defaultValues,
|
|
268
276
|
top: this.transformNode(node.top),
|
|
277
|
+
output: this.transformNode(node.output),
|
|
269
278
|
});
|
|
270
279
|
}
|
|
271
280
|
transformValues(node) {
|
|
@@ -282,11 +291,13 @@ export class OperationNodeTransformer {
|
|
|
282
291
|
joins: this.transformNodeList(node.joins),
|
|
283
292
|
where: this.transformNode(node.where),
|
|
284
293
|
returning: this.transformNode(node.returning),
|
|
294
|
+
endModifiers: this.transformNodeList(node.endModifiers),
|
|
285
295
|
with: this.transformNode(node.with),
|
|
286
296
|
orderBy: this.transformNode(node.orderBy),
|
|
287
297
|
limit: this.transformNode(node.limit),
|
|
288
298
|
explain: this.transformNode(node.explain),
|
|
289
299
|
top: this.transformNode(node.top),
|
|
300
|
+
output: this.transformNode(node.output),
|
|
290
301
|
});
|
|
291
302
|
}
|
|
292
303
|
transformReturning(node) {
|
|
@@ -327,6 +338,7 @@ export class OperationNodeTransformer {
|
|
|
327
338
|
endModifiers: this.transformNodeList(node.endModifiers),
|
|
328
339
|
nullsNotDistinct: node.nullsNotDistinct,
|
|
329
340
|
identity: node.identity,
|
|
341
|
+
ifNotExists: node.ifNotExists,
|
|
330
342
|
});
|
|
331
343
|
}
|
|
332
344
|
transformAddColumn(node) {
|
|
@@ -377,10 +389,12 @@ export class OperationNodeTransformer {
|
|
|
377
389
|
where: this.transformNode(node.where),
|
|
378
390
|
updates: this.transformNodeList(node.updates),
|
|
379
391
|
returning: this.transformNode(node.returning),
|
|
392
|
+
endModifiers: this.transformNodeList(node.endModifiers),
|
|
380
393
|
with: this.transformNode(node.with),
|
|
381
394
|
explain: this.transformNode(node.explain),
|
|
382
395
|
limit: this.transformNode(node.limit),
|
|
383
396
|
top: this.transformNode(node.top),
|
|
397
|
+
output: this.transformNode(node.output),
|
|
384
398
|
});
|
|
385
399
|
}
|
|
386
400
|
transformColumnUpdate(node) {
|
|
@@ -682,6 +696,7 @@ export class OperationNodeTransformer {
|
|
|
682
696
|
kind: 'AggregateFunctionNode',
|
|
683
697
|
aggregated: this.transformNodeList(node.aggregated),
|
|
684
698
|
distinct: node.distinct,
|
|
699
|
+
orderBy: this.transformNode(node.orderBy),
|
|
685
700
|
filter: this.transformNode(node.filter),
|
|
686
701
|
func: node.func,
|
|
687
702
|
over: this.transformNode(node.over),
|
|
@@ -792,6 +807,8 @@ export class OperationNodeTransformer {
|
|
|
792
807
|
whens: this.transformNodeList(node.whens),
|
|
793
808
|
with: this.transformNode(node.with),
|
|
794
809
|
top: this.transformNode(node.top),
|
|
810
|
+
endModifiers: this.transformNodeList(node.endModifiers),
|
|
811
|
+
output: this.transformNode(node.output),
|
|
795
812
|
});
|
|
796
813
|
}
|
|
797
814
|
transformMatched(node) {
|
|
@@ -832,6 +849,12 @@ export class OperationNodeTransformer {
|
|
|
832
849
|
modifiers: node.modifiers,
|
|
833
850
|
});
|
|
834
851
|
}
|
|
852
|
+
transformOutput(node) {
|
|
853
|
+
return requireAllProps({
|
|
854
|
+
kind: 'OutputNode',
|
|
855
|
+
selections: this.transformNodeList(node.selections),
|
|
856
|
+
});
|
|
857
|
+
}
|
|
835
858
|
transformDataType(node) {
|
|
836
859
|
// An Object.freezed leaf node. No need to clone.
|
|
837
860
|
return node;
|
|
@@ -91,6 +91,7 @@ import { AddIndexNode } from './add-index-node.js';
|
|
|
91
91
|
import { CastNode } from './cast-node.js';
|
|
92
92
|
import { FetchNode } from './fetch-node.js';
|
|
93
93
|
import { TopNode } from './top-node.js';
|
|
94
|
+
import { OutputNode } from './output-node.js';
|
|
94
95
|
export declare abstract class OperationNodeVisitor {
|
|
95
96
|
#private;
|
|
96
97
|
protected readonly nodeStack: OperationNode[];
|
|
@@ -188,4 +189,5 @@ export declare abstract class OperationNodeVisitor {
|
|
|
188
189
|
protected abstract visitCast(node: CastNode): void;
|
|
189
190
|
protected abstract visitFetch(node: FetchNode): void;
|
|
190
191
|
protected abstract visitTop(node: TopNode): void;
|
|
192
|
+
protected abstract visitOutput(node: OutputNode): void;
|
|
191
193
|
}
|
|
@@ -98,6 +98,7 @@ export class OperationNodeVisitor {
|
|
|
98
98
|
CastNode: this.visitCast.bind(this),
|
|
99
99
|
FetchNode: this.visitFetch.bind(this),
|
|
100
100
|
TopNode: this.visitTop.bind(this),
|
|
101
|
+
OutputNode: this.visitOutput.bind(this),
|
|
101
102
|
});
|
|
102
103
|
visitNode = (node) => {
|
|
103
104
|
this.nodeStack.push(node);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type OperationNodeKind = 'IdentifierNode' | 'SchemableIdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode' | 'SelectModifierNode' | 'CreateTypeNode' | 'DropTypeNode' | 'ExplainNode' | 'DefaultInsertValueNode' | 'AggregateFunctionNode' | 'OverNode' | 'PartitionByNode' | 'PartitionByItemNode' | 'SetOperationNode' | 'BinaryOperationNode' | 'UnaryOperationNode' | 'UsingNode' | 'FunctionNode' | 'CaseNode' | 'WhenNode' | 'JSONReferenceNode' | 'JSONPathNode' | 'JSONPathLegNode' | 'JSONOperatorChainNode' | 'TupleNode' | 'MergeQueryNode' | 'MatchedNode' | 'AddIndexNode' | 'CastNode' | 'FetchNode' | 'TopNode';
|
|
1
|
+
export type OperationNodeKind = 'IdentifierNode' | 'SchemableIdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'AndNode' | 'OrNode' | 'ParensNode' | 'ValueNode' | 'ValueListNode' | 'PrimitiveValueListNode' | 'JoinNode' | 'OperatorNode' | 'WhereNode' | 'InsertQueryNode' | 'DeleteQueryNode' | 'ReturningNode' | 'CreateTableNode' | 'ColumnDefinitionNode' | 'AddColumnNode' | 'DropTableNode' | 'DataTypeNode' | 'OrderByNode' | 'OrderByItemNode' | 'GroupByNode' | 'GroupByItemNode' | 'UpdateQueryNode' | 'ColumnUpdateNode' | 'LimitNode' | 'OffsetNode' | 'OnConflictNode' | 'OnDuplicateKeyNode' | 'CreateIndexNode' | 'DropIndexNode' | 'ListNode' | 'ReferencesNode' | 'PrimaryKeyConstraintNode' | 'UniqueConstraintNode' | 'CheckConstraintNode' | 'ForeignKeyConstraintNode' | 'WithNode' | 'CommonTableExpressionNode' | 'HavingNode' | 'CreateSchemaNode' | 'DropSchemaNode' | 'AlterTableNode' | 'ModifyColumnNode' | 'DropColumnNode' | 'RenameColumnNode' | 'AlterColumnNode' | 'AddConstraintNode' | 'DropConstraintNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode' | 'SelectModifierNode' | 'CreateTypeNode' | 'DropTypeNode' | 'ExplainNode' | 'DefaultInsertValueNode' | 'AggregateFunctionNode' | 'OverNode' | 'PartitionByNode' | 'PartitionByItemNode' | 'SetOperationNode' | 'BinaryOperationNode' | 'UnaryOperationNode' | 'UsingNode' | 'FunctionNode' | 'CaseNode' | 'WhenNode' | 'JSONReferenceNode' | 'JSONPathNode' | 'JSONPathLegNode' | 'JSONOperatorChainNode' | 'TupleNode' | 'MergeQueryNode' | 'MatchedNode' | 'AddIndexNode' | 'CastNode' | 'FetchNode' | 'TopNode' | 'OutputNode';
|
|
2
2
|
export interface OperationNode {
|
|
3
3
|
readonly kind: OperationNodeKind;
|
|
4
4
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { OperationNode } from './operation-node.js';
|
|
2
|
-
export declare const COMPARISON_OPERATORS: readonly ["=", "==", "!=", "<>", ">", ">=", "<", "<=", "in", "not in", "is", "is not", "like", "not like", "match", "ilike", "not ilike", "@>", "<@", "&&", "?", "?&", "!<", "!>", "<=>", "!~", "~", "~*", "!~*", "@@", "@@@", "!!", "<->", "regexp", "is distinct from", "is not distinct from"];
|
|
2
|
+
export declare const COMPARISON_OPERATORS: readonly ["=", "==", "!=", "<>", ">", ">=", "<", "<=", "in", "not in", "is", "is not", "like", "not like", "match", "ilike", "not ilike", "@>", "<@", "^@", "&&", "?", "?&", "?|", "!<", "!>", "<=>", "!~", "~", "~*", "!~*", "@@", "@@@", "!!", "<->", "regexp", "is distinct from", "is not distinct from"];
|
|
3
3
|
export declare const ARITHMETIC_OPERATORS: readonly ["+", "-", "*", "/", "%", "^", "&", "|", "#", "<<", ">>"];
|
|
4
4
|
export declare const JSON_OPERATORS: readonly ["->", "->>"];
|
|
5
|
-
export declare const BINARY_OPERATORS: readonly ["=", "==", "!=", "<>", ">", ">=", "<", "<=", "in", "not in", "is", "is not", "like", "not like", "match", "ilike", "not ilike", "@>", "<@", "&&", "?", "?&", "!<", "!>", "<=>", "!~", "~", "~*", "!~*", "@@", "@@@", "!!", "<->", "regexp", "is distinct from", "is not distinct from", "+", "-", "*", "/", "%", "^", "&", "|", "#", "<<", ">>", "&&", "||"];
|
|
5
|
+
export declare const BINARY_OPERATORS: readonly ["=", "==", "!=", "<>", ">", ">=", "<", "<=", "in", "not in", "is", "is not", "like", "not like", "match", "ilike", "not ilike", "@>", "<@", "^@", "&&", "?", "?&", "?|", "!<", "!>", "<=>", "!~", "~", "~*", "!~*", "@@", "@@@", "!!", "<->", "regexp", "is distinct from", "is not distinct from", "+", "-", "*", "/", "%", "^", "&", "|", "#", "<<", ">>", "&&", "||"];
|
|
6
6
|
export declare const UNARY_FILTER_OPERATORS: readonly ["exists", "not exists"];
|
|
7
7
|
export declare const UNARY_OPERATORS: readonly ["not", "-", "exists", "not exists"];
|
|
8
|
-
export declare const OPERATORS: readonly ["=", "==", "!=", "<>", ">", ">=", "<", "<=", "in", "not in", "is", "is not", "like", "not like", "match", "ilike", "not ilike", "@>", "<@", "&&", "?", "?&", "!<", "!>", "<=>", "!~", "~", "~*", "!~*", "@@", "@@@", "!!", "<->", "regexp", "is distinct from", "is not distinct from", "+", "-", "*", "/", "%", "^", "&", "|", "#", "<<", ">>", "&&", "||", "->", "->>", "not", "-", "exists", "not exists", "between", "between symmetric"];
|
|
8
|
+
export declare const OPERATORS: readonly ["=", "==", "!=", "<>", ">", ">=", "<", "<=", "in", "not in", "is", "is not", "like", "not like", "match", "ilike", "not ilike", "@>", "<@", "^@", "&&", "?", "?&", "?|", "!<", "!>", "<=>", "!~", "~", "~*", "!~*", "@@", "@@@", "!!", "<->", "regexp", "is distinct from", "is not distinct from", "+", "-", "*", "/", "%", "^", "&", "|", "#", "<<", ">>", "&&", "||", "->", "->>", "not", "-", "exists", "not exists", "between", "between symmetric"];
|
|
9
9
|
export type ComparisonOperator = (typeof COMPARISON_OPERATORS)[number];
|
|
10
10
|
export type ArithmeticOperator = (typeof ARITHMETIC_OPERATORS)[number];
|
|
11
11
|
export type JSONOperator = (typeof JSON_OPERATORS)[number];
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { OperationNode } from './operation-node.js';
|
|
2
|
+
export interface OutputNode extends OperationNode {
|
|
3
|
+
readonly kind: 'OutputNode';
|
|
4
|
+
readonly selections: ReadonlyArray<OperationNode>;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export declare const OutputNode: Readonly<{
|
|
10
|
+
is(node: OperationNode): node is OutputNode;
|
|
11
|
+
create(selections: ReadonlyArray<OperationNode>): OutputNode;
|
|
12
|
+
cloneWithSelections(output: OutputNode, selections: ReadonlyArray<OperationNode>): OutputNode;
|
|
13
|
+
}>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/// <reference types="./output-node.d.ts" />
|
|
2
|
+
import { freeze } from '../util/object-utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export const OutputNode = freeze({
|
|
7
|
+
is(node) {
|
|
8
|
+
return node.kind === 'OutputNode';
|
|
9
|
+
},
|
|
10
|
+
create(selections) {
|
|
11
|
+
return freeze({
|
|
12
|
+
kind: 'OutputNode',
|
|
13
|
+
selections: freeze(selections),
|
|
14
|
+
});
|
|
15
|
+
},
|
|
16
|
+
cloneWithSelections(output, selections) {
|
|
17
|
+
return freeze({
|
|
18
|
+
...output,
|
|
19
|
+
selections: output.selections
|
|
20
|
+
? freeze([...output.selections, ...selections])
|
|
21
|
+
: freeze(selections),
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
});
|
|
@@ -12,6 +12,7 @@ import { ExplainFormat } from '../util/explainable.js';
|
|
|
12
12
|
import { Expression } from '../expression/expression.js';
|
|
13
13
|
import { MergeQueryNode } from './merge-query-node.js';
|
|
14
14
|
import { TopNode } from './top-node.js';
|
|
15
|
+
import { OutputNode } from './output-node.js';
|
|
15
16
|
export type QueryNode = SelectQueryNode | InsertQueryNode | UpdateQueryNode | DeleteQueryNode | MergeQueryNode;
|
|
16
17
|
type HasJoins = {
|
|
17
18
|
joins?: ReadonlyArray<JoinNode>;
|
|
@@ -28,17 +29,25 @@ type HasExplain = {
|
|
|
28
29
|
type HasTop = {
|
|
29
30
|
top?: TopNode;
|
|
30
31
|
};
|
|
32
|
+
type HasOutput = {
|
|
33
|
+
output?: OutputNode;
|
|
34
|
+
};
|
|
35
|
+
type HasEndModifiers = {
|
|
36
|
+
endModifiers?: ReadonlyArray<OperationNode>;
|
|
37
|
+
};
|
|
31
38
|
/**
|
|
32
39
|
* @internal
|
|
33
40
|
*/
|
|
34
41
|
export declare const QueryNode: Readonly<{
|
|
35
42
|
is(node: OperationNode): node is QueryNode;
|
|
43
|
+
cloneWithEndModifier<T extends HasEndModifiers>(node: T, modifier: OperationNode): T;
|
|
36
44
|
cloneWithWhere<T extends HasWhere>(node: T, operation: OperationNode): T;
|
|
37
|
-
cloneWithJoin<
|
|
38
|
-
cloneWithReturning<
|
|
39
|
-
cloneWithoutReturning<
|
|
40
|
-
cloneWithoutWhere<
|
|
41
|
-
cloneWithExplain<
|
|
42
|
-
cloneWithTop<
|
|
45
|
+
cloneWithJoin<T extends HasJoins>(node: T, join: JoinNode): T;
|
|
46
|
+
cloneWithReturning<T extends HasReturning>(node: T, selections: ReadonlyArray<SelectionNode>): T;
|
|
47
|
+
cloneWithoutReturning<T extends HasReturning>(node: T): T;
|
|
48
|
+
cloneWithoutWhere<T extends HasWhere>(node: T): T;
|
|
49
|
+
cloneWithExplain<T extends HasExplain>(node: T, format: ExplainFormat | undefined, options: Expression<any> | undefined): T;
|
|
50
|
+
cloneWithTop<T extends HasTop>(node: T, top: TopNode): T;
|
|
51
|
+
cloneWithOutput<T extends HasOutput>(node: T, selections: ReadonlyArray<SelectionNode>): T;
|
|
43
52
|
}>;
|
|
44
53
|
export {};
|
|
@@ -8,6 +8,7 @@ import { freeze } from '../util/object-utils.js';
|
|
|
8
8
|
import { ReturningNode } from './returning-node.js';
|
|
9
9
|
import { ExplainNode } from './explain-node.js';
|
|
10
10
|
import { MergeQueryNode } from './merge-query-node.js';
|
|
11
|
+
import { OutputNode } from './output-node.js';
|
|
11
12
|
/**
|
|
12
13
|
* @internal
|
|
13
14
|
*/
|
|
@@ -19,6 +20,14 @@ export const QueryNode = freeze({
|
|
|
19
20
|
DeleteQueryNode.is(node) ||
|
|
20
21
|
MergeQueryNode.is(node));
|
|
21
22
|
},
|
|
23
|
+
cloneWithEndModifier(node, modifier) {
|
|
24
|
+
return freeze({
|
|
25
|
+
...node,
|
|
26
|
+
endModifiers: node.endModifiers
|
|
27
|
+
? freeze([...node.endModifiers, modifier])
|
|
28
|
+
: freeze([modifier]),
|
|
29
|
+
});
|
|
30
|
+
},
|
|
22
31
|
cloneWithWhere(node, operation) {
|
|
23
32
|
return freeze({
|
|
24
33
|
...node,
|
|
@@ -65,4 +74,12 @@ export const QueryNode = freeze({
|
|
|
65
74
|
top,
|
|
66
75
|
});
|
|
67
76
|
},
|
|
77
|
+
cloneWithOutput(node, selections) {
|
|
78
|
+
return freeze({
|
|
79
|
+
...node,
|
|
80
|
+
output: node.output
|
|
81
|
+
? OutputNode.cloneWithSelections(node.output, selections)
|
|
82
|
+
: OutputNode.create(selections),
|
|
83
|
+
});
|
|
84
|
+
},
|
|
68
85
|
});
|
|
@@ -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;
|
|
@@ -58,4 +57,5 @@ export declare const SelectQueryNode: Readonly<{
|
|
|
58
57
|
cloneWithoutLimit(select: SelectQueryNode): SelectQueryNode;
|
|
59
58
|
cloneWithoutOffset(select: SelectQueryNode): SelectQueryNode;
|
|
60
59
|
cloneWithoutOrderBy(select: SelectQueryNode): SelectQueryNode;
|
|
60
|
+
cloneWithoutGroupBy(select: SelectQueryNode): SelectQueryNode;
|
|
61
61
|
}>;
|
|
@@ -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,
|
|
@@ -130,4 +122,10 @@ export const SelectQueryNode = freeze({
|
|
|
130
122
|
orderBy: undefined,
|
|
131
123
|
});
|
|
132
124
|
},
|
|
125
|
+
cloneWithoutGroupBy(select) {
|
|
126
|
+
return freeze({
|
|
127
|
+
...select,
|
|
128
|
+
groupBy: undefined,
|
|
129
|
+
});
|
|
130
|
+
},
|
|
133
131
|
});
|
|
@@ -10,6 +10,7 @@ import { FromNode } from './from-node.js';
|
|
|
10
10
|
import { ExplainNode } from './explain-node.js';
|
|
11
11
|
import { LimitNode } from './limit-node.js';
|
|
12
12
|
import { TopNode } from './top-node.js';
|
|
13
|
+
import { OutputNode } from './output-node.js';
|
|
13
14
|
export type UpdateValuesNode = ValueListNode | PrimitiveValueListNode;
|
|
14
15
|
export interface UpdateQueryNode extends OperationNode {
|
|
15
16
|
readonly kind: 'UpdateQueryNode';
|
|
@@ -21,8 +22,10 @@ export interface UpdateQueryNode extends OperationNode {
|
|
|
21
22
|
readonly returning?: ReturningNode;
|
|
22
23
|
readonly with?: WithNode;
|
|
23
24
|
readonly explain?: ExplainNode;
|
|
25
|
+
readonly endModifiers?: ReadonlyArray<OperationNode>;
|
|
24
26
|
readonly limit?: LimitNode;
|
|
25
27
|
readonly top?: TopNode;
|
|
28
|
+
readonly output?: OutputNode;
|
|
26
29
|
}
|
|
27
30
|
/**
|
|
28
31
|
* @internal
|
|
@@ -9,5 +9,5 @@ export interface WhereNode extends OperationNode {
|
|
|
9
9
|
export declare const WhereNode: Readonly<{
|
|
10
10
|
is(node: OperationNode): node is WhereNode;
|
|
11
11
|
create(filter: OperationNode): WhereNode;
|
|
12
|
-
cloneWithOperation(whereNode: WhereNode, operator:
|
|
12
|
+
cloneWithOperation(whereNode: WhereNode, operator: "And" | "Or", operation: OperationNode): WhereNode;
|
|
13
13
|
}>;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { DeleteResult } from '../query-builder/delete-result.js';
|
|
2
2
|
import { InsertResult } from '../query-builder/insert-result.js';
|
|
3
|
+
import { MergeResult } from '../query-builder/merge-result.js';
|
|
3
4
|
import { UpdateResult } from '../query-builder/update-result.js';
|
|
4
5
|
import { Selection, AllSelection, CallbackSelection } from './select-parser.js';
|
|
5
|
-
export type ReturningRow<DB, TB extends keyof DB, O, SE> = O extends InsertResult
|
|
6
|
-
export type ReturningCallbackRow<DB, TB extends keyof DB, O, CB> = O extends InsertResult
|
|
7
|
-
export type ReturningAllRow<DB, TB extends keyof DB, O> = O extends InsertResult
|
|
6
|
+
export type ReturningRow<DB, TB extends keyof DB, O, SE> = O extends InsertResult | DeleteResult | UpdateResult | MergeResult ? Selection<DB, TB, SE> : O & Selection<DB, TB, SE>;
|
|
7
|
+
export type ReturningCallbackRow<DB, TB extends keyof DB, O, CB> = O extends InsertResult | DeleteResult | UpdateResult | MergeResult ? CallbackSelection<DB, TB, CB> : O & CallbackSelection<DB, TB, CB>;
|
|
8
|
+
export type ReturningAllRow<DB, TB extends keyof DB, O> = O extends InsertResult | DeleteResult | UpdateResult | MergeResult ? AllSelection<DB, TB> : O & AllSelection<DB, TB>;
|
|
@@ -35,47 +35,48 @@ export interface CamelCasePluginOptions {
|
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
37
|
* A plugin that converts snake_case identifiers in the database into
|
|
38
|
-
* camelCase in the
|
|
38
|
+
* camelCase in the JavaScript side.
|
|
39
39
|
*
|
|
40
40
|
* For example let's assume we have a table called `person_table`
|
|
41
41
|
* with columns `first_name` and `last_name` in the database. When
|
|
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
|
-
* in camelCase in the
|
|
79
|
+
* in camelCase in the TypeScript code: table names, columns, schemas,
|
|
79
80
|
* __everything__. When using the `CamelCasePlugin` Kysely works as if
|
|
80
81
|
* the database was defined in camelCase.
|
|
81
82
|
*
|
|
@@ -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`
|