kysely 0.27.1 → 0.27.3

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 (161) hide show
  1. package/dist/cjs/dialect/database-introspector.d.ts +1 -0
  2. package/dist/cjs/dialect/mssql/mssql-introspector.js +13 -2
  3. package/dist/cjs/dialect/mssql/mssql-query-compiler.d.ts +4 -0
  4. package/dist/cjs/dialect/mssql/mssql-query-compiler.js +8 -0
  5. package/dist/cjs/dialect/mysql/mysql-introspector.js +2 -0
  6. package/dist/cjs/dialect/postgres/postgres-dialect-config.d.ts +1 -1
  7. package/dist/cjs/dialect/postgres/postgres-driver.js +2 -1
  8. package/dist/cjs/dialect/postgres/postgres-introspector.js +2 -0
  9. package/dist/cjs/dialect/sqlite/sqlite-introspector.js +1 -0
  10. package/dist/cjs/driver/database-connection.d.ts +1 -1
  11. package/dist/cjs/expression/expression-builder.d.ts +30 -4
  12. package/dist/cjs/expression/expression-builder.js +5 -0
  13. package/dist/cjs/index.d.ts +7 -1
  14. package/dist/cjs/index.js +6 -0
  15. package/dist/cjs/migration/migrator.d.ts +19 -2
  16. package/dist/cjs/migration/migrator.js +77 -43
  17. package/dist/cjs/operation-node/add-index-node.js +1 -1
  18. package/dist/cjs/operation-node/cast-node.d.ts +13 -0
  19. package/dist/cjs/operation-node/cast-node.js +19 -0
  20. package/dist/cjs/operation-node/column-definition-node.d.ts +1 -0
  21. package/dist/cjs/operation-node/data-type-node.d.ts +5 -1
  22. package/dist/cjs/operation-node/data-type-node.js +55 -1
  23. package/dist/cjs/operation-node/delete-query-node.d.ts +4 -0
  24. package/dist/cjs/operation-node/delete-query-node.js +12 -0
  25. package/dist/cjs/operation-node/fetch-node.d.ts +15 -0
  26. package/dist/cjs/operation-node/fetch-node.js +19 -0
  27. package/dist/cjs/operation-node/insert-query-node.d.ts +4 -1
  28. package/dist/cjs/operation-node/insert-query-node.js +5 -0
  29. package/dist/cjs/operation-node/join-node.d.ts +1 -1
  30. package/dist/cjs/operation-node/matched-node.d.ts +13 -0
  31. package/dist/cjs/operation-node/matched-node.js +19 -0
  32. package/dist/cjs/operation-node/merge-query-node.d.ts +25 -0
  33. package/dist/cjs/operation-node/merge-query-node.js +45 -0
  34. package/dist/cjs/operation-node/operation-node-transformer.d.ts +10 -0
  35. package/dist/cjs/operation-node/operation-node-transformer.js +50 -0
  36. package/dist/cjs/operation-node/operation-node-visitor.d.ts +10 -0
  37. package/dist/cjs/operation-node/operation-node-visitor.js +5 -0
  38. package/dist/cjs/operation-node/operation-node.d.ts +1 -1
  39. package/dist/cjs/operation-node/query-node.d.ts +10 -3
  40. package/dist/cjs/operation-node/query-node.js +15 -1
  41. package/dist/cjs/operation-node/select-query-node.d.ts +5 -0
  42. package/dist/cjs/operation-node/select-query-node.js +6 -0
  43. package/dist/cjs/operation-node/top-node.d.ts +14 -0
  44. package/dist/cjs/operation-node/top-node.js +19 -0
  45. package/dist/cjs/operation-node/update-query-node.d.ts +7 -1
  46. package/dist/cjs/operation-node/update-query-node.js +11 -0
  47. package/dist/cjs/parser/binary-operation-parser.d.ts +1 -1
  48. package/dist/cjs/parser/binary-operation-parser.js +2 -2
  49. package/dist/cjs/parser/data-type-parser.js +7 -3
  50. package/dist/cjs/parser/fetch-parser.d.ts +2 -0
  51. package/dist/cjs/parser/fetch-parser.js +18 -0
  52. package/dist/cjs/parser/insert-values-parser.d.ts +3 -3
  53. package/dist/cjs/parser/merge-parser.d.ts +9 -0
  54. package/dist/cjs/parser/merge-parser.js +32 -0
  55. package/dist/cjs/parser/table-parser.d.ts +4 -3
  56. package/dist/cjs/parser/top-parser.d.ts +2 -0
  57. package/dist/cjs/parser/top-parser.js +20 -0
  58. package/dist/cjs/plugin/with-schema/with-schema-transformer.js +4 -0
  59. package/dist/cjs/query-builder/delete-query-builder.d.ts +99 -0
  60. package/dist/cjs/query-builder/delete-query-builder.js +120 -0
  61. package/dist/cjs/query-builder/insert-query-builder.d.ts +73 -3
  62. package/dist/cjs/query-builder/insert-query-builder.js +242 -0
  63. package/dist/cjs/query-builder/merge-query-builder.d.ts +557 -0
  64. package/dist/cjs/query-builder/merge-query-builder.js +518 -0
  65. package/dist/cjs/query-builder/merge-result.d.ts +4 -0
  66. package/dist/cjs/query-builder/merge-result.js +10 -0
  67. package/dist/cjs/query-builder/select-query-builder.d.ts +102 -7
  68. package/dist/cjs/query-builder/select-query-builder.js +14 -0
  69. package/dist/cjs/query-builder/update-query-builder.d.ts +82 -3
  70. package/dist/cjs/query-builder/update-query-builder.js +98 -0
  71. package/dist/cjs/query-compiler/default-query-compiler.d.ts +10 -0
  72. package/dist/cjs/query-compiler/default-query-compiler.js +94 -10
  73. package/dist/cjs/query-compiler/query-compiler.d.ts +2 -1
  74. package/dist/cjs/query-creator.d.ts +40 -2
  75. package/dist/cjs/query-creator.js +9 -0
  76. package/dist/cjs/schema/alter-table-add-index-builder.js +6 -2
  77. package/dist/cjs/schema/column-definition-builder.d.ts +13 -1
  78. package/dist/cjs/schema/column-definition-builder.js +15 -1
  79. package/dist/cjs/util/infer-result.d.ts +2 -1
  80. package/dist/cjs/util/type-utils.d.ts +3 -2
  81. package/dist/esm/dialect/database-introspector.d.ts +1 -0
  82. package/dist/esm/dialect/mssql/mssql-introspector.js +13 -2
  83. package/dist/esm/dialect/mssql/mssql-query-compiler.d.ts +4 -0
  84. package/dist/esm/dialect/mssql/mssql-query-compiler.js +8 -0
  85. package/dist/esm/dialect/mysql/mysql-introspector.js +2 -0
  86. package/dist/esm/dialect/postgres/postgres-dialect-config.d.ts +1 -1
  87. package/dist/esm/dialect/postgres/postgres-driver.js +2 -1
  88. package/dist/esm/dialect/postgres/postgres-introspector.js +2 -0
  89. package/dist/esm/dialect/sqlite/sqlite-introspector.js +1 -0
  90. package/dist/esm/driver/database-connection.d.ts +1 -1
  91. package/dist/esm/expression/expression-builder.d.ts +30 -4
  92. package/dist/esm/expression/expression-builder.js +5 -0
  93. package/dist/esm/index.d.ts +7 -1
  94. package/dist/esm/index.js +6 -0
  95. package/dist/esm/migration/migrator.d.ts +19 -2
  96. package/dist/esm/migration/migrator.js +76 -42
  97. package/dist/esm/operation-node/add-index-node.js +1 -1
  98. package/dist/esm/operation-node/cast-node.d.ts +13 -0
  99. package/dist/esm/operation-node/cast-node.js +17 -0
  100. package/dist/esm/operation-node/column-definition-node.d.ts +1 -0
  101. package/dist/esm/operation-node/data-type-node.d.ts +5 -1
  102. package/dist/esm/operation-node/data-type-node.js +53 -0
  103. package/dist/esm/operation-node/delete-query-node.d.ts +4 -0
  104. package/dist/esm/operation-node/delete-query-node.js +12 -0
  105. package/dist/esm/operation-node/fetch-node.d.ts +15 -0
  106. package/dist/esm/operation-node/fetch-node.js +17 -0
  107. package/dist/esm/operation-node/insert-query-node.d.ts +4 -1
  108. package/dist/esm/operation-node/insert-query-node.js +5 -0
  109. package/dist/esm/operation-node/join-node.d.ts +1 -1
  110. package/dist/esm/operation-node/matched-node.d.ts +13 -0
  111. package/dist/esm/operation-node/matched-node.js +17 -0
  112. package/dist/esm/operation-node/merge-query-node.d.ts +25 -0
  113. package/dist/esm/operation-node/merge-query-node.js +43 -0
  114. package/dist/esm/operation-node/operation-node-transformer.d.ts +10 -0
  115. package/dist/esm/operation-node/operation-node-transformer.js +50 -0
  116. package/dist/esm/operation-node/operation-node-visitor.d.ts +10 -0
  117. package/dist/esm/operation-node/operation-node-visitor.js +5 -0
  118. package/dist/esm/operation-node/operation-node.d.ts +1 -1
  119. package/dist/esm/operation-node/query-node.d.ts +10 -3
  120. package/dist/esm/operation-node/query-node.js +15 -1
  121. package/dist/esm/operation-node/select-query-node.d.ts +5 -0
  122. package/dist/esm/operation-node/select-query-node.js +6 -0
  123. package/dist/esm/operation-node/top-node.d.ts +14 -0
  124. package/dist/esm/operation-node/top-node.js +17 -0
  125. package/dist/esm/operation-node/update-query-node.d.ts +7 -1
  126. package/dist/esm/operation-node/update-query-node.js +11 -0
  127. package/dist/esm/parser/binary-operation-parser.d.ts +1 -1
  128. package/dist/esm/parser/binary-operation-parser.js +2 -2
  129. package/dist/esm/parser/data-type-parser.js +8 -4
  130. package/dist/esm/parser/fetch-parser.d.ts +2 -0
  131. package/dist/esm/parser/fetch-parser.js +15 -0
  132. package/dist/esm/parser/insert-values-parser.d.ts +3 -3
  133. package/dist/esm/parser/merge-parser.d.ts +9 -0
  134. package/dist/esm/parser/merge-parser.js +28 -0
  135. package/dist/esm/parser/table-parser.d.ts +4 -3
  136. package/dist/esm/parser/top-parser.d.ts +2 -0
  137. package/dist/esm/parser/top-parser.js +17 -0
  138. package/dist/esm/plugin/with-schema/with-schema-transformer.js +4 -0
  139. package/dist/esm/query-builder/delete-query-builder.d.ts +99 -0
  140. package/dist/esm/query-builder/delete-query-builder.js +120 -0
  141. package/dist/esm/query-builder/insert-query-builder.d.ts +73 -3
  142. package/dist/esm/query-builder/insert-query-builder.js +242 -0
  143. package/dist/esm/query-builder/merge-query-builder.d.ts +557 -0
  144. package/dist/esm/query-builder/merge-query-builder.js +512 -0
  145. package/dist/esm/query-builder/merge-result.d.ts +4 -0
  146. package/dist/esm/query-builder/merge-result.js +7 -0
  147. package/dist/esm/query-builder/select-query-builder.d.ts +102 -7
  148. package/dist/esm/query-builder/select-query-builder.js +14 -0
  149. package/dist/esm/query-builder/update-query-builder.d.ts +82 -3
  150. package/dist/esm/query-builder/update-query-builder.js +98 -0
  151. package/dist/esm/query-compiler/default-query-compiler.d.ts +10 -0
  152. package/dist/esm/query-compiler/default-query-compiler.js +94 -10
  153. package/dist/esm/query-compiler/query-compiler.d.ts +2 -1
  154. package/dist/esm/query-creator.d.ts +40 -2
  155. package/dist/esm/query-creator.js +10 -1
  156. package/dist/esm/schema/alter-table-add-index-builder.js +7 -3
  157. package/dist/esm/schema/column-definition-builder.d.ts +13 -1
  158. package/dist/esm/schema/column-definition-builder.js +15 -1
  159. package/dist/esm/util/infer-result.d.ts +2 -1
  160. package/dist/esm/util/type-utils.d.ts +3 -2
  161. package/package.json +22 -21
