kysely 0.24.1 → 0.25.0
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/README.md +30 -13
- package/dist/cjs/dialect/mysql/mysql-dialect-config.d.ts +2 -1
- package/dist/cjs/dialect/postgres/postgres-introspector.js +4 -1
- package/dist/cjs/driver/runtime-driver.js +6 -6
- 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 +56 -1
- package/dist/cjs/expression/expression-builder.js +10 -0
- package/dist/cjs/helpers/mysql.d.ts +3 -3
- package/dist/cjs/helpers/mysql.js +2 -2
- package/dist/cjs/helpers/postgres.d.ts +1 -1
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.js +4 -0
- package/dist/cjs/kysely.d.ts +19 -2
- package/dist/cjs/kysely.js +28 -1
- package/dist/cjs/operation-node/aggregate-function-node.d.ts +3 -7
- package/dist/cjs/operation-node/aggregate-function-node.js +1 -1
- package/dist/cjs/operation-node/alter-column-node.d.ts +1 -2
- package/dist/cjs/operation-node/alter-table-node.d.ts +1 -1
- package/dist/cjs/operation-node/alter-table-node.js +1 -2
- package/dist/cjs/operation-node/case-node.d.ts +19 -0
- package/dist/cjs/operation-node/case-node.js +42 -0
- package/dist/cjs/operation-node/create-index-node.d.ts +2 -1
- package/dist/cjs/operation-node/create-index-node.js +6 -0
- package/dist/cjs/operation-node/data-type-node.d.ts +1 -1
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +20 -2
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +2 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/when-node.d.ts +14 -0
- package/dist/cjs/operation-node/when-node.js +24 -0
- package/dist/cjs/parser/binary-operation-parser.d.ts +1 -0
- package/dist/cjs/parser/binary-operation-parser.js +18 -2
- package/dist/cjs/parser/expression-parser.d.ts +2 -1
- package/dist/cjs/parser/order-by-parser.d.ts +1 -0
- package/dist/cjs/parser/order-by-parser.js +5 -1
- package/dist/cjs/parser/reference-parser.d.ts +6 -2
- package/dist/cjs/parser/reference-parser.js +16 -1
- package/dist/cjs/parser/select-parser.d.ts +4 -4
- package/dist/cjs/parser/table-parser.d.ts +5 -4
- package/dist/cjs/parser/with-parser.d.ts +4 -3
- package/dist/cjs/query-builder/case-builder.d.ts +111 -0
- package/dist/cjs/query-builder/case-builder.js +75 -0
- package/dist/cjs/query-builder/delete-query-builder.d.ts +55 -13
- package/dist/cjs/query-builder/delete-query-builder.js +44 -0
- package/dist/cjs/query-builder/function-module.d.ts +36 -5
- package/dist/cjs/query-builder/function-module.js +12 -16
- package/dist/cjs/query-builder/insert-query-builder.d.ts +44 -3
- package/dist/cjs/query-builder/insert-query-builder.js +49 -1
- package/dist/cjs/query-builder/select-query-builder.d.ts +54 -13
- package/dist/cjs/query-builder/select-query-builder.js +43 -0
- package/dist/cjs/query-builder/update-query-builder.d.ts +65 -20
- package/dist/cjs/query-builder/update-query-builder.js +47 -0
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +4 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +30 -3
- package/dist/cjs/schema/alter-column-builder.d.ts +2 -2
- package/dist/cjs/schema/alter-column-builder.js +2 -2
- package/dist/cjs/schema/create-index-builder.d.ts +49 -7
- package/dist/cjs/schema/create-index-builder.js +51 -13
- package/dist/cjs/schema/schema.js +1 -1
- package/dist/cjs/util/column-type.d.ts +3 -2
- package/dist/cjs/util/log.d.ts +3 -3
- package/dist/cjs/util/log.js +4 -4
- package/dist/cjs/util/object-utils.d.ts +2 -1
- package/dist/cjs/util/type-utils.d.ts +43 -29
- package/dist/esm/dialect/mysql/mysql-dialect-config.d.ts +2 -1
- package/dist/esm/dialect/postgres/postgres-introspector.js +4 -1
- package/dist/esm/driver/runtime-driver.js +6 -6
- 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 +56 -1
- package/dist/esm/expression/expression-builder.js +11 -1
- package/dist/esm/helpers/mysql.d.ts +3 -3
- package/dist/esm/helpers/mysql.js +2 -2
- package/dist/esm/helpers/postgres.d.ts +1 -1
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/kysely.d.ts +19 -2
- package/dist/esm/kysely.js +29 -2
- package/dist/esm/operation-node/aggregate-function-node.d.ts +3 -7
- package/dist/esm/operation-node/aggregate-function-node.js +1 -1
- package/dist/esm/operation-node/alter-column-node.d.ts +1 -2
- package/dist/esm/operation-node/alter-table-node.d.ts +1 -1
- package/dist/esm/operation-node/alter-table-node.js +1 -2
- package/dist/esm/operation-node/case-node.d.ts +19 -0
- package/dist/esm/operation-node/case-node.js +40 -0
- package/dist/esm/operation-node/create-index-node.d.ts +2 -1
- package/dist/esm/operation-node/create-index-node.js +6 -0
- package/dist/esm/operation-node/data-type-node.d.ts +1 -1
- package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -0
- package/dist/esm/operation-node/operation-node-transformer.js +20 -2
- package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -0
- package/dist/esm/operation-node/operation-node-visitor.js +2 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/when-node.d.ts +14 -0
- package/dist/esm/operation-node/when-node.js +22 -0
- package/dist/esm/parser/binary-operation-parser.d.ts +1 -0
- package/dist/esm/parser/binary-operation-parser.js +16 -1
- package/dist/esm/parser/expression-parser.d.ts +2 -1
- package/dist/esm/parser/order-by-parser.d.ts +1 -0
- package/dist/esm/parser/order-by-parser.js +3 -0
- package/dist/esm/parser/reference-parser.d.ts +6 -2
- package/dist/esm/parser/reference-parser.js +14 -0
- package/dist/esm/parser/select-parser.d.ts +4 -4
- package/dist/esm/parser/table-parser.d.ts +5 -4
- package/dist/esm/parser/with-parser.d.ts +4 -3
- package/dist/esm/query-builder/case-builder.d.ts +111 -0
- package/dist/esm/query-builder/case-builder.js +69 -0
- package/dist/esm/query-builder/delete-query-builder.d.ts +55 -13
- package/dist/esm/query-builder/delete-query-builder.js +44 -0
- package/dist/esm/query-builder/function-module.d.ts +36 -5
- package/dist/esm/query-builder/function-module.js +13 -17
- package/dist/esm/query-builder/insert-query-builder.d.ts +44 -3
- package/dist/esm/query-builder/insert-query-builder.js +49 -1
- package/dist/esm/query-builder/select-query-builder.d.ts +54 -13
- package/dist/esm/query-builder/select-query-builder.js +43 -0
- package/dist/esm/query-builder/update-query-builder.d.ts +65 -20
- package/dist/esm/query-builder/update-query-builder.js +47 -0
- package/dist/esm/query-compiler/default-query-compiler.d.ts +4 -0
- package/dist/esm/query-compiler/default-query-compiler.js +30 -3
- package/dist/esm/schema/alter-column-builder.d.ts +2 -2
- package/dist/esm/schema/alter-column-builder.js +2 -2
- package/dist/esm/schema/create-index-builder.d.ts +49 -7
- package/dist/esm/schema/create-index-builder.js +52 -14
- package/dist/esm/schema/schema.js +1 -1
- package/dist/esm/util/column-type.d.ts +3 -2
- package/dist/esm/util/log.d.ts +3 -3
- package/dist/esm/util/log.js +4 -4
- package/dist/esm/util/object-utils.d.ts +2 -1
- package/dist/esm/util/type-utils.d.ts +43 -29
- package/package.json +1 -1
|
@@ -9,7 +9,7 @@ export interface CreateIndexNode extends OperationNode {
|
|
|
9
9
|
readonly kind: 'CreateIndexNode';
|
|
10
10
|
readonly name: IdentifierNode;
|
|
11
11
|
readonly table?: TableNode;
|
|
12
|
-
readonly
|
|
12
|
+
readonly columns?: OperationNode[];
|
|
13
13
|
readonly unique?: boolean;
|
|
14
14
|
readonly using?: RawNode;
|
|
15
15
|
readonly ifNotExists?: boolean;
|
|
@@ -22,4 +22,5 @@ export declare const CreateIndexNode: Readonly<{
|
|
|
22
22
|
is(node: OperationNode): node is CreateIndexNode;
|
|
23
23
|
create(name: string): CreateIndexNode;
|
|
24
24
|
cloneWith(node: CreateIndexNode, props: CreateIndexNodeProps): CreateIndexNode;
|
|
25
|
+
cloneWithColumns(node: CreateIndexNode, columns: OperationNode[]): CreateIndexNode;
|
|
25
26
|
}>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OperationNode } from './operation-node.js';
|
|
2
|
-
export declare type ColumnDataType = 'varchar' | `varchar(${number})` | 'text' | 'integer' | 'int2' | 'int4' | 'int8' | 'bigint' | 'boolean' | 'real' | 'double precision' | 'float4' | 'float8' | 'decimal' | `decimal(${number}, ${number})` | 'numeric' | `numeric(${number}, ${number})` | 'binary' | 'date' | 'datetime' | `datetime(${number})` | 'time' | `time(${number})` | 'timetz' | `timetz(${number})` | 'timestamp' | `timestamp(${number})` | 'timestamptz' | `timestamptz(${number})` | 'serial' | 'bigserial' | 'uuid' | 'json' | 'jsonb' | 'blob';
|
|
2
|
+
export declare type ColumnDataType = 'varchar' | `varchar(${number})` | 'char' | `char(${number})` | 'text' | 'integer' | 'int2' | 'int4' | 'int8' | 'bigint' | 'boolean' | 'real' | 'double precision' | 'float4' | 'float8' | 'decimal' | `decimal(${number}, ${number})` | 'numeric' | `numeric(${number}, ${number})` | 'binary' | `binary(${number})` | 'bytea' | 'date' | 'datetime' | `datetime(${number})` | 'time' | `time(${number})` | 'timetz' | `timetz(${number})` | 'timestamp' | `timestamp(${number})` | 'timestamptz' | `timestamptz(${number})` | 'serial' | 'bigserial' | 'uuid' | 'json' | 'jsonb' | 'blob';
|
|
3
3
|
export declare type DataTypeParams = Omit<DataTypeNode, 'kind' | 'dataType'>;
|
|
4
4
|
export interface DataTypeNode extends OperationNode {
|
|
5
5
|
readonly kind: 'DataTypeNode';
|
|
@@ -78,6 +78,8 @@ import { BinaryOperationNode } from './binary-operation-node.js';
|
|
|
78
78
|
import { UnaryOperationNode } from './unary-operation-node.js';
|
|
79
79
|
import { UsingNode } from './using-node.js';
|
|
80
80
|
import { FunctionNode } from './function-node.js';
|
|
81
|
+
import { CaseNode } from './case-node.js';
|
|
82
|
+
import { WhenNode } from './when-node.js';
|
|
81
83
|
/**
|
|
82
84
|
* Transforms an operation node tree into another one.
|
|
83
85
|
*
|
|
@@ -185,6 +187,8 @@ export declare class OperationNodeTransformer {
|
|
|
185
187
|
protected transformUnaryOperation(node: UnaryOperationNode): UnaryOperationNode;
|
|
186
188
|
protected transformUsing(node: UsingNode): UsingNode;
|
|
187
189
|
protected transformFunction(node: FunctionNode): FunctionNode;
|
|
190
|
+
protected transformCase(node: CaseNode): CaseNode;
|
|
191
|
+
protected transformWhen(node: WhenNode): WhenNode;
|
|
188
192
|
protected transformDataType(node: DataTypeNode): DataTypeNode;
|
|
189
193
|
protected transformSelectAll(node: SelectAllNode): SelectAllNode;
|
|
190
194
|
protected transformIdentifier(node: IdentifierNode): IdentifierNode;
|
|
@@ -114,6 +114,8 @@ class OperationNodeTransformer {
|
|
|
114
114
|
UnaryOperationNode: this.transformUnaryOperation.bind(this),
|
|
115
115
|
UsingNode: this.transformUsing.bind(this),
|
|
116
116
|
FunctionNode: this.transformFunction.bind(this),
|
|
117
|
+
CaseNode: this.transformCase.bind(this),
|
|
118
|
+
WhenNode: this.transformWhen.bind(this),
|
|
117
119
|
});
|
|
118
120
|
transformNode(node) {
|
|
119
121
|
if (!node) {
|
|
@@ -404,7 +406,7 @@ class OperationNodeTransformer {
|
|
|
404
406
|
kind: 'CreateIndexNode',
|
|
405
407
|
name: this.transformNode(node.name),
|
|
406
408
|
table: this.transformNode(node.table),
|
|
407
|
-
|
|
409
|
+
columns: this.transformNodeList(node.columns),
|
|
408
410
|
unique: node.unique,
|
|
409
411
|
using: this.transformNode(node.using),
|
|
410
412
|
ifNotExists: node.ifNotExists,
|
|
@@ -653,7 +655,7 @@ class OperationNodeTransformer {
|
|
|
653
655
|
transformAggregateFunction(node) {
|
|
654
656
|
return (0, require_all_props_js_1.requireAllProps)({
|
|
655
657
|
kind: 'AggregateFunctionNode',
|
|
656
|
-
aggregated: this.
|
|
658
|
+
aggregated: this.transformNodeList(node.aggregated),
|
|
657
659
|
distinct: node.distinct,
|
|
658
660
|
filter: this.transformNode(node.filter),
|
|
659
661
|
func: node.func,
|
|
@@ -707,6 +709,22 @@ class OperationNodeTransformer {
|
|
|
707
709
|
arguments: this.transformNodeList(node.arguments),
|
|
708
710
|
});
|
|
709
711
|
}
|
|
712
|
+
transformCase(node) {
|
|
713
|
+
return (0, require_all_props_js_1.requireAllProps)({
|
|
714
|
+
kind: 'CaseNode',
|
|
715
|
+
value: this.transformNode(node.value),
|
|
716
|
+
when: this.transformNodeList(node.when),
|
|
717
|
+
else: this.transformNode(node.else),
|
|
718
|
+
isStatement: node.isStatement,
|
|
719
|
+
});
|
|
720
|
+
}
|
|
721
|
+
transformWhen(node) {
|
|
722
|
+
return (0, require_all_props_js_1.requireAllProps)({
|
|
723
|
+
kind: 'WhenNode',
|
|
724
|
+
condition: this.transformNode(node.condition),
|
|
725
|
+
result: this.transformNode(node.result),
|
|
726
|
+
});
|
|
727
|
+
}
|
|
710
728
|
transformDataType(node) {
|
|
711
729
|
// An Object.freezed leaf node. No need to clone.
|
|
712
730
|
return node;
|
|
@@ -78,6 +78,8 @@ import { BinaryOperationNode } from './binary-operation-node.js';
|
|
|
78
78
|
import { UnaryOperationNode } from './unary-operation-node.js';
|
|
79
79
|
import { UsingNode } from './using-node.js';
|
|
80
80
|
import { FunctionNode } from './function-node.js';
|
|
81
|
+
import { WhenNode } from './when-node.js';
|
|
82
|
+
import { CaseNode } from './case-node.js';
|
|
81
83
|
export declare abstract class OperationNodeVisitor {
|
|
82
84
|
#private;
|
|
83
85
|
protected readonly nodeStack: OperationNode[];
|
|
@@ -162,4 +164,6 @@ export declare abstract class OperationNodeVisitor {
|
|
|
162
164
|
protected abstract visitUnaryOperation(node: UnaryOperationNode): void;
|
|
163
165
|
protected abstract visitUsing(node: UsingNode): void;
|
|
164
166
|
protected abstract visitFunction(node: FunctionNode): void;
|
|
167
|
+
protected abstract visitCase(node: CaseNode): void;
|
|
168
|
+
protected abstract visitWhen(node: WhenNode): void;
|
|
165
169
|
}
|
|
@@ -87,6 +87,8 @@ class OperationNodeVisitor {
|
|
|
87
87
|
UnaryOperationNode: this.visitUnaryOperation.bind(this),
|
|
88
88
|
UsingNode: this.visitUsing.bind(this),
|
|
89
89
|
FunctionNode: this.visitFunction.bind(this),
|
|
90
|
+
CaseNode: this.visitCase.bind(this),
|
|
91
|
+
WhenNode: this.visitWhen.bind(this),
|
|
90
92
|
});
|
|
91
93
|
visitNode = (node) => {
|
|
92
94
|
this.nodeStack.push(node);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare 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';
|
|
1
|
+
export declare 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';
|
|
2
2
|
export interface OperationNode {
|
|
3
3
|
readonly kind: OperationNodeKind;
|
|
4
4
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { OperationNode } from './operation-node.js';
|
|
2
|
+
export interface WhenNode extends OperationNode {
|
|
3
|
+
readonly kind: 'WhenNode';
|
|
4
|
+
readonly condition: OperationNode;
|
|
5
|
+
readonly result?: OperationNode;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export declare const WhenNode: Readonly<{
|
|
11
|
+
is(node: OperationNode): node is WhenNode;
|
|
12
|
+
create(condition: OperationNode): WhenNode;
|
|
13
|
+
cloneWithResult(whenNode: WhenNode, result: OperationNode): WhenNode;
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WhenNode = void 0;
|
|
4
|
+
const object_utils_js_1 = require("../util/object-utils.js");
|
|
5
|
+
/**
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
exports.WhenNode = (0, object_utils_js_1.freeze)({
|
|
9
|
+
is(node) {
|
|
10
|
+
return node.kind === 'WhenNode';
|
|
11
|
+
},
|
|
12
|
+
create(condition) {
|
|
13
|
+
return (0, object_utils_js_1.freeze)({
|
|
14
|
+
kind: 'WhenNode',
|
|
15
|
+
condition,
|
|
16
|
+
});
|
|
17
|
+
},
|
|
18
|
+
cloneWithResult(whenNode, result) {
|
|
19
|
+
return (0, object_utils_js_1.freeze)({
|
|
20
|
+
...whenNode,
|
|
21
|
+
result,
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
});
|
|
@@ -17,3 +17,4 @@ export declare function parseReferentialComparison(leftOperand: ReferenceExpress
|
|
|
17
17
|
export declare function parseWhere(args: any[]): OperationNode;
|
|
18
18
|
export declare function parseHaving(args: any[]): OperationNode;
|
|
19
19
|
export declare function parseOn(args: any[]): OperationNode;
|
|
20
|
+
export declare function parseWhen(args: any[]): OperationNode;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseOn = exports.parseHaving = exports.parseWhere = exports.parseReferentialComparison = exports.parseValueComparison = exports.parseReferentialBinaryOperation = exports.parseValueBinaryOperation = void 0;
|
|
3
|
+
exports.parseWhen = exports.parseOn = exports.parseHaving = exports.parseWhere = exports.parseReferentialComparison = exports.parseValueComparison = exports.parseReferentialBinaryOperation = exports.parseValueBinaryOperation = void 0;
|
|
4
4
|
const binary_operation_node_js_1 = require("../operation-node/binary-operation-node.js");
|
|
5
5
|
const object_utils_js_1 = require("../util/object-utils.js");
|
|
6
6
|
const operation_node_source_js_1 = require("../operation-node/operation-node-source.js");
|
|
@@ -14,6 +14,8 @@ const parse_utils_js_1 = require("./parse-utils.js");
|
|
|
14
14
|
const select_query_node_js_1 = require("../operation-node/select-query-node.js");
|
|
15
15
|
const join_node_js_1 = require("../operation-node/join-node.js");
|
|
16
16
|
const expression_builder_js_1 = require("../expression/expression-builder.js");
|
|
17
|
+
const unary_operation_node_js_1 = require("../operation-node/unary-operation-node.js");
|
|
18
|
+
const case_node_js_1 = require("../operation-node/case-node.js");
|
|
17
19
|
function parseValueBinaryOperation(leftOperand, operator, rightOperand) {
|
|
18
20
|
if (!(0, operator_node_js_1.isBinaryOperator)(operator) && !(0, operation_node_source_js_1.isOperationNodeSource)(operator)) {
|
|
19
21
|
throw new Error(`invalid binary operator ${JSON.stringify(operator)}`);
|
|
@@ -57,6 +59,10 @@ function parseOn(args) {
|
|
|
57
59
|
return parseFilter('on', args);
|
|
58
60
|
}
|
|
59
61
|
exports.parseOn = parseOn;
|
|
62
|
+
function parseWhen(args) {
|
|
63
|
+
return parseFilter('when', args);
|
|
64
|
+
}
|
|
65
|
+
exports.parseWhen = parseWhen;
|
|
60
66
|
function parseFilter(type, args) {
|
|
61
67
|
if (args.length === 3) {
|
|
62
68
|
return parseValueComparison(args[0], args[1], args[2]);
|
|
@@ -84,14 +90,24 @@ function parseOperator(operator) {
|
|
|
84
90
|
}
|
|
85
91
|
function parseOneArgFilterExpression(type, arg) {
|
|
86
92
|
if ((0, object_utils_js_1.isFunction)(arg)) {
|
|
93
|
+
if (type === 'when') {
|
|
94
|
+
throw new Error(`when method doesn't accept a callback as an argument`);
|
|
95
|
+
}
|
|
87
96
|
return CALLBACK_PARSERS[type](arg);
|
|
88
97
|
}
|
|
89
98
|
else if ((0, operation_node_source_js_1.isOperationNodeSource)(arg)) {
|
|
90
99
|
const node = arg.toOperationNode();
|
|
91
|
-
if (raw_node_js_1.RawNode.is(node)
|
|
100
|
+
if (raw_node_js_1.RawNode.is(node) ||
|
|
101
|
+
binary_operation_node_js_1.BinaryOperationNode.is(node) ||
|
|
102
|
+
unary_operation_node_js_1.UnaryOperationNode.is(node) ||
|
|
103
|
+
parens_node_js_1.ParensNode.is(node) ||
|
|
104
|
+
case_node_js_1.CaseNode.is(node)) {
|
|
92
105
|
return node;
|
|
93
106
|
}
|
|
94
107
|
}
|
|
108
|
+
else if (type === 'when') {
|
|
109
|
+
return value_node_js_1.ValueNode.create(arg);
|
|
110
|
+
}
|
|
95
111
|
throw createFilterExpressionError(type, arg);
|
|
96
112
|
}
|
|
97
113
|
function createFilterExpressionError(type, args) {
|
|
@@ -3,7 +3,8 @@ import { AliasNode } from '../operation-node/alias-node.js';
|
|
|
3
3
|
import { OperationNode } from '../operation-node/operation-node.js';
|
|
4
4
|
import { ExpressionBuilder } from '../expression/expression-builder.js';
|
|
5
5
|
import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
|
|
6
|
-
|
|
6
|
+
import { ShallowRecord } from '../util/type-utils.js';
|
|
7
|
+
export declare type ExpressionOrFactory<DB, TB extends keyof DB, V> = SelectQueryBuilder<any, any, ShallowRecord<string, V>> | SelectQueryBuilderFactory<DB, TB, ShallowRecord<string, V>> | Expression<V> | ExpressionFactory<DB, TB, V>;
|
|
7
8
|
export declare type AliasedExpressionOrFactory<DB, TB extends keyof DB> = AliasedExpression<any, any> | AliasedExpressionFactory<DB, TB>;
|
|
8
9
|
declare type SelectQueryBuilderFactory<DB, TB extends keyof DB, V> = (eb: ExpressionBuilder<DB, TB>) => SelectQueryBuilder<any, any, V>;
|
|
9
10
|
declare type ExpressionFactory<DB, TB extends keyof DB, V> = (eb: ExpressionBuilder<DB, TB>) => Expression<V>;
|
|
@@ -2,6 +2,7 @@ import { Expression } from '../expression/expression.js';
|
|
|
2
2
|
import { OrderByItemNode } from '../operation-node/order-by-item-node.js';
|
|
3
3
|
import { ReferenceExpression } from './reference-parser.js';
|
|
4
4
|
export declare type OrderByDirection = 'asc' | 'desc';
|
|
5
|
+
export declare function isOrderByDirection(thing: unknown): thing is OrderByDirection;
|
|
5
6
|
export declare type OrderByExpression<DB, TB extends keyof DB, O> = ReferenceExpression<DB, TB> | (keyof O & string);
|
|
6
7
|
export declare type OrderByDirectionExpression = OrderByDirection | Expression<any>;
|
|
7
8
|
export declare function parseOrderBy(orderBy: OrderByExpression<any, any, any>, direction?: OrderByDirectionExpression): OrderByItemNode;
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseOrderBy = void 0;
|
|
3
|
+
exports.parseOrderBy = exports.isOrderByDirection = void 0;
|
|
4
4
|
const order_by_item_node_js_1 = require("../operation-node/order-by-item-node.js");
|
|
5
5
|
const raw_node_js_1 = require("../operation-node/raw-node.js");
|
|
6
6
|
const reference_parser_js_1 = require("./reference-parser.js");
|
|
7
|
+
function isOrderByDirection(thing) {
|
|
8
|
+
return thing === 'asc' || thing === 'desc';
|
|
9
|
+
}
|
|
10
|
+
exports.isOrderByDirection = isOrderByDirection;
|
|
7
11
|
function parseOrderBy(orderBy, direction) {
|
|
8
12
|
return order_by_item_node_js_1.OrderByItemNode.create(parseOrderByExpression(orderBy), parseOrderByDirectionExpression(direction));
|
|
9
13
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AliasNode } from '../operation-node/alias-node.js';
|
|
2
2
|
import { ColumnNode } from '../operation-node/column-node.js';
|
|
3
|
-
import { AnyColumn, AnyColumnWithTable, ExtractColumnType
|
|
3
|
+
import { AnyColumn, AnyColumnWithTable, ExtractColumnType } from '../util/type-utils.js';
|
|
4
4
|
import { SelectQueryBuilder } from '../query-builder/select-query-builder.js';
|
|
5
5
|
import { ExpressionOrFactory } from './expression-parser.js';
|
|
6
6
|
import { DynamicReferenceBuilder } from '../dynamic/dynamic-reference-builder.js';
|
|
@@ -8,15 +8,19 @@ import { SelectType } from '../util/column-type.js';
|
|
|
8
8
|
import { OperationNode } from '../operation-node/operation-node.js';
|
|
9
9
|
import { Expression } from '../expression/expression.js';
|
|
10
10
|
import { SimpleReferenceExpressionNode } from '../operation-node/simple-reference-expression-node.js';
|
|
11
|
+
import { OrderByDirection } from './order-by-parser.js';
|
|
11
12
|
export declare type StringReference<DB, TB extends keyof DB> = AnyColumn<DB, TB> | AnyColumnWithTable<DB, TB>;
|
|
12
13
|
export declare type SimpleReferenceExpression<DB, TB extends keyof DB> = StringReference<DB, TB> | DynamicReferenceBuilder<any>;
|
|
13
14
|
export declare type ReferenceExpression<DB, TB extends keyof DB> = SimpleReferenceExpression<DB, TB> | ExpressionOrFactory<DB, TB, any>;
|
|
14
15
|
export declare type ReferenceExpressionOrList<DB, TB extends keyof DB> = ReferenceExpression<DB, TB> | ReadonlyArray<ReferenceExpression<DB, TB>>;
|
|
15
|
-
export declare type ExtractTypeFromReferenceExpression<DB, TB extends keyof DB, RE, DV = unknown> = RE extends string ? SelectType<ExtractTypeFromStringReference<DB, TB, RE>> : RE extends SelectQueryBuilder<any, any, infer O> ?
|
|
16
|
+
export declare type ExtractTypeFromReferenceExpression<DB, TB extends keyof DB, RE, DV = unknown> = RE extends string ? SelectType<ExtractTypeFromStringReference<DB, TB, RE>> : RE extends SelectQueryBuilder<any, any, infer O> ? O[keyof O] | null : RE extends (qb: any) => SelectQueryBuilder<any, any, infer O> ? O[keyof O] | null : RE extends Expression<infer O> ? O : RE extends (qb: any) => Expression<infer O> ? O : DV;
|
|
16
17
|
export declare type ExtractTypeFromStringReference<DB, TB extends keyof DB, RE extends string, DV = unknown> = RE extends `${infer SC}.${infer T}.${infer C}` ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : RE extends `${infer T}.${infer C}` ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : RE extends AnyColumn<DB, TB> ? ExtractColumnType<DB, TB, RE> : DV;
|
|
18
|
+
export declare type OrderedColumnName<C extends string> = C extends `${string} ${infer O}` ? O extends OrderByDirection ? C : never : C;
|
|
19
|
+
export declare type ExtractColumnNameFromOrderedColumnName<C extends string> = C extends `${infer CL} ${infer O}` ? O extends OrderByDirection ? CL : never : C;
|
|
17
20
|
export declare function parseSimpleReferenceExpression(exp: SimpleReferenceExpression<any, any>): SimpleReferenceExpressionNode;
|
|
18
21
|
export declare function parseReferenceExpressionOrList(arg: ReferenceExpressionOrList<any, any>): OperationNode[];
|
|
19
22
|
export declare function parseReferenceExpression(exp: ReferenceExpression<any, any>): OperationNode;
|
|
20
23
|
export declare function parseStringReference(ref: string): SimpleReferenceExpressionNode;
|
|
21
24
|
export declare function parseAliasedStringReference(ref: string): SimpleReferenceExpressionNode | AliasNode;
|
|
22
25
|
export declare function parseColumnName(column: AnyColumn<any, any>): ColumnNode;
|
|
26
|
+
export declare function parseOrderedColumnName(column: string): OperationNode;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseColumnName = exports.parseAliasedStringReference = exports.parseStringReference = exports.parseReferenceExpression = exports.parseReferenceExpressionOrList = exports.parseSimpleReferenceExpression = void 0;
|
|
3
|
+
exports.parseOrderedColumnName = exports.parseColumnName = exports.parseAliasedStringReference = exports.parseStringReference = exports.parseReferenceExpression = exports.parseReferenceExpressionOrList = exports.parseSimpleReferenceExpression = void 0;
|
|
4
4
|
const alias_node_js_1 = require("../operation-node/alias-node.js");
|
|
5
5
|
const column_node_js_1 = require("../operation-node/column-node.js");
|
|
6
6
|
const reference_node_js_1 = require("../operation-node/reference-node.js");
|
|
@@ -8,6 +8,7 @@ const table_node_js_1 = require("../operation-node/table-node.js");
|
|
|
8
8
|
const object_utils_js_1 = require("../util/object-utils.js");
|
|
9
9
|
const expression_parser_js_1 = require("./expression-parser.js");
|
|
10
10
|
const identifier_node_js_1 = require("../operation-node/identifier-node.js");
|
|
11
|
+
const order_by_parser_js_1 = require("./order-by-parser.js");
|
|
11
12
|
function parseSimpleReferenceExpression(exp) {
|
|
12
13
|
if ((0, object_utils_js_1.isString)(exp)) {
|
|
13
14
|
return parseStringReference(exp);
|
|
@@ -65,6 +66,20 @@ function parseColumnName(column) {
|
|
|
65
66
|
return column_node_js_1.ColumnNode.create(column);
|
|
66
67
|
}
|
|
67
68
|
exports.parseColumnName = parseColumnName;
|
|
69
|
+
function parseOrderedColumnName(column) {
|
|
70
|
+
const ORDER_SEPARATOR = ' ';
|
|
71
|
+
if (column.includes(ORDER_SEPARATOR)) {
|
|
72
|
+
const [columnName, order] = column.split(ORDER_SEPARATOR).map(trim);
|
|
73
|
+
if (!(0, order_by_parser_js_1.isOrderByDirection)(order)) {
|
|
74
|
+
throw new Error(`invalid order direction "${order}" next to "${columnName}"`);
|
|
75
|
+
}
|
|
76
|
+
return (0, order_by_parser_js_1.parseOrderBy)(columnName, order);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
return parseColumnName(column);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
exports.parseOrderedColumnName = parseOrderedColumnName;
|
|
68
83
|
function parseStringReferenceWithTableAndSchema(parts) {
|
|
69
84
|
const [schema, table, column] = parts;
|
|
70
85
|
return reference_node_js_1.ReferenceNode.create(table_node_js_1.TableNode.createWithSchema(schema, table), column_node_js_1.ColumnNode.create(column));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AliasedSelectQueryBuilder } from '../query-builder/select-query-builder.js';
|
|
2
2
|
import { SelectionNode } from '../operation-node/selection-node.js';
|
|
3
|
-
import { AnyAliasedColumn, AnyAliasedColumnWithTable, AnyColumn, AnyColumnWithTable,
|
|
3
|
+
import { AnyAliasedColumn, AnyAliasedColumnWithTable, AnyColumn, AnyColumnWithTable, DrainOuterGeneric, ExtractColumnType } from '../util/type-utils.js';
|
|
4
4
|
import { DynamicReferenceBuilder } from '../dynamic/dynamic-reference-builder.js';
|
|
5
5
|
import { AliasedExpressionOrFactory } from './expression-parser.js';
|
|
6
6
|
import { Selectable, SelectType } from '../util/column-type.js';
|
|
@@ -8,12 +8,12 @@ import { AliasedExpression } from '../expression/expression.js';
|
|
|
8
8
|
import { ExpressionBuilder } from '../expression/expression-builder.js';
|
|
9
9
|
export declare type SelectExpression<DB, TB extends keyof DB> = AnyAliasedColumnWithTable<DB, TB> | AnyAliasedColumn<DB, TB> | AnyColumnWithTable<DB, TB> | AnyColumn<DB, TB> | DynamicReferenceBuilder<any> | AliasedExpressionOrFactory<DB, TB>;
|
|
10
10
|
export declare type SelectArg<DB, TB extends keyof DB, SE extends SelectExpression<DB, TB>> = SE | ReadonlyArray<SE> | ((eb: ExpressionBuilder<DB, TB>) => ReadonlyArray<SE>);
|
|
11
|
-
export declare type Selection<DB, TB extends keyof DB, SE> = {
|
|
11
|
+
export declare type Selection<DB, TB extends keyof DB, SE> = DrainOuterGeneric<{
|
|
12
12
|
[A in ExtractAliasFromSelectExpression<SE>]: SelectType<ExtractTypeFromSelectExpression<DB, TB, SE, A>>;
|
|
13
|
-
}
|
|
13
|
+
}>;
|
|
14
14
|
declare type ExtractAliasFromSelectExpression<SE> = SE extends string ? ExtractAliasFromStringSelectExpression<SE> : SE extends AliasedExpression<any, infer EA> ? EA : SE extends (qb: any) => AliasedExpression<any, infer EA> ? EA : SE extends DynamicReferenceBuilder<infer RA> ? ExtractAliasFromStringSelectExpression<RA> : never;
|
|
15
15
|
declare type ExtractAliasFromStringSelectExpression<SE extends string> = SE extends `${string}.${string}.${string} as ${infer A}` ? A : SE extends `${string}.${string} as ${infer A}` ? A : SE extends `${string} as ${infer A}` ? A : SE extends `${string}.${string}.${infer C}` ? C : SE extends `${string}.${infer C}` ? C : SE;
|
|
16
|
-
declare type ExtractTypeFromSelectExpression<DB, TB extends keyof DB, SE, A extends keyof any> = SE extends string ? ExtractTypeFromStringSelectExpression<DB, TB, SE, A> : SE extends AliasedSelectQueryBuilder<any, any, infer O, infer QA> ? QA extends A ?
|
|
16
|
+
declare type ExtractTypeFromSelectExpression<DB, TB extends keyof DB, SE, A extends keyof any> = SE extends string ? ExtractTypeFromStringSelectExpression<DB, TB, SE, A> : SE extends AliasedSelectQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? O[keyof O] | null : never : SE extends (qb: any) => AliasedSelectQueryBuilder<any, any, infer O, infer QA> ? QA extends A ? O[keyof O] | null : never : SE extends AliasedExpression<infer O, infer EA> ? EA extends A ? O : never : SE extends (qb: any) => AliasedExpression<infer O, infer EA> ? EA extends A ? O : never : SE extends DynamicReferenceBuilder<infer RA> ? A extends ExtractAliasFromStringSelectExpression<RA> ? ExtractTypeFromStringSelectExpression<DB, TB, RA, A> | undefined : never : never;
|
|
17
17
|
declare type ExtractTypeFromStringSelectExpression<DB, TB extends keyof DB, SE extends string, A extends keyof any> = SE extends `${infer SC}.${infer T}.${infer C} as ${infer RA}` ? RA extends A ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : never : SE extends `${infer T}.${infer C} as ${infer RA}` ? RA extends A ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : never : SE extends `${infer C} as ${infer RA}` ? RA extends A ? C extends AnyColumn<DB, TB> ? ExtractColumnType<DB, TB, C> : never : never : SE extends `${infer SC}.${infer T}.${infer C}` ? C extends A ? `${SC}.${T}` extends TB ? C extends keyof DB[`${SC}.${T}`] ? DB[`${SC}.${T}`][C] : never : never : never : SE extends `${infer T}.${infer C}` ? C extends A ? T extends TB ? C extends keyof DB[T] ? DB[T][C] : never : never : never : SE extends A ? SE extends AnyColumn<DB, TB> ? ExtractColumnType<DB, TB, SE> : never : never;
|
|
18
18
|
export declare type AllSelection<DB, TB extends keyof DB> = Selectable<{
|
|
19
19
|
[C in AnyColumn<DB, TB>]: {
|
|
@@ -3,17 +3,18 @@ import { TableNode } from '../operation-node/table-node.js';
|
|
|
3
3
|
import { AliasedExpressionOrFactory } from './expression-parser.js';
|
|
4
4
|
import { OperationNode } from '../operation-node/operation-node.js';
|
|
5
5
|
import { AliasedExpression } from '../expression/expression.js';
|
|
6
|
+
import { DrainOuterGeneric, ShallowRecord } from '../util/type-utils.js';
|
|
6
7
|
export declare type TableExpression<DB, TB extends keyof DB> = AnyAliasedTable<DB> | AnyTable<DB> | AliasedExpressionOrFactory<DB, TB>;
|
|
7
8
|
export declare type TableExpressionOrList<DB, TB extends keyof DB> = TableExpression<DB, TB> | ReadonlyArray<TableExpression<DB, TB>>;
|
|
8
9
|
export declare type TableReference<DB> = AnyAliasedTable<DB> | AnyTable<DB> | AliasedExpression<any, any>;
|
|
9
10
|
export declare type AnyAliasedTable<DB> = `${AnyTable<DB>} as ${string}`;
|
|
10
11
|
export declare type TableReferenceOrList<DB> = TableReference<DB> | ReadonlyArray<TableReference<DB>>;
|
|
11
|
-
export declare type From<DB, TE> = {
|
|
12
|
+
export declare type From<DB, TE> = DrainOuterGeneric<{
|
|
12
13
|
[C in keyof DB | ExtractAliasFromTableExpression<DB, TE>]: C extends ExtractAliasFromTableExpression<DB, TE> ? ExtractRowTypeFromTableExpression<DB, TE, C> : C extends keyof DB ? DB[C] : never;
|
|
13
|
-
}
|
|
14
|
-
export declare type FromTables<DB, TB extends keyof DB, TE> = TB | ExtractAliasFromTableExpression<DB, TE
|
|
14
|
+
}>;
|
|
15
|
+
export declare type FromTables<DB, TB extends keyof DB, TE> = DrainOuterGeneric<TB | ExtractAliasFromTableExpression<DB, TE>>;
|
|
15
16
|
export declare type ExtractTableAlias<DB, TE> = TE extends `${string} as ${infer TA}` ? TA : TE extends keyof DB ? TE : never;
|
|
16
|
-
export declare type PickTableWithAlias<DB, T extends AnyAliasedTable<DB>> = T extends `${infer TB} as ${infer A}` ? TB extends keyof DB ?
|
|
17
|
+
export declare type PickTableWithAlias<DB, T extends AnyAliasedTable<DB>> = T extends `${infer TB} as ${infer A}` ? TB extends keyof DB ? ShallowRecord<A, DB[TB]> : never : never;
|
|
17
18
|
declare type ExtractAliasFromTableExpression<DB, TE> = TE extends string ? ExtractTableAlias<DB, TE> : TE extends AliasedExpression<any, infer QA> ? QA : TE extends (qb: any) => AliasedExpression<any, infer QA> ? QA : never;
|
|
18
19
|
declare 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;
|
|
19
20
|
declare type AnyTable<DB> = keyof DB & string;
|
|
@@ -4,9 +4,10 @@ import { InsertQueryBuilder } from '../query-builder/insert-query-builder.js';
|
|
|
4
4
|
import { CommonTableExpressionNode } from '../operation-node/common-table-expression-node.js';
|
|
5
5
|
import { QueryCreator } from '../query-creator.js';
|
|
6
6
|
import { Expression } from '../expression/expression.js';
|
|
7
|
+
import { ShallowRecord } from '../util/type-utils.js';
|
|
7
8
|
export declare type CommonTableExpression<DB, CN extends string> = (creator: QueryCreator<DB>) => CommonTableExpressionOutput<DB, CN>;
|
|
8
|
-
export declare type RecursiveCommonTableExpression<DB, CN extends string> = (creator: QueryCreator<DB &
|
|
9
|
-
export declare type QueryCreatorWithCommonTableExpression<DB, CN extends string, CTE> = QueryCreator<DB &
|
|
9
|
+
export declare type RecursiveCommonTableExpression<DB, CN extends string> = (creator: QueryCreator<DB & ShallowRecord<ExtractTableFromCommonTableExpressionName<CN>, ExtractRowFromCommonTableExpressionName<CN>>>) => CommonTableExpressionOutput<DB, CN>;
|
|
10
|
+
export declare type QueryCreatorWithCommonTableExpression<DB, CN extends string, CTE> = QueryCreator<DB & ShallowRecord<ExtractTableFromCommonTableExpressionName<CN>, ExtractRowFromCommonTableExpression<CTE>>>;
|
|
10
11
|
declare type CommonTableExpressionOutput<DB, CN extends string> = Expression<ExtractRowFromCommonTableExpressionName<CN>> | InsertQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>> | UpdateQueryBuilder<DB, any, any, ExtractRowFromCommonTableExpressionName<CN>> | DeleteQueryBuilder<DB, any, ExtractRowFromCommonTableExpressionName<CN>>;
|
|
11
12
|
/**
|
|
12
13
|
* Given a common CommonTableExpression CTE extracts the row type from it.
|
|
@@ -30,7 +31,7 @@ declare type ExtractTableFromCommonTableExpressionName<CN extends string> = CN e
|
|
|
30
31
|
*/
|
|
31
32
|
declare type ExtractRowFromCommonTableExpressionName<CN extends string> = CN extends `${string}(${infer CL})` ? {
|
|
32
33
|
[C in ExtractColumnNamesFromColumnList<CL>]: any;
|
|
33
|
-
} :
|
|
34
|
+
} : ShallowRecord<string, any>;
|
|
34
35
|
/**
|
|
35
36
|
* Parses a string like 'id, first_name' into a type 'id' | 'first_name'
|
|
36
37
|
*/
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { Expression } from '../expression/expression.js';
|
|
2
|
+
import { ExpressionWrapper } from '../expression/expression-wrapper.js';
|
|
3
|
+
import { ReferenceExpression } from '../parser/reference-parser.js';
|
|
4
|
+
import { CaseNode } from '../operation-node/case-node.js';
|
|
5
|
+
import { ComparisonOperatorExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js';
|
|
6
|
+
import { KyselyTypeError } from '../util/type-error.js';
|
|
7
|
+
export declare class CaseBuilder<DB, TB extends keyof DB, W = unknown, O = never> implements Whenable<DB, TB, W, O> {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(props: CaseBuilderProps);
|
|
10
|
+
/**
|
|
11
|
+
* Adds a `when` clause to the case statement.
|
|
12
|
+
*
|
|
13
|
+
* A `when` call must be followed by a {@link CaseThenBuilder.then} call.
|
|
14
|
+
*/
|
|
15
|
+
when<RE extends ReferenceExpression<DB, TB>>(lhs: unknown extends W ? RE : KyselyTypeError<'when(lhs, op, rhs) is not supported when using case(value)'>, op: ComparisonOperatorExpression, rhs: OperandValueExpressionOrList<DB, TB, RE>): CaseThenBuilder<DB, TB, W, O>;
|
|
16
|
+
when(expression: Expression<W>): CaseThenBuilder<DB, TB, W, O>;
|
|
17
|
+
when(value: unknown extends W ? KyselyTypeError<'when(value) is only supported when using case(value)'> : W): CaseThenBuilder<DB, TB, W, O>;
|
|
18
|
+
}
|
|
19
|
+
interface CaseBuilderProps {
|
|
20
|
+
readonly node: CaseNode;
|
|
21
|
+
}
|
|
22
|
+
export declare class CaseThenBuilder<DB, TB extends keyof DB, W, O> {
|
|
23
|
+
#private;
|
|
24
|
+
constructor(props: CaseBuilderProps);
|
|
25
|
+
/**
|
|
26
|
+
* Adds a `then` clause to the `case` statement.
|
|
27
|
+
*
|
|
28
|
+
* A `then` call can be followed by {@link Whenable.when}, {@link CaseWhenBuilder.else},
|
|
29
|
+
* {@link CaseWhenBuilder.end} or {@link CaseWhenBuilder.endCase} call.
|
|
30
|
+
*/
|
|
31
|
+
then<O2>(expression: Expression<O2>): CaseWhenBuilder<DB, TB, W, O | O2>;
|
|
32
|
+
then<V>(value: V): CaseWhenBuilder<DB, TB, W, O | V>;
|
|
33
|
+
}
|
|
34
|
+
export declare class CaseWhenBuilder<DB, TB extends keyof DB, W, O> implements Whenable<DB, TB, W, O>, Endable<O | null> {
|
|
35
|
+
#private;
|
|
36
|
+
constructor(props: CaseBuilderProps);
|
|
37
|
+
/**
|
|
38
|
+
* Adds a `when` clause to the case statement.
|
|
39
|
+
*
|
|
40
|
+
* A `when` call must be followed by a {@link CaseThenBuilder.then} call.
|
|
41
|
+
*/
|
|
42
|
+
when<RE extends ReferenceExpression<DB, TB>>(lhs: unknown extends W ? RE : KyselyTypeError<'when(lhs, op, rhs) is not supported when using case(value)'>, op: ComparisonOperatorExpression, rhs: OperandValueExpressionOrList<DB, TB, RE>): CaseThenBuilder<DB, TB, W, O>;
|
|
43
|
+
when(expression: Expression<W>): CaseThenBuilder<DB, TB, W, O>;
|
|
44
|
+
when(value: unknown extends W ? KyselyTypeError<'when(value) is only supported when using case(value)'> : W): CaseThenBuilder<DB, TB, W, O>;
|
|
45
|
+
/**
|
|
46
|
+
* Adds an `else` clause to the `case` statement.
|
|
47
|
+
*
|
|
48
|
+
* An `else` call must be followed by an {@link Endable.end} or {@link Endable.endCase} call.
|
|
49
|
+
*/
|
|
50
|
+
else<O2>(expression: Expression<O2>): CaseEndBuilder<O | O2>;
|
|
51
|
+
else<V>(value: V): CaseEndBuilder<O | V>;
|
|
52
|
+
/**
|
|
53
|
+
* Adds an `end` keyword to the case operator.
|
|
54
|
+
*
|
|
55
|
+
* `case` operators can only be used as part of a query.
|
|
56
|
+
* For a `case` statement used as part of a stored program, use {@link endCase} instead.
|
|
57
|
+
*/
|
|
58
|
+
end(): ExpressionWrapper<O | null>;
|
|
59
|
+
/**
|
|
60
|
+
* Adds `end case` keywords to the case statement.
|
|
61
|
+
*
|
|
62
|
+
* `case` statements can only be used for flow control in stored programs.
|
|
63
|
+
* For a `case` operator used as part of a query, use {@link end} instead.
|
|
64
|
+
*/
|
|
65
|
+
endCase(): ExpressionWrapper<O | null>;
|
|
66
|
+
}
|
|
67
|
+
export declare class CaseEndBuilder<O> implements Endable<O> {
|
|
68
|
+
#private;
|
|
69
|
+
constructor(props: CaseBuilderProps);
|
|
70
|
+
/**
|
|
71
|
+
* Adds an `end` keyword to the case operator.
|
|
72
|
+
*
|
|
73
|
+
* `case` operators can only be used as part of a query.
|
|
74
|
+
* For a `case` statement used as part of a stored program, use {@link endCase} instead.
|
|
75
|
+
*/
|
|
76
|
+
end(): ExpressionWrapper<O>;
|
|
77
|
+
/**
|
|
78
|
+
* Adds `end case` keywords to the case statement.
|
|
79
|
+
*
|
|
80
|
+
* `case` statements can only be used for flow control in stored programs.
|
|
81
|
+
* For a `case` operator used as part of a query, use {@link end} instead.
|
|
82
|
+
*/
|
|
83
|
+
endCase(): ExpressionWrapper<O>;
|
|
84
|
+
}
|
|
85
|
+
interface Whenable<DB, TB extends keyof DB, W, O> {
|
|
86
|
+
/**
|
|
87
|
+
* Adds a `when` clause to the case statement.
|
|
88
|
+
*
|
|
89
|
+
* A `when` call must be followed by a {@link CaseThenBuilder.then} call.
|
|
90
|
+
*/
|
|
91
|
+
when<RE extends ReferenceExpression<DB, TB>>(lhs: unknown extends W ? RE : KyselyTypeError<'when(lhs, op, rhs) is not supported when using case(value)'>, op: ComparisonOperatorExpression, rhs: OperandValueExpressionOrList<DB, TB, RE>): CaseThenBuilder<DB, TB, W, O>;
|
|
92
|
+
when(expression: Expression<W>): CaseThenBuilder<DB, TB, W, O>;
|
|
93
|
+
when(value: unknown extends W ? KyselyTypeError<'when(value) is only supported when using case(value)'> : W): CaseThenBuilder<DB, TB, W, O>;
|
|
94
|
+
}
|
|
95
|
+
interface Endable<O> {
|
|
96
|
+
/**
|
|
97
|
+
* Adds an `end` keyword to the case operator.
|
|
98
|
+
*
|
|
99
|
+
* `case` operators can only be used as part of a query.
|
|
100
|
+
* For a `case` statement used as part of a stored program, use {@link endCase} instead.
|
|
101
|
+
*/
|
|
102
|
+
end(): ExpressionWrapper<O>;
|
|
103
|
+
/**
|
|
104
|
+
* Adds `end case` keywords to the case statement.
|
|
105
|
+
*
|
|
106
|
+
* `case` statements can only be used for flow control in stored programs.
|
|
107
|
+
* For a `case` operator used as part of a query, use {@link end} instead.
|
|
108
|
+
*/
|
|
109
|
+
endCase(): ExpressionWrapper<O>;
|
|
110
|
+
}
|
|
111
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CaseEndBuilder = exports.CaseWhenBuilder = exports.CaseThenBuilder = exports.CaseBuilder = void 0;
|
|
4
|
+
const expression_wrapper_js_1 = require("../expression/expression-wrapper.js");
|
|
5
|
+
const object_utils_js_1 = require("../util/object-utils.js");
|
|
6
|
+
const case_node_js_1 = require("../operation-node/case-node.js");
|
|
7
|
+
const when_node_js_1 = require("../operation-node/when-node.js");
|
|
8
|
+
const binary_operation_parser_js_1 = require("../parser/binary-operation-parser.js");
|
|
9
|
+
const value_parser_js_1 = require("../parser/value-parser.js");
|
|
10
|
+
class CaseBuilder {
|
|
11
|
+
#props;
|
|
12
|
+
constructor(props) {
|
|
13
|
+
this.#props = (0, object_utils_js_1.freeze)(props);
|
|
14
|
+
}
|
|
15
|
+
when(...args) {
|
|
16
|
+
return new CaseThenBuilder({
|
|
17
|
+
...this.#props,
|
|
18
|
+
node: case_node_js_1.CaseNode.cloneWithWhen(this.#props.node, when_node_js_1.WhenNode.create((0, binary_operation_parser_js_1.parseWhen)(args))),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.CaseBuilder = CaseBuilder;
|
|
23
|
+
class CaseThenBuilder {
|
|
24
|
+
#props;
|
|
25
|
+
constructor(props) {
|
|
26
|
+
this.#props = (0, object_utils_js_1.freeze)(props);
|
|
27
|
+
}
|
|
28
|
+
then(valueExpression) {
|
|
29
|
+
return new CaseWhenBuilder({
|
|
30
|
+
...this.#props,
|
|
31
|
+
node: case_node_js_1.CaseNode.cloneWithThen(this.#props.node, (0, value_parser_js_1.parseValueExpression)(valueExpression)),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.CaseThenBuilder = CaseThenBuilder;
|
|
36
|
+
class CaseWhenBuilder {
|
|
37
|
+
#props;
|
|
38
|
+
constructor(props) {
|
|
39
|
+
this.#props = (0, object_utils_js_1.freeze)(props);
|
|
40
|
+
}
|
|
41
|
+
when(...args) {
|
|
42
|
+
return new CaseThenBuilder({
|
|
43
|
+
...this.#props,
|
|
44
|
+
node: case_node_js_1.CaseNode.cloneWithWhen(this.#props.node, when_node_js_1.WhenNode.create((0, binary_operation_parser_js_1.parseWhen)(args))),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
else(valueExpression) {
|
|
48
|
+
return new CaseEndBuilder({
|
|
49
|
+
...this.#props,
|
|
50
|
+
node: case_node_js_1.CaseNode.cloneWith(this.#props.node, {
|
|
51
|
+
else: (0, value_parser_js_1.parseValueExpression)(valueExpression),
|
|
52
|
+
}),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
end() {
|
|
56
|
+
return new expression_wrapper_js_1.ExpressionWrapper(case_node_js_1.CaseNode.cloneWith(this.#props.node, { isStatement: false }));
|
|
57
|
+
}
|
|
58
|
+
endCase() {
|
|
59
|
+
return new expression_wrapper_js_1.ExpressionWrapper(case_node_js_1.CaseNode.cloneWith(this.#props.node, { isStatement: true }));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.CaseWhenBuilder = CaseWhenBuilder;
|
|
63
|
+
class CaseEndBuilder {
|
|
64
|
+
#props;
|
|
65
|
+
constructor(props) {
|
|
66
|
+
this.#props = (0, object_utils_js_1.freeze)(props);
|
|
67
|
+
}
|
|
68
|
+
end() {
|
|
69
|
+
return new expression_wrapper_js_1.ExpressionWrapper(case_node_js_1.CaseNode.cloneWith(this.#props.node, { isStatement: false }));
|
|
70
|
+
}
|
|
71
|
+
endCase() {
|
|
72
|
+
return new expression_wrapper_js_1.ExpressionWrapper(case_node_js_1.CaseNode.cloneWith(this.#props.node, { isStatement: true }));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.CaseEndBuilder = CaseEndBuilder;
|