@contember/schema-migrations 1.2.0-alpha.9 → 1.2.0-beta.2

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 (188) hide show
  1. package/dist/src/Migration.d.ts +2 -0
  2. package/dist/src/Migration.d.ts.map +1 -1
  3. package/dist/src/Migration.js +2 -2
  4. package/dist/src/Migration.js.map +1 -1
  5. package/dist/src/MigrationCreator.d.ts +3 -1
  6. package/dist/src/MigrationCreator.d.ts.map +1 -1
  7. package/dist/src/MigrationCreator.js +2 -2
  8. package/dist/src/MigrationCreator.js.map +1 -1
  9. package/dist/src/MigrationFilesManager.d.ts.map +1 -1
  10. package/dist/src/MigrationFilesManager.js +10 -19
  11. package/dist/src/MigrationFilesManager.js.map +1 -1
  12. package/dist/src/MigrationsResolver.d.ts.map +1 -1
  13. package/dist/src/MigrationsResolver.js +1 -0
  14. package/dist/src/MigrationsResolver.js.map +1 -1
  15. package/dist/src/SchemaDiffer.d.ts +6 -1
  16. package/dist/src/SchemaDiffer.d.ts.map +1 -1
  17. package/dist/src/SchemaDiffer.js +12 -7
  18. package/dist/src/SchemaDiffer.js.map +1 -1
  19. package/dist/src/SchemaMigrator.d.ts +2 -1
  20. package/dist/src/SchemaMigrator.d.ts.map +1 -1
  21. package/dist/src/SchemaMigrator.js.map +1 -1
  22. package/dist/src/modifications/ModificationHandler.d.ts +7 -4
  23. package/dist/src/modifications/ModificationHandler.d.ts.map +1 -1
  24. package/dist/src/modifications/ModificationHandler.js.map +1 -1
  25. package/dist/src/modifications/ModificationHandlerFactory.d.ts +2 -2
  26. package/dist/src/modifications/ModificationHandlerFactory.d.ts.map +1 -1
  27. package/dist/src/modifications/ModificationHandlerFactory.js +2 -0
  28. package/dist/src/modifications/ModificationHandlerFactory.js.map +1 -1
  29. package/dist/src/modifications/columns/CreateColumnModification.d.ts +1 -3
  30. package/dist/src/modifications/columns/CreateColumnModification.d.ts.map +1 -1
  31. package/dist/src/modifications/columns/CreateColumnModification.js +3 -3
  32. package/dist/src/modifications/columns/CreateColumnModification.js.map +1 -1
  33. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.d.ts +3 -5
  34. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.d.ts.map +1 -1
  35. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.js +24 -20
  36. package/dist/src/modifications/columns/UpdateColumnDefinitionModification.js.map +1 -1
  37. package/dist/src/modifications/columns/UpdateColumnNameModification.d.ts +1 -3
  38. package/dist/src/modifications/columns/UpdateColumnNameModification.d.ts.map +1 -1
  39. package/dist/src/modifications/columns/UpdateColumnNameModification.js +7 -7
  40. package/dist/src/modifications/columns/UpdateColumnNameModification.js.map +1 -1
  41. package/dist/src/modifications/constraints/CreateUniqueConstraintModification.js +2 -2
  42. package/dist/src/modifications/constraints/CreateUniqueConstraintModification.js.map +1 -1
  43. package/dist/src/modifications/differs/RemoveChangedFieldDiffer.d.ts +1 -3
  44. package/dist/src/modifications/differs/RemoveChangedFieldDiffer.d.ts.map +1 -1
  45. package/dist/src/modifications/differs/RemoveChangedViewDiffer.d.ts +1 -2
  46. package/dist/src/modifications/differs/RemoveChangedViewDiffer.d.ts.map +1 -1
  47. package/dist/src/modifications/differs/RemoveChangedViewDiffer.js +7 -20
  48. package/dist/src/modifications/differs/RemoveChangedViewDiffer.js.map +1 -1
  49. package/dist/src/modifications/entities/CreateEntityModification.d.ts.map +1 -1
  50. package/dist/src/modifications/entities/CreateEntityModification.js +2 -2
  51. package/dist/src/modifications/entities/CreateEntityModification.js.map +1 -1
  52. package/dist/src/modifications/entities/RemoveEntityModification.d.ts +2 -1
  53. package/dist/src/modifications/entities/RemoveEntityModification.d.ts.map +1 -1
  54. package/dist/src/modifications/entities/RemoveEntityModification.js.map +1 -1
  55. package/dist/src/modifications/entities/UpdateEntityNameModification.d.ts +2 -2
  56. package/dist/src/modifications/entities/UpdateEntityNameModification.d.ts.map +1 -1
  57. package/dist/src/modifications/entities/UpdateEntityNameModification.js.map +1 -1
  58. package/dist/src/modifications/fields/RemoveFieldModification.js +4 -4
  59. package/dist/src/modifications/fields/RemoveFieldModification.js.map +1 -1
  60. package/dist/src/modifications/fields/UpdateFieldNameModification.d.ts +2 -2
  61. package/dist/src/modifications/fields/UpdateFieldNameModification.d.ts.map +1 -1
  62. package/dist/src/modifications/fields/UpdateFieldNameModification.js +7 -7
  63. package/dist/src/modifications/fields/UpdateFieldNameModification.js.map +1 -1
  64. package/dist/src/modifications/indexes/CreateIndexModification.js +3 -3
  65. package/dist/src/modifications/indexes/CreateIndexModification.js.map +1 -1
  66. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts +3 -4
  67. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.d.ts.map +1 -1
  68. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js +2 -2
  69. package/dist/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.js.map +1 -1
  70. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.d.ts +3 -4
  71. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.d.ts.map +1 -1
  72. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.js +10 -2
  73. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.js.map +1 -1
  74. package/dist/src/modifications/relations/CreateRelationInverseSideModification.d.ts +1 -3
  75. package/dist/src/modifications/relations/CreateRelationInverseSideModification.d.ts.map +1 -1
  76. package/dist/src/modifications/relations/CreateRelationModification.d.ts +3 -4
  77. package/dist/src/modifications/relations/CreateRelationModification.d.ts.map +1 -1
  78. package/dist/src/modifications/relations/CreateRelationModification.js +17 -6
  79. package/dist/src/modifications/relations/CreateRelationModification.js.map +1 -1
  80. package/dist/src/modifications/relations/DisableOrphanRemovalModification.d.ts +1 -3
  81. package/dist/src/modifications/relations/DisableOrphanRemovalModification.d.ts.map +1 -1
  82. package/dist/src/modifications/relations/EnableOrphanRemovalModification.d.ts +1 -3
  83. package/dist/src/modifications/relations/EnableOrphanRemovalModification.d.ts.map +1 -1
  84. package/dist/src/modifications/relations/MakeRelationNotNullModification.d.ts +1 -3
  85. package/dist/src/modifications/relations/MakeRelationNotNullModification.d.ts.map +1 -1
  86. package/dist/src/modifications/relations/MakeRelationNullableModification.d.ts +1 -3
  87. package/dist/src/modifications/relations/MakeRelationNullableModification.d.ts.map +1 -1
  88. package/dist/src/modifications/relations/ToggleJunctionEventLogModification.d.ts +1 -3
  89. package/dist/src/modifications/relations/ToggleJunctionEventLogModification.d.ts.map +1 -1
  90. package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.d.ts +1 -3
  91. package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.d.ts.map +1 -1
  92. package/dist/src/modifications/relations/UpdateRelationOrderByModification.d.ts +1 -3
  93. package/dist/src/modifications/relations/UpdateRelationOrderByModification.d.ts.map +1 -1
  94. package/dist/src/modifications/settings/UpdateSettingsModification.d.ts +28 -0
  95. package/dist/src/modifications/settings/UpdateSettingsModification.d.ts.map +1 -0
  96. package/dist/src/modifications/settings/UpdateSettingsModification.js +64 -0
  97. package/dist/src/modifications/settings/UpdateSettingsModification.js.map +1 -0
  98. package/dist/src/modifications/settings/index.d.ts +2 -0
  99. package/dist/src/modifications/settings/index.d.ts.map +1 -0
  100. package/dist/src/modifications/settings/index.js +18 -0
  101. package/dist/src/modifications/settings/index.js.map +1 -0
  102. package/dist/src/modifications/utils/columnUtils.d.ts +3 -0
  103. package/dist/src/modifications/utils/columnUtils.d.ts.map +1 -0
  104. package/dist/src/modifications/utils/columnUtils.js +9 -0
  105. package/dist/src/modifications/utils/columnUtils.js.map +1 -0
  106. package/dist/src/modifications/utils/createJunctionTable.d.ts +2 -1
  107. package/dist/src/modifications/utils/createJunctionTable.d.ts.map +1 -1
  108. package/dist/src/modifications/utils/createJunctionTable.js +7 -5
  109. package/dist/src/modifications/utils/createJunctionTable.js.map +1 -1
  110. package/dist/src/modifications/utils/diffUtils.d.ts +14 -12
  111. package/dist/src/modifications/utils/diffUtils.d.ts.map +1 -1
  112. package/dist/src/modifications/utils/diffUtils.js.map +1 -1
  113. package/dist/src/modifications/utils/schemaMeta.d.ts +8 -0
  114. package/dist/src/modifications/utils/schemaMeta.d.ts.map +1 -0
  115. package/dist/src/modifications/utils/schemaMeta.js +13 -0
  116. package/dist/src/modifications/utils/schemaMeta.js.map +1 -0
  117. package/dist/src/modifications/utils/schemaUpdateUtils.d.ts +4 -2
  118. package/dist/src/modifications/utils/schemaUpdateUtils.d.ts.map +1 -1
  119. package/dist/src/modifications/utils/schemaUpdateUtils.js +24 -2
  120. package/dist/src/modifications/utils/schemaUpdateUtils.js.map +1 -1
  121. package/dist/src/modifications/utils/viewDependencies.d.ts +4 -2
  122. package/dist/src/modifications/utils/viewDependencies.d.ts.map +1 -1
  123. package/dist/src/modifications/utils/viewDependencies.js +29 -6
  124. package/dist/src/modifications/utils/viewDependencies.js.map +1 -1
  125. package/dist/src/tsconfig.tsbuildinfo +1 -1
  126. package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.js +3 -2
  127. package/dist/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.js.map +1 -1
  128. package/dist/tests/cases/integration/createColumn.test.js +36 -0
  129. package/dist/tests/cases/integration/createColumn.test.js.map +1 -1
  130. package/dist/tests/cases/integration/createManyHasMany.test.js +3 -2
  131. package/dist/tests/cases/integration/createManyHasMany.test.js.map +1 -1
  132. package/dist/tests/cases/integration/createView.test.js +80 -0
  133. package/dist/tests/cases/integration/createView.test.js.map +1 -1
  134. package/dist/tests/cases/integration/removeField.test.js +72 -0
  135. package/dist/tests/cases/integration/removeField.test.js.map +1 -1
  136. package/dist/tests/cases/integration/takenIndexName.test.d.ts +2 -0
  137. package/dist/tests/cases/integration/takenIndexName.test.d.ts.map +1 -0
  138. package/dist/tests/cases/integration/takenIndexName.test.js +307 -0
  139. package/dist/tests/cases/integration/takenIndexName.test.js.map +1 -0
  140. package/dist/tests/cases/integration/updateColumnDefinition.test.js +160 -0
  141. package/dist/tests/cases/integration/updateColumnDefinition.test.js.map +1 -1
  142. package/dist/tests/scripts/checkCreateConsistentMigrations.js +5 -4
  143. package/dist/tests/scripts/checkCreateConsistentMigrations.js.map +1 -1
  144. package/dist/tests/src/tests.d.ts.map +1 -1
  145. package/dist/tests/src/tests.js +15 -5
  146. package/dist/tests/src/tests.js.map +1 -1
  147. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  148. package/package.json +6 -6
  149. package/src/Migration.ts +3 -1
  150. package/src/MigrationCreator.ts +2 -1
  151. package/src/MigrationFilesManager.ts +10 -20
  152. package/src/MigrationsResolver.ts +1 -0
  153. package/src/SchemaDiffer.ts +18 -7
  154. package/src/SchemaMigrator.ts +2 -1
  155. package/src/modifications/ModificationHandler.ts +5 -4
  156. package/src/modifications/ModificationHandlerFactory.ts +4 -1
  157. package/src/modifications/columns/CreateColumnModification.ts +3 -2
  158. package/src/modifications/columns/UpdateColumnDefinitionModification.ts +33 -24
  159. package/src/modifications/columns/UpdateColumnNameModification.ts +42 -42
  160. package/src/modifications/constraints/CreateUniqueConstraintModification.ts +2 -2
  161. package/src/modifications/differs/RemoveChangedViewDiffer.ts +9 -22
  162. package/src/modifications/entities/CreateEntityModification.ts +2 -1
  163. package/src/modifications/entities/RemoveEntityModification.ts +2 -1
  164. package/src/modifications/entities/UpdateEntityNameModification.ts +2 -1
  165. package/src/modifications/fields/RemoveFieldModification.ts +4 -4
  166. package/src/modifications/fields/UpdateFieldNameModification.ts +9 -8
  167. package/src/modifications/indexes/CreateIndexModification.ts +3 -3
  168. package/src/modifications/relations/ConvertOneHasManyToManyHasManyRelationModification.ts +13 -4
  169. package/src/modifications/relations/ConvertOneToManyRelationModification.ts +19 -3
  170. package/src/modifications/relations/CreateRelationModification.ts +33 -11
  171. package/src/modifications/settings/UpdateSettingsModification.ts +87 -0
  172. package/src/modifications/settings/index.ts +1 -0
  173. package/src/modifications/utils/columnUtils.ts +5 -0
  174. package/src/modifications/utils/createJunctionTable.ts +7 -5
  175. package/src/modifications/utils/diffUtils.ts +12 -12
  176. package/src/modifications/utils/schemaMeta.ts +18 -0
  177. package/src/modifications/utils/schemaUpdateUtils.ts +22 -2
  178. package/src/modifications/utils/viewDependencies.ts +28 -5
  179. package/src/tsconfig.json +2 -2
  180. package/tests/cases/integration/convertOneHasManyToManyHasManyRelation.test.ts +3 -2
  181. package/tests/cases/integration/createColumn.test.ts +33 -0
  182. package/tests/cases/integration/createManyHasMany.test.ts +3 -2
  183. package/tests/cases/integration/createView.test.ts +70 -0
  184. package/tests/cases/integration/removeField.test.ts +58 -0
  185. package/tests/cases/integration/takenIndexName.test.ts +314 -0
  186. package/tests/cases/integration/updateColumnDefinition.test.ts +138 -1
  187. package/tests/scripts/checkCreateConsistentMigrations.ts +3 -2
  188. package/tests/src/tests.ts +21 -11
