@contember/schema-migrations 1.4.0-alpha.1 → 1.4.0-alpha.3

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 (136) hide show
  1. package/dist/src/Migration.d.ts +1 -1
  2. package/dist/src/Migration.d.ts.map +1 -1
  3. package/dist/src/SchemaDiffer.d.ts.map +1 -1
  4. package/dist/src/SchemaDiffer.js +2 -0
  5. package/dist/src/SchemaDiffer.js.map +1 -1
  6. package/dist/src/index.d.ts +0 -4
  7. package/dist/src/index.d.ts.map +1 -1
  8. package/dist/src/index.js +0 -4
  9. package/dist/src/index.js.map +1 -1
  10. package/dist/src/modifications/ModificationHandlerFactory.d.ts.map +1 -1
  11. package/dist/src/modifications/ModificationHandlerFactory.js +2 -0
  12. package/dist/src/modifications/ModificationHandlerFactory.js.map +1 -1
  13. package/dist/src/modifications/acl/PatchAclSchemaModification.d.ts +1 -2
  14. package/dist/src/modifications/acl/PatchAclSchemaModification.d.ts.map +1 -1
  15. package/dist/src/modifications/acl/PatchAclSchemaModification.js +1 -1
  16. package/dist/src/modifications/acl/PatchAclSchemaModification.js.map +1 -1
  17. package/dist/src/modifications/acl/UpdateAclSchemaModification.d.ts +1 -2
  18. package/dist/src/modifications/acl/UpdateAclSchemaModification.d.ts.map +1 -1
  19. package/dist/src/modifications/acl/UpdateAclSchemaModification.js +1 -1
  20. package/dist/src/modifications/acl/UpdateAclSchemaModification.js.map +1 -1
  21. package/dist/src/modifications/actions/CreateTargetModification.d.ts +1 -2
  22. package/dist/src/modifications/actions/CreateTargetModification.d.ts.map +1 -1
  23. package/dist/src/modifications/actions/CreateTargetModification.js +1 -1
  24. package/dist/src/modifications/actions/CreateTargetModification.js.map +1 -1
  25. package/dist/src/modifications/actions/CreateTriggerModification.d.ts +1 -2
  26. package/dist/src/modifications/actions/CreateTriggerModification.d.ts.map +1 -1
  27. package/dist/src/modifications/actions/CreateTriggerModification.js +1 -1
  28. package/dist/src/modifications/actions/CreateTriggerModification.js.map +1 -1
  29. package/dist/src/modifications/actions/RemoveTargetModification.d.ts +1 -2
  30. package/dist/src/modifications/actions/RemoveTargetModification.d.ts.map +1 -1
  31. package/dist/src/modifications/actions/RemoveTargetModification.js +1 -1
  32. package/dist/src/modifications/actions/RemoveTargetModification.js.map +1 -1
  33. package/dist/src/modifications/actions/RemoveTriggerModification.d.ts +1 -2
  34. package/dist/src/modifications/actions/RemoveTriggerModification.d.ts.map +1 -1
  35. package/dist/src/modifications/actions/RemoveTriggerModification.js +1 -1
  36. package/dist/src/modifications/actions/RemoveTriggerModification.js.map +1 -1
  37. package/dist/src/modifications/actions/UpdateTargetModification.d.ts +1 -2
  38. package/dist/src/modifications/actions/UpdateTargetModification.d.ts.map +1 -1
  39. package/dist/src/modifications/actions/UpdateTargetModification.js +1 -1
  40. package/dist/src/modifications/actions/UpdateTargetModification.js.map +1 -1
  41. package/dist/src/modifications/actions/UpdateTriggerModification.d.ts +1 -2
  42. package/dist/src/modifications/actions/UpdateTriggerModification.d.ts.map +1 -1
  43. package/dist/src/modifications/actions/UpdateTriggerModification.js +1 -1
  44. package/dist/src/modifications/actions/UpdateTriggerModification.js.map +1 -1
  45. package/dist/src/modifications/relations/ConvertOneHasManyToOneHasOneRelationModification.d.ts +28 -0
  46. package/dist/src/modifications/relations/ConvertOneHasManyToOneHasOneRelationModification.d.ts.map +1 -0
  47. package/dist/src/modifications/relations/ConvertOneHasManyToOneHasOneRelationModification.js +98 -0
  48. package/dist/src/modifications/relations/ConvertOneHasManyToOneHasOneRelationModification.js.map +1 -0
  49. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.d.ts.map +1 -1
  50. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.js +4 -2
  51. package/dist/src/modifications/relations/ConvertOneToManyRelationModification.js.map +1 -1
  52. package/dist/src/modifications/relations/CreateRelationInverseSideModification.d.ts +1 -2
  53. package/dist/src/modifications/relations/CreateRelationInverseSideModification.d.ts.map +1 -1
  54. package/dist/src/modifications/relations/CreateRelationInverseSideModification.js +1 -1
  55. package/dist/src/modifications/relations/CreateRelationInverseSideModification.js.map +1 -1
  56. package/dist/src/modifications/relations/DisableOrphanRemovalModification.d.ts +1 -2
  57. package/dist/src/modifications/relations/DisableOrphanRemovalModification.d.ts.map +1 -1
  58. package/dist/src/modifications/relations/DisableOrphanRemovalModification.js +1 -1
  59. package/dist/src/modifications/relations/DisableOrphanRemovalModification.js.map +1 -1
  60. package/dist/src/modifications/relations/EnableOrphanRemovalModification.d.ts +1 -2
  61. package/dist/src/modifications/relations/EnableOrphanRemovalModification.d.ts.map +1 -1
  62. package/dist/src/modifications/relations/EnableOrphanRemovalModification.js +1 -1
  63. package/dist/src/modifications/relations/EnableOrphanRemovalModification.js.map +1 -1
  64. package/dist/src/modifications/relations/UpdateRelationOrderByModification.d.ts +1 -2
  65. package/dist/src/modifications/relations/UpdateRelationOrderByModification.d.ts.map +1 -1
  66. package/dist/src/modifications/relations/UpdateRelationOrderByModification.js +1 -1
  67. package/dist/src/modifications/relations/UpdateRelationOrderByModification.js.map +1 -1
  68. package/dist/src/modifications/settings/UpdateSettingsModification.d.ts +1 -2
  69. package/dist/src/modifications/settings/UpdateSettingsModification.d.ts.map +1 -1
  70. package/dist/src/modifications/settings/UpdateSettingsModification.js +1 -1
  71. package/dist/src/modifications/settings/UpdateSettingsModification.js.map +1 -1
  72. package/dist/src/modifications/validation/PatchValidationSchemaModification.d.ts +1 -2
  73. package/dist/src/modifications/validation/PatchValidationSchemaModification.d.ts.map +1 -1
  74. package/dist/src/modifications/validation/PatchValidationSchemaModification.js +1 -1
  75. package/dist/src/modifications/validation/PatchValidationSchemaModification.js.map +1 -1
  76. package/dist/src/modifications/validation/UpdateValidationSchemaModification.d.ts +1 -2
  77. package/dist/src/modifications/validation/UpdateValidationSchemaModification.d.ts.map +1 -1
  78. package/dist/src/modifications/validation/UpdateValidationSchemaModification.js +1 -1
  79. package/dist/src/modifications/validation/UpdateValidationSchemaModification.js.map +1 -1
  80. package/dist/src/tsconfig.tsbuildinfo +1 -1
  81. package/dist/tests/cases/integration/convertManyHasOneToOneHasOneRelation.test.d.ts +2 -0
  82. package/dist/tests/cases/integration/convertManyHasOneToOneHasOneRelation.test.d.ts.map +1 -0
  83. package/dist/tests/cases/integration/convertManyHasOneToOneHasOneRelation.test.js +59 -0
  84. package/dist/tests/cases/integration/convertManyHasOneToOneHasOneRelation.test.js.map +1 -0
  85. package/dist/tests/cases/integration/convertOneToManyRelation.test.js +37 -0
  86. package/dist/tests/cases/integration/convertOneToManyRelation.test.js.map +1 -1
  87. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  88. package/package.json +7 -7
  89. package/src/Migration.ts +1 -1
  90. package/src/SchemaDiffer.ts +2 -0
  91. package/src/index.ts +0 -4
  92. package/src/modifications/ModificationHandlerFactory.ts +2 -0
  93. package/src/modifications/acl/PatchAclSchemaModification.ts +1 -2
  94. package/src/modifications/acl/UpdateAclSchemaModification.ts +1 -2
  95. package/src/modifications/actions/CreateTargetModification.ts +1 -2
  96. package/src/modifications/actions/CreateTriggerModification.ts +1 -2
  97. package/src/modifications/actions/RemoveTargetModification.ts +1 -2
  98. package/src/modifications/actions/RemoveTriggerModification.ts +1 -2
  99. package/src/modifications/actions/UpdateTargetModification.ts +1 -3
  100. package/src/modifications/actions/UpdateTriggerModification.ts +1 -2
  101. package/src/modifications/relations/ConvertOneHasManyToOneHasOneRelationModification.ts +145 -0
  102. package/src/modifications/relations/ConvertOneToManyRelationModification.ts +3 -2
  103. package/src/modifications/relations/CreateRelationInverseSideModification.ts +1 -2
  104. package/src/modifications/relations/DisableOrphanRemovalModification.ts +1 -2
  105. package/src/modifications/relations/EnableOrphanRemovalModification.ts +1 -2
  106. package/src/modifications/relations/UpdateRelationOrderByModification.ts +1 -2
  107. package/src/modifications/settings/UpdateSettingsModification.ts +1 -2
  108. package/src/modifications/validation/PatchValidationSchemaModification.ts +1 -2
  109. package/src/modifications/validation/UpdateValidationSchemaModification.ts +1 -2
  110. package/tests/cases/integration/convertManyHasOneToOneHasOneRelation.test.ts +48 -0
  111. package/tests/cases/integration/convertOneToManyRelation.test.ts +42 -0
  112. package/dist/src/MigrationCreator.d.ts +0 -20
  113. package/dist/src/MigrationCreator.d.ts.map +0 -1
  114. package/dist/src/MigrationCreator.js +0 -37
  115. package/dist/src/MigrationCreator.js.map +0 -1
  116. package/dist/src/MigrationFilesManager.d.ts +0 -22
  117. package/dist/src/MigrationFilesManager.d.ts.map +0 -1
  118. package/dist/src/MigrationFilesManager.js +0 -99
  119. package/dist/src/MigrationFilesManager.js.map +0 -1
  120. package/dist/src/MigrationsResolver.d.ts +0 -9
  121. package/dist/src/MigrationsResolver.d.ts.map +0 -1
  122. package/dist/src/MigrationsResolver.js +0 -27
  123. package/dist/src/MigrationsResolver.js.map +0 -1
  124. package/dist/src/SchemaVersionBuilder.d.ts +0 -13
  125. package/dist/src/SchemaVersionBuilder.d.ts.map +0 -1
  126. package/dist/src/SchemaVersionBuilder.js +0 -26
  127. package/dist/src/SchemaVersionBuilder.js.map +0 -1
  128. package/dist/tests/scripts/checkCreateConsistentMigrations.d.ts +0 -2
  129. package/dist/tests/scripts/checkCreateConsistentMigrations.d.ts.map +0 -1
  130. package/dist/tests/scripts/checkCreateConsistentMigrations.js +0 -28
  131. package/dist/tests/scripts/checkCreateConsistentMigrations.js.map +0 -1
  132. package/src/MigrationCreator.ts +0 -50
  133. package/src/MigrationFilesManager.ts +0 -91
  134. package/src/MigrationsResolver.ts +0 -25
  135. package/src/SchemaVersionBuilder.ts +0 -33
  136. package/tests/scripts/checkCreateConsistentMigrations.ts +0 -32
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contember/schema-migrations",
3
- "version": "1.4.0-alpha.1",
3
+ "version": "1.4.0-alpha.3",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/src/index.js",
6
6
  "typings": "dist/src/index.d.ts",
