@react-native/codegen 0.72.1 → 0.72.2
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/CodegenSchema.d.ts +348 -0
- package/lib/CodegenSchema.js.flow +31 -3
- package/lib/SchemaValidator.d.ts +11 -0
- package/lib/cli/combine/combine-js-to-schema.js +8 -8
- package/lib/cli/combine/combine-js-to-schema.js.flow +8 -7
- package/lib/cli/parser/parser.js +8 -15
- package/lib/cli/parser/parser.js.flow +8 -14
- package/lib/generators/Utils.js +16 -0
- package/lib/generators/Utils.js.flow +20 -0
- package/lib/generators/__test_fixtures__/fixtures.js +2 -1
- package/lib/generators/__test_fixtures__/fixtures.js.flow +2 -1
- package/lib/generators/components/ComponentsGeneratorUtils.js +10 -1
- package/lib/generators/components/ComponentsGeneratorUtils.js.flow +12 -2
- package/lib/generators/components/CppHelpers.js +8 -15
- package/lib/generators/components/CppHelpers.js.flow +8 -19
- package/lib/generators/components/GenerateEventEmitterCpp.js +7 -3
- package/lib/generators/components/GenerateEventEmitterCpp.js.flow +7 -3
- package/lib/generators/components/GenerateEventEmitterH.js +2 -2
- package/lib/generators/components/GenerateEventEmitterH.js.flow +1 -2
- package/lib/generators/components/GeneratePropsH.js +3 -4
- package/lib/generators/components/GeneratePropsH.js.flow +2 -4
- package/lib/generators/components/GeneratePropsJavaDelegate.js +2 -0
- package/lib/generators/components/GeneratePropsJavaDelegate.js.flow +2 -0
- package/lib/generators/components/GeneratePropsJavaInterface.js +3 -0
- package/lib/generators/components/GeneratePropsJavaInterface.js.flow +3 -0
- package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js +8 -0
- package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js.flow +12 -0
- package/lib/generators/components/GenerateTests.js +3 -2
- package/lib/generators/components/GenerateTests.js.flow +3 -1
- package/lib/generators/components/GenerateViewConfigJs.js +5 -2
- package/lib/generators/components/GenerateViewConfigJs.js.flow +5 -2
- package/lib/generators/components/JavaHelpers.js +9 -0
- package/lib/generators/components/JavaHelpers.js.flow +12 -1
- package/lib/generators/components/__test_fixtures__/fixtures.js +41 -0
- package/lib/generators/components/__test_fixtures__/fixtures.js.flow +42 -0
- package/lib/generators/modules/GenerateModuleCpp.js +9 -4
- package/lib/generators/modules/GenerateModuleCpp.js.flow +11 -3
- package/lib/generators/modules/GenerateModuleH.js +185 -33
- package/lib/generators/modules/GenerateModuleH.js.flow +203 -25
- package/lib/generators/modules/GenerateModuleJavaSpec.js +2 -2
- package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +5 -5
- package/lib/generators/modules/GenerateModuleJniCpp.js +2 -2
- package/lib/generators/modules/GenerateModuleJniCpp.js.flow +5 -5
- package/lib/generators/modules/GenerateModuleObjCpp/index.js +2 -2
- package/lib/generators/modules/GenerateModuleObjCpp/index.js.flow +2 -2
- package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +2 -2
- package/lib/generators/modules/Utils.js +4 -0
- package/lib/generators/modules/Utils.js.flow +6 -0
- package/lib/generators/modules/__test_fixtures__/fixtures.js +152 -10
- package/lib/generators/modules/__test_fixtures__/fixtures.js.flow +152 -10
- package/lib/parsers/error-utils.js +1 -19
- package/lib/parsers/error-utils.js.flow +1 -19
- package/lib/parsers/errors.d.ts +10 -0
- package/lib/parsers/errors.js +9 -29
- package/lib/parsers/errors.js.flow +2 -20
- package/lib/parsers/flow/Visitor.js +37 -0
- package/lib/parsers/flow/Visitor.js.flow +41 -0
- package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +20 -2
- package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +20 -2
- package/lib/parsers/flow/components/commands.js +3 -0
- package/lib/parsers/flow/components/commands.js.flow +2 -1
- package/lib/parsers/flow/components/componentsUtils.js +10 -0
- package/lib/parsers/flow/components/componentsUtils.js.flow +11 -1
- package/lib/parsers/flow/components/events.js.flow +1 -1
- package/lib/parsers/flow/components/extends.js.flow +1 -1
- package/lib/parsers/flow/components/index.js.flow +1 -1
- package/lib/parsers/flow/components/options.js.flow +1 -1
- package/lib/parsers/flow/components/props.js.flow +1 -1
- package/lib/parsers/flow/modules/__test_fixtures__/failures.js +54 -0
- package/lib/parsers/flow/modules/__test_fixtures__/failures.js.flow +56 -0
- package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js +64 -1
- package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js.flow +66 -1
- package/lib/parsers/flow/modules/index.js +99 -25
- package/lib/parsers/flow/modules/index.js.flow +106 -22
- package/lib/parsers/flow/parser.d.ts +10 -0
- package/lib/parsers/flow/parser.js +122 -32
- package/lib/parsers/flow/parser.js.flow +144 -24
- package/lib/parsers/flow/utils.js +33 -19
- package/lib/parsers/flow/utils.js.flow +37 -22
- package/lib/parsers/parser.d.ts +17 -0
- package/lib/parsers/parser.js.flow +102 -17
- package/lib/parsers/parserMock.js +87 -30
- package/lib/parsers/parserMock.js.flow +118 -24
- package/lib/parsers/parsers-commons.js +121 -119
- package/lib/parsers/parsers-commons.js.flow +130 -131
- package/lib/parsers/parsers-primitives.js +75 -12
- package/lib/parsers/parsers-primitives.js.flow +92 -13
- package/lib/parsers/schema/index.d.ts +10 -0
- package/lib/parsers/typescript/Visitor.js +42 -0
- package/lib/parsers/typescript/Visitor.js.flow +47 -0
- package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +22 -0
- package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +22 -0
- package/lib/parsers/typescript/components/commands.js +3 -0
- package/lib/parsers/typescript/components/commands.js.flow +2 -1
- package/lib/parsers/typescript/components/componentsUtils.js +5 -0
- package/lib/parsers/typescript/components/componentsUtils.js.flow +6 -1
- package/lib/parsers/typescript/components/events.js.flow +1 -1
- package/lib/parsers/typescript/components/extends.js.flow +1 -1
- package/lib/parsers/typescript/components/index.js.flow +1 -1
- package/lib/parsers/typescript/components/options.js.flow +1 -1
- package/lib/parsers/typescript/components/props.js.flow +1 -1
- package/lib/parsers/typescript/modules/__test_fixtures__/failures.js +52 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/failures.js.flow +54 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js +142 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js.flow +146 -0
- package/lib/parsers/typescript/modules/index.js +266 -87
- package/lib/parsers/typescript/modules/index.js.flow +230 -48
- package/lib/parsers/typescript/parser.d.ts +10 -0
- package/lib/parsers/typescript/parser.js +131 -25
- package/lib/parsers/typescript/parser.js.flow +137 -26
- package/lib/parsers/typescript/utils.js +40 -20
- package/lib/parsers/typescript/utils.js.flow +44 -24
- package/lib/parsers/utils.js +0 -125
- package/lib/parsers/utils.js.flow +3 -70
- package/package.json +4 -1
- package/lib/parsers/flow/index.js +0 -80
- package/lib/parsers/flow/index.js.flow +0 -85
- package/lib/parsers/typescript/index.js +0 -85
- package/lib/parsers/typescript/index.js.flow +0 -94
|
@@ -38,9 +38,22 @@ function _toPrimitive(input, hint) {
|
|
|
38
38
|
}
|
|
39
39
|
return (hint === 'string' ? String : Number)(input);
|
|
40
40
|
}
|
|
41
|
-
|
|
41
|
+
// $FlowFixMe[untyped-import] there's no flowtype flow-parser
|
|
42
|
+
const flowParser = require('flow-parser');
|
|
43
|
+
const _require = require('../parsers-commons'),
|
|
44
|
+
buildSchema = _require.buildSchema;
|
|
45
|
+
const _require2 = require('./Visitor'),
|
|
46
|
+
Visitor = _require2.Visitor;
|
|
47
|
+
const _require3 = require('./components'),
|
|
48
|
+
buildComponentSchema = _require3.buildComponentSchema;
|
|
49
|
+
const _require4 = require('./components/schema'),
|
|
50
|
+
wrapComponentSchema = _require4.wrapComponentSchema;
|
|
51
|
+
const _require5 = require('./modules'),
|
|
52
|
+
buildModuleSchema = _require5.buildModuleSchema;
|
|
53
|
+
const fs = require('fs');
|
|
54
|
+
const _require6 = require('../errors'),
|
|
42
55
|
UnsupportedObjectPropertyTypeAnnotationParserError =
|
|
43
|
-
|
|
56
|
+
_require6.UnsupportedObjectPropertyTypeAnnotationParserError;
|
|
44
57
|
class FlowParser {
|
|
45
58
|
constructor() {
|
|
46
59
|
_defineProperty(
|
|
@@ -49,37 +62,19 @@ class FlowParser {
|
|
|
49
62
|
'TypeParameterInstantiation',
|
|
50
63
|
);
|
|
51
64
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
switch (propertyOrIndex.type) {
|
|
55
|
-
case 'ObjectTypeProperty':
|
|
56
|
-
return propertyOrIndex.key.name;
|
|
57
|
-
case 'ObjectTypeIndexer':
|
|
58
|
-
// flow index name is optional
|
|
59
|
-
return (_propertyOrIndex$id$n =
|
|
60
|
-
(_propertyOrIndex$id = propertyOrIndex.id) === null ||
|
|
61
|
-
_propertyOrIndex$id === void 0
|
|
62
|
-
? void 0
|
|
63
|
-
: _propertyOrIndex$id.name) !== null &&
|
|
64
|
-
_propertyOrIndex$id$n !== void 0
|
|
65
|
-
? _propertyOrIndex$id$n
|
|
66
|
-
: 'key';
|
|
67
|
-
default:
|
|
68
|
-
throw new UnsupportedObjectPropertyTypeAnnotationParserError(
|
|
69
|
-
hasteModuleName,
|
|
70
|
-
propertyOrIndex,
|
|
71
|
-
propertyOrIndex.type,
|
|
72
|
-
this.language(),
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
getMaybeEnumMemberType(maybeEnumDeclaration) {
|
|
77
|
-
return maybeEnumDeclaration.body.type
|
|
78
|
-
.replace('EnumNumberBody', 'NumberTypeAnnotation')
|
|
79
|
-
.replace('EnumStringBody', 'StringTypeAnnotation');
|
|
65
|
+
isProperty(property) {
|
|
66
|
+
return property.type === 'ObjectTypeProperty';
|
|
80
67
|
}
|
|
81
|
-
|
|
82
|
-
|
|
68
|
+
getKeyName(property, hasteModuleName) {
|
|
69
|
+
if (!this.isProperty(property)) {
|
|
70
|
+
throw new UnsupportedObjectPropertyTypeAnnotationParserError(
|
|
71
|
+
hasteModuleName,
|
|
72
|
+
property,
|
|
73
|
+
property.type,
|
|
74
|
+
this.language(),
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
return property.key.name;
|
|
83
78
|
}
|
|
84
79
|
language() {
|
|
85
80
|
return 'Flow';
|
|
@@ -103,6 +98,101 @@ class FlowParser {
|
|
|
103
98
|
};
|
|
104
99
|
return [...new Set(membersTypes.map(remapLiteral))];
|
|
105
100
|
}
|
|
101
|
+
parseFile(filename) {
|
|
102
|
+
const contents = fs.readFileSync(filename, 'utf8');
|
|
103
|
+
return this.parseString(contents, filename);
|
|
104
|
+
}
|
|
105
|
+
parseString(contents, filename) {
|
|
106
|
+
return buildSchema(
|
|
107
|
+
contents,
|
|
108
|
+
filename,
|
|
109
|
+
wrapComponentSchema,
|
|
110
|
+
buildComponentSchema,
|
|
111
|
+
buildModuleSchema,
|
|
112
|
+
Visitor,
|
|
113
|
+
this,
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
parseModuleFixture(filename) {
|
|
117
|
+
const contents = fs.readFileSync(filename, 'utf8');
|
|
118
|
+
return this.parseString(contents, 'path/NativeSampleTurboModule.js');
|
|
119
|
+
}
|
|
120
|
+
getAst(contents) {
|
|
121
|
+
return flowParser.parse(contents, {
|
|
122
|
+
enums: true,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
getFunctionTypeAnnotationParameters(functionTypeAnnotation) {
|
|
126
|
+
return functionTypeAnnotation.params;
|
|
127
|
+
}
|
|
128
|
+
getFunctionNameFromParameter(parameter) {
|
|
129
|
+
return parameter.name;
|
|
130
|
+
}
|
|
131
|
+
getParameterName(parameter) {
|
|
132
|
+
return parameter.name.name;
|
|
133
|
+
}
|
|
134
|
+
getParameterTypeAnnotation(parameter) {
|
|
135
|
+
return parameter.typeAnnotation;
|
|
136
|
+
}
|
|
137
|
+
getFunctionTypeAnnotationReturnType(functionTypeAnnotation) {
|
|
138
|
+
return functionTypeAnnotation.returnType;
|
|
139
|
+
}
|
|
140
|
+
parseEnumMembersType(typeAnnotation) {
|
|
141
|
+
const enumMembersType =
|
|
142
|
+
typeAnnotation.type === 'EnumStringBody'
|
|
143
|
+
? 'StringTypeAnnotation'
|
|
144
|
+
: typeAnnotation.type === 'EnumNumberBody'
|
|
145
|
+
? 'NumberTypeAnnotation'
|
|
146
|
+
: null;
|
|
147
|
+
if (!enumMembersType) {
|
|
148
|
+
throw new Error(
|
|
149
|
+
`Unknown enum type annotation type. Got: ${typeAnnotation.type}. Expected: EnumStringBody or EnumNumberBody.`,
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
return enumMembersType;
|
|
153
|
+
}
|
|
154
|
+
validateEnumMembersSupported(typeAnnotation, enumMembersType) {
|
|
155
|
+
if (!typeAnnotation.members || typeAnnotation.members.length === 0) {
|
|
156
|
+
// passing mixed members to flow would result in a flow error
|
|
157
|
+
// if the tool is launched ignoring that error, the enum would appear like not having enums
|
|
158
|
+
throw new Error(
|
|
159
|
+
'Enums should have at least one member and member values can not be mixed- they all must be either blank, number, or string values.',
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
typeAnnotation.members.forEach(member => {
|
|
163
|
+
if (
|
|
164
|
+
enumMembersType === 'StringTypeAnnotation' &&
|
|
165
|
+
(!member.init || typeof member.init.value === 'string')
|
|
166
|
+
) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (
|
|
170
|
+
enumMembersType === 'NumberTypeAnnotation' &&
|
|
171
|
+
member.init &&
|
|
172
|
+
typeof member.init.value === 'number'
|
|
173
|
+
) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
throw new Error(
|
|
177
|
+
'Enums can not be mixed- they all must be either blank, number, or string values.',
|
|
178
|
+
);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
parseEnumMembers(typeAnnotation) {
|
|
182
|
+
return typeAnnotation.members.map(member => {
|
|
183
|
+
var _member$init$value, _member$init;
|
|
184
|
+
return {
|
|
185
|
+
name: member.id.name,
|
|
186
|
+
value:
|
|
187
|
+
(_member$init$value =
|
|
188
|
+
(_member$init = member.init) === null || _member$init === void 0
|
|
189
|
+
? void 0
|
|
190
|
+
: _member$init.value) !== null && _member$init$value !== void 0
|
|
191
|
+
? _member$init$value
|
|
192
|
+
: member.id.name,
|
|
193
|
+
};
|
|
194
|
+
});
|
|
195
|
+
}
|
|
106
196
|
}
|
|
107
197
|
module.exports = {
|
|
108
198
|
FlowParser,
|
|
@@ -10,10 +10,29 @@
|
|
|
10
10
|
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
import type {
|
|
13
|
+
import type {
|
|
14
|
+
UnionTypeAnnotationMemberType,
|
|
15
|
+
SchemaType,
|
|
16
|
+
NamedShape,
|
|
17
|
+
Nullable,
|
|
18
|
+
NativeModuleParamTypeAnnotation,
|
|
19
|
+
NativeModuleEnumMemberType,
|
|
20
|
+
NativeModuleEnumMembers,
|
|
21
|
+
} from '../../CodegenSchema';
|
|
14
22
|
import type {ParserType} from '../errors';
|
|
15
23
|
import type {Parser} from '../parser';
|
|
16
24
|
|
|
25
|
+
// $FlowFixMe[untyped-import] there's no flowtype flow-parser
|
|
26
|
+
const flowParser = require('flow-parser');
|
|
27
|
+
|
|
28
|
+
const {buildSchema} = require('../parsers-commons');
|
|
29
|
+
const {Visitor} = require('./Visitor');
|
|
30
|
+
const {buildComponentSchema} = require('./components');
|
|
31
|
+
const {wrapComponentSchema} = require('./components/schema');
|
|
32
|
+
const {buildModuleSchema} = require('./modules');
|
|
33
|
+
|
|
34
|
+
const fs = require('fs');
|
|
35
|
+
|
|
17
36
|
const {
|
|
18
37
|
UnsupportedObjectPropertyTypeAnnotationParserError,
|
|
19
38
|
} = require('../errors');
|
|
@@ -21,31 +40,20 @@ const {
|
|
|
21
40
|
class FlowParser implements Parser {
|
|
22
41
|
typeParameterInstantiation: string = 'TypeParameterInstantiation';
|
|
23
42
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
case 'ObjectTypeProperty':
|
|
27
|
-
return propertyOrIndex.key.name;
|
|
28
|
-
case 'ObjectTypeIndexer':
|
|
29
|
-
// flow index name is optional
|
|
30
|
-
return propertyOrIndex.id?.name ?? 'key';
|
|
31
|
-
default:
|
|
32
|
-
throw new UnsupportedObjectPropertyTypeAnnotationParserError(
|
|
33
|
-
hasteModuleName,
|
|
34
|
-
propertyOrIndex,
|
|
35
|
-
propertyOrIndex.type,
|
|
36
|
-
this.language(),
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
getMaybeEnumMemberType(maybeEnumDeclaration: $FlowFixMe): string {
|
|
42
|
-
return maybeEnumDeclaration.body.type
|
|
43
|
-
.replace('EnumNumberBody', 'NumberTypeAnnotation')
|
|
44
|
-
.replace('EnumStringBody', 'StringTypeAnnotation');
|
|
43
|
+
isProperty(property: $FlowFixMe): boolean {
|
|
44
|
+
return property.type === 'ObjectTypeProperty';
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
getKeyName(property: $FlowFixMe, hasteModuleName: string): string {
|
|
48
|
+
if (!this.isProperty(property)) {
|
|
49
|
+
throw new UnsupportedObjectPropertyTypeAnnotationParserError(
|
|
50
|
+
hasteModuleName,
|
|
51
|
+
property,
|
|
52
|
+
property.type,
|
|
53
|
+
this.language(),
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
return property.key.name;
|
|
49
57
|
}
|
|
50
58
|
|
|
51
59
|
language(): ParserType {
|
|
@@ -76,6 +84,118 @@ class FlowParser implements Parser {
|
|
|
76
84
|
|
|
77
85
|
return [...new Set(membersTypes.map(remapLiteral))];
|
|
78
86
|
}
|
|
87
|
+
|
|
88
|
+
parseFile(filename: string): SchemaType {
|
|
89
|
+
const contents = fs.readFileSync(filename, 'utf8');
|
|
90
|
+
|
|
91
|
+
return this.parseString(contents, filename);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
parseString(contents: string, filename: ?string): SchemaType {
|
|
95
|
+
return buildSchema(
|
|
96
|
+
contents,
|
|
97
|
+
filename,
|
|
98
|
+
wrapComponentSchema,
|
|
99
|
+
buildComponentSchema,
|
|
100
|
+
buildModuleSchema,
|
|
101
|
+
Visitor,
|
|
102
|
+
this,
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
parseModuleFixture(filename: string): SchemaType {
|
|
107
|
+
const contents = fs.readFileSync(filename, 'utf8');
|
|
108
|
+
|
|
109
|
+
return this.parseString(contents, 'path/NativeSampleTurboModule.js');
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
getAst(contents: string): $FlowFixMe {
|
|
113
|
+
return flowParser.parse(contents, {
|
|
114
|
+
enums: true,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
getFunctionTypeAnnotationParameters(
|
|
119
|
+
functionTypeAnnotation: $FlowFixMe,
|
|
120
|
+
): $ReadOnlyArray<$FlowFixMe> {
|
|
121
|
+
return functionTypeAnnotation.params;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
getFunctionNameFromParameter(
|
|
125
|
+
parameter: NamedShape<Nullable<NativeModuleParamTypeAnnotation>>,
|
|
126
|
+
): $FlowFixMe {
|
|
127
|
+
return parameter.name;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
getParameterName(parameter: $FlowFixMe): string {
|
|
131
|
+
return parameter.name.name;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
getParameterTypeAnnotation(parameter: $FlowFixMe): $FlowFixMe {
|
|
135
|
+
return parameter.typeAnnotation;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
getFunctionTypeAnnotationReturnType(
|
|
139
|
+
functionTypeAnnotation: $FlowFixMe,
|
|
140
|
+
): $FlowFixMe {
|
|
141
|
+
return functionTypeAnnotation.returnType;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
parseEnumMembersType(typeAnnotation: $FlowFixMe): NativeModuleEnumMemberType {
|
|
145
|
+
const enumMembersType: ?NativeModuleEnumMemberType =
|
|
146
|
+
typeAnnotation.type === 'EnumStringBody'
|
|
147
|
+
? 'StringTypeAnnotation'
|
|
148
|
+
: typeAnnotation.type === 'EnumNumberBody'
|
|
149
|
+
? 'NumberTypeAnnotation'
|
|
150
|
+
: null;
|
|
151
|
+
if (!enumMembersType) {
|
|
152
|
+
throw new Error(
|
|
153
|
+
`Unknown enum type annotation type. Got: ${typeAnnotation.type}. Expected: EnumStringBody or EnumNumberBody.`,
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
return enumMembersType;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
validateEnumMembersSupported(
|
|
160
|
+
typeAnnotation: $FlowFixMe,
|
|
161
|
+
enumMembersType: NativeModuleEnumMemberType,
|
|
162
|
+
): void {
|
|
163
|
+
if (!typeAnnotation.members || typeAnnotation.members.length === 0) {
|
|
164
|
+
// passing mixed members to flow would result in a flow error
|
|
165
|
+
// if the tool is launched ignoring that error, the enum would appear like not having enums
|
|
166
|
+
throw new Error(
|
|
167
|
+
'Enums should have at least one member and member values can not be mixed- they all must be either blank, number, or string values.',
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
typeAnnotation.members.forEach(member => {
|
|
172
|
+
if (
|
|
173
|
+
enumMembersType === 'StringTypeAnnotation' &&
|
|
174
|
+
(!member.init || typeof member.init.value === 'string')
|
|
175
|
+
) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (
|
|
180
|
+
enumMembersType === 'NumberTypeAnnotation' &&
|
|
181
|
+
member.init &&
|
|
182
|
+
typeof member.init.value === 'number'
|
|
183
|
+
) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
throw new Error(
|
|
188
|
+
'Enums can not be mixed- they all must be either blank, number, or string values.',
|
|
189
|
+
);
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
parseEnumMembers(typeAnnotation: $FlowFixMe): NativeModuleEnumMembers {
|
|
194
|
+
return typeAnnotation.members.map(member => ({
|
|
195
|
+
name: member.id.name,
|
|
196
|
+
value: member.init?.value ?? member.id.name,
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
79
199
|
}
|
|
80
200
|
|
|
81
201
|
module.exports = {
|
|
@@ -61,38 +61,52 @@ function resolveTypeAnnotation(
|
|
|
61
61
|
);
|
|
62
62
|
let node = typeAnnotation;
|
|
63
63
|
let nullable = false;
|
|
64
|
-
let
|
|
64
|
+
let typeResolutionStatus = {
|
|
65
65
|
successful: false,
|
|
66
66
|
};
|
|
67
67
|
for (;;) {
|
|
68
68
|
if (node.type === 'NullableTypeAnnotation') {
|
|
69
69
|
nullable = true;
|
|
70
70
|
node = node.typeAnnotation;
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (node.type !== 'GenericTypeAnnotation') {
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
const resolvedTypeAnnotation = types[node.id.name];
|
|
77
|
+
if (resolvedTypeAnnotation == null) {
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
switch (resolvedTypeAnnotation.type) {
|
|
81
|
+
case 'TypeAlias': {
|
|
82
|
+
typeResolutionStatus = {
|
|
83
|
+
successful: true,
|
|
84
|
+
type: 'alias',
|
|
85
|
+
name: node.id.name,
|
|
86
|
+
};
|
|
87
|
+
node = resolvedTypeAnnotation.right;
|
|
81
88
|
break;
|
|
82
89
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
+
case 'EnumDeclaration': {
|
|
91
|
+
typeResolutionStatus = {
|
|
92
|
+
successful: true,
|
|
93
|
+
type: 'enum',
|
|
94
|
+
name: node.id.name,
|
|
95
|
+
};
|
|
96
|
+
node = resolvedTypeAnnotation.body;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
default: {
|
|
100
|
+
throw new TypeError(
|
|
101
|
+
`A non GenericTypeAnnotation must be a type declaration ('TypeAlias') or enum ('EnumDeclaration'). Instead, got the unsupported ${resolvedTypeAnnotation.type}.`,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
90
104
|
}
|
|
91
105
|
}
|
|
92
106
|
return {
|
|
93
107
|
nullable: nullable,
|
|
94
108
|
typeAnnotation: node,
|
|
95
|
-
|
|
109
|
+
typeResolutionStatus,
|
|
96
110
|
};
|
|
97
111
|
}
|
|
98
112
|
function getValueFromTypes(value, types) {
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
import type {
|
|
13
|
+
import type {TypeResolutionStatus, TypeDeclarationMap} from '../utils';
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* This FlowFixMe is supposed to refer to an InterfaceDeclaration or TypeAlias
|
|
@@ -61,7 +61,7 @@ function resolveTypeAnnotation(
|
|
|
61
61
|
): {
|
|
62
62
|
nullable: boolean,
|
|
63
63
|
typeAnnotation: $FlowFixMe,
|
|
64
|
-
|
|
64
|
+
typeResolutionStatus: TypeResolutionStatus,
|
|
65
65
|
} {
|
|
66
66
|
invariant(
|
|
67
67
|
typeAnnotation != null,
|
|
@@ -70,7 +70,7 @@ function resolveTypeAnnotation(
|
|
|
70
70
|
|
|
71
71
|
let node = typeAnnotation;
|
|
72
72
|
let nullable = false;
|
|
73
|
-
let
|
|
73
|
+
let typeResolutionStatus: TypeResolutionStatus = {
|
|
74
74
|
successful: false,
|
|
75
75
|
};
|
|
76
76
|
|
|
@@ -78,34 +78,49 @@ function resolveTypeAnnotation(
|
|
|
78
78
|
if (node.type === 'NullableTypeAnnotation') {
|
|
79
79
|
nullable = true;
|
|
80
80
|
node = node.typeAnnotation;
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
successful: true,
|
|
84
|
-
aliasName: node.id.name,
|
|
85
|
-
};
|
|
86
|
-
const resolvedTypeAnnotation = types[node.id.name];
|
|
87
|
-
if (
|
|
88
|
-
resolvedTypeAnnotation == null ||
|
|
89
|
-
resolvedTypeAnnotation.type === 'EnumDeclaration'
|
|
90
|
-
) {
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
93
83
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
);
|
|
84
|
+
if (node.type !== 'GenericTypeAnnotation') {
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
98
87
|
|
|
99
|
-
|
|
100
|
-
|
|
88
|
+
const resolvedTypeAnnotation = types[node.id.name];
|
|
89
|
+
if (resolvedTypeAnnotation == null) {
|
|
101
90
|
break;
|
|
102
91
|
}
|
|
92
|
+
|
|
93
|
+
switch (resolvedTypeAnnotation.type) {
|
|
94
|
+
case 'TypeAlias': {
|
|
95
|
+
typeResolutionStatus = {
|
|
96
|
+
successful: true,
|
|
97
|
+
type: 'alias',
|
|
98
|
+
name: node.id.name,
|
|
99
|
+
};
|
|
100
|
+
node = resolvedTypeAnnotation.right;
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case 'EnumDeclaration': {
|
|
104
|
+
typeResolutionStatus = {
|
|
105
|
+
successful: true,
|
|
106
|
+
type: 'enum',
|
|
107
|
+
name: node.id.name,
|
|
108
|
+
};
|
|
109
|
+
node = resolvedTypeAnnotation.body;
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
default: {
|
|
113
|
+
throw new TypeError(
|
|
114
|
+
`A non GenericTypeAnnotation must be a type declaration ('TypeAlias') or enum ('EnumDeclaration'). Instead, got the unsupported ${resolvedTypeAnnotation.type}.`,
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
103
118
|
}
|
|
104
119
|
|
|
105
120
|
return {
|
|
106
121
|
nullable: nullable,
|
|
107
122
|
typeAnnotation: node,
|
|
108
|
-
|
|
123
|
+
typeResolutionStatus,
|
|
109
124
|
};
|
|
110
125
|
}
|
|
111
126
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { SchemaType } from "../CodegenSchema";
|
|
9
|
+
import type { ParserType } from "./errors";
|
|
10
|
+
|
|
11
|
+
// useful members only for downstream
|
|
12
|
+
export interface Parser {
|
|
13
|
+
language(): ParserType;
|
|
14
|
+
parseFile(filename: string): SchemaType;
|
|
15
|
+
parseString(contents: string, filename?: string): SchemaType;
|
|
16
|
+
parseModuleFixture(filename: string): SchemaType;
|
|
17
|
+
}
|
|
@@ -10,7 +10,15 @@
|
|
|
10
10
|
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
import type {
|
|
13
|
+
import type {
|
|
14
|
+
UnionTypeAnnotationMemberType,
|
|
15
|
+
SchemaType,
|
|
16
|
+
NamedShape,
|
|
17
|
+
Nullable,
|
|
18
|
+
NativeModuleParamTypeAnnotation,
|
|
19
|
+
NativeModuleEnumMemberType,
|
|
20
|
+
NativeModuleEnumMembers,
|
|
21
|
+
} from '../CodegenSchema';
|
|
14
22
|
import type {ParserType} from './errors';
|
|
15
23
|
|
|
16
24
|
/**
|
|
@@ -24,25 +32,17 @@ export interface Parser {
|
|
|
24
32
|
typeParameterInstantiation: string;
|
|
25
33
|
|
|
26
34
|
/**
|
|
27
|
-
* Given a
|
|
28
|
-
* @parameter propertyOrIndex: an object containing a property or an index declaration.
|
|
29
|
-
* @parameter hasteModuleName: a string with the native module name.
|
|
30
|
-
* @returns: the key name.
|
|
31
|
-
* @throws if propertyOrIndex does not contain a property or an index declaration.
|
|
35
|
+
* Given a declaration, it returns true if it is a property
|
|
32
36
|
*/
|
|
33
|
-
|
|
37
|
+
isProperty(property: $FlowFixMe): boolean;
|
|
34
38
|
/**
|
|
35
|
-
* Given a
|
|
36
|
-
* @parameter
|
|
37
|
-
* @
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Given a type declaration, it returns a boolean specifying if is an Enum declaration.
|
|
42
|
-
* @parameter maybeEnumDeclaration: an object possibly containing an Enum declaration.
|
|
43
|
-
* @returns: a boolean specifying if is an Enum declaration.
|
|
39
|
+
* Given a property declaration, it returns the key name.
|
|
40
|
+
* @parameter property: an object containing a property declaration.
|
|
41
|
+
* @parameter hasteModuleName: a string with the native module name.
|
|
42
|
+
* @returns: the key name.
|
|
43
|
+
* @throws if property does not contain a property declaration.
|
|
44
44
|
*/
|
|
45
|
-
|
|
45
|
+
getKeyName(property: $FlowFixMe, hasteModuleName: string): string;
|
|
46
46
|
/**
|
|
47
47
|
* @returns: the Parser language.
|
|
48
48
|
*/
|
|
@@ -67,4 +67,89 @@ export interface Parser {
|
|
|
67
67
|
remapUnionTypeAnnotationMemberNames(
|
|
68
68
|
types: $FlowFixMe,
|
|
69
69
|
): UnionTypeAnnotationMemberType[];
|
|
70
|
+
/**
|
|
71
|
+
* Given the name of a file, it returns a Schema.
|
|
72
|
+
* @parameter filename: the name of the file.
|
|
73
|
+
* @returns: the Schema of the file.
|
|
74
|
+
*/
|
|
75
|
+
parseFile(filename: string): SchemaType;
|
|
76
|
+
/**
|
|
77
|
+
* Given the content of a file, it returns a Schema.
|
|
78
|
+
* @parameter contents: the content of the file.
|
|
79
|
+
* @parameter filename: the name of the file.
|
|
80
|
+
* @returns: the Schema of the file.
|
|
81
|
+
*/
|
|
82
|
+
parseString(contents: string, filename: ?string): SchemaType;
|
|
83
|
+
/**
|
|
84
|
+
* Given the name of a file, it returns a Schema.
|
|
85
|
+
* @parameter filename: the name of the file.
|
|
86
|
+
* @returns: the Schema of the file.
|
|
87
|
+
*/
|
|
88
|
+
parseModuleFixture(filename: string): SchemaType;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Given the content of a file, it returns an AST.
|
|
92
|
+
* @parameter contents: the content of the file.
|
|
93
|
+
* @returns: the AST of the file.
|
|
94
|
+
*/
|
|
95
|
+
getAst(contents: string): $FlowFixMe;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Given a FunctionTypeAnnotation, it returns an array of its parameters.
|
|
99
|
+
* @parameter functionTypeAnnotation: a FunctionTypeAnnotation
|
|
100
|
+
* @returns: the parameters of the FunctionTypeAnnotation.
|
|
101
|
+
*/
|
|
102
|
+
getFunctionTypeAnnotationParameters(
|
|
103
|
+
functionTypeAnnotation: $FlowFixMe,
|
|
104
|
+
): $ReadOnlyArray<$FlowFixMe>;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Given a parameter, it returns the function name of the parameter.
|
|
108
|
+
* @parameter parameter: a parameter of a FunctionTypeAnnotation.
|
|
109
|
+
* @returns: the function name of the parameter.
|
|
110
|
+
*/
|
|
111
|
+
getFunctionNameFromParameter(
|
|
112
|
+
parameter: NamedShape<Nullable<NativeModuleParamTypeAnnotation>>,
|
|
113
|
+
): $FlowFixMe;
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Given a parameter, it returns its name.
|
|
117
|
+
* @parameter parameter: a parameter of a FunctionTypeAnnotation.
|
|
118
|
+
* @returns: the name of the parameter.
|
|
119
|
+
*/
|
|
120
|
+
getParameterName(parameter: $FlowFixMe): string;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Given a parameter, it returns its typeAnnotation.
|
|
124
|
+
* @parameter parameter: a parameter of a FunctionTypeAnnotation.
|
|
125
|
+
* @returns: the typeAnnotation of the parameter.
|
|
126
|
+
*/
|
|
127
|
+
getParameterTypeAnnotation(param: $FlowFixMe): $FlowFixMe;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Given a FunctionTypeAnnotation, it returns its returnType.
|
|
131
|
+
* @parameter functionTypeAnnotation: a FunctionTypeAnnotation
|
|
132
|
+
* @returns: the returnType of the FunctionTypeAnnotation.
|
|
133
|
+
*/
|
|
134
|
+
getFunctionTypeAnnotationReturnType(
|
|
135
|
+
functionTypeAnnotation: $FlowFixMe,
|
|
136
|
+
): $FlowFixMe;
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Calculates an enum's members type
|
|
140
|
+
*/
|
|
141
|
+
parseEnumMembersType(typeAnnotation: $FlowFixMe): NativeModuleEnumMemberType;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Throws if enum mebers are not supported
|
|
145
|
+
*/
|
|
146
|
+
validateEnumMembersSupported(
|
|
147
|
+
typeAnnotation: $FlowFixMe,
|
|
148
|
+
enumMembersType: NativeModuleEnumMemberType,
|
|
149
|
+
): void;
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Calculates enum's members
|
|
153
|
+
*/
|
|
154
|
+
parseEnumMembers(typeAnnotation: $FlowFixMe): NativeModuleEnumMembers;
|
|
70
155
|
}
|