@react-native/codegen 0.72.1

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 (186) hide show
  1. package/README.md +21 -0
  2. package/lib/CodegenSchema.js +11 -0
  3. package/lib/CodegenSchema.js.flow +351 -0
  4. package/lib/SchemaValidator.js +54 -0
  5. package/lib/SchemaValidator.js.flow +67 -0
  6. package/lib/cli/combine/combine-js-to-schema-cli.js +50 -0
  7. package/lib/cli/combine/combine-js-to-schema-cli.js.flow +49 -0
  8. package/lib/cli/combine/combine-js-to-schema.js +110 -0
  9. package/lib/cli/combine/combine-js-to-schema.js.flow +48 -0
  10. package/lib/cli/combine/combine-utils.js +118 -0
  11. package/lib/cli/combine/combine-utils.js.flow +85 -0
  12. package/lib/cli/generators/generate-all.js +65 -0
  13. package/lib/cli/generators/generate-all.js.flow +66 -0
  14. package/lib/cli/parser/parser-cli.js +55 -0
  15. package/lib/cli/parser/parser-cli.js.flow +18 -0
  16. package/lib/cli/parser/parser.js +35 -0
  17. package/lib/cli/parser/parser.js.flow +37 -0
  18. package/lib/cli/parser/parser.sh +15 -0
  19. package/lib/generators/RNCodegen.js +207 -0
  20. package/lib/generators/RNCodegen.js.flow +284 -0
  21. package/lib/generators/Utils.js +31 -0
  22. package/lib/generators/Utils.js.flow +33 -0
  23. package/lib/generators/__test_fixtures__/fixtures.js +79 -0
  24. package/lib/generators/__test_fixtures__/fixtures.js.flow +82 -0
  25. package/lib/generators/components/ComponentsGeneratorUtils.js +217 -0
  26. package/lib/generators/components/ComponentsGeneratorUtils.js.flow +304 -0
  27. package/lib/generators/components/CppHelpers.js +188 -0
  28. package/lib/generators/components/CppHelpers.js.flow +228 -0
  29. package/lib/generators/components/GenerateComponentDescriptorH.js +75 -0
  30. package/lib/generators/components/GenerateComponentDescriptorH.js.flow +95 -0
  31. package/lib/generators/components/GenerateComponentHObjCpp.js +327 -0
  32. package/lib/generators/components/GenerateComponentHObjCpp.js.flow +418 -0
  33. package/lib/generators/components/GenerateEventEmitterCpp.js +199 -0
  34. package/lib/generators/components/GenerateEventEmitterCpp.js.flow +273 -0
  35. package/lib/generators/components/GenerateEventEmitterH.js +224 -0
  36. package/lib/generators/components/GenerateEventEmitterH.js.flow +315 -0
  37. package/lib/generators/components/GeneratePropsCpp.js +126 -0
  38. package/lib/generators/components/GeneratePropsCpp.js.flow +161 -0
  39. package/lib/generators/components/GeneratePropsH.js +606 -0
  40. package/lib/generators/components/GeneratePropsH.js.flow +778 -0
  41. package/lib/generators/components/GeneratePropsJavaDelegate.js +287 -0
  42. package/lib/generators/components/GeneratePropsJavaDelegate.js.flow +348 -0
  43. package/lib/generators/components/GeneratePropsJavaInterface.js +237 -0
  44. package/lib/generators/components/GeneratePropsJavaInterface.js.flow +288 -0
  45. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js +157 -0
  46. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +187 -0
  47. package/lib/generators/components/GeneratePropsJavaPojo/index.js +66 -0
  48. package/lib/generators/components/GeneratePropsJavaPojo/index.js.flow +80 -0
  49. package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js +273 -0
  50. package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js.flow +296 -0
  51. package/lib/generators/components/GenerateShadowNodeCpp.js +73 -0
  52. package/lib/generators/components/GenerateShadowNodeCpp.js.flow +95 -0
  53. package/lib/generators/components/GenerateShadowNodeH.js +91 -0
  54. package/lib/generators/components/GenerateShadowNodeH.js.flow +124 -0
  55. package/lib/generators/components/GenerateStateCpp.js +70 -0
  56. package/lib/generators/components/GenerateStateCpp.js.flow +92 -0
  57. package/lib/generators/components/GenerateStateH.js +93 -0
  58. package/lib/generators/components/GenerateStateH.js.flow +111 -0
  59. package/lib/generators/components/GenerateTests.js +165 -0
  60. package/lib/generators/components/GenerateTests.js.flow +219 -0
  61. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +91 -0
  62. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +107 -0
  63. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +89 -0
  64. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +105 -0
  65. package/lib/generators/components/GenerateViewConfigJs.js +410 -0
  66. package/lib/generators/components/GenerateViewConfigJs.js.flow +484 -0
  67. package/lib/generators/components/JavaHelpers.js +87 -0
  68. package/lib/generators/components/JavaHelpers.js.flow +119 -0
  69. package/lib/generators/components/__test_fixtures__/fixtures.js +1641 -0
  70. package/lib/generators/components/__test_fixtures__/fixtures.js.flow +1672 -0
  71. package/lib/generators/modules/GenerateModuleCpp.js +299 -0
  72. package/lib/generators/modules/GenerateModuleCpp.js.flow +278 -0
  73. package/lib/generators/modules/GenerateModuleH.js +373 -0
  74. package/lib/generators/modules/GenerateModuleH.js.flow +355 -0
  75. package/lib/generators/modules/GenerateModuleJavaSpec.js +571 -0
  76. package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +553 -0
  77. package/lib/generators/modules/GenerateModuleJniCpp.js +505 -0
  78. package/lib/generators/modules/GenerateModuleJniCpp.js.flow +523 -0
  79. package/lib/generators/modules/GenerateModuleJniH.js +138 -0
  80. package/lib/generators/modules/GenerateModuleJniH.js.flow +148 -0
  81. package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js +262 -0
  82. package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js.flow +208 -0
  83. package/lib/generators/modules/GenerateModuleObjCpp/Utils.js +25 -0
  84. package/lib/generators/modules/GenerateModuleObjCpp/Utils.js.flow +32 -0
  85. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js +337 -0
  86. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js.flow +288 -0
  87. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js +330 -0
  88. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js.flow +279 -0
  89. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeStruct.js +25 -0
  90. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeStruct.js.flow +35 -0
  91. package/lib/generators/modules/GenerateModuleObjCpp/index.js +185 -0
  92. package/lib/generators/modules/GenerateModuleObjCpp/index.js.flow +219 -0
  93. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js +529 -0
  94. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +510 -0
  95. package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js +96 -0
  96. package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js.flow +121 -0
  97. package/lib/generators/modules/Utils.js +34 -0
  98. package/lib/generators/modules/Utils.js.flow +53 -0
  99. package/lib/generators/modules/__test_fixtures__/fixtures.js +1658 -0
  100. package/lib/generators/modules/__test_fixtures__/fixtures.js.flow +1669 -0
  101. package/lib/parsers/consistency/compareSnaps.js +84 -0
  102. package/lib/parsers/error-utils.js +284 -0
  103. package/lib/parsers/error-utils.js.flow +295 -0
  104. package/lib/parsers/errors.js +350 -0
  105. package/lib/parsers/errors.js.flow +439 -0
  106. package/lib/parsers/flow/components/__test_fixtures__/failures.js +583 -0
  107. package/lib/parsers/flow/components/__test_fixtures__/failures.js.flow +600 -0
  108. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +1001 -0
  109. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +1016 -0
  110. package/lib/parsers/flow/components/commands.js +104 -0
  111. package/lib/parsers/flow/components/commands.js.flow +123 -0
  112. package/lib/parsers/flow/components/componentsUtils.js +446 -0
  113. package/lib/parsers/flow/components/componentsUtils.js.flow +496 -0
  114. package/lib/parsers/flow/components/events.js +233 -0
  115. package/lib/parsers/flow/components/events.js.flow +262 -0
  116. package/lib/parsers/flow/components/extends.js +52 -0
  117. package/lib/parsers/flow/components/extends.js.flow +66 -0
  118. package/lib/parsers/flow/components/index.js +267 -0
  119. package/lib/parsers/flow/components/index.js.flow +226 -0
  120. package/lib/parsers/flow/components/options.js +72 -0
  121. package/lib/parsers/flow/components/options.js.flow +87 -0
  122. package/lib/parsers/flow/components/props.js +47 -0
  123. package/lib/parsers/flow/components/props.js.flow +60 -0
  124. package/lib/parsers/flow/components/schema.js +106 -0
  125. package/lib/parsers/flow/components/schema.js.flow +62 -0
  126. package/lib/parsers/flow/index.js +80 -0
  127. package/lib/parsers/flow/index.js.flow +85 -0
  128. package/lib/parsers/flow/modules/__test_fixtures__/failures.js +215 -0
  129. package/lib/parsers/flow/modules/__test_fixtures__/failures.js.flow +223 -0
  130. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js +724 -0
  131. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js.flow +747 -0
  132. package/lib/parsers/flow/modules/index.js +528 -0
  133. package/lib/parsers/flow/modules/index.js.flow +420 -0
  134. package/lib/parsers/flow/parser.js +109 -0
  135. package/lib/parsers/flow/parser.js.flow +83 -0
  136. package/lib/parsers/flow/utils.js +108 -0
  137. package/lib/parsers/flow/utils.js.flow +123 -0
  138. package/lib/parsers/parser.js +11 -0
  139. package/lib/parsers/parser.js.flow +70 -0
  140. package/lib/parsers/parserMock.js +96 -0
  141. package/lib/parsers/parserMock.js.flow +68 -0
  142. package/lib/parsers/parsers-commons.js +448 -0
  143. package/lib/parsers/parsers-commons.js.flow +447 -0
  144. package/lib/parsers/parsers-primitives.js +387 -0
  145. package/lib/parsers/parsers-primitives.js.flow +383 -0
  146. package/lib/parsers/parsers-utils.js +18 -0
  147. package/lib/parsers/parsers-utils.js.flow +19 -0
  148. package/lib/parsers/schema/index.js +23 -0
  149. package/lib/parsers/schema/index.js.flow +26 -0
  150. package/lib/parsers/typescript/components/__test_fixtures__/failures.js +489 -0
  151. package/lib/parsers/typescript/components/__test_fixtures__/failures.js.flow +505 -0
  152. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +1151 -0
  153. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +1168 -0
  154. package/lib/parsers/typescript/components/commands.js +132 -0
  155. package/lib/parsers/typescript/components/commands.js.flow +151 -0
  156. package/lib/parsers/typescript/components/componentsUtils.js +471 -0
  157. package/lib/parsers/typescript/components/componentsUtils.js.flow +521 -0
  158. package/lib/parsers/typescript/components/events.js +240 -0
  159. package/lib/parsers/typescript/components/events.js.flow +262 -0
  160. package/lib/parsers/typescript/components/extends.js +88 -0
  161. package/lib/parsers/typescript/components/extends.js.flow +103 -0
  162. package/lib/parsers/typescript/components/index.js +277 -0
  163. package/lib/parsers/typescript/components/index.js.flow +239 -0
  164. package/lib/parsers/typescript/components/options.js +72 -0
  165. package/lib/parsers/typescript/components/options.js.flow +87 -0
  166. package/lib/parsers/typescript/components/props.js +39 -0
  167. package/lib/parsers/typescript/components/props.js.flow +48 -0
  168. package/lib/parsers/typescript/components/schema.js +106 -0
  169. package/lib/parsers/typescript/components/schema.js.flow +62 -0
  170. package/lib/parsers/typescript/index.js +85 -0
  171. package/lib/parsers/typescript/index.js.flow +94 -0
  172. package/lib/parsers/typescript/modules/__test_fixtures__/failures.js +160 -0
  173. package/lib/parsers/typescript/modules/__test_fixtures__/failures.js.flow +167 -0
  174. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js +701 -0
  175. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js.flow +727 -0
  176. package/lib/parsers/typescript/modules/index.js +543 -0
  177. package/lib/parsers/typescript/modules/index.js.flow +435 -0
  178. package/lib/parsers/typescript/parseTopLevelType.js +203 -0
  179. package/lib/parsers/typescript/parseTopLevelType.js.flow +243 -0
  180. package/lib/parsers/typescript/parser.js +105 -0
  181. package/lib/parsers/typescript/parser.js.flow +87 -0
  182. package/lib/parsers/typescript/utils.js +101 -0
  183. package/lib/parsers/typescript/utils.js.flow +115 -0
  184. package/lib/parsers/utils.js +273 -0
  185. package/lib/parsers/utils.js.flow +266 -0
  186. package/package.json +45 -0
