@react-native/codegen 0.73.0 → 0.74.0-nightly-20231003-5dedf277c

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 (82) hide show
  1. package/README.md +2 -2
  2. package/lib/CodegenSchema.d.ts +15 -4
  3. package/lib/CodegenSchema.js.flow +33 -21
  4. package/lib/cli/combine/combine-js-to-schema-cli.js +7 -1
  5. package/lib/cli/combine/combine-js-to-schema-cli.js.flow +7 -1
  6. package/lib/generators/components/CppHelpers.js +39 -2
  7. package/lib/generators/components/CppHelpers.js.flow +54 -5
  8. package/lib/generators/components/GenerateEventEmitterCpp.js +222 -28
  9. package/lib/generators/components/GenerateEventEmitterCpp.js.flow +221 -34
  10. package/lib/generators/components/GenerateEventEmitterH.js +77 -26
  11. package/lib/generators/components/GenerateEventEmitterH.js.flow +87 -30
  12. package/lib/generators/components/GeneratePropsH.js +2 -3
  13. package/lib/generators/components/GeneratePropsH.js.flow +2 -3
  14. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js +0 -1
  15. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +3 -5
  16. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +4 -0
  17. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +4 -0
  18. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +2 -0
  19. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +2 -0
  20. package/lib/generators/components/__test_fixtures__/fixtures.js +114 -1
  21. package/lib/generators/components/__test_fixtures__/fixtures.js.flow +114 -1
  22. package/lib/generators/modules/GenerateModuleCpp.js +1 -1
  23. package/lib/generators/modules/GenerateModuleCpp.js.flow +1 -1
  24. package/lib/generators/modules/GenerateModuleH.js +44 -39
  25. package/lib/generators/modules/GenerateModuleH.js.flow +51 -39
  26. package/lib/generators/modules/GenerateModuleJavaSpec.js +9 -7
  27. package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +10 -6
  28. package/lib/generators/modules/GenerateModuleJniH.js +1 -1
  29. package/lib/generators/modules/GenerateModuleJniH.js.flow +1 -1
  30. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js +11 -3
  31. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +13 -3
  32. package/lib/parsers/error-utils.js +44 -0
  33. package/lib/parsers/error-utils.js.flow +59 -0
  34. package/lib/parsers/errors.js +3 -9
  35. package/lib/parsers/errors.js.flow +3 -9
  36. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +51 -0
  37. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +51 -0
  38. package/lib/parsers/flow/components/componentsUtils.js +22 -33
  39. package/lib/parsers/flow/components/componentsUtils.js.flow +24 -45
  40. package/lib/parsers/flow/components/events.js +151 -128
  41. package/lib/parsers/flow/components/events.js.flow +161 -136
  42. package/lib/parsers/flow/components/index.js +13 -94
  43. package/lib/parsers/flow/components/index.js.flow +5 -102
  44. package/lib/parsers/flow/modules/index.js +24 -24
  45. package/lib/parsers/flow/modules/index.js.flow +6 -6
  46. package/lib/parsers/flow/parser.d.ts +9 -2
  47. package/lib/parsers/flow/parser.js +179 -18
  48. package/lib/parsers/flow/parser.js.flow +231 -7
  49. package/lib/parsers/flow/utils.js +0 -63
  50. package/lib/parsers/flow/utils.js.flow +1 -77
  51. package/lib/parsers/parser.js.flow +176 -3
  52. package/lib/parsers/parserMock.js +202 -4
  53. package/lib/parsers/parserMock.js.flow +253 -4
  54. package/lib/parsers/parsers-commons.js +268 -10
  55. package/lib/parsers/parsers-commons.js.flow +365 -12
  56. package/lib/parsers/parsers-primitives.js +95 -1
  57. package/lib/parsers/parsers-primitives.js.flow +136 -1
  58. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +51 -0
  59. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +51 -0
  60. package/lib/parsers/typescript/components/componentsUtils.js +49 -57
  61. package/lib/parsers/typescript/components/componentsUtils.js.flow +48 -66
  62. package/lib/parsers/typescript/components/events.js +136 -115
  63. package/lib/parsers/typescript/components/events.js.flow +148 -119
  64. package/lib/parsers/typescript/components/extends.js +2 -49
  65. package/lib/parsers/typescript/components/extends.js.flow +1 -55
  66. package/lib/parsers/typescript/components/index.js +14 -99
  67. package/lib/parsers/typescript/components/index.js.flow +6 -106
  68. package/lib/parsers/typescript/modules/index.js +28 -26
  69. package/lib/parsers/typescript/modules/index.js.flow +9 -8
  70. package/lib/parsers/typescript/parser.d.ts +9 -2
  71. package/lib/parsers/typescript/parser.js +208 -14
  72. package/lib/parsers/typescript/parser.js.flow +247 -8
  73. package/lib/parsers/utils.js.flow +6 -0
  74. package/package.json +27 -16
  75. package/lib/parsers/flow/components/extends.js +0 -52
  76. package/lib/parsers/flow/components/extends.js.flow +0 -66
  77. package/lib/parsers/flow/components/props.js +0 -47
  78. package/lib/parsers/flow/components/props.js.flow +0 -60
  79. package/lib/parsers/typescript/components/props.js +0 -39
  80. package/lib/parsers/typescript/components/props.js.flow +0 -48
  81. package/lib/parsers/typescript/utils.js +0 -90
  82. package/lib/parsers/typescript/utils.js.flow +0 -104
