@react-native/codegen 0.74.0 → 0.75.0-nightly-20240221-a1171f79f

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 (147) hide show
  1. package/lib/CodegenSchema.d.ts +10 -1
  2. package/lib/CodegenSchema.js.flow +2 -1
  3. package/lib/SchemaValidator.js.flow +2 -2
  4. package/lib/cli/combine/combine-js-to-schema-cli.js +59 -40
  5. package/lib/cli/combine/combine-js-to-schema-cli.js.flow +23 -39
  6. package/lib/cli/combine/combine-js-to-schema.js +49 -1
  7. package/lib/cli/combine/combine-js-to-schema.js.flow +59 -1
  8. package/lib/cli/combine/combine-schemas-cli.js +77 -0
  9. package/lib/cli/combine/combine-schemas-cli.js.flow +87 -0
  10. package/lib/cli/combine/combine-utils.js +3 -65
  11. package/lib/cli/combine/combine-utils.js.flow +7 -28
  12. package/lib/cli/parser/parser.js +1 -1
  13. package/lib/cli/parser/parser.js.flow +1 -1
  14. package/lib/generators/RNCodegen.d.ts +1 -0
  15. package/lib/generators/RNCodegen.js +58 -31
  16. package/lib/generators/RNCodegen.js.flow +52 -32
  17. package/lib/generators/TypeUtils/Cxx/index.js +17 -0
  18. package/lib/generators/TypeUtils/Cxx/index.js.flow +18 -0
  19. package/lib/generators/TypeUtils/Java/index.js +31 -0
  20. package/lib/generators/TypeUtils/Java/index.js.flow +27 -0
  21. package/lib/generators/TypeUtils/Objective-C/index.js +17 -0
  22. package/lib/generators/TypeUtils/Objective-C/index.js.flow +18 -0
  23. package/lib/generators/components/ComponentsGeneratorUtils.js +7 -7
  24. package/lib/generators/components/ComponentsGeneratorUtils.js.flow +8 -10
  25. package/lib/generators/components/ComponentsProviderUtils.js +55 -0
  26. package/lib/generators/components/ComponentsProviderUtils.js.flow +60 -0
  27. package/lib/generators/components/CppHelpers.js +7 -0
  28. package/lib/generators/components/CppHelpers.js.flow +14 -0
  29. package/lib/generators/components/GenerateComponentDescriptorCpp.js +89 -0
  30. package/lib/generators/components/GenerateComponentDescriptorCpp.js.flow +101 -0
  31. package/lib/generators/components/GenerateComponentDescriptorH.js +28 -12
  32. package/lib/generators/components/GenerateComponentDescriptorH.js.flow +20 -12
  33. package/lib/generators/components/GenerateComponentHObjCpp.js +15 -1
  34. package/lib/generators/components/GenerateComponentHObjCpp.js.flow +11 -2
  35. package/lib/generators/components/GenerateEventEmitterCpp.js +28 -15
  36. package/lib/generators/components/GenerateEventEmitterCpp.js.flow +16 -17
  37. package/lib/generators/components/GenerateEventEmitterH.js +20 -13
  38. package/lib/generators/components/GenerateEventEmitterH.js.flow +13 -15
  39. package/lib/generators/components/GeneratePropsCpp.js +17 -8
  40. package/lib/generators/components/GeneratePropsCpp.js.flow +13 -9
  41. package/lib/generators/components/GeneratePropsH.js +23 -16
  42. package/lib/generators/components/GeneratePropsH.js.flow +12 -16
  43. package/lib/generators/components/GeneratePropsJavaDelegate.js +11 -3
  44. package/lib/generators/components/GeneratePropsJavaDelegate.js.flow +7 -4
  45. package/lib/generators/components/GeneratePropsJavaInterface.js +11 -3
  46. package/lib/generators/components/GeneratePropsJavaInterface.js.flow +6 -3
  47. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +6 -6
  48. package/lib/generators/components/GeneratePropsJavaPojo/index.js +1 -1
  49. package/lib/generators/components/GeneratePropsJavaPojo/index.js.flow +1 -1
  50. package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js.flow +1 -0
  51. package/lib/generators/components/GenerateShadowNodeCpp.js +19 -8
  52. package/lib/generators/components/GenerateShadowNodeCpp.js.flow +9 -8
  53. package/lib/generators/components/GenerateShadowNodeH.js +27 -11
  54. package/lib/generators/components/GenerateShadowNodeH.js.flow +11 -14
  55. package/lib/generators/components/GenerateStateCpp.js +19 -8
  56. package/lib/generators/components/GenerateStateCpp.js.flow +9 -8
  57. package/lib/generators/components/GenerateStateH.js +9 -5
  58. package/lib/generators/components/GenerateStateH.js.flow +3 -4
  59. package/lib/generators/components/GenerateTests.js +11 -5
  60. package/lib/generators/components/GenerateTests.js.flow +2 -2
  61. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +16 -3
  62. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +18 -3
  63. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +18 -3
  64. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +21 -3
  65. package/lib/generators/components/GenerateViewConfigJs.js +2 -2
  66. package/lib/generators/components/GenerateViewConfigJs.js.flow +2 -2
  67. package/lib/generators/components/JavaHelpers.js +8 -0
  68. package/lib/generators/components/JavaHelpers.js.flow +9 -0
  69. package/lib/generators/components/__test_fixtures__/fixtures.js +22 -0
  70. package/lib/generators/components/__test_fixtures__/fixtures.js.flow +22 -0
  71. package/lib/generators/modules/GenerateModuleCpp.js +14 -10
  72. package/lib/generators/modules/GenerateModuleCpp.js.flow +9 -10
  73. package/lib/generators/modules/GenerateModuleH.js +198 -72
  74. package/lib/generators/modules/GenerateModuleH.js.flow +186 -71
  75. package/lib/generators/modules/GenerateModuleJavaSpec.js +50 -57
  76. package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +45 -50
  77. package/lib/generators/modules/GenerateModuleJniCpp.js +16 -12
  78. package/lib/generators/modules/GenerateModuleJniCpp.js.flow +11 -12
  79. package/lib/generators/modules/GenerateModuleJniH.js +12 -5
  80. package/lib/generators/modules/GenerateModuleJniH.js.flow +8 -6
  81. package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js +5 -5
  82. package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js.flow +11 -12
  83. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js +23 -21
  84. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js.flow +19 -18
  85. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js +23 -21
  86. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js.flow +19 -18
  87. package/lib/generators/modules/GenerateModuleObjCpp/index.js +18 -20
  88. package/lib/generators/modules/GenerateModuleObjCpp/index.js.flow +11 -14
  89. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js +40 -42
  90. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +38 -44
  91. package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js +25 -27
  92. package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js.flow +26 -28
  93. package/lib/generators/modules/Utils.js +98 -0
  94. package/lib/generators/modules/Utils.js.flow +34 -2
  95. package/lib/generators/modules/__test_fixtures__/fixtures.js +685 -64
  96. package/lib/generators/modules/__test_fixtures__/fixtures.js.flow +686 -64
  97. package/lib/parsers/error-utils.js +17 -17
  98. package/lib/parsers/error-utils.js.flow +10 -10
  99. package/lib/parsers/errors.js +10 -0
  100. package/lib/parsers/errors.js.flow +15 -1
  101. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +7 -1
  102. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +7 -1
  103. package/lib/parsers/flow/components/commands.js +24 -0
  104. package/lib/parsers/flow/components/commands.js.flow +45 -3
  105. package/lib/parsers/flow/components/componentsUtils.js +5 -4
  106. package/lib/parsers/flow/components/componentsUtils.js.flow +4 -3
  107. package/lib/parsers/flow/components/events.js +7 -7
  108. package/lib/parsers/flow/components/events.js.flow +7 -7
  109. package/lib/parsers/flow/components/index.js +8 -8
  110. package/lib/parsers/flow/components/index.js.flow +3 -3
  111. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js +13 -0
  112. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js.flow +13 -0
  113. package/lib/parsers/flow/modules/index.js +20 -19
  114. package/lib/parsers/flow/modules/index.js.flow +10 -11
  115. package/lib/parsers/flow/parseFlowAndThrowErrors.js +105 -0
  116. package/lib/parsers/flow/parseFlowAndThrowErrors.js.flow +41 -0
  117. package/lib/parsers/flow/parser.js +24 -25
  118. package/lib/parsers/flow/parser.js.flow +27 -36
  119. package/lib/parsers/flow/utils.js.flow +1 -1
  120. package/lib/parsers/parser.js.flow +12 -10
  121. package/lib/parsers/parserMock.js +11 -12
  122. package/lib/parsers/parserMock.js.flow +25 -28
  123. package/lib/parsers/parsers-commons.js +85 -36
  124. package/lib/parsers/parsers-commons.js.flow +71 -37
  125. package/lib/parsers/parsers-primitives.js +17 -17
  126. package/lib/parsers/parsers-primitives.js.flow +14 -16
  127. package/lib/parsers/schema.js.flow +3 -3
  128. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +8 -1
  129. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +8 -1
  130. package/lib/parsers/typescript/components/commands.js +23 -15
  131. package/lib/parsers/typescript/components/commands.js.flow +24 -16
  132. package/lib/parsers/typescript/components/componentsUtils.js +34 -20
  133. package/lib/parsers/typescript/components/componentsUtils.js.flow +36 -19
  134. package/lib/parsers/typescript/components/events.js +22 -22
  135. package/lib/parsers/typescript/components/events.js.flow +11 -10
  136. package/lib/parsers/typescript/components/extends.js.flow +1 -0
  137. package/lib/parsers/typescript/components/index.js +10 -10
  138. package/lib/parsers/typescript/components/index.js.flow +4 -4
  139. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js +13 -0
  140. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js.flow +13 -0
  141. package/lib/parsers/typescript/modules/index.js +25 -20
  142. package/lib/parsers/typescript/modules/index.js.flow +16 -14
  143. package/lib/parsers/typescript/parser.js +25 -26
  144. package/lib/parsers/typescript/parser.js.flow +23 -27
  145. package/lib/parsers/utils.js +5 -0
  146. package/lib/parsers/utils.js.flow +6 -1
  147. package/package.json +8 -6
