@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,435 @@
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
+ NativeModulePropertyShape,
18
+ NativeModuleTypeAnnotation,
19
+ NativeModuleSchema,
20
+ Nullable,
21
+ } from '../../../CodegenSchema';
22
+
23
+ import type {ParserErrorCapturer, TypeDeclarationMap} from '../../utils';
24
+
25
+ const {visit, isModuleRegistryCall, verifyPlatforms} = require('../../utils');
26
+ const {resolveTypeAnnotation, getTypes} = require('../utils');
27
+
28
+ const {
29
+ parseObjectProperty,
30
+ translateDefault,
31
+ buildPropertySchema,
32
+ } = require('../../parsers-commons');
33
+
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
+ UnsupportedGenericParserError,
56
+ UnsupportedTypeAnnotationParserError,
57
+ IncorrectModuleRegistryCallArgumentTypeParserError,
58
+ } = require('../../errors');
59
+
60
+ const {
61
+ throwIfUntypedModule,
62
+ throwIfUnusedModuleInterfaceParserError,
63
+ throwIfModuleInterfaceNotFound,
64
+ throwIfModuleInterfaceIsMisnamed,
65
+ throwIfWrongNumberOfCallExpressionArgs,
66
+ throwIfMoreThanOneModuleRegistryCalls,
67
+ throwIfMoreThanOneModuleInterfaceParserError,
68
+ throwIfIncorrectModuleRegistryCallTypeParameterParserError,
69
+ } = require('../../error-utils');
70
+
71
+ const {TypeScriptParser} = require('../parser');
72
+
73
+ const language = 'TypeScript';
74
+ const parser = new TypeScriptParser();
75
+
76
+ function translateTypeAnnotation(
77
+ hasteModuleName: string,
78
+ /**
79
+ * TODO(T108222691): Use flow-types for @babel/parser
80
+ */
81
+ typeScriptTypeAnnotation: $FlowFixMe,
82
+ types: TypeDeclarationMap,
83
+ aliasMap: {...NativeModuleAliasMap},
84
+ tryParse: ParserErrorCapturer,
85
+ cxxOnly: boolean,
86
+ ): Nullable<NativeModuleTypeAnnotation> {
87
+ const {nullable, typeAnnotation, typeAliasResolutionStatus} =
88
+ resolveTypeAnnotation(typeScriptTypeAnnotation, types);
89
+
90
+ switch (typeAnnotation.type) {
91
+ case 'TSArrayType': {
92
+ return translateArrayTypeAnnotation(
93
+ hasteModuleName,
94
+ types,
95
+ aliasMap,
96
+ cxxOnly,
97
+ 'Array',
98
+ typeAnnotation.elementType,
99
+ nullable,
100
+ language,
101
+ translateTypeAnnotation,
102
+ );
103
+ }
104
+ case 'TSTypeOperator': {
105
+ if (
106
+ typeAnnotation.operator === 'readonly' &&
107
+ typeAnnotation.typeAnnotation.type === 'TSArrayType'
108
+ ) {
109
+ return translateArrayTypeAnnotation(
110
+ hasteModuleName,
111
+ types,
112
+ aliasMap,
113
+ cxxOnly,
114
+ 'ReadonlyArray',
115
+ typeAnnotation.typeAnnotation.elementType,
116
+ nullable,
117
+ language,
118
+ translateTypeAnnotation,
119
+ );
120
+ } else {
121
+ throw new UnsupportedGenericParserError(
122
+ hasteModuleName,
123
+ typeAnnotation,
124
+ parser,
125
+ );
126
+ }
127
+ }
128
+ case 'TSTypeReference': {
129
+ switch (typeAnnotation.typeName.name) {
130
+ case 'RootTag': {
131
+ return emitRootTag(nullable);
132
+ }
133
+ case 'Promise': {
134
+ return emitPromise(
135
+ hasteModuleName,
136
+ typeAnnotation,
137
+ parser,
138
+ nullable,
139
+ types,
140
+ aliasMap,
141
+ tryParse,
142
+ cxxOnly,
143
+ translateTypeAnnotation,
144
+ );
145
+ }
146
+ case 'Array':
147
+ case 'ReadonlyArray': {
148
+ return emitArrayType(
149
+ hasteModuleName,
150
+ typeAnnotation,
151
+ parser,
152
+ types,
153
+ aliasMap,
154
+ cxxOnly,
155
+ nullable,
156
+ translateTypeAnnotation,
157
+ );
158
+ }
159
+ case 'Stringish': {
160
+ return emitStringish(nullable);
161
+ }
162
+ case 'Int32': {
163
+ return emitInt32(nullable);
164
+ }
165
+ case 'Double': {
166
+ return emitDouble(nullable);
167
+ }
168
+ case 'Float': {
169
+ return emitFloat(nullable);
170
+ }
171
+ case 'UnsafeObject':
172
+ case 'Object': {
173
+ return emitObject(nullable);
174
+ }
175
+ default: {
176
+ return translateDefault(
177
+ hasteModuleName,
178
+ typeAnnotation,
179
+ types,
180
+ nullable,
181
+ parser,
182
+ );
183
+ }
184
+ }
185
+ }
186
+ case 'TSTypeLiteral': {
187
+ const objectTypeAnnotation = {
188
+ type: 'ObjectTypeAnnotation',
189
+ // $FlowFixMe[missing-type-arg]
190
+ properties: (typeAnnotation.members: Array<$FlowFixMe>)
191
+ .map<?NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>>(
192
+ property => {
193
+ return tryParse(() => {
194
+ return parseObjectProperty(
195
+ property,
196
+ hasteModuleName,
197
+ types,
198
+ aliasMap,
199
+ tryParse,
200
+ cxxOnly,
201
+ nullable,
202
+ translateTypeAnnotation,
203
+ parser,
204
+ );
205
+ });
206
+ },
207
+ )
208
+ .filter(Boolean),
209
+ };
210
+
211
+ return typeAliasResolution(
212
+ typeAliasResolutionStatus,
213
+ objectTypeAnnotation,
214
+ aliasMap,
215
+ nullable,
216
+ );
217
+ }
218
+ case 'TSBooleanKeyword': {
219
+ return emitBoolean(nullable);
220
+ }
221
+ case 'TSNumberKeyword': {
222
+ return emitNumber(nullable);
223
+ }
224
+ case 'TSVoidKeyword': {
225
+ return emitVoid(nullable);
226
+ }
227
+ case 'TSStringKeyword': {
228
+ return emitString(nullable);
229
+ }
230
+ case 'TSFunctionType': {
231
+ return emitFunction(
232
+ nullable,
233
+ hasteModuleName,
234
+ typeAnnotation,
235
+ types,
236
+ aliasMap,
237
+ tryParse,
238
+ cxxOnly,
239
+ translateTypeAnnotation,
240
+ language,
241
+ );
242
+ }
243
+ case 'TSUnionType': {
244
+ return emitUnion(nullable, hasteModuleName, typeAnnotation, parser);
245
+ }
246
+ case 'TSUnknownKeyword': {
247
+ if (cxxOnly) {
248
+ return emitMixed(nullable);
249
+ }
250
+ // Fallthrough
251
+ }
252
+ default: {
253
+ throw new UnsupportedTypeAnnotationParserError(
254
+ hasteModuleName,
255
+ typeAnnotation,
256
+ language,
257
+ );
258
+ }
259
+ }
260
+ }
261
+
262
+ function isModuleInterface(node: $FlowFixMe) {
263
+ return (
264
+ node.type === 'TSInterfaceDeclaration' &&
265
+ node.extends?.length === 1 &&
266
+ node.extends[0].type === 'TSExpressionWithTypeArguments' &&
267
+ node.extends[0].expression.name === 'TurboModule'
268
+ );
269
+ }
270
+
271
+ function buildModuleSchema(
272
+ hasteModuleName: string,
273
+ /**
274
+ * TODO(T108222691): Use flow-types for @babel/parser
275
+ */
276
+ ast: $FlowFixMe,
277
+ tryParse: ParserErrorCapturer,
278
+ ): NativeModuleSchema {
279
+ const types = getTypes(ast);
280
+ const moduleSpecs = (Object.values(types): $ReadOnlyArray<$FlowFixMe>).filter(
281
+ isModuleInterface,
282
+ );
283
+
284
+ throwIfModuleInterfaceNotFound(
285
+ moduleSpecs.length,
286
+ hasteModuleName,
287
+ ast,
288
+ language,
289
+ );
290
+
291
+ throwIfMoreThanOneModuleInterfaceParserError(
292
+ hasteModuleName,
293
+ moduleSpecs,
294
+ language,
295
+ );
296
+
297
+ const [moduleSpec] = moduleSpecs;
298
+
299
+ throwIfModuleInterfaceIsMisnamed(hasteModuleName, moduleSpec.id, language);
300
+
301
+ // Parse Module Name
302
+ const moduleName = ((): string => {
303
+ const callExpressions = [];
304
+ visit(ast, {
305
+ CallExpression(node) {
306
+ if (isModuleRegistryCall(node)) {
307
+ callExpressions.push(node);
308
+ }
309
+ },
310
+ });
311
+
312
+ throwIfUnusedModuleInterfaceParserError(
313
+ hasteModuleName,
314
+ moduleSpec,
315
+ callExpressions,
316
+ language,
317
+ );
318
+
319
+ throwIfMoreThanOneModuleRegistryCalls(
320
+ hasteModuleName,
321
+ callExpressions,
322
+ callExpressions.length,
323
+ language,
324
+ );
325
+
326
+ const [callExpression] = callExpressions;
327
+ const {typeParameters} = callExpression;
328
+ const methodName = callExpression.callee.property.name;
329
+
330
+ throwIfWrongNumberOfCallExpressionArgs(
331
+ hasteModuleName,
332
+ callExpression,
333
+ methodName,
334
+ callExpression.arguments.length,
335
+ language,
336
+ );
337
+
338
+ if (callExpression.arguments[0].type !== 'StringLiteral') {
339
+ const {type} = callExpression.arguments[0];
340
+ throw new IncorrectModuleRegistryCallArgumentTypeParserError(
341
+ hasteModuleName,
342
+ callExpression.arguments[0],
343
+ methodName,
344
+ type,
345
+ language,
346
+ );
347
+ }
348
+
349
+ const $moduleName = callExpression.arguments[0].value;
350
+
351
+ throwIfUntypedModule(
352
+ typeParameters,
353
+ hasteModuleName,
354
+ callExpression,
355
+ methodName,
356
+ $moduleName,
357
+ language,
358
+ );
359
+
360
+ throwIfIncorrectModuleRegistryCallTypeParameterParserError(
361
+ hasteModuleName,
362
+ typeParameters,
363
+ methodName,
364
+ $moduleName,
365
+ parser,
366
+ );
367
+
368
+ return $moduleName;
369
+ })();
370
+
371
+ // Some module names use platform suffix to indicate platform-exclusive modules.
372
+ // Eventually this should be made explicit in the Flow type itself.
373
+ // Also check the hasteModuleName for platform suffix.
374
+ // Note: this shape is consistent with ComponentSchema.
375
+ const {cxxOnly, excludedPlatforms} = verifyPlatforms(
376
+ hasteModuleName,
377
+ moduleName,
378
+ );
379
+
380
+ // $FlowFixMe[missing-type-arg]
381
+ return (moduleSpec.body.body: $ReadOnlyArray<$FlowFixMe>)
382
+ .filter(
383
+ property =>
384
+ property.type === 'TSMethodSignature' ||
385
+ property.type === 'TSPropertySignature',
386
+ )
387
+ .map<?{
388
+ aliasMap: NativeModuleAliasMap,
389
+ propertyShape: NativeModulePropertyShape,
390
+ }>(property => {
391
+ const aliasMap: {...NativeModuleAliasMap} = {};
392
+
393
+ return tryParse(() => ({
394
+ aliasMap: aliasMap,
395
+ propertyShape: buildPropertySchema(
396
+ hasteModuleName,
397
+ property,
398
+ types,
399
+ aliasMap,
400
+ tryParse,
401
+ cxxOnly,
402
+ language,
403
+ resolveTypeAnnotation,
404
+ translateTypeAnnotation,
405
+ ),
406
+ }));
407
+ })
408
+ .filter(Boolean)
409
+ .reduce(
410
+ (moduleSchema: NativeModuleSchema, {aliasMap, propertyShape}) => {
411
+ return {
412
+ type: 'NativeModule',
413
+ aliases: {...moduleSchema.aliases, ...aliasMap},
414
+ spec: {
415
+ properties: [...moduleSchema.spec.properties, propertyShape],
416
+ },
417
+ moduleName: moduleSchema.moduleName,
418
+ excludedPlatforms: moduleSchema.excludedPlatforms,
419
+ };
420
+ },
421
+ {
422
+ type: 'NativeModule',
423
+ aliases: {},
424
+ spec: {properties: []},
425
+ moduleName: moduleName,
426
+ excludedPlatforms:
427
+ excludedPlatforms.length !== 0 ? [...excludedPlatforms] : undefined,
428
+ },
429
+ );
430
+ }
431
+
432
+ module.exports = {
433
+ buildModuleSchema,
434
+ typeScriptTranslateTypeAnnotation: translateTypeAnnotation,
435
+ };
@@ -0,0 +1,203 @@
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 getValueFromTypes(value, types) {
14
+ switch (value.type) {
15
+ case 'TSTypeReference':
16
+ if (types[value.typeName.name]) {
17
+ return getValueFromTypes(types[value.typeName.name], types);
18
+ } else {
19
+ return value;
20
+ }
21
+ case 'TSTypeAliasDeclaration':
22
+ return getValueFromTypes(value.typeAnnotation, types);
23
+ default:
24
+ return value;
25
+ }
26
+ }
27
+ function isNull(t) {
28
+ return t.type === 'TSNullKeyword' || t.type === 'TSUndefinedKeyword';
29
+ }
30
+ function isNullOrVoid(t) {
31
+ return isNull(t) || t.type === 'TSVoidKeyword';
32
+ }
33
+ function couldBeNumericLiteral(type) {
34
+ return type === 'Literal' || type === 'NumericLiteral';
35
+ }
36
+ function couldBeSimpleLiteral(type) {
37
+ return (
38
+ couldBeNumericLiteral(type) ||
39
+ type === 'StringLiteral' ||
40
+ type === 'BooleanLiteral'
41
+ );
42
+ }
43
+ function evaluateLiteral(literalNode) {
44
+ const valueType = literalNode.type;
45
+ if (valueType === 'TSLiteralType') {
46
+ const literal = literalNode.literal;
47
+ if (couldBeSimpleLiteral(literal.type)) {
48
+ if (
49
+ typeof literal.value === 'string' ||
50
+ typeof literal.value === 'number' ||
51
+ typeof literal.value === 'boolean'
52
+ ) {
53
+ return literal.value;
54
+ }
55
+ } else if (
56
+ literal.type === 'UnaryExpression' &&
57
+ literal.operator === '-' &&
58
+ couldBeNumericLiteral(literal.argument.type) &&
59
+ typeof literal.argument.value === 'number'
60
+ ) {
61
+ return -literal.argument.value;
62
+ }
63
+ } else if (isNull(literalNode)) {
64
+ return null;
65
+ }
66
+ throw new Error(
67
+ 'The default value in WithDefault must be string, number, boolean or null .',
68
+ );
69
+ }
70
+ function handleUnionAndParen(type, result, knownTypes) {
71
+ switch (type.type) {
72
+ case 'TSParenthesizedType': {
73
+ handleUnionAndParen(type.typeAnnotation, result, knownTypes);
74
+ break;
75
+ }
76
+ case 'TSUnionType': {
77
+ // the order is important
78
+ // result.optional must be set first
79
+ for (const t of type.types) {
80
+ if (isNullOrVoid(t)) {
81
+ result.optional = true;
82
+ }
83
+ }
84
+ for (const t of type.types) {
85
+ if (!isNullOrVoid(t)) {
86
+ handleUnionAndParen(t, result, knownTypes);
87
+ }
88
+ }
89
+ break;
90
+ }
91
+ case 'TSTypeReference':
92
+ if (type.typeName.name === 'Readonly') {
93
+ handleUnionAndParen(type.typeParameters.params[0], result, knownTypes);
94
+ } else if (type.typeName.name === 'WithDefault') {
95
+ if (result.optional) {
96
+ throw new Error(
97
+ 'WithDefault<> is optional and does not need to be marked as optional. Please remove the union of undefined and/or null',
98
+ );
99
+ }
100
+ if (type.typeParameters.params.length !== 2) {
101
+ throw new Error(
102
+ 'WithDefault requires two parameters: type and default value.',
103
+ );
104
+ }
105
+ if (result.defaultValue !== undefined) {
106
+ throw new Error(
107
+ 'Multiple WithDefault is not allowed nested or in a union type.',
108
+ );
109
+ }
110
+ result.optional = true;
111
+ result.defaultValue = evaluateLiteral(type.typeParameters.params[1]);
112
+ handleUnionAndParen(type.typeParameters.params[0], result, knownTypes);
113
+ } else if (!knownTypes) {
114
+ result.unions.push(type);
115
+ } else {
116
+ const resolvedType = getValueFromTypes(type, knownTypes);
117
+ if (
118
+ resolvedType.type === 'TSTypeReference' &&
119
+ resolvedType.typeName.name === type.typeName.name
120
+ ) {
121
+ result.unions.push(type);
122
+ } else {
123
+ handleUnionAndParen(resolvedType, result, knownTypes);
124
+ }
125
+ }
126
+ break;
127
+ default:
128
+ result.unions.push(type);
129
+ }
130
+ }
131
+ function parseTopLevelType(type, knownTypes) {
132
+ let result = {
133
+ unions: [],
134
+ optional: false,
135
+ };
136
+ handleUnionAndParen(type, result, knownTypes);
137
+ if (result.unions.length === 0) {
138
+ throw new Error('Union type could not be just null or undefined.');
139
+ } else if (result.unions.length === 1) {
140
+ return {
141
+ type: result.unions[0],
142
+ optional: result.optional,
143
+ defaultValue: result.defaultValue,
144
+ };
145
+ } else {
146
+ return {
147
+ type: {
148
+ type: 'TSUnionType',
149
+ types: result.unions,
150
+ },
151
+ optional: result.optional,
152
+ defaultValue: result.defaultValue,
153
+ };
154
+ }
155
+ }
156
+ function handleIntersectionAndParen(type, result, knownTypes) {
157
+ switch (type.type) {
158
+ case 'TSParenthesizedType': {
159
+ handleIntersectionAndParen(type.typeAnnotation, result, knownTypes);
160
+ break;
161
+ }
162
+ case 'TSIntersectionType': {
163
+ for (const t of type.types) {
164
+ handleIntersectionAndParen(t, result, knownTypes);
165
+ }
166
+ break;
167
+ }
168
+ case 'TSTypeReference':
169
+ if (type.typeName.name === 'Readonly') {
170
+ handleIntersectionAndParen(
171
+ type.typeParameters.params[0],
172
+ result,
173
+ knownTypes,
174
+ );
175
+ } else if (type.typeName.name === 'WithDefault') {
176
+ throw new Error('WithDefault<> is now allowed in intersection types.');
177
+ } else if (!knownTypes) {
178
+ result.push(type);
179
+ } else {
180
+ const resolvedType = getValueFromTypes(type, knownTypes);
181
+ if (
182
+ resolvedType.type === 'TSTypeReference' &&
183
+ resolvedType.typeName.name === type.typeName.name
184
+ ) {
185
+ result.push(type);
186
+ } else {
187
+ handleIntersectionAndParen(resolvedType, result, knownTypes);
188
+ }
189
+ }
190
+ break;
191
+ default:
192
+ result.push(type);
193
+ }
194
+ }
195
+ function flattenIntersectionType(type, knownTypes) {
196
+ const result = [];
197
+ handleIntersectionAndParen(type, result, knownTypes);
198
+ return result;
199
+ }
200
+ module.exports = {
201
+ parseTopLevelType,
202
+ flattenIntersectionType,
203
+ };