kysely 0.10.0 → 0.10.1

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 (47) hide show
  1. package/dist/cjs/driver/runtime-driver.js +3 -4
  2. package/dist/cjs/operation-node/column-definition-node.d.ts +4 -2
  3. package/dist/cjs/operation-node/default-value-node.d.ts +14 -0
  4. package/dist/cjs/operation-node/default-value-node.js +18 -0
  5. package/dist/cjs/operation-node/generated-always-as-node.d.ts +16 -0
  6. package/dist/cjs/operation-node/generated-always-as-node.js +25 -0
  7. package/dist/cjs/operation-node/operation-node-transformer.d.ts +4 -0
  8. package/dist/cjs/operation-node/operation-node-transformer.js +18 -2
  9. package/dist/cjs/operation-node/operation-node-visitor.d.ts +4 -0
  10. package/dist/cjs/operation-node/operation-node-visitor.js +5 -2
  11. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  12. package/dist/cjs/operation-node/raw-node.d.ts +1 -1
  13. package/dist/cjs/query-compiler/default-query-compiler.d.ts +4 -0
  14. package/dist/cjs/query-compiler/default-query-compiler.js +17 -1
  15. package/dist/cjs/raw-builder/raw-builder.d.ts +1 -1
  16. package/dist/cjs/schema/alter-table-builder.d.ts +4 -0
  17. package/dist/cjs/schema/alter-table-builder.js +24 -0
  18. package/dist/cjs/schema/column-definition-builder.d.ts +41 -0
  19. package/dist/cjs/schema/column-definition-builder.js +18 -1
  20. package/dist/cjs/schema/create-table-builder.d.ts +6 -7
  21. package/dist/cjs/schema/create-table-builder.js +6 -7
  22. package/dist/cjs/util/performance-now.d.ts +1 -0
  23. package/dist/cjs/util/performance-now.js +13 -0
  24. package/dist/esm/driver/runtime-driver.js +3 -4
  25. package/dist/esm/operation-node/column-definition-node.d.ts +4 -2
  26. package/dist/esm/operation-node/default-value-node.d.ts +14 -0
  27. package/dist/esm/operation-node/default-value-node.js +15 -0
  28. package/dist/esm/operation-node/generated-always-as-node.d.ts +16 -0
  29. package/dist/esm/operation-node/generated-always-as-node.js +22 -0
  30. package/dist/esm/operation-node/operation-node-transformer.d.ts +4 -0
  31. package/dist/esm/operation-node/operation-node-transformer.js +18 -2
  32. package/dist/esm/operation-node/operation-node-visitor.d.ts +4 -0
  33. package/dist/esm/operation-node/operation-node-visitor.js +5 -2
  34. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  35. package/dist/esm/operation-node/raw-node.d.ts +1 -1
  36. package/dist/esm/query-compiler/default-query-compiler.d.ts +4 -0
  37. package/dist/esm/query-compiler/default-query-compiler.js +17 -1
  38. package/dist/esm/raw-builder/raw-builder.d.ts +1 -1
  39. package/dist/esm/schema/alter-table-builder.d.ts +4 -0
  40. package/dist/esm/schema/alter-table-builder.js +24 -0
  41. package/dist/esm/schema/column-definition-builder.d.ts +41 -0
  42. package/dist/esm/schema/column-definition-builder.js +18 -1
  43. package/dist/esm/schema/create-table-builder.d.ts +6 -7
  44. package/dist/esm/schema/create-table-builder.js +6 -7
  45. package/dist/esm/util/performance-now.d.ts +1 -0
  46. package/dist/esm/util/performance-now.js +9 -0
  47. package/package.json +3 -3
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RuntimeDriver = void 0;
4
+ const performance_now_js_1 = require("../util/performance-now.js");
4
5
  /**
5
6
  * A small wrapper around {@link Driver} that makes sure the driver is
6
7
  * initialized before it is used, only initialized and destroyed
@@ -75,7 +76,7 @@ class RuntimeConnection {
75
76
  this.#log = log;
76
77
  }
77
78
  async executeQuery(compiledQuery) {
78
- const startTime = process.hrtime.bigint();
79
+ const startTime = (0, performance_now_js_1.performanceNow)();
79
80
  try {
80
81
  return await this.#connection.executeQuery(compiledQuery);
81
82
  }
@@ -101,8 +102,6 @@ class RuntimeConnection {
101
102
  }));
102
103
  }
103
104
  #calculateDurationMillis(startTime) {
104
- const endTime = process.hrtime.bigint();
105
- const durationNanos = Number(endTime - startTime);
106
- return durationNanos / 1_000_000;
105
+ return (0, performance_now_js_1.performanceNow)() - startTime;
107
106
  }
108
107
  }
@@ -1,10 +1,11 @@
1
1
  import { CheckConstraintNode } from './check-constraint-node.js';
2
2
  import { ColumnNode } from './column-node.js';
3
3
  import { DataTypeNode } from './data-type-node.js';
4
+ import { DefaultValueNode } from './default-value-node.js';
5
+ import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
4
6
  import { OperationNode } from './operation-node.js';
5
7
  import { RawNode } from './raw-node.js';
6
8
  import { ReferencesNode } from './references-node.js';
7
- import { ValueNode } from './value-node.js';
8
9
  export declare type ColumnDefinitionNodeProps = Omit<Partial<ColumnDefinitionNode>, 'kind'>;
9
10
  export declare type ColumnDataTypeNode = DataTypeNode | RawNode;
10
11
  export interface ColumnDefinitionNode extends OperationNode {
@@ -16,8 +17,9 @@ export interface ColumnDefinitionNode extends OperationNode {
16
17
  readonly autoIncrement: boolean;
17
18
  readonly unique: boolean;
18
19
  readonly nullable: boolean;
19
- readonly defaultTo?: ValueNode | RawNode;
20
+ readonly defaultTo?: DefaultValueNode;
20
21
  readonly check?: CheckConstraintNode;
22
+ readonly generatedAlwaysAs?: GeneratedAlwaysAsNode;
21
23
  }
22
24
  /**
23
25
  * @internal
@@ -0,0 +1,14 @@
1
+ import { OperationNode } from './operation-node.js';
2
+ import { RawNode } from './raw-node.js';
3
+ import { ValueNode } from './value-node.js';
4
+ export interface DefaultValueNode extends OperationNode {
5
+ readonly kind: 'DefaultValueNode';
6
+ readonly defaultValue: ValueNode | RawNode;
7
+ }
8
+ /**
9
+ * @internal
10
+ */
11
+ export declare const DefaultValueNode: Readonly<{
12
+ is(node: OperationNode): node is DefaultValueNode;
13
+ create(defaultValue: ValueNode | RawNode): DefaultValueNode;
14
+ }>;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultValueNode = void 0;
4
+ const object_utils_js_1 = require("../util/object-utils.js");
5
+ /**
6
+ * @internal
7
+ */
8
+ exports.DefaultValueNode = (0, object_utils_js_1.freeze)({
9
+ is(node) {
10
+ return node.kind === 'DefaultValueNode';
11
+ },
12
+ create(defaultValue) {
13
+ return (0, object_utils_js_1.freeze)({
14
+ kind: 'DefaultValueNode',
15
+ defaultValue,
16
+ });
17
+ },
18
+ });
@@ -0,0 +1,16 @@
1
+ import { OperationNode } from './operation-node.js';
2
+ import { RawNode } from './raw-node.js';
3
+ export declare type GeneratedAlwaysAsNodeParams = Omit<GeneratedAlwaysAsNode, 'kind' | 'expression'>;
4
+ export interface GeneratedAlwaysAsNode extends OperationNode {
5
+ readonly kind: 'GeneratedAlwaysAsNode';
6
+ readonly expression: RawNode;
7
+ readonly stored?: boolean;
8
+ }
9
+ /**
10
+ * @internal
11
+ */
12
+ export declare const GeneratedAlwaysAsNode: Readonly<{
13
+ is(node: OperationNode): node is GeneratedAlwaysAsNode;
14
+ create(expression: string): GeneratedAlwaysAsNode;
15
+ cloneWith(node: GeneratedAlwaysAsNode, params: GeneratedAlwaysAsNodeParams): GeneratedAlwaysAsNode;
16
+ }>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GeneratedAlwaysAsNode = void 0;
4
+ const object_utils_js_1 = require("../util/object-utils.js");
5
+ const raw_node_js_1 = require("./raw-node.js");
6
+ /**
7
+ * @internal
8
+ */
9
+ exports.GeneratedAlwaysAsNode = (0, object_utils_js_1.freeze)({
10
+ is(node) {
11
+ return node.kind === 'GeneratedAlwaysAsNode';
12
+ },
13
+ create(expression) {
14
+ return (0, object_utils_js_1.freeze)({
15
+ kind: 'GeneratedAlwaysAsNode',
16
+ expression: raw_node_js_1.RawNode.createWithSql(expression),
17
+ });
18
+ },
19
+ cloneWith(node, params) {
20
+ return (0, object_utils_js_1.freeze)({
21
+ ...node,
22
+ ...params,
23
+ });
24
+ },
25
+ });
@@ -60,6 +60,8 @@ import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
60
60
  import { UnionNode } from './union-node.js';
