@react-native/codegen 0.72.5 → 0.73.0-nightly-20230605-5062553c6

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 (72) 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/GenerateModuleJavaSpec.js +1 -2
  23. package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +1 -2
  24. package/lib/parsers/error-utils.js +44 -0
  25. package/lib/parsers/error-utils.js.flow +59 -0
  26. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +51 -0
  27. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +51 -0
  28. package/lib/parsers/flow/components/componentsUtils.js +12 -19
  29. package/lib/parsers/flow/components/componentsUtils.js.flow +16 -27
  30. package/lib/parsers/flow/components/events.js +157 -83
  31. package/lib/parsers/flow/components/events.js.flow +158 -82
  32. package/lib/parsers/flow/components/index.js +10 -129
  33. package/lib/parsers/flow/components/index.js.flow +10 -150
  34. package/lib/parsers/flow/modules/index.js +39 -49
  35. package/lib/parsers/flow/modules/index.js.flow +22 -31
  36. package/lib/parsers/flow/parser.d.ts +9 -2
  37. package/lib/parsers/flow/parser.js +177 -16
  38. package/lib/parsers/flow/parser.js.flow +220 -6
  39. package/lib/parsers/flow/utils.js +0 -63
  40. package/lib/parsers/flow/utils.js.flow +1 -77
  41. package/lib/parsers/parser.js.flow +143 -1
  42. package/lib/parsers/parserMock.js +175 -2
  43. package/lib/parsers/parserMock.js.flow +227 -2
  44. package/lib/parsers/parsers-commons.js +169 -9
  45. package/lib/parsers/parsers-commons.js.flow +233 -12
  46. package/lib/parsers/parsers-primitives.js +94 -35
  47. package/lib/parsers/parsers-primitives.js.flow +124 -35
  48. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +51 -0
  49. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +51 -0
  50. package/lib/parsers/typescript/components/componentsUtils.js +44 -46
  51. package/lib/parsers/typescript/components/componentsUtils.js.flow +44 -51
  52. package/lib/parsers/typescript/components/events.js +142 -72
  53. package/lib/parsers/typescript/components/events.js.flow +149 -73
  54. package/lib/parsers/typescript/components/extends.js +2 -49
  55. package/lib/parsers/typescript/components/extends.js.flow +1 -55
  56. package/lib/parsers/typescript/components/index.js +11 -134
  57. package/lib/parsers/typescript/components/index.js.flow +11 -156
  58. package/lib/parsers/typescript/modules/index.js +43 -51
  59. package/lib/parsers/typescript/modules/index.js.flow +25 -32
  60. package/lib/parsers/typescript/parser.d.ts +9 -2
  61. package/lib/parsers/typescript/parser.js +224 -7
  62. package/lib/parsers/typescript/parser.js.flow +262 -6
  63. package/lib/parsers/utils.js.flow +6 -0
  64. package/package.json +16 -5
  65. package/lib/parsers/flow/components/extends.js +0 -52
  66. package/lib/parsers/flow/components/extends.js.flow +0 -66
  67. package/lib/parsers/flow/components/props.js +0 -47
  68. package/lib/parsers/flow/components/props.js.flow +0 -60
  69. package/lib/parsers/typescript/components/props.js +0 -39
  70. package/lib/parsers/typescript/components/props.js.flow +0 -48
  71. package/lib/parsers/typescript/utils.js +0 -90
  72. package/lib/parsers/typescript/utils.js.flow +0 -104
@@ -10,96 +10,170 @@
10
10
 
11
11
  'use strict';
12
12
 
