@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,523 @@
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
+ SchemaType,
17
+ NativeModulePropertyShape,
18
+ NativeModuleReturnTypeAnnotation,
19
+ NativeModuleParamTypeAnnotation,
20
+ NativeModuleFunctionTypeAnnotation,
21
+ } from '../../CodegenSchema';
22
+
23
+ import type {AliasResolver} from './Utils';
24
+ const {createAliasResolver, getModules} = require('./Utils');
25
+ const {unwrapNullable} = require('../../parsers/parsers-commons');
26
+
27
+ type FilesOutput = Map<string, string>;
28
+
29
+ type JSReturnType =
30
+ | 'VoidKind'
31
+ | 'StringKind'
32
+ | 'BooleanKind'
33
+ | 'NumberKind'
34
+ | 'PromiseKind'
35
+ | 'ObjectKind'
36
+ | 'ArrayKind';
37
+
38
+ const HostFunctionTemplate = ({
39
+ hasteModuleName,
40
+ propertyName,
41
+ jniSignature,
42
+ jsReturnType,
43
+ }: $ReadOnly<{
44
+ hasteModuleName: string,
45
+ propertyName: string,
46
+ jniSignature: string,
47
+ jsReturnType: JSReturnType,
48
+ }>) => {
49
+ return `static facebook::jsi::Value __hostFunction_${hasteModuleName}SpecJSI_${propertyName}(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
50
+ static jmethodID cachedMethodId = nullptr;
51
+ return static_cast<JavaTurboModule &>(turboModule).invokeJavaMethod(rt, ${jsReturnType}, "${propertyName}", "${jniSignature}", args, count, cachedMethodId);
52
+ }`;
53
+ };
54
+
55
+ const ModuleClassConstructorTemplate = ({
56
+ hasteModuleName,
57
+ methods,
58
+ }: $ReadOnly<{
59
+ hasteModuleName: string,
60
+ methods: $ReadOnlyArray<{
61
+ propertyName: string,
62
+ argCount: number,
63
+ }>,
64
+ }>) => {
65
+ return `
66
+ ${hasteModuleName}SpecJSI::${hasteModuleName}SpecJSI(const JavaTurboModule::InitParams &params)
67
+ : JavaTurboModule(params) {
68
+ ${methods
69
+ .map(({propertyName, argCount}) => {
70
+ return ` methodMap_["${propertyName}"] = MethodMetadata {${argCount}, __hostFunction_${hasteModuleName}SpecJSI_${propertyName}};`;
71
+ })
72
+ .join('\n')}
73
+ }`.trim();
74
+ };
75
+
76
+ const ModuleLookupTemplate = ({
77
+ moduleName,
78
+ hasteModuleName,
79
+ }: $ReadOnly<{moduleName: string, hasteModuleName: string}>) => {
80
+ return ` if (moduleName == "${moduleName}") {
81
+ return std::make_shared<${hasteModuleName}SpecJSI>(params);
82
+ }`;
83
+ };
84
+
85
+ const FileTemplate = ({
86
+ libraryName,
87
+ include,
88
+ modules,
89
+ moduleLookups,
90
+ }: $ReadOnly<{
91
+ libraryName: string,
92
+ include: string,
93
+ modules: string,
94
+ moduleLookups: $ReadOnlyArray<{
95
+ hasteModuleName: string,
96
+ moduleName: string,
97
+ }>,
98
+ }>) => {
99
+ return `
100
+ /**
101
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
102
+ *
103
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
104
+ * once the code is regenerated.
105
+ *
106
+ * ${'@'}generated by codegen project: GenerateModuleJniCpp.js
107
+ */
108
+
109
+ #include ${include}
110
+
111
+ namespace facebook {
112
+ namespace react {
113
+
114
+ ${modules}
115
+
116
+ std::shared_ptr<TurboModule> ${libraryName}_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams &params) {
117
+ ${moduleLookups.map(ModuleLookupTemplate).join('\n')}
118
+ return nullptr;
119
+ }
120
+
121
+ } // namespace react
122
+ } // namespace facebook
123
+ `;
124
+ };
125
+
126
+ function translateReturnTypeToKind(
127
+ nullableTypeAnnotation: Nullable<NativeModuleReturnTypeAnnotation>,
128
+ resolveAlias: AliasResolver,
129
+ ): JSReturnType {
130
+ const [typeAnnotation] = unwrapNullable<NativeModuleReturnTypeAnnotation>(
131
+ nullableTypeAnnotation,
132
+ );
133
+ let realTypeAnnotation = typeAnnotation;
134
+ if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
135
+ realTypeAnnotation = resolveAlias(realTypeAnnotation.name);
136
+ }
137
+
138
+ switch (realTypeAnnotation.type) {
139
+ case 'ReservedTypeAnnotation':
140
+ switch (realTypeAnnotation.name) {
141
+ case 'RootTag':
142
+ return 'NumberKind';
143
+ default:
144
+ (realTypeAnnotation.name: empty);
145
+ throw new Error(
146
+ `Invalid ReservedFunctionValueTypeName name, got ${realTypeAnnotation.name}`,
147
+ );
148
+ }
149
+ case 'VoidTypeAnnotation':
150
+ return 'VoidKind';
151
+ case 'StringTypeAnnotation':
152
+ return 'StringKind';
153
+ case 'BooleanTypeAnnotation':
154
+ return 'BooleanKind';
155
+ case 'EnumDeclaration':
156
+ switch (typeAnnotation.memberType) {
157
+ case 'NumberTypeAnnotation':
158
+ return 'NumberKind';
159
+ case 'StringTypeAnnotation':
160
+ return 'StringKind';
161
+ default:
162
+ throw new Error(
163
+ `Unknown enum prop type for returning value, found: ${realTypeAnnotation.type}"`,
164
+ );
165
+ }
166
+ case 'UnionTypeAnnotation':
167
+ switch (typeAnnotation.memberType) {
168
+ case 'NumberTypeAnnotation':
169
+ return 'NumberKind';
170
+ case 'ObjectTypeAnnotation':
171
+ return 'ObjectKind';
172
+ case 'StringTypeAnnotation':
173
+ return 'StringKind';
174
+ default:
175
+ throw new Error(
176
+ `Unsupported union member returning value, found: ${realTypeAnnotation.memberType}"`,
177
+ );
178
+ }
179
+ case 'NumberTypeAnnotation':
180
+ return 'NumberKind';
181
+ case 'DoubleTypeAnnotation':
182
+ return 'NumberKind';
183
+ case 'FloatTypeAnnotation':
184
+ return 'NumberKind';
185
+ case 'Int32TypeAnnotation':
186
+ return 'NumberKind';
187
+ case 'PromiseTypeAnnotation':
188
+ return 'PromiseKind';
189
+ case 'GenericObjectTypeAnnotation':
190
+ return 'ObjectKind';
191
+ case 'ObjectTypeAnnotation':
192
+ return 'ObjectKind';
193
+ case 'ArrayTypeAnnotation':
194
+ return 'ArrayKind';
195
+ default:
196
+ (realTypeAnnotation.type: 'EnumDeclaration' | 'MixedTypeAnnotation');
197
+ throw new Error(
198
+ `Unknown prop type for returning value, found: ${realTypeAnnotation.type}"`,
199
+ );
200
+ }
201
+ }
202
+
203
+ type Param = NamedShape<Nullable<NativeModuleParamTypeAnnotation>>;
204
+
205
+ function translateParamTypeToJniType(
206
+ param: Param,
207
+ resolveAlias: AliasResolver,
208
+ ): string {
209
+ const {optional, typeAnnotation: nullableTypeAnnotation} = param;
210
+ const [typeAnnotation, nullable] =
211
+ unwrapNullable<NativeModuleParamTypeAnnotation>(nullableTypeAnnotation);
212
+ const isRequired = !optional && !nullable;
213
+
214
+ let realTypeAnnotation = typeAnnotation;
215
+ if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
216
+ realTypeAnnotation = resolveAlias(realTypeAnnotation.name);
217
+ }
218
+
219
+ switch (realTypeAnnotation.type) {
220
+ case 'ReservedTypeAnnotation':
221
+ switch (realTypeAnnotation.name) {
222
+ case 'RootTag':
223
+ return !isRequired ? 'Ljava/lang/Double;' : 'D';
224
+ default:
225
+ (realTypeAnnotation.name: empty);
226
+ throw new Error(
227
+ `Invalid ReservedFunctionValueTypeName name, got ${realTypeAnnotation.name}`,
228
+ );
229
+ }
230
+ case 'StringTypeAnnotation':
231
+ return 'Ljava/lang/String;';
232
+ case 'BooleanTypeAnnotation':
233
+ return !isRequired ? 'Ljava/lang/Boolean;' : 'Z';
234
+ case 'EnumDeclaration':
235
+ switch (typeAnnotation.memberType) {
236
+ case 'NumberTypeAnnotation':
237
+ return !isRequired ? 'Ljava/lang/Double;' : 'D';
238
+ case 'StringTypeAnnotation':
239
+ return 'Ljava/lang/String;';
240
+ default:
241
+ throw new Error(
242
+ `Unknown enum prop type for method arg, found: ${realTypeAnnotation.type}"`,
243
+ );
244
+ }
245
+ case 'UnionTypeAnnotation':
246
+ switch (typeAnnotation.memberType) {
247
+ case 'NumberTypeAnnotation':
248
+ return !isRequired ? 'Ljava/lang/Double;' : 'D';
249
+ case 'ObjectTypeAnnotation':
250
+ return 'Lcom/facebook/react/bridge/ReadableMap;';
251
+ case 'StringTypeAnnotation':
252
+ return 'Ljava/lang/String;';
253
+ default:
254
+ throw new Error(
255
+ `Unsupported union prop value, found: ${realTypeAnnotation.memberType}"`,
256
+ );
257
+ }
258
+ case 'NumberTypeAnnotation':
259
+ return !isRequired ? 'Ljava/lang/Double;' : 'D';
260
+ case 'DoubleTypeAnnotation':
261
+ return !isRequired ? 'Ljava/lang/Double;' : 'D';
262
+ case 'FloatTypeAnnotation':
263
+ return !isRequired ? 'Ljava/lang/Double;' : 'D';
264
+ case 'Int32TypeAnnotation':
265
+ return !isRequired ? 'Ljava/lang/Double;' : 'D';
266
+ case 'GenericObjectTypeAnnotation':
267
+ return 'Lcom/facebook/react/bridge/ReadableMap;';
268
+ case 'ObjectTypeAnnotation':
269
+ return 'Lcom/facebook/react/bridge/ReadableMap;';
270
+ case 'ArrayTypeAnnotation':
271
+ return 'Lcom/facebook/react/bridge/ReadableArray;';
272
+ case 'FunctionTypeAnnotation':
273
+ return 'Lcom/facebook/react/bridge/Callback;';
274
+ default:
275
+ (realTypeAnnotation.type: 'EnumDeclaration' | 'MixedTypeAnnotation');
276
+ throw new Error(
277
+ `Unknown prop type for method arg, found: ${realTypeAnnotation.type}"`,
278
+ );
279
+ }
280
+ }
281
+
282
+ function translateReturnTypeToJniType(
283
+ nullableTypeAnnotation: Nullable<NativeModuleReturnTypeAnnotation>,
284
+ resolveAlias: AliasResolver,
285
+ ): string {
286
+ const [typeAnnotation, nullable] = unwrapNullable(nullableTypeAnnotation);
287
+
288
+ let realTypeAnnotation = typeAnnotation;
289
+ if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
290
+ realTypeAnnotation = resolveAlias(realTypeAnnotation.name);
291
+ }
292
+
293
+ switch (realTypeAnnotation.type) {
294
+ case 'ReservedTypeAnnotation':
295
+ switch (realTypeAnnotation.name) {
296
+ case 'RootTag':
297
+ return nullable ? 'Ljava/lang/Double;' : 'D';
298
+ default:
299
+ (realTypeAnnotation.name: empty);
300
+ throw new Error(
301
+ `Invalid ReservedFunctionValueTypeName name, got ${realTypeAnnotation.name}`,
302
+ );
303
+ }
304
+ case 'VoidTypeAnnotation':
305
+ return 'V';
306
+ case 'StringTypeAnnotation':
307
+ return 'Ljava/lang/String;';
308
+ case 'BooleanTypeAnnotation':
309
+ return nullable ? 'Ljava/lang/Boolean;' : 'Z';
310
+ case 'EnumDeclaration':
311
+ switch (typeAnnotation.memberType) {
312
+ case 'NumberTypeAnnotation':
313
+ return nullable ? 'Ljava/lang/Double;' : 'D';
314
+ case 'StringTypeAnnotation':
315
+ return 'Ljava/lang/String;';
316
+ default:
317
+ throw new Error(
318
+ `Unknown enum prop type for method return type, found: ${realTypeAnnotation.type}"`,
319
+ );
320
+ }
321
+ case 'UnionTypeAnnotation':
322
+ switch (typeAnnotation.memberType) {
323
+ case 'NumberTypeAnnotation':
324
+ return nullable ? 'Ljava/lang/Double;' : 'D';
325
+ case 'ObjectTypeAnnotation':
326
+ return 'Lcom/facebook/react/bridge/WritableMap;';
327
+ case 'StringTypeAnnotation':
328
+ return 'Ljava/lang/String;';
329
+ default:
330
+ throw new Error(
331
+ `Unsupported union member type, found: ${realTypeAnnotation.memberType}"`,
332
+ );
333
+ }
334
+ case 'NumberTypeAnnotation':
335
+ return nullable ? 'Ljava/lang/Double;' : 'D';
336
+ case 'DoubleTypeAnnotation':
337
+ return nullable ? 'Ljava/lang/Double;' : 'D';
338
+ case 'FloatTypeAnnotation':
339
+ return nullable ? 'Ljava/lang/Double;' : 'D';
340
+ case 'Int32TypeAnnotation':
341
+ return nullable ? 'Ljava/lang/Double;' : 'D';
342
+ case 'PromiseTypeAnnotation':
343
+ return 'Lcom/facebook/react/bridge/Promise;';
344
+ case 'GenericObjectTypeAnnotation':
345
+ return 'Lcom/facebook/react/bridge/WritableMap;';
346
+ case 'ObjectTypeAnnotation':
347
+ return 'Lcom/facebook/react/bridge/WritableMap;';
348
+ case 'ArrayTypeAnnotation':
349
+ return 'Lcom/facebook/react/bridge/WritableArray;';
350
+ default:
351
+ (realTypeAnnotation.type: 'EnumDeclaration' | 'MixedTypeAnnotation');
352
+ throw new Error(
353
+ `Unknown prop type for method return type, found: ${realTypeAnnotation.type}"`,
354
+ );
355
+ }
356
+ }
357
+
358
+ function translateMethodTypeToJniSignature(
359
+ property: NativeModulePropertyShape,
360
+ resolveAlias: AliasResolver,
361
+ ): string {
362
+ const {name, typeAnnotation} = property;
363
+ let [{returnTypeAnnotation, params}] =
364
+ unwrapNullable<NativeModuleFunctionTypeAnnotation>(typeAnnotation);
365
+
366
+ params = [...params];
367
+ let processedReturnTypeAnnotation = returnTypeAnnotation;
368
+ const isPromiseReturn = returnTypeAnnotation.type === 'PromiseTypeAnnotation';
369
+ if (isPromiseReturn) {
370
+ processedReturnTypeAnnotation = {
371
+ type: 'VoidTypeAnnotation',
372
+ };
373
+ }
374
+
375
+ const argsSignatureParts = params.map(t => {
376
+ return translateParamTypeToJniType(t, resolveAlias);
377
+ });
378
+ if (isPromiseReturn) {
379
+ // Additional promise arg for this case.
380
+ argsSignatureParts.push(
381
+ translateReturnTypeToJniType(returnTypeAnnotation, resolveAlias),
382
+ );
383
+ }
384
+ const argsSignature = argsSignatureParts.join('');
385
+ const returnSignature =
386
+ name === 'getConstants'
387
+ ? 'Ljava/util/Map;'
388
+ : translateReturnTypeToJniType(
389
+ processedReturnTypeAnnotation,
390
+ resolveAlias,
391
+ );
392
+
393
+ return `(${argsSignature})${returnSignature}`;
394
+ }
395
+
396
+ function translateMethodForImplementation(
397
+ hasteModuleName: string,
398
+ property: NativeModulePropertyShape,
399
+ resolveAlias: AliasResolver,
400
+ ): string {
401
+ const [propertyTypeAnnotation] =
402
+ unwrapNullable<NativeModuleFunctionTypeAnnotation>(property.typeAnnotation);
403
+ const {returnTypeAnnotation} = propertyTypeAnnotation;
404
+
405
+ if (
406
+ property.name === 'getConstants' &&
407
+ returnTypeAnnotation.type === 'ObjectTypeAnnotation' &&
408
+ returnTypeAnnotation.properties.length === 0
409
+ ) {
410
+ return '';
411
+ }
412
+
413
+ return HostFunctionTemplate({
414
+ hasteModuleName,
415
+ propertyName: property.name,
416
+ jniSignature: translateMethodTypeToJniSignature(property, resolveAlias),
417
+ jsReturnType: translateReturnTypeToKind(returnTypeAnnotation, resolveAlias),
418
+ });
419
+ }
420
+
421
+ module.exports = {
422
+ generate(
423
+ libraryName: string,
424
+ schema: SchemaType,
425
+ packageName?: string,
426
+ assumeNonnull: boolean = false,
427
+ ): FilesOutput {
428
+ const nativeModules = getModules(schema);
429
+
430
+ const modules = Object.keys(nativeModules)
431
+ .filter(hasteModuleName => {
432
+ const module = nativeModules[hasteModuleName];
433
+ return !(
434
+ module.excludedPlatforms != null &&
435
+ module.excludedPlatforms.includes('android')
436
+ );
437
+ })
438
+ .sort()
439
+ .map(hasteModuleName => {
440
+ const {
441
+ aliases,
442
+ spec: {properties},
443
+ } = nativeModules[hasteModuleName];
444
+ const resolveAlias = createAliasResolver(aliases);
445
+
446
+ const translatedMethods = properties
447
+ .map(property =>
448
+ translateMethodForImplementation(
449
+ hasteModuleName,
450
+ property,
451
+ resolveAlias,
452
+ ),
453
+ )
454
+ .join('\n\n');
455
+
456
+ return (
457
+ translatedMethods +
458
+ '\n\n' +
459
+ ModuleClassConstructorTemplate({
460
+ hasteModuleName,
461
+ methods: properties
462
+ .map(({name: propertyName, typeAnnotation}) => {
463
+ const [{returnTypeAnnotation, params}] =
464
+ unwrapNullable<NativeModuleFunctionTypeAnnotation>(
465
+ typeAnnotation,
466
+ );
467
+
468
+ if (
469
+ propertyName === 'getConstants' &&
470
+ returnTypeAnnotation.type === 'ObjectTypeAnnotation' &&
471
+ returnTypeAnnotation.properties &&
472
+ returnTypeAnnotation.properties.length === 0
473
+ ) {
474
+ return null;
475
+ }
476
+
477
+ return {
478
+ propertyName,
479
+ argCount: params.length,
480
+ };
481
+ })
482
+ .filter(Boolean),
483
+ })
484
+ );
485
+ })
486
+ .join('\n');
487
+
488
+ const moduleLookups: $ReadOnlyArray<{
489
+ hasteModuleName: string,
490
+ moduleName: string,
491
+ }> = Object.keys(nativeModules)
492
+ .filter(hasteModuleName => {
493
+ const module = nativeModules[hasteModuleName];
494
+ return !(
495
+ module.excludedPlatforms != null &&
496
+ module.excludedPlatforms.includes('android')
497
+ );
498
+ })
499
+ .sort((a, b) => {
500
+ const nameA = nativeModules[a].moduleName;
501
+ const nameB = nativeModules[b].moduleName;
502
+ if (nameA < nameB) {
503
+ return -1;
504
+ } else if (nameA > nameB) {
505
+ return 1;
506
+ }
507
+ return 0;
508
+ })
509
+ .map((hasteModuleName: string) => ({
510
+ moduleName: nativeModules[hasteModuleName].moduleName,
511
+ hasteModuleName,
512
+ }));
513
+
514
+ const fileName = `${libraryName}-generated.cpp`;
515
+ const replacedTemplate = FileTemplate({
516
+ modules: modules,
517
+ libraryName: libraryName.replace(/-/g, '_'),
518
+ moduleLookups,
519
+ include: `"${libraryName}.h"`,
520
+ });
521
+ return new Map([[`jni/${fileName}`, replacedTemplate]]);
522
+ },
523
+ };
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ *
8
+ * @format
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ const _require = require('./Utils'),
14
+ getModules = _require.getModules;
15
+ const ModuleClassDeclarationTemplate = ({hasteModuleName}) => {
16
+ return `/**
17
+ * JNI C++ class for module '${hasteModuleName}'
18
+ */
19
+ class JSI_EXPORT ${hasteModuleName}SpecJSI : public JavaTurboModule {
20
+ public:
21
+ ${hasteModuleName}SpecJSI(const JavaTurboModule::InitParams &params);
22
+ };
23
+ `;
24
+ };
25
+ const HeaderFileTemplate = ({modules, libraryName}) => {
26
+ return `
27
+ /**
28
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
29
+ *
30
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
31
+ * once the code is regenerated.
32
+ *
33
+ * ${'@'}generated by codegen project: GenerateModuleJniH.js
34
+ */
35
+
36
+ #pragma once
37
+
38
+ #include <ReactCommon/JavaTurboModule.h>
39
+ #include <ReactCommon/TurboModule.h>
40
+ #include <jsi/jsi.h>
41
+
42
+ namespace facebook {
43
+ namespace react {
44
+
45
+ ${modules}
46
+
47
+ JSI_EXPORT
48
+ std::shared_ptr<TurboModule> ${libraryName}_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams &params);
49
+
50
+ } // namespace react
51
+ } // namespace facebook
52
+ `;
53
+ };
54
+
55
+ // Note: this CMakeLists.txt template includes dependencies for both NativeModule and components.
56
+ const CMakeListsTemplate = ({libraryName}) => {
57
+ return `# Copyright (c) Meta Platforms, Inc. and affiliates.
58
+ #
59
+ # This source code is licensed under the MIT license found in the
60
+ # LICENSE file in the root directory of this source tree.
61
+
62
+ cmake_minimum_required(VERSION 3.13)
63
+ set(CMAKE_VERBOSE_MAKEFILE on)
64
+
65
+ file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/${libraryName}/*.cpp)
66
+
67
+ add_library(
68
+ react_codegen_${libraryName}
69
+ SHARED
70
+ \${react_codegen_SRCS}
71
+ )
72
+
73
+ target_include_directories(react_codegen_${libraryName} PUBLIC . react/renderer/components/${libraryName})
74
+
75
+ target_link_libraries(
76
+ react_codegen_${libraryName}
77
+ fbjni
78
+ folly_runtime
79
+ glog
80
+ jsi
81
+ ${libraryName !== 'rncore' ? 'react_codegen_rncore' : ''}
82
+ react_debug
83
+ react_nativemodule_core
84
+ react_render_core
85
+ react_render_debug
86
+ react_render_graphics
87
+ react_render_imagemanager
88
+ rrc_image
89
+ rrc_view
90
+ turbomodulejsijni
91
+ yoga
92
+ )
93
+
94
+ target_compile_options(
95
+ react_codegen_${libraryName}
96
+ PRIVATE
97
+ -DLOG_TAG=\\"ReactNative\\"
98
+ -fexceptions
99
+ -frtti
100
+ -std=c++17
101
+ -Wall
102
+ )
103
+ `;
104
+ };
105
+ module.exports = {
106
+ generate(libraryName, schema, packageName, assumeNonnull = false) {
107
+ const nativeModules = getModules(schema);
108
+ const modules = Object.keys(nativeModules)
109
+ .filter(hasteModuleName => {
110
+ const module = nativeModules[hasteModuleName];
111
+ return !(
112
+ module.excludedPlatforms != null &&
113
+ module.excludedPlatforms.includes('android')
114
+ );
115
+ })
116
+ .sort()
117
+ .map(hasteModuleName =>
118
+ ModuleClassDeclarationTemplate({
119
+ hasteModuleName,
120
+ }),
121
+ )
122
+ .join('\n');
123
+ const fileName = `${libraryName}.h`;
124
+ const replacedTemplate = HeaderFileTemplate({
125
+ modules: modules,
126
+ libraryName: libraryName.replace(/-/g, '_'),
127
+ });
128
+ return new Map([
129
+ [`jni/${fileName}`, replacedTemplate],
130
+ [
131
+ 'jni/CMakeLists.txt',
132
+ CMakeListsTemplate({
133
+ libraryName: libraryName,
134
+ }),
135
+ ],
136
+ ]);
137
+ },
138
+ };