61
61
  import { CreateViewNode } from './create-view-node.js';
62
62
  import { DropViewNode } from './drop-view-node.js';
63
+ import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
64
+ import { DefaultValueNode } from './default-value-node.js';
63
65
  /**
64
66
  * Transforms an operation node tree into another one.
65
67
  *
@@ -149,6 +151,8 @@ export declare class OperationNodeTransformer {
149
151
  protected transformDropConstraint(node: DropConstraintNode): DropConstraintNode;
150
152
  protected transformCreateView(node: CreateViewNode): CreateViewNode;
151
153
  protected transformDropView(node: DropViewNode): DropViewNode;
154
+ protected transformGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): GeneratedAlwaysAsNode;
155
+ protected transformDefaultValue(node: DefaultValueNode): DefaultValueNode;
152
156
  protected transformDataType(node: DataTypeNode): DataTypeNode;
153
157
  protected transformSelectAll(node: SelectAllNode): SelectAllNode;
154
158
  protected transformIdentifier(node: IdentifierNode): IdentifierNode;
@@ -33,7 +33,7 @@ const object_utils_js_1 = require("../util/object-utils.js");
33
33
  */
34
34
  class OperationNodeTransformer {
35
35
  nodeStack = [];
36
- #transformers = {
36
+ #transformers = (0, object_utils_js_1.freeze)({
37
37
  AliasNode: this.transformAlias.bind(this),
38
38
  ColumnNode: this.transformColumn.bind(this),
39
39
  IdentifierNode: this.transformIdentifier.bind(this),
@@ -95,7 +95,9 @@ class OperationNodeTransformer {
95
95
  UnionNode: this.transformUnion.bind(this),
96
96
  CreateViewNode: this.transformCreateView.bind(this),
97
97
  DropViewNode: this.transformDropView.bind(this),
98
- };
98
+ GeneratedAlwaysAsNode: this.transformGeneratedAlwaysAs.bind(this),
99
+ DefaultValueNode: this.transformDefaultValue.bind(this),
100
+ });
99
101
  transformNode = (node) => {
100
102
  if (!node) {
101
103
  return undefined;
@@ -274,6 +276,7 @@ class OperationNodeTransformer {
274
276
  nullable: node.nullable,
275
277
  defaultTo: this.transformNode(node.defaultTo),
276
278
  check: this.transformNode(node.check),
279
+ generatedAlwaysAs: this.transformNode(node.generatedAlwaysAs),
277
280
  };
278
281
  }
279
282
  transformAddColumn(node) {
@@ -538,6 +541,19 @@ class OperationNodeTransformer {
538
541
  materialized: node.materialized,
539
542
  };
540
543
  }
544
+ transformGeneratedAlwaysAs(node) {
545
+ return {
546
+ kind: 'GeneratedAlwaysAsNode',
547
+ expression: this.transformNode(node.expression),
548
+ stored: node.stored,
549
+ };
550
+ }
551
+ transformDefaultValue(node) {
552
+ return {
553
+ kind: 'DefaultValueNode',
554
+ defaultValue: this.transformNode(node.defaultValue),
555
+ };
556
+ }
541
557
  transformDataType(node) {
542
558
  // An Object.freezed leaf node. No need to clone.
543
559
  return node;
@@ -60,6 +60,8 @@ import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
60
60
  import { UnionNode } from './union-node.js';
61
61
  import { CreateViewNode } from './create-view-node.js';
62
62
  import { DropViewNode } from './drop-view-node.js';
63
+ import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
64
+ import { DefaultValueNode } from './default-value-node.js';
63
65
  export declare abstract class OperationNodeVisitor {
64
66
  #private;
65
67
  protected readonly nodeStack: OperationNode[];
@@ -125,4 +127,6 @@ export declare abstract class OperationNodeVisitor {
125
127
  protected abstract visitOperator(node: OperatorNode): void;
126
128
  protected abstract visitCreateView(node: CreateViewNode): void;
127
129
  protected abstract visitDropView(node: DropViewNode): void;
130
+ protected abstract visitGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): void;
131
+ protected abstract visitDefaultValue(node: DefaultValueNode): void;
128
132
  }
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OperationNodeVisitor = void 0;
4
+ const object_utils_js_1 = require("../util/object-utils.js");
4
5
  class OperationNodeVisitor {
5
6
  nodeStack = [];
6
- #visitors = {
7
+ #visitors = (0, object_utils_js_1.freeze)({
7
8
  AliasNode: this.visitAlias.bind(this),
8
9
  ColumnNode: this.visitColumn.bind(this),
9
10
  IdentifierNode: this.visitIdentifier.bind(this),
@@ -65,7 +66,9 @@ class OperationNodeVisitor {
65
66
  UnionNode: this.visitUnion.bind(this),
66
67
  CreateViewNode: this.visitCreateView.bind(this),
67
68
  DropViewNode: this.visitDropView.bind(this),
68
- };
69
+ GeneratedAlwaysAsNode: this.visitGeneratedAlwaysAs.bind(this),
70
+ DefaultValueNode: this.visitDefaultValue.bind(this),
71
+ });
69
72
  visitNode = (node) => {
70
73
  this.nodeStack.push(node);
71
74
  this.#visitors[node.kind](node);
@@ -1,4 +1,4 @@
1
- export declare type OperationNodeKind = 'IdentifierNode' | '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';
1
+ export declare type OperationNodeKind = 'IdentifierNode' | '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' | 'GeneratedAlwaysAsNode' | 'DefaultValueNode';
2
2
  export interface OperationNode {
3
3
  readonly kind: OperationNodeKind;
4
4
  }
@@ -9,6 +9,6 @@ export interface RawNode extends OperationNode {
9
9
  */
10
10
  export declare const RawNode: Readonly<{
11
11
  is(node: OperationNode): node is RawNode;
12
- create(sqlFragments: string[], params: ReadonlyArray<OperationNode>): RawNode;
12
+ create(sqlFragments: ReadonlyArray<string>, params: ReadonlyArray<OperationNode>): RawNode;
13
13
  createWithSql(sql: string): RawNode;
14
14
  }>;
@@ -64,6 +64,8 @@ import { ColumnNode } from '../operation-node/column-node.js';
64
64
  import { UnionNode } from '../operation-node/union-node.js';
65
65
  import { CreateViewNode } from '../operation-node/create-view-node.js';
66
66
  import { DropViewNode } from '../operation-node/drop-view-node.js';
67
+ import { GeneratedAlwaysAsNode } from '../operation-node/generated-always-as-node.js';
68
+ import { DefaultValueNode } from '../operation-node/default-value-node.js';
67
69
  export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
68
70
  #private;
69
71
  protected get numParameters(): number;
@@ -134,6 +136,8 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
134
136
  protected visitUnion(node: UnionNode): void;
135
137
  protected visitCreateView(node: CreateViewNode): void;
136
138
  protected visitDropView(node: DropViewNode): void;
139
+ protected visitGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): void;
140
+ protected visitDefaultValue(node: DefaultValueNode): void;
137
141
  protected append(str: string): void;
138
142
  protected appendValue(parameter: unknown): void;
139
143
  protected getLeftIdentifierWrapper(): string;
@@ -302,8 +302,12 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
302
302
  this.visitNode(node.column);
303
303
  this.append(' ');
304
304
  this.visitNode(node.dataType);
305
+ if (node.generatedAlwaysAs) {
306
+ this.append(' ');
307
+ this.visitNode(node.generatedAlwaysAs);
308
+ }
305
309
  if (node.defaultTo) {
306
- this.append(' default ');
310
+ this.append(' ');
307
311
  this.visitNode(node.defaultTo);
308
312
  }
309
313
  if (!node.nullable) {
@@ -679,6 +683,18 @@ class DefaultQueryCompiler extends operation_node_visitor_js_1.OperationNodeVisi
679
683
  }
680
684
  this.visitNode(node.name);
681
685
  }
686
+ visitGeneratedAlwaysAs(node) {
687
+ this.append('generated always as (');
688
+ this.visitNode(node.expression);
689
+ this.append(')');
690
+ if (node.stored) {
691
+ this.append(' stored');
692
+ }
693
+ }
694
+ visitDefaultValue(node) {
695
+ this.append('default ');
696
+ this.visitNode(node.defaultValue);
697
+ }
682
698
  append(str) {
683
699
  this.#sql += str;
684
700
  }
@@ -41,5 +41,5 @@ export interface RawBuilderProps {
41
41
  readonly queryId: QueryId;
42
42
  readonly executor: QueryExecutor;
43
43
  readonly sql: string;
44
- readonly parameters?: any;
44
+ readonly parameters?: ReadonlyArray<unknown>;
45
45
  }
@@ -72,6 +72,8 @@ export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuild
72
72
  notNull(): AlterTableAddColumnBuilder;
73
73
  defaultTo(value: PrimitiveValue | AnyRawBuilder): AlterTableAddColumnBuilder;
74
74
  check(sql: string): AlterTableAddColumnBuilder;
75
+ generatedAlwaysAs(sql: string): AlterTableAddColumnBuilder;
76
+ stored(): AlterTableAddColumnBuilder;
75
77
  toOperationNode(): AlterTableNode;
76
78
  compile(): CompiledQuery;
77
79
  execute(): Promise<void>;
@@ -91,6 +93,8 @@ export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBu
91
93
  notNull(): AlterTableModifyColumnBuilder;
92
94
  defaultTo(value: PrimitiveValue | AnyRawBuilder): AlterTableModifyColumnBuilder;
93
95
  check(sql: string): AlterTableModifyColumnBuilder;
96
+ generatedAlwaysAs(sql: string): AlterTableModifyColumnBuilder;
97
+ stored(): AlterTableModifyColumnBuilder;
94
98
  toOperationNode(): AlterTableNode;
95
99
  compile(): CompiledQuery;
96
100
  execute(): Promise<void>;
@@ -244,6 +244,18 @@ class AlterTableAddColumnBuilder {
244
244
  columnBuilder: this.#props.columnBuilder.check(sql),
245
245
  });
