@contember/schema-migrations 1.2.1 → 1.3.0-alpha.4
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.
- package/dist/src/MigrationCreator.js +2 -2
- package/dist/src/MigrationCreator.js.map +1 -1
- package/dist/src/MigrationFilesManager.js +2 -2
- package/dist/src/MigrationFilesManager.js.map +1 -1
- package/dist/src/MigrationsResolver.js +3 -3
- package/dist/src/MigrationsResolver.js.map +1 -1
- package/dist/src/SchemaDiffer.d.ts.map +1 -1
- package/dist/src/SchemaDiffer.js +11 -0
- package/dist/src/SchemaDiffer.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/modifications/ModificationHandlerFactory.d.ts.map +1 -1
- package/dist/src/modifications/ModificationHandlerFactory.js +12 -0
- package/dist/src/modifications/ModificationHandlerFactory.js.map +1 -1
- package/dist/src/modifications/ModificationVersions.d.ts +2 -1
- package/dist/src/modifications/ModificationVersions.d.ts.map +1 -1
- package/dist/src/modifications/ModificationVersions.js +3 -2
- package/dist/src/modifications/ModificationVersions.js.map +1 -1
- package/dist/src/modifications/actions/CreateTargetModification.d.ts +21 -0
- package/dist/src/modifications/actions/CreateTargetModification.d.ts.map +1 -0
- package/dist/src/modifications/actions/CreateTargetModification.js +40 -0
- package/dist/src/modifications/actions/CreateTargetModification.js.map +1 -0
- package/dist/src/modifications/actions/CreateTriggerModification.d.ts +21 -0
- package/dist/src/modifications/actions/CreateTriggerModification.d.ts.map +1 -0
- package/dist/src/modifications/actions/CreateTriggerModification.js +40 -0
- package/dist/src/modifications/actions/CreateTriggerModification.js.map +1 -0
- package/dist/src/modifications/actions/RemoveTargetModification.d.ts +21 -0
- package/dist/src/modifications/actions/RemoveTargetModification.d.ts.map +1 -0
- package/dist/src/modifications/actions/RemoveTargetModification.js +40 -0
- package/dist/src/modifications/actions/RemoveTargetModification.js.map +1 -0
- package/dist/src/modifications/actions/RemoveTriggerModification.d.ts +21 -0
- package/dist/src/modifications/actions/RemoveTriggerModification.d.ts.map +1 -0
- package/dist/src/modifications/actions/RemoveTriggerModification.js +40 -0
- package/dist/src/modifications/actions/RemoveTriggerModification.js.map +1 -0
- package/dist/src/modifications/actions/UpdateTargetModification.d.ts +22 -0
- package/dist/src/modifications/actions/UpdateTargetModification.d.ts.map +1 -0
- package/dist/src/modifications/actions/UpdateTargetModification.js +46 -0
- package/dist/src/modifications/actions/UpdateTargetModification.js.map +1 -0
- package/dist/src/modifications/actions/UpdateTriggerModification.d.ts +21 -0
- package/dist/src/modifications/actions/UpdateTriggerModification.d.ts.map +1 -0
- package/dist/src/modifications/actions/UpdateTriggerModification.js +46 -0
- package/dist/src/modifications/actions/UpdateTriggerModification.js.map +1 -0
- package/dist/src/modifications/actions/index.d.ts +4 -0
- package/dist/src/modifications/actions/index.d.ts.map +1 -0
- package/dist/src/modifications/actions/index.js +20 -0
- package/dist/src/modifications/actions/index.js.map +1 -0
- package/dist/src/modifications/entities/UpdateEntityNameModification.d.ts.map +1 -1
- package/dist/src/modifications/entities/UpdateEntityNameModification.js +15 -0
- package/dist/src/modifications/entities/UpdateEntityNameModification.js.map +1 -1
- package/dist/src/modifications/entities/UpdateEntityOrderByModification.d.ts +23 -0
- package/dist/src/modifications/entities/UpdateEntityOrderByModification.d.ts.map +1 -0
- package/dist/src/modifications/entities/UpdateEntityOrderByModification.js +63 -0
- package/dist/src/modifications/entities/UpdateEntityOrderByModification.js.map +1 -0
- package/dist/src/modifications/entities/index.d.ts +1 -0
- package/dist/src/modifications/entities/index.d.ts.map +1 -1
- package/dist/src/modifications/entities/index.js +1 -0
- package/dist/src/modifications/entities/index.js.map +1 -1
- package/dist/src/modifications/fields/UpdateFieldNameModification.d.ts.map +1 -1
- package/dist/src/modifications/fields/UpdateFieldNameModification.js +15 -0
- package/dist/src/modifications/fields/UpdateFieldNameModification.js.map +1 -1
- package/dist/src/modifications/relations/CreateRelationModification.d.ts.map +1 -1
- package/dist/src/modifications/relations/CreateRelationModification.js +2 -10
- package/dist/src/modifications/relations/CreateRelationModification.js.map +1 -1
- package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.d.ts.map +1 -1
- package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.js +20 -1
- package/dist/src/modifications/relations/UpdateRelationOnDeleteModification.js.map +1 -1
- package/dist/src/modifications/relations/helpers.d.ts +10 -0
- package/dist/src/modifications/relations/helpers.d.ts.map +1 -0
- package/dist/src/modifications/relations/helpers.js +26 -0
- package/dist/src/modifications/relations/helpers.js.map +1 -0
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/tests/cases/integration/createManyHasOne.test.js +1 -1
- package/dist/tests/cases/integration/createRelationInverseSide.test.js +1 -1
- package/dist/tests/cases/integration/createRelationInverseSide.test.js.map +1 -1
- package/dist/tests/cases/integration/takenIndexName.test.js +2 -2
- package/dist/tests/cases/integration/updateEntityName.test.js +20 -0
- package/dist/tests/cases/integration/updateEntityName.test.js.map +1 -1
- package/dist/tests/cases/integration/updateEntityOrderBy.test.d.ts +2 -0
- package/dist/tests/cases/integration/updateEntityOrderBy.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/updateEntityOrderBy.test.js +57 -0
- package/dist/tests/cases/integration/updateEntityOrderBy.test.js.map +1 -0
- package/dist/tests/cases/integration/updateFieldName.test.js +21 -0
- package/dist/tests/cases/integration/updateFieldName.test.js.map +1 -1
- package/dist/tests/cases/integration/updateRelationOnDelete.test.js +2 -1
- package/dist/tests/cases/integration/updateRelationOnDelete.test.js.map +1 -1
- package/dist/tests/src/tests.d.ts.map +1 -1
- package/dist/tests/src/tests.js +4 -6
- package/dist/tests/src/tests.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -6
- package/src/MigrationCreator.ts +1 -1
- package/src/MigrationFilesManager.ts +1 -1
- package/src/MigrationsResolver.ts +1 -1
- package/src/SchemaDiffer.ts +12 -0
- package/src/index.ts +1 -1
- package/src/modifications/ModificationHandlerFactory.ts +12 -0
- package/src/modifications/ModificationVersions.ts +2 -1
- package/src/modifications/actions/CreateTargetModification.ts +46 -0
- package/src/modifications/actions/CreateTriggerModification.ts +46 -0
- package/src/modifications/actions/RemoveTargetModification.ts +46 -0
- package/src/modifications/actions/RemoveTriggerModification.ts +46 -0
- package/src/modifications/actions/UpdateTargetModification.ts +51 -0
- package/src/modifications/actions/UpdateTriggerModification.ts +49 -0
- package/src/modifications/actions/index.ts +3 -0
- package/src/modifications/entities/UpdateEntityNameModification.ts +23 -2
- package/src/modifications/entities/UpdateEntityOrderByModification.ts +68 -0
- package/src/modifications/entities/index.ts +1 -0
- package/src/modifications/fields/UpdateFieldNameModification.ts +22 -1
- package/src/modifications/relations/CreateRelationModification.ts +2 -15
- package/src/modifications/relations/UpdateRelationOnDeleteModification.ts +20 -1
- package/src/modifications/relations/helpers.ts +34 -0
- package/src/tsconfig.json +5 -12
- package/tests/cases/integration/createManyHasOne.test.ts +1 -1
- package/tests/cases/integration/createRelationInverseSide.test.ts +1 -1
- package/tests/cases/integration/takenIndexName.test.ts +2 -2
- package/tests/cases/integration/updateEntityName.test.ts +21 -0
- package/tests/cases/integration/updateEntityOrderBy.test.ts +43 -0
- package/tests/cases/integration/updateFieldName.test.ts +22 -0
- package/tests/cases/integration/updateRelationOnDelete.test.ts +2 -1
- package/tests/src/tests.ts +5 -7
- package/tests/tsconfig.json +2 -6
- package/dist/src/MigrationVersionHelper.d.ts +0 -9
- package/dist/src/MigrationVersionHelper.d.ts.map +0 -1
- package/dist/src/MigrationVersionHelper.js +0 -45
- package/dist/src/MigrationVersionHelper.js.map +0 -1
- package/src/MigrationVersionHelper.ts +0 -46
package/src/SchemaDiffer.ts
CHANGED
|
@@ -38,12 +38,17 @@ import {
|
|
|
38
38
|
UpdateEnumDiffer,
|
|
39
39
|
UpdateRelationOnDeleteDiffer,
|
|
40
40
|
UpdateRelationOrderByDiffer,
|
|
41
|
+
UpdateEntityOrderByDiffer,
|
|
41
42
|
UpdateValidationSchemaDiffer,
|
|
42
43
|
VERSION_LATEST,
|
|
43
44
|
} from './modifications'
|
|
44
45
|
import { ChangeViewNonViewDiffer, RemoveChangedFieldDiffer, RemoveChangedViewDiffer } from './modifications/differs'
|
|
45
46
|
import { CreateIndexDiffer, RemoveIndexDiffer } from './modifications/indexes'
|
|
46
47
|
import { SchemaWithMeta } from './modifications/utils/schemaMeta'
|
|
48
|
+
import { CreateTriggerDiffer, RemoveTriggerDiffer, UpdateTriggerDiffer } from './modifications/actions'
|
|
49
|
+
import { UpdateTargetDiffer } from './modifications/actions/UpdateTargetModification'
|
|
50
|
+
import { CreateTargetDiffer } from './modifications/actions/CreateTargetModification'
|
|
51
|
+
import { RemoveTargetDiffer } from './modifications/actions/RemoveTargetModification'
|
|
47
52
|
import { UpdateSettingsDiffer } from './modifications/settings'
|
|
48
53
|
|
|
49
54
|
type DiffOptions = { skipRecreateValidation?: boolean; skipInitialSchemaValidation?: boolean }
|
|
@@ -101,6 +106,13 @@ export class SchemaDiffer {
|
|
|
101
106
|
new RemoveEnumDiffer(),
|
|
102
107
|
new UpdateAclSchemaDiffer(),
|
|
103
108
|
new UpdateValidationSchemaDiffer(),
|
|
109
|
+
new UpdateEntityOrderByDiffer(),
|
|
110
|
+
new UpdateTargetDiffer(),
|
|
111
|
+
new CreateTargetDiffer(),
|
|
112
|
+
new UpdateTriggerDiffer(),
|
|
113
|
+
new CreateTriggerDiffer(),
|
|
114
|
+
new RemoveTriggerDiffer(),
|
|
115
|
+
new RemoveTargetDiffer(),
|
|
104
116
|
]
|
|
105
117
|
|
|
106
118
|
const diffs: Migration.Modification[] = []
|
package/src/index.ts
CHANGED
|
@@ -31,6 +31,11 @@ import { patchValidationSchemaModification, updateValidationSchemaModification }
|
|
|
31
31
|
import { createIndexModification, removeIndexModification } from './indexes'
|
|
32
32
|
import { SchemaWithMeta } from './utils/schemaMeta'
|
|
33
33
|
import { updateSettingsModification } from './settings'
|
|
34
|
+
import { createTriggerModification, removeTriggerModification, updateTriggerModification } from './actions'
|
|
35
|
+
import { createTargetModification } from './actions/CreateTargetModification'
|
|
36
|
+
import { removeTargetModification } from './actions/RemoveTargetModification'
|
|
37
|
+
import { updateTargetModification } from './actions/UpdateTargetModification'
|
|
38
|
+
import { updateEntityOrderByModification } from './entities/UpdateEntityOrderByModification'
|
|
34
39
|
|
|
35
40
|
|
|
36
41
|
class ModificationHandlerFactory {
|
|
@@ -83,6 +88,13 @@ namespace ModificationHandlerFactory {
|
|
|
83
88
|
toggleEventLogModification,
|
|
84
89
|
toggleJunctionEventLogModification,
|
|
85
90
|
convertOneHasManyToManyHasManyRelationModification,
|
|
91
|
+
updateEntityOrderByModification,
|
|
92
|
+
createTriggerModification,
|
|
93
|
+
updateTriggerModification,
|
|
94
|
+
removeTriggerModification,
|
|
95
|
+
createTargetModification,
|
|
96
|
+
updateTargetModification,
|
|
97
|
+
removeTargetModification,
|
|
86
98
|
]
|
|
87
99
|
|
|
88
100
|
export const defaultFactoryMap: HandlerMap<any> = Object.fromEntries(handlers.map(it => [it.id, it]))
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export const VERSION_INITIAL = 1
|
|
2
|
-
export const VERSION_LATEST =
|
|
2
|
+
export const VERSION_LATEST = 4
|
|
3
3
|
|
|
4
4
|
export const VERSION_ACL_PATCH = 2
|
|
5
5
|
export const VERSION_UPDATE_CONSTRAINT_NAME = 2
|
|
6
6
|
export const VERSION_REMOVE_RELATION_INVERSE_SIDE = 3
|
|
7
7
|
export const VERSION_REMOVE_REFERENCING_RELATIONS = 3
|
|
8
|
+
export const VERSION_UPDATE_CONSTRAINT_NAME_ONE_HAS_ONE = 4
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { MigrationBuilder } from '@contember/database-migrations'
|
|
2
|
+
import { Actions, Schema } from '@contember/schema'
|
|
3
|
+
import { SchemaUpdater } from '../utils/schemaUpdateUtils'
|
|
4
|
+
import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
|
|
5
|
+
|
|
6
|
+
export class CreateTargetModificationHandler implements ModificationHandler<CreateTargetModificationData> {
|
|
7
|
+
constructor(private readonly data: CreateTargetModificationData) {
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
public createSql(builder: MigrationBuilder): void {
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public getSchemaUpdater(): SchemaUpdater {
|
|
14
|
+
return ({ schema }) => ({
|
|
15
|
+
...schema,
|
|
16
|
+
actions: {
|
|
17
|
+
...schema.actions,
|
|
18
|
+
targets: {
|
|
19
|
+
...schema.actions.targets,
|
|
20
|
+
[this.data.target.name]: this.data.target,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
})
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
describe() {
|
|
27
|
+
return { message: `Create target ${this.data.target.name}` }
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface CreateTargetModificationData {
|
|
32
|
+
target: Actions.AnyTarget
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const createTargetModification = createModificationType({
|
|
36
|
+
id: 'createTarget',
|
|
37
|
+
handler: CreateTargetModificationHandler,
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
export class CreateTargetDiffer implements Differ {
|
|
41
|
+
createDiff(originalSchema: Schema, updatedSchema: Schema) {
|
|
42
|
+
return Object.entries(updatedSchema.actions.targets)
|
|
43
|
+
.filter(([name]) => !originalSchema.actions.targets[name])
|
|
44
|
+
.map(([, target]) => createTargetModification.createModification({ target }))
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { MigrationBuilder } from '@contember/database-migrations'
|
|
2
|
+
import { Actions, Schema } from '@contember/schema'
|
|
3
|
+
import { SchemaUpdater } from '../utils/schemaUpdateUtils'
|
|
4
|
+
import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
|
|
5
|
+
|
|
6
|
+
export class CreateTriggerModificationHandler implements ModificationHandler<CreateTriggerModificationData> {
|
|
7
|
+
constructor(private readonly data: CreateTriggerModificationData) {
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
public createSql(builder: MigrationBuilder): void {
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public getSchemaUpdater(): SchemaUpdater {
|
|
14
|
+
return ({ schema }) => ({
|
|
15
|
+
...schema,
|
|
16
|
+
actions: {
|
|
17
|
+
...schema.actions,
|
|
18
|
+
triggers: {
|
|
19
|
+
...schema.actions.triggers,
|
|
20
|
+
[this.data.trigger.name]: this.data.trigger,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
})
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
describe() {
|
|
27
|
+
return { message: `Create trigger ${this.data.trigger.name}` }
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface CreateTriggerModificationData {
|
|
32
|
+
trigger: Actions.AnyTrigger
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const createTriggerModification = createModificationType({
|
|
36
|
+
id: 'createTrigger',
|
|
37
|
+
handler: CreateTriggerModificationHandler,
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
export class CreateTriggerDiffer implements Differ {
|
|
41
|
+
createDiff(originalSchema: Schema, updatedSchema: Schema) {
|
|
42
|
+
return Object.entries(updatedSchema.actions.triggers)
|
|
43
|
+
.filter(([name]) => !originalSchema.actions.triggers[name])
|
|
44
|
+
.map(([, trigger]) => createTriggerModification.createModification({ trigger }))
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { MigrationBuilder } from '@contember/database-migrations'
|
|
2
|
+
import { Schema } from '@contember/schema'
|
|
3
|
+
import { SchemaUpdater } from '../utils/schemaUpdateUtils'
|
|
4
|
+
import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
|
|
5
|
+
|
|
6
|
+
export class RemoveTargetModificationHandler implements ModificationHandler<RemoveTargetModificationData> {
|
|
7
|
+
constructor(private readonly data: RemoveTargetModificationData) {
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
public createSql(builder: MigrationBuilder): void {
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public getSchemaUpdater(): SchemaUpdater {
|
|
14
|
+
return ({ schema }) => {
|
|
15
|
+
const { [this.data.name]: _, ...targets } = schema.actions.targets
|
|
16
|
+
return ({
|
|
17
|
+
...schema,
|
|
18
|
+
actions: {
|
|
19
|
+
...schema.actions,
|
|
20
|
+
targets,
|
|
21
|
+
},
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
describe() {
|
|
27
|
+
return { message: `Remove target ${this.data.name}` }
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface RemoveTargetModificationData {
|
|
32
|
+
name: string
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const removeTargetModification = createModificationType({
|
|
36
|
+
id: 'removeTarget',
|
|
37
|
+
handler: RemoveTargetModificationHandler,
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
export class RemoveTargetDiffer implements Differ {
|
|
41
|
+
createDiff(originalSchema: Schema, updatedSchema: Schema) {
|
|
42
|
+
return Object.entries(originalSchema.actions.targets)
|
|
43
|
+
.filter(([name]) => !updatedSchema.actions.targets[name])
|
|
44
|
+
.map(([name]) => removeTargetModification.createModification({ name }))
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { MigrationBuilder } from '@contember/database-migrations'
|
|
2
|
+
import { Schema } from '@contember/schema'
|
|
3
|
+
import { SchemaUpdater } from '../utils/schemaUpdateUtils'
|
|
4
|
+
import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
|
|
5
|
+
|
|
6
|
+
export class RemoveTriggerModificationHandler implements ModificationHandler<RemoveTriggerModificationData> {
|
|
7
|
+
constructor(private readonly data: RemoveTriggerModificationData) {
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
public createSql(builder: MigrationBuilder): void {
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public getSchemaUpdater(): SchemaUpdater {
|
|
14
|
+
return ({ schema }) => {
|
|
15
|
+
const { [this.data.name]: _, ...triggers } = schema.actions.triggers
|
|
16
|
+
return ({
|
|
17
|
+
...schema,
|
|
18
|
+
actions: {
|
|
19
|
+
...schema.actions,
|
|
20
|
+
triggers,
|
|
21
|
+
},
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
describe() {
|
|
27
|
+
return { message: `Remove trigger ${this.data.name}` }
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface RemoveTriggerModificationData {
|
|
32
|
+
name: string
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const removeTriggerModification = createModificationType({
|
|
36
|
+
id: 'removeTrigger',
|
|
37
|
+
handler: RemoveTriggerModificationHandler,
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
export class RemoveTriggerDiffer implements Differ {
|
|
41
|
+
createDiff(originalSchema: Schema, updatedSchema: Schema) {
|
|
42
|
+
return Object.entries(originalSchema.actions.triggers)
|
|
43
|
+
.filter(([name]) => !updatedSchema.actions.triggers[name])
|
|
44
|
+
.map(([name]) => removeTriggerModification.createModification({ name }))
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
|
|
2
|
+
import { MigrationBuilder } from '@contember/database-migrations'
|
|
3
|
+
import { Actions, Schema } from '@contember/schema'
|
|
4
|
+
import { SchemaUpdater } from '../utils/schemaUpdateUtils'
|
|
5
|
+
import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
|
|
6
|
+
import deepEqual from 'fast-deep-equal'
|
|
7
|
+
|
|
8
|
+
export class UpdateTargetModificationHandler implements ModificationHandler<UpdateTargetModificationData> {
|
|
9
|
+
constructor(private readonly data: UpdateTargetModificationData) {
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
public createSql(builder: MigrationBuilder): void {
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public getSchemaUpdater(): SchemaUpdater {
|
|
16
|
+
return ({ schema }) => {
|
|
17
|
+
return ({
|
|
18
|
+
...schema,
|
|
19
|
+
actions: {
|
|
20
|
+
...schema.actions,
|
|
21
|
+
targets: {
|
|
22
|
+
...schema.actions.targets,
|
|
23
|
+
[this.data.name]: this.data.target,
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
})
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
describe() {
|
|
31
|
+
return { message: `Update target ${this.data.name}` }
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface UpdateTargetModificationData {
|
|
36
|
+
name: string
|
|
37
|
+
target: Actions.AnyTarget
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const updateTargetModification = createModificationType({
|
|
41
|
+
id: 'updateTarget',
|
|
42
|
+
handler: UpdateTargetModificationHandler,
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
export class UpdateTargetDiffer implements Differ {
|
|
46
|
+
createDiff(originalSchema: Schema, updatedSchema: Schema) {
|
|
47
|
+
return Object.entries(updatedSchema.actions.targets)
|
|
48
|
+
.filter(([name, target]) => originalSchema.actions.targets[name] && !deepEqual(target, originalSchema.actions.targets[name]))
|
|
49
|
+
.map(([name, target]) => updateTargetModification.createModification({ name, target }))
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { MigrationBuilder } from '@contember/database-migrations'
|
|
2
|
+
import { Actions, Schema } from '@contember/schema'
|
|
3
|
+
import { SchemaUpdater } from '../utils/schemaUpdateUtils'
|
|
4
|
+
import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
|
|
5
|
+
import deepEqual from 'fast-deep-equal'
|
|
6
|
+
|
|
7
|
+
export class UpdateTriggerModificationHandler implements ModificationHandler<UpdateTriggerModificationData> {
|
|
8
|
+
constructor(private readonly data: UpdateTriggerModificationData) {
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
public createSql(builder: MigrationBuilder): void {
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public getSchemaUpdater(): SchemaUpdater {
|
|
15
|
+
return ({ schema }) => {
|
|
16
|
+
return ({
|
|
17
|
+
...schema,
|
|
18
|
+
actions: {
|
|
19
|
+
...schema.actions,
|
|
20
|
+
triggers: {
|
|
21
|
+
...schema.actions.triggers,
|
|
22
|
+
[this.data.trigger.name]: this.data.trigger,
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
})
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
describe() {
|
|
30
|
+
return { message: `Update trigger ${this.data.trigger.name}` }
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface UpdateTriggerModificationData {
|
|
35
|
+
trigger: Actions.AnyTrigger
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const updateTriggerModification = createModificationType({
|
|
39
|
+
id: 'updateTrigger',
|
|
40
|
+
handler: UpdateTriggerModificationHandler,
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
export class UpdateTriggerDiffer implements Differ {
|
|
44
|
+
createDiff(originalSchema: Schema, updatedSchema: Schema) {
|
|
45
|
+
return Object.entries(updatedSchema.actions.triggers)
|
|
46
|
+
.filter(([name, trigger]) => originalSchema.actions.triggers[name] && !deepEqual(trigger, originalSchema.actions.triggers[name]))
|
|
47
|
+
.map(([, trigger]) => updateTriggerModification.createModification({ trigger }))
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -13,8 +13,12 @@ import {
|
|
|
13
13
|
} from '../utils/schemaUpdateUtils'
|
|
14
14
|
import { createModificationType, ModificationHandler, ModificationHandlerOptions } from '../ModificationHandler'
|
|
15
15
|
import { isIt } from '../../utils/isIt'
|
|
16
|
-
import {
|
|
17
|
-
|
|
16
|
+
import {
|
|
17
|
+
VERSION_ACL_PATCH,
|
|
18
|
+
VERSION_UPDATE_CONSTRAINT_NAME,
|
|
19
|
+
VERSION_UPDATE_CONSTRAINT_NAME_ONE_HAS_ONE,
|
|
20
|
+
} from '../ModificationVersions'
|
|
21
|
+
import { acceptEveryFieldVisitor, NamingHelper } from '@contember/schema-utils'
|
|
18
22
|
import { NoopModification } from '../NoopModification'
|
|
19
23
|
import { renameConstraintSchemaUpdater, renameConstraintsSqlBuilder } from '../utils/renameConstraintsHelper'
|
|
20
24
|
import { changeValue } from '../utils/valueUtils'
|
|
@@ -43,6 +47,23 @@ export class UpdateEntityNameModificationHandler implements ModificationHandler<
|
|
|
43
47
|
if (!entity.view && this.options.formatVersion >= VERSION_UPDATE_CONSTRAINT_NAME) {
|
|
44
48
|
renameConstraintsSqlBuilder(builder, entity, this.getNewConstraintName.bind(this))
|
|
45
49
|
}
|
|
50
|
+
|
|
51
|
+
if (this.options.formatVersion >= VERSION_UPDATE_CONSTRAINT_NAME_ONE_HAS_ONE) {
|
|
52
|
+
acceptEveryFieldVisitor(this.schema.model, this.data.entityName, {
|
|
53
|
+
visitColumn: () => {},
|
|
54
|
+
visitManyHasManyOwning: () => {},
|
|
55
|
+
visitManyHasManyInverse: () => {},
|
|
56
|
+
visitOneHasOneInverse: () => {},
|
|
57
|
+
visitManyHasOne: () => {},
|
|
58
|
+
visitOneHasMany: () => {},
|
|
59
|
+
visitOneHasOneOwning: ({ relation }) => {
|
|
60
|
+
const uniqueConstraintName = NamingHelper.createUniqueConstraintName(entity.name, [relation.name])
|
|
61
|
+
const newUniqueConstraintName = NamingHelper.createUniqueConstraintName(this.data.newEntityName, [relation.name])
|
|
62
|
+
builder.renameConstraint(entity.tableName, uniqueConstraintName, newUniqueConstraintName)
|
|
63
|
+
},
|
|
64
|
+
})
|
|
65
|
+
}
|
|
66
|
+
|
|
46
67
|
this.subModification.createSql(builder)
|
|
47
68
|
}
|
|
48
69
|
|
|
@@ -0,0 +1,68 @@
|
|
|
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 deepEqual from 'fast-deep-equal'
|
|
6
|
+
|
|
7
|
+
export class UpdateEntityOrderByModificationHandler implements ModificationHandler<UpdateEntityOrderByModificationData> {
|
|
8
|
+
|
|
9
|
+
constructor(private readonly data: UpdateEntityOrderByModificationData, private readonly schema: Schema) { }
|
|
10
|
+
|
|
11
|
+
public createSql(builder: MigrationBuilder): void { }
|
|
12
|
+
|
|
13
|
+
public getSchemaUpdater(): SchemaUpdater {
|
|
14
|
+
const { entityName, orderBy } = this.data
|
|
15
|
+
return updateModel(
|
|
16
|
+
updateEntity(entityName, ({ entity }) => {
|
|
17
|
+
if (orderBy) {
|
|
18
|
+
return {
|
|
19
|
+
...entity,
|
|
20
|
+
orderBy,
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const { orderBy: _, ...rest } = entity
|
|
24
|
+
return rest
|
|
25
|
+
}),
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
describe() {
|
|
30
|
+
return { message: `Update order-by of entity ${this.data.entityName}` }
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface UpdateEntityOrderByModificationData {
|
|
35
|
+
entityName: string
|
|
36
|
+
orderBy?: readonly Model.OrderBy[]
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const updateEntityOrderByModification = createModificationType({
|
|
40
|
+
id: 'updateEntityOrderBy',
|
|
41
|
+
handler: UpdateEntityOrderByModificationHandler,
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
export class UpdateEntityOrderByDiffer implements Differ {
|
|
45
|
+
createDiff(originalSchema: Schema, updatedSchema: Schema) {
|
|
46
|
+
return Object.values(updatedSchema.model.entities)
|
|
47
|
+
.flatMap(updatedEntity => {
|
|
48
|
+
const origEntity = originalSchema.model.entities[updatedEntity.name]
|
|
49
|
+
if (!origEntity) {
|
|
50
|
+
return []
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (!deepEqual(updatedEntity.orderBy ?? [], origEntity.orderBy ?? [])) {
|
|
54
|
+
if (updatedEntity.orderBy) {
|
|
55
|
+
return [updateEntityOrderByModification.createModification({
|
|
56
|
+
entityName: updatedEntity.name,
|
|
57
|
+
orderBy: updatedEntity.orderBy,
|
|
58
|
+
})]
|
|
59
|
+
}
|
|
60
|
+
return [updateEntityOrderByModification.createModification({
|
|
61
|
+
entityName: updatedEntity.name,
|
|
62
|
+
})]
|
|
63
|
+
}
|
|
64
|
+
return []
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -15,7 +15,11 @@ import {
|
|
|
15
15
|
} from '../utils/schemaUpdateUtils'
|
|
16
16
|
import { createModificationType, ModificationHandler, ModificationHandlerOptions } from '../ModificationHandler'
|
|
17
17
|
import { acceptFieldVisitor, NamingHelper, PredicateDefinitionProcessor } from '@contember/schema-utils'
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
VERSION_ACL_PATCH,
|
|
20
|
+
VERSION_UPDATE_CONSTRAINT_NAME,
|
|
21
|
+
VERSION_UPDATE_CONSTRAINT_NAME_ONE_HAS_ONE,
|
|
22
|
+
} from '../ModificationVersions'
|
|
19
23
|
import { renameConstraintSchemaUpdater, renameConstraintsSqlBuilder } from '../utils/renameConstraintsHelper'
|
|
20
24
|
import { changeValue } from '../utils/valueUtils'
|
|
21
25
|
import { updateColumnNameModification } from '../columns'
|
|
@@ -47,6 +51,23 @@ export class UpdateFieldNameModificationHandler implements ModificationHandler<U
|
|
|
47
51
|
if (this.options.formatVersion >= VERSION_UPDATE_CONSTRAINT_NAME) {
|
|
48
52
|
renameConstraintsSqlBuilder(builder, entity, this.getNewConstraintName.bind(this))
|
|
49
53
|
}
|
|
54
|
+
|
|
55
|
+
if (this.options.formatVersion >= VERSION_UPDATE_CONSTRAINT_NAME_ONE_HAS_ONE) {
|
|
56
|
+
acceptFieldVisitor(this.schema.model, this.data.entityName, this.data.fieldName, {
|
|
57
|
+
visitColumn: () => {},
|
|
58
|
+
visitManyHasManyOwning: () => {},
|
|
59
|
+
visitManyHasManyInverse: () => {},
|
|
60
|
+
visitOneHasOneInverse: () => {},
|
|
61
|
+
visitManyHasOne: () => {},
|
|
62
|
+
visitOneHasMany: () => {},
|
|
63
|
+
visitOneHasOneOwning: ({ relation }) => {
|
|
64
|
+
const uniqueConstraintName = NamingHelper.createUniqueConstraintName(entity.name, [relation.name])
|
|
65
|
+
const newUniqueConstraintName = NamingHelper.createUniqueConstraintName(entity.name, [this.data.newFieldName])
|
|
66
|
+
builder.renameConstraint(entity.tableName, uniqueConstraintName, newUniqueConstraintName)
|
|
67
|
+
},
|
|
68
|
+
})
|
|
69
|
+
}
|
|
70
|
+
|
|
50
71
|
this.renameColumnSubModification.createSql(builder)
|
|
51
72
|
}
|
|
52
73
|
|
|
@@ -27,6 +27,7 @@ import { getPrimaryColumnType } from '../utils/getPrimaryColumnType'
|
|
|
27
27
|
import { createJunctionTableSql } from '../utils/createJunctionTable'
|
|
28
28
|
import { normalizeManyHasManyRelation, PartialManyHasManyRelation } from './normalization'
|
|
29
29
|
import { resolveIndexName, SchemaWithMeta } from '../utils/schemaMeta'
|
|
30
|
+
import { addForeignKeyConstraint } from './helpers'
|
|
30
31
|
|
|
31
32
|
|
|
32
33
|
export class CreateRelationModificationHandler implements ModificationHandler<CreateRelationModificationData> {
|
|
@@ -50,21 +51,7 @@ export class CreateRelationModificationHandler implements ModificationHandler<Cr
|
|
|
50
51
|
notNull: !relation.nullable,
|
|
51
52
|
},
|
|
52
53
|
})
|
|
53
|
-
|
|
54
|
-
entity.tableName,
|
|
55
|
-
relation.joiningColumn.columnName,
|
|
56
|
-
targetEntity.tableName,
|
|
57
|
-
targetEntity.primaryColumn,
|
|
58
|
-
)
|
|
59
|
-
builder.addConstraint(entity.tableName, fkName, {
|
|
60
|
-
foreignKeys: {
|
|
61
|
-
columns: relation.joiningColumn.columnName,
|
|
62
|
-
references: `"${targetEntity.tableName}"("${targetEntity.primaryColumn}")`,
|
|
63
|
-
onDelete: 'NO ACTION',
|
|
64
|
-
},
|
|
65
|
-
deferrable: true,
|
|
66
|
-
deferred: false,
|
|
67
|
-
})
|
|
54
|
+
addForeignKeyConstraint({ builder, entity, targetEntity, relation })
|
|
68
55
|
}
|
|
69
56
|
acceptRelationTypeVisitor(this.schema.model, entity, this.getNormalizedOwningSide(), {
|
|
70
57
|
visitManyHasOne: ({ relation }) => {
|
|
@@ -4,11 +4,30 @@ import { SchemaUpdater, updateEntity, updateField, updateModel } from '../utils/
|
|
|
4
4
|
import { createModificationType, Differ, ModificationHandler } from '../ModificationHandler'
|
|
5
5
|
import { isIt } from '../../utils/isIt'
|
|
6
6
|
import { updateRelations } from '../utils/diffUtils'
|
|
7
|
+
import { acceptRelationTypeVisitor } from '@contember/schema-utils'
|
|
8
|
+
import { addForeignKeyConstraint } from './helpers'
|
|
7
9
|
|
|
8
10
|
export class UpdateRelationOnDeleteModificationHandler implements ModificationHandler<UpdateRelationOnDeleteModificationData> {
|
|
9
11
|
constructor(private readonly data: UpdateRelationOnDeleteModificationData, private readonly schema: Schema) {}
|
|
10
12
|
|
|
11
|
-
public createSql(builder: MigrationBuilder): void {
|
|
13
|
+
public createSql(builder: MigrationBuilder): void {
|
|
14
|
+
const entity = this.schema.model.entities[this.data.entityName]
|
|
15
|
+
if (entity.view) {
|
|
16
|
+
return
|
|
17
|
+
}
|
|
18
|
+
acceptRelationTypeVisitor(this.schema.model, entity, this.data.fieldName, {
|
|
19
|
+
visitManyHasOne: ({ entity, relation, targetEntity }) => {
|
|
20
|
+
addForeignKeyConstraint({ builder, entity, targetEntity, relation, recreate: true })
|
|
21
|
+
},
|
|
22
|
+
visitOneHasOneOwning: ({ entity, relation, targetEntity }) => {
|
|
23
|
+
addForeignKeyConstraint({ builder, entity, targetEntity, relation, recreate: true })
|
|
24
|
+
},
|
|
25
|
+
visitOneHasMany: () => {},
|
|
26
|
+
visitOneHasOneInverse: () => {},
|
|
27
|
+
visitManyHasManyOwning: () => {},
|
|
28
|
+
visitManyHasManyInverse: () => {},
|
|
29
|
+
})
|
|
30
|
+
}
|
|
12
31
|
|
|
13
32
|
public getSchemaUpdater(): SchemaUpdater {
|
|
14
33
|
const { entityName, fieldName, onDelete } = this.data
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { MigrationBuilder } from '@contember/database-migrations'
|
|
2
|
+
import { NamingHelper } from '@contember/schema-utils'
|
|
3
|
+
import { Model } from '@contember/schema'
|
|
4
|
+
|
|
5
|
+
export const addForeignKeyConstraint = ({ builder, entity, relation, targetEntity, recreate = false }: {
|
|
6
|
+
recreate?: boolean
|
|
7
|
+
builder: MigrationBuilder
|
|
8
|
+
entity: Model.Entity
|
|
9
|
+
targetEntity: Model.Entity
|
|
10
|
+
relation: Model.OneHasOneOwningRelation | Model.ManyHasOneRelation
|
|
11
|
+
}) => {
|
|
12
|
+
const fkName = NamingHelper.createForeignKeyName(
|
|
13
|
+
entity.tableName,
|
|
14
|
+
relation.joiningColumn.columnName,
|
|
15
|
+
targetEntity.tableName,
|
|
16
|
+
targetEntity.primaryColumn,
|
|
17
|
+
)
|
|
18
|
+
if (recreate) {
|
|
19
|
+
builder.dropConstraint(entity.tableName, fkName)
|
|
20
|
+
}
|
|
21
|
+
builder.addConstraint(entity.tableName, fkName, {
|
|
22
|
+
foreignKeys: {
|
|
23
|
+
columns: relation.joiningColumn.columnName,
|
|
24
|
+
references: `"${targetEntity.tableName}"("${targetEntity.primaryColumn}")`,
|
|
25
|
+
onDelete: ({
|
|
26
|
+
[Model.OnDelete.setNull]: 'SET NULL',
|
|
27
|
+
[Model.OnDelete.cascade]: 'CASCADE',
|
|
28
|
+
[Model.OnDelete.restrict]: 'NO ACTION',
|
|
29
|
+
} as const)[relation.joiningColumn.onDelete],
|
|
30
|
+
},
|
|
31
|
+
deferrable: true,
|
|
32
|
+
deferred: false,
|
|
33
|
+
})
|
|
34
|
+
}
|
package/src/tsconfig.json
CHANGED
|
@@ -6,17 +6,10 @@
|
|
|
6
6
|
"downlevelIteration": true
|
|
7
7
|
},
|
|
8
8
|
"references": [
|
|
9
|
-
{
|
|
10
|
-
|
|
11
|
-
},
|
|
12
|
-
{
|
|
13
|
-
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"path": "../../schema/src"
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
"path": "../../schema-utils/src"
|
|
20
|
-
}
|
|
9
|
+
{ "path": "../../database/src" },
|
|
10
|
+
{ "path": "../../database-migrations/src" },
|
|
11
|
+
{ "path": "../../engine-common/src" },
|
|
12
|
+
{ "path": "../../schema/src" },
|
|
13
|
+
{ "path": "../../schema-utils/src" }
|
|
21
14
|
]
|
|
22
15
|
}
|
|
@@ -84,6 +84,6 @@ testMigrations('create many has one relation (post with author)', {
|
|
|
84
84
|
ALTER TABLE "post"
|
|
85
85
|
ADD "author_id" uuid;
|
|
86
86
|
ALTER TABLE "post"
|
|
87
|
-
ADD CONSTRAINT "fk_post_author_id_87ef9a" FOREIGN KEY ("author_id") REFERENCES "author"("id") ON DELETE
|
|
87
|
+
ADD CONSTRAINT "fk_post_author_id_87ef9a" FOREIGN KEY ("author_id") REFERENCES "author"("id") ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE;
|
|
88
88
|
CREATE INDEX "post_author_id_index" ON "post" ("author_id");`,
|
|
89
89
|
})
|
|
@@ -56,5 +56,5 @@ testMigrations('create inverse side relation together with changing onDelete beh
|
|
|
56
56
|
},
|
|
57
57
|
},
|
|
58
58
|
],
|
|
59
|
-
sql: SQL
|
|
59
|
+
sql: SQL`ALTER TABLE "post_locale" DROP CONSTRAINT "fk_post_locale_post_id_f3d2e5"; ALTER TABLE "post_locale" ADD CONSTRAINT "fk_post_locale_post_id_f3d2e5" FOREIGN KEY ("post_id") REFERENCES "post"("id") ON DELETE NO ACTION DEFERRABLE INITIALLY IMMEDIATE;`,
|
|
60
60
|
})
|