@contember/schema-migrations 2.1.0-alpha.3 → 2.1.0-alpha.30

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 (114) hide show
  1. package/dist/development/src/SchemaDiffer.cjs +1 -1
  2. package/dist/development/src/SchemaDiffer.cjs.map +1 -1
  3. package/dist/development/src/SchemaDiffer.js +1 -1
  4. package/dist/development/src/SchemaDiffer.js.map +1 -1
  5. package/dist/development/src/modifications/ModificationHandlerFactory.cjs +2 -0
  6. package/dist/development/src/modifications/ModificationHandlerFactory.cjs.map +1 -1
  7. package/dist/development/src/modifications/ModificationHandlerFactory.js +2 -0
  8. package/dist/development/src/modifications/ModificationHandlerFactory.js.map +1 -1
  9. package/dist/development/src/modifications/acl/UpdateAclSchemaModification.cjs +1 -1
  10. package/dist/development/src/modifications/acl/UpdateAclSchemaModification.cjs.map +1 -1
  11. package/dist/development/src/modifications/acl/UpdateAclSchemaModification.js +1 -1
  12. package/dist/development/src/modifications/acl/UpdateAclSchemaModification.js.map +1 -1
  13. package/dist/development/src/modifications/actions/PatchTriggerModification.cjs +44 -0
  14. package/dist/development/src/modifications/actions/PatchTriggerModification.cjs.map +1 -0
  15. package/dist/development/src/modifications/actions/PatchTriggerModification.js +44 -0
  16. package/dist/development/src/modifications/actions/PatchTriggerModification.js.map +1 -0
  17. package/dist/development/src/modifications/actions/UpdateTriggerModification.cjs +16 -1
  18. package/dist/development/src/modifications/actions/UpdateTriggerModification.cjs.map +1 -1
  19. package/dist/development/src/modifications/actions/UpdateTriggerModification.js +16 -1
  20. package/dist/development/src/modifications/actions/UpdateTriggerModification.js.map +1 -1
  21. package/dist/development/src/modifications/columns/UpdateColumnDefinitionModification.cjs +1 -1
  22. package/dist/development/src/modifications/columns/UpdateColumnDefinitionModification.cjs.map +1 -1
  23. package/dist/development/src/modifications/columns/UpdateColumnDefinitionModification.js +1 -1
  24. package/dist/development/src/modifications/columns/UpdateColumnDefinitionModification.js.map +1 -1
  25. package/dist/development/src/modifications/constraints/CreateUniqueConstraintModification.cjs +3 -2
  26. package/dist/development/src/modifications/constraints/CreateUniqueConstraintModification.cjs.map +1 -1
  27. package/dist/development/src/modifications/constraints/CreateUniqueConstraintModification.js +3 -2
  28. package/dist/development/src/modifications/constraints/CreateUniqueConstraintModification.js.map +1 -1
  29. package/dist/development/src/modifications/entities/RemoveEntityModification.cjs +5 -1
  30. package/dist/development/src/modifications/entities/RemoveEntityModification.cjs.map +1 -1
  31. package/dist/development/src/modifications/entities/RemoveEntityModification.js +5 -1
  32. package/dist/development/src/modifications/entities/RemoveEntityModification.js.map +1 -1
  33. package/dist/development/src/modifications/enums/UpdateEnumModification.cjs +36 -8
  34. package/dist/development/src/modifications/enums/UpdateEnumModification.cjs.map +1 -1
  35. package/dist/development/src/modifications/enums/UpdateEnumModification.js +34 -6
  36. package/dist/development/src/modifications/enums/UpdateEnumModification.js.map +1 -1
  37. package/dist/development/src/modifications/indexes/CreateIndexModification.cjs +4 -2
  38. package/dist/development/src/modifications/indexes/CreateIndexModification.cjs.map +1 -1
  39. package/dist/development/src/modifications/indexes/CreateIndexModification.js +4 -2
  40. package/dist/development/src/modifications/indexes/CreateIndexModification.js.map +1 -1
  41. package/dist/production/src/SchemaDiffer.cjs +1 -1
  42. package/dist/production/src/SchemaDiffer.cjs.map +1 -1
  43. package/dist/production/src/SchemaDiffer.js +1 -1
  44. package/dist/production/src/SchemaDiffer.js.map +1 -1
  45. package/dist/production/src/modifications/ModificationHandlerFactory.cjs +2 -0
  46. package/dist/production/src/modifications/ModificationHandlerFactory.cjs.map +1 -1
  47. package/dist/production/src/modifications/ModificationHandlerFactory.js +2 -0
  48. package/dist/production/src/modifications/ModificationHandlerFactory.js.map +1 -1
  49. package/dist/production/src/modifications/acl/UpdateAclSchemaModification.cjs +1 -1
  50. package/dist/production/src/modifications/acl/UpdateAclSchemaModification.cjs.map +1 -1
  51. package/dist/production/src/modifications/acl/UpdateAclSchemaModification.js +1 -1
  52. package/dist/production/src/modifications/acl/UpdateAclSchemaModification.js.map +1 -1
  53. package/dist/production/src/modifications/actions/PatchTriggerModification.cjs +44 -0
  54. package/dist/production/src/modifications/actions/PatchTriggerModification.cjs.map +1 -0
  55. package/dist/production/src/modifications/actions/PatchTriggerModification.js +44 -0
  56. package/dist/production/src/modifications/actions/PatchTriggerModification.js.map +1 -0
  57. package/dist/production/src/modifications/actions/UpdateTriggerModification.cjs +16 -1
  58. package/dist/production/src/modifications/actions/UpdateTriggerModification.cjs.map +1 -1
  59. package/dist/production/src/modifications/actions/UpdateTriggerModification.js +16 -1
  60. package/dist/production/src/modifications/actions/UpdateTriggerModification.js.map +1 -1
  61. package/dist/production/src/modifications/columns/UpdateColumnDefinitionModification.cjs +1 -1
  62. package/dist/production/src/modifications/columns/UpdateColumnDefinitionModification.cjs.map +1 -1
  63. package/dist/production/src/modifications/columns/UpdateColumnDefinitionModification.js +1 -1
  64. package/dist/production/src/modifications/columns/UpdateColumnDefinitionModification.js.map +1 -1
  65. package/dist/production/src/modifications/constraints/CreateUniqueConstraintModification.cjs +3 -2
  66. package/dist/production/src/modifications/constraints/CreateUniqueConstraintModification.cjs.map +1 -1
  67. package/dist/production/src/modifications/constraints/CreateUniqueConstraintModification.js +3 -2
  68. package/dist/production/src/modifications/constraints/CreateUniqueConstraintModification.js.map +1 -1
  69. package/dist/production/src/modifications/entities/RemoveEntityModification.cjs +5 -1
  70. package/dist/production/src/modifications/entities/RemoveEntityModification.cjs.map +1 -1
  71. package/dist/production/src/modifications/entities/RemoveEntityModification.js +5 -1
  72. package/dist/production/src/modifications/entities/RemoveEntityModification.js.map +1 -1
  73. package/dist/production/src/modifications/enums/UpdateEnumModification.cjs +36 -8
  74. package/dist/production/src/modifications/enums/UpdateEnumModification.cjs.map +1 -1
  75. package/dist/production/src/modifications/enums/UpdateEnumModification.js +34 -6
  76. package/dist/production/src/modifications/enums/UpdateEnumModification.js.map +1 -1
  77. package/dist/production/src/modifications/indexes/CreateIndexModification.cjs +4 -2
  78. package/dist/production/src/modifications/indexes/CreateIndexModification.cjs.map +1 -1
  79. package/dist/production/src/modifications/indexes/CreateIndexModification.js +4 -2
  80. package/dist/production/src/modifications/indexes/CreateIndexModification.js.map +1 -1
  81. package/dist/tests/cases/integration/patchTrigger.test.d.ts +2 -0
  82. package/dist/tests/cases/integration/patchTrigger.test.d.ts.map +1 -0
  83. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  84. package/dist/types/modifications/ModificationHandlerFactory.d.ts.map +1 -1
  85. package/dist/types/modifications/actions/PatchTriggerModification.d.ts +18 -0
  86. package/dist/types/modifications/actions/PatchTriggerModification.d.ts.map +1 -0
  87. package/dist/types/modifications/actions/UpdateTriggerModification.d.ts +5 -1
  88. package/dist/types/modifications/actions/UpdateTriggerModification.d.ts.map +1 -1
  89. package/dist/types/modifications/actions/index.d.ts +1 -0
  90. package/dist/types/modifications/actions/index.d.ts.map +1 -1
  91. package/dist/types/modifications/columns/UpdateColumnDefinitionModification.d.ts.map +1 -1
  92. package/dist/types/modifications/constraints/CreateUniqueConstraintModification.d.ts.map +1 -1
  93. package/dist/types/modifications/entities/RemoveEntityModification.d.ts.map +1 -1
  94. package/dist/types/modifications/enums/UpdateEnumModification.d.ts +1 -0
  95. package/dist/types/modifications/enums/UpdateEnumModification.d.ts.map +1 -1
  96. package/dist/types/modifications/indexes/CreateIndexModification.d.ts.map +1 -1
  97. package/dist/types/tsconfig.tsbuildinfo +1 -1
  98. package/package.json +7 -7
  99. package/src/SchemaDiffer.ts +1 -1
  100. package/src/modifications/ModificationHandlerFactory.ts +2 -1
  101. package/src/modifications/acl/UpdateAclSchemaModification.ts +1 -1
  102. package/src/modifications/actions/PatchTriggerModification.ts +51 -0
  103. package/src/modifications/actions/UpdateTriggerModification.ts +22 -1
  104. package/src/modifications/actions/index.ts +1 -0
  105. package/src/modifications/columns/UpdateColumnDefinitionModification.ts +3 -1
  106. package/src/modifications/constraints/CreateUniqueConstraintModification.ts +3 -2
  107. package/src/modifications/entities/RemoveEntityModification.ts +5 -1
  108. package/src/modifications/enums/UpdateEnumModification.ts +44 -7
  109. package/src/modifications/indexes/CreateIndexModification.ts +4 -2
  110. package/tests/cases/integration/createAndDropIndex.test.ts +100 -0
  111. package/tests/cases/integration/createUnique.test.ts +154 -2
  112. package/tests/cases/integration/patchTrigger.test.ts +184 -0
  113. package/tests/cases/integration/updateColumnDefinition.test.ts +28 -1
  114. package/tests/cases/integration/updateEnum.test.ts +43 -1
