@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,496 @@
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
+ * @flow strict-local
8
+ * @format
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ import type {ASTNode} from '../utils';
14
+ import type {NamedShape} from '../../../CodegenSchema.js';
15
+ const {getValueFromTypes} = require('../utils.js');
16
+ import type {TypeDeclarationMap} from '../../utils';
17
+
18
+ function getProperties(
19
+ typeName: string,
20
+ types: TypeDeclarationMap,
21
+ ): $FlowFixMe {
22
+ const typeAlias = types[typeName];
23
+ try {
24
+ return typeAlias.right.typeParameters.params[0].properties;
25
+ } catch (e) {
26
+ throw new Error(
27
+ `Failed to find type definition for "${typeName}", please check that you have a valid codegen flow file`,
28
+ );
29
+ }
30
+ }
31
+
32
+ function getTypeAnnotationForArray<+T>(
33
+ name: string,
34
+ typeAnnotation: $FlowFixMe,
35
+ defaultValue: $FlowFixMe | null,
36
+ types: TypeDeclarationMap,
37
+ buildSchema: (property: PropAST, types: TypeDeclarationMap) => ?NamedShape<T>,
38
+ ): $FlowFixMe {
39
+ const extractedTypeAnnotation = getValueFromTypes(typeAnnotation, types);
40
+ if (extractedTypeAnnotation.type === 'NullableTypeAnnotation') {
41
+ throw new Error(
42
+ 'Nested optionals such as "$ReadOnlyArray<?boolean>" are not supported, please declare optionals at the top level of value definitions as in "?$ReadOnlyArray<boolean>"',
43
+ );
44
+ }
45
+
46
+ if (
47
+ extractedTypeAnnotation.type === 'GenericTypeAnnotation' &&
48
+ extractedTypeAnnotation.id.name === 'WithDefault'
49
+ ) {
50
+ throw new Error(
51
+ 'Nested defaults such as "$ReadOnlyArray<WithDefault<boolean, false>>" are not supported, please declare defaults at the top level of value definitions as in "WithDefault<$ReadOnlyArray<boolean>, false>"',
52
+ );
53
+ }
54
+
55
+ if (extractedTypeAnnotation.type === 'GenericTypeAnnotation') {
56
+ // Resolve the type alias if it's not defined inline
57
+ const objectType = getValueFromTypes(extractedTypeAnnotation, types);
58
+
59
+ if (objectType.id.name === '$ReadOnly') {
60
+ return {
61
+ type: 'ObjectTypeAnnotation',
62
+ properties: flattenProperties(
63
+ objectType.typeParameters.params[0].properties,
64
+ types,
65
+ )
66
+ .map(prop => buildSchema(prop, types))
67
+ .filter(Boolean),
68
+ };
69
+ }
70
+
71
+ if (objectType.id.name === '$ReadOnlyArray') {
72
+ // We need to go yet another level deeper to resolve
73
+ // types that may be defined in a type alias
74
+ const nestedObjectType = getValueFromTypes(
75
+ objectType.typeParameters.params[0],
76
+ types,
77
+ );
78
+
79
+ return {
80
+ type: 'ArrayTypeAnnotation',
81
+ elementType: {
82
+ type: 'ObjectTypeAnnotation',
83
+ properties: flattenProperties(
84
+ nestedObjectType.typeParameters.params[0].properties,
85
+ types,
86
+ )
87
+ .map(prop => buildSchema(prop, types))
88
+ .filter(Boolean),
89
+ },
90
+ };
91
+ }
92
+ }
93
+
94
+ const type =
95
+ extractedTypeAnnotation.type === 'GenericTypeAnnotation'
96
+ ? extractedTypeAnnotation.id.name
97
+ : extractedTypeAnnotation.type;
98
+
99
+ switch (type) {
100
+ case 'ImageSource':
101
+ return {
102
+ type: 'ReservedPropTypeAnnotation',
103
+ name: 'ImageSourcePrimitive',
104
+ };
105
+ case 'ImageRequest':
106
+ return {
107
+ type: 'ReservedPropTypeAnnotation',
108
+ name: 'ImageRequestPrimitive',
109
+ };
110
+ case 'ColorValue':
111
+ case 'ProcessedColorValue':
112
+ return {
113
+ type: 'ReservedPropTypeAnnotation',
114
+ name: 'ColorPrimitive',
115
+ };
116
+ case 'PointValue':
117
+ return {
118
+ type: 'ReservedPropTypeAnnotation',
119
+ name: 'PointPrimitive',
120
+ };
121
+ case 'EdgeInsetsValue':
122
+ return {
123
+ type: 'ReservedPropTypeAnnotation',
124
+ name: 'EdgeInsetsPrimitive',
125
+ };
126
+ case 'Stringish':
127
+ return {
128
+ type: 'StringTypeAnnotation',
129
+ };
130
+ case 'Int32':
131
+ return {
132
+ type: 'Int32TypeAnnotation',
133
+ };
134
+ case 'Double':
135
+ return {
136
+ type: 'DoubleTypeAnnotation',
137
+ };
138
+ case 'Float':
139
+ return {
140
+ type: 'FloatTypeAnnotation',
141
+ };
142
+ case 'BooleanTypeAnnotation':
143
+ return {
144
+ type: 'BooleanTypeAnnotation',
145
+ };
146
+ case 'StringTypeAnnotation':
147
+ return {
148
+ type: 'StringTypeAnnotation',
149
+ };
150
+ case 'UnionTypeAnnotation':
151
+ typeAnnotation.types.reduce((lastType, currType) => {
152
+ if (lastType && currType.type !== lastType.type) {
153
+ throw new Error(`Mixed types are not supported (see "${name}")`);
154
+ }
155
+ return currType;
156
+ });
157
+
158
+ if (defaultValue === null) {
159
+ throw new Error(`A default enum value is required for "${name}"`);
160
+ }
161
+
162
+ const unionType = typeAnnotation.types[0].type;
163
+ if (unionType === 'StringLiteralTypeAnnotation') {
164
+ return {
165
+ type: 'StringEnumTypeAnnotation',
166
+ default: (defaultValue: string),
167
+ options: typeAnnotation.types.map(option => option.value),
168
+ };
169
+ } else if (unionType === 'NumberLiteralTypeAnnotation') {
170
+ throw new Error(
171
+ `Arrays of int enums are not supported (see: "${name}")`,
172
+ );
173
+ } else {
174
+ throw new Error(
175
+ `Unsupported union type for "${name}", received "${unionType}"`,
176
+ );
177
+ }
178
+ default:
179
+ (type: empty);
180
+ throw new Error(`Unknown property type for "${name}": ${type}`);
181
+ }
182
+ }
183
+
184
+ function flattenProperties(
185
+ typeDefinition: $ReadOnlyArray<PropAST>,
186
+ types: TypeDeclarationMap,
187
+ ): $ReadOnlyArray<PropAST> {
188
+ return typeDefinition
189
+ .map(property => {
190
+ if (property.type === 'ObjectTypeProperty') {
191
+ return property;
192
+ } else if (property.type === 'ObjectTypeSpreadProperty') {
193
+ return flattenProperties(
194
+ getProperties(property.argument.id.name, types),
195
+ types,
196
+ );
197
+ }
198
+ })
199
+ .reduce((acc: Array<PropAST>, item) => {
200
+ if (Array.isArray(item)) {
201
+ item.forEach(prop => {
202
+ verifyPropNotAlreadyDefined(acc, prop);
203
+ });
204
+ return acc.concat(item);
205
+ } else {
206
+ verifyPropNotAlreadyDefined(acc, item);
207
+ acc.push(item);
208
+ return acc;
209
+ }
210
+ }, [])
211
+ .filter(Boolean);
212
+ }
213
+
214
+ function verifyPropNotAlreadyDefined(
215
+ props: $ReadOnlyArray<PropAST>,
216
+ needleProp: PropAST,
217
+ ) {
218
+ const propName = needleProp.key.name;
219
+ const foundProp = props.some(prop => prop.key.name === propName);
220
+ if (foundProp) {
221
+ throw new Error(`A prop was already defined with the name ${propName}`);
222
+ }
223
+ }
224
+
225
+ function getTypeAnnotation<+T>(
226
+ name: string,
227
+ annotation: $FlowFixMe | ASTNode,
228
+ defaultValue: $FlowFixMe | null,
229
+ withNullDefault: boolean,
230
+ types: TypeDeclarationMap,
231
+ buildSchema: (property: PropAST, types: TypeDeclarationMap) => ?NamedShape<T>,
232
+ ): $FlowFixMe {
233
+ const typeAnnotation = getValueFromTypes(annotation, types);
234
+
235
+ if (
236
+ typeAnnotation.type === 'GenericTypeAnnotation' &&
237
+ typeAnnotation.id.name === '$ReadOnlyArray'
238
+ ) {
239
+ return {
240
+ type: 'ArrayTypeAnnotation',
241
+ elementType: getTypeAnnotationForArray(
242
+ name,
243
+ typeAnnotation.typeParameters.params[0],
244
+ defaultValue,
245
+ types,
246
+ buildSchema,
247
+ ),
248
+ };
249
+ }
250
+
251
+ if (
252
+ typeAnnotation.type === 'GenericTypeAnnotation' &&
253
+ typeAnnotation.id.name === '$ReadOnly'
254
+ ) {
255
+ return {
256
+ type: 'ObjectTypeAnnotation',
257
+ properties: flattenProperties(
258
+ typeAnnotation.typeParameters.params[0].properties,
259
+ types,
260
+ )
261
+ .map(prop => buildSchema(prop, types))
262
+ .filter(Boolean),
263
+ };
264
+ }
265
+
266
+ const type =
267
+ typeAnnotation.type === 'GenericTypeAnnotation'
268
+ ? typeAnnotation.id.name
269
+ : typeAnnotation.type;
270
+
271
+ switch (type) {
272
+ case 'ImageSource':
273
+ return {
274
+ type: 'ReservedPropTypeAnnotation',
275
+ name: 'ImageSourcePrimitive',
276
+ };
277
+ case 'ImageRequest':
278
+ return {
279
+ type: 'ReservedPropTypeAnnotation',
280
+ name: 'ImageRequestPrimitive',
281
+ };
282
+ case 'ColorValue':
283
+ case 'ProcessedColorValue':
284
+ return {
285
+ type: 'ReservedPropTypeAnnotation',
286
+ name: 'ColorPrimitive',
287
+ };
288
+ case 'ColorArrayValue':
289
+ return {
290
+ type: 'ArrayTypeAnnotation',
291
+ elementType: {
292
+ type: 'ReservedPropTypeAnnotation',
293
+ name: 'ColorPrimitive',
294
+ },
295
+ };
296
+ case 'PointValue':
297
+ return {
298
+ type: 'ReservedPropTypeAnnotation',
299
+ name: 'PointPrimitive',
300
+ };
301
+ case 'EdgeInsetsValue':
302
+ return {
303
+ type: 'ReservedPropTypeAnnotation',
304
+ name: 'EdgeInsetsPrimitive',
305
+ };
306
+ case 'Int32':
307
+ return {
308
+ type: 'Int32TypeAnnotation',
309
+ default: ((defaultValue ? defaultValue : 0): number),
310
+ };
311
+ case 'Double':
312
+ return {
313
+ type: 'DoubleTypeAnnotation',
314
+ default: ((defaultValue ? defaultValue : 0): number),
315
+ };
316
+ case 'Float':
317
+ return {
318
+ type: 'FloatTypeAnnotation',
319
+ default: withNullDefault
320
+ ? (defaultValue: number | null)
321
+ : ((defaultValue ? defaultValue : 0): number),
322
+ };
323
+ case 'BooleanTypeAnnotation':
324
+ return {
325
+ type: 'BooleanTypeAnnotation',
326
+ default: withNullDefault
327
+ ? (defaultValue: boolean | null)
328
+ : ((defaultValue == null ? false : defaultValue): boolean),
329
+ };
330
+ case 'StringTypeAnnotation':
331
+ if (typeof defaultValue !== 'undefined') {
332
+ return {
333
+ type: 'StringTypeAnnotation',
334
+ default: (defaultValue: string | null),
335
+ };
336
+ }
337
+ throw new Error(`A default string (or null) is required for "${name}"`);
338
+ case 'Stringish':
339
+ if (typeof defaultValue !== 'undefined') {
340
+ return {
341
+ type: 'StringTypeAnnotation',
342
+ default: (defaultValue: string | null),
343
+ };
344
+ }
345
+ throw new Error(`A default string (or null) is required for "${name}"`);
346
+ case 'UnionTypeAnnotation':
347
+ typeAnnotation.types.reduce((lastType, currType) => {
348
+ if (lastType && currType.type !== lastType.type) {
349
+ throw new Error(`Mixed types are not supported (see "${name}").`);
350
+ }
351
+ return currType;
352
+ });
353
+
354
+ if (defaultValue === null) {
355
+ throw new Error(`A default enum value is required for "${name}"`);
356
+ }
357
+
358
+ const unionType = typeAnnotation.types[0].type;
359
+ if (unionType === 'StringLiteralTypeAnnotation') {
360
+ return {
361
+ type: 'StringEnumTypeAnnotation',
362
+ default: (defaultValue: string),
363
+ options: typeAnnotation.types.map(option => option.value),
364
+ };
365
+ } else if (unionType === 'NumberLiteralTypeAnnotation') {
366
+ return {
367
+ type: 'Int32EnumTypeAnnotation',
368
+ default: (defaultValue: number),
369
+ options: typeAnnotation.types.map(option => option.value),
370
+ };
371
+ } else {
372
+ throw new Error(
373
+ `Unsupported union type for "${name}", received "${unionType}"`,
374
+ );
375
+ }
376
+ case 'ObjectTypeAnnotation':
377
+ throw new Error(
378
+ `Cannot use "${type}" type annotation for "${name}": object types must be declared using $ReadOnly<>`,
379
+ );
380
+ case 'NumberTypeAnnotation':
381
+ throw new Error(
382
+ `Cannot use "${type}" type annotation for "${name}": must use a specific numeric type like Int32, Double, or Float`,
383
+ );
384
+ default:
385
+ (type: empty);
386
+ throw new Error(
387
+ `Unknown property type for "${name}": "${type}" in the State`,
388
+ );
389
+ }
390
+ }
391
+
392
+ type SchemaInfo = {
393
+ name: string,
394
+ optional: boolean,
395
+ typeAnnotation: $FlowFixMe,
396
+ defaultValue: $FlowFixMe,
397
+ withNullDefault: boolean,
398
+ };
399
+
400
+ function getSchemaInfo(
401
+ property: PropAST,
402
+ types: TypeDeclarationMap,
403
+ ): ?SchemaInfo {
404
+ const name = property.key.name;
405
+
406
+ const value = getValueFromTypes(property.value, types);
407
+ let typeAnnotation =
408
+ value.type === 'NullableTypeAnnotation' ? value.typeAnnotation : value;
409
+
410
+ const optional =
411
+ value.type === 'NullableTypeAnnotation' ||
412
+ property.optional ||
413
+ (value.type === 'GenericTypeAnnotation' &&
414
+ typeAnnotation.id.name === 'WithDefault');
415
+
416
+ if (
417
+ !property.optional &&
418
+ value.type === 'GenericTypeAnnotation' &&
419
+ typeAnnotation.id.name === 'WithDefault'
420
+ ) {
421
+ throw new Error(
422
+ `key ${name} must be optional if used with WithDefault<> annotation`,
423
+ );
424
+ }
425
+ if (
426
+ value.type === 'NullableTypeAnnotation' &&
427
+ typeAnnotation.type === 'GenericTypeAnnotation' &&
428
+ typeAnnotation.id.name === 'WithDefault'
429
+ ) {
430
+ throw new Error(
431
+ 'WithDefault<> is optional and does not need to be marked as optional. Please remove the ? annotation in front of it.',
432
+ );
433
+ }
434
+
435
+ let type = typeAnnotation.type;
436
+ if (
437
+ type === 'GenericTypeAnnotation' &&
438
+ (typeAnnotation.id.name === 'DirectEventHandler' ||
439
+ typeAnnotation.id.name === 'BubblingEventHandler')
440
+ ) {
441
+ return null;
442
+ }
443
+
444
+ if (
445
+ name === 'style' &&
446
+ type === 'GenericTypeAnnotation' &&
447
+ typeAnnotation.id.name === 'ViewStyleProp'
448
+ ) {
449
+ return null;
450
+ }
451
+
452
+ let defaultValue = null;
453
+ let withNullDefault = false;
454
+ if (
455
+ type === 'GenericTypeAnnotation' &&
456
+ typeAnnotation.id.name === 'WithDefault'
457
+ ) {
458
+ if (typeAnnotation.typeParameters.params.length === 1) {
459
+ throw new Error(
460
+ `WithDefault requires two parameters, did you forget to provide a default value for "${name}"?`,
461
+ );
462
+ }
463
+
464
+ defaultValue = typeAnnotation.typeParameters.params[1].value;
465
+ const defaultValueType = typeAnnotation.typeParameters.params[1].type;
466
+
467
+ typeAnnotation = typeAnnotation.typeParameters.params[0];
468
+ type =
469
+ typeAnnotation.type === 'GenericTypeAnnotation'
470
+ ? typeAnnotation.id.name
471
+ : typeAnnotation.type;
472
+
473
+ if (defaultValueType === 'NullLiteralTypeAnnotation') {
474
+ defaultValue = null;
475
+ withNullDefault = true;
476
+ }
477
+ }
478
+
479
+ return {
480
+ name,
481
+ optional,
482
+ typeAnnotation,
483
+ defaultValue,
484
+ withNullDefault,
485
+ };
486
+ }
487
+
488
+ // $FlowFixMe[unclear-type] there's no flowtype for ASTs
489
+ type PropAST = Object;
490
+
491
+ module.exports = {
492
+ getProperties,
493
+ getSchemaInfo,
494
+ getTypeAnnotation,
495
+ flattenProperties,
496
+ };