@@ -0,0 +1,471 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ *
8
+ * @format
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ const _require = require('../parseTopLevelType'),
14
+ parseTopLevelType = _require.parseTopLevelType,
15
+ flattenIntersectionType = _require.flattenIntersectionType;
16
+ function getProperties(typeName, types) {
17
+ const alias = types[typeName];
18
+ if (!alias) {
19
+ throw new Error(
20
+ `Failed to find definition for "${typeName}", please check that you have a valid codegen typescript file`,
21
+ );
22
+ }
23
+ const aliasKind =
24
+ alias.type === 'TSInterfaceDeclaration' ? 'interface' : 'type';
25
+ try {
26
+ if (aliasKind === 'interface') {
27
+ var _alias$extends;
28
+ return [
29
+ ...((_alias$extends = alias.extends) !== null &&
30
+ _alias$extends !== void 0
31
+ ? _alias$extends
32
+ : []),
33
+ ...alias.body.body,
34
+ ];
35
+ }
36
+ return (
37
+ alias.typeAnnotation.members ||
38
+ alias.typeAnnotation.typeParameters.params[0].members ||
39
+ alias.typeAnnotation.typeParameters.params
40
+ );
41
+ } catch (e) {
42
+ throw new Error(
43
+ `Failed to find ${aliasKind} definition for "${typeName}", please check that you have a valid codegen typescript file`,
44
+ );
45
+ }
46
+ }
47
+ function getUnionOfLiterals(name, forArray, elementTypes, defaultValue, types) {
48
+ var _elementTypes$0$liter, _elementTypes$0$liter2;
49
+ elementTypes.reduce((lastType, currType) => {
50
+ const lastFlattenedType =
51
+ lastType && lastType.type === 'TSLiteralType'
52
+ ? lastType.literal.type
53
+ : lastType.type;
54
+ const currFlattenedType =
55
+ currType.type === 'TSLiteralType' ? currType.literal.type : currType.type;
56
+ if (lastFlattenedType && currFlattenedType !== lastFlattenedType) {
57
+ throw new Error(`Mixed types are not supported (see "${name}")`);
58
+ }
59
+ return currType;
60
+ });
61
+ if (defaultValue === undefined) {
62
+ throw new Error(`A default enum value is required for "${name}"`);
63
+ }
64
+ const unionType = elementTypes[0].type;
65
+ if (
66
+ unionType === 'TSLiteralType' &&
67
+ ((_elementTypes$0$liter = elementTypes[0].literal) === null ||
68
+ _elementTypes$0$liter === void 0
69
+ ? void 0
70
+ : _elementTypes$0$liter.type) === 'StringLiteral'
71
+ ) {
72
+ return {
73
+ type: 'StringEnumTypeAnnotation',
74
+ default: defaultValue,
75
+ options: elementTypes.map(option => option.literal.value),
76
+ };
77
+ } else if (
78
+ unionType === 'TSLiteralType' &&
79
+ ((_elementTypes$0$liter2 = elementTypes[0].literal) === null ||
80
+ _elementTypes$0$liter2 === void 0
81
+ ? void 0
82
+ : _elementTypes$0$liter2.type) === 'NumericLiteral'
83
+ ) {
84
+ if (forArray) {
85
+ throw new Error(`Arrays of int enums are not supported (see: "${name}")`);
86
+ } else {
87
+ return {
88
+ type: 'Int32EnumTypeAnnotation',
89
+ default: defaultValue,
90
+ options: elementTypes.map(option => option.literal.value),
91
+ };
92
+ }
93
+ } else {
94
+ var _elementTypes$0$liter3;
95
+ throw new Error(
96
+ `Unsupported union type for "${name}", received "${
97
+ unionType === 'TSLiteralType'
98
+ ? (_elementTypes$0$liter3 = elementTypes[0].literal) === null ||
99
+ _elementTypes$0$liter3 === void 0
100
+ ? void 0
101
+ : _elementTypes$0$liter3.type
102
+ : unionType
103
+ }"`,
104
+ );
105
+ }
106
+ }
107
+ function detectArrayType(
108
+ name,
109
+ typeAnnotation,
110
+ defaultValue,
111
+ types,
112
+ buildSchema,
113
+ ) {
114
+ // Covers: readonly T[]
115
+ if (
116
+ typeAnnotation.type === 'TSTypeOperator' &&
117
+ typeAnnotation.operator === 'readonly' &&
118
+ typeAnnotation.typeAnnotation.type === 'TSArrayType'
119
+ ) {
120
+ return {
121
+ type: 'ArrayTypeAnnotation',
122
+ elementType: getTypeAnnotationForArray(
123
+ name,
124
+ typeAnnotation.typeAnnotation.elementType,
125
+ defaultValue,
126
+ types,
127
+ buildSchema,
128
+ ),
129
+ };
130
+ }
131
+
132
+ // Covers: T[]
133
+ if (typeAnnotation.type === 'TSArrayType') {
134
+ return {
135
+ type: 'ArrayTypeAnnotation',
136
+ elementType: getTypeAnnotationForArray(
137
+ name,
138
+ typeAnnotation.elementType,
139
+ defaultValue,
140
+ types,
141
+ buildSchema,
142
+ ),
143
+ };
144
+ }
145
+
146
+ // Covers: Array<T> and ReadonlyArray<T>
147
+ if (
148
+ typeAnnotation.type === 'TSTypeReference' &&
149
+ (typeAnnotation.typeName.name === 'ReadonlyArray' ||
150
+ typeAnnotation.typeName.name === 'Array')
151
+ ) {
152
+ return {
153
+ type: 'ArrayTypeAnnotation',
154
+ elementType: getTypeAnnotationForArray(
155
+ name,
156
+ typeAnnotation.typeParameters.params[0],
157
+ defaultValue,
158
+ types,
159
+ buildSchema,
160
+ ),
161
+ };
162
+ }
163
+ return null;
164
+ }
165
+ function buildObjectType(rawProperties, types, buildSchema) {
166
+ const flattenedProperties = flattenProperties(rawProperties, types);
167
+ const properties = flattenedProperties
168
+ .map(prop => buildSchema(prop, types))
169
+ .filter(Boolean);
170
+ return {
171
+ type: 'ObjectTypeAnnotation',
172
+ properties,
173
+ };
174
+ }
175
+ function getCommonTypeAnnotation(
176
+ name,
177
+ forArray,
178
+ type,
179
+ typeAnnotation,
180
+ defaultValue,
181
+ types,
182
+ buildSchema,
183
+ ) {
184
+ switch (type) {
185
+ case 'TSTypeLiteral':
186
+ return buildObjectType(typeAnnotation.members, types, buildSchema);
187
+ case 'TSInterfaceDeclaration':
188
+ return buildObjectType([typeAnnotation], types, buildSchema);
189
+ case 'TSIntersectionType':
190
+ return buildObjectType(
191
+ flattenIntersectionType(typeAnnotation, types),
192
+ types,
193
+ buildSchema,
194
+ );
195
+ case 'ImageSource':
196
+ return {
197
+ type: 'ReservedPropTypeAnnotation',
198
+ name: 'ImageSourcePrimitive',
199
+ };
200
+ case 'ImageRequest':
201
+ return {
202
+ type: 'ReservedPropTypeAnnotation',
203
+ name: 'ImageRequestPrimitive',
204
+ };
205
+ case 'ColorValue':
206
+ case 'ProcessedColorValue':
207
+ return {
208
+ type: 'ReservedPropTypeAnnotation',
209
+ name: 'ColorPrimitive',
210
+ };
211
+ case 'PointValue':
212
+ return {
213
+ type: 'ReservedPropTypeAnnotation',
214
+ name: 'PointPrimitive',
215
+ };
216
+ case 'EdgeInsetsValue':
217
+ return {
218
+ type: 'ReservedPropTypeAnnotation',
219
+ name: 'EdgeInsetsPrimitive',
220
+ };
221
+ case 'TSUnionType':
222
+ return getUnionOfLiterals(
223
+ name,
224
+ forArray,
225
+ typeAnnotation.types,
226
+ defaultValue,
227
+ types,
228
+ );
229
+ case 'Int32':
230
+ return {
231
+ type: 'Int32TypeAnnotation',
232
+ };
233
+ case 'Double':
234
+ return {
235
+ type: 'DoubleTypeAnnotation',
236
+ };
237
+ case 'Float':
238
+ return {
239
+ type: 'FloatTypeAnnotation',
240
+ };
241
+ case 'TSBooleanKeyword':
242
+ return {
243
+ type: 'BooleanTypeAnnotation',
244
+ };
245
+ case 'Stringish':
246
+ case 'TSStringKeyword':
247
+ return {
248
+ type: 'StringTypeAnnotation',
249
+ };
250
+ default:
251
+ return undefined;
252
+ }
253
+ }
254
+ function getTypeAnnotationForArray(
255
+ name,
256
+ typeAnnotation,
257
+ defaultValue,
258
+ types,
259
+ buildSchema,
260
+ ) {
261
+ var _extractedTypeAnnotat, _extractedTypeAnnotat2;
262
+ // unpack WithDefault, (T) or T|U
263
+ const topLevelType = parseTopLevelType(typeAnnotation, types);
264
+ if (topLevelType.defaultValue !== undefined) {
265
+ throw new Error(
266
+ 'Nested optionals such as "ReadonlyArray<boolean | null | undefined>" are not supported, please declare optionals at the top level of value definitions as in "ReadonlyArray<boolean> | null | undefined"',
267
+ );
268
+ }
269
+ if (topLevelType.optional) {
270
+ throw new Error(
271
+ 'Nested optionals such as "ReadonlyArray<boolean | null | undefined>" are not supported, please declare optionals at the top level of value definitions as in "ReadonlyArray<boolean> | null | undefined"',
272
+ );
273
+ }
274
+ const extractedTypeAnnotation = topLevelType.type;
275
+ const arrayType = detectArrayType(
276
+ name,
277
+ extractedTypeAnnotation,
278
+ defaultValue,
279
+ types,
280
+ buildSchema,
281
+ );
282
+ if (arrayType) {
283
+ if (arrayType.elementType.type !== 'ObjectTypeAnnotation') {
284
+ throw new Error(
285
+ `Only array of array of object is supported for "${name}".`,
286
+ );
287
+ }
288
+ return arrayType;
289
+ }
290
+ const type =
291
+ extractedTypeAnnotation.elementType === 'TSTypeReference'
292
+ ? extractedTypeAnnotation.elementType.typeName.name
293
+ : ((_extractedTypeAnnotat = extractedTypeAnnotation.elementType) ===
294
+ null || _extractedTypeAnnotat === void 0
295
+ ? void 0
296
+ : _extractedTypeAnnotat.type) ||
297
+ ((_extractedTypeAnnotat2 = extractedTypeAnnotation.typeName) === null ||
298
+ _extractedTypeAnnotat2 === void 0
299
+ ? void 0
300
+ : _extractedTypeAnnotat2.name) ||
301
+ extractedTypeAnnotation.type;
302
+ const common = getCommonTypeAnnotation(
303
+ name,
304
+ true,
305
+ type,
306
+ extractedTypeAnnotation,
307
+ defaultValue,
308
+ types,
309
+ buildSchema,
310
+ );
311
+ if (common) {
312
+ return common;
313
+ }
314
+ switch (type) {
315
+ case 'TSNumberKeyword':
316
+ return {
317
+ type: 'FloatTypeAnnotation',
318
+ };
319
+ default:
320
+ type;
321
+ throw new Error(`Unknown prop type for "${name}": ${type}`);
322
+ }
323
+ }
324
+ function setDefaultValue(common, defaultValue) {
325
+ switch (common.type) {
326
+ case 'Int32TypeAnnotation':
327
+ case 'DoubleTypeAnnotation':
328
+ common.default = defaultValue ? defaultValue : 0;
329
+ break;
330
+ case 'FloatTypeAnnotation':
331
+ common.default =
332
+ defaultValue === null ? null : defaultValue ? defaultValue : 0;
333
+ break;
334
+ case 'BooleanTypeAnnotation':
335
+ common.default = defaultValue === null ? null : !!defaultValue;
336
+ break;
337
+ case 'StringTypeAnnotation':
338
+ common.default = defaultValue === undefined ? null : defaultValue;
339
+ break;
340
+ }
341
+ }
342
+ function getTypeAnnotation(name, annotation, defaultValue, types, buildSchema) {
343
+ // unpack WithDefault, (T) or T|U
344
+ const topLevelType = parseTopLevelType(annotation, types);
345
+ const typeAnnotation = topLevelType.type;
346
+ const arrayType = detectArrayType(
347
+ name,
348
+ typeAnnotation,
349
+ defaultValue,
350
+ types,
351
+ buildSchema,
352
+ );
353
+ if (arrayType) {
354
+ return arrayType;
355
+ }
356
+ const type =
357
+ typeAnnotation.type === 'TSTypeReference' ||
358
+ typeAnnotation.type === 'TSTypeAliasDeclaration'
359
+ ? typeAnnotation.typeName.name
360
+ : typeAnnotation.type;
361
+ const common = getCommonTypeAnnotation(
362
+ name,
363
+ false,
364
+ type,
365
+ typeAnnotation,
366
+ defaultValue,
367
+ types,
368
+ buildSchema,
369
+ );
370
+ if (common) {
371
+ setDefaultValue(common, defaultValue);
372
+ return common;
373
+ }
374
+ switch (type) {
375
+ case 'ColorArrayValue':
376
+ return {
377
+ type: 'ArrayTypeAnnotation',
378
+ elementType: {
379
+ type: 'ReservedPropTypeAnnotation',
380
+ name: 'ColorPrimitive',
381
+ },
382
+ };
383
+ case 'TSNumberKeyword':
384
+ throw new Error(
385
+ `Cannot use "${type}" type annotation for "${name}": must use a specific numeric type like Int32, Double, or Float`,
386
+ );
387
+ default:
388
+ type;
389
+ throw new Error(`Unknown prop type for "${name}": "${type}"`);
390
+ }
391
+ }
392
+ function getSchemaInfo(property, types) {
393
+ // unpack WithDefault, (T) or T|U
394
+ const topLevelType = parseTopLevelType(
395
+ property.typeAnnotation.typeAnnotation,
396
+ types,
397
+ );
398
+ const name = property.key.name;
399
+ if (!property.optional && topLevelType.defaultValue !== undefined) {
400
+ throw new Error(
401
+ `key ${name} must be optional if used with WithDefault<> annotation`,
402
+ );
403
+ }
404
+ return {
405
+ name,
406
+ optional: property.optional || topLevelType.optional,
407
+ typeAnnotation: topLevelType.type,
408
+ defaultValue: topLevelType.defaultValue,
409
+ };
410
+ }
411
+
412
+ // $FlowFixMe[unclear-type] TODO(T108222691): Use flow-types for @babel/parser
413
+
414
+ function verifyPropNotAlreadyDefined(props, needleProp) {
415
+ const propName = needleProp.key.name;
416
+ const foundProp = props.some(prop => prop.key.name === propName);
417
+ if (foundProp) {
418
+ throw new Error(`A prop was already defined with the name ${propName}`);
419
+ }
420
+ }
421
+ function flattenProperties(typeDefinition, types) {
422
+ return typeDefinition
423
+ .map(property => {
424
+ if (property.type === 'TSPropertySignature') {
425
+ return property;
426
+ } else if (property.type === 'TSTypeReference') {
427
+ return flattenProperties(
428
+ getProperties(property.typeName.name, types),
429
+ types,
430
+ );
431
+ } else if (
432
+ property.type === 'TSExpressionWithTypeArguments' ||
433
+ property.type === 'TSInterfaceHeritage'
434
+ ) {
435
+ return flattenProperties(
436
+ getProperties(property.expression.name, types),
437
+ types,
438
+ );
439
+ } else if (property.type === 'TSTypeLiteral') {
440
+ return flattenProperties(property.members, types);
441
+ } else if (property.type === 'TSInterfaceDeclaration') {
442
+ return flattenProperties(getProperties(property.id.name, types), types);
443
+ } else if (property.type === 'TSIntersectionType') {
444
+ return flattenProperties(property.types, types);
445
+ } else {
446
+ throw new Error(
447
+ `${property.type} is not a supported object literal type.`,
448
+ );
449
+ }
450
+ })
451
+ .filter(Boolean)
452
+ .reduce((acc, item) => {
453
+ if (Array.isArray(item)) {
454
+ item.forEach(prop => {
455
+ verifyPropNotAlreadyDefined(acc, prop);
456
+ });
457
+ return acc.concat(item);
458
+ } else {
459
+ verifyPropNotAlreadyDefined(acc, item);
460
+ acc.push(item);
461
+ return acc;
462
+ }
463
+ }, [])
464
+ .filter(Boolean);
465
+ }
466
+ module.exports = {
467
+ getProperties,
468
+ getSchemaInfo,
469
+ getTypeAnnotation,
470
+ flattenProperties,
471
+ };