typeorm 0.3.6-dev.62518ae → 0.3.6-dev.78df84c

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 (170) hide show
  1. package/README.md +1 -1
  2. package/browser/cache/RedisQueryResultCache.js +3 -0
  3. package/browser/cache/RedisQueryResultCache.js.map +1 -1
  4. package/browser/decorator/options/ColumnOptions.d.ts +10 -2
  5. package/browser/decorator/options/ColumnOptions.js.map +1 -1
  6. package/browser/decorator/options/JoinColumnOptions.d.ts +4 -0
  7. package/browser/decorator/options/JoinColumnOptions.js.map +1 -1
  8. package/browser/decorator/options/PrimaryGeneratedColumnIdentityOptions.d.ts +4 -0
  9. package/browser/decorator/options/PrimaryGeneratedColumnIdentityOptions.js.map +1 -1
  10. package/browser/decorator/options/PrimaryGeneratedColumnNumericOptions.d.ts +4 -0
  11. package/browser/decorator/options/PrimaryGeneratedColumnNumericOptions.js.map +1 -1
  12. package/browser/decorator/options/PrimaryGeneratedColumnUUIDOptions.d.ts +4 -0
  13. package/browser/decorator/options/PrimaryGeneratedColumnUUIDOptions.js.map +1 -1
  14. package/browser/decorator/relations/JoinColumn.js +1 -0
  15. package/browser/decorator/relations/JoinColumn.js.map +1 -1
  16. package/browser/driver/cockroachdb/CockroachDriver.js +4 -1
  17. package/browser/driver/cockroachdb/CockroachDriver.js.map +1 -1
  18. package/browser/driver/cockroachdb/CockroachQueryRunner.d.ts +3 -3
  19. package/browser/driver/cockroachdb/CockroachQueryRunner.js +233 -33
  20. package/browser/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  21. package/browser/driver/mysql/MysqlDriver.d.ts +1 -0
  22. package/browser/driver/mysql/MysqlDriver.js +94 -23
  23. package/browser/driver/mysql/MysqlDriver.js.map +1 -1
  24. package/browser/driver/mysql/MysqlQueryRunner.js +219 -24
  25. package/browser/driver/mysql/MysqlQueryRunner.js.map +1 -1
  26. package/browser/driver/oracle/OracleDriver.js +79 -15
  27. package/browser/driver/oracle/OracleDriver.js.map +1 -1
  28. package/browser/driver/oracle/OracleQueryRunner.d.ts +3 -3
  29. package/browser/driver/oracle/OracleQueryRunner.js +216 -42
  30. package/browser/driver/oracle/OracleQueryRunner.js.map +1 -1
  31. package/browser/driver/postgres/PostgresDriver.js +95 -18
  32. package/browser/driver/postgres/PostgresDriver.js.map +1 -1
  33. package/browser/driver/postgres/PostgresQueryRunner.d.ts +3 -3
  34. package/browser/driver/postgres/PostgresQueryRunner.js +159 -59
  35. package/browser/driver/postgres/PostgresQueryRunner.js.map +1 -1
  36. package/browser/driver/spanner/SpannerDriver.d.ts +1 -0
  37. package/browser/driver/spanner/SpannerDriver.js +52 -13
  38. package/browser/driver/spanner/SpannerDriver.js.map +1 -1
  39. package/browser/driver/spanner/SpannerQueryRunner.js +129 -43
  40. package/browser/driver/spanner/SpannerQueryRunner.js.map +1 -1
  41. package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js +65 -16
  42. package/browser/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
  43. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +218 -32
  44. package/browser/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  45. package/browser/driver/sqlserver/SqlServerDriver.d.ts +3 -1
  46. package/browser/driver/sqlserver/SqlServerDriver.js +99 -26
  47. package/browser/driver/sqlserver/SqlServerDriver.js.map +1 -1
  48. package/browser/driver/sqlserver/SqlServerQueryRunner.d.ts +3 -3
  49. package/browser/driver/sqlserver/SqlServerQueryRunner.js +251 -37
  50. package/browser/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  51. package/browser/entity-schema/EntitySchemaColumnOptions.d.ts +2 -2
  52. package/browser/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
  53. package/browser/entity-schema/EntitySchemaTransformer.js +1 -0
  54. package/browser/entity-schema/EntitySchemaTransformer.js.map +1 -1
  55. package/browser/metadata/ColumnMetadata.d.ts +10 -2
  56. package/browser/metadata/ColumnMetadata.js +8 -0
  57. package/browser/metadata/ColumnMetadata.js.map +1 -1
  58. package/browser/metadata/ForeignKeyMetadata.d.ts +7 -0
  59. package/browser/metadata/ForeignKeyMetadata.js +4 -1
  60. package/browser/metadata/ForeignKeyMetadata.js.map +1 -1
  61. package/browser/metadata-args/JoinColumnMetadataArgs.d.ts +4 -0
  62. package/browser/metadata-args/JoinColumnMetadataArgs.js.map +1 -1
  63. package/browser/metadata-builder/EntityMetadataValidator.js +17 -0
  64. package/browser/metadata-builder/EntityMetadataValidator.js.map +1 -1
  65. package/browser/metadata-builder/JunctionEntityMetadataBuilder.js +5 -0
  66. package/browser/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
  67. package/browser/metadata-builder/RelationJoinColumnBuilder.js +2 -0
  68. package/browser/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
  69. package/browser/query-runner/BaseQueryRunner.d.ts +10 -0
  70. package/browser/query-runner/BaseQueryRunner.js +25 -1
  71. package/browser/query-runner/BaseQueryRunner.js.map +1 -1
  72. package/browser/query-runner/QueryRunner.d.ts +2 -2
  73. package/browser/query-runner/QueryRunner.js.map +1 -1
  74. package/browser/schema-builder/RdbmsSchemaBuilder.d.ts +6 -2
  75. package/browser/schema-builder/RdbmsSchemaBuilder.js +11 -5
  76. package/browser/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
  77. package/browser/schema-builder/options/TableColumnOptions.d.ts +10 -2
  78. package/browser/schema-builder/options/TableColumnOptions.js.map +1 -1
  79. package/browser/schema-builder/table/TableColumn.d.ts +6 -2
  80. package/browser/schema-builder/table/TableColumn.js +2 -0
  81. package/browser/schema-builder/table/TableColumn.js.map +1 -1
  82. package/browser/schema-builder/util/TableUtils.js +1 -0
  83. package/browser/schema-builder/util/TableUtils.js.map +1 -1
  84. package/cache/RedisQueryResultCache.js +3 -0
  85. package/cache/RedisQueryResultCache.js.map +1 -1
  86. package/commands/InitCommand.js +1 -1
  87. package/commands/InitCommand.js.map +1 -1
  88. package/commands/MigrationGenerateCommand.js +3 -2
  89. package/commands/MigrationGenerateCommand.js.map +1 -1
  90. package/decorator/options/ColumnOptions.d.ts +10 -2
  91. package/decorator/options/ColumnOptions.js.map +1 -1
  92. package/decorator/options/JoinColumnOptions.d.ts +4 -0
  93. package/decorator/options/JoinColumnOptions.js.map +1 -1
  94. package/decorator/options/PrimaryGeneratedColumnIdentityOptions.d.ts +4 -0
  95. package/decorator/options/PrimaryGeneratedColumnIdentityOptions.js.map +1 -1
  96. package/decorator/options/PrimaryGeneratedColumnNumericOptions.d.ts +4 -0
  97. package/decorator/options/PrimaryGeneratedColumnNumericOptions.js.map +1 -1
  98. package/decorator/options/PrimaryGeneratedColumnUUIDOptions.d.ts +4 -0
  99. package/decorator/options/PrimaryGeneratedColumnUUIDOptions.js.map +1 -1
  100. package/decorator/relations/JoinColumn.js +1 -0
  101. package/decorator/relations/JoinColumn.js.map +1 -1
  102. package/driver/cockroachdb/CockroachDriver.js +4 -1
  103. package/driver/cockroachdb/CockroachDriver.js.map +1 -1
  104. package/driver/cockroachdb/CockroachQueryRunner.d.ts +3 -3
  105. package/driver/cockroachdb/CockroachQueryRunner.js +233 -33
  106. package/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
  107. package/driver/mysql/MysqlDriver.d.ts +1 -0
  108. package/driver/mysql/MysqlDriver.js +94 -23
  109. package/driver/mysql/MysqlDriver.js.map +1 -1
  110. package/driver/mysql/MysqlQueryRunner.js +219 -24
  111. package/driver/mysql/MysqlQueryRunner.js.map +1 -1
  112. package/driver/oracle/OracleDriver.js +79 -15
  113. package/driver/oracle/OracleDriver.js.map +1 -1
  114. package/driver/oracle/OracleQueryRunner.d.ts +3 -3
  115. package/driver/oracle/OracleQueryRunner.js +216 -42
  116. package/driver/oracle/OracleQueryRunner.js.map +1 -1
  117. package/driver/postgres/PostgresDriver.js +95 -18
  118. package/driver/postgres/PostgresDriver.js.map +1 -1
  119. package/driver/postgres/PostgresQueryRunner.d.ts +3 -3
  120. package/driver/postgres/PostgresQueryRunner.js +159 -59
  121. package/driver/postgres/PostgresQueryRunner.js.map +1 -1
  122. package/driver/spanner/SpannerDriver.d.ts +1 -0
  123. package/driver/spanner/SpannerDriver.js +52 -13
  124. package/driver/spanner/SpannerDriver.js.map +1 -1
  125. package/driver/spanner/SpannerQueryRunner.js +129 -43
  126. package/driver/spanner/SpannerQueryRunner.js.map +1 -1
  127. package/driver/sqlite-abstract/AbstractSqliteDriver.js +65 -16
  128. package/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
  129. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js +218 -32
  130. package/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
  131. package/driver/sqlserver/SqlServerDriver.d.ts +3 -1
  132. package/driver/sqlserver/SqlServerDriver.js +99 -26
  133. package/driver/sqlserver/SqlServerDriver.js.map +1 -1
  134. package/driver/sqlserver/SqlServerQueryRunner.d.ts +3 -3
  135. package/driver/sqlserver/SqlServerQueryRunner.js +251 -37
  136. package/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
  137. package/entity-schema/EntitySchemaColumnOptions.d.ts +2 -2
  138. package/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
  139. package/entity-schema/EntitySchemaTransformer.js +1 -0
  140. package/entity-schema/EntitySchemaTransformer.js.map +1 -1
  141. package/metadata/ColumnMetadata.d.ts +10 -2
  142. package/metadata/ColumnMetadata.js +8 -0
  143. package/metadata/ColumnMetadata.js.map +1 -1
  144. package/metadata/ForeignKeyMetadata.d.ts +7 -0
  145. package/metadata/ForeignKeyMetadata.js +4 -1
  146. package/metadata/ForeignKeyMetadata.js.map +1 -1
  147. package/metadata-args/JoinColumnMetadataArgs.d.ts +4 -0
  148. package/metadata-args/JoinColumnMetadataArgs.js.map +1 -1
  149. package/metadata-builder/EntityMetadataValidator.js +17 -0
  150. package/metadata-builder/EntityMetadataValidator.js.map +1 -1
  151. package/metadata-builder/JunctionEntityMetadataBuilder.js +5 -0
  152. package/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
  153. package/metadata-builder/RelationJoinColumnBuilder.js +2 -0
  154. package/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
  155. package/package.json +1 -1
  156. package/query-runner/BaseQueryRunner.d.ts +10 -0
  157. package/query-runner/BaseQueryRunner.js +25 -1
  158. package/query-runner/BaseQueryRunner.js.map +1 -1
  159. package/query-runner/QueryRunner.d.ts +2 -2
  160. package/query-runner/QueryRunner.js.map +1 -1
  161. package/schema-builder/RdbmsSchemaBuilder.d.ts +6 -2
  162. package/schema-builder/RdbmsSchemaBuilder.js +11 -5
  163. package/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
  164. package/schema-builder/options/TableColumnOptions.d.ts +10 -2
  165. package/schema-builder/options/TableColumnOptions.js.map +1 -1
  166. package/schema-builder/table/TableColumn.d.ts +6 -2
  167. package/schema-builder/table/TableColumn.js +2 -0
  168. package/schema-builder/table/TableColumn.js.map +1 -1
  169. package/schema-builder/util/TableUtils.js +1 -0
  170. package/schema-builder/util/TableUtils.js.map +1 -1