246
246
  }
247
+ generatedAlwaysAs(sql) {
248
+ return new AlterTableAddColumnBuilder({
249
+ ...this.#props,
250
+ columnBuilder: this.#props.columnBuilder.generatedAlwaysAs(sql),
251
+ });
252
+ }
253
+ stored() {
254
+ return new AlterTableAddColumnBuilder({
255
+ ...this.#props,
256
+ columnBuilder: this.#props.columnBuilder.stored(),
257
+ });
258
+ }
247
259
  toOperationNode() {
248
260
  return this.#props.executor.transformQuery(alter_table_node_js_1.AlterTableNode.cloneWith(this.#props.alterTableNode, {
249
261
  addColumn: add_column_node_js_1.AddColumnNode.create(this.#props.columnBuilder.toOperationNode()),
@@ -316,6 +328,18 @@ class AlterTableModifyColumnBuilder {
316
328
  columnBuilder: this.#props.columnBuilder.check(sql),
317
329
  });
318
330
  }
331
+ generatedAlwaysAs(sql) {
332
+ return new AlterTableModifyColumnBuilder({
333
+ ...this.#props,
334
+ columnBuilder: this.#props.columnBuilder.generatedAlwaysAs(sql),
335
+ });
336
+ }
337
+ stored() {
338
+ return new AlterTableModifyColumnBuilder({
339
+ ...this.#props,
340
+ columnBuilder: this.#props.columnBuilder.stored(),
341
+ });
342
+ }
319
343
  toOperationNode() {
320
344
  return this.#props.executor.transformQuery(alter_table_node_js_1.AlterTableNode.cloneWith(this.#props.alterTableNode, {
321
345
  modifyColumn: modify_column_node_js_1.ModifyColumnNode.create(this.#props.columnBuilder.toOperationNode()),
@@ -40,10 +40,19 @@ export interface ColumnDefinitionBuilderInterface<R> {
40
40
  * column definition (like MySQL 5) you need to call the table level
41
41
  * {@link TableBuilder.addForeignKeyConstraint} method instead.
42
42
  *
43
+ * @example
44
+ * ```ts
45
+ * col.references('person.id').onDelete('cascade')
46
+ * ```
43
47
  */
44
48
  onDelete(onDelete: OnModifyForeignAction): R;
45
49
  /**
46
50
  * Adds an `on update` constraint for the foreign key column.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * col.references('person.id').onUpdate('cascade')
55
+ * ```
47
56
  */
48
57
  onUpdate(onUpdate: OnModifyForeignAction): R;
49
58
  /**
@@ -78,6 +87,36 @@ export interface ColumnDefinitionBuilderInterface<R> {
78
87
  * ```
79
88
  */
80
89
  check(sql: string): R;
90
+ /**
91
+ * Makes the column a generated column using a `generated always as` statement.
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * db.schema
96
+ * .createTable('person')
97
+ * .addColumn('full_name', 'varchar(255)',
98
+ * (col) => col.generatedAlwaysAs("concat(first_name, ' ', last_name)")
99
+ * )
100
+ * .execute()
101
+ * ```
102
+ */
103
+ generatedAlwaysAs(sql: string): R;
104
+ /**
105
+ * Makes a generated column stored instead of virtual. This method can only
106
+ * be used with {@link generatedAlwaysAs}
107
+ *
108
+ * @example
109
+ * ```ts
110
+ * db.schema
111
+ * .createTable('person')
112
+ * .addColumn('full_name', 'varchar(255)', (col) => col
113
+ * .generatedAlwaysAs("concat(first_name, ' ', last_name)")
114
+ * .stored()
115
+ * )
116
+ * .execute()
117
+ * ```
118
+ */
119
+ stored(): R;
81
120
  }
82
121
  export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderInterface<ColumnDefinitionBuilder>, OperationNodeSource {
83
122
  #private;
@@ -91,5 +130,7 @@ export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderI
91
130
  notNull(): ColumnDefinitionBuilder;
92
131
  defaultTo(value: DefaultValueExpression): ColumnDefinitionBuilder;
93
132
  check(sql: string): ColumnDefinitionBuilder;
133
+ generatedAlwaysAs(sql: string): ColumnDefinitionBuilder;
134
+ stored(): ColumnDefinitionBuilder;
94
135
  toOperationNode(): ColumnDefinitionNode;
95
136
  }
@@ -9,6 +9,8 @@ const reference_parser_js_1 = require("../parser/reference-parser.js");
9
9
  const prevent_await_js_1 = require("../util/prevent-await.js");
10
10
  const column_definition_node_js_1 = require("../operation-node/column-definition-node.js");
11
11
  const default_value_parser_js_1 = require("../parser/default-value-parser.js");
12
+ const generated_always_as_node_js_1 = require("../operation-node/generated-always-as-node.js");
13
+ const default_value_node_js_1 = require("../operation-node/default-value-node.js");
12
14
  class ColumnDefinitionBuilder {
13
15
  #node;
14
16
  constructor(node) {
@@ -55,7 +57,7 @@ class ColumnDefinitionBuilder {
55
57
  }
56
58
  defaultTo(value) {
57
59
  return new ColumnDefinitionBuilder(column_definition_node_js_1.ColumnDefinitionNode.cloneWith(this.#node, {
58
- defaultTo: (0, default_value_parser_js_1.parseDefaultValueExpression)(value),
60
+ defaultTo: default_value_node_js_1.DefaultValueNode.create((0, default_value_parser_js_1.parseDefaultValueExpression)(value)),
59
61
  }));
60
62
  }
61
63
  check(sql) {
@@ -63,6 +65,21 @@ class ColumnDefinitionBuilder {
63
65
  check: check_constraint_node_js_1.CheckConstraintNode.create(sql),
64
66
  }));
65
67
  }
68
+ generatedAlwaysAs(sql) {
69
+ return new ColumnDefinitionBuilder(column_definition_node_js_1.ColumnDefinitionNode.cloneWith(this.#node, {
70
+ generatedAlwaysAs: generated_always_as_node_js_1.GeneratedAlwaysAsNode.create(sql),
71
+ }));
72
+ }
73
+ stored() {
74
+ if (!this.#node.generatedAlwaysAs) {
75
+ throw new Error('stored() can only be called after generatedAlwaysAs');
76
+ }
77
+ return new ColumnDefinitionBuilder(column_definition_node_js_1.ColumnDefinitionNode.cloneWith(this.#node, {
78
+ generatedAlwaysAs: generated_always_as_node_js_1.GeneratedAlwaysAsNode.cloneWith(this.#node.generatedAlwaysAs, {
79
+ stored: true,
80
+ }),
81
+ }));
82
+ }
66
83
  toOperationNode() {
67
84
  return this.#node;
68
85
  }
