@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.
- package/lib/generators/modules/GenerateModuleH.js +60 -16
- package/lib/generators/modules/GenerateModuleH.js.flow +56 -11
- package/lib/generators/modules/Utils.js +98 -0
- package/lib/generators/modules/Utils.js.flow +32 -0
- package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js +13 -0
- package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js.flow +13 -0
- package/lib/parsers/flow/modules/index.js +1 -0
- package/lib/parsers/flow/modules/index.js.flow +1 -0
- package/lib/parsers/parsers-commons.js +39 -0
- package/lib/parsers/parsers-commons.js.flow +29 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js +13 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js.flow +13 -0
- package/lib/parsers/typescript/modules/index.js +5 -0
- package/lib/parsers/typescript/modules/index.js.flow +5 -0
- package/package.json +1 -1
|
@@ -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
|
|
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
|
-
|
|
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
|
-
${
|
|
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
|
-
(
|
|
387
|
-
`
|
|
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(
|
|
404
|
-
if (v.
|
|
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
|
|
525
|
-
|
|
526
|
-
propTypeAnnotation =
|
|
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
|
|
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
|
-
|
|
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
|
-
${
|
|
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
|
-
(
|
|
361
|
-
`
|
|
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(
|
|
378
|
-
if (v.
|
|
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;
|
|
@@ -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,
|