@contember/schema-migrations 1.3.0-alpha.7 → 1.3.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/dist/src/MigrationDescriber.d.ts +4 -4
  2. package/dist/src/MigrationDescriber.d.ts.map +1 -1
  3. package/dist/src/MigrationDescriber.js +8 -7
  4. package/dist/src/MigrationDescriber.js.map +1 -1
  5. package/dist/src/SchemaDiffer.d.ts +1 -1
  6. package/dist/src/SchemaDiffer.d.ts.map +1 -1
  7. package/dist/src/SchemaDiffer.js +10 -2
  8. package/dist/src/SchemaDiffer.js.map +1 -1
  9. package/dist/src/SchemaMigrator.d.ts +1 -2
  10. package/dist/src/SchemaMigrator.d.ts.map +1 -1
  11. package/dist/src/SchemaMigrator.js +0 -1
  12. package/dist/src/SchemaMigrator.js.map +1 -1
  13. package/dist/src/modifications/ModificationHandler.d.ts +10 -6
  14. package/dist/src/modifications/ModificationHandler.d.ts.map +1 -1
  15. package/dist/src/modifications/ModificationHandler.js.map +1 -1
  16. package/dist/src/modifications/ModificationHandlerFactory.d.ts +2 -2
  17. package/dist/src/modifications/ModificationHandlerFactory.d.ts.map +1 -1
  18. package/dist/src/modifications/ModificationHandlerFactory.js +3 -2
  19. package/dist/src/modifications/ModificationHandlerFactory.js.map +1 -1
  20. package/dist/src/modifications/ModificationVersions.d.ts +4 -3
  21. package/dist/src/modifications/ModificationVersions.d.ts.map +1 -1
  22. package/dist/src/modifications/ModificationVersions.js +5 -4
  23. package/dist/src/modifications/ModificationVersions.js.map +1 -1
  24. package/dist/src/modifications/columns/CreateColumnModification.d.ts +2 -2
  25. package/dist/src/modifications/columns/CreateColumnModification.d.ts.map +1 -1
  26. package/dist/src/modifications/columns/CreateColumnModification.js +14 -24
  27. package/dist/src/modifications/columns/CreateColumnModification.js.map +1 -1
  28. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.d.ts +5 -3
  29. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.d.ts.map +1 -1
  30. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.js +19 -4
  31. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.js.map +1 -1
  32. package/dist/src/modifications/columns/columnUtils.d.ts +14 -0
  33. package/dist/src/modifications/columns/columnUtils.d.ts.map +1 -0
  34. package/dist/src/modifications/columns/columnUtils.js +29 -0
  35. package/dist/src/modifications/columns/columnUtils.js.map +1 -0
  36. package/dist/src/modifications/constraints/CreateUniqueConstraintModification.d.ts +3 -3
  37. package/dist/src/modifications/constraints/CreateUniqueConstraintModification.d.ts.map +1 -1
  38. package/dist/src/modifications/constraints/CreateUniqueConstraintModification.js +20 -32
  39. package/dist/src/modifications/constraints/CreateUniqueConstraintModification.js.map +1 -1
  40. package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.d.ts +11 -5
  41. package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.d.ts.map +1 -1
  42. package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.js +37 -9
  43. package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.js.map +1 -1
  44. package/dist/src/modifications/constraints/utils.d.ts +7 -0
  45. package/dist/src/modifications/constraints/utils.d.ts.map +1 -0
  46. package/dist/src/modifications/constraints/utils.js +33 -0
  47. package/dist/src/modifications/constraints/utils.js.map +1 -0
  48. package/dist/src/modifications/entities/CreateEntityModification.d.ts +4 -4
  49. package/dist/src/modifications/entities/CreateEntityModification.d.ts.map +1 -1
  50. package/dist/src/modifications/entities/CreateEntityModification.js +18 -14
  51. package/dist/src/modifications/entities/CreateEntityModification.js.map +1 -1
  52. package/dist/src/modifications/entities/CreateViewModification.d.ts +2 -2
  53. package/dist/src/modifications/entities/CreateViewModification.d.ts.map +1 -1
  54. package/dist/src/modifications/entities/CreateViewModification.js +14 -10
  55. package/dist/src/modifications/entities/CreateViewModification.js.map +1 -1
  56. package/dist/src/modifications/entities/RemoveEntityModification.d.ts +3 -4
  57. package/dist/src/modifications/entities/RemoveEntityModification.d.ts.map +1 -1
  58. package/dist/src/modifications/entities/RemoveEntityModification.js +3 -2
  59. package/dist/src/modifications/entities/RemoveEntityModification.js.map +1 -1
  60. package/dist/src/modifications/entities/ToggleEventLogModification.d.ts +2 -2
  61. package/dist/src/modifications/entities/ToggleEventLogModification.d.ts.map +1 -1
  62. package/dist/src/modifications/entities/ToggleEventLogModification.js +3 -3
  63. package/dist/src/modifications/entities/ToggleEventLogModification.js.map +1 -1
  64. package/dist/src/modifications/entities/UpdateEntityNameModification.d.ts +4 -5
  65. package/dist/src/modifications/entities/UpdateEntityNameModification.d.ts.map +1 -1
  66. package/dist/src/modifications/entities/UpdateEntityNameModification.js +3 -34
  67. package/dist/src/modifications/entities/UpdateEntityNameModification.js.map +1 -1
  68. package/dist/src/modifications/fields/RemoveFieldModification.js.map +1 -1
  69. package/dist/src/modifications/fields/UpdateFieldNameModification.d.ts +4 -5
  70. package/dist/src/modifications/fields/UpdateFieldNameModification.d.ts.map +1 -1
  71. package/dist/src/modifications/fields/UpdateFieldNameModification.js +18 -42
  72. package/dist/src/modifications/fields/UpdateFieldNameModification.js.map +1 -1
  73. package/dist/src/modifications/indexes/CreateIndexModification.d.ts +5 -5
  74. package/dist/src/modifications/indexes/CreateIndexModification.d.ts.map +1 -1
  75. package/dist/src/modifications/indexes/CreateIndexModification.js +24 -35
  76. package/dist/src/modifications/indexes/CreateIndexModification.js.map +1 -1
  77. package/dist/src/modifications/indexes/RemoveIndexModification.d.ts +12 -6
  78. package/dist/src/modifications/indexes/RemoveIndexModification.d.ts.map +1 -1
  79. package/dist/src/modifications/indexes/RemoveIndexModification.js +36 -10
  80. package/dist/src/modifications/indexes/RemoveIndexModification.js.map +1 -1
  81. package/dist/src/modifications/indexes/utils.d.ts +7 -0
  82. package/dist/src/modifications/indexes/utils.d.ts.map +1 -0
  83. package/dist/src/modifications/indexes/utils.js +33 -0
  84. package/dist/src/modifications/indexes/utils.js.map +1 -0
  85. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts +3 -4
  86. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts.map +1 -1
  87. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js +10 -10
  88. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js.map +1 -1
  89. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.d.ts +3 -4
  90. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.d.ts.map +1 -1
  91. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.js +14 -12
  92. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.js.map +1 -1
  93. package/dist/src/modifications/relations/CreateRelationModification.d.ts +4 -5
  94. package/dist/src/modifications/relations/CreateRelationModification.d.ts.map +1 -1
  95. package/dist/src/modifications/relations/CreateRelationModification.js +13 -17
  96. package/dist/src/modifications/relations/CreateRelationModification.js.map +1 -1
  97. package/dist/src/modifications/relations/ToggleJunctionEventLogModification.d.ts +3 -4
  98. package/dist/src/modifications/relations/ToggleJunctionEventLogModification.d.ts.map +1 -1
  99. package/dist/src/modifications/relations/ToggleJunctionEventLogModification.js +4 -5
  100. package/dist/src/modifications/relations/ToggleJunctionEventLogModification.js.map +1 -1
  101. package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.d.ts +2 -2
  102. package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.d.ts.map +1 -1
  103. package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.js +3 -3
  104. package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.js.map +1 -1
  105. package/dist/src/modifications/relations/helpers.d.ts +4 -1
  106. package/dist/src/modifications/relations/helpers.d.ts.map +1 -1
  107. package/dist/src/modifications/relations/helpers.js +20 -17
  108. package/dist/src/modifications/relations/helpers.js.map +1 -1
  109. package/dist/src/modifications/relations/normalization.d.ts +2 -2
  110. package/dist/src/modifications/relations/normalization.d.ts.map +1 -1
  111. package/dist/src/modifications/settings/UpdateSettingsModification.d.ts +1 -1
  112. package/dist/src/modifications/settings/UpdateSettingsModification.d.ts.map +1 -1
  113. package/dist/src/modifications/upgrade/RemoveIndexNamesModification.d.ts +19 -0
  114. package/dist/src/modifications/upgrade/RemoveIndexNamesModification.d.ts.map +1 -0
  115. package/dist/src/modifications/upgrade/RemoveIndexNamesModification.js +40 -0
  116. package/dist/src/modifications/upgrade/RemoveIndexNamesModification.js.map +1 -0
  117. package/dist/src/modifications/utils/createJunctionTable.d.ts +2 -3
  118. package/dist/src/modifications/utils/createJunctionTable.d.ts.map +1 -1
  119. package/dist/src/modifications/utils/createJunctionTable.js +4 -6
  120. package/dist/src/modifications/utils/createJunctionTable.js.map +1 -1
  121. package/dist/src/modifications/utils/schemaUpdateUtils.d.ts +12 -14
  122. package/dist/src/modifications/utils/schemaUpdateUtils.d.ts.map +1 -1
  123. package/dist/src/modifications/utils/schemaUpdateUtils.js +5 -20
  124. package/dist/src/modifications/utils/schemaUpdateUtils.js.map +1 -1
  125. package/dist/src/modifications/utils/stringArrayEquals.d.ts +2 -0
  126. package/dist/src/modifications/utils/stringArrayEquals.d.ts.map +1 -0
  127. package/dist/src/modifications/utils/stringArrayEquals.js +9 -0
  128. package/dist/src/modifications/utils/stringArrayEquals.js.map +1 -0
  129. package/dist/src/modifications/utils/viewDependencies.d.ts +1 -1
  130. package/dist/src/modifications/utils/viewDependencies.d.ts.map +1 -1
  131. package/dist/src/tsconfig.tsbuildinfo +1 -1
  132. package/dist/src/utils/PartialEntity.d.ts +5 -3
  133. package/dist/src/utils/PartialEntity.d.ts.map +1 -1
  134. package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.js +1 -1
  135. package/dist/tests/cases/integration/convertOneToManyRelation.test.js +5 -5
  136. package/dist/tests/cases/integration/convertOneToManyRelation.test.js.map +1 -1
  137. package/dist/tests/cases/integration/createAndDropIndex.test.js +4 -4
  138. package/dist/tests/cases/integration/createAndDropIndex.test.js.map +1 -1
  139. package/dist/tests/cases/integration/createColumn.test.js +0 -2
  140. package/dist/tests/cases/integration/createColumn.test.js.map +1 -1
  141. package/dist/tests/cases/integration/createEntity.test.js +6 -9
  142. package/dist/tests/cases/integration/createEntity.test.js.map +1 -1
  143. package/dist/tests/cases/integration/createManyHasMany.test.js +3 -3
  144. package/dist/tests/cases/integration/createManyHasOne.test.js +4 -4
  145. package/dist/tests/cases/integration/createManyHasOne.test.js.map +1 -1
  146. package/dist/tests/cases/integration/createOneHasMany.test.js +6 -9
  147. package/dist/tests/cases/integration/createOneHasMany.test.js.map +1 -1
  148. package/dist/tests/cases/integration/createOneHasOne.test.js +6 -6
  149. package/dist/tests/cases/integration/createRelationInverseSide.test.js +1 -1
  150. package/dist/tests/cases/integration/createRelationInverseSide.test.js.map +1 -1
  151. package/dist/tests/cases/integration/createView.test.js +6 -6
  152. package/dist/tests/cases/integration/removeField.test.js +6 -6
  153. package/dist/tests/cases/integration/removeField.test.js.map +1 -1
  154. package/dist/tests/cases/integration/updateColumnDefinition.test.js +42 -4
  155. package/dist/tests/cases/integration/updateColumnDefinition.test.js.map +1 -1
  156. package/dist/tests/cases/integration/updateEntityName.test.js +1 -20
  157. package/dist/tests/cases/integration/updateEntityName.test.js.map +1 -1
  158. package/dist/tests/cases/integration/updateFieldName.test.js +1 -21
  159. package/dist/tests/cases/integration/updateFieldName.test.js.map +1 -1
  160. package/dist/tests/cases/integration/updateRelationOnDelete.test.js +2 -2
  161. package/dist/tests/cases/integration/updateRelationOnDelete.test.js.map +1 -1
  162. package/dist/tests/cases/integration/updateView.test.js +18 -18
  163. package/dist/tests/scripts/checkCreateConsistentMigrations.js +1 -1
  164. package/dist/tests/scripts/checkCreateConsistentMigrations.js.map +1 -1
  165. package/dist/tests/src/tests.d.ts.map +1 -1
  166. package/dist/tests/src/tests.js +10 -4
  167. package/dist/tests/src/tests.js.map +1 -1
  168. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  169. package/package.json +8 -9
  170. package/src/MigrationDescriber.ts +11 -9
  171. package/src/SchemaDiffer.ts +12 -13
  172. package/src/SchemaMigrator.ts +1 -3
  173. package/src/modifications/ModificationHandler.ts +10 -5
  174. package/src/modifications/ModificationHandlerFactory.ts +12 -11
  175. package/src/modifications/ModificationVersions.ts +4 -3
  176. package/src/modifications/columns/CreateColumnModification.ts +19 -27
  177. package/src/modifications/columns/UpdateColumnDefinitionModification.ts +22 -4
  178. package/src/modifications/columns/columnUtils.ts +35 -0
  179. package/src/modifications/constraints/CreateUniqueConstraintModification.ts +31 -40
  180. package/src/modifications/constraints/RemoveUniqueConstraintModification.ts +60 -15
  181. package/src/modifications/constraints/utils.ts +36 -0
  182. package/src/modifications/entities/CreateEntityModification.ts +9 -8
  183. package/src/modifications/entities/CreateViewModification.ts +4 -3
  184. package/src/modifications/entities/RemoveEntityModification.ts +5 -5
  185. package/src/modifications/entities/ToggleEventLogModification.ts +4 -3
  186. package/src/modifications/entities/UpdateEntityNameModification.ts +10 -46
  187. package/src/modifications/fields/RemoveFieldModification.ts +1 -1
  188. package/src/modifications/fields/UpdateFieldNameModification.ts +30 -57
  189. package/src/modifications/indexes/CreateIndexModification.ts +35 -41
  190. package/src/modifications/indexes/RemoveIndexModification.ts +57 -17
  191. package/src/modifications/indexes/utils.ts +30 -0
  192. package/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.ts +7 -19
  193. package/src/modifications/relations/ConvertOneToManyRelationModification.ts +21 -22
  194. package/src/modifications/relations/CreateRelationModification.ts +20 -35
  195. package/src/modifications/relations/ToggleJunctionEventLogModification.ts +4 -5
  196. package/src/modifications/relations/UpdateRelationOnDeleteModification.ts +13 -5
  197. package/src/modifications/relations/helpers.ts +27 -22
  198. package/src/modifications/upgrade/RemoveIndexNamesModification.ts +46 -0
  199. package/src/modifications/utils/createJunctionTable.ts +8 -8
  200. package/src/modifications/utils/schemaUpdateUtils.ts +5 -17
  201. package/src/modifications/utils/stringArrayEquals.ts +4 -0
  202. package/src/tsconfig.json +0 -1
  203. package/src/utils/PartialEntity.ts +7 -1
  204. package/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.ts +1 -1
  205. package/tests/cases/integration/convertOneToManyRelation.test.ts +5 -5
  206. package/tests/cases/integration/createAndDropIndex.test.ts +4 -4
  207. package/tests/cases/integration/createColumn.test.ts +0 -2
  208. package/tests/cases/integration/createEntity.test.ts +6 -9
  209. package/tests/cases/integration/createManyHasMany.test.ts +3 -3
  210. package/tests/cases/integration/createManyHasOne.test.ts +4 -4
  211. package/tests/cases/integration/createOneHasMany.test.ts +6 -9
  212. package/tests/cases/integration/createOneHasOne.test.ts +6 -6
  213. package/tests/cases/integration/createRelationInverseSide.test.ts +1 -1
  214. package/tests/cases/integration/createView.test.ts +6 -6
  215. package/tests/cases/integration/removeField.test.ts +6 -6
  216. package/tests/cases/integration/updateColumnDefinition.test.ts +36 -4
  217. package/tests/cases/integration/updateEntityName.test.ts +1 -20
  218. package/tests/cases/integration/updateFieldName.test.ts +1 -21
  219. package/tests/cases/integration/updateRelationOnDelete.test.ts +2 -2
  220. package/tests/cases/integration/updateView.test.ts +18 -18
  221. package/tests/scripts/checkCreateConsistentMigrations.ts +1 -1
  222. package/tests/src/tests.ts +13 -8
  223. package/dist/src/modifications/utils/renameConstraintsHelper.d.ts +0 -8
  224. package/dist/src/modifications/utils/renameConstraintsHelper.d.ts.map +0 -1
  225. package/dist/src/modifications/utils/renameConstraintsHelper.js +0 -31
  226. package/dist/src/modifications/utils/renameConstraintsHelper.js.map +0 -1
  227. package/dist/src/modifications/utils/schemaMeta.d.ts +0 -8
  228. package/dist/src/modifications/utils/schemaMeta.d.ts.map +0 -1
  229. package/dist/src/modifications/utils/schemaMeta.js +0 -13
  230. package/dist/src/modifications/utils/schemaMeta.js.map +0 -1
  231. package/dist/tests/cases/integration/takenIndexName.test.d.ts +0 -2
  232. package/dist/tests/cases/integration/takenIndexName.test.d.ts.map +0 -1
  233. package/dist/tests/cases/integration/takenIndexName.test.js +0 -307
  234. package/dist/tests/cases/integration/takenIndexName.test.js.map +0 -1
  235. package/src/modifications/utils/renameConstraintsHelper.ts +0 -34
  236. package/src/modifications/utils/schemaMeta.ts +0 -18
  237. package/tests/cases/integration/takenIndexName.test.ts +0 -314
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contember/schema-migrations",
3
- "version": "1.3.0-alpha.7",
3
+ "version": "1.3.0-beta.1",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/src/index.js",
6
6
  "typings": "dist/src/index.d.ts",
