kysely 0.21.5 → 0.21.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/cjs/dialect/sqlite/sqlite-query-compiler.d.ts +2 -0
- package/dist/cjs/dialect/sqlite/sqlite-query-compiler.js +4 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/operation-node/default-insert-value-node.d.ts +11 -0
- package/dist/cjs/operation-node/default-insert-value-node.js +17 -0
- package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-transformer.js +5 -0
- package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
- package/dist/cjs/operation-node/operation-node.d.ts +1 -1
- package/dist/cjs/operation-node/value-list-node.d.ts +2 -1
- package/dist/cjs/parser/complex-expression-parser.d.ts +1 -1
- package/dist/cjs/parser/insert-values-parser.js +13 -4
- package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -0
- package/dist/cjs/query-compiler/default-query-compiler.js +3 -0
- package/dist/cjs/util/object-utils.d.ts +1 -0
- package/dist/cjs/util/object-utils.js +5 -1
- package/dist/cjs/util/type-utils.d.ts +1 -1
- package/dist/esm/dialect/sqlite/sqlite-query-compiler.d.ts +2 -0
- package/dist/esm/dialect/sqlite/sqlite-query-compiler.js +4 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/operation-node/default-insert-value-node.d.ts +11 -0
- package/dist/esm/operation-node/default-insert-value-node.js +15 -0
- package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-transformer.js +5 -0
- package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
- package/dist/esm/operation-node/operation-node-visitor.js +1 -0
- package/dist/esm/operation-node/operation-node.d.ts +1 -1
- package/dist/esm/operation-node/value-list-node.d.ts +2 -1
- package/dist/esm/parser/complex-expression-parser.d.ts +1 -1
- package/dist/esm/parser/insert-values-parser.js +14 -5
- package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -0
- package/dist/esm/query-compiler/default-query-compiler.js +3 -0
- package/dist/esm/util/object-utils.d.ts +1 -0
- package/dist/esm/util/object-utils.js +3 -0
- package/dist/esm/util/type-utils.d.ts +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -69,6 +69,7 @@ for [3rd party dialects](https://koskimas.github.io/kysely/interfaces/Dialect.ht
|
|
|
69
69
|
### 3rd party dialects:
|
|
70
70
|
|
|
71
71
|
- [AWS Data API](https://github.com/serverless-stack/kysely-data-api)
|
|
72
|
+
- [PlanetScale Serverless Driver](https://github.com/depot/kysely-planetscale)
|
|
72
73
|
|
|
73
74
|
# Minimal example
|
|
74
75
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DefaultInsertValueNode } from '../../operation-node/default-insert-value-node.js';
|
|
1
2
|
import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
|
|
2
3
|
export declare class SqliteQueryCompiler extends DefaultQueryCompiler {
|
|
3
4
|
protected getCurrentParameterPlaceholder(): string;
|
|
@@ -7,4 +8,5 @@ export declare class SqliteQueryCompiler extends DefaultQueryCompiler {
|
|
|
7
8
|
protected getRightIdentifierWrapper(): string;
|
|
8
9
|
protected getAutoIncrement(): string;
|
|
9
10
|
protected sanitizeIdentifier(identifier: string): string;
|
|
11
|
+
protected visitDefaultInsertValue(_: DefaultInsertValueNode): void;
|
|
10
12
|
}
|
|
@@ -25,5 +25,9 @@ class SqliteQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompil
|
|
|
25
25
|
sanitizeIdentifier(identifier) {
|
|
26
26
|
return identifier.replace(ID_WRAP_REGEX, '""');
|
|
27
27
|
}
|
|
28
|
+
visitDefaultInsertValue(_) {
|
|
29
|
+
// sqlite doesn't support the `default` keyword in inserts.
|
|
30
|
+
this.append('null');
|
|
31
|
+
}
|
|
28
32
|
}
|
|
29
33
|
exports.SqliteQueryCompiler = SqliteQueryCompiler;
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -151,6 +151,7 @@ export * from './operation-node/values-node.js';
|
|
|
151
151
|
export * from './operation-node/where-node.js';
|
|
152
152
|
export * from './operation-node/with-node.js';
|
|
153
153
|
export * from './operation-node/explain-node.js';
|
|
154
|
+
export * from './operation-node/default-insert-value-node.js';
|
|
154
155
|
export * from './util/column-type.js';
|
|
155
156
|
export * from './util/compilable.js';
|
|
156
157
|
export * from './util/explainable.js';
|
package/dist/cjs/index.js
CHANGED
|
@@ -167,6 +167,7 @@ __exportStar(require("./operation-node/values-node.js"), exports);
|
|
|
167
167
|
__exportStar(require("./operation-node/where-node.js"), exports);
|
|
168
168
|
__exportStar(require("./operation-node/with-node.js"), exports);
|
|
169
169
|
__exportStar(require("./operation-node/explain-node.js"), exports);
|
|
170
|
+
__exportStar(require("./operation-node/default-insert-value-node.js"), exports);
|
|
170
171
|
__exportStar(require("./util/column-type.js"), exports);
|
|
171
172
|
__exportStar(require("./util/compilable.js"), exports);
|
|
172
173
|
__exportStar(require("./util/explainable.js"), exports);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { OperationNode } from './operation-node.js';
|
|
2
|
+
export interface DefaultInsertValueNode extends OperationNode {
|
|
3
|
+
readonly kind: 'DefaultInsertValueNode';
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export declare const DefaultInsertValueNode: Readonly<{
|
|
9
|
+
is(node: OperationNode): node is DefaultInsertValueNode;
|
|
10
|
+
create(): DefaultInsertValueNode;
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DefaultInsertValueNode = void 0;
|
|
4
|
+
const object_utils_js_1 = require("../util/object-utils.js");
|
|
5
|
+
/**
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
exports.DefaultInsertValueNode = (0, object_utils_js_1.freeze)({
|
|
9
|
+
is(node) {
|
|
10
|
+
return node.kind === 'DefaultInsertValueNode';
|
|
11
|
+
},
|
|
12
|
+
create() {
|
|
13
|
+
return (0, object_utils_js_1.freeze)({
|
|
14
|
+
kind: 'DefaultInsertValueNode',
|
|
15
|
+
});
|
|
16
|
+
},
|
|
17
|
+
});
|
|
@@ -70,6 +70,7 @@ import { CreateTypeNode } from './create-type-node.js';
|
|
|
70
70
|
import { DropTypeNode } from './drop-type-node.js';
|
|
71
71
|
import { ExplainNode } from './explain-node.js';
|
|
72
72
|
import { SchemableIdentifierNode } from './schemable-identifier-node.js';
|
|
73
|
+
import { DefaultInsertValueNode } from './default-insert-value-node.js';
|
|
73
74
|
/**
|
|
74
75
|
* Transforms an operation node tree into another one.
|
|
75
76
|
*
|
|
@@ -176,4 +177,5 @@ export declare class OperationNodeTransformer {
|
|
|
176
177
|
protected transformValue(node: ValueNode): ValueNode;
|
|
177
178
|
protected transformPrimitiveValueList(node: PrimitiveValueListNode): PrimitiveValueListNode;
|
|
178
179
|
protected transformOperator(node: OperatorNode): OperatorNode;
|
|
180
|
+
protected transformDefaultInsertValue(node: DefaultInsertValueNode): DefaultInsertValueNode;
|
|
179
181
|
}
|
|
@@ -106,6 +106,7 @@ class OperationNodeTransformer {
|
|
|
106
106
|
CreateTypeNode: this.transformCreateType.bind(this),
|
|
107
107
|
DropTypeNode: this.transformDropType.bind(this),
|
|
108
108
|
ExplainNode: this.transformExplain.bind(this),
|
|
109
|
+
DefaultInsertValueNode: this.transformDefaultInsertValue.bind(this),
|
|
109
110
|
});
|
|
110
111
|
transformNode(node) {
|
|
111
112
|
if (!node) {
|
|
@@ -672,5 +673,9 @@ class OperationNodeTransformer {
|
|
|
672
673
|
// An Object.freezed leaf node. No need to clone.
|
|
673
674
|
return node;
|
|
674
675
|
}
|
|
676
|
+
transformDefaultInsertValue(node) {
|
|
677
|
+
// An Object.freezed leaf node. No need to clone.
|
|
678
|
+
return node;
|
|
679
|
+
}
|
|
675
680
|
}
|
|
676
681
|
exports.OperationNodeTransformer = OperationNodeTransformer;
|
|
@@ -70,6 +70,7 @@ import { CreateTypeNode } from './create-type-node.js';
|
|
|
70
70
|
import { DropTypeNode } from './drop-type-node.js';
|
|
71
71
|
import { ExplainNode } from './explain-node.js';
|
|
72
72
|
import { SchemableIdentifierNode } from './schemable-identifier-node.js';
|
|
73
|
+
import { DefaultInsertValueNode } from './default-insert-value-node.js';
|
|
73
74
|
export declare abstract class OperationNodeVisitor {
|
|
74
75
|
#private;
|
|
75
76
|
protected readonly nodeStack: OperationNode[];
|
|
@@ -146,4 +147,5 @@ export declare abstract class OperationNodeVisitor {
|
|
|
146
147
|
protected abstract visitCreateType(node: CreateTypeNode): void;
|
|
147
148
|
protected abstract visitDropType(node: DropTypeNode): void;
|
|
148
149
|
protected abstract visitExplain(node: ExplainNode): void;
|
|
150
|
+
protected abstract visitDefaultInsertValue(node: DefaultInsertValueNode): void;
|
|
149
151
|
}
|
|
@@ -79,6 +79,7 @@ class OperationNodeVisitor {
|
|
|
79
79
|
CreateTypeNode: this.visitCreateType.bind(this),
|
|
80
80
|
DropTypeNode: this.visitDropType.bind(this),
|
|
81
81
|
ExplainNode: this.visitExplain.bind(this),
|
|
82
|
+
DefaultInsertValueNode: this.visitDefaultInsertValue.bind(this),
|
|
82
83
|
});
|
|
83
84
|
visitNode = (node) => {
|
|
84
85
|
this.nodeStack.push(node);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare type OperationNodeKind = 'IdentifierNode' | 'SchemableIdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | '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' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode' | 'SelectModifierNode' | 'CreateTypeNode' | 'DropTypeNode' | 'ExplainNode';
|
|
1
|
+
export declare type OperationNodeKind = 'IdentifierNode' | 'SchemableIdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | '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' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode' | 'SelectModifierNode' | 'CreateTypeNode' | 'DropTypeNode' | 'ExplainNode' | 'DefaultInsertValueNode';
|
|
2
2
|
export interface OperationNode {
|
|
3
3
|
readonly kind: OperationNodeKind;
|
|
4
4
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { DefaultInsertValueNode } from './default-insert-value-node.js';
|
|
1
2
|
import { OperationNode } from './operation-node.js';
|
|
2
3
|
import { RawNode } from './raw-node.js';
|
|
3
4
|
import { ReferenceNode } from './reference-node.js';
|
|
4
5
|
import { SelectQueryNode } from './select-query-node.js';
|
|
5
6
|
import { ValueNode } from './value-node.js';
|
|
6
|
-
export declare type ListNodeItem = ValueNode | ReferenceNode | SelectQueryNode | RawNode;
|
|
7
|
+
export declare type ListNodeItem = ValueNode | ReferenceNode | DefaultInsertValueNode | SelectQueryNode | RawNode;
|
|
7
8
|
export interface ValueListNode extends OperationNode {
|
|
8
9
|
readonly kind: 'ValueListNode';
|
|
9
10
|
readonly values: ReadonlyArray<ListNodeItem>;
|
|
@@ -3,7 +3,7 @@ import { RawNode } from '../operation-node/raw-node.js';
|
|
|
3
3
|
import { SelectQueryNode } from '../operation-node/select-query-node.js';
|
|
4
4
|
import { RawBuilder } from '../raw-builder/raw-builder.js';
|
|
5
5
|
import { AliasedQueryBuilderFactory, AliasedRawBuilderFactory, AnyAliasedQueryBuilder, AnyAliasedRawBuilder, AnySelectQueryBuilder, SelectQueryBuilderFactory, RawBuilderFactory } from '../util/type-utils.js';
|
|
6
|
-
export declare type ComplexExpression<DB, TB extends keyof DB, V = any> = AnySelectQueryBuilder | SelectQueryBuilderFactory<DB, TB> | RawBuilder<V> | RawBuilderFactory<DB, TB>;
|
|
6
|
+
export declare type ComplexExpression<DB, TB extends keyof DB, V = any> = AnySelectQueryBuilder | SelectQueryBuilderFactory<DB, TB> | RawBuilder<V> | RawBuilderFactory<DB, TB, V>;
|
|
7
7
|
export declare type AliasedComplexExpression<DB, TB extends keyof DB> = AnyAliasedQueryBuilder | AliasedQueryBuilderFactory<DB, TB> | AnyAliasedRawBuilder | AliasedRawBuilderFactory<DB, TB>;
|
|
8
8
|
export declare function parseComplexExpression(exp: ComplexExpression<any, any>): SelectQueryNode | RawNode;
|
|
9
9
|
export declare function parseAliasedComplexExpression(exp: AliasedComplexExpression<any, any>): AliasNode;
|
|
@@ -8,6 +8,7 @@ const object_utils_js_1 = require("../util/object-utils.js");
|
|
|
8
8
|
const value_parser_js_1 = require("./value-parser.js");
|
|
9
9
|
const values_node_js_1 = require("../operation-node/values-node.js");
|
|
10
10
|
const complex_expression_parser_js_1 = require("./complex-expression-parser.js");
|
|
11
|
+
const default_insert_value_node_js_1 = require("../operation-node/default-insert-value-node.js");
|
|
11
12
|
function parseInsertObjectOrList(args) {
|
|
12
13
|
return parseInsertColumnsAndValues(Array.isArray(args) ? args : [args]);
|
|
13
14
|
}
|
|
@@ -33,16 +34,24 @@ function parseColumnNamesAndIndexes(rows) {
|
|
|
33
34
|
}
|
|
34
35
|
function parseRowValues(row, columns) {
|
|
35
36
|
const rowColumns = Object.keys(row);
|
|
36
|
-
const rowValues =
|
|
37
|
+
const rowValues = Array.from({
|
|
38
|
+
length: columns.size,
|
|
39
|
+
});
|
|
40
|
+
let complexColumn = false;
|
|
37
41
|
for (const col of rowColumns) {
|
|
38
42
|
const columnIdx = columns.get(col);
|
|
39
|
-
const value = row[col];
|
|
40
43
|
if (columnIdx !== undefined) {
|
|
44
|
+
const value = row[col];
|
|
45
|
+
if ((0, complex_expression_parser_js_1.isComplexExpression)(value)) {
|
|
46
|
+
complexColumn = true;
|
|
47
|
+
}
|
|
41
48
|
rowValues[columnIdx] = value;
|
|
42
49
|
}
|
|
43
50
|
}
|
|
44
|
-
|
|
45
|
-
|
|
51
|
+
const columnMissing = rowColumns.length < columns.size;
|
|
52
|
+
if (columnMissing || complexColumn) {
|
|
53
|
+
const defaultValue = default_insert_value_node_js_1.DefaultInsertValueNode.create();
|
|
54
|
+
return value_list_node_js_1.ValueListNode.create(rowValues.map((it) => (0, object_utils_js_1.isUndefined)(it) ? defaultValue : (0, value_parser_js_1.parseValueExpression)(it)));
|
|
46
55
|
}
|
|
47
56
|
return primitive_value_list_node_js_1.PrimitiveValueListNode.create(rowValues);
|
|
48
57
|
}
|
|
@@ -73,6 +73,7 @@ import { CreateTypeNode } from '../operation-node/create-type-node.js';
|
|
|
73
73
|
import { DropTypeNode } from '../operation-node/drop-type-node.js';
|
|
74
74
|
import { ExplainNode } from '../operation-node/explain-node.js';
|
|
75
75
|
import { SchemableIdentifierNode } from '../operation-node/schemable-identifier-node.js';
|
|
76
|
+
import { DefaultInsertValueNode } from '../operation-node/default-insert-value-node.js';
|
|
76
77
|
export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
|
|
77
78
|
#private;
|
|
78
79
|
protected get numParameters(): number;
|
|
@@ -153,6 +154,7 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
153
154
|
protected visitCreateType(node: CreateTypeNode): void;
|
|
154
155
|
protected visitDropType(node: DropTypeNode): void;
|
|
155
156
|
protected visitExplain(node: ExplainNode): void;
|
|
157
|
+
protected visitDefaultInsertValue(_: DefaultInsertValueNode): void;
|
|
156
158
|
protected append(str: string): void;
|
|
157
159
|
protected appendValue(parameter: unknown): void;
|
|
158
160
|
protected getLeftIdentifierWrapper(): string;
|
|
@@ -867,6 +867,9 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
|
|
|
867
867
|
this.append(this.getRightExplainOptionsWrapper());
|
|
868
868
|
}
|
|
869
869
|
}
|
|
870
|
+
visitDefaultInsertValue(_) {
|
|
871
|
+
this.append('default');
|
|
872
|
+
}
|
|
870
873
|
append(str) {
|
|
871
874
|
this.#sql += str;
|
|
872
875
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare function isEmpty(obj: ArrayLike<unknown> | string | object): boolean;
|
|
2
|
+
export declare function isUndefined(obj: unknown): obj is undefined;
|
|
2
3
|
export declare function isString(obj: unknown): obj is string;
|
|
3
4
|
export declare function isNumber(obj: unknown): obj is number;
|
|
4
5
|
export declare function isBoolean(obj: unknown): obj is boolean;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.compare = exports.noop = exports.isReadonlyArray = exports.asReadonlyArray = exports.asArray = exports.freeze = exports.getLast = exports.isObject = exports.isFunction = exports.isBuffer = exports.isBigInt = exports.isDate = exports.isNull = exports.isBoolean = exports.isNumber = exports.isString = exports.isEmpty = void 0;
|
|
3
|
+
exports.compare = exports.noop = exports.isReadonlyArray = exports.asReadonlyArray = exports.asArray = exports.freeze = exports.getLast = exports.isObject = exports.isFunction = exports.isBuffer = exports.isBigInt = exports.isDate = exports.isNull = exports.isBoolean = exports.isNumber = exports.isString = exports.isUndefined = exports.isEmpty = void 0;
|
|
4
4
|
function isEmpty(obj) {
|
|
5
5
|
if (Array.isArray(obj) || isString(obj) || isBuffer(obj)) {
|
|
6
6
|
return obj.length === 0;
|
|
@@ -11,6 +11,10 @@ function isEmpty(obj) {
|
|
|
11
11
|
return false;
|
|
12
12
|
}
|
|
13
13
|
exports.isEmpty = isEmpty;
|
|
14
|
+
function isUndefined(obj) {
|
|
15
|
+
return obj === undefined;
|
|
16
|
+
}
|
|
17
|
+
exports.isUndefined = isUndefined;
|
|
14
18
|
function isString(obj) {
|
|
15
19
|
return typeof obj === 'string';
|
|
16
20
|
}
|
|
@@ -104,7 +104,7 @@ export declare type AnyRawBuilder = RawBuilder<any>;
|
|
|
104
104
|
export declare type AnyAliasedRawBuilder = AliasedRawBuilder<any, any>;
|
|
105
105
|
export declare type SelectQueryBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) => AnySelectQueryBuilder;
|
|
106
106
|
export declare type AliasedQueryBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) => AnyAliasedQueryBuilder;
|
|
107
|
-
export declare type RawBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) =>
|
|
107
|
+
export declare type RawBuilderFactory<DB, TB extends keyof DB, O = any> = (qb: ExpressionBuilder<DB, TB>) => RawBuilder<O>;
|
|
108
108
|
export declare type AliasedRawBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) => AnyAliasedRawBuilder;
|
|
109
109
|
export declare type SingleResultType<O> = O extends InsertResult ? O : O extends DeleteResult ? O : O extends UpdateResult ? O : O | undefined;
|
|
110
110
|
export declare type UnknownRow = Record<string, unknown>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DefaultInsertValueNode } from '../../operation-node/default-insert-value-node.js';
|
|
1
2
|
import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
|
|
2
3
|
export declare class SqliteQueryCompiler extends DefaultQueryCompiler {
|
|
3
4
|
protected getCurrentParameterPlaceholder(): string;
|
|
@@ -7,4 +8,5 @@ export declare class SqliteQueryCompiler extends DefaultQueryCompiler {
|
|
|
7
8
|
protected getRightIdentifierWrapper(): string;
|
|
8
9
|
protected getAutoIncrement(): string;
|
|
9
10
|
protected sanitizeIdentifier(identifier: string): string;
|
|
11
|
+
protected visitDefaultInsertValue(_: DefaultInsertValueNode): void;
|
|
10
12
|
}
|
|
@@ -23,4 +23,8 @@ export class SqliteQueryCompiler extends DefaultQueryCompiler {
|
|
|
23
23
|
sanitizeIdentifier(identifier) {
|
|
24
24
|
return identifier.replace(ID_WRAP_REGEX, '""');
|
|
25
25
|
}
|
|
26
|
+
visitDefaultInsertValue(_) {
|
|
27
|
+
// sqlite doesn't support the `default` keyword in inserts.
|
|
28
|
+
this.append('null');
|
|
29
|
+
}
|
|
26
30
|
}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -151,6 +151,7 @@ export * from './operation-node/values-node.js';
|
|
|
151
151
|
export * from './operation-node/where-node.js';
|
|
152
152
|
export * from './operation-node/with-node.js';
|
|
153
153
|
export * from './operation-node/explain-node.js';
|
|
154
|
+
export * from './operation-node/default-insert-value-node.js';
|
|
154
155
|
export * from './util/column-type.js';
|
|
155
156
|
export * from './util/compilable.js';
|
|
156
157
|
export * from './util/explainable.js';
|
package/dist/esm/index.js
CHANGED
|
@@ -152,6 +152,7 @@ export * from './operation-node/values-node.js';
|
|
|
152
152
|
export * from './operation-node/where-node.js';
|
|
153
153
|
export * from './operation-node/with-node.js';
|
|
154
154
|
export * from './operation-node/explain-node.js';
|
|
155
|
+
export * from './operation-node/default-insert-value-node.js';
|
|
155
156
|
export * from './util/column-type.js';
|
|
156
157
|
export * from './util/compilable.js';
|
|
157
158
|
export * from './util/explainable.js';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { OperationNode } from './operation-node.js';
|
|
2
|
+
export interface DefaultInsertValueNode extends OperationNode {
|
|
3
|
+
readonly kind: 'DefaultInsertValueNode';
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export declare const DefaultInsertValueNode: Readonly<{
|
|
9
|
+
is(node: OperationNode): node is DefaultInsertValueNode;
|
|
10
|
+
create(): DefaultInsertValueNode;
|
|
11
|
+
}>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/// <reference types="./default-insert-value-node.d.ts" />
|
|
2
|
+
import { freeze } from '../util/object-utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export const DefaultInsertValueNode = freeze({
|
|
7
|
+
is(node) {
|
|
8
|
+
return node.kind === 'DefaultInsertValueNode';
|
|
9
|
+
},
|
|
10
|
+
create() {
|
|
11
|
+
return freeze({
|
|
12
|
+
kind: 'DefaultInsertValueNode',
|
|
13
|
+
});
|
|
14
|
+
},
|
|
15
|
+
});
|
|
@@ -70,6 +70,7 @@ import { CreateTypeNode } from './create-type-node.js';
|
|
|
70
70
|
import { DropTypeNode } from './drop-type-node.js';
|
|
71
71
|
import { ExplainNode } from './explain-node.js';
|
|
72
72
|
import { SchemableIdentifierNode } from './schemable-identifier-node.js';
|
|
73
|
+
import { DefaultInsertValueNode } from './default-insert-value-node.js';
|
|
73
74
|
/**
|
|
74
75
|
* Transforms an operation node tree into another one.
|
|
75
76
|
*
|
|
@@ -176,4 +177,5 @@ export declare class OperationNodeTransformer {
|
|
|
176
177
|
protected transformValue(node: ValueNode): ValueNode;
|
|
177
178
|
protected transformPrimitiveValueList(node: PrimitiveValueListNode): PrimitiveValueListNode;
|
|
178
179
|
protected transformOperator(node: OperatorNode): OperatorNode;
|
|
180
|
+
protected transformDefaultInsertValue(node: DefaultInsertValueNode): DefaultInsertValueNode;
|
|
179
181
|
}
|
|
@@ -104,6 +104,7 @@ export class OperationNodeTransformer {
|
|
|
104
104
|
CreateTypeNode: this.transformCreateType.bind(this),
|
|
105
105
|
DropTypeNode: this.transformDropType.bind(this),
|
|
106
106
|
ExplainNode: this.transformExplain.bind(this),
|
|
107
|
+
DefaultInsertValueNode: this.transformDefaultInsertValue.bind(this),
|
|
107
108
|
});
|
|
108
109
|
transformNode(node) {
|
|
109
110
|
if (!node) {
|
|
@@ -670,4 +671,8 @@ export class OperationNodeTransformer {
|
|
|
670
671
|
// An Object.freezed leaf node. No need to clone.
|
|
671
672
|
return node;
|
|
672
673
|
}
|
|
674
|
+
transformDefaultInsertValue(node) {
|
|
675
|
+
// An Object.freezed leaf node. No need to clone.
|
|
676
|
+
return node;
|
|
677
|
+
}
|
|
673
678
|
}
|
|
@@ -70,6 +70,7 @@ import { CreateTypeNode } from './create-type-node.js';
|
|
|
70
70
|
import { DropTypeNode } from './drop-type-node.js';
|
|
71
71
|
import { ExplainNode } from './explain-node.js';
|
|
72
72
|
import { SchemableIdentifierNode } from './schemable-identifier-node.js';
|
|
73
|
+
import { DefaultInsertValueNode } from './default-insert-value-node.js';
|
|
73
74
|
export declare abstract class OperationNodeVisitor {
|
|
74
75
|
#private;
|
|
75
76
|
protected readonly nodeStack: OperationNode[];
|
|
@@ -146,4 +147,5 @@ export declare abstract class OperationNodeVisitor {
|
|
|
146
147
|
protected abstract visitCreateType(node: CreateTypeNode): void;
|
|
147
148
|
protected abstract visitDropType(node: DropTypeNode): void;
|
|
148
149
|
protected abstract visitExplain(node: ExplainNode): void;
|
|
150
|
+
protected abstract visitDefaultInsertValue(node: DefaultInsertValueNode): void;
|
|
149
151
|
}
|
|
@@ -77,6 +77,7 @@ export class OperationNodeVisitor {
|
|
|
77
77
|
CreateTypeNode: this.visitCreateType.bind(this),
|
|
78
78
|
DropTypeNode: this.visitDropType.bind(this),
|
|
79
79
|
ExplainNode: this.visitExplain.bind(this),
|
|
80
|
+
DefaultInsertValueNode: this.visitDefaultInsertValue.bind(this),
|
|
80
81
|
});
|
|
81
82
|
visitNode = (node) => {
|
|
82
83
|
this.nodeStack.push(node);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare type OperationNodeKind = 'IdentifierNode' | 'SchemableIdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | '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' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode' | 'SelectModifierNode' | 'CreateTypeNode' | 'DropTypeNode' | 'ExplainNode';
|
|
1
|
+
export declare type OperationNodeKind = 'IdentifierNode' | 'SchemableIdentifierNode' | 'RawNode' | 'SelectQueryNode' | 'SelectionNode' | 'ReferenceNode' | 'ColumnNode' | 'TableNode' | 'AliasNode' | 'FromNode' | 'SelectAllNode' | 'FilterNode' | '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' | 'UnionNode' | 'CreateViewNode' | 'DropViewNode' | 'GeneratedNode' | 'DefaultValueNode' | 'OnNode' | 'ValuesNode' | 'CommonTableExpressionNameNode' | 'SelectModifierNode' | 'CreateTypeNode' | 'DropTypeNode' | 'ExplainNode' | 'DefaultInsertValueNode';
|
|
2
2
|
export interface OperationNode {
|
|
3
3
|
readonly kind: OperationNodeKind;
|
|
4
4
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { DefaultInsertValueNode } from './default-insert-value-node.js';
|
|
1
2
|
import { OperationNode } from './operation-node.js';
|
|
2
3
|
import { RawNode } from './raw-node.js';
|
|
3
4
|
import { ReferenceNode } from './reference-node.js';
|
|
4
5
|
import { SelectQueryNode } from './select-query-node.js';
|
|
5
6
|
import { ValueNode } from './value-node.js';
|
|
6
|
-
export declare type ListNodeItem = ValueNode | ReferenceNode | SelectQueryNode | RawNode;
|
|
7
|
+
export declare type ListNodeItem = ValueNode | ReferenceNode | DefaultInsertValueNode | SelectQueryNode | RawNode;
|
|
7
8
|
export interface ValueListNode extends OperationNode {
|
|
8
9
|
readonly kind: 'ValueListNode';
|
|
9
10
|
readonly values: ReadonlyArray<ListNodeItem>;
|
|
@@ -3,7 +3,7 @@ import { RawNode } from '../operation-node/raw-node.js';
|
|
|
3
3
|
import { SelectQueryNode } from '../operation-node/select-query-node.js';
|
|
4
4
|
import { RawBuilder } from '../raw-builder/raw-builder.js';
|
|
5
5
|
import { AliasedQueryBuilderFactory, AliasedRawBuilderFactory, AnyAliasedQueryBuilder, AnyAliasedRawBuilder, AnySelectQueryBuilder, SelectQueryBuilderFactory, RawBuilderFactory } from '../util/type-utils.js';
|
|
6
|
-
export declare type ComplexExpression<DB, TB extends keyof DB, V = any> = AnySelectQueryBuilder | SelectQueryBuilderFactory<DB, TB> | RawBuilder<V> | RawBuilderFactory<DB, TB>;
|
|
6
|
+
export declare type ComplexExpression<DB, TB extends keyof DB, V = any> = AnySelectQueryBuilder | SelectQueryBuilderFactory<DB, TB> | RawBuilder<V> | RawBuilderFactory<DB, TB, V>;
|
|
7
7
|
export declare type AliasedComplexExpression<DB, TB extends keyof DB> = AnyAliasedQueryBuilder | AliasedQueryBuilderFactory<DB, TB> | AnyAliasedRawBuilder | AliasedRawBuilderFactory<DB, TB>;
|
|
8
8
|
export declare function parseComplexExpression(exp: ComplexExpression<any, any>): SelectQueryNode | RawNode;
|
|
9
9
|
export declare function parseAliasedComplexExpression(exp: AliasedComplexExpression<any, any>): AliasNode;
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
import { ColumnNode } from '../operation-node/column-node.js';
|
|
3
3
|
import { PrimitiveValueListNode } from '../operation-node/primitive-value-list-node.js';
|
|
4
4
|
import { ValueListNode } from '../operation-node/value-list-node.js';
|
|
5
|
-
import { freeze } from '../util/object-utils.js';
|
|
5
|
+
import { freeze, isUndefined } from '../util/object-utils.js';
|
|
6
6
|
import { parseValueExpression } from './value-parser.js';
|
|
7
7
|
import { ValuesNode } from '../operation-node/values-node.js';
|
|
8
8
|
import { isComplexExpression } from './complex-expression-parser.js';
|
|
9
|
+
import { DefaultInsertValueNode } from '../operation-node/default-insert-value-node.js';
|
|
9
10
|
export function parseInsertObjectOrList(args) {
|
|
10
11
|
return parseInsertColumnsAndValues(Array.isArray(args) ? args : [args]);
|
|
11
12
|
}
|
|
@@ -30,16 +31,24 @@ function parseColumnNamesAndIndexes(rows) {
|
|
|
30
31
|
}
|
|
31
32
|
function parseRowValues(row, columns) {
|
|
32
33
|
const rowColumns = Object.keys(row);
|
|
33
|
-
const rowValues =
|
|
34
|
+
const rowValues = Array.from({
|
|
35
|
+
length: columns.size,
|
|
36
|
+
});
|
|
37
|
+
let complexColumn = false;
|
|
34
38
|
for (const col of rowColumns) {
|
|
35
39
|
const columnIdx = columns.get(col);
|
|
36
|
-
const value = row[col];
|
|
37
40
|
if (columnIdx !== undefined) {
|
|
41
|
+
const value = row[col];
|
|
42
|
+
if (isComplexExpression(value)) {
|
|
43
|
+
complexColumn = true;
|
|
44
|
+
}
|
|
38
45
|
rowValues[columnIdx] = value;
|
|
39
46
|
}
|
|
40
47
|
}
|
|
41
|
-
|
|
42
|
-
|
|
48
|
+
const columnMissing = rowColumns.length < columns.size;
|
|
49
|
+
if (columnMissing || complexColumn) {
|
|
50
|
+
const defaultValue = DefaultInsertValueNode.create();
|
|
51
|
+
return ValueListNode.create(rowValues.map((it) => isUndefined(it) ? defaultValue : parseValueExpression(it)));
|
|
43
52
|
}
|
|
44
53
|
return PrimitiveValueListNode.create(rowValues);
|
|
45
54
|
}
|
|
@@ -73,6 +73,7 @@ import { CreateTypeNode } from '../operation-node/create-type-node.js';
|
|
|
73
73
|
import { DropTypeNode } from '../operation-node/drop-type-node.js';
|
|
74
74
|
import { ExplainNode } from '../operation-node/explain-node.js';
|
|
75
75
|
import { SchemableIdentifierNode } from '../operation-node/schemable-identifier-node.js';
|
|
76
|
+
import { DefaultInsertValueNode } from '../operation-node/default-insert-value-node.js';
|
|
76
77
|
export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
|
|
77
78
|
#private;
|
|
78
79
|
protected get numParameters(): number;
|
|
@@ -153,6 +154,7 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
|
|
|
153
154
|
protected visitCreateType(node: CreateTypeNode): void;
|
|
154
155
|
protected visitDropType(node: DropTypeNode): void;
|
|
155
156
|
protected visitExplain(node: ExplainNode): void;
|
|
157
|
+
protected visitDefaultInsertValue(_: DefaultInsertValueNode): void;
|
|
156
158
|
protected append(str: string): void;
|
|
157
159
|
protected appendValue(parameter: unknown): void;
|
|
158
160
|
protected getLeftIdentifierWrapper(): string;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare function isEmpty(obj: ArrayLike<unknown> | string | object): boolean;
|
|
2
|
+
export declare function isUndefined(obj: unknown): obj is undefined;
|
|
2
3
|
export declare function isString(obj: unknown): obj is string;
|
|
3
4
|
export declare function isNumber(obj: unknown): obj is number;
|
|
4
5
|
export declare function isBoolean(obj: unknown): obj is boolean;
|
|
@@ -104,7 +104,7 @@ export declare type AnyRawBuilder = RawBuilder<any>;
|
|
|
104
104
|
export declare type AnyAliasedRawBuilder = AliasedRawBuilder<any, any>;
|
|
105
105
|
export declare type SelectQueryBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) => AnySelectQueryBuilder;
|
|
106
106
|
export declare type AliasedQueryBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) => AnyAliasedQueryBuilder;
|
|
107
|
-
export declare type RawBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) =>
|
|
107
|
+
export declare type RawBuilderFactory<DB, TB extends keyof DB, O = any> = (qb: ExpressionBuilder<DB, TB>) => RawBuilder<O>;
|
|
108
108
|
export declare type AliasedRawBuilderFactory<DB, TB extends keyof DB> = (qb: ExpressionBuilder<DB, TB>) => AnyAliasedRawBuilder;
|
|
109
109
|
export declare type SingleResultType<O> = O extends InsertResult ? O : O extends DeleteResult ? O : O extends UpdateResult ? O : O | undefined;
|
|
110
110
|
export declare type UnknownRow = Record<string, unknown>;
|