typeorm 0.3.6-dev.b84cb9b → 0.3.6-dev.bbdc20f

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