@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
|
@@ -78,28 +78,26 @@ function _iterableToArrayLimit(arr, i) {
|
|
|
78
78
|
function _arrayWithHoles(arr) {
|
|
79
79
|
if (Array.isArray(arr)) return arr;
|
|
80
80
|
}
|
|
81
|
-
const _require = require('
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
unwrapNullable = _require2.unwrapNullable,
|
|
85
|
-
wrapNullable = _require2.wrapNullable,
|
|
81
|
+
const _require = require('../../parsers-commons'),
|
|
82
|
+
unwrapNullable = _require.unwrapNullable,
|
|
83
|
+
wrapNullable = _require.wrapNullable,
|
|
86
84
|
assertGenericTypeAnnotationHasExactlyOneTypeParameter =
|
|
87
|
-
|
|
88
|
-
parseObjectProperty =
|
|
89
|
-
const
|
|
90
|
-
emitArrayType =
|
|
91
|
-
emitFunction =
|
|
92
|
-
|
|
93
|
-
emitPromise =
|
|
94
|
-
emitRootTag =
|
|
95
|
-
emitUnion =
|
|
96
|
-
emitCommonTypes =
|
|
97
|
-
typeAliasResolution =
|
|
98
|
-
typeEnumResolution =
|
|
99
|
-
const
|
|
85
|
+
_require.assertGenericTypeAnnotationHasExactlyOneTypeParameter,
|
|
86
|
+
parseObjectProperty = _require.parseObjectProperty;
|
|
87
|
+
const _require2 = require('../../parsers-primitives'),
|
|
88
|
+
emitArrayType = _require2.emitArrayType,
|
|
89
|
+
emitFunction = _require2.emitFunction,
|
|
90
|
+
emitDictionary = _require2.emitDictionary,
|
|
91
|
+
emitPromise = _require2.emitPromise,
|
|
92
|
+
emitRootTag = _require2.emitRootTag,
|
|
93
|
+
emitUnion = _require2.emitUnion,
|
|
94
|
+
emitCommonTypes = _require2.emitCommonTypes,
|
|
95
|
+
typeAliasResolution = _require2.typeAliasResolution,
|
|
96
|
+
typeEnumResolution = _require2.typeEnumResolution;
|
|
97
|
+
const _require3 = require('../../errors'),
|
|
100
98
|
UnsupportedTypeAnnotationParserError =
|
|
101
|
-
|
|
102
|
-
UnsupportedGenericParserError =
|
|
99
|
+
_require3.UnsupportedTypeAnnotationParserError,
|
|
100
|
+
UnsupportedGenericParserError = _require3.UnsupportedGenericParserError;
|
|
103
101
|
function translateTypeAnnotation(
|
|
104
102
|
hasteModuleName,
|
|
105
103
|
/**
|
|
@@ -113,16 +111,18 @@ function translateTypeAnnotation(
|
|
|
113
111
|
cxxOnly,
|
|
114
112
|
parser,
|
|
115
113
|
) {
|
|
116
|
-
const
|
|
114
|
+
const resolveTypeAnnotationFN = parser.getResolveTypeAnnotationFN();
|
|
115
|
+
const _resolveTypeAnnotatio = resolveTypeAnnotationFN(
|
|
117
116
|
flowTypeAnnotation,
|
|
118
117
|
types,
|
|
118
|
+
parser,
|
|
119
119
|
),
|
|
120
120
|
nullable = _resolveTypeAnnotatio.nullable,
|
|
121
121
|
typeAnnotation = _resolveTypeAnnotatio.typeAnnotation,
|
|
122
122
|
typeResolutionStatus = _resolveTypeAnnotatio.typeResolutionStatus;
|
|
123
123
|
switch (typeAnnotation.type) {
|
|
124
124
|
case 'GenericTypeAnnotation': {
|
|
125
|
-
switch (typeAnnotation
|
|
125
|
+
switch (parser.getTypeAnnotationName(typeAnnotation)) {
|
|
126
126
|
case 'RootTag': {
|
|
127
127
|
return emitRootTag(nullable);
|
|
128
128
|
}
|
|
@@ -210,7 +210,7 @@ function translateTypeAnnotation(
|
|
|
210
210
|
// check the property type to prevent developers from using unsupported types
|
|
211
211
|
// the return value from `translateTypeAnnotation` is unused
|
|
212
212
|
const propertyType = indexers[0].value;
|
|
213
|
-
translateTypeAnnotation(
|
|
213
|
+
const valueType = translateTypeAnnotation(
|
|
214
214
|
hasteModuleName,
|
|
215
215
|
propertyType,
|
|
216
216
|
types,
|
|
@@ -221,7 +221,7 @@ function translateTypeAnnotation(
|
|
|
221
221
|
parser,
|
|
222
222
|
);
|
|
223
223
|
// no need to do further checking
|
|
224
|
-
return
|
|
224
|
+
return emitDictionary(nullable, valueType);
|
|
225
225
|
}
|
|
226
226
|
}
|
|
227
227
|
const objectTypeAnnotation = {
|
|
@@ -22,7 +22,6 @@ import type {
|
|
|
22
22
|
import type {Parser} from '../../parser';
|
|
23
23
|
import type {ParserErrorCapturer, TypeDeclarationMap} from '../../utils';
|
|
24
24
|
|
|
25
|
-
const {resolveTypeAnnotation} = require('../utils');
|
|
26
25
|
const {
|
|
27
26
|
unwrapNullable,
|
|
28
27
|
wrapNullable,
|
|
@@ -32,7 +31,7 @@ const {
|
|
|
32
31
|
const {
|
|
33
32
|
emitArrayType,
|
|
34
33
|
emitFunction,
|
|
35
|
-
|
|
34
|
+
emitDictionary,
|
|
36
35
|
emitPromise,
|
|
37
36
|
emitRootTag,
|
|
38
37
|
emitUnion,
|
|
@@ -59,12 +58,13 @@ function translateTypeAnnotation(
|
|
|
59
58
|
cxxOnly: boolean,
|
|
60
59
|
parser: Parser,
|
|
61
60
|
): Nullable<NativeModuleTypeAnnotation> {
|
|
61
|
+
const resolveTypeAnnotationFN = parser.getResolveTypeAnnotationFN();
|
|
62
62
|
const {nullable, typeAnnotation, typeResolutionStatus} =
|
|
63
|
-
|
|
63
|
+
resolveTypeAnnotationFN(flowTypeAnnotation, types, parser);
|
|
64
64
|
|
|
65
65
|
switch (typeAnnotation.type) {
|
|
66
66
|
case 'GenericTypeAnnotation': {
|
|
67
|
-
switch (typeAnnotation
|
|
67
|
+
switch (parser.getTypeAnnotationName(typeAnnotation)) {
|
|
68
68
|
case 'RootTag': {
|
|
69
69
|
return emitRootTag(nullable);
|
|
70
70
|
}
|
|
@@ -152,7 +152,7 @@ function translateTypeAnnotation(
|
|
|
152
152
|
// check the property type to prevent developers from using unsupported types
|
|
153
153
|
// the return value from `translateTypeAnnotation` is unused
|
|
154
154
|
const propertyType = indexers[0].value;
|
|
155
|
-
translateTypeAnnotation(
|
|
155
|
+
const valueType = translateTypeAnnotation(
|
|
156
156
|
hasteModuleName,
|
|
157
157
|
propertyType,
|
|
158
158
|
types,
|
|
@@ -163,7 +163,7 @@ function translateTypeAnnotation(
|
|
|
163
163
|
parser,
|
|
164
164
|
);
|
|
165
165
|
// no need to do further checking
|
|
166
|
-
return
|
|
166
|
+
return emitDictionary(nullable, valueType);
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
169
|
|
|
@@ -5,6 +5,13 @@
|
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import type {Parser} from '../parser';
|
|
8
|
+
import type { Parser } from '../parser';
|
|
9
|
+
import type { SchemaType } from '../../CodegenSchema';
|
|
10
|
+
import type { ParserType } from '../errors';
|
|
9
11
|
|
|
10
|
-
export declare class FlowParser implements Parser{
|
|
12
|
+
export declare class FlowParser implements Parser {
|
|
13
|
+
language(): ParserType;
|
|
14
|
+
parseFile(filename: string): SchemaType;
|
|
15
|
+
parseString(contents: string, filename?: string): SchemaType;
|
|
16
|
+
parseModuleFixture(filename: string): SchemaType;
|
|
17
|
+
}
|
|
@@ -38,27 +38,31 @@ function _toPrimitive(input, hint) {
|
|
|
38
38
|
}
|
|
39
39
|
return (hint === 'string' ? String : Number)(input);
|
|
40
40
|
}
|
|
41
|
-
const
|
|
42
|
-
|
|
41
|
+
const invariant = require('invariant');
|
|
42
|
+
const _require = require('./components/componentsUtils'),
|
|
43
|
+
getSchemaInfo = _require.getSchemaInfo,
|
|
44
|
+
getTypeAnnotation = _require.getTypeAnnotation,
|
|
45
|
+
flattenProperties = _require.flattenProperties;
|
|
46
|
+
const _require2 = require('./modules'),
|
|
47
|
+
flowTranslateTypeAnnotation = _require2.flowTranslateTypeAnnotation;
|
|
43
48
|
|
|
44
49
|
// $FlowFixMe[untyped-import] there's no flowtype flow-parser
|
|
45
50
|
const flowParser = require('flow-parser');
|
|
46
|
-
const
|
|
47
|
-
buildSchema =
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
resolveTypeAnnotation = _require7.resolveTypeAnnotation;
|
|
51
|
+
const _require3 = require('../parsers-commons'),
|
|
52
|
+
buildSchema = _require3.buildSchema,
|
|
53
|
+
buildPropSchema = _require3.buildPropSchema,
|
|
54
|
+
buildModuleSchema = _require3.buildModuleSchema,
|
|
55
|
+
handleGenericTypeAnnotation = _require3.handleGenericTypeAnnotation;
|
|
56
|
+
const _require4 = require('../parsers-primitives'),
|
|
57
|
+
Visitor = _require4.Visitor;
|
|
58
|
+
const _require5 = require('./components'),
|
|
59
|
+
buildComponentSchema = _require5.buildComponentSchema;
|
|
60
|
+
const _require6 = require('../schema.js'),
|
|
61
|
+
wrapComponentSchema = _require6.wrapComponentSchema;
|
|
58
62
|
const fs = require('fs');
|
|
59
|
-
const
|
|
63
|
+
const _require7 = require('../errors'),
|
|
60
64
|
UnsupportedObjectPropertyTypeAnnotationParserError =
|
|
61
|
-
|
|
65
|
+
_require7.UnsupportedObjectPropertyTypeAnnotationParserError;
|
|
62
66
|
class FlowParser {
|
|
63
67
|
constructor() {
|
|
64
68
|
_defineProperty(
|
|
@@ -66,6 +70,19 @@ class FlowParser {
|
|
|
66
70
|
'typeParameterInstantiation',
|
|
67
71
|
'TypeParameterInstantiation',
|
|
68
72
|
);
|
|
73
|
+
_defineProperty(this, 'typeAlias', 'TypeAlias');
|
|
74
|
+
_defineProperty(this, 'enumDeclaration', 'EnumDeclaration');
|
|
75
|
+
_defineProperty(this, 'interfaceDeclaration', 'InterfaceDeclaration');
|
|
76
|
+
_defineProperty(
|
|
77
|
+
this,
|
|
78
|
+
'nullLiteralTypeAnnotation',
|
|
79
|
+
'NullLiteralTypeAnnotation',
|
|
80
|
+
);
|
|
81
|
+
_defineProperty(
|
|
82
|
+
this,
|
|
83
|
+
'undefinedLiteralTypeAnnotation',
|
|
84
|
+
'VoidLiteralTypeAnnotation',
|
|
85
|
+
);
|
|
69
86
|
}
|
|
70
87
|
isProperty(property) {
|
|
71
88
|
return property.type === 'ObjectTypeProperty';
|
|
@@ -84,7 +101,7 @@ class FlowParser {
|
|
|
84
101
|
language() {
|
|
85
102
|
return 'Flow';
|
|
86
103
|
}
|
|
87
|
-
|
|
104
|
+
getTypeAnnotationName(typeAnnotation) {
|
|
88
105
|
var _typeAnnotation$id;
|
|
89
106
|
return typeAnnotation === null || typeAnnotation === void 0
|
|
90
107
|
? void 0
|
|
@@ -122,7 +139,6 @@ class FlowParser {
|
|
|
122
139
|
buildModuleSchema,
|
|
123
140
|
Visitor,
|
|
124
141
|
this,
|
|
125
|
-
resolveTypeAnnotation,
|
|
126
142
|
flowTranslateTypeAnnotation,
|
|
127
143
|
);
|
|
128
144
|
}
|
|
@@ -315,6 +331,151 @@ class FlowParser {
|
|
|
315
331
|
convertKeywordToTypeAnnotation(keyword) {
|
|
316
332
|
return keyword;
|
|
317
333
|
}
|
|
334
|
+
argumentForProp(prop) {
|
|
335
|
+
return prop.argument;
|
|
336
|
+
}
|
|
337
|
+
nameForArgument(prop) {
|
|
338
|
+
return prop.argument.id.name;
|
|
339
|
+
}
|
|
340
|
+
isOptionalProperty(property) {
|
|
341
|
+
return (
|
|
342
|
+
property.value.type === 'NullableTypeAnnotation' || property.optional
|
|
343
|
+
);
|
|
344
|
+
}
|
|
345
|
+
getGetSchemaInfoFN() {
|
|
346
|
+
return getSchemaInfo;
|
|
347
|
+
}
|
|
348
|
+
getTypeAnnotationFromProperty(property) {
|
|
349
|
+
return property.value.type === 'NullableTypeAnnotation'
|
|
350
|
+
? property.value.typeAnnotation
|
|
351
|
+
: property.value;
|
|
352
|
+
}
|
|
353
|
+
getGetTypeAnnotationFN() {
|
|
354
|
+
return getTypeAnnotation;
|
|
355
|
+
}
|
|
356
|
+
getResolvedTypeAnnotation(typeAnnotation, types, parser) {
|
|
357
|
+
invariant(
|
|
358
|
+
typeAnnotation != null,
|
|
359
|
+
'resolveTypeAnnotation(): typeAnnotation cannot be null',
|
|
360
|
+
);
|
|
361
|
+
let node = typeAnnotation;
|
|
362
|
+
let nullable = false;
|
|
363
|
+
let typeResolutionStatus = {
|
|
364
|
+
successful: false,
|
|
365
|
+
};
|
|
366
|
+
for (;;) {
|
|
367
|
+
if (node.type === 'NullableTypeAnnotation') {
|
|
368
|
+
nullable = true;
|
|
369
|
+
node = node.typeAnnotation;
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
if (node.type !== 'GenericTypeAnnotation') {
|
|
373
|
+
break;
|
|
374
|
+
}
|
|
375
|
+
const typeAnnotationName = this.getTypeAnnotationName(node);
|
|
376
|
+
const resolvedTypeAnnotation = types[typeAnnotationName];
|
|
377
|
+
if (resolvedTypeAnnotation == null) {
|
|
378
|
+
break;
|
|
379
|
+
}
|
|
380
|
+
const _handleGenericTypeAnn = handleGenericTypeAnnotation(
|
|
381
|
+
node,
|
|
382
|
+
resolvedTypeAnnotation,
|
|
383
|
+
this,
|
|
384
|
+
),
|
|
385
|
+
typeAnnotationNode = _handleGenericTypeAnn.typeAnnotation,
|
|
386
|
+
status = _handleGenericTypeAnn.typeResolutionStatus;
|
|
387
|
+
typeResolutionStatus = status;
|
|
388
|
+
node = typeAnnotationNode;
|
|
389
|
+
}
|
|
390
|
+
return {
|
|
391
|
+
nullable: nullable,
|
|
392
|
+
typeAnnotation: node,
|
|
393
|
+
typeResolutionStatus,
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
getResolveTypeAnnotationFN() {
|
|
397
|
+
return (typeAnnotation, types, parser) =>
|
|
398
|
+
this.getResolvedTypeAnnotation(typeAnnotation, types, parser);
|
|
399
|
+
}
|
|
400
|
+
extendsForProp(prop, types, parser) {
|
|
401
|
+
const argument = this.argumentForProp(prop);
|
|
402
|
+
if (!argument) {
|
|
403
|
+
console.log('null', prop);
|
|
404
|
+
}
|
|
405
|
+
const name = parser.nameForArgument(prop);
|
|
406
|
+
if (types[name] != null) {
|
|
407
|
+
// This type is locally defined in the file
|
|
408
|
+
return null;
|
|
409
|
+
}
|
|
410
|
+
switch (name) {
|
|
411
|
+
case 'ViewProps':
|
|
412
|
+
return {
|
|
413
|
+
type: 'ReactNativeBuiltInType',
|
|
414
|
+
knownTypeName: 'ReactNativeCoreViewProps',
|
|
415
|
+
};
|
|
416
|
+
default: {
|
|
417
|
+
throw new Error(`Unable to handle prop spread: ${name}`);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
removeKnownExtends(typeDefinition, types) {
|
|
422
|
+
return typeDefinition.filter(
|
|
423
|
+
prop =>
|
|
424
|
+
prop.type !== 'ObjectTypeSpreadProperty' ||
|
|
425
|
+
this.extendsForProp(prop, types, this) === null,
|
|
426
|
+
);
|
|
427
|
+
}
|
|
428
|
+
getExtendsProps(typeDefinition, types) {
|
|
429
|
+
return typeDefinition
|
|
430
|
+
.filter(prop => prop.type === 'ObjectTypeSpreadProperty')
|
|
431
|
+
.map(prop => this.extendsForProp(prop, types, this))
|
|
432
|
+
.filter(Boolean);
|
|
433
|
+
}
|
|
434
|
+
getProps(typeDefinition, types) {
|
|
435
|
+
const nonExtendsProps = this.removeKnownExtends(typeDefinition, types);
|
|
436
|
+
const props = flattenProperties(nonExtendsProps, types, this)
|
|
437
|
+
.map(property => buildPropSchema(property, types, this))
|
|
438
|
+
.filter(Boolean);
|
|
439
|
+
return {
|
|
440
|
+
props,
|
|
441
|
+
extendsProps: this.getExtendsProps(typeDefinition, types),
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
getProperties(typeName, types) {
|
|
445
|
+
const typeAlias = types[typeName];
|
|
446
|
+
try {
|
|
447
|
+
return typeAlias.right.typeParameters.params[0].properties;
|
|
448
|
+
} catch (e) {
|
|
449
|
+
throw new Error(
|
|
450
|
+
`Failed to find type definition for "${typeName}", please check that you have a valid codegen flow file`,
|
|
451
|
+
);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
nextNodeForTypeAlias(typeAnnotation) {
|
|
455
|
+
return typeAnnotation.right;
|
|
456
|
+
}
|
|
457
|
+
nextNodeForEnum(typeAnnotation) {
|
|
458
|
+
return typeAnnotation.body;
|
|
459
|
+
}
|
|
460
|
+
genericTypeAnnotationErrorMessage(typeAnnotation) {
|
|
461
|
+
return `A non GenericTypeAnnotation must be a type declaration ('${this.typeAlias}') or enum ('${this.enumDeclaration}'). Instead, got the unsupported ${typeAnnotation.type}.`;
|
|
462
|
+
}
|
|
463
|
+
extractTypeFromTypeAnnotation(typeAnnotation) {
|
|
464
|
+
return typeAnnotation.type === 'GenericTypeAnnotation'
|
|
465
|
+
? typeAnnotation.id.name
|
|
466
|
+
: typeAnnotation.type;
|
|
467
|
+
}
|
|
468
|
+
getObjectProperties(typeAnnotation) {
|
|
469
|
+
return typeAnnotation.properties;
|
|
470
|
+
}
|
|
471
|
+
getLiteralValue(option) {
|
|
472
|
+
return option.value;
|
|
473
|
+
}
|
|
474
|
+
getPaperTopLevelNameDeprecated(typeAnnotation) {
|
|
475
|
+
return typeAnnotation.typeParameters.params.length > 1
|
|
476
|
+
? typeAnnotation.typeParameters.params[1].value
|
|
477
|
+
: null;
|
|
478
|
+
}
|
|
318
479
|
}
|
|
319
480
|
module.exports = {
|
|
320
481
|
FlowParser,
|
|
@@ -20,22 +20,50 @@ import type {
|
|
|
20
20
|
NativeModuleEnumMembers,
|
|
21
21
|
NativeModuleAliasMap,
|
|
22
22
|
NativeModuleEnumMap,
|
|
23
|
+
PropTypeAnnotation,
|
|
24
|
+
ExtendsPropsShape,
|
|
23
25
|
} from '../../CodegenSchema';
|
|
24
26
|
import type {ParserType} from '../errors';
|
|
25
|
-
import type {
|
|
26
|
-
|
|
27
|
+
import type {
|
|
28
|
+
GetSchemaInfoFN,
|
|
29
|
+
GetTypeAnnotationFN,
|
|
30
|
+
Parser,
|
|
31
|
+
ResolveTypeAnnotationFN,
|
|
32
|
+
} from '../parser';
|
|
33
|
+
import type {
|
|
34
|
+
ParserErrorCapturer,
|
|
35
|
+
TypeDeclarationMap,
|
|
36
|
+
PropAST,
|
|
37
|
+
TypeResolutionStatus,
|
|
38
|
+
} from '../utils';
|
|
39
|
+
|
|
40
|
+
type ExtendsForProp = null | {
|
|
41
|
+
type: 'ReactNativeBuiltInType',
|
|
42
|
+
knownTypeName: 'ReactNativeCoreViewProps',
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const invariant = require('invariant');
|
|
46
|
+
|
|
47
|
+
const {
|
|
48
|
+
getSchemaInfo,
|
|
49
|
+
getTypeAnnotation,
|
|
50
|
+
flattenProperties,
|
|
51
|
+
} = require('./components/componentsUtils');
|
|
27
52
|
|
|
28
53
|
const {flowTranslateTypeAnnotation} = require('./modules');
|
|
29
54
|
|
|
30
55
|
// $FlowFixMe[untyped-import] there's no flowtype flow-parser
|
|
31
56
|
const flowParser = require('flow-parser');
|
|
32
57
|
|
|
33
|
-
const {
|
|
58
|
+
const {
|
|
59
|
+
buildSchema,
|
|
60
|
+
buildPropSchema,
|
|
61
|
+
buildModuleSchema,
|
|
62
|
+
handleGenericTypeAnnotation,
|
|
63
|
+
} = require('../parsers-commons');
|
|
34
64
|
const {Visitor} = require('../parsers-primitives');
|
|
35
65
|
const {buildComponentSchema} = require('./components');
|
|
36
66
|
const {wrapComponentSchema} = require('../schema.js');
|
|
37
|
-
const {buildModuleSchema} = require('../parsers-commons.js');
|
|
38
|
-
const {resolveTypeAnnotation} = require('./utils');
|
|
39
67
|
|
|
40
68
|
const fs = require('fs');
|
|
41
69
|
|
|
@@ -45,6 +73,11 @@ const {
|
|
|
45
73
|
|
|
46
74
|
class FlowParser implements Parser {
|
|
47
75
|
typeParameterInstantiation: string = 'TypeParameterInstantiation';
|
|
76
|
+
typeAlias: string = 'TypeAlias';
|
|
77
|
+
enumDeclaration: string = 'EnumDeclaration';
|
|
78
|
+
interfaceDeclaration: string = 'InterfaceDeclaration';
|
|
79
|
+
nullLiteralTypeAnnotation: string = 'NullLiteralTypeAnnotation';
|
|
80
|
+
undefinedLiteralTypeAnnotation: string = 'VoidLiteralTypeAnnotation';
|
|
48
81
|
|
|
49
82
|
isProperty(property: $FlowFixMe): boolean {
|
|
50
83
|
return property.type === 'ObjectTypeProperty';
|
|
@@ -66,7 +99,7 @@ class FlowParser implements Parser {
|
|
|
66
99
|
return 'Flow';
|
|
67
100
|
}
|
|
68
101
|
|
|
69
|
-
|
|
102
|
+
getTypeAnnotationName(typeAnnotation: $FlowFixMe): string {
|
|
70
103
|
return typeAnnotation?.id?.name;
|
|
71
104
|
}
|
|
72
105
|
|
|
@@ -106,7 +139,6 @@ class FlowParser implements Parser {
|
|
|
106
139
|
buildModuleSchema,
|
|
107
140
|
Visitor,
|
|
108
141
|
this,
|
|
109
|
-
resolveTypeAnnotation,
|
|
110
142
|
flowTranslateTypeAnnotation,
|
|
111
143
|
);
|
|
112
144
|
}
|
|
@@ -329,6 +361,198 @@ class FlowParser implements Parser {
|
|
|
329
361
|
convertKeywordToTypeAnnotation(keyword: string): string {
|
|
330
362
|
return keyword;
|
|
331
363
|
}
|
|
364
|
+
|
|
365
|
+
argumentForProp(prop: PropAST): $FlowFixMe {
|
|
366
|
+
return prop.argument;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
nameForArgument(prop: PropAST): $FlowFixMe {
|
|
370
|
+
return prop.argument.id.name;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
isOptionalProperty(property: $FlowFixMe): boolean {
|
|
374
|
+
return (
|
|
375
|
+
property.value.type === 'NullableTypeAnnotation' || property.optional
|
|
376
|
+
);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
getGetSchemaInfoFN(): GetSchemaInfoFN {
|
|
380
|
+
return getSchemaInfo;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
getTypeAnnotationFromProperty(property: PropAST): $FlowFixMe {
|
|
384
|
+
return property.value.type === 'NullableTypeAnnotation'
|
|
385
|
+
? property.value.typeAnnotation
|
|
386
|
+
: property.value;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
getGetTypeAnnotationFN(): GetTypeAnnotationFN {
|
|
390
|
+
return getTypeAnnotation;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
getResolvedTypeAnnotation(
|
|
394
|
+
typeAnnotation: $FlowFixMe,
|
|
395
|
+
types: TypeDeclarationMap,
|
|
396
|
+
parser: Parser,
|
|
397
|
+
): {
|
|
398
|
+
nullable: boolean,
|
|
399
|
+
typeAnnotation: $FlowFixMe,
|
|
400
|
+
typeResolutionStatus: TypeResolutionStatus,
|
|
401
|
+
} {
|
|
402
|
+
invariant(
|
|
403
|
+
typeAnnotation != null,
|
|
404
|
+
'resolveTypeAnnotation(): typeAnnotation cannot be null',
|
|
405
|
+
);
|
|
406
|
+
|
|
407
|
+
let node = typeAnnotation;
|
|
408
|
+
let nullable = false;
|
|
409
|
+
let typeResolutionStatus: TypeResolutionStatus = {
|
|
410
|
+
successful: false,
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
for (;;) {
|
|
414
|
+
if (node.type === 'NullableTypeAnnotation') {
|
|
415
|
+
nullable = true;
|
|
416
|
+
node = node.typeAnnotation;
|
|
417
|
+
continue;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
if (node.type !== 'GenericTypeAnnotation') {
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
const typeAnnotationName = this.getTypeAnnotationName(node);
|
|
425
|
+
const resolvedTypeAnnotation = types[typeAnnotationName];
|
|
426
|
+
if (resolvedTypeAnnotation == null) {
|
|
427
|
+
break;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
const {typeAnnotation: typeAnnotationNode, typeResolutionStatus: status} =
|
|
431
|
+
handleGenericTypeAnnotation(node, resolvedTypeAnnotation, this);
|
|
432
|
+
typeResolutionStatus = status;
|
|
433
|
+
node = typeAnnotationNode;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
return {
|
|
437
|
+
nullable: nullable,
|
|
438
|
+
typeAnnotation: node,
|
|
439
|
+
typeResolutionStatus,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
getResolveTypeAnnotationFN(): ResolveTypeAnnotationFN {
|
|
444
|
+
return (typeAnnotation, types, parser) =>
|
|
445
|
+
this.getResolvedTypeAnnotation(typeAnnotation, types, parser);
|
|
446
|
+
}
|
|
447
|
+
extendsForProp(
|
|
448
|
+
prop: PropAST,
|
|
449
|
+
types: TypeDeclarationMap,
|
|
450
|
+
parser: Parser,
|
|
451
|
+
): ExtendsForProp {
|
|
452
|
+
const argument = this.argumentForProp(prop);
|
|
453
|
+
if (!argument) {
|
|
454
|
+
console.log('null', prop);
|
|
455
|
+
}
|
|
456
|
+
const name = parser.nameForArgument(prop);
|
|
457
|
+
|
|
458
|
+
if (types[name] != null) {
|
|
459
|
+
// This type is locally defined in the file
|
|
460
|
+
return null;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
switch (name) {
|
|
464
|
+
case 'ViewProps':
|
|
465
|
+
return {
|
|
466
|
+
type: 'ReactNativeBuiltInType',
|
|
467
|
+
knownTypeName: 'ReactNativeCoreViewProps',
|
|
468
|
+
};
|
|
469
|
+
default: {
|
|
470
|
+
throw new Error(`Unable to handle prop spread: ${name}`);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
removeKnownExtends(
|
|
476
|
+
typeDefinition: $ReadOnlyArray<PropAST>,
|
|
477
|
+
types: TypeDeclarationMap,
|
|
478
|
+
): $ReadOnlyArray<PropAST> {
|
|
479
|
+
return typeDefinition.filter(
|
|
480
|
+
prop =>
|
|
481
|
+
prop.type !== 'ObjectTypeSpreadProperty' ||
|
|
482
|
+
this.extendsForProp(prop, types, this) === null,
|
|
483
|
+
);
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
getExtendsProps(
|
|
487
|
+
typeDefinition: $ReadOnlyArray<PropAST>,
|
|
488
|
+
types: TypeDeclarationMap,
|
|
489
|
+
): $ReadOnlyArray<ExtendsPropsShape> {
|
|
490
|
+
return typeDefinition
|
|
491
|
+
.filter(prop => prop.type === 'ObjectTypeSpreadProperty')
|
|
492
|
+
.map(prop => this.extendsForProp(prop, types, this))
|
|
493
|
+
.filter(Boolean);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
getProps(
|
|
497
|
+
typeDefinition: $ReadOnlyArray<PropAST>,
|
|
498
|
+
types: TypeDeclarationMap,
|
|
499
|
+
): {
|
|
500
|
+
props: $ReadOnlyArray<NamedShape<PropTypeAnnotation>>,
|
|
501
|
+
extendsProps: $ReadOnlyArray<ExtendsPropsShape>,
|
|
502
|
+
} {
|
|
503
|
+
const nonExtendsProps = this.removeKnownExtends(typeDefinition, types);
|
|
504
|
+
const props = flattenProperties(nonExtendsProps, types, this)
|
|
505
|
+
.map(property => buildPropSchema(property, types, this))
|
|
506
|
+
.filter(Boolean);
|
|
507
|
+
|
|
508
|
+
return {
|
|
509
|
+
props,
|
|
510
|
+
extendsProps: this.getExtendsProps(typeDefinition, types),
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
getProperties(typeName: string, types: TypeDeclarationMap): $FlowFixMe {
|
|
515
|
+
const typeAlias = types[typeName];
|
|
516
|
+
try {
|
|
517
|
+
return typeAlias.right.typeParameters.params[0].properties;
|
|
518
|
+
} catch (e) {
|
|
519
|
+
throw new Error(
|
|
520
|
+
`Failed to find type definition for "${typeName}", please check that you have a valid codegen flow file`,
|
|
521
|
+
);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
nextNodeForTypeAlias(typeAnnotation: $FlowFixMe): $FlowFixMe {
|
|
526
|
+
return typeAnnotation.right;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
nextNodeForEnum(typeAnnotation: $FlowFixMe): $FlowFixMe {
|
|
530
|
+
return typeAnnotation.body;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
genericTypeAnnotationErrorMessage(typeAnnotation: $FlowFixMe): string {
|
|
534
|
+
return `A non GenericTypeAnnotation must be a type declaration ('${this.typeAlias}') or enum ('${this.enumDeclaration}'). Instead, got the unsupported ${typeAnnotation.type}.`;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
extractTypeFromTypeAnnotation(typeAnnotation: $FlowFixMe): string {
|
|
538
|
+
return typeAnnotation.type === 'GenericTypeAnnotation'
|
|
539
|
+
? typeAnnotation.id.name
|
|
540
|
+
: typeAnnotation.type;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
getObjectProperties(typeAnnotation: $FlowFixMe): $FlowFixMe {
|
|
544
|
+
return typeAnnotation.properties;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
getLiteralValue(option: $FlowFixMe): $FlowFixMe {
|
|
548
|
+
return option.value;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
getPaperTopLevelNameDeprecated(typeAnnotation: $FlowFixMe): $FlowFixMe {
|
|
552
|
+
return typeAnnotation.typeParameters.params.length > 1
|
|
553
|
+
? typeAnnotation.typeParameters.params[1].value
|
|
554
|
+
: null;
|
|
555
|
+
}
|
|
332
556
|
}
|
|
333
557
|
|
|
334
558
|
module.exports = {
|