@strapi/typescript-utils 5.50.0 → 5.50.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 (171) hide show
  1. package/dist/compile.d.ts +5 -0
  2. package/dist/compile.d.ts.map +1 -0
  3. package/dist/compile.js +12 -0
  4. package/dist/compile.js.map +1 -0
  5. package/dist/compile.mjs +10 -0
  6. package/dist/compile.mjs.map +1 -0
  7. package/dist/compilers/basic.d.ts +11 -0
  8. package/dist/compilers/basic.d.ts.map +1 -0
  9. package/dist/compilers/basic.js +58 -0
  10. package/dist/compilers/basic.js.map +1 -0
  11. package/dist/compilers/basic.mjs +36 -0
  12. package/dist/compilers/basic.mjs.map +1 -0
  13. package/dist/compilers/index.d.ts +3 -0
  14. package/dist/compilers/index.d.ts.map +1 -0
  15. package/dist/compilers/index.js +8 -0
  16. package/dist/compilers/index.js.map +1 -0
  17. package/dist/compilers/index.mjs +3 -0
  18. package/dist/compilers/index.mjs.map +1 -0
  19. package/dist/generators/common/imports.d.ts +5 -0
  20. package/dist/generators/common/imports.d.ts.map +1 -0
  21. package/dist/generators/common/imports.js +42 -0
  22. package/dist/generators/common/imports.js.map +1 -0
  23. package/dist/generators/common/imports.mjs +19 -0
  24. package/dist/generators/common/imports.mjs.map +1 -0
  25. package/dist/generators/common/index.d.ts +4 -0
  26. package/dist/generators/common/index.d.ts.map +1 -0
  27. package/dist/generators/common/models/attributes.d.ts +17 -0
  28. package/dist/generators/common/models/attributes.d.ts.map +1 -0
  29. package/dist/generators/common/models/attributes.js +152 -0
  30. package/dist/generators/common/models/attributes.js.map +1 -0
  31. package/dist/generators/common/models/attributes.mjs +124 -0
  32. package/dist/generators/common/models/attributes.mjs.map +1 -0
  33. package/dist/generators/common/models/index.d.ts +7 -0
  34. package/dist/generators/common/models/index.d.ts.map +1 -0
  35. package/dist/generators/common/models/mappers.d.ts +9 -0
  36. package/dist/generators/common/models/mappers.d.ts.map +1 -0
  37. package/dist/generators/common/models/mappers.js +227 -0
  38. package/dist/generators/common/models/mappers.js.map +1 -0
  39. package/dist/generators/common/models/mappers.mjs +202 -0
  40. package/dist/generators/common/models/mappers.mjs.map +1 -0
  41. package/dist/generators/common/models/schema.d.ts +7 -0
  42. package/dist/generators/common/models/schema.d.ts.map +1 -0
  43. package/dist/generators/common/models/schema.js +79 -0
  44. package/dist/generators/common/models/schema.js.map +1 -0
  45. package/dist/generators/common/models/schema.mjs +57 -0
  46. package/dist/generators/common/models/schema.mjs.map +1 -0
  47. package/dist/generators/common/models/utils.d.ts +54 -0
  48. package/dist/generators/common/models/utils.d.ts.map +1 -0
  49. package/dist/generators/common/models/utils.js +109 -0
  50. package/dist/generators/common/models/utils.js.map +1 -0
  51. package/dist/generators/common/models/utils.mjs +81 -0
  52. package/dist/generators/common/models/utils.mjs.map +1 -0
  53. package/dist/generators/components/index.d.ts +9 -0
  54. package/dist/generators/components/index.d.ts.map +1 -0
  55. package/dist/generators/components/index.js +76 -0
  56. package/dist/generators/components/index.js.map +1 -0
  57. package/dist/generators/components/index.mjs +54 -0
  58. package/dist/generators/components/index.mjs.map +1 -0
  59. package/dist/generators/constants.d.ts +3 -0
  60. package/dist/generators/constants.d.ts.map +1 -0
  61. package/dist/generators/constants.js +8 -0
  62. package/dist/generators/constants.js.map +1 -0
  63. package/dist/generators/constants.mjs +5 -0
  64. package/dist/generators/constants.mjs.map +1 -0
  65. package/dist/generators/content-types/index.d.ts +9 -0
  66. package/dist/generators/content-types/index.d.ts.map +1 -0
  67. package/dist/generators/content-types/index.js +76 -0
  68. package/dist/generators/content-types/index.js.map +1 -0
  69. package/dist/generators/content-types/index.mjs +54 -0
  70. package/dist/generators/content-types/index.mjs.map +1 -0
  71. package/dist/generators/index.d.ts +23 -0
  72. package/dist/generators/index.d.ts.map +1 -0
  73. package/dist/generators/index.js +81 -0
  74. package/dist/generators/index.js.map +1 -0
  75. package/dist/generators/index.mjs +74 -0
  76. package/dist/generators/index.mjs.map +1 -0
  77. package/dist/generators/utils.d.ts +52 -0
  78. package/dist/generators/utils.d.ts.map +1 -0
  79. package/dist/generators/utils.js +164 -0
  80. package/dist/generators/utils.js.map +1 -0
  81. package/dist/generators/utils.mjs +131 -0
  82. package/dist/generators/utils.mjs.map +1 -0
  83. package/dist/index.d.ts +5 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +28 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/index.mjs +14 -0
  88. package/dist/index.mjs.map +1 -0
  89. package/dist/utils/format-host.d.ts +3 -0
  90. package/dist/utils/format-host.d.ts.map +1 -0
  91. package/dist/utils/format-host.js +33 -0
  92. package/dist/utils/format-host.js.map +1 -0
  93. package/dist/utils/format-host.mjs +11 -0
  94. package/dist/utils/format-host.mjs.map +1 -0
  95. package/dist/utils/get-config-path.d.ts +10 -0
  96. package/dist/utils/get-config-path.d.ts.map +1 -0
  97. package/dist/utils/get-config-path.js +43 -0
  98. package/dist/utils/get-config-path.js.map +1 -0
  99. package/dist/utils/get-config-path.mjs +18 -0
  100. package/dist/utils/get-config-path.mjs.map +1 -0
  101. package/dist/utils/index.d.ts +9 -0
  102. package/dist/utils/index.d.ts.map +1 -0
  103. package/dist/utils/is-using-typescript-sync.d.ts +5 -0
  104. package/dist/utils/is-using-typescript-sync.d.ts.map +1 -0
  105. package/dist/utils/is-using-typescript-sync.js +20 -0
  106. package/dist/utils/is-using-typescript-sync.js.map +1 -0
  107. package/dist/utils/is-using-typescript-sync.mjs +14 -0
  108. package/dist/utils/is-using-typescript-sync.mjs.map +1 -0
  109. package/dist/utils/is-using-typescript.d.ts +5 -0
  110. package/dist/utils/is-using-typescript.d.ts.map +1 -0
  111. package/dist/utils/is-using-typescript.js +20 -0
  112. package/dist/utils/is-using-typescript.js.map +1 -0
  113. package/dist/utils/is-using-typescript.mjs +14 -0
  114. package/dist/utils/is-using-typescript.mjs.map +1 -0
  115. package/dist/utils/report-diagnostics.d.ts +6 -0
  116. package/dist/utils/report-diagnostics.d.ts.map +1 -0
  117. package/dist/utils/report-diagnostics.js +37 -0
  118. package/dist/utils/report-diagnostics.js.map +1 -0
  119. package/dist/utils/report-diagnostics.mjs +15 -0
  120. package/dist/utils/report-diagnostics.mjs.map +1 -0
  121. package/dist/utils/resolve-config-options.d.ts +12 -0
  122. package/dist/utils/resolve-config-options.d.ts.map +1 -0
  123. package/dist/utils/resolve-config-options.js +39 -0
  124. package/dist/utils/resolve-config-options.js.map +1 -0
  125. package/dist/utils/resolve-config-options.mjs +17 -0
  126. package/dist/utils/resolve-config-options.mjs.map +1 -0
  127. package/dist/utils/resolve-outdir-sync.d.ts +5 -0
  128. package/dist/utils/resolve-outdir-sync.d.ts.map +1 -0
  129. package/dist/utils/resolve-outdir-sync.js +19 -0
  130. package/dist/utils/resolve-outdir-sync.js.map +1 -0
  131. package/dist/utils/resolve-outdir-sync.mjs +13 -0
  132. package/dist/utils/resolve-outdir-sync.mjs.map +1 -0
  133. package/dist/utils/resolve-outdir.d.ts +5 -0
  134. package/dist/utils/resolve-outdir.d.ts.map +1 -0
  135. package/dist/utils/resolve-outdir.js +19 -0
  136. package/dist/utils/resolve-outdir.js.map +1 -0
  137. package/dist/utils/resolve-outdir.mjs +13 -0
  138. package/dist/utils/resolve-outdir.mjs.map +1 -0
  139. package/package.json +25 -10
  140. package/.eslintrc.cjs +0 -16
  141. package/index.d.ts +0 -5
  142. package/jest.config.js +0 -6
  143. package/lib/__tests__/generators/schemas/attributes.test.js +0 -903
  144. package/lib/__tests__/generators/schemas/imports.test.js +0 -56
  145. package/lib/__tests__/generators/schemas/utils.test.js +0 -314
  146. package/lib/compile.js +0 -10
  147. package/lib/compilers/basic.js +0 -50
  148. package/lib/compilers/index.js +0 -7
  149. package/lib/generators/common/imports.js +0 -34
  150. package/lib/generators/common/index.js +0 -9
  151. package/lib/generators/common/models/attributes.js +0 -198
  152. package/lib/generators/common/models/index.js +0 -15
  153. package/lib/generators/common/models/mappers.js +0 -144
  154. package/lib/generators/common/models/schema.js +0 -93
  155. package/lib/generators/common/models/utils.js +0 -178
  156. package/lib/generators/components/index.js +0 -74
  157. package/lib/generators/constants.js +0 -6
  158. package/lib/generators/content-types/index.js +0 -74
  159. package/lib/generators/index.js +0 -122
  160. package/lib/generators/utils.js +0 -216
  161. package/lib/index.js +0 -13
  162. package/lib/utils/format-host.js +0 -15
  163. package/lib/utils/get-config-path.js +0 -29
  164. package/lib/utils/index.js +0 -21
  165. package/lib/utils/is-using-typescript-sync.js +0 -19
  166. package/lib/utils/is-using-typescript.js +0 -17
  167. package/lib/utils/report-diagnostics.js +0 -19
  168. package/lib/utils/resolve-config-options.js +0 -23
  169. package/lib/utils/resolve-outdir-sync.js +0 -18
  170. package/lib/utils/resolve-outdir.js +0 -18
  171. package/lint-staged.config.mjs +0 -1