@@ -180,7 +180,7 @@ class AbstractSqliteQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
180
180
  const tableName = InstanceChecker_1.InstanceChecker.isTable(tableOrName)
181
181
  ? tableOrName.name
182
182
  : tableOrName;
183
- const sql = `PRAGMA table_info(${this.escapePath(tableName)})`;
183
+ const sql = `PRAGMA table_xinfo(${this.escapePath(tableName)})`;
184
184
  const columns = await this.query(sql);
185
185
  return !!columns.find((column) => column["name"] === columnName);
186
186
  }
@@ -230,6 +230,23 @@ class AbstractSqliteQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
230
230
  downQueries.push(this.dropIndexSql(index));
231
231
  });
232
232
  }
233
+ // if table have column with generated type, we must add the expression to the metadata table
234
+ const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
235
+ for (const column of generatedColumns) {
236
+ const insertQuery = this.insertTypeormMetadataSql({
237
+ table: table.name,
238
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
239
+ name: column.name,
240
+ value: column.asExpression,
241
+ });
242
+ const deleteQuery = this.deleteTypeormMetadataSql({
243
+ table: table.name,
244
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
245
+ name: column.name,
246
+ });
247
+ upQueries.push(insertQuery);
248
+ downQueries.push(deleteQuery);
249
+ }
233
250
  await this.executeQueries(upQueries, downQueries);
