@react-native/codegen 0.84.0-nightly-20251203-a5e6addc6 → 0.84.0-nightly-20251205-95cc1e767

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 (50) hide show
  1. package/lib/CodegenSchema.d.ts +4 -13
  2. package/lib/CodegenSchema.js.flow +5 -13
  3. package/lib/cli/combine/combine-js-to-schema.js +6 -8
  4. package/lib/cli/combine/combine-js-to-schema.js.flow +6 -8
  5. package/lib/generators/Utils.js +49 -0
  6. package/lib/generators/Utils.js.flow +58 -0
  7. package/lib/generators/components/CppHelpers.js +35 -2
  8. package/lib/generators/components/CppHelpers.js.flow +35 -2
  9. package/lib/generators/components/GenerateEventEmitterCpp.js +11 -2
  10. package/lib/generators/components/GenerateEventEmitterCpp.js.flow +11 -2
  11. package/lib/generators/components/GenerateEventEmitterH.js +24 -9
  12. package/lib/generators/components/GenerateEventEmitterH.js.flow +24 -10
  13. package/lib/generators/modules/GenerateModuleH.js +24 -17
  14. package/lib/generators/modules/GenerateModuleH.js.flow +24 -17
  15. package/lib/generators/modules/GenerateModuleJavaSpec.js +48 -34
  16. package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +48 -34
  17. package/lib/generators/modules/GenerateModuleJniCpp.js +29 -28
  18. package/lib/generators/modules/GenerateModuleJniCpp.js.flow +29 -28
  19. package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js +36 -22
  20. package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js.flow +39 -24
  21. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js +4 -3
  22. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js.flow +4 -3
  23. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js +7 -4
  24. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js.flow +7 -4
  25. package/lib/generators/modules/GenerateModuleObjCpp/serializeEventEmitter.js +19 -6
  26. package/lib/generators/modules/GenerateModuleObjCpp/serializeEventEmitter.js.flow +19 -6
  27. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js +22 -23
  28. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +22 -23
  29. package/lib/parsers/error-utils.js +1 -1
  30. package/lib/parsers/error-utils.js.flow +1 -1
  31. package/lib/parsers/errors.js +0 -15
  32. package/lib/parsers/errors.js.flow +0 -22
  33. package/lib/parsers/flow/components/events.js +1 -1
  34. package/lib/parsers/flow/components/events.js.flow +1 -1
  35. package/lib/parsers/flow/modules/index.js +12 -1
  36. package/lib/parsers/flow/modules/index.js.flow +12 -1
  37. package/lib/parsers/flow/parser.js +0 -3
  38. package/lib/parsers/flow/parser.js.flow +2 -8
  39. package/lib/parsers/parser.js.flow +2 -10
  40. package/lib/parsers/parserMock.js +0 -3
  41. package/lib/parsers/parserMock.js.flow +2 -8
  42. package/lib/parsers/parsers-primitives.js +41 -47
  43. package/lib/parsers/parsers-primitives.js.flow +45 -56
  44. package/lib/parsers/typescript/components/events.js +1 -1
  45. package/lib/parsers/typescript/components/events.js.flow +1 -1
  46. package/lib/parsers/typescript/modules/index.js +12 -1
  47. package/lib/parsers/typescript/modules/index.js.flow +12 -1
  48. package/lib/parsers/typescript/parser.js +0 -3
  49. package/lib/parsers/typescript/parser.js.flow +2 -8
  50. package/package.json +2 -2
