@react-native/codegen 0.73.0 → 0.74.0-nightly-20231003-5dedf277c

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 (82) 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/cli/combine/combine-js-to-schema-cli.js +7 -1
  5. package/lib/cli/combine/combine-js-to-schema-cli.js.flow +7 -1
  6. package/lib/generators/components/CppHelpers.js +39 -2
  7. package/lib/generators/components/CppHelpers.js.flow +54 -5
  8. package/lib/generators/components/GenerateEventEmitterCpp.js +222 -28
  9. package/lib/generators/components/GenerateEventEmitterCpp.js.flow +221 -34
  10. package/lib/generators/components/GenerateEventEmitterH.js +77 -26
  11. package/lib/generators/components/GenerateEventEmitterH.js.flow +87 -30
  12. package/lib/generators/components/GeneratePropsH.js +2 -3
  13. package/lib/generators/components/GeneratePropsH.js.flow +2 -3
  14. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js +0 -1
  15. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +3 -5
  16. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +4 -0
  17. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +4 -0
  18. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +2 -0
  19. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +2 -0
  20. package/lib/generators/components/__test_fixtures__/fixtures.js +114 -1
  21. package/lib/generators/components/__test_fixtures__/fixtures.js.flow +114 -1
  22. package/lib/generators/modules/GenerateModuleCpp.js +1 -1
  23. package/lib/generators/modules/GenerateModuleCpp.js.flow +1 -1
  24. package/lib/generators/modules/GenerateModuleH.js +44 -39
  25. package/lib/generators/modules/GenerateModuleH.js.flow +51 -39
  26. package/lib/generators/modules/GenerateModuleJavaSpec.js +9 -7
  27. package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +10 -6
  28. package/lib/generators/modules/GenerateModuleJniH.js +1 -1
  29. package/lib/generators/modules/GenerateModuleJniH.js.flow +1 -1
  30. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js +11 -3
  31. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +13 -3
  32. package/lib/parsers/error-utils.js +44 -0
  33. package/lib/parsers/error-utils.js.flow +59 -0
  34. package/lib/parsers/errors.js +3 -9
  35. package/lib/parsers/errors.js.flow +3 -9
  36. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +51 -0
  37. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +51 -0
  38. package/lib/parsers/flow/components/componentsUtils.js +22 -33
  39. package/lib/parsers/flow/components/componentsUtils.js.flow +24 -45
  40. package/lib/parsers/flow/components/events.js +151 -128
  41. package/lib/parsers/flow/components/events.js.flow +161 -136
  42. package/lib/parsers/flow/components/index.js +13 -94
  43. package/lib/parsers/flow/components/index.js.flow +5 -102
  44. package/lib/parsers/flow/modules/index.js +24 -24
  45. package/lib/parsers/flow/modules/index.js.flow +6 -6
  46. package/lib/parsers/flow/parser.d.ts +9 -2
  47. package/lib/parsers/flow/parser.js +179 -18
  48. package/lib/parsers/flow/parser.js.flow +231 -7
  49. package/lib/parsers/flow/utils.js +0 -63
  50. package/lib/parsers/flow/utils.js.flow +1 -77
  51. package/lib/parsers/parser.js.flow +176 -3
  52. package/lib/parsers/parserMock.js +202 -4
  53. package/lib/parsers/parserMock.js.flow +253 -4
  54. package/lib/parsers/parsers-commons.js +268 -10
  55. package/lib/parsers/parsers-commons.js.flow +365 -12
  56. package/lib/parsers/parsers-primitives.js +95 -1
  57. package/lib/parsers/parsers-primitives.js.flow +136 -1
  58. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +51 -0
  59. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +51 -0
  60. package/lib/parsers/typescript/components/componentsUtils.js +49 -57
  61. package/lib/parsers/typescript/components/componentsUtils.js.flow +48 -66
  62. package/lib/parsers/typescript/components/events.js +136 -115
  63. package/lib/parsers/typescript/components/events.js.flow +148 -119
  64. package/lib/parsers/typescript/components/extends.js +2 -49
  65. package/lib/parsers/typescript/components/extends.js.flow +1 -55
  66. package/lib/parsers/typescript/components/index.js +14 -99
  67. package/lib/parsers/typescript/components/index.js.flow +6 -106
  68. package/lib/parsers/typescript/modules/index.js +28 -26
  69. package/lib/parsers/typescript/modules/index.js.flow +9 -8
  70. package/lib/parsers/typescript/parser.d.ts +9 -2
  71. package/lib/parsers/typescript/parser.js +208 -14
  72. package/lib/parsers/typescript/parser.js.flow +247 -8
  73. package/lib/parsers/utils.js.flow +6 -0
  74. package/package.json +27 -16
  75. package/lib/parsers/flow/components/extends.js +0 -52
  76. package/lib/parsers/flow/components/extends.js.flow +0 -66
  77. package/lib/parsers/flow/components/props.js +0 -47
  78. package/lib/parsers/flow/components/props.js.flow +0 -60
  79. package/lib/parsers/typescript/components/props.js +0 -39
  80. package/lib/parsers/typescript/components/props.js.flow +0 -48
  81. package/lib/parsers/typescript/utils.js +0 -90
  82. package/lib/parsers/typescript/utils.js.flow +0 -104
