@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.
Files changed (72) hide show
  1. package/README.md +2 -2
  2. package/lib/CodegenSchema.d.ts +15 -4
  3. package/lib/CodegenSchema.js.flow +33 -21
  4. package/lib/generators/components/CppHelpers.js +39 -2
  5. package/lib/generators/components/CppHelpers.js.flow +54 -5
  6. package/lib/generators/components/GenerateEventEmitterCpp.js +238 -55
  7. package/lib/generators/components/GenerateEventEmitterCpp.js.flow +233 -55
  8. package/lib/generators/components/GenerateEventEmitterH.js +77 -28
  9. package/lib/generators/components/GenerateEventEmitterH.js.flow +87 -32
  10. package/lib/generators/components/GeneratePropsH.js +1 -2
  11. package/lib/generators/components/GeneratePropsH.js.flow +1 -2
  12. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js +0 -1
  13. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +3 -5
  14. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +4 -0
  15. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +4 -0
  16. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +2 -0
  17. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +2 -0
  18. package/lib/generators/components/__test_fixtures__/fixtures.js +114 -1
  19. package/lib/generators/components/__test_fixtures__/fixtures.js.flow +114 -1
  20. package/lib/generators/modules/GenerateModuleCpp.js +3 -3
  21. package/lib/generators/modules/GenerateModuleCpp.js.flow +3 -3
  22. package/lib/generators/modules/GenerateModuleJavaSpec.js +1 -2
  23. package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +1 -2
  24. package/lib/parsers/error-utils.js +44 -0
  25. package/lib/parsers/error-utils.js.flow +59 -0
  26. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +51 -0
  27. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +51 -0
  28. package/lib/parsers/flow/components/componentsUtils.js +12 -19
  29. package/lib/parsers/flow/components/componentsUtils.js.flow +16 -27
  30. package/lib/parsers/flow/components/events.js +157 -83
  31. package/lib/parsers/flow/components/events.js.flow +158 -82
  32. package/lib/parsers/flow/components/index.js +10 -129
  33. package/lib/parsers/flow/components/index.js.flow +10 -150
  34. package/lib/parsers/flow/modules/index.js +39 -49
  35. package/lib/parsers/flow/modules/index.js.flow +22 -31
  36. package/lib/parsers/flow/parser.d.ts +9 -2
  37. package/lib/parsers/flow/parser.js +177 -16
  38. package/lib/parsers/flow/parser.js.flow +220 -6
  39. package/lib/parsers/flow/utils.js +0 -63
  40. package/lib/parsers/flow/utils.js.flow +1 -77
  41. package/lib/parsers/parser.js.flow +143 -1
  42. package/lib/parsers/parserMock.js +175 -2
  43. package/lib/parsers/parserMock.js.flow +227 -2
  44. package/lib/parsers/parsers-commons.js +169 -9
  45. package/lib/parsers/parsers-commons.js.flow +233 -12
  46. package/lib/parsers/parsers-primitives.js +94 -35
  47. package/lib/parsers/parsers-primitives.js.flow +124 -35
  48. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +51 -0
  49. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +51 -0
  50. package/lib/parsers/typescript/components/componentsUtils.js +44 -46
  51. package/lib/parsers/typescript/components/componentsUtils.js.flow +44 -51
  52. package/lib/parsers/typescript/components/events.js +142 -72
  53. package/lib/parsers/typescript/components/events.js.flow +149 -73
  54. package/lib/parsers/typescript/components/extends.js +2 -49
  55. package/lib/parsers/typescript/components/extends.js.flow +1 -55
  56. package/lib/parsers/typescript/components/index.js +11 -134
  57. package/lib/parsers/typescript/components/index.js.flow +11 -156
  58. package/lib/parsers/typescript/modules/index.js +43 -51
  59. package/lib/parsers/typescript/modules/index.js.flow +25 -32
  60. package/lib/parsers/typescript/parser.d.ts +9 -2
  61. package/lib/parsers/typescript/parser.js +224 -7
  62. package/lib/parsers/typescript/parser.js.flow +262 -6
  63. package/lib/parsers/utils.js.flow +6 -0
  64. package/package.json +16 -5
  65. package/lib/parsers/flow/components/extends.js +0 -52
  66. package/lib/parsers/flow/components/extends.js.flow +0 -66
  67. package/lib/parsers/flow/components/props.js +0 -47
  68. package/lib/parsers/flow/components/props.js.flow +0 -60
  69. package/lib/parsers/typescript/components/props.js +0 -39
  70. package/lib/parsers/typescript/components/props.js.flow +0 -48
  71. package/lib/parsers/typescript/utils.js +0 -90
  72. 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 _require = require('./errors'),
49
+ const _require3 = require('./errors'),
44
50
  UnsupportedObjectPropertyTypeAnnotationParserError =
45
- _require.UnsupportedObjectPropertyTypeAnnotationParserError;
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 {Parser} from './parser';
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 {ParserErrorCapturer, TypeDeclarationMap} from './utils';
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
- var _resolveTypeAnnotatio = resolveTypeAnnotation(value, types);
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
  };