@react-native/codegen 0.73.0 → 0.74.0-nightly-20231003-5dedf277c

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) 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/cli/combine/combine-js-to-schema-cli.js +7 -1
  5. package/lib/cli/combine/combine-js-to-schema-cli.js.flow +7 -1
  6. package/lib/generators/components/CppHelpers.js +39 -2
  7. package/lib/generators/components/CppHelpers.js.flow +54 -5
  8. package/lib/generators/components/GenerateEventEmitterCpp.js +222 -28
  9. package/lib/generators/components/GenerateEventEmitterCpp.js.flow +221 -34
  10. package/lib/generators/components/GenerateEventEmitterH.js +77 -26
  11. package/lib/generators/components/GenerateEventEmitterH.js.flow +87 -30
  12. package/lib/generators/components/GeneratePropsH.js +2 -3
  13. package/lib/generators/components/GeneratePropsH.js.flow +2 -3
  14. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js +0 -1
  15. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +3 -5
  16. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +4 -0
  17. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +4 -0
  18. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +2 -0
  19. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +2 -0
  20. package/lib/generators/components/__test_fixtures__/fixtures.js +114 -1
  21. package/lib/generators/components/__test_fixtures__/fixtures.js.flow +114 -1
  22. package/lib/generators/modules/GenerateModuleCpp.js +1 -1
  23. package/lib/generators/modules/GenerateModuleCpp.js.flow +1 -1
  24. package/lib/generators/modules/GenerateModuleH.js +44 -39
  25. package/lib/generators/modules/GenerateModuleH.js.flow +51 -39
  26. package/lib/generators/modules/GenerateModuleJavaSpec.js +9 -7
  27. package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +10 -6
  28. package/lib/generators/modules/GenerateModuleJniH.js +1 -1
  29. package/lib/generators/modules/GenerateModuleJniH.js.flow +1 -1
  30. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js +11 -3
  31. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +13 -3
  32. package/lib/parsers/error-utils.js +44 -0
  33. package/lib/parsers/error-utils.js.flow +59 -0
  34. package/lib/parsers/errors.js +3 -9
  35. package/lib/parsers/errors.js.flow +3 -9
  36. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +51 -0
  37. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +51 -0
  38. package/lib/parsers/flow/components/componentsUtils.js +22 -33
  39. package/lib/parsers/flow/components/componentsUtils.js.flow +24 -45
  40. package/lib/parsers/flow/components/events.js +151 -128
  41. package/lib/parsers/flow/components/events.js.flow +161 -136
  42. package/lib/parsers/flow/components/index.js +13 -94
  43. package/lib/parsers/flow/components/index.js.flow +5 -102
  44. package/lib/parsers/flow/modules/index.js +24 -24
  45. package/lib/parsers/flow/modules/index.js.flow +6 -6
  46. package/lib/parsers/flow/parser.d.ts +9 -2
  47. package/lib/parsers/flow/parser.js +179 -18
  48. package/lib/parsers/flow/parser.js.flow +231 -7
  49. package/lib/parsers/flow/utils.js +0 -63
  50. package/lib/parsers/flow/utils.js.flow +1 -77
  51. package/lib/parsers/parser.js.flow +176 -3
  52. package/lib/parsers/parserMock.js +202 -4
  53. package/lib/parsers/parserMock.js.flow +253 -4
  54. package/lib/parsers/parsers-commons.js +268 -10
  55. package/lib/parsers/parsers-commons.js.flow +365 -12
  56. package/lib/parsers/parsers-primitives.js +95 -1
  57. package/lib/parsers/parsers-primitives.js.flow +136 -1
  58. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +51 -0
  59. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +51 -0
  60. package/lib/parsers/typescript/components/componentsUtils.js +49 -57
  61. package/lib/parsers/typescript/components/componentsUtils.js.flow +48 -66
  62. package/lib/parsers/typescript/components/events.js +136 -115
  63. package/lib/parsers/typescript/components/events.js.flow +148 -119
  64. package/lib/parsers/typescript/components/extends.js +2 -49
  65. package/lib/parsers/typescript/components/extends.js.flow +1 -55
  66. package/lib/parsers/typescript/components/index.js +14 -99
  67. package/lib/parsers/typescript/components/index.js.flow +6 -106
  68. package/lib/parsers/typescript/modules/index.js +28 -26
  69. package/lib/parsers/typescript/modules/index.js.flow +9 -8
  70. package/lib/parsers/typescript/parser.d.ts +9 -2
  71. package/lib/parsers/typescript/parser.js +208 -14
  72. package/lib/parsers/typescript/parser.js.flow +247 -8
  73. package/lib/parsers/utils.js.flow +6 -0
  74. package/package.json +27 -16
  75. package/lib/parsers/flow/components/extends.js +0 -52
  76. package/lib/parsers/flow/components/extends.js.flow +0 -66
  77. package/lib/parsers/flow/components/props.js +0 -47
  78. package/lib/parsers/flow/components/props.js.flow +0 -60
  79. package/lib/parsers/typescript/components/props.js +0 -39
  80. package/lib/parsers/typescript/components/props.js.flow +0 -48
  81. package/lib/parsers/typescript/utils.js +0 -90
  82. package/lib/parsers/typescript/utils.js.flow +0 -104