@@ -27,8 +27,8 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
27
27
  * await db.schema
28
28
  * .createTable('person')
29
29
  * .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
30
- * .addColumn('first_name', 'varchar(50), (col) => col.notNull())
31
- * .addColumn('last_name', 'varchar')
30
+ * .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
31
+ * .addColumn('last_name', 'varchar(255)')
32
32
  * .addColumn('bank_balance', 'numeric(8, 2)')
33
33
  * .addColumn('data', db.raw('customtype'))
34
34
  * .addColumn('parent_id', 'integer', (col) =>
@@ -37,11 +37,10 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
37
37
  * ```
38
38
  *
39
39
  * With this method, it's once again good to remember that Kysely just builds the query
40
- * that's as close to the structure of your builder method calls as possible, and doesn't
41
- * provide the same API for all databses. For example, some databases like older MySQL
42
- * don't support `references` statement in the column definition. Instead foreign key
43
- * constraints need to be defined in at the level of the `create table` query. See
44
- * the next example:
40
+ * and doesn't provide the same API for all databses. For example, some databases like
41
+ * older MySQL don't support `references` statement in the column definition. Instead
42
+ * foreign key constraints need to be defined in at the level of the `create table`
43
+ * query. See the next example:
45
44
  *
46
45
  * @example
47
46
  * ```ts
@@ -41,8 +41,8 @@ class CreateTableBuilder {
41
41
  * await db.schema
42
42
  * .createTable('person')
43
43
  * .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
44
- * .addColumn('first_name', 'varchar(50), (col) => col.notNull())
45
- * .addColumn('last_name', 'varchar')
44
+ * .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
45
+ * .addColumn('last_name', 'varchar(255)')
46
46
  * .addColumn('bank_balance', 'numeric(8, 2)')
47
47
  * .addColumn('data', db.raw('customtype'))
48
48
  * .addColumn('parent_id', 'integer', (col) =>
@@ -51,11 +51,10 @@ class CreateTableBuilder {
51
51
  * ```
52
52
  *
53
53
  * With this method, it's once again good to remember that Kysely just builds the query
54
- * that's as close to the structure of your builder method calls as possible, and doesn't
55
- * provide the same API for all databses. For example, some databases like older MySQL
56
- * don't support `references` statement in the column definition. Instead foreign key
57
- * constraints need to be defined in at the level of the `create table` query. See
58
- * the next example:
54
+ * and doesn't provide the same API for all databses. For example, some databases like
55
+ * older MySQL don't support `references` statement in the column definition. Instead
56
+ * foreign key constraints need to be defined in at the level of the `create table`
57
+ * query. See the next example:
59
58
  *
60
59
  * @example
61
60
  * ```ts
@@ -0,0 +1 @@
1
+ export declare function performanceNow(): number;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.performanceNow = void 0;
4
+ const object_utils_js_1 = require("./object-utils.js");
5
+ function performanceNow() {
6
+ if (typeof performance !== 'undefined' && (0, object_utils_js_1.isFunction)(performance.now)) {
7
+ return performance.now();
8
+ }
9
+ else {
10
+ return Date.now();
11
+ }
12
+ }
13
+ exports.performanceNow = performanceNow;
@@ -1,3 +1,4 @@
1
+ import { performanceNow } from '../util/performance-now.js';
1
2
  /**
2
3
  * A small wrapper around {@link Driver} that makes sure the driver is
3
4
  * initialized before it is used, only initialized and destroyed
@@ -71,7 +72,7 @@ class RuntimeConnection {
71
72
  this.#log = log;
72
73
  }
73
74
  async executeQuery(compiledQuery) {
74
- const startTime = process.hrtime.bigint();
75
+ const startTime = performanceNow();
75
76
  try {
76
77
  return await this.#connection.executeQuery(compiledQuery);
77
78
  }
@@ -97,8 +98,6 @@ class RuntimeConnection {
97
98
  }));
98
99
  }
99
100
  #calculateDurationMillis(startTime) {
100
- const endTime = process.hrtime.bigint();
101
- const durationNanos = Number(endTime - startTime);
102
- return durationNanos / 1_000_000;
101
+ return performanceNow() - startTime;
103
102
  }
104
103
  }
@@ -1,10 +1,11 @@
1
1
  import { CheckConstraintNode } from './check-constraint-node.js';
2
2
  import { ColumnNode } from './column-node.js';
3
3
  import { DataTypeNode } from './data-type-node.js';
4
+ import { DefaultValueNode } from './default-value-node.js';
5
+ import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
4
6
  import { OperationNode } from './operation-node.js';
5
7
  import { RawNode } from './raw-node.js';
6
8
  import { ReferencesNode } from './references-node.js';
7
- import { ValueNode } from './value-node.js';
8
9
  export declare type ColumnDefinitionNodeProps = Omit<Partial<ColumnDefinitionNode>, 'kind'>;
9
10
  export declare type ColumnDataTypeNode = DataTypeNode | RawNode;
10
11
  export interface ColumnDefinitionNode extends OperationNode {
@@ -16,8 +17,9 @@ export interface ColumnDefinitionNode extends OperationNode {
16
17
  readonly autoIncrement: boolean;
17
18
  readonly unique: boolean;
18
19
  readonly nullable: boolean;
19
- readonly defaultTo?: ValueNode | RawNode;
20
+ readonly defaultTo?: DefaultValueNode;
20
21
  readonly check?: CheckConstraintNode;
22
+ readonly generatedAlwaysAs?: GeneratedAlwaysAsNode;
21
23
  }
22
24
  /**
23
25
  * @internal
@@ -0,0 +1,14 @@
1
+ import { OperationNode } from './operation-node.js';
2
+ import { RawNode } from './raw-node.js';
3
+ import { ValueNode } from './value-node.js';
4
+ export interface DefaultValueNode extends OperationNode {
5
+ readonly kind: 'DefaultValueNode';
6
+ readonly defaultValue: ValueNode | RawNode;
7
+ }
8
+ /**
9
+ * @internal
10
+ */
11
+ export declare const DefaultValueNode: Readonly<{
12
+ is(node: OperationNode): node is DefaultValueNode;
13
+ create(defaultValue: ValueNode | RawNode): DefaultValueNode;
14
+ }>;
@@ -0,0 +1,15 @@
1
+ import { freeze } from '../util/object-utils.js';
2
+ /**
3
+ * @internal
4
+ */
5
+ export const DefaultValueNode = freeze({
6
+ is(node) {
7
+ return node.kind === 'DefaultValueNode';
8
+ },
9
+ create(defaultValue) {
10
+ return freeze({
11
+ kind: 'DefaultValueNode',
12
+ defaultValue,
13
+ });
14
+ },
15
+ });
@@ -0,0 +1,16 @@
1
+ import { OperationNode } from './operation-node.js';
2
+ import { RawNode } from './raw-node.js';
3
+ export declare type GeneratedAlwaysAsNodeParams = Omit<GeneratedAlwaysAsNode, 'kind' | 'expression'>;
4
+ export interface GeneratedAlwaysAsNode extends OperationNode {
5
+ readonly kind: 'GeneratedAlwaysAsNode';
6
+ readonly expression: RawNode;
7
+ readonly stored?: boolean;
8
+ }
9
+ /**
10
+ * @internal
11
+ */
12
+ export declare const GeneratedAlwaysAsNode: Readonly<{
13
+ is(node: OperationNode): node is GeneratedAlwaysAsNode;
14
+ create(expression: string): GeneratedAlwaysAsNode;
15
+ cloneWith(node: GeneratedAlwaysAsNode, params: GeneratedAlwaysAsNodeParams): GeneratedAlwaysAsNode;
16
+ }>;
@@ -0,0 +1,22 @@
1
+ import { freeze } from '../util/object-utils.js';
2
+ import { RawNode } from './raw-node.js';
3
+ /**
4
+ * @internal
5
+ */
6
+ export const GeneratedAlwaysAsNode = freeze({
7
+ is(node) {
8
+ return node.kind === 'GeneratedAlwaysAsNode';
9
+ },
10
+ create(expression) {
11
+ return freeze({
12
+ kind: 'GeneratedAlwaysAsNode',
13
+ expression: RawNode.createWithSql(expression),
14
+ });
15
+ },
16
+ cloneWith(node, params) {
17
+ return freeze({
18
+ ...node,
19
+ ...params,
20
+ });
21
+ },
22
+ });
@@ -60,6 +60,8 @@ import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
60
60
  import { UnionNode } from './union-node.js';
61
61
  import { CreateViewNode } from './create-view-node.js';
62
62
  import { DropViewNode } from './drop-view-node.js';
63
+ import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
64
+ import { DefaultValueNode } from './default-value-node.js';
63
65
  /**
64
66
  * Transforms an operation node tree into another one.
65
67
  *
@@ -149,6 +151,8 @@ export declare class OperationNodeTransformer {
149
151
  protected transformDropConstraint(node: DropConstraintNode): DropConstraintNode;
150
152
  protected transformCreateView(node: CreateViewNode): CreateViewNode;
151
153
  protected transformDropView(node: DropViewNode): DropViewNode;
154
+ protected transformGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): GeneratedAlwaysAsNode;
155
+ protected transformDefaultValue(node: DefaultValueNode): DefaultValueNode;
152
156
  protected transformDataType(node: DataTypeNode): DataTypeNode;
153
157
  protected transformSelectAll(node: SelectAllNode): SelectAllNode;
154
158
  protected transformIdentifier(node: IdentifierNode): IdentifierNode;
@@ -30,7 +30,7 @@ import { freeze } from '../util/object-utils.js';
30
30
  */
31
31
  export class OperationNodeTransformer {
32
32
  nodeStack = [];
33
- #transformers = {
33
+ #transformers = freeze({
34
34
  AliasNode: this.transformAlias.bind(this),
35
35
  ColumnNode: this.transformColumn.bind(this),
36
36
  IdentifierNode: this.transformIdentifier.bind(this),
@@ -92,7 +92,9 @@ export class OperationNodeTransformer {
92
92
  UnionNode: this.transformUnion.bind(this),
93
93
  CreateViewNode: this.transformCreateView.bind(this),
94
94
  DropViewNode: this.transformDropView.bind(this),
95
- };
95
+ GeneratedAlwaysAsNode: this.transformGeneratedAlwaysAs.bind(this),
96
+ DefaultValueNode: this.transformDefaultValue.bind(this),
97
+ });
96
98
  transformNode = (node) => {
97
99
  if (!node) {
98
100
  return undefined;
@@ -271,6 +273,7 @@ export class OperationNodeTransformer {
271
273
  nullable: node.nullable,
272
274
  defaultTo: this.transformNode(node.defaultTo),
273
275
  check: this.transformNode(node.check),
276
+ generatedAlwaysAs: this.transformNode(node.generatedAlwaysAs),
274
277
  };
275
278
  }
276
279
  transformAddColumn(node) {
@@ -535,6 +538,19 @@ export class OperationNodeTransformer {
535
538
  materialized: node.materialized,
536
539
  };
537
540
  }
541
+ transformGeneratedAlwaysAs(node) {
542
+ return {
543
+ kind: 'GeneratedAlwaysAsNode',
544
+ expression: this.transformNode(node.expression),
545
+ stored: node.stored,
546
+ };
547
+ }
548
+ transformDefaultValue(node) {
549
+ return {
550
+ kind: 'DefaultValueNode',
551
+ defaultValue: this.transformNode(node.defaultValue),
552
+ };
553
+ }
538
554
  transformDataType(node) {
539
555
  // An Object.freezed leaf node. No need to clone.
540
556
  return node;
@@ -60,6 +60,8 @@ import { OnDuplicateKeyNode } from './on-duplicate-key-node.js';
60
60
  import { UnionNode } from './union-node.js';
61
61
  import { CreateViewNode } from './create-view-node.js';
62
62
  import { DropViewNode } from './drop-view-node.js';
63
+ import { GeneratedAlwaysAsNode } from './generated-always-as-node.js';
64
+ import { DefaultValueNode } from './default-value-node.js';
63
65
  export declare abstract class OperationNodeVisitor {
64
66
  #private;
65
67
  protected readonly nodeStack: OperationNode[];
@@ -125,4 +127,6 @@ export declare abstract class OperationNodeVisitor {
125
127
  protected abstract visitOperator(node: OperatorNode): void;
126
128
  protected abstract visitCreateView(node: CreateViewNode): void;
127
129
  protected abstract visitDropView(node: DropViewNode): void;
130
+ protected abstract visitGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): void;
131
+ protected abstract visitDefaultValue(node: DefaultValueNode): void;
128
132
  }
@@ -1,6 +1,7 @@
1
+ import { freeze } from '../util/object-utils.js';
1
2
  export class OperationNodeVisitor {
2
3
  nodeStack = [];
3
- #visitors = {
4
+ #visitors = freeze({
4
5
  AliasNode: this.visitAlias.bind(this),
5
6
  ColumnNode: this.visitColumn.bind(this),
6
7
  IdentifierNode: this.visitIdentifier.bind(this),
@@ -62,7 +63,9 @@ export class OperationNodeVisitor {
62
63
  UnionNode: this.visitUnion.bind(this),
63
64
  CreateViewNode: this.visitCreateView.bind(this),
64
65
  DropViewNode: this.visitDropView.bind(this),
65
- };
66
+ GeneratedAlwaysAsNode: this.visitGeneratedAlwaysAs.bind(this),
67
+ DefaultValueNode: this.visitDefaultValue.bind(this),
68
+ });
66
69
  visitNode = (node) => {
67
70
  this.nodeStack.push(node);
68
71
  this.#visitors[node.kind](node);
@@ -1,4 +1,4 @@
1
- export declare type OperationNodeKind = 'IdentifierNode' | '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';
1
+ export declare type OperationNodeKind = 'IdentifierNode' | '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' | 'GeneratedAlwaysAsNode' | 'DefaultValueNode';
2
2
  export interface OperationNode {
3
3
  readonly kind: OperationNodeKind;
4
4
  }
@@ -9,6 +9,6 @@ export interface RawNode extends OperationNode {
9
9
  */
10
10
  export declare const RawNode: Readonly<{
11
11
  is(node: OperationNode): node is RawNode;
12
- create(sqlFragments: string[], params: ReadonlyArray<OperationNode>): RawNode;
12
+ create(sqlFragments: ReadonlyArray<string>, params: ReadonlyArray<OperationNode>): RawNode;
13
13
  createWithSql(sql: string): RawNode;
14
14
  }>;
@@ -64,6 +64,8 @@ import { ColumnNode } from '../operation-node/column-node.js';
64
64
  import { UnionNode } from '../operation-node/union-node.js';
65
65
  import { CreateViewNode } from '../operation-node/create-view-node.js';
66
66
  import { DropViewNode } from '../operation-node/drop-view-node.js';
67
+ import { GeneratedAlwaysAsNode } from '../operation-node/generated-always-as-node.js';
68
+ import { DefaultValueNode } from '../operation-node/default-value-node.js';
67
69
  export declare class DefaultQueryCompiler extends OperationNodeVisitor implements QueryCompiler {
68
70
  #private;
69
71
  protected get numParameters(): number;
@@ -134,6 +136,8 @@ export declare class DefaultQueryCompiler extends OperationNodeVisitor implement
134
136
  protected visitUnion(node: UnionNode): void;
135
137
  protected visitCreateView(node: CreateViewNode): void;
136
138
  protected visitDropView(node: DropViewNode): void;
139
+ protected visitGeneratedAlwaysAs(node: GeneratedAlwaysAsNode): void;
140
+ protected visitDefaultValue(node: DefaultValueNode): void;
137
141
  protected append(str: string): void;
138
142
  protected appendValue(parameter: unknown): void;
139
143
  protected getLeftIdentifierWrapper(): string;
@@ -299,8 +299,12 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
299
299
  this.visitNode(node.column);
300
300
  this.append(' ');
301
301
  this.visitNode(node.dataType);
302
+ if (node.generatedAlwaysAs) {
303
+ this.append(' ');
304
+ this.visitNode(node.generatedAlwaysAs);
305
+ }
302
306
  if (node.defaultTo) {
303
- this.append(' default ');
307
+ this.append(' ');
304
308
  this.visitNode(node.defaultTo);
305
309
  }
306
310
  if (!node.nullable) {
@@ -676,6 +680,18 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
676
680
  }
677
681
  this.visitNode(node.name);
678
682
  }
683
+ visitGeneratedAlwaysAs(node) {
684
+ this.append('generated always as (');
685
+ this.visitNode(node.expression);
686
+ this.append(')');
687
+ if (node.stored) {
688
+ this.append(' stored');
689
+ }
690
+ }
691
+ visitDefaultValue(node) {
692
+ this.append('default ');
693
+ this.visitNode(node.defaultValue);
694
+ }
679
695
  append(str) {
680
696
  this.#sql += str;
681
697
  }
@@ -41,5 +41,5 @@ export interface RawBuilderProps {
41
41
  readonly queryId: QueryId;
42
42
  readonly executor: QueryExecutor;
43
43
  readonly sql: string;
44
- readonly parameters?: any;
44
+ readonly parameters?: ReadonlyArray<unknown>;
45
45
  }
@@ -72,6 +72,8 @@ export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuild
72
72
  notNull(): AlterTableAddColumnBuilder;
73
73
  defaultTo(value: PrimitiveValue | AnyRawBuilder): AlterTableAddColumnBuilder;
74
74
  check(sql: string): AlterTableAddColumnBuilder;
75
+ generatedAlwaysAs(sql: string): AlterTableAddColumnBuilder;
76
+ stored(): AlterTableAddColumnBuilder;
75
77
  toOperationNode(): AlterTableNode;
76
78
  compile(): CompiledQuery;
77
79
  execute(): Promise<void>;
@@ -91,6 +93,8 @@ export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBu
91
93
  notNull(): AlterTableModifyColumnBuilder;
92
94
  defaultTo(value: PrimitiveValue | AnyRawBuilder): AlterTableModifyColumnBuilder;
93
95
  check(sql: string): AlterTableModifyColumnBuilder;
96
+ generatedAlwaysAs(sql: string): AlterTableModifyColumnBuilder;
97
+ stored(): AlterTableModifyColumnBuilder;
94
98
  toOperationNode(): AlterTableNode;
95
99
  compile(): CompiledQuery;
96
100
  execute(): Promise<void>;
@@ -238,6 +238,18 @@ export class AlterTableAddColumnBuilder {
238
238
  columnBuilder: this.#props.columnBuilder.check(sql),
239
239
  });
240
240
  }
241
+ generatedAlwaysAs(sql) {
242
+ return new AlterTableAddColumnBuilder({
243
+ ...this.#props,
244
+ columnBuilder: this.#props.columnBuilder.generatedAlwaysAs(sql),
245
+ });
246
+ }
247
+ stored() {
248
+ return new AlterTableAddColumnBuilder({
249
+ ...this.#props,
250
+ columnBuilder: this.#props.columnBuilder.stored(),
251
+ });
252
+ }
241
253
  toOperationNode() {
242
254
  return this.#props.executor.transformQuery(AlterTableNode.cloneWith(this.#props.alterTableNode, {
243
255
  addColumn: AddColumnNode.create(this.#props.columnBuilder.toOperationNode()),
@@ -309,6 +321,18 @@ export class AlterTableModifyColumnBuilder {
309
321
  columnBuilder: this.#props.columnBuilder.check(sql),
310
322
  });
311
323
  }
324
+ generatedAlwaysAs(sql) {
325
+ return new AlterTableModifyColumnBuilder({
326
+ ...this.#props,
327
+ columnBuilder: this.#props.columnBuilder.generatedAlwaysAs(sql),
328
+ });
329
+ }
330
+ stored() {
331
+ return new AlterTableModifyColumnBuilder({
332
+ ...this.#props,
333
+ columnBuilder: this.#props.columnBuilder.stored(),
334
+ });
335
+ }
312
336
  toOperationNode() {
313
337
  return this.#props.executor.transformQuery(AlterTableNode.cloneWith(this.#props.alterTableNode, {
314
338
  modifyColumn: ModifyColumnNode.create(this.#props.columnBuilder.toOperationNode()),
@@ -40,10 +40,19 @@ export interface ColumnDefinitionBuilderInterface<R> {
40
40
  * column definition (like MySQL 5) you need to call the table level
41
41
  * {@link TableBuilder.addForeignKeyConstraint} method instead.
42
42
  *
43
+ * @example
44
+ * ```ts
45
+ * col.references('person.id').onDelete('cascade')
46
+ * ```
43
47
  */
44
48
  onDelete(onDelete: OnModifyForeignAction): R;
45
49
  /**
46
50
  * Adds an `on update` constraint for the foreign key column.
51
+ *
52
+ * @example
53
+ * ```ts
54
+ * col.references('person.id').onUpdate('cascade')
55
+ * ```
47
56
  */
48
57
  onUpdate(onUpdate: OnModifyForeignAction): R;
49
58
  /**
@@ -78,6 +87,36 @@ export interface ColumnDefinitionBuilderInterface<R> {
78
87
  * ```
79
88
  */
80
89
  check(sql: string): R;
90
+ /**
91
+ * Makes the column a generated column using a `generated always as` statement.
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * db.schema
96
+ * .createTable('person')
97
+ * .addColumn('full_name', 'varchar(255)',
98
+ * (col) => col.generatedAlwaysAs("concat(first_name, ' ', last_name)")
99
+ * )
100
+ * .execute()
101
+ * ```
102
+ */
103
+ generatedAlwaysAs(sql: string): R;
104
+ /**
105
+ * Makes a generated column stored instead of virtual. This method can only
106
+ * be used with {@link generatedAlwaysAs}
107
+ *
108
+ * @example
109
+ * ```ts
110
+ * db.schema
111
+ * .createTable('person')
112
+ * .addColumn('full_name', 'varchar(255)', (col) => col
113
+ * .generatedAlwaysAs("concat(first_name, ' ', last_name)")
114
+ * .stored()
115
+ * )
116
+ * .execute()
117
+ * ```
118
+ */
119
+ stored(): R;
81
120
  }
82
121
  export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderInterface<ColumnDefinitionBuilder>, OperationNodeSource {
83
122
  #private;
@@ -91,5 +130,7 @@ export declare class ColumnDefinitionBuilder implements ColumnDefinitionBuilderI
91
130
  notNull(): ColumnDefinitionBuilder;
92
131
  defaultTo(value: DefaultValueExpression): ColumnDefinitionBuilder;
93
132
  check(sql: string): ColumnDefinitionBuilder;
133
+ generatedAlwaysAs(sql: string): ColumnDefinitionBuilder;
134
+ stored(): ColumnDefinitionBuilder;
94
135
  toOperationNode(): ColumnDefinitionNode;
95
136
  }
@@ -6,6 +6,8 @@ import { parseStringReference } from '../parser/reference-parser.js';
6
6
  import { preventAwait } from '../util/prevent-await.js';
7
7
  import { ColumnDefinitionNode } from '../operation-node/column-definition-node.js';
8
8
  import { parseDefaultValueExpression, } from '../parser/default-value-parser.js';
9
+ import { GeneratedAlwaysAsNode } from '../operation-node/generated-always-as-node.js';
10
+ import { DefaultValueNode } from '../operation-node/default-value-node.js';
9
11
  export class ColumnDefinitionBuilder {
10
12
  #node;
11
13
  constructor(node) {
@@ -52,7 +54,7 @@ export class ColumnDefinitionBuilder {
52
54
  }
53
55
  defaultTo(value) {
54
56
  return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
55
- defaultTo: parseDefaultValueExpression(value),
57
+ defaultTo: DefaultValueNode.create(parseDefaultValueExpression(value)),
56
58
  }));
57
59
  }
58
60
  check(sql) {
@@ -60,6 +62,21 @@ export class ColumnDefinitionBuilder {
60
62
  check: CheckConstraintNode.create(sql),
61
63
  }));
62
64
  }
65
+ generatedAlwaysAs(sql) {
66
+ return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
67
+ generatedAlwaysAs: GeneratedAlwaysAsNode.create(sql),
68
+ }));
69
+ }
70
+ stored() {
71
+ if (!this.#node.generatedAlwaysAs) {
72
+ throw new Error('stored() can only be called after generatedAlwaysAs');
73
+ }
74
+ return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, {
75
+ generatedAlwaysAs: GeneratedAlwaysAsNode.cloneWith(this.#node.generatedAlwaysAs, {
76
+ stored: true,
77
+ }),
78
+ }));
79
+ }
63
80
  toOperationNode() {
64
81
  return this.#node;
65
82
  }
