kysely 0.27.2 → 0.27.4
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/CONTRIBUTING.md +1 -1
- package/README.md +7 -7
- package/dist/cjs/dialect/database-introspector.d.ts +1 -0
- package/dist/cjs/dialect/dialect-adapter-base.d.ts +2 -1
- package/dist/cjs/dialect/dialect-adapter-base.js +4 -1
- package/dist/cjs/dialect/dialect-adapter.d.ts +5 -0
- package/dist/cjs/dialect/mssql/mssql-adapter.d.ts +1 -5
- package/dist/cjs/dialect/mssql/mssql-adapter.js +2 -4
- package/dist/cjs/dialect/mssql/mssql-dialect-config.d.ts +46 -26
- package/dist/cjs/dialect/mssql/mssql-driver.d.ts +1 -0
- package/dist/cjs/dialect/mssql/mssql-driver.js +95 -36
- package/dist/cjs/dialect/mssql/mssql-introspector.js +13 -2
- package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +4 -0
- package/dist/cjs/dialect/mssql/mssql-query-compiler.js +8 -0
- package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -0
- package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +1 -1
- package/dist/cjs/dialect/postgres/postgres-driver.js +2 -1
- package/dist/cjs/dialect/postgres/postgres-introspector.js +3 -1
- package/dist/cjs/dialect/sqlite/sqlite-introspector.js +1 -0
- package/dist/cjs/driver/database-connection.d.ts +4 -2
- package/dist/cjs/dynamic/dynamic-reference-builder.js +2 -2
- package/dist/cjs/dynamic/dynamic.d.ts +1 -1
- package/dist/cjs/dynamic/dynamic.js +1 -1
- package/dist/cjs/expression/expression-builder.d.ts +31 -5
- package/dist/cjs/expression/expression-builder.js +7 -3
- package/dist/cjs/expression/expression.js +2 -3
- package/dist/cjs/helpers/mssql.js +3 -4
- package/dist/cjs/helpers/mysql.d.ts +3 -3
- package/dist/cjs/helpers/mysql.js +6 -7
- package/dist/cjs/helpers/postgres.d.ts +4 -4
- package/dist/cjs/helpers/postgres.js +7 -8
- package/dist/cjs/helpers/sqlite.js +3 -4
- package/dist/cjs/index.d.ts +31 -18
- package/dist/cjs/index.js +30 -17
- package/dist/cjs/kysely.d.ts +1 -1
- package/dist/cjs/kysely.js +3 -3
- package/dist/cjs/operation-node/add-index-node.js +1 -1
- 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/cast-node.d.ts +13 -0
- package/dist/cjs/operation-node/cast-node.js +19 -0
- package/dist/cjs/operation-node/column-definition-node.d.ts +2 -0
- package/dist/cjs/operation-node/data-type-node.d.ts +5 -1
- package/dist/cjs/operation-node/data-type-node.js +56 -0
- package/dist/cjs/operation-node/delete-query-node.d.ts +6 -0
- package/dist/cjs/operation-node/delete-query-node.js +12 -0
- package/dist/cjs/operation-node/fetch-node.d.ts +15 -0
- package/dist/cjs/operation-node/fetch-node.js +19 -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 +6 -1
- package/dist/cjs/operation-node/insert-query-node.js +5 -0
- package/dist/cjs/operation-node/join-node.d.ts +1 -1
- package/dist/cjs/operation-node/matched-node.d.ts +13 -0
- package/dist/cjs/operation-node/matched-node.js +19 -0
- package/dist/cjs/operation-node/merge-query-node.d.ts +27 -0
- package/dist/cjs/operation-node/merge-query-node.js +45 -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 +12 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +62 -0
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +12 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +6 -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 +17 -5
- package/dist/cjs/operation-node/query-node.js +24 -1
- package/dist/cjs/operation-node/select-query-node.d.ts +6 -0
- package/dist/cjs/operation-node/select-query-node.js +12 -0
- package/dist/cjs/operation-node/top-node.d.ts +14 -0
- package/dist/cjs/operation-node/top-node.js +19 -0
- package/dist/cjs/operation-node/update-query-node.d.ts +9 -1
- package/dist/cjs/operation-node/update-query-node.js +11 -0
- package/dist/cjs/operation-node/where-node.d.ts +1 -1
- package/dist/cjs/parser/binary-operation-parser.d.ts +1 -1
- package/dist/cjs/parser/binary-operation-parser.js +7 -8
- package/dist/cjs/parser/data-type-parser.js +8 -5
- 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.d.ts +2 -0
- package/dist/cjs/parser/fetch-parser.js +17 -0
- 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.d.ts +3 -3
- 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.d.ts +9 -0
- package/dist/cjs/parser/merge-parser.js +31 -0
- 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.d.ts +4 -3
- package/dist/cjs/parser/table-parser.js +4 -5
- package/dist/cjs/parser/top-parser.d.ts +2 -0
- package/dist/cjs/parser/top-parser.js +19 -0
- 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 +2 -2
- package/dist/cjs/plugin/camel-case/camel-case-plugin.js +2 -2
- package/dist/cjs/plugin/camel-case/camel-case.js +2 -3
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.d.ts +18 -0
- package/dist/cjs/plugin/parse-json-results/parse-json-results-plugin.js +19 -11
- package/dist/cjs/plugin/with-schema/with-schema-transformer.js +4 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +188 -5
- package/dist/cjs/query-builder/delete-query-builder.js +139 -5
- package/dist/cjs/query-builder/function-module.d.ts +5 -5
- package/dist/cjs/query-builder/function-module.js +1 -2
- package/dist/cjs/query-builder/insert-query-builder.d.ts +166 -10
- package/dist/cjs/query-builder/insert-query-builder.js +107 -10
- package/dist/cjs/query-builder/merge-query-builder.d.ts +721 -0
- package/dist/cjs/query-builder/merge-query-builder.js +547 -0
- package/dist/cjs/query-builder/merge-result.d.ts +4 -0
- package/dist/cjs/query-builder/merge-result.js +10 -0
- package/dist/cjs/query-builder/no-result-error.js +2 -2
- package/dist/cjs/query-builder/on-conflict-builder.d.ts +2 -2
- package/dist/cjs/query-builder/output-interface.d.ts +95 -0
- package/dist/cjs/query-builder/output-interface.js +2 -0
- package/dist/cjs/query-builder/returning-interface.d.ts +2 -0
- package/dist/cjs/query-builder/select-query-builder.d.ts +177 -17
- package/dist/cjs/query-builder/select-query-builder.js +21 -2
- package/dist/cjs/query-builder/update-query-builder.d.ts +175 -10
- package/dist/cjs/query-builder/update-query-builder.js +119 -7
- 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 +1 -1
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +12 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +118 -10
- package/dist/cjs/query-compiler/query-compiler.d.ts +2 -1
- package/dist/cjs/query-creator.d.ts +96 -5
- package/dist/cjs/query-creator.js +63 -1
- package/dist/cjs/raw-builder/raw-builder.js +1 -2
- package/dist/cjs/raw-builder/sql.d.ts +5 -5
- package/dist/cjs/schema/alter-column-builder.js +3 -0
- package/dist/cjs/schema/alter-table-add-index-builder.d.ts +1 -1
- package/dist/cjs/schema/alter-table-add-index-builder.js +7 -3
- package/dist/cjs/schema/alter-table-builder.js +1 -2
- package/dist/cjs/schema/column-definition-builder.d.ts +18 -1
- package/dist/cjs/schema/column-definition-builder.js +22 -1
- package/dist/cjs/util/assert.js +2 -3
- package/dist/cjs/util/compilable.js +1 -2
- package/dist/cjs/util/infer-result.d.ts +2 -1
- 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.js +1 -2
- package/dist/cjs/util/stack-trace-utils.js +1 -2
- package/dist/cjs/util/type-utils.d.ts +3 -2
- package/dist/esm/dialect/database-introspector.d.ts +1 -0
- package/dist/esm/dialect/dialect-adapter-base.d.ts +2 -1
- package/dist/esm/dialect/dialect-adapter-base.js +4 -1
- package/dist/esm/dialect/dialect-adapter.d.ts +5 -0
- package/dist/esm/dialect/mssql/mssql-adapter.d.ts +1 -5
- package/dist/esm/dialect/mssql/mssql-adapter.js +2 -4
- package/dist/esm/dialect/mssql/mssql-dialect-config.d.ts +46 -26
- package/dist/esm/dialect/mssql/mssql-driver.d.ts +1 -0
- package/dist/esm/dialect/mssql/mssql-driver.js +95 -36
- package/dist/esm/dialect/mssql/mssql-introspector.js +13 -2
- package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +4 -0
- package/dist/esm/dialect/mssql/mssql-query-compiler.js +8 -0
- package/dist/esm/dialect/mysql/mysql-introspector.js +2 -0
- package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +1 -1
- package/dist/esm/dialect/postgres/postgres-driver.js +2 -1
- package/dist/esm/dialect/postgres/postgres-introspector.js +3 -1
- package/dist/esm/dialect/sqlite/sqlite-introspector.js +1 -0
- package/dist/esm/driver/database-connection.d.ts +4 -2
- package/dist/esm/dynamic/dynamic.d.ts +1 -1
- package/dist/esm/dynamic/dynamic.js +1 -1
- package/dist/esm/expression/expression-builder.d.ts +31 -5
- package/dist/esm/expression/expression-builder.js +5 -0
- package/dist/esm/helpers/mysql.d.ts +3 -3
- package/dist/esm/helpers/mysql.js +3 -3
- package/dist/esm/helpers/postgres.d.ts +4 -4
- package/dist/esm/helpers/postgres.js +4 -4
- package/dist/esm/index.d.ts +31 -18
- package/dist/esm/index.js +30 -17
- package/dist/esm/kysely.d.ts +1 -1
- package/dist/esm/kysely.js +1 -1
- package/dist/esm/operation-node/add-index-node.js +1 -1
- 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/cast-node.d.ts +13 -0
- package/dist/esm/operation-node/cast-node.js +17 -0
- package/dist/esm/operation-node/column-definition-node.d.ts +2 -0
- package/dist/esm/operation-node/data-type-node.d.ts +5 -1
- package/dist/esm/operation-node/data-type-node.js +55 -0
- package/dist/esm/operation-node/delete-query-node.d.ts +6 -0
- package/dist/esm/operation-node/delete-query-node.js +12 -0
- package/dist/esm/operation-node/fetch-node.d.ts +15 -0
- package/dist/esm/operation-node/fetch-node.js +17 -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 +6 -1
- package/dist/esm/operation-node/insert-query-node.js +5 -0
- package/dist/esm/operation-node/join-node.d.ts +1 -1
- package/dist/esm/operation-node/matched-node.d.ts +13 -0
- package/dist/esm/operation-node/matched-node.js +17 -0
- package/dist/esm/operation-node/merge-query-node.d.ts +27 -0
- package/dist/esm/operation-node/merge-query-node.js +43 -0
- package/dist/esm/operation-node/on-node.d.ts +1 -1
- package/dist/esm/operation-node/operation-node-transformer.d.ts +12 -0
- package/dist/esm/operation-node/operation-node-transformer.js +62 -0
- package/dist/esm/operation-node/operation-node-visitor.d.ts +12 -0
- package/dist/esm/operation-node/operation-node-visitor.js +6 -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 +17 -5
- package/dist/esm/operation-node/query-node.js +24 -1
- package/dist/esm/operation-node/select-query-node.d.ts +6 -0
- package/dist/esm/operation-node/select-query-node.js +12 -0
- package/dist/esm/operation-node/top-node.d.ts +14 -0
- package/dist/esm/operation-node/top-node.js +17 -0
- package/dist/esm/operation-node/update-query-node.d.ts +9 -1
- package/dist/esm/operation-node/update-query-node.js +11 -0
- package/dist/esm/operation-node/where-node.d.ts +1 -1
- package/dist/esm/parser/binary-operation-parser.d.ts +1 -1
- package/dist/esm/parser/binary-operation-parser.js +2 -2
- package/dist/esm/parser/data-type-parser.js +8 -4
- package/dist/esm/parser/fetch-parser.d.ts +2 -0
- package/dist/esm/parser/fetch-parser.js +15 -0
- package/dist/esm/parser/insert-values-parser.d.ts +3 -3
- package/dist/esm/parser/merge-parser.d.ts +9 -0
- package/dist/esm/parser/merge-parser.js +28 -0
- package/dist/esm/parser/returning-parser.d.ts +4 -3
- package/dist/esm/parser/table-parser.d.ts +4 -3
- package/dist/esm/parser/top-parser.d.ts +2 -0
- package/dist/esm/parser/top-parser.js +17 -0
- package/dist/esm/plugin/camel-case/camel-case-plugin.d.ts +2 -2
- package/dist/esm/plugin/camel-case/camel-case-plugin.js +2 -2
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts +18 -0
- package/dist/esm/plugin/parse-json-results/parse-json-results-plugin.js +19 -11
- package/dist/esm/plugin/with-schema/with-schema-transformer.js +4 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +188 -5
- package/dist/esm/query-builder/delete-query-builder.js +139 -5
- package/dist/esm/query-builder/function-module.d.ts +5 -5
- package/dist/esm/query-builder/insert-query-builder.d.ts +166 -10
- package/dist/esm/query-builder/insert-query-builder.js +107 -10
- package/dist/esm/query-builder/merge-query-builder.d.ts +721 -0
- package/dist/esm/query-builder/merge-query-builder.js +541 -0
- package/dist/esm/query-builder/merge-result.d.ts +4 -0
- package/dist/esm/query-builder/merge-result.js +7 -0
- package/dist/esm/query-builder/on-conflict-builder.d.ts +2 -2
- package/dist/esm/query-builder/output-interface.d.ts +95 -0
- package/dist/esm/query-builder/output-interface.js +2 -0
- package/dist/esm/query-builder/returning-interface.d.ts +2 -0
- package/dist/esm/query-builder/select-query-builder.d.ts +177 -17
- package/dist/esm/query-builder/select-query-builder.js +20 -0
- package/dist/esm/query-builder/update-query-builder.d.ts +175 -10
- package/dist/esm/query-builder/update-query-builder.js +119 -7
- 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 +1 -1
- package/dist/esm/query-compiler/default-query-compiler.d.ts +12 -0
- package/dist/esm/query-compiler/default-query-compiler.js +118 -10
- package/dist/esm/query-compiler/query-compiler.d.ts +2 -1
- package/dist/esm/query-creator.d.ts +96 -5
- package/dist/esm/query-creator.js +64 -2
- package/dist/esm/raw-builder/sql.d.ts +5 -5
- package/dist/esm/schema/alter-column-builder.js +3 -0
- package/dist/esm/schema/alter-table-add-index-builder.d.ts +1 -1
- package/dist/esm/schema/alter-table-add-index-builder.js +8 -4
- package/dist/esm/schema/alter-table-builder.js +1 -2
- package/dist/esm/schema/column-definition-builder.d.ts +18 -1
- package/dist/esm/schema/column-definition-builder.js +22 -1
- package/dist/esm/util/infer-result.d.ts +2 -1
- package/dist/esm/util/object-utils.js +18 -5
- package/dist/esm/util/type-utils.d.ts +3 -2
- package/package.json +26 -24
|
@@ -10,7 +10,10 @@ import { OperationNode } from './operation-node.js';
|
|
|
10
10
|
import { ExplainNode } from './explain-node.js';
|
|
11
11
|
import { ExplainFormat } from '../util/explainable.js';
|
|
12
12
|
import { Expression } from '../expression/expression.js';
|
|
13
|
-
|
|
13
|
+
import { MergeQueryNode } from './merge-query-node.js';
|
|
14
|
+
import { TopNode } from './top-node.js';
|
|
15
|
+
import { OutputNode } from './output-node.js';
|
|
16
|
+
export type QueryNode = SelectQueryNode | InsertQueryNode | UpdateQueryNode | DeleteQueryNode | MergeQueryNode;
|
|
14
17
|
type HasJoins = {
|
|
15
18
|
joins?: ReadonlyArray<JoinNode>;
|
|
16
19
|
};
|
|
@@ -23,15 +26,24 @@ type HasReturning = {
|
|
|
23
26
|
type HasExplain = {
|
|
24
27
|
explain?: ExplainNode;
|
|
25
28
|
};
|
|
29
|
+
type HasTop = {
|
|
30
|
+
top?: TopNode;
|
|
31
|
+
};
|
|
32
|
+
type HasOutput = {
|
|
33
|
+
output?: OutputNode;
|
|
34
|
+
};
|
|
26
35
|
/**
|
|
27
36
|
* @internal
|
|
28
37
|
*/
|
|
29
38
|
export declare const QueryNode: Readonly<{
|
|
30
39
|
is(node: OperationNode): node is QueryNode;
|
|
31
40
|
cloneWithWhere<T extends HasWhere>(node: T, operation: OperationNode): T;
|
|
32
|
-
cloneWithJoin<
|
|
33
|
-
cloneWithReturning<
|
|
34
|
-
|
|
35
|
-
|
|
41
|
+
cloneWithJoin<T extends HasJoins>(node: T, join: JoinNode): T;
|
|
42
|
+
cloneWithReturning<T extends HasReturning>(node: T, selections: ReadonlyArray<SelectionNode>): T;
|
|
43
|
+
cloneWithoutReturning<T extends HasReturning>(node: T): T;
|
|
44
|
+
cloneWithoutWhere<T extends HasWhere>(node: T): T;
|
|
45
|
+
cloneWithExplain<T extends HasExplain>(node: T, format: ExplainFormat | undefined, options: Expression<any> | undefined): T;
|
|
46
|
+
cloneWithTop<T extends HasTop>(node: T, top: TopNode): T;
|
|
47
|
+
cloneWithOutput<T extends HasOutput>(node: T, selections: ReadonlyArray<SelectionNode>): T;
|
|
36
48
|
}>;
|
|
37
49
|
export {};
|
|
@@ -7,6 +7,8 @@ import { WhereNode } from './where-node.js';
|
|
|
7
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
|
+
import { MergeQueryNode } from './merge-query-node.js';
|
|
11
|
+
import { OutputNode } from './output-node.js';
|
|
10
12
|
/**
|
|
11
13
|
* @internal
|
|
12
14
|
*/
|
|
@@ -15,7 +17,8 @@ export const QueryNode = freeze({
|
|
|
15
17
|
return (SelectQueryNode.is(node) ||
|
|
16
18
|
InsertQueryNode.is(node) ||
|
|
17
19
|
UpdateQueryNode.is(node) ||
|
|
18
|
-
DeleteQueryNode.is(node)
|
|
20
|
+
DeleteQueryNode.is(node) ||
|
|
21
|
+
MergeQueryNode.is(node));
|
|
19
22
|
},
|
|
20
23
|
cloneWithWhere(node, operation) {
|
|
21
24
|
return freeze({
|
|
@@ -39,6 +42,12 @@ export const QueryNode = freeze({
|
|
|
39
42
|
: ReturningNode.create(selections),
|
|
40
43
|
});
|
|
41
44
|
},
|
|
45
|
+
cloneWithoutReturning(node) {
|
|
46
|
+
return freeze({
|
|
47
|
+
...node,
|
|
48
|
+
returning: undefined,
|
|
49
|
+
});
|
|
50
|
+
},
|
|
42
51
|
cloneWithoutWhere(node) {
|
|
43
52
|
return freeze({
|
|
44
53
|
...node,
|
|
@@ -51,4 +60,18 @@ export const QueryNode = freeze({
|
|
|
51
60
|
explain: ExplainNode.create(format, options?.toOperationNode()),
|
|
52
61
|
});
|
|
53
62
|
},
|
|
63
|
+
cloneWithTop(node, top) {
|
|
64
|
+
return freeze({
|
|
65
|
+
...node,
|
|
66
|
+
top,
|
|
67
|
+
});
|
|
68
|
+
},
|
|
69
|
+
cloneWithOutput(node, selections) {
|
|
70
|
+
return freeze({
|
|
71
|
+
...node,
|
|
72
|
+
output: node.output
|
|
73
|
+
? OutputNode.cloneWithSelections(node.output, selections)
|
|
74
|
+
: OutputNode.create(selections),
|
|
75
|
+
});
|
|
76
|
+
},
|
|
54
77
|
});
|
|
@@ -14,6 +14,8 @@ import { WithNode } from './with-node.js';
|
|
|
14
14
|
import { SelectModifierNode } from './select-modifier-node.js';
|
|
15
15
|
import { ExplainNode } from './explain-node.js';
|
|
16
16
|
import { SetOperationNode } from './set-operation-node.js';
|
|
17
|
+
import { FetchNode } from './fetch-node.js';
|
|
18
|
+
import { TopNode } from './top-node.js';
|
|
17
19
|
export interface SelectQueryNode extends OperationNode {
|
|
18
20
|
readonly kind: 'SelectQueryNode';
|
|
19
21
|
readonly from?: FromNode;
|
|
@@ -31,6 +33,8 @@ export interface SelectQueryNode extends OperationNode {
|
|
|
31
33
|
readonly having?: HavingNode;
|
|
32
34
|
readonly explain?: ExplainNode;
|
|
33
35
|
readonly setOperations?: ReadonlyArray<SetOperationNode>;
|
|
36
|
+
readonly fetch?: FetchNode;
|
|
37
|
+
readonly top?: TopNode;
|
|
34
38
|
}
|
|
35
39
|
/**
|
|
36
40
|
* @internal
|
|
@@ -47,10 +51,12 @@ export declare const SelectQueryNode: Readonly<{
|
|
|
47
51
|
cloneWithGroupByItems(selectNode: SelectQueryNode, items: ReadonlyArray<GroupByItemNode>): SelectQueryNode;
|
|
48
52
|
cloneWithLimit(selectNode: SelectQueryNode, limit: LimitNode): SelectQueryNode;
|
|
49
53
|
cloneWithOffset(selectNode: SelectQueryNode, offset: OffsetNode): SelectQueryNode;
|
|
54
|
+
cloneWithFetch(selectNode: SelectQueryNode, fetch: FetchNode): SelectQueryNode;
|
|
50
55
|
cloneWithHaving(selectNode: SelectQueryNode, operation: OperationNode): SelectQueryNode;
|
|
51
56
|
cloneWithSetOperations(selectNode: SelectQueryNode, setOperations: ReadonlyArray<SetOperationNode>): SelectQueryNode;
|
|
52
57
|
cloneWithoutSelections(select: SelectQueryNode): SelectQueryNode;
|
|
53
58
|
cloneWithoutLimit(select: SelectQueryNode): SelectQueryNode;
|
|
54
59
|
cloneWithoutOffset(select: SelectQueryNode): SelectQueryNode;
|
|
55
60
|
cloneWithoutOrderBy(select: SelectQueryNode): SelectQueryNode;
|
|
61
|
+
cloneWithoutGroupBy(select: SelectQueryNode): SelectQueryNode;
|
|
56
62
|
}>;
|
|
@@ -84,6 +84,12 @@ export const SelectQueryNode = freeze({
|
|
|
84
84
|
offset,
|
|
85
85
|
});
|
|
86
86
|
},
|
|
87
|
+
cloneWithFetch(selectNode, fetch) {
|
|
88
|
+
return freeze({
|
|
89
|
+
...selectNode,
|
|
90
|
+
fetch,
|
|
91
|
+
});
|
|
92
|
+
},
|
|
87
93
|
cloneWithHaving(selectNode, operation) {
|
|
88
94
|
return freeze({
|
|
89
95
|
...selectNode,
|
|
@@ -124,4 +130,10 @@ export const SelectQueryNode = freeze({
|
|
|
124
130
|
orderBy: undefined,
|
|
125
131
|
});
|
|
126
132
|
},
|
|
133
|
+
cloneWithoutGroupBy(select) {
|
|
134
|
+
return freeze({
|
|
135
|
+
...select,
|
|
136
|
+
groupBy: undefined,
|
|
137
|
+
});
|
|
138
|
+
},
|
|
127
139
|
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { OperationNode } from './operation-node.js';
|
|
2
|
+
export type TopModifier = 'percent' | 'with ties' | 'percent with ties';
|
|
3
|
+
export interface TopNode extends OperationNode {
|
|
4
|
+
readonly kind: 'TopNode';
|
|
5
|
+
readonly expression: number | bigint;
|
|
6
|
+
readonly modifiers?: TopModifier;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export declare const TopNode: Readonly<{
|
|
12
|
+
is(node: OperationNode): node is TopNode;
|
|
13
|
+
create(expression: number | bigint, modifiers?: TopModifier): TopNode;
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="./top-node.d.ts" />
|
|
2
|
+
import { freeze } from '../util/object-utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export const TopNode = freeze({
|
|
7
|
+
is(node) {
|
|
8
|
+
return node.kind === 'TopNode';
|
|
9
|
+
},
|
|
10
|
+
create(expression, modifiers) {
|
|
11
|
+
return freeze({
|
|
12
|
+
kind: 'TopNode',
|
|
13
|
+
expression,
|
|
14
|
+
modifiers,
|
|
15
|
+
});
|
|
16
|
+
},
|
|
17
|
+
});
|
|
@@ -8,10 +8,13 @@ import { WhereNode } from './where-node.js';
|
|
|
8
8
|
import { WithNode } from './with-node.js';
|
|
9
9
|
import { FromNode } from './from-node.js';
|
|
10
10
|
import { ExplainNode } from './explain-node.js';
|
|
11
|
+
import { LimitNode } from './limit-node.js';
|
|
12
|
+
import { TopNode } from './top-node.js';
|
|
13
|
+
import { OutputNode } from './output-node.js';
|
|
11
14
|
export type UpdateValuesNode = ValueListNode | PrimitiveValueListNode;
|
|
12
15
|
export interface UpdateQueryNode extends OperationNode {
|
|
13
16
|
readonly kind: 'UpdateQueryNode';
|
|
14
|
-
readonly table
|
|
17
|
+
readonly table?: OperationNode;
|
|
15
18
|
readonly from?: FromNode;
|
|
16
19
|
readonly joins?: ReadonlyArray<JoinNode>;
|
|
17
20
|
readonly where?: WhereNode;
|
|
@@ -19,6 +22,9 @@ export interface UpdateQueryNode extends OperationNode {
|
|
|
19
22
|
readonly returning?: ReturningNode;
|
|
20
23
|
readonly with?: WithNode;
|
|
21
24
|
readonly explain?: ExplainNode;
|
|
25
|
+
readonly limit?: LimitNode;
|
|
26
|
+
readonly top?: TopNode;
|
|
27
|
+
readonly output?: OutputNode;
|
|
22
28
|
}
|
|
23
29
|
/**
|
|
24
30
|
* @internal
|
|
@@ -26,6 +32,8 @@ export interface UpdateQueryNode extends OperationNode {
|
|
|
26
32
|
export declare const UpdateQueryNode: Readonly<{
|
|
27
33
|
is(node: OperationNode): node is UpdateQueryNode;
|
|
28
34
|
create(table: OperationNode, withNode?: WithNode): UpdateQueryNode;
|
|
35
|
+
createWithoutTable(): UpdateQueryNode;
|
|
29
36
|
cloneWithFromItems(updateQuery: UpdateQueryNode, fromItems: ReadonlyArray<OperationNode>): UpdateQueryNode;
|
|
30
37
|
cloneWithUpdates(updateQuery: UpdateQueryNode, updates: ReadonlyArray<ColumnUpdateNode>): UpdateQueryNode;
|
|
38
|
+
cloneWithLimit(updateQuery: UpdateQueryNode, limit: LimitNode): UpdateQueryNode;
|
|
31
39
|
}>;
|
|
@@ -15,6 +15,11 @@ export const UpdateQueryNode = freeze({
|
|
|
15
15
|
...(withNode && { with: withNode }),
|
|
16
16
|
});
|
|
17
17
|
},
|
|
18
|
+
createWithoutTable() {
|
|
19
|
+
return freeze({
|
|
20
|
+
kind: 'UpdateQueryNode',
|
|
21
|
+
});
|
|
22
|
+
},
|
|
18
23
|
cloneWithFromItems(updateQuery, fromItems) {
|
|
19
24
|
return freeze({
|
|
20
25
|
...updateQuery,
|
|
@@ -31,4 +36,10 @@ export const UpdateQueryNode = freeze({
|
|
|
31
36
|
: updates,
|
|
32
37
|
});
|
|
33
38
|
},
|
|
39
|
+
cloneWithLimit(updateQuery, limit) {
|
|
40
|
+
return freeze({
|
|
41
|
+
...updateQuery,
|
|
42
|
+
limit,
|
|
43
|
+
});
|
|
44
|
+
},
|
|
34
45
|
});
|
|
@@ -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
|
}>;
|
|
@@ -18,4 +18,4 @@ export declare function parseValueBinaryOperationOrExpression(args: any[]): Oper
|
|
|
18
18
|
export declare function parseValueBinaryOperation(left: ReferenceExpression<any, any>, operator: BinaryOperatorExpression, right: OperandValueExpressionOrList<any, any, any>): BinaryOperationNode;
|
|
19
19
|
export declare function parseReferentialBinaryOperation(left: ReferenceExpression<any, any>, operator: BinaryOperatorExpression, right: OperandValueExpressionOrList<any, any, any>): BinaryOperationNode;
|
|
20
20
|
export declare function parseFilterObject(obj: Readonly<FilterObject<any, any>>, combinator: 'and' | 'or'): OperationNode;
|
|
21
|
-
export declare function parseFilterList(list: ReadonlyArray<OperationNodeSource | OperationNode>, combinator: 'and' | 'or'): OperationNode;
|
|
21
|
+
export declare function parseFilterList(list: ReadonlyArray<OperationNodeSource | OperationNode>, combinator: 'and' | 'or', withParens?: boolean): OperationNode;
|
|
@@ -32,7 +32,7 @@ export function parseFilterObject(obj, combinator) {
|
|
|
32
32
|
.filter(([, v]) => !isUndefined(v))
|
|
33
33
|
.map(([k, v]) => parseValueBinaryOperation(k, needsIsOperator(v) ? 'is' : '=', v)), combinator);
|
|
34
34
|
}
|
|
35
|
-
export function parseFilterList(list, combinator) {
|
|
35
|
+
export function parseFilterList(list, combinator, withParens = true) {
|
|
36
36
|
const combine = combinator === 'and' ? AndNode.create : OrNode.create;
|
|
37
37
|
if (list.length === 0) {
|
|
38
38
|
return BinaryOperationNode.create(ValueNode.createImmediate(1), OperatorNode.create('='), ValueNode.createImmediate(combinator === 'and' ? 1 : 0));
|
|
@@ -41,7 +41,7 @@ export function parseFilterList(list, combinator) {
|
|
|
41
41
|
for (let i = 1; i < list.length; ++i) {
|
|
42
42
|
node = combine(node, toOperationNode(list[i]));
|
|
43
43
|
}
|
|
44
|
-
if (list.length > 1) {
|
|
44
|
+
if (list.length > 1 && withParens) {
|
|
45
45
|
return ParensNode.create(node);
|
|
46
46
|
}
|
|
47
47
|
return node;
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
/// <reference types="./data-type-parser.d.ts" />
|
|
2
|
-
import { DataTypeNode, } from '../operation-node/data-type-node.js';
|
|
2
|
+
import { DataTypeNode, isColumnDataType, } from '../operation-node/data-type-node.js';
|
|
3
3
|
import { isOperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
4
4
|
export function parseDataTypeExpression(dataType) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
if (isOperationNodeSource(dataType)) {
|
|
6
|
+
return dataType.toOperationNode();
|
|
7
|
+
}
|
|
8
|
+
if (isColumnDataType(dataType)) {
|
|
9
|
+
return DataTypeNode.create(dataType);
|
|
10
|
+
}
|
|
11
|
+
throw new Error(`invalid column data type ${JSON.stringify(dataType)}`);
|
|
8
12
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/// <reference types="./fetch-parser.d.ts" />
|
|
2
|
+
import { FetchNode } from '../operation-node/fetch-node.js';
|
|
3
|
+
import { isBigInt, isNumber } from '../util/object-utils.js';
|
|
4
|
+
export function parseFetch(rowCount, modifier) {
|
|
5
|
+
if (!isNumber(rowCount) && !isBigInt(rowCount)) {
|
|
6
|
+
throw new Error(`Invalid fetch row count: ${rowCount}`);
|
|
7
|
+
}
|
|
8
|
+
if (!isFetchModifier(modifier)) {
|
|
9
|
+
throw new Error(`Invalid fetch modifier: ${modifier}`);
|
|
10
|
+
}
|
|
11
|
+
return FetchNode.create(rowCount, modifier);
|
|
12
|
+
}
|
|
13
|
+
function isFetchModifier(value) {
|
|
14
|
+
return value === 'only' || value === 'with ties';
|
|
15
|
+
}
|
|
@@ -9,6 +9,6 @@ export type InsertObject<DB, TB extends keyof DB> = {
|
|
|
9
9
|
[C in NullableInsertKeys<DB[TB]>]?: ValueExpression<DB, TB, InsertType<DB[TB][C]>> | undefined;
|
|
10
10
|
};
|
|
11
11
|
export type InsertObjectOrList<DB, TB extends keyof DB> = InsertObject<DB, TB> | ReadonlyArray<InsertObject<DB, TB>>;
|
|
12
|
-
export type InsertObjectOrListFactory<DB, TB extends keyof DB> = (eb: ExpressionBuilder<DB, TB>) => InsertObjectOrList<DB, TB>;
|
|
13
|
-
export type InsertExpression<DB, TB extends keyof DB> = InsertObjectOrList<DB, TB> | InsertObjectOrListFactory<DB, TB>;
|
|
14
|
-
export declare function parseInsertExpression(arg: InsertExpression<any, any>): [ReadonlyArray<ColumnNode>, ValuesNode];
|
|
12
|
+
export type InsertObjectOrListFactory<DB, TB extends keyof DB, UT extends keyof DB = never> = (eb: ExpressionBuilder<DB, TB | UT>) => InsertObjectOrList<DB, TB>;
|
|
13
|
+
export type InsertExpression<DB, TB extends keyof DB, UT extends keyof DB = never> = InsertObjectOrList<DB, TB> | InsertObjectOrListFactory<DB, TB, UT>;
|
|
14
|
+
export declare function parseInsertExpression(arg: InsertExpression<any, any, any>): [ReadonlyArray<ColumnNode>, ValuesNode];
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { InsertQueryNode } from '../operation-node/insert-query-node.js';
|
|
2
|
+
import { OperationNodeSource } from '../operation-node/operation-node-source.js';
|
|
3
|
+
import { OperationNode } from '../operation-node/operation-node.js';
|
|
4
|
+
import { WhenNode } from '../operation-node/when-node.js';
|
|
5
|
+
export declare function parseMergeWhen(type: {
|
|
6
|
+
isMatched: boolean;
|
|
7
|
+
bySource?: boolean;
|
|
8
|
+
}, args?: any[], refRight?: boolean): WhenNode;
|
|
9
|
+
export declare function parseMergeThen(result: 'delete' | 'do nothing' | OperationNodeSource | InsertQueryNode): OperationNode;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/// <reference types="./merge-parser.d.ts" />
|
|
2
|
+
import { MatchedNode } from '../operation-node/matched-node.js';
|
|
3
|
+
import { isOperationNodeSource, } from '../operation-node/operation-node-source.js';
|
|
4
|
+
import { RawNode } from '../operation-node/raw-node.js';
|
|
5
|
+
import { WhenNode } from '../operation-node/when-node.js';
|
|
6
|
+
import { isString } from '../util/object-utils.js';
|
|
7
|
+
import { parseFilterList, parseReferentialBinaryOperation, parseValueBinaryOperationOrExpression, } from './binary-operation-parser.js';
|
|
8
|
+
export function parseMergeWhen(type, args, refRight) {
|
|
9
|
+
return WhenNode.create(parseFilterList([
|
|
10
|
+
MatchedNode.create(!type.isMatched, type.bySource),
|
|
11
|
+
...(args && args.length > 0
|
|
12
|
+
? [
|
|
13
|
+
args.length === 3 && refRight
|
|
14
|
+
? parseReferentialBinaryOperation(args[0], args[1], args[2])
|
|
15
|
+
: parseValueBinaryOperationOrExpression(args),
|
|
16
|
+
]
|
|
17
|
+
: []),
|
|
18
|
+
], 'and', false));
|
|
19
|
+
}
|
|
20
|
+
export function parseMergeThen(result) {
|
|
21
|
+
if (isString(result)) {
|
|
22
|
+
return RawNode.create([result], []);
|
|
23
|
+
}
|
|
24
|
+
if (isOperationNodeSource(result)) {
|
|
25
|
+
return result.toOperationNode();
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
@@ -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>;
|
|
@@ -6,16 +6,17 @@ import { AliasedExpression } from '../expression/expression.js';
|
|
|
6
6
|
import { DrainOuterGeneric, ShallowRecord } from '../util/type-utils.js';
|
|
7
7
|
export type TableExpression<DB, TB extends keyof DB> = AnyAliasedTable<DB> | AnyTable<DB> | AliasedExpressionOrFactory<DB, TB>;
|
|
8
8
|
export type TableExpressionOrList<DB, TB extends keyof DB> = TableExpression<DB, TB> | ReadonlyArray<TableExpression<DB, TB>>;
|
|
9
|
-
export type TableReference<DB> =
|
|
9
|
+
export type TableReference<DB> = SimpleTableReference<DB> | AliasedExpression<any, any>;
|
|
10
|
+
export type SimpleTableReference<DB> = AnyAliasedTable<DB> | AnyTable<DB>;
|
|
10
11
|
export type AnyAliasedTable<DB> = `${AnyTable<DB>} as ${string}`;
|
|
11
12
|
export type TableReferenceOrList<DB> = TableReference<DB> | ReadonlyArray<TableReference<DB>>;
|
|
12
13
|
export type From<DB, TE> = DrainOuterGeneric<{
|
|
13
14
|
[C in keyof DB | ExtractAliasFromTableExpression<DB, TE>]: C extends ExtractAliasFromTableExpression<DB, TE> ? ExtractRowTypeFromTableExpression<DB, TE, C> : C extends keyof DB ? DB[C] : never;
|
|
14
15
|
}>;
|
|
15
16
|
export type FromTables<DB, TB extends keyof DB, TE> = DrainOuterGeneric<TB | ExtractAliasFromTableExpression<DB, TE>>;
|
|
16
|
-
export type ExtractTableAlias<DB, TE> = TE extends `${string} as ${infer TA}` ? TA : TE extends keyof DB ? TE : never;
|
|
17
|
+
export type ExtractTableAlias<DB, TE> = TE extends `${string} as ${infer TA}` ? TA extends keyof DB ? TA : never : TE extends keyof DB ? TE : never;
|
|
17
18
|
export type PickTableWithAlias<DB, T extends AnyAliasedTable<DB>> = T extends `${infer TB} as ${infer A}` ? TB extends keyof DB ? ShallowRecord<A, DB[TB]> : never : never;
|
|
18
|
-
type ExtractAliasFromTableExpression<DB, TE> = TE extends string ?
|
|
19
|
+
type ExtractAliasFromTableExpression<DB, TE> = TE extends string ? TE extends `${string} as ${infer TA}` ? TA : TE extends keyof DB ? TE : never : TE extends AliasedExpression<any, infer QA> ? QA : TE extends (qb: any) => AliasedExpression<any, infer QA> ? QA : never;
|
|
19
20
|
type ExtractRowTypeFromTableExpression<DB, TE, A extends keyof any> = TE extends `${infer T} as ${infer TA}` ? TA extends A ? T extends keyof DB ? DB[T] : never : never : TE extends A ? TE extends keyof DB ? DB[TE] : never : TE extends AliasedExpression<infer O, infer QA> ? QA extends A ? O : never : TE extends (qb: any) => AliasedExpression<infer O, infer QA> ? QA extends A ? O : never : never;
|
|
20
21
|
type AnyTable<DB> = keyof DB & string;
|
|
21
22
|
export declare function parseTableExpressionOrList(table: TableExpressionOrList<any, any>): OperationNode[];
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="./top-parser.d.ts" />
|
|
2
|
+
import { TopNode } from '../operation-node/top-node.js';
|
|
3
|
+
import { isBigInt, isNumber, isUndefined } from '../util/object-utils.js';
|
|
4
|
+
export function parseTop(expression, modifiers) {
|
|
5
|
+
if (!isNumber(expression) && !isBigInt(expression)) {
|
|
6
|
+
throw new Error(`Invalid top expression: ${expression}`);
|
|
7
|
+
}
|
|
8
|
+
if (!isUndefined(modifiers) && !isTopModifiers(modifiers)) {
|
|
9
|
+
throw new Error(`Invalid top modifiers: ${modifiers}`);
|
|
10
|
+
}
|
|
11
|
+
return TopNode.create(expression, modifiers);
|
|
12
|
+
}
|
|
13
|
+
function isTopModifiers(modifiers) {
|
|
14
|
+
return (modifiers === 'percent' ||
|
|
15
|
+
modifiers === 'with ties' ||
|
|
16
|
+
modifiers === 'percent with ties');
|
|
17
|
+
}
|
|
@@ -35,7 +35,7 @@ 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
|
|
@@ -75,7 +75,7 @@ export interface CamelCasePluginOptions {
|
|
|
75
75
|
* ```
|
|
76
76
|
*
|
|
77
77
|
* As you can see from the example, __everything__ needs to be defined
|
|
78
|
-
* in camelCase in the
|
|
78
|
+
* in camelCase in the TypeScript code: table names, columns, schemas,
|
|
79
79
|
* __everything__. When using the `CamelCasePlugin` Kysely works as if
|
|
80
80
|
* the database was defined in camelCase.
|
|
81
81
|
*
|
|
@@ -4,7 +4,7 @@ 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
|
|
@@ -44,7 +44,7 @@ import { createCamelCaseMapper, createSnakeCaseMapper, } from './camel-case.js';
|
|
|
44
44
|
* ```
|
|
45
45
|
*
|
|
46
46
|
* As you can see from the example, __everything__ needs to be defined
|
|
47
|
-
* in camelCase in the
|
|
47
|
+
* in camelCase in the TypeScript code: table names, columns, schemas,
|
|
48
48
|
* __everything__. When using the `CamelCasePlugin` Kysely works as if
|
|
49
49
|
* the database was defined in camelCase.
|
|
50
50
|
*
|
|
@@ -2,6 +2,20 @@ 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
|
*
|
|
@@ -16,6 +30,9 @@ import { KyselyPlugin, PluginTransformQueryArgs, PluginTransformResultArgs } fro
|
|
|
16
30
|
* ```
|
|
17
31
|
*/
|
|
18
32
|
export declare class ParseJSONResultsPlugin implements KyselyPlugin {
|
|
33
|
+
#private;
|
|
34
|
+
readonly opt: ParseJSONResultsPluginOptions;
|
|
35
|
+
constructor(opt?: ParseJSONResultsPluginOptions);
|
|
19
36
|
/**
|
|
20
37
|
* This is called for each query before it is executed. You can modify the query by
|
|
21
38
|
* transforming its {@link OperationNode} tree provided in {@link PluginTransformQueryArgs.node | args.node}
|
|
@@ -53,3 +70,4 @@ export declare class ParseJSONResultsPlugin implements KyselyPlugin {
|
|
|
53
70
|
*/
|
|
54
71
|
transformResult(args: PluginTransformResultArgs): Promise<QueryResult<UnknownRow>>;
|
|
55
72
|
}
|
|
73
|
+
export {};
|
|
@@ -14,6 +14,12 @@ import { isPlainObject, isString } from '../../util/object-utils.js';
|
|
|
14
14
|
* ```
|
|
15
15
|
*/
|
|
16
16
|
export class ParseJSONResultsPlugin {
|
|
17
|
+
opt;
|
|
18
|
+
#objectStrategy;
|
|
19
|
+
constructor(opt = {}) {
|
|
20
|
+
this.opt = opt;
|
|
21
|
+
this.#objectStrategy = opt.objectStrategy || 'in-place';
|
|
22
|
+
}
|
|
17
23
|
// noop
|
|
18
24
|
transformQuery(args) {
|
|
19
25
|
return args.node;
|
|
@@ -21,32 +27,33 @@ export class ParseJSONResultsPlugin {
|
|
|
21
27
|
async transformResult(args) {
|
|
22
28
|
return {
|
|
23
29
|
...args.result,
|
|
24
|
-
rows: parseArray(args.result.rows),
|
|
30
|
+
rows: parseArray(args.result.rows, this.#objectStrategy),
|
|
25
31
|
};
|
|
26
32
|
}
|
|
27
33
|
}
|
|
28
|
-
function parseArray(arr) {
|
|
34
|
+
function parseArray(arr, objectStrategy) {
|
|
35
|
+
const target = objectStrategy === 'create' ? new Array(arr.length) : arr;
|
|
29
36
|
for (let i = 0; i < arr.length; ++i) {
|
|
30
|
-
|
|
37
|
+
target[i] = parse(arr[i], objectStrategy);
|
|
31
38
|
}
|
|
32
|
-
return
|
|
39
|
+
return target;
|
|
33
40
|
}
|
|
34
|
-
function parse(obj) {
|
|
41
|
+
function parse(obj, objectStrategy) {
|
|
35
42
|
if (isString(obj)) {
|
|
36
43
|
return parseString(obj);
|
|
37
44
|
}
|
|
38
45
|
if (Array.isArray(obj)) {
|
|
39
|
-
return parseArray(obj);
|
|
46
|
+
return parseArray(obj, objectStrategy);
|
|
40
47
|
}
|
|
41
48
|
if (isPlainObject(obj)) {
|
|
42
|
-
return parseObject(obj);
|
|
49
|
+
return parseObject(obj, objectStrategy);
|
|
43
50
|
}
|
|
44
51
|
return obj;
|
|
45
52
|
}
|
|
46
53
|
function parseString(str) {
|
|
47
54
|
if (maybeJson(str)) {
|
|
48
55
|
try {
|
|
49
|
-
return parse(JSON.parse(str));
|
|
56
|
+
return parse(JSON.parse(str), 'in-place');
|
|
50
57
|
}
|
|
51
58
|
catch (err) {
|
|
52
59
|
// this catch block is intentionally empty.
|
|
@@ -57,9 +64,10 @@ function parseString(str) {
|
|
|
57
64
|
function maybeJson(value) {
|
|
58
65
|
return value.match(/^[\[\{]/) != null;
|
|
59
66
|
}
|
|
60
|
-
function parseObject(obj) {
|
|
67
|
+
function parseObject(obj, objectStrategy) {
|
|
68
|
+
const target = objectStrategy === 'create' ? {} : obj;
|
|
61
69
|
for (const key in obj) {
|
|
62
|
-
|
|
70
|
+
target[key] = parse(obj[key], objectStrategy);
|
|
63
71
|
}
|
|
64
|
-
return
|
|
72
|
+
return target;
|
|
65
73
|
}
|
|
@@ -27,6 +27,7 @@ const ROOT_OPERATION_NODES = freeze({
|
|
|
27
27
|
RawNode: true,
|
|
28
28
|
SelectQueryNode: true,
|
|
29
29
|
UpdateQueryNode: true,
|
|
30
|
+
MergeQueryNode: true,
|
|
30
31
|
});
|
|
31
32
|
export class WithSchemaTransformer extends OperationNodeTransformer {
|
|
32
33
|
#schema;
|
|
@@ -101,6 +102,9 @@ export class WithSchemaTransformer extends OperationNodeTransformer {
|
|
|
101
102
|
this.#collectSchemableIdsFromTableExpr(join.table, schemableIds);
|
|
102
103
|
}
|
|
103
104
|
}
|
|
105
|
+
if ('using' in node && node.using) {
|
|
106
|
+
this.#collectSchemableIdsFromTableExpr(node.using, schemableIds);
|
|
107
|
+
}
|
|
104
108
|
return schemableIds;
|
|
105
109
|
}
|
|
106
110
|
#collectCTEs(node) {
|