@react-native/codegen 0.75.0-nightly-20240611-5b3a32142 → 0.75.0-nightly-20240612-fd618819c

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.
@@ -58,6 +58,11 @@ export interface MixedTypeAnnotation {
58
58
  readonly type: 'MixedTypeAnnotation';
59
59
  }
60
60
 
61
+ export interface EventEmitterTypeAnnotation {
62
+ readonly type: 'EventEmitterTypeAnnotation';
63
+ readonly typeAnnotation: NativeModuleBaseTypeAnnotation;
64
+ }
65
+
61
66
  export interface FunctionTypeAnnotation<P, R> {
62
67
  readonly type: 'FunctionTypeAnnotation';
63
68
  readonly params: readonly NamedShape<P>[];
@@ -241,6 +246,7 @@ export interface NativeModuleSchema {
241
246
  }
242
247
 
243
248
  export interface NativeModuleSpec {
249
+ readonly eventEmitters: readonly NativeModuleEventEmitterShape[];
244
250
  readonly properties: readonly NativeModulePropertyShape[];
245
251
  }
246
252
 
@@ -248,6 +254,8 @@ export type NativeModulePropertyShape = NamedShape<
248
254
  Nullable<NativeModuleFunctionTypeAnnotation>
249
255
  >;
250
256
 
257
+ export type NativeModuleEventEmitterShape = NamedShape<EventEmitterTypeAnnotation>;
258
+
251
259
  export interface NativeModuleEnumMap {
252
260
  readonly [enumName: string]: NativeModuleEnumDeclarationWithMembers;
253
261
  }
@@ -61,6 +61,11 @@ export type MixedTypeAnnotation = $ReadOnly<{
61
61
  type: 'MixedTypeAnnotation',
62
62
  }>;
63
63
 
64
+ type EventEmitterTypeAnnotation = $ReadOnly<{
65
+ type: 'EventEmitterTypeAnnotation',
66
+ typeAnnotation: NativeModuleBaseTypeAnnotation,
67
+ }>;
68
+
64
69
  type FunctionTypeAnnotation<+P, +R> = $ReadOnly<{
65
70
  type: 'FunctionTypeAnnotation',
66
71
  params: $ReadOnlyArray<NamedShape<P>>,
@@ -242,9 +247,13 @@ export type NativeModuleSchema = $ReadOnly<{
242
247
  }>;
243
248
 
244
249
  type NativeModuleSpec = $ReadOnly<{
250
+ eventEmitters: $ReadOnlyArray<NativeModuleEventEmitterShape>,
245
251
  properties: $ReadOnlyArray<NativeModulePropertyShape>,
246
252
  }>;
247
253
 
254
+ export type NativeModuleEventEmitterShape =
255
+ NamedShape<EventEmitterTypeAnnotation>;
256
+
248
257
  export type NativeModulePropertyShape = NamedShape<
249
258
  Nullable<NativeModuleFunctionTypeAnnotation>,
250
259
  >;
@@ -42,6 +42,7 @@ const SCHEMA_WITH_TM_AND_FC = {
42
42
  aliasMap: {},
43
43
  enumMap: {},
44
44
  spec: {
45
+ eventEmitters: [],
45
46
  properties: [
46
47
  {
47
48
  name: 'add',
@@ -44,6 +44,7 @@ const SCHEMA_WITH_TM_AND_FC: SchemaType = {
44
44
  aliasMap: {},
45
45
  enumMap: {},
46
46
  spec: {
47
+ eventEmitters: [],
47
48
  properties: [
48
49
  {
49
50
  name: 'add',
@@ -84,6 +84,7 @@ const _require2 = require('../TypeUtils/Cxx'),
84
84
  wrapOptional = _require2.wrapOptional;
85
85
  const _require3 = require('../Utils'),
86
86
  getEnumName = _require3.getEnumName,
87
+ toPascalCase = _require3.toPascalCase,
87
88
  toSafeCppString = _require3.toSafeCppString;
88
89
  const _require4 = require('../Utils'),
89
90
  indent = _require4.indent;
@@ -111,6 +112,7 @@ public:
111
112
  const ModuleSpecClassDeclarationTemplate = ({
112
113
  hasteModuleName,
113
114
  moduleName,
115
+ moduleEventEmitters,
114
116
  moduleProperties,
115
117
  }) => {
116
118
  return `template <typename T>
@@ -126,16 +128,20 @@ protected:
126
128
  ${hasteModuleName}CxxSpec(std::shared_ptr<CallInvoker> jsInvoker)
127
129
  : TurboModule(std::string{${hasteModuleName}CxxSpec::kModuleName}, jsInvoker),
128
130
  delegate_(reinterpret_cast<T*>(this), jsInvoker) {}
131
+ ${moduleEventEmitters.map(e => e.emitFunction).join('\n')}
129
132
 
130
133
  private:
131
134
  class Delegate : public ${hasteModuleName}CxxSpecJSI {
132
135
  public:
133
136
  Delegate(T *instance, std::shared_ptr<CallInvoker> jsInvoker) :
134
- ${hasteModuleName}CxxSpecJSI(std::move(jsInvoker)), instance_(instance) {}
137
+ ${hasteModuleName}CxxSpecJSI(std::move(jsInvoker)), instance_(instance) {
138
+ ${moduleEventEmitters.map(e => e.registerEventEmitter).join('\n')}
139
+ }
135
140
 
136
141
  ${indent(moduleProperties.join('\n'), 4)}
137
142
 
138
143
  private:
144
+ friend class ${hasteModuleName}CxxSpec;
139
145
  T *instance_;
140
146
  };
141
147
 
@@ -509,6 +515,61 @@ function translatePropertyToCpp(
509
515
  rt, &T::${prop.name}, jsInvoker_, ${['instance_', ...params].join(', ')});
510
516
  }`;
511
517
  }
518
+ function translateEventEmitterToCpp(
519
+ moduleName,
520
+ eventEmitter,
521
+ resolveAlias,
522
+ enumMap,
523
+ ) {
524
+ const isVoidTypeAnnotation =
525
+ eventEmitter.typeAnnotation.typeAnnotation.type === 'VoidTypeAnnotation';
526
+ const templateName = `${toPascalCase(eventEmitter.name)}Type`;
527
+ const jsiType = translatePrimitiveJSTypeToCpp(
528
+ moduleName,
529
+ null,
530
+ eventEmitter.typeAnnotation.typeAnnotation,
531
+ false,
532
+ typeName =>
533
+ `Unsupported type for eventEmitter "${eventEmitter.name}" in ${moduleName}. Found: ${typeName}`,
534
+ resolveAlias,
535
+ enumMap,
536
+ );
537
+ const isArray = jsiType === 'jsi::Array';
538
+ return {
539
+ isVoidTypeAnnotation: isVoidTypeAnnotation,
540
+ templateName: isVoidTypeAnnotation ? `/*${templateName}*/` : templateName,
541
+ registerEventEmitter: ` eventEmitterMap_["${
542
+ eventEmitter.name
543
+ }"] = std::make_shared<AsyncEventEmitter<${
544
+ isVoidTypeAnnotation ? '' : 'jsi::Value'
545
+ }>>();`,
546
+ emitFunction: `
547
+ ${
548
+ isVoidTypeAnnotation ? '' : `template <typename ${templateName}> `
549
+ }void emit${toPascalCase(eventEmitter.name)}(${
550
+ isVoidTypeAnnotation
551
+ ? ''
552
+ : `${isArray ? `std::vector<${templateName}>` : templateName} value`
553
+ }) {${
554
+ isVoidTypeAnnotation
555
+ ? ''
556
+ : `
557
+ static_assert(bridging::supportsFromJs<${
558
+ isArray ? `std::vector<${templateName}>` : templateName
559
+ }, ${jsiType}>, "value cannnot be converted to ${jsiType}");`
560
+ }
561
+ std::static_pointer_cast<AsyncEventEmitter<${
562
+ isVoidTypeAnnotation ? '' : 'jsi::Value'
563
+ }>>(delegate_.eventEmitterMap_["${eventEmitter.name}"])->emit(${
564
+ isVoidTypeAnnotation
565
+ ? ''
566
+ : `[jsInvoker = jsInvoker_, eventValue = value](jsi::Runtime& rt) -> jsi::Value {
567
+ return bridging::toJs(rt, eventValue, jsInvoker);
568
+ }`
569
+ });
570
+ }`,
571
+ };
572
+ }
512
573
  module.exports = {
513
574
  generate(
514
575
  libraryName,
@@ -522,7 +583,7 @@ module.exports = {
522
583
  const _nativeModules$hasteM = nativeModules[hasteModuleName],
523
584
  aliasMap = _nativeModules$hasteM.aliasMap,
524
585
  enumMap = _nativeModules$hasteM.enumMap,
525
- properties = _nativeModules$hasteM.spec.properties,
586
+ spec = _nativeModules$hasteM.spec,
526
587
  moduleName = _nativeModules$hasteM.moduleName;
527
588
  const resolveAlias = createAliasResolver(aliasMap);
528
589
  const structs = createStructsString(
@@ -535,7 +596,7 @@ module.exports = {
535
596
  return [
536
597
  ModuleClassDeclarationTemplate({
537
598
  hasteModuleName,
538
- moduleProperties: properties.map(prop =>
599
+ moduleProperties: spec.properties.map(prop =>
539
600
  translatePropertyToCpp(
540
601
  hasteModuleName,
541
602
  prop,
@@ -550,7 +611,15 @@ module.exports = {
550
611
  ModuleSpecClassDeclarationTemplate({
551
612
  hasteModuleName,
552
613
  moduleName,
553
- moduleProperties: properties.map(prop =>
614
+ moduleEventEmitters: spec.eventEmitters.map(eventEmitter =>
615
+ translateEventEmitterToCpp(
616
+ moduleName,
617
+ eventEmitter,
618
+ resolveAlias,
619
+ enumMap,
620
+ ),
621
+ ),
622
+ moduleProperties: spec.properties.map(prop =>
554
623
  translatePropertyToCpp(
555
624
  hasteModuleName,
556
625
  prop,
@@ -18,6 +18,7 @@ import type {
18
18
  NativeModuleEnumMap,
19
19
  NativeModuleEnumMembers,
20
20
  NativeModuleEnumMemberType,
21
+ NativeModuleEventEmitterShape,
21
22
  NativeModuleFunctionTypeAnnotation,
22
23
  NativeModulePropertyShape,
23
24
  NativeModuleTypeAnnotation,
@@ -28,7 +29,7 @@ import type {AliasResolver} from './Utils';
28
29
 
29
30
  const {unwrapNullable} = require('../../parsers/parsers-commons');
30
31
  const {wrapOptional} = require('../TypeUtils/Cxx');
31
- const {getEnumName, toSafeCppString} = require('../Utils');
32
+ const {getEnumName, toPascalCase, toSafeCppString} = require('../Utils');
32
33
  const {indent} = require('../Utils');
33
34
  const {
34
35
  createAliasResolver,
@@ -64,10 +65,12 @@ public:
64
65
  const ModuleSpecClassDeclarationTemplate = ({
65
66
  hasteModuleName,
66
67
  moduleName,
68
+ moduleEventEmitters,
67
69
  moduleProperties,
68
70
  }: $ReadOnly<{
69
71
  hasteModuleName: string,
70
72
  moduleName: string,
73
+ moduleEventEmitters: EventEmitterCpp[],
71
74
  moduleProperties: string[],
72
75
  }>) => {
73
76
  return `template <typename T>
@@ -83,16 +86,20 @@ protected:
83
86
  ${hasteModuleName}CxxSpec(std::shared_ptr<CallInvoker> jsInvoker)
84
87
  : TurboModule(std::string{${hasteModuleName}CxxSpec::kModuleName}, jsInvoker),
85
88
  delegate_(reinterpret_cast<T*>(this), jsInvoker) {}
89
+ ${moduleEventEmitters.map(e => e.emitFunction).join('\n')}
86
90
 
87
91
  private:
88
92
  class Delegate : public ${hasteModuleName}CxxSpecJSI {
89
93
  public:
90
94
  Delegate(T *instance, std::shared_ptr<CallInvoker> jsInvoker) :
91
- ${hasteModuleName}CxxSpecJSI(std::move(jsInvoker)), instance_(instance) {}
95
+ ${hasteModuleName}CxxSpecJSI(std::move(jsInvoker)), instance_(instance) {
96
+ ${moduleEventEmitters.map(e => e.registerEventEmitter).join('\n')}
97
+ }
92
98
 
93
99
  ${indent(moduleProperties.join('\n'), 4)}
94
100
 
95
101
  private:
102
+ friend class ${hasteModuleName}CxxSpec;
96
103
  T *instance_;
97
104
  };
98
105
 
@@ -460,7 +467,7 @@ function translatePropertyToCpp(
460
467
  resolveAlias: AliasResolver,
461
468
  enumMap: NativeModuleEnumMap,
462
469
  abstract: boolean = false,
463
- ) {
470
+ ): string {
464
471
  const [propTypeAnnotation] =
465
472
  unwrapNullable<NativeModuleFunctionTypeAnnotation>(prop.typeAnnotation);
466
473
 
@@ -511,6 +518,69 @@ function translatePropertyToCpp(
511
518
  }`;
512
519
  }
513
520
 
521
+ type EventEmitterCpp = {
522
+ isVoidTypeAnnotation: boolean,
523
+ templateName: string,
524
+ registerEventEmitter: string,
525
+ emitFunction: string,
526
+ };
527
+
528
+ function translateEventEmitterToCpp(
529
+ moduleName: string,
530
+ eventEmitter: NativeModuleEventEmitterShape,
531
+ resolveAlias: AliasResolver,
532
+ enumMap: NativeModuleEnumMap,
533
+ ): EventEmitterCpp {
534
+ const isVoidTypeAnnotation =
535
+ eventEmitter.typeAnnotation.typeAnnotation.type === 'VoidTypeAnnotation';
536
+ const templateName = `${toPascalCase(eventEmitter.name)}Type`;
537
+ const jsiType = translatePrimitiveJSTypeToCpp(
538
+ moduleName,
539
+ null,
540
+ eventEmitter.typeAnnotation.typeAnnotation,
541
+ false,
542
+ typeName =>
543
+ `Unsupported type for eventEmitter "${eventEmitter.name}" in ${moduleName}. Found: ${typeName}`,
544
+ resolveAlias,
545
+ enumMap,
546
+ );
547
+ const isArray = jsiType === 'jsi::Array';
548
+ return {
549
+ isVoidTypeAnnotation: isVoidTypeAnnotation,
550
+ templateName: isVoidTypeAnnotation ? `/*${templateName}*/` : templateName,
551
+ registerEventEmitter: ` eventEmitterMap_["${
552
+ eventEmitter.name
553
+ }"] = std::make_shared<AsyncEventEmitter<${
554
+ isVoidTypeAnnotation ? '' : 'jsi::Value'
555
+ }>>();`,
556
+ emitFunction: `
557
+ ${
558
+ isVoidTypeAnnotation ? '' : `template <typename ${templateName}> `
559
+ }void emit${toPascalCase(eventEmitter.name)}(${
560
+ isVoidTypeAnnotation
561
+ ? ''
562
+ : `${isArray ? `std::vector<${templateName}>` : templateName} value`
563
+ }) {${
564
+ isVoidTypeAnnotation
565
+ ? ''
566
+ : `
567
+ static_assert(bridging::supportsFromJs<${
568
+ isArray ? `std::vector<${templateName}>` : templateName
569
+ }, ${jsiType}>, "value cannnot be converted to ${jsiType}");`
570
+ }
571
+ std::static_pointer_cast<AsyncEventEmitter<${
572
+ isVoidTypeAnnotation ? '' : 'jsi::Value'
573
+ }>>(delegate_.eventEmitterMap_["${eventEmitter.name}"])->emit(${
574
+ isVoidTypeAnnotation
575
+ ? ''
576
+ : `[jsInvoker = jsInvoker_, eventValue = value](jsi::Runtime& rt) -> jsi::Value {
577
+ return bridging::toJs(rt, eventValue, jsInvoker);
578
+ }`
579
+ });
580
+ }`,
581
+ };
582
+ }
583
+
514
584
  module.exports = {
515
585
  generate(
516
586
  libraryName: string,
@@ -522,12 +592,8 @@ module.exports = {
522
592
  const nativeModules = getModules(schema);
523
593
 
524
594
  const modules = Object.keys(nativeModules).flatMap(hasteModuleName => {
525
- const {
526
- aliasMap,
527
- enumMap,
528
- spec: {properties},
529
- moduleName,
530
- } = nativeModules[hasteModuleName];
595
+ const {aliasMap, enumMap, spec, moduleName} =
596
+ nativeModules[hasteModuleName];
531
597
  const resolveAlias = createAliasResolver(aliasMap);
532
598
  const structs = createStructsString(
533
599
  hasteModuleName,
@@ -540,7 +606,7 @@ module.exports = {
540
606
  return [
541
607
  ModuleClassDeclarationTemplate({
542
608
  hasteModuleName,
543
- moduleProperties: properties.map(prop =>
609
+ moduleProperties: spec.properties.map(prop =>
544
610
  translatePropertyToCpp(
545
611
  hasteModuleName,
546
612
  prop,
@@ -555,7 +621,15 @@ module.exports = {
555
621
  ModuleSpecClassDeclarationTemplate({
556
622
  hasteModuleName,
557
623
  moduleName,
558
- moduleProperties: properties.map(prop =>
624
+ moduleEventEmitters: spec.eventEmitters.map(eventEmitter =>
625
+ translateEventEmitterToCpp(
626
+ moduleName,
627
+ eventEmitter,
628
+ resolveAlias,
629
+ enumMap,
630
+ ),
631
+ ),
632
+ moduleProperties: spec.properties.map(prop =>
559
633
  translatePropertyToCpp(
560
634
  hasteModuleName,
561
635
  prop,
@@ -17,6 +17,7 @@ const EMPTY_NATIVE_MODULES = {
17
17
  aliasMap: {},
18
18
  enumMap: {},
19
19
  spec: {
20
+ eventEmitters: [],
20
21
  properties: [],
21
22
  },
22
23
  moduleName: 'SampleTurboModule',
@@ -80,6 +81,7 @@ const SIMPLE_NATIVE_MODULES = {
80
81
  },
81
82
  },
82
83
  spec: {
84
+ eventEmitters: [],
83
85
  properties: [
84
86
  {
85
87
  name: 'getConstants',
@@ -407,6 +409,7 @@ const TWO_MODULES_DIFFERENT_FILES = {
407
409
  aliasMap: {},
408
410
  enumMap: {},
409
411
  spec: {
412
+ eventEmitters: [],
410
413
  properties: [
411
414
  {
412
415
  name: 'voidFunc',
@@ -428,6 +431,7 @@ const TWO_MODULES_DIFFERENT_FILES = {
428
431
  aliasMap: {},
429
432
  enumMap: {},
430
433
  spec: {
434
+ eventEmitters: [],
431
435
  properties: [
432
436
  {
433
437
  name: 'getConstants',
@@ -465,6 +469,7 @@ const COMPLEX_OBJECTS = {
465
469
  aliasMap: {},
466
470
  enumMap: {},
467
471
  spec: {
472
+ eventEmitters: [],
468
473
  properties: [
469
474
  {
470
475
  name: 'difficult',
@@ -920,6 +925,7 @@ const NATIVE_MODULES_WITH_TYPE_ALIASES = {
920
925
  },
921
926
  enumMap: {},
922
927
  spec: {
928
+ eventEmitters: [],
923
929
  properties: [
924
930
  {
925
931
  name: 'getConstants',
@@ -1204,6 +1210,7 @@ const REAL_MODULE_EXAMPLE = {
1204
1210
  },
1205
1211
  enumMap: {},
1206
1212
  spec: {
1213
+ eventEmitters: [],
1207
1214
  properties: [
1208
1215
  {
1209
1216
  name: 'getConstants',
@@ -1400,6 +1407,7 @@ const REAL_MODULE_EXAMPLE = {
1400
1407
  },
1401
1408
  enumMap: {},
1402
1409
  spec: {
1410
+ eventEmitters: [],
1403
1411
  properties: [
1404
1412
  {
1405
1413
  name: 'reportFatalException',
@@ -1820,6 +1828,7 @@ const CXX_ONLY_NATIVE_MODULES = {
1820
1828
  },
1821
1829
  },
1822
1830
  spec: {
1831
+ eventEmitters: [],
1823
1832
  properties: [
1824
1833
  {
1825
1834
  name: 'getArray',
@@ -2403,6 +2412,7 @@ const SAMPLE_WITH_UPPERCASE_NAME = {
2403
2412
  enumMap: {},
2404
2413
  aliasMap: {},
2405
2414
  spec: {
2415
+ eventEmitters: [],
2406
2416
  properties: [],
2407
2417
  },
2408
2418
  moduleName: 'SampleTurboModule',
@@ -19,6 +19,7 @@ const EMPTY_NATIVE_MODULES: SchemaType = {
19
19
  aliasMap: {},
20
20
  enumMap: {},
21
21
  spec: {
22
+ eventEmitters: [],
22
23
  properties: [],
23
24
  },
24
25
  moduleName: 'SampleTurboModule',
@@ -83,6 +84,7 @@ const SIMPLE_NATIVE_MODULES: SchemaType = {
83
84
  },
84
85
  },
85
86
  spec: {
87
+ eventEmitters: [],
86
88
  properties: [
87
89
  {
88
90
  name: 'getConstants',
@@ -412,6 +414,7 @@ const TWO_MODULES_DIFFERENT_FILES: SchemaType = {
412
414
  aliasMap: {},
413
415
  enumMap: {},
414
416
  spec: {
417
+ eventEmitters: [],
415
418
  properties: [
416
419
  {
417
420
  name: 'voidFunc',
@@ -433,6 +436,7 @@ const TWO_MODULES_DIFFERENT_FILES: SchemaType = {
433
436
  aliasMap: {},
434
437
  enumMap: {},
435
438
  spec: {
439
+ eventEmitters: [],
436
440
  properties: [
437
441
  {
438
442
  name: 'getConstants',
@@ -471,6 +475,7 @@ const COMPLEX_OBJECTS: SchemaType = {
471
475
  aliasMap: {},
472
476
  enumMap: {},
473
477
  spec: {
478
+ eventEmitters: [],
474
479
  properties: [
475
480
  {
476
481
  name: 'difficult',
@@ -927,6 +932,7 @@ const NATIVE_MODULES_WITH_TYPE_ALIASES: SchemaType = {
927
932
  },
928
933
  enumMap: {},
929
934
  spec: {
935
+ eventEmitters: [],
930
936
  properties: [
931
937
  {
932
938
  name: 'getConstants',
@@ -1212,6 +1218,7 @@ const REAL_MODULE_EXAMPLE: SchemaType = {
1212
1218
  },
1213
1219
  enumMap: {},
1214
1220
  spec: {
1221
+ eventEmitters: [],
1215
1222
  properties: [
1216
1223
  {
1217
1224
  name: 'getConstants',
@@ -1408,6 +1415,7 @@ const REAL_MODULE_EXAMPLE: SchemaType = {
1408
1415
  },
1409
1416
  enumMap: {},
1410
1417
  spec: {
1418
+ eventEmitters: [],
1411
1419
  properties: [
1412
1420
  {
1413
1421
  name: 'reportFatalException',
@@ -1829,6 +1837,7 @@ const CXX_ONLY_NATIVE_MODULES: SchemaType = {
1829
1837
  },
1830
1838
  },
1831
1839
  spec: {
1840
+ eventEmitters: [],
1832
1841
  properties: [
1833
1842
  {
1834
1843
  name: 'getArray',
@@ -2414,6 +2423,7 @@ const SAMPLE_WITH_UPPERCASE_NAME: SchemaType = {
2414
2423
  enumMap: {},
2415
2424
  aliasMap: {},
2416
2425
  spec: {
2426
+ eventEmitters: [],
2417
2427
  properties: [],
2418
2428
  },
2419
2429
  moduleName: 'SampleTurboModule',
@@ -31,6 +31,10 @@ const _require = require('./errors'),
31
31
  _require.UnsupportedFunctionParamTypeAnnotationParserError,
32
32
  UnsupportedFunctionReturnTypeAnnotationParserError =
33
33
  _require.UnsupportedFunctionReturnTypeAnnotationParserError,
34
+ UnsupportedModuleEventEmitterPropertyParserError =
35
+ _require.UnsupportedModuleEventEmitterPropertyParserError,
36
+ UnsupportedModuleEventEmitterTypePropertyParserError =
37
+ _require.UnsupportedModuleEventEmitterTypePropertyParserError,
34
38
  UnsupportedModulePropertyParserError =
35
39
  _require.UnsupportedModulePropertyParserError,
36
40
  UnsupportedObjectPropertyValueTypeAnnotationParserError =
@@ -152,6 +156,44 @@ function throwIfUntypedModule(
152
156
  );
153
157
  }
154
158
  }
159
+ function throwIfEventEmitterTypeIsUnsupported(
160
+ nativeModuleName,
161
+ propertyName,
162
+ propertyValueType,
163
+ parser,
164
+ nullable,
165
+ untyped,
166
+ cxxOnly,
167
+ ) {
168
+ if (nullable || untyped || !cxxOnly) {
169
+ throw new UnsupportedModuleEventEmitterPropertyParserError(
170
+ nativeModuleName,
171
+ propertyName,
172
+ propertyValueType,
173
+ parser.language(),
174
+ nullable,
175
+ untyped,
176
+ cxxOnly,
177
+ );
178
+ }
179
+ }
180
+ function throwIfEventEmitterEventTypeIsUnsupported(
181
+ nativeModuleName,
182
+ propertyName,
183
+ propertyValueType,
184
+ parser,
185
+ nullable,
186
+ ) {
187
+ if (nullable) {
188
+ throw new UnsupportedModuleEventEmitterTypePropertyParserError(
189
+ nativeModuleName,
190
+ propertyName,
191
+ propertyValueType,
192
+ parser.language(),
193
+ nullable,
194
+ );
195
+ }
196
+ }
155
197
  function throwIfModuleTypeIsUnsupported(
156
198
  nativeModuleName,
157
199
  propertyValue,
@@ -330,6 +372,8 @@ module.exports = {
330
372
  throwIfWrongNumberOfCallExpressionArgs,
331
373
  throwIfIncorrectModuleRegistryCallTypeParameterParserError,
332
374
  throwIfUntypedModule,
375
+ throwIfEventEmitterTypeIsUnsupported,
376
+ throwIfEventEmitterEventTypeIsUnsupported,
333
377
  throwIfModuleTypeIsUnsupported,
334
378
  throwIfMoreThanOneModuleInterfaceParserError,
335
379
  throwIfUnsupportedFunctionParamTypeAnnotationParserError,
@@ -26,6 +26,8 @@ const {
26
26
  UnsupportedArrayElementTypeAnnotationParserError,
27
27
  UnsupportedFunctionParamTypeAnnotationParserError,
28
28
  UnsupportedFunctionReturnTypeAnnotationParserError,
29
+ UnsupportedModuleEventEmitterPropertyParserError,
30
+ UnsupportedModuleEventEmitterTypePropertyParserError,
29
31
  UnsupportedModulePropertyParserError,
30
32
  UnsupportedObjectPropertyValueTypeAnnotationParserError,
31
33
  UntypedModuleRegistryCallParserError,
@@ -155,6 +157,46 @@ function throwIfUntypedModule(
155
157
  }
156
158
  }
157
159
 
160
+ function throwIfEventEmitterTypeIsUnsupported(
161
+ nativeModuleName: string,
162
+ propertyName: string,
163
+ propertyValueType: string,
164
+ parser: Parser,
165
+ nullable: boolean,
166
+ untyped: boolean,
167
+ cxxOnly: boolean,
168
+ ) {
169
+ if (nullable || untyped || !cxxOnly) {
170
+ throw new UnsupportedModuleEventEmitterPropertyParserError(
171
+ nativeModuleName,
172
+ propertyName,
173
+ propertyValueType,
174
+ parser.language(),
175
+ nullable,
176
+ untyped,
177
+ cxxOnly,
178
+ );
179
+ }
180
+ }
181
+
182
+ function throwIfEventEmitterEventTypeIsUnsupported(
183
+ nativeModuleName: string,
184
+ propertyName: string,
185
+ propertyValueType: string,
186
+ parser: Parser,
187
+ nullable: boolean,
188
+ ) {
189
+ if (nullable) {
190
+ throw new UnsupportedModuleEventEmitterTypePropertyParserError(
191
+ nativeModuleName,
192
+ propertyName,
193
+ propertyValueType,
194
+ parser.language(),
195
+ nullable,
196
+ );
197
+ }
198
+ }
199
+
158
200
  function throwIfModuleTypeIsUnsupported(
159
201
  nativeModuleName: string,
160
202
  propertyValue: $FlowFixMe,
@@ -363,6 +405,8 @@ module.exports = {
363
405
  throwIfWrongNumberOfCallExpressionArgs,
364
406
  throwIfIncorrectModuleRegistryCallTypeParameterParserError,
365
407
  throwIfUntypedModule,
408
+ throwIfEventEmitterTypeIsUnsupported,
409
+ throwIfEventEmitterEventTypeIsUnsupported,
366
410
  throwIfModuleTypeIsUnsupported,
367
411
  throwIfMoreThanOneModuleInterfaceParserError,
368
412
  throwIfUnsupportedFunctionParamTypeAnnotationParserError,
@@ -56,6 +56,42 @@ class MoreThanOneModuleInterfaceParserError extends ParserError {
56
56
  );
57
57
  }
58
58
  }
59
+ class UnsupportedModuleEventEmitterTypePropertyParserError extends ParserError {
60
+ constructor(
61
+ nativeModuleName,
62
+ propertyValue,
63
+ propertyName,
64
+ language,
65
+ nullable,
66
+ ) {
67
+ super(
68
+ nativeModuleName,
69
+ propertyValue,
70
+ `Property '${propertyName}' is an EventEmitter and must have a non nullable eventType`,
71
+ );
72
+ }
73
+ }
74
+ class UnsupportedModuleEventEmitterPropertyParserError extends ParserError {
75
+ constructor(
76
+ nativeModuleName,
77
+ propertyValue,
78
+ propertyName,
79
+ language,
80
+ nullable,
81
+ untyped,
82
+ cxxOnly,
83
+ ) {
84
+ let message = `${language} interfaces extending TurboModule must only contain 'FunctionTypeAnnotation's or non nullable 'EventEmitter's. Further the EventEmitter property `;
85
+ if (nullable) {
86
+ message += `'${propertyValue}' must non nullable.`;
87
+ } else if (untyped) {
88
+ message += `'${propertyValue}' must have a concrete or void eventType.`;
89
+ } else if (cxxOnly) {
90
+ message += `'${propertyValue}' is only supported in C++ Turbo Modules.`;
91
+ }
92
+ super(nativeModuleName, propertyValue, message);
93
+ }
94
+ }
59
95
  class UnsupportedModulePropertyParserError extends ParserError {
60
96
  constructor(
61
97
  nativeModuleName,
@@ -67,7 +103,7 @@ class UnsupportedModulePropertyParserError extends ParserError {
67
103
  super(
68
104
  nativeModuleName,
69
105
  propertyValue,
70
- `${language} interfaces extending TurboModule must only contain 'FunctionTypeAnnotation's. Property '${propertyName}' refers to a '${invalidPropertyValueType}'.`,
106
+ `${language} interfaces extending TurboModule must only contain 'FunctionTypeAnnotation's or non nullable 'EventEmitter's. Property '${propertyName}' refers to a '${invalidPropertyValueType}'.`,
71
107
  );
72
108
  }
73
109
  }
@@ -321,6 +357,8 @@ module.exports = {
321
357
  UnsupportedFunctionReturnTypeAnnotationParserError,
322
358
  UnsupportedEnumDeclarationParserError,
323
359
  UnsupportedUnionTypeAnnotationParserError,
360
+ UnsupportedModuleEventEmitterTypePropertyParserError,
361
+ UnsupportedModuleEventEmitterPropertyParserError,
324
362
  UnsupportedModulePropertyParserError,
325
363
  UnsupportedObjectPropertyTypeAnnotationParserError,
326
364
  UnsupportedObjectPropertyValueTypeAnnotationParserError,
@@ -76,6 +76,44 @@ class MoreThanOneModuleInterfaceParserError extends ParserError {
76
76
  }
77
77
  }
78
78
 
79
+ class UnsupportedModuleEventEmitterTypePropertyParserError extends ParserError {
80
+ constructor(
81
+ nativeModuleName: string,
82
+ propertyValue: $FlowFixMe,
83
+ propertyName: string,
84
+ language: ParserType,
85
+ nullable: boolean,
86
+ ) {
87
+ super(
88
+ nativeModuleName,
89
+ propertyValue,
90
+ `Property '${propertyName}' is an EventEmitter and must have a non nullable eventType`,
91
+ );
92
+ }
93
+ }
94
+
95
+ class UnsupportedModuleEventEmitterPropertyParserError extends ParserError {
96
+ constructor(
97
+ nativeModuleName: string,
98
+ propertyValue: $FlowFixMe,
99
+ propertyName: string,
100
+ language: ParserType,
101
+ nullable: boolean,
102
+ untyped: boolean,
103
+ cxxOnly: boolean,
104
+ ) {
105
+ let message = `${language} interfaces extending TurboModule must only contain 'FunctionTypeAnnotation's or non nullable 'EventEmitter's. Further the EventEmitter property `;
106
+ if (nullable) {
107
+ message += `'${propertyValue}' must non nullable.`;
108
+ } else if (untyped) {
109
+ message += `'${propertyValue}' must have a concrete or void eventType.`;
110
+ } else if (cxxOnly) {
111
+ message += `'${propertyValue}' is only supported in C++ Turbo Modules.`;
112
+ }
113
+ super(nativeModuleName, propertyValue, message);
114
+ }
115
+ }
116
+
79
117
  class UnsupportedModulePropertyParserError extends ParserError {
80
118
  constructor(
81
119
  nativeModuleName: string,
@@ -87,7 +125,7 @@ class UnsupportedModulePropertyParserError extends ParserError {
87
125
  super(
88
126
  nativeModuleName,
89
127
  propertyValue,
90
- `${language} interfaces extending TurboModule must only contain 'FunctionTypeAnnotation's. Property '${propertyName}' refers to a '${invalidPropertyValueType}'.`,
128
+ `${language} interfaces extending TurboModule must only contain 'FunctionTypeAnnotation's or non nullable 'EventEmitter's. Property '${propertyName}' refers to a '${invalidPropertyValueType}'.`,
91
129
  );
92
130
  }
93
131
  }
@@ -416,6 +454,8 @@ module.exports = {
416
454
  UnsupportedFunctionReturnTypeAnnotationParserError,
417
455
  UnsupportedEnumDeclarationParserError,
418
456
  UnsupportedUnionTypeAnnotationParserError,
457
+ UnsupportedModuleEventEmitterTypePropertyParserError,
458
+ UnsupportedModuleEventEmitterPropertyParserError,
419
459
  UnsupportedModulePropertyParserError,
420
460
  UnsupportedObjectPropertyTypeAnnotationParserError,
421
461
  UnsupportedObjectPropertyValueTypeAnnotationParserError,
@@ -142,6 +142,10 @@ function _arrayWithHoles(arr) {
142
142
  }
143
143
  const _require = require('./error-utils'),
144
144
  throwIfConfigNotfound = _require.throwIfConfigNotfound,
145
+ throwIfEventEmitterEventTypeIsUnsupported =
146
+ _require.throwIfEventEmitterEventTypeIsUnsupported,
147
+ throwIfEventEmitterTypeIsUnsupported =
148
+ _require.throwIfEventEmitterTypeIsUnsupported,
145
149
  throwIfIncorrectModuleRegistryCallArgument =
146
150
  _require.throwIfIncorrectModuleRegistryCallArgument,
147
151
  throwIfIncorrectModuleRegistryCallTypeParameterParserError =
@@ -543,6 +547,66 @@ function buildPropertySchema(
543
547
  ),
544
548
  };
545
549
  }
550
+ function buildEventEmitterSchema(
551
+ hasteModuleName,
552
+ // TODO(T108222691): [TS] Use flow-types for @babel/parser
553
+ // TODO(T71778680): [Flow] This is an ObjectTypeProperty containing either:
554
+ // - a FunctionTypeAnnotation or GenericTypeAnnotation
555
+ // - a NullableTypeAnnoation containing a FunctionTypeAnnotation or GenericTypeAnnotation
556
+ // Flow type this node
557
+ property,
558
+ types,
559
+ aliasMap,
560
+ enumMap,
561
+ tryParse,
562
+ cxxOnly,
563
+ translateTypeAnnotation,
564
+ parser,
565
+ ) {
566
+ let key = property.key,
567
+ value = property.value;
568
+ const eventemitterName = key.name;
569
+ const resolveTypeAnnotationFN = parser.getResolveTypeAnnotationFN();
570
+ const _unwrapNullable7 = unwrapNullable(value),
571
+ _unwrapNullable8 = _slicedToArray(_unwrapNullable7, 2),
572
+ typeAnnotation = _unwrapNullable8[0],
573
+ typeAnnotationNullable = _unwrapNullable8[1];
574
+ const typeAnnotationUntyped =
575
+ value.typeParameters.params.length === 1 &&
576
+ value.typeParameters.params[0].type === 'ObjectTypeAnnotation' &&
577
+ value.typeParameters.params[0].properties.length === 0;
578
+ throwIfEventEmitterTypeIsUnsupported(
579
+ hasteModuleName,
580
+ key.name,
581
+ typeAnnotation.type,
582
+ parser,
583
+ typeAnnotationNullable,
584
+ typeAnnotationUntyped,
585
+ cxxOnly,
586
+ );
587
+ const eventTypeResolutionStatus = resolveTypeAnnotationFN(
588
+ typeAnnotation.typeParameters.params[0],
589
+ types,
590
+ parser,
591
+ );
592
+ throwIfEventEmitterEventTypeIsUnsupported(
593
+ hasteModuleName,
594
+ key.name,
595
+ eventTypeResolutionStatus.typeAnnotation,
596
+ parser,
597
+ eventTypeResolutionStatus.nullable,
598
+ );
599
+ return {
600
+ name: eventemitterName,
601
+ optional: false,
602
+ typeAnnotation: {
603
+ type: 'EventEmitterTypeAnnotation',
604
+ typeAnnotation: {
605
+ type: eventTypeResolutionStatus.typeAnnotation.type,
606
+ },
607
+ },
608
+ };
609
+ }
546
610
  function buildSchemaFromConfigType(
547
611
  configType,
548
612
  filename,
@@ -744,7 +808,6 @@ const buildModuleSchema = (
744
808
  : {};
745
809
  const properties =
746
810
  language === 'Flow' ? moduleSpec.body.properties : moduleSpec.body.body;
747
-
748
811
  // $FlowFixMe[missing-type-arg]
749
812
  const nativeModuleSchema = properties
750
813
  .filter(
@@ -754,21 +817,55 @@ const buildModuleSchema = (
754
817
  property.type === 'TSMethodSignature',
755
818
  )
756
819
  .map(property => {
820
+ var _property$value, _property$value2;
757
821
  const enumMap = {};
822
+ const isEventEmitter =
823
+ (property === null ||
824
+ property === void 0 ||
825
+ (_property$value = property.value) === null ||
826
+ _property$value === void 0
827
+ ? void 0
828
+ : _property$value.type) === 'GenericTypeAnnotation' &&
829
+ (property === null ||
830
+ property === void 0 ||
831
+ (_property$value2 = property.value) === null ||
832
+ _property$value2 === void 0 ||
833
+ (_property$value2 = _property$value2.id) === null ||
834
+ _property$value2 === void 0
835
+ ? void 0
836
+ : _property$value2.name) === 'EventEmitter';
758
837
  return tryParse(() => ({
759
838
  aliasMap,
760
839
  enumMap,
761
- propertyShape: buildPropertySchema(
762
- hasteModuleName,
763
- property,
764
- types,
765
- aliasMap,
766
- enumMap,
767
- tryParse,
768
- cxxOnly,
769
- translateTypeAnnotation,
770
- parser,
771
- ),
840
+ propertyShape: isEventEmitter
841
+ ? {
842
+ type: 'eventEmitter',
843
+ value: buildEventEmitterSchema(
844
+ hasteModuleName,
845
+ property,
846
+ types,
847
+ aliasMap,
848
+ enumMap,
849
+ tryParse,
850
+ cxxOnly,
851
+ translateTypeAnnotation,
852
+ parser,
853
+ ),
854
+ }
855
+ : {
856
+ type: 'method',
857
+ value: buildPropertySchema(
858
+ hasteModuleName,
859
+ property,
860
+ types,
861
+ aliasMap,
862
+ enumMap,
863
+ tryParse,
864
+ cxxOnly,
865
+ translateTypeAnnotation,
866
+ parser,
867
+ ),
868
+ },
772
869
  }));
773
870
  })
774
871
  .filter(Boolean)
@@ -784,7 +881,12 @@ const buildModuleSchema = (
784
881
  enumMap,
785
882
  ),
786
883
  spec: {
787
- properties: [...moduleSchema.spec.properties, propertyShape],
884
+ eventEmitters: [...moduleSchema.spec.eventEmitters].concat(
885
+ propertyShape.type === 'eventEmitter' ? [propertyShape.value] : [],
886
+ ),
887
+ properties: [...moduleSchema.spec.properties].concat(
888
+ propertyShape.type === 'method' ? [propertyShape.value] : [],
889
+ ),
788
890
  },
789
891
  moduleName: moduleSchema.moduleName,
790
892
  excludedPlatforms: moduleSchema.excludedPlatforms,
@@ -794,6 +896,7 @@ const buildModuleSchema = (
794
896
  aliasMap: {},
795
897
  enumMap: {},
796
898
  spec: {
899
+ eventEmitters: [],
797
900
  properties: [],
798
901
  },
799
902
  moduleName,
@@ -806,6 +909,7 @@ const buildModuleSchema = (
806
909
  aliasMap: getSortedObject(nativeModuleSchema.aliasMap),
807
910
  enumMap: getSortedObject(nativeModuleSchema.enumMap),
808
911
  spec: {
912
+ eventEmitters: nativeModuleSchema.spec.eventEmitters.sort(),
809
913
  properties: nativeModuleSchema.spec.properties.sort(),
810
914
  },
811
915
  moduleName,
@@ -17,6 +17,7 @@ import type {
17
17
  NativeModuleAliasMap,
18
18
  NativeModuleBaseTypeAnnotation,
19
19
  NativeModuleEnumMap,
20
+ NativeModuleEventEmitterShape,
20
21
  NativeModuleFunctionTypeAnnotation,
21
22
  NativeModuleParamTypeAnnotation,
22
23
  NativeModulePropertyShape,
@@ -40,6 +41,8 @@ import type {
40
41
 
41
42
  const {
42
43
  throwIfConfigNotfound,
44
+ throwIfEventEmitterEventTypeIsUnsupported,
45
+ throwIfEventEmitterTypeIsUnsupported,
43
46
  throwIfIncorrectModuleRegistryCallArgument,
44
47
  throwIfIncorrectModuleRegistryCallTypeParameterParserError,
45
48
  throwIfModuleInterfaceIsMisnamed,
@@ -470,6 +473,63 @@ function buildPropertySchema(
470
473
  };
471
474
  }
472
475
 
476
+ function buildEventEmitterSchema(
477
+ hasteModuleName: string,
478
+ // TODO(T108222691): [TS] Use flow-types for @babel/parser
479
+ // TODO(T71778680): [Flow] This is an ObjectTypeProperty containing either:
480
+ // - a FunctionTypeAnnotation or GenericTypeAnnotation
481
+ // - a NullableTypeAnnoation containing a FunctionTypeAnnotation or GenericTypeAnnotation
482
+ // Flow type this node
483
+ property: $FlowFixMe,
484
+ types: TypeDeclarationMap,
485
+ aliasMap: {...NativeModuleAliasMap},
486
+ enumMap: {...NativeModuleEnumMap},
487
+ tryParse: ParserErrorCapturer,
488
+ cxxOnly: boolean,
489
+ translateTypeAnnotation: $FlowFixMe,
490
+ parser: Parser,
491
+ ): NativeModuleEventEmitterShape {
492
+ let {key, value} = property;
493
+ const eventemitterName: string = key.name;
494
+
495
+ const resolveTypeAnnotationFN = parser.getResolveTypeAnnotationFN();
496
+ const [typeAnnotation, typeAnnotationNullable] = unwrapNullable(value);
497
+ const typeAnnotationUntyped =
498
+ value.typeParameters.params.length === 1 &&
499
+ value.typeParameters.params[0].type === 'ObjectTypeAnnotation' &&
500
+ value.typeParameters.params[0].properties.length === 0;
501
+
502
+ throwIfEventEmitterTypeIsUnsupported(
503
+ hasteModuleName,
504
+ key.name,
505
+ typeAnnotation.type,
506
+ parser,
507
+ typeAnnotationNullable,
508
+ typeAnnotationUntyped,
509
+ cxxOnly,
510
+ );
511
+ const eventTypeResolutionStatus = resolveTypeAnnotationFN(
512
+ typeAnnotation.typeParameters.params[0],
513
+ types,
514
+ parser,
515
+ );
516
+ throwIfEventEmitterEventTypeIsUnsupported(
517
+ hasteModuleName,
518
+ key.name,
519
+ eventTypeResolutionStatus.typeAnnotation,
520
+ parser,
521
+ eventTypeResolutionStatus.nullable,
522
+ );
523
+ return {
524
+ name: eventemitterName,
525
+ optional: false,
526
+ typeAnnotation: {
527
+ type: 'EventEmitterTypeAnnotation',
528
+ typeAnnotation: {type: eventTypeResolutionStatus.typeAnnotation.type},
529
+ },
530
+ };
531
+ }
532
+
473
533
  function buildSchemaFromConfigType(
474
534
  configType: 'module' | 'component' | 'none',
475
535
  filename: ?string,
@@ -719,6 +779,10 @@ const buildModuleSchema = (
719
779
  const properties: $ReadOnlyArray<$FlowFixMe> =
720
780
  language === 'Flow' ? moduleSpec.body.properties : moduleSpec.body.body;
721
781
 
782
+ type PropertyShape =
783
+ | {type: 'eventEmitter', value: NativeModuleEventEmitterShape}
784
+ | {type: 'method', value: NativeModulePropertyShape};
785
+
722
786
  // $FlowFixMe[missing-type-arg]
723
787
  const nativeModuleSchema = properties
724
788
  .filter(
@@ -730,23 +794,44 @@ const buildModuleSchema = (
730
794
  .map<?{
731
795
  aliasMap: NativeModuleAliasMap,
732
796
  enumMap: NativeModuleEnumMap,
733
- propertyShape: NativeModulePropertyShape,
797
+ propertyShape: PropertyShape,
734
798
  }>(property => {
735
799
  const enumMap: {...NativeModuleEnumMap} = {};
800
+ const isEventEmitter =
801
+ property?.value?.type === 'GenericTypeAnnotation' &&
802
+ property?.value?.id?.name === 'EventEmitter';
736
803
  return tryParse(() => ({
737
804
  aliasMap,
738
805
  enumMap,
739
- propertyShape: buildPropertySchema(
740
- hasteModuleName,
741
- property,
742
- types,
743
- aliasMap,
744
- enumMap,
745
- tryParse,
746
- cxxOnly,
747
- translateTypeAnnotation,
748
- parser,
749
- ),
806
+ propertyShape: isEventEmitter
807
+ ? {
808
+ type: 'eventEmitter',
809
+ value: buildEventEmitterSchema(
810
+ hasteModuleName,
811
+ property,
812
+ types,
813
+ aliasMap,
814
+ enumMap,
815
+ tryParse,
816
+ cxxOnly,
817
+ translateTypeAnnotation,
818
+ parser,
819
+ ),
820
+ }
821
+ : {
822
+ type: 'method',
823
+ value: buildPropertySchema(
824
+ hasteModuleName,
825
+ property,
826
+ types,
827
+ aliasMap,
828
+ enumMap,
829
+ tryParse,
830
+ cxxOnly,
831
+ translateTypeAnnotation,
832
+ parser,
833
+ ),
834
+ },
750
835
  }));
751
836
  })
752
837
  .filter(Boolean)
@@ -756,7 +841,12 @@ const buildModuleSchema = (
756
841
  aliasMap: {...moduleSchema.aliasMap, ...aliasMap},
757
842
  enumMap: {...moduleSchema.enumMap, ...enumMap},
758
843
  spec: {
759
- properties: [...moduleSchema.spec.properties, propertyShape],
844
+ eventEmitters: [...moduleSchema.spec.eventEmitters].concat(
845
+ propertyShape.type === 'eventEmitter' ? [propertyShape.value] : [],
846
+ ),
847
+ properties: [...moduleSchema.spec.properties].concat(
848
+ propertyShape.type === 'method' ? [propertyShape.value] : [],
849
+ ),
760
850
  },
761
851
  moduleName: moduleSchema.moduleName,
762
852
  excludedPlatforms: moduleSchema.excludedPlatforms,
@@ -765,7 +855,7 @@ const buildModuleSchema = (
765
855
  type: 'NativeModule',
766
856
  aliasMap: {},
767
857
  enumMap: {},
768
- spec: {properties: []},
858
+ spec: {eventEmitters: [], properties: []},
769
859
  moduleName,
770
860
  excludedPlatforms:
771
861
  excludedPlatforms.length !== 0 ? [...excludedPlatforms] : undefined,
@@ -776,7 +866,10 @@ const buildModuleSchema = (
776
866
  type: 'NativeModule',
777
867
  aliasMap: getSortedObject(nativeModuleSchema.aliasMap),
778
868
  enumMap: getSortedObject(nativeModuleSchema.enumMap),
779
- spec: {properties: nativeModuleSchema.spec.properties.sort()},
869
+ spec: {
870
+ eventEmitters: nativeModuleSchema.spec.eventEmitters.sort(),
871
+ properties: nativeModuleSchema.spec.properties.sort(),
872
+ },
780
873
  moduleName,
781
874
  excludedPlatforms: nativeModuleSchema.excludedPlatforms,
782
875
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-native/codegen",
3
- "version": "0.75.0-nightly-20240611-5b3a32142",
3
+ "version": "0.75.0-nightly-20240612-fd618819c",
4
4
  "description": "Code generation tools for React Native",
5
5
  "license": "MIT",
6
6
  "repository": {