@react-native/codegen 0.72.5 → 0.73.0-nightly-20230605-5062553c6
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/generators/components/CppHelpers.js +39 -2
- package/lib/generators/components/CppHelpers.js.flow +54 -5
- package/lib/generators/components/GenerateEventEmitterCpp.js +238 -55
- package/lib/generators/components/GenerateEventEmitterCpp.js.flow +233 -55
- package/lib/generators/components/GenerateEventEmitterH.js +77 -28
- package/lib/generators/components/GenerateEventEmitterH.js.flow +87 -32
- package/lib/generators/components/GeneratePropsH.js +1 -2
- package/lib/generators/components/GeneratePropsH.js.flow +1 -2
- 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 +3 -3
- package/lib/generators/modules/GenerateModuleCpp.js.flow +3 -3
- package/lib/generators/modules/GenerateModuleJavaSpec.js +1 -2
- package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +1 -2
- package/lib/parsers/error-utils.js +44 -0
- package/lib/parsers/error-utils.js.flow +59 -0
- 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 +12 -19
- package/lib/parsers/flow/components/componentsUtils.js.flow +16 -27
- package/lib/parsers/flow/components/events.js +157 -83
- package/lib/parsers/flow/components/events.js.flow +158 -82
- package/lib/parsers/flow/components/index.js +10 -129
- package/lib/parsers/flow/components/index.js.flow +10 -150
- package/lib/parsers/flow/modules/index.js +39 -49
- package/lib/parsers/flow/modules/index.js.flow +22 -31
- package/lib/parsers/flow/parser.d.ts +9 -2
- package/lib/parsers/flow/parser.js +177 -16
- package/lib/parsers/flow/parser.js.flow +220 -6
- package/lib/parsers/flow/utils.js +0 -63
- package/lib/parsers/flow/utils.js.flow +1 -77
- package/lib/parsers/parser.js.flow +143 -1
- package/lib/parsers/parserMock.js +175 -2
- package/lib/parsers/parserMock.js.flow +227 -2
- package/lib/parsers/parsers-commons.js +169 -9
- package/lib/parsers/parsers-commons.js.flow +233 -12
- package/lib/parsers/parsers-primitives.js +94 -35
- package/lib/parsers/parsers-primitives.js.flow +124 -35
- 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 +44 -46
- package/lib/parsers/typescript/components/componentsUtils.js.flow +44 -51
- package/lib/parsers/typescript/components/events.js +142 -72
- package/lib/parsers/typescript/components/events.js.flow +149 -73
- 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 +11 -134
- package/lib/parsers/typescript/components/index.js.flow +11 -156
- package/lib/parsers/typescript/modules/index.js +43 -51
- package/lib/parsers/typescript/modules/index.js.flow +25 -32
- package/lib/parsers/typescript/parser.d.ts +9 -2
- package/lib/parsers/typescript/parser.js +224 -7
- package/lib/parsers/typescript/parser.js.flow +262 -6
- package/lib/parsers/utils.js.flow +6 -0
- package/package.json +16 -5
- 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
|
@@ -38,11 +38,17 @@ function _toPrimitive(input, hint) {
|
|
|
38
38
|
}
|
|
39
39
|
return (hint === 'string' ? String : Number)(input);
|
|
40
40
|
}
|
|
41
|
+
import invariant from 'invariant';
|
|
42
|
+
const _require = require('./typescript/components/componentsUtils'),
|
|
43
|
+
flattenProperties = _require.flattenProperties;
|
|
44
|
+
const _require2 = require('./parsers-commons'),
|
|
45
|
+
buildPropSchema = _require2.buildPropSchema;
|
|
46
|
+
|
|
41
47
|
// $FlowFixMe[untyped-import] there's no flowtype flow-parser
|
|
42
48
|
const flowParser = require('flow-parser');
|
|
43
|
-
const
|
|
49
|
+
const _require3 = require('./errors'),
|
|
44
50
|
UnsupportedObjectPropertyTypeAnnotationParserError =
|
|
45
|
-
|
|
51
|
+
_require3.UnsupportedObjectPropertyTypeAnnotationParserError;
|
|
46
52
|
const schemaMock = {
|
|
47
53
|
modules: {
|
|
48
54
|
StringPropNativeComponentView: {
|
|
@@ -65,6 +71,19 @@ export class MockedParser {
|
|
|
65
71
|
'typeParameterInstantiation',
|
|
66
72
|
'TypeParameterInstantiation',
|
|
67
73
|
);
|
|
74
|
+
_defineProperty(this, 'typeAlias', 'TypeAlias');
|
|
75
|
+
_defineProperty(this, 'enumDeclaration', 'EnumDeclaration');
|
|
76
|
+
_defineProperty(this, 'interfaceDeclaration', 'InterfaceDeclaration');
|
|
77
|
+
_defineProperty(
|
|
78
|
+
this,
|
|
79
|
+
'nullLiteralTypeAnnotation',
|
|
80
|
+
'NullLiteralTypeAnnotation',
|
|
81
|
+
);
|
|
82
|
+
_defineProperty(
|
|
83
|
+
this,
|
|
84
|
+
'undefinedLiteralTypeAnnotation',
|
|
85
|
+
'VoidLiteralTypeAnnotation',
|
|
86
|
+
);
|
|
68
87
|
}
|
|
69
88
|
isProperty(property) {
|
|
70
89
|
return property.type === 'ObjectTypeProperty';
|
|
@@ -158,6 +177,9 @@ export class MockedParser {
|
|
|
158
177
|
node.extends[0].id.name === 'TurboModule'
|
|
159
178
|
);
|
|
160
179
|
}
|
|
180
|
+
isGenericTypeAnnotation(type) {
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
161
183
|
extractAnnotatedElement(typeAnnotation, types) {
|
|
162
184
|
return types[typeAnnotation.typeParameters.params[0].id.name];
|
|
163
185
|
}
|
|
@@ -208,4 +230,155 @@ export class MockedParser {
|
|
|
208
230
|
getAnnotatedElementProperties(annotatedElement) {
|
|
209
231
|
return annotatedElement.right.properties;
|
|
210
232
|
}
|
|
233
|
+
bodyProperties(typeAlias) {
|
|
234
|
+
return typeAlias.body.properties;
|
|
235
|
+
}
|
|
236
|
+
convertKeywordToTypeAnnotation(keyword) {
|
|
237
|
+
return keyword;
|
|
238
|
+
}
|
|
239
|
+
argumentForProp(prop) {
|
|
240
|
+
return prop.expression;
|
|
241
|
+
}
|
|
242
|
+
nameForArgument(prop) {
|
|
243
|
+
return prop.expression.name;
|
|
244
|
+
}
|
|
245
|
+
isOptionalProperty(property) {
|
|
246
|
+
return property.optional || false;
|
|
247
|
+
}
|
|
248
|
+
getGetTypeAnnotationFN() {
|
|
249
|
+
return () => {
|
|
250
|
+
return {};
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
getGetSchemaInfoFN() {
|
|
254
|
+
return () => {
|
|
255
|
+
return {
|
|
256
|
+
name: 'MockedSchema',
|
|
257
|
+
optional: false,
|
|
258
|
+
typeAnnotation: 'BooleanTypeAnnotation',
|
|
259
|
+
defaultValue: false,
|
|
260
|
+
withNullDefault: false,
|
|
261
|
+
};
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
getResolveTypeAnnotationFN() {
|
|
265
|
+
return () => {
|
|
266
|
+
return {
|
|
267
|
+
nullable: false,
|
|
268
|
+
typeAnnotation: null,
|
|
269
|
+
typeResolutionStatus: {
|
|
270
|
+
successful: false,
|
|
271
|
+
},
|
|
272
|
+
};
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
getResolvedTypeAnnotation(typeAnnotation, types) {
|
|
276
|
+
invariant(
|
|
277
|
+
typeAnnotation != null,
|
|
278
|
+
'resolveTypeAnnotation(): typeAnnotation cannot be null',
|
|
279
|
+
);
|
|
280
|
+
let node = typeAnnotation;
|
|
281
|
+
let nullable = false;
|
|
282
|
+
let typeResolutionStatus = {
|
|
283
|
+
successful: false,
|
|
284
|
+
};
|
|
285
|
+
for (;;) {
|
|
286
|
+
if (node.type === 'NullableTypeAnnotation') {
|
|
287
|
+
nullable = true;
|
|
288
|
+
node = node.typeAnnotation;
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
if (node.type !== 'GenericTypeAnnotation') {
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
const resolvedTypeAnnotation = types[node.id.name];
|
|
295
|
+
if (resolvedTypeAnnotation == null) {
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
switch (resolvedTypeAnnotation.type) {
|
|
299
|
+
case 'TypeAlias': {
|
|
300
|
+
typeResolutionStatus = {
|
|
301
|
+
successful: true,
|
|
302
|
+
type: 'alias',
|
|
303
|
+
name: node.id.name,
|
|
304
|
+
};
|
|
305
|
+
node = resolvedTypeAnnotation.right;
|
|
306
|
+
break;
|
|
307
|
+
}
|
|
308
|
+
case 'EnumDeclaration': {
|
|
309
|
+
typeResolutionStatus = {
|
|
310
|
+
successful: true,
|
|
311
|
+
type: 'enum',
|
|
312
|
+
name: node.id.name,
|
|
313
|
+
};
|
|
314
|
+
node = resolvedTypeAnnotation.body;
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
default: {
|
|
318
|
+
throw new TypeError(
|
|
319
|
+
`A non GenericTypeAnnotation must be a type declaration ('TypeAlias') or enum ('EnumDeclaration'). Instead, got the unsupported ${resolvedTypeAnnotation.type}.`,
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return {
|
|
325
|
+
nullable: nullable,
|
|
326
|
+
typeAnnotation: node,
|
|
327
|
+
typeResolutionStatus,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
getExtendsProps(typeDefinition, types) {
|
|
331
|
+
return typeDefinition
|
|
332
|
+
.filter(prop => prop.type === 'ObjectTypeSpreadProperty')
|
|
333
|
+
.map(prop => this.extendsForProp(prop, types, this))
|
|
334
|
+
.filter(Boolean);
|
|
335
|
+
}
|
|
336
|
+
extendsForProp(prop, types, parser) {
|
|
337
|
+
const argument = this.argumentForProp(prop);
|
|
338
|
+
if (!argument) {
|
|
339
|
+
console.log('null', prop);
|
|
340
|
+
}
|
|
341
|
+
const name = parser.nameForArgument(prop);
|
|
342
|
+
if (types[name] != null) {
|
|
343
|
+
// This type is locally defined in the file
|
|
344
|
+
return null;
|
|
345
|
+
}
|
|
346
|
+
switch (name) {
|
|
347
|
+
case 'ViewProps':
|
|
348
|
+
return {
|
|
349
|
+
type: 'ReactNativeBuiltInType',
|
|
350
|
+
knownTypeName: 'ReactNativeCoreViewProps',
|
|
351
|
+
};
|
|
352
|
+
default: {
|
|
353
|
+
throw new Error(`Unable to handle prop spread: ${name}`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
removeKnownExtends(typeDefinition, types) {
|
|
358
|
+
return typeDefinition.filter(
|
|
359
|
+
prop =>
|
|
360
|
+
prop.type !== 'ObjectTypeSpreadProperty' ||
|
|
361
|
+
this.extendsForProp(prop, types, this) === null,
|
|
362
|
+
);
|
|
363
|
+
}
|
|
364
|
+
getProps(typeDefinition, types) {
|
|
365
|
+
const nonExtendsProps = this.removeKnownExtends(typeDefinition, types);
|
|
366
|
+
const props = flattenProperties(nonExtendsProps, types, this)
|
|
367
|
+
.map(property => buildPropSchema(property, types, this))
|
|
368
|
+
.filter(Boolean);
|
|
369
|
+
return {
|
|
370
|
+
props,
|
|
371
|
+
extendsProps: this.getExtendsProps(typeDefinition, types),
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
getProperties(typeName, types) {
|
|
375
|
+
const typeAlias = types[typeName];
|
|
376
|
+
try {
|
|
377
|
+
return typeAlias.right.typeParameters.params[0].properties;
|
|
378
|
+
} catch (e) {
|
|
379
|
+
throw new Error(
|
|
380
|
+
`Failed to find type definition for "${typeName}", please check that you have a valid codegen flow file`,
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
211
384
|
}
|
|
@@ -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';
|
|
@@ -172,6 +198,10 @@ export class MockedParser implements Parser {
|
|
|
172
198
|
);
|
|
173
199
|
}
|
|
174
200
|
|
|
201
|
+
isGenericTypeAnnotation(type: $FlowFixMe): boolean {
|
|
202
|
+
return true;
|
|
203
|
+
}
|
|
204
|
+
|
|
175
205
|
extractAnnotatedElement(
|
|
176
206
|
typeAnnotation: $FlowFixMe,
|
|
177
207
|
types: TypeDeclarationMap,
|
|
@@ -231,4 +261,199 @@ export class MockedParser implements Parser {
|
|
|
231
261
|
getAnnotatedElementProperties(annotatedElement: $FlowFixMe): $FlowFixMe {
|
|
232
262
|
return annotatedElement.right.properties;
|
|
233
263
|
}
|
|
264
|
+
|
|
265
|
+
bodyProperties(typeAlias: $FlowFixMe): $ReadOnlyArray<$FlowFixMe> {
|
|
266
|
+
return typeAlias.body.properties;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
convertKeywordToTypeAnnotation(keyword: string): string {
|
|
270
|
+
return keyword;
|
|
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
|
+
getGetTypeAnnotationFN(): GetTypeAnnotationFN {
|
|
286
|
+
return () => {
|
|
287
|
+
return {};
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
getGetSchemaInfoFN(): GetSchemaInfoFN {
|
|
292
|
+
return () => {
|
|
293
|
+
return {
|
|
294
|
+
name: 'MockedSchema',
|
|
295
|
+
optional: false,
|
|
296
|
+
typeAnnotation: 'BooleanTypeAnnotation',
|
|
297
|
+
defaultValue: false,
|
|
298
|
+
withNullDefault: false,
|
|
299
|
+
};
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
getResolveTypeAnnotationFN(): ResolveTypeAnnotationFN {
|
|
304
|
+
return () => {
|
|
305
|
+
return {
|
|
306
|
+
nullable: false,
|
|
307
|
+
typeAnnotation: null,
|
|
308
|
+
typeResolutionStatus: {successful: false},
|
|
309
|
+
};
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
getResolvedTypeAnnotation(
|
|
314
|
+
typeAnnotation: $FlowFixMe,
|
|
315
|
+
types: TypeDeclarationMap,
|
|
316
|
+
): {
|
|
317
|
+
nullable: boolean,
|
|
318
|
+
typeAnnotation: $FlowFixMe,
|
|
319
|
+
typeResolutionStatus: TypeResolutionStatus,
|
|
320
|
+
} {
|
|
321
|
+
invariant(
|
|
322
|
+
typeAnnotation != null,
|
|
323
|
+
'resolveTypeAnnotation(): typeAnnotation cannot be null',
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
let node = typeAnnotation;
|
|
327
|
+
let nullable = false;
|
|
328
|
+
let typeResolutionStatus: TypeResolutionStatus = {
|
|
329
|
+
successful: false,
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
for (;;) {
|
|
333
|
+
if (node.type === 'NullableTypeAnnotation') {
|
|
334
|
+
nullable = true;
|
|
335
|
+
node = node.typeAnnotation;
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
if (node.type !== 'GenericTypeAnnotation') {
|
|
340
|
+
break;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
const resolvedTypeAnnotation = types[node.id.name];
|
|
344
|
+
if (resolvedTypeAnnotation == null) {
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
switch (resolvedTypeAnnotation.type) {
|
|
349
|
+
case 'TypeAlias': {
|
|
350
|
+
typeResolutionStatus = {
|
|
351
|
+
successful: true,
|
|
352
|
+
type: 'alias',
|
|
353
|
+
name: node.id.name,
|
|
354
|
+
};
|
|
355
|
+
node = resolvedTypeAnnotation.right;
|
|
356
|
+
break;
|
|
357
|
+
}
|
|
358
|
+
case 'EnumDeclaration': {
|
|
359
|
+
typeResolutionStatus = {
|
|
360
|
+
successful: true,
|
|
361
|
+
type: 'enum',
|
|
362
|
+
name: node.id.name,
|
|
363
|
+
};
|
|
364
|
+
node = resolvedTypeAnnotation.body;
|
|
365
|
+
break;
|
|
366
|
+
}
|
|
367
|
+
default: {
|
|
368
|
+
throw new TypeError(
|
|
369
|
+
`A non GenericTypeAnnotation must be a type declaration ('TypeAlias') or enum ('EnumDeclaration'). Instead, got the unsupported ${resolvedTypeAnnotation.type}.`,
|
|
370
|
+
);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
return {
|
|
376
|
+
nullable: nullable,
|
|
377
|
+
typeAnnotation: node,
|
|
378
|
+
typeResolutionStatus,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
getExtendsProps(
|
|
383
|
+
typeDefinition: $ReadOnlyArray<PropAST>,
|
|
384
|
+
types: TypeDeclarationMap,
|
|
385
|
+
): $ReadOnlyArray<ExtendsPropsShape> {
|
|
386
|
+
return typeDefinition
|
|
387
|
+
.filter(prop => prop.type === 'ObjectTypeSpreadProperty')
|
|
388
|
+
.map(prop => this.extendsForProp(prop, types, this))
|
|
389
|
+
.filter(Boolean);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
extendsForProp(
|
|
393
|
+
prop: PropAST,
|
|
394
|
+
types: TypeDeclarationMap,
|
|
395
|
+
parser: Parser,
|
|
396
|
+
): ExtendsForProp {
|
|
397
|
+
const argument = this.argumentForProp(prop);
|
|
398
|
+
if (!argument) {
|
|
399
|
+
console.log('null', prop);
|
|
400
|
+
}
|
|
401
|
+
const name = parser.nameForArgument(prop);
|
|
402
|
+
|
|
403
|
+
if (types[name] != null) {
|
|
404
|
+
// This type is locally defined in the file
|
|
405
|
+
return null;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
switch (name) {
|
|
409
|
+
case 'ViewProps':
|
|
410
|
+
return {
|
|
411
|
+
type: 'ReactNativeBuiltInType',
|
|
412
|
+
knownTypeName: 'ReactNativeCoreViewProps',
|
|
413
|
+
};
|
|
414
|
+
default: {
|
|
415
|
+
throw new Error(`Unable to handle prop spread: ${name}`);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
removeKnownExtends(
|
|
421
|
+
typeDefinition: $ReadOnlyArray<PropAST>,
|
|
422
|
+
types: TypeDeclarationMap,
|
|
423
|
+
): $ReadOnlyArray<PropAST> {
|
|
424
|
+
return typeDefinition.filter(
|
|
425
|
+
prop =>
|
|
426
|
+
prop.type !== 'ObjectTypeSpreadProperty' ||
|
|
427
|
+
this.extendsForProp(prop, types, this) === null,
|
|
428
|
+
);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
getProps(
|
|
432
|
+
typeDefinition: $ReadOnlyArray<PropAST>,
|
|
433
|
+
types: TypeDeclarationMap,
|
|
434
|
+
): {
|
|
435
|
+
props: $ReadOnlyArray<NamedShape<PropTypeAnnotation>>,
|
|
436
|
+
extendsProps: $ReadOnlyArray<ExtendsPropsShape>,
|
|
437
|
+
} {
|
|
438
|
+
const nonExtendsProps = this.removeKnownExtends(typeDefinition, types);
|
|
439
|
+
const props = flattenProperties(nonExtendsProps, types, this)
|
|
440
|
+
.map(property => buildPropSchema(property, types, this))
|
|
441
|
+
.filter(Boolean);
|
|
442
|
+
|
|
443
|
+
return {
|
|
444
|
+
props,
|
|
445
|
+
extendsProps: this.getExtendsProps(typeDefinition, types),
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
getProperties(typeName: string, types: TypeDeclarationMap): $FlowFixMe {
|
|
450
|
+
const typeAlias = types[typeName];
|
|
451
|
+
try {
|
|
452
|
+
return typeAlias.right.typeParameters.params[0].properties;
|
|
453
|
+
} catch (e) {
|
|
454
|
+
throw new Error(
|
|
455
|
+
`Failed to find type definition for "${typeName}", please check that you have a valid codegen flow file`,
|
|
456
|
+
);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
234
459
|
}
|
|
@@ -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,
|
|
@@ -395,7 +400,6 @@ function buildPropertySchema(
|
|
|
395
400
|
enumMap,
|
|
396
401
|
tryParse,
|
|
397
402
|
cxxOnly,
|
|
398
|
-
resolveTypeAnnotation,
|
|
399
403
|
translateTypeAnnotation,
|
|
400
404
|
parser,
|
|
401
405
|
) {
|
|
@@ -409,7 +413,8 @@ function buildPropertySchema(
|
|
|
409
413
|
? property
|
|
410
414
|
: property.typeAnnotation;
|
|
411
415
|
}
|
|
412
|
-
|
|
416
|
+
const resolveTypeAnnotationFN = parser.getResolveTypeAnnotationFN();
|
|
417
|
+
var _resolveTypeAnnotatio = resolveTypeAnnotationFN(value, types, parser);
|
|
413
418
|
nullable = _resolveTypeAnnotatio.nullable;
|
|
414
419
|
value = _resolveTypeAnnotatio.typeAnnotation;
|
|
415
420
|
throwIfModuleTypeIsUnsupported(
|
|
@@ -446,7 +451,6 @@ function buildSchemaFromConfigType(
|
|
|
446
451
|
buildComponentSchema,
|
|
447
452
|
buildModuleSchema,
|
|
448
453
|
parser,
|
|
449
|
-
resolveTypeAnnotation,
|
|
450
454
|
translateTypeAnnotation,
|
|
451
455
|
) {
|
|
452
456
|
switch (configType) {
|
|
@@ -468,7 +472,6 @@ function buildSchemaFromConfigType(
|
|
|
468
472
|
ast,
|
|
469
473
|
tryParse,
|
|
470
474
|
parser,
|
|
471
|
-
resolveTypeAnnotation,
|
|
472
475
|
translateTypeAnnotation,
|
|
473
476
|
),
|
|
474
477
|
);
|
|
@@ -503,7 +506,6 @@ function buildSchema(
|
|
|
503
506
|
buildModuleSchema,
|
|
504
507
|
Visitor,
|
|
505
508
|
parser,
|
|
506
|
-
resolveTypeAnnotation,
|
|
507
509
|
translateTypeAnnotation,
|
|
508
510
|
) {
|
|
509
511
|
// Early return for non-Spec JavaScript files
|
|
@@ -525,7 +527,6 @@ function buildSchema(
|
|
|
525
527
|
buildComponentSchema,
|
|
526
528
|
buildModuleSchema,
|
|
527
529
|
parser,
|
|
528
|
-
resolveTypeAnnotation,
|
|
529
530
|
translateTypeAnnotation,
|
|
530
531
|
);
|
|
531
532
|
}
|
|
@@ -600,7 +601,6 @@ const buildModuleSchema = (
|
|
|
600
601
|
ast,
|
|
601
602
|
tryParse,
|
|
602
603
|
parser,
|
|
603
|
-
resolveTypeAnnotation,
|
|
604
604
|
translateTypeAnnotation,
|
|
605
605
|
) => {
|
|
606
606
|
const language = parser.language();
|
|
@@ -658,7 +658,6 @@ const buildModuleSchema = (
|
|
|
658
658
|
enumMap,
|
|
659
659
|
tryParse,
|
|
660
660
|
cxxOnly,
|
|
661
|
-
resolveTypeAnnotation,
|
|
662
661
|
translateTypeAnnotation,
|
|
663
662
|
parser,
|
|
664
663
|
),
|
|
@@ -787,6 +786,160 @@ function getOptions(optionsExpression) {
|
|
|
787
786
|
}
|
|
788
787
|
return foundOptions;
|
|
789
788
|
}
|
|
789
|
+
function getCommandTypeNameAndOptionsExpression(namedExport, parser) {
|
|
790
|
+
let callExpression;
|
|
791
|
+
let calleeName;
|
|
792
|
+
try {
|
|
793
|
+
callExpression = namedExport.declaration.declarations[0].init;
|
|
794
|
+
calleeName = callExpression.callee.name;
|
|
795
|
+
} catch (e) {
|
|
796
|
+
return;
|
|
797
|
+
}
|
|
798
|
+
if (calleeName !== 'codegenNativeCommands') {
|
|
799
|
+
return;
|
|
800
|
+
}
|
|
801
|
+
if (callExpression.arguments.length !== 1) {
|
|
802
|
+
throw new Error(
|
|
803
|
+
'codegenNativeCommands must be passed options including the supported commands',
|
|
804
|
+
);
|
|
805
|
+
}
|
|
806
|
+
const typeArgumentParam =
|
|
807
|
+
parser.getTypeArgumentParamsFromDeclaration(callExpression)[0];
|
|
808
|
+
if (!parser.isGenericTypeAnnotation(typeArgumentParam.type)) {
|
|
809
|
+
throw new Error(
|
|
810
|
+
"codegenNativeCommands doesn't support inline definitions. Specify a file local type alias",
|
|
811
|
+
);
|
|
812
|
+
}
|
|
813
|
+
return {
|
|
814
|
+
commandTypeName: parser.nameForGenericTypeAnnotation(typeArgumentParam),
|
|
815
|
+
commandOptionsExpression: callExpression.arguments[0],
|
|
816
|
+
};
|
|
817
|
+
}
|
|
818
|
+
function propertyNames(properties) {
|
|
819
|
+
return properties
|
|
820
|
+
.map(property => property && property.key && property.key.name)
|
|
821
|
+
.filter(Boolean);
|
|
822
|
+
}
|
|
823
|
+
function extendsForProp(prop, types, parser) {
|
|
824
|
+
const argument = parser.argumentForProp(prop);
|
|
825
|
+
if (!argument) {
|
|
826
|
+
console.log('null', prop);
|
|
827
|
+
}
|
|
828
|
+
const name = parser.nameForArgument(prop);
|
|
829
|
+
if (types[name] != null) {
|
|
830
|
+
// This type is locally defined in the file
|
|
831
|
+
return null;
|
|
832
|
+
}
|
|
833
|
+
switch (name) {
|
|
834
|
+
case 'ViewProps':
|
|
835
|
+
return {
|
|
836
|
+
type: 'ReactNativeBuiltInType',
|
|
837
|
+
knownTypeName: 'ReactNativeCoreViewProps',
|
|
838
|
+
};
|
|
839
|
+
default: {
|
|
840
|
+
throw new Error(`Unable to handle prop spread: ${name}`);
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
function buildPropSchema(property, types, parser) {
|
|
845
|
+
const getSchemaInfoFN = parser.getGetSchemaInfoFN();
|
|
846
|
+
const info = getSchemaInfoFN(property, types);
|
|
847
|
+
if (info == null) {
|
|
848
|
+
return null;
|
|
849
|
+
}
|
|
850
|
+
const name = info.name,
|
|
851
|
+
optional = info.optional,
|
|
852
|
+
typeAnnotation = info.typeAnnotation,
|
|
853
|
+
defaultValue = info.defaultValue,
|
|
854
|
+
withNullDefault = info.withNullDefault;
|
|
855
|
+
const getTypeAnnotationFN = parser.getGetTypeAnnotationFN();
|
|
856
|
+
return {
|
|
857
|
+
name,
|
|
858
|
+
optional,
|
|
859
|
+
typeAnnotation: getTypeAnnotationFN(
|
|
860
|
+
name,
|
|
861
|
+
typeAnnotation,
|
|
862
|
+
defaultValue,
|
|
863
|
+
withNullDefault,
|
|
864
|
+
types,
|
|
865
|
+
parser,
|
|
866
|
+
buildPropSchema,
|
|
867
|
+
),
|
|
868
|
+
};
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
|
|
872
|
+
* LTI update could not be added via codemod */
|
|
873
|
+
function getEventArgument(argumentProps, buildPropertiesForEvent, parser) {
|
|
874
|
+
return {
|
|
875
|
+
type: 'ObjectTypeAnnotation',
|
|
876
|
+
properties: argumentProps.map(member =>
|
|
877
|
+
buildPropertiesForEvent(member, parser),
|
|
878
|
+
),
|
|
879
|
+
};
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
/* $FlowFixMe[signature-verification-failure] there's no flowtype for AST.
|
|
883
|
+
* TODO(T108222691): Use flow-types for @babel/parser */
|
|
884
|
+
function findComponentConfig(ast, parser) {
|
|
885
|
+
const foundConfigs = [];
|
|
886
|
+
const defaultExports = ast.body.filter(
|
|
887
|
+
node => node.type === 'ExportDefaultDeclaration',
|
|
888
|
+
);
|
|
889
|
+
defaultExports.forEach(statement => {
|
|
890
|
+
findNativeComponentType(statement, foundConfigs, parser);
|
|
891
|
+
});
|
|
892
|
+
throwIfConfigNotfound(foundConfigs);
|
|
893
|
+
throwIfMoreThanOneConfig(foundConfigs);
|
|
894
|
+
const foundConfig = foundConfigs[0];
|
|
895
|
+
const namedExports = ast.body.filter(
|
|
896
|
+
node => node.type === 'ExportNamedDeclaration',
|
|
897
|
+
);
|
|
898
|
+
const commandsTypeNames = namedExports
|
|
899
|
+
.map(statement => getCommandTypeNameAndOptionsExpression(statement, parser))
|
|
900
|
+
.filter(Boolean);
|
|
901
|
+
throwIfMoreThanOneCodegenNativecommands(commandsTypeNames);
|
|
902
|
+
return createComponentConfig(foundConfig, commandsTypeNames);
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
// $FlowFixMe[signature-verification-failure] there's no flowtype for AST
|
|
906
|
+
function getCommandProperties(ast, parser) {
|
|
907
|
+
const _findComponentConfig = findComponentConfig(ast, parser),
|
|
908
|
+
commandTypeName = _findComponentConfig.commandTypeName,
|
|
909
|
+
commandOptionsExpression = _findComponentConfig.commandOptionsExpression;
|
|
910
|
+
if (commandTypeName == null) {
|
|
911
|
+
return [];
|
|
912
|
+
}
|
|
913
|
+
const types = parser.getTypes(ast);
|
|
914
|
+
const typeAlias = types[commandTypeName];
|
|
915
|
+
throwIfTypeAliasIsNotInterface(typeAlias, parser);
|
|
916
|
+
const properties = parser.bodyProperties(typeAlias);
|
|
917
|
+
if (!properties) {
|
|
918
|
+
throw new Error(
|
|
919
|
+
`Failed to find type definition for "${commandTypeName}", please check that you have a valid codegen file`,
|
|
920
|
+
);
|
|
921
|
+
}
|
|
922
|
+
const commandPropertyNames = propertyNames(properties);
|
|
923
|
+
const commandOptions = getCommandOptions(commandOptionsExpression);
|
|
924
|
+
if (commandOptions == null || commandOptions.supportedCommands == null) {
|
|
925
|
+
throw new Error(
|
|
926
|
+
'codegenNativeCommands must be given an options object with supportedCommands array',
|
|
927
|
+
);
|
|
928
|
+
}
|
|
929
|
+
if (
|
|
930
|
+
commandOptions.supportedCommands.length !== commandPropertyNames.length ||
|
|
931
|
+
!commandOptions.supportedCommands.every(supportedCommand =>
|
|
932
|
+
commandPropertyNames.includes(supportedCommand),
|
|
933
|
+
)
|
|
934
|
+
) {
|
|
935
|
+
throw new Error(
|
|
936
|
+
`codegenNativeCommands expected the same supportedCommands specified in the ${commandTypeName} interface: ${commandPropertyNames.join(
|
|
937
|
+
', ',
|
|
938
|
+
)}`,
|
|
939
|
+
);
|
|
940
|
+
}
|
|
941
|
+
return properties;
|
|
942
|
+
}
|
|
790
943
|
module.exports = {
|
|
791
944
|
wrapModuleSchema,
|
|
792
945
|
unwrapNullable,
|
|
@@ -802,6 +955,13 @@ module.exports = {
|
|
|
802
955
|
parseModuleName,
|
|
803
956
|
buildModuleSchema,
|
|
804
957
|
findNativeComponentType,
|
|
958
|
+
propertyNames,
|
|
805
959
|
getCommandOptions,
|
|
806
960
|
getOptions,
|
|
961
|
+
getCommandTypeNameAndOptionsExpression,
|
|
962
|
+
extendsForProp,
|
|
963
|
+
buildPropSchema,
|
|
964
|
+
getEventArgument,
|
|
965
|
+
findComponentConfig,
|
|
966
|
+
getCommandProperties,
|
|
807
967
|
};
|