@contember/schema-migrations 1.1.2 → 1.2.0-alpha.11

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 (256) hide show
  1. package/dist/src/MigrationDescriber.d.ts +1 -2
  2. package/dist/src/MigrationDescriber.d.ts.map +1 -1
  3. package/dist/src/MigrationDescriber.js +5 -7
  4. package/dist/src/MigrationDescriber.js.map +1 -1
  5. package/dist/src/SchemaDiffer.d.ts.map +1 -1
  6. package/dist/src/SchemaDiffer.js +36 -46
  7. package/dist/src/SchemaDiffer.js.map +1 -1
  8. package/dist/src/SchemaMigrator.d.ts +1 -1
  9. package/dist/src/SchemaMigrator.d.ts.map +1 -1
  10. package/dist/src/index.d.ts +1 -5
  11. package/dist/src/index.d.ts.map +1 -1
  12. package/dist/src/index.js +1 -11
  13. package/dist/src/index.js.map +1 -1
  14. package/dist/src/modifications/ModificationHandler.d.ts +11 -6
  15. package/dist/src/modifications/ModificationHandler.d.ts.map +1 -1
  16. package/dist/src/modifications/ModificationHandler.js +9 -1
  17. package/dist/src/modifications/ModificationHandler.js.map +1 -1
  18. package/dist/src/modifications/ModificationHandlerFactory.d.ts +6 -5
  19. package/dist/src/modifications/ModificationHandlerFactory.d.ts.map +1 -1
  20. package/dist/src/modifications/ModificationHandlerFactory.js +42 -37
  21. package/dist/src/modifications/ModificationHandlerFactory.js.map +1 -1
  22. package/dist/src/modifications/acl/PatchAclSchemaModification.d.ts +13 -2
  23. package/dist/src/modifications/acl/PatchAclSchemaModification.d.ts.map +1 -1
  24. package/dist/src/modifications/acl/PatchAclSchemaModification.js +28 -28
  25. package/dist/src/modifications/acl/PatchAclSchemaModification.js.map +1 -1
  26. package/dist/src/modifications/acl/UpdateAclSchemaModification.d.ts +17 -3
  27. package/dist/src/modifications/acl/UpdateAclSchemaModification.d.ts.map +1 -1
  28. package/dist/src/modifications/acl/UpdateAclSchemaModification.js +33 -30
  29. package/dist/src/modifications/acl/UpdateAclSchemaModification.js.map +1 -1
  30. package/dist/src/modifications/columns/CreateColumnModification.d.ts +23 -3
  31. package/dist/src/modifications/columns/CreateColumnModification.d.ts.map +1 -1
  32. package/dist/src/modifications/columns/CreateColumnModification.js +70 -67
  33. package/dist/src/modifications/columns/CreateColumnModification.js.map +1 -1
  34. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.d.ts +21 -3
  35. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.d.ts.map +1 -1
  36. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.js +73 -70
  37. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.js.map +1 -1
  38. package/dist/src/modifications/columns/UpdateColumnNameModification.d.ts +20 -2
  39. package/dist/src/modifications/columns/UpdateColumnNameModification.d.ts.map +1 -1
  40. package/dist/src/modifications/columns/UpdateColumnNameModification.js +97 -94
  41. package/dist/src/modifications/columns/UpdateColumnNameModification.js.map +1 -1
  42. package/dist/src/modifications/constraints/CreateUniqueConstraintModification.d.ts +21 -3
  43. package/dist/src/modifications/constraints/CreateUniqueConstraintModification.d.ts.map +1 -1
  44. package/dist/src/modifications/constraints/CreateUniqueConstraintModification.js +72 -66
  45. package/dist/src/modifications/constraints/CreateUniqueConstraintModification.js.map +1 -1
  46. package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.d.ts +18 -2
  47. package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.d.ts.map +1 -1
  48. package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.js +45 -42
  49. package/dist/src/modifications/constraints/RemoveUniqueConstraintModification.js.map +1 -1
  50. package/dist/src/modifications/differs/ChangeViewNonViewDiffer.js +1 -1
  51. package/dist/src/modifications/differs/RemoveChangedFieldDiffer.js +1 -1
  52. package/dist/src/modifications/differs/RemoveChangedViewDiffer.js +1 -1
  53. package/dist/src/modifications/entities/CreateEntityModification.d.ts +21 -6
  54. package/dist/src/modifications/entities/CreateEntityModification.d.ts.map +1 -1
  55. package/dist/src/modifications/entities/CreateEntityModification.js +65 -61
  56. package/dist/src/modifications/entities/CreateEntityModification.js.map +1 -1
  57. package/dist/src/modifications/entities/CreateViewModification.d.ts +23 -6
  58. package/dist/src/modifications/entities/CreateViewModification.d.ts.map +1 -1
  59. package/dist/src/modifications/entities/CreateViewModification.js +59 -55
  60. package/dist/src/modifications/entities/CreateViewModification.js.map +1 -1
  61. package/dist/src/modifications/entities/RemoveEntityModification.d.ts +21 -2
  62. package/dist/src/modifications/entities/RemoveEntityModification.d.ts.map +1 -1
  63. package/dist/src/modifications/entities/RemoveEntityModification.js +73 -70
  64. package/dist/src/modifications/entities/RemoveEntityModification.js.map +1 -1
  65. package/dist/src/modifications/entities/ToggleEventLogModification.d.ts +19 -2
  66. package/dist/src/modifications/entities/ToggleEventLogModification.d.ts.map +1 -1
  67. package/dist/src/modifications/entities/ToggleEventLogModification.js +57 -54
  68. package/dist/src/modifications/entities/ToggleEventLogModification.js.map +1 -1
  69. package/dist/src/modifications/entities/UpdateEntityNameModification.d.ts +18 -2
  70. package/dist/src/modifications/entities/UpdateEntityNameModification.d.ts.map +1 -1
  71. package/dist/src/modifications/entities/UpdateEntityNameModification.js +78 -78
  72. package/dist/src/modifications/entities/UpdateEntityNameModification.js.map +1 -1
  73. package/dist/src/modifications/entities/UpdateEntityTableNameModification.d.ts +18 -2
  74. package/dist/src/modifications/entities/UpdateEntityTableNameModification.d.ts.map +1 -1
  75. package/dist/src/modifications/entities/UpdateEntityTableNameModification.js +40 -34
  76. package/dist/src/modifications/entities/UpdateEntityTableNameModification.js.map +1 -1
  77. package/dist/src/modifications/entities/UpdateViewModification.d.ts +15 -3
  78. package/dist/src/modifications/entities/UpdateViewModification.d.ts.map +1 -1
  79. package/dist/src/modifications/entities/UpdateViewModification.js +28 -28
  80. package/dist/src/modifications/entities/UpdateViewModification.js.map +1 -1
  81. package/dist/src/modifications/enums/CreateEnumModification.d.ts +18 -2
  82. package/dist/src/modifications/enums/CreateEnumModification.d.ts.map +1 -1
  83. package/dist/src/modifications/enums/CreateEnumModification.js +42 -36
  84. package/dist/src/modifications/enums/CreateEnumModification.js.map +1 -1
  85. package/dist/src/modifications/enums/RemoveEnumModification.d.ts +18 -2
  86. package/dist/src/modifications/enums/RemoveEnumModification.d.ts.map +1 -1
  87. package/dist/src/modifications/enums/RemoveEnumModification.js +36 -33
  88. package/dist/src/modifications/enums/RemoveEnumModification.js.map +1 -1
  89. package/dist/src/modifications/enums/UpdateEnumModification.d.ts +19 -2
  90. package/dist/src/modifications/enums/UpdateEnumModification.d.ts.map +1 -1
  91. package/dist/src/modifications/enums/UpdateEnumModification.js +43 -40
  92. package/dist/src/modifications/enums/UpdateEnumModification.js.map +1 -1
  93. package/dist/src/modifications/fields/RemoveFieldModification.d.ts +20 -2
  94. package/dist/src/modifications/fields/RemoveFieldModification.d.ts.map +1 -1
  95. package/dist/src/modifications/fields/RemoveFieldModification.js +67 -64
  96. package/dist/src/modifications/fields/RemoveFieldModification.js.map +1 -1
  97. package/dist/src/modifications/fields/UpdateFieldNameModification.d.ts +18 -2
  98. package/dist/src/modifications/fields/UpdateFieldNameModification.d.ts.map +1 -1
  99. package/dist/src/modifications/fields/UpdateFieldNameModification.js +132 -132
  100. package/dist/src/modifications/fields/UpdateFieldNameModification.js.map +1 -1
  101. package/dist/src/modifications/index.d.ts +14 -0
  102. package/dist/src/modifications/index.d.ts.map +1 -0
  103. package/dist/src/modifications/index.js +32 -0
  104. package/dist/src/modifications/index.js.map +1 -0
  105. package/dist/src/modifications/indexes/CreateIndexModification.d.ts +23 -0
  106. package/dist/src/modifications/indexes/CreateIndexModification.d.ts.map +1 -0
  107. package/dist/src/modifications/indexes/CreateIndexModification.js +75 -0
  108. package/dist/src/modifications/indexes/CreateIndexModification.js.map +1 -0
  109. package/dist/src/modifications/indexes/RemoveIndexModification.d.ts +23 -0
  110. package/dist/src/modifications/indexes/RemoveIndexModification.d.ts.map +1 -0
  111. package/dist/src/modifications/indexes/RemoveIndexModification.js +56 -0
  112. package/dist/src/modifications/indexes/RemoveIndexModification.js.map +1 -0
  113. package/dist/src/modifications/indexes/index.d.ts +3 -0
  114. package/dist/src/modifications/indexes/index.d.ts.map +1 -0
  115. package/dist/src/modifications/indexes/index.js +19 -0
  116. package/dist/src/modifications/indexes/index.js.map +1 -0
  117. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts +23 -3
  118. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts.map +1 -1
  119. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js +68 -65
  120. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js.map +1 -1
  121. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.d.ts +23 -2
  122. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.d.ts.map +1 -1
  123. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.js +73 -70
  124. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.js.map +1 -1
  125. package/dist/src/modifications/relations/CreateRelationInverseSideModification.d.ts +20 -3
  126. package/dist/src/modifications/relations/CreateRelationInverseSideModification.d.ts.map +1 -1
  127. package/dist/src/modifications/relations/CreateRelationInverseSideModification.js +36 -33
  128. package/dist/src/modifications/relations/CreateRelationInverseSideModification.js.map +1 -1
  129. package/dist/src/modifications/relations/CreateRelationModification.d.ts +25 -3
  130. package/dist/src/modifications/relations/CreateRelationModification.d.ts.map +1 -1
  131. package/dist/src/modifications/relations/CreateRelationModification.js +88 -85
  132. package/dist/src/modifications/relations/CreateRelationModification.js.map +1 -1
  133. package/dist/src/modifications/relations/DisableOrphanRemovalModification.d.ts +20 -2
  134. package/dist/src/modifications/relations/DisableOrphanRemovalModification.d.ts.map +1 -1
  135. package/dist/src/modifications/relations/DisableOrphanRemovalModification.js +42 -39
  136. package/dist/src/modifications/relations/DisableOrphanRemovalModification.js.map +1 -1
  137. package/dist/src/modifications/relations/EnableOrphanRemovalModification.d.ts +20 -2
  138. package/dist/src/modifications/relations/EnableOrphanRemovalModification.d.ts.map +1 -1
  139. package/dist/src/modifications/relations/EnableOrphanRemovalModification.js +45 -42
  140. package/dist/src/modifications/relations/EnableOrphanRemovalModification.js.map +1 -1
  141. package/dist/src/modifications/relations/MakeRelationNotNullModification.d.ts +21 -2
  142. package/dist/src/modifications/relations/MakeRelationNotNullModification.d.ts.map +1 -1
  143. package/dist/src/modifications/relations/MakeRelationNotNullModification.js +55 -52
  144. package/dist/src/modifications/relations/MakeRelationNotNullModification.js.map +1 -1
  145. package/dist/src/modifications/relations/MakeRelationNullableModification.d.ts +20 -2
  146. package/dist/src/modifications/relations/MakeRelationNullableModification.d.ts.map +1 -1
  147. package/dist/src/modifications/relations/MakeRelationNullableModification.js +54 -51
  148. package/dist/src/modifications/relations/MakeRelationNullableModification.js.map +1 -1
  149. package/dist/src/modifications/relations/ToggleJunctionEventLogModification.d.ts +27 -0
  150. package/dist/src/modifications/relations/ToggleJunctionEventLogModification.d.ts.map +1 -0
  151. package/dist/src/modifications/relations/ToggleJunctionEventLogModification.js +84 -0
  152. package/dist/src/modifications/relations/ToggleJunctionEventLogModification.js.map +1 -0
  153. package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.d.ts +20 -3
  154. package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.d.ts.map +1 -1
  155. package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.js +42 -39
  156. package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.js.map +1 -1
  157. package/dist/src/modifications/relations/UpdateRelationOrderByModification.d.ts +20 -3
  158. package/dist/src/modifications/relations/UpdateRelationOrderByModification.d.ts.map +1 -1
  159. package/dist/src/modifications/relations/UpdateRelationOrderByModification.js +43 -40
  160. package/dist/src/modifications/relations/UpdateRelationOrderByModification.js.map +1 -1
  161. package/dist/src/modifications/relations/index.d.ts +1 -1
  162. package/dist/src/modifications/relations/index.d.ts.map +1 -1
  163. package/dist/src/modifications/relations/index.js +1 -1
  164. package/dist/src/modifications/relations/index.js.map +1 -1
  165. package/dist/src/modifications/validation/PatchValidationSchemaModification.d.ts +13 -2
  166. package/dist/src/modifications/validation/PatchValidationSchemaModification.d.ts.map +1 -1
  167. package/dist/src/modifications/validation/PatchValidationSchemaModification.js +28 -28
  168. package/dist/src/modifications/validation/PatchValidationSchemaModification.js.map +1 -1
  169. package/dist/src/modifications/validation/UpdateValidationSchemaModification.d.ts +17 -3
  170. package/dist/src/modifications/validation/UpdateValidationSchemaModification.d.ts.map +1 -1
  171. package/dist/src/modifications/validation/UpdateValidationSchemaModification.js +33 -30
  172. package/dist/src/modifications/validation/UpdateValidationSchemaModification.js.map +1 -1
  173. package/dist/src/tsconfig.tsbuildinfo +1 -1
  174. package/dist/src/utils/PartialEntity.d.ts +5 -0
  175. package/dist/src/utils/PartialEntity.d.ts.map +1 -0
  176. package/dist/src/utils/PartialEntity.js +3 -0
  177. package/dist/src/utils/PartialEntity.js.map +1 -0
  178. package/dist/tests/cases/integration/createAndDropIndex.test.d.ts +2 -0
  179. package/dist/tests/cases/integration/createAndDropIndex.test.d.ts.map +1 -0
  180. package/dist/tests/cases/integration/createAndDropIndex.test.js +57 -0
  181. package/dist/tests/cases/integration/createAndDropIndex.test.js.map +1 -0
  182. package/dist/tests/cases/integration/createEntity.test.js +2 -0
  183. package/dist/tests/cases/integration/createEntity.test.js.map +1 -1
  184. package/dist/tests/cases/integration/createManyHasMany.test.js +1 -0
  185. package/dist/tests/cases/integration/createManyHasMany.test.js.map +1 -1
  186. package/dist/tests/cases/integration/createManyHasOne.test.js +1 -0
  187. package/dist/tests/cases/integration/createManyHasOne.test.js.map +1 -1
  188. package/dist/tests/cases/integration/createOneHasMany.test.js +1 -0
  189. package/dist/tests/cases/integration/createOneHasMany.test.js.map +1 -1
  190. package/dist/tests/cases/integration/createOneHasOne.test.js +2 -0
  191. package/dist/tests/cases/integration/createOneHasOne.test.js.map +1 -1
  192. package/dist/tests/cases/integration/createView.test.js +1 -0
  193. package/dist/tests/cases/integration/createView.test.js.map +1 -1
  194. package/dist/tests/cases/integration/updateView.test.js +9 -0
  195. package/dist/tests/cases/integration/updateView.test.js.map +1 -1
  196. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  197. package/package.json +7 -7
  198. package/src/MigrationDescriber.ts +8 -8
  199. package/src/SchemaDiffer.ts +65 -76
  200. package/src/SchemaMigrator.ts +1 -1
  201. package/src/index.ts +1 -5
  202. package/src/modifications/ModificationHandler.ts +20 -8
  203. package/src/modifications/ModificationHandlerFactory.ts +65 -61
  204. package/src/modifications/acl/PatchAclSchemaModification.ts +7 -8
  205. package/src/modifications/acl/UpdateAclSchemaModification.ts +16 -15
  206. package/src/modifications/columns/CreateColumnModification.ts +18 -16
  207. package/src/modifications/columns/UpdateColumnDefinitionModification.ts +27 -25
  208. package/src/modifications/columns/UpdateColumnNameModification.ts +60 -53
  209. package/src/modifications/constraints/CreateUniqueConstraintModification.ts +23 -17
  210. package/src/modifications/constraints/RemoveUniqueConstraintModification.ts +18 -14
  211. package/src/modifications/differs/ChangeViewNonViewDiffer.ts +2 -2
  212. package/src/modifications/differs/RemoveChangedFieldDiffer.ts +2 -2
  213. package/src/modifications/differs/RemoveChangedViewDiffer.ts +2 -2
  214. package/src/modifications/entities/CreateEntityModification.ts +19 -11
  215. package/src/modifications/entities/CreateViewModification.ts +13 -11
  216. package/src/modifications/entities/RemoveEntityModification.ts +22 -15
  217. package/src/modifications/entities/ToggleEventLogModification.ts +20 -13
  218. package/src/modifications/entities/UpdateEntityNameModification.ts +9 -9
  219. package/src/modifications/entities/UpdateEntityTableNameModification.ts +18 -13
  220. package/src/modifications/entities/UpdateViewModification.ts +7 -7
  221. package/src/modifications/enums/CreateEnumModification.ts +18 -13
  222. package/src/modifications/enums/RemoveEnumModification.ts +14 -12
  223. package/src/modifications/enums/UpdateEnumModification.ts +15 -13
  224. package/src/modifications/fields/RemoveFieldModification.ts +20 -17
  225. package/src/modifications/fields/UpdateFieldNameModification.ts +16 -17
  226. package/src/modifications/index.ts +13 -0
  227. package/src/modifications/indexes/CreateIndexModification.ts +83 -0
  228. package/src/modifications/indexes/RemoveIndexModification.ts +68 -0
  229. package/src/modifications/indexes/index.ts +2 -0
  230. package/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.ts +35 -25
  231. package/src/modifications/relations/ConvertOneToManyRelationModification.ts +31 -24
  232. package/src/modifications/relations/CreateRelationInverseSideModification.ts +15 -13
  233. package/src/modifications/relations/CreateRelationModification.ts +35 -27
  234. package/src/modifications/relations/DisableOrphanRemovalModification.ts +15 -12
  235. package/src/modifications/relations/EnableOrphanRemovalModification.ts +16 -13
  236. package/src/modifications/relations/MakeRelationNotNullModification.ts +16 -14
  237. package/src/modifications/relations/MakeRelationNullableModification.ts +17 -13
  238. package/src/modifications/relations/{ToggleManyHasManyEventLogModification.ts → ToggleJunctionEventLogModification.ts} +21 -14
  239. package/src/modifications/relations/UpdateRelationOnDeleteModification.ts +16 -14
  240. package/src/modifications/relations/UpdateRelationOrderByModification.ts +17 -14
  241. package/src/modifications/relations/index.ts +1 -1
  242. package/src/modifications/validation/PatchValidationSchemaModification.ts +7 -7
  243. package/src/modifications/validation/UpdateValidationSchemaModification.ts +17 -14
  244. package/src/utils/PartialEntity.ts +5 -0
  245. package/tests/cases/integration/createAndDropIndex.test.ts +44 -0
  246. package/tests/cases/integration/createEntity.test.ts +2 -0
  247. package/tests/cases/integration/createManyHasMany.test.ts +1 -0
  248. package/tests/cases/integration/createManyHasOne.test.ts +1 -0
  249. package/tests/cases/integration/createOneHasMany.test.ts +1 -0
  250. package/tests/cases/integration/createOneHasOne.test.ts +2 -0
  251. package/tests/cases/integration/createView.test.ts +1 -0
  252. package/tests/cases/integration/updateView.test.ts +9 -0
  253. package/dist/src/modifications/relations/ToggleManyHasManyEventLogModification.d.ts +0 -8
  254. package/dist/src/modifications/relations/ToggleManyHasManyEventLogModification.d.ts.map +0 -1
  255. package/dist/src/modifications/relations/ToggleManyHasManyEventLogModification.js +0 -81
  256. package/dist/src/modifications/relations/ToggleManyHasManyEventLogModification.js.map +0 -1
