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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/dist/src/acl/PredicateDefinitionProcessor.js +2 -2
  2. package/dist/src/acl/PredicateDefinitionProcessor.js.map +1 -1
  3. package/dist/src/definition-generator/TsDefinitionGenerator.d.ts +26 -0
  4. package/dist/src/definition-generator/TsDefinitionGenerator.d.ts.map +1 -0
  5. package/dist/src/definition-generator/TsDefinitionGenerator.js +246 -0
  6. package/dist/src/definition-generator/TsDefinitionGenerator.js.map +1 -0
  7. package/dist/src/definition-generator/index.d.ts +2 -0
  8. package/dist/src/definition-generator/index.d.ts.map +1 -0
  9. package/dist/src/definition-generator/index.js +18 -0
  10. package/dist/src/definition-generator/index.js.map +1 -0
  11. package/dist/src/index.d.ts +2 -0
  12. package/dist/src/index.d.ts.map +1 -1
  13. package/dist/src/index.js +4 -0
  14. package/dist/src/index.js.map +1 -1
  15. package/dist/src/lax/LaxSchemaConverter.d.ts +10 -0
  16. package/dist/src/lax/LaxSchemaConverter.d.ts.map +1 -0
  17. package/dist/src/lax/LaxSchemaConverter.js +204 -0
  18. package/dist/src/lax/LaxSchemaConverter.js.map +1 -0
  19. package/dist/src/lax/index.d.ts +3 -0
  20. package/dist/src/lax/index.d.ts.map +1 -0
  21. package/dist/src/lax/index.js +6 -0
  22. package/dist/src/lax/index.js.map +1 -0
  23. package/dist/src/lax/schema.d.ts +284 -0
  24. package/dist/src/lax/schema.d.ts.map +1 -0
  25. package/dist/src/lax/schema.js +67 -0
  26. package/dist/src/lax/schema.js.map +1 -0
  27. package/dist/src/model/NamingConventions.d.ts +17 -0
  28. package/dist/src/model/NamingConventions.d.ts.map +1 -0
  29. package/dist/src/model/NamingConventions.js +29 -0
  30. package/dist/src/model/NamingConventions.js.map +1 -0
  31. package/dist/src/model/NamingHelper.d.ts +2 -0
  32. package/dist/src/model/NamingHelper.d.ts.map +1 -1
  33. package/dist/src/model/NamingHelper.js +10 -2
  34. package/dist/src/model/NamingHelper.js.map +1 -1
  35. package/dist/src/model/index.d.ts +2 -0
  36. package/dist/src/model/index.d.ts.map +1 -1
  37. package/dist/src/model/index.js +2 -0
  38. package/dist/src/model/index.js.map +1 -1
  39. package/dist/src/model/modelUtils.d.ts +1 -0
  40. package/dist/src/model/modelUtils.d.ts.map +1 -1
  41. package/dist/src/model/modelUtils.js +69 -46
  42. package/dist/src/model/modelUtils.js.map +1 -1
  43. package/dist/src/model/resolveDefaultColumnType.d.ts +3 -0
  44. package/dist/src/model/resolveDefaultColumnType.d.ts.map +1 -0
  45. package/dist/src/model/resolveDefaultColumnType.js +29 -0
  46. package/dist/src/model/resolveDefaultColumnType.js.map +1 -0
  47. package/dist/src/schemaNormalizer.d.ts.map +1 -1
  48. package/dist/src/schemaNormalizer.js +1 -0
  49. package/dist/src/schemaNormalizer.js.map +1 -1
  50. package/dist/src/tsconfig.tsbuildinfo +1 -1
  51. package/dist/src/type-schema/acl.d.ts.map +1 -1
  52. package/dist/src/type-schema/acl.js +15 -4
  53. package/dist/src/type-schema/acl.js.map +1 -1
  54. package/dist/src/type-schema/index.d.ts +1 -0
  55. package/dist/src/type-schema/index.d.ts.map +1 -1
  56. package/dist/src/type-schema/index.js +1 -0
  57. package/dist/src/type-schema/index.js.map +1 -1
  58. package/dist/src/type-schema/model.js +1 -1
  59. package/dist/src/type-schema/model.js.map +1 -1
  60. package/dist/src/type-schema/settings.d.ts +10 -0
  61. package/dist/src/type-schema/settings.d.ts.map +1 -0
  62. package/dist/src/type-schema/settings.js +32 -0
  63. package/dist/src/type-schema/settings.js.map +1 -0
  64. package/dist/src/validation/AclValidator.d.ts.map +1 -1
  65. package/dist/src/validation/AclValidator.js +11 -11
  66. package/dist/src/validation/AclValidator.js.map +1 -1
  67. package/dist/src/validation/MembershipResolver.d.ts.map +1 -1
  68. package/dist/src/validation/MembershipResolver.js +12 -3
  69. package/dist/src/validation/MembershipResolver.js.map +1 -1
  70. package/dist/src/validation/ModelValidator.d.ts.map +1 -1
  71. package/dist/src/validation/ModelValidator.js +77 -43
  72. package/dist/src/validation/ModelValidator.js.map +1 -1
  73. package/dist/src/validation/SchemaValidator.d.ts +6 -2
  74. package/dist/src/validation/SchemaValidator.d.ts.map +1 -1
  75. package/dist/src/validation/SchemaValidator.js +7 -2
  76. package/dist/src/validation/SchemaValidator.js.map +1 -1
  77. package/dist/src/validation/ValidationValidator.js +4 -4
  78. package/dist/src/validation/ValidationValidator.js.map +1 -1
  79. package/dist/src/validation/errors.d.ts +3 -1
  80. package/dist/src/validation/errors.d.ts.map +1 -1
  81. package/dist/src/validation/errors.js +2 -2
  82. package/dist/src/validation/errors.js.map +1 -1
  83. package/dist/tests/cases/unit/laxSchemaConverter.test.d.ts +2 -0
  84. package/dist/tests/cases/unit/laxSchemaConverter.test.d.ts.map +1 -0
  85. package/dist/tests/cases/unit/laxSchemaConverter.test.js +118 -0
  86. package/dist/tests/cases/unit/laxSchemaConverter.test.js.map +1 -0
  87. package/dist/tests/cases/unit/membershipResolver.test.js +19 -0
  88. package/dist/tests/cases/unit/membershipResolver.test.js.map +1 -1
  89. package/dist/tests/cases/unit/modelValidator.test.d.ts +2 -0
  90. package/dist/tests/cases/unit/modelValidator.test.d.ts.map +1 -0
  91. package/dist/tests/cases/unit/modelValidator.test.js +141 -0
  92. package/dist/tests/cases/unit/modelValidator.test.js.map +1 -0
  93. package/dist/tests/cases/unit/schemas/basic.d.ts +5 -0
  94. package/dist/tests/cases/unit/schemas/basic.d.ts.map +1 -0
  95. package/dist/tests/cases/unit/schemas/basic.js +11 -0
  96. package/dist/tests/cases/unit/schemas/basic.js.map +1 -0
  97. package/dist/tests/cases/unit/schemas/enum.d.ts +7 -0
  98. package/dist/tests/cases/unit/schemas/enum.d.ts.map +1 -0
  99. package/dist/tests/cases/unit/schemas/enum.js +13 -0
  100. package/dist/tests/cases/unit/schemas/enum.js.map +1 -0
  101. package/dist/tests/cases/unit/schemas/relations.d.ts +15 -0
  102. package/dist/tests/cases/unit/schemas/relations.d.ts.map +1 -0
  103. package/dist/tests/cases/unit/schemas/relations.js +27 -0
  104. package/dist/tests/cases/unit/schemas/relations.js.map +1 -0
  105. package/dist/tests/cases/unit/schemas/unique.d.ts +5 -0
  106. package/dist/tests/cases/unit/schemas/unique.d.ts.map +1 -0
  107. package/dist/tests/cases/unit/schemas/unique.js +20 -0
  108. package/dist/tests/cases/unit/schemas/unique.js.map +1 -0
  109. package/dist/tests/cases/unit/tsDefinitionGenerator.test.d.ts +2 -0
  110. package/dist/tests/cases/unit/tsDefinitionGenerator.test.d.ts.map +1 -0
  111. package/dist/tests/cases/unit/tsDefinitionGenerator.test.js +56 -0
  112. package/dist/tests/cases/unit/tsDefinitionGenerator.test.js.map +1 -0
  113. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  114. package/package.json +3 -3
  115. package/src/acl/PredicateDefinitionProcessor.ts +2 -2
  116. package/src/definition-generator/TsDefinitionGenerator.ts +275 -0
  117. package/src/definition-generator/index.ts +1 -0
  118. package/src/index.ts +5 -1
  119. package/src/lax/LaxSchemaConverter.ts +213 -0
  120. package/src/lax/index.ts +9 -0
  121. package/src/lax/schema.ts +62 -0
  122. package/src/model/NamingConventions.ts +53 -0
  123. package/src/model/NamingHelper.ts +11 -1
  124. package/src/model/index.ts +2 -0
  125. package/src/model/modelUtils.ts +76 -71
  126. package/src/model/resolveDefaultColumnType.ts +25 -0
  127. package/src/schemaNormalizer.ts +1 -0
  128. package/src/type-schema/acl.ts +30 -11
  129. package/src/type-schema/index.ts +1 -0
  130. package/src/type-schema/model.ts +1 -1
  131. package/src/type-schema/settings.ts +8 -0
  132. package/src/validation/AclValidator.ts +10 -11
  133. package/src/validation/MembershipResolver.ts +10 -3
  134. package/src/validation/ModelValidator.ts +77 -45
  135. package/src/validation/SchemaValidator.ts +17 -4
  136. package/src/validation/ValidationValidator.ts +4 -4
  137. package/src/validation/errors.ts +25 -2
  138. package/tests/cases/unit/__snapshots__/laxSchemaConverter.test.ts.snap +310 -0
  139. package/tests/cases/unit/laxSchemaConverter.test.ts +137 -0
  140. package/tests/cases/unit/membershipResolver.test.ts +22 -0
  141. package/tests/cases/unit/modelValidator.test.ts +143 -0
  142. package/tests/cases/unit/schemas/.eslintignore +1 -0
  143. package/tests/cases/unit/schemas/basic.ts +5 -0
  144. package/tests/cases/unit/schemas/enum.ts +8 -0
  145. package/tests/cases/unit/schemas/relations.ts +17 -0
  146. package/tests/cases/unit/schemas/unique.ts +6 -0
  147. package/tests/cases/unit/tsDefinitionGenerator.test.ts +31 -0
