@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.
- package/lib/CodegenSchema.d.ts +8 -0
- package/lib/CodegenSchema.js.flow +9 -0
- package/lib/generators/__test_fixtures__/fixtures.js +1 -0
- package/lib/generators/__test_fixtures__/fixtures.js.flow +1 -0
- package/lib/generators/modules/GenerateModuleH.js +73 -4
- package/lib/generators/modules/GenerateModuleH.js.flow +85 -11
- package/lib/generators/modules/__test_fixtures__/fixtures.js +10 -0
- package/lib/generators/modules/__test_fixtures__/fixtures.js.flow +10 -0
- package/lib/parsers/error-utils.js +44 -0
- package/lib/parsers/error-utils.js.flow +44 -0
- package/lib/parsers/errors.js +39 -1
- package/lib/parsers/errors.js.flow +41 -1
- package/lib/parsers/parsers-commons.js +117 -13
- package/lib/parsers/parsers-commons.js.flow +108 -15
- package/package.json +1 -1
package/lib/CodegenSchema.d.ts
CHANGED
|
@@ -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
|
>;
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
package/lib/parsers/errors.js
CHANGED
|
@@ -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:
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
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
|
-
|
|
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: {
|
|
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
|
};
|