@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,355 @@
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
+ SchemaType,
16
+ NativeModuleTypeAnnotation,
17
+ NativeModuleFunctionTypeAnnotation,
18
+ NativeModulePropertyShape,
19
+ NativeModuleAliasMap,
20
+ } from '../../CodegenSchema';
21
+
22
+ import type {AliasResolver} from './Utils';
23
+ const {createAliasResolver, getModules} = require('./Utils');
24
+ const {indent} = require('../Utils');
25
+ const {unwrapNullable} = require('../../parsers/parsers-commons');
26
+
27
+ type FilesOutput = Map<string, string>;
28
+
29
+ const ModuleClassDeclarationTemplate = ({
30
+ hasteModuleName,
31
+ moduleProperties,
32
+ structs,
33
+ }: $ReadOnly<{
34
+ hasteModuleName: string,
35
+ moduleProperties: string[],
36
+ structs: string,
37
+ }>) => {
38
+ return `${structs}class JSI_EXPORT ${hasteModuleName}CxxSpecJSI : public TurboModule {
39
+ protected:
40
+ ${hasteModuleName}CxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker);
41
+
42
+ public:
43
+ ${indent(moduleProperties.join('\n'), 2)}
44
+
45
+ };`;
46
+ };
47
+
48
+ const ModuleSpecClassDeclarationTemplate = ({
49
+ hasteModuleName,
50
+ moduleName,
51
+ moduleProperties,
52
+ }: $ReadOnly<{
53
+ hasteModuleName: string,
54
+ moduleName: string,
55
+ moduleProperties: string[],
56
+ }>) => {
57
+ return `template <typename T>
58
+ class JSI_EXPORT ${hasteModuleName}CxxSpec : public TurboModule {
59
+ public:
60
+ jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override {
61
+ return delegate_.get(rt, propName);
62
+ }
63
+
64
+ protected:
65
+ ${hasteModuleName}CxxSpec(std::shared_ptr<CallInvoker> jsInvoker)
66
+ : TurboModule("${moduleName}", jsInvoker),
67
+ delegate_(static_cast<T*>(this), jsInvoker) {}
68
+
69
+ private:
70
+ class Delegate : public ${hasteModuleName}CxxSpecJSI {
71
+ public:
72
+ Delegate(T *instance, std::shared_ptr<CallInvoker> jsInvoker) :
73
+ ${hasteModuleName}CxxSpecJSI(std::move(jsInvoker)), instance_(instance) {}
74
+
75
+ ${indent(moduleProperties.join('\n'), 4)}
76
+
77
+ private:
78
+ T *instance_;
79
+ };
80
+
81
+ Delegate delegate_;
82
+ };`;
83
+ };
84
+
85
+ const FileTemplate = ({
86
+ modules,
87
+ }: $ReadOnly<{
88
+ modules: string[],
89
+ }>) => {
90
+ return `/**
91
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
92
+ *
93
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
94
+ * once the code is regenerated.
95
+ *
96
+ * ${'@'}generated by codegen project: GenerateModuleH.js
97
+ */
98
+
99
+ #pragma once
100
+
101
+ #include <ReactCommon/TurboModule.h>
102
+ #include <react/bridging/Bridging.h>
103
+
104
+ namespace facebook {
105
+ namespace react {
106
+
107
+ ${modules.join('\n\n')}
108
+
109
+ } // namespace react
110
+ } // namespace facebook
111
+ `;
112
+ };
113
+
114
+ function translatePrimitiveJSTypeToCpp(
115
+ nullableTypeAnnotation: Nullable<NativeModuleTypeAnnotation>,
116
+ optional: boolean,
117
+ createErrorMessage: (typeName: string) => string,
118
+ resolveAlias: AliasResolver,
119
+ ) {
120
+ const [typeAnnotation, nullable] = unwrapNullable<NativeModuleTypeAnnotation>(
121
+ nullableTypeAnnotation,
122
+ );
123
+ const isRequired = !optional && !nullable;
124
+
125
+ let realTypeAnnotation = typeAnnotation;
126
+ if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
127
+ realTypeAnnotation = resolveAlias(realTypeAnnotation.name);
128
+ }
129
+
130
+ function wrap(type: string) {
131
+ return isRequired ? type : `std::optional<${type}>`;
132
+ }
133
+
134
+ switch (realTypeAnnotation.type) {
135
+ case 'ReservedTypeAnnotation':
136
+ switch (realTypeAnnotation.name) {
137
+ case 'RootTag':
138
+ return wrap('double');
139
+ default:
140
+ (realTypeAnnotation.name: empty);
141
+ throw new Error(createErrorMessage(realTypeAnnotation.name));
142
+ }
143
+ case 'VoidTypeAnnotation':
144
+ return 'void';
145
+ case 'StringTypeAnnotation':
146
+ return wrap('jsi::String');
147
+ case 'NumberTypeAnnotation':
148
+ return wrap('double');
149
+ case 'DoubleTypeAnnotation':
150
+ return wrap('double');
151
+ case 'FloatTypeAnnotation':
152
+ return wrap('double');
153
+ case 'Int32TypeAnnotation':
154
+ return wrap('int');
155
+ case 'BooleanTypeAnnotation':
156
+ return wrap('bool');
157
+ case 'EnumDeclaration':
158
+ switch (realTypeAnnotation.memberType) {
159
+ case 'NumberTypeAnnotation':
160
+ return wrap('double');
161
+ case 'StringTypeAnnotation':
162
+ return wrap('jsi::String');
163
+ default:
164
+ throw new Error(createErrorMessage(realTypeAnnotation.type));
165
+ }
166
+ case 'GenericObjectTypeAnnotation':
167
+ return wrap('jsi::Object');
168
+ case 'UnionTypeAnnotation':
169
+ switch (typeAnnotation.memberType) {
170
+ case 'NumberTypeAnnotation':
171
+ return wrap('double');
172
+ case 'ObjectTypeAnnotation':
173
+ return wrap('jsi::Object');
174
+ case 'StringTypeAnnotation':
175
+ return wrap('jsi::String');
176
+ default:
177
+ throw new Error(createErrorMessage(realTypeAnnotation.type));
178
+ }
179
+ case 'ObjectTypeAnnotation':
180
+ return wrap('jsi::Object');
181
+ case 'ArrayTypeAnnotation':
182
+ return wrap('jsi::Array');
183
+ case 'FunctionTypeAnnotation':
184
+ return wrap('jsi::Function');
185
+ case 'PromiseTypeAnnotation':
186
+ return wrap('jsi::Value');
187
+ case 'MixedTypeAnnotation':
188
+ return wrap('jsi::Value');
189
+ default:
190
+ (realTypeAnnotation.type: empty);
191
+ throw new Error(createErrorMessage(realTypeAnnotation.type));
192
+ }
193
+ }
194
+
195
+ function createStructs(
196
+ moduleName: string,
197
+ aliasMap: NativeModuleAliasMap,
198
+ resolveAlias: AliasResolver,
199
+ ): string {
200
+ return Object.keys(aliasMap)
201
+ .map(alias => {
202
+ const value = aliasMap[alias];
203
+ if (value.properties.length === 0) {
204
+ return '';
205
+ }
206
+ const structName = `${moduleName}Base${alias}`;
207
+ const templateParameterWithTypename = value.properties
208
+ .map((v, i) => 'typename P' + i)
209
+ .join(', ');
210
+ const templateParameter = value.properties
211
+ .map((v, i) => 'P' + i)
212
+ .join(', ');
213
+ return `#pragma mark - ${structName}
214
+
215
+ template <${templateParameterWithTypename}>
216
+ struct ${structName} {
217
+ ${value.properties.map((v, i) => ' P' + i + ' ' + v.name).join(';\n')};
218
+ bool operator==(const ${structName} &other) const {
219
+ return ${value.properties
220
+ .map(v => `${v.name} == other.${v.name}`)
221
+ .join(' && ')};
222
+ }
223
+ };
224
+
225
+ template <${templateParameterWithTypename}>
226
+ struct ${structName}Bridging {
227
+ static ${structName}<${templateParameter}> fromJs(
228
+ jsi::Runtime &rt,
229
+ const jsi::Object &value,
230
+ const std::shared_ptr<CallInvoker> &jsInvoker) {
231
+ ${structName}<${templateParameter}> result{
232
+ ${value.properties
233
+ .map(
234
+ (v, i) =>
235
+ ` bridging::fromJs<P${i}>(rt, value.getProperty(rt, "${v.name}"), jsInvoker)`,
236
+ )
237
+ .join(',\n')}};
238
+ return result;
239
+ }
240
+
241
+ static jsi::Object toJs(
242
+ jsi::Runtime &rt,
243
+ const ${structName}<${templateParameter}> &value) {
244
+ auto result = facebook::jsi::Object(rt);
245
+ ${value.properties
246
+ .map((v, i) => {
247
+ if (v.optional) {
248
+ return ` if (value.${v.name}) {
249
+ result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}.value()));
250
+ }`;
251
+ } else {
252
+ return ` result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}));`;
253
+ }
254
+ })
255
+ .join('\n')}
256
+ return result;
257
+ }
258
+ };
259
+
260
+ `;
261
+ })
262
+ .join('\n');
263
+ }
264
+
265
+ function translatePropertyToCpp(
266
+ prop: NativeModulePropertyShape,
267
+ resolveAlias: AliasResolver,
268
+ abstract: boolean = false,
269
+ ) {
270
+ const [propTypeAnnotation] =
271
+ unwrapNullable<NativeModuleFunctionTypeAnnotation>(prop.typeAnnotation);
272
+
273
+ const params = propTypeAnnotation.params.map(
274
+ param => `std::move(${param.name})`,
275
+ );
276
+
277
+ const paramTypes = propTypeAnnotation.params.map(param => {
278
+ const translatedParam = translatePrimitiveJSTypeToCpp(
279
+ param.typeAnnotation,
280
+ param.optional,
281
+ typeName =>
282
+ `Unsupported type for param "${param.name}" in ${prop.name}. Found: ${typeName}`,
283
+ resolveAlias,
284
+ );
285
+ return `${translatedParam} ${param.name}`;
286
+ });
287
+
288
+ const returnType = translatePrimitiveJSTypeToCpp(
289
+ propTypeAnnotation.returnTypeAnnotation,
290
+ false,
291
+ typeName => `Unsupported return type for ${prop.name}. Found: ${typeName}`,
292
+ resolveAlias,
293
+ );
294
+
295
+ // The first param will always be the runtime reference.
296
+ paramTypes.unshift('jsi::Runtime &rt');
297
+
298
+ const method = `${returnType} ${prop.name}(${paramTypes.join(', ')})`;
299
+
300
+ if (abstract) {
301
+ return `virtual ${method} = 0;`;
302
+ }
303
+
304
+ return `${method} override {
305
+ static_assert(
306
+ bridging::getParameterCount(&T::${prop.name}) == ${paramTypes.length},
307
+ "Expected ${prop.name}(...) to have ${paramTypes.length} parameters");
308
+
309
+ return bridging::callFromJs<${returnType}>(
310
+ rt, &T::${prop.name}, jsInvoker_, ${['instance_', ...params].join(', ')});
311
+ }`;
312
+ }
313
+
314
+ module.exports = {
315
+ generate(
316
+ libraryName: string,
317
+ schema: SchemaType,
318
+ packageName?: string,
319
+ assumeNonnull: boolean = false,
320
+ ): FilesOutput {
321
+ const nativeModules = getModules(schema);
322
+
323
+ const modules = Object.keys(nativeModules).flatMap(hasteModuleName => {
324
+ const {
325
+ aliases,
326
+ spec: {properties},
327
+ moduleName,
328
+ } = nativeModules[hasteModuleName];
329
+ const resolveAlias = createAliasResolver(aliases);
330
+ const structs = createStructs(moduleName, aliases, resolveAlias);
331
+
332
+ return [
333
+ ModuleClassDeclarationTemplate({
334
+ hasteModuleName,
335
+ moduleProperties: properties.map(prop =>
336
+ translatePropertyToCpp(prop, resolveAlias, true),
337
+ ),
338
+ structs,
339
+ }),
340
+ ModuleSpecClassDeclarationTemplate({
341
+ hasteModuleName,
342
+ moduleName,
343
+ moduleProperties: properties.map(prop =>
344
+ translatePropertyToCpp(prop, resolveAlias),
345
+ ),
346
+ }),
347
+ ];
348
+ });
349
+
350
+ const fileName = `${libraryName}JSI.h`;
351
+ const replacedTemplate = FileTemplate({modules});
352
+
353
+ return new Map([[fileName, replacedTemplate]]);
354
+ },
355
+ };