@@ -0,0 +1,310 @@
1
+ // Vitest Snapshot v1
2
+
3
+ exports[`lax schema converter basic 1`] = `
4
+ {
5
+ "acl": {
6
+ "roles": {},
7
+ },
8
+ "model": {
9
+ "entities": {
10
+ "Article": {
11
+ "eventLog": {
12
+ "enabled": true,
13
+ },
14
+ "fields": {
15
+ "content": {
16
+ "columnName": "content",
17
+ "columnType": "jsonb",
18
+ "name": "content",
19
+ "nullable": true,
20
+ "type": "Json",
21
+ },
22
+ "id": {
23
+ "columnName": "id",
24
+ "columnType": "uuid",
25
+ "name": "id",
26
+ "nullable": false,
27
+ "type": "Uuid",
28
+ },
29
+ "state": {
30
+ "columnName": "state",
31
+ "columnType": "ArticleState",
32
+ "name": "state",
33
+ "nullable": true,
34
+ "type": "Enum",
35
+ },
36
+ "title": {
37
+ "columnName": "title",
38
+ "columnType": "text",
39
+ "name": "title",
40
+ "nullable": false,
41
+ "type": "String",
42
+ },
43
+ },
44
+ "indexes": {},
45
+ "name": "Article",
46
+ "primary": "id",
47
+ "primaryColumn": "id",
48
+ "tableName": "article",
49
+ "unique": {},
50
+ },
51
+ },
52
+ "enums": {
53
+ "ArticleState": [
54
+ "draft",
55
+ "published",
56
+ "archived",
57
+ ],
58
+ },
59
+ },
60
+ "settings": {},
61
+ "validation": {},
62
+ }
63
+ `;
64
+
65
+ exports[`lax schema converter many-has-many 1`] = `
66
+ {
67
+ "acl": {
68
+ "roles": {},
69
+ },
70
+ "model": {
71
+ "entities": {
72
+ "Article": {
73
+ "eventLog": {
74
+ "enabled": true,
75
+ },
76
+ "fields": {
77
+ "id": {
78
+ "columnName": "id",
79
+ "columnType": "uuid",
80
+ "name": "id",
81
+ "nullable": false,
82
+ "type": "Uuid",
83
+ },
84
+ "tags": {
85
+ "inversedBy": "articles",
86
+ "joiningTable": {
87
+ "eventLog": {
88
+ "enabled": true,
89
+ },
90
+ "inverseJoiningColumn": {
91
+ "columnName": "tag_id",
92
+ "onDelete": "cascade",
93
+ },
94
+ "joiningColumn": {
95
+ "columnName": "article_id",
96
+ "onDelete": "cascade",
97
+ },
98
+ "tableName": "article_tags",
99
+ },
100
+ "name": "tags",
101
+ "target": "Tag",
102
+ "type": "ManyHasMany",
103
+ },
104
+ "title": {
105
+ "columnName": "title",
106
+ "columnType": "text",
107
+ "name": "title",
108
+ "nullable": false,
109
+ "type": "String",
110
+ },
111
+ },
112
+ "indexes": {},
113
+ "name": "Article",
114
+ "primary": "id",
115
+ "primaryColumn": "id",
116
+ "tableName": "article",
117
+ "unique": {},
118
+ },
119
+ "Tag": {
120
+ "eventLog": {
121
+ "enabled": true,
122
+ },
123
+ "fields": {
124
+ "articles": {
125
+ "name": "articles",
126
+ "ownedBy": "tags",
127
+ "target": "Article",
128
+ "type": "ManyHasMany",
129
+ },
130
+ "id": {
131
+ "columnName": "id",
132
+ "columnType": "uuid",
133
+ "name": "id",
134
+ "nullable": false,
135
+ "type": "Uuid",
136
+ },
137
+ },
138
+ "indexes": {},
139
+ "name": "Tag",
140
+ "primary": "id",
141
+ "primaryColumn": "id",
142
+ "tableName": "tag",
143
+ "unique": {},
144
+ },
145
+ },
146
+ "enums": {},
147
+ },
148
+ "settings": {},
149
+ "validation": {},
150
+ }
151
+ `;
152
+
153
+ exports[`lax schema converter one-has-many 1`] = `
154
+ {
155
+ "acl": {
156
+ "roles": {},
157
+ },
158
+ "model": {
159
+ "entities": {
160
+ "Article": {
161
+ "eventLog": {
162
+ "enabled": true,
163
+ },
164
+ "fields": {
165
+ "category": {
166
+ "inversedBy": "articles",
167
+ "joiningColumn": {
168
+ "columnName": "category_id",
169
+ "onDelete": "restrict",
170
+ },
171
+ "name": "category",
172
+ "nullable": true,
173
+ "target": "Category",
174
+ "type": "ManyHasOne",
175
+ },
176
+ "id": {
177
+ "columnName": "id",
178
+ "columnType": "uuid",
179
+ "name": "id",
180
+ "nullable": false,
181
+ "type": "Uuid",
182
+ },
183
+ "title": {
184
+ "columnName": "title",
185
+ "columnType": "text",
186
+ "name": "title",
187
+ "nullable": false,
188
+ "type": "String",
189
+ },
190
+ },
191
+ "indexes": {},
192
+ "name": "Article",
193
+ "primary": "id",
194
+ "primaryColumn": "id",
195
+ "tableName": "article",
196
+ "unique": {},
197
+ },
198
+ "Category": {
199
+ "eventLog": {
200
+ "enabled": true,
201
+ },
202
+ "fields": {
203
+ "articles": {
204
+ "name": "articles",
205
+ "ownedBy": "category",
206
+ "target": "Article",
207
+ "type": "OneHasMany",
208
+ },
209
+ "id": {
210
+ "columnName": "id",
211
+ "columnType": "uuid",
212
+ "name": "id",
213
+ "nullable": false,
214
+ "type": "Uuid",
215
+ },
216
+ },
217
+ "indexes": {},
218
+ "name": "Category",
219
+ "primary": "id",
220
+ "primaryColumn": "id",
221
+ "tableName": "category",
222
+ "unique": {},
223
+ },
224
+ },
225
+ "enums": {},
226
+ },
227
+ "settings": {},
228
+ "validation": {},
229
+ }
230
+ `;
231
+
232
+ exports[`lax schema converter one-has-one 1`] = `
233
+ {
234
+ "acl": {
235
+ "roles": {},
236
+ },
237
+ "model": {
238
+ "entities": {
239
+ "Article": {
240
+ "eventLog": {
241
+ "enabled": true,
242
+ },
243
+ "fields": {
244
+ "content": {
245
+ "inversedBy": "article",
246
+ "joiningColumn": {
247
+ "columnName": "content_id",
248
+ "onDelete": "restrict",
249
+ },
250
+ "name": "content",
251
+ "nullable": true,
252
+ "target": "Content",
253
+ "type": "OneHasOne",
254
+ },
255
+ "id": {
256
+ "columnName": "id",
257
+ "columnType": "uuid",
258
+ "name": "id",
259
+ "nullable": false,
260
+ "type": "Uuid",
261
+ },
262
+ "title": {
263
+ "columnName": "title",
264
+ "columnType": "text",
265
+ "name": "title",
266
+ "nullable": false,
267
+ "type": "String",
268
+ },
269
+ },
270
+ "indexes": {},
271
+ "name": "Article",
272
+ "primary": "id",
273
+ "primaryColumn": "id",
274
+ "tableName": "article",
275
+ "unique": {},
276
+ },
277
+ "Content": {
278
+ "eventLog": {
279
+ "enabled": true,
280
+ },
281
+ "fields": {
282
+ "article": {
283
+ "name": "article",
284
+ "nullable": true,
285
+ "ownedBy": "content",
286
+ "target": "Article",
287
+ "type": "OneHasOne",
288
+ },
289
+ "id": {
290
+ "columnName": "id",
291
+ "columnType": "uuid",
292
+ "name": "id",
293
+ "nullable": false,
294
+ "type": "Uuid",
295
+ },
296
+ },
297
+ "indexes": {},
298
+ "name": "Content",
299
+ "primary": "id",
300
+ "primaryColumn": "id",
301
+ "tableName": "content",
302
+ "unique": {},
303
+ },
304
+ },
305
+ "enums": {},
306
+ },
307
+ "settings": {},
308
+ "validation": {},
309
+ }
310
+ `;
@@ -0,0 +1,137 @@
1
+ import { expect, test } from 'vitest'
2
+ import { LaxSchemaConverter } from '../../../src'
3
+
4
+ test('lax schema converter basic', () => {
5
+ const converter = new LaxSchemaConverter(
6
+ {
7
+ entities: {
8
+ Article: {
9
+ fields: {
10
+ title: { type: 'string', notNull: true },
11
+ content: { type: 'json' },
12
+ state: { type: 'enum', values: ['draft', 'published', 'archived'], enumName: 'ArticleState' },
13
+ },
14
+ },
15
+ },
16
+ },
17
+ )
18
+ expect(converter.convert()).toMatchSnapshot()
19
+ })
20
+
21
+
22
+ test('lax schema converter one-has-many', () => {
23
+ const converter = new LaxSchemaConverter(
24
+ {
25
+ entities: {
26
+ Article: {
27
+ fields: {
28
+ title: { type: 'string', notNull: true },
29
+ category: { type: 'manyHasOne', targetEntity: 'Category', targetField: 'articles' },
30
+ },
31
+ },
32
+ Category: {
33
+ fields: {
34
+ articles: { type: 'oneHasMany', targetEntity: 'Article', targetField: 'category' },
35
+ },
36
+ },
37
+ },
38
+ },
39
+ )
40
+ const schema1 = converter.convert()
41
+ expect(schema1).toMatchSnapshot()
42
+ const converter2 = new LaxSchemaConverter(
43
+ {
44
+ entities: {
45
+ Article: {
46
+ fields: {
47
+ title: { type: 'string', notNull: true },
48
+ category: { type: 'manyHasOne', targetEntity: 'Category', targetField: 'articles' },
49
+ },
50
+ },
51
+ Category: {
52
+ fields: {},
53
+ },
54
+ },
55
+ },
56
+ )
57
+ expect(converter2.convert()).deep.eq(schema1)
58
+ })
59
+
60
+
61
+ test('lax schema converter many-has-many', () => {
62
+ const converter = new LaxSchemaConverter(
63
+ {
64
+ entities: {
65
+ Article: {
66
+ fields: {
67
+ title: { type: 'string', notNull: true },
68
+ tags: { type: 'manyHasMany', targetEntity: 'Tag', targetField: 'articles' },
69
+ },
70
+ },
71
+ Tag: {
72
+ fields: {
73
+ articles: { type: 'manyHasManyInverse', targetEntity: 'Article', targetField: 'tags' },
74
+ },
75
+ },
76
+ },
77
+ },
78
+ )
79
+ const schema1 = converter.convert()
80
+ expect(schema1).toMatchSnapshot()
81
+ const converter2 = new LaxSchemaConverter(
82
+ {
83
+ entities: {
84
+ Article: {
85
+ fields: {
86
+ title: { type: 'string', notNull: true },
87
+ tags: { type: 'manyHasMany', targetEntity: 'Tag', targetField: 'articles' },
88
+ },
89
+ },
90
+ Tag: {
91
+ fields: {},
92
+ },
93
+ },
94
+ },
95
+ )
96
+ expect(converter2.convert()).deep.eq(schema1)
97
+ })
98
+
99
+
100
+ test('lax schema converter one-has-one', () => {
101
+ const converter = new LaxSchemaConverter(
102
+ {
103
+ entities: {
104
+ Article: {
105
+ fields: {
106
+ title: { type: 'string', notNull: true },
107
+ content: { type: 'oneHasOne', targetEntity: 'Content', targetField: 'article' },
108
+ },
109
+ },
110
+ Content: {
111
+ fields: {
112
+ article: { type: 'oneHasOneInverse', targetEntity: 'Article', targetField: 'content' },
113
+ },
114
+ },
115
+ },
116
+ },
117
+ )
118
+ const schema1 = converter.convert()
119
+ expect(schema1).toMatchSnapshot()
120
+ const converter2 = new LaxSchemaConverter(
121
+ {
122
+ entities: {
123
+ Article: {
124
+ fields: {
125
+ title: { type: 'string', notNull: true },
126
+ content: { type: 'oneHasOne', targetEntity: 'Content', targetField: 'article' },
127
+ },
128
+ },
129
+ Content: {
130
+ fields: {},
131
+ },
132
+ },
133
+ },
134
+ )
135
+ expect(converter2.convert()).deep.eq(schema1)
136
+ })
137
+
@@ -159,3 +159,25 @@ test('fails on undefined variable', () => {
159
159
  { role: 'editor', variables: [] },
160
160
  ])