@@ -9,21 +9,20 @@
9
9
  "default": "./dist/src/index.js"
10
10
  },
11
11
  "scripts": {
12
- "test": "vitest"
12
+ "test": "vitest --dir ./tests/cases"
13
13
  },
14
14
  "dependencies": {
15
- "@contember/database": "^1.3.0-alpha.7",
16
- "@contember/database-migrations": "^1.3.0-alpha.7",
17
- "@contember/engine-common": "^1.3.0-alpha.7",
18
- "@contember/schema": "^1.3.0-alpha.7",
19
- "@contember/schema-utils": "^1.3.0-alpha.7",
15
+ "@contember/database-migrations": "1.3.0-beta.1",
16
+ "@contember/engine-common": "1.3.0-beta.1",
17
+ "@contember/schema": "1.3.0-beta.1",
18
+ "@contember/schema-utils": "1.3.0-beta.1",
20
19
  "fast-deep-equal": "^3.1.3",
21
20
  "rfc6902": "^5.0.1"
22
21
  },
23
22
  "devDependencies": {
24
- "@contember/schema-definition": "^1.3.0-alpha.7"
23
+ "@contember/schema-definition": "1.3.0-beta.1"
25
24
  },
26
25
  "peerDependencies": {
27
26
  "pg": "^8.9.0"
28
27
  }