@@ -0,0 +1,184 @@
1
+ import { Actions } from '@contember/schema'
2
+ import { emptySchema } from '@contember/schema-utils'
3
+ import { describe } from 'bun:test'
4
+ import { testMigrations } from '../../src/tests'
5
+ import { c, createSchema } from '@contember/schema-definition'
6
+ namespace Schema {
7
+ export class Post {
8
+ title = c.stringColumn()
9
+ description = c.stringColumn()
10
+ category = c.manyHasOne(Category, 'articles')
11
+ }
12
+
13
+ export class Category {
14
+ name = c.stringColumn()
15
+ slug = c.stringColumn()
16
+ articles = c.oneHasMany(Post, 'category')
17
+ }
18
+
19
+
20
+ }
21
+
22
+ describe('patch trigger', () => testMigrations({
23
+ original: {
24
+ ...createSchema(Schema),
25
+ actions: {
26
+ triggers: {
27
+ 'post_created': {
28
+ type: 'basic',
29
+ name: 'post_created',
30
+ entity: 'Post',
31
+ create: true,
32
+ delete: false,
33
+ update: false,
34
+ target: 'webhook',
35
+ selection: [
36
+ 'id',
37
+ 'title',
38
+ ['category', {}, ['name']],
39
+ ],
40
+ } satisfies Actions.BasicTrigger,
41
+ },
42
+ targets: {
43
+ 'webhook': {
44
+ type: 'webhook',
45
+ name: 'webhook',
46
+ url: 'https://example.com/webhook',
47
+ } satisfies Actions.WebhookTarget,
48
+ },
49
+ },
50
+ },
51
+ updated: {
52
+ ...createSchema(Schema),
53
+ actions: {
54
+ triggers: {
55
+ 'post_created': {
56
+ type: 'basic',
57
+ name: 'post_created',
58
+ entity: 'Post',
59
+ create: true,
60
+ delete: false,
61
+ update: false,
62
+ target: 'webhook',
63
+ selection: [
64
+ 'id',
65
+ 'title',
66
+ 'description', // added field
67
+ ['category', {}, ['name', 'slug']], // added sub-field
68
+ ],
69
+ } satisfies Actions.BasicTrigger,
70
+ },
71
+ targets: {
72
+ 'webhook': {
73
+ type: 'webhook',
74
+ name: 'webhook',
75
+ url: 'https://example.com/webhook',
76
+ } satisfies Actions.WebhookTarget,
77
+ },
78
+ },
79
+ },
80
+ diff: [
81
+ {
82
+ modification: 'patchTrigger',
83
+ triggerName: 'post_created',
84
+ patch: [
85
+ {
86
+ op: 'replace',
87
+ path: '/selection/2',
88
+ value: 'description',
89
+ },
90
+ {
91
+ op: 'add',
92
+ path: '/selection/-',
93
+ value: [
94
+ 'category',
95
+ {},
96
+ [
97
+ 'name',
98
+ 'slug',
99
+ ],
100
+ ],
101
+ },
102
+ ],
103
+ },
104
+ ],
105
+ sql: '', // no SQL changes for action modifications
106
+ }))
107
+
108
+ describe('patch watch trigger', () => testMigrations({
109
+ original: {
110
+ ...createSchema(Schema),
111
+ actions: {
112
+ triggers: {
113
+ 'post_watch': {
114
+ type: 'watch',
115
+ name: 'post_watch',
116
+ entity: 'Post',
117
+ target: 'webhook',
118
+ watch: [
119
+ 'title',
120
+ ['category', {}, ['name']],
121
+ ],
122
+ } satisfies Actions.WatchTrigger,
123
+ },
124
+ targets: {
125
+ 'webhook': {
126
+ type: 'webhook',
127
+ name: 'webhook',
128
+ url: 'https://example.com/webhook',
129
+ } satisfies Actions.WebhookTarget,
130
+ },
131
+ },
132
+ },
133
+ updated: {
134
+ ...createSchema(Schema),
135
+ actions: {
136
+ triggers: {
137
+ 'post_watch': {
138
+ type: 'watch',
139
+ name: 'post_watch',
140
+ entity: 'Post',
141
+ target: 'webhook',
142
+ watch: [
143
+ 'title',
144
+ 'description', // added field
145
+ ['category', {}, ['name', 'slug']], // added sub-field
146
+ ],
147
+ } satisfies Actions.WatchTrigger,
148
+ },
149
+ targets: {
150
+ 'webhook': {
151
+ type: 'webhook',
152
+ name: 'webhook',
153
+ url: 'https://example.com/webhook',
154
+ } satisfies Actions.WebhookTarget,
155
+ },
156
+ },
157
+ },
158
+ diff: [
159
+ {
160
+ modification: 'patchTrigger',
161
+ triggerName: 'post_watch',
162
+ patch: [
163
+ {
164
+ op: 'replace',
165
+ path: '/watch/1',
166
+ value: 'description',
167
+ },
168
+ {
169
+ op: 'add',
170
+ path: '/watch/-',
171
+ value: [
172
+ 'category',
173
+ {},
174
+ [
175
+ 'name',
176
+ 'slug',
177
+ ],
178
+ ],
179
+ },
180
+ ],
181
+ },
182
+ ],
183
+ sql: '', // no SQL changes for action modifications
184
+ }))
@@ -251,5 +251,32 @@ describe('change string to array string', () => testMigrations({
251
251
  },
252
252
  }),