@@ -86,3 +86,73 @@ testMigrations('create view', {
86
86
  sql: SQL`CREATE VIEW "author_stats" AS SELECT 1;`,
87
87
  })
88
88
 
89
+
90
+ namespace ViewAddRelationOriginalSchema {
91
+ export class Article {
92
+ title = def.stringColumn()
93
+ }
94
+
95
+
96
+ export class Category {
97
+ name = def.stringColumn()
98
+ }
99
+ }
100
+
101
+ namespace ViewAddRelationUpdateSchema {
102
+ export class Article {
103
+ title = def.stringColumn()
104
+ category = def.manyHasOne(Category)
105
+ stats = def.oneHasOneInverse(ArticleStats, 'article')
106
+ }
107
+
108
+ export class Category {
109
+ name = def.stringColumn()
110
+ }
111
+
112
+ @def.View('SELECT 1')
113
+ export class ArticleStats {
114
+ article = def.oneHasOne(Article, 'stats')
115
+ visitCount = def.intColumn()
116
+ }
117
+ }
118
+
119
+
120
+ testMigrations('create a relation and a view', {
121
+ originalSchema: def.createModel(ViewAddRelationOriginalSchema), updatedSchema: def.createModel(ViewAddRelationUpdateSchema), diff: [
122
+ {
123
+ modification: 'createRelation',
124
+ entityName: 'Article',
125
+ owningSide: { name: 'category', nullable: true, type: 'ManyHasOne', target: 'Category', joiningColumn: { columnName: 'category_id', onDelete: 'restrict' } },
126
+ },
127
+ {
128
+ modification: 'createView',
129
+ entity: { name: 'ArticleStats',
130
+ primary: 'id',
131
+ primaryColumn: 'id',
132
+ unique: {},
133
+ indexes: {},
134
+ fields: { id: { name: 'id', columnName: 'id', nullable: false, type: 'Uuid', columnType: 'uuid' },
135
+ article: { name: 'article', inversedBy: 'stats', nullable: true, type: 'OneHasOne', target: 'Article', joiningColumn: { columnName: 'article_id', onDelete: 'restrict' } },
136
+ visitCount: { name: 'visitCount', columnName: 'visit_count', nullable: true, type: 'Integer', columnType: 'integer' } },
137
+ tableName: 'article_stats',
138
+ eventLog: { enabled: true },
139
+ view: { sql: 'SELECT 1' } },
140
+ },
141
+ {
142
+ modification: 'createRelationInverseSide',
143
+ entityName: 'Article',
144
+ relation: {
145
+ name: 'stats',
146
+ ownedBy: 'article',
147
+ target: 'ArticleStats',
148
+ type: 'OneHasOne',
149
+ nullable: true,
150
+ },
151
+ },
152
+ ],
153
+ sql: SQL`ALTER TABLE "article" ADD "category_id" uuid;
154
+ ALTER TABLE "article" ADD CONSTRAINT "fk_article_category_id_703b8b" FOREIGN KEY ("category_id") REFERENCES "category"("id") ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE;
155
+ CREATE INDEX "article_category_id_index" ON "article" ("category_id");
156
+ CREATE VIEW "article_stats" AS SELECT 1;`,
157
+ })
158
+
@@ -2,6 +2,8 @@ import { testMigrations } from '../../src/tests'
2
2
  import { SchemaBuilder } from '@contember/schema-definition'