@@ -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';
@@ -70,8 +96,8 @@ export class MockedParser implements Parser {
70
96
  return 'Flow';
71
97
  }
72
98
 
73
- nameForGenericTypeAnnotation(typeAnnotation: $FlowFixMe): string {
74
- return typeAnnotation.id.name;
99
+ getTypeAnnotationName(typeAnnotation: $FlowFixMe): string {
100
+ return typeAnnotation?.id?.name;
75
101
  }
76
102
 
77
103
  checkIfInvalidModule(typeArguments: $FlowFixMe): boolean {
@@ -243,4 +269,227 @@ export class MockedParser implements Parser {
243
269
  convertKeywordToTypeAnnotation(keyword: string): string {
244
270
  return keyword;
245
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
+ getTypeAnnotationFromProperty(property: PropAST): $FlowFixMe {
286
+ return property.typeAnnotation.typeAnnotation;
287
+ }
288
+
289
+ getGetTypeAnnotationFN(): GetTypeAnnotationFN {
290
+ return () => {
291
+ return {};
292
+ };
293
+ }
294
+
295
+ getGetSchemaInfoFN(): GetSchemaInfoFN {
296
+ return () => {
297
+ return {
298
+ name: 'MockedSchema',
299
+ optional: false,
300
+ typeAnnotation: 'BooleanTypeAnnotation',
301
+ defaultValue: false,
302
+ withNullDefault: false,
303
+ };
304
+ };
305
+ }
306
+
307
+ getResolveTypeAnnotationFN(): ResolveTypeAnnotationFN {
308
+ return () => {
309
+ return {
310
+ nullable: false,
311
+ typeAnnotation: null,
312
+ typeResolutionStatus: {successful: false},
313
+ };
314
+ };
315
+ }
316
+
317
+ getResolvedTypeAnnotation(
318
+ typeAnnotation: $FlowFixMe,
319
+ types: TypeDeclarationMap,
320
+ ): {
321
+ nullable: boolean,
322
+ typeAnnotation: $FlowFixMe,
323
+ typeResolutionStatus: TypeResolutionStatus,
324
+ } {
325
+ invariant(
326
+ typeAnnotation != null,
327
+ 'resolveTypeAnnotation(): typeAnnotation cannot be null',
328
+ );
329
+
330
+ let node = typeAnnotation;
331
+ let nullable = false;
332
+ let typeResolutionStatus: TypeResolutionStatus = {
333
+ successful: false,
334
+ };
335
+
336
+ for (;;) {
337
+ if (node.type === 'NullableTypeAnnotation') {
338
+ nullable = true;
339
+ node = node.typeAnnotation;
340
+ continue;
341
+ }
342
+
343
+ if (node.type !== 'GenericTypeAnnotation') {
344
+ break;
345
+ }
346
+
347
+ const resolvedTypeAnnotation = types[node.id.name];
348
+ if (resolvedTypeAnnotation == null) {
349
+ break;
350
+ }
351
+
352
+ switch (resolvedTypeAnnotation.type) {
353
+ case 'TypeAlias': {
354
+ typeResolutionStatus = {
355
+ successful: true,
356
+ type: 'alias',
357
+ name: node.id.name,
358
+ };
359
+ node = resolvedTypeAnnotation.right;
360
+ break;
361
+ }
362
+ case 'EnumDeclaration': {
363
+ typeResolutionStatus = {
364
+ successful: true,
365
+ type: 'enum',
366
+ name: node.id.name,
367
+ };
368
+ node = resolvedTypeAnnotation.body;
369
+ break;
370
+ }
371
+ default: {
372
+ throw new TypeError(
373
+ `A non GenericTypeAnnotation must be a type declaration ('TypeAlias') or enum ('EnumDeclaration'). Instead, got the unsupported ${resolvedTypeAnnotation.type}.`,
374
+ );
375
+ }
376
+ }
377
+ }
378
+
379
+ return {
380
+ nullable: nullable,
381
+ typeAnnotation: node,
382
+ typeResolutionStatus,
383
+ };
384
+ }
385
+
386
+ getExtendsProps(
387
+ typeDefinition: $ReadOnlyArray<PropAST>,
388
+ types: TypeDeclarationMap,
389
+ ): $ReadOnlyArray<ExtendsPropsShape> {
390
+ return typeDefinition
391
+ .filter(prop => prop.type === 'ObjectTypeSpreadProperty')
392
+ .map(prop => this.extendsForProp(prop, types, this))
393
+ .filter(Boolean);
394
+ }
395
+
396
+ extendsForProp(
397
+ prop: PropAST,
398
+ types: TypeDeclarationMap,
399
+ parser: Parser,
400
+ ): ExtendsForProp {
401
+ const argument = this.argumentForProp(prop);
402
+ if (!argument) {
403
+ console.log('null', prop);
404
+ }
405
+ const name = parser.nameForArgument(prop);
406
+
407
+ if (types[name] != null) {
408
+ // This type is locally defined in the file
409
+ return null;
410
+ }
411
+
412
+ switch (name) {
413
+ case 'ViewProps':
414
+ return {
415
+ type: 'ReactNativeBuiltInType',
416
+ knownTypeName: 'ReactNativeCoreViewProps',
417
+ };
418
+ default: {
419
+ throw new Error(`Unable to handle prop spread: ${name}`);
420
+ }
421
+ }
422
+ }
423
+
424
+ removeKnownExtends(
425
+ typeDefinition: $ReadOnlyArray<PropAST>,
426
+ types: TypeDeclarationMap,
427
+ ): $ReadOnlyArray<PropAST> {
428
+ return typeDefinition.filter(
429
+ prop =>
430
+ prop.type !== 'ObjectTypeSpreadProperty' ||
431
+ this.extendsForProp(prop, types, this) === null,
432
+ );
433
+ }
434
+
435
+ getProps(
436
+ typeDefinition: $ReadOnlyArray<PropAST>,
437
+ types: TypeDeclarationMap,
438
+ ): {
439
+ props: $ReadOnlyArray<NamedShape<PropTypeAnnotation>>,
440
+ extendsProps: $ReadOnlyArray<ExtendsPropsShape>,
441
+ } {
442
+ const nonExtendsProps = this.removeKnownExtends(typeDefinition, types);
443
+ const props = flattenProperties(nonExtendsProps, types, this)
444
+ .map(property => buildPropSchema(property, types, this))
445
+ .filter(Boolean);
446
+
447
+ return {
448
+ props,
449
+ extendsProps: this.getExtendsProps(typeDefinition, types),
450
+ };
451
+ }
452
+
453
+ getProperties(typeName: string, types: TypeDeclarationMap): $FlowFixMe {
454
+ const typeAlias = types[typeName];
455
+ try {
456
+ return typeAlias.right.typeParameters.params[0].properties;
457
+ } catch (e) {
458
+ throw new Error(
459
+ `Failed to find type definition for "${typeName}", please check that you have a valid codegen flow file`,
460
+ );
461
+ }
462
+ }
463
+
464
+ nextNodeForTypeAlias(typeAnnotation: $FlowFixMe): $FlowFixMe {
465
+ return typeAnnotation.right;
466
+ }
467
+
468
+ nextNodeForEnum(typeAnnotation: $FlowFixMe): $FlowFixMe {
469
+ return typeAnnotation.body;
470
+ }
471
+
472
+ genericTypeAnnotationErrorMessage(typeAnnotation: $FlowFixMe): string {
473
+ return `A non GenericTypeAnnotation must be a type declaration ('${this.typeAlias}') or enum ('${this.enumDeclaration}'). Instead, got the unsupported ${typeAnnotation.type}.`;
474
+ }
475
+
476
+ extractTypeFromTypeAnnotation(typeAnnotation: $FlowFixMe): string {
477
+ return typeAnnotation.type === 'GenericTypeAnnotation'
478
+ ? typeAnnotation.id.name
479
+ : typeAnnotation.type;
480
+ }
481
+
482
+ getObjectProperties(typeAnnotation: $FlowFixMe): $FlowFixMe {
483
+ return typeAnnotation.properties;
484
+ }
485
+
486
+ getLiteralValue(option: $FlowFixMe): $FlowFixMe {
487
+ return option.value;
488
+ }
489
+
490
+ getPaperTopLevelNameDeprecated(typeAnnotation: $FlowFixMe): $FlowFixMe {
491
+ return typeAnnotation.typeParameters.params.length > 1
492
+ ? typeAnnotation.typeParameters.params[1].value
493
+ : null;
494
+ }
246
495
  }
@@ -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,
@@ -184,12 +189,16 @@ function wrapModuleSchema(nativeModuleSchema, hasteModuleName) {
184
189
  },
185
190
  };
186
191
  }
192
+
193
+ // $FlowFixMe[unsupported-variance-annotation]
187
194
  function unwrapNullable(x) {
188
195
  if (x.type === 'NullableTypeAnnotation') {
189
196
  return [x.typeAnnotation, true];
190
197
  }
191
198
  return [x, false];
192
199
  }
200
+
201
+ // $FlowFixMe[unsupported-variance-annotation]
193
202
  function wrapNullable(nullable, typeAnnotation) {
194
203
  if (!nullable) {
195
204
  return typeAnnotation;
@@ -395,7 +404,6 @@ function buildPropertySchema(
395
404
  enumMap,
396
405
  tryParse,
397
406
  cxxOnly,
398
- resolveTypeAnnotation,
399
407
  translateTypeAnnotation,
400
408
  parser,
401
409
  ) {
@@ -409,7 +417,8 @@ function buildPropertySchema(
409
417
  ? property
410
418
  : property.typeAnnotation;
411
419
  }
412
- var _resolveTypeAnnotatio = resolveTypeAnnotation(value, types);
420
+ const resolveTypeAnnotationFN = parser.getResolveTypeAnnotationFN();
421
+ var _resolveTypeAnnotatio = resolveTypeAnnotationFN(value, types, parser);
413
422
  nullable = _resolveTypeAnnotatio.nullable;
414
423
  value = _resolveTypeAnnotatio.typeAnnotation;
415
424
  throwIfModuleTypeIsUnsupported(
@@ -446,7 +455,6 @@ function buildSchemaFromConfigType(
446
455
  buildComponentSchema,
447
456
  buildModuleSchema,
448
457
  parser,
449
- resolveTypeAnnotation,
450
458
  translateTypeAnnotation,
451
459
  ) {
452
460
  switch (configType) {
@@ -468,7 +476,6 @@ function buildSchemaFromConfigType(
468
476
  ast,
469
477
  tryParse,
470
478
  parser,
471
- resolveTypeAnnotation,
472
479
  translateTypeAnnotation,
473
480
  ),
474
481
  );
@@ -503,7 +510,6 @@ function buildSchema(
503
510
  buildModuleSchema,
504
511
  Visitor,
505
512
  parser,
506
- resolveTypeAnnotation,
507
513
  translateTypeAnnotation,
508
514
  ) {
509
515
  // Early return for non-Spec JavaScript files
@@ -525,7 +531,6 @@ function buildSchema(
525
531
  buildComponentSchema,
526
532
  buildModuleSchema,
527
533
  parser,
528
- resolveTypeAnnotation,
529
534
  translateTypeAnnotation,
530
535
  );
531
536
  }
@@ -600,7 +605,6 @@ const buildModuleSchema = (
600
605
  ast,
601
606
  tryParse,
602
607
  parser,
603
- resolveTypeAnnotation,
604
608
  translateTypeAnnotation,
605
609
  ) => {
606
610
  const language = parser.language();
@@ -658,7 +662,6 @@ const buildModuleSchema = (
658
662
  enumMap,
659
663
  tryParse,
660
664
  cxxOnly,
661
- resolveTypeAnnotation,
662
665
  translateTypeAnnotation,
663
666
  parser,
664
667
  ),
@@ -812,7 +815,7 @@ function getCommandTypeNameAndOptionsExpression(namedExport, parser) {
812
815
  );
813
816
  }
814
817
  return {
815
- commandTypeName: parser.nameForGenericTypeAnnotation(typeArgumentParam),
818
+ commandTypeName: parser.getTypeAnnotationName(typeArgumentParam),
816
819
  commandOptionsExpression: callExpression.arguments[0],
817
820
  };
818
821
  }
@@ -821,6 +824,250 @@ function propertyNames(properties) {
821
824
  .map(property => property && property.key && property.key.name)
822
825
  .filter(Boolean);
823
826
  }
827
+ function extendsForProp(prop, types, parser) {
828
+ const argument = parser.argumentForProp(prop);
829
+ if (!argument) {
830
+ console.log('null', prop);
831
+ }
832
+ const name = parser.nameForArgument(prop);
833
+ if (types[name] != null) {
834
+ // This type is locally defined in the file
835
+ return null;
836
+ }
837
+ switch (name) {
838
+ case 'ViewProps':
839
+ return {
840
+ type: 'ReactNativeBuiltInType',
841
+ knownTypeName: 'ReactNativeCoreViewProps',
842
+ };
843
+ default: {
844
+ throw new Error(`Unable to handle prop spread: ${name}`);
845
+ }
846
+ }
847
+ }
848
+ function buildPropSchema(property, types, parser) {
849
+ const getSchemaInfoFN = parser.getGetSchemaInfoFN();
850
+ const info = getSchemaInfoFN(property, types);
851
+ if (info == null) {
852
+ return null;
853
+ }
854
+ const name = info.name,
855
+ optional = info.optional,
856
+ typeAnnotation = info.typeAnnotation,
857
+ defaultValue = info.defaultValue,
858
+ withNullDefault = info.withNullDefault;
859
+ const getTypeAnnotationFN = parser.getGetTypeAnnotationFN();
860
+ return {
861
+ name,
862
+ optional,
863
+ typeAnnotation: getTypeAnnotationFN(
864
+ name,
865
+ typeAnnotation,
866
+ defaultValue,
867
+ withNullDefault,
868
+ types,
869
+ parser,
870
+ buildPropSchema,
871
+ ),
872
+ };
873
+ }
874
+
875
+ /* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
876
+ * LTI update could not be added via codemod */
877
+ function getEventArgument(argumentProps, parser, getPropertyType) {
878
+ return {
879
+ type: 'ObjectTypeAnnotation',
880
+ properties: argumentProps.map(member =>
881
+ buildPropertiesForEvent(member, parser, getPropertyType),
882
+ ),
883
+ };
884
+ }
885
+
886
+ /* $FlowFixMe[signature-verification-failure] there's no flowtype for AST.
887
+ * TODO(T108222691): Use flow-types for @babel/parser */
888
+ function findComponentConfig(ast, parser) {
889
+ const foundConfigs = [];
890
+ const defaultExports = ast.body.filter(
891
+ node => node.type === 'ExportDefaultDeclaration',
892
+ );
893
+ defaultExports.forEach(statement => {
894
+ findNativeComponentType(statement, foundConfigs, parser);
895
+ });
896
+ throwIfConfigNotfound(foundConfigs);
897
+ throwIfMoreThanOneConfig(foundConfigs);
898
+ const foundConfig = foundConfigs[0];
899
+ const namedExports = ast.body.filter(
900
+ node => node.type === 'ExportNamedDeclaration',
901
+ );
902
+ const commandsTypeNames = namedExports
903
+ .map(statement => getCommandTypeNameAndOptionsExpression(statement, parser))
904
+ .filter(Boolean);
905
+ throwIfMoreThanOneCodegenNativecommands(commandsTypeNames);
906
+ return createComponentConfig(foundConfig, commandsTypeNames);
907
+ }
908
+
909
+ // $FlowFixMe[signature-verification-failure] there's no flowtype for AST
910
+ function getCommandProperties(ast, parser) {
911
+ const _findComponentConfig = findComponentConfig(ast, parser),
912
+ commandTypeName = _findComponentConfig.commandTypeName,
913
+ commandOptionsExpression = _findComponentConfig.commandOptionsExpression;
914
+ if (commandTypeName == null) {
915
+ return [];
916
+ }
917
+ const types = parser.getTypes(ast);
918
+ const typeAlias = types[commandTypeName];
919
+ throwIfTypeAliasIsNotInterface(typeAlias, parser);
920
+ const properties = parser.bodyProperties(typeAlias);
921
+ if (!properties) {
922
+ throw new Error(
923
+ `Failed to find type definition for "${commandTypeName}", please check that you have a valid codegen file`,
924
+ );
925
+ }
926
+ const commandPropertyNames = propertyNames(properties);
927
+ const commandOptions = getCommandOptions(commandOptionsExpression);
928
+ if (commandOptions == null || commandOptions.supportedCommands == null) {
929
+ throw new Error(
930
+ 'codegenNativeCommands must be given an options object with supportedCommands array',
931
+ );
932
+ }
933
+ if (
934
+ commandOptions.supportedCommands.length !== commandPropertyNames.length ||
935
+ !commandOptions.supportedCommands.every(supportedCommand =>
936
+ commandPropertyNames.includes(supportedCommand),
937
+ )
938
+ ) {
939
+ throw new Error(
940
+ `codegenNativeCommands expected the same supportedCommands specified in the ${commandTypeName} interface: ${commandPropertyNames.join(
941
+ ', ',
942
+ )}`,
943
+ );
944
+ }
945
+ return properties;
946
+ }
947
+ function getTypeResolutionStatus(type, typeAnnotation, parser) {
948
+ return {
949
+ successful: true,
950
+ type,
951
+ name: parser.getTypeAnnotationName(typeAnnotation),
952
+ };
953
+ }
954
+ function handleGenericTypeAnnotation(
955
+ typeAnnotation,
956
+ resolvedTypeAnnotation,
957
+ parser,
958
+ ) {
959
+ let typeResolutionStatus;
960
+ let node;
961
+ switch (resolvedTypeAnnotation.type) {
962
+ case parser.typeAlias: {
963
+ typeResolutionStatus = getTypeResolutionStatus(
964
+ 'alias',
965
+ typeAnnotation,
966
+ parser,
967
+ );
968
+ node = parser.nextNodeForTypeAlias(resolvedTypeAnnotation);
969
+ break;
970
+ }
971
+ case parser.enumDeclaration: {
972
+ typeResolutionStatus = getTypeResolutionStatus(
973
+ 'enum',
974
+ typeAnnotation,
975
+ parser,
976
+ );
977
+ node = parser.nextNodeForEnum(resolvedTypeAnnotation);
978
+ break;
979
+ }
980
+ // parser.interfaceDeclaration is not used here because for flow it should fall through to default case and throw an error
981
+ case 'TSInterfaceDeclaration': {
982
+ typeResolutionStatus = getTypeResolutionStatus(
983
+ 'alias',
984
+ typeAnnotation,
985
+ parser,
986
+ );
987
+ node = resolvedTypeAnnotation;
988
+ break;
989
+ }
990
+ default: {
991
+ throw new TypeError(
992
+ parser.genericTypeAnnotationErrorMessage(resolvedTypeAnnotation),
993
+ );
994
+ }
995
+ }
996
+ return {
997
+ typeAnnotation: node,
998
+ typeResolutionStatus,
999
+ };
1000
+ }
1001
+ function buildPropertiesForEvent(property, parser, getPropertyType) {
1002
+ const name = property.key.name;
1003
+ const optional = parser.isOptionalProperty(property);
1004
+ const typeAnnotation = parser.getTypeAnnotationFromProperty(property);
1005
+ return getPropertyType(name, optional, typeAnnotation, parser);
1006
+ }
1007
+ function verifyPropNotAlreadyDefined(props, needleProp) {
1008
+ const propName = needleProp.key.name;
1009
+ const foundProp = props.some(prop => prop.key.name === propName);
1010
+ if (foundProp) {
1011
+ throw new Error(`A prop was already defined with the name ${propName}`);
1012
+ }
1013
+ }
1014
+ function handleEventHandler(
1015
+ name,
1016
+ typeAnnotation,
1017
+ parser,
1018
+ types,
1019
+ findEventArgumentsAndType,
1020
+ ) {
1021
+ const eventType = name === 'BubblingEventHandler' ? 'bubble' : 'direct';
1022
+ const paperTopLevelNameDeprecated =
1023
+ parser.getPaperTopLevelNameDeprecated(typeAnnotation);
1024
+ switch (typeAnnotation.typeParameters.params[0].type) {
1025
+ case parser.nullLiteralTypeAnnotation:
1026
+ case parser.undefinedLiteralTypeAnnotation:
1027
+ return {
1028
+ argumentProps: [],
1029
+ bubblingType: eventType,
1030
+ paperTopLevelNameDeprecated,
1031
+ };
1032
+ default:
1033
+ return findEventArgumentsAndType(
1034
+ parser,
1035
+ typeAnnotation.typeParameters.params[0],
1036
+ types,
1037
+ eventType,
1038
+ paperTopLevelNameDeprecated,
1039
+ );
1040
+ }
1041
+ }
1042
+ function emitBuildEventSchema(
1043
+ paperTopLevelNameDeprecated,
1044
+ name,
1045
+ optional,
1046
+ nonNullableBubblingType,
1047
+ argument,
1048
+ ) {
1049
+ if (paperTopLevelNameDeprecated != null) {
1050
+ return {
1051
+ name,
1052
+ optional,
1053
+ bubblingType: nonNullableBubblingType,
1054
+ paperTopLevelNameDeprecated,
1055
+ typeAnnotation: {
1056
+ type: 'EventTypeAnnotation',
1057
+ argument: argument,
1058
+ },
1059
+ };
1060
+ }
1061
+ return {
1062
+ name,
1063
+ optional,
1064
+ bubblingType: nonNullableBubblingType,
1065
+ typeAnnotation: {
1066
+ type: 'EventTypeAnnotation',
1067
+ argument: argument,
1068
+ },
1069
+ };
1070
+ }
824
1071
  module.exports = {
825
1072
  wrapModuleSchema,
826
1073
  unwrapNullable,
@@ -840,4 +1087,15 @@ module.exports = {
840
1087
  getCommandOptions,
841
1088
  getOptions,
842
1089
  getCommandTypeNameAndOptionsExpression,
1090
+ extendsForProp,
1091
+ buildPropSchema,
1092
+ getEventArgument,
1093
+ findComponentConfig,
1094
+ getCommandProperties,
1095
+ handleGenericTypeAnnotation,
1096
+ getTypeResolutionStatus,
1097
+ buildPropertiesForEvent,
1098
+ verifyPropNotAlreadyDefined,
1099
+ handleEventHandler,
1100
+ emitBuildEventSchema,
843
1101
  };