kysely 0.9.7 → 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 (120) hide show
  1. package/README.md +15 -13
  2. package/dist/cjs/driver/runtime-driver.js +3 -4
  3. package/dist/cjs/index.d.ts +2 -0
  4. package/dist/cjs/index.js +2 -0
  5. package/dist/cjs/operation-node/column-definition-node.d.ts +8 -6
  6. package/dist/cjs/operation-node/column-definition-node.js +4 -4
  7. package/dist/cjs/operation-node/create-schema-node.d.ts +1 -2
  8. package/dist/cjs/operation-node/create-table-node.d.ts +2 -3
  9. package/dist/cjs/operation-node/create-table-node.js +2 -2
  10. package/dist/cjs/operation-node/create-view-node.d.ts +22 -0
  11. package/dist/cjs/operation-node/create-view-node.js +25 -0
  12. package/dist/cjs/operation-node/default-value-node.d.ts +14 -0
  13. package/dist/cjs/operation-node/default-value-node.js +18 -0
  14. package/dist/cjs/operation-node/drop-index-node.d.ts +1 -2
  15. package/dist/cjs/operation-node/drop-schema-node.d.ts +2 -3
  16. package/dist/cjs/operation-node/drop-schema-node.js +3 -3
  17. package/dist/cjs/operation-node/drop-table-node.d.ts +2 -3
  18. package/dist/cjs/operation-node/drop-table-node.js +2 -2
  19. package/dist/cjs/operation-node/drop-view-node.d.ts +17 -0
  20. package/dist/cjs/operation-node/drop-view-node.js +25 -0
  21. package/dist/cjs/operation-node/generated-always-as-node.d.ts +16 -0
  22. package/dist/cjs/operation-node/generated-always-as-node.js +25 -0
  23. package/dist/cjs/operation-node/operation-node-transformer.d.ts +8 -0
  24. package/dist/cjs/operation-node/operation-node-transformer.js +47 -11
  25. package/dist/cjs/operation-node/operation-node-visitor.d.ts +8 -0
  26. package/dist/cjs/operation-node/operation-node-visitor.js +7 -2
  27. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  28. package/dist/cjs/operation-node/operator-node.d.ts +1 -1
  29. package/dist/cjs/operation-node/operator-node.js +5 -0
  30. package/dist/cjs/operation-node/raw-node.d.ts +1 -1
  31. package/dist/cjs/operation-node/select-query-node.d.ts +1 -1
  32. package/dist/cjs/operation-node/select-query-node.js +1 -1
  33. package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.d.ts +17 -0
  34. package/dist/cjs/plugin/immediate-value.ts/immediate-value-plugin.js +22 -0
  35. package/dist/cjs/plugin/immediate-value.ts/immediate-value-transformer.d.ts +13 -0
  36. package/dist/cjs/plugin/immediate-value.ts/immediate-value-transformer.js +21 -0
  37. package/dist/cjs/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  38. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +6 -0
  39. package/dist/cjs/query-compiler/default-query-compiler.d.ts +8 -0
  40. package/dist/cjs/query-compiler/default-query-compiler.js +59 -11
  41. package/dist/cjs/query-compiler/query-compiler.d.ts +3 -1
  42. package/dist/cjs/raw-builder/raw-builder.d.ts +1 -1
  43. package/dist/cjs/schema/alter-table-builder.d.ts +6 -2
  44. package/dist/cjs/schema/alter-table-builder.js +28 -4
  45. package/dist/cjs/schema/column-definition-builder.d.ts +43 -2
  46. package/dist/cjs/schema/column-definition-builder.js +23 -6
  47. package/dist/cjs/schema/create-schema-builder.js +1 -1
  48. package/dist/cjs/schema/create-table-builder.d.ts +7 -8
  49. package/dist/cjs/schema/create-table-builder.js +8 -9
  50. package/dist/cjs/schema/create-view-builder.d.ts +24 -0
  51. package/dist/cjs/schema/create-view-builder.js +73 -0
  52. package/dist/cjs/schema/drop-index-builder.js +1 -1
  53. package/dist/cjs/schema/drop-schema-builder.js +3 -1
  54. package/dist/cjs/schema/drop-table-builder.js +3 -1
  55. package/dist/cjs/schema/drop-view-builder.d.ts +20 -0
  56. package/dist/cjs/schema/drop-view-builder.js +39 -0
  57. package/dist/cjs/schema/schema.d.ts +30 -3
  58. package/dist/cjs/schema/schema.js +44 -3
  59. package/dist/cjs/util/performance-now.d.ts +1 -0
  60. package/dist/cjs/util/performance-now.js +13 -0
  61. package/dist/esm/driver/runtime-driver.js +3 -4
  62. package/dist/esm/index.d.ts +2 -0
  63. package/dist/esm/index.js +2 -0
  64. package/dist/esm/operation-node/column-definition-node.d.ts +8 -6
  65. package/dist/esm/operation-node/column-definition-node.js +4 -4
  66. package/dist/esm/operation-node/create-schema-node.d.ts +1 -2
  67. package/dist/esm/operation-node/create-table-node.d.ts +2 -3
  68. package/dist/esm/operation-node/create-table-node.js +2 -2
  69. package/dist/esm/operation-node/create-view-node.d.ts +22 -0
  70. package/dist/esm/operation-node/create-view-node.js +22 -0
  71. package/dist/esm/operation-node/default-value-node.d.ts +14 -0
  72. package/dist/esm/operation-node/default-value-node.js +15 -0
  73. package/dist/esm/operation-node/drop-index-node.d.ts +1 -2
  74. package/dist/esm/operation-node/drop-schema-node.d.ts +2 -3
  75. package/dist/esm/operation-node/drop-schema-node.js +3 -3
  76. package/dist/esm/operation-node/drop-table-node.d.ts +2 -3
  77. package/dist/esm/operation-node/drop-table-node.js +2 -2
  78. package/dist/esm/operation-node/drop-view-node.d.ts +17 -0
  79. package/dist/esm/operation-node/drop-view-node.js +22 -0
  80. package/dist/esm/operation-node/generated-always-as-node.d.ts +16 -0
  81. package/dist/esm/operation-node/generated-always-as-node.js +22 -0
  82. package/dist/esm/operation-node/operation-node-transformer.d.ts +8 -0
  83. package/dist/esm/operation-node/operation-node-transformer.js +47 -11
  84. package/dist/esm/operation-node/operation-node-visitor.d.ts +8 -0
  85. package/dist/esm/operation-node/operation-node-visitor.js +7 -2
  86. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  87. package/dist/esm/operation-node/operator-node.d.ts +1 -1
  88. package/dist/esm/operation-node/operator-node.js +5 -0
  89. package/dist/esm/operation-node/raw-node.d.ts +1 -1
  90. package/dist/esm/operation-node/select-query-node.d.ts +1 -1
  91. package/dist/esm/operation-node/select-query-node.js +1 -1
  92. package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.d.ts +17 -0
  93. package/dist/esm/plugin/immediate-value.ts/immediate-value-plugin.js +18 -0
  94. package/dist/esm/plugin/immediate-value.ts/immediate-value-transformer.d.ts +13 -0
  95. package/dist/esm/plugin/immediate-value.ts/immediate-value-transformer.js +17 -0
  96. package/dist/esm/plugin/with-schema/with-schema-transformer.d.ts +4 -0
  97. package/dist/esm/plugin/with-schema/with-schema-transformer.js +6 -0
  98. package/dist/esm/query-compiler/default-query-compiler.d.ts +8 -0
  99. package/dist/esm/query-compiler/default-query-compiler.js +59 -11
  100. package/dist/esm/query-compiler/query-compiler.d.ts +3 -1
  101. package/dist/esm/raw-builder/raw-builder.d.ts +1 -1
  102. package/dist/esm/schema/alter-table-builder.d.ts +6 -2
  103. package/dist/esm/schema/alter-table-builder.js +28 -4
  104. package/dist/esm/schema/column-definition-builder.d.ts +43 -2
  105. package/dist/esm/schema/column-definition-builder.js +23 -6
  106. package/dist/esm/schema/create-schema-builder.js +1 -1
  107. package/dist/esm/schema/create-table-builder.d.ts +7 -8
  108. package/dist/esm/schema/create-table-builder.js +8 -9
  109. package/dist/esm/schema/create-view-builder.d.ts +24 -0
  110. package/dist/esm/schema/create-view-builder.js +69 -0
  111. package/dist/esm/schema/drop-index-builder.js +1 -1
  112. package/dist/esm/schema/drop-schema-builder.js +3 -1
  113. package/dist/esm/schema/drop-table-builder.js +3 -1
  114. package/dist/esm/schema/drop-view-builder.d.ts +20 -0
  115. package/dist/esm/schema/drop-view-builder.js +35 -0
  116. package/dist/esm/schema/schema.d.ts +30 -3
  117. package/dist/esm/schema/schema.js +44 -3
  118. package/dist/esm/util/performance-now.d.ts +1 -0
  119. package/dist/esm/util/performance-now.js +9 -0
  120. package/package.json +3 -3