253
253
  ],
254
- sql: SQL`ALTER TABLE "author" ALTER "email" SET DATA TYPE text[] USING ARRAY["email"]::text[];`,
254
+ sql: SQL`ALTER TABLE "author" ALTER "email" SET DATA TYPE text[] USING CASE WHEN "email" IS NULL THEN NULL ELSE ARRAY["email"]::text[] END;`,
255
+ }))
256
+
257
+ describe('change string to array string not null', () => testMigrations({
258
+ original: createSchema({
259
+ Author: class Author {
260
+ email = def.stringColumn().notNull()
261
+ },
262
+ }),
263
+ updated: createSchema({
264
+ Author: class Author {
265
+ email = def.stringColumn().list().notNull()
266
+ },
267
+ }),
268
+ diff: [
269
+ updateColumnDefinitionModification.createModification({
270
+ entityName: 'Author',
271
+ fieldName: 'email',
272
+ definition: {
273
+ type: Model.ColumnType.String,
274
+ columnType: 'text',
275
+ nullable: false,
276
+ list: true,
277
+ },
278
+ }),
279
+ ],
280
+ sql: SQL`ALTER TABLE "author"
281
+ ALTER "email" SET DATA TYPE text[] USING CASE WHEN "email" IS NULL THEN ARRAY[]::text[] ELSE ARRAY["email"]::text[] END;`,
255
282
  }))