@@ -58,4 +58,5 @@ export interface ColumnMetadata {
58
58
  readonly isAutoIncrementing: boolean;
59
59
  readonly isNullable: boolean;
60
60
  readonly hasDefaultValue: boolean;
61
+ readonly comment?: string;
61
62
  }
@@ -16,8 +16,12 @@ class MssqlIntrospector {
16
16
  .selectFrom('sys.tables as tables')
17
17
  .leftJoin('sys.schemas as table_schemas', 'table_schemas.schema_id', 'tables.schema_id')
18
18
  .innerJoin('sys.columns as columns', 'columns.object_id', 'tables.object_id')
19
- .innerJoin('sys.types as types', 'types.system_type_id', 'columns.system_type_id')
19
+ .innerJoin('sys.types as types', 'types.user_type_id', 'columns.user_type_id')
20
20
  .leftJoin('sys.schemas as type_schemas', 'type_schemas.schema_id', 'types.schema_id')
21
+ .leftJoin('sys.extended_properties as comments', (join) => join
22
+ .onRef('comments.major_id', '=', 'tables.object_id')
23
+ .onRef('comments.minor_id', '=', 'columns.column_id')
24
+ .on('comments.name', '=', 'MS_Description'))
21
25
  .$if(!options.withInternalKyselyTables, (qb) => qb
22
26
  .where('tables.name', '!=', migrator_js_1.DEFAULT_MIGRATION_TABLE)
23
27
  .where('tables.name', '!=', migrator_js_1.DEFAULT_MIGRATION_LOCK_TABLE))
@@ -38,13 +42,18 @@ class MssqlIntrospector {
38
42
  'types.is_nullable as type_is_nullable',
39
43
  'types.name as type_name',
40
44
  'type_schemas.name as type_schema_name',
45
+ 'comments.value as column_comment',
41
46
  ])