@@ -35,7 +35,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
35
35
  this.compileDistinctOn(node.distinctOnSelections);
36
36
  this.append(' ');
37
37
  }
38
- if (node.isDistinct) {
38
+ if (node.distinct) {
39
39
  this.append('distinct');
40
40
  this.append(' ');
41
41
  }
@@ -287,7 +287,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
287
287
  }
288
288
  visitCreateTable(node) {
289
289
  this.append('create table ');
290
- if (node.modifier === 'IfNotExists') {
290
+ if (node.ifNotExists) {
291
291
  this.append('if not exists ');
292
292
  }
293
293
  this.visitNode(node.table);
@@ -299,21 +299,25 @@ 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
- if (!node.isNullable) {
310
+ if (!node.nullable) {
307
311
  this.append(' not null');
308
312
  }
309
- if (node.isAutoIncrementing) {
313
+ if (node.autoIncrement) {
310
314
  this.append(' ');
311
315
  this.append(this.getAutoIncrement());
312
316
  }
313
- if (node.isUnique) {
317
+ if (node.unique) {
314
318
  this.append(' unique');
315
319
  }
316
- if (node.isPrimaryKey) {
320
+ if (node.primaryKey) {
317
321
  this.append(' primary key');
318
322
  }
319
323
  if (node.references) {
@@ -345,7 +349,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
345
349
  }
346
350
  visitDropTable(node) {
347
351
  this.append('drop table ');
348
- if (node.modifier === 'IfExists') {
352
+ if (node.ifExists) {
349
353
  this.append('if exists ');
350
354
  }
351
355
  this.visitNode(node.table);
@@ -467,7 +471,7 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
467
471
  }
468
472
  visitDropIndex(node) {
469
473
  this.append('drop index ');
470
- if (node.modifier === 'IfExists') {
474
+ if (node.ifExists) {
471
475
  this.append('if exists ');
472
476
  }
473
477
  this.visitNode(node.name);
@@ -478,14 +482,14 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
478
482
  }
479
483
  visitCreateSchema(node) {
480
484
  this.append('create schema ');
481
- if (node.modifier === 'IfNotExists') {
485
+ if (node.ifNotExists) {
482
486
  this.append('if not exists ');
483
487
  }
484
488
  this.visitNode(node.schema);
485
489
  }
486
490
  visitDropSchema(node) {
487
491
  this.append('drop schema ');
488
- if (node.modifier === 'IfExists') {
492
+ if (node.ifExists) {
489
493
  this.append('if exists ');
490
494
  }
491
495
  this.visitNode(node.schema);
@@ -644,6 +648,50 @@ export class DefaultQueryCompiler extends OperationNodeVisitor {
644
648
  }
645
649
  this.visitNode(node.union);
646
650
  }
651
+ visitCreateView(node) {
652
+ this.append('create ');
653
+ if (node.orReplace) {
654
+ this.append('or replace ');
655
+ }
656
+ if (node.materialized) {
657
+ this.append('materialized ');
658
+ }
659
+ this.append('view ');
660
+ this.visitNode(node.name);
661
+ this.append(' ');
662
+ if (node.columns) {
663
+ this.append('(');
664
+ this.compileList(node.columns);
665
+ this.append(') ');
666
+ }
667
+ if (node.as) {
668
+ this.append('as ');
669
+ this.visitNode(node.as);
670
+ }
671
+ }
672
+ visitDropView(node) {
673
+ this.append('drop ');
674
+ if (node.materialized) {
675
+ this.append('materialized ');
676
+ }
677
+ this.append('view ');
678
+ if (node.ifExists) {
679
+ this.append('if exists ');
680
+ }
681
+ this.visitNode(node.name);
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
+ }
647
695
  append(str) {
648
696
  this.#sql += str;
649
697
  }
@@ -2,13 +2,15 @@ import { AlterTableNode } from '../operation-node/alter-table-node.js';
2
2
  import { CreateIndexNode } from '../operation-node/create-index-node.js';
3
3
  import { CreateSchemaNode } from '../operation-node/create-schema-node.js';
4
4
  import { CreateTableNode } from '../operation-node/create-table-node.js';
5
+ import { CreateViewNode } from '../operation-node/create-view-node.js';
5
6
  import { DropIndexNode } from '../operation-node/drop-index-node.js';
6
7
  import { DropSchemaNode } from '../operation-node/drop-schema-node.js';
7
8
  import { DropTableNode } from '../operation-node/drop-table-node.js';
9
+ import { DropViewNode } from '../operation-node/drop-view-node.js';
8
10
  import { QueryNode } from '../operation-node/query-node.js';
9
11
  import { RawNode } from '../operation-node/raw-node.js';
10
12
  import { CompiledQuery } from './compiled-query.js';
11
- export declare type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode | AlterTableNode | DropTableNode | DropIndexNode | CreateSchemaNode | DropSchemaNode | RawNode;
13
+ export declare type RootOperationNode = QueryNode | CreateTableNode | CreateIndexNode | CreateSchemaNode | CreateViewNode | DropTableNode | DropIndexNode | DropSchemaNode | DropViewNode | AlterTableNode | RawNode;
12
14
  /**
13
15
  * a `QueryCompiler` compiles a query expressed as a tree of `OperationNodes` into SQL.
14
16
  */
@@ -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
  }
@@ -63,7 +63,7 @@ export interface AlterTableExecutorProps extends AlterTableBuilderProps {
63
63
  export declare class AlterTableAddColumnBuilder implements ColumnDefinitionBuilderInterface<AlterTableAddColumnBuilder>, OperationNodeSource, Compilable {
64
64
  #private;
65
65
  constructor(props: AlterTableAddColumnBuilderProps);
66
- increments(): AlterTableAddColumnBuilder;
66
+ autoIncrement(): AlterTableAddColumnBuilder;
67
67
  primaryKey(): AlterTableAddColumnBuilder;
68
68
  references(ref: string): AlterTableAddColumnBuilder;
69
69
  onDelete(onDelete: OnModifyForeignAction): AlterTableAddColumnBuilder;
@@ -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>;
@@ -82,7 +84,7 @@ export interface AlterTableAddColumnBuilderProps extends AlterTableBuilderProps
82
84
  export declare class AlterTableModifyColumnBuilder implements ColumnDefinitionBuilderInterface<AlterTableModifyColumnBuilder>, OperationNodeSource, Compilable {
83
85
  #private;
84
86
  constructor(props: AlterTableModifyColumnBuilderProps);
85
- increments(): AlterTableModifyColumnBuilder;
87
+ autoIncrement(): AlterTableModifyColumnBuilder;
86
88
  primaryKey(): AlterTableModifyColumnBuilder;
87
89
  references(ref: string): AlterTableModifyColumnBuilder;
88
90
  onDelete(onDelete: OnModifyForeignAction): AlterTableModifyColumnBuilder;
@@ -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>;
@@ -184,10 +184,10 @@ export class AlterTableAddColumnBuilder {
184
184
  constructor(props) {
185
185
  this.#props = freeze(props);
186
186
  }
187
- increments() {
187
+ autoIncrement() {
188
188
  return new AlterTableAddColumnBuilder({
189
189
  ...this.#props,
190
- columnBuilder: this.#props.columnBuilder.increments(),
190
+ columnBuilder: this.#props.columnBuilder.autoIncrement(),
191
191
  });
192
192
  }
193
193
  primaryKey() {
@@ -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()),
@@ -255,10 +267,10 @@ export class AlterTableModifyColumnBuilder {
255
267
  constructor(props) {
256
268
  this.#props = freeze(props);
257
269
  }
258
- increments() {
270
+ autoIncrement() {
259
271
  return new AlterTableModifyColumnBuilder({
260
272
  ...this.#props,
261
- columnBuilder: this.#props.columnBuilder.increments(),
273
+ columnBuilder: this.#props.columnBuilder.autoIncrement(),
262
274
  });
263
275
  }
264
276
  primaryKey() {
@@ -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()),
@@ -12,7 +12,7 @@ export interface ColumnDefinitionBuilderInterface<R> {
12
12
  * Some dialects like PostgreSQL don't support this. On PostgreSQL
13
13
  * you can use the `serial` or `bigserial` data type instead.
14
14
  */
15
- increments(): R;
15
+ autoIncrement(): R;
16
16
  /**
17
17
  * Makes the column the primary key.
18
18
  *
@@ -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,11 +87,41 @@ 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;
84
123
  constructor(node: ColumnDefinitionNode);
85
- increments(): ColumnDefinitionBuilder;
124
+ autoIncrement(): ColumnDefinitionBuilder;
86
125
  primaryKey(): ColumnDefinitionBuilder;
87
126
  references(ref: string): ColumnDefinitionBuilder;
88
127
  onDelete(onDelete: OnModifyForeignAction): ColumnDefinitionBuilder;
@@ -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,16 +6,18 @@ 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) {
12
14
  this.#node = node;
13
15
  }
14
- increments() {
15
- return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { isAutoIncrementing: true }));
16
+ autoIncrement() {
17
+ return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { autoIncrement: true }));
16
18
  }
17
19
  primaryKey() {
18
- return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { isPrimaryKey: true }));
20
+ return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { primaryKey: true }));
19
21
  }
20
22
  references(ref) {
21
23
  const references = parseStringReference(ref);
@@ -45,14 +47,14 @@ export class ColumnDefinitionBuilder {
45
47
  }));
46
48
  }
47
49
  unique() {
48
- return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { isUnique: true }));
50
+ return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { unique: true }));
49
51
  }
50
52
  notNull() {
51
- return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { isNullable: false }));
53
+ return new ColumnDefinitionBuilder(ColumnDefinitionNode.cloneWith(this.#node, { nullable: false }));
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
  }
@@ -9,7 +9,7 @@ export class CreateSchemaBuilder {
9
9
  ifNotExists() {
10
10
  return new CreateSchemaBuilder({
11
11
  ...this.#props,
12
- createSchemaNode: CreateSchemaNode.cloneWith(this.#props.createSchemaNode, { modifier: 'IfNotExists' }),
12
+ createSchemaNode: CreateSchemaNode.cloneWith(this.#props.createSchemaNode, { ifNotExists: true }),
13
13
  });
14
14
  }
15
15
  toOperationNode() {
@@ -26,9 +26,9 @@ export declare class CreateTableBuilder<TB extends string, C extends string = ne
26
26
  * ```ts
27
27
  * await db.schema
28
28
  * .createTable('person')
29
- * .addColumn('id', 'integer', (col) => col.increments().primaryKey()),
30
- * .addColumn('first_name', 'varchar(50), (col) => col.notNull())
31
- * .addColumn('last_name', 'varchar')
29
+ * .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
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
@@ -27,7 +27,7 @@ export class CreateTableBuilder {
27
27
  ifNotExists() {
28
28
  return new CreateTableBuilder({
29
29
  ...this.#props,
30
- createTableNode: CreateTableNode.cloneWithModifier(this.#props.createTableNode, 'IfNotExists'),
30
+ createTableNode: CreateTableNode.cloneWithIfNotExists(this.#props.createTableNode, true),
31
31
  });
32
32
  }
33
33
  /**
@@ -37,9 +37,9 @@ export class CreateTableBuilder {
37
37
  * ```ts
38
38
  * await db.schema
39
39
  * .createTable('person')
40
- * .addColumn('id', 'integer', (col) => col.increments().primaryKey()),
41
- * .addColumn('first_name', 'varchar(50), (col) => col.notNull())
42
- * .addColumn('last_name', 'varchar')
40
+ * .addColumn('id', 'integer', (col) => col.autoIncrement().primaryKey()),
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,24 @@
1
+ import { OperationNodeSource } from '../operation-node/operation-node-source.js';
2
+ import { CompiledQuery } from '../query-compiler/compiled-query.js';
3
+ import { Compilable } from '../util/compilable.js';
4
+ import { QueryExecutor } from '../query-executor/query-executor.js';
5
+ import { QueryId } from '../util/query-id.js';
6
+ import { CreateViewNode } from '../operation-node/create-view-node.js';
7
+ import { AnyQueryBuilder } from '../index.js';
8
+ import { AnyRawBuilder } from '../util/type-utils.js';
9
+ export declare class CreateViewBuilder implements OperationNodeSource, Compilable {
10
+ #private;
11
+ constructor(props: CreateViewBuilderProps);
12
+ materialized(): CreateViewBuilder;
13
+ orReplace(): CreateViewBuilder;
14
+ columns(columns: string[]): CreateViewBuilder;
15
+ as(query: AnyQueryBuilder | AnyRawBuilder): CreateViewBuilder;
16
+ toOperationNode(): CreateViewNode;
17
+ compile(): CompiledQuery;
18
+ execute(): Promise<void>;
19
+ }
20
+ export interface CreateViewBuilderProps {
21
+ readonly queryId: QueryId;
22
+ readonly executor: QueryExecutor;
23
+ readonly createViewNode: CreateViewNode;
24
+ }
@@ -0,0 +1,69 @@
1
+ import { preventAwait } from '../util/prevent-await.js';
2
+ import { freeze } from '../util/object-utils.js';
3
+ import { CreateViewNode } from '../operation-node/create-view-node.js';
4
+ import { parseColumnName } from '../parser/reference-parser.js';
5
+ import { QueryNode } from '../index.js';
6
+ import { ImmediateValuePlugin } from '../plugin/immediate-value.ts/immediate-value-plugin.js';
7
+ export class CreateViewBuilder {
8
+ #props;
9
+ constructor(props) {
10
+ this.#props = freeze({
11
+ ...props,
12
+ // The select statement (defined using the `as` method) can't have parameters on some
13
+ // dialects. We add the `ImmediateValuePlugin` to make all parameters "immediate"
14
+ // meaning they are interpolated into the SQL instead of added as parameters.
15
+ //
16
+ // The values are therefore not escaped at all, which leads to SQL injection
17
+ // vulnerabilities if user input is passed into the query. However, the use
18
+ // case where user input is passed into a `create view` statement is a weird
19
+ // one, and we can pretty safely just ignore it.
20
+ executor: props.executor.withPlugin(new ImmediateValuePlugin()),
21
+ });
22
+ }
23
+ materialized() {
24
+ return new CreateViewBuilder({
25
+ ...this.#props,
26
+ createViewNode: CreateViewNode.cloneWith(this.#props.createViewNode, {
27
+ materialized: true,
28
+ }),
29
+ });
30
+ }
31
+ orReplace() {
32
+ return new CreateViewBuilder({
33
+ ...this.#props,
34
+ createViewNode: CreateViewNode.cloneWith(this.#props.createViewNode, {
35
+ orReplace: true,
36
+ }),
37
+ });
38
+ }
39
+ columns(columns) {
40
+ return new CreateViewBuilder({
41
+ ...this.#props,
42
+ createViewNode: CreateViewNode.cloneWith(this.#props.createViewNode, {
43
+ columns: columns.map(parseColumnName),
44
+ }),
45
+ });
46
+ }
47
+ as(query) {
48
+ const queryNode = query.toOperationNode();
49
+ if (QueryNode.isMutating(queryNode)) {
50
+ throw new Error('only select statements are allowd in views');
51
+ }
52
+ return new CreateViewBuilder({
53
+ ...this.#props,
54
+ createViewNode: CreateViewNode.cloneWith(this.#props.createViewNode, {
55
+ as: queryNode,
56
+ }),
57
+ });
58
+ }
59
+ toOperationNode() {
60
+ return this.#props.executor.transformQuery(this.#props.createViewNode, this.#props.queryId);
61
+ }
62
+ compile() {
63
+ return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
64
+ }
65
+ async execute() {
66
+ await this.#props.executor.executeQuery(this.compile(), this.#props.queryId);
67
+ }
68
+ }
69
+ preventAwait(CreateViewBuilder, "don't await CreateViewBuilder instances directly. To execute the query you need to call `execute`");
@@ -23,7 +23,7 @@ export class DropIndexBuilder {
23
23
  return new DropIndexBuilder({
24
24
  ...this.#props,
25
25
  dropIndexNode: DropIndexNode.cloneWith(this.#props.dropIndexNode, {
26
- modifier: 'IfExists',
26
+ ifExists: true,
27
27
  }),
28
28
  });
29
29
  }
@@ -9,7 +9,9 @@ export class DropSchemaBuilder {
9
9
  ifExists() {
10
10
  return new DropSchemaBuilder({
11
11
  ...this.#props,
12
- dropSchemaNode: DropSchemaNode.cloneWithModifier(this.#props.dropSchemaNode, 'IfExists'),
12
+ dropSchemaNode: DropSchemaNode.cloneWith(this.#props.dropSchemaNode, {
13
+ ifExists: true,
14
+ }),
13
15
  });
14
16
  }
15
17
  toOperationNode() {
@@ -9,7 +9,9 @@ export class DropTableBuilder {
9
9
  ifExists() {
10
10
  return new DropTableBuilder({
11
11
  ...this.#props,
12
- dropTableNode: DropTableNode.cloneWithModifier(this.#props.dropTableNode, 'IfExists'),
12
+ dropTableNode: DropTableNode.cloneWith(this.#props.dropTableNode, {
13
+ ifExists: true,
14
+ }),
13
15
  });
14
16
  }
15
17
  toOperationNode() {
@@ -0,0 +1,20 @@
1
+ import { OperationNodeSource } from '../operation-node/operation-node-source.js';
2
+ import { CompiledQuery } from '../query-compiler/compiled-query.js';
3
+ import { Compilable } from '../util/compilable.js';
4
+ import { QueryExecutor } from '../query-executor/query-executor.js';
5
+ import { QueryId } from '../util/query-id.js';
6
+ import { DropViewNode } from '../operation-node/drop-view-node.js';
7
+ export declare class DropViewBuilder implements OperationNodeSource, Compilable {
8
+ #private;
9
+ constructor(props: DropViewBuilderProps);
10
+ materialized(): DropViewBuilder;
11
+ ifExists(): DropViewBuilder;
12
+ toOperationNode(): DropViewNode;
13
+ compile(): CompiledQuery;
14
+ execute(): Promise<void>;
15
+ }
16
+ export interface DropViewBuilderProps {
17
+ readonly queryId: QueryId;
18
+ readonly executor: QueryExecutor;
19
+ readonly dropViewNode: DropViewNode;
20
+ }
@@ -0,0 +1,35 @@
1
+ import { preventAwait } from '../util/prevent-await.js';
2
+ import { freeze } from '../util/object-utils.js';
3
+ import { DropViewNode } from '../operation-node/drop-view-node.js';
4
+ export class DropViewBuilder {
5
+ #props;
6
+ constructor(props) {
7
+ this.#props = freeze(props);
8
+ }
9
+ materialized() {
10
+ return new DropViewBuilder({
11
+ ...this.#props,
12
+ dropViewNode: DropViewNode.cloneWith(this.#props.dropViewNode, {
13
+ materialized: true,
14
+ }),
15
+ });
16
+ }
17
+ ifExists() {
18
+ return new DropViewBuilder({
19
+ ...this.#props,
20
+ dropViewNode: DropViewNode.cloneWith(this.#props.dropViewNode, {
21
+ ifExists: true,
22
+ }),
23
+ });
24
+ }
25
+ toOperationNode() {
26
+ return this.#props.executor.transformQuery(this.#props.dropViewNode, this.#props.queryId);
27
+ }
28
+ compile() {
29
+ return this.#props.executor.compileQuery(this.toOperationNode(), this.#props.queryId);
30
+ }
31
+ async execute() {
32
+ await this.#props.executor.executeQuery(this.compile(), this.#props.queryId);
33
+ }
34
+ }
35
+ preventAwait(DropViewBuilder, "don't await DropViewBuilder instances directly. To execute the query you need to call `execute`");