@@ -10,97 +10,165 @@
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
+ buildPropertiesForEvent = _require2.buildPropertiesForEvent,
20
+ handleEventHandler = _require2.handleEventHandler,
21
+ emitBuildEventSchema = _require2.emitBuildEventSchema;
22
+ const _require3 = require('../../parsers-primitives'),
23
+ emitBoolProp = _require3.emitBoolProp,
24
+ emitDoubleProp = _require3.emitDoubleProp,
25
+ emitFloatProp = _require3.emitFloatProp,
26
+ emitMixedProp = _require3.emitMixedProp,
27
+ emitStringProp = _require3.emitStringProp,
28
+ emitInt32Prop = _require3.emitInt32Prop,
29
+ emitObjectProp = _require3.emitObjectProp,
30
+ emitUnionProp = _require3.emitUnionProp;
13
31
  function getPropertyType(
14
32
  /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
15
33
  * LTI update could not be added via codemod */
16
34
  name,
17
35
  optional,
18
36
  typeAnnotation,
37
+ parser,
19
38
  ) {
20
- const type =
21
- typeAnnotation.type === 'GenericTypeAnnotation'
22
- ? typeAnnotation.id.name
23
- : typeAnnotation.type;
39
+ const type = extractTypeFromTypeAnnotation(typeAnnotation, parser);
24
40
  switch (type) {
25
41
  case 'BooleanTypeAnnotation':
42
+ return emitBoolProp(name, optional);
43
+ case 'StringTypeAnnotation':
44
+ return emitStringProp(name, optional);
45
+ case 'Int32':
46
+ return emitInt32Prop(name, optional);
47
+ case 'Double':
48
+ return emitDoubleProp(name, optional);
49
+ case 'Float':
50
+ return emitFloatProp(name, optional);
51
+ case '$ReadOnly':
52
+ return getPropertyType(
53
+ name,
54
+ optional,
55
+ typeAnnotation.typeParameters.params[0],
56
+ parser,
57
+ );
58
+ case 'ObjectTypeAnnotation':
59
+ return emitObjectProp(
60
+ name,
61
+ optional,
62
+ parser,
63
+ typeAnnotation,
64
+ extractArrayElementType,
65
+ );
66
+ case 'UnionTypeAnnotation':
67
+ return emitUnionProp(name, optional, parser, typeAnnotation);
68
+ case 'UnsafeMixed':
69
+ return emitMixedProp(name, optional);
70
+ case 'ArrayTypeAnnotation':
71
+ case '$ReadOnlyArray':
26
72
  return {
27
73
  name,
28
74
  optional,
29
- typeAnnotation: {
30
- type: 'BooleanTypeAnnotation',
31
- },
75
+ typeAnnotation: extractArrayElementType(typeAnnotation, name, parser),
76
+ };
77
+ default:
78
+ throw new Error(`Unable to determine event type for "${name}": ${type}`);
79
+ }
80
+ }
81
+ function extractArrayElementType(typeAnnotation, name, parser) {
82
+ const type = extractTypeFromTypeAnnotation(typeAnnotation, parser);
83
+ switch (type) {
84
+ case 'BooleanTypeAnnotation':
85
+ return {
86
+ type: 'BooleanTypeAnnotation',
32
87
  };
33
88
  case 'StringTypeAnnotation':
34
89
  return {
35
- name,
36
- optional,
37
- typeAnnotation: {
38
- type: 'StringTypeAnnotation',
39
- },
90
+ type: 'StringTypeAnnotation',
40
91
  };
41
92
  case 'Int32':
42
93
  return {
43
- name,
44
- optional,
45
- typeAnnotation: {
46
- type: 'Int32TypeAnnotation',
47
- },
94
+ type: 'Int32TypeAnnotation',
48
95
  };
96
+ case 'Float':
97
+ return {
98
+ type: 'FloatTypeAnnotation',
99
+ };
100
+ case 'NumberTypeAnnotation':
49
101
  case 'Double':
50
102
  return {
51
- name,
52
- optional,
53
- typeAnnotation: {
54
- type: 'DoubleTypeAnnotation',
55
- },
103
+ type: 'DoubleTypeAnnotation',
56
104
  };
57
- case 'Float':
105
+ case 'UnionTypeAnnotation':
58
106
  return {
59
- name,
60
- optional,
61
- typeAnnotation: {
62
- type: 'FloatTypeAnnotation',
63
- },
107
+ type: 'StringEnumTypeAnnotation',
108
+ options: typeAnnotation.types.map(option =>
109
+ parser.getLiteralValue(option),
110
+ ),
111
+ };
112
+ case 'UnsafeMixed':
113
+ return {
114
+ type: 'MixedTypeAnnotation',
64
115
  };
65
- case '$ReadOnly':
66
- return getPropertyType(
67
- name,
68
- optional,
69
- typeAnnotation.typeParameters.params[0],
70
- );
71
116
  case 'ObjectTypeAnnotation':
72
117
  return {
73
- name,
74
- optional,
75
- typeAnnotation: {
76
- type: 'ObjectTypeAnnotation',
77
- properties: typeAnnotation.properties.map(buildPropertiesForEvent),
78
- },
118
+ type: 'ObjectTypeAnnotation',
119
+ properties: parser
120
+ .getObjectProperties(typeAnnotation)
121
+ .map(member =>
122
+ buildPropertiesForEvent(member, parser, getPropertyType),
123
+ ),
79
124
  };
80
- case 'UnionTypeAnnotation':
125
+ case 'ArrayTypeAnnotation':
81
126
  return {
82
- name,
83
- optional,
84
- typeAnnotation: {
85
- type: 'StringEnumTypeAnnotation',
86
- options: typeAnnotation.types.map(option => option.value),
87
- },
127
+ type: 'ArrayTypeAnnotation',
128
+ elementType: extractArrayElementType(
129
+ typeAnnotation.elementType,
130
+ name,
131
+ parser,
132
+ ),
133
+ };
134
+ case '$ReadOnlyArray':
135
+ const genericParams = typeAnnotation.typeParameters.params;
136
+ if (genericParams.length !== 1) {
137
+ throw new Error(
138
+ `Events only supports arrays with 1 Generic type. Found ${
139
+ genericParams.length
140
+ } types:\n${prettify(genericParams)}`,
141
+ );
142
+ }
143
+ return {
144
+ type: 'ArrayTypeAnnotation',
145
+ elementType: extractArrayElementType(genericParams[0], name, parser),
88
146
  };
89
147
  default:
90
- type;
91
- throw new Error(`Unable to determine event type for "${name}": ${type}`);
148
+ throw new Error(
149
+ `Unrecognized ${type} for Array ${name} in events.\n${prettify(
150
+ typeAnnotation,
151
+ )}`,
152
+ );
92
153
  }
93
154
  }