13
+ const _require = require('../../error-utils'),
14
+ throwIfEventHasNoName = _require.throwIfEventHasNoName,
15
+ throwIfBubblingTypeIsNull = _require.throwIfBubblingTypeIsNull,
16
+ throwIfArgumentPropsAreNull = _require.throwIfArgumentPropsAreNull;
17
+ const _require2 = require('../../parsers-commons'),
18
+ getEventArgument = _require2.getEventArgument;
19
+ const _require3 = require('../../parsers-primitives'),
20
+ emitBoolProp = _require3.emitBoolProp,
21
+ emitDoubleProp = _require3.emitDoubleProp,
22
+ emitFloatProp = _require3.emitFloatProp,
23
+ emitStringProp = _require3.emitStringProp,
24
+ emitInt32Prop = _require3.emitInt32Prop;
13
25
  function getPropertyType(
14
26
  /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
15
27
  * LTI update could not be added via codemod */
16
28
  name,
17
29
  optional,
18
30
  typeAnnotation,
31
+ parser,
19
32
  ) {
20
- const type =
21
- typeAnnotation.type === 'GenericTypeAnnotation'
22
- ? typeAnnotation.id.name
23
- : typeAnnotation.type;
33
+ const type = extractTypeFromTypeAnnotation(typeAnnotation);
24
34
  switch (type) {
25
35
  case 'BooleanTypeAnnotation':
36
+ return emitBoolProp(name, optional);
37
+ case 'StringTypeAnnotation':
38
+ return emitStringProp(name, optional);
39
+ case 'Int32':
40
+ return emitInt32Prop(name, optional);
41
+ case 'Double':
42
+ return emitDoubleProp(name, optional);
43
+ case 'Float':
44
+ return emitFloatProp(name, optional);
45
+ case '$ReadOnly':
46
+ return getPropertyType(
47
+ name,
48
+ optional,
49
+ typeAnnotation.typeParameters.params[0],
50
+ parser,
51
+ );
52
+ case 'ObjectTypeAnnotation':
26
53
  return {
27
54
  name,
28
55
  optional,
29
56
  typeAnnotation: {
30
- type: 'BooleanTypeAnnotation',
57
+ type: 'ObjectTypeAnnotation',
58
+ properties: typeAnnotation.properties.map(member =>
59
+ buildPropertiesForEvent(member, parser),
60
+ ),
31
61
  },
32
62
  };
33
- case 'StringTypeAnnotation':
63
+ case 'UnionTypeAnnotation':
34
64
  return {
35
65
  name,
36
66
  optional,
37
67
  typeAnnotation: {
38
- type: 'StringTypeAnnotation',
68
+ type: 'StringEnumTypeAnnotation',
69
+ options: typeAnnotation.types.map(option => option.value),
39
70
  },
40
71
  };
41
- case 'Int32':
72
+ case 'UnsafeMixed':
42
73
  return {
43
74
  name,
44
75
  optional,
45
76
  typeAnnotation: {
46
- type: 'Int32TypeAnnotation',
77
+ type: 'MixedTypeAnnotation',
47
78
  },
48
79
  };
49
- case 'Double':
80
+ case 'ArrayTypeAnnotation':
81
+ case '$ReadOnlyArray':
50
82
  return {
51
83
  name,
52
84
  optional,
53
- typeAnnotation: {
54
- type: 'DoubleTypeAnnotation',
55
- },
85
+ typeAnnotation: extractArrayElementType(typeAnnotation, name, parser),
86
+ };
87
+ default:
88
+ throw new Error(`Unable to determine event type for "${name}": ${type}`);
89
+ }
90
+ }
91
+ function extractArrayElementType(typeAnnotation, name, parser) {
92
+ const type = extractTypeFromTypeAnnotation(typeAnnotation);
93
+ switch (type) {
94
+ case 'BooleanTypeAnnotation':
95
+ return {
96
+ type: 'BooleanTypeAnnotation',
97
+ };
98
+ case 'StringTypeAnnotation':
99
+ return {
100
+ type: 'StringTypeAnnotation',
101
+ };
102
+ case 'Int32':
103
+ return {
104
+ type: 'Int32TypeAnnotation',
56
105
  };
57
106
  case 'Float':
58
107
  return {
59
- name,
60
- optional,
61
- typeAnnotation: {
62
- type: 'FloatTypeAnnotation',
63
- },
108
+ type: 'FloatTypeAnnotation',
64
109
  };
65
- case '$ReadOnly':
66
- return getPropertyType(
67
- name,
68
- optional,
69
- typeAnnotation.typeParameters.params[0],
70
- );
71
- case 'ObjectTypeAnnotation':
110
+ case 'NumberTypeAnnotation':
111
+ case 'Double':
72
112
  return {
73
- name,
74
- optional,
75
- typeAnnotation: {
76
- type: 'ObjectTypeAnnotation',
77
- properties: typeAnnotation.properties.map(buildPropertiesForEvent),
78
- },
113
+ type: 'DoubleTypeAnnotation',
79
114
  };
80
115
  case 'UnionTypeAnnotation':
81
116
  return {
82
- name,
83
- optional,
84
- typeAnnotation: {
85
- type: 'StringEnumTypeAnnotation',
86
- options: typeAnnotation.types.map(option => option.value),
87
- },
117
+ type: 'StringEnumTypeAnnotation',
118
+ options: typeAnnotation.types.map(option => option.value),
119
+ };
120
+ case 'UnsafeMixed':
121
+ return {
122
+ type: 'MixedTypeAnnotation',
123
+ };
124
+ case 'ObjectTypeAnnotation':
125
+ return {
126
+ type: 'ObjectTypeAnnotation',
127
+ properties: typeAnnotation.properties.map(member =>
128
+ buildPropertiesForEvent(member, parser),
129
+ ),
130
+ };
131
+ case 'ArrayTypeAnnotation':
132
+ return {
133
+ type: 'ArrayTypeAnnotation',
134
+ elementType: extractArrayElementType(
135
+ typeAnnotation.elementType,
136
+ name,
137
+ parser,
138
+ ),
139
+ };
140
+ case '$ReadOnlyArray':
141
+ const genericParams = typeAnnotation.typeParameters.params;
142
+ if (genericParams.length !== 1) {
143
+ throw new Error(
144
+ `Events only supports arrays with 1 Generic type. Found ${
145
+ genericParams.length
146
+ } types:\n${prettify(genericParams)}`,
147
+ );
148
+ }
149
+ return {
150
+ type: 'ArrayTypeAnnotation',
151
+ elementType: extractArrayElementType(genericParams[0], name, parser),
88
152
  };
89
153
  default:
90
- type;
91
- throw new Error(`Unable to determine event type for "${name}": ${type}`);
154
+ throw new Error(
155
+ `Unrecognized ${type} for Array ${name} in events.\n${prettify(
156
+ typeAnnotation,
157
+ )}`,
158
+ );
92
159
  }
93
160
  }
