@react-native/codegen 0.72.5 → 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 (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 +6 -6
  29. package/lib/parsers/flow/components/componentsUtils.js.flow +10 -10
  30. package/lib/parsers/flow/components/events.js +157 -78
  31. package/lib/parsers/flow/components/events.js.flow +158 -77
  32. package/lib/parsers/flow/components/index.js +28 -105
  33. package/lib/parsers/flow/components/index.js.flow +21 -110
  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 +167 -16
  38. package/lib/parsers/flow/parser.js.flow +209 -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 +141 -1
  42. package/lib/parsers/parserMock.js +165 -2
  43. package/lib/parsers/parserMock.js.flow +216 -2
  44. package/lib/parsers/parsers-commons.js +128 -9
  45. package/lib/parsers/parsers-commons.js.flow +182 -12
  46. package/lib/parsers/parsers-primitives.js +84 -35
  47. package/lib/parsers/parsers-primitives.js.flow +110 -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 +31 -7
  51. package/lib/parsers/typescript/components/componentsUtils.js.flow +31 -14
  52. package/lib/parsers/typescript/components/events.js +142 -67
  53. package/lib/parsers/typescript/components/events.js.flow +149 -68
  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 +29 -109
  57. package/lib/parsers/typescript/components/index.js.flow +21 -116
  58. package/lib/parsers/typescript/modules/index.js +41 -50
  59. package/lib/parsers/typescript/modules/index.js.flow +23 -31
  60. package/lib/parsers/typescript/parser.d.ts +9 -2
  61. package/lib/parsers/typescript/parser.js +193 -7
  62. package/lib/parsers/typescript/parser.js.flow +235 -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,9 +10,11 @@
10
10
 
11
11
  'use strict';
12
12
 
13
- const _require = require('./CppHelpers.js'),
13
+ const _require = require('./CppHelpers'),
14
14
  generateEventStructName = _require.generateEventStructName;
15
- const FileTemplate = ({events, libraryName}) => `
15
+ const _require2 = require('../Utils'),
16
+ indent = _require2.indent;
17
+ const FileTemplate = ({events, libraryName, extraIncludes}) => `
16
18
  /**
17
19
  * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
18
20
  *
@@ -23,12 +25,11 @@ const FileTemplate = ({events, libraryName}) => `
23
25
  */
24
26
 
25
27
  #include <react/renderer/components/${libraryName}/EventEmitters.h>
28
+ ${[...extraIncludes].join('\n')}
26
29
 
27
30
  namespace facebook {
28
31
  namespace react {
29
-
30
32
  ${events}
31
-
32
33
  } // namespace react
33
34
  } // namespace facebook
34
35
  `;
@@ -39,16 +40,16 @@ const ComponentTemplate = ({
39
40
  dispatchEventName,
40
41
  implementation,
41
42
  }) => {
42
- const capture = implementation.includes('event')
43
- ? 'event=std::move(event)'
43
+ const capture = implementation.includes('$event')
44
+ ? '$event=std::move($event)'
44
45
  : '';
45
46
  return `
46
- void ${className}EventEmitter::${eventName}(${structName} event) const {
47
+ void ${className}EventEmitter::${eventName}(${structName} $event) const {
47
48
  dispatchEvent("${dispatchEventName}", [${capture}](jsi::Runtime &runtime) {
48
49
  ${implementation}
49
50
  });
50
51
  }
51
- `.trim();
52
+ `;
52
53
  };
53
54
  const BasicComponentTemplate = ({className, eventName, dispatchEventName}) =>
54
55
  `
@@ -56,84 +57,261 @@ void ${className}EventEmitter::${eventName}() const {
56
57
  dispatchEvent("${dispatchEventName}");
57
58
  }
58
59
  `.trim();
59
- function generateSetter(variableName, propertyName, propertyParts) {
60
- const trailingPeriod = propertyParts.length === 0 ? '' : '.';
61
- const eventChain = `event.${propertyParts.join(
62
- '.',
63
- )}${trailingPeriod}${propertyName});`;
64
- return `${variableName}.setProperty(runtime, "${propertyName}", ${eventChain}`;
60
+ function generateSetter(
61
+ variableName,
62
+ propertyName,
63
+ propertyParts,
64
+ usingEvent,
65
+ valueMapper = value => value,
66
+ ) {
67
+ const eventChain = usingEvent
68
+ ? `$event.${[...propertyParts, propertyName].join('.')}`
69
+ : [propertyParts, propertyName].join('.');
70
+ return `${variableName}.setProperty(runtime, "${propertyName}", ${valueMapper(
71
+ eventChain,
72
+ )});`;
73
+ }
74
+ function generateObjectSetter(
75
+ variableName,
76
+ propertyName,
77
+ propertyParts,
78
+ typeAnnotation,
79
+ extraIncludes,
80
+ usingEvent,
81
+ ) {
82
+ return `
83
+ {
84
+ auto ${propertyName} = jsi::Object(runtime);
85
+ ${indent(
86
+ generateSetters(
87
+ propertyName,
88
+ typeAnnotation.properties,
89
+ propertyParts.concat([propertyName]),
90
+ extraIncludes,
91
+ usingEvent,
92
+ ),
93
+ 2,
94
+ )}
95
+ ${variableName}.setProperty(runtime, "${propertyName}", ${propertyName});
96
+ }
97
+ `.trim();
65
98
  }
66
- function generateEnumSetter(variableName, propertyName, propertyParts) {
67
- const trailingPeriod = propertyParts.length === 0 ? '' : '.';
68
- const eventChain = `event.${propertyParts.join(
69
- '.',
70
- )}${trailingPeriod}${propertyName})`;
71
- return `${variableName}.setProperty(runtime, "${propertyName}", toString(${eventChain});`;
99
+ function setValueAtIndex(
100
+ propertyName,
101
+ indexVariable,
102
+ loopLocalVariable,
103
+ mappingFunction = value => value,
104
+ ) {
105
+ return `${propertyName}.setValueAtIndex(runtime, ${indexVariable}++, ${mappingFunction(
106
+ loopLocalVariable,
107
+ )});`;
72
108
  }
73
- function generateSetters(parentPropertyName, properties, propertyParts) {
109
+ function generateArraySetter(
110
+ variableName,
111
+ propertyName,
112
+ propertyParts,
113
+ elementType,
114
+ extraIncludes,
115
+ usingEvent,
116
+ ) {
117
+ const eventChain = usingEvent
118
+ ? `$event.${[...propertyParts, propertyName].join('.')}`
119
+ : [propertyParts, propertyName].join('.');
120
+ const indexVar = `${propertyName}Index`;
121
+ const innerLoopVar = `${propertyName}Value`;
122
+ return `
123
+ auto ${propertyName} = jsi::Array(runtime, ${eventChain}.size());
124
+ size_t ${indexVar} = 0;
125
+ for (auto ${innerLoopVar} : ${eventChain}) {
126
+ ${handleArrayElementType(
127
+ elementType,
128
+ propertyName,
129
+ indexVar,
130
+ innerLoopVar,
131
+ propertyParts,
132
+ extraIncludes,
133
+ usingEvent,
134
+ )}
135
+ }
136
+ ${variableName}.setProperty(runtime, "${propertyName}", ${propertyName});
137
+ `;
138
+ }
139
+ function handleArrayElementType(
140
+ elementType,
141
+ propertyName,
142
+ indexVariable,
143
+ loopLocalVariable,
144
+ propertyParts,
145
+ extraIncludes,
146
+ usingEvent,
147
+ ) {
148
+ switch (elementType.type) {
149
+ case 'BooleanTypeAnnotation':
150
+ return setValueAtIndex(
151
+ propertyName,
152
+ indexVariable,
153
+ loopLocalVariable,
154
+ val => `(bool)${val}`,
155
+ );
156
+ case 'StringTypeAnnotation':
157
+ case 'Int32TypeAnnotation':
158
+ case 'DoubleTypeAnnotation':
159
+ case 'FloatTypeAnnotation':
160
+ return setValueAtIndex(propertyName, indexVariable, loopLocalVariable);
161
+ case 'MixedTypeAnnotation':
162
+ return setValueAtIndex(
163
+ propertyName,
164
+ indexVariable,
165
+ loopLocalVariable,
166
+ val => `jsi::valueFromDynamic(runtime, ${val})`,
167
+ );
168
+ case 'StringEnumTypeAnnotation':
169
+ return setValueAtIndex(
170
+ propertyName,
171
+ indexVariable,
172
+ loopLocalVariable,
173
+ val => `toString(${val})`,
174
+ );
175
+ case 'ObjectTypeAnnotation':
176
+ return convertObjectTypeArray(
177
+ propertyName,
178
+ indexVariable,
179
+ loopLocalVariable,
180
+ propertyParts,
181
+ elementType,
182
+ extraIncludes,
183
+ );
184
+ case 'ArrayTypeAnnotation':
185
+ return convertArrayTypeArray(
186
+ propertyName,
187
+ indexVariable,
188
+ loopLocalVariable,
189
+ propertyParts,
190
+ elementType,
191
+ extraIncludes,
192
+ usingEvent,
193
+ );
194
+ default:
195
+ throw new Error(
196
+ `Received invalid elementType for array ${elementType.type}`,
197
+ );
198
+ }
199
+ }
200
+ function convertObjectTypeArray(
201
+ propertyName,
202
+ indexVariable,
203
+ loopLocalVariable,
204
+ propertyParts,
205
+ objectTypeAnnotation,
206
+ extraIncludes,
207
+ ) {
208
+ return `auto ${propertyName}Object = jsi::Object(runtime);
209
+ ${generateSetters(
210
+ `${propertyName}Object`,
211
+ objectTypeAnnotation.properties,
212
+ [].concat([loopLocalVariable]),
213
+ extraIncludes,
214
+ false,
215
+ )}
216
+ ${setValueAtIndex(propertyName, indexVariable, `${propertyName}Object`)}`;
217
+ }
218
+ function convertArrayTypeArray(
219
+ propertyName,
220
+ indexVariable,
221
+ loopLocalVariable,
222
+ propertyParts,
223
+ eventTypeAnnotation,
224
+ extraIncludes,
225
+ usingEvent,
226
+ ) {
227
+ if (eventTypeAnnotation.type !== 'ArrayTypeAnnotation') {
228
+ throw new Error(
229
+ `Inconsistent eventTypeAnnotation received. Expected type = 'ArrayTypeAnnotation'; received = ${eventTypeAnnotation.type}`,
230
+ );
231
+ }
232
+ return `auto ${propertyName}Array = jsi::Array(runtime, ${loopLocalVariable}.size());
233
+ size_t ${indexVariable}Internal = 0;
234
+ for (auto ${loopLocalVariable}Internal : ${loopLocalVariable}) {
235
+ ${handleArrayElementType(
236
+ eventTypeAnnotation.elementType,
237
+ `${propertyName}Array`,
238
+ `${indexVariable}Internal`,
239
+ `${loopLocalVariable}Internal`,
240
+ propertyParts,
241
+ extraIncludes,
242
+ usingEvent,
243
+ )}
244
+ }
245
+ ${setValueAtIndex(propertyName, indexVariable, `${propertyName}Array`)}`;
246
+ }
247
+ function generateSetters(
248
+ parentPropertyName,
249
+ properties,
250
+ propertyParts,
251
+ extraIncludes,
252
+ usingEvent = true,
253
+ ) {
74
254
  const propSetters = properties
75
255
  .map(eventProperty => {
76
256
  const typeAnnotation = eventProperty.typeAnnotation;
77
257
  switch (typeAnnotation.type) {
78
258
  case 'BooleanTypeAnnotation':
79
- return generateSetter(
80
- parentPropertyName,
81
- eventProperty.name,
82
- propertyParts,
83
- );
84
259
  case 'StringTypeAnnotation':
260
+ case 'Int32TypeAnnotation':
261
+ case 'DoubleTypeAnnotation':
262
+ case 'FloatTypeAnnotation':
85
263
  return generateSetter(
86
264
  parentPropertyName,
87
265
  eventProperty.name,
88
266
  propertyParts,
267
+ usingEvent,
89
268
  );
90
- case 'Int32TypeAnnotation':
269
+ case 'MixedTypeAnnotation':
270
+ extraIncludes.add('#include <jsi/JSIDynamic.h>');
91
271
  return generateSetter(
92
272
  parentPropertyName,
93
273
  eventProperty.name,
94
274
  propertyParts,
275
+ usingEvent,
276
+ prop => `jsi::valueFromDynamic(runtime, ${prop})`,
95
277
  );
96
- case 'DoubleTypeAnnotation':
278
+ case 'StringEnumTypeAnnotation':
97
279
  return generateSetter(
98
280
  parentPropertyName,
99
281
  eventProperty.name,
100
282
  propertyParts,
283
+ usingEvent,
284
+ prop => `toString(${prop})`,
101
285
  );
102
- case 'FloatTypeAnnotation':
103
- return generateSetter(
286
+ case 'ObjectTypeAnnotation':
287
+ return generateObjectSetter(
104
288
  parentPropertyName,
105
289
  eventProperty.name,
106
290
  propertyParts,
291
+ typeAnnotation,
292
+ extraIncludes,
293
+ usingEvent,
107
294
  );
108
- case 'StringEnumTypeAnnotation':
109
- return generateEnumSetter(
295
+ case 'ArrayTypeAnnotation':
296
+ return generateArraySetter(
110
297
  parentPropertyName,
111
298
  eventProperty.name,
112
299
  propertyParts,
300
+ typeAnnotation.elementType,
301
+ extraIncludes,
302
+ usingEvent,
113
303
  );
114
- case 'ObjectTypeAnnotation':
115
- const propertyName = eventProperty.name;
116
- return `
117
- {
118
- auto ${propertyName} = jsi::Object(runtime);
119
- ${generateSetters(
120
- propertyName,
121
- typeAnnotation.properties,
122
- propertyParts.concat([propertyName]),
123
- )}
124
-
125
- ${parentPropertyName}.setProperty(runtime, "${propertyName}", ${propertyName});
126
- }
127
- `.trim();
128
304
  default:
129
305
  typeAnnotation.type;
130
- throw new Error('Received invalid event property type');
306
+ throw new Error(
307
+ `Received invalid event property type ${typeAnnotation.type}`,
308
+ );
131
309
  }
132
310
  })
133
311
  .join('\n');
134
312
  return propSetters;
135
313
  }
136
- function generateEvent(componentName, event) {
314
+ function generateEvent(componentName, event, extraIncludes) {
137
315
  // This is a gross hack necessary because native code is sending
138
316
  // events named things like topChange to JS which is then converted back to
139
317
  // call the onChange prop. We should be consistent throughout the system.
@@ -145,9 +323,14 @@ function generateEvent(componentName, event) {
145
323
  )}`;
146
324
  if (event.typeAnnotation.argument) {
147
325
  const implementation = `
148
- auto payload = jsi::Object(runtime);
149
- ${generateSetters('payload', event.typeAnnotation.argument.properties, [])}
150
- return payload;
326
+ auto $payload = jsi::Object(runtime);
327
+ ${generateSetters(
328
+ '$payload',
329
+ event.typeAnnotation.argument.properties,
330
+ [],
331
+ extraIncludes,
332
+ )}
333
+ return $payload;
151
334
  `.trim();
152
335
  if (!event.name.startsWith('on')) {
153
336
  throw new Error('Expected the event name to start with `on`');
@@ -183,20 +366,20 @@ module.exports = {
183
366
  })
184
367
  .filter(Boolean)
185
368
  .reduce((acc, components) => Object.assign(acc, components), {});
186
- const fileName = 'EventEmitters.cpp';
369
+ const extraIncludes = new Set();
187
370
  const componentEmitters = Object.keys(moduleComponents)
188
371
  .map(componentName => {
189
372
  const component = moduleComponents[componentName];
190
373
  return component.events
191
- .map(event => {
192
- return generateEvent(componentName, event);
193
- })
374
+ .map(event => generateEvent(componentName, event, extraIncludes))
194
375
  .join('\n');
195
376
  })
196
377
  .join('\n');
378
+ const fileName = 'EventEmitters.cpp';
197
379
  const replacedTemplate = FileTemplate({
198
380
  libraryName,
199
381
  events: componentEmitters,
382
+ extraIncludes,
200
383
  });
201
384
  return new Map([[fileName, replacedTemplate]]);
202
385
  },