42
47
  .unionAll(this.#db
43
48
  .selectFrom('sys.views as views')
44
49
  .leftJoin('sys.schemas as view_schemas', 'view_schemas.schema_id', 'views.schema_id')
45
50
  .innerJoin('sys.columns as columns', 'columns.object_id', 'views.object_id')
46
- .innerJoin('sys.types as types', 'types.system_type_id', 'columns.system_type_id')
51
+ .innerJoin('sys.types as types', 'types.user_type_id', 'columns.user_type_id')
47
52
  .leftJoin('sys.schemas as type_schemas', 'type_schemas.schema_id', 'types.schema_id')
53
+ .leftJoin('sys.extended_properties as comments', (join) => join
54
+ .onRef('comments.major_id', '=', 'views.object_id')
55
+ .onRef('comments.minor_id', '=', 'columns.column_id')
56
+ .on('comments.name', '=', 'MS_Description'))
48
57
  .select([
49
58
  'views.name as table_name',
50
59
  'views.type as table_type',
@@ -59,6 +68,7 @@ class MssqlIntrospector {
59
68
  'types.is_nullable as type_is_nullable',
60
69
  'types.name as type_name',
61
70
  'type_schemas.name as type_schema_name',
71
+ 'comments.value as column_comment',
62
72
  ]))
63
73
  .orderBy('table_schema_name')
64
74
  .orderBy('table_name')
@@ -86,6 +96,7 @@ class MssqlIntrospector {
86
96
  isAutoIncrementing: rawColumn.column_is_identity,
87
97
  isNullable: rawColumn.column_is_nullable && rawColumn.type_is_nullable,
88
98
  name: rawColumn.column_name,
99
+ comment: rawColumn.column_comment ?? undefined,
89
100
  }));
90
101
  }
91
102
  return Object.values(tableDictionary);
@@ -1,11 +1,15 @@
1
1
  import { AddColumnNode } from '../../operation-node/add-column-node.js';
2
2
  import { AlterTableColumnAlterationNode } from '../../operation-node/alter-table-node.js';
3
3
  import { DropColumnNode } from '../../operation-node/drop-column-node.js';
4
+ import { OffsetNode } from '../../operation-node/offset-node.js';
5
+ import { MergeQueryNode } from '../../operation-node/merge-query-node.js';
4
6
  import { DefaultQueryCompiler } from '../../query-compiler/default-query-compiler.js';
5
7
  export declare class MssqlQueryCompiler extends DefaultQueryCompiler {
6
8
  protected getCurrentParameterPlaceholder(): string;
9
+ protected visitOffset(node: OffsetNode): void;
7
10
  protected compileColumnAlterations(columnAlterations: readonly AlterTableColumnAlterationNode[]): void;
8
11
  protected visitAddColumn(node: AddColumnNode): void;
9
12
  protected visitDropColumn(node: DropColumnNode): void;
13
+ protected visitMergeQuery(node: MergeQueryNode): void;
10
14
  protected announcesNewColumnDataType(): boolean;
11
15
  }
@@ -6,6 +6,10 @@ class MssqlQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompile
6
6
  getCurrentParameterPlaceholder() {
7
7
  return `@${this.numParameters}`;
8
8
  }
9
+ visitOffset(node) {
10
+ super.visitOffset(node);
11
+ this.append(' rows');
12
+ }
9
13
  // mssql allows multi-column alterations in a single statement,
