@react-native/codegen 0.74.0-nightly-20231203-385473522 → 0.74.0-nightly-20231204-e9b80971c

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.
@@ -88,7 +88,9 @@ const _require3 = require('../Utils'),
88
88
  const _require4 = require('./Utils'),
89
89
  createAliasResolver = _require4.createAliasResolver,
90
90
  getAreEnumMembersInteger = _require4.getAreEnumMembersInteger,
91
- getModules = _require4.getModules;
91
+ getModules = _require4.getModules,
92
+ isArrayRecursiveMember = _require4.isArrayRecursiveMember,
93
+ isDirectRecursiveMember = _require4.isDirectRecursiveMember;
92
94
  const ModuleClassDeclarationTemplate = ({
93
95
  hasteModuleName,
94
96
  moduleProperties,
@@ -165,6 +167,7 @@ ${modules.join('\n\n')}
165
167
  };
166
168
  function translatePrimitiveJSTypeToCpp(
167
169
  moduleName,
170
+ parentObjectAliasName,
168
171
  nullableTypeAnnotation,
169
172
  optional,
170
173
  createErrorMessage,
@@ -176,12 +179,16 @@ function translatePrimitiveJSTypeToCpp(
176
179
  typeAnnotation = _unwrapNullable2[0],
177
180
  nullable = _unwrapNullable2[1];
178
181
  const isRequired = !optional && !nullable;
182
+ const isRecursiveType = isDirectRecursiveMember(
183
+ parentObjectAliasName,
184
+ nullableTypeAnnotation,
185
+ );
179
186
  let realTypeAnnotation = typeAnnotation;
180
187
  if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
181
188
  realTypeAnnotation = resolveAlias(realTypeAnnotation.name);
182
189
  }
183
190
  function wrap(type) {
184
- return isRequired ? type : `std::optional<${type}>`;
191
+ return isRequired || isRecursiveType ? type : `std::optional<${type}>`;
185
192
  }
186
193
  switch (realTypeAnnotation.type) {
187
194
  case 'ReservedTypeAnnotation':
@@ -248,9 +255,10 @@ function translatePrimitiveJSTypeToCpp(
248
255
  }
249
256
  }
250
257
  function createStructsString(moduleName, aliasMap, resolveAlias, enumMap) {
251
- const getCppType = v =>
258
+ const getCppType = (parentObjectAlias, v) =>
252
259
  translatePrimitiveJSTypeToCpp(
253
260
  moduleName,
261
+ parentObjectAlias,
254
262
  v.typeAnnotation,
255
263
  false,
256
264
  typeName => `Unsupported type for param "${v.name}". Found: ${typeName}`,
@@ -276,7 +284,7 @@ function createStructsString(moduleName, aliasMap, resolveAlias, enumMap) {
276
284
  .join(', ');
277
285
  const debugParameterConversion = value.properties
278
286
  .map(
279
- (v, i) => ` static ${getCppType(v)} ${
287
+ (v, i) => ` static ${getCppType(alias, v)} ${
280
288
  v.name
281
289
  }ToJs(jsi::Runtime &rt, P${i} value) {
282
290
  return bridging::toJs(rt, value);
@@ -347,12 +355,39 @@ ${value.properties
347
355
  return '';
348
356
  }
349
357
  const structName = `${moduleName}${alias}`;
350
- const templateParameterWithTypename = value.properties
358
+ const templateParameter = value.properties.filter(
359
+ v =>
360
+ !isDirectRecursiveMember(alias, v.typeAnnotation) &&
361
+ !isArrayRecursiveMember(alias, v.typeAnnotation),
362
+ );
363
+ const templateParameterWithTypename = templateParameter
351
364
  .map((v, i) => `typename P${i}`)
352
365
  .join(', ');
366
+ const templateParameterWithoutTypename = templateParameter
367
+ .map((v, i) => `P${i}`)
368
+ .join(', ');
369
+ let i = -1;
370
+ const templateMemberTypes = value.properties.map(v => {
371
+ if (isDirectRecursiveMember(alias, v.typeAnnotation)) {
372
+ return `std::unique_ptr<${structName}<${templateParameterWithoutTypename}>> ${v.name}`;
373
+ } else if (isArrayRecursiveMember(alias, v.typeAnnotation)) {
374
+ const _unwrapNullable3 = unwrapNullable(v.typeAnnotation),
375
+ _unwrapNullable4 = _slicedToArray(_unwrapNullable3, 1),
376
+ nullable = _unwrapNullable4[0];
377
+ return (
378
+ (nullable
379
+ ? `std::optional<std::vector<${structName}<${templateParameterWithoutTypename}>>>`
380
+ : `std::vector<${structName}<${templateParameterWithoutTypename}>>`) +
381
+ ` ${v.name}`
382
+ );
383
+ } else {
384
+ i++;
385
+ return `P${i} ${v.name}`;
386
+ }
387
+ });
353
388
  const debugParameterConversion = value.properties
354
389
  .map(
355
- (v, i) => ` static ${getCppType(v)} ${
390
+ v => ` static ${getCppType(alias, v)} ${
356
391
  v.name
357
392
  }ToJs(jsi::Runtime &rt, decltype(types.${v.name}) value) {
358
393
  return bridging::toJs(rt, value);
@@ -364,7 +399,7 @@ ${value.properties
364
399
 
365
400
  template <${templateParameterWithTypename}>
366
401
  struct ${structName} {
367
- ${value.properties.map((v, i) => ' P' + i + ' ' + v.name).join(';\n')};
402
+ ${templateMemberTypes.map(v => ' ' + v).join(';\n')};
368
403
  bool operator==(const ${structName} &other) const {
369
404
  return ${value.properties
370
405
  .map(v => `${v.name} == other.${v.name}`)
@@ -382,10 +417,13 @@ struct ${structName}Bridging {
382
417
  const std::shared_ptr<CallInvoker> &jsInvoker) {
383
418
  T result{
384
419
  ${value.properties
385
- .map(
386
- (v, i) =>
387
- ` bridging::fromJs<decltype(types.${v.name})>(rt, value.getProperty(rt, "${v.name}"), jsInvoker)`,
388
- )
420
+ .map(v => {
421
+ if (isDirectRecursiveMember(alias, v.typeAnnotation)) {
422
+ return ` value.hasProperty(rt, "${v.name}") ? std::make_unique<T>(bridging::fromJs<T>(rt, value.getProperty(rt, "${v.name}"), jsInvoker)) : nullptr`;
423
+ } else {
424
+ return ` bridging::fromJs<decltype(types.${v.name})>(rt, value.getProperty(rt, "${v.name}"), jsInvoker)`;
425
+ }
426
+ })
389
427
  .join(',\n')}};
390
428
  return result;
391
429
  }
@@ -400,8 +438,12 @@ ${debugParameterConversion}
400
438
  const std::shared_ptr<CallInvoker> &jsInvoker) {
401
439
  auto result = facebook::jsi::Object(rt);
402
440
  ${value.properties
403
- .map((v, i) => {
404
- if (v.optional) {
441
+ .map(v => {
442
+ if (isDirectRecursiveMember(alias, v.typeAnnotation)) {
443
+ return ` if (value.${v.name}) {
444
+ result.setProperty(rt, "${v.name}", bridging::toJs(rt, *value.${v.name}, jsInvoker));
445
+ }`;
446
+ } else if (v.optional) {
405
447
  return ` if (value.${v.name}) {
406
448
  result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}.value(), jsInvoker));
407
449
  }`;
@@ -521,15 +563,16 @@ function translatePropertyToCpp(
521
563
  enumMap,
522
564
  abstract = false,
523
565
  ) {
524
- const _unwrapNullable3 = unwrapNullable(prop.typeAnnotation),
525
- _unwrapNullable4 = _slicedToArray(_unwrapNullable3, 1),
526
- propTypeAnnotation = _unwrapNullable4[0];
566
+ const _unwrapNullable5 = unwrapNullable(prop.typeAnnotation),
567
+ _unwrapNullable6 = _slicedToArray(_unwrapNullable5, 1),
568
+ propTypeAnnotation = _unwrapNullable6[0];
527
569
  const params = propTypeAnnotation.params.map(
528
570
  param => `std::move(${param.name})`,
529
571
  );
530
572
  const paramTypes = propTypeAnnotation.params.map(param => {
531
573
  const translatedParam = translatePrimitiveJSTypeToCpp(
532
574
  moduleName,
575
+ null,
533
576
  param.typeAnnotation,
534
577
  param.optional,
535
578
  typeName =>
@@ -541,6 +584,7 @@ function translatePropertyToCpp(
541
584
  });
542
585
  const returnType = translatePrimitiveJSTypeToCpp(
543
586
  moduleName,
587
+ null,
544
588
  propTypeAnnotation.returnTypeAnnotation,
545
589
  false,
546
590
  typeName => `Unsupported return type for ${prop.name}. Found: ${typeName}`,
@@ -33,6 +33,8 @@ const {
33
33
  createAliasResolver,
34
34
  getAreEnumMembersInteger,
35
35
  getModules,
36
+ isArrayRecursiveMember,
37
+ isDirectRecursiveMember,
36
38
  } = require('./Utils');
37
39
 
38
40
  type FilesOutput = Map<string, string>;
@@ -129,6 +131,7 @@ ${modules.join('\n\n')}
129
131
 
130
132
  function translatePrimitiveJSTypeToCpp(
131
133
  moduleName: string,
134
+ parentObjectAliasName: ?string,
132
135
  nullableTypeAnnotation: Nullable<NativeModuleTypeAnnotation>,
133
136
  optional: boolean,
134
137
  createErrorMessage: (typeName: string) => string,
@@ -139,6 +142,10 @@ function translatePrimitiveJSTypeToCpp(
139
142
  nullableTypeAnnotation,
140
143
  );
141
144
  const isRequired = !optional && !nullable;
145
+ const isRecursiveType = isDirectRecursiveMember(
146
+ parentObjectAliasName,
147
+ nullableTypeAnnotation,
148
+ );
142
149
 
143
150
  let realTypeAnnotation = typeAnnotation;
144
151
  if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
@@ -146,7 +153,7 @@ function translatePrimitiveJSTypeToCpp(
146
153
  }
147
154
 
148
155
  function wrap(type: string) {
149
- return isRequired ? type : `std::optional<${type}>`;
156
+ return isRequired || isRecursiveType ? type : `std::optional<${type}>`;
150
157
  }
151
158
 
152
159
  switch (realTypeAnnotation.type) {
@@ -221,10 +228,12 @@ function createStructsString(
221
228
  enumMap: NativeModuleEnumMap,
222
229
  ): string {
223
230
  const getCppType = (
231
+ parentObjectAlias: string,
224
232
  v: NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>,
225
233
  ) =>
226
234
  translatePrimitiveJSTypeToCpp(
227
235
  moduleName,
236
+ parentObjectAlias,
228
237
  v.typeAnnotation,
229
238
  false,
230
239
  typeName => `Unsupported type for param "${v.name}". Found: ${typeName}`,
@@ -250,7 +259,7 @@ function createStructsString(
250
259
  .join(', ');
251
260
  const debugParameterConversion = value.properties
252
261
  .map(
253
- (v, i) => ` static ${getCppType(v)} ${
262
+ (v, i) => ` static ${getCppType(alias, v)} ${
254
263
  v.name
255
264
  }ToJs(jsi::Runtime &rt, P${i} value) {
256
265
  return bridging::toJs(rt, value);
@@ -321,12 +330,39 @@ ${value.properties
321
330
  return '';
322
331
  }
323
332
  const structName = `${moduleName}${alias}`;
324
- const templateParameterWithTypename = value.properties
333
+ const templateParameter = value.properties.filter(
334
+ v =>
335
+ !isDirectRecursiveMember(alias, v.typeAnnotation) &&
336
+ !isArrayRecursiveMember(alias, v.typeAnnotation),
337
+ );
338
+ const templateParameterWithTypename = templateParameter
325
339
  .map((v, i) => `typename P${i}`)
326
340
  .join(', ');
341
+ const templateParameterWithoutTypename = templateParameter
342
+ .map((v, i) => `P${i}`)
343
+ .join(', ');
344
+ let i = -1;
345
+ const templateMemberTypes = value.properties.map(v => {
346
+ if (isDirectRecursiveMember(alias, v.typeAnnotation)) {
347
+ return `std::unique_ptr<${structName}<${templateParameterWithoutTypename}>> ${v.name}`;
348
+ } else if (isArrayRecursiveMember(alias, v.typeAnnotation)) {
349
+ const [nullable] = unwrapNullable<NativeModuleTypeAnnotation>(
350
+ v.typeAnnotation,
351
+ );
352
+ return (
353
+ (nullable
354
+ ? `std::optional<std::vector<${structName}<${templateParameterWithoutTypename}>>>`
355
+ : `std::vector<${structName}<${templateParameterWithoutTypename}>>`) +
356
+ ` ${v.name}`
357
+ );
358
+ } else {
359
+ i++;
360
+ return `P${i} ${v.name}`;
361
+ }
362
+ });
327
363
  const debugParameterConversion = value.properties
328
364
  .map(
329
- (v, i) => ` static ${getCppType(v)} ${
365
+ v => ` static ${getCppType(alias, v)} ${
330
366
  v.name
331
367
  }ToJs(jsi::Runtime &rt, decltype(types.${v.name}) value) {
332
368
  return bridging::toJs(rt, value);
@@ -338,7 +374,7 @@ ${value.properties
338
374
 
339
375
  template <${templateParameterWithTypename}>
340
376
  struct ${structName} {
341
- ${value.properties.map((v, i) => ' P' + i + ' ' + v.name).join(';\n')};
377
+ ${templateMemberTypes.map(v => ' ' + v).join(';\n')};
342
378
  bool operator==(const ${structName} &other) const {
343
379
  return ${value.properties
344
380
  .map(v => `${v.name} == other.${v.name}`)
@@ -356,10 +392,13 @@ struct ${structName}Bridging {
356
392
  const std::shared_ptr<CallInvoker> &jsInvoker) {
357
393
  T result{
358
394
  ${value.properties
359
- .map(
360
- (v, i) =>
361
- ` bridging::fromJs<decltype(types.${v.name})>(rt, value.getProperty(rt, "${v.name}"), jsInvoker)`,
362
- )
395
+ .map(v => {
396
+ if (isDirectRecursiveMember(alias, v.typeAnnotation)) {
397
+ return ` value.hasProperty(rt, "${v.name}") ? std::make_unique<T>(bridging::fromJs<T>(rt, value.getProperty(rt, "${v.name}"), jsInvoker)) : nullptr`;
398
+ } else {
399
+ return ` bridging::fromJs<decltype(types.${v.name})>(rt, value.getProperty(rt, "${v.name}"), jsInvoker)`;
400
+ }
401
+ })
363
402
  .join(',\n')}};
364
403
  return result;
365
404
  }
@@ -374,8 +413,12 @@ ${debugParameterConversion}
374
413
  const std::shared_ptr<CallInvoker> &jsInvoker) {
375
414
  auto result = facebook::jsi::Object(rt);
376
415
  ${value.properties
377
- .map((v, i) => {
378
- if (v.optional) {
416
+ .map(v => {
417
+ if (isDirectRecursiveMember(alias, v.typeAnnotation)) {
418
+ return ` if (value.${v.name}) {
419
+ result.setProperty(rt, "${v.name}", bridging::toJs(rt, *value.${v.name}, jsInvoker));
420
+ }`;
421
+ } else if (v.optional) {
379
422
  return ` if (value.${v.name}) {
380
423
  result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}.value(), jsInvoker));
381
424
  }`;
@@ -528,6 +571,7 @@ function translatePropertyToCpp(
528
571
  const paramTypes = propTypeAnnotation.params.map(param => {
529
572
  const translatedParam = translatePrimitiveJSTypeToCpp(
530
573
  moduleName,
574
+ null,
531
575
  param.typeAnnotation,
532
576
  param.optional,
533
577
  typeName =>
@@ -540,6 +584,7 @@ function translatePropertyToCpp(
540
584
 
541
585
  const returnType = translatePrimitiveJSTypeToCpp(
542
586
  moduleName,
587
+ null,
543
588
  propTypeAnnotation.returnTypeAnnotation,
544
589
  false,
545
590
  typeName => `Unsupported return type for ${prop.name}. Found: ${typeName}`,
@@ -10,6 +10,76 @@
10
10
 
11
11
  'use strict';
12
12
 
13
+ function _slicedToArray(arr, i) {
14
+ return (
15
+ _arrayWithHoles(arr) ||
16
+ _iterableToArrayLimit(arr, i) ||
17
+ _unsupportedIterableToArray(arr, i) ||
18
+ _nonIterableRest()
19
+ );
20
+ }
21
+ function _nonIterableRest() {
22
+ throw new TypeError(
23
+ 'Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.',
24
+ );
25
+ }
26
+ function _unsupportedIterableToArray(o, minLen) {
27
+ if (!o) return;
28
+ if (typeof o === 'string') return _arrayLikeToArray(o, minLen);
29
+ var n = Object.prototype.toString.call(o).slice(8, -1);
30
+ if (n === 'Object' && o.constructor) n = o.constructor.name;
31
+ if (n === 'Map' || n === 'Set') return Array.from(o);
32
+ if (n === 'Arguments' || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))
33
+ return _arrayLikeToArray(o, minLen);
34
+ }
35
+ function _arrayLikeToArray(arr, len) {
36
+ if (len == null || len > arr.length) len = arr.length;
37
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
38
+ return arr2;
39
+ }
40
+ function _iterableToArrayLimit(arr, i) {
41
+ var _i =
42
+ null == arr
43
+ ? null
44
+ : ('undefined' != typeof Symbol && arr[Symbol.iterator]) ||
45
+ arr['@@iterator'];
46
+ if (null != _i) {
47
+ var _s,
48
+ _e,
49
+ _x,
50
+ _r,
51
+ _arr = [],
52
+ _n = !0,
53
+ _d = !1;
54
+ try {
55
+ if (((_x = (_i = _i.call(arr)).next), 0 === i)) {
56
+ if (Object(_i) !== _i) return;
57
+ _n = !1;
58
+ } else
59
+ for (
60
+ ;
61
+ !(_n = (_s = _x.call(_i)).done) &&
62
+ (_arr.push(_s.value), _arr.length !== i);
63
+ _n = !0
64
+ );
65
+ } catch (err) {
66
+ (_d = !0), (_e = err);
67
+ } finally {
68
+ try {
69
+ if (!_n && null != _i.return && ((_r = _i.return()), Object(_r) !== _r))
70
+ return;
71
+ } finally {
72
+ if (_d) throw _e;
73
+ }
74
+ }
75
+ return _arr;
76
+ }
77
+ }
78
+ function _arrayWithHoles(arr) {
79
+ if (Array.isArray(arr)) return arr;
80
+ }
81
+ const _require = require('../../parsers/parsers-commons'),
82
+ unwrapNullable = _require.unwrapNullable;
13
83
  const invariant = require('invariant');
14
84
  function createAliasResolver(aliasMap) {
15
85
  return aliasName => {
@@ -28,6 +98,32 @@ function getModules(schema) {
28
98
  return modules;
29
99
  }, {});
30
100
  }
101
+ function isDirectRecursiveMember(
102
+ parentObjectAliasName,
103
+ nullableTypeAnnotation,
104
+ ) {
105
+ const _unwrapNullable = unwrapNullable(nullableTypeAnnotation),
106
+ _unwrapNullable2 = _slicedToArray(_unwrapNullable, 1),
107
+ typeAnnotation = _unwrapNullable2[0];
108
+ return (
109
+ parentObjectAliasName !== undefined &&
110
+ typeAnnotation.name === parentObjectAliasName
111
+ );
112
+ }
113
+ function isArrayRecursiveMember(parentObjectAliasName, nullableTypeAnnotation) {
114
+ var _typeAnnotation$eleme;
115
+ const _unwrapNullable3 = unwrapNullable(nullableTypeAnnotation),
116
+ _unwrapNullable4 = _slicedToArray(_unwrapNullable3, 1),
117
+ typeAnnotation = _unwrapNullable4[0];
118
+ return (
119
+ parentObjectAliasName !== undefined &&
120
+ typeAnnotation.type === 'ArrayTypeAnnotation' &&
121
+ ((_typeAnnotation$eleme = typeAnnotation.elementType) === null ||
122
+ _typeAnnotation$eleme === void 0
123
+ ? void 0
124
+ : _typeAnnotation$eleme.name) === parentObjectAliasName
125
+ );
126
+ }
31
127
  function getAreEnumMembersInteger(members) {
32
128
  return !members.some(m => `${m.value}`.includes('.'));
33
129
  }
@@ -35,4 +131,6 @@ module.exports = {
35
131
  createAliasResolver,
36
132
  getModules,
37
133
  getAreEnumMembersInteger,
134
+ isDirectRecursiveMember,
135
+ isArrayRecursiveMember,
38
136
  };
@@ -15,9 +15,12 @@ import type {
15
15
  NativeModuleEnumMembers,
16
16
  NativeModuleObjectTypeAnnotation,
17
17
  NativeModuleSchema,
18
+ NativeModuleTypeAnnotation,
19
+ Nullable,
18
20
  SchemaType,
19
21
  } from '../../CodegenSchema';
20
22
 
23
+ const {unwrapNullable} = require('../../parsers/parsers-commons');
21
24
  const invariant = require('invariant');
22
25
 
23
26
  export type AliasResolver = (
@@ -48,6 +51,33 @@ function getModules(
48
51
  );
49
52
  }
50
53
 
54
+ function isDirectRecursiveMember(
55
+ parentObjectAliasName: ?string,
56
+ nullableTypeAnnotation: Nullable<NativeModuleTypeAnnotation>,
57
+ ): boolean {
58
+ const [typeAnnotation] = unwrapNullable<NativeModuleTypeAnnotation>(
59
+ nullableTypeAnnotation,
60
+ );
61
+ return (
62
+ parentObjectAliasName !== undefined &&
63
+ typeAnnotation.name === parentObjectAliasName
64
+ );
65
+ }
66
+
67
+ function isArrayRecursiveMember(
68
+ parentObjectAliasName: ?string,
69
+ nullableTypeAnnotation: Nullable<NativeModuleTypeAnnotation>,
70
+ ): boolean {
71
+ const [typeAnnotation] = unwrapNullable<NativeModuleTypeAnnotation>(
72
+ nullableTypeAnnotation,
73
+ );
74
+ return (
75
+ parentObjectAliasName !== undefined &&
76
+ typeAnnotation.type === 'ArrayTypeAnnotation' &&
77
+ typeAnnotation.elementType?.name === parentObjectAliasName
78
+ );
79
+ }
80
+
51
81
  function getAreEnumMembersInteger(members: NativeModuleEnumMembers): boolean {
52
82
  return !members.some(m => `${m.value}`.includes('.'));
53
83
  }
@@ -56,4 +86,6 @@ module.exports = {
56
86
  createAliasResolver,
57
87
  getModules,
58
88
  getAreEnumMembersInteger,
89
+ isDirectRecursiveMember,
90
+ isArrayRecursiveMember,
59
91
  };
@@ -708,10 +708,23 @@ export enum StringOptions {
708
708
  Three = 'three',
709
709
  }
710
710
 
711
+ export type BinaryTreeNode = {
712
+ left?: BinaryTreeNode,
713
+ value: number,
714
+ right?: BinaryTreeNode,
715
+ };
716
+
717
+ export type GraphNode = {
718
+ label: string,
719
+ neighbors?: Array<GraphNode>,
720
+ };
721
+
711
722
  export interface Spec extends TurboModule {
712
723
  +getCallback: () => () => void;
713
724
  +getMixed: (arg: mixed) => mixed;
714
725
  +getEnums: (quality: Quality, resolution?: Resolution, floppy: Floppy, stringOptions: StringOptions) => string;
726
+ +getBinaryTreeNode: (arg: BinaryTreeNode) => BinaryTreeNode;
727
+ +getGraphNode: (arg: GraphNode) => GraphNode;
715
728
  +getMap: (arg: {[a: string]: ?number}) => {[b: string]: ?number};
716
729
  +getAnotherMap: (arg: {[string]: string}) => {[string]: string};
717
730
  +getUnion: (chooseInt: ChooseInt, chooseFloat: ChooseFloat, chooseObject: ChooseObject, chooseString: ChooseString) => ChooseObject;
@@ -731,10 +731,23 @@ export enum StringOptions {
731
731
  Three = 'three',
732
732
  }
733
733
 
734
+ export type BinaryTreeNode = {
735
+ left?: BinaryTreeNode,
736
+ value: number,
737
+ right?: BinaryTreeNode,
738
+ };
739
+
740
+ export type GraphNode = {
741
+ label: string,
742
+ neighbors?: Array<GraphNode>,
743
+ };
744
+
734
745
  export interface Spec extends TurboModule {
735
746
  +getCallback: () => () => void;
736
747
  +getMixed: (arg: mixed) => mixed;
737
748
  +getEnums: (quality: Quality, resolution?: Resolution, floppy: Floppy, stringOptions: StringOptions) => string;
749
+ +getBinaryTreeNode: (arg: BinaryTreeNode) => BinaryTreeNode;
750
+ +getGraphNode: (arg: GraphNode) => GraphNode;
738
751
  +getMap: (arg: {[a: string]: ?number}) => {[b: string]: ?number};
739
752
  +getAnotherMap: (arg: {[string]: string}) => {[string]: string};
740
753
  +getUnion: (chooseInt: ChooseInt, chooseFloat: ChooseFloat, chooseObject: ChooseObject, chooseString: ChooseString) => ChooseObject;
@@ -231,6 +231,7 @@ function translateTypeAnnotation(
231
231
  .map(property => {
232
232
  return tryParse(() => {
233
233
  return parseObjectProperty(
234
+ flowTypeAnnotation,
234
235
  property,
235
236
  hasteModuleName,
236
237
  types,
@@ -176,6 +176,7 @@ function translateTypeAnnotation(
176
176
  property => {
177
177
  return tryParse(() => {
178
178
  return parseObjectProperty(
179
+ flowTypeAnnotation,
179
180
  property,
180
181
  hasteModuleName,
181
182
  types,
@@ -247,6 +247,7 @@ function isObjectProperty(property, language) {
247
247
  }
248
248
  }
249
249
  function parseObjectProperty(
250
+ parentObject,
250
251
  property,
251
252
  hasteModuleName,
252
253
  types,
@@ -266,6 +267,44 @@ function parseObjectProperty(
266
267
  language === 'TypeScript'
267
268
  ? property.typeAnnotation.typeAnnotation
268
269
  : property.value;
270
+
271
+ // Handle recursive types
272
+ if (parentObject) {
273
+ var _languageTypeAnnotati, _languageTypeAnnotati2;
274
+ const propertyType = parser.getResolveTypeAnnotationFN()(
275
+ languageTypeAnnotation,
276
+ types,
277
+ parser,
278
+ );
279
+ if (
280
+ propertyType.typeResolutionStatus.successful === true &&
281
+ propertyType.typeResolutionStatus.type === 'alias' &&
282
+ (language === 'TypeScript'
283
+ ? parentObject.typeName &&
284
+ parentObject.typeName.name ===
285
+ ((_languageTypeAnnotati = languageTypeAnnotation.typeName) ===
286
+ null || _languageTypeAnnotati === void 0
287
+ ? void 0
288
+ : _languageTypeAnnotati.name)
289
+ : parentObject.id &&
290
+ parentObject.id.name ===
291
+ ((_languageTypeAnnotati2 = languageTypeAnnotation.id) === null ||
292
+ _languageTypeAnnotati2 === void 0
293
+ ? void 0
294
+ : _languageTypeAnnotati2.name))
295
+ ) {
296
+ return {
297
+ name,
298
+ optional,
299
+ typeAnnotation: {
300
+ type: 'TypeAliasTypeAnnotation',
301
+ name: propertyType.typeResolutionStatus.name,
302
+ },
303
+ };
304
+ }
305
+ }
306
+
307
+ // Handle non-recursive types
269
308
  const _unwrapNullable = unwrapNullable(
270
309
  translateTypeAnnotation(
271
310
  hasteModuleName,
@@ -171,6 +171,7 @@ function isObjectProperty(property: $FlowFixMe, language: ParserType): boolean {
171
171
  }
172
172
 
173
173
  function parseObjectProperty(
174
+ parentObject?: $FlowFixMe,
174
175
  property: $FlowFixMe,
175
176
  hasteModuleName: string,
176
177
  types: TypeDeclarationMap,
@@ -191,6 +192,34 @@ function parseObjectProperty(
191
192
  ? property.typeAnnotation.typeAnnotation
192
193
  : property.value;
193
194
 
195
+ // Handle recursive types
196
+ if (parentObject) {
197
+ const propertyType = parser.getResolveTypeAnnotationFN()(
198
+ languageTypeAnnotation,
199
+ types,
200
+ parser,
201
+ );
202
+ if (
203
+ propertyType.typeResolutionStatus.successful === true &&
204
+ propertyType.typeResolutionStatus.type === 'alias' &&
205
+ (language === 'TypeScript'
206
+ ? parentObject.typeName &&
207
+ parentObject.typeName.name === languageTypeAnnotation.typeName?.name
208
+ : parentObject.id &&
209
+ parentObject.id.name === languageTypeAnnotation.id?.name)
210
+ ) {
211
+ return {
212
+ name,
213
+ optional,
214
+ typeAnnotation: {
215
+ type: 'TypeAliasTypeAnnotation',
216
+ name: propertyType.typeResolutionStatus.name,
217
+ },
218
+ };
219
+ }
220
+ }
221
+
222
+ // Handle non-recursive types
194
223
  const [propertyTypeAnnotation, isPropertyNullable] =
195
224
  unwrapNullable<$FlowFixMe>(
196
225
  translateTypeAnnotation(
@@ -796,10 +796,23 @@ export type ChooseFloat = 1.44 | 2.88 | 5.76;
796
796
  export type ChooseObject = {} | {low: string};
797
797
  export type ChooseString = 'One' | 'Two' | 'Three';
798
798
 
799
+ export type BinaryTreeNode = {
800
+ left?: BinaryTreeNode,
801
+ value: number,
802
+ right?: BinaryTreeNode,
803
+ };
804
+
805
+ export type GraphNode = {
806
+ label: string,
807
+ neighbors?: Array<GraphNode>,
808
+ };
809
+
799
810
  export interface Spec extends TurboModule {
800
811
  readonly getCallback: () => () => void;
801
812
  readonly getMixed: (arg: unknown) => unknown;
802
813
  readonly getEnums: (quality: Quality, resolution?: Resolution, floppy: Floppy, stringOptions: StringOptions) => string;
814
+ readonly getBinaryTreeNode: (arg: BinaryTreeNode) => BinaryTreeNode;
815
+ readonly getGraphNode: (arg: GraphNode) => GraphNode;
803
816
  readonly getMap: (arg: {[a: string]: number | null;}) => {[b: string]: number | null;};
804
817
  readonly getAnotherMap: (arg: {[key: string]: string}) => {[key: string]: string};
805
818
  readonly getUnion: (chooseInt: ChooseInt, chooseFloat: ChooseFloat, chooseObject: ChooseObject, chooseString: ChooseString) => ChooseObject;
@@ -825,10 +825,23 @@ export type ChooseFloat = 1.44 | 2.88 | 5.76;
825
825
  export type ChooseObject = {} | {low: string};
826
826
  export type ChooseString = 'One' | 'Two' | 'Three';
827
827
 
828
+ export type BinaryTreeNode = {
829
+ left?: BinaryTreeNode,
830
+ value: number,
831
+ right?: BinaryTreeNode,
832
+ };
833
+
834
+ export type GraphNode = {
835
+ label: string,
836
+ neighbors?: Array<GraphNode>,
837
+ };
838
+
828
839
  export interface Spec extends TurboModule {
829
840
  readonly getCallback: () => () => void;
830
841
  readonly getMixed: (arg: unknown) => unknown;
831
842
  readonly getEnums: (quality: Quality, resolution?: Resolution, floppy: Floppy, stringOptions: StringOptions) => string;
843
+ readonly getBinaryTreeNode: (arg: BinaryTreeNode) => BinaryTreeNode;
844
+ readonly getGraphNode: (arg: GraphNode) => GraphNode;
832
845
  readonly getMap: (arg: {[a: string]: number | null;}) => {[b: string]: number | null;};
833
846
  readonly getAnotherMap: (arg: {[key: string]: string}) => {[key: string]: string};
834
847
  readonly getUnion: (chooseInt: ChooseInt, chooseFloat: ChooseFloat, chooseObject: ChooseObject, chooseString: ChooseString) => ChooseObject;
@@ -36,6 +36,7 @@ function translateObjectTypeAnnotation(
36
36
  /**
37
37
  * TODO(T108222691): Use flow-types for @babel/parser
38
38
  */
39
+ typeScriptTypeAnnotation,
39
40
  nullable,
40
41
  objectMembers,
41
42
  typeResolutionStatus,
@@ -52,6 +53,7 @@ function translateObjectTypeAnnotation(
52
53
  .map(property => {
53
54
  return tryParse(() => {
54
55
  return parseObjectProperty(
56
+ typeScriptTypeAnnotation,
55
57
  property,
56
58
  hasteModuleName,
57
59
  types,
@@ -259,6 +261,7 @@ function translateTypeAnnotation(
259
261
  }
260
262
  return translateObjectTypeAnnotation(
261
263
  hasteModuleName,
264
+ typeScriptTypeAnnotation,
262
265
  nullable,
263
266
  flattenProperties([typeAnnotation], types, parser),
264
267
  typeResolutionStatus,
@@ -274,6 +277,7 @@ function translateTypeAnnotation(
274
277
  case 'TSIntersectionType': {
275
278
  return translateObjectTypeAnnotation(
276
279
  hasteModuleName,
280
+ typeScriptTypeAnnotation,
277
281
  nullable,
278
282
  flattenProperties(
279
283
  flattenIntersectionType(typeAnnotation, types),
@@ -316,6 +320,7 @@ function translateTypeAnnotation(
316
320
  }
317
321
  return translateObjectTypeAnnotation(
318
322
  hasteModuleName,
323
+ typeScriptTypeAnnotation,
319
324
  nullable,
320
325
  typeAnnotation.members,
321
326
  typeResolutionStatus,
@@ -50,6 +50,7 @@ function translateObjectTypeAnnotation(
50
50
  /**
51
51
  * TODO(T108222691): Use flow-types for @babel/parser
52
52
  */
53
+ typeScriptTypeAnnotation: $FlowFixMe,
53
54
  nullable: boolean,
54
55
  objectMembers: $ReadOnlyArray<$FlowFixMe>,
55
56
  typeResolutionStatus: TypeResolutionStatus,
@@ -66,6 +67,7 @@ function translateObjectTypeAnnotation(
66
67
  .map<?NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>>(property => {
67
68
  return tryParse(() => {
68
69
  return parseObjectProperty(
70
+ typeScriptTypeAnnotation,
69
71
  property,
70
72
  hasteModuleName,
71
73
  types,
@@ -266,6 +268,7 @@ function translateTypeAnnotation(
266
268
 
267
269
  return translateObjectTypeAnnotation(
268
270
  hasteModuleName,
271
+ typeScriptTypeAnnotation,
269
272
  nullable,
270
273
  flattenProperties([typeAnnotation], types, parser),
271
274
  typeResolutionStatus,
@@ -281,6 +284,7 @@ function translateTypeAnnotation(
281
284
  case 'TSIntersectionType': {
282
285
  return translateObjectTypeAnnotation(
283
286
  hasteModuleName,
287
+ typeScriptTypeAnnotation,
284
288
  nullable,
285
289
  flattenProperties(
286
290
  flattenIntersectionType(typeAnnotation, types),
@@ -324,6 +328,7 @@ function translateTypeAnnotation(
324
328
 
325
329
  return translateObjectTypeAnnotation(
326
330
  hasteModuleName,
331
+ typeScriptTypeAnnotation,
327
332
  nullable,
328
333
  typeAnnotation.members,
329
334
  typeResolutionStatus,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-native/codegen",
3
- "version": "0.74.0-nightly-20231203-385473522",
3
+ "version": "0.74.0-nightly-20231204-e9b80971c",
4
4
  "description": "Code generation tools for React Native",
5
5
  "license": "MIT",
6
6
  "repository": {