@@ -123,7 +123,7 @@ const EVENTS_WITH_PAPER_NAME: SchemaType = {
123
123
  },
124
124
  },
125
125
  {
126
- name: 'onDire tChange',
126
+ name: 'onDirectChange',
127
127
  paperTopLevelNameDeprecated: 'paperDirectChange',
128
128
  optional: true,
129
129
  bubblingType: 'direct',
@@ -1206,6 +1206,99 @@ const EVENT_PROPS: SchemaType = {
1206
1206
  },
1207
1207
  },
1208
1208
  },
1209
+ {
1210
+ name: 'onArrayEventType',
1211
+ optional: true,
1212
+ bubblingType: 'bubble',
1213
+ typeAnnotation: {
1214
+ type: 'EventTypeAnnotation',
1215
+ argument: {
1216
+ type: 'ObjectTypeAnnotation',
1217
+ properties: [
1218
+ {
1219
+ name: 'bool_array_event_prop',
1220
+ optional: false,
1221
+ typeAnnotation: {
1222
+ type: 'ArrayTypeAnnotation',
1223
+ elementType: {
1224
+ type: 'BooleanTypeAnnotation',
1225
+ },
1226
+ },
1227
+ },
1228
+ {
1229
+ name: 'string_enum_event_prop',
1230
+ optional: false,
1231
+ typeAnnotation: {
1232
+ type: 'ArrayTypeAnnotation',
1233
+ elementType: {
1234
+ type: 'StringEnumTypeAnnotation',
1235
+ options: ['YES', 'NO'],
1236
+ },
1237
+ },
1238
+ },
1239
+ {
1240
+ name: 'array_array_event_prop',
1241
+ optional: false,
1242
+ typeAnnotation: {
1243
+ type: 'ArrayTypeAnnotation',
1244
+ elementType: {
1245
+ type: 'ArrayTypeAnnotation',
1246
+ elementType: {
1247
+ type: 'StringTypeAnnotation',
1248
+ },
1249
+ },
1250
+ },
1251
+ },
1252
+ {
1253
+ name: 'array_object_event_prop',
1254
+ optional: false,
1255
+ typeAnnotation: {
1256
+ type: 'ArrayTypeAnnotation',
1257
+ elementType: {
1258
+ type: 'ObjectTypeAnnotation',
1259
+ properties: [
1260
+ {
1261
+ name: 'lat',
1262
+ optional: false,
1263
+ typeAnnotation: {
1264
+ type: 'DoubleTypeAnnotation',
1265
+ },
1266
+ },
1267
+ {
1268
+ name: 'lon',
1269
+ optional: false,
1270
+ typeAnnotation: {
1271
+ type: 'DoubleTypeAnnotation',
1272
+ },
1273
+ },
1274
+ {
1275
+ name: 'names',
1276
+ optional: false,
1277
+ typeAnnotation: {
1278
+ type: 'ArrayTypeAnnotation',
1279
+ elementType: {
1280
+ type: 'StringTypeAnnotation',
1281
+ },
1282
+ },
1283
+ },
1284
+ ],
1285
+ },
1286
+ },
1287
+ },
1288
+ {
1289
+ name: 'array_mixed_event_prop',
1290
+ optional: false,
1291
+ typeAnnotation: {
1292
+ type: 'ArrayTypeAnnotation',
1293
+ elementType: {
1294
+ type: 'MixedTypeAnnotation',
1295
+ },
1296
+ },
1297
+ },
1298
+ ],
1299
+ },
1300
+ },
1301
+ },
1209
1302
  {
1210
1303
  name: 'onEventDirect',
1211
1304
  optional: true,
@@ -1255,6 +1348,26 @@ const EVENT_PROPS: SchemaType = {
1255
1348
  type: 'EventTypeAnnotation',
1256
1349
  },
1257
1350
  },