161
161
  })
162
+
163
+
164
+ test('use fallback value', () => {
165
+ const reader = new MembershipResolver()
166
+ const result = reader.resolve({
167
+ roles: {
168
+ editor: {
169
+ variables: {
170
+ localeID: { type: Acl.VariableType.condition, fallback: { always: true } },
171
+ },
172
+ entities: {},
173
+ },
174
+ },
175
+ }, [
176
+ { role: 'editor', variables: [] },
177
+ ], MembershipResolver.UnknownIdentity)
178
+ assert.deepStrictEqual(result.errors, [])
179
+
180
+ assert.deepStrictEqual(result.memberships, [
181
+ { role: 'editor', variables: [{ name: 'localeID', condition: { always: true } }] },
182
+ ])
183
+ })
@@ -0,0 +1,143 @@
1
+ import { assert, test } from 'vitest'
2
+ import { Model } from '@contember/schema'
3
+ import { ModelValidator } from '../../../src'
4
+
5
+
6
+
7
+ test('index name collision', () => {
8
+ const model: Model.Schema = {
9
+ enums: {},
10
+ entities: {
11
+ Foo: {
12
+ fields: {
13
+ id: {
14
+ columnName: 'id',
15
+ name: 'id',
16
+ nullable: false,
17
+ type: Model.ColumnType.Uuid,
18
+ columnType: 'uuid',
19
+ },
20
+ },
21
+ name: 'Foo',
22
+ primary: 'id',
23
+ primaryColumn: 'id',
24
+ tableName: 'foo',
25
+ unique: {},
26
+ eventLog: {
27
+ enabled: true,
28
+ },
29
+ indexes: {
30
+ test: { fields: ['id'], name: 'test' },
31
+ },
32
+ },
33
+ Bar: {
34
+ fields: {
35
+ id: {
36
+ columnName: 'id',
37
+ name: 'id',
38
+ nullable: false,
39
+ type: Model.ColumnType.Uuid,
40
+ columnType: 'uuid',
41
+ },
42
+ },
43
+ name: 'Bar',
44
+ primary: 'id',
45
+ primaryColumn: 'id',
46
+ tableName: 'bar',
47
+ unique: {
48
+ test: { fields: ['id'], name: 'test' },
49
+ },
50
+ eventLog: {
51
+ enabled: true,
52
+ },
53
+ indexes: {
54
+ foo: { fields: ['id'], name: 'foo' },
55
+ },
56
+ },
57
+ },
58
+ }
59
+ const validator = new ModelValidator(model)
60
+ assert.deepStrictEqual(validator.validate(), [
61
+ {
62
+ code: 'MODEL_NAME_COLLISION',
63
+ message: 'index name foo of entity Bar collides with table name foo of entity Foo',
64
+ path: ['entities', 'Bar'],
65
+ },
66
+ {
67
+ code: 'MODEL_NAME_COLLISION',
68
+ message: 'unique index name test of entity Bar collides with index name test of entity Foo',
69
+ path: ['entities', 'Bar'],
70
+ },
71
+ ])
72
+ })
73
+
74
+
75
+ test('"meta" collision', () => {
76
+ const model: Model.Schema = {
77
+ enums: {},
78
+ entities: {
79
+ Foo: {
80
+ fields: {
81
+ id: {
82
+ columnName: 'id',
83
+ name: 'id',
84
+ nullable: false,
85
+ type: Model.ColumnType.Uuid,
86
+ columnType: 'uuid',
87
+ },
88
+ },
89
+ name: 'Foo',
90
+ primary: 'id',
91
+ primaryColumn: 'id',
92
+ tableName: 'foo',
93
+ unique: {},
94
+ eventLog: { enabled: true },
95
+ indexes: {},
96
+ },
97
+ FooMeta: {
98
+ fields: {
99
+ id: {
100
+ columnName: 'id',
101
+ name: 'id',
102
+ nullable: false,
103
+ type: Model.ColumnType.Uuid,
104
+ columnType: 'uuid',
105
+ },
106
+ },
107
+ name: 'FooMeta',
108
+ primary: 'id',
109
+ primaryColumn: 'id',
110
+ tableName: 'foo_meta',
111
+ unique: {},
112
+ eventLog: { enabled: true },
113
+ indexes: {},
114
+ },
115
+ BarMeta: {
116
+ fields: {
117
+ id: {
118
+ columnName: 'id',
119
+ name: 'id',
120
+ nullable: false,
121
+ type: Model.ColumnType.Uuid,
122
+ columnType: 'uuid',
123
+ },
124
+ },
125
+ name: 'BarMeta',
126
+ primary: 'id',
127
+ primaryColumn: 'id',
128
+ tableName: 'bar',
129
+ unique: {},
130
+ eventLog: { enabled: true },
131
+ indexes: {},
132
+ },
133
+ },
134
+ }
135
+ const validator = new ModelValidator(model)
136
+ assert.deepStrictEqual(validator.validate(), [
137
+ {
138
+ code: 'MODEL_NAME_COLLISION',
139
+ message: 'entity FooMeta collides with entity Foo, because a GraphQL type with "Meta" suffix is created for every entity',
140
+ path: ['entities', 'FooMeta'],
141
+ },
142
+ ])
143
+ })
@@ -0,0 +1 @@
1
+ *.ts
@@ -0,0 +1,5 @@
1
+ import { SchemaDefinition as def } from '@contember/schema-definition'
2
+
3
+ export class Article {
4
+ title = def.stringColumn()
5
+ }
@@ -0,0 +1,8 @@
1
+ import { SchemaDefinition as def } from '@contember/schema-definition'
2
+
3
+ export const articleState = def.createEnum('draft', 'published')
4
+
5
+ export class Article {
6
+ title = def.stringColumn()
7
+ state = def.enumColumn(articleState).notNull().default('draft')
8
+ }
@@ -0,0 +1,17 @@
1
+ import { SchemaDefinition as def } from '@contember/schema-definition'
2
+
3
+ export class Article {
4
+ title = def.stringColumn()
5
+ category = def.manyHasOne(Category, 'articles')
6
+ tags = def.manyHasMany(Tag, 'articles')
7
+ }
8
+
9
+ export class Category {
10
+ name = def.stringColumn()
11
+ articles = def.oneHasMany(Article, 'category')
12
+ }
13
+
14
+ export class Tag {
15
+ name = def.stringColumn()
16
+ tags = def.manyHasManyInverse(Article, 'tags')
17
+ }
@@ -0,0 +1,6 @@
1
+ import { SchemaDefinition as def } from '@contember/schema-definition'
2
+
3
+ @def.Unique('title')
4
+ export class Article {
5
+ title = def.stringColumn()
6
+ }
@@ -0,0 +1,31 @@
1
+ import { createSchema } from '@contember/schema-definition'
2
+ import { test, expect } from 'vitest'
3
+ import * as basic from './schemas/basic'
4
+ import * as relations from './schemas/relations'
5
+ import * as unique from './schemas/unique'
6
+ import * as enum_ from './schemas/enum'
7
+ import { readFile, writeFile } from 'fs/promises'
8
+ import { join } from 'path'
9
+ import { TsDefinitionGenerator } from '../../../src'
10
+
11
+
12
+ const tests = [
13
+ ['basic', basic],
14
+ ['relations', relations],
15
+ ['unique', unique],
16
+ ['enum', enum_],
17
+ ] as const
18
+ for (const [name, def] of tests) {
19
+ test(`generate schema: ${name}`, async () => {
20
+ const schema = createSchema(def)
21
+ const generator = new TsDefinitionGenerator(schema)
22
+ const content = await readFile(join(__dirname, `schemas/${name}.ts`), 'utf-8')
23
+ const generated = generator.generate()
24
+ try {
25
+ expect(generated).toBe(content)
26
+ } catch (e) {
27
+ await writeFile(join(__dirname, `schemas/${name}.actual.ts`), generated, 'utf8')
28
+ throw e
29
+ }
30
+ })
31
+ }