3
3
  import { Model } from '@contember/schema'
4
4
  import { SQL } from '../../src/tags'
5
+ import { SchemaDefinition as def } from '@contember/schema-definition'
6
+
5
7
 
6
8
  testMigrations('remove relation (many has one)', {
7
9
  originalSchema: new SchemaBuilder()
@@ -128,3 +130,59 @@ testMigrations('remove relation inverse side', {
128
130
  ],
129
131
  sql: SQL``,
130
132
  })
133
+
134
+
135
+ namespace DropIndexOrigSchema {
136
+
137
+ @def.Unique('title', 'author')
138
+ @def.Index('title', 'author')
139
+ export class Article {
140
+ title = def.stringColumn()
141
+ author = def.manyHasOne(Author)
142
+ }
143
+
144
+ export class Author {
145
+ name = def.stringColumn()
146
+ }
147
+ }
148
+
149
+ namespace DropIndexUpSchema {
150
+ @def.Unique('title', 'author')
151
+ @def.Index('title', 'author')
152
+ export class Article {
153
+ title = def.stringColumn()
154
+ author = def.stringColumn()
155
+ }
156
+
157
+ export class Author {
158
+ name = def.stringColumn()
159
+ }
160
+ }
161
+
162
+
163
+ testMigrations('test drop index / unique when removing a field', {
164
+ originalSchema: def.createModel(DropIndexOrigSchema),
165
+ updatedSchema: def.createModel(DropIndexUpSchema),
166
+ diff: [{
167
+ modification: 'removeField',
168
+ entityName: 'Article',
169
+ fieldName: 'author',
170
+ }, {
171
+ modification: 'createColumn',
172
+ entityName: 'Article',
173
+ field: { name: 'author', columnName: 'author', nullable: true, type: 'String', columnType: 'text' },
174
+ }, {
175
+ modification: 'createUniqueConstraint',
176
+ entityName: 'Article',
177
+ unique: { name: 'unique_Article_title_author_7157ea', fields: ['title', 'author'] },
178
+ }, {
179
+ modification: 'createIndex',
180
+ entityName: 'Article',
181
+ index: { name: 'idx_Article_title_author_7157ea', fields: ['title', 'author'] },
182
+ }],
183
+ sql: SQL`ALTER TABLE "article" DROP "author_id";
184
+ ALTER TABLE "article" ADD "author" text;
185
+ ALTER TABLE "article" ADD CONSTRAINT "unique_Article_title_author_7157ea" UNIQUE ("title", "author");
186
+ CREATE INDEX "idx_Article_title_author_7157ea" ON "article" ("title", "author");`,
187
+ })
188
+
@@ -0,0 +1,314 @@
1
+ import { test } from 'vitest'
2
+ import { testGenerateSql } from '../../src/tests'
3
+ import {
4
+ createEntityModification,
5
+ createRelationModification,
6
+ removeFieldModification,
7
+ updateEntityNameModification,
8
+ } from '../../../src'
9
+ import { emptyModelSchema } from '@contember/schema-utils'
10
+ import { Model } from '@contember/schema'
11
+ import { SQL } from '../../src/tags'
12
+
13
+ test('taken fk index name', () => {
14
+ testGenerateSql(emptyModelSchema, [
15
+ createEntityModification.createModification({
16
+ entity: {
17
+ fields: {
18
+ id: {
19
+ columnName: 'id',
20
+ name: 'id',
21
+ nullable: false,
22
+ type: Model.ColumnType.Uuid,
23
+ columnType: 'uuid',
24
+ },
25
+ },
26
+ name: 'Post',
27
+ primary: 'id',
28
+ primaryColumn: 'id',
29
+ tableName: 'post',
30
+ unique: {},
31
+ eventLog: {
32
+ enabled: true,
33
+ },
34
+ indexes: {},
35
+ },
36
+ }),
37
+ createEntityModification.createModification({
38
+ entity: {
39
+ fields: {
40
+ id: {
41
+ columnName: 'id',
42
+ name: 'id',
43
+ nullable: false,
44
+ type: Model.ColumnType.Uuid,
45
+ columnType: 'uuid',
46
+ },
47
+ },
48
+ name: 'Author',
49
+ primary: 'id',
50
+ primaryColumn: 'id',
51
+ tableName: 'author',
52
+ unique: {},
53
+ eventLog: {
54
+ enabled: true,
55
+ },
56
+ indexes: {},
57
+ },
58
+ }),
59
+ createRelationModification.createModification({
60
+ entityName: 'Post',
61
+ owningSide: {
62
+ name: 'author',
63
+ type: Model.RelationType.ManyHasOne,
64
+ target: 'Author',
65
+ joiningColumn: {
66
+ columnName: 'author_id',
67
+ onDelete: Model.OnDelete.cascade,
68
+ },
69
+ nullable: true,
70
+ },
71
+
72
+ }),
73
+ updateEntityNameModification.createModification({
74
+ entityName: 'Post',
75
+ newEntityName: 'Article',
76
+ tableName: 'article',
77
+ }),
78
+ createEntityModification.createModification({
79
+ entity: {
80
+ fields: {
81
+ id: {
82
+ columnName: 'id',
83
+ name: 'id',
84
+ nullable: false,
85
+ type: Model.ColumnType.Uuid,
86
+ columnType: 'uuid',
87
+ },
88
+ },
89
+ name: 'Post',
90
+ primary: 'id',
91
+ primaryColumn: 'id',
92
+ tableName: 'post',
93
+ unique: {},
94
+ eventLog: {
95
+ enabled: true,
96
+ },
97
+ indexes: {},
98
+ },
99
+ }),
100
+ createRelationModification.createModification({
101
+ entityName: 'Post',
102
+ owningSide: {
103
+ name: 'author',
104
+ type: Model.RelationType.ManyHasOne,
105
+ target: 'Author',
106
+ joiningColumn: {
107
+ columnName: 'author_id',
108
+ onDelete: Model.OnDelete.cascade,
109
+ },
110
+ nullable: true,
111
+ },
112
+
113
+ }),
114
+ ], SQL`CREATE TABLE "post" (
115
+ "id" uuid PRIMARY KEY NOT NULL
116
+ );
117
+ CREATE TRIGGER "log_event"
118
+ AFTER INSERT OR UPDATE OR DELETE ON "post"
119
+ FOR EACH ROW
120
+ EXECUTE PROCEDURE "system"."trigger_event"($pga$id$pga$);
121
+ CREATE CONSTRAINT TRIGGER "log_event_trx"
122
+ AFTER INSERT OR UPDATE OR DELETE ON "post"
123
+ DEFERRABLE INITIALLY DEFERRED
124
+ FOR EACH ROW
125
+ EXECUTE PROCEDURE "system"."trigger_event_commit"();
126
+ CREATE TABLE "author" (
127
+ "id" uuid PRIMARY KEY NOT NULL
128
+ );
129
+ CREATE TRIGGER "log_event"
130
+ AFTER INSERT OR UPDATE OR DELETE ON "author"
131
+ FOR EACH ROW
132
+ EXECUTE PROCEDURE "system"."trigger_event"($pga$id$pga$);
133
+ CREATE CONSTRAINT TRIGGER "log_event_trx"
134
+ AFTER INSERT OR UPDATE OR DELETE ON "author"
135
+ DEFERRABLE INITIALLY DEFERRED
136
+ FOR EACH ROW
137
+ EXECUTE PROCEDURE "system"."trigger_event_commit"();
138
+ ALTER TABLE "post"
139
+ ADD "author_id" uuid;
140
+ ALTER TABLE "post"
141
+ ADD CONSTRAINT "fk_post_author_id_87ef9a" FOREIGN KEY ("author_id") REFERENCES "author"("id") ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE;
142
+ CREATE INDEX "post_author_id_index" ON "post" ("author_id");
143
+ ALTER TABLE "post" RENAME TO "article";
144
+ CREATE TABLE "post" (
145
+ "id" uuid PRIMARY KEY NOT NULL
146
+ );
147
+ CREATE TRIGGER "log_event"
148
+ AFTER INSERT OR UPDATE OR DELETE ON "post"
149
+ FOR EACH ROW
150
+ EXECUTE PROCEDURE "system"."trigger_event"($pga$id$pga$);
151
+ CREATE CONSTRAINT TRIGGER "log_event_trx"
152
+ AFTER INSERT OR UPDATE OR DELETE ON "post"
153
+ DEFERRABLE INITIALLY DEFERRED
154
+ FOR EACH ROW
155
+ EXECUTE PROCEDURE "system"."trigger_event_commit"();
156
+ ALTER TABLE "post"
157
+ ADD "author_id" uuid;
158
+ ALTER TABLE "post"
159
+ ADD CONSTRAINT "fk_post_author_id_87ef9a" FOREIGN KEY ("author_id") REFERENCES "author"("id") ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE;
160
+ CREATE INDEX "post_author_id_index1" ON "post" ("author_id");`)
161
+ })
162
+
163
+
164
+ test('taken junction table index name', () => {
165
+ testGenerateSql(emptyModelSchema, [
166
+ createEntityModification.createModification({
167
+ entity: {
168
+ fields: {
169
+ id: {
170
+ columnName: 'id',
171
+ name: 'id',
172
+ nullable: false,
173
+ type: Model.ColumnType.Uuid,
174
+ columnType: 'uuid',
175
+ },
176
+ },
177
+ name: 'Post',
178
+ primary: 'id',
179
+ primaryColumn: 'id',
180
+ tableName: 'post',
181
+ unique: {},
182
+ eventLog: {
183
+ enabled: true,
184
+ },
185
+ indexes: {},
186
+ },
187
+ }),
188
+ createEntityModification.createModification({
189
+ entity: {
190
+ fields: {
191
+ id: {
192
+ columnName: 'id',
193
+ name: 'id',
194
+ nullable: false,
195
+ type: Model.ColumnType.Uuid,
196
+ columnType: 'uuid',
197
+ },
198
+ },
199
+ name: 'Author',
200
+ primary: 'id',
201
+ primaryColumn: 'id',
202
+ tableName: 'author',
203
+ unique: {},
204
+ eventLog: {
205
+ enabled: true,
206
+ },
207
+ indexes: {},
208
+ },
209
+ }),
210
+ createRelationModification.createModification({
211
+ entityName: 'Post',
212
+ owningSide: {
213
+ name: 'authors',
214
+ type: Model.RelationType.ManyHasMany,
215
+ target: 'Author',
216
+ joiningTable: {
217
+ tableName: 'post_authors',
218
+ joiningColumn: {
219
+ columnName: 'post_id',
220
+ onDelete: Model.OnDelete.cascade,
221
+ },
222
+ inverseJoiningColumn: {
223
+ columnName: 'author_id',
224
+ onDelete: Model.OnDelete.cascade,
225
+ },
226
+ eventLog: {
227
+ enabled: true,
228
+ },
229
+ },
230
+ },
231
+ }),
232
+ removeFieldModification.createModification({
233
+ entityName: 'Post',
234
+ fieldName: 'authors',
235
+ }),
236
+ createRelationModification.createModification({
237
+ entityName: 'Post',
238
+ owningSide: {
239
+ name: 'authors',
240
+ type: Model.RelationType.ManyHasMany,
241
+ target: 'Author',
242
+ joiningTable: {
243
+ tableName: 'post_authors',
244
+ joiningColumn: {
245
+ columnName: 'post_id',
246
+ onDelete: Model.OnDelete.cascade,
247
+ },
248
+ inverseJoiningColumn: {
249
+ columnName: 'author_id',
250
+ onDelete: Model.OnDelete.cascade,
251
+ },
252
+ eventLog: {
253
+ enabled: true,
254
+ },
255
+ },
256
+ },
257
+ }),
258
+ ], SQL`CREATE TABLE "post" (
259
+ "id" uuid PRIMARY KEY NOT NULL
260
+ );
261
+ CREATE TRIGGER "log_event"
262
+ AFTER INSERT OR UPDATE OR DELETE ON "post"
263
+ FOR EACH ROW
264
+ EXECUTE PROCEDURE "system"."trigger_event"($pga$id$pga$);
265
+ CREATE CONSTRAINT TRIGGER "log_event_trx"
266
+ AFTER INSERT OR UPDATE OR DELETE ON "post"
267
+ DEFERRABLE INITIALLY DEFERRED
268
+ FOR EACH ROW
269
+ EXECUTE PROCEDURE "system"."trigger_event_commit"();
270
+ CREATE TABLE "author" (
271
+ "id" uuid PRIMARY KEY NOT NULL
272
+ );
273
+ CREATE TRIGGER "log_event"
274
+ AFTER INSERT OR UPDATE OR DELETE ON "author"
275
+ FOR EACH ROW
276
+ EXECUTE PROCEDURE "system"."trigger_event"($pga$id$pga$);
277
+ CREATE CONSTRAINT TRIGGER "log_event_trx"
278
+ AFTER INSERT OR UPDATE OR DELETE ON "author"
279
+ DEFERRABLE INITIALLY DEFERRED
280
+ FOR EACH ROW
281
+ EXECUTE PROCEDURE "system"."trigger_event_commit"();
282
+ CREATE TABLE "post_authors" (
283
+ "post_id" uuid NOT NULL REFERENCES "post"("id") ON DELETE CASCADE,
284
+ "author_id" uuid NOT NULL REFERENCES "author"("id") ON DELETE CASCADE
285
+ );
286
+ ALTER TABLE "post_authors"
287
+ ADD CONSTRAINT "post_authors_pkey" PRIMARY KEY ("post_id", "author_id");
288
+ CREATE TRIGGER "log_event"
289
+ AFTER INSERT OR UPDATE OR DELETE ON "post_authors"
290
+ FOR EACH ROW
291
+ EXECUTE PROCEDURE "system"."trigger_event"($pga$post_id$pga$, $pga$author_id$pga$);
292
+ CREATE CONSTRAINT TRIGGER "log_event_trx"
293
+ AFTER INSERT OR UPDATE OR DELETE ON "post_authors"
294
+ DEFERRABLE INITIALLY DEFERRED
295
+ FOR EACH ROW
296
+ EXECUTE PROCEDURE "system"."trigger_event_commit"();
297
+ DROP TABLE "post_authors";
298
+ CREATE TABLE "post_authors" (
299
+ "post_id" uuid NOT NULL REFERENCES "post"("id") ON DELETE CASCADE,
300
+ "author_id" uuid NOT NULL REFERENCES "author"("id") ON DELETE CASCADE
301
+ );
302
+ ALTER TABLE "post_authors"
303
+ ADD CONSTRAINT "post_authors_pkey1" PRIMARY KEY ("post_id", "author_id");
304
+ CREATE TRIGGER "log_event"
305
+ AFTER INSERT OR UPDATE OR DELETE ON "post_authors"
306
+ FOR EACH ROW
307
+ EXECUTE PROCEDURE "system"."trigger_event"($pga$post_id$pga$, $pga$author_id$pga$);
308
+ CREATE CONSTRAINT TRIGGER "log_event_trx"
309
+ AFTER INSERT OR UPDATE OR DELETE ON "post_authors"
310
+ DEFERRABLE INITIALLY DEFERRED
311
+ FOR EACH ROW
312
+ EXECUTE PROCEDURE "system"."trigger_event_commit"();
313
+ `)
314
+ })
@@ -1,7 +1,8 @@
1
1
  import { testMigrations } from '../../src/tests'
2
- import { SchemaBuilder } from '@contember/schema-definition'
2
+ import { SchemaBuilder, SchemaDefinition as def, createSchema } from '@contember/schema-definition'
3
3
  import { Model } from '@contember/schema'
4
4
  import { SQL } from '../../src/tags'
5
+ import { updateColumnDefinitionModification } from '../../../src'
5
6
 
6
7
  testMigrations('update column definition', {
7
8
  originalSchema: new SchemaBuilder()
@@ -31,3 +32,139 @@ testMigrations('update column definition', {
31
32
  sql: SQL`ALTER TABLE "author"
32
33
  ALTER "registered_at" SET DATA TYPE timestamptz USING "registered_at"::timestamptz;`,
33
34
  })
35
+
36
+ namespace SeqOrig {
37
+ export class Author {
38
+ idSeq = def.intColumn()
39
+ }
40
+ }
41
+ namespace SeqUpdated {
42
+ export class Author {
43
+ idSeq = def.intColumn().notNull().sequence({ start: 10 })
44
+ }
45
+ }
46
+ testMigrations('add sequence to existing column', {
47
+ originalSchema: createSchema(SeqOrig).model,
48
+ updatedSchema: createSchema(SeqUpdated).model,
49
+ diff: [
50
+ updateColumnDefinitionModification.createModification({
51
+ entityName: 'Author',
52
+ fieldName: 'idSeq',
53
+ definition: {
54
+ type: Model.ColumnType.Int,
55
+ columnType: 'integer',
56
+ nullable: false,
57
+ sequence: {
58
+ precedence: 'BY DEFAULT',
59
+ start: 10,
60
+ },
61
+ },
62
+ }),
63
+ ],
64
+ sql: SQL`
65
+ ALTER TABLE "author"
66
+ ALTER "id_seq" SET DATA TYPE integer USING COALESCE("id_seq"::integer, nextval(PG_GET_SERIAL_SEQUENCE($pga$author$pga$, $pga$id_seq$pga$))),
67
+ ALTER "id_seq" SET NOT NULL,
68
+ ALTER "id_seq" ADD GENERATED BY DEFAULT AS IDENTITY (START WITH 10);`,
69
+ })
70
+
71
+
72
+ namespace ViewColDepOrig {
73
+ export class Author {
74
+ val = def.intColumn()
75
+ }
76
+
77
+ @def.View('SELECT * FROM author', {
78
+ dependencies: [Author],
79
+ })
80
+ export class AuthorMetaX {
81
+
82
+ }
83
+
84
+ @def.View('SELECT * FROM author_meta_x', {
85
+ dependencies: [AuthorMetaX],
86
+ })
87
+ export class AuthorMetaY {
88
+ }
89
+ }
90
+
91
+ namespace ViewColDepUpdated {
92
+ export class Author {
93
+ val = def.stringColumn()
94
+ }
95
+
96
+ @def.View('SELECT * FROM author', {
97
+ dependencies: [Author],
98
+ })
99
+ export class AuthorMetaX {
100
+
101
+ }
102
+
103
+ @def.View('SELECT * FROM author_meta_x', {
104
+ dependencies: [AuthorMetaX],
105
+ })
106
+ export class AuthorMetaY {
107
+ }
108
+ }
109
+
110
+ testMigrations('recreate view dependent on entity after changing column type', {
111
+ originalSchema: createSchema(ViewColDepOrig).model,
112
+ updatedSchema: createSchema(ViewColDepUpdated).model,
113
+ diff: [{ modification: 'removeEntity', entityName: 'AuthorMetaY' }, {
114
+ modification: 'removeEntity',
115
+ entityName: 'AuthorMetaX',
116
+ }, {
117
+ modification: 'updateColumnDefinition',
118
+ entityName: 'Author',
119
+ fieldName: 'val',
120
+ definition: { nullable: true, type: 'String', columnType: 'text' },
121
+ }, {
122
+ modification: 'createView',
123
+ entity: {
124
+ name: 'AuthorMetaX',
125
+ primary: 'id',
126
+ primaryColumn: 'id',
127
+ unique: {},
128
+ indexes: {},
129
+ fields: {
130
+ id: {
131
+ name: 'id',
132
+ columnName: 'id',
133
+ nullable: false,
134
+ type: 'Uuid',
135
+ columnType: 'uuid',
136
+ },
137
+ },
138
+ tableName: 'author_meta_x',
139
+ eventLog: { enabled: true },
140
+ view: { sql: 'SELECT * FROM author', dependencies: ['Author'] },
141
+ },
142
+ }, {
143
+ modification: 'createView',
144
+ entity: {
145
+ name: 'AuthorMetaY',
146
+ primary: 'id',
147
+ primaryColumn: 'id',
148
+ unique: {},
149
+ indexes: {},
150
+ fields: {
151
+ id: {
152
+ name: 'id',
153
+ columnName: 'id',
154
+ nullable: false,
155
+ type: 'Uuid',
156
+ columnType: 'uuid',
157
+ },
158
+ },
159
+ tableName: 'author_meta_y',
160
+ eventLog: { enabled: true },
161
+ view: { sql: 'SELECT * FROM author_meta_x', dependencies: ['AuthorMetaX'] },
162
+ },
163
+ }],
164
+ sql: SQL`DROP VIEW "author_meta_y";
165
+ DROP VIEW "author_meta_x";
166
+ ALTER TABLE "author"
167
+ ALTER "val" SET DATA TYPE text USING "val"::text;
168
+ CREATE VIEW "author_meta_x" AS SELECT * FROM author;
169
+ CREATE VIEW "author_meta_y" AS SELECT * FROM author_meta_x;`,
170
+ })
@@ -1,4 +1,4 @@
1
- import { relative } from 'path'
1
+ import { relative } from 'node:path'
2
2
  import {
3
3
  MigrationFilesManager,
4
4
  MigrationsResolver,
@@ -18,7 +18,8 @@ import { emptySchema, schemaType } from '@contember/schema-utils'
18
18
  for (const migration of await migrationsResolver.getMigrations()) {
19
19
  const nextSchema = migrator.applyModifications(schema, migration.modifications, migration.formatVersion)
20
20
  schemaType(nextSchema)
21
- differ.diffSchemas(schema, nextSchema)
21
+ const { meta, ...nextSchemaWithoutMeta } = nextSchema
22
+ differ.diffSchemas(schema, nextSchemaWithoutMeta)
22
23
 
23
24
  schema = nextSchema
24
25
  }
@@ -2,6 +2,8 @@ import { Migration, ModificationHandlerFactory, SchemaDiffer, SchemaMigrator, VE
2
2
  import { Acl, Model } from '@contember/schema'
3
3
  import { createMigrationBuilder } from '@contember/database-migrations'
4
4
  import { assert, describe, it } from 'vitest'
5
+ import { SchemaWithMeta } from '../../src/modifications/utils/schemaMeta'
6
+ import { emptySchema } from '@contember/schema-utils'
5
7
 
6
8
  const modificationFactory = new ModificationHandlerFactory(ModificationHandlerFactory.defaultFactoryMap)
7
9
  const schemaMigrator = new SchemaMigrator(modificationFactory)
@@ -27,17 +29,24 @@ export function testDiffSchemas(
27
29
  updatedAcl: Acl.Schema = emptyAcl,
28
30
  ) {
29
31
  const actualDiff = schemaDiffer.diffSchemas(
30
- { model: originalModel, acl: originalAcl, validation: {} },
31
- { model: updatedModel, acl: updatedAcl, validation: {} },
32
- false,
32
+ { ...emptySchema, model: originalModel, acl: originalAcl, validation: {} },
33
+ { ...emptySchema, model: updatedModel, acl: updatedAcl, validation: {} },
34
+ { skipRecreateValidation: true },
33
35
  )
34
- assert.deepStrictEqual(actualDiff, expectedDiff)
35
- const schema = schemaMigrator.applyModifications(
36
- { model: originalModel, acl: originalAcl, validation: {} },
36
+ try {
37
+ assert.deepStrictEqual(actualDiff, expectedDiff)
38
+ } catch (e) {
39
+ // eslint-disable-next-line no-console
40
+ console.log(JSON.stringify(actualDiff))
41
+ throw e
42
+ }
43
+ const { meta, ...schema } = schemaMigrator.applyModifications(
44
+ { ...emptySchema, model: originalModel, acl: originalAcl, validation: {} },
37
45
  actualDiff,
38
46
  VERSION_LATEST,
39
- )
47
+ ) as SchemaWithMeta
40
48
  assert.deepStrictEqual(schema, {
49
+ ...emptySchema,
41
50
  model: updatedModel,
42
51
  acl: updatedAcl,
43
52
  validation: {},
@@ -51,13 +60,14 @@ export function testApplyDiff(
51
60
  originalAcl: Acl.Schema = emptyAcl,
52
61
  expectedAcl: Acl.Schema = emptyAcl,
53
62
  ) {
54
- const actualSchema = schemaMigrator.applyModifications(
55
- { model: originalModel, acl: originalAcl, validation: {} },
63
+ const { meta, ...actualSchema } = schemaMigrator.applyModifications(
64
+ { ...emptySchema, model: originalModel, acl: originalAcl, validation: {} },
56
65
  diff,
57
66
  VERSION_LATEST,
58
- )
67
+ ) as SchemaWithMeta
59
68
 
60
69
  assert.deepStrictEqual(actualSchema, {
70
+ ...emptySchema,
61
71
  model: expectedModel,
62
72
  acl: expectedAcl,
63
73
  validation: {},
@@ -65,7 +75,7 @@ export function testApplyDiff(
65
75
  }
66
76
 
67
77
  export function testGenerateSql(originalSchema: Model.Schema, diff: Migration.Modification[], expectedSql: string) {
68
- let schema = { model: originalSchema, acl: emptyAcl, validation: {} }
78
+ let schema = { ...emptySchema, model: originalSchema, acl: emptyAcl, validation: {} }
69
79
  const builder = createMigrationBuilder()
70
80
  for (let { modification, ...data } of diff) {
71
81
  const modificationHandler = modificationFactory.create(modification, data, schema, { formatVersion: VERSION_LATEST, systemSchema: 'system' })