10
14
  // but you can only use the command keyword/s once.
11
15
  // it also doesn't support multiple kinds of commands in the same
@@ -57,6 +61,10 @@ class MssqlQueryCompiler extends default_query_compiler_js_1.DefaultQueryCompile
57
61
  visitDropColumn(node) {
58
62
  this.visitNode(node.column);
59
63
  }
64
+ visitMergeQuery(node) {
65
+ super.visitMergeQuery(node);
66
+ this.append(';');
67
+ }
60
68
  announcesNewColumnDataType() {
61
69
  return false;
62
70
  }
@@ -33,6 +33,7 @@ class MysqlIntrospector {
33
33
  'columns.IS_NULLABLE',
34
34
  'columns.DATA_TYPE',
35
35
  'columns.EXTRA',
36
+ 'columns.COLUMN_COMMENT',
36
37
  ])
37
38
  .where('columns.TABLE_SCHEMA', '=', (0, sql_js_1.sql) `database()`)
38
39
  .orderBy('columns.TABLE_NAME')
@@ -69,6 +70,7 @@ class MysqlIntrospector {
69
70
  isNullable: it.IS_NULLABLE === 'YES',
70
71
  isAutoIncrementing: it.EXTRA.toLowerCase().includes('auto_increment'),
71
72
  hasDefaultValue: it.COLUMN_DEFAULT !== null,
73
+ comment: it.COLUMN_COMMENT === '' ? undefined : it.COLUMN_COMMENT,
72
74
  }));
73
75
  return tables;
74
76
  }, []);
@@ -52,7 +52,7 @@ export interface PostgresCursor<T> {
52
52
  }
53
53
  export type PostgresCursorConstructor = new <T>(sql: string, parameters: unknown[]) => PostgresCursor<T>;
54
54
  export interface PostgresQueryResult<R> {
55
- command: 'UPDATE' | 'DELETE' | 'INSERT' | 'SELECT';
55
+ command: 'UPDATE' | 'DELETE' | 'INSERT' | 'SELECT' | 'MERGE';
56
56
  rowCount: number;
57
57
  rows: R[];
58
58
  }
@@ -74,7 +74,8 @@ class PostgresConnection {
74
74
  ]);
75
75
  if (result.command === 'INSERT' ||
76
76
  result.command === 'UPDATE' ||
77
- result.command === 'DELETE') {
77
+ result.command === 'DELETE' ||
78
+ result.command === 'MERGE') {
78
79
  const numAffectedRows = BigInt(result.rowCount);
79
80
  return {
80
81
  // TODO: remove.
@@ -38,6 +38,7 @@ class PostgresIntrospector {
38
38
  'ns.nspname as schema',
39
39
  'typ.typname as type',
40
40
  'dtns.nspname as type_schema',
41
+ (0, sql_js_1.sql) `col_description(a.attrelid, a.attnum)`.as('column_description'),
41
42
  // Detect if the column is auto incrementing by finding the sequence
42
43
  // that is created for `serial` and `bigserial` columns.
43
44
  this.#db
@@ -92,6 +93,7 @@ class PostgresIntrospector {
92
93
  isNullable: !it.not_null,
93
94
  isAutoIncrementing: !!it.auto_incrementing,
94
95
  hasDefaultValue: it.has_default,
96
+ comment: it.column_description ?? undefined,
95
97
  }));
96
98
  return tables;
97
99
  }, []);
@@ -63,6 +63,7 @@ class SqliteIntrospector {
63
63
  isNullable: !col.notnull,
64
64
  isAutoIncrementing: col.name === autoIncrementCol,
65
65
  hasDefaultValue: col.dflt_value != null,
66
+ comment: undefined,
66
67
  })),
67
68
  };
68
69
  }
