@react-native/codegen 0.72.4 → 0.73.0-nightly-20230603-fd9e295be

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 (74) hide show
  1. package/README.md +2 -2
  2. package/lib/CodegenSchema.d.ts +15 -4
  3. package/lib/CodegenSchema.js.flow +33 -21
  4. package/lib/generators/components/CppHelpers.js +39 -2
  5. package/lib/generators/components/CppHelpers.js.flow +54 -5
  6. package/lib/generators/components/GenerateEventEmitterCpp.js +238 -55
  7. package/lib/generators/components/GenerateEventEmitterCpp.js.flow +233 -55
  8. package/lib/generators/components/GenerateEventEmitterH.js +77 -28
  9. package/lib/generators/components/GenerateEventEmitterH.js.flow +87 -32
  10. package/lib/generators/components/GeneratePropsH.js +1 -2
  11. package/lib/generators/components/GeneratePropsH.js.flow +1 -2
  12. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js +0 -1
  13. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +3 -5
  14. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +4 -0
  15. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +4 -0
  16. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +2 -0
  17. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +2 -0
  18. package/lib/generators/components/__test_fixtures__/fixtures.js +114 -1
  19. package/lib/generators/components/__test_fixtures__/fixtures.js.flow +114 -1
  20. package/lib/generators/modules/GenerateModuleCpp.js +3 -3
  21. package/lib/generators/modules/GenerateModuleCpp.js.flow +3 -3
  22. package/lib/generators/modules/GenerateModuleH.js +1 -1
  23. package/lib/generators/modules/GenerateModuleH.js.flow +1 -1
  24. package/lib/generators/modules/GenerateModuleJavaSpec.js +1 -2
  25. package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +1 -2
  26. package/lib/parsers/error-utils.js +44 -0
  27. package/lib/parsers/error-utils.js.flow +59 -0
  28. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +51 -0
  29. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +51 -0
  30. package/lib/parsers/flow/components/componentsUtils.js +6 -6
  31. package/lib/parsers/flow/components/componentsUtils.js.flow +10 -10
  32. package/lib/parsers/flow/components/events.js +157 -78
  33. package/lib/parsers/flow/components/events.js.flow +158 -77
  34. package/lib/parsers/flow/components/index.js +28 -105
  35. package/lib/parsers/flow/components/index.js.flow +21 -110
  36. package/lib/parsers/flow/modules/index.js +39 -49
  37. package/lib/parsers/flow/modules/index.js.flow +22 -31
  38. package/lib/parsers/flow/parser.d.ts +9 -2
  39. package/lib/parsers/flow/parser.js +167 -16
  40. package/lib/parsers/flow/parser.js.flow +209 -6
  41. package/lib/parsers/flow/utils.js +0 -63
  42. package/lib/parsers/flow/utils.js.flow +1 -77
  43. package/lib/parsers/parser.js.flow +141 -1
  44. package/lib/parsers/parserMock.js +165 -2
  45. package/lib/parsers/parserMock.js.flow +216 -2
  46. package/lib/parsers/parsers-commons.js +128 -9
  47. package/lib/parsers/parsers-commons.js.flow +182 -12
  48. package/lib/parsers/parsers-primitives.js +84 -35
  49. package/lib/parsers/parsers-primitives.js.flow +110 -35
  50. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +51 -0
  51. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +51 -0
  52. package/lib/parsers/typescript/components/componentsUtils.js +31 -7
  53. package/lib/parsers/typescript/components/componentsUtils.js.flow +31 -14
  54. package/lib/parsers/typescript/components/events.js +142 -67
  55. package/lib/parsers/typescript/components/events.js.flow +149 -68
  56. package/lib/parsers/typescript/components/extends.js +2 -49
  57. package/lib/parsers/typescript/components/extends.js.flow +1 -55
  58. package/lib/parsers/typescript/components/index.js +29 -109
  59. package/lib/parsers/typescript/components/index.js.flow +21 -116
  60. package/lib/parsers/typescript/modules/index.js +41 -50
  61. package/lib/parsers/typescript/modules/index.js.flow +23 -31
  62. package/lib/parsers/typescript/parser.d.ts +9 -2
  63. package/lib/parsers/typescript/parser.js +193 -7
  64. package/lib/parsers/typescript/parser.js.flow +235 -6
  65. package/lib/parsers/utils.js.flow +6 -0
  66. package/package.json +26 -15
  67. package/lib/parsers/flow/components/extends.js +0 -52
  68. package/lib/parsers/flow/components/extends.js.flow +0 -66
  69. package/lib/parsers/flow/components/props.js +0 -47
  70. package/lib/parsers/flow/components/props.js.flow +0 -60
  71. package/lib/parsers/typescript/components/props.js +0 -39
  72. package/lib/parsers/typescript/components/props.js.flow +0 -48
  73. package/lib/parsers/typescript/utils.js +0 -90
  74. package/lib/parsers/typescript/utils.js.flow +0 -104