@@ -10,33 +10,33 @@
10
10
 
11
11
  'use strict';
12
12
  import type {
13
- NativeModuleBaseTypeAnnotation,
14
13
  NamedShape,
14
+ NativeModuleBaseTypeAnnotation,
15
15
  } from '../../CodegenSchema';
16
-
17
16
  import type {
18
- Nullable,
19
- SchemaType,
20
- NativeModuleTypeAnnotation,
21
- NativeModuleFunctionTypeAnnotation,
22
- NativeModulePropertyShape,
23
17
  NativeModuleAliasMap,
24
18
  NativeModuleEnumMap,
25
19
  NativeModuleEnumMembers,
26
20
  NativeModuleEnumMemberType,
21
+ NativeModuleFunctionTypeAnnotation,
22
+ NativeModulePropertyShape,
23
+ NativeModuleTypeAnnotation,
24
+ Nullable,
25
+ SchemaType,
27
26
  } from '../../CodegenSchema';
28
-
29
27
  import type {AliasResolver} from './Utils';
30
28
 
29
+ const {unwrapNullable} = require('../../parsers/parsers-commons');
30
+ const {wrapOptional} = require('../TypeUtils/Cxx');
31
31
  const {getEnumName, toSafeCppString} = require('../Utils');
32
-
32
+ const {indent} = require('../Utils');
33
33
  const {
34
34
  createAliasResolver,
35
- getModules,
36
35
  getAreEnumMembersInteger,
36
+ getModules,
37
+ isArrayRecursiveMember,
38
+ isDirectRecursiveMember,
37
39
  } = require('./Utils');
