@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,447 @@
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
8
+ * @format
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ import type {
14
+ Nullable,
15
+ NamedShape,
16
+ NativeModuleAliasMap,
17
+ NativeModuleBaseTypeAnnotation,
18
+ NativeModuleEnumDeclaration,
19
+ NativeModuleSchema,
20
+ NativeModuleTypeAnnotation,
21
+ NativeModuleFunctionTypeAnnotation,
22
+ NativeModuleParamTypeAnnotation,
23
+ NativeModulePropertyShape,
24
+ SchemaType,
25
+ } from '../CodegenSchema.js';
26
+
27
+ import type {Parser} from './parser';
28
+ import type {ParserType} from './errors';
29
+ import type {ParserErrorCapturer, TypeDeclarationMap} from './utils';
30
+
31
+ const {
32
+ throwIfPropertyValueTypeIsUnsupported,
33
+ throwIfUnsupportedFunctionParamTypeAnnotationParserError,
34
+ throwIfUnsupportedFunctionReturnTypeAnnotationParserError,
35
+ throwIfModuleTypeIsUnsupported,
36
+ } = require('./error-utils');
37
+
38
+ const {
39
+ MissingTypeParameterGenericParserError,
40
+ MoreThanOneTypeParameterGenericParserError,
41
+ UnsupportedEnumDeclarationParserError,
42
+ UnsupportedGenericParserError,
43
+ UnsupportedObjectPropertyTypeAnnotationParserError,
44
+ UnnamedFunctionParamParserError,
45
+ } = require('./errors');
46
+
47
+ const invariant = require('invariant');
48
+
49
+ function wrapModuleSchema(
50
+ nativeModuleSchema: NativeModuleSchema,
51
+ hasteModuleName: string,
52
+ ): SchemaType {
53
+ return {
54
+ modules: {
55
+ [hasteModuleName]: nativeModuleSchema,
56
+ },
57
+ };
58
+ }
59
+
60
+ function unwrapNullable<+T: NativeModuleTypeAnnotation>(
61
+ x: Nullable<T>,
62
+ ): [T, boolean] {
63
+ if (x.type === 'NullableTypeAnnotation') {
64
+ return [x.typeAnnotation, true];
65
+ }
66
+
67
+ return [x, false];
68
+ }
69
+
70
+ function wrapNullable<+T: NativeModuleTypeAnnotation>(
71
+ nullable: boolean,
72
+ typeAnnotation: T,
73
+ ): Nullable<T> {
74
+ if (!nullable) {
75
+ return typeAnnotation;
76
+ }
77
+
78
+ return {
79
+ type: 'NullableTypeAnnotation',
80
+ typeAnnotation,
81
+ };
82
+ }
83
+
84
+ function assertGenericTypeAnnotationHasExactlyOneTypeParameter(
85
+ moduleName: string,
86
+ /**
87
+ * TODO(T108222691): Use flow-types for @babel/parser
88
+ */
89
+ typeAnnotation: $FlowFixMe,
90
+ parser: Parser,
91
+ ) {
92
+ if (typeAnnotation.typeParameters == null) {
93
+ throw new MissingTypeParameterGenericParserError(
94
+ moduleName,
95
+ typeAnnotation,
96
+ parser,
97
+ );
98
+ }
99
+
100
+ const typeAnnotationType = parser.typeParameterInstantiation;
101
+
102
+ invariant(
103
+ typeAnnotation.typeParameters.type === typeAnnotationType,
104
+ `assertGenericTypeAnnotationHasExactlyOneTypeParameter: Type parameters must be an AST node of type '${typeAnnotationType}'`,
105
+ );
106
+
107
+ if (typeAnnotation.typeParameters.params.length !== 1) {
108
+ throw new MoreThanOneTypeParameterGenericParserError(
109
+ moduleName,
110
+ typeAnnotation,
111
+ parser,
112
+ );
113
+ }
114
+ }
115
+
116
+ function isObjectProperty(property: $FlowFixMe, language: ParserType): boolean {
117
+ switch (language) {
118
+ case 'Flow':
119
+ return (
120
+ property.type === 'ObjectTypeProperty' ||
121
+ property.type === 'ObjectTypeIndexer'
122
+ );
123
+ case 'TypeScript':
124
+ return (
125
+ property.type === 'TSPropertySignature' ||
126
+ property.type === 'TSIndexSignature'
127
+ );
128
+ default:
129
+ return false;
130
+ }
131
+ }
132
+
133
+ function parseObjectProperty(
134
+ property: $FlowFixMe,
135
+ hasteModuleName: string,
136
+ types: TypeDeclarationMap,
137
+ aliasMap: {...NativeModuleAliasMap},
138
+ tryParse: ParserErrorCapturer,
139
+ cxxOnly: boolean,
140
+ nullable: boolean,
141
+ translateTypeAnnotation: $FlowFixMe,
142
+ parser: Parser,
143
+ ): NamedShape<Nullable<NativeModuleBaseTypeAnnotation>> {
144
+ const language = parser.language();
145
+
146
+ if (!isObjectProperty(property, language)) {
147
+ throw new UnsupportedObjectPropertyTypeAnnotationParserError(
148
+ hasteModuleName,
149
+ property,
150
+ property.type,
151
+ language,
152
+ );
153
+ }
154
+
155
+ const {optional = false} = property;
156
+ const name = parser.getKeyName(property, hasteModuleName);
157
+ const languageTypeAnnotation =
158
+ language === 'TypeScript'
159
+ ? property.typeAnnotation.typeAnnotation
160
+ : property.value;
161
+
162
+ if (
163
+ property.type === 'ObjectTypeIndexer' ||
164
+ property.type === 'TSIndexSignature'
165
+ ) {
166
+ return {
167
+ name,
168
+ optional,
169
+ typeAnnotation: wrapNullable(nullable, {
170
+ type: 'GenericObjectTypeAnnotation',
171
+ }), //TODO: use `emitObject` for typeAnnotation
172
+ };
173
+ }
174
+
175
+ const [propertyTypeAnnotation, isPropertyNullable] =
176
+ unwrapNullable<$FlowFixMe>(
177
+ translateTypeAnnotation(
178
+ hasteModuleName,
179
+ languageTypeAnnotation,
180
+ types,
181
+ aliasMap,
182
+ tryParse,
183
+ cxxOnly,
184
+ ),
185
+ );
186
+
187
+ if (
188
+ propertyTypeAnnotation.type === 'FunctionTypeAnnotation' ||
189
+ propertyTypeAnnotation.type === 'PromiseTypeAnnotation' ||
190
+ propertyTypeAnnotation.type === 'VoidTypeAnnotation'
191
+ ) {
192
+ throwIfPropertyValueTypeIsUnsupported(
193
+ hasteModuleName,
194
+ languageTypeAnnotation,
195
+ property.key,
196
+ propertyTypeAnnotation.type,
197
+ language,
198
+ );
199
+ }
200
+
201
+ return {
202
+ name,
203
+ optional,
204
+ typeAnnotation: wrapNullable(isPropertyNullable, propertyTypeAnnotation),
205
+ };
206
+ }
207
+
208
+ function translateDefault(
209
+ hasteModuleName: string,
210
+ typeAnnotation: $FlowFixMe,
211
+ types: TypeDeclarationMap,
212
+ nullable: boolean,
213
+ parser: Parser,
214
+ ): Nullable<NativeModuleEnumDeclaration> {
215
+ const maybeEnumDeclaration =
216
+ types[parser.nameForGenericTypeAnnotation(typeAnnotation)];
217
+
218
+ if (maybeEnumDeclaration && parser.isEnumDeclaration(maybeEnumDeclaration)) {
219
+ const memberType = parser.getMaybeEnumMemberType(maybeEnumDeclaration);
220
+
221
+ if (
222
+ memberType === 'NumberTypeAnnotation' ||
223
+ memberType === 'StringTypeAnnotation'
224
+ ) {
225
+ return wrapNullable(nullable, {
226
+ type: 'EnumDeclaration',
227
+ memberType: memberType,
228
+ });
229
+ } else {
230
+ throw new UnsupportedEnumDeclarationParserError(
231
+ hasteModuleName,
232
+ typeAnnotation,
233
+ memberType,
234
+ parser.language(),
235
+ );
236
+ }
237
+ }
238
+
239
+ throw new UnsupportedGenericParserError(
240
+ hasteModuleName,
241
+ typeAnnotation,
242
+ parser,
243
+ );
244
+ }
245
+
246
+ function getTypeAnnotationParameters(
247
+ typeAnnotation: $FlowFixMe,
248
+ language: ParserType,
249
+ ): $ReadOnlyArray<$FlowFixMe> {
250
+ return language === 'Flow'
251
+ ? typeAnnotation.params
252
+ : typeAnnotation.parameters;
253
+ }
254
+
255
+ function getFunctionNameFromParameter(
256
+ param: NamedShape<Nullable<NativeModuleParamTypeAnnotation>>,
257
+ language: ParserType,
258
+ ): $FlowFixMe {
259
+ return language === 'Flow' ? param.name : param.typeAnnotation;
260
+ }
261
+
262
+ function getParameterName(param: $FlowFixMe, language: ParserType): string {
263
+ return language === 'Flow' ? param.name.name : param.name;
264
+ }
265
+
266
+ function getParameterTypeAnnotation(
267
+ param: $FlowFixMe,
268
+ language: ParserType,
269
+ ): $FlowFixMe {
270
+ return language === 'Flow'
271
+ ? param.typeAnnotation
272
+ : param.typeAnnotation.typeAnnotation;
273
+ }
274
+
275
+ function getTypeAnnotationReturnType(
276
+ typeAnnotation: $FlowFixMe,
277
+ language: ParserType,
278
+ ): $FlowFixMe {
279
+ return language === 'Flow'
280
+ ? typeAnnotation.returnType
281
+ : typeAnnotation.typeAnnotation.typeAnnotation;
282
+ }
283
+
284
+ function translateFunctionTypeAnnotation(
285
+ hasteModuleName: string,
286
+ // TODO(T108222691): Use flow-types for @babel/parser
287
+ // TODO(T71778680): This is a FunctionTypeAnnotation. Type this.
288
+ typeAnnotation: $FlowFixMe,
289
+ types: TypeDeclarationMap,
290
+ aliasMap: {...NativeModuleAliasMap},
291
+ tryParse: ParserErrorCapturer,
292
+ cxxOnly: boolean,
293
+ translateTypeAnnotation: $FlowFixMe,
294
+ language: ParserType,
295
+ ): NativeModuleFunctionTypeAnnotation {
296
+ type Param = NamedShape<Nullable<NativeModuleParamTypeAnnotation>>;
297
+ const params: Array<Param> = [];
298
+
299
+ for (const param of getTypeAnnotationParameters(typeAnnotation, language)) {
300
+ const parsedParam = tryParse(() => {
301
+ if (getFunctionNameFromParameter(param, language) == null) {
302
+ throw new UnnamedFunctionParamParserError(
303
+ param,
304
+ hasteModuleName,
305
+ language,
306
+ );
307
+ }
308
+
309
+ const paramName = getParameterName(param, language);
310
+
311
+ const [paramTypeAnnotation, isParamTypeAnnotationNullable] =
312
+ unwrapNullable<$FlowFixMe>(
313
+ translateTypeAnnotation(
314
+ hasteModuleName,
315
+ getParameterTypeAnnotation(param, language),
316
+ types,
317
+ aliasMap,
318
+ tryParse,
319
+ cxxOnly,
320
+ ),
321
+ );
322
+
323
+ if (
324
+ paramTypeAnnotation.type === 'VoidTypeAnnotation' ||
325
+ paramTypeAnnotation.type === 'PromiseTypeAnnotation'
326
+ ) {
327
+ return throwIfUnsupportedFunctionParamTypeAnnotationParserError(
328
+ hasteModuleName,
329
+ param.typeAnnotation,
330
+ paramName,
331
+ paramTypeAnnotation.type,
332
+ );
333
+ }
334
+
335
+ return {
336
+ name: paramName,
337
+ optional: Boolean(param.optional),
338
+ typeAnnotation: wrapNullable(
339
+ isParamTypeAnnotationNullable,
340
+ paramTypeAnnotation,
341
+ ),
342
+ };
343
+ });
344
+
345
+ if (parsedParam != null) {
346
+ params.push(parsedParam);
347
+ }
348
+ }
349
+
350
+ const [returnTypeAnnotation, isReturnTypeAnnotationNullable] =
351
+ unwrapNullable<$FlowFixMe>(
352
+ translateTypeAnnotation(
353
+ hasteModuleName,
354
+ getTypeAnnotationReturnType(typeAnnotation, language),
355
+ types,
356
+ aliasMap,
357
+ tryParse,
358
+ cxxOnly,
359
+ ),
360
+ );
361
+
362
+ throwIfUnsupportedFunctionReturnTypeAnnotationParserError(
363
+ hasteModuleName,
364
+ typeAnnotation,
365
+ 'FunctionTypeAnnotation',
366
+ language,
367
+ cxxOnly,
368
+ returnTypeAnnotation.type,
369
+ );
370
+
371
+ return {
372
+ type: 'FunctionTypeAnnotation',
373
+ returnTypeAnnotation: wrapNullable(
374
+ isReturnTypeAnnotationNullable,
375
+ returnTypeAnnotation,
376
+ ),
377
+ params,
378
+ };
379
+ }
380
+
381
+ function buildPropertySchema(
382
+ hasteModuleName: string,
383
+ // TODO(T108222691): [TS] Use flow-types for @babel/parser
384
+ // TODO(T71778680): [Flow] This is an ObjectTypeProperty containing either:
385
+ // - a FunctionTypeAnnotation or GenericTypeAnnotation
386
+ // - a NullableTypeAnnoation containing a FunctionTypeAnnotation or GenericTypeAnnotation
387
+ // Flow type this node
388
+ property: $FlowFixMe,
389
+ types: TypeDeclarationMap,
390
+ aliasMap: {...NativeModuleAliasMap},
391
+ tryParse: ParserErrorCapturer,
392
+ cxxOnly: boolean,
393
+ language: ParserType,
394
+ resolveTypeAnnotation: $FlowFixMe,
395
+ translateTypeAnnotation: $FlowFixMe,
396
+ ): NativeModulePropertyShape {
397
+ let nullable: boolean = false;
398
+ let {key, value} = property;
399
+ const methodName: string = key.name;
400
+
401
+ if (language === 'TypeScript') {
402
+ value =
403
+ property.type === 'TSMethodSignature'
404
+ ? property
405
+ : property.typeAnnotation;
406
+ }
407
+
408
+ ({nullable, typeAnnotation: value} = resolveTypeAnnotation(value, types));
409
+
410
+ throwIfModuleTypeIsUnsupported(
411
+ hasteModuleName,
412
+ property.value,
413
+ key.name,
414
+ value.type,
415
+ language,
416
+ );
417
+
418
+ return {
419
+ name: methodName,
420
+ optional: Boolean(property.optional),
421
+ typeAnnotation: wrapNullable(
422
+ nullable,
423
+ translateFunctionTypeAnnotation(
424
+ hasteModuleName,
425
+ value,
426
+ types,
427
+ aliasMap,
428
+ tryParse,
429
+ cxxOnly,
430
+ translateTypeAnnotation,
431
+ language,
432
+ ),
433
+ ),
434
+ };
435
+ }
436
+
437
+ module.exports = {
438
+ wrapModuleSchema,
439
+ unwrapNullable,
440
+ wrapNullable,
441
+ assertGenericTypeAnnotationHasExactlyOneTypeParameter,
442
+ isObjectProperty,
443
+ parseObjectProperty,
444
+ translateDefault,
445
+ translateFunctionTypeAnnotation,
446
+ buildPropertySchema,
447
+ };