29
- }
28
+ }
@@ -4,6 +4,7 @@ import {
4
4
  ModificationDescription,
5
5
  ModificationDescriptionContext,
6
6
  ModificationHandler,
7
+ ModificationHandlerCreateSqlOptions,
7
8
  ModificationHandlerFactory,
8
9
  ModificationHandlerOptions,
9
10
  SchemaUpdateError,
@@ -14,23 +15,22 @@ import { Schema } from '@contember/schema'
14
15
 
15
16
  export interface ModificationDescriptionResult {
16
17
  modification: Migration.Modification
17
- sql: string
18
18
  schema: Schema
19
19
  description: ModificationDescription
20
20
  handler: ModificationHandler<any>
21
+ getSql: (options: ModificationHandlerCreateSqlOptions) => string
21
22
  }
22
23
 
23
24
  export class MigrationDescriber {
24
25
  constructor(private readonly modificationHandlerFactory: ModificationHandlerFactory) {
25
26
  }
26
27
 
27
- public async describeModification(
28
+ public describeModification(
28
29
  schema: Schema,
29
30
  modification: Migration.Modification,
30
31
  options: ModificationHandlerOptions,
31
32
  modificationDescriptionContext: ModificationDescriptionContext = emptyModificationDescriptionContext,
32
- ): Promise<ModificationDescriptionResult> {
33
- const builder = createMigrationBuilder()
33
+ ): ModificationDescriptionResult {
34
34
  const modificationHandler = this.modificationHandlerFactory.create(
35
35
  modification.modification,
36
36
  modification,
@@ -45,29 +45,31 @@ export class MigrationDescriber {
45
45
  }
46
46
  throw new SchemaUpdateError(e.message + '\n for modification: \n' + JSON.stringify(modification))
47
47
  }
48
- await modificationHandler.createSql(builder)
49
48
  return {
50
49
  modification,
51
50
  schema,
52
- sql: builder.getSql(),
51
+ getSql: options => {
52
+ const builder = createMigrationBuilder()
53
+ modificationHandler.createSql(builder, options)
54
+ return builder.getSql()
55
+ },
53
56
  description: modificationHandler.describe(modificationDescriptionContext),
54
57
  handler: modificationHandler,
55
58
  }
56
59
  }
57
60
 
58
- public async describeModifications(schema: Schema, migration: Migration, systemSchema: string): Promise<ModificationDescriptionResult[]> {
61
+ public describeModifications(schema: Schema, migration: Migration): ModificationDescriptionResult[] {
59
62
  const result = []
60
63
  const createdEntities = []
61
64
  for (const modification of migration.modifications) {
62
65
  if (modification.modification === createEntityModification.id) {
63
66
  createdEntities.push(modification.entity.name)
64
67
  }
65
- const description = await this.describeModification(
68
+ const description = this.describeModification(
66
69
  schema,
67
70
  modification,
68
71
  {
69
72
  formatVersion: migration.formatVersion,
70
- systemSchema,
71
73
  },
72
74
  {
73
75
  createdEntities,
@@ -1,12 +1,5 @@
1
1
  import { Schema } from '@contember/schema'
2
- import {
3
- deepCompare,
4
- isInverseRelation,
5
- isOwningRelation,
6
- isRelation,
7
- SchemaValidator,
8
- ValidationError,
9
- } from '@contember/schema-utils'
2
+ import { compareArraysIgnoreOrder, deepCompare, isInverseRelation, isOwningRelation, isRelation, SchemaValidator, ValidationError } from '@contember/schema-utils'
10
3
  import { SchemaMigrator } from './SchemaMigrator'
11
4
  import { Migration } from './Migration'
12
5
  import { ImplementationException } from './exceptions'
@@ -34,22 +27,22 @@ import {
34
27
  UpdateAclSchemaDiffer,
35
28
  UpdateColumnDefinitionDiffer,
36
29
  UpdateColumnNameDiffer,
30
+ UpdateEntityOrderByDiffer,
37
31
  UpdateEntityTableNameDiffer,
38
32
  UpdateEnumDiffer,
39
33
  UpdateRelationOnDeleteDiffer,
40
34
  UpdateRelationOrderByDiffer,
41
- UpdateEntityOrderByDiffer,
42
35
  UpdateValidationSchemaDiffer,
43
36
  VERSION_LATEST,
44
37
  } from './modifications'
45
38
  import { ChangeViewNonViewDiffer, RemoveChangedFieldDiffer, RemoveChangedViewDiffer } from './modifications/differs'
46
39
  import { CreateIndexDiffer, RemoveIndexDiffer } from './modifications/indexes'
47
- import { SchemaWithMeta } from './modifications/utils/schemaMeta'
48
40
  import { CreateTriggerDiffer, RemoveTriggerDiffer, UpdateTriggerDiffer } from './modifications/actions'
49
41
  import { UpdateTargetDiffer } from './modifications/actions/UpdateTargetModification'
50
42
  import { CreateTargetDiffer } from './modifications/actions/CreateTargetModification'
51
43
  import { RemoveTargetDiffer } from './modifications/actions/RemoveTargetModification'
52
44
  import { UpdateSettingsDiffer } from './modifications/settings'
45
+ import { RemoveIndexNamesDiffer } from './modifications/upgrade/RemoveIndexNamesModification'
53
46
 
54
47
  type DiffOptions = { skipRecreateValidation?: boolean; skipInitialSchemaValidation?: boolean }
55
48
 
@@ -72,6 +65,7 @@ export class SchemaDiffer {
72
65
  }
73
66
 
74
67
  const differs: Differ[] = [
68
+ new RemoveIndexNamesDiffer(),
75
69
  new UpdateSettingsDiffer(),
76
70
  new ConvertOneToManyRelationDiffer(),
77
71
  new ConvertOneHasManyToManyHasManyRelationDiffer(),
@@ -123,10 +117,15 @@ export class SchemaDiffer {
123
117
  diffs.push(...differDiffs)
124
118
  }
125
119
 
126
-
127
120
  if (!skipRecreateValidation) {
128
- const { meta, ...appliedDiffsSchema2 } = appliedDiffsSchema as SchemaWithMeta
129
- const errors = deepCompare(updatedSchema, appliedDiffsSchema2, [])
121
+ const errors = deepCompare(updatedSchema, appliedDiffsSchema, [], path => {
122
+ if (path[0] === 'model' && path[1] === 'entities' && (path[3] === 'unique' || path[3] === 'index')) {
123
+ return (a, b) => {
124
+ return compareArraysIgnoreOrder(a, b, path)
125
+ }
126
+ }
127
+ return null
128
+ })
130
129
  if (errors.length === 0) {
131
130
  return diffs
132
131
  }
@@ -1,17 +1,15 @@
1
1
  import { Schema } from '@contember/schema'
2
2
  import { ModificationHandlerFactory } from './modifications'
3
3
  import { Migration } from './Migration'
4
- import { SchemaWithMeta } from './modifications/utils/schemaMeta'
5
4
 
6
5
  export class SchemaMigrator {
7
6
  constructor(private readonly modificationHandlerFactory: ModificationHandlerFactory) {}
8
7
 
9
- public applyModifications(schema: Schema, diff: readonly Migration.Modification[], formatVersion: number): SchemaWithMeta {
8
+ public applyModifications(schema: Schema, diff: readonly Migration.Modification[], formatVersion: number): Schema {
10
9
  for (const modification of diff) {
11
10
  const { modification: name, ...data } = modification
12
11
  const modificationHandler = this.modificationHandlerFactory.create(name, data, schema, {
13
12
  formatVersion,
14
- systemSchema: 'system', // not important here
15
13
  })
16
14
  schema = modificationHandler.getSchemaUpdater()({ schema })
17
15
  }
@@ -2,7 +2,7 @@ import { MigrationBuilder } from '@contember/database-migrations'
2
2
  import { SchemaUpdater } from './utils/schemaUpdateUtils'
3
3
  import { Schema } from '@contember/schema'
4
4
  import { Migration } from '../Migration'
5
- import { SchemaWithMeta } from './utils/schemaMeta'
5
+ import { SchemaDatabaseMetadata } from '@contember/schema-utils'
6
6
 
7
7
  export interface ModificationDescription {
8
8
  message: string
@@ -14,20 +14,25 @@ export const emptyModificationDescriptionContext: ModificationDescriptionContext
14
14
  export type ModificationDescriptionContext = { createdEntities: string[] }
15
15
 
16
16
  export interface ModificationHandler<Data> {
17
- createSql(builder: MigrationBuilder): void | Promise<void>
17
+ createSql(builder: MigrationBuilder, options: ModificationHandlerCreateSqlOptions): void
18
18
 
19
19
  getSchemaUpdater(): SchemaUpdater
20
20
 
21
21
  describe(context: ModificationDescriptionContext): ModificationDescription
22
22
  }
23
23
 
24
+ export interface ModificationHandlerCreateSqlOptions {
25
+ systemSchema: string
26
+ databaseMetadata: SchemaDatabaseMetadata
27
+ invalidateDatabaseMetadata: () => void
28
+ }
29
+
24
30
  export interface ModificationHandlerOptions {
25
31
  formatVersion: number
26
- systemSchema: string
27
32
  }
28
33
 
29
34
  export interface ModificationHandlerConstructor<Data> {
30
- new(data: Data, schema: SchemaWithMeta, options: ModificationHandlerOptions): ModificationHandler<Data>
35
+ new(data: Data, schema: Schema, options: ModificationHandlerOptions): ModificationHandler<Data>
31
36
  }
32
37
 
33
38
  export interface Differ<Data = { [field: string]: any }> {
@@ -38,7 +43,7 @@ export interface Differ<Data = { [field: string]: any }> {
38
43
  export interface ModificationType<Id extends String, Data> {
39
44
  id: Id
40
45
  createModification: (data: Data) => Migration.Modification<Data>
41
- createHandler: (data: Data, schema: SchemaWithMeta, options: ModificationHandlerOptions) => ModificationHandler<Data>
46
+ createHandler: (data: Data, schema: Schema, options: ModificationHandlerOptions) => ModificationHandler<Data>
42
47
  }
43
48
 
44
49
  export const createModificationType = <Data, Id extends string>({ handler, id }: {
@@ -4,44 +4,44 @@ import { patchAclSchemaModification, updateAclSchemaModification } from './acl'
4
4
  import { createColumnModification, updateColumnDefinitionModification, updateColumnNameModification } from './columns'
5
5
  import { createUniqueConstraintModification, removeUniqueConstraintModification } from './constraints'
6
6
  import {
7
- createEntityModification, createViewModification,
8
- removeEntityModification, toggleEventLogModification,
7
+ createEntityModification,
8
+ createViewModification,
9
+ removeEntityModification,
10
+ toggleEventLogModification,
9
11
  updateEntityNameModification,
10
12
  updateEntityTableNameModification,
11
13
  } from './entities'
12
14
  import { updateViewModification } from './entities/UpdateViewModification'
13
- import {
14
- createEnumModification,
15
- removeEnumModification,
16
- updateEnumModification,
17
- } from './enums'
15
+ import { createEnumModification, removeEnumModification, updateEnumModification } from './enums'
18
16
  import { removeFieldModification, updateFieldNameModification } from './fields'
19
17
  import {
20
18
  convertOneHasManyToManyHasManyRelationModification,
21
19
  convertOneToManyRelationModification,
22
20
  createRelationInverseSideModification,
23
- createRelationModification, disableOrphanRemovalModification,
21
+ createRelationModification,
22
+ disableOrphanRemovalModification,
24
23
  enableOrphanRemovalModification,
25
24
  makeRelationNotNullModification,
26
- makeRelationNullableModification, toggleJunctionEventLogModification,
25
+ makeRelationNullableModification,
26
+ toggleJunctionEventLogModification,
27
27
  updateRelationOnDeleteModification,
28
28
  updateRelationOrderByModification,
29
29
  } from './relations'
30
30
  import { patchValidationSchemaModification, updateValidationSchemaModification } from './validation'
31
31
  import { createIndexModification, removeIndexModification } from './indexes'
32
- import { SchemaWithMeta } from './utils/schemaMeta'
33
32
  import { updateSettingsModification } from './settings'
34
33
  import { createTriggerModification, removeTriggerModification, updateTriggerModification } from './actions'
35
34
  import { createTargetModification } from './actions/CreateTargetModification'
36
35
  import { removeTargetModification } from './actions/RemoveTargetModification'
37
36
  import { updateTargetModification } from './actions/UpdateTargetModification'
38
37
  import { updateEntityOrderByModification } from './entities/UpdateEntityOrderByModification'
38
+ import { removeIndexNamesModification } from './upgrade/RemoveIndexNamesModification'
39
39
 
40
40
 
41
41
  class ModificationHandlerFactory {
42
42
  constructor(private readonly map: Record<string, ModificationType<string, any>>) {}
43
43
 
44
- public create<D>(name: string, data: D, schema: SchemaWithMeta, options: ModificationHandlerOptions): ModificationHandler<D> {
44
+ public create<D>(name: string, data: D, schema: Schema, options: ModificationHandlerOptions): ModificationHandler<D> {
45
45
  if (!this.map[name]) {
46
46
  throw new Error(`Undefined modification handler for ${name}`)
47
47
  }
@@ -53,6 +53,7 @@ namespace ModificationHandlerFactory {
53
53
  type HandlerMap<D> = { [modificationName: string]: ModificationType<string, D> }
54
54
 
55
55
  const handlers = [
56
+ removeIndexNamesModification,
56
57
  updateSettingsModification,
57
58
  updateAclSchemaModification,
58
59
  patchAclSchemaModification,
@@ -1,8 +1,9 @@
1
1
  export const VERSION_INITIAL = 1
2
- export const VERSION_LATEST = 4
2
+ export const VERSION_LATEST = 5
3
3
 
4
4
  export const VERSION_ACL_PATCH = 2
5
- export const VERSION_UPDATE_CONSTRAINT_NAME = 2
5
+ export const VERSION_UPDATE_CONSTRAINT_FIELDS = 2
6
6
  export const VERSION_REMOVE_RELATION_INVERSE_SIDE = 3
7
7
  export const VERSION_REMOVE_REFERENCING_RELATIONS = 3
8
- export const VERSION_UPDATE_CONSTRAINT_NAME_ONE_HAS_ONE = 4
8
+ export const _REMOVED_VERSION_UPDATE_CONSTRAINT_NAME_ONE_HAS_ONE = 4
9
+ export const VERSION_UPDATE_INDEX_FIELDS = 5
@@ -1,12 +1,11 @@
1
- import { escapeValue, MigrationBuilder } from '@contember/database-migrations'
2
- import { Model, Schema } from '@contember/schema'
1
+ import { MigrationBuilder } from '@contember/database-migrations'
2
+ import { JSONValue, Model, Schema } from '@contember/schema'
3
3
  import { addField, SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'
4
4
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
5
- import { wrapIdentifier } from '../../utils/dbHelpers'
6
- import { getColumnName, isColumn } from '@contember/schema-utils'
7
- import { ImplementationException } from '../../exceptions'
5
+ import { isColumn } from '@contember/schema-utils'
8
6
  import { createFields } from '../utils/diffUtils'
9
7
  import { getColumnSqlType } from '../utils/columnUtils'
8
+ import { fillSeed } from './columnUtils'
10
9
 
11
10
  export class CreateColumnModificationHandler implements ModificationHandler<CreateColumnModificationData> {
12
11
  constructor(private readonly data: CreateColumnModificationData, private readonly schema: Schema) {}
@@ -18,34 +17,27 @@ export class CreateColumnModificationHandler implements ModificationHandler<Crea
18
17
  }
19
18
  const column = this.data.field
20
19
  const hasSeed = this.data.fillValue !== undefined || this.data.copyValue !== undefined
20
+ const columnType = getColumnSqlType(column)
21
21
  builder.addColumn(entity.tableName, {
22
22
  [column.columnName]: {
23
- type: getColumnSqlType(column),
23
+ type: columnType,
24
24
  notNull: !column.nullable && !hasSeed,
25
25
  sequenceGenerated: column.sequence,
26
26
  },
27
27
  })
28
- if (hasSeed) {
29
- if (this.data.fillValue !== undefined) {
30
- builder.sql(`UPDATE ${wrapIdentifier(entity.tableName)}
31
- SET ${wrapIdentifier(column.columnName)} = ${escapeValue(this.data.fillValue)}`)
32
- } else if (this.data.copyValue !== undefined) {
33
- const copyFrom = getColumnName(this.schema.model, entity, this.data.copyValue)
34
- builder.sql(`UPDATE ${wrapIdentifier(entity.tableName)}
35
- SET ${wrapIdentifier(column.columnName)} = ${wrapIdentifier(copyFrom)}::${getColumnSqlType(column)}`)
36
- } else {
37
- throw new ImplementationException()
38
- }
39
-
40
- // event applier defers constraint check, we need to fire them before ALTER
41
- builder.sql(`SET CONSTRAINTS ALL IMMEDIATE`)
42
- builder.sql(`SET CONSTRAINTS ALL DEFERRED`)
43
28
 
44
- if (!column.nullable) {
45
- builder.alterColumn(entity.tableName, column.columnName, {
46
- notNull: true,
47
- })
48
- }
29
+ if (hasSeed) {
30
+ fillSeed({
31
+ builder,
32
+ type: 'creating',
33
+ model: this.schema.model,
34
+ entity,
35
+ columnName: column.columnName,
36
+ nullable: column.nullable,
37
+ columnType,
38
+ copyValue: this.data.copyValue,
39
+ fillValue: this.data.fillValue,
40
+ })
49
41
  }
50
42
  }
51
43
 
@@ -67,7 +59,7 @@ export class CreateColumnModificationHandler implements ModificationHandler<Crea
67
59
  export interface CreateColumnModificationData {
68
60
  entityName: string
69
61
  field: Model.AnyColumn
70
- fillValue?: any
62
+ fillValue?: JSONValue
71
63
  copyValue?: string
72
64
  }
73
65
 
@@ -1,12 +1,12 @@
1
1
  import { escapeValue, MigrationBuilder } from '@contember/database-migrations'
2
- import { Model, Schema } from '@contember/schema'
2
+ import { JSONValue, Model, Schema } from '@contember/schema'
3
3
  import { SchemaUpdater, updateEntity, updateField, updateModel } from '../utils/schemaUpdateUtils'
4
4
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
5
5
  import deepEqual from 'fast-deep-equal'
6
6
  import { updateColumns } from '../utils/diffUtils'
7
- import { wrapIdentifier } from '@contember/database'
7
+ import { wrapIdentifier } from '../../utils/dbHelpers'
8
8
  import { getColumnSqlType } from '../utils/columnUtils'
9
- import { getEntityDependantViews } from '../utils/viewDependencies'
9
+ import { fillSeed } from './columnUtils'
10
10
 
11
11
  export class UpdateColumnDefinitionModificationHandler implements ModificationHandler<UpdateColumnDefinitionModificationData> {
12
12
  constructor(private readonly data: UpdateColumnDefinitionModificationData, private readonly schema: Schema) {}
@@ -25,9 +25,11 @@ export class UpdateColumnDefinitionModificationHandler implements ModificationHa
25
25
 
26
26
  const usingCast = `${wrapIdentifier(oldColumn.columnName)}::${columnType}`
27
27
 
28
+ const hasSeed = this.data.fillValue !== undefined || this.data.copyValue !== undefined
29
+
28
30
  builder.alterColumn(entity.tableName, oldColumn.columnName, {
29
31
  type: hasNewSequence || hasNewType ? columnType : undefined,
30
- notNull: oldColumn.nullable !== newColumn.nullable ? !newColumn.nullable : undefined,
32
+ notNull: oldColumn.nullable !== newColumn.nullable && (!hasSeed || newColumn.nullable) ? !newColumn.nullable : undefined,
31
33
  using: hasNewSequence
32
34
  ? `COALESCE(${usingCast}, nextval(PG_GET_SERIAL_SEQUENCE(${escapeValue(entity.tableName)}, ${escapeValue(oldColumn.columnName)})))`
33
35
  : hasNewType
@@ -36,6 +38,20 @@ export class UpdateColumnDefinitionModificationHandler implements ModificationHa
36
38
  sequenceGenerated: oldColumn.sequence && !newColumn.sequence ? false : (!oldColumn.sequence ? newColumn.sequence : undefined),
37
39
  })
38
40
 
41
+ if (hasSeed) {
42
+ fillSeed({
43
+ builder,
44
+ type: 'updating',
45
+ model: this.schema.model,
46
+ entity,
47
+ columnName: oldColumn.columnName,
48
+ nullable: newColumn.nullable,
49
+ columnType,
50
+ copyValue: this.data.copyValue,
51
+ fillValue: this.data.fillValue,
52
+ })
53
+ }
54
+
39
55
  const seqAlter = []
40
56
  if (oldColumn.sequence && newColumn.sequence) {
41
57
  if (oldColumn.sequence.precedence !== newColumn.sequence.precedence) {
@@ -96,6 +112,8 @@ export interface UpdateColumnDefinitionModificationData {
96
112
  entityName: string
97
113
  fieldName: string
98
114
  definition: ColumnDefinitionAlter
115
+ fillValue?: JSONValue
116
+ copyValue?: string
99
117
  }
100
118
 
101
119
  export const updateColumnDefinitionModification = createModificationType({
@@ -0,0 +1,35 @@
1
+ import { wrapIdentifier } from '../../utils/dbHelpers'
2
+ import { ImplementationException } from '../../exceptions'
3
+ import { JSONValue, Model } from '@contember/schema'
4
+ import { escapeValue, MigrationBuilder } from '@contember/database-migrations'
5
+ import { getColumnName } from '@contember/schema-utils'
6
+
7
+ export const fillSeed = ({ builder, fillValue, copyValue, entity, columnName, nullable, model, columnType, type }: {
8
+ model: Model.Schema
9
+ entity: Model.Entity
10
+ columnName: string
11
+ columnType: string
12
+ nullable: boolean
13
+ builder: MigrationBuilder
14
+ fillValue?: JSONValue
15
+ copyValue?: string
16
+ type: 'creating' | 'updating'
17
+ }) => {
18
+ const where = type === 'updating' ? ` WHERE ${wrapIdentifier(columnName)} IS NULL` : ''
19
+ if (fillValue !== undefined) {
20
+ builder.sql(`UPDATE ${wrapIdentifier(entity.tableName)}
21
+ SET ${wrapIdentifier(columnName)} = ${escapeValue(fillValue)}${where}`)
22
+ } else if (copyValue !== undefined) {
23
+ const copyFrom = getColumnName(model, entity, copyValue)
24
+ builder.sql(`UPDATE ${wrapIdentifier(entity.tableName)}
25
+ SET ${wrapIdentifier(columnName)} = ${wrapIdentifier(copyFrom)}::${columnType}${where}`)
26
+ } else {
27
+ throw new ImplementationException()
28
+ }
29
+
30
+ if (!nullable) {
31
+ builder.alterColumn(entity.tableName, columnName, {
32
+ notNull: true,
33
+ })
34
+ }
35
+ }
@@ -1,57 +1,48 @@
1
1
  import { MigrationBuilder } from '@contember/database-migrations'
2
2
  import { Model, Schema } from '@contember/schema'
3
3
  import { SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'
4
- import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
5
- import { acceptFieldVisitor } from '@contember/schema-utils'
4
+ import {
5
+ createModificationType,
6
+ Differ,
7
+ ModificationHandler,
8
+ ModificationHandlerCreateSqlOptions,
9
+ } from '../ModificationHandler'
10
+ import { wrapIdentifier } from '../../utils/dbHelpers'
11
+ import { getUniqueConstraintColumns } from './utils'
12
+ import deepEqual from 'fast-deep-equal'
6
13
 
7
14
  export class CreateUniqueConstraintModificationHandler implements ModificationHandler<CreateUniqueConstraintModificationData> {
8
15
  constructor(private readonly data: CreateUniqueConstraintModificationData, private readonly schema: Schema) {
9
16
  }
10
17
 
11
- public createSql(builder: MigrationBuilder): void {
18
+ public createSql(builder: MigrationBuilder, { databaseMetadata, invalidateDatabaseMetadata }: ModificationHandlerCreateSqlOptions): void {
12
19
  const entity = this.schema.model.entities[this.data.entityName]
13
20
  if (entity.view) {
14
21
  return
15
22
  }
16
23
  const fields = this.data.unique.fields
17
- const columns = fields.map(fieldName => {
18
- return acceptFieldVisitor(this.schema.model, entity, fieldName, {
19
- visitColumn: ({ column }) => {
20
- return column.columnName
21
- },
22
- visitManyHasOne: ({ relation }) => {
23
- return relation.joiningColumn.columnName
24
- },
25
- visitOneHasMany: () => {
26
- throw new Error(`Cannot create unique key on 1:m relation in ${entity.name}.${fieldName}`)
27
- },
28
- visitOneHasOneOwning: () => {
29
- throw new Error(
30
- `Cannot create unique key on 1:1 relation, this relation has unique key by default in ${entity.name}.${fieldName}`,
31
- )
32
- },
33
- visitOneHasOneInverse: () => {
34
- throw new Error(`Cannot create unique key on 1:1 inverse relation in ${entity.name}.${fieldName}`)
35
- },
36
- visitManyHasManyOwning: () => {
37
- throw new Error(`Cannot create unique key on m:m relation in ${entity.name}.${fieldName}`)
38
- },
39
- visitManyHasManyInverse: () => {
40
- throw new Error(`Cannot create unique key on m:m inverse relation in ${entity.name}.${fieldName}`)
41
- },
42
- })
24
+ const columns = getUniqueConstraintColumns({
25
+ entity,
26
+ model: this.schema.model,
27
+ fields,
43
28
  })
44
- builder.addConstraint(entity.tableName, this.data.unique.name, { unique: columns })
29
+
30
+ const tableNameId = wrapIdentifier(entity.tableName)
31
+ const columnNameIds = columns.map(wrapIdentifier)
32
+
33
+ builder.sql(`ALTER TABLE ${tableNameId} ADD UNIQUE (${columnNameIds.join(', ')})`)
34
+
35
+ invalidateDatabaseMetadata()
45
36
  }
46
37
 
47
38
  public getSchemaUpdater(): SchemaUpdater {
48
39
  return updateModel(
49
40
  updateEntity(this.data.entityName, ({ entity }) => ({
50
41
  ...entity,
51
- unique: {
42
+ unique: [
52
43
  ...entity.unique,
53
- [this.data.unique.name]: this.data.unique,
54
- },
44
+ this.data.unique,
45
+ ],
55
46
  })),
56
47
  )
57
48
  }
@@ -67,21 +58,21 @@ export class CreateUniqueConstraintModificationHandler implements ModificationHa
67
58
 
68
59
  }
69
60
 
70
- export interface CreateUniqueConstraintModificationData {
71
- entityName: string
72
- unique: Model.UniqueConstraint
73
- }
74
-
75
61
  export const createUniqueConstraintModification = createModificationType({
76
62
  id: 'createUniqueConstraint',
77
63
  handler: CreateUniqueConstraintModificationHandler,
78
64
  })
79
65
 
66
+ export interface CreateUniqueConstraintModificationData {
67
+ entityName: string
68
+ unique: Model.UniqueConstraint
69
+ }
70
+
80
71
  export class CreateUniqueConstraintDiffer implements Differ {
81
72
  createDiff(originalSchema: Schema, updatedSchema: Schema) {
82
73
  return Object.values(updatedSchema.model.entities).flatMap(entity =>
83
- Object.values(entity.unique)
84
- .filter(it => !originalSchema.model.entities[entity.name].unique[it.name])
74
+ entity.unique
75
+ .filter(it => !originalSchema.model.entities[entity.name].unique.find(uniq => deepEqual(uniq.fields, it.fields)))
85
76
  .map(unique => createUniqueConstraintModification.createModification({
86
77
  entityName: entity.name,
87
78
  unique,