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.
Files changed (40) hide show
  1. package/README.md +1 -0
  2. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.d.ts +2 -0
  3. package/dist/cjs/dialect/sqlite/sqlite-query-compiler.js +4 -0
  4. package/dist/cjs/index.d.ts +1 -0
  5. package/dist/cjs/index.js +1 -0
  6. package/dist/cjs/operation-node/default-insert-value-node.d.ts +11 -0
  7. package/dist/cjs/operation-node/default-insert-value-node.js +17 -0
  8. package/dist/cjs/operation-node/operation-node-transformer.d.ts +2 -0
  9. package/dist/cjs/operation-node/operation-node-transformer.js +5 -0
  10. package/dist/cjs/operation-node/operation-node-visitor.d.ts +2 -0
  11. package/dist/cjs/operation-node/operation-node-visitor.js +1 -0
  12. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  13. package/dist/cjs/operation-node/value-list-node.d.ts +2 -1
  14. package/dist/cjs/parser/complex-expression-parser.d.ts +1 -1
  15. package/dist/cjs/parser/insert-values-parser.js +13 -4
  16. package/dist/cjs/query-compiler/default-query-compiler.d.ts +2 -0
  17. package/dist/cjs/query-compiler/default-query-compiler.js +3 -0
  18. package/dist/cjs/util/object-utils.d.ts +1 -0
  19. package/dist/cjs/util/object-utils.js +5 -1
  20. package/dist/cjs/util/type-utils.d.ts +1 -1
  21. package/dist/esm/dialect/sqlite/sqlite-query-compiler.d.ts +2 -0
  22. package/dist/esm/dialect/sqlite/sqlite-query-compiler.js +4 -0
  23. package/dist/esm/index.d.ts +1 -0
  24. package/dist/esm/index.js +1 -0
  25. package/dist/esm/operation-node/default-insert-value-node.d.ts +11 -0
  26. package/dist/esm/operation-node/default-insert-value-node.js +15 -0
  27. package/dist/esm/operation-node/operation-node-transformer.d.ts +2 -0
  28. package/dist/esm/operation-node/operation-node-transformer.js +5 -0
  29. package/dist/esm/operation-node/operation-node-visitor.d.ts +2 -0
  30. package/dist/esm/operation-node/operation-node-visitor.js +1 -0
  31. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  32. package/dist/esm/operation-node/value-list-node.d.ts +2 -1
  33. package/dist/esm/parser/complex-expression-parser.d.ts +1 -1
  34. package/dist/esm/parser/insert-values-parser.js +14 -5
  35. package/dist/esm/query-compiler/default-query-compiler.d.ts +2 -0
  36. package/dist/esm/query-compiler/default-query-compiler.js +3 -0
  37. package/dist/esm/util/object-utils.d.ts +1 -0
  38. package/dist/esm/util/object-utils.js +3 -0
  39. package/dist/esm/util/type-utils.d.ts +1 -1
  40. 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;
@@ -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 = new Array(columns.size).fill(null);
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
- if (rowValues.some(complex_expression_parser_js_1.isComplexExpression)) {
45
- return value_list_node_js_1.ValueListNode.create(rowValues.map((it) => (0, value_parser_js_1.parseValueExpression)(it)));
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>) => AnyRawBuilder;
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
  }
@@ -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 = new Array(columns.size).fill(null);
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
- if (rowValues.some(isComplexExpression)) {
42
- return ValueListNode.create(rowValues.map((it) => parseValueExpression(it)));
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;
@@ -865,6 +865,9 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
865
865
  this.append(this.getRightExplainOptionsWrapper());
866
866
  }
867
867
  }
868
+ visitDefaultInsertValue(_) {
869
+ this.append('default');
870
+ }
868
871
  append(str) {
869
872
  this.#sql += str;
870
873
  }
@@ -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;
@@ -8,6 +8,9 @@ export function isEmpty(obj) {
8
8
  }
9
9
  return false;
10
10
  }
11
+ export function isUndefined(obj) {
12
+ return obj === undefined;
13
+ }
11
14
  export function isString(obj) {
12
15
  return typeof obj === 'string';
13
16
  }
@@ -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>) => AnyRawBuilder;
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>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kysely",
3
- "version": "0.21.5",
3
+ "version": "0.21.6",
4
4
  "description": "Type safe SQL query builder",
5
5
  "repository": {
6
6
  "type": "git",