@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.
- package/README.md +2 -2
- package/lib/CodegenSchema.d.ts +15 -4
- package/lib/CodegenSchema.js.flow +33 -21
- package/lib/cli/combine/combine-js-to-schema-cli.js +7 -1
- package/lib/cli/combine/combine-js-to-schema-cli.js.flow +7 -1
- package/lib/generators/components/CppHelpers.js +39 -2
- package/lib/generators/components/CppHelpers.js.flow +54 -5
- package/lib/generators/components/GenerateEventEmitterCpp.js +222 -28
- package/lib/generators/components/GenerateEventEmitterCpp.js.flow +221 -34
- package/lib/generators/components/GenerateEventEmitterH.js +77 -26
- package/lib/generators/components/GenerateEventEmitterH.js.flow +87 -30
- package/lib/generators/components/GeneratePropsH.js +2 -3
- package/lib/generators/components/GeneratePropsH.js.flow +2 -3
- package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js +0 -1
- package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +3 -5
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +4 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +4 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +2 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +2 -0
- package/lib/generators/components/__test_fixtures__/fixtures.js +114 -1
- package/lib/generators/components/__test_fixtures__/fixtures.js.flow +114 -1
- package/lib/generators/modules/GenerateModuleCpp.js +1 -1
- package/lib/generators/modules/GenerateModuleCpp.js.flow +1 -1
- package/lib/generators/modules/GenerateModuleH.js +44 -39
- package/lib/generators/modules/GenerateModuleH.js.flow +51 -39
- package/lib/generators/modules/GenerateModuleJavaSpec.js +9 -7
- package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +10 -6
- package/lib/generators/modules/GenerateModuleJniH.js +1 -1
- package/lib/generators/modules/GenerateModuleJniH.js.flow +1 -1
- package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js +11 -3
- package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +13 -3
- package/lib/parsers/error-utils.js +44 -0
- package/lib/parsers/error-utils.js.flow +59 -0
- package/lib/parsers/errors.js +3 -9
- package/lib/parsers/errors.js.flow +3 -9
- package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +51 -0
- package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +51 -0
- package/lib/parsers/flow/components/componentsUtils.js +22 -33
- package/lib/parsers/flow/components/componentsUtils.js.flow +24 -45
- package/lib/parsers/flow/components/events.js +151 -128
- package/lib/parsers/flow/components/events.js.flow +161 -136
- package/lib/parsers/flow/components/index.js +13 -94
- package/lib/parsers/flow/components/index.js.flow +5 -102
- package/lib/parsers/flow/modules/index.js +24 -24
- package/lib/parsers/flow/modules/index.js.flow +6 -6
- package/lib/parsers/flow/parser.d.ts +9 -2
- package/lib/parsers/flow/parser.js +179 -18
- package/lib/parsers/flow/parser.js.flow +231 -7
- package/lib/parsers/flow/utils.js +0 -63
- package/lib/parsers/flow/utils.js.flow +1 -77
- package/lib/parsers/parser.js.flow +176 -3
- package/lib/parsers/parserMock.js +202 -4
- package/lib/parsers/parserMock.js.flow +253 -4
- package/lib/parsers/parsers-commons.js +268 -10
- package/lib/parsers/parsers-commons.js.flow +365 -12
- package/lib/parsers/parsers-primitives.js +95 -1
- package/lib/parsers/parsers-primitives.js.flow +136 -1
- package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +51 -0
- package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +51 -0
- package/lib/parsers/typescript/components/componentsUtils.js +49 -57
- package/lib/parsers/typescript/components/componentsUtils.js.flow +48 -66
- package/lib/parsers/typescript/components/events.js +136 -115
- package/lib/parsers/typescript/components/events.js.flow +148 -119
- package/lib/parsers/typescript/components/extends.js +2 -49
- package/lib/parsers/typescript/components/extends.js.flow +1 -55
- package/lib/parsers/typescript/components/index.js +14 -99
- package/lib/parsers/typescript/components/index.js.flow +6 -106
- package/lib/parsers/typescript/modules/index.js +28 -26
- package/lib/parsers/typescript/modules/index.js.flow +9 -8
- package/lib/parsers/typescript/parser.d.ts +9 -2
- package/lib/parsers/typescript/parser.js +208 -14
- package/lib/parsers/typescript/parser.js.flow +247 -8
- package/lib/parsers/utils.js.flow +6 -0
- package/package.json +27 -16
- package/lib/parsers/flow/components/extends.js +0 -52
- package/lib/parsers/flow/components/extends.js.flow +0 -66
- package/lib/parsers/flow/components/props.js +0 -47
- package/lib/parsers/flow/components/props.js.flow +0 -60
- package/lib/parsers/typescript/components/props.js +0 -39
- package/lib/parsers/typescript/components/props.js.flow +0 -48
- package/lib/parsers/typescript/utils.js +0 -90
- package/lib/parsers/typescript/utils.js.flow +0 -104
|
@@ -10,8 +10,17 @@
|
|
|
10
10
|
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
import type {
|
|
13
|
+
import type {
|
|
14
|
+
GetSchemaInfoFN,
|
|
15
|
+
GetTypeAnnotationFN,
|
|
16
|
+
Parser,
|
|
17
|
+
ResolveTypeAnnotationFN,
|
|
18
|
+
} from './parser';
|
|
14
19
|
import type {ParserType} from './errors';
|
|
20
|
+
type ExtendsForProp = null | {
|
|
21
|
+
type: 'ReactNativeBuiltInType',
|
|
22
|
+
knownTypeName: 'ReactNativeCoreViewProps',
|
|
23
|
+
};
|
|
15
24
|
import type {
|
|
16
25
|
UnionTypeAnnotationMemberType,
|
|
17
26
|
SchemaType,
|
|
@@ -22,8 +31,20 @@ import type {
|
|
|
22
31
|
NativeModuleEnumMembers,
|
|
23
32
|
NativeModuleAliasMap,
|
|
24
33
|
NativeModuleEnumMap,
|
|
34
|
+
PropTypeAnnotation,
|
|
35
|
+
ExtendsPropsShape,
|
|
25
36
|
} from '../CodegenSchema';
|
|
26
|
-
import type {
|
|
37
|
+
import type {
|
|
38
|
+
ParserErrorCapturer,
|
|
39
|
+
PropAST,
|
|
40
|
+
TypeDeclarationMap,
|
|
41
|
+
TypeResolutionStatus,
|
|
42
|
+
} from './utils';
|
|
43
|
+
import invariant from 'invariant';
|
|
44
|
+
|
|
45
|
+
const {flattenProperties} = require('./typescript/components/componentsUtils');
|
|
46
|
+
|
|
47
|
+
const {buildPropSchema} = require('./parsers-commons');
|
|
27
48
|
|
|
28
49
|
// $FlowFixMe[untyped-import] there's no flowtype flow-parser
|
|
29
50
|
const flowParser = require('flow-parser');
|
|
@@ -49,6 +70,11 @@ const schemaMock = {
|
|
|
49
70
|
|
|
50
71
|
export class MockedParser implements Parser {
|
|
51
72
|
typeParameterInstantiation: string = 'TypeParameterInstantiation';
|
|
73
|
+
typeAlias: string = 'TypeAlias';
|
|
74
|
+
enumDeclaration: string = 'EnumDeclaration';
|
|
75
|
+
interfaceDeclaration: string = 'InterfaceDeclaration';
|
|
76
|
+
nullLiteralTypeAnnotation: string = 'NullLiteralTypeAnnotation';
|
|
77
|
+
undefinedLiteralTypeAnnotation: string = 'VoidLiteralTypeAnnotation';
|
|
52
78
|
|
|
53
79
|
isProperty(property: $FlowFixMe): boolean {
|
|
54
80
|
return property.type === 'ObjectTypeProperty';
|
|
@@ -70,8 +96,8 @@ export class MockedParser implements Parser {
|
|
|
70
96
|
return 'Flow';
|
|
71
97
|
}
|
|
72
98
|
|
|
73
|
-
|
|
74
|
-
return typeAnnotation
|
|
99
|
+
getTypeAnnotationName(typeAnnotation: $FlowFixMe): string {
|
|
100
|
+
return typeAnnotation?.id?.name;
|
|
75
101
|
}
|
|
76
102
|
|
|
77
103
|
checkIfInvalidModule(typeArguments: $FlowFixMe): boolean {
|
|
@@ -243,4 +269,227 @@ export class MockedParser implements Parser {
|
|
|
243
269
|
convertKeywordToTypeAnnotation(keyword: string): string {
|
|
244
270
|
return keyword;
|
|
245
271
|
}
|
|
272
|
+
|
|
273
|
+
argumentForProp(prop: PropAST): $FlowFixMe {
|
|
274
|
+
return prop.expression;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
nameForArgument(prop: PropAST): $FlowFixMe {
|
|
278
|
+
return prop.expression.name;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
isOptionalProperty(property: $FlowFixMe): boolean {
|
|
282
|
+
return property.optional || false;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
getTypeAnnotationFromProperty(property: PropAST): $FlowFixMe {
|
|
286
|
+
return property.typeAnnotation.typeAnnotation;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
getGetTypeAnnotationFN(): GetTypeAnnotationFN {
|
|
290
|
+
return () => {
|
|
291
|
+
return {};
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
getGetSchemaInfoFN(): GetSchemaInfoFN {
|
|
296
|
+
return () => {
|
|
297
|
+
return {
|
|
298
|
+
name: 'MockedSchema',
|
|
299
|
+
optional: false,
|
|
300
|
+
typeAnnotation: 'BooleanTypeAnnotation',
|
|
301
|
+
defaultValue: false,
|
|
302
|
+
withNullDefault: false,
|
|
303
|
+
};
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
getResolveTypeAnnotationFN(): ResolveTypeAnnotationFN {
|
|
308
|
+
return () => {
|
|
309
|
+
return {
|
|
310
|
+
nullable: false,
|
|
311
|
+
typeAnnotation: null,
|
|
312
|
+
typeResolutionStatus: {successful: false},
|
|
313
|
+
};
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
getResolvedTypeAnnotation(
|
|
318
|
+
typeAnnotation: $FlowFixMe,
|
|
319
|
+
types: TypeDeclarationMap,
|
|
320
|
+
): {
|
|
321
|
+
nullable: boolean,
|
|
322
|
+
typeAnnotation: $FlowFixMe,
|
|
323
|
+
typeResolutionStatus: TypeResolutionStatus,
|
|
324
|
+
} {
|
|
325
|
+
invariant(
|
|
326
|
+
typeAnnotation != null,
|
|
327
|
+
'resolveTypeAnnotation(): typeAnnotation cannot be null',
|
|
328
|
+
);
|
|
329
|
+
|
|
330
|
+
let node = typeAnnotation;
|
|
331
|
+
let nullable = false;
|
|
332
|
+
let typeResolutionStatus: TypeResolutionStatus = {
|
|
333
|
+
successful: false,
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
for (;;) {
|
|
337
|
+
if (node.type === 'NullableTypeAnnotation') {
|
|
338
|
+
nullable = true;
|
|
339
|
+
node = node.typeAnnotation;
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if (node.type !== 'GenericTypeAnnotation') {
|
|
344
|
+
break;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
const resolvedTypeAnnotation = types[node.id.name];
|
|
348
|
+
if (resolvedTypeAnnotation == null) {
|
|
349
|
+
break;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
switch (resolvedTypeAnnotation.type) {
|
|
353
|
+
case 'TypeAlias': {
|
|
354
|
+
typeResolutionStatus = {
|
|
355
|
+
successful: true,
|
|
356
|
+
type: 'alias',
|
|
357
|
+
name: node.id.name,
|
|
358
|
+
};
|
|
359
|
+
node = resolvedTypeAnnotation.right;
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
362
|
+
case 'EnumDeclaration': {
|
|
363
|
+
typeResolutionStatus = {
|
|
364
|
+
successful: true,
|
|
365
|
+
type: 'enum',
|
|
366
|
+
name: node.id.name,
|
|
367
|
+
};
|
|
368
|
+
node = resolvedTypeAnnotation.body;
|
|
369
|
+
break;
|
|
370
|
+
}
|
|
371
|
+
default: {
|
|
372
|
+
throw new TypeError(
|
|
373
|
+
`A non GenericTypeAnnotation must be a type declaration ('TypeAlias') or enum ('EnumDeclaration'). Instead, got the unsupported ${resolvedTypeAnnotation.type}.`,
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
return {
|
|
380
|
+
nullable: nullable,
|
|
381
|
+
typeAnnotation: node,
|
|
382
|
+
typeResolutionStatus,
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
getExtendsProps(
|
|
387
|
+
typeDefinition: $ReadOnlyArray<PropAST>,
|
|
388
|
+
types: TypeDeclarationMap,
|
|
389
|
+
): $ReadOnlyArray<ExtendsPropsShape> {
|
|
390
|
+
return typeDefinition
|
|
391
|
+
.filter(prop => prop.type === 'ObjectTypeSpreadProperty')
|
|
392
|
+
.map(prop => this.extendsForProp(prop, types, this))
|
|
393
|
+
.filter(Boolean);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
extendsForProp(
|
|
397
|
+
prop: PropAST,
|
|
398
|
+
types: TypeDeclarationMap,
|
|
399
|
+
parser: Parser,
|
|
400
|
+
): ExtendsForProp {
|
|
401
|
+
const argument = this.argumentForProp(prop);
|
|
402
|
+
if (!argument) {
|
|
403
|
+
console.log('null', prop);
|
|
404
|
+
}
|
|
405
|
+
const name = parser.nameForArgument(prop);
|
|
406
|
+
|
|
407
|
+
if (types[name] != null) {
|
|
408
|
+
// This type is locally defined in the file
|
|
409
|
+
return null;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
switch (name) {
|
|
413
|
+
case 'ViewProps':
|
|
414
|
+
return {
|
|
415
|
+
type: 'ReactNativeBuiltInType',
|
|
416
|
+
knownTypeName: 'ReactNativeCoreViewProps',
|
|
417
|
+
};
|
|
418
|
+
default: {
|
|
419
|
+
throw new Error(`Unable to handle prop spread: ${name}`);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
removeKnownExtends(
|
|
425
|
+
typeDefinition: $ReadOnlyArray<PropAST>,
|
|
426
|
+
types: TypeDeclarationMap,
|
|
427
|
+
): $ReadOnlyArray<PropAST> {
|
|
428
|
+
return typeDefinition.filter(
|
|
429
|
+
prop =>
|
|
430
|
+
prop.type !== 'ObjectTypeSpreadProperty' ||
|
|
431
|
+
this.extendsForProp(prop, types, this) === null,
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
getProps(
|
|
436
|
+
typeDefinition: $ReadOnlyArray<PropAST>,
|
|
437
|
+
types: TypeDeclarationMap,
|
|
438
|
+
): {
|
|
439
|
+
props: $ReadOnlyArray<NamedShape<PropTypeAnnotation>>,
|
|
440
|
+
extendsProps: $ReadOnlyArray<ExtendsPropsShape>,
|
|
441
|
+
} {
|
|
442
|
+
const nonExtendsProps = this.removeKnownExtends(typeDefinition, types);
|
|
443
|
+
const props = flattenProperties(nonExtendsProps, types, this)
|
|
444
|
+
.map(property => buildPropSchema(property, types, this))
|
|
445
|
+
.filter(Boolean);
|
|
446
|
+
|
|
447
|
+
return {
|
|
448
|
+
props,
|
|
449
|
+
extendsProps: this.getExtendsProps(typeDefinition, types),
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
getProperties(typeName: string, types: TypeDeclarationMap): $FlowFixMe {
|
|
454
|
+
const typeAlias = types[typeName];
|
|
455
|
+
try {
|
|
456
|
+
return typeAlias.right.typeParameters.params[0].properties;
|
|
457
|
+
} catch (e) {
|
|
458
|
+
throw new Error(
|
|
459
|
+
`Failed to find type definition for "${typeName}", please check that you have a valid codegen flow file`,
|
|
460
|
+
);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
nextNodeForTypeAlias(typeAnnotation: $FlowFixMe): $FlowFixMe {
|
|
465
|
+
return typeAnnotation.right;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
nextNodeForEnum(typeAnnotation: $FlowFixMe): $FlowFixMe {
|
|
469
|
+
return typeAnnotation.body;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
genericTypeAnnotationErrorMessage(typeAnnotation: $FlowFixMe): string {
|
|
473
|
+
return `A non GenericTypeAnnotation must be a type declaration ('${this.typeAlias}') or enum ('${this.enumDeclaration}'). Instead, got the unsupported ${typeAnnotation.type}.`;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
extractTypeFromTypeAnnotation(typeAnnotation: $FlowFixMe): string {
|
|
477
|
+
return typeAnnotation.type === 'GenericTypeAnnotation'
|
|
478
|
+
? typeAnnotation.id.name
|
|
479
|
+
: typeAnnotation.type;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
getObjectProperties(typeAnnotation: $FlowFixMe): $FlowFixMe {
|
|
483
|
+
return typeAnnotation.properties;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
getLiteralValue(option: $FlowFixMe): $FlowFixMe {
|
|
487
|
+
return option.value;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
getPaperTopLevelNameDeprecated(typeAnnotation: $FlowFixMe): $FlowFixMe {
|
|
491
|
+
return typeAnnotation.typeParameters.params.length > 1
|
|
492
|
+
? typeAnnotation.typeParameters.params[1].value
|
|
493
|
+
: null;
|
|
494
|
+
}
|
|
246
495
|
}
|
|
@@ -169,7 +169,12 @@ const _require2 = require('./error-utils'),
|
|
|
169
169
|
throwIfModuleInterfaceNotFound = _require2.throwIfModuleInterfaceNotFound,
|
|
170
170
|
throwIfMoreThanOneModuleInterfaceParserError =
|
|
171
171
|
_require2.throwIfMoreThanOneModuleInterfaceParserError,
|
|
172
|
-
throwIfModuleInterfaceIsMisnamed = _require2.throwIfModuleInterfaceIsMisnamed
|
|
172
|
+
throwIfModuleInterfaceIsMisnamed = _require2.throwIfModuleInterfaceIsMisnamed,
|
|
173
|
+
throwIfMoreThanOneCodegenNativecommands =
|
|
174
|
+
_require2.throwIfMoreThanOneCodegenNativecommands,
|
|
175
|
+
throwIfConfigNotfound = _require2.throwIfConfigNotfound,
|
|
176
|
+
throwIfMoreThanOneConfig = _require2.throwIfMoreThanOneConfig,
|
|
177
|
+
throwIfTypeAliasIsNotInterface = _require2.throwIfTypeAliasIsNotInterface;
|
|
173
178
|
const _require3 = require('./errors'),
|
|
174
179
|
MissingTypeParameterGenericParserError =
|
|
175
180
|
_require3.MissingTypeParameterGenericParserError,
|
|
@@ -184,12 +189,16 @@ function wrapModuleSchema(nativeModuleSchema, hasteModuleName) {
|
|
|
184
189
|
},
|
|
185
190
|
};
|
|
186
191
|
}
|
|
192
|
+
|
|
193
|
+
// $FlowFixMe[unsupported-variance-annotation]
|
|
187
194
|
function unwrapNullable(x) {
|
|
188
195
|
if (x.type === 'NullableTypeAnnotation') {
|
|
189
196
|
return [x.typeAnnotation, true];
|
|
190
197
|
}
|
|
191
198
|
return [x, false];
|
|
192
199
|
}
|
|
200
|
+
|
|
201
|
+
// $FlowFixMe[unsupported-variance-annotation]
|
|
193
202
|
function wrapNullable(nullable, typeAnnotation) {
|
|
194
203
|
if (!nullable) {
|
|
195
204
|
return typeAnnotation;
|
|
@@ -395,7 +404,6 @@ function buildPropertySchema(
|
|
|
395
404
|
enumMap,
|
|
396
405
|
tryParse,
|
|
397
406
|
cxxOnly,
|
|
398
|
-
resolveTypeAnnotation,
|
|
399
407
|
translateTypeAnnotation,
|
|
400
408
|
parser,
|
|
401
409
|
) {
|
|
@@ -409,7 +417,8 @@ function buildPropertySchema(
|
|
|
409
417
|
? property
|
|
410
418
|
: property.typeAnnotation;
|
|
411
419
|
}
|
|
412
|
-
|
|
420
|
+
const resolveTypeAnnotationFN = parser.getResolveTypeAnnotationFN();
|
|
421
|
+
var _resolveTypeAnnotatio = resolveTypeAnnotationFN(value, types, parser);
|
|
413
422
|
nullable = _resolveTypeAnnotatio.nullable;
|
|
414
423
|
value = _resolveTypeAnnotatio.typeAnnotation;
|
|
415
424
|
throwIfModuleTypeIsUnsupported(
|
|
@@ -446,7 +455,6 @@ function buildSchemaFromConfigType(
|
|
|
446
455
|
buildComponentSchema,
|
|
447
456
|
buildModuleSchema,
|
|
448
457
|
parser,
|
|
449
|
-
resolveTypeAnnotation,
|
|
450
458
|
translateTypeAnnotation,
|
|
451
459
|
) {
|
|
452
460
|
switch (configType) {
|
|
@@ -468,7 +476,6 @@ function buildSchemaFromConfigType(
|
|
|
468
476
|
ast,
|
|
469
477
|
tryParse,
|
|
470
478
|
parser,
|
|
471
|
-
resolveTypeAnnotation,
|
|
472
479
|
translateTypeAnnotation,
|
|
473
480
|
),
|
|
474
481
|
);
|
|
@@ -503,7 +510,6 @@ function buildSchema(
|
|
|
503
510
|
buildModuleSchema,
|
|
504
511
|
Visitor,
|
|
505
512
|
parser,
|
|
506
|
-
resolveTypeAnnotation,
|
|
507
513
|
translateTypeAnnotation,
|
|
508
514
|
) {
|
|
509
515
|
// Early return for non-Spec JavaScript files
|
|
@@ -525,7 +531,6 @@ function buildSchema(
|
|
|
525
531
|
buildComponentSchema,
|
|
526
532
|
buildModuleSchema,
|
|
527
533
|
parser,
|
|
528
|
-
resolveTypeAnnotation,
|
|
529
534
|
translateTypeAnnotation,
|
|
530
535
|
);
|
|
531
536
|
}
|
|
@@ -600,7 +605,6 @@ const buildModuleSchema = (
|
|
|
600
605
|
ast,
|
|
601
606
|
tryParse,
|
|
602
607
|
parser,
|
|
603
|
-
resolveTypeAnnotation,
|
|
604
608
|
translateTypeAnnotation,
|
|
605
609
|
) => {
|
|
606
610
|
const language = parser.language();
|
|
@@ -658,7 +662,6 @@ const buildModuleSchema = (
|
|
|
658
662
|
enumMap,
|
|
659
663
|
tryParse,
|
|
660
664
|
cxxOnly,
|
|
661
|
-
resolveTypeAnnotation,
|
|
662
665
|
translateTypeAnnotation,
|
|
663
666
|
parser,
|
|
664
667
|
),
|
|
@@ -812,7 +815,7 @@ function getCommandTypeNameAndOptionsExpression(namedExport, parser) {
|
|
|
812
815
|
);
|
|
813
816
|
}
|
|
814
817
|
return {
|
|
815
|
-
commandTypeName: parser.
|
|
818
|
+
commandTypeName: parser.getTypeAnnotationName(typeArgumentParam),
|
|
816
819
|
commandOptionsExpression: callExpression.arguments[0],
|
|
817
820
|
};
|
|
818
821
|
}
|
|
@@ -821,6 +824,250 @@ function propertyNames(properties) {
|
|
|
821
824
|
.map(property => property && property.key && property.key.name)
|
|
822
825
|
.filter(Boolean);
|
|
823
826
|
}
|
|
827
|
+
function extendsForProp(prop, types, parser) {
|
|
828
|
+
const argument = parser.argumentForProp(prop);
|
|
829
|
+
if (!argument) {
|
|
830
|
+
console.log('null', prop);
|
|
831
|
+
}
|
|
832
|
+
const name = parser.nameForArgument(prop);
|
|
833
|
+
if (types[name] != null) {
|
|
834
|
+
// This type is locally defined in the file
|
|
835
|
+
return null;
|
|
836
|
+
}
|
|
837
|
+
switch (name) {
|
|
838
|
+
case 'ViewProps':
|
|
839
|
+
return {
|
|
840
|
+
type: 'ReactNativeBuiltInType',
|
|
841
|
+
knownTypeName: 'ReactNativeCoreViewProps',
|
|
842
|
+
};
|
|
843
|
+
default: {
|
|
844
|
+
throw new Error(`Unable to handle prop spread: ${name}`);
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
function buildPropSchema(property, types, parser) {
|
|
849
|
+
const getSchemaInfoFN = parser.getGetSchemaInfoFN();
|
|
850
|
+
const info = getSchemaInfoFN(property, types);
|
|
851
|
+
if (info == null) {
|
|
852
|
+
return null;
|
|
853
|
+
}
|
|
854
|
+
const name = info.name,
|
|
855
|
+
optional = info.optional,
|
|
856
|
+
typeAnnotation = info.typeAnnotation,
|
|
857
|
+
defaultValue = info.defaultValue,
|
|
858
|
+
withNullDefault = info.withNullDefault;
|
|
859
|
+
const getTypeAnnotationFN = parser.getGetTypeAnnotationFN();
|
|
860
|
+
return {
|
|
861
|
+
name,
|
|
862
|
+
optional,
|
|
863
|
+
typeAnnotation: getTypeAnnotationFN(
|
|
864
|
+
name,
|
|
865
|
+
typeAnnotation,
|
|
866
|
+
defaultValue,
|
|
867
|
+
withNullDefault,
|
|
868
|
+
types,
|
|
869
|
+
parser,
|
|
870
|
+
buildPropSchema,
|
|
871
|
+
),
|
|
872
|
+
};
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
876
|
+
* LTI update could not be added via codemod */
|
|
877
|
+
function getEventArgument(argumentProps, parser, getPropertyType) {
|
|
878
|
+
return {
|
|
879
|
+
type: 'ObjectTypeAnnotation',
|
|
880
|
+
properties: argumentProps.map(member =>
|
|
881
|
+
buildPropertiesForEvent(member, parser, getPropertyType),
|
|
882
|
+
),
|
|
883
|
+
};
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
/* $FlowFixMe[signature-verification-failure] there's no flowtype for AST.
|
|
887
|
+
* TODO(T108222691): Use flow-types for @babel/parser */
|
|
888
|
+
function findComponentConfig(ast, parser) {
|
|
889
|
+
const foundConfigs = [];
|
|
890
|
+
const defaultExports = ast.body.filter(
|
|
891
|
+
node => node.type === 'ExportDefaultDeclaration',
|
|
892
|
+
);
|
|
893
|
+
defaultExports.forEach(statement => {
|
|
894
|
+
findNativeComponentType(statement, foundConfigs, parser);
|
|
895
|
+
});
|
|
896
|
+
throwIfConfigNotfound(foundConfigs);
|
|
897
|
+
throwIfMoreThanOneConfig(foundConfigs);
|
|
898
|
+
const foundConfig = foundConfigs[0];
|
|
899
|
+
const namedExports = ast.body.filter(
|
|
900
|
+
node => node.type === 'ExportNamedDeclaration',
|
|
901
|
+
);
|
|
902
|
+
const commandsTypeNames = namedExports
|
|
903
|
+
.map(statement => getCommandTypeNameAndOptionsExpression(statement, parser))
|
|
904
|
+
.filter(Boolean);
|
|
905
|
+
throwIfMoreThanOneCodegenNativecommands(commandsTypeNames);
|
|
906
|
+
return createComponentConfig(foundConfig, commandsTypeNames);
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
// $FlowFixMe[signature-verification-failure] there's no flowtype for AST
|
|
910
|
+
function getCommandProperties(ast, parser) {
|
|
911
|
+
const _findComponentConfig = findComponentConfig(ast, parser),
|
|
912
|
+
commandTypeName = _findComponentConfig.commandTypeName,
|
|
913
|
+
commandOptionsExpression = _findComponentConfig.commandOptionsExpression;
|
|
914
|
+
if (commandTypeName == null) {
|
|
915
|
+
return [];
|
|
916
|
+
}
|
|
917
|
+
const types = parser.getTypes(ast);
|
|
918
|
+
const typeAlias = types[commandTypeName];
|
|
919
|
+
throwIfTypeAliasIsNotInterface(typeAlias, parser);
|
|
920
|
+
const properties = parser.bodyProperties(typeAlias);
|
|
921
|
+
if (!properties) {
|
|
922
|
+
throw new Error(
|
|
923
|
+
`Failed to find type definition for "${commandTypeName}", please check that you have a valid codegen file`,
|
|
924
|
+
);
|
|
925
|
+
}
|
|
926
|
+
const commandPropertyNames = propertyNames(properties);
|
|
927
|
+
const commandOptions = getCommandOptions(commandOptionsExpression);
|
|
928
|
+
if (commandOptions == null || commandOptions.supportedCommands == null) {
|
|
929
|
+
throw new Error(
|
|
930
|
+
'codegenNativeCommands must be given an options object with supportedCommands array',
|
|
931
|
+
);
|
|
932
|
+
}
|
|
933
|
+
if (
|
|
934
|
+
commandOptions.supportedCommands.length !== commandPropertyNames.length ||
|
|
935
|
+
!commandOptions.supportedCommands.every(supportedCommand =>
|
|
936
|
+
commandPropertyNames.includes(supportedCommand),
|
|
937
|
+
)
|
|
938
|
+
) {
|
|
939
|
+
throw new Error(
|
|
940
|
+
`codegenNativeCommands expected the same supportedCommands specified in the ${commandTypeName} interface: ${commandPropertyNames.join(
|
|
941
|
+
', ',
|
|
942
|
+
)}`,
|
|
943
|
+
);
|
|
944
|
+
}
|
|
945
|
+
return properties;
|
|
946
|
+
}
|
|
947
|
+
function getTypeResolutionStatus(type, typeAnnotation, parser) {
|
|
948
|
+
return {
|
|
949
|
+
successful: true,
|
|
950
|
+
type,
|
|
951
|
+
name: parser.getTypeAnnotationName(typeAnnotation),
|
|
952
|
+
};
|
|
953
|
+
}
|
|
954
|
+
function handleGenericTypeAnnotation(
|
|
955
|
+
typeAnnotation,
|
|
956
|
+
resolvedTypeAnnotation,
|
|
957
|
+
parser,
|
|
958
|
+
) {
|
|
959
|
+
let typeResolutionStatus;
|
|
960
|
+
let node;
|
|
961
|
+
switch (resolvedTypeAnnotation.type) {
|
|
962
|
+
case parser.typeAlias: {
|
|
963
|
+
typeResolutionStatus = getTypeResolutionStatus(
|
|
964
|
+
'alias',
|
|
965
|
+
typeAnnotation,
|
|
966
|
+
parser,
|
|
967
|
+
);
|
|
968
|
+
node = parser.nextNodeForTypeAlias(resolvedTypeAnnotation);
|
|
969
|
+
break;
|
|
970
|
+
}
|
|
971
|
+
case parser.enumDeclaration: {
|
|
972
|
+
typeResolutionStatus = getTypeResolutionStatus(
|
|
973
|
+
'enum',
|
|
974
|
+
typeAnnotation,
|
|
975
|
+
parser,
|
|
976
|
+
);
|
|
977
|
+
node = parser.nextNodeForEnum(resolvedTypeAnnotation);
|
|
978
|
+
break;
|
|
979
|
+
}
|
|
980
|
+
// parser.interfaceDeclaration is not used here because for flow it should fall through to default case and throw an error
|
|
981
|
+
case 'TSInterfaceDeclaration': {
|
|
982
|
+
typeResolutionStatus = getTypeResolutionStatus(
|
|
983
|
+
'alias',
|
|
984
|
+
typeAnnotation,
|
|
985
|
+
parser,
|
|
986
|
+
);
|
|
987
|
+
node = resolvedTypeAnnotation;
|
|
988
|
+
break;
|
|
989
|
+
}
|
|
990
|
+
default: {
|
|
991
|
+
throw new TypeError(
|
|
992
|
+
parser.genericTypeAnnotationErrorMessage(resolvedTypeAnnotation),
|
|
993
|
+
);
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
return {
|
|
997
|
+
typeAnnotation: node,
|
|
998
|
+
typeResolutionStatus,
|
|
999
|
+
};
|
|
1000
|
+
}
|
|
1001
|
+
function buildPropertiesForEvent(property, parser, getPropertyType) {
|
|
1002
|
+
const name = property.key.name;
|
|
1003
|
+
const optional = parser.isOptionalProperty(property);
|
|
1004
|
+
const typeAnnotation = parser.getTypeAnnotationFromProperty(property);
|
|
1005
|
+
return getPropertyType(name, optional, typeAnnotation, parser);
|
|
1006
|
+
}
|
|
1007
|
+
function verifyPropNotAlreadyDefined(props, needleProp) {
|
|
1008
|
+
const propName = needleProp.key.name;
|
|
1009
|
+
const foundProp = props.some(prop => prop.key.name === propName);
|
|
1010
|
+
if (foundProp) {
|
|
1011
|
+
throw new Error(`A prop was already defined with the name ${propName}`);
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
function handleEventHandler(
|
|
1015
|
+
name,
|
|
1016
|
+
typeAnnotation,
|
|
1017
|
+
parser,
|
|
1018
|
+
types,
|
|
1019
|
+
findEventArgumentsAndType,
|
|
1020
|
+
) {
|
|
1021
|
+
const eventType = name === 'BubblingEventHandler' ? 'bubble' : 'direct';
|
|
1022
|
+
const paperTopLevelNameDeprecated =
|
|
1023
|
+
parser.getPaperTopLevelNameDeprecated(typeAnnotation);
|
|
1024
|
+
switch (typeAnnotation.typeParameters.params[0].type) {
|
|
1025
|
+
case parser.nullLiteralTypeAnnotation:
|
|
1026
|
+
case parser.undefinedLiteralTypeAnnotation:
|
|
1027
|
+
return {
|
|
1028
|
+
argumentProps: [],
|
|
1029
|
+
bubblingType: eventType,
|
|
1030
|
+
paperTopLevelNameDeprecated,
|
|
1031
|
+
};
|
|
1032
|
+
default:
|
|
1033
|
+
return findEventArgumentsAndType(
|
|
1034
|
+
parser,
|
|
1035
|
+
typeAnnotation.typeParameters.params[0],
|
|
1036
|
+
types,
|
|
1037
|
+
eventType,
|
|
1038
|
+
paperTopLevelNameDeprecated,
|
|
1039
|
+
);
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
function emitBuildEventSchema(
|
|
1043
|
+
paperTopLevelNameDeprecated,
|
|
1044
|
+
name,
|
|
1045
|
+
optional,
|
|
1046
|
+
nonNullableBubblingType,
|
|
1047
|
+
argument,
|
|
1048
|
+
) {
|
|
1049
|
+
if (paperTopLevelNameDeprecated != null) {
|
|
1050
|
+
return {
|
|
1051
|
+
name,
|
|
1052
|
+
optional,
|
|
1053
|
+
bubblingType: nonNullableBubblingType,
|
|
1054
|
+
paperTopLevelNameDeprecated,
|
|
1055
|
+
typeAnnotation: {
|
|
1056
|
+
type: 'EventTypeAnnotation',
|
|
1057
|
+
argument: argument,
|
|
1058
|
+
},
|
|
1059
|
+
};
|
|
1060
|
+
}
|
|
1061
|
+
return {
|
|
1062
|
+
name,
|
|
1063
|
+
optional,
|
|
1064
|
+
bubblingType: nonNullableBubblingType,
|
|
1065
|
+
typeAnnotation: {
|
|
1066
|
+
type: 'EventTypeAnnotation',
|
|
1067
|
+
argument: argument,
|
|
1068
|
+
},
|
|
1069
|
+
};
|
|
1070
|
+
}
|
|
824
1071
|
module.exports = {
|
|
825
1072
|
wrapModuleSchema,
|
|
826
1073
|
unwrapNullable,
|
|
@@ -840,4 +1087,15 @@ module.exports = {
|
|
|
840
1087
|
getCommandOptions,
|
|
841
1088
|
getOptions,
|
|
842
1089
|
getCommandTypeNameAndOptionsExpression,
|
|
1090
|
+
extendsForProp,
|
|
1091
|
+
buildPropSchema,
|
|
1092
|
+
getEventArgument,
|
|
1093
|
+
findComponentConfig,
|
|
1094
|
+
getCommandProperties,
|
|
1095
|
+
handleGenericTypeAnnotation,
|
|
1096
|
+
getTypeResolutionStatus,
|
|
1097
|
+
buildPropertiesForEvent,
|
|
1098
|
+
verifyPropNotAlreadyDefined,
|
|
1099
|
+
handleEventHandler,
|
|
1100
|
+
emitBuildEventSchema,
|
|
843
1101
|
};
|