@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,420 @@
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
+ NamedShape,
15
+ NativeModuleAliasMap,
16
+ NativeModuleBaseTypeAnnotation,
17
+ NativeModuleTypeAnnotation,
18
+ NativeModulePropertyShape,
19
+ NativeModuleSchema,
20
+ Nullable,
21
+ } from '../../../CodegenSchema';
22
+ import type {ParserErrorCapturer, TypeDeclarationMap} from '../../utils';
23
+
24
+ const {visit, isModuleRegistryCall, verifyPlatforms} = require('../../utils');
25
+ const {resolveTypeAnnotation, getTypes} = require('../utils');
26
+ const {
27
+ unwrapNullable,
28
+ wrapNullable,
29
+ assertGenericTypeAnnotationHasExactlyOneTypeParameter,
30
+ parseObjectProperty,
31
+ translateDefault,
32
+ buildPropertySchema,
33
+ } = require('../../parsers-commons');
34
+ const {
35
+ emitArrayType,
36
+ emitBoolean,
37
+ emitDouble,
38
+ emitFloat,
39
+ emitFunction,
40
+ emitNumber,
41
+ emitInt32,
42
+ emitObject,
43
+ emitPromise,
44
+ emitRootTag,
45
+ emitVoid,
46
+ emitString,
47
+ emitStringish,
48
+ emitMixed,
49
+ emitUnion,
50
+ typeAliasResolution,
51
+ translateArrayTypeAnnotation,
52
+ } = require('../../parsers-primitives');
53
+
54
+ const {
55
+ UnsupportedTypeAnnotationParserError,
56
+ IncorrectModuleRegistryCallArgumentTypeParserError,
57
+ } = require('../../errors');
58
+
59
+ const {
60
+ throwIfModuleInterfaceNotFound,
61
+ throwIfModuleInterfaceIsMisnamed,
62
+ throwIfUnusedModuleInterfaceParserError,
63
+ throwIfWrongNumberOfCallExpressionArgs,
64
+ throwIfMoreThanOneModuleRegistryCalls,
65
+ throwIfIncorrectModuleRegistryCallTypeParameterParserError,
66
+ throwIfUntypedModule,
67
+ throwIfMoreThanOneModuleInterfaceParserError,
68
+ } = require('../../error-utils');
69
+
70
+ const {FlowParser} = require('../parser');
71
+
72
+ const language = 'Flow';
73
+ const parser = new FlowParser();
74
+
75
+ function translateTypeAnnotation(
76
+ hasteModuleName: string,
77
+ /**
78
+ * TODO(T71778680): Flow-type this node.
79
+ */
80
+ flowTypeAnnotation: $FlowFixMe,
81
+ types: TypeDeclarationMap,
82
+ aliasMap: {...NativeModuleAliasMap},
83
+ tryParse: ParserErrorCapturer,
84
+ cxxOnly: boolean,
85
+ ): Nullable<NativeModuleTypeAnnotation> {
86
+ const {nullable, typeAnnotation, typeAliasResolutionStatus} =
87
+ resolveTypeAnnotation(flowTypeAnnotation, types);
88
+
89
+ switch (typeAnnotation.type) {
90
+ case 'GenericTypeAnnotation': {
91
+ switch (typeAnnotation.id.name) {
92
+ case 'RootTag': {
93
+ return emitRootTag(nullable);
94
+ }
95
+ case 'Promise': {
96
+ return emitPromise(
97
+ hasteModuleName,
98
+ typeAnnotation,
99
+ parser,
100
+ nullable,
101
+ types,
102
+ aliasMap,
103
+ tryParse,
104
+ cxxOnly,
105
+ translateTypeAnnotation,
106
+ );
107
+ }
108
+ case 'Array':
109
+ case '$ReadOnlyArray': {
110
+ return emitArrayType(
111
+ hasteModuleName,
112
+ typeAnnotation,
113
+ parser,
114
+ types,
115
+ aliasMap,
116
+ cxxOnly,
117
+ nullable,
118
+ translateTypeAnnotation,
119
+ );
120
+ }
121
+ case '$ReadOnly': {
122
+ assertGenericTypeAnnotationHasExactlyOneTypeParameter(
123
+ hasteModuleName,
124
+ typeAnnotation,
125
+ parser,
126
+ );
127
+
128
+ const [paramType, isParamNullable] = unwrapNullable(
129
+ translateTypeAnnotation(
130
+ hasteModuleName,
131
+ typeAnnotation.typeParameters.params[0],
132
+ types,
133
+ aliasMap,
134
+ tryParse,
135
+ cxxOnly,
136
+ ),
137
+ );
138
+
139
+ return wrapNullable(nullable || isParamNullable, paramType);
140
+ }
141
+ case 'Stringish': {
142
+ return emitStringish(nullable);
143
+ }
144
+ case 'Int32': {
145
+ return emitInt32(nullable);
146
+ }
147
+ case 'Double': {
148
+ return emitDouble(nullable);
149
+ }
150
+ case 'Float': {
151
+ return emitFloat(nullable);
152
+ }
153
+ case 'UnsafeObject':
154
+ case 'Object': {
155
+ return emitObject(nullable);
156
+ }
157
+ default: {
158
+ return translateDefault(
159
+ hasteModuleName,
160
+ typeAnnotation,
161
+ types,
162
+ nullable,
163
+ parser,
164
+ );
165
+ }
166
+ }
167
+ }
168
+ case 'ObjectTypeAnnotation': {
169
+ const objectTypeAnnotation = {
170
+ type: 'ObjectTypeAnnotation',
171
+ // $FlowFixMe[missing-type-arg]
172
+ properties: ([
173
+ ...typeAnnotation.properties,
174
+ ...typeAnnotation.indexers,
175
+ ]: Array<$FlowFixMe>)
176
+ .map<?NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>>(
177
+ property => {
178
+ return tryParse(() => {
179
+ return parseObjectProperty(
180
+ property,
181
+ hasteModuleName,
182
+ types,
183
+ aliasMap,
184
+ tryParse,
185
+ cxxOnly,
186
+ nullable,
187
+ translateTypeAnnotation,
188
+ parser,
189
+ );
190
+ });
191
+ },
192
+ )
193
+ .filter(Boolean),
194
+ };
195
+
196
+ return typeAliasResolution(
197
+ typeAliasResolutionStatus,
198
+ objectTypeAnnotation,
199
+ aliasMap,
200
+ nullable,
201
+ );
202
+ }
203
+ case 'BooleanTypeAnnotation': {
204
+ return emitBoolean(nullable);
205
+ }
206
+ case 'NumberTypeAnnotation': {
207
+ return emitNumber(nullable);
208
+ }
209
+ case 'VoidTypeAnnotation': {
210
+ return emitVoid(nullable);
211
+ }
212
+ case 'StringTypeAnnotation': {
213
+ return emitString(nullable);
214
+ }
215
+ case 'FunctionTypeAnnotation': {
216
+ return emitFunction(
217
+ nullable,
218
+ hasteModuleName,
219
+ typeAnnotation,
220
+ types,
221
+ aliasMap,
222
+ tryParse,
223
+ cxxOnly,
224
+ translateTypeAnnotation,
225
+ language,
226
+ );
227
+ }
228
+ case 'UnionTypeAnnotation': {
229
+ return emitUnion(nullable, hasteModuleName, typeAnnotation, parser);
230
+ }
231
+ case 'StringLiteralTypeAnnotation': {
232
+ // 'a' is a special case for 'a' | 'b' but the type name is different
233
+ return wrapNullable(nullable, {
234
+ type: 'UnionTypeAnnotation',
235
+ memberType: 'StringTypeAnnotation',
236
+ });
237
+ }
238
+ case 'MixedTypeAnnotation': {
239
+ if (cxxOnly) {
240
+ return emitMixed(nullable);
241
+ }
242
+ // Fallthrough
243
+ }
244
+ default: {
245
+ throw new UnsupportedTypeAnnotationParserError(
246
+ hasteModuleName,
247
+ typeAnnotation,
248
+ language,
249
+ );
250
+ }
251
+ }
252
+ }
253
+
254
+ function isModuleInterface(node: $FlowFixMe) {
255
+ return (
256
+ node.type === 'InterfaceDeclaration' &&
257
+ node.extends.length === 1 &&
258
+ node.extends[0].type === 'InterfaceExtends' &&
259
+ node.extends[0].id.name === 'TurboModule'
260
+ );
261
+ }
262
+
263
+ function buildModuleSchema(
264
+ hasteModuleName: string,
265
+ /**
266
+ * TODO(T71778680): Flow-type this node.
267
+ */
268
+ ast: $FlowFixMe,
269
+ tryParse: ParserErrorCapturer,
270
+ ): NativeModuleSchema {
271
+ const types = getTypes(ast);
272
+ const moduleSpecs = (Object.values(types): $ReadOnlyArray<$FlowFixMe>).filter(
273
+ isModuleInterface,
274
+ );
275
+
276
+ throwIfModuleInterfaceNotFound(
277
+ moduleSpecs.length,
278
+ hasteModuleName,
279
+ ast,
280
+ language,
281
+ );
282
+
283
+ throwIfMoreThanOneModuleInterfaceParserError(
284
+ hasteModuleName,
285
+ moduleSpecs,
286
+ language,
287
+ );
288
+
289
+ const [moduleSpec] = moduleSpecs;
290
+
291
+ throwIfModuleInterfaceIsMisnamed(hasteModuleName, moduleSpec.id, language);
292
+
293
+ // Parse Module Name
294
+ const moduleName = ((): string => {
295
+ const callExpressions = [];
296
+ visit(ast, {
297
+ CallExpression(node) {
298
+ if (isModuleRegistryCall(node)) {
299
+ callExpressions.push(node);
300
+ }
301
+ },
302
+ });
303
+
304
+ throwIfUnusedModuleInterfaceParserError(
305
+ hasteModuleName,
306
+ moduleSpec,
307
+ callExpressions,
308
+ language,
309
+ );
310
+
311
+ throwIfMoreThanOneModuleRegistryCalls(
312
+ hasteModuleName,
313
+ callExpressions,
314
+ callExpressions.length,
315
+ language,
316
+ );
317
+
318
+ const [callExpression] = callExpressions;
319
+ const {typeArguments} = callExpression;
320
+ const methodName = callExpression.callee.property.name;
321
+
322
+ throwIfWrongNumberOfCallExpressionArgs(
323
+ hasteModuleName,
324
+ callExpression,
325
+ methodName,
326
+ callExpression.arguments.length,
327
+ language,
328
+ );
329
+
330
+ if (callExpression.arguments[0].type !== 'Literal') {
331
+ const {type} = callExpression.arguments[0];
332
+ throw new IncorrectModuleRegistryCallArgumentTypeParserError(
333
+ hasteModuleName,
334
+ callExpression.arguments[0],
335
+ methodName,
336
+ type,
337
+ language,
338
+ );
339
+ }
340
+
341
+ const $moduleName = callExpression.arguments[0].value;
342
+
343
+ throwIfUntypedModule(
344
+ typeArguments,
345
+ hasteModuleName,
346
+ callExpression,
347
+ methodName,
348
+ $moduleName,
349
+ language,
350
+ );
351
+
352
+ throwIfIncorrectModuleRegistryCallTypeParameterParserError(
353
+ hasteModuleName,
354
+ typeArguments,
355
+ methodName,
356
+ $moduleName,
357
+ parser,
358
+ );
359
+
360
+ return $moduleName;
361
+ })();
362
+
363
+ // Some module names use platform suffix to indicate platform-exclusive modules.
364
+ // Eventually this should be made explicit in the Flow type itself.
365
+ // Also check the hasteModuleName for platform suffix.
366
+ // Note: this shape is consistent with ComponentSchema.
367
+ const {cxxOnly, excludedPlatforms} = verifyPlatforms(
368
+ hasteModuleName,
369
+ moduleName,
370
+ );
371
+
372
+ // $FlowFixMe[missing-type-arg]
373
+ return (moduleSpec.body.properties: $ReadOnlyArray<$FlowFixMe>)
374
+ .filter(property => property.type === 'ObjectTypeProperty')
375
+ .map<?{
376
+ aliasMap: NativeModuleAliasMap,
377
+ propertyShape: NativeModulePropertyShape,
378
+ }>(property => {
379
+ const aliasMap: {...NativeModuleAliasMap} = {};
380
+ return tryParse(() => ({
381
+ aliasMap: aliasMap,
382
+ propertyShape: buildPropertySchema(
383
+ hasteModuleName,
384
+ property,
385
+ types,
386
+ aliasMap,
387
+ tryParse,
388
+ cxxOnly,
389
+ language,
390
+ resolveTypeAnnotation,
391
+ translateTypeAnnotation,
392
+ ),
393
+ }));
394
+ })
395
+ .filter(Boolean)
396
+ .reduce(
397
+ (moduleSchema: NativeModuleSchema, {aliasMap, propertyShape}) => ({
398
+ type: 'NativeModule',
399
+ aliases: {...moduleSchema.aliases, ...aliasMap},
400
+ spec: {
401
+ properties: [...moduleSchema.spec.properties, propertyShape],
402
+ },
403
+ moduleName: moduleSchema.moduleName,
404
+ excludedPlatforms: moduleSchema.excludedPlatforms,
405
+ }),
406
+ {
407
+ type: 'NativeModule',
408
+ aliases: {},
409
+ spec: {properties: []},
410
+ moduleName,
411
+ excludedPlatforms:
412
+ excludedPlatforms.length !== 0 ? [...excludedPlatforms] : undefined,
413
+ },
414
+ );
415
+ }
416
+
417
+ module.exports = {
418
+ buildModuleSchema,
419
+ flowTranslateTypeAnnotation: translateTypeAnnotation,
420
+ };
@@ -0,0 +1,109 @@
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
+ function _defineProperty(obj, key, value) {
14
+ key = _toPropertyKey(key);
15
+ if (key in obj) {
16
+ Object.defineProperty(obj, key, {
17
+ value: value,
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true,
21
+ });
22
+ } else {
23
+ obj[key] = value;
24
+ }
25
+ return obj;
26
+ }
27
+ function _toPropertyKey(arg) {
28
+ var key = _toPrimitive(arg, 'string');
29
+ return typeof key === 'symbol' ? key : String(key);
30
+ }
31
+ function _toPrimitive(input, hint) {
32
+ if (typeof input !== 'object' || input === null) return input;
33
+ var prim = input[Symbol.toPrimitive];
34
+ if (prim !== undefined) {
35
+ var res = prim.call(input, hint || 'default');
36
+ if (typeof res !== 'object') return res;
37
+ throw new TypeError('@@toPrimitive must return a primitive value.');
38
+ }
39
+ return (hint === 'string' ? String : Number)(input);
40
+ }
41
+ const _require = require('../errors'),
42
+ UnsupportedObjectPropertyTypeAnnotationParserError =
43
+ _require.UnsupportedObjectPropertyTypeAnnotationParserError;
44
+ class FlowParser {
45
+ constructor() {
46
+ _defineProperty(
47
+ this,
48
+ 'typeParameterInstantiation',
49
+ 'TypeParameterInstantiation',
50
+ );
51
+ }
52
+ getKeyName(propertyOrIndex, hasteModuleName) {
53
+ var _propertyOrIndex$id$n, _propertyOrIndex$id;
54
+ switch (propertyOrIndex.type) {
55
+ case 'ObjectTypeProperty':
56
+ return propertyOrIndex.key.name;
57
+ case 'ObjectTypeIndexer':
58
+ // flow index name is optional
59
+ return (_propertyOrIndex$id$n =
60
+ (_propertyOrIndex$id = propertyOrIndex.id) === null ||
61
+ _propertyOrIndex$id === void 0
62
+ ? void 0
63
+ : _propertyOrIndex$id.name) !== null &&
64
+ _propertyOrIndex$id$n !== void 0
65
+ ? _propertyOrIndex$id$n
66
+ : 'key';
67
+ default:
68
+ throw new UnsupportedObjectPropertyTypeAnnotationParserError(
69
+ hasteModuleName,
70
+ propertyOrIndex,
71
+ propertyOrIndex.type,
72
+ this.language(),
73
+ );
74
+ }
75
+ }
76
+ getMaybeEnumMemberType(maybeEnumDeclaration) {
77
+ return maybeEnumDeclaration.body.type
78
+ .replace('EnumNumberBody', 'NumberTypeAnnotation')
79
+ .replace('EnumStringBody', 'StringTypeAnnotation');
80
+ }
81
+ isEnumDeclaration(maybeEnumDeclaration) {
82
+ return maybeEnumDeclaration.type === 'EnumDeclaration';
83
+ }
84
+ language() {
85
+ return 'Flow';
86
+ }
87
+ nameForGenericTypeAnnotation(typeAnnotation) {
88
+ return typeAnnotation.id.name;
89
+ }
90
+ checkIfInvalidModule(typeArguments) {
91
+ return (
92
+ typeArguments.type !== 'TypeParameterInstantiation' ||
93
+ typeArguments.params.length !== 1 ||
94
+ typeArguments.params[0].type !== 'GenericTypeAnnotation' ||
95
+ typeArguments.params[0].id.name !== 'Spec'
96
+ );
97
+ }
98
+ remapUnionTypeAnnotationMemberNames(membersTypes) {
99
+ const remapLiteral = item => {
100
+ return item.type
101
+ .replace('NumberLiteralTypeAnnotation', 'NumberTypeAnnotation')
102
+ .replace('StringLiteralTypeAnnotation', 'StringTypeAnnotation');
103
+ };
104
+ return [...new Set(membersTypes.map(remapLiteral))];
105
+ }
106
+ }
107
+ module.exports = {
108
+ FlowParser,
109
+ };
@@ -0,0 +1,83 @@
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 {UnionTypeAnnotationMemberType} from '../../CodegenSchema.js';
14
+ import type {ParserType} from '../errors';
15
+ import type {Parser} from '../parser';
16
+
17
+ const {
18
+ UnsupportedObjectPropertyTypeAnnotationParserError,
19
+ } = require('../errors');
20
+
21
+ class FlowParser implements Parser {
22
+ typeParameterInstantiation: string = 'TypeParameterInstantiation';
23
+
24
+ getKeyName(propertyOrIndex: $FlowFixMe, hasteModuleName: string): string {
25
+ switch (propertyOrIndex.type) {
26
+ case 'ObjectTypeProperty':
27
+ return propertyOrIndex.key.name;
28
+ case 'ObjectTypeIndexer':
29
+ // flow index name is optional
30
+ return propertyOrIndex.id?.name ?? 'key';
31
+ default:
32
+ throw new UnsupportedObjectPropertyTypeAnnotationParserError(
33
+ hasteModuleName,
34
+ propertyOrIndex,
35
+ propertyOrIndex.type,
36
+ this.language(),
37
+ );
38
+ }
39
+ }
40
+
41
+ getMaybeEnumMemberType(maybeEnumDeclaration: $FlowFixMe): string {
42
+ return maybeEnumDeclaration.body.type
43
+ .replace('EnumNumberBody', 'NumberTypeAnnotation')
44
+ .replace('EnumStringBody', 'StringTypeAnnotation');
45
+ }
46
+
47
+ isEnumDeclaration(maybeEnumDeclaration: $FlowFixMe): boolean {
48
+ return maybeEnumDeclaration.type === 'EnumDeclaration';
49
+ }
50
+
51
+ language(): ParserType {
52
+ return 'Flow';
53
+ }
54
+
55
+ nameForGenericTypeAnnotation(typeAnnotation: $FlowFixMe): string {
56
+ return typeAnnotation.id.name;
57
+ }
58
+
59
+ checkIfInvalidModule(typeArguments: $FlowFixMe): boolean {
60
+ return (
61
+ typeArguments.type !== 'TypeParameterInstantiation' ||
62
+ typeArguments.params.length !== 1 ||
63
+ typeArguments.params[0].type !== 'GenericTypeAnnotation' ||
64
+ typeArguments.params[0].id.name !== 'Spec'
65
+ );
66
+ }
67
+
68
+ remapUnionTypeAnnotationMemberNames(
69
+ membersTypes: $FlowFixMe[],
70
+ ): UnionTypeAnnotationMemberType[] {
71
+ const remapLiteral = (item: $FlowFixMe) => {
72
+ return item.type
73
+ .replace('NumberLiteralTypeAnnotation', 'NumberTypeAnnotation')
74
+ .replace('StringLiteralTypeAnnotation', 'StringTypeAnnotation');
75
+ };
76
+
77
+ return [...new Set(membersTypes.map(remapLiteral))];
78
+ }
79
+ }
80
+
81
+ module.exports = {
82
+ FlowParser,
83
+ };
@@ -0,0 +1,108 @@
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
+ /**
14
+ * This FlowFixMe is supposed to refer to an InterfaceDeclaration or TypeAlias
15
+ * declaration type. Unfortunately, we don't have those types, because flow-parser
16
+ * generates them, and flow-parser is not type-safe. In the future, we should find
17
+ * a way to get these types from our flow parser library.
18
+ *
19
+ * TODO(T71778680): Flow type AST Nodes
20
+ */
21
+
22
+ function getTypes(ast) {
23
+ return ast.body.reduce((types, node) => {
24
+ if (node.type === 'ExportNamedDeclaration' && node.exportKind === 'type') {
25
+ if (
26
+ node.declaration != null &&
27
+ (node.declaration.type === 'TypeAlias' ||
28
+ node.declaration.type === 'InterfaceDeclaration')
29
+ ) {
30
+ types[node.declaration.id.name] = node.declaration;
31
+ }
32
+ } else if (
33
+ node.type === 'ExportNamedDeclaration' &&
34
+ node.exportKind === 'value' &&
35
+ node.declaration &&
36
+ node.declaration.type === 'EnumDeclaration'
37
+ ) {
38
+ types[node.declaration.id.name] = node.declaration;
39
+ } else if (
40
+ node.type === 'TypeAlias' ||
41
+ node.type === 'InterfaceDeclaration' ||
42
+ node.type === 'EnumDeclaration'
43
+ ) {
44
+ types[node.id.name] = node;
45
+ }
46
+ return types;
47
+ }, {});
48
+ }
49
+
50
+ // $FlowFixMe[unclear-type] there's no flowtype for ASTs
51
+
52
+ const invariant = require('invariant');
53
+ function resolveTypeAnnotation(
54
+ // TODO(T71778680): This is an Flow TypeAnnotation. Flow-type this
55
+ typeAnnotation,
56
+ types,
57
+ ) {
58
+ invariant(
59
+ typeAnnotation != null,
60
+ 'resolveTypeAnnotation(): typeAnnotation cannot be null',
61
+ );
62
+ let node = typeAnnotation;
63
+ let nullable = false;
64
+ let typeAliasResolutionStatus = {
65
+ successful: false,
66
+ };
67
+ for (;;) {
68
+ if (node.type === 'NullableTypeAnnotation') {
69
+ nullable = true;
70
+ node = node.typeAnnotation;
71
+ } else if (node.type === 'GenericTypeAnnotation') {
72
+ typeAliasResolutionStatus = {
73
+ successful: true,
74
+ aliasName: node.id.name,
75
+ };
76
+ const resolvedTypeAnnotation = types[node.id.name];
77
+ if (
78
+ resolvedTypeAnnotation == null ||
79
+ resolvedTypeAnnotation.type === 'EnumDeclaration'
80
+ ) {
81
+ break;
82
+ }
83
+ invariant(
84
+ resolvedTypeAnnotation.type === 'TypeAlias',
85
+ `GenericTypeAnnotation '${node.id.name}' must resolve to a TypeAlias. Instead, it resolved to a '${resolvedTypeAnnotation.type}'`,
86
+ );
87
+ node = resolvedTypeAnnotation.right;
88
+ } else {
89
+ break;
90
+ }
91
+ }
92
+ return {
93
+ nullable: nullable,
94
+ typeAnnotation: node,
95
+ typeAliasResolutionStatus,
96
+ };
97
+ }
98
+ function getValueFromTypes(value, types) {
99
+ if (value.type === 'GenericTypeAnnotation' && types[value.id.name]) {
100
+ return getValueFromTypes(types[value.id.name].right, types);
101
+ }
102
+ return value;
103
+ }
104
+ module.exports = {
105
+ getValueFromTypes,
106
+ resolveTypeAnnotation,
107
+ getTypes,
108
+ };