234
251
  }
235
252
  /**
@@ -256,6 +273,23 @@ class AbstractSqliteQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
256
273
  }
257
274
  upQueries.push(this.dropTableSql(table, ifExist));
258
275
  downQueries.push(this.createTableSql(table, createForeignKeys));
276
+ // if table had columns with generated type, we must remove the expression from the metadata table
277
+ const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
278
+ for (const column of generatedColumns) {
279
+ const deleteQuery = this.deleteTypeormMetadataSql({
280
+ table: table.name,
281
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
282
+ name: column.name,
283
+ });
284
+ const insertQuery = this.insertTypeormMetadataSql({
285
+ table: table.name,
286
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
287
+ name: column.name,
288
+ value: column.asExpression,
289
+ });
290
+ upQueries.push(deleteQuery);
291
+ downQueries.push(insertQuery);
292
+ }
259
293
  await this.executeQueries(upQueries, downQueries);
260
294
  }
261
295
  /**
@@ -297,20 +331,32 @@ class AbstractSqliteQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
297
331
  const up = new Query_1.Query(`ALTER TABLE ${this.escapePath(oldTable.name)} RENAME TO ${this.escapePath(newTableName)}`);
298
332
  const down = new Query_1.Query(`ALTER TABLE ${this.escapePath(newTableName)} RENAME TO ${this.escapePath(oldTable.name)}`);
299
333
  await this.executeQueries(up, down);
300
- // rename old table;
301
- oldTable.name = newTable.name;
302
334
  // rename unique constraints
303
335
  newTable.uniques.forEach((unique) => {
336
+ const oldUniqueName = this.connection.namingStrategy.uniqueConstraintName(oldTable, unique.columnNames);
337
+ // Skip renaming if Unique has user defined constraint name
338
+ if (unique.name !== oldUniqueName)
339
+ return;
304
340
  unique.name = this.connection.namingStrategy.uniqueConstraintName(newTable, unique.columnNames);
305
341
  });
306
342
  // rename foreign key constraints
307
343
  newTable.foreignKeys.forEach((foreignKey) => {
344
+ const oldForeignKeyName = this.connection.namingStrategy.foreignKeyName(oldTable, foreignKey.columnNames, this.getTablePath(foreignKey), foreignKey.referencedColumnNames);
345
+ // Skip renaming if foreign key has user defined constraint name
346
+ if (foreignKey.name !== oldForeignKeyName)
347
+ return;
308
348
  foreignKey.name = this.connection.namingStrategy.foreignKeyName(newTable, foreignKey.columnNames, this.getTablePath(foreignKey), foreignKey.referencedColumnNames);
309
349
  });
310
350
  // rename indices
311
351
  newTable.indices.forEach((index) => {
352
+ const oldIndexName = this.connection.namingStrategy.indexName(oldTable, index.columnNames, index.where);
353
+ // Skip renaming if Index has user defined constraint name
354
+ if (index.name !== oldIndexName)
355
+ return;
312
356
  index.name = this.connection.namingStrategy.indexName(newTable, index.columnNames, index.where);
313
357
  });
358
+ // rename old table;
359
+ oldTable.name = newTable.name;
314
360
  // recreate table with new constraint names
315
361
  await this.recreateTable(newTable, oldTable);
316
362
  }
@@ -385,24 +431,38 @@ class AbstractSqliteQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
385
431
  changedTable
386
432
  .findColumnUniques(changedColumnSet.oldColumn)
387
433
  .forEach((unique) => {
434
+ const uniqueName = this.connection.namingStrategy.uniqueConstraintName(table, unique.columnNames);
388
435
  unique.columnNames.splice(unique.columnNames.indexOf(changedColumnSet.oldColumn.name), 1);
389
436
  unique.columnNames.push(changedColumnSet.newColumn.name);
390
- unique.name =
391
- this.connection.namingStrategy.uniqueConstraintName(changedTable, unique.columnNames);
437
+ // rename Unique only if it has default constraint name
438
+ if (unique.name === uniqueName) {
439
+ unique.name =
440
+ this.connection.namingStrategy.uniqueConstraintName(changedTable, unique.columnNames);
441
+ }
392
442
  });
393
443
  changedTable
394
444
  .findColumnForeignKeys(changedColumnSet.oldColumn)
395
- .forEach((fk) => {
396
- fk.columnNames.splice(fk.columnNames.indexOf(changedColumnSet.oldColumn.name), 1);
397
- fk.columnNames.push(changedColumnSet.newColumn.name);
398
- fk.name = this.connection.namingStrategy.foreignKeyName(changedTable, fk.columnNames, this.getTablePath(fk), fk.referencedColumnNames);
445
+ .forEach((foreignKey) => {
446
+ const foreignKeyName = this.connection.namingStrategy.foreignKeyName(table, foreignKey.columnNames, this.getTablePath(foreignKey), foreignKey.referencedColumnNames);
447
+ foreignKey.columnNames.splice(foreignKey.columnNames.indexOf(changedColumnSet.oldColumn.name), 1);
448
+ foreignKey.columnNames.push(changedColumnSet.newColumn.name);
449
+ // rename FK only if it has default constraint name
450
+ if (foreignKey.name === foreignKeyName) {
451
+ foreignKey.name =
452
+ this.connection.namingStrategy.foreignKeyName(changedTable, foreignKey.columnNames, this.getTablePath(foreignKey), foreignKey.referencedColumnNames);
453
+ }
399
454
  });
400
455
  changedTable
401
456
  .findColumnIndices(changedColumnSet.oldColumn)
402
457
  .forEach((index) => {
458
+ const indexName = this.connection.namingStrategy.indexName(table, index.columnNames, index.where);
403
459
  index.columnNames.splice(index.columnNames.indexOf(changedColumnSet.oldColumn.name), 1);
404
460
  index.columnNames.push(changedColumnSet.newColumn.name);
405
- index.name = this.connection.namingStrategy.indexName(changedTable, index.columnNames, index.where);
461
+ // rename Index only if it has default constraint name
462
+ if (index.name === indexName) {
463
+ index.name =
464
+ this.connection.namingStrategy.indexName(changedTable, index.columnNames, index.where);
465
+ }
406
466
  });
407
467
  }
408
468
  const originalColumn = changedTable.columns.find((column) => column.name === changedColumnSet.oldColumn.name);
@@ -828,7 +888,7 @@ class AbstractSqliteQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
828
888
  const sql = dbTable["sql"];
829
889
  // load columns and indices
830
890
  const [dbColumns, dbIndices, dbForeignKeys] = await Promise.all([
831
- this.loadPragmaRecords(tablePath, `table_info`),
891
+ this.loadPragmaRecords(tablePath, `table_xinfo`),
832
892
  this.loadPragmaRecords(tablePath, `index_list`),
833
893
  this.loadPragmaRecords(tablePath, `foreign_key_list`),
834
894
  ]);
@@ -860,7 +920,7 @@ class AbstractSqliteQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
860
920
  }
861
921
  }
862
922
  // create columns from the loaded columns
863
- table.columns = dbColumns.map((dbColumn) => {
923
+ table.columns = await Promise.all(dbColumns.map(async (dbColumn) => {
864
924
  const tableColumn = new TableColumn_1.TableColumn();
865
925
  tableColumn.name = dbColumn["name"];
866
926
  tableColumn.type = dbColumn["type"].toLowerCase();
@@ -878,6 +938,23 @@ class AbstractSqliteQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
878
938
  if (tableColumn.isGenerated) {
879
939
  tableColumn.generationStrategy = "increment";
880
940
  }
941
+ if (dbColumn["hidden"] === 2 ||
942
+ dbColumn["hidden"] === 3) {
943
+ tableColumn.generatedType =
944
+ dbColumn["hidden"] === 2 ? "VIRTUAL" : "STORED";
945
+ const asExpressionQuery = await this.selectTypeormMetadataSql({
946
+ table: table.name,
947
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
948
+ name: tableColumn.name,
949
+ });
950
+ const results = await this.query(asExpressionQuery.query, asExpressionQuery.parameters);
951
+ if (results[0] && results[0].value) {
952
+ tableColumn.asExpression = results[0].value;
953
+ }
954
+ else {
955
+ tableColumn.asExpression = "";
956
+ }
957
+ }
881
958
  if (tableColumn.type === "varchar") {
882
959
  // Check if this is an enum
883
960
  const enumMatch = sql.match(new RegExp('"(' +
@@ -917,7 +994,20 @@ class AbstractSqliteQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
917
994
  }
918
995
  }
919
996
  return tableColumn;
920
- });
997
+ }));
998
+ // find unique constraints from CREATE TABLE sql
999
+ let fkResult;
1000
+ const fkMappings = [];
1001
+ const fkRegex = /CONSTRAINT "([^"]*)" FOREIGN KEY \((.*?)\) REFERENCES "([^"]*)" /g;
1002
+ while ((fkResult = fkRegex.exec(sql)) !== null) {
1003
+ fkMappings.push({
1004
+ name: fkResult[1],
1005
+ columns: fkResult[2]
1006
+ .substr(1, fkResult[2].length - 2)
1007
+ .split(`", "`),
1008
+ referencedTableName: fkResult[3],
1009
+ });
1010
+ }
921
1011
  // build foreign keys
922
1012
  const tableForeignKeyConstraints = OrmUtils_1.OrmUtils.uniq(dbForeignKeys, (dbForeignKey) => dbForeignKey["id"]);
923
1013
  table.foreignKeys = tableForeignKeyConstraints.map((foreignKey) => {
@@ -925,10 +1015,12 @@ class AbstractSqliteQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
925
1015
  dbForeignKey["table"] === foreignKey["table"]);
926
1016
  const columnNames = ownForeignKeys.map((dbForeignKey) => dbForeignKey["from"]);
927
1017
  const referencedColumnNames = ownForeignKeys.map((dbForeignKey) => dbForeignKey["to"]);
928
- // build foreign key name, because we can not get it directly.
929
- const fkName = this.connection.namingStrategy.foreignKeyName(table, columnNames, foreignKey.referencedTableName, foreignKey.referencedColumnNames);
1018
+ // find related foreign key mapping
1019
+ const fkMapping = fkMappings.find((it) => it.referencedTableName ===
1020
+ foreignKey["table"] &&
1021
+ it.columns.every((column) => columnNames.indexOf(column) !== -1));
930
1022
  return new TableForeignKey_1.TableForeignKey({
931
- name: fkName,
1023
+ name: fkMapping.name,
932
1024
  columnNames: columnNames,
933
1025
  referencedTableName: foreignKey["table"],
934
1026
  referencedColumnNames: referencedColumnNames,
@@ -1211,8 +1303,13 @@ class AbstractSqliteQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1211
1303
  c += " COLLATE " + column.collation;
1212
1304
  if (column.isNullable !== true)
1213
1305
  c += " NOT NULL";
1214
- if (column.default !== undefined && column.default !== null)
1215
- c += " DEFAULT (" + column.default + ")";
1306
+ if (column.asExpression) {
1307
+ c += ` AS (${column.asExpression}) ${column.generatedType ? column.generatedType : "VIRTUAL"}`;
1308
+ }
1309
+ else {
1310
+ if (column.default !== undefined && column.default !== null)
1311
+ c += " DEFAULT (" + column.default + ")";
1312
+ }
1216
1313
  return c;
1217
1314
  }
1218
1315
  async recreateTable(newTable, oldTable, migrateData = true) {
@@ -1233,29 +1330,31 @@ class AbstractSqliteQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1233
1330
  // migrate all data from the old table into new table
1234
1331
  if (migrateData) {
1235
1332
  let newColumnNames = newTable.columns
1236
- .map((column) => `"${column.name}"`)
1237
- .join(", ");
1333
+ .filter((column) => !column.generatedType)
1334
+ .map((column) => `"${column.name}"`);
1238
1335
  let oldColumnNames = oldTable.columns
1239
- .map((column) => `"${column.name}"`)
1240
- .join(", ");
1241
- if (oldTable.columns.length < newTable.columns.length) {
1336
+ .filter((column) => !column.generatedType)
1337
+ .map((column) => `"${column.name}"`);
1338
+ if (oldColumnNames.length < newColumnNames.length) {
1242
1339
  newColumnNames = newTable.columns
1243
1340
  .filter((column) => {
1244
- return oldTable.columns.find((c) => c.name === column.name);
1341
+ const oldColumn = oldTable.columns.find((c) => c.name === column.name);
1342
+ if (oldColumn && oldColumn.generatedType)
1343
+ return false;
1344
+ return !column.generatedType && oldColumn;
1245
1345
  })
1246
- .map((column) => `"${column.name}"`)
1247
- .join(", ");
1346
+ .map((column) => `"${column.name}"`);
1248
1347
  }
1249
- else if (oldTable.columns.length > newTable.columns.length) {
1348
+ else if (oldColumnNames.length > newColumnNames.length) {
1250
1349
  oldColumnNames = oldTable.columns
1251
1350
  .filter((column) => {
1252
- return newTable.columns.find((c) => c.name === column.name);
1351
+ return (!column.generatedType &&
1352
+ newTable.columns.find((c) => c.name === column.name));
1253
1353
  })
1254
- .map((column) => `"${column.name}"`)
1255
- .join(", ");
1354
+ .map((column) => `"${column.name}"`);
1256
1355
  }
1257
- upQueries.push(new Query_1.Query(`INSERT INTO ${this.escapePath(newTable.name)}(${newColumnNames}) SELECT ${oldColumnNames} FROM ${this.escapePath(oldTable.name)}`));
1258
- downQueries.push(new Query_1.Query(`INSERT INTO ${this.escapePath(oldTable.name)}(${oldColumnNames}) SELECT ${newColumnNames} FROM ${this.escapePath(newTable.name)}`));
1356
+ upQueries.push(new Query_1.Query(`INSERT INTO ${this.escapePath(newTable.name)}(${newColumnNames.join(", ")}) SELECT ${oldColumnNames.join(", ")} FROM ${this.escapePath(oldTable.name)}`));
1357
+ downQueries.push(new Query_1.Query(`INSERT INTO ${this.escapePath(oldTable.name)}(${oldColumnNames.join(", ")}) SELECT ${newColumnNames.join(", ")} FROM ${this.escapePath(newTable.name)}`));
1259
1358
  }
1260
1359
  // drop old table
1261
1360
  upQueries.push(this.dropTableSql(oldTable));
@@ -1272,6 +1371,93 @@ class AbstractSqliteQueryRunner extends BaseQueryRunner_1.BaseQueryRunner {
1272
1371
  upQueries.push(this.createIndexSql(newTable, index));
1273
1372
  downQueries.push(this.dropIndexSql(index));
1274
1373
  });
1374
+ // update generated columns in "typeorm_metadata" table
1375
+ // Step 1: clear data for removed generated columns
1376
+ oldTable.columns
1377
+ .filter((column) => {
1378
+ const newTableColumn = newTable.columns.find((c) => c.name === column.name);
1379
+ // we should delete record from "typeorm_metadata" if generated column was removed
1380
+ // or it was changed to non-generated
1381
+ return (column.generatedType &&
1382
+ column.asExpression &&
1383
+ (!newTableColumn ||
1384
+ (!newTableColumn.generatedType &&
1385
+ !newTableColumn.asExpression)));
1386
+ })
1387
+ .forEach((column) => {
1388
+ const deleteQuery = this.deleteTypeormMetadataSql({
1389
+ table: oldTable.name,
1390
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1391
+ name: column.name,
1392
+ });
1393
+ const insertQuery = this.insertTypeormMetadataSql({
1394
+ table: oldTable.name,
1395
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1396
+ name: column.name,
1397
+ value: column.asExpression,
1398
+ });
1399
+ upQueries.push(deleteQuery);
1400
+ downQueries.push(insertQuery);
1401
+ });
1402
+ // Step 2: add data for new generated columns
1403
+ newTable.columns
1404
+ .filter((column) => column.generatedType &&
1405
+ column.asExpression &&
1406
+ !oldTable.columns.some((c) => c.name === column.name))
1407
+ .forEach((column) => {
1408
+ const insertQuery = this.insertTypeormMetadataSql({
1409
+ table: newTable.name,
1410
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1411
+ name: column.name,
1412
+ value: column.asExpression,
1413
+ });
1414
+ const deleteQuery = this.deleteTypeormMetadataSql({
1415
+ table: newTable.name,
1416
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1417
+ name: column.name,
1418
+ });
1419
+ upQueries.push(insertQuery);
1420
+ downQueries.push(deleteQuery);
1421
+ });
1422
+ // Step 3: update changed expressions
1423
+ newTable.columns
1424
+ .filter((column) => column.generatedType && column.asExpression)
1425
+ .forEach((column) => {
1426
+ const oldColumn = oldTable.columns.find((c) => c.name === column.name &&
1427
+ c.generatedType &&
1428
+ column.generatedType &&
1429
+ c.asExpression !== column.asExpression);
1430
+ if (!oldColumn)
1431
+ return;
1432
+ // update expression
1433
+ const deleteQuery = this.deleteTypeormMetadataSql({
1434
+ table: oldTable.name,
1435
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1436
+ name: oldColumn.name,
1437
+ });
1438
+ const insertQuery = this.insertTypeormMetadataSql({
1439
+ table: newTable.name,
1440
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1441
+ name: column.name,
1442
+ value: column.asExpression,
1443
+ });
1444
+ upQueries.push(deleteQuery);
1445
+ upQueries.push(insertQuery);
1446
+ // revert update
1447
+ const revertInsertQuery = this.insertTypeormMetadataSql({
1448
+ table: newTable.name,
1449
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1450
+ name: oldColumn.name,
1451
+ value: oldColumn.asExpression,
1452
+ });
1453
+ const revertDeleteQuery = this.deleteTypeormMetadataSql({
1454
+ table: oldTable.name,
1455
+ type: MetadataTableType_1.MetadataTableType.GENERATED_COLUMN,
1456
+ name: column.name,
1457
+ });
1458
+ downQueries.push(revertInsertQuery);
1459
+ downQueries.push(revertDeleteQuery);
1460
+ });
1275
1461
  await this.executeQueries(upQueries, downQueries);
1276
1462
  this.replaceCachedTable(oldTable, newTable);
1277
1463
  }