@@ -14,7 +14,7 @@ export interface QueryResult<O> {
14
14
  */
15
15
  readonly numUpdatedOrDeletedRows?: bigint;
16
16
  /**
17
- * This is defined for insert, update and delete queries and contains
17
+ * This is defined for insert, update, delete and merge queries and contains
18
18
  * the number of rows the query inserted/updated/deleted.
19
19
  */
20
20
  readonly numAffectedRows?: bigint;
@@ -15,6 +15,7 @@ import { OperandExpression } from '../parser/expression-parser.js';
15
15
  import { RefTuple2, RefTuple3, RefTuple4, RefTuple5, ValTuple2, ValTuple3, ValTuple4, ValTuple5 } from '../parser/tuple-parser.js';
16
16
  import { Selectable } from '../util/column-type.js';
17
17
  import { KyselyTypeError } from '../util/type-error.js';
18
+ import { DataTypeExpression } from '../parser/data-type-parser.js';
18
19
  export interface ExpressionBuilder<DB, TB extends keyof DB> {
19
20
  /**
20
21
  * Creates a binary expression.
@@ -194,7 +195,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
194
195
  selectFrom<TE extends keyof DB & string>(from: TE[]): SelectQueryBuilder<DB, TB | ExtractTableAlias<DB, TE>, {}>;
195
196
  selectFrom<TE extends TableExpression<DB, TB>>(from: TE[]): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
196
197
  selectFrom<TE extends keyof DB & string>(from: TE): SelectQueryBuilder<DB, TB | ExtractTableAlias<DB, TE>, {}>;
197
- selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, TB | ExtractTableAlias<DB, TE>, {}>;
198
+ selectFrom<TE extends AnyAliasedTable<DB>>(from: TE): SelectQueryBuilder<DB & PickTableWithAlias<DB, TE>, TB | ExtractTableAlias<DB & PickTableWithAlias<DB, TE>, TE>, {}>;
198
199
  selectFrom<TE extends TableExpression<DB, TB>>(from: TE): SelectQueryBuilder<From<DB, TE>, FromTables<DB, TB, TE>, {}>;
199
200
  /**
200
201
  * Creates a `case` statement/operator.
@@ -218,7 +219,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
218
219
  * .when('gender', '=', 'female')
219
220
  * .then(
220
221
  * eb
221
- * .case('martialStatus')
222
+ * .case('maritalStatus')
222
223
  * .when('single')
223
224
  * .then('Ms.')
224
225
  * .else('Mrs.')
@@ -238,7 +239,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
238
239
  * case
239
240
  * when "gender" = $1 then $2
240
241
  * when "gender" = $3 then
241
- * case "martialStatus"
242
+ * case "maritalStatus"
242
243
  * when $4 then $5
243
244
  * else $6
244
245
  * end
@@ -775,7 +776,7 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
775
776
  * ```ts
776
777
  * db.selectFrom('person')
777
778
  * .selectAll('person')
778
- * .where((eb) => parens(
779
+ * .where((eb) => eb.parens(
779
780
  * eb('age', '=', 1).or('age', '=', 2))
780
781
  * ).and(
781
782
  * eb('first_name', '=', 'Jennifer').or('first_name', '=', 'Arnold')
@@ -792,6 +793,31 @@ export interface ExpressionBuilder<DB, TB extends keyof DB> {
792
793
  */
793
794
  parens<RE extends ReferenceExpression<DB, TB>, OP extends BinaryOperatorExpression, VE extends OperandValueExpressionOrList<DB, TB, RE>>(lhs: RE, op: OP, rhs: VE): ExpressionWrapper<DB, TB, OP extends ComparisonOperator ? SqlBool : ExtractTypeFromReferenceExpression<DB, TB, RE>>;
794
795
  parens<T>(expr: Expression<T>): ExpressionWrapper<DB, TB, T>;
796
+ /**
797
+ * Creates a `cast(expr as dataType)` expression.
798
+ *
799
+ * Since Kysely can't know the mapping between javascript and database types,
800
+ * you need to provide both explicitly.
801
+ *
802
+ * ### Examples
803
+ *
804
+ * ```ts
805
+ * db.selectFrom('person')
806
+ * .select((eb) => [
807
+ * 'id',
808
+ * 'first_name',
809
+ * eb.cast<number>('age', 'integer').as('age')
810
+ * ])
811
+ * ```
812
+ *
813
+ * The generated SQL (PostgreSQL):
814
+ *
815
+ * ```sql
816
+ * select cast("age" as integer) as "age"
817
+ * from "person"
818
+ * ```
819
+ */
820
+ cast<T, RE extends ReferenceExpression<DB, TB> = ReferenceExpression<DB, TB>>(expr: RE, dataType: DataTypeExpression): ExpressionWrapper<DB, TB, T>;
795
821
  /**
796
822
  * See {@link QueryCreator.withSchema}
797
823
  *
@@ -23,6 +23,8 @@ const binary_operation_node_js_1 = require("../operation-node/binary-operation-n
23
23
  const and_node_js_1 = require("../operation-node/and-node.js");
24
24
  const tuple_node_js_1 = require("../operation-node/tuple-node.js");
25
25
  const json_path_node_js_1 = require("../operation-node/json-path-node.js");
26
+ const data_type_parser_js_1 = require("../parser/data-type-parser.js");
27
+ const cast_node_js_1 = require("../operation-node/cast-node.js");
26
28
  function createExpressionBuilder(executor = noop_query_executor_js_1.NOOP_QUERY_EXECUTOR) {
27
29
  function binary(lhs, op, rhs) {
28
30
  return new expression_wrapper_js_1.ExpressionWrapper((0, binary_operation_parser_js_1.parseValueBinaryOperation)(lhs, op, rhs));
@@ -109,6 +111,9 @@ function createExpressionBuilder(executor = noop_query_executor_js_1.NOOP_QUERY_
109
111
  return new expression_wrapper_js_1.ExpressionWrapper(parens_node_js_1.ParensNode.create(node));
110
112
  }
111
113
  },
114
+ cast(expr, dataType) {
115
+ return new expression_wrapper_js_1.ExpressionWrapper(cast_node_js_1.CastNode.create((0, reference_parser_js_1.parseReferenceExpression)(expr), (0, data_type_parser_js_1.parseDataTypeExpression)(dataType)));
116
+ },
112
117
  withSchema(schema) {
113
118
  return createExpressionBuilder(executor.withPluginAtFront(new with_schema_plugin_js_1.WithSchemaPlugin(schema)));
114
119
  },
@@ -20,6 +20,8 @@ export * from './query-builder/on-conflict-builder.js';
20
20
  export * from './query-builder/aggregate-function-builder.js';
21
21
  export * from './query-builder/case-builder.js';
22
22
  export * from './query-builder/json-path-builder.js';
23
+ export * from './query-builder/merge-query-builder.js';
24
+ export * from './query-builder/merge-result.js';
23
25
  export * from './raw-builder/raw-builder.js';
24
26
  export * from './raw-builder/sql.js';
25
27
  export * from './query-executor/query-executor.js';
@@ -177,6 +179,10 @@ export * from './operation-node/json-path-leg-node.js';
177
179
  export * from './operation-node/json-path-node.js';
178
180
  export * from './operation-node/json-operator-chain-node.js';
179
181
  export * from './operation-node/tuple-node.js';
182
+ export * from './operation-node/merge-query-node.js';
183
+ export * from './operation-node/matched-node.js';
184
+ export * from './operation-node/fetch-node.js';
185
+ export * from './operation-node/top-node.js';
180
186
  export * from './util/column-type.js';
181
187
  export * from './util/compilable.js';
182
188
  export * from './util/explainable.js';
@@ -188,7 +194,7 @@ export { logOnce } from './util/log-once.js';
188
194
  export { SelectExpression, SelectCallback, SelectArg, Selection, CallbackSelection, } from './parser/select-parser.js';
189
195
  export { ReferenceExpression, ReferenceExpressionOrList, SimpleReferenceExpression, StringReference, ExtractTypeFromStringReference, ExtractTypeFromReferenceExpression, } from './parser/reference-parser.js';
190
196
  export { ValueExpression, ValueExpressionOrList, } from './parser/value-parser.js';
191
- export { TableExpression, TableExpressionOrList, } from './parser/table-parser.js';
197
+ export { SimpleTableReference, TableExpression, TableExpressionOrList, } from './parser/table-parser.js';
192
198
  export { JoinReferenceExpression, JoinCallbackExpression, } from './parser/join-parser.js';
193
199
  export { InsertObject } from './parser/insert-values-parser.js';
194
200
  export { UpdateObject } from './parser/update-set-parser.js';
package/dist/cjs/index.js CHANGED
@@ -38,6 +38,8 @@ __exportStar(require("./query-builder/on-conflict-builder.js"), exports);
38
38
  __exportStar(require("./query-builder/aggregate-function-builder.js"), exports);
39
39
  __exportStar(require("./query-builder/case-builder.js"), exports);
40
40
  __exportStar(require("./query-builder/json-path-builder.js"), exports);
41
+ __exportStar(require("./query-builder/merge-query-builder.js"), exports);
42
+ __exportStar(require("./query-builder/merge-result.js"), exports);
41
43
  __exportStar(require("./raw-builder/raw-builder.js"), exports);
42
44
  __exportStar(require("./raw-builder/sql.js"), exports);
43
45
  __exportStar(require("./query-executor/query-executor.js"), exports);
@@ -195,6 +197,10 @@ __exportStar(require("./operation-node/json-path-leg-node.js"), exports);
195
197
  __exportStar(require("./operation-node/json-path-node.js"), exports);
196
198
  __exportStar(require("./operation-node/json-operator-chain-node.js"), exports);
197
199
  __exportStar(require("./operation-node/tuple-node.js"), exports);
200
+ __exportStar(require("./operation-node/merge-query-node.js"), exports);
201
+ __exportStar(require("./operation-node/matched-node.js"), exports);
202
+ __exportStar(require("./operation-node/fetch-node.js"), exports);
203
+ __exportStar(require("./operation-node/top-node.js"), exports);
198
204
  __exportStar(require("./util/column-type.js"), exports);
199
205
  __exportStar(require("./util/compilable.js"), exports);
200
206
  __exportStar(require("./util/explainable.js"), exports);
@@ -1,6 +1,7 @@
1
1
  import { Kysely } from '../kysely.js';
2
2
  export declare const DEFAULT_MIGRATION_TABLE = "kysely_migration";
3
3
  export declare const DEFAULT_MIGRATION_LOCK_TABLE = "kysely_migration_lock";
4
+ export declare const DEFAULT_ALLOW_UNORDERED_MIGRATIONS = false;
4
5
  export declare const MIGRATION_LOCK_ID = "migration_lock";
5
6
  export declare const NO_MIGRATIONS: NoMigrations;
6
7
  export interface Migration {
@@ -58,7 +59,7 @@ export declare class Migrator {
58
59
  * This method goes through all possible migrations provided by the provider and runs the
59
60
  * ones whose names come alphabetically after the last migration that has been run. If the
60
61
  * list of executed migrations doesn't match the beginning of the list of possible migrations
61
- * an error is thrown.
62
+ * an error is returned.
62
63
  *
63
64
  * ### Examples
64
65
  *
@@ -197,6 +198,20 @@ export interface MigratorProps {
197
198
  * This only works on postgres.
198
199
  */
199
200
  readonly migrationTableSchema?: string;
201
+ /**
202
+ * Enforces whether or not migrations must be run in alpha-numeric order.
203
+ *
204
+ * When false, migrations must be run in their exact alpha-numeric order.
205
+ * This is checked against the migrations already run in the database
206
+ * (`migrationTableName'). This ensures your migrations are always run in
207
+ * the same order and is the safest option.
208
+ *
209
+ * When true, migrations are still run in alpha-numeric order, but
210
+ * the order is not checked against already-run migrations in the database.
211
+ * Kysely will simply run all migrations that haven't run yet, in alpha-numeric
212
+ * order.
213
+ */
214
+ readonly allowUnorderedMigrations?: boolean;
200
215
  }
201
216
  /**
202
217
  * All migration methods ({@link Migrator.migrateTo | migrateTo},
@@ -231,12 +246,13 @@ export interface MigrationResultSet {
231
246
  */
232
247
  readonly results?: MigrationResult[];
233
248
  }