@@ -23,6 +23,7 @@ import type {
23
23
  import type {AliasResolver} from './Utils';
24
24
 
25
25
  const {unwrapNullable} = require('../../parsers/parsers-commons');
26
+ const {parseValidUnionType} = require('../Utils');
26
27
  const {createAliasResolver, getModules} = require('./Utils');
27
28
 
28
29
  type FilesOutput = Map<string, string>;
@@ -167,8 +168,6 @@ function translateReturnTypeToKind(
167
168
  return 'StringKind';
168
169
  case 'StringLiteralTypeAnnotation':
169
170
  return 'StringKind';
170
- case 'StringLiteralUnionTypeAnnotation':
171
- return 'StringKind';
172
171
  case 'BooleanTypeAnnotation':
173
172
  return 'BooleanKind';
174
173
  case 'BooleanLiteralTypeAnnotation':
@@ -185,17 +184,19 @@ function translateReturnTypeToKind(
185
184
  );
186
185
  }
187
186
  case 'UnionTypeAnnotation':
188
- switch (typeAnnotation.memberType) {
189
- case 'NumberTypeAnnotation':
187
+ const validUnionType = parseValidUnionType(realTypeAnnotation);
188
+ switch (validUnionType) {
189
+ case 'boolean':
190
+ return 'BooleanKind';
191
+ case 'number':
190
192
  return 'NumberKind';
191
- case 'ObjectTypeAnnotation':
193
+ case 'object':
192
194
  return 'ObjectKind';
193
- case 'StringTypeAnnotation':
195
+ case 'string':
194
196
  return 'StringKind';
195
197
  default:
196
- throw new Error(
197
- `Unsupported union member returning value, found: ${realTypeAnnotation.memberType}"`,
198
- );
198
+ (validUnionType: empty);
199
+ throw new Error(`Unsupported union member type`);
199
200
  }
200
201
  case 'NumberTypeAnnotation':
201
202
  return 'NumberKind';
@@ -254,8 +255,6 @@ function translateParamTypeToJniType(
254
255
  return 'Ljava/lang/String;';
255
256
  case 'StringLiteralTypeAnnotation':
256
257
  return 'Ljava/lang/String;';
257
- case 'StringLiteralUnionTypeAnnotation':
258
- return 'Ljava/lang/String;';
259
258
  case 'BooleanTypeAnnotation':
260
259
  return !isRequired ? 'Ljava/lang/Boolean;' : 'Z';
261
260
  case 'BooleanLiteralTypeAnnotation':
@@ -272,17 +271,19 @@ function translateParamTypeToJniType(
272
271
  );
273
272
  }
274
273
  case 'UnionTypeAnnotation':
275
- switch (typeAnnotation.memberType) {
276
- case 'NumberTypeAnnotation':
274
+ const validUnionType = parseValidUnionType(realTypeAnnotation);
275
+ switch (validUnionType) {
276
+ case 'boolean':
277
+ return !isRequired ? 'Ljava/lang/Boolean;' : 'Z';
278
+ case 'number':
277
279
  return !isRequired ? 'Ljava/lang/Double;' : 'D';
278
- case 'ObjectTypeAnnotation':
280
+ case 'object':
279
281
  return 'Lcom/facebook/react/bridge/ReadableMap;';
280
- case 'StringTypeAnnotation':
282
+ case 'string':
281
283
  return 'Ljava/lang/String;';
282
284
  default:
283
- throw new Error(
284
- `Unsupported union prop value, found: ${realTypeAnnotation.memberType}"`,
285
- );
285
+ (validUnionType: empty);
286
+ throw new Error(`Unsupported union member type`);
286
287
  }
287
288
  case 'NumberTypeAnnotation':
288
289
  return !isRequired ? 'Ljava/lang/Double;' : 'D';
@@ -338,8 +339,6 @@ function translateReturnTypeToJniType(
338
339
  return 'Ljava/lang/String;';
339
340
  case 'StringLiteralTypeAnnotation':
340
341
  return 'Ljava/lang/String;';
341
- case 'StringLiteralUnionTypeAnnotation':
342
- return 'Ljava/lang/String;';
343
342
  case 'BooleanTypeAnnotation':
344
343
  return nullable ? 'Ljava/lang/Boolean;' : 'Z';
345
344
  case 'BooleanLiteralTypeAnnotation':
@@ -356,17 +355,19 @@ function translateReturnTypeToJniType(
356
355
  );
357
356
  }
358
357
  case 'UnionTypeAnnotation':
359
- switch (typeAnnotation.memberType) {
360
- case 'NumberTypeAnnotation':
358
+ const validUnionType = parseValidUnionType(realTypeAnnotation);
359
+ switch (validUnionType) {
360
+ case 'boolean':
361
+ return nullable ? 'Ljava/lang/Boolean;' : 'Z';
362
+ case 'number':
361
363
  return nullable ? 'Ljava/lang/Double;' : 'D';
362
- case 'ObjectTypeAnnotation':
363
- return 'Lcom/facebook/react/bridge/WritableMap;';
364
- case 'StringTypeAnnotation':
364
+ case 'object':
365
+ return 'Lcom/facebook/react/bridge/ReadableMap;';
366
+ case 'string':
365
367
  return 'Ljava/lang/String;';
366
368
  default:
367
- throw new Error(
368
- `Unsupported union member type, found: ${realTypeAnnotation.memberType}"`,
369
- );
369
+ (validUnionType: empty);
370
+ throw new Error(`Unsupported union member type`);
370
371
  }
371
372
  case 'NumberTypeAnnotation':
372
373
  return nullable ? 'Ljava/lang/Double;' : 'D';
@@ -41,7 +41,11 @@ const {
41
41
  unwrapNullable,
42
42
  wrapNullable,
43
43
  } = require('../../../parsers/parsers-commons');
44
- const {capitalize} = require('../../Utils');
44
+ const {
45
+ HeterogeneousUnionError,
46
+ capitalize,
47
+ parseValidUnionType,
48
+ } = require('../../Utils');
45
49
  class StructCollector {
46
50
  constructor() {
47
51
  _defineProperty(this, '_structs', new Map());
@@ -89,27 +93,37 @@ class StructCollector {
89
93
  case 'MixedTypeAnnotation':
90
94
  throw new Error('Mixed types are unsupported in structs');
91
95
  case 'UnionTypeAnnotation':
92
- switch (typeAnnotation.memberType) {
93
- case 'StringTypeAnnotation':
94
- return wrapNullable(nullable, {
95
- type: 'StringTypeAnnotation',
96
- });
97
- case 'NumberTypeAnnotation':
98
- return wrapNullable(nullable, {
99
- type: 'NumberTypeAnnotation',
100
- });
101
- case 'ObjectTypeAnnotation':
102
- // This isn't smart enough to actually know how to generate the
103
- // options on the native side. So we just treat it as an unknown object type
104
- return wrapNullable(nullable, {
105
- type: 'GenericObjectTypeAnnotation',
106
- });
107
- default:
108
- typeAnnotation.memberType;
109
- throw new Error(
110
- 'Union types are unsupported in structs' +
111
- JSON.stringify(typeAnnotation),
112
- );
96
+ try {
97
+ const validUnionType = parseValidUnionType(typeAnnotation);
98
+ switch (validUnionType) {
99
+ case 'boolean':
100
+ return wrapNullable(nullable, {
101
+ type: 'BooleanTypeAnnotation',
102
+ });
103
+ case 'number':
104
+ return wrapNullable(nullable, {
105
+ type: 'NumberTypeAnnotation',
106
+ });
107
+ case 'object':
108
+ // This isn't smart enough to actually know how to generate the
109
+ // options on the native side. So we just treat it as an unknown object type
110
+ return wrapNullable(nullable, {
111
+ type: 'GenericObjectTypeAnnotation',
112
+ });
113
+ case 'string':
114
+ return wrapNullable(nullable, {
115
+ type: 'StringTypeAnnotation',
116
+ });
117
+ default:
118
+ validUnionType;
119
+ throw new Error(`Unsupported union member types`);
120
+ }
121
+ } catch (ex) {
122
+ // TODO(T247151345): Implement proper heterogeneous union support.
123
+ if (ex instanceof HeterogeneousUnionError) {
124
+ return wrapNullable(nullable, typeAnnotation);
125
+ }
126
+ throw ex;
113
127
  }
114
128
  default: {
115
129
  return wrapNullable(nullable, typeAnnotation);
@@ -23,11 +23,11 @@ import type {
23
23
  NativeModuleNumberTypeAnnotation,
24
24
  NativeModuleObjectTypeAnnotation,
25
25
  NativeModuleTypeAliasTypeAnnotation,
26
+ NativeModuleUnionTypeAnnotation,
26
27
  Nullable,
27
28
  NumberLiteralTypeAnnotation,
28
29
  ReservedTypeAnnotation,
29
30
  StringLiteralTypeAnnotation,
30
- StringLiteralUnionTypeAnnotation,
31
31
  StringTypeAnnotation,
32
32
  } from '../../../CodegenSchema';
33
33
  import type {AliasResolver} from '../Utils';
@@ -36,7 +36,11 @@ const {
36
36
  unwrapNullable,
37
37
  wrapNullable,
38
38
  } = require('../../../parsers/parsers-commons');
39
- const {capitalize} = require('../../Utils');
39
+ const {
40
+ HeterogeneousUnionError,
41
+ capitalize,
42
+ parseValidUnionType,
43
+ } = require('../../Utils');
40
44
 
41
45
  type StructContext = 'CONSTANTS' | 'REGULAR';
42
46
 
@@ -63,7 +67,7 @@ export type StructProperty = $ReadOnly<{
63
67
  export type StructTypeAnnotation =
64
68
  | StringTypeAnnotation
65
69
  | StringLiteralTypeAnnotation
66
- | StringLiteralUnionTypeAnnotation
70
+ | NativeModuleUnionTypeAnnotation
67
71
  | NativeModuleNumberTypeAnnotation
68
72
  | NumberLiteralTypeAnnotation
69
73
  | BooleanLiteralTypeAnnotation
@@ -129,27 +133,38 @@ class StructCollector {
129
133
  case 'MixedTypeAnnotation':
130
134
  throw new Error('Mixed types are unsupported in structs');
131
135
  case 'UnionTypeAnnotation':
132
- switch (typeAnnotation.memberType) {
133
- case 'StringTypeAnnotation':
134
- return wrapNullable(nullable, {
135
- type: 'StringTypeAnnotation',
136
- });
137
- case 'NumberTypeAnnotation':
138
- return wrapNullable(nullable, {
139
- type: 'NumberTypeAnnotation',
140
- });
141
- case 'ObjectTypeAnnotation':
142
- // This isn't smart enough to actually know how to generate the
143
- // options on the native side. So we just treat it as an unknown object type
144
- return wrapNullable(nullable, {
145
- type: 'GenericObjectTypeAnnotation',
146
- });
147
- default:
148
- (typeAnnotation.memberType: empty);
149
- throw new Error(
150
- 'Union types are unsupported in structs' +
151
- JSON.stringify(typeAnnotation),
152
- );
136
+ try {
137
+ const validUnionType = parseValidUnionType(typeAnnotation);
138
+ switch (validUnionType) {
139
+ case 'boolean':
140
+ return wrapNullable(nullable, {
141
+ type: 'BooleanTypeAnnotation',
142
+ });
143
+ case 'number':
144
+ return wrapNullable(nullable, {
145
+ type: 'NumberTypeAnnotation',
146
+ });
147
+ case 'object':
148
+ // This isn't smart enough to actually know how to generate the
149
+ // options on the native side. So we just treat it as an unknown object type
150
+ return wrapNullable(nullable, {
151
+ type: 'GenericObjectTypeAnnotation',
152
+ });
153
+ case 'string':
154
+ return wrapNullable(nullable, {
155
+ type: 'StringTypeAnnotation',
156
+ });
157
+ default:
158
+ (validUnionType: empty);
159
+ throw new Error(`Unsupported union member types`);
160
+ }
161
+ } catch (ex) {
162
+ // TODO(T247151345): Implement proper heterogeneous union support.
163
+ if (ex instanceof HeterogeneousUnionError) {
164
+ return wrapNullable(nullable, typeAnnotation);
165
+ }
166
+
167
+ throw ex;
153
168
  }
154
169
  default: {
155
170
  return wrapNullable(nullable, typeAnnotation);
@@ -80,8 +80,9 @@ function toObjCType(
80
80
  return 'NSString *';
81
81
  case 'StringLiteralTypeAnnotation':
82
82
  return 'NSString *';
83
- case 'StringLiteralUnionTypeAnnotation':
84
- return 'NSString *';
83
+ case 'UnionTypeAnnotation':
84
+ // TODO(T247151345): Implement proper heterogeneous union support. This is unsafe.
85
+ return 'NSObject *';
85
86
  case 'NumberTypeAnnotation':
86
87
  return wrapCxxOptional('double', isRequired);
87
88
  case 'NumberLiteralTypeAnnotation':
@@ -160,7 +161,7 @@ function toObjCValue(
160
161
  return value;
161
162
  case 'StringLiteralTypeAnnotation':
162
163
  return value;
163
- case 'StringLiteralUnionTypeAnnotation':
164
+ case 'UnionTypeAnnotation':
164
165
  return value;
165
166
  case 'NumberTypeAnnotation':
166
167
  return wrapPrimitive('double');
@@ -96,8 +96,9 @@ function toObjCType(
96
96
  return 'NSString *';
97
97
  case 'StringLiteralTypeAnnotation':
98
98
  return 'NSString *';
99
- case 'StringLiteralUnionTypeAnnotation':
100
- return 'NSString *';
99
+ case 'UnionTypeAnnotation':
100
+ // TODO(T247151345): Implement proper heterogeneous union support. This is unsafe.
101
+ return 'NSObject *';
101
102
  case 'NumberTypeAnnotation':
102
103
  return wrapCxxOptional('double', isRequired);
103
104
  case 'NumberLiteralTypeAnnotation':
@@ -183,7 +184,7 @@ function toObjCValue(
183
184
  return value;
184
185
  case 'StringLiteralTypeAnnotation':
185
186
  return value;
186
- case 'StringLiteralUnionTypeAnnotation':
187
+ case 'UnionTypeAnnotation':
187
188
  return value;
188
189
  case 'NumberTypeAnnotation':
189
190
  return wrapPrimitive('double');
@@ -68,8 +68,9 @@ function toObjCType(
68
68
  return 'NSString *';
69
69
  case 'StringLiteralTypeAnnotation':
70
70
  return 'NSString *';
71
- case 'StringLiteralUnionTypeAnnotation':
72
- return 'NSString *';
71
+ case 'UnionTypeAnnotation':
72
+ // TODO(T247151345): Implement proper heterogeneous union support. This is unsafe.
73
+ return 'NSObject *';
73
74
  case 'NumberTypeAnnotation':
74
75
  return wrapCxxOptional('double', isRequired);
75
76
  case 'NumberLiteralTypeAnnotation':
@@ -149,8 +150,10 @@ function toObjCValue(
149
150
  return RCTBridgingTo('String');
150
151
  case 'StringLiteralTypeAnnotation':
151
152
  return RCTBridgingTo('String');
152
- case 'StringLiteralUnionTypeAnnotation':
153
- return RCTBridgingTo('String');
153
+ case 'UnionTypeAnnotation':
154
+ return !isRequired
155
+ ? `!RCTNilIfNull(${value}) ? std::optional<NSObject *>{} : std::optional<NSObject *>(${value})`
156
+ : value;
154
157
  case 'NumberTypeAnnotation':
155
158
  return RCTBridgingTo('Double');
156
159
  case 'NumberLiteralTypeAnnotation':
@@ -87,8 +87,9 @@ function toObjCType(
87
87
  return 'NSString *';
88
88
  case 'StringLiteralTypeAnnotation':
89
89
  return 'NSString *';
90
- case 'StringLiteralUnionTypeAnnotation':
91
- return 'NSString *';
90
+ case 'UnionTypeAnnotation':
91
+ // TODO(T247151345): Implement proper heterogeneous union support. This is unsafe.
92
+ return 'NSObject *';
92
93
  case 'NumberTypeAnnotation':
93
94
  return wrapCxxOptional('double', isRequired);
94
95
  case 'NumberLiteralTypeAnnotation':
@@ -173,8 +174,10 @@ function toObjCValue(
173
174
  return RCTBridgingTo('String');
174
175
  case 'StringLiteralTypeAnnotation':
175
176
  return RCTBridgingTo('String');
176
- case 'StringLiteralUnionTypeAnnotation':
177
- return RCTBridgingTo('String');
177
+ case 'UnionTypeAnnotation':
178
+ return !isRequired
179
+ ? `!RCTNilIfNull(${value}) ? std::optional<NSObject *>{} : std::optional<NSObject *>(${value})`
180
+ : value;
178
181
  case 'NumberTypeAnnotation':
179
182
  return RCTBridgingTo('Double');
180
183
  case 'NumberLiteralTypeAnnotation':
@@ -8,16 +8,29 @@
8
8
  * @format
9
9
  */
10
10
 
11
- const {toPascalCase} = require('../../Utils');
11
+ const {parseValidUnionType, toPascalCase} = require('../../Utils');
12
12
  function getEventEmitterTypeObjCType(eventEmitter) {
13
- const type = eventEmitter.typeAnnotation.typeAnnotation.type;
14
- switch (type) {
13
+ const typeAnnotation = eventEmitter.typeAnnotation.typeAnnotation;
14
+ switch (typeAnnotation.type) {
15
15
  case 'StringTypeAnnotation':
16
16
  return 'NSString *_Nonnull';
17
17
  case 'StringLiteralTypeAnnotation':
18
18
  return 'NSString *_Nonnull';
19
- case 'StringLiteralUnionTypeAnnotation':
20
- return 'NSString *_Nonnull';
19
+ case 'UnionTypeAnnotation':
20
+ const validUnionType = parseValidUnionType(typeAnnotation);
21
+ switch (validUnionType) {
22
+ case 'boolean':
23
+ return 'BOOL';
24
+ case 'number':
25
+ return 'NSNumber *_Nonnull';
26
+ case 'object':
27
+ return 'NSDictionary *';
28
+ case 'string':
29
+ return 'NSString *_Nonnull';
30
+ default:
31
+ validUnionType;
32
+ throw new Error(`Unsupported union member type`);
33
+ }
21
34
  case 'NumberTypeAnnotation':
22
35
  case 'NumberLiteralTypeAnnotation':
23
36
  return 'NSNumber *_Nonnull';
@@ -39,7 +52,7 @@ function getEventEmitterTypeObjCType(eventEmitter) {
39
52
  `Unsupported eventType for ${eventEmitter.name}. Found: ${eventEmitter.typeAnnotation.typeAnnotation.type}`,
40
53
  );
41
54
  default:
42
- type;
55
+ typeAnnotation.type;
43
56
  throw new Error(
44
57
  `Unsupported eventType for ${eventEmitter.name}. Found: ${eventEmitter.typeAnnotation.typeAnnotation.type}`,
45
58
  );
@@ -10,20 +10,33 @@
10
10
 
11
11
  import type {NativeModuleEventEmitterShape} from '../../../CodegenSchema';
12
12
 
13
- const {toPascalCase} = require('../../Utils');
13
+ const {parseValidUnionType, toPascalCase} = require('../../Utils');
14
14
 
15
15
  function getEventEmitterTypeObjCType(
16
16
  eventEmitter: NativeModuleEventEmitterShape,
17
17
  ): string {
18
- const type = eventEmitter.typeAnnotation.typeAnnotation.type;
18
+ const typeAnnotation = eventEmitter.typeAnnotation.typeAnnotation;
19
19
 
20
- switch (type) {
20
+ switch (typeAnnotation.type) {
21
21
  case 'StringTypeAnnotation':
22
22
  return 'NSString *_Nonnull';
23
23
  case 'StringLiteralTypeAnnotation':
24
24
  return 'NSString *_Nonnull';
25
- case 'StringLiteralUnionTypeAnnotation':
26
- return 'NSString *_Nonnull';
25
+ case 'UnionTypeAnnotation':
26
+ const validUnionType = parseValidUnionType(typeAnnotation);
27
+ switch (validUnionType) {
28
+ case 'boolean':
29
+ return 'BOOL';
30
+ case 'number':
31
+ return 'NSNumber *_Nonnull';
32
+ case 'object':
33
+ return 'NSDictionary *';
34
+ case 'string':
35
+ return 'NSString *_Nonnull';
36
+ default:
37
+ (validUnionType: empty);
38
+ throw new Error(`Unsupported union member type`);
39
+ }
27
40
  case 'NumberTypeAnnotation':
28
41
  case 'NumberLiteralTypeAnnotation':
29
42
  return 'NSNumber *_Nonnull';
@@ -45,7 +58,7 @@ function getEventEmitterTypeObjCType(
45
58
  `Unsupported eventType for ${eventEmitter.name}. Found: ${eventEmitter.typeAnnotation.typeAnnotation.type}`,
46
59
  );
47
60
  default:
48
- (type: empty);
61
+ (typeAnnotation.type: empty);
49
62
  throw new Error(
50
63
  `Unsupported eventType for ${eventEmitter.name}. Found: ${eventEmitter.typeAnnotation.typeAnnotation.type}`,
51
64
  );
@@ -15,7 +15,7 @@ const {
15
15
  wrapNullable,
16
16
  } = require('../../../parsers/parsers-commons');
17
17
  const {wrapOptional} = require('../../TypeUtils/Objective-C');
18
- const {capitalize} = require('../../Utils');
18
+ const {capitalize, parseValidUnionType} = require('../../Utils');
19
19
  const {getNamespacedStructName} = require('./Utils');
20
20
  const invariant = require('invariant');
21
21
  const ProtocolMethodTemplate = ({returnObjCType, methodName, params}) =>
@@ -210,8 +210,9 @@ function getParamObjCType(
210
210
  return notStruct(wrapOptional('NSString *', !nullable));
211
211
  case 'StringLiteralTypeAnnotation':
212
212
  return notStruct(wrapOptional('NSString *', !nullable));
213
- case 'StringLiteralUnionTypeAnnotation':
214
- return notStruct(wrapOptional('NSString *', !nullable));
213
+ case 'UnionTypeAnnotation':
214
+ // TODO(T247151345): Implement proper heterogeneous union support. This is unsafe.
215
+ return notStruct(wrapOptional('NSObject *', !nullable));
215
216
  case 'NumberTypeAnnotation':
216
217
  return notStruct(isRequired ? 'double' : 'NSNumber *');
217
218
  case 'NumberLiteralTypeAnnotation':
@@ -284,10 +285,6 @@ function getReturnObjCType(methodName, nullableTypeAnnotation) {
284
285
  // TODO: Can NSString * returns not be _Nullable?
285
286
  // In the legacy codegen, we don't surround NSSTring * with _Nullable
286
287
  return wrapOptional('NSString *', isRequired);
287
- case 'StringLiteralUnionTypeAnnotation':
288
- // TODO: Can NSString * returns not be _Nullable?
289
- // In the legacy codegen, we don't surround NSSTring * with _Nullable
290
- return wrapOptional('NSString *', isRequired);
291
288
  case 'NumberTypeAnnotation':
292
289
  return wrapOptional('NSNumber *', isRequired);
293
290
  case 'NumberLiteralTypeAnnotation':
@@ -314,19 +311,21 @@ function getReturnObjCType(methodName, nullableTypeAnnotation) {
314
311
  );
315
312
  }
316
313
  case 'UnionTypeAnnotation':
317
- switch (typeAnnotation.memberType) {
318
- case 'NumberTypeAnnotation':
314
+ const validUnionType = parseValidUnionType(typeAnnotation);
315
+ switch (validUnionType) {
316
+ case 'boolean':
319
317
  return wrapOptional('NSNumber *', isRequired);
320
- case 'ObjectTypeAnnotation':
318
+ case 'number':
319
+ return wrapOptional('NSNumber *', isRequired);
320
+ case 'object':
321
321
  return wrapOptional('NSDictionary *', isRequired);
322
- case 'StringTypeAnnotation':
322
+ case 'string':
323
323
  // TODO: Can NSString * returns not be _Nullable?
324
324
  // In the legacy codegen, we don't surround NSSTring * with _Nullable
325
325
  return wrapOptional('NSString *', isRequired);
326
326
  default:
327
- throw new Error(
328
- `Unsupported union return type for ${methodName}, found: ${typeAnnotation.memberType}"`,
329
- );
327
+ validUnionType;
328
+ throw new Error(`Unsupported union member type`);
330
329
  }
331
330
  case 'GenericObjectTypeAnnotation':
332
331
  return wrapOptional('NSDictionary *', isRequired);
@@ -356,8 +355,6 @@ function getReturnJSType(methodName, nullableTypeAnnotation) {
356
355
  return 'StringKind';
357
356
  case 'StringLiteralTypeAnnotation':
358
357
  return 'StringKind';
359
- case 'StringLiteralUnionTypeAnnotation':
360
- return 'StringKind';
361
358
  case 'NumberTypeAnnotation':
362
359
  return 'NumberKind';
363
360
  case 'NumberLiteralTypeAnnotation':
@@ -386,17 +383,19 @@ function getReturnJSType(methodName, nullableTypeAnnotation) {
386
383
  );
387
384
  }
388
385
  case 'UnionTypeAnnotation':
389
- switch (typeAnnotation.memberType) {
390
- case 'NumberTypeAnnotation':
386
+ const validUnionType = parseValidUnionType(typeAnnotation);
387
+ switch (validUnionType) {
388
+ case 'boolean':
389
+ return 'BooleanKind';
390
+ case 'number':
391
391
  return 'NumberKind';
392
- case 'ObjectTypeAnnotation':
392
+ case 'object':
393
393
  return 'ObjectKind';
394
- case 'StringTypeAnnotation':
394
+ case 'string':
395
395
  return 'StringKind';
396
396
  default:
397
- throw new Error(
398
- `Unsupported return type for ${methodName}. Found: ${typeAnnotation.type}`,
399
- );
397
+ validUnionType;
398
+ throw new Error(`Unsupported union member types`);
400
399
  }
401
400
  default:
402
401
  typeAnnotation.type;