@@ -14,6 +14,17 @@ const _require = require('./componentsUtils'),
14
14
  flattenProperties = _require.flattenProperties;
15
15
  const _require2 = require('../parseTopLevelType'),
16
16
  parseTopLevelType = _require2.parseTopLevelType;
17
+ const _require3 = require('../../error-utils'),
18
+ throwIfEventHasNoName = _require3.throwIfEventHasNoName,
19
+ throwIfBubblingTypeIsNull = _require3.throwIfBubblingTypeIsNull,
20
+ throwIfArgumentPropsAreNull = _require3.throwIfArgumentPropsAreNull;
21
+ const _require4 = require('../../parsers-commons'),
22
+ getEventArgument = _require4.getEventArgument;
23
+ const _require5 = require('../../parsers-primitives'),
24
+ emitBoolProp = _require5.emitBoolProp,
25
+ emitDoubleProp = _require5.emitDoubleProp,
26
+ emitFloatProp = _require5.emitFloatProp,
27
+ emitStringProp = _require5.emitStringProp;
17
28
  function getPropertyType(
18
29
  /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
19
30
  * LTI update could not be added via codemod */
@@ -22,6 +33,7 @@ function getPropertyType(
22
33
  /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
23
34
  * LTI update could not be added via codemod */
24
35
  annotation,
36
+ parser,
25
37
  ) {
26
38
  const topLevelType = parseTopLevelType(annotation);
27
39
  const typeAnnotation = topLevelType.type;
@@ -32,21 +44,9 @@ function getPropertyType(
32
44
  : typeAnnotation.type;
33
45
  switch (type) {
34
46
  case 'TSBooleanKeyword':
35
- return {
36
- name,
37
- optional,
38
- typeAnnotation: {
39
- type: 'BooleanTypeAnnotation',
40
- },
41
- };
47
+ return emitBoolProp(name, optional);
42
48
  case 'TSStringKeyword':
43
- return {
44
- name,
45
- optional,
46
- typeAnnotation: {
47
- type: 'StringTypeAnnotation',
48
- },
49
- };
49
+ return emitStringProp(name, optional);
50
50
  case 'Int32':
51
51
  return {
52
52
  name,
@@ -56,45 +56,116 @@ function getPropertyType(
56
56
  },
57
57
  };
58
58
  case 'Double':
59
+ return emitDoubleProp(name, optional);
60
+ case 'Float':
61
+ return emitFloatProp(name, optional);
62
+ case 'TSTypeLiteral':
59
63
  return {
60
64
  name,
61
65
  optional,
62
66
  typeAnnotation: {
63
- type: 'DoubleTypeAnnotation',
67
+ type: 'ObjectTypeAnnotation',
68
+ properties: typeAnnotation.members.map(member =>
69
+ buildPropertiesForEvent(member, parser),
70
+ ),
64
71
  },
65
72
  };
66
- case 'Float':
73
+ case 'TSUnionType':
67
74
  return {
68
75
  name,
69
76
  optional,
70
77
  typeAnnotation: {
71
- type: 'FloatTypeAnnotation',
78
+ type: 'StringEnumTypeAnnotation',
79
+ options: typeAnnotation.types.map(option => option.literal.value),
72
80
  },
73
81
  };
74
- case 'TSTypeLiteral':
82
+ case 'UnsafeMixed':
75
83
  return {
76
84
  name,
77
85
  optional,
78
86
  typeAnnotation: {
79
- type: 'ObjectTypeAnnotation',
80
- properties: typeAnnotation.members.map(buildPropertiesForEvent),
87
+ type: 'MixedTypeAnnotation',
81
88
  },
82
89
  };
83
- case 'TSUnionType':
90
+ case 'TSArrayType':
84
91
  return {
85
92
  name,
86
93
  optional,
87
- typeAnnotation: {
88
- type: 'StringEnumTypeAnnotation',
89
- options: typeAnnotation.types.map(option => option.literal.value),
90
- },
94
+ typeAnnotation: extractArrayElementType(typeAnnotation, name, parser),
91
95
  };
92
96
  default:
93
97
  type;
94
98
  throw new Error(`Unable to determine event type for "${name}": ${type}`);
95
99
  }
96
100
  }
101
+ function extractArrayElementType(typeAnnotation, name, parser) {
102
+ const type = extractTypeFromTypeAnnotation(typeAnnotation);
103
+ switch (type) {
104
+ case 'TSParenthesizedType':
105
+ return extractArrayElementType(
106
+ typeAnnotation.typeAnnotation,
107
+ name,
108
+ parser,
109
+ );
110
+ case 'TSBooleanKeyword':
111
+ return {
112
+ type: 'BooleanTypeAnnotation',
113
+ };
114
+ case 'TSStringKeyword':
115
+ return {
116
+ type: 'StringTypeAnnotation',
117
+ };
118
+ case 'Float':
119
+ return {
120
+ type: 'FloatTypeAnnotation',
121
+ };
122
+ case 'Int32':
123
+ return {
124
+ type: 'Int32TypeAnnotation',
125
+ };
126
+ case 'TSNumberKeyword':
127
+ case 'Double':
128
+ return {
129
+ type: 'DoubleTypeAnnotation',
130
+ };
131
+ case 'TSUnionType':
132
+ return {
133
+ type: 'StringEnumTypeAnnotation',
134
+ options: typeAnnotation.types.map(option => option.literal.value),
135
+ };
136
+ case 'TSTypeLiteral':
137
+ return {
138
+ type: 'ObjectTypeAnnotation',
139
+ properties: typeAnnotation.members.map(member =>
140
+ buildPropertiesForEvent(member, parser),
141
+ ),
142
+ };
143
+ case 'TSArrayType':
144
+ return {
145
+ type: 'ArrayTypeAnnotation',
146
+ elementType: extractArrayElementType(
147
+ typeAnnotation.elementType,
148
+ name,
149
+ parser,
150
+ ),
151
+ };
152
+ default:
153
+ throw new Error(
154
+ `Unrecognized ${type} for Array ${name} in events.\n${JSON.stringify(
155
+ typeAnnotation,
156
+ null,
157
+ 2,
158
+ )}`,
159
+ );
160
+ }
161
+ }
162
+ function extractTypeFromTypeAnnotation(typeAnnotation) {
163
+ return typeAnnotation.type === 'TSTypeReference'
164
+ ? typeAnnotation.typeName.name
165
+ : typeAnnotation.type;
166
+ }
97
167
  function findEventArgumentsAndType(
168
+ parser,
98
169
  typeAnnotation,
99
170
  types,
100
171
  bubblingType,
@@ -114,12 +185,11 @@ function findEventArgumentsAndType(
114
185
  bubblingType,
115
186
  };
116
187
  }
117
- if (!typeAnnotation.typeName) {
118
- throw new Error("typeAnnotation of event doesn't have a name");
119
- }
188
+ throwIfEventHasNoName(typeAnnotation, parser);
120
189
  const name = typeAnnotation.typeName.name;
121
190
  if (name === 'Readonly') {
122
191
  return findEventArgumentsAndType(
192
+ parser,
123
193
  typeAnnotation.typeParameters.params[0],
124
194
  types,
125
195
  bubblingType,
@@ -132,8 +202,8 @@ function findEventArgumentsAndType(
132
202
  ? typeAnnotation.typeParameters.params[1].literal.value
133
203
  : null;
134
204
  switch (typeAnnotation.typeParameters.params[0].type) {
135
- case 'TSNullKeyword':
136
- case 'TSUndefinedKeyword':
205
+ case parser.nullLiteralTypeAnnotation:
206
+ case parser.undefinedLiteralTypeAnnotation:
137
207
  return {
138
208
  argumentProps: [],
139
209
  bubblingType: eventType,
@@ -141,6 +211,7 @@ function findEventArgumentsAndType(
141
211
  };
142
212
  default:
143
213
  return findEventArgumentsAndType(
214
+ parser,
144
215
  typeAnnotation.typeParameters.params[0],
145
216
  types,
146
217
  eventType,
@@ -153,6 +224,7 @@ function findEventArgumentsAndType(
153
224
  elementType = elementType.typeAnnotation;
154
225
  }
155
226
  return findEventArgumentsAndType(
227
+ parser,
156
228
  elementType,
157
229
  types,
158
230
  bubblingType,
@@ -166,28 +238,21 @@ function findEventArgumentsAndType(
166
238
  };
167
239
  }
168
240
  }
169
-
170
- /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
171
- * LTI update could not be added via codemod */
172
- function buildPropertiesForEvent(property) {
241
+ function buildPropertiesForEvent(
242
+ /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
243
+ * LTI update could not be added via codemod */
244
+ property,
245
+ parser,
246
+ ) {
173
247
  const name = property.key.name;
174
- const optional = property.optional || false;
248
+ const optional = parser.isOptionalProperty(property);
175
249
  let typeAnnotation = property.typeAnnotation.typeAnnotation;
176
- return getPropertyType(name, optional, typeAnnotation);
177
- }
178
-
179
- /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
180
- * LTI update could not be added via codemod */
181
- function getEventArgument(argumentProps, name) {
182
- return {
183
- type: 'ObjectTypeAnnotation',
184
- properties: argumentProps.map(buildPropertiesForEvent),
185
- };
250
+ return getPropertyType(name, optional, typeAnnotation, parser);
186
251
  }
187
252
 
188
253
  // $FlowFixMe[unclear-type] TODO(T108222691): Use flow-types for @babel/parser
189
254
 
190
- function buildEventSchema(types, property) {
255
+ function buildEventSchema(types, property, parser) {
191
256
  // unpack WithDefault, (T) or T|U
192
257
  const topLevelType = parseTopLevelType(
193
258
  property.typeAnnotation.typeAnnotation,
@@ -197,6 +262,7 @@ function buildEventSchema(types, property) {
197
262
  const typeAnnotation = topLevelType.type;
198
263
  const optional = property.optional || topLevelType.optional;
199
264
  const _findEventArgumentsAn = findEventArgumentsAndType(
265
+ parser,
200
266
  typeAnnotation,
201
267
  types,
202
268
  ),
@@ -204,36 +270,45 @@ function buildEventSchema(types, property) {
204
270
  bubblingType = _findEventArgumentsAn.bubblingType,
205
271
  paperTopLevelNameDeprecated =
206
272
  _findEventArgumentsAn.paperTopLevelNameDeprecated;
207
- if (!argumentProps) {
208
- throw new Error(`Unable to determine event arguments for "${name}"`);
209
- } else if (!bubblingType) {
210
- throw new Error(`Unable to determine event bubbling type for "${name}"`);
211
- } else {
212
- if (paperTopLevelNameDeprecated != null) {
213
- return {
214
- name,
215
- optional,
216
- bubblingType,
217
- paperTopLevelNameDeprecated,
218
- typeAnnotation: {
219
- type: 'EventTypeAnnotation',
220
- argument: getEventArgument(argumentProps, name),
221
- },
222
- };
223
- }
273
+ const nonNullableArgumentProps = throwIfArgumentPropsAreNull(
274
+ argumentProps,
275
+ name,
276
+ );
277
+ const nonNullableBubblingType = throwIfBubblingTypeIsNull(bubblingType, name);
278
+ if (paperTopLevelNameDeprecated != null) {
224
279
  return {
225
280
  name,
226
281
  optional,
227
- bubblingType,
282
+ bubblingType: nonNullableBubblingType,
283
+ paperTopLevelNameDeprecated,
228
284
  typeAnnotation: {
229
285
  type: 'EventTypeAnnotation',
230
- argument: getEventArgument(argumentProps, name),
286
+ argument: getEventArgument(
287
+ nonNullableArgumentProps,
288
+ buildPropertiesForEvent,
289
+ parser,
290
+ ),
231
291
  },
232
292
  };
233
293
  }
294
+ return {
295
+ name,
296
+ optional,
297
+ bubblingType: nonNullableBubblingType,
298
+ typeAnnotation: {
299
+ type: 'EventTypeAnnotation',
300
+ argument: getEventArgument(
301
+ nonNullableArgumentProps,
302
+ buildPropertiesForEvent,
303
+ parser,
304
+ ),
305
+ },
306
+ };
234
307
  }
235
- function getEvents(eventTypeAST, types) {
236
- return eventTypeAST.map(property => buildEventSchema(types, property));
308
+ function getEvents(eventTypeAST, types, parser) {
309
+ return eventTypeAST
310
+ .map(property => buildEventSchema(types, property, parser))
311
+ .filter(Boolean);
237
312
  }
238
313
  module.exports = {
239
314
  getEvents,
@@ -16,9 +16,21 @@ import type {
16
16
  EventTypeAnnotation,
17
17
  } from '../../../CodegenSchema.js';
18
18
  import type {TypeDeclarationMap} from '../../utils';
19
+ import type {Parser} from '../../parser';
19
20
  const {flattenProperties} = require('./componentsUtils');
20
21
  const {parseTopLevelType} = require('../parseTopLevelType');
21
-
22
+ const {
23
+ throwIfEventHasNoName,
24
+ throwIfBubblingTypeIsNull,
25
+ throwIfArgumentPropsAreNull,
26
+ } = require('../../error-utils');
27
+ const {getEventArgument} = require('../../parsers-commons');
28
+ const {
29
+ emitBoolProp,
30
+ emitDoubleProp,
31
+ emitFloatProp,
32
+ emitStringProp,
33
+ } = require('../../parsers-primitives');
22
34
  function getPropertyType(
23
35
  /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
24
36
  * LTI update could not be added via codemod */
@@ -27,6 +39,7 @@ function getPropertyType(
27
39
  /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
28
40
  * LTI update could not be added via codemod */
29
41
  annotation,
42
+ parser: Parser,
30
43
  ): NamedShape<EventTypeAnnotation> {
31
44
  const topLevelType = parseTopLevelType(annotation);
32
45
  const typeAnnotation = topLevelType.type;
@@ -38,21 +51,9 @@ function getPropertyType(
38
51
 
39
52
  switch (type) {
40
53
  case 'TSBooleanKeyword':
41
- return {
42
- name,
43
- optional,
44
- typeAnnotation: {
45
- type: 'BooleanTypeAnnotation',
46
- },
47
- };
54
+ return emitBoolProp(name, optional);
48
55
  case 'TSStringKeyword':
49
- return {
50
- name,
51
- optional,
52
- typeAnnotation: {
53
- type: 'StringTypeAnnotation',
54
- },
55
- };
56
+ return emitStringProp(name, optional);
56
57
  case 'Int32':
57
58
  return {
58
59
  name,
@@ -62,39 +63,42 @@ function getPropertyType(
62
63
  },
63
64
  };
64
65
  case 'Double':
66
+ return emitDoubleProp(name, optional);
67
+ case 'Float':
68
+ return emitFloatProp(name, optional);
69
+ case 'TSTypeLiteral':
65
70
  return {
66
71
  name,
67
72
  optional,
68
73
  typeAnnotation: {
69
- type: 'DoubleTypeAnnotation',
74
+ type: 'ObjectTypeAnnotation',
75
+ properties: typeAnnotation.members.map(member =>
76
+ buildPropertiesForEvent(member, parser),
77
+ ),
70
78
  },
71
79
  };
72
- case 'Float':
80
+ case 'TSUnionType':
73
81
  return {
74
82
  name,
75
83
  optional,
76
84
  typeAnnotation: {
77
- type: 'FloatTypeAnnotation',
85
+ type: 'StringEnumTypeAnnotation',
86
+ options: typeAnnotation.types.map(option => option.literal.value),
78
87
  },
79
88
  };
80
- case 'TSTypeLiteral':
89
+ case 'UnsafeMixed':
81
90
  return {
82
91
  name,
83
92
  optional,
84
93
  typeAnnotation: {
85
- type: 'ObjectTypeAnnotation',
86
- properties: typeAnnotation.members.map(buildPropertiesForEvent),
94
+ type: 'MixedTypeAnnotation',
87
95
  },
88
96
  };
89
-
90
- case 'TSUnionType':
97
+ case 'TSArrayType':
91
98
  return {
92
99
  name,
93
100
  optional,
94
- typeAnnotation: {
95
- type: 'StringEnumTypeAnnotation',
96
- options: typeAnnotation.types.map(option => option.literal.value),
97
- },
101
+ typeAnnotation: extractArrayElementType(typeAnnotation, name, parser),
98
102
  };
99
103
  default:
100
104
  (type: empty);
@@ -102,7 +106,77 @@ function getPropertyType(
102
106
  }
103
107
  }
104
108
 
109
+ function extractArrayElementType(
110
+ typeAnnotation: $FlowFixMe,
111
+ name: string,
112
+ parser: Parser,
113
+ ): EventTypeAnnotation {
114
+ const type = extractTypeFromTypeAnnotation(typeAnnotation);
115
+
116
+ switch (type) {
117
+ case 'TSParenthesizedType':
118
+ return extractArrayElementType(
119
+ typeAnnotation.typeAnnotation,
120
+ name,
121
+ parser,
122
+ );
123
+ case 'TSBooleanKeyword':
124
+ return {type: 'BooleanTypeAnnotation'};
125
+ case 'TSStringKeyword':
126
+ return {type: 'StringTypeAnnotation'};
127
+ case 'Float':
128
+ return {
129
+ type: 'FloatTypeAnnotation',
130
+ };
131
+ case 'Int32':
132
+ return {
133
+ type: 'Int32TypeAnnotation',
134
+ };
135
+ case 'TSNumberKeyword':
136
+ case 'Double':
137
+ return {
138
+ type: 'DoubleTypeAnnotation',
139
+ };
140
+ case 'TSUnionType':
141
+ return {
142
+ type: 'StringEnumTypeAnnotation',
143
+ options: typeAnnotation.types.map(option => option.literal.value),
144
+ };
145
+ case 'TSTypeLiteral':
146
+ return {
147
+ type: 'ObjectTypeAnnotation',
148
+ properties: typeAnnotation.members.map(member =>
149
+ buildPropertiesForEvent(member, parser),
150
+ ),
151
+ };
152
+ case 'TSArrayType':
153
+ return {
154
+ type: 'ArrayTypeAnnotation',
155
+ elementType: extractArrayElementType(
156
+ typeAnnotation.elementType,
157
+ name,
158
+ parser,
159
+ ),
160
+ };
161
+ default:
162
+ throw new Error(
163
+ `Unrecognized ${type} for Array ${name} in events.\n${JSON.stringify(
164
+ typeAnnotation,
165
+ null,
166
+ 2,
167
+ )}`,
168
+ );
169
+ }
170
+ }
171
+
172
+ function extractTypeFromTypeAnnotation(typeAnnotation: $FlowFixMe): string {
173
+ return typeAnnotation.type === 'TSTypeReference'
174
+ ? typeAnnotation.typeName.name
175
+ : typeAnnotation.type;
176
+ }
177
+
105
178
  function findEventArgumentsAndType(
179
+ parser: Parser,
106
180
  typeAnnotation: $FlowFixMe,
107
181
  types: TypeDeclarationMap,
108
182
  bubblingType: void | 'direct' | 'bubble',
@@ -128,12 +202,11 @@ function findEventArgumentsAndType(
128
202
  };
129
203
  }
130
204
 
131
- if (!typeAnnotation.typeName) {
132
- throw new Error("typeAnnotation of event doesn't have a name");
133
- }
205
+ throwIfEventHasNoName(typeAnnotation, parser);
134
206
  const name = typeAnnotation.typeName.name;
135
207
  if (name === 'Readonly') {
136
208
  return findEventArgumentsAndType(
209
+ parser,
137
210
  typeAnnotation.typeParameters.params[0],
138
211
  types,
139
212
  bubblingType,
@@ -147,8 +220,8 @@ function findEventArgumentsAndType(
147
220
  : null;
148
221
 
149
222
  switch (typeAnnotation.typeParameters.params[0].type) {
150
- case 'TSNullKeyword':
151
- case 'TSUndefinedKeyword':
223
+ case parser.nullLiteralTypeAnnotation:
224
+ case parser.undefinedLiteralTypeAnnotation:
152
225
  return {
153
226
  argumentProps: [],
154
227
  bubblingType: eventType,
@@ -156,6 +229,7 @@ function findEventArgumentsAndType(
156
229
  };
157
230
  default:
158
231
  return findEventArgumentsAndType(
232
+ parser,
159
233
  typeAnnotation.typeParameters.params[0],
160
234
  types,
161
235
  eventType,
@@ -168,6 +242,7 @@ function findEventArgumentsAndType(
168
242
  elementType = elementType.typeAnnotation;
169
243
  }
170
244
  return findEventArgumentsAndType(
245
+ parser,
171
246
  elementType,
172
247
  types,
173
248
  bubblingType,
@@ -182,23 +257,17 @@ function findEventArgumentsAndType(
182
257
  }
183
258
  }
184
259
 
185
- /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
186
- * LTI update could not be added via codemod */
187
- function buildPropertiesForEvent(property): NamedShape<EventTypeAnnotation> {
260
+ function buildPropertiesForEvent(
261
+ /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
262
+ * LTI update could not be added via codemod */
263
+ property,
264
+ parser: Parser,
265
+ ): NamedShape<EventTypeAnnotation> {
188
266
  const name = property.key.name;
189
- const optional = property.optional || false;
267
+ const optional = parser.isOptionalProperty(property);
190
268
  let typeAnnotation = property.typeAnnotation.typeAnnotation;
191
269
 
192
- return getPropertyType(name, optional, typeAnnotation);
193
- }
194
-
195
- /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
196
- * LTI update could not be added via codemod */
197
- function getEventArgument(argumentProps, name: $FlowFixMe) {
198
- return {
199
- type: 'ObjectTypeAnnotation',
200
- properties: argumentProps.map(buildPropertiesForEvent),
201
- };
270
+ return getPropertyType(name, optional, typeAnnotation, parser);
202
271
  }
203
272
 
204
273
  // $FlowFixMe[unclear-type] TODO(T108222691): Use flow-types for @babel/parser
@@ -207,7 +276,8 @@ type EventTypeAST = Object;
207
276
  function buildEventSchema(
208
277
  types: TypeDeclarationMap,
209
278
  property: EventTypeAST,
210
- ): EventTypeShape {
279
+ parser: Parser,
280
+ ): ?EventTypeShape {
211
281
  // unpack WithDefault, (T) or T|U
212
282
  const topLevelType = parseTopLevelType(
213
283
  property.typeAnnotation.typeAnnotation,
@@ -218,43 +288,54 @@ function buildEventSchema(
218
288
  const typeAnnotation = topLevelType.type;
219
289
  const optional = property.optional || topLevelType.optional;
220
290
  const {argumentProps, bubblingType, paperTopLevelNameDeprecated} =
221
- findEventArgumentsAndType(typeAnnotation, types);
291
+ findEventArgumentsAndType(parser, typeAnnotation, types);
222
292
 
223
- if (!argumentProps) {
224
- throw new Error(`Unable to determine event arguments for "${name}"`);
225
- } else if (!bubblingType) {
226
- throw new Error(`Unable to determine event bubbling type for "${name}"`);
227
- } else {
228
- if (paperTopLevelNameDeprecated != null) {
229
- return {
230
- name,
231
- optional,
232
- bubblingType,
233
- paperTopLevelNameDeprecated,
234
- typeAnnotation: {
235
- type: 'EventTypeAnnotation',
236
- argument: getEventArgument(argumentProps, name),
237
- },
238
- };
239
- }
293
+ const nonNullableArgumentProps = throwIfArgumentPropsAreNull(
294
+ argumentProps,
295
+ name,
296
+ );
297
+ const nonNullableBubblingType = throwIfBubblingTypeIsNull(bubblingType, name);
240
298
 
299
+ if (paperTopLevelNameDeprecated != null) {
241
300
  return {
242
301
  name,
243
302
  optional,
244
- bubblingType,
303
+ bubblingType: nonNullableBubblingType,
304
+ paperTopLevelNameDeprecated,
245
305
  typeAnnotation: {
246
306
  type: 'EventTypeAnnotation',
247
- argument: getEventArgument(argumentProps, name),
307
+ argument: getEventArgument(
308
+ nonNullableArgumentProps,
309
+ buildPropertiesForEvent,
310
+ parser,
311
+ ),
248
312
  },
249
313
  };
250
314
  }
315
+
316
+ return {
317
+ name,
318
+ optional,
319
+ bubblingType: nonNullableBubblingType,
320
+ typeAnnotation: {
321
+ type: 'EventTypeAnnotation',
322
+ argument: getEventArgument(
323
+ nonNullableArgumentProps,
324
+ buildPropertiesForEvent,
325
+ parser,
326
+ ),
327
+ },
328
+ };
251
329
  }
252
330
 
253
331
  function getEvents(
254
332
  eventTypeAST: $ReadOnlyArray<EventTypeAST>,
255
333
  types: TypeDeclarationMap,
334
+ parser: Parser,
256
335
  ): $ReadOnlyArray<EventTypeShape> {
257
- return eventTypeAST.map(property => buildEventSchema(types, property));
336
+ return eventTypeAST
337
+ .map(property => buildEventSchema(types, property, parser))
338
+ .filter(Boolean);
258
339
  }
259
340
 
260
341
  module.exports = {