@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
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
import type {
|
|
14
14
|
NamedShape,
|
|
15
15
|
NativeModuleAliasMap,
|
|
16
|
+
NativeModuleEnumMap,
|
|
16
17
|
NativeModuleBaseTypeAnnotation,
|
|
17
18
|
NativeModulePropertyShape,
|
|
18
19
|
NativeModuleTypeAnnotation,
|
|
@@ -20,16 +21,23 @@ import type {
|
|
|
20
21
|
Nullable,
|
|
21
22
|
} from '../../../CodegenSchema';
|
|
22
23
|
|
|
23
|
-
import type {
|
|
24
|
+
import type {Parser} from '../../parser';
|
|
25
|
+
import type {
|
|
26
|
+
ParserErrorCapturer,
|
|
27
|
+
TypeResolutionStatus,
|
|
28
|
+
TypeDeclarationMap,
|
|
29
|
+
} from '../../utils';
|
|
30
|
+
const {flattenIntersectionType} = require('../parseTopLevelType');
|
|
31
|
+
const {flattenProperties} = require('../components/componentsUtils');
|
|
24
32
|
|
|
25
33
|
const {visit, isModuleRegistryCall, verifyPlatforms} = require('../../utils');
|
|
26
34
|
const {resolveTypeAnnotation, getTypes} = require('../utils');
|
|
27
35
|
|
|
28
36
|
const {
|
|
29
37
|
parseObjectProperty,
|
|
30
|
-
translateDefault,
|
|
31
38
|
buildPropertySchema,
|
|
32
39
|
} = require('../../parsers-commons');
|
|
40
|
+
const {typeEnumResolution} = require('../../parsers-primitives');
|
|
33
41
|
|
|
34
42
|
const {
|
|
35
43
|
emitArrayType,
|
|
@@ -39,6 +47,7 @@ const {
|
|
|
39
47
|
emitFunction,
|
|
40
48
|
emitNumber,
|
|
41
49
|
emitInt32,
|
|
50
|
+
emitGenericObject,
|
|
42
51
|
emitObject,
|
|
43
52
|
emitPromise,
|
|
44
53
|
emitRootTag,
|
|
@@ -68,10 +77,65 @@ const {
|
|
|
68
77
|
throwIfIncorrectModuleRegistryCallTypeParameterParserError,
|
|
69
78
|
} = require('../../error-utils');
|
|
70
79
|
|
|
71
|
-
const {TypeScriptParser} = require('../parser');
|
|
72
|
-
|
|
73
80
|
const language = 'TypeScript';
|
|
74
|
-
|
|
81
|
+
|
|
82
|
+
function translateObjectTypeAnnotation(
|
|
83
|
+
hasteModuleName: string,
|
|
84
|
+
/**
|
|
85
|
+
* TODO(T108222691): Use flow-types for @babel/parser
|
|
86
|
+
*/
|
|
87
|
+
nullable: boolean,
|
|
88
|
+
objectMembers: $ReadOnlyArray<$FlowFixMe>,
|
|
89
|
+
typeResolutionStatus: TypeResolutionStatus,
|
|
90
|
+
baseTypes: $ReadOnlyArray<string>,
|
|
91
|
+
types: TypeDeclarationMap,
|
|
92
|
+
aliasMap: {...NativeModuleAliasMap},
|
|
93
|
+
enumMap: {...NativeModuleEnumMap},
|
|
94
|
+
tryParse: ParserErrorCapturer,
|
|
95
|
+
cxxOnly: boolean,
|
|
96
|
+
parser: Parser,
|
|
97
|
+
): Nullable<NativeModuleTypeAnnotation> {
|
|
98
|
+
// $FlowFixMe[missing-type-arg]
|
|
99
|
+
const properties = objectMembers
|
|
100
|
+
.map<?NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>>(property => {
|
|
101
|
+
return tryParse(() => {
|
|
102
|
+
return parseObjectProperty(
|
|
103
|
+
property,
|
|
104
|
+
hasteModuleName,
|
|
105
|
+
types,
|
|
106
|
+
aliasMap,
|
|
107
|
+
enumMap,
|
|
108
|
+
tryParse,
|
|
109
|
+
cxxOnly,
|
|
110
|
+
nullable,
|
|
111
|
+
translateTypeAnnotation,
|
|
112
|
+
parser,
|
|
113
|
+
);
|
|
114
|
+
});
|
|
115
|
+
})
|
|
116
|
+
.filter(Boolean);
|
|
117
|
+
|
|
118
|
+
let objectTypeAnnotation;
|
|
119
|
+
if (baseTypes.length === 0) {
|
|
120
|
+
objectTypeAnnotation = {
|
|
121
|
+
type: 'ObjectTypeAnnotation',
|
|
122
|
+
properties,
|
|
123
|
+
};
|
|
124
|
+
} else {
|
|
125
|
+
objectTypeAnnotation = {
|
|
126
|
+
type: 'ObjectTypeAnnotation',
|
|
127
|
+
properties,
|
|
128
|
+
baseTypes,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return typeAliasResolution(
|
|
133
|
+
typeResolutionStatus,
|
|
134
|
+
objectTypeAnnotation,
|
|
135
|
+
aliasMap,
|
|
136
|
+
nullable,
|
|
137
|
+
);
|
|
138
|
+
}
|
|
75
139
|
|
|
76
140
|
function translateTypeAnnotation(
|
|
77
141
|
hasteModuleName: string,
|
|
@@ -81,10 +145,12 @@ function translateTypeAnnotation(
|
|
|
81
145
|
typeScriptTypeAnnotation: $FlowFixMe,
|
|
82
146
|
types: TypeDeclarationMap,
|
|
83
147
|
aliasMap: {...NativeModuleAliasMap},
|
|
148
|
+
enumMap: {...NativeModuleEnumMap},
|
|
84
149
|
tryParse: ParserErrorCapturer,
|
|
85
150
|
cxxOnly: boolean,
|
|
151
|
+
parser: Parser,
|
|
86
152
|
): Nullable<NativeModuleTypeAnnotation> {
|
|
87
|
-
const {nullable, typeAnnotation,
|
|
153
|
+
const {nullable, typeAnnotation, typeResolutionStatus} =
|
|
88
154
|
resolveTypeAnnotation(typeScriptTypeAnnotation, types);
|
|
89
155
|
|
|
90
156
|
switch (typeAnnotation.type) {
|
|
@@ -93,12 +159,13 @@ function translateTypeAnnotation(
|
|
|
93
159
|
hasteModuleName,
|
|
94
160
|
types,
|
|
95
161
|
aliasMap,
|
|
162
|
+
enumMap,
|
|
96
163
|
cxxOnly,
|
|
97
164
|
'Array',
|
|
98
165
|
typeAnnotation.elementType,
|
|
99
166
|
nullable,
|
|
100
|
-
language,
|
|
101
167
|
translateTypeAnnotation,
|
|
168
|
+
parser,
|
|
102
169
|
);
|
|
103
170
|
}
|
|
104
171
|
case 'TSTypeOperator': {
|
|
@@ -110,12 +177,13 @@ function translateTypeAnnotation(
|
|
|
110
177
|
hasteModuleName,
|
|
111
178
|
types,
|
|
112
179
|
aliasMap,
|
|
180
|
+
enumMap,
|
|
113
181
|
cxxOnly,
|
|
114
182
|
'ReadonlyArray',
|
|
115
183
|
typeAnnotation.typeAnnotation.elementType,
|
|
116
184
|
nullable,
|
|
117
|
-
language,
|
|
118
185
|
translateTypeAnnotation,
|
|
186
|
+
parser,
|
|
119
187
|
);
|
|
120
188
|
} else {
|
|
121
189
|
throw new UnsupportedGenericParserError(
|
|
@@ -138,6 +206,7 @@ function translateTypeAnnotation(
|
|
|
138
206
|
nullable,
|
|
139
207
|
types,
|
|
140
208
|
aliasMap,
|
|
209
|
+
enumMap,
|
|
141
210
|
tryParse,
|
|
142
211
|
cxxOnly,
|
|
143
212
|
translateTypeAnnotation,
|
|
@@ -151,6 +220,7 @@ function translateTypeAnnotation(
|
|
|
151
220
|
parser,
|
|
152
221
|
types,
|
|
153
222
|
aliasMap,
|
|
223
|
+
enumMap,
|
|
154
224
|
cxxOnly,
|
|
155
225
|
nullable,
|
|
156
226
|
translateTypeAnnotation,
|
|
@@ -170,49 +240,155 @@ function translateTypeAnnotation(
|
|
|
170
240
|
}
|
|
171
241
|
case 'UnsafeObject':
|
|
172
242
|
case 'Object': {
|
|
173
|
-
return
|
|
243
|
+
return emitGenericObject(nullable);
|
|
244
|
+
}
|
|
245
|
+
case 'Partial': {
|
|
246
|
+
if (typeAnnotation.typeParameters.params.length !== 1) {
|
|
247
|
+
throw new Error(
|
|
248
|
+
'Partials only support annotating exactly one parameter.',
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const annotatedElement =
|
|
253
|
+
types[typeAnnotation.typeParameters.params[0].typeName.name];
|
|
254
|
+
|
|
255
|
+
if (!annotatedElement) {
|
|
256
|
+
throw new Error(
|
|
257
|
+
'Partials only support annotating a type parameter.',
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const properties = annotatedElement.typeAnnotation.members.map(
|
|
262
|
+
member => {
|
|
263
|
+
return {
|
|
264
|
+
name: member.key.name,
|
|
265
|
+
optional: true,
|
|
266
|
+
typeAnnotation: translateTypeAnnotation(
|
|
267
|
+
hasteModuleName,
|
|
268
|
+
member.typeAnnotation.typeAnnotation,
|
|
269
|
+
types,
|
|
270
|
+
aliasMap,
|
|
271
|
+
enumMap,
|
|
272
|
+
tryParse,
|
|
273
|
+
cxxOnly,
|
|
274
|
+
parser,
|
|
275
|
+
),
|
|
276
|
+
};
|
|
277
|
+
},
|
|
278
|
+
);
|
|
279
|
+
|
|
280
|
+
return emitObject(nullable, properties);
|
|
174
281
|
}
|
|
175
282
|
default: {
|
|
176
|
-
|
|
283
|
+
throw new UnsupportedGenericParserError(
|
|
177
284
|
hasteModuleName,
|
|
178
285
|
typeAnnotation,
|
|
179
|
-
types,
|
|
180
|
-
nullable,
|
|
181
286
|
parser,
|
|
182
287
|
);
|
|
183
288
|
}
|
|
184
289
|
}
|
|
185
290
|
}
|
|
291
|
+
case 'TSInterfaceDeclaration': {
|
|
292
|
+
const baseTypes = (typeAnnotation.extends ?? []).map(
|
|
293
|
+
extend => extend.expression.name,
|
|
294
|
+
);
|
|
295
|
+
for (const baseType of baseTypes) {
|
|
296
|
+
// ensure base types exist and appear in aliasMap
|
|
297
|
+
translateTypeAnnotation(
|
|
298
|
+
hasteModuleName,
|
|
299
|
+
{
|
|
300
|
+
type: 'TSTypeReference',
|
|
301
|
+
typeName: {type: 'Identifier', name: baseType},
|
|
302
|
+
},
|
|
303
|
+
types,
|
|
304
|
+
aliasMap,
|
|
305
|
+
enumMap,
|
|
306
|
+
tryParse,
|
|
307
|
+
cxxOnly,
|
|
308
|
+
parser,
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
return translateObjectTypeAnnotation(
|
|
313
|
+
hasteModuleName,
|
|
314
|
+
nullable,
|
|
315
|
+
flattenProperties([typeAnnotation], types),
|
|
316
|
+
typeResolutionStatus,
|
|
317
|
+
baseTypes,
|
|
318
|
+
types,
|
|
319
|
+
aliasMap,
|
|
320
|
+
enumMap,
|
|
321
|
+
tryParse,
|
|
322
|
+
cxxOnly,
|
|
323
|
+
parser,
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
case 'TSIntersectionType': {
|
|
327
|
+
return translateObjectTypeAnnotation(
|
|
328
|
+
hasteModuleName,
|
|
329
|
+
nullable,
|
|
330
|
+
flattenProperties(
|
|
331
|
+
flattenIntersectionType(typeAnnotation, types),
|
|
332
|
+
types,
|
|
333
|
+
),
|
|
334
|
+
typeResolutionStatus,
|
|
335
|
+
[],
|
|
336
|
+
types,
|
|
337
|
+
aliasMap,
|
|
338
|
+
enumMap,
|
|
339
|
+
tryParse,
|
|
340
|
+
cxxOnly,
|
|
341
|
+
parser,
|
|
342
|
+
);
|
|
343
|
+
}
|
|
186
344
|
case 'TSTypeLiteral': {
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
)
|
|
208
|
-
|
|
209
|
-
}
|
|
345
|
+
// if there is TSIndexSignature, then it is a dictionary
|
|
346
|
+
if (typeAnnotation.members) {
|
|
347
|
+
const indexSignatures = typeAnnotation.members.filter(
|
|
348
|
+
member => member.type === 'TSIndexSignature',
|
|
349
|
+
);
|
|
350
|
+
if (indexSignatures.length > 0) {
|
|
351
|
+
// check the property type to prevent developers from using unsupported types
|
|
352
|
+
// the return value from `translateTypeAnnotation` is unused
|
|
353
|
+
const propertyType = indexSignatures[0].typeAnnotation;
|
|
354
|
+
translateTypeAnnotation(
|
|
355
|
+
hasteModuleName,
|
|
356
|
+
propertyType,
|
|
357
|
+
types,
|
|
358
|
+
aliasMap,
|
|
359
|
+
enumMap,
|
|
360
|
+
tryParse,
|
|
361
|
+
cxxOnly,
|
|
362
|
+
parser,
|
|
363
|
+
);
|
|
364
|
+
// no need to do further checking
|
|
365
|
+
return emitGenericObject(nullable);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
210
368
|
|
|
211
|
-
return
|
|
212
|
-
|
|
213
|
-
|
|
369
|
+
return translateObjectTypeAnnotation(
|
|
370
|
+
hasteModuleName,
|
|
371
|
+
nullable,
|
|
372
|
+
typeAnnotation.members,
|
|
373
|
+
typeResolutionStatus,
|
|
374
|
+
[],
|
|
375
|
+
types,
|
|
214
376
|
aliasMap,
|
|
377
|
+
enumMap,
|
|
378
|
+
tryParse,
|
|
379
|
+
cxxOnly,
|
|
380
|
+
parser,
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
case 'TSEnumDeclaration': {
|
|
384
|
+
return typeEnumResolution(
|
|
385
|
+
typeAnnotation,
|
|
386
|
+
typeResolutionStatus,
|
|
215
387
|
nullable,
|
|
388
|
+
hasteModuleName,
|
|
389
|
+
language,
|
|
390
|
+
enumMap,
|
|
391
|
+
parser,
|
|
216
392
|
);
|
|
217
393
|
}
|
|
218
394
|
case 'TSBooleanKeyword': {
|
|
@@ -234,10 +410,11 @@ function translateTypeAnnotation(
|
|
|
234
410
|
typeAnnotation,
|
|
235
411
|
types,
|
|
236
412
|
aliasMap,
|
|
413
|
+
enumMap,
|
|
237
414
|
tryParse,
|
|
238
415
|
cxxOnly,
|
|
239
416
|
translateTypeAnnotation,
|
|
240
|
-
|
|
417
|
+
parser,
|
|
241
418
|
);
|
|
242
419
|
}
|
|
243
420
|
case 'TSUnionType': {
|
|
@@ -275,6 +452,7 @@ function buildModuleSchema(
|
|
|
275
452
|
*/
|
|
276
453
|
ast: $FlowFixMe,
|
|
277
454
|
tryParse: ParserErrorCapturer,
|
|
455
|
+
parser: Parser,
|
|
278
456
|
): NativeModuleSchema {
|
|
279
457
|
const types = getTypes(ast);
|
|
280
458
|
const moduleSpecs = (Object.values(types): $ReadOnlyArray<$FlowFixMe>).filter(
|
|
@@ -313,14 +491,12 @@ function buildModuleSchema(
|
|
|
313
491
|
hasteModuleName,
|
|
314
492
|
moduleSpec,
|
|
315
493
|
callExpressions,
|
|
316
|
-
language,
|
|
317
494
|
);
|
|
318
495
|
|
|
319
496
|
throwIfMoreThanOneModuleRegistryCalls(
|
|
320
497
|
hasteModuleName,
|
|
321
498
|
callExpressions,
|
|
322
499
|
callExpressions.length,
|
|
323
|
-
language,
|
|
324
500
|
);
|
|
325
501
|
|
|
326
502
|
const [callExpression] = callExpressions;
|
|
@@ -332,7 +508,6 @@ function buildModuleSchema(
|
|
|
332
508
|
callExpression,
|
|
333
509
|
methodName,
|
|
334
510
|
callExpression.arguments.length,
|
|
335
|
-
language,
|
|
336
511
|
);
|
|
337
512
|
|
|
338
513
|
if (callExpression.arguments[0].type !== 'StringLiteral') {
|
|
@@ -342,7 +517,6 @@ function buildModuleSchema(
|
|
|
342
517
|
callExpression.arguments[0],
|
|
343
518
|
methodName,
|
|
344
519
|
type,
|
|
345
|
-
language,
|
|
346
520
|
);
|
|
347
521
|
}
|
|
348
522
|
|
|
@@ -354,7 +528,6 @@ function buildModuleSchema(
|
|
|
354
528
|
callExpression,
|
|
355
529
|
methodName,
|
|
356
530
|
$moduleName,
|
|
357
|
-
language,
|
|
358
531
|
);
|
|
359
532
|
|
|
360
533
|
throwIfIncorrectModuleRegistryCallTypeParameterParserError(
|
|
@@ -386,31 +559,39 @@ function buildModuleSchema(
|
|
|
386
559
|
)
|
|
387
560
|
.map<?{
|
|
388
561
|
aliasMap: NativeModuleAliasMap,
|
|
562
|
+
enumMap: NativeModuleEnumMap,
|
|
389
563
|
propertyShape: NativeModulePropertyShape,
|
|
390
564
|
}>(property => {
|
|
391
565
|
const aliasMap: {...NativeModuleAliasMap} = {};
|
|
566
|
+
const enumMap: {...NativeModuleEnumMap} = {};
|
|
392
567
|
|
|
393
568
|
return tryParse(() => ({
|
|
394
569
|
aliasMap: aliasMap,
|
|
570
|
+
enumMap: enumMap,
|
|
395
571
|
propertyShape: buildPropertySchema(
|
|
396
572
|
hasteModuleName,
|
|
397
573
|
property,
|
|
398
574
|
types,
|
|
399
575
|
aliasMap,
|
|
576
|
+
enumMap,
|
|
400
577
|
tryParse,
|
|
401
578
|
cxxOnly,
|
|
402
|
-
language,
|
|
403
579
|
resolveTypeAnnotation,
|
|
404
580
|
translateTypeAnnotation,
|
|
581
|
+
parser,
|
|
405
582
|
),
|
|
406
583
|
}));
|
|
407
584
|
})
|
|
408
585
|
.filter(Boolean)
|
|
409
586
|
.reduce(
|
|
410
|
-
(
|
|
587
|
+
(
|
|
588
|
+
moduleSchema: NativeModuleSchema,
|
|
589
|
+
{aliasMap, enumMap, propertyShape},
|
|
590
|
+
) => {
|
|
411
591
|
return {
|
|
412
592
|
type: 'NativeModule',
|
|
413
|
-
|
|
593
|
+
aliasMap: {...moduleSchema.aliasMap, ...aliasMap},
|
|
594
|
+
enumMap: {...moduleSchema.enumMap, ...enumMap},
|
|
414
595
|
spec: {
|
|
415
596
|
properties: [...moduleSchema.spec.properties, propertyShape],
|
|
416
597
|
},
|
|
@@ -420,7 +601,8 @@ function buildModuleSchema(
|
|
|
420
601
|
},
|
|
421
602
|
{
|
|
422
603
|
type: 'NativeModule',
|
|
423
|
-
|
|
604
|
+
aliasMap: {},
|
|
605
|
+
enumMap: {},
|
|
424
606
|
spec: {properties: []},
|
|
425
607
|
moduleName: moduleName,
|
|
426
608
|
excludedPlatforms:
|
|
@@ -0,0 +1,10 @@
|
|
|
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 {Parser} from '../parser';
|
|
9
|
+
|
|
10
|
+
export declare class TypeScriptParser implements Parser{}
|
|
@@ -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] Use flow-types for @babel/parser
|
|
42
|
+
const babelParser = require('@babel/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 TypeScriptParser {
|
|
45
58
|
constructor() {
|
|
46
59
|
_defineProperty(
|
|
@@ -49,31 +62,19 @@ class TypeScriptParser {
|
|
|
49
62
|
'TSTypeParameterInstantiation',
|
|
50
63
|
);
|
|
51
64
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
case 'TSPropertySignature':
|
|
55
|
-
return propertyOrIndex.key.name;
|
|
56
|
-
case 'TSIndexSignature':
|
|
57
|
-
return propertyOrIndex.parameters[0].name;
|
|
58
|
-
default:
|
|
59
|
-
throw new UnsupportedObjectPropertyTypeAnnotationParserError(
|
|
60
|
-
hasteModuleName,
|
|
61
|
-
propertyOrIndex,
|
|
62
|
-
propertyOrIndex.type,
|
|
63
|
-
this.language(),
|
|
64
|
-
);
|
|
65
|
-
}
|
|
65
|
+
isProperty(property) {
|
|
66
|
+
return property.type === 'TSPropertySignature';
|
|
66
67
|
}
|
|
67
|
-
|
|
68
|
-
if (
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
68
|
+
getKeyName(property, hasteModuleName) {
|
|
69
|
+
if (!this.isProperty(property)) {
|
|
70
|
+
throw new UnsupportedObjectPropertyTypeAnnotationParserError(
|
|
71
|
+
hasteModuleName,
|
|
72
|
+
property,
|
|
73
|
+
property.type,
|
|
74
|
+
this.language(),
|
|
75
|
+
);
|
|
72
76
|
}
|
|
73
|
-
return
|
|
74
|
-
}
|
|
75
|
-
isEnumDeclaration(maybeEnumDeclaration) {
|
|
76
|
-
return maybeEnumDeclaration.type === 'TSEnumDeclaration';
|
|
77
|
+
return property.key.name;
|
|
77
78
|
}
|
|
78
79
|
language() {
|
|
79
80
|
return 'TypeScript';
|
|
@@ -99,6 +100,111 @@ class TypeScriptParser {
|
|
|
99
100
|
};
|
|
100
101
|
return [...new Set(membersTypes.map(remapLiteral))];
|
|
101
102
|
}
|
|
103
|
+
parseFile(filename) {
|
|
104
|
+
const contents = fs.readFileSync(filename, 'utf8');
|
|
105
|
+
return this.parseString(contents, filename);
|
|
106
|
+
}
|
|
107
|
+
parseString(contents, filename) {
|
|
108
|
+
return buildSchema(
|
|
109
|
+
contents,
|
|
110
|
+
filename,
|
|
111
|
+
wrapComponentSchema,
|
|
112
|
+
buildComponentSchema,
|
|
113
|
+
buildModuleSchema,
|
|
114
|
+
Visitor,
|
|
115
|
+
this,
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
parseModuleFixture(filename) {
|
|
119
|
+
const contents = fs.readFileSync(filename, 'utf8');
|
|
120
|
+
return this.parseString(contents, 'path/NativeSampleTurboModule.ts');
|
|
121
|
+
}
|
|
122
|
+
getAst(contents) {
|
|
123
|
+
return babelParser.parse(contents, {
|
|
124
|
+
sourceType: 'module',
|
|
125
|
+
plugins: ['typescript'],
|
|
126
|
+
}).program;
|
|
127
|
+
}
|
|
128
|
+
getFunctionTypeAnnotationParameters(functionTypeAnnotation) {
|
|
129
|
+
return functionTypeAnnotation.parameters;
|
|
130
|
+
}
|
|
131
|
+
getFunctionNameFromParameter(parameter) {
|
|
132
|
+
return parameter.typeAnnotation;
|
|
133
|
+
}
|
|
134
|
+
getParameterName(parameter) {
|
|
135
|
+
return parameter.name;
|
|
136
|
+
}
|
|
137
|
+
getParameterTypeAnnotation(parameter) {
|
|
138
|
+
return parameter.typeAnnotation.typeAnnotation;
|
|
139
|
+
}
|
|
140
|
+
getFunctionTypeAnnotationReturnType(functionTypeAnnotation) {
|
|
141
|
+
return functionTypeAnnotation.typeAnnotation.typeAnnotation;
|
|
142
|
+
}
|
|
143
|
+
parseEnumMembersType(typeAnnotation) {
|
|
144
|
+
var _typeAnnotation$membe;
|
|
145
|
+
const enumInitializer =
|
|
146
|
+
(_typeAnnotation$membe = typeAnnotation.members[0]) === null ||
|
|
147
|
+
_typeAnnotation$membe === void 0
|
|
148
|
+
? void 0
|
|
149
|
+
: _typeAnnotation$membe.initializer;
|
|
150
|
+
const enumMembersType =
|
|
151
|
+
!enumInitializer || enumInitializer.type === 'StringLiteral'
|
|
152
|
+
? 'StringTypeAnnotation'
|
|
153
|
+
: enumInitializer.type === 'NumericLiteral'
|
|
154
|
+
? 'NumberTypeAnnotation'
|
|
155
|
+
: null;
|
|
156
|
+
if (!enumMembersType) {
|
|
157
|
+
throw new Error(
|
|
158
|
+
'Enum values must be either blank, number, or string values.',
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
return enumMembersType;
|
|
162
|
+
}
|
|
163
|
+
validateEnumMembersSupported(typeAnnotation, enumMembersType) {
|
|
164
|
+
if (!typeAnnotation.members || typeAnnotation.members.length === 0) {
|
|
165
|
+
throw new Error('Enums should have at least one member.');
|
|
166
|
+
}
|
|
167
|
+
const enumInitializerType =
|
|
168
|
+
enumMembersType === 'StringTypeAnnotation'
|
|
169
|
+
? 'StringLiteral'
|
|
170
|
+
: enumMembersType === 'NumberTypeAnnotation'
|
|
171
|
+
? 'NumericLiteral'
|
|
172
|
+
: null;
|
|
173
|
+
typeAnnotation.members.forEach(member => {
|
|
174
|
+
var _member$initializer$t, _member$initializer;
|
|
175
|
+
if (
|
|
176
|
+
((_member$initializer$t =
|
|
177
|
+
(_member$initializer = member.initializer) === null ||
|
|
178
|
+
_member$initializer === void 0
|
|
179
|
+
? void 0
|
|
180
|
+
: _member$initializer.type) !== null &&
|
|
181
|
+
_member$initializer$t !== void 0
|
|
182
|
+
? _member$initializer$t
|
|
183
|
+
: 'StringLiteral') !== enumInitializerType
|
|
184
|
+
) {
|
|
185
|
+
throw new Error(
|
|
186
|
+
'Enum values can not be mixed. They all must be either blank, number, or string values.',
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
parseEnumMembers(typeAnnotation) {
|
|
192
|
+
return typeAnnotation.members.map(member => {
|
|
193
|
+
var _member$initializer$v, _member$initializer2;
|
|
194
|
+
return {
|
|
195
|
+
name: member.id.name,
|
|
196
|
+
value:
|
|
197
|
+
(_member$initializer$v =
|
|
198
|
+
(_member$initializer2 = member.initializer) === null ||
|
|
199
|
+
_member$initializer2 === void 0
|
|
200
|
+
? void 0
|
|
201
|
+
: _member$initializer2.value) !== null &&
|
|
202
|
+
_member$initializer$v !== void 0
|
|
203
|
+
? _member$initializer$v
|
|
204
|
+
: member.id.name,
|
|
205
|
+
};
|
|
206
|
+
});
|
|
207
|
+
}
|
|
102
208
|
}
|
|
103
209
|
module.exports = {
|
|
104
210
|
TypeScriptParser,
|