249
+ type MigrationDirection = 'Up' | 'Down';
234
250
  export interface MigrationResult {
235
251
  readonly migrationName: string;
236
252
  /**
237
253
  * The direction in which this migration was executed.
238
254
  */
239
- readonly direction: 'Up' | 'Down';
255
+ readonly direction: MigrationDirection;
240
256
  /**
241
257
  * The execution status.
242
258
  *
@@ -293,3 +309,4 @@ export interface MigrationInfo {
293
309
  */
294
310
  executedAt?: Date;
295
311
  }
312
+ export {};
@@ -1,11 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Migrator = exports.NO_MIGRATIONS = exports.MIGRATION_LOCK_ID = exports.DEFAULT_MIGRATION_LOCK_TABLE = exports.DEFAULT_MIGRATION_TABLE = void 0;
3
+ exports.Migrator = exports.NO_MIGRATIONS = exports.MIGRATION_LOCK_ID = exports.DEFAULT_ALLOW_UNORDERED_MIGRATIONS = exports.DEFAULT_MIGRATION_LOCK_TABLE = exports.DEFAULT_MIGRATION_TABLE = void 0;
4
4
  const noop_plugin_js_1 = require("../plugin/noop-plugin.js");
5
5
  const with_schema_plugin_js_1 = require("../plugin/with-schema/with-schema-plugin.js");
6
6
  const object_utils_js_1 = require("../util/object-utils.js");
7
7
  exports.DEFAULT_MIGRATION_TABLE = 'kysely_migration';
8
8
  exports.DEFAULT_MIGRATION_LOCK_TABLE = 'kysely_migration_lock';