155
+ function prettify(jsonObject) {
156
+ return JSON.stringify(jsonObject, null, 2);
157
+ }
158
+ function extractTypeFromTypeAnnotation(typeAnnotation, parser) {
159
+ return typeAnnotation.type === 'GenericTypeAnnotation'
160
+ ? parser.getTypeAnnotationName(typeAnnotation)
161
+ : typeAnnotation.type;
162
+ }
94
163
  function findEventArgumentsAndType(
164
+ parser,
95
165
  typeAnnotation,
96
166
  types,
97
167
  bubblingType,
98
168
  paperName,
99
169
  ) {
100
- if (!typeAnnotation.id) {
101
- throw new Error("typeAnnotation of event doesn't have a name");
102
- }
103
- const name = typeAnnotation.id.name;
170
+ throwIfEventHasNoName(typeAnnotation, parser);
171
+ const name = parser.getTypeAnnotationName(typeAnnotation);
104
172
  if (name === '$ReadOnly') {
105
173
  return {
106
174
  argumentProps: typeAnnotation.typeParameters.params[0].properties,
@@ -108,29 +176,16 @@ function findEventArgumentsAndType(
108
176
  bubblingType,
109
177
  };
110
178
  } else if (name === 'BubblingEventHandler' || name === 'DirectEventHandler') {
111
- const eventType = name === 'BubblingEventHandler' ? 'bubble' : 'direct';
112
- const paperTopLevelNameDeprecated =
113
- typeAnnotation.typeParameters.params.length > 1
114
- ? typeAnnotation.typeParameters.params[1].value
115
- : null;
116
- if (
117
- typeAnnotation.typeParameters.params[0].type ===
118
- 'NullLiteralTypeAnnotation'
119
- ) {
120
- return {
121
- argumentProps: [],
122
- bubblingType: eventType,
123
- paperTopLevelNameDeprecated,
124
- };
125
- }
126
- return findEventArgumentsAndType(
127
- typeAnnotation.typeParameters.params[0],
179
+ return handleEventHandler(
180
+ name,
181
+ typeAnnotation,
182
+ parser,
128
183
  types,
129
- eventType,
130
- paperTopLevelNameDeprecated,
184
+ findEventArgumentsAndType,
131
185
  );
132
186
  } else if (types[name]) {
133
187
  return findEventArgumentsAndType(
188
+ parser,
134
189
  types[name].right,
135
190
  types,
136
191
  bubblingType,
@@ -144,29 +199,7 @@ function findEventArgumentsAndType(
144
199
  };
145
200
  }
146
201
  }
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) {
151
- const name = property.key.name;
152
- const optional =
153
- property.value.type === 'NullableTypeAnnotation' || property.optional;
154
- let typeAnnotation =
155
- property.value.type === 'NullableTypeAnnotation'
156
- ? property.value.typeAnnotation
157
- : 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
- };
168
- }
169
- function buildEventSchema(types, property) {
202
+ function buildEventSchema(types, property, parser) {
170
203
  const name = property.key.name;
171
204
  const optional =
172
205
  property.optional || property.value.type === 'NullableTypeAnnotation';
@@ -176,12 +209,13 @@ function buildEventSchema(types, property) {
176
209
  : property.value;
177
210
  if (
178
211
  typeAnnotation.type !== 'GenericTypeAnnotation' ||
179
- (typeAnnotation.id.name !== 'BubblingEventHandler' &&
180
- typeAnnotation.id.name !== 'DirectEventHandler')
212
+ (parser.getTypeAnnotationName(typeAnnotation) !== 'BubblingEventHandler' &&
213
+ parser.getTypeAnnotationName(typeAnnotation) !== 'DirectEventHandler')
181
214
  ) {
182
215
  return null;
183
216
  }
184
217
  const _findEventArgumentsAn = findEventArgumentsAndType(
218
+ parser,
185
219
  typeAnnotation,
186
220
  types,
187
221
  ),
@@ -189,45 +223,34 @@ function buildEventSchema(types, property) {
189
223
  bubblingType = _findEventArgumentsAn.bubblingType,
190
224
  paperTopLevelNameDeprecated =
191
225
  _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
- }
205
- return {
206
- name,
207
- optional,
208
- bubblingType,
209
- typeAnnotation: {
210
- type: 'EventTypeAnnotation',
211
- argument: getEventArgument(argumentProps, name),
212
- },
213
- };
214
- }
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
- }
226
+ const nonNullableArgumentProps = throwIfArgumentPropsAreNull(
227
+ argumentProps,
228
+ name,
229
+ );
230
+ const nonNullableBubblingType = throwIfBubblingTypeIsNull(bubblingType, name);
231
+ const argument = getEventArgument(
232
+ nonNullableArgumentProps,
233
+ parser,
234
+ getPropertyType,
235
+ );
236
+ return emitBuildEventSchema(
237
+ paperTopLevelNameDeprecated,
238
+ name,
239
+ optional,
240
+ nonNullableBubblingType,
241
+ argument,
242
+ );
221
243
  }
222
244
 
223
245
  // $FlowFixMe[unclear-type] there's no flowtype for ASTs
224
246
 
225
- function getEvents(eventTypeAST, types) {
247
+ function getEvents(eventTypeAST, types, parser) {
226
248
  return eventTypeAST
227
249
  .filter(property => property.type === 'ObjectTypeProperty')
228
- .map(property => buildEventSchema(types, property))
250
+ .map(property => buildEventSchema(types, property, parser))
229
251
  .filter(Boolean);
230
252
  }
231
253
  module.exports = {
232
254
  getEvents,
255
+ extractArrayElementType,
233
256
  };