@@ -12,16 +12,16 @@
12
12
  "test": "vitest --dir ./tests/cases"
13
13
  },
14
14
  "dependencies": {
15
- "@contember/database": "1.4.0-alpha.1",
16
- "@contember/database-migrations": "1.4.0-alpha.1",
17
- "@contember/engine-common": "1.4.0-alpha.1",
18
- "@contember/schema": "1.4.0-alpha.1",
19
- "@contember/schema-utils": "1.4.0-alpha.1",
15
+ "@contember/database": "1.4.0-alpha.3",
16
+ "@contember/database-migrations": "1.4.0-alpha.3",
17
+ "@contember/engine-common": "1.4.0-alpha.3",
18
+ "@contember/schema": "1.4.0-alpha.3",
19
+ "@contember/schema-utils": "1.4.0-alpha.3",
20
20
  "fast-deep-equal": "^3.1.3",
21
21
  "rfc6902": "^5.0.1"
22
22
  },
23
23
  "devDependencies": {
24
- "@contember/schema-definition": "1.4.0-alpha.1"
24
+ "@contember/schema-definition": "1.4.0-alpha.3"
25
25
  },
26
26
  "peerDependencies": {
27
27
  "pg": "^8.9.0"
package/src/Migration.ts CHANGED
@@ -5,7 +5,7 @@ export interface MigrationInfo {
5
5
  readonly version: string // YYYY-MM-DD-HHIISS
6
6
  readonly name: string // version-label
7
7
  readonly formatVersion: number
8
- readonly skippedErrors?: SchemaValidatorSkippedErrors[]
8
+ readonly skippedErrors?: readonly SchemaValidatorSkippedErrors[]
9
9
  }
10
10
 
11
11
  interface Migration extends MigrationInfo {
@@ -43,6 +43,7 @@ import { CreateTargetDiffer } from './modifications/actions/CreateTargetModifica
43
43
  import { RemoveTargetDiffer } from './modifications/actions/RemoveTargetModification'
44
44
  import { UpdateSettingsDiffer } from './modifications/settings'
45
45
  import { RemoveIndexNamesDiffer } from './modifications/upgrade/RemoveIndexNamesModification'
46
+ import { ConvertOneHasManyToOneHasOneRelationDiffer } from './modifications/relations/ConvertOneHasManyToOneHasOneRelationModification'
46
47
 
47
48
  type DiffOptions = { skipRecreateValidation?: boolean; skipInitialSchemaValidation?: boolean }
48
49
 
@@ -69,6 +70,7 @@ export class SchemaDiffer {
69
70
  new UpdateSettingsDiffer(),
70
71
  new ConvertOneToManyRelationDiffer(),
71
72
  new ConvertOneHasManyToManyHasManyRelationDiffer(),
73
+ new ConvertOneHasManyToOneHasOneRelationDiffer(),
72
74
  new RemoveUniqueConstraintDiffer(),
73
75
  new RemoveIndexDiffer(),
74
76
  new RemoveViewDiffer(),
package/src/index.ts CHANGED
@@ -1,11 +1,7 @@
1
1
  export * from './SchemaDiffer'
2
2
  export * from './Migration'
3
- export * from './MigrationsResolver'
4
- export * from './SchemaVersionBuilder'
5
3
  export * from './SchemaMigrator'
6
4
  export * from './SchemaDiffer'
7
- export * from './MigrationCreator'
8
5
  export * from './MigrationDescriber'
9
6
  export * from './modifications'
10
- export * from './MigrationFilesManager'
11
7
  export { MigrationVersionHelper } from '@contember/engine-common'
@@ -36,6 +36,7 @@ import { removeTargetModification } from './actions/RemoveTargetModification'
36
36
  import { updateTargetModification } from './actions/UpdateTargetModification'
37
37
  import { updateEntityOrderByModification } from './entities/UpdateEntityOrderByModification'
38
38
  import { removeIndexNamesModification } from './upgrade/RemoveIndexNamesModification'
39
+ import { convertOneHasManyToOneHasOneRelationModification } from './relations/ConvertOneHasManyToOneHasOneRelationModification'
39
40
 
40
41
 
41
42
  class ModificationHandlerFactory {
@@ -86,6 +87,7 @@ namespace ModificationHandlerFactory {
86
87
  updateValidationSchemaModification,
87
88
  patchValidationSchemaModification,
88
89
  convertOneToManyRelationModification,
90
+ convertOneHasManyToOneHasOneRelationModification,
89
91
  toggleEventLogModification,
90
92
  toggleJunctionEventLogModification,
91
93
  convertOneHasManyToManyHasManyRelationModification,
@@ -1,4 +1,3 @@
1
- import { MigrationBuilder } from '@contember/database-migrations'
2
1
  import { SchemaUpdater } from '../utils/schemaUpdateUtils'
3
2
  import { createModificationType, ModificationHandler } from '../ModificationHandler'
4
3
  import { applyPatch, Operation } from 'rfc6902'
@@ -7,7 +6,7 @@ import deepCopy from '../../utils/deepCopy'
7
6
  export class PatchAclSchemaModificationHandler implements ModificationHandler<PatchAclSchemaModificationData>{
8
7
  constructor(private readonly data: PatchAclSchemaModificationData) {}
9
8
 
10
- public createSql(builder: MigrationBuilder): void {}
9
+ public createSql(): void {}
11
10
 
12
11
  public getSchemaUpdater(): SchemaUpdater {
13
12
  return ({ schema }) => {
@@ -1,4 +1,3 @@
1
- import { MigrationBuilder } from '@contember/database-migrations'
2
1
  import { Acl, Schema } from '@contember/schema'
3
2
  import { SchemaUpdater } from '../utils/schemaUpdateUtils'
4
3
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
@@ -9,7 +8,7 @@ import { patchAclSchemaModification } from './PatchAclSchemaModification'
9
8
  export class UpdateAclSchemaModificationHandler implements ModificationHandler<UpdateAclSchemaModificationData>{
10
9
  constructor(private readonly data: UpdateAclSchemaModificationData) {}
11
10
 
12
- public createSql(builder: MigrationBuilder): void {}
11
+ public createSql(): void {}
13
12
 
14
13
  public getSchemaUpdater(): SchemaUpdater {
15
14
  return ({ schema }) => ({
@@ -1,4 +1,3 @@
1
- import { MigrationBuilder } from '@contember/database-migrations'
2
1
  import { Actions, Schema } from '@contember/schema'
3
2
  import { SchemaUpdater } from '../utils/schemaUpdateUtils'
4
3
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
@@ -7,7 +6,7 @@ export class CreateTargetModificationHandler implements ModificationHandler<Crea
7
6
  constructor(private readonly data: CreateTargetModificationData) {
8
7
  }
9
8
 
10
- public createSql(builder: MigrationBuilder): void {
9
+ public createSql(): void {
11
10
  }
12
11
 
13
12
  public getSchemaUpdater(): SchemaUpdater {
@@ -1,4 +1,3 @@
1
- import { MigrationBuilder } from '@contember/database-migrations'
2
1
  import { Actions, Schema } from '@contember/schema'
3
2
  import { SchemaUpdater } from '../utils/schemaUpdateUtils'
4
3
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
@@ -7,7 +6,7 @@ export class CreateTriggerModificationHandler implements ModificationHandler<Cre
7
6
  constructor(private readonly data: CreateTriggerModificationData) {
8
7
  }
9
8
 
10
- public createSql(builder: MigrationBuilder): void {
9
+ public createSql(): void {
11
10
  }
12
11
 
13
12
  public getSchemaUpdater(): SchemaUpdater {
@@ -1,4 +1,3 @@
1
- import { MigrationBuilder } from '@contember/database-migrations'
2
1
  import { Schema } from '@contember/schema'
3
2
  import { SchemaUpdater } from '../utils/schemaUpdateUtils'
4
3
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
@@ -7,7 +6,7 @@ export class RemoveTargetModificationHandler implements ModificationHandler<Remo
7
6
  constructor(private readonly data: RemoveTargetModificationData) {
8
7
  }
9
8
 
10
- public createSql(builder: MigrationBuilder): void {
9
+ public createSql(): void {
11
10
  }
12
11
 
13
12
  public getSchemaUpdater(): SchemaUpdater {
@@ -1,4 +1,3 @@
1
- import { MigrationBuilder } from '@contember/database-migrations'
2
1
  import { Schema } from '@contember/schema'
3
2
  import { SchemaUpdater } from '../utils/schemaUpdateUtils'
4
3
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
@@ -7,7 +6,7 @@ export class RemoveTriggerModificationHandler implements ModificationHandler<Rem
7
6
  constructor(private readonly data: RemoveTriggerModificationData) {
8
7
  }
9
8
 
10
- public createSql(builder: MigrationBuilder): void {
9
+ public createSql(): void {
11
10
  }
12
11
 
13
12
  public getSchemaUpdater(): SchemaUpdater {
@@ -1,5 +1,3 @@
1
-
2
- import { MigrationBuilder } from '@contember/database-migrations'
3
1
  import { Actions, Schema } from '@contember/schema'
4
2
  import { SchemaUpdater } from '../utils/schemaUpdateUtils'
5
3
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
@@ -9,7 +7,7 @@ export class UpdateTargetModificationHandler implements ModificationHandler<Upda
9
7
  constructor(private readonly data: UpdateTargetModificationData) {
10
8
  }
11
9
 
12
- public createSql(builder: MigrationBuilder): void {
10
+ public createSql(): void {
13
11
  }
14
12
 
15
13
  public getSchemaUpdater(): SchemaUpdater {
@@ -1,4 +1,3 @@
1
- import { MigrationBuilder } from '@contember/database-migrations'
2
1
  import { Actions, Schema } from '@contember/schema'
3
2
  import { SchemaUpdater } from '../utils/schemaUpdateUtils'
4
3
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
@@ -8,7 +7,7 @@ export class UpdateTriggerModificationHandler implements ModificationHandler<Upd
8
7
  constructor(private readonly data: UpdateTriggerModificationData) {
9
8
  }
10
9
 
11
- public createSql(builder: MigrationBuilder): void {
10
+ public createSql(): void {
12
11
  }
13
12
 
14
13
  public getSchemaUpdater(): SchemaUpdater {
@@ -0,0 +1,145 @@
1
+ import { MigrationBuilder } from '@contember/database-migrations'
2
+ import { Model, Schema } from '@contember/schema'
3
+ import { SchemaUpdater, updateEntity, updateField, updateModel, updateSchema } from '../utils/schemaUpdateUtils'
4
+ import {
5
+ createModificationType,
6
+ Differ,
7
+ ModificationHandler,
8
+ ModificationHandlerCreateSqlOptions,
9
+ ModificationHandlerOptions,
10
+ } from '../ModificationHandler'
11
+ import { isOwningRelation } from '@contember/schema-utils'
12
+ import { updateRelations } from '../utils/diffUtils'
13
+ import { NoopModification } from '../NoopModification'
14
+ import { updateFieldNameModification } from '../fields'
15
+ import { wrapIdentifier } from '../../utils/dbHelpers'
16
+
17
+ export class ConvertOneHasManyToOneHasOneRelationModificationHandler implements ModificationHandler<ConvertOneHasManyToOneHasOneRelationModificationData> {
18
+ private subModification: ModificationHandler<any>
19
+
20
+ constructor(
21
+ private readonly data: ConvertOneHasManyToOneHasOneRelationModificationData,
22
+ private readonly schema: Schema,
23
+ private readonly options: ModificationHandlerOptions,
24
+ ) {
25
+ const { relation } = this.getRelation()
26
+ this.subModification = data.newInverseSideFieldName && relation.inversedBy ?
27
+ updateFieldNameModification.createHandler(
28
+ {
29
+ entityName: relation.target,
30
+ fieldName: relation.inversedBy,
31
+ newFieldName: data.newInverseSideFieldName,
32
+ },
33
+ schema,
34
+ this.options,
35
+ )
36
+ : new NoopModification()
37
+ }
38
+
39
+ public createSql(builder: MigrationBuilder, options: ModificationHandlerCreateSqlOptions): void {
40
+ const { entity, relation } = this.getRelation()
41
+ const columnName = relation.joiningColumn.columnName
42
+
43
+ const tableNameId = wrapIdentifier(entity.tableName)
44
+ const columnNameId = wrapIdentifier(columnName)
45
+
46
+ const uniqueConstraintNames = options.databaseMetadata.indexes.filter({
47
+ tableName: entity.tableName,
48
+ columnNames: [columnName],
49
+ }).getNames()
50
+
51
+ for (const name of uniqueConstraintNames) {
52
+ builder.sql(`DROP INDEX ${wrapIdentifier(name)}`)
53
+ }
54
+ builder.sql(`ALTER TABLE ${tableNameId} ADD UNIQUE (${columnNameId})`)
55
+
56
+ options.invalidateDatabaseMetadata()
57
+
58
+ this.subModification.createSql(builder, options)
59
+ }
60
+
61
+ public getSchemaUpdater(): SchemaUpdater {
62
+ const { relation } = this.getRelation()
63
+ const { entityName, fieldName } = this.data
64
+ const inverseFieldName = this.data.newInverseSideFieldName ?? relation.inversedBy
65
+ return updateSchema(
66
+ updateModel(
67
+ updateEntity(
68
+ entityName,
69
+ updateField<Model.ManyHasOneRelation, Model.OneHasOneOwningRelation>(
70
+ fieldName,
71
+ ({ field: { type, ...field } }) => ({
72
+ type: Model.RelationType.OneHasOne,
73
+ ...field,
74
+ }),
75
+ ),
76
+ ),
77
+ ),
78
+ this.subModification.getSchemaUpdater(),
79
+ inverseFieldName ?
80
+ updateModel(
81
+ updateEntity(
82
+ relation.target,
83
+ updateField<Model.OneHasManyRelation, Model.OneHasOneInverseRelation>(
84
+ inverseFieldName,
85
+ ({ field: { type, ...field } }) => ({
86
+ type: Model.RelationType.OneHasOne,
87
+ nullable: true,
88
+ ...field,
89
+ }),
90
+ ),
91
+ ),
92
+ ) : undefined,
93
+ )
94
+ }
95
+
96
+ describe() {
97
+ return {
98
+ message: `Converts ManyHasOne relation to OneHasOne on ${this.data.entityName}.${this.data.fieldName}`,
99
+ failureWarning: 'Make sure no conflicting rows exists, otherwise this may fail in runtime.',
100
+ }
101
+ }
102
+
103
+ private getRelation() {
104
+ const entity = this.schema.model.entities[this.data.entityName]
105
+ const relation = entity.fields[this.data.fieldName]
106
+ if (relation.type !== Model.RelationType.ManyHasOne) {
107
+ throw new Error()
108
+ }
109
+ return { entity, relation }
110
+ }
111
+ }
112
+
113
+ export interface ConvertOneHasManyToOneHasOneRelationModificationData {
114
+ entityName: string
115
+ fieldName: string
116
+ newInverseSideFieldName?: string
117
+ }
118
+
119
+ export const convertOneHasManyToOneHasOneRelationModification = createModificationType({
120
+ id: 'convertOneHasManyToOneHasOneRelation',
121
+ handler: ConvertOneHasManyToOneHasOneRelationModificationHandler,
122
+ })
123
+
124
+ export class ConvertOneHasManyToOneHasOneRelationDiffer implements Differ {
125
+ createDiff(originalSchema: Schema, updatedSchema: Schema) {
126
+ return updateRelations(originalSchema, updatedSchema, ({ originalRelation, updatedRelation, updatedEntity }) => {
127
+ if (
128
+ isOwningRelation(originalRelation) &&
129
+ isOwningRelation(updatedRelation) &&
130
+ originalRelation.type === Model.RelationType.ManyHasOne &&
131
+ updatedRelation.type === Model.RelationType.OneHasOne
132
+ ) {
133
+ const isInverseSideRenamed = originalRelation.inversedBy && updatedRelation.inversedBy && originalRelation.inversedBy !== updatedRelation.inversedBy
134
+ return convertOneHasManyToOneHasOneRelationModification.createModification({
135
+ entityName: updatedEntity.name,
136
+ fieldName: updatedRelation.name,
137
+ ...(isInverseSideRenamed ? {
138
+ newInverseSideFieldName: updatedRelation.inversedBy,
139
+ } : {}),
140
+ })
141
+ }
142
+ return undefined
143
+ })
144
+ }
145
+ }
@@ -61,6 +61,7 @@ export class ConvertOneToManyRelationModificationHandler implements Modification
61
61
  const { relation } = this.getRelation()
62
62
  const { entityName, fieldName } = this.data
63
63
 
64
+ const inverseFieldName = this.data.newInverseSideFieldName ?? relation.inversedBy
64
65
  return updateSchema(
65
66
  updateModel(
66
67
  updateEntity(
@@ -75,12 +76,12 @@ export class ConvertOneToManyRelationModificationHandler implements Modification
75
76
  ),
76
77
  ),
77
78
  this.subModification.getSchemaUpdater(),
78
- this.data.newInverseSideFieldName ?
79
+ inverseFieldName ?
79
80
  updateModel(
80
81
  updateEntity(
81
82
  relation.target,
82
83
  updateField<Model.OneHasOneInverseRelation, Model.OneHasManyRelation>(
83
- this.data.newInverseSideFieldName,
84
+ inverseFieldName,
84
85
  ({ field: { type, nullable, ...field } }) => ({
85
86
  type: Model.RelationType.OneHasMany,
86
87
  ...field,
@@ -1,4 +1,3 @@
1
- import { MigrationBuilder } from '@contember/database-migrations'
2
1
  import { Model, Schema } from '@contember/schema'
3
2
  import { addField, SchemaUpdater, updateEntity, updateField, updateModel } from '../utils/schemaUpdateUtils'
4
3
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
@@ -8,7 +7,7 @@ import { isInverseRelation, isRelation } from '@contember/schema-utils'
8
7
  export class CreateRelationInverseSideModificationHandler implements ModificationHandler<CreateRelationInverseSideModificationData> {
9
8
  constructor(private readonly data: CreateRelationInverseSideModificationData, private readonly schema: Schema) {}
10
9
 
11
- public createSql(builder: MigrationBuilder): void {}
10
+ public createSql(): void {}
12
11
 
13
12
  public getSchemaUpdater(): SchemaUpdater {
14
13
  return updateModel(
@@ -1,4 +1,3 @@
1
- import { MigrationBuilder } from '@contember/database-migrations'
2
1
  import { Model, Schema } from '@contember/schema'
3
2
  import { SchemaUpdater, updateEntity, updateField, updateModel } from '../utils/schemaUpdateUtils'
4
3
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
@@ -9,7 +8,7 @@ export class DisableOrphanRemovalModificationHandler implements ModificationHand
9
8
 
10
9
  constructor(private readonly data: DisableOrphanRemovalModificationData, private readonly schema: Schema) {}
11
10
 
12
- public createSql(builder: MigrationBuilder): void {}
11
+ public createSql(): void {}
13
12
 
14
13
  public getSchemaUpdater(): SchemaUpdater {
15
14
  const { entityName, fieldName } = this.data
@@ -1,4 +1,3 @@
1
- import { MigrationBuilder } from '@contember/database-migrations'
2
1
  import { Model, Schema } from '@contember/schema'
3
2
  import { SchemaUpdater, updateEntity, updateField, updateModel } from '../utils/schemaUpdateUtils'
4
3
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
@@ -8,7 +7,7 @@ import { updateRelations } from '../utils/diffUtils'
8
7
  export class EnableOrphanRemovalModificationHandler implements ModificationHandler<EnableOrphanRemovalModificationData> {
9
8
  constructor(private readonly data: EnableOrphanRemovalModificationData, private readonly schema: Schema) {}
10
9
 
11
- public createSql(builder: MigrationBuilder): void {}
10
+ public createSql(): void {}
12
11
 
13
12
  public getSchemaUpdater(): SchemaUpdater {
14
13
  const { entityName, fieldName } = this.data
@@ -1,4 +1,3 @@
1
- import { MigrationBuilder } from '@contember/database-migrations'
2
1
  import { Model, Schema } from '@contember/schema'
3
2
  import { SchemaUpdater, updateEntity, updateField, updateModel } from '../utils/schemaUpdateUtils'
4
3
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
@@ -9,7 +8,7 @@ export class UpdateRelationOrderByModificationHandler implements ModificationHan
9
8
 
10
9
  constructor(private readonly data: UpdateRelationOrderByModificationData, private readonly schema: Schema) {}
11
10
 
12
- public createSql(builder: MigrationBuilder): void {}
11
+ public createSql(): void {}
13
12
 
14
13
  public getSchemaUpdater(): SchemaUpdater {
15
14
  const { entityName, fieldName, orderBy } = this.data
@@ -1,4 +1,3 @@
1
- import { MigrationBuilder } from '@contember/database-migrations'
2
1
  import { Schema, Settings } from '@contember/schema'
3
2
  import { SchemaUpdater } from '../utils/schemaUpdateUtils'
4
3
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
@@ -10,7 +9,7 @@ export class UpdateSettingsModificationHandler implements ModificationHandler<Up
10
9
  ) {
11
10
  }
12
11
 
13
- public createSql(builder: MigrationBuilder): void {
12
+ public createSql(): void {
14
13
  }
15
14
 
16
15
  public getSchemaUpdater(): SchemaUpdater {
@@ -1,4 +1,3 @@
1
- import { MigrationBuilder } from '@contember/database-migrations'
2
1
  import { SchemaUpdater } from '../utils/schemaUpdateUtils'
3
2
  import { createModificationType, ModificationHandler } from '../ModificationHandler'
4
3
  import { applyPatch, Operation } from 'rfc6902'
@@ -7,7 +6,7 @@ import deepCopy from '../../utils/deepCopy'
7
6
  export class PatchValidationSchemaModificationHandler implements ModificationHandler<PatchValidationSchemaModificationData> {
8
7
  constructor(private readonly data: PatchValidationSchemaModificationData) {}
9
8
 
10
- public createSql(builder: MigrationBuilder): void {}
9
+ public createSql(): void {}
11
10
 
12
11
  public getSchemaUpdater(): SchemaUpdater {
13
12
  return ({ schema }) => {
@@ -1,4 +1,3 @@
1
- import { MigrationBuilder } from '@contember/database-migrations'
2
1
  import { Schema, Validation } from '@contember/schema'
3
2
  import { SchemaUpdater } from '../utils/schemaUpdateUtils'
4
3
  import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
@@ -9,7 +8,7 @@ import { patchValidationSchemaModification } from './PatchValidationSchemaModifi
9
8
  export class UpdateValidationSchemaModificationHandler implements ModificationHandler<UpdateValidationSchemaModificationData> {
10
9
  constructor(private readonly data: UpdateValidationSchemaModificationData) {}
11
10
 
12
- public createSql(builder: MigrationBuilder): void {}
11
+ public createSql(): void {}
13
12
 
14
13
  public getSchemaUpdater(): SchemaUpdater {
15
14
  return ({ schema }) => ({
@@ -0,0 +1,48 @@
1
+ import { testMigrations } from '../../src/tests'
2
+ import { SQL } from '../../src/tags'
3
+ import { createSchema, SchemaDefinition as def } from '@contember/schema-definition'
4
+ import { createDatabaseMetadata } from '@contember/database'
5
+
6
+ namespace ConvertMHOtoOHOSchemaOrig {
7
+ export class Article {
8
+ title = def.stringColumn()
9
+ reviews = def.oneHasMany(ArticleReview, 'article')
10
+ }
11
+
12
+ export class ArticleReview {
13
+ article = def.manyHasOne(Article, 'reviews')
14
+ }
15
+ }
16
+
17
+ namespace ConvertMHOtoOHOSchemaUpdated {
18
+ export class Article {
19
+ title = def.stringColumn()
20
+ review = def.oneHasOneInverse(ArticleReview, 'article')
21
+ }
22
+
23
+ export class ArticleReview {
24
+ article = def.oneHasOne(Article, 'review')
25
+ }
26
+ }
27
+
28
+
29
+ testMigrations('convert one has many to one has one', {
30
+ original: createSchema(ConvertMHOtoOHOSchemaOrig),
31
+ updated: createSchema(ConvertMHOtoOHOSchemaUpdated),
32
+ diff: [{
33
+ entityName: 'ArticleReview',
34
+ fieldName: 'article',
35
+ modification: 'convertOneHasManyToOneHasOneRelation',
36
+ newInverseSideFieldName: 'review',
37
+ }],
38
+ sql: SQL`DROP INDEX "article_review_article_id_idx"; ALTER TABLE "article_review" ADD UNIQUE ("article_id");`,
39
+ databaseMetadata: createDatabaseMetadata({
40
+ foreignKeys: [],
41
+ indexes: [{
42
+ indexName: 'article_review_article_id_idx',
43
+ columnNames: ['article_id'],
44
+ tableName: 'article_review',
45
+ }],
46
+ uniqueConstraints: [],
47
+ }),
48
+ })
@@ -88,3 +88,45 @@ testMigrations('convert one has one to many has one relation with inverse side',
88
88
  }),
89
89
  })
90
90
 
91
+ testMigrations('convert one has one to many has one relation with inverse side, but not renamed', {
92
+ original: {
93
+ model: new SchemaBuilder()
94
+ .entity('Post', entity =>
95
+ entity.oneHasOne('image', rel => rel.target('Image').inversedBy('posts')),
96
+ )
97
+ .entity('Image', e => e.column('url', c => c.type(Model.ColumnType.String)))
98
+ .buildSchema(),
99
+ },
100
+ updated: {
101
+ model: new SchemaBuilder()
102
+ .entity('Post', entity =>
103
+ entity.manyHasOne('image', rel => rel.target('Image').inversedBy('posts')),
104
+ )
105
+ .entity('Image', e => e.column('url', c => c.type(Model.ColumnType.String)))
106
+ .buildSchema(),
107
+ },
108
+ diff: [
109
+ {
110
+ modification: 'convertOneToManyRelation',
111
+ entityName: 'Post',
112
+ fieldName: 'image',
113
+ },
114
+ ],
115
+ sql: SQL`
116
+ CREATE INDEX ON "post" ("image_id");
117
+ ALTER TABLE "post"
118
+ DROP CONSTRAINT "uniq_post_image_id";
119
+ `,
120
+ databaseMetadata: createDatabaseMetadata({
121
+ foreignKeys: [],
122
+ indexes: [],
123
+ uniqueConstraints: [{
124
+ constraintName: 'uniq_post_image_id',
125
+ columnNames: ['image_id'],
126
+ tableName: 'post',
127
+ deferred: false,
128
+ deferrable: false,
129
+ }],
130
+ }),
131
+ })
132
+
@@ -1,20 +0,0 @@
1
- import { MigrationFilesManager } from './MigrationFilesManager';
2
- import { Schema } from '@contember/schema';
3
- import { SchemaDiffer } from './SchemaDiffer';
4
- import { Migration } from './Migration';
5
- export declare class MigrationCreator {
6
- private readonly migrationFilesManager;
7
- private readonly schemaDiffer;
8
- constructor(migrationFilesManager: MigrationFilesManager, schemaDiffer: SchemaDiffer);
9
- prepareMigration(initialSchema: Schema, newSchema: Schema, migrationName: string, { skipInitialSchemaValidation }?: {
10
- skipInitialSchemaValidation?: boolean;
11
- }): Promise<{
12
- migration: Migration;
13
- initialSchema: Schema;
14
- } | null>;
15
- saveMigration(migration: Migration): Promise<string>;
16
- removeMigration(name: string): Promise<void>;
17
- private createMigration;
18
- static createContent({ modifications, formatVersion }: Migration): string;
19
- }
20
- //# sourceMappingURL=MigrationCreator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MigrationCreator.d.ts","sourceRoot":"","sources":["../../src/MigrationCreator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGvC,qBAAa,gBAAgB;IAE3B,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY;gBADZ,qBAAqB,EAAE,qBAAqB,EAC5C,YAAY,EAAE,YAAY;IAGtC,gBAAgB,CACrB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,EAAE,2BAAmC,EAAE,GAAE;QAAE,2BAA2B,CAAC,EAAE,OAAO,CAAA;KAAO,GACrF,OAAO,CAAC;QAAE,SAAS,EAAE,SAAS,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAa5D,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAMpD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,OAAO,CAAC,eAAe;WAKT,aAAa,CAAC,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,SAAS,GAAG,MAAM;CAGhF"}
@@ -1,37 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MigrationCreator = void 0;
4
- const ModificationVersions_1 = require("./modifications/ModificationVersions");
5
- const engine_common_1 = require("@contember/engine-common");
6
- class MigrationCreator {
7
- constructor(migrationFilesManager, schemaDiffer) {
8
- this.migrationFilesManager = migrationFilesManager;
9
- this.schemaDiffer = schemaDiffer;
10
- }
11
- async prepareMigration(initialSchema, newSchema, migrationName, { skipInitialSchemaValidation = false } = {}) {
12
- await this.migrationFilesManager.createDirIfNotExist();
13
- const modifications = this.schemaDiffer.diffSchemas(initialSchema, newSchema, { skipInitialSchemaValidation });
14
- if (modifications.length === 0) {
15
- return null;
16
- }
17
- const migration = this.createMigration(modifications, migrationName);
18
- return { initialSchema, migration };
19
- }
20
- async saveMigration(migration) {
21
- const jsonDiff = MigrationCreator.createContent(migration);
22
- const filename = await this.migrationFilesManager.createFile(jsonDiff, migration.name);
23
- return filename;
24
- }
25
- async removeMigration(name) {
26
- await this.migrationFilesManager.removeFile(name);
27
- }
28
- createMigration(modifications, name) {
29
- const [version, fullName] = engine_common_1.MigrationVersionHelper.createVersion(name);
30
- return { formatVersion: ModificationVersions_1.VERSION_LATEST, modifications, version, name: fullName };
31
- }
32
- static createContent({ modifications, formatVersion }) {
33
- return JSON.stringify({ formatVersion, modifications }, undefined, '\t') + '\n';
34
- }
35
- }
36
- exports.MigrationCreator = MigrationCreator;
37
- //# sourceMappingURL=MigrationCreator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MigrationCreator.js","sourceRoot":"","sources":["../../src/MigrationCreator.ts"],"names":[],"mappings":";;;AAGA,+EAAqE;AAErE,4DAAiE;AAEjE,MAAa,gBAAgB;IAC5B,YACkB,qBAA4C,EAC5C,YAA0B;QAD1B,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,iBAAY,GAAZ,YAAY,CAAc;IACzC,CAAC;IAEJ,KAAK,CAAC,gBAAgB,CACrB,aAAqB,EACrB,SAAiB,EACjB,aAAqB,EACrB,EAAE,2BAA2B,GAAG,KAAK,KAAgD,EAAE;QAEvF,MAAM,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,EAAE,CAAA;QAEtD,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,aAAa,EAAE,SAAS,EAAE,EAAE,2BAA2B,EAAE,CAAC,CAAA;QAC9G,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;YAC/B,OAAO,IAAI,CAAA;SACX;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,aAAa,CAAC,CAAA;QAEpE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,CAAA;IACpC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAoB;QACvC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;QAC1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;QACtF,OAAO,QAAQ,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAY;QACjC,MAAM,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAClD,CAAC;IAEO,eAAe,CAAC,aAAuC,EAAE,IAAY;QAC5E,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,sCAAsB,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;QACtE,OAAO,EAAE,aAAa,EAAE,qCAAc,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IACjF,CAAC;IAEM,MAAM,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,aAAa,EAAa;QACtE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,IAAI,CAAA;IAChF,CAAC;CACD;AA1CD,4CA0CC"}