9
+ exports.DEFAULT_ALLOW_UNORDERED_MIGRATIONS = false;
9
10
  exports.MIGRATION_LOCK_ID = 'migration_lock';
10
11
  exports.NO_MIGRATIONS = (0, object_utils_js_1.freeze)({ __noMigrations__: true });
11
12
  /**
@@ -72,7 +73,7 @@ class Migrator {
72
73
  * This method goes through all possible migrations provided by the provider and runs the
73
74
  * ones whose names come alphabetically after the last migration that has been run. If the
74
75
  * list of executed migrations doesn't match the beginning of the list of possible migrations
75
- * an error is thrown.
76
+ * an error is returned.
76
77
  *
77
78
  * ### Examples
78
79
  *
@@ -109,7 +110,7 @@ class Migrator {
109
110
  * ```
110
111
  */
111
112
  async migrateToLatest() {
112
- return this.#migrate(({ migrations }) => migrations.length - 1);
113
+ return this.#migrate(() => ({ direction: 'Up', step: Infinity }));
113
114
  }
114
115
  /**
115
116
  * Migrate up/down to a specific migration.
@@ -135,15 +136,27 @@ class Migrator {
135
136
  * ```
136
137
  */
137
138
  async migrateTo(targetMigrationName) {
138
- return this.#migrate(({ migrations }) => {
139
+ return this.#migrate(({ migrations, executedMigrations, pendingMigrations, }) => {
139
140
  if (targetMigrationName === exports.NO_MIGRATIONS) {
140
- return -1;
141
+ return { direction: 'Down', step: Infinity };
141
142
  }
142
- const index = migrations.findIndex((it) => it.name === targetMigrationName);
143
- if (index === -1) {
143
+ if (!migrations.find((m) => m.name === targetMigrationName)) {
144
144
  throw new Error(`migration "${targetMigrationName}" doesn't exist`);
145
145
  }
146
- return index;
146
+ const executedIndex = executedMigrations.indexOf(targetMigrationName);
147
+ const pendingIndex = pendingMigrations.findIndex((m) => m.name === targetMigrationName);
148
+ if (executedIndex !== -1) {
149
+ return {
150
+ direction: 'Down',
151
+ step: executedMigrations.length - executedIndex - 1,
152
+ };
153
+ }
154
+ else if (pendingIndex !== -1) {
155
+ return { direction: 'Up', step: pendingIndex + 1 };
156
+ }
157
+ else {
158
+ throw new Error(`migration "${targetMigrationName}" isn't executed or pending`);
159
+ }
147
160
  });
148
161
  }
149
162
  /**
@@ -161,7 +174,7 @@ class Migrator {
161
174
  * ```
162
175
  */
163
176
  async migrateUp() {
164
- return this.#migrate(({ currentIndex, migrations }) => Math.min(currentIndex + 1, migrations.length - 1));
177
+ return this.#migrate(() => ({ direction: 'Up', step: 1 }));
165
178
  }
166
179
  /**
167
180
  * Migrate one step down.
@@ -178,12 +191,12 @@ class Migrator {
178
191
  * ```
179
192
  */
180
193
  async migrateDown() {
181
- return this.#migrate(({ currentIndex }) => Math.max(currentIndex - 1, -1));
194
+ return this.#migrate(() => ({ direction: 'Down', step: 1 }));
182
195
  }
183
- async #migrate(getTargetMigrationIndex) {
196
+ async #migrate(getMigrationDirectionAndStep) {
184
197
  try {
185
198
  await this.#ensureMigrationTablesExists();
186
- return await this.#runMigrations(getTargetMigrationIndex);
199
+ return await this.#runMigrations(getMigrationDirectionAndStep);
187
200
  }