@@ -1,903 +0,0 @@
1
- 'use strict';
2
-
3
- jest.mock('../../../generators/common/imports', () => ({ addImport: jest.fn() }));
4
-
5
- const consoleWarnMock = jest.spyOn(console, 'warn').mockImplementation();
6
-
7
- const ts = require('typescript');
8
-
9
- const attributeToPropertySignature = require('../../../generators/common/models/attributes');
10
- const {
11
- getAttributeType,
12
- getAttributeModifiers,
13
- } = require('../../../generators/common/models/attributes');
14
- const { addImport } = require('../../../generators/common/imports');
15
-
16
- // TODO: emit definition (to a string) & also check snapshots based on that. It would allow checking both the structure & the output.
17
- describe('Attributes', () => {
18
- afterEach(() => {
19
- jest.clearAllMocks();
20
- });
21
-
22
- describe('Attribute to Property Signature', () => {
23
- const schema = { uid: 'api::foo.foo' };
24
- const attributeName = 'foo';
25
-
26
- const toPropertySignature = (attribute) => {
27
- return attributeToPropertySignature(schema, attributeName, attribute);
28
- };
29
-
30
- const defaultAssertion = (node) => {
31
- expect(node.kind).toBe(ts.SyntaxKind.PropertySignature);
32
- expect(node.name.escapedText).toBe(attributeName);
33
- expect(node.type.kind).toBe(ts.SyntaxKind.IntersectionType);
34
- };
35
-
36
- test('Invalid attribute type', () => {
37
- const attribute = { type: 'invalid' };
38
- const prop = toPropertySignature(attribute);
39
-
40
- expect(prop).toBeNull();
41
- });
42
-
43
- test('Attribute without type argument', () => {
44
- const attribute = { type: 'string' };
45
- const prop = toPropertySignature(attribute);
46
-
47
- defaultAssertion(prop);
48
-
49
- expect(prop.type.types).toHaveLength(1);
50
- expect(prop.type.types[0].kind).toBe(ts.SyntaxKind.TypeReference);
51
- expect(prop.type.types[0].typeName.escapedText).toBe('Schema.Attribute.String');
52
- expect(prop.type.types[0].typeArguments).toBeUndefined();
53
- });
54
-
55
- test('Attribute with type argument', () => {
56
- const attribute = { type: 'component', component: 'default.comp' };
57
- const prop = toPropertySignature(attribute);
58
-
59
- defaultAssertion(prop);
60
-
61
- expect(prop.type.types).toHaveLength(1);
62
- expect(prop.type.types[0].kind).toBe(ts.SyntaxKind.TypeReference);
63
- expect(prop.type.types[0].typeName.escapedText).toBe('Schema.Attribute.Component');
64
- expect(prop.type.types[0].typeArguments).toHaveLength(2);
65
- expect(prop.type.types[0].typeArguments[0].kind).toBe(ts.SyntaxKind.StringLiteral);
66
- expect(prop.type.types[0].typeArguments[0].text).toBe('default.comp');
67
- expect(prop.type.types[0].typeArguments[1].kind).toBe(ts.SyntaxKind.FalseKeyword);
68
- });
69
-
70
- test('Attribute with type argument and options', () => {
71
- const attribute = {
72
- type: 'enumeration',
73
- enum: ['a', 'b'],
74
- default: 'b',
75
- configurable: false,
76
- };
77
- const prop = toPropertySignature(attribute);
78
-
79
- defaultAssertion(prop);
80
-
81
- expect(prop.type.types).toHaveLength(2);
82
-
83
- const [attributeType, requiredOptionType] = prop.type.types;
84
-
85
- expect(attributeType.kind).toBe(ts.SyntaxKind.TypeReference);
86
- expect(attributeType.typeName.escapedText).toBe('Schema.Attribute.Enumeration');
87
- expect(attributeType.typeArguments).toHaveLength(1);
88
- expect(attributeType.typeArguments[0].kind).toBe(ts.SyntaxKind.TupleType);
89
- expect(attributeType.typeArguments[0].elements[0].text).toBe('a');
90
- expect(attributeType.typeArguments[0].elements[1].text).toBe('b');
91
-
92
- expect(requiredOptionType.kind).toBe(ts.SyntaxKind.TypeReference);
93
- expect(requiredOptionType.typeName.escapedText).toBe('Schema.Attribute.DefaultTo');
94
- expect(requiredOptionType.typeArguments).toHaveLength(1);
95
- expect(requiredOptionType.typeArguments[0].kind).toBe(ts.SyntaxKind.StringLiteral);
96
- expect(requiredOptionType.typeArguments[0].text).toBe('b');
97
- });
98
- });
99
-
100
- describe('Get Attribute Type / Mappers', () => {
101
- test('If the attribute type is not valid then log an error and exit early without importing the type', () => {
102
- const typeNode = getAttributeType('foo', { type: 'invalid', uid: 'api::foo.foo' });
103
-
104
- expect(typeNode).toBeNull();
105
- expect(consoleWarnMock).toHaveBeenCalledWith(
106
- '"foo" attribute from "undefined" has an invalid type: "invalid"'
107
- );
108
- expect(addImport).not.toHaveBeenCalled();
109
- });
110
-
111
- test.each([
112
- ['string', 'Schema.Attribute.String'],
113
- ['text', 'Schema.Attribute.Text'],
114
- ['richtext', 'Schema.Attribute.RichText'],
115
- ['password', 'Schema.Attribute.Password'],
116
- ['email', 'Schema.Attribute.Email'],
117
- ['date', 'Schema.Attribute.Date'],
118
- ['time', 'Schema.Attribute.Time'],
119
- ['datetime', 'Schema.Attribute.DateTime'],
120
- ['timestamp', 'Schema.Attribute.Timestamp'],
121
- ['integer', 'Schema.Attribute.Integer'],
122
- ['biginteger', 'Schema.Attribute.BigInteger'],
123
- ['float', 'Schema.Attribute.Float'],
124
- ['decimal', 'Schema.Attribute.Decimal'],
125
- ['boolean', 'Schema.Attribute.Boolean'],
126
- ['json', 'Schema.Attribute.JSON'],
127
- ['media', 'Schema.Attribute.Media'],
128
- ])('Basic %p attribute should map to a %p type', (type, expectedType) => {
129
- const typeNode = getAttributeType('foo', { type });
130
-
131
- expect(ts.isTypeNode(typeNode)).toBeTruthy();
132
-
133
- expect(typeNode.kind).toBe(ts.SyntaxKind.TypeReference);
134
- expect(typeNode.typeName.escapedText).toBe(expectedType);
135
- expect(typeNode.typeArguments).toBeUndefined();
136
-
137
- expect(consoleWarnMock).not.toHaveBeenCalled();
138
- expect(addImport).toHaveBeenCalledWith('Schema');
139
- });
140
-
141
- describe('Complex types (with generic type parameters)', () => {
142
- const defaultAssertions = (typeNode, typeName) => {
143
- expect(ts.isTypeNode(typeNode)).toBeTruthy();
144
-
145
- expect(typeNode.kind).toBe(ts.SyntaxKind.TypeReference);
146
- expect(typeNode.typeName.escapedText).toBe(typeName);
147
-
148
- expect(consoleWarnMock).not.toHaveBeenCalled();
149
- expect(addImport).toHaveBeenCalledWith('Schema');
150
- };
151
-
152
- describe('Media', () => {
153
- test('Media with multiple and with no allowedTypes', () => {
154
- const attribute = { type: 'media', multiple: true };
155
- const typeNode = getAttributeType('foo', attribute);
156
-
157
- defaultAssertions(typeNode, 'Schema.Attribute.Media');
158
-
159
- expect(typeNode.typeArguments).toHaveLength(2);
160
-
161
- expect(typeNode.typeArguments[0].kind).toBe(ts.SyntaxKind.UndefinedKeyword);
162
-
163
- expect(typeNode.typeArguments[1].kind).toBe(ts.SyntaxKind.TrueKeyword);
164
- });
165
-
166
- test('Media without multiple with allowedTypes', () => {
167
- const attribute = { type: 'media', allowedTypes: ['images', 'videos'] };
168
- const typeNode = getAttributeType('foo', attribute);
169
-
170
- defaultAssertions(typeNode, 'Schema.Attribute.Media');
171
-
172
- expect(typeNode.typeArguments).toHaveLength(1);
173
-
174
- expect(typeNode.typeArguments[0].kind).toBe(ts.SyntaxKind.UnionType);
175
-
176
- const unionTypes = typeNode.typeArguments[0].types;
177
-
178
- attribute.allowedTypes.forEach((value, index) => {
179
- const element = unionTypes[index];
180
-
181
- expect(element.kind).toBe(ts.SyntaxKind.StringLiteral);
182
- expect(element.text).toBe(value);
183
- });
184
- });
185
-
186
- test('Media with multiple and with allowedTypes', () => {
187
- const attribute = { type: 'media', multiple: true, allowedTypes: ['images', 'videos'] };
188
- const typeNode = getAttributeType('foo', attribute);
189
-
190
- defaultAssertions(typeNode, 'Schema.Attribute.Media');
191
-
192
- expect(typeNode.typeArguments).toHaveLength(2);
193
-
194
- expect(typeNode.typeArguments[0].kind).toBe(ts.SyntaxKind.UnionType);
195
-
196
- const unionTypes = typeNode.typeArguments[0].types;
197
-
198
- attribute.allowedTypes.forEach((value, index) => {
199
- const element = unionTypes[index];
200
-
201
- expect(element.kind).toBe(ts.SyntaxKind.StringLiteral);
202
- expect(element.text).toBe(value);
203
- });
204
-
205
- expect(typeNode.typeArguments[1].kind).toBe(ts.SyntaxKind.TrueKeyword);
206
- });
207
-
208
- test('Media without multiple and with no allowedTypes', () => {
209
- const attribute = { type: 'media' };
210
- const typeNode = getAttributeType('foo', attribute);
211
-
212
- defaultAssertions(typeNode, 'Schema.Attribute.Media');
213
-
214
- expect(typeNode.typeArguments).toBeUndefined();
215
- });
216
- });
217
-
218
- describe('Enumeration', () => {
219
- test('Enumeration with an enum property', () => {
220
- const attribute = { type: 'enumeration', enum: ['a', 'b', 'c'] };
221
- const typeNode = getAttributeType('foo', attribute);
222
-
223
- defaultAssertions(typeNode, 'Schema.Attribute.Enumeration');
224
-
225
- expect(typeNode.typeArguments).toHaveLength(1);
226
- expect(typeNode.typeArguments[0].kind).toBe(ts.SyntaxKind.TupleType);
227
-
228
- const tupleElements = typeNode.typeArguments[0].elements;
229
-
230
- attribute.enum.forEach((value, index) => {
231
- const element = tupleElements[index];
232
-
233
- expect(element.kind).toBe(ts.SyntaxKind.StringLiteral);
234
- expect(element.text).toBe(value);
235
- });
236
- });
237
- });
238
-
239
- describe('UID', () => {
240
- test('UID with no options and no target field', () => {
241
- const attribute = { type: 'uid' };
242
- const typeNode = getAttributeType('foo', attribute);
243
-
244
- defaultAssertions(typeNode, 'Schema.Attribute.UID');
245
-
246
- expect(typeNode.typeArguments).toBeUndefined();
247
- });
248
-
249
- test('UID with a target field and no options', () => {
250
- const attribute = { type: 'uid', targetField: 'bar' };
251
- const typeNode = getAttributeType('foo', attribute, 'api::bar.bar');
252
-
253
- defaultAssertions(typeNode, 'Schema.Attribute.UID');
254
-
255
- expect(typeNode.typeArguments).not.toBeUndefined();
256
- expect(typeNode.typeArguments).toHaveLength(1);
257
-
258
- expect(typeNode.typeArguments[0].kind).toBe(ts.SyntaxKind.StringLiteral);
259
- expect(typeNode.typeArguments[0].text).toBe('bar');
260
- });
261
-
262
- test('UID with partial options and no target field', () => {
263
- const attribute = { type: 'uid', options: { separator: '_' } };
264
- const typeNode = getAttributeType('foo', attribute, 'api::foo.foo');
265
-
266
- defaultAssertions(typeNode, 'Schema.Attribute.UID');
267
-
268
- expect(typeNode.typeArguments).toHaveLength(2);
269
-
270
- expect(typeNode.typeArguments[0].kind).toBe(ts.SyntaxKind.UndefinedKeyword);
271
-
272
- const optionsLiteralNode = typeNode.typeArguments[1];
273
-
274
- expect(optionsLiteralNode.kind).toBe(ts.SyntaxKind.TypeLiteral);
275
- expect(optionsLiteralNode.members).toHaveLength(1);
276
-
277
- expect(optionsLiteralNode.members[0].kind).toBe(ts.SyntaxKind.PropertyDeclaration);
278
-
279
- expect(optionsLiteralNode.members[0].name.kind).toBe(ts.SyntaxKind.Identifier);
280
- expect(optionsLiteralNode.members[0].name.escapedText).toBe('separator');
281
-
282
- expect(optionsLiteralNode.members[0].type.kind).toBe(ts.SyntaxKind.StringLiteral);
283
- expect(optionsLiteralNode.members[0].type.text).toBe('_');
284
- });
285
-
286
- test('UID with options and a target field', () => {
287
- const attribute = { type: 'uid', options: { separator: '_' }, targetField: 'bar' };
288
- const typeNode = getAttributeType('foo', attribute, 'api::bar.bar');
289
-
290
- defaultAssertions(typeNode, 'Schema.Attribute.UID');
291
-
292
- expect(typeNode.typeArguments).toHaveLength(2);
293
-
294
- expect(typeNode.typeArguments[0].kind).toBe(ts.SyntaxKind.StringLiteral);
295
- expect(typeNode.typeArguments[0].text).toBe('bar');
296
-
297
- const optionsLiteralNode = typeNode.typeArguments[1];
298
-
299
- expect(optionsLiteralNode.kind).toBe(ts.SyntaxKind.TypeLiteral);
300
- expect(optionsLiteralNode.members).toHaveLength(1);
301
-
302
- expect(optionsLiteralNode.members[0].kind).toBe(ts.SyntaxKind.PropertyDeclaration);
303
-
304
- expect(optionsLiteralNode.members[0].name.kind).toBe(ts.SyntaxKind.Identifier);
305
- expect(optionsLiteralNode.members[0].name.escapedText).toBe('separator');
306
-
307
- expect(optionsLiteralNode.members[0].type.kind).toBe(ts.SyntaxKind.StringLiteral);
308
- expect(optionsLiteralNode.members[0].type.text).toBe('_');
309
- });
310
- });
311
-
312
- describe('Relation', () => {
313
- test('Basic relation', () => {
314
- const attribute = { type: 'relation', relation: 'oneToOne', target: 'api::bar.bar' };
315
- const typeNode = getAttributeType('foo', attribute, 'api::foo.foo');
316
-
317
- defaultAssertions(typeNode, 'Schema.Attribute.Relation');
318
-
319
- expect(typeNode.typeArguments).toHaveLength(2);
320
-
321
- expect(typeNode.typeArguments[0].kind).toBe(ts.SyntaxKind.StringLiteral);
322
- expect(typeNode.typeArguments[0].text).toBe('oneToOne');
323
-
324
- expect(typeNode.typeArguments[1].kind).toBe(ts.SyntaxKind.StringLiteral);
325
- expect(typeNode.typeArguments[1].text).toBe('api::bar.bar');
326
- });
327
-
328
- test('Polymorphic relation', () => {
329
- const attribute = { type: 'relation', relation: 'morphMany' };
330
- const typeNode = getAttributeType('foo', attribute, 'api::foo.foo');
331
-
332
- defaultAssertions(typeNode, 'Schema.Attribute.Relation');
333
-
334
- expect(typeNode.typeArguments).toHaveLength(1);
335
-
336
- expect(typeNode.typeArguments[0].kind).toBe(ts.SyntaxKind.StringLiteral);
337
- expect(typeNode.typeArguments[0].text).toBe('morphMany');
338
- });
339
- });
340
-
341
- describe('Component', () => {
342
- test('Repeatable component', () => {
343
- const attribute = { type: 'component', component: 'default.comp', repeatable: true };
344
- const typeNode = getAttributeType('foo', attribute);
345
-
346
- defaultAssertions(typeNode, 'Schema.Attribute.Component');
347
-
348
- expect(typeNode.typeArguments).toHaveLength(2);
349
-
350
- expect(typeNode.typeArguments[0].kind).toBe(ts.SyntaxKind.StringLiteral);
351
- expect(typeNode.typeArguments[0].text).toBe('default.comp');
352
-
353
- expect(typeNode.typeArguments[1].kind).toBe(ts.SyntaxKind.TrueKeyword);
354
- });
355
-
356
- test('Non repeatable component', () => {
357
- const attribute = { type: 'component', component: 'default.comp' };
358
- const typeNode = getAttributeType('foo', attribute);
359
-
360
- defaultAssertions(typeNode, 'Schema.Attribute.Component');
361
-
362
- expect(typeNode.typeArguments).toHaveLength(2);
363
-
364
- expect(typeNode.typeArguments[0].kind).toBe(ts.SyntaxKind.StringLiteral);
365
- expect(typeNode.typeArguments[0].text).toBe('default.comp');
366
-
367
- expect(typeNode.typeArguments[1].kind).toBe(ts.SyntaxKind.FalseKeyword);
368
- });
369
- });
370
-
371
- describe('Dynamic Zone', () => {
372
- test('Dynamic Zone with an array of components (targets)', () => {
373
- const attribute = { type: 'dynamiczone', components: ['default.comp1', 'default.comp2'] };
374
- const typeNode = getAttributeType('foo', attribute);
375
-
376
- defaultAssertions(typeNode, 'Schema.Attribute.DynamicZone');
377
-
378
- expect(typeNode.typeArguments).toHaveLength(1);
379
-
380
- const [typeArgument] = typeNode.typeArguments;
381
-
382
- expect(typeArgument.kind).toBe(ts.SyntaxKind.TupleType);
383
- expect(typeArgument.elements).toHaveLength(2);
384
-
385
- expect(typeArgument.elements[0].kind).toBe(ts.SyntaxKind.StringLiteral);
386
- expect(typeArgument.elements[0].text).toBe('default.comp1');
387
-
388
- expect(typeArgument.elements[1].kind).toBe(ts.SyntaxKind.StringLiteral);
389
- expect(typeArgument.elements[1].text).toBe('default.comp2');
390
- });
391
- });
392
- });
393
- });
394
-
395
- describe('Get Attribute Modifiers', () => {
396
- describe('Units', () => {
397
- describe('Required', () => {
398
- test('No required', () => {
399
- const attribute = {};
400
- const modifiers = getAttributeModifiers(attribute);
401
-
402
- expect(modifiers).toHaveLength(0);
403
- });
404
-
405
- test('Required: false', () => {
406
- const attribute = { required: false };
407
- const modifiers = getAttributeModifiers(attribute);
408
-
409
- expect(modifiers).toHaveLength(0);
410
- });
411
-
412
- test('Required: true', () => {
413
- const attribute = { required: true };
414
- const modifiers = getAttributeModifiers(attribute);
415
-
416
- expect(modifiers).toHaveLength(1);
417
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
418
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.Required');
419
- });
420
- });
421
-
422
- describe('Private', () => {
423
- test('No private', () => {
424
- const attribute = {};
425
- const modifiers = getAttributeModifiers(attribute);
426
-
427
- expect(modifiers).toHaveLength(0);
428
- });
429
-
430
- test('Private: false', () => {
431
- const attribute = { private: false };
432
- const modifiers = getAttributeModifiers(attribute);
433
-
434
- expect(modifiers).toHaveLength(0);
435
- });
436
-
437
- test('Private: true', () => {
438
- const attribute = { private: true };
439
- const modifiers = getAttributeModifiers(attribute);
440
-
441
- expect(modifiers).toHaveLength(1);
442
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
443
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.Private');
444
- });
445
- });
446
-
447
- describe('Unique', () => {
448
- test('No unique', () => {
449
- const attribute = {};
450
- const modifiers = getAttributeModifiers(attribute);
451
-
452
- expect(modifiers).toHaveLength(0);
453
- });
454
-
455
- test('Unique: false', () => {
456
- const attribute = { unique: false };
457
- const modifiers = getAttributeModifiers(attribute);
458
-
459
- expect(modifiers).toHaveLength(0);
460
- });
461
-
462
- test('Unique: true', () => {
463
- const attribute = { unique: true };
464
- const modifiers = getAttributeModifiers(attribute);
465
-
466
- expect(modifiers).toHaveLength(1);
467
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
468
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.Unique');
469
- });
470
- });
471
-
472
- describe('Configurable', () => {
473
- test('No configurable', () => {
474
- const attribute = {};
475
- const modifiers = getAttributeModifiers(attribute);
476
-
477
- expect(modifiers).toHaveLength(0);
478
- });
479
-
480
- test('Configurable: false', () => {
481
- const attribute = { configurable: false };
482
- const modifiers = getAttributeModifiers(attribute);
483
-
484
- expect(modifiers).toHaveLength(0);
485
- });
486
-
487
- test('Configurable: true', () => {
488
- const attribute = { configurable: true };
489
- const modifiers = getAttributeModifiers(attribute);
490
-
491
- expect(modifiers).toHaveLength(1);
492
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
493
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.Configurable');
494
- });
495
- });
496
-
497
- describe('Custom field', () => {
498
- test('No custom field', () => {
499
- const attribute = {};
500
- const modifiers = getAttributeModifiers(attribute);
501
-
502
- expect(modifiers).toHaveLength(0);
503
- });
504
-
505
- test('Basic custom field', () => {
506
- const attribute = {
507
- type: 'string',
508
- customField: 'plugin::color-picker.color',
509
- };
510
- const modifiers = getAttributeModifiers(attribute);
511
-
512
- expect(modifiers).toHaveLength(1);
513
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
514
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.CustomField');
515
- expect(modifiers[0].typeArguments).toHaveLength(1);
516
- expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.StringLiteral);
517
- expect(modifiers[0].typeArguments[0].text).toBe('plugin::color-picker.color');
518
- });
519
-
520
- test('Advanced custom field', () => {
521
- const attribute = {
522
- type: 'string',
523
- customField: 'plugin::color-picker.color',
524
- options: {
525
- format: 'hex',
526
- },
527
- };
528
- const modifiers = getAttributeModifiers(attribute);
529
-
530
- expect(modifiers).toHaveLength(1);
531
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
532
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.CustomField');
533
- expect(modifiers[0].typeArguments).toHaveLength(2);
534
- expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.StringLiteral);
535
- expect(modifiers[0].typeArguments[0].text).toBe('plugin::color-picker.color');
536
- expect(modifiers[0].typeArguments[1].kind).toBe(ts.SyntaxKind.TypeLiteral);
537
- expect(modifiers[0].typeArguments[1].members).toHaveLength(1);
538
- expect(modifiers[0].typeArguments[1].members[0].kind).toBe(
539
- ts.SyntaxKind.PropertyDeclaration
540
- );
541
- expect(modifiers[0].typeArguments[1].members[0].name.escapedText).toBe('format');
542
- expect(modifiers[0].typeArguments[1].members[0].kind).toBe(
543
- ts.SyntaxKind.PropertyDeclaration
544
- );
545
- expect(modifiers[0].typeArguments[1].members[0].type.kind).toBe(
546
- ts.SyntaxKind.StringLiteral
547
- );
548
- expect(modifiers[0].typeArguments[1].members[0].type.text).toBe('hex');
549
- });
550
- });
551
-
552
- describe('Plugin Options', () => {
553
- test('No plugin options', () => {
554
- const attribute = {};
555
- const modifiers = getAttributeModifiers(attribute);
556
-
557
- expect(modifiers).toHaveLength(0);
558
- });
559
-
560
- test('Plugin Options: { foo: { enabled: true } }', () => {
561
- const attribute = { pluginOptions: { foo: { enabled: true } } };
562
- const modifiers = getAttributeModifiers(attribute);
563
-
564
- expect(modifiers).toHaveLength(1);
565
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
566
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.SetPluginOptions');
567
- expect(modifiers[0].typeArguments).toHaveLength(1);
568
- expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.TypeLiteral);
569
- expect(modifiers[0].typeArguments[0].members).toHaveLength(1);
570
- expect(modifiers[0].typeArguments[0].members[0].kind).toBe(
571
- ts.SyntaxKind.PropertyDeclaration
572
- );
573
- expect(modifiers[0].typeArguments[0].members[0].name.escapedText).toBe('foo');
574
- expect(modifiers[0].typeArguments[0].members[0].type.kind).toBe(
575
- ts.SyntaxKind.TypeLiteral
576
- );
577
- expect(modifiers[0].typeArguments[0].members[0].type.members).toHaveLength(1);
578
- expect(modifiers[0].typeArguments[0].members[0].type.members[0].kind).toBe(
579
- ts.SyntaxKind.PropertyDeclaration
580
- );
581
- expect(modifiers[0].typeArguments[0].members[0].type.members[0].name.escapedText).toBe(
582
- 'enabled'
583
- );
584
- expect(modifiers[0].typeArguments[0].members[0].type.members[0].type.kind).toBe(
585
- ts.SyntaxKind.TrueKeyword
586
- );
587
- });
588
- });
589
-
590
- describe('Min / Max', () => {
591
- test('No min or max', () => {
592
- const attribute = {};
593
- const modifiers = getAttributeModifiers(attribute);
594
-
595
- expect(modifiers).toHaveLength(0);
596
- });
597
-
598
- test('Min: 2, no Max', () => {
599
- const attribute = { min: 2 };
600
- const modifiers = getAttributeModifiers(attribute);
601
-
602
- expect(modifiers).toHaveLength(1);
603
-
604
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
605
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.SetMinMax');
606
-
607
- const [setMinMax] = modifiers;
608
- const { typeArguments } = setMinMax;
609
-
610
- expect(typeArguments).toBeDefined();
611
- expect(typeArguments).toHaveLength(2);
612
-
613
- const [definition, typeofMinMax] = typeArguments;
614
-
615
- // Min
616
- expect(definition.kind).toBe(ts.SyntaxKind.TypeLiteral);
617
- expect(definition.members).toHaveLength(1);
618
-
619
- const [min] = definition.members;
620
-
621
- expect(min.kind).toBe(ts.SyntaxKind.PropertyDeclaration);
622
- expect(min.name.escapedText).toBe('min');
623
- expect(min.type.kind).toBe(ts.SyntaxKind.NumericLiteral);
624
- expect(min.type.text).toBe('2');
625
-
626
- // Check for number keyword on the second typeArgument
627
- expect(typeofMinMax.kind).toBe(ts.SyntaxKind.NumberKeyword);
628
- });
629
-
630
- test('No Min, Max: 3', () => {
631
- const attribute = { max: 3 };
632
- const modifiers = getAttributeModifiers(attribute);
633
-
634
- expect(modifiers).toHaveLength(1);
635
-
636
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
637
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.SetMinMax');
638
-
639
- const [setMinMax] = modifiers;
640
- const { typeArguments } = setMinMax;
641
-
642
- expect(typeArguments).toBeDefined();
643
- expect(typeArguments).toHaveLength(2);
644
-
645
- const [definition, typeofMinMax] = typeArguments;
646
-
647
- // Max
648
- expect(definition.kind).toBe(ts.SyntaxKind.TypeLiteral);
649
- expect(definition.members).toHaveLength(1);
650
-
651
- const [max] = definition.members;
652
-
653
- expect(max.kind).toBe(ts.SyntaxKind.PropertyDeclaration);
654
- expect(max.name.escapedText).toBe('max');
655
- expect(max.type.kind).toBe(ts.SyntaxKind.NumericLiteral);
656
- expect(max.type.text).toBe('3');
657
-
658
- // Check for number keyword on the second typeArgument
659
- expect(typeofMinMax.kind).toBe(ts.SyntaxKind.NumberKeyword);
660
- });
661
-
662
- test('Min: 4, Max: 12', () => {
663
- const attribute = { min: 4, max: 12 };
664
- const modifiers = getAttributeModifiers(attribute);
665
-
666
- expect(modifiers).toHaveLength(1);
667
-
668
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
669
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.SetMinMax');
670
-
671
- const [setMinMax] = modifiers;
672
- const { typeArguments } = setMinMax;
673
-
674
- expect(typeArguments).toBeDefined();
675
- expect(typeArguments).toHaveLength(2);
676
-
677
- const [definition, typeofMinMax] = typeArguments;
678
-
679
- // Min/Max
680
- expect(definition.kind).toBe(ts.SyntaxKind.TypeLiteral);
681
- expect(definition.members).toHaveLength(2);
682
-
683
- const [max, min] = definition.members;
684
-
685
- expect(max.kind).toBe(ts.SyntaxKind.PropertyDeclaration);
686
- expect(max.name.escapedText).toBe('max');
687
- expect(max.type.kind).toBe(ts.SyntaxKind.NumericLiteral);
688
- expect(max.type.text).toBe('12');
689
-
690
- expect(min.kind).toBe(ts.SyntaxKind.PropertyDeclaration);
691
- expect(min.name.escapedText).toBe('min');
692
- expect(min.type.kind).toBe(ts.SyntaxKind.NumericLiteral);
693
- expect(min.type.text).toBe('4');
694
-
695
- // Check for number keyword on the second typeArgument
696
- expect(typeofMinMax.kind).toBe(ts.SyntaxKind.NumberKeyword);
697
- });
698
-
699
- test('Min: "1"', () => {
700
- const attribute = { min: '1' };
701
- const modifiers = getAttributeModifiers(attribute);
702
-
703
- expect(modifiers).toHaveLength(1);
704
-
705
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
706
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.SetMinMax');
707
-
708
- const [setMinMax] = modifiers;
709
- const { typeArguments } = setMinMax;
710
-
711
- expect(typeArguments).toBeDefined();
712
- expect(typeArguments).toHaveLength(2);
713
-
714
- const [definition, typeofMinMax] = typeArguments;
715
-
716
- // Min/Max
717
- expect(definition.kind).toBe(ts.SyntaxKind.TypeLiteral);
718
- expect(definition.members).toHaveLength(1);
719
-
720
- const [min] = definition.members;
721
-
722
- expect(min.kind).toBe(ts.SyntaxKind.PropertyDeclaration);
723
- expect(min.name.escapedText).toBe('min');
724
- expect(min.type.kind).toBe(ts.SyntaxKind.StringLiteral);
725
- expect(min.type.text).toBe('1');
726
-
727
- // Check for string keyword on the second typeArgument
728
- expect(typeofMinMax.kind).toBe(ts.SyntaxKind.StringKeyword);
729
- });
730
-
731
- test('Min: 0', () => {
732
- const attribute = { min: 0 };
733
- const modifiers = getAttributeModifiers(attribute);
734
-
735
- expect(modifiers).toHaveLength(1);
736
-
737
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
738
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.SetMinMax');
739
-
740
- const [setMinMax] = modifiers;
741
- const { typeArguments } = setMinMax;
742
-
743
- expect(typeArguments).toBeDefined();
744
- expect(typeArguments).toHaveLength(2);
745
-
746
- const [definition, typeofMinMax] = typeArguments;
747
-
748
- // Min/Max
749
- expect(definition.kind).toBe(ts.SyntaxKind.TypeLiteral);
750
- expect(definition.members).toHaveLength(1);
751
-
752
- const [min] = definition.members;
753
-
754
- expect(min.kind).toBe(ts.SyntaxKind.PropertyDeclaration);
755
- expect(min.name.escapedText).toBe('min');
756
- expect(min.type.kind).toBe(ts.SyntaxKind.NumericLiteral);
757
- expect(min.type.text).toBe('0');
758
-
759
- // Check for string keyword on the second typeArgument
760
- expect(typeofMinMax.kind).toBe(ts.SyntaxKind.NumberKeyword);
761
- });
762
- });
763
-
764
- describe('MinLength / MaxLength', () => {
765
- test('No minLength or maxLength', () => {
766
- const attribute = {};
767
- const modifiers = getAttributeModifiers(attribute);
768
-
769
- expect(modifiers).toHaveLength(0);
770
- });
771
-
772
- test('MinLength: 2, no MaxLength', () => {
773
- const attribute = { minLength: 2 };
774
- const modifiers = getAttributeModifiers(attribute);
775
-
776
- expect(modifiers).toHaveLength(1);
777
-
778
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
779
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.SetMinMaxLength');
780
-
781
- expect(modifiers[0].typeArguments).toHaveLength(1);
782
- expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.TypeLiteral);
783
- expect(modifiers[0].typeArguments[0].members).toHaveLength(1);
784
-
785
- // Min
786
- expect(modifiers[0].typeArguments[0].members[0].kind).toBe(
787
- ts.SyntaxKind.PropertyDeclaration
788
- );
789
- expect(modifiers[0].typeArguments[0].members[0].name.escapedText).toBe('minLength');
790
- expect(modifiers[0].typeArguments[0].members[0].type.kind).toBe(
791
- ts.SyntaxKind.NumericLiteral
792
- );
793
- expect(modifiers[0].typeArguments[0].members[0].type.text).toBe('2');
794
- });
795
-
796
- test('No MinLength, MaxLength: 3', () => {
797
- const attribute = { maxLength: 3 };
798
- const modifiers = getAttributeModifiers(attribute);
799
-
800
- expect(modifiers).toHaveLength(1);
801
-
802
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
803
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.SetMinMaxLength');
804
-
805
- expect(modifiers[0].typeArguments).toHaveLength(1);
806
- expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.TypeLiteral);
807
- expect(modifiers[0].typeArguments[0].members).toHaveLength(1);
808
-
809
- // Min
810
- expect(modifiers[0].typeArguments[0].members[0].kind).toBe(
811
- ts.SyntaxKind.PropertyDeclaration
812
- );
813
- expect(modifiers[0].typeArguments[0].members[0].name.escapedText).toBe('maxLength');
814
- expect(modifiers[0].typeArguments[0].members[0].type.kind).toBe(
815
- ts.SyntaxKind.NumericLiteral
816
- );
817
- expect(modifiers[0].typeArguments[0].members[0].type.text).toBe('3');
818
- });
819
-
820
- test('MinLength: 4, MaxLength: 12', () => {
821
- const attribute = { minLength: 4, maxLength: 12 };
822
- const modifiers = getAttributeModifiers(attribute);
823
-
824
- expect(modifiers).toHaveLength(1);
825
-
826
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
827
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.SetMinMaxLength');
828
-
829
- expect(modifiers[0].typeArguments).toHaveLength(1);
830
- expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.TypeLiteral);
831
- expect(modifiers[0].typeArguments[0].members).toHaveLength(2);
832
-
833
- const [maxLength, minLength] = modifiers[0].typeArguments[0].members;
834
-
835
- // Max
836
- expect(maxLength.kind).toBe(ts.SyntaxKind.PropertyDeclaration);
837
- expect(maxLength.name.escapedText).toBe('maxLength');
838
- expect(maxLength.type.kind).toBe(ts.SyntaxKind.NumericLiteral);
839
- expect(maxLength.type.text).toBe('12');
840
-
841
- // Min
842
- expect(minLength.kind).toBe(ts.SyntaxKind.PropertyDeclaration);
843
- expect(minLength.name.escapedText).toBe('minLength');
844
- expect(minLength.type.kind).toBe(ts.SyntaxKind.NumericLiteral);
845
- expect(minLength.type.text).toBe('4');
846
- });
847
- });
848
-
849
- describe('Default', () => {
850
- test('No default', () => {
851
- const attribute = {};
852
- const modifiers = getAttributeModifiers(attribute);
853
-
854
- expect(modifiers).toHaveLength(0);
855
- });
856
-
857
- test('Default: true', () => {
858
- const attribute = { default: true };
859
- const modifiers = getAttributeModifiers(attribute);
860
-
861
- expect(modifiers).toHaveLength(1);
862
-
863
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
864
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.DefaultTo');
865
-
866
- expect(modifiers[0].typeArguments).toHaveLength(1);
867
- expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.TrueKeyword);
868
- });
869
-
870
- test('Default: { enabled: true }', () => {
871
- const attribute = { default: { enabled: true } };
872
- const modifiers = getAttributeModifiers(attribute);
873
-
874
- expect(modifiers).toHaveLength(1);
875
-
876
- expect(modifiers[0].kind).toBe(ts.SyntaxKind.TypeReference);
877
- expect(modifiers[0].typeName.escapedText).toBe('Schema.Attribute.DefaultTo');
878
-
879
- expect(modifiers[0].typeArguments).toHaveLength(1);
880
- expect(modifiers[0].typeArguments[0].kind).toBe(ts.SyntaxKind.TypeLiteral);
881
- expect(modifiers[0].typeArguments[0].members).toHaveLength(1);
882
- expect(modifiers[0].typeArguments[0].members[0].kind).toBe(
883
- ts.SyntaxKind.PropertyDeclaration
884
- );
885
- expect(modifiers[0].typeArguments[0].members[0].name.escapedText).toBe('enabled');
886
- expect(modifiers[0].typeArguments[0].members[0].type.kind).toBe(
887
- ts.SyntaxKind.TrueKeyword
888
- );
889
- });
890
-
891
- test('Default: <function>', () => {
892
- const anyFunction = jest.fn();
893
- const attribute = { default: anyFunction };
894
-
895
- const modifiers = getAttributeModifiers(attribute);
896
-
897
- // The default modifier shouldn't be processed when encountering a function
898
- expect(modifiers).toHaveLength(0);
899
- });
900
- });
901
- });
902
- });
903
- });