@@ -27,8 +27,8 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
27
27
  * await db.schema
28
28
  * .createTable('person')
29
29
  * .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
30
- * .addColumn('first_name', 'varchar(50), (col) => col.notNull())
31
- * .addColumn('last_name', 'varchar')
30
+ * .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
31
+ * .addColumn('last_name', 'varchar(255)')
32
32
  * .addColumn('bank_balance', 'numeric(8, 2)')
33
33
  * .addColumn('data', db.raw('customtype'))
34
34
  * .addColumn('parent_id', 'integer', (col) =>
@@ -37,11 +37,10 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
37
37
  * ```
38
38
  *
39
39
  * With this method, it's once again good to remember that Kysely just builds the query
40
- * that's as close to the structure of your builder method calls as possible, and doesn't
41
- * provide the same API for all databses. For example, some databases like older MySQL
42
- * don't support `references` statement in the column definition. Instead foreign key
43
- * constraints need to be defined in at the level of the `create table` query. See
44
- * the next example:
40
+ * and doesn't provide the same API for all databses. For example, some databases like
41
+ * older MySQL don't support `references` statement in the column definition. Instead
42
+ * foreign key constraints need to be defined in at the level of the `create table`
43
+ * query. See the next example:
45
44
  *
46
45
  * @example
47
46
  * ```ts
@@ -38,8 +38,8 @@ export class CreateTableBuilder {
38
38
  * await db.schema
39
39
  * .createTable('person')
40
40
  * .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
41
- * .addColumn('first_name', 'varchar(50), (col) => col.notNull())
42
- * .addColumn('last_name', 'varchar')
41
+ * .addColumn('first_name', 'varchar(50)', (col) => col.notNull())
42
+ * .addColumn('last_name', 'varchar(255)')
43
43
  * .addColumn('bank_balance', 'numeric(8, 2)')
44
44
  * .addColumn('data', db.raw('customtype'))
45
45
  * .addColumn('parent_id', 'integer', (col) =>
@@ -48,11 +48,10 @@ export class CreateTableBuilder {
48
48
  * ```
49
49
  *
50
50
  * With this method, it's once again good to remember that Kysely just builds the query
51
- * that's as close to the structure of your builder method calls as possible, and doesn't
52
- * provide the same API for all databses. For example, some databases like older MySQL
53
- * don't support `references` statement in the column definition. Instead foreign key
54
- * constraints need to be defined in at the level of the `create table` query. See
55
- * the next example:
51
+ * and doesn't provide the same API for all databses. For example, some databases like
52
+ * older MySQL don't support `references` statement in the column definition. Instead
53
+ * foreign key constraints need to be defined in at the level of the `create table`
54
+ * query. See the next example:
56
55
  *
57
56
  * @example
58
57
  * ```ts
@@ -0,0 +1 @@
1
+ export declare function performanceNow(): number;
@@ -0,0 +1,9 @@
1
+ import { isFunction } from './object-utils.js';
2
+ export function performanceNow() {
3
+ if (typeof performance !== 'undefined' && isFunction(performance.now)) {
4
+ return performance.now();
5
+ }
6
+ else {
7
+ return Date.now();
8
+ }
9
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kysely",
3
- "version": "0.10.0",
3
+ "version": "0.10.1",
4
4
  "description": "Type safe SQL query builder",
5
5
  "repository": {
6
6
  "type": "git",
@@ -47,9 +47,9 @@
47
47
  "mocha": "^9.1.3",
48
48
  "mysql2": "^2.3.3",
49
49
  "pg": "^8.7.1",
50
- "prettier": "^2.4.1",
50
+ "prettier": "^2.5.1",
51
51
  "tsd": "^0.19.0",
52
- "typedoc": "^0.22.9",
52
+ "typedoc": "^0.22.10",
53
53
  "typescript": "4.5.2"
54
54
  }
55
55
  }