161
+ function prettify(jsonObject) {
162
+ return JSON.stringify(jsonObject, null, 2);
163
+ }
164
+ function extractTypeFromTypeAnnotation(typeAnnotation) {
165
+ return typeAnnotation.type === 'GenericTypeAnnotation'
166
+ ? typeAnnotation.id.name
167
+ : typeAnnotation.type;
168
+ }
94
169
  function findEventArgumentsAndType(
170
+ parser,
95
171
  typeAnnotation,
96
172
  types,
97
173
  bubblingType,
98
174
  paperName,
99
175
  ) {
100
- if (!typeAnnotation.id) {
101
- throw new Error("typeAnnotation of event doesn't have a name");
102
- }
176
+ throwIfEventHasNoName(typeAnnotation, parser);
103
177
  const name = typeAnnotation.id.name;
104
178
  if (name === '$ReadOnly') {
105
179
  return {
@@ -115,7 +189,7 @@ function findEventArgumentsAndType(
115
189
  : null;
116
190
  if (
117
191
  typeAnnotation.typeParameters.params[0].type ===
118
- 'NullLiteralTypeAnnotation'
192
+ parser.nullLiteralTypeAnnotation
119
193
  ) {
120
194
  return {
121
195
  argumentProps: [],
@@ -124,6 +198,7 @@ function findEventArgumentsAndType(
124
198
  };
125
199
  }
126
200
  return findEventArgumentsAndType(
201
+ parser,
127
202
  typeAnnotation.typeParameters.params[0],
128
203
  types,
129
204
  eventType,
@@ -131,6 +206,7 @@ function findEventArgumentsAndType(
131
206
  );
132
207
  } else if (types[name]) {
133
208
  return findEventArgumentsAndType(
209
+ parser,
134
210
  types[name].right,
135
211
  types,
136
212
  bubblingType,
@@ -144,29 +220,21 @@ function findEventArgumentsAndType(
144
220
  };
145
221
  }
146
222
  }
147
-
148
- /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
149
- * LTI update could not be added via codemod */
150
- function buildPropertiesForEvent(property) {
223
+ function buildPropertiesForEvent(
224
+ /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
225
+ * LTI update could not be added via codemod */
226
+ property,
227
+ parser,
228
+ ) {
151
229
  const name = property.key.name;
152
- const optional =
153
- property.value.type === 'NullableTypeAnnotation' || property.optional;
230
+ const optional = parser.isOptionalProperty(property);
154
231
  let typeAnnotation =
155
232
  property.value.type === 'NullableTypeAnnotation'
156
233
  ? property.value.typeAnnotation
157
234
  : property.value;
158
- return getPropertyType(name, optional, typeAnnotation);
159
- }
160
-
161
- /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
162
- * LTI update could not be added via codemod */
163
- function getEventArgument(argumentProps, name) {
164
- return {
165
- type: 'ObjectTypeAnnotation',
166
- properties: argumentProps.map(buildPropertiesForEvent),
167
- };
235
+ return getPropertyType(name, optional, typeAnnotation, parser);
168
236
  }
169
- function buildEventSchema(types, property) {
237
+ function buildEventSchema(types, property, parser) {
170
238
  const name = property.key.name;
171
239
  const optional =
172
240
  property.optional || property.value.type === 'NullableTypeAnnotation';
@@ -182,6 +250,7 @@ function buildEventSchema(types, property) {
182
250
  return null;
183
251
  }
184
252
  const _findEventArgumentsAn = findEventArgumentsAndType(
253
+ parser,
185
254
  typeAnnotation,
186
255
  types,
187
256
  ),
@@ -189,43 +258,48 @@ function buildEventSchema(types, property) {
189
258
  bubblingType = _findEventArgumentsAn.bubblingType,
190
259
  paperTopLevelNameDeprecated =
191
260
  _findEventArgumentsAn.paperTopLevelNameDeprecated;
192
- if (bubblingType && argumentProps) {
193
- if (paperTopLevelNameDeprecated != null) {
194
- return {
195
- name,
196
- optional,
197
- bubblingType,
198
- paperTopLevelNameDeprecated,
199
- typeAnnotation: {
200
- type: 'EventTypeAnnotation',
201
- argument: getEventArgument(argumentProps, name),
202
- },
203
- };
204
- }
261
+ const nonNullableArgumentProps = throwIfArgumentPropsAreNull(
262
+ argumentProps,
263
+ name,
264
+ );
265
+ const nonNullableBubblingType = throwIfBubblingTypeIsNull(bubblingType, name);
266
+ if (paperTopLevelNameDeprecated != null) {
205
267
  return {
206
268
  name,
207
269
  optional,
208
- bubblingType,
270
+ bubblingType: nonNullableBubblingType,
271
+ paperTopLevelNameDeprecated,
209
272
  typeAnnotation: {
210
273
  type: 'EventTypeAnnotation',
211
- argument: getEventArgument(argumentProps, name),
274
+ argument: getEventArgument(
275
+ nonNullableArgumentProps,
276
+ buildPropertiesForEvent,
277
+ parser,
278
+ ),
212
279
  },
213
280
  };
214
281
  }
215
- if (argumentProps === null) {
216
- throw new Error(`Unable to determine event arguments for "${name}"`);
217
- }
218
- if (bubblingType === null) {
219
- throw new Error(`Unable to determine event arguments for "${name}"`);
220
- }
282
+ return {
283
+ name,
284
+ optional,
285
+ bubblingType: nonNullableBubblingType,
286
+ typeAnnotation: {
287
+ type: 'EventTypeAnnotation',
288
+ argument: getEventArgument(
289
+ nonNullableArgumentProps,
290
+ buildPropertiesForEvent,
291
+ parser,
292
+ ),
293
+ },
294
+ };
221
295
  }
222
296
 
223
297
  // $FlowFixMe[unclear-type] there's no flowtype for ASTs
224
298
 
225
- function getEvents(eventTypeAST, types) {
299
+ function getEvents(eventTypeAST, types, parser) {
226
300
  return eventTypeAST
227
301
  .filter(property => property.type === 'ObjectTypeProperty')
228
- .map(property => buildEventSchema(types, property))
302
+ .map(property => buildEventSchema(types, property, parser))
229
303
  .filter(Boolean);
230
304
  }
231
305
  module.exports = {