@@ -1,10 +1,9 @@
1
1
  import { MigrationBuilder } from '@contember/database-migrations'
2
2
  import { Schema } from '@contember/schema'
3
3
  import { SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'
4
- import { ModificationHandlerStatic } from '../ModificationHandler'
4
+ import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
5
5
 
6
- export const UpdateEntityTableNameModification: ModificationHandlerStatic<UpdateEntityTableNameModificationData> = class {
7
- static id = 'updateEntityTableName'
6
+ export class UpdateEntityTableNameModificationHandler implements ModificationHandler<UpdateEntityTableNameModificationData> {
8
7
  constructor(private readonly data: UpdateEntityTableNameModificationData, private readonly schema: Schema) {}
9
8
 
10
9
  public createSql(builder: MigrationBuilder): void {
@@ -28,22 +27,28 @@ export const UpdateEntityTableNameModification: ModificationHandlerStatic<Update
28
27
  describe() {
29
28
  return { message: `Change table name of entity ${this.data.entityName}` }
30
29
  }
30
+ }
31
31
 
32
- static createModification(data: UpdateEntityTableNameModificationData) {
33
- return { modification: this.id, ...data }
34
- }
32
+ export interface UpdateEntityTableNameModificationData {
33
+ entityName: string
34
+ tableName: string
35
+ }
35
36
 
36
- static createDiff(originalSchema: Schema, updatedSchema: Schema) {
37
+ export const updateEntityTableNameModification = createModificationType({
38
+ id: 'updateEntityTableName',
39
+ handler: UpdateEntityTableNameModificationHandler,
40
+ })
41
+
42
+ export class UpdateEntityTableNameDiffer implements Differ {
43
+ createDiff(originalSchema: Schema, updatedSchema: Schema) {
37
44
  return Object.values(updatedSchema.model.entities)
38
45
  .filter(
39
46
  it =>
40
47
  originalSchema.model.entities[it.name] && originalSchema.model.entities[it.name].tableName !== it.tableName,
41
48
  )
42
- .map(it => UpdateEntityTableNameModification.createModification({ entityName: it.name, tableName: it.tableName }))
49
+ .map(it => updateEntityTableNameModification.createModification({
50
+ entityName: it.name,
51
+ tableName: it.tableName,
52
+ }))
43
53
  }
44
54
  }
45
-
46
- export interface UpdateEntityTableNameModificationData {
47
- entityName: string
48
- tableName: string
49
- }
@@ -1,11 +1,9 @@
1
1
  import { MigrationBuilder } from '@contember/database-migrations'
2
2
  import { Model, Schema } from '@contember/schema'
3
- import { ModificationHandlerStatic } from '../ModificationHandler'
3
+ import { createModificationType, ModificationHandler } from '../ModificationHandler'
4
4
  import { SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'
5
5
 
6
- export const UpdateViewModification: ModificationHandlerStatic<UpdateViewModificationData> = class {
7
- static id = 'updateView'
8
-
6
+ export class UpdateViewModificationHandler implements ModificationHandler<UpdateViewModificationData> {
9
7
  constructor(private readonly data: UpdateViewModificationData, private readonly schema: Schema) {}
10
8
 
11
9
  public createSql(builder: MigrationBuilder): void {
@@ -32,12 +30,14 @@ export const UpdateViewModification: ModificationHandlerStatic<UpdateViewModific
32
30
  return { message: `Update SQL definition of a view` }
33
31
  }
34
32
 
35
- static createModification(data: UpdateViewModificationData) {
36
- return { modification: this.id, ...data }
37
- }
38
33
  }
39
34
 
40
35
  export interface UpdateViewModificationData {
41
36
  entityName: string
42
37
  view: Model.View
43
38
  }
39
+
40
+ export const updateViewModification = createModificationType({
41
+ id: 'updateView',
42
+ handler: UpdateViewModificationHandler,
43
+ })
@@ -1,11 +1,10 @@
1
1
  import { MigrationBuilder } from '@contember/database-migrations'
2
2
  import { Schema } from '@contember/schema'
3
3
  import { SchemaUpdater, updateModel } from '../utils/schemaUpdateUtils'
4
- import { ModificationHandlerStatic } from '../ModificationHandler'
4
+ import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
5
5
  import { createCheck, getConstraintName } from './enumUtils'
6
6
 
7
- export const CreateEnumModification: ModificationHandlerStatic<CreateEnumModificationData> = class {
8
- static id = 'createEnum'
7
+ export class CreateEnumModificationHandler implements ModificationHandler<CreateEnumModificationData> {
9
8
  constructor(private readonly data: CreateEnumModificationData, private readonly schema: Schema) {}
10
9
 
11
10
  public createSql(builder: MigrationBuilder): void {
@@ -28,19 +27,25 @@ export const CreateEnumModification: ModificationHandlerStatic<CreateEnumModific
28
27
  describe() {
29
28
  return { message: `Add enum ${this.data.enumName}` }
30
29
  }
31
-
32
- static createModification(data: CreateEnumModificationData) {
33
- return { modification: this.id, ...data }
34
- }
35
-
36
- static createDiff(originalSchema: Schema, updatedSchema: Schema) {
37
- return Object.entries(updatedSchema.model.enums)
38
- .filter(([name]) => !originalSchema.model.enums[name])
39
- .map(([enumName, values]) => CreateEnumModification.createModification({ enumName, values }))
40
- }
41
30
  }
42
31
 
43
32
  export interface CreateEnumModificationData {
44
33
  enumName: string
45
34
  values: readonly string[]
46
35
  }
36
+
37
+ export const createEnumModification = createModificationType({
38
+ id: 'createEnum',
39
+ handler: CreateEnumModificationHandler,
40
+ })
41
+
42
+ export class CreateEnumDiffer implements Differ {
43
+ createDiff(originalSchema: Schema, updatedSchema: Schema) {
44
+ return Object.entries(updatedSchema.model.enums)
45
+ .filter(([name]) => !originalSchema.model.enums[name])
46
+ .map(([enumName, values]) => createEnumModification.createModification({
47
+ enumName,
48
+ values,
49
+ }))
50
+ }
51
+ }
@@ -1,10 +1,9 @@
1
1
  import { MigrationBuilder } from '@contember/database-migrations'
2
2
  import { Schema } from '@contember/schema'
3
3
  import { SchemaUpdater, updateModel } from '../utils/schemaUpdateUtils'
4
- import { ModificationHandlerStatic } from '../ModificationHandler'
4
+ import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
5
5
 
6
- export const RemoveEnumModification: ModificationHandlerStatic<RemoveEnumModificationData> = class {
7
- static id = 'removeEnum'
6
+ export class RemoveEnumModificationHandler implements ModificationHandler<RemoveEnumModificationData> {
8
7
  constructor(private readonly data: RemoveEnumModificationData, private readonly schema: Schema) {}
9
8
 
10
9
  public createSql(builder: MigrationBuilder): void {
@@ -24,18 +23,21 @@ export const RemoveEnumModification: ModificationHandlerStatic<RemoveEnumModific
24
23
  describe() {
25
24
  return { message: `Remove ${this.data.enumName}` }
26
25
  }
26
+ }
27
27
 
28
- static createModification(data: RemoveEnumModificationData) {
29
- return { modification: this.id, ...data }
30
- }
28
+ export interface RemoveEnumModificationData {
29
+ enumName: string
30
+ }
31
31
 
32
- static createDiff(originalSchema: Schema, updatedSchema: Schema) {
32
+ export const removeEnumModification = createModificationType({
33
+ id: 'removeEnum',
34
+ handler: RemoveEnumModificationHandler,
35
+ })
36
+
37
+ export class RemoveEnumDiffer implements Differ {
38
+ createDiff(originalSchema: Schema, updatedSchema: Schema) {
33
39
  return Object.entries(originalSchema.model.enums)
34
40
  .filter(([name]) => !updatedSchema.model.enums[name])
35
- .map(([enumName, values]) => RemoveEnumModification.createModification({ enumName }))
41
+ .map(([enumName, values]) => removeEnumModification.createModification({ enumName }))
36
42
  }
37
43
  }
38
-
39
- export interface RemoveEnumModificationData {
40
- enumName: string
41
- }
@@ -1,12 +1,11 @@
1
1
  import { MigrationBuilder } from '@contember/database-migrations'
2
2
  import { Schema } from '@contember/schema'
3
3
  import { SchemaUpdater, updateModel } from '../utils/schemaUpdateUtils'
4
- import { ModificationHandlerStatic } from '../ModificationHandler'
4
+ import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
5
5
  import deepEqual from 'fast-deep-equal'
6
6
  import { createCheck, getConstraintName } from './enumUtils'
7
7
 
8
- export const UpdateEnumModification: ModificationHandlerStatic<UpdateEnumModificationData> = class {
9
- static id = 'updateEnum'
8
+ export class UpdateEnumModificationHandler implements ModificationHandler<UpdateEnumModificationData> {
10
9
  constructor(private readonly data: UpdateEnumModificationData, private readonly schema: Schema) {}
11
10
 
12
11
  public createSql(builder: MigrationBuilder): void {
@@ -37,23 +36,26 @@ export const UpdateEnumModification: ModificationHandlerStatic<UpdateEnumModific
37
36
  : undefined
38
37
  return { message: `Update enum ${this.data.enumName}`, failureWarning }
39
38
  }
39
+ }
40
40
 
41
- static createModification(data: UpdateEnumModificationData) {
42
- return { modification: this.id, ...data }
43
- }
41
+ export interface UpdateEnumModificationData {
42
+ enumName: string
43
+ values: readonly string[]
44
+ }
44
45
 
45
- static createDiff(originalSchema: Schema, updatedSchema: Schema) {
46
+ export const updateEnumModification = createModificationType({
47
+ id: 'updateEnum',
48
+ handler: UpdateEnumModificationHandler,
49
+ })
50
+
51
+ export class UpdateEnumDiffer implements Differ {
52
+ createDiff(originalSchema: Schema, updatedSchema: Schema) {
46
53
  return Object.entries(updatedSchema.model.enums)
47
54
  .filter(
48
55
  ([name]) =>
49
56
  originalSchema.model.enums[name] &&
50
57
  !deepEqual(updatedSchema.model.enums[name], originalSchema.model.enums[name]),
51
58
  )
52
- .map(([enumName, values]) => UpdateEnumModification.createModification({ enumName, values }))
59
+ .map(([enumName, values]) => updateEnumModification.createModification({ enumName, values }))
53
60
  }
54
61
  }
55
-
56
- export interface UpdateEnumModificationData {
57
- enumName: string
58
- values: readonly string[]
59
- }
@@ -2,11 +2,10 @@ import { acceptFieldVisitor, isInverseRelation, isRelation, NamingHelper } from
2
2
  import { MigrationBuilder } from '@contember/database-migrations'
3
3
  import { Schema } from '@contember/schema'
4
4
  import { removeField, SchemaUpdater } from '../utils/schemaUpdateUtils'
5
- import { ModificationHandlerOptions, ModificationHandlerStatic } from '../ModificationHandler'
5
+ import { createModificationType, Differ, ModificationHandler, ModificationHandlerOptions } from '../ModificationHandler'
6
6
  import { isDefined } from '../../utils/isDefined'
7
7
 
8
- export const RemoveFieldModification: ModificationHandlerStatic<RemoveFieldModificationData> = class {
9
- static id = 'removeField'
8
+ export class RemoveFieldModificationHandler implements ModificationHandler<RemoveFieldModificationData> {
10
9
 
11
10
  constructor(
12
11
  private readonly data: RemoveFieldModificationData,
@@ -20,19 +19,19 @@ export const RemoveFieldModification: ModificationHandlerStatic<RemoveFieldModif
20
19
  return
21
20
  }
22
21
  acceptFieldVisitor(this.schema.model, this.data.entityName, this.data.fieldName, {
23
- visitColumn: (entity, column) => {
22
+ visitColumn: ({ entity, column }) => {
24
23
  builder.dropColumn(entity.tableName, column.columnName)
25
24
  },
26
- visitManyHasOne: (entity, relation, {}, _) => {
25
+ visitManyHasOne: ({ entity, relation }) => {
27
26
  builder.dropColumn(entity.tableName, relation.joiningColumn.columnName)
28
27
  },
29
28
  visitOneHasMany: () => {},
30
- visitOneHasOneOwning: (entity, relation, {}, _) => {
29
+ visitOneHasOneOwning: ({ entity, relation }) => {
31
30
  builder.dropConstraint(entity.tableName, NamingHelper.createUniqueConstraintName(entity.name, [relation.name]))
32
31
  builder.dropColumn(entity.tableName, relation.joiningColumn.columnName)
33
32
  },
34
33
  visitOneHasOneInverse: () => {},
35
- visitManyHasManyOwning: ({}, relation, {}, _) => {
34
+ visitManyHasManyOwning: ({ relation }) => {
36
35
  builder.dropTable(relation.joiningTable.tableName)
37
36
  },
38
37
  visitManyHasManyInverse: () => {},
@@ -47,11 +46,20 @@ export const RemoveFieldModification: ModificationHandlerStatic<RemoveFieldModif
47
46
  return { message: `Remove field ${this.data.entityName}.${this.data.fieldName}`, isDestructive: true }
48
47
  }
49
48
 
50
- static createModification(data: RemoveFieldModificationData) {
51
- return { modification: this.id, ...data }
52
- }
49
+ }
50
+
51
+ export interface RemoveFieldModificationData {
52
+ entityName: string
53
+ fieldName: string
54
+ }
53
55
 
54
- static createDiff(originalSchema: Schema, updatedSchema: Schema) {
56
+ export const removeFieldModification = createModificationType({
57
+ id: 'removeField',
58
+ handler: RemoveFieldModificationHandler,
59
+ })
60
+
61
+ export class RemoveFieldDiffer implements Differ {
62
+ createDiff(originalSchema: Schema, updatedSchema: Schema) {
55
63
  return Object.values(updatedSchema.model.entities)
56
64
  .filter(({ name }) => originalSchema.model.entities[name])
57
65
  .flatMap(entity => {
@@ -66,7 +74,7 @@ export const RemoveFieldModification: ModificationHandlerStatic<RemoveFieldModif
66
74
  return undefined
67
75
  }
68
76
  }
69
- return RemoveFieldModification.createModification({
77
+ return removeFieldModification.createModification({
70
78
  entityName: entity.name,
71
79
  fieldName: field.name,
72
80
  })
@@ -75,8 +83,3 @@ export const RemoveFieldModification: ModificationHandlerStatic<RemoveFieldModif
75
83
  })
76
84
  }
77
85
  }
78
-
79
- export interface RemoveFieldModificationData {
80
- entityName: string
81
- fieldName: string
82
- }
@@ -13,17 +13,15 @@ import {
13
13
  updateModel,
14
14
  updateSchema,
15
15
  } from '../utils/schemaUpdateUtils'
16
- import { ModificationHandler, ModificationHandlerOptions, ModificationHandlerStatic } from '../ModificationHandler'
16
+ import { createModificationType, ModificationHandler, ModificationHandlerOptions } from '../ModificationHandler'
17
17
  import { acceptFieldVisitor, NamingHelper, PredicateDefinitionProcessor } from '@contember/schema-utils'
18
18
  import { VERSION_ACL_PATCH, VERSION_UPDATE_CONSTRAINT_NAME } from '../ModificationVersions'
19
19
  import { renameConstraintSchemaUpdater, renameConstraintsSqlBuilder } from '../utils/renameConstraintsHelper'
20
20
  import { changeValue } from '../utils/valueUtils'
21
- import { UpdateColumnNameModification } from '../columns'
21
+ import { updateColumnNameModification } from '../columns'
22
22
  import { NoopModification } from '../NoopModification'
23
23
 
24
- export const UpdateFieldNameModification: ModificationHandlerStatic<UpdateFieldNameModificationData> = class {
25
- static id = 'updateFieldName'
26
-
24
+ export class UpdateFieldNameModificationHandler implements ModificationHandler<UpdateFieldNameModificationData> {
27
25
  private renameColumnSubModification: ModificationHandler<any> = new NoopModification()
28
26
 
29
27
  constructor(
@@ -32,7 +30,7 @@ export const UpdateFieldNameModification: ModificationHandlerStatic<UpdateFieldN
32
30
  private readonly options: ModificationHandlerOptions,
33
31
  ) {
34
32
  if (this.data.columnName) {
35
- this.renameColumnSubModification = new UpdateColumnNameModification({
33
+ this.renameColumnSubModification = updateColumnNameModification.createHandler({
36
34
  entityName: this.data.entityName,
37
35
  columnName: this.data.columnName,
38
36
  fieldName: this.data.fieldName,
@@ -81,33 +79,33 @@ export const UpdateFieldNameModification: ModificationHandlerStatic<UpdateFieldN
81
79
  }
82
80
 
83
81
  return acceptFieldVisitor<Model.AnyField>(this.schema.model, entity, field, {
84
- visitColumn: (entity, field) => field,
85
- visitManyHasOne: (entity, relation, targetEntity, targetRelation) => {
82
+ visitColumn: ({ column }) => column,
83
+ visitManyHasOne: ({ targetEntity, relation, targetRelation }) => {
86
84
  return isUpdatedRelation(targetEntity, targetRelation)
87
85
  ? { ...relation, inversedBy: this.data.newFieldName }
88
86
  : relation
89
87
  },
90
- visitOneHasMany: (entity, relation, targetEntity, targetRelation) => {
88
+ visitOneHasMany: ({ relation, targetEntity, targetRelation }) => {
91
89
  return isUpdatedRelation(targetEntity, targetRelation)
92
90
  ? { ...relation, ownedBy: this.data.newFieldName }
93
91
  : relation
94
92
  },
95
- visitOneHasOneOwning: (entity, relation, targetEntity, targetRelation) => {
93
+ visitOneHasOneOwning: ({ relation, targetEntity, targetRelation }) => {
96
94
  return isUpdatedRelation(targetEntity, targetRelation)
97
95
  ? { ...relation, inversedBy: this.data.newFieldName }
98
96
  : relation
99
97
  },
100
- visitOneHasOneInverse: (entity, relation, targetEntity, targetRelation) => {
98
+ visitOneHasOneInverse: ({ relation, targetEntity, targetRelation }) => {
101
99
  return isUpdatedRelation(targetEntity, targetRelation)
102
100
  ? { ...relation, ownedBy: this.data.newFieldName }
103
101
  : relation
104
102
  },
105
- visitManyHasManyOwning: (entity, relation, targetEntity, targetRelation) => {
103
+ visitManyHasManyOwning: ({ relation, targetEntity, targetRelation }) => {
106
104
  return isUpdatedRelation(targetEntity, targetRelation)
107
105
  ? { ...relation, inversedBy: this.data.newFieldName }
108
106
  : relation
109
107
  },
110
- visitManyHasManyInverse: (entity, relation, targetEntity, targetRelation) => {
108
+ visitManyHasManyInverse: ({ relation, targetEntity, targetRelation }) => {
111
109
  return isUpdatedRelation(targetEntity, targetRelation)
112
110
  ? { ...relation, ownedBy: this.data.newFieldName }
113
111
  : relation
@@ -192,10 +190,6 @@ export const UpdateFieldNameModification: ModificationHandlerStatic<UpdateFieldN
192
190
  describe() {
193
191
  return { message: `Change field name ${this.data.entityName}.${this.data.fieldName} to ${this.data.newFieldName}` }
194
192
  }
195
-
196
- static createModification(data: UpdateFieldNameModificationData) {
197
- return { modification: this.id, ...data }
198
- }
199
193
  }
200
194
 
201
195
  export interface UpdateFieldNameModificationData {
@@ -204,3 +198,8 @@ export interface UpdateFieldNameModificationData {
204
198
  newFieldName: string
205
199
  columnName?: string
206
200
  }
201
+
202
+ export const updateFieldNameModification = createModificationType({
203
+ id: 'updateFieldName',
204
+ handler: UpdateFieldNameModificationHandler,
205
+ })
@@ -0,0 +1,13 @@
1
+ export * from './acl'
2
+ export * from './columns'
3
+ export * from './constraints'
4
+ export * from './entities'
5
+ export * from './enums'
6
+ export * from './fields'
7
+ export * from './relations'
8
+ export * from './validation'
9
+ export * from './ModificationHandlerFactory'
10
+ export * from './ModificationVersions'
11
+ export * from './ModificationHandler'
12
+ export { SchemaUpdateError } from './exceptions'
13
+ export * from './utils/sqlUpdateUtils'
@@ -0,0 +1,83 @@
1
+ import { MigrationBuilder } from '@contember/database-migrations'
2
+ import { Model, Schema } from '@contember/schema'
3
+ import { SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'
4
+ import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
5
+ import { acceptFieldVisitor } from '@contember/schema-utils'
6
+
7
+ export class CreateIndexModificationHandler implements ModificationHandler<CreateIndexModificationData> {
8
+ constructor(private readonly data: CreateIndexModificationData, private readonly schema: Schema) {}
9
+
10
+ public createSql(builder: MigrationBuilder): void {
11
+ const entity = this.schema.model.entities[this.data.entityName]
12
+ if (entity.view) {
13
+ return
14
+ }
15
+ const fields = this.data.index.fields
16
+ const columns = fields.map(fieldName => {
17
+ return acceptFieldVisitor(this.schema.model, entity, fieldName, {
18
+ visitColumn: ({ column }) => {
19
+ return column.columnName
20
+ },
21
+ visitManyHasOne: ({ relation }) => {
22
+ return relation.joiningColumn.columnName
23
+ },
24
+ visitOneHasOneOwning: ({ relation }) => {
25
+ return relation.joiningColumn.columnName
26
+ },
27
+ visitOneHasMany: () => {
28
+ throw new Error(`Cannot create index on 1:m relation in ${entity.name}.${fieldName}`)
29
+ },
30
+ visitOneHasOneInverse: () => {
31
+ throw new Error(`Cannot create index on 1:1 inverse relation in ${entity.name}.${fieldName}`)
32
+ },
33
+ visitManyHasManyOwning: () => {
34
+ throw new Error(`Cannot create index on m:m relation in ${entity.name}.${fieldName}`)
35
+ },
36
+ visitManyHasManyInverse: () => {
37
+ throw new Error(`Cannot create index on m:m inverse relation in ${entity.name}.${fieldName}`)
38
+ },
39
+ })
40
+ })
41
+ builder.addIndex(entity.tableName, [...columns], {
42
+ name: this.data.index.name,
43
+ })
44
+ }
45
+
46
+ public getSchemaUpdater(): SchemaUpdater {
47
+ return updateModel(
48
+ updateEntity(this.data.entityName, ({ entity }) => ({
49
+ ...entity,
50
+ indexes: {
51
+ ...entity.indexes,
52
+ [this.data.index.name]: this.data.index,
53
+ },
54
+ })),
55
+ )
56
+ }
57
+
58
+ describe() {
59
+ return {
60
+ message: `Create index(${this.data.index.fields.join(', ')}) on entity ${this.data.entityName}`,
61
+ }
62
+ }
63
+ }
64
+
65
+ export const createIndexModification = createModificationType({
66
+ id: 'createIndex',
67
+ handler: CreateIndexModificationHandler,
68
+ })
69
+
70
+ export class CreateIndexDiffer implements Differ {
71
+ createDiff(originalSchema: Schema, updatedSchema: Schema) {
72
+ return Object.values(updatedSchema.model.entities).flatMap(entity =>
73
+ Object.values(entity.indexes)
74
+ .filter(it => !originalSchema.model.entities[entity.name].indexes[it.name])
75
+ .map(index => createIndexModification.createModification({ entityName: entity.name, index })),
76
+ )
77
+ }
78
+ }
79
+
80
+ export interface CreateIndexModificationData {
81
+ entityName: string
82
+ index: Model.Index
83
+ }
@@ -0,0 +1,68 @@
1
+ import { MigrationBuilder } from '@contember/database-migrations'
2
+ import { Schema } from '@contember/schema'
3
+ import { SchemaUpdater, updateEntity, updateModel } from '../utils/schemaUpdateUtils'
4
+ import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
5
+ import deepEqual from 'fast-deep-equal'
6
+
7
+ export class RemoveIndexModificationHandler implements ModificationHandler<RemoveIndexModificationData> {
8
+ constructor(private readonly data: RemoveIndexModificationData, private readonly schema: Schema) {}
9
+
10
+ public createSql(builder: MigrationBuilder): void {
11
+ const entity = this.schema.model.entities[this.data.entityName]
12
+ if (entity.view) {
13
+ return
14
+ }
15
+ builder.dropIndex(entity.tableName, [], {
16
+ name: this.data.indexName,
17
+ })
18
+ }
19
+
20
+ public getSchemaUpdater(): SchemaUpdater {
21
+ return updateModel(
22
+ updateEntity(this.data.entityName, ({ entity }) => {
23
+ const { [this.data.indexName]: removed, ...indexes } = entity.indexes
24
+ return {
25
+ ...entity,
26
+ indexes,
27
+ }
28
+ }),
29
+ )
30
+ }
31
+
32
+ describe() {
33
+ const fields = this.schema.model.entities[this.data.entityName].indexes[this.data.indexName].fields
34
+ return { message: `Remove index (${fields.join(', ')}) on entity ${this.data.entityName}` }
35
+ }
36
+ }
37
+
38
+ export const removeIndexModification = createModificationType({
39
+ id: 'removeIndex',
40
+ handler: RemoveIndexModificationHandler,
41
+ })
42
+
43
+
44
+ export class RemoveIndexDiffer implements Differ {
45
+
46
+ createDiff(originalSchema: Schema, updatedSchema: Schema) {
47
+ return Object.values(originalSchema.model.entities).flatMap(entity =>
48
+ Object.values(entity.indexes)
49
+ .filter(
50
+ it =>
51
+ updatedSchema.model.entities[entity.name] &&
52
+ (!updatedSchema.model.entities[entity.name].indexes[it.name] ||
53
+ !deepEqual(it.fields, updatedSchema.model.entities[entity.name].indexes[it.name].fields)),
54
+ )
55
+ .map(index =>
56
+ removeIndexModification.createModification({
57
+ entityName: entity.name,
58
+ indexName: index.name,
59
+ }),
60
+ ),
61
+ )
62
+ }
63
+ }
64
+
65
+ export interface RemoveIndexModificationData {
66
+ entityName: string
67
+ indexName: string
68
+ }
@@ -0,0 +1,2 @@
1
+ export * from './CreateIndexModification'
2
+ export * from './RemoveIndexModification'
@@ -1,16 +1,20 @@
1
1
  import { MigrationBuilder } from '@contember/database-migrations'
2
2
  import { Model, Schema } from '@contember/schema'
3
3
  import { addField, SchemaUpdater, updateEntity, updateModel, updateSchema } from '../utils/schemaUpdateUtils'
4
- import { ModificationHandler, ModificationHandlerOptions, ModificationHandlerStatic } from '../ModificationHandler'
4
+ import {
5
+ createModificationType,
6
+ Differ,
7
+ ModificationHandler,
8
+ ModificationHandlerOptions,
9
+ } from '../ModificationHandler'
5
10
  import { isInverseRelation, isOwningRelation } from '@contember/schema-utils'
6
11
  import { updateRelations } from '../utils/diffUtils'
7
- import { UpdateFieldNameModification } from '../fields'
8
12
  import { createJunctionTableSql } from '../utils/createJunctionTable'
9
13
  import { wrapIdentifier } from '@contember/database'
10
14
  import { normalizeManyHasManyRelation, PartialManyHasManyRelation } from './normalization'
15
+ import { updateFieldNameModification } from '../fields'
11
16
 
12
- export const ConvertOneHasManyToManyHasManyRelationModification: ModificationHandlerStatic<ConvertOneHasManyToManyHasManyRelationModificationData> = class {
13
- static id = 'convertOneHasManyToManyHasManyRelation'
17
+ export class ConvertOneHasManyToManyHasManyRelationModificationHandler implements ModificationHandler<ConvertOneHasManyToManyHasManyRelationModificationData> {
14
18
  private subModification: ModificationHandler<any>
15
19
 
16
20
  constructor(
@@ -18,7 +22,7 @@ export const ConvertOneHasManyToManyHasManyRelationModification: ModificationHan
18
22
  private readonly schema: Schema,
19
23
  private readonly options: ModificationHandlerOptions,
20
24
  ) {
21
- this.subModification = new UpdateFieldNameModification(
25
+ this.subModification = updateFieldNameModification.createHandler(
22
26
  {
23
27
  entityName: this.data.entityName,
24
28
  fieldName: this.data.fieldName,
@@ -63,11 +67,33 @@ export const ConvertOneHasManyToManyHasManyRelationModification: ModificationHan
63
67
  }
64
68
  }
65
69
 
66
- static createModification(data: ConvertOneHasManyToManyHasManyRelationModificationData) {
67
- return { modification: this.id, ...data }
70
+
71
+
72
+
73
+ private getRelation(): { entity: Model.Entity; relation: Model.ManyHasOneRelation } {
74
+ const entity = this.schema.model.entities[this.data.entityName]
75
+ const relation = entity.fields[this.data.fieldName]
76
+ if (relation.type !== Model.RelationType.ManyHasOne) {
77
+ throw new Error()
78
+ }
79
+ return { entity, relation }
68
80
  }
81
+ }
82
+
83
+ export const convertOneHasManyToManyHasManyRelationModification = createModificationType({
84
+ id: 'convertOneHasManyToManyHasManyRelation',
85
+ handler: ConvertOneHasManyToManyHasManyRelationModificationHandler,
86
+ })
69
87
 
70
- static createDiff(originalSchema: Schema, updatedSchema: Schema) {
88
+ export interface ConvertOneHasManyToManyHasManyRelationModificationData {
89
+ entityName: string
90
+ fieldName: string
91
+ owningSide: PartialManyHasManyRelation
92
+ inverseSide?: Model.ManyHasManyInverseRelation
93
+ }
94
+
95
+ export class ConvertOneHasManyToManyHasManyRelationDiffer implements Differ {
96
+ createDiff(originalSchema: Schema, updatedSchema: Schema) {
71
97
  return updateRelations(originalSchema, updatedSchema, ({ originalRelation, updatedRelation, updatedEntity }) => {
72
98
  if (
73
99
  isInverseRelation(originalRelation) &&
@@ -81,7 +107,7 @@ export const ConvertOneHasManyToManyHasManyRelationModification: ModificationHan
81
107
  if (owningSide.type !== Model.RelationType.ManyHasMany || !isOwningRelation(owningSide)) {
82
108
  throw new Error()
83
109
  }
84
- return ConvertOneHasManyToManyHasManyRelationModification.createModification({
110
+ return convertOneHasManyToManyHasManyRelationModification.createModification({
85
111
  entityName: updatedRelation.target,
86
112
  fieldName: owningOldName,
87
113
  owningSide,
@@ -91,20 +117,4 @@ export const ConvertOneHasManyToManyHasManyRelationModification: ModificationHan
91
117
  return undefined
92
118
  })
93
119
  }
94
-
95
- private getRelation(): { entity: Model.Entity; relation: Model.ManyHasOneRelation } {
96
- const entity = this.schema.model.entities[this.data.entityName]
97
- const relation = entity.fields[this.data.fieldName]
98
- if (relation.type !== Model.RelationType.ManyHasOne) {
99
- throw new Error()
100
- }
101
- return { entity, relation }
102
- }
103
- }
104
-
105
- export interface ConvertOneHasManyToManyHasManyRelationModificationData {
106
- entityName: string
107
- fieldName: string
108
- owningSide: PartialManyHasManyRelation
109
- inverseSide?: Model.ManyHasManyInverseRelation
110
120
  }