38
- const {indent} = require('../Utils');
39
- const {unwrapNullable} = require('../../parsers/parsers-commons');
40
40
 
41
41
  type FilesOutput = Map<string, string>;
42
42
 
@@ -83,7 +83,7 @@ public:
83
83
  protected:
84
84
  ${hasteModuleName}CxxSpec(std::shared_ptr<CallInvoker> jsInvoker)
85
85
  : TurboModule(std::string{${hasteModuleName}CxxSpec::kModuleName}, jsInvoker),
86
- delegate_(static_cast<T*>(this), jsInvoker) {}
86
+ delegate_(reinterpret_cast<T*>(this), jsInvoker) {}
87
87
 
88
88
  private:
89
89
  class Delegate : public ${hasteModuleName}CxxSpecJSI {
@@ -120,18 +120,17 @@ const FileTemplate = ({
120
120
  #include <ReactCommon/TurboModule.h>
121
121
  #include <react/bridging/Bridging.h>
122
122
 
123
- namespace facebook {
124
- namespace react {
123
+ namespace facebook::react {
125
124
 
126
125
  ${modules.join('\n\n')}
127
126
 
128
- } // namespace react
129
- } // namespace facebook
127
+ } // namespace facebook::react
130
128
  `;
131
129
  };
132
130
 
133
131
  function translatePrimitiveJSTypeToCpp(
134
132
  moduleName: string,
133
+ parentObjectAliasName: ?string,
135
134
  nullableTypeAnnotation: Nullable<NativeModuleTypeAnnotation>,
136
135
  optional: boolean,
137
136
  createErrorMessage: (typeName: string) => string,
@@ -141,22 +140,21 @@ function translatePrimitiveJSTypeToCpp(
141
140
  const [typeAnnotation, nullable] = unwrapNullable<NativeModuleTypeAnnotation>(
142
141
  nullableTypeAnnotation,
143
142
  );
144
- const isRequired = !optional && !nullable;
145
-
143
+ const isRecursiveType = isDirectRecursiveMember(
144
+ parentObjectAliasName,
145
+ nullableTypeAnnotation,
146
+ );
147
+ const isRequired = (!optional && !nullable) || isRecursiveType;
146
148
  let realTypeAnnotation = typeAnnotation;
147
149
  if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
148
150
  realTypeAnnotation = resolveAlias(realTypeAnnotation.name);
149
151
  }
150
152
 
151
- function wrap(type: string) {
152
- return isRequired ? type : `std::optional<${type}>`;
153
- }
154
-
155
153
  switch (realTypeAnnotation.type) {
156
154
  case 'ReservedTypeAnnotation':
157
155
  switch (realTypeAnnotation.name) {
158
156
  case 'RootTag':
159
- return wrap('double');
157
+ return wrapOptional('double', isRequired);
160
158
  default:
161
159
  (realTypeAnnotation.name: empty);
162
160
  throw new Error(createErrorMessage(realTypeAnnotation.name));
@@ -164,53 +162,49 @@ function translatePrimitiveJSTypeToCpp(
164
162
  case 'VoidTypeAnnotation':
165
163
  return 'void';
166
164
  case 'StringTypeAnnotation':
167
- return wrap('jsi::String');
165
+ return wrapOptional('jsi::String', isRequired);
168
166
  case 'NumberTypeAnnotation':
169
- return wrap('double');
167
+ return wrapOptional('double', isRequired);
170
168
  case 'DoubleTypeAnnotation':
171
- return wrap('double');
169
+ return wrapOptional('double', isRequired);
172
170
  case 'FloatTypeAnnotation':
173
- return wrap('double');
171
+ return wrapOptional('double', isRequired);
174
172
  case 'Int32TypeAnnotation':
175
- return wrap('int');
173
+ return wrapOptional('int', isRequired);
176
174
  case 'BooleanTypeAnnotation':
177
- return wrap('bool');
175
+ return wrapOptional('bool', isRequired);
178
176
  case 'EnumDeclaration':
179
177
  switch (realTypeAnnotation.memberType) {
180
178
  case 'NumberTypeAnnotation':
181
- return getAreEnumMembersInteger(
182
- enumMap[realTypeAnnotation.name].members,
183
- )
184
- ? wrap('int')
185
- : wrap('double');
179
+ return wrapOptional('jsi::Value', isRequired);
186
180
  case 'StringTypeAnnotation':
187
- return wrap('jsi::String');
181
+ return wrapOptional('jsi::String', isRequired);
188
182
  default:
189
183
  throw new Error(createErrorMessage(realTypeAnnotation.type));
190
184
  }
191
185
  case 'GenericObjectTypeAnnotation':
192
- return wrap('jsi::Object');
186
+ return wrapOptional('jsi::Object', isRequired);
193
187
  case 'UnionTypeAnnotation':
194
188
  switch (typeAnnotation.memberType) {
195
189
  case 'NumberTypeAnnotation':
196
- return wrap('double');
190
+ return wrapOptional('double', isRequired);
197
191
  case 'ObjectTypeAnnotation':
198
- return wrap('jsi::Object');
192
+ return wrapOptional('jsi::Object', isRequired);
199
193
  case 'StringTypeAnnotation':
200
- return wrap('jsi::String');
194
+ return wrapOptional('jsi::String', isRequired);
201
195
  default:
202
196
  throw new Error(createErrorMessage(realTypeAnnotation.type));
203
197
  }
204
198
  case 'ObjectTypeAnnotation':
205
- return wrap('jsi::Object');
199
+ return wrapOptional('jsi::Object', isRequired);
206
200
  case 'ArrayTypeAnnotation':
207
- return wrap('jsi::Array');
201
+ return wrapOptional('jsi::Array', isRequired);
208
202
  case 'FunctionTypeAnnotation':
209
- return wrap('jsi::Function');
203
+ return wrapOptional('jsi::Function', isRequired);
210
204
  case 'PromiseTypeAnnotation':
211
- return wrap('jsi::Value');
205
+ return wrapOptional('jsi::Value', isRequired);
212
206
  case 'MixedTypeAnnotation':
213
- return wrap('jsi::Value');
207
+ return wrapOptional('jsi::Value', isRequired);
214
208
  default:
215
209
  (realTypeAnnotation.type: empty);
216
210
  throw new Error(createErrorMessage(realTypeAnnotation.type));
@@ -224,10 +218,12 @@ function createStructsString(
224
218
  enumMap: NativeModuleEnumMap,
225
219
  ): string {
226
220
  const getCppType = (
221
+ parentObjectAlias: string,
227
222
  v: NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>,
228
223
  ) =>
229
224
  translatePrimitiveJSTypeToCpp(
230
225
  moduleName,
226
+ parentObjectAlias,
231
227
  v.typeAnnotation,
232
228
  false,
233
229
  typeName => `Unsupported type for param "${v.name}". Found: ${typeName}`,
@@ -235,33 +231,36 @@ function createStructsString(
235
231
  enumMap,
236
232
  );
237
233
 
238
- return Object.keys(aliasMap)
239
- .map(alias => {
240
- const value = aliasMap[alias];
241
- if (value.properties.length === 0) {
242
- return '';
243
- }
244
- const structName = `${moduleName}Base${alias}`;
245
- const templateParameterWithTypename = value.properties
246
- .map((v, i) => `typename P${i}`)
247
- .join(', ');
248
- const templateParameter = value.properties
249
- .map((v, i) => 'P' + i)
250
- .join(', ');
251
- const debugParameterConversion = value.properties
252
- .map(
253
- (v, i) => ` static ${getCppType(v)} ${
254
- v.name
255
- }ToJs(jsi::Runtime &rt, P${i} value) {
234
+ // TODO: T171006733 [Begin] Remove deprecated Cxx TMs structs after a new release.
235
+ return (
236
+ Object.keys(aliasMap)
237
+ .map(alias => {
238
+ const value = aliasMap[alias];
239
+ if (value.properties.length === 0) {
240
+ return '';
241
+ }
242
+ const structName = `${moduleName}Base${alias}`;
243
+ const structNameNew = `${moduleName}${alias}`;
244
+ const templateParameterWithTypename = value.properties
245
+ .map((v, i) => `typename P${i}`)
246
+ .join(', ');
247
+ const templateParameter = value.properties
248
+ .map((v, i) => 'P' + i)
249
+ .join(', ');
250
+ const debugParameterConversion = value.properties
251
+ .map(
252
+ (v, i) => ` static ${getCppType(alias, v)} ${
253
+ v.name
254
+ }ToJs(jsi::Runtime &rt, P${i} value) {
256
255
  return bridging::toJs(rt, value);
257
256
  }`,
258
- )
259
- .join('\n\n');
260
- return `
257
+ )
258
+ .join('\n\n');
259
+ return `
261
260
  #pragma mark - ${structName}
262
261
 
263
262
  template <${templateParameterWithTypename}>
264
- struct ${structName} {
263
+ struct [[deprecated("Use ${structNameNew} instead.")]] ${structName} {
265
264
  ${value.properties.map((v, i) => ' P' + i + ' ' + v.name).join(';\n')};
266
265
  bool operator==(const ${structName} &other) const {
267
266
  return ${value.properties
@@ -271,7 +270,7 @@ ${value.properties.map((v, i) => ' P' + i + ' ' + v.name).join(';\n')};
271
270
  };
272
271
 
273
272
  template <${templateParameterWithTypename}>
274
- struct ${structName}Bridging {
273
+ struct [[deprecated("Use ${structNameNew}Bridging instead.")]] ${structName}Bridging {
275
274
  static ${structName}<${templateParameter}> fromJs(
276
275
  jsi::Runtime &rt,
277
276
  const jsi::Object &value,
@@ -311,8 +310,121 @@ ${value.properties
311
310
  };
312
311
 
313
312
  `;
314
- })
315
- .join('\n');
313
+ })
314
+ .join('\n') +
315
+ // TODO: T171006733 [End] Remove deprecated Cxx TMs structs after a new release.
316
+ Object.keys(aliasMap)
317
+ .map(alias => {
318
+ const value = aliasMap[alias];
319
+ if (value.properties.length === 0) {
320
+ return '';
321
+ }
322
+ const structName = `${moduleName}${alias}`;
323
+ const templateParameter = value.properties.filter(
324
+ v =>
325
+ !isDirectRecursiveMember(alias, v.typeAnnotation) &&
326
+ !isArrayRecursiveMember(alias, v.typeAnnotation),
327
+ );
328
+ const templateParameterWithTypename = templateParameter
329
+ .map((v, i) => `typename P${i}`)
330
+ .join(', ');
331
+ const templateParameterWithoutTypename = templateParameter
332
+ .map((v, i) => `P${i}`)
333
+ .join(', ');
334
+ let i = -1;
335
+ const templateMemberTypes = value.properties.map(v => {
336
+ if (isDirectRecursiveMember(alias, v.typeAnnotation)) {
337
+ return `std::unique_ptr<${structName}<${templateParameterWithoutTypename}>> ${v.name}`;
338
+ } else if (isArrayRecursiveMember(alias, v.typeAnnotation)) {
339
+ const [nullable] = unwrapNullable<NativeModuleTypeAnnotation>(
340
+ v.typeAnnotation,
341
+ );
342
+ return (
343
+ (nullable
344
+ ? `std::optional<std::vector<${structName}<${templateParameterWithoutTypename}>>>`
345
+ : `std::vector<${structName}<${templateParameterWithoutTypename}>>`) +
346
+ ` ${v.name}`
347
+ );
348
+ } else {
349
+ i++;
350
+ return `P${i} ${v.name}`;
351
+ }
352
+ });
353
+ const debugParameterConversion = value.properties
354
+ .map(
355
+ v => ` static ${getCppType(alias, v)} ${
356
+ v.name
357
+ }ToJs(jsi::Runtime &rt, decltype(types.${v.name}) value) {
358
+ return bridging::toJs(rt, value);
359
+ }`,
360
+ )
361
+ .join('\n\n');
362
+ return `
363
+ #pragma mark - ${structName}
364
+
365
+ template <${templateParameterWithTypename}>
366
+ struct ${structName} {
367
+ ${templateMemberTypes.map(v => ' ' + v).join(';\n')};
368
+ bool operator==(const ${structName} &other) const {
369
+ return ${value.properties
370
+ .map(v => `${v.name} == other.${v.name}`)
371
+ .join(' && ')};
372
+ }
373
+ };
374
+
375
+ template <typename T>
376
+ struct ${structName}Bridging {
377
+ static T types;
378
+
379
+ static T fromJs(
380
+ jsi::Runtime &rt,
381
+ const jsi::Object &value,
382
+ const std::shared_ptr<CallInvoker> &jsInvoker) {
383
+ T result{
384
+ ${value.properties
385
+ .map(v => {
386
+ if (isDirectRecursiveMember(alias, v.typeAnnotation)) {
387
+ return ` value.hasProperty(rt, "${v.name}") ? std::make_unique<T>(bridging::fromJs<T>(rt, value.getProperty(rt, "${v.name}"), jsInvoker)) : nullptr`;
388
+ } else {
389
+ return ` bridging::fromJs<decltype(types.${v.name})>(rt, value.getProperty(rt, "${v.name}"), jsInvoker)`;
390
+ }
391
+ })
392
+ .join(',\n')}};
393
+ return result;
394
+ }
395
+
396
+ #ifdef DEBUG
397
+ ${debugParameterConversion}
398
+ #endif
399
+
400
+ static jsi::Object toJs(
401
+ jsi::Runtime &rt,
402
+ const T &value,
403
+ const std::shared_ptr<CallInvoker> &jsInvoker) {
404
+ auto result = facebook::jsi::Object(rt);
405
+ ${value.properties
406
+ .map(v => {
407
+ if (isDirectRecursiveMember(alias, v.typeAnnotation)) {
408
+ return ` if (value.${v.name}) {
409
+ result.setProperty(rt, "${v.name}", bridging::toJs(rt, *value.${v.name}, jsInvoker));
410
+ }`;
411
+ } else if (v.optional) {
412
+ return ` if (value.${v.name}) {
413
+ result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}.value(), jsInvoker));
414
+ }`;
415
+ } else {
416
+ return ` result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}, jsInvoker));`;
417
+ }
418
+ })
419
+ .join('\n')}
420
+ return result;
421
+ }
422
+ };
423
+
424
+ `;
425
+ })
426
+ .join('\n')
427
+ );
316
428
  }
317
429
 
318
430
  type NativeEnumMemberValueType = 'std::string' | 'int32_t' | 'float';
@@ -346,7 +458,7 @@ const EnumTemplate = ({
346
458
  return `
347
459
  #pragma mark - ${enumName}
348
460
 
349
- enum ${enumName} { ${values} };
461
+ enum class ${enumName} { ${values} };
350
462
 
351
463
  template <>
352
464
  struct Bridging<${enumName}> {
@@ -449,6 +561,7 @@ function translatePropertyToCpp(
449
561
  const paramTypes = propTypeAnnotation.params.map(param => {
450
562
  const translatedParam = translatePrimitiveJSTypeToCpp(
451
563
  moduleName,
564
+ null,
452
565
  param.typeAnnotation,
453
566
  param.optional,
454
567
  typeName =>
@@ -461,6 +574,7 @@ function translatePropertyToCpp(
461
574
 
462
575
  const returnType = translatePrimitiveJSTypeToCpp(
463
576
  moduleName,
577
+ null,
464
578
  propTypeAnnotation.returnTypeAnnotation,
465
579
  false,
466
580
  typeName => `Unsupported return type for ${prop.name}. Found: ${typeName}`,
@@ -493,6 +607,7 @@ module.exports = {
493
607
  schema: SchemaType,
494
608
  packageName?: string,
495
609
  assumeNonnull: boolean = false,
610
+ headerPrefix?: string,
496
611
  ): FilesOutput {
497
612
  const nativeModules = getModules(schema);
498
613
 
@@ -78,11 +78,13 @@ function _iterableToArrayLimit(arr, i) {
78
78
  function _arrayWithHoles(arr) {
79
79
  if (Array.isArray(arr)) return arr;
80
80
  }
81
- const _require = require('./Utils'),
82
- createAliasResolver = _require.createAliasResolver,
83
- getModules = _require.getModules;
84
- const _require2 = require('../../parsers/parsers-commons'),
85
- unwrapNullable = _require2.unwrapNullable;
81
+ const _require = require('../../parsers/parsers-commons'),
82
+ unwrapNullable = _require.unwrapNullable;
83
+ const _require2 = require('../TypeUtils/Java'),
84
+ wrapOptional = _require2.wrapOptional;
85
+ const _require3 = require('./Utils'),
86
+ createAliasResolver = _require3.createAliasResolver,
87
+ getModules = _require3.getModules;
86
88
  function FileTemplate(config) {
87
89
  const packageName = config.packageName,
88
90
  className = config.className,
@@ -152,16 +154,8 @@ function translateFunctionParamToJavaType(
152
154
  typeAnnotation = _unwrapNullable2[0],
153
155
  nullable = _unwrapNullable2[1];
154
156
  const isRequired = !optional && !nullable;
155
- function wrapNullable(javaType, nullableType) {
156
- if (!isRequired) {
157
- imports.add('javax.annotation.Nullable');
158
- return `@Nullable ${
159
- nullableType !== null && nullableType !== void 0
160
- ? nullableType
161
- : javaType
162
- }`;
163
- }
164
- return javaType;
157
+ if (!isRequired) {
158
+ imports.add('javax.annotation.Nullable');
165
159
  }
166
160
 
167
161
  // FIXME: support class alias for args
@@ -173,41 +167,41 @@ function translateFunctionParamToJavaType(
173
167
  case 'ReservedTypeAnnotation':
174
168
  switch (realTypeAnnotation.name) {
175
169
  case 'RootTag':
176
- return wrapNullable('double', 'Double');
170
+ return wrapOptional('double', isRequired);
177
171
  default:
178
172
  realTypeAnnotation.name;
179
173
  throw new Error(createErrorMessage(realTypeAnnotation.name));
180
174
  }
181
175
  case 'StringTypeAnnotation':
182
- return wrapNullable('String');
176
+ return wrapOptional('String', isRequired);
183
177
  case 'NumberTypeAnnotation':
184
- return wrapNullable('double', 'Double');
178
+ return wrapOptional('double', isRequired);
185
179
  case 'FloatTypeAnnotation':
186
- return wrapNullable('double', 'Double');
180
+ return wrapOptional('float', isRequired);
187
181
  case 'DoubleTypeAnnotation':
188
- return wrapNullable('double', 'Double');
182
+ return wrapOptional('double', isRequired);
189
183
  case 'Int32TypeAnnotation':
190
- return wrapNullable('double', 'Double');
184
+ return wrapOptional('int', isRequired);
191
185
  case 'BooleanTypeAnnotation':
192
- return wrapNullable('boolean', 'Boolean');
186
+ return wrapOptional('boolean', isRequired);
193
187
  case 'EnumDeclaration':
194
188
  switch (realTypeAnnotation.memberType) {
195
189
  case 'NumberTypeAnnotation':
196
- return wrapNullable('double', 'Double');
190
+ return wrapOptional('double', isRequired);
197
191
  case 'StringTypeAnnotation':
198
- return wrapNullable('String');
192
+ return wrapOptional('String', isRequired);
199
193
  default:
200
194
  throw new Error(createErrorMessage(realTypeAnnotation.type));
201
195
  }
202
196
  case 'UnionTypeAnnotation':
203
197
  switch (typeAnnotation.memberType) {
204
198
  case 'NumberTypeAnnotation':
205
- return wrapNullable('double', 'Double');
199
+ return wrapOptional('double', isRequired);
206
200
  case 'ObjectTypeAnnotation':
207
201
  imports.add('com.facebook.react.bridge.ReadableMap');
208
- return wrapNullable('ReadableMap');
202
+ return wrapOptional('ReadableMap', isRequired);
209
203
  case 'StringTypeAnnotation':
210
- return wrapNullable('String');
204
+ return wrapOptional('String', isRequired);
211
205
  default:
212
206
  throw new Error(
213
207
  `Unsupported union member returning value, found: ${realTypeAnnotation.memberType}"`,
@@ -215,17 +209,17 @@ function translateFunctionParamToJavaType(
215
209
  }
216
210
  case 'ObjectTypeAnnotation':
217
211
  imports.add('com.facebook.react.bridge.ReadableMap');
218
- return wrapNullable('ReadableMap');
212
+ return wrapOptional('ReadableMap', isRequired);
219
213
  case 'GenericObjectTypeAnnotation':
220
214
  // Treat this the same as ObjectTypeAnnotation for now.
221
215
  imports.add('com.facebook.react.bridge.ReadableMap');
222
- return wrapNullable('ReadableMap');
216
+ return wrapOptional('ReadableMap', isRequired);
223
217
  case 'ArrayTypeAnnotation':
224
218
  imports.add('com.facebook.react.bridge.ReadableArray');
225
- return wrapNullable('ReadableArray');
219
+ return wrapOptional('ReadableArray', isRequired);
226
220
  case 'FunctionTypeAnnotation':
227
221
  imports.add('com.facebook.react.bridge.Callback');
228
- return wrapNullable('Callback');
222
+ return wrapOptional('Callback', isRequired);
229
223
  default:
230
224
  realTypeAnnotation.type;
231
225
  throw new Error(createErrorMessage(realTypeAnnotation.type));
@@ -241,17 +235,10 @@ function translateFunctionReturnTypeToJavaType(
241
235
  _unwrapNullable4 = _slicedToArray(_unwrapNullable3, 2),
242
236
  returnTypeAnnotation = _unwrapNullable4[0],
243
237
  nullable = _unwrapNullable4[1];
244
- function wrapNullable(javaType, nullableType) {
245
- if (nullable) {
246
- imports.add('javax.annotation.Nullable');
247
- return `@Nullable ${
248
- nullableType !== null && nullableType !== void 0
249
- ? nullableType
250
- : javaType
251
- }`;
252
- }
253
- return javaType;
238
+ if (nullable) {
239
+ imports.add('javax.annotation.Nullable');
254
240
  }
241
+ const isRequired = !nullable;
255
242
 
256
243
  // FIXME: support class alias for args
257
244
  let realTypeAnnotation = returnTypeAnnotation;
@@ -262,7 +249,7 @@ function translateFunctionReturnTypeToJavaType(
262
249
  case 'ReservedTypeAnnotation':
263
250
  switch (realTypeAnnotation.name) {
264
251
  case 'RootTag':
265
- return wrapNullable('double', 'Double');
252
+ return wrapOptional('double', isRequired);
266
253
  default:
267
254
  realTypeAnnotation.name;
268
255
  throw new Error(createErrorMessage(realTypeAnnotation.name));
@@ -272,35 +259,35 @@ function translateFunctionReturnTypeToJavaType(
272
259
  case 'PromiseTypeAnnotation':
273
260
  return 'void';
274
261
  case 'StringTypeAnnotation':
275
- return wrapNullable('String');
262
+ return wrapOptional('String', isRequired);
276
263
  case 'NumberTypeAnnotation':
277
- return wrapNullable('double', 'Double');
264
+ return wrapOptional('double', isRequired);
278
265
  case 'FloatTypeAnnotation':
279
- return wrapNullable('double', 'Double');
266
+ return wrapOptional('double', isRequired);
280
267
  case 'DoubleTypeAnnotation':
281
- return wrapNullable('double', 'Double');
268
+ return wrapOptional('double', isRequired);
282
269
  case 'Int32TypeAnnotation':
283
- return wrapNullable('double', 'Double');
270
+ return wrapOptional('double', isRequired);
284
271
  case 'BooleanTypeAnnotation':
285
- return wrapNullable('boolean', 'Boolean');
272
+ return wrapOptional('boolean', isRequired);
286
273
  case 'EnumDeclaration':
287
274
  switch (realTypeAnnotation.memberType) {
288
275
  case 'NumberTypeAnnotation':
289
- return wrapNullable('double', 'Double');
276
+ return wrapOptional('double', isRequired);
290
277
  case 'StringTypeAnnotation':
291
- return wrapNullable('String');
278
+ return wrapOptional('String', isRequired);
292
279
  default:
293
280
  throw new Error(createErrorMessage(realTypeAnnotation.type));
294
281
  }
295
282
  case 'UnionTypeAnnotation':
296
283
  switch (realTypeAnnotation.memberType) {
297
284
  case 'NumberTypeAnnotation':
298
- return wrapNullable('double', 'Double');
285
+ return wrapOptional('double', isRequired);
299
286
  case 'ObjectTypeAnnotation':
300
287
  imports.add('com.facebook.react.bridge.WritableMap');
301
- return wrapNullable('WritableMap');
288
+ return wrapOptional('WritableMap', isRequired);
302
289
  case 'StringTypeAnnotation':
303
- return wrapNullable('String');
290
+ return wrapOptional('String', isRequired);
304
291
  default:
305
292
  throw new Error(
306
293
  `Unsupported union member returning value, found: ${realTypeAnnotation.memberType}"`,
@@ -308,13 +295,13 @@ function translateFunctionReturnTypeToJavaType(
308
295
  }
309
296
  case 'ObjectTypeAnnotation':
310
297
  imports.add('com.facebook.react.bridge.WritableMap');
311
- return wrapNullable('WritableMap');
298
+ return wrapOptional('WritableMap', isRequired);
312
299
  case 'GenericObjectTypeAnnotation':
313
300
  imports.add('com.facebook.react.bridge.WritableMap');
314
- return wrapNullable('WritableMap');
301
+ return wrapOptional('WritableMap', isRequired);
315
302
  case 'ArrayTypeAnnotation':
316
303
  imports.add('com.facebook.react.bridge.WritableArray');
317
- return wrapNullable('WritableArray');
304
+ return wrapOptional('WritableArray', isRequired);
318
305
  default:
319
306
  realTypeAnnotation.type;
320
307
  throw new Error(createErrorMessage(realTypeAnnotation.type));
@@ -468,7 +455,13 @@ function buildGetConstantsMethod(method, imports, resolveAlias) {
468
455
  return '';
469
456
  }
470
457
  module.exports = {
471
- generate(libraryName, schema, packageName, assumeNonnull = false) {
458
+ generate(
459
+ libraryName,
460
+ schema,
461
+ packageName,
462
+ assumeNonnull = false,
463
+ headerPrefix,
464
+ ) {
472
465
  const files = new Map();
473
466
  const nativeModules = getModules(schema);
474
467
  const normalizedPackageName =