1351
+ {
1352
+ name: 'onEventWithMixedPropAttribute',
1353
+ optional: true,
1354
+ bubblingType: 'direct',
1355
+ typeAnnotation: {
1356
+ type: 'EventTypeAnnotation',
1357
+ argument: {
1358
+ type: 'ObjectTypeAnnotation',
1359
+ properties: [
1360
+ {
1361
+ name: 'value',
1362
+ optional: false,
1363
+ typeAnnotation: {
1364
+ type: 'MixedTypeAnnotation',
1365
+ },
1366
+ },
1367
+ ],
1368
+ },
1369
+ },
1370
+ },
1258
1371
  ],
1259
1372
  props: [
1260
1373
  {
@@ -133,7 +133,7 @@ const FileTemplate = ({libraryName, modules}) => {
133
133
  * Do not edit this file as changes may cause incorrect behavior and will be lost
134
134
  * once the code is regenerated.
135
135
  *
136
- * ${'@'}generated by codegen project: GenerateModuleH.js
136
+ * ${'@'}generated by codegen project: GenerateModuleCpp.js
137
137
  */
138
138
 
139
139
  #include "${libraryName}JSI.h"
@@ -96,7 +96,7 @@ const FileTemplate = ({
96
96
  * Do not edit this file as changes may cause incorrect behavior and will be lost
97
97
  * once the code is regenerated.
98
98
  *
99
- * ${'@'}generated by codegen project: GenerateModuleH.js
99
+ * ${'@'}generated by codegen project: GenerateModuleCpp.js
100
100
  */
101
101
 
102
102
  #include "${libraryName}JSI.h"
@@ -117,9 +117,11 @@ public:
117
117
  return delegate_.get(rt, propName);
118
118
  }
119
119
 
120
+ static constexpr std::string_view kModuleName = "${moduleName}";
121
+
120
122
  protected:
121
123
  ${hasteModuleName}CxxSpec(std::shared_ptr<CallInvoker> jsInvoker)
122
- : TurboModule("${moduleName}", jsInvoker),
124
+ : TurboModule(std::string{${hasteModuleName}CxxSpec::kModuleName}, jsInvoker),
123
125
  delegate_(static_cast<T*>(this), jsInvoker) {}
124
126
 
125
127
  private:
@@ -246,6 +248,15 @@ function translatePrimitiveJSTypeToCpp(
246
248
  }
247
249
  }
248
250
  function createStructsString(moduleName, aliasMap, resolveAlias, enumMap) {
251
+ const getCppType = v =>
252
+ translatePrimitiveJSTypeToCpp(
253
+ moduleName,
254
+ v.typeAnnotation,
255
+ false,
256
+ typeName => `Unsupported type for param "${v.name}". Found: ${typeName}`,
257
+ resolveAlias,
258
+ enumMap,
259
+ );
249
260
  return Object.keys(aliasMap)
250
261
  .map(alias => {
251
262
  const value = aliasMap[alias];
@@ -254,28 +265,22 @@ function createStructsString(moduleName, aliasMap, resolveAlias, enumMap) {
254
265
  }
255
266
  const structName = `${moduleName}Base${alias}`;
256
267
  const templateParameterWithTypename = value.properties
257
- .map((v, i) => 'typename P' + i)
268
+ .map((v, i) => `typename P${i}`)
258
269
  .join(', ');
259
270
  const templateParameter = value.properties
260
271
  .map((v, i) => 'P' + i)
261
272
  .join(', ');
262
- const paramemterConversion = value.properties
263
- .map((v, i) => {
264
- const translatedParam = translatePrimitiveJSTypeToCpp(
265
- moduleName,
266
- v.typeAnnotation,
267
- false,
268
- typeName =>
269
- `Unsupported type for param "${v.name}". Found: ${typeName}`,
270
- resolveAlias,
271
- enumMap,
272
- );
273
- return ` static ${translatedParam} ${v.name}ToJs(jsi::Runtime &rt, P${i} value) {
273
+ const debugParameterConversion = value.properties
274
+ .map(
275
+ (v, i) => ` static ${getCppType(v)} ${
276
+ v.name
277
+ }ToJs(jsi::Runtime &rt, P${i} value) {
274
278
  return bridging::toJs(rt, value);
275
- }`;
276
- })
277
- .join('\n');
278
- return `#pragma mark - ${structName}
279
+ }`,
280
+ )
281
+ .join('\n\n');
282
+ return `
283
+ #pragma mark - ${structName}
279
284
 
280
285
  template <${templateParameterWithTypename}>
281
286
  struct ${structName} {
@@ -304,28 +309,28 @@ ${value.properties
304
309
  }
305
310
 
306
311
  #ifdef DEBUG
307
- ${paramemterConversion}
312
+ ${debugParameterConversion}
308
313
  #endif
309
314
 
310
315
  static jsi::Object toJs(
311
- jsi::Runtime &rt,
312
- const ${structName}<${templateParameter}> &value,
313
- const std::shared_ptr<CallInvoker> &jsInvoker) {
314
- auto result = facebook::jsi::Object(rt);
315
- ${value.properties
316
- .map((v, i) => {
317
- if (v.optional) {
318
- return ` if (value.${v.name}) {
319
- result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}.value(), jsInvoker));
320
- }`;
321
- } else {
322
- return ` result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}, jsInvoker));`;
323
- }
324
- })
325
- .join('\n')}
326
- return result;
327
- }
328
- };
316
+ jsi::Runtime &rt,
317
+ const ${structName}<${templateParameter}> &value,
318
+ const std::shared_ptr<CallInvoker> &jsInvoker) {
319
+ auto result = facebook::jsi::Object(rt);
320
+ ${value.properties
321
+ .map((v, i) => {
322
+ if (v.optional) {
323
+ return ` if (value.${v.name}) {
324
+ result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}.value(), jsInvoker));
325
+ }`;
326
+ } else {
327
+ return ` result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}, jsInvoker));`;
328
+ }
329
+ })
330
+ .join('\n')}
331
+ return result;
332
+ }
333
+ };
329
334
 
330
335
  `;
331
336
  })
@@ -361,12 +366,12 @@ enum ${enumName} { ${values} };
361
366
 
362
367
  template <>
363
368
  struct Bridging<${enumName}> {
364
- static ${enumName} fromJs(jsi::Runtime &rt, ${fromValue}, const std::shared_ptr<CallInvoker> &jsInvoker) {
369
+ static ${enumName} fromJs(jsi::Runtime &rt, ${fromValue}) {
365
370
  ${fromValueConversion}
366
371
  ${fromCases}
367
372
  }
368
373
 
369
- static ${toValue} toJs(jsi::Runtime &rt, ${enumName} value, const std::shared_ptr<CallInvoker> &jsInvoker) {
374
+ static ${toValue} toJs(jsi::Runtime &rt, ${enumName} value) {
370
375
  ${toCases}
371
376
  }
372
377
  };`;
@@ -9,6 +9,10 @@
9
9
  */
10
10
 
11
11
  'use strict';
12
+ import type {
13
+ NativeModuleBaseTypeAnnotation,
14
+ NamedShape,
15
+ } from '../../CodegenSchema';
12
16
 
13
17
  import type {
14
18
  Nullable,
@@ -74,9 +78,11 @@ public:
74
78
  return delegate_.get(rt, propName);
75
79
  }
76
80
 
81
+ static constexpr std::string_view kModuleName = "${moduleName}";
82
+
77
83
  protected:
78
84
  ${hasteModuleName}CxxSpec(std::shared_ptr<CallInvoker> jsInvoker)
79
- : TurboModule("${moduleName}", jsInvoker),
85
+ : TurboModule(std::string{${hasteModuleName}CxxSpec::kModuleName}, jsInvoker),
80
86
  delegate_(static_cast<T*>(this), jsInvoker) {}
81
87
 
82
88
  private:
@@ -217,6 +223,18 @@ function createStructsString(
217
223
  resolveAlias: AliasResolver,
218
224
  enumMap: NativeModuleEnumMap,
219
225
  ): string {
226
+ const getCppType = (
227
+ v: NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>,
228
+ ) =>
229
+ translatePrimitiveJSTypeToCpp(
230
+ moduleName,
231
+ v.typeAnnotation,
232
+ false,
233
+ typeName => `Unsupported type for param "${v.name}". Found: ${typeName}`,
234
+ resolveAlias,
235
+ enumMap,
236
+ );
237
+
220
238
  return Object.keys(aliasMap)
221
239
  .map(alias => {
222
240
  const value = aliasMap[alias];
@@ -225,28 +243,22 @@ function createStructsString(
225
243
  }
226
244
  const structName = `${moduleName}Base${alias}`;
227
245
  const templateParameterWithTypename = value.properties
228
- .map((v, i) => 'typename P' + i)
246
+ .map((v, i) => `typename P${i}`)
229
247
  .join(', ');
230
248
  const templateParameter = value.properties
231
249
  .map((v, i) => 'P' + i)
232
250
  .join(', ');
233
- const paramemterConversion = value.properties
234
- .map((v, i) => {
235
- const translatedParam = translatePrimitiveJSTypeToCpp(
236
- moduleName,
237
- v.typeAnnotation,
238
- false,
239
- typeName =>
240
- `Unsupported type for param "${v.name}". Found: ${typeName}`,
241
- resolveAlias,
242
- enumMap,
243
- );
244
- return ` static ${translatedParam} ${v.name}ToJs(jsi::Runtime &rt, P${i} value) {
251
+ const debugParameterConversion = value.properties
252
+ .map(
253
+ (v, i) => ` static ${getCppType(v)} ${
254
+ v.name
255
+ }ToJs(jsi::Runtime &rt, P${i} value) {
245
256
  return bridging::toJs(rt, value);
246
- }`;
247
- })
248
- .join('\n');
249
- return `#pragma mark - ${structName}
257
+ }`,
258
+ )
259
+ .join('\n\n');
260
+ return `
261
+ #pragma mark - ${structName}
250
262
 
251
263
  template <${templateParameterWithTypename}>
252
264
  struct ${structName} {
@@ -275,28 +287,28 @@ ${value.properties
275
287
  }
276
288
 
277
289
  #ifdef DEBUG
278
- ${paramemterConversion}
290
+ ${debugParameterConversion}
279
291
  #endif
280
292
 
281
293
  static jsi::Object toJs(
282
- jsi::Runtime &rt,
283
- const ${structName}<${templateParameter}> &value,
284
- const std::shared_ptr<CallInvoker> &jsInvoker) {
285
- auto result = facebook::jsi::Object(rt);
286
- ${value.properties
287
- .map((v, i) => {
288
- if (v.optional) {
289
- return ` if (value.${v.name}) {
290
- result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}.value(), jsInvoker));
291
- }`;
292
- } else {
293
- return ` result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}, jsInvoker));`;
294
- }
295
- })
296
- .join('\n')}
297
- return result;
298
- }
299
- };
294
+ jsi::Runtime &rt,
295
+ const ${structName}<${templateParameter}> &value,
296
+ const std::shared_ptr<CallInvoker> &jsInvoker) {
297
+ auto result = facebook::jsi::Object(rt);
298
+ ${value.properties
299
+ .map((v, i) => {
300
+ if (v.optional) {
301
+ return ` if (value.${v.name}) {
302
+ result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}.value(), jsInvoker));
303
+ }`;
304
+ } else {
305
+ return ` result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}, jsInvoker));`;
306
+ }
307
+ })
308
+ .join('\n')}
309
+ return result;
310
+ }
311
+ };
300
312
 
301
313
  `;
302
314
  })
@@ -338,12 +350,12 @@ enum ${enumName} { ${values} };
338
350
 
339
351
  template <>
340
352
  struct Bridging<${enumName}> {
341
- static ${enumName} fromJs(jsi::Runtime &rt, ${fromValue}, const std::shared_ptr<CallInvoker> &jsInvoker) {
353
+ static ${enumName} fromJs(jsi::Runtime &rt, ${fromValue}) {
342
354
  ${fromValueConversion}
343
355
  ${fromCases}
344
356
  }
345
357
 
346
- static ${toValue} toJs(jsi::Runtime &rt, ${enumName} value, const std::shared_ptr<CallInvoker> &jsInvoker) {
358
+ static ${toValue} toJs(jsi::Runtime &rt, ${enumName} value) {
347
359
  ${toCases}
348
360
  }
349
361
  };`;
@@ -393,17 +393,19 @@ function getFalsyReturnStatementFromReturnType(
393
393
  }
394
394
 
395
395
  // Build special-cased runtime check for getConstants().
396
- function buildGetConstantsMethod(method, imports) {
396
+ function buildGetConstantsMethod(method, imports, resolveAlias) {
397
397
  const _unwrapNullable7 = unwrapNullable(method.typeAnnotation),
398
398
  _unwrapNullable8 = _slicedToArray(_unwrapNullable7, 1),
399
399
  methodTypeAnnotation = _unwrapNullable8[0];
400
- if (
401
- methodTypeAnnotation.returnTypeAnnotation.type === 'ObjectTypeAnnotation'
402
- ) {
400
+ let returnTypeAnnotation = methodTypeAnnotation.returnTypeAnnotation;
401
+ if (returnTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
402
+ // The return type is an alias, resolve it to get the expected undelying object literal type
403
+ returnTypeAnnotation = resolveAlias(returnTypeAnnotation.name);
404
+ }
405
+ if (returnTypeAnnotation.type === 'ObjectTypeAnnotation') {
403
406
  const requiredProps = [];
404
407
  const optionalProps = [];
405
- const rawProperties =
406
- methodTypeAnnotation.returnTypeAnnotation.properties || [];
408
+ const rawProperties = returnTypeAnnotation.properties || [];
407
409
  rawProperties.forEach(p => {
408
410
  if (p.optional || p.typeAnnotation.type === 'NullableTypeAnnotation') {
409
411
  optionalProps.push(p.name);
@@ -494,7 +496,7 @@ module.exports = {
494
496
  ]);
495
497
  const methods = properties.map(method => {
496
498
  if (method.name === 'getConstants') {
497
- return buildGetConstantsMethod(method, imports);
499
+ return buildGetConstantsMethod(method, imports, resolveAlias);
498
500
  }
499
501
  const _unwrapNullable9 = unwrapNullable(method.typeAnnotation),
500
502
  _unwrapNullable10 = _slicedToArray(_unwrapNullable9, 1),
@@ -355,16 +355,20 @@ function getFalsyReturnStatementFromReturnType(
355
355
  function buildGetConstantsMethod(
356
356
  method: NativeModulePropertyShape,
357
357
  imports: Set<string>,
358
+ resolveAlias: AliasResolver,
358
359
  ): string {
359
360
  const [methodTypeAnnotation] =
360
361
  unwrapNullable<NativeModuleFunctionTypeAnnotation>(method.typeAnnotation);
361
- if (
362
- methodTypeAnnotation.returnTypeAnnotation.type === 'ObjectTypeAnnotation'
363
- ) {
362
+ let returnTypeAnnotation = methodTypeAnnotation.returnTypeAnnotation;
363
+ if (returnTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
364
+ // The return type is an alias, resolve it to get the expected undelying object literal type
365
+ returnTypeAnnotation = resolveAlias(returnTypeAnnotation.name);
366
+ }
367
+
368
+ if (returnTypeAnnotation.type === 'ObjectTypeAnnotation') {
364
369
  const requiredProps = [];
365
370
  const optionalProps = [];
366
- const rawProperties =
367
- methodTypeAnnotation.returnTypeAnnotation.properties || [];
371
+ const rawProperties = returnTypeAnnotation.properties || [];
368
372
  rawProperties.forEach(p => {
369
373
  if (p.optional || p.typeAnnotation.type === 'NullableTypeAnnotation') {
370
374
  optionalProps.push(p.name);
@@ -470,7 +474,7 @@ module.exports = {
470
474
 
471
475
  const methods = properties.map(method => {
472
476
  if (method.name === 'getConstants') {
473
- return buildGetConstantsMethod(method, imports);
477
+ return buildGetConstantsMethod(method, imports, resolveAlias);
474
478
  }
475
479
 
476
480
  const [methodTypeAnnotation] =
@@ -97,7 +97,7 @@ target_compile_options(
97
97
  -DLOG_TAG=\\"ReactNative\\"
98
98
  -fexceptions
99
99
  -frtti
100
- -std=c++17
100
+ -std=c++20
101
101
  -Wall
102
102
  )
103
103
  `;
@@ -109,7 +109,7 @@ target_compile_options(
109
109
  -DLOG_TAG=\\"ReactNative\\"
110
110
  -fexceptions
111
111
  -frtti
112
- -std=c++17
112
+ -std=c++20
113
113
  -Wall
114
114
  )
115
115
  `;
@@ -486,13 +486,21 @@ function serializeConstantsProtocolMethods(
486
486
  `${hasteModuleName}.getConstants() may only accept 0 arguments.`,
487
487
  );
488
488
  }
489
- const returnTypeAnnotation = propertyTypeAnnotation.returnTypeAnnotation;
489
+ let returnTypeAnnotation = propertyTypeAnnotation.returnTypeAnnotation;
490
+ if (returnTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
491
+ // The return type is an alias, resolve it to get the expected undelying object literal type
492
+ returnTypeAnnotation = resolveAlias(returnTypeAnnotation.name);
493
+ }
490
494
  if (returnTypeAnnotation.type !== 'ObjectTypeAnnotation') {
491
495
  throw new Error(
492
- `${hasteModuleName}.getConstants() may only return an object literal: {...}.`,
496
+ `${hasteModuleName}.getConstants() may only return an object literal: {...}` +
497
+ ` or a type alias of such. Got '${propertyTypeAnnotation.returnTypeAnnotation.type}'.`,
493
498
  );
494
499
  }
495
- if (returnTypeAnnotation.properties.length === 0) {
500
+ if (
501
+ returnTypeAnnotation.type === 'ObjectTypeAnnotation' &&
502
+ returnTypeAnnotation.properties.length === 0
503
+ ) {
496
504
  return [];
497
505
  }
498
506
  const realTypeAnnotation = structCollector.process(
@@ -459,14 +459,24 @@ function serializeConstantsProtocolMethods(
459
459
  );
460
460
  }
461
461
 
462
- const {returnTypeAnnotation} = propertyTypeAnnotation;
462
+ let {returnTypeAnnotation} = propertyTypeAnnotation;
463
+
464
+ if (returnTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
465
+ // The return type is an alias, resolve it to get the expected undelying object literal type
466
+ returnTypeAnnotation = resolveAlias(returnTypeAnnotation.name);
467
+ }
468
+
463
469
  if (returnTypeAnnotation.type !== 'ObjectTypeAnnotation') {
464
470
  throw new Error(
465
- `${hasteModuleName}.getConstants() may only return an object literal: {...}.`,
471
+ `${hasteModuleName}.getConstants() may only return an object literal: {...}` +
472
+ ` or a type alias of such. Got '${propertyTypeAnnotation.returnTypeAnnotation.type}'.`,
466
473
  );
467
474
  }
468
475
 
469
- if (returnTypeAnnotation.properties.length === 0) {
476
+ if (
477
+ returnTypeAnnotation.type === 'ObjectTypeAnnotation' &&
478
+ returnTypeAnnotation.properties.length === 0
479
+ ) {
470
480
  return [];
471
481
  }
472
482
 
@@ -280,6 +280,44 @@ function throwIfMoreThanOneCodegenNativecommands(commandsTypeNames) {
280
280
  throw new Error('codegenNativeCommands may only be called once in a file');
281
281
  }
282
282
  }
283
+ function throwIfConfigNotfound(foundConfigs) {
284
+ if (foundConfigs.length === 0) {
285
+ throw new Error('Could not find component config for native component');
286
+ }
287
+ }
288
+ function throwIfMoreThanOneConfig(foundConfigs) {
289
+ if (foundConfigs.length > 1) {
290
+ throw new Error('Only one component is supported per file');
291
+ }
292
+ }
293
+ function throwIfEventHasNoName(typeAnnotation, parser) {
294
+ const name =
295
+ parser.language() === 'Flow' ? typeAnnotation.id : typeAnnotation.typeName;
296
+ if (!name) {
297
+ throw new Error("typeAnnotation of event doesn't have a name");
298
+ }
299
+ }
300
+ function throwIfBubblingTypeIsNull(bubblingType, eventName) {
301
+ if (!bubblingType) {
302
+ throw new Error(
303
+ `Unable to determine event bubbling type for "${eventName}"`,
304
+ );
305
+ }
306
+ return bubblingType;
307
+ }
308
+ function throwIfArgumentPropsAreNull(argumentProps, eventName) {
309
+ if (!argumentProps) {
310
+ throw new Error(`Unable to determine event arguments for "${eventName}"`);
311
+ }
312
+ return argumentProps;
313
+ }
314
+ function throwIfTypeAliasIsNotInterface(typeAlias, parser) {
315
+ if (typeAlias.type !== parser.interfaceDeclaration) {
316
+ throw new Error(
317
+ `The type argument for codegenNativeCommands must be an interface, received ${typeAlias.type}`,
318
+ );
319
+ }
320
+ }
283
321
  module.exports = {
284
322
  throwIfModuleInterfaceIsMisnamed,
285
323
  throwIfUnsupportedFunctionReturnTypeAnnotationParserError,
@@ -298,4 +336,10 @@ module.exports = {
298
336
  throwIfPartialNotAnnotatingTypeParameter,
299
337
  throwIfPartialWithMoreParameter,
300
338
  throwIfMoreThanOneCodegenNativecommands,
339
+ throwIfConfigNotfound,
340
+ throwIfMoreThanOneConfig,
341
+ throwIfEventHasNoName,
342
+ throwIfBubblingTypeIsNull,
343
+ throwIfArgumentPropsAreNull,
344
+ throwIfTypeAliasIsNotInterface,
301
345
  };