188
201
  catch (error) {
189
202
  if (error instanceof MigrationResultSetError) {
@@ -201,6 +214,9 @@ class Migrator {
201
214
  get #migrationLockTable() {
202
215
  return this.#props.migrationLockTableName ?? exports.DEFAULT_MIGRATION_LOCK_TABLE;
203
216
  }
217
+ get #allowUnorderedMigrations() {
218
+ return (this.#props.allowUnorderedMigrations ?? exports.DEFAULT_ALLOW_UNORDERED_MIGRATIONS);
219
+ }
204
220
  get #schemaPlugin() {
205
221
  if (this.#migrationTableSchema) {
206
222
  return new with_schema_plugin_js_1.WithSchemaPlugin(this.#migrationTableSchema);
@@ -311,7 +327,7 @@ class Migrator {
311
327
  .executeTakeFirst();
312
328
  return !!lockRow;
313
329
  }
314
- async #runMigrations(getTargetMigrationIndex) {
330
+ async #runMigrations(getMigrationDirectionAndStep) {
315
331
  const adapter = this.#props.db.getExecutor().adapter;
316
332
  const lockOptions = (0, object_utils_js_1.freeze)({
317
333
  lockTable: this.#props.migrationLockTableName ?? exports.DEFAULT_MIGRATION_LOCK_TABLE,
@@ -325,15 +341,15 @@ class Migrator {
325
341
  if (state.migrations.length === 0) {
326
342
  return { results: [] };
327
343
  }
328
- const targetIndex = getTargetMigrationIndex(state);
329
- if (targetIndex === undefined) {
344
+ const { direction, step } = getMigrationDirectionAndStep(state);
345
+ if (step <= 0) {
330
346
  return { results: [] };
331
347
  }
332
- if (targetIndex < state.currentIndex) {
333
- return await this.#migrateDown(db, state, targetIndex);
348
+ if (direction === 'Down') {
349
+ return await this.#migrateDown(db, state, step);
334
350
  }
335
- else if (targetIndex > state.currentIndex) {
336
- return await this.#migrateUp(db, state, targetIndex);
351
+ else if (direction === 'Up') {
352
+ return await this.#migrateUp(db, state, step);
337
353
  }
338
354
  return { results: [] };
339
355
  }
@@ -351,10 +367,21 @@ class Migrator {
351
367
  async #getState(db) {
352
368
  const migrations = await this.#resolveMigrations();
353
369
  const executedMigrations = await this.#getExecutedMigrations(db);
354
- this.#ensureMigrationsNotCorrupted(migrations, executedMigrations);
370
+ this.#ensureNoMissingMigrations(migrations, executedMigrations);
371
+ if (!this.#allowUnorderedMigrations) {
372
+ this.#ensureMigrationsInOrder(migrations, executedMigrations);
373
+ }
374
+ const pendingMigrations = this.#getPendingMigrations(migrations, executedMigrations);
355
375
  return (0, object_utils_js_1.freeze)({
356
376
  migrations,
357
- currentIndex: migrations.findIndex((it) => it.name === (0, object_utils_js_1.getLast)(executedMigrations)),
377
+ executedMigrations,
378
+ lastMigration: (0, object_utils_js_1.getLast)(executedMigrations),
379
+ pendingMigrations,
380
+ });
381
+ }
382
+ #getPendingMigrations(migrations, executedMigrations) {
383
+ return migrations.filter((migration) => {
384
+ return !executedMigrations.includes(migration.name);
358
385
  });
359
386
  }
360
387
  async #resolveMigrations() {
@@ -371,36 +398,43 @@ class Migrator {
371
398
  .withPlugin(this.#schemaPlugin)
372
399
  .selectFrom(this.#migrationTable)
373
400
  .select('name')
374
- .orderBy('name')
401
+ .orderBy(['timestamp', 'name'])
375
402
  .execute();
376
403
  return executedMigrations.map((it) => it.name);
377
404
  }
378
- #ensureMigrationsNotCorrupted(migrations, executedMigrations) {
405
+ #ensureNoMissingMigrations(migrations, executedMigrations) {
406
+ // Ensure all executed migrations exist in the `migrations` list.
379
407
  for (const executed of executedMigrations) {
380
408
  if (!migrations.some((it) => it.name === executed)) {
381
409
  throw new Error(`corrupted migrations: previously executed migration ${executed} is missing`);
382
410
  }
383
411
  }
384
- // Now we know all executed migrations exist in the `migrations` list.
385
- // Next we need to make sure that the executed migratiosns are the first
386
- // ones in the migration list.
412
+ }
413
+ #ensureMigrationsInOrder(migrations, executedMigrations) {
414
+ // Ensure the executed migrations are the first ones in the migration list.
387
415
  for (let i = 0; i < executedMigrations.length; ++i) {
388
416
  if (migrations[i].name !== executedMigrations[i]) {
389
417
  throw new Error(`corrupted migrations: expected previously executed migration ${executedMigrations[i]} to be at index ${i} but ${migrations[i].name} was found in its place. New migrations must always have a name that comes alphabetically after the last executed migration.`);
390
418
  }
391
419
  }
392
420
  }
393
- async #migrateDown(db, state, targetIndex) {
394
- const results = [];
395
- for (let i = state.currentIndex; i > targetIndex; --i) {
396
- results.push({
397
- migrationName: state.migrations[i].name,
421
+ async #migrateDown(db, state, step) {
422
+ const migrationsToRollback = state.executedMigrations
423
+ .slice()
424
+ .reverse()
425
+ .slice(0, step)
426
+ .map((name) => {
427
+ return state.migrations.find((it) => it.name === name);
428
+ });
429
+ const results = migrationsToRollback.map((migration) => {
430
+ return {
431
+ migrationName: migration.name,
398
432
  direction: 'Down',
399
433
  status: 'NotExecuted',
400
- });
401
- }
434
+ };
435
+ });
402
436
  for (let i = 0; i < results.length; ++i) {
403
- const migration = state.migrations.find((it) => it.name === results[i].migrationName);
437
+ const migration = migrationsToRollback[i];
404
438
  try {
405
439
  if (migration.down) {
406
440
  await migration.down(db);
@@ -430,17 +464,17 @@ class Migrator {
430
464
  }
431
465
  return { results };
432
466
  }
433
- async #migrateUp(db, state, targetIndex) {
434
- const results = [];
435
- for (let i = state.currentIndex + 1; i <= targetIndex; ++i) {
436
- results.push({
437
- migrationName: state.migrations[i].name,
467
+ async #migrateUp(db, state, step) {
468
+ const migrationsToRun = state.pendingMigrations.slice(0, step);
469
+ const results = migrationsToRun.map((migration) => {
470
+ return {
471
+ migrationName: migration.name,
438
472
  direction: 'Up',
439
473
  status: 'NotExecuted',
440
- });
441
- }
442
- for (let i = 0; i < results.length; ++i) {
443
- const migration = state.migrations.find((it) => it.name === results[i].migrationName);
474
+ };
475
+ });
476
+ for (let i = 0; i < results.length; i++) {
477
+ const migration = state.pendingMigrations[i];
444
478
  try {
445
479
  await migration.up(db);
446
480
  await db
@@ -13,7 +13,7 @@ exports.AddIndexNode = (0, object_utils_js_1.freeze)({
13
13
  create(name) {
14
14
  return (0, object_utils_js_1.freeze)({
15
15
  kind: 'AddIndexNode',
16
- name: identifier_node_js_1.IdentifierNode.create(name)
16
+ name: identifier_node_js_1.IdentifierNode.create(name),
17
17
  });
18
18
  },
19
19
  cloneWith(node, props) {
@@ -0,0 +1,13 @@
1
+ import { OperationNode } from './operation-node.js';
2
+ export interface CastNode extends OperationNode {
3
+ readonly kind: 'CastNode';
4
+ readonly expression: OperationNode;
5
+ readonly dataType: OperationNode;
6
+ }
7
+ /**
8
+ * @internal
9
+ */
10
+ export declare const CastNode: Readonly<{
11
+ is(node: OperationNode): node is CastNode;
12
+ create(expression: OperationNode, dataType: OperationNode): CastNode;
13
+ }>;