@@ -1,6 +1,6 @@
1
1
  import { describe } from 'bun:test'
2
2
  import { testMigrations } from '../../src/tests'
3
- import { SchemaBuilder } from '@contember/schema-definition'
3
+ import { c, createSchema, SchemaBuilder } from '@contember/schema-definition'
4
4
  import { Model } from '@contember/schema'
5
5
  import { SQL } from '../../src/tags'
6
6
 
@@ -35,3 +35,45 @@ describe('update enum', () => testMigrations({
35
35
  sql: SQL`ALTER DOMAIN "postStatus" DROP CONSTRAINT poststatus_check;
36
36
  ALTER DOMAIN "postStatus" ADD CONSTRAINT poststatus_check CHECK (VALUE IN('publish','draft'));`,
37
37
  }))
38
+
39
+
40
+ namespace EnumModelOriginal {
41
+ export const FooStatus = c.createEnum('foo', 'bar')
42
+ export class Foo {
43
+
44
+ status = c.enumColumn(FooStatus).notNull()
45
+ statusList = c.enumColumn(FooStatus).notNull().list()
46
+ }
47
+ }
48
+
49
+ namespace EnumModelUpdated {
50
+ export const FooStatus = c.createEnum('foo', 'bar', 'baz')
51
+
52
+ export class Foo {
53
+
54
+ status = c.enumColumn(FooStatus).notNull()
55
+ statusList = c.enumColumn(FooStatus).notNull().list()
56
+ }
57
+ }
58
+
59
+
60
+ describe('update enum if used in list', () => testMigrations({
61
+ original: {
62
+ model: createSchema(EnumModelOriginal).model,
63
+ },
64
+ updated: {
65
+ model: createSchema(EnumModelUpdated).model,
66
+ },
67
+ diff: [
68
+ {
69
+ modification: 'updateEnum',
70
+ enumName: 'FooStatus',
71
+ values: ['foo', 'bar', 'baz'],
72
+ },
73
+ ],
74
+ sql: SQL`ALTER DOMAIN "FooStatus" RENAME TO "FooStatus__old";
75
+ CREATE DOMAIN "FooStatus" AS text CONSTRAINT "foostatus_check" CHECK (VALUE IN('foo','bar','baz'));
76
+ ALTER TABLE "foo" ALTER "status" SET DATA TYPE "FooStatus";
77
+ ALTER TABLE "foo" ALTER "status_list" SET DATA TYPE "FooStatus"[];
78
+ DROP DOMAIN "FooStatus__old";`,
79
+ }))