@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
@@ -78,28 +78,26 @@ function _iterableToArrayLimit(arr, i) {
78
78
  function _arrayWithHoles(arr) {
79
79
  if (Array.isArray(arr)) return arr;
80
80
  }
81
- const _require = require('../utils'),
82
- resolveTypeAnnotation = _require.resolveTypeAnnotation;
83
- const _require2 = require('../../parsers-commons'),
84
- unwrapNullable = _require2.unwrapNullable,
85
- wrapNullable = _require2.wrapNullable,
81
+ const _require = require('../../parsers-commons'),
82
+ unwrapNullable = _require.unwrapNullable,
83
+ wrapNullable = _require.wrapNullable,
86
84
  assertGenericTypeAnnotationHasExactlyOneTypeParameter =
87
- _require2.assertGenericTypeAnnotationHasExactlyOneTypeParameter,
88
- parseObjectProperty = _require2.parseObjectProperty;
89
- const _require3 = require('../../parsers-primitives'),
90
- emitArrayType = _require3.emitArrayType,
91
- emitFunction = _require3.emitFunction,
92
- emitGenericObject = _require3.emitGenericObject,
93
- emitPromise = _require3.emitPromise,
94
- emitRootTag = _require3.emitRootTag,
95
- emitUnion = _require3.emitUnion,
96
- emitCommonTypes = _require3.emitCommonTypes,
97
- typeAliasResolution = _require3.typeAliasResolution,
98
- typeEnumResolution = _require3.typeEnumResolution;
99
- const _require4 = require('../../errors'),
85
+ _require.assertGenericTypeAnnotationHasExactlyOneTypeParameter,
86
+ parseObjectProperty = _require.parseObjectProperty;
87
+ const _require2 = require('../../parsers-primitives'),
88
+ emitArrayType = _require2.emitArrayType,
89
+ emitFunction = _require2.emitFunction,
90
+ emitDictionary = _require2.emitDictionary,
91
+ emitPromise = _require2.emitPromise,
92
+ emitRootTag = _require2.emitRootTag,
93
+ emitUnion = _require2.emitUnion,
94
+ emitCommonTypes = _require2.emitCommonTypes,
95
+ typeAliasResolution = _require2.typeAliasResolution,
96
+ typeEnumResolution = _require2.typeEnumResolution;
97
+ const _require3 = require('../../errors'),
100
98
  UnsupportedTypeAnnotationParserError =
101
- _require4.UnsupportedTypeAnnotationParserError,
102
- UnsupportedGenericParserError = _require4.UnsupportedGenericParserError;
99
+ _require3.UnsupportedTypeAnnotationParserError,
100
+ UnsupportedGenericParserError = _require3.UnsupportedGenericParserError;
103
101
  function translateTypeAnnotation(
104
102
  hasteModuleName,
105
103
  /**
@@ -113,16 +111,18 @@ function translateTypeAnnotation(
113
111
  cxxOnly,
114
112
  parser,
115
113
  ) {
116
- const _resolveTypeAnnotatio = resolveTypeAnnotation(
114
+ const resolveTypeAnnotationFN = parser.getResolveTypeAnnotationFN();
115
+ const _resolveTypeAnnotatio = resolveTypeAnnotationFN(
117
116
  flowTypeAnnotation,
118
117
  types,
118
+ parser,
119
119
  ),
120
120
  nullable = _resolveTypeAnnotatio.nullable,
121
121
  typeAnnotation = _resolveTypeAnnotatio.typeAnnotation,
122
122
  typeResolutionStatus = _resolveTypeAnnotatio.typeResolutionStatus;
123
123
  switch (typeAnnotation.type) {
124
124
  case 'GenericTypeAnnotation': {
125
- switch (typeAnnotation.id.name) {
125
+ switch (parser.getTypeAnnotationName(typeAnnotation)) {
126
126
  case 'RootTag': {
127
127
  return emitRootTag(nullable);
128
128
  }
@@ -210,7 +210,7 @@ function translateTypeAnnotation(
210
210
  // check the property type to prevent developers from using unsupported types
211
211
  // the return value from `translateTypeAnnotation` is unused
212
212
  const propertyType = indexers[0].value;
213
- translateTypeAnnotation(
213
+ const valueType = translateTypeAnnotation(
214
214
  hasteModuleName,
215
215
  propertyType,
216
216
  types,
@@ -221,7 +221,7 @@ function translateTypeAnnotation(
221
221
  parser,
222
222
  );
223
223
  // no need to do further checking
224
- return emitGenericObject(nullable);
224
+ return emitDictionary(nullable, valueType);
225
225
  }
226
226
  }
227
227
  const objectTypeAnnotation = {
@@ -22,7 +22,6 @@ import type {
22
22
  import type {Parser} from '../../parser';
23
23
  import type {ParserErrorCapturer, TypeDeclarationMap} from '../../utils';
24
24
 
25
- const {resolveTypeAnnotation} = require('../utils');
26
25
  const {
27
26
  unwrapNullable,
28
27
  wrapNullable,
@@ -32,7 +31,7 @@ const {
32
31
  const {
33
32
  emitArrayType,
34
33
  emitFunction,
35
- emitGenericObject,
34
+ emitDictionary,
36
35
  emitPromise,
37
36
  emitRootTag,
38
37
  emitUnion,
@@ -59,12 +58,13 @@ function translateTypeAnnotation(
59
58
  cxxOnly: boolean,
60
59
  parser: Parser,
61
60
  ): Nullable<NativeModuleTypeAnnotation> {
61
+ const resolveTypeAnnotationFN = parser.getResolveTypeAnnotationFN();
62
62
  const {nullable, typeAnnotation, typeResolutionStatus} =
63
- resolveTypeAnnotation(flowTypeAnnotation, types);
63
+ resolveTypeAnnotationFN(flowTypeAnnotation, types, parser);
64
64
 
65
65
  switch (typeAnnotation.type) {
66
66
  case 'GenericTypeAnnotation': {
67
- switch (typeAnnotation.id.name) {
67
+ switch (parser.getTypeAnnotationName(typeAnnotation)) {
68
68
  case 'RootTag': {
69
69
  return emitRootTag(nullable);
70
70
  }
@@ -152,7 +152,7 @@ function translateTypeAnnotation(
152
152
  // check the property type to prevent developers from using unsupported types
153
153
  // the return value from `translateTypeAnnotation` is unused
154
154
  const propertyType = indexers[0].value;
155
- translateTypeAnnotation(
155
+ const valueType = translateTypeAnnotation(
156
156
  hasteModuleName,
157
157
  propertyType,
158
158
  types,
@@ -163,7 +163,7 @@ function translateTypeAnnotation(
163
163
  parser,
164
164
  );
165
165
  // no need to do further checking
166
- return emitGenericObject(nullable);
166
+ return emitDictionary(nullable, valueType);
167
167
  }
168
168
  }
169
169
 
@@ -5,6 +5,13 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import type {Parser} from '../parser';
8
+ import type { Parser } from '../parser';
9
+ import type { SchemaType } from '../../CodegenSchema';
10
+ import type { ParserType } from '../errors';
9
11
 
10
- export declare class FlowParser implements Parser{}
12
+ export declare class FlowParser implements Parser {
13
+ language(): ParserType;
14
+ parseFile(filename: string): SchemaType;
15
+ parseString(contents: string, filename?: string): SchemaType;
16
+ parseModuleFixture(filename: string): SchemaType;
17
+ }
@@ -38,27 +38,31 @@ function _toPrimitive(input, hint) {
38
38
  }
39
39
  return (hint === 'string' ? String : Number)(input);
40
40
  }
41
- const _require = require('./modules'),
42
- flowTranslateTypeAnnotation = _require.flowTranslateTypeAnnotation;
41
+ const invariant = require('invariant');
42
+ const _require = require('./components/componentsUtils'),
43
+ getSchemaInfo = _require.getSchemaInfo,
44
+ getTypeAnnotation = _require.getTypeAnnotation,
45
+ flattenProperties = _require.flattenProperties;
46
+ const _require2 = require('./modules'),
47
+ flowTranslateTypeAnnotation = _require2.flowTranslateTypeAnnotation;
43
48
 
44
49
  // $FlowFixMe[untyped-import] there's no flowtype flow-parser
45
50
  const flowParser = require('flow-parser');
46
- const _require2 = require('../parsers-commons'),
47
- buildSchema = _require2.buildSchema;
48
- const _require3 = require('../parsers-primitives'),
49
- Visitor = _require3.Visitor;
50
- const _require4 = require('./components'),
51
- buildComponentSchema = _require4.buildComponentSchema;
52
- const _require5 = require('../schema.js'),
53
- wrapComponentSchema = _require5.wrapComponentSchema;
54
- const _require6 = require('../parsers-commons.js'),
55
- buildModuleSchema = _require6.buildModuleSchema;
56
- const _require7 = require('./utils'),
57
- resolveTypeAnnotation = _require7.resolveTypeAnnotation;
51
+ const _require3 = require('../parsers-commons'),
52
+ buildSchema = _require3.buildSchema,
53
+ buildPropSchema = _require3.buildPropSchema,
54
+ buildModuleSchema = _require3.buildModuleSchema,
55
+ handleGenericTypeAnnotation = _require3.handleGenericTypeAnnotation;
56
+ const _require4 = require('../parsers-primitives'),
57
+ Visitor = _require4.Visitor;
58
+ const _require5 = require('./components'),
59
+ buildComponentSchema = _require5.buildComponentSchema;
60
+ const _require6 = require('../schema.js'),
61
+ wrapComponentSchema = _require6.wrapComponentSchema;
58
62
  const fs = require('fs');
59
- const _require8 = require('../errors'),
63
+ const _require7 = require('../errors'),
60
64
  UnsupportedObjectPropertyTypeAnnotationParserError =
61
- _require8.UnsupportedObjectPropertyTypeAnnotationParserError;
65
+ _require7.UnsupportedObjectPropertyTypeAnnotationParserError;
62
66
  class FlowParser {
63
67
  constructor() {
64
68
  _defineProperty(
@@ -66,6 +70,19 @@ class FlowParser {
66
70
  'typeParameterInstantiation',
67
71
  'TypeParameterInstantiation',
68
72
  );
73
+ _defineProperty(this, 'typeAlias', 'TypeAlias');
74
+ _defineProperty(this, 'enumDeclaration', 'EnumDeclaration');
75
+ _defineProperty(this, 'interfaceDeclaration', 'InterfaceDeclaration');
76
+ _defineProperty(
77
+ this,
78
+ 'nullLiteralTypeAnnotation',
79
+ 'NullLiteralTypeAnnotation',
80
+ );
81
+ _defineProperty(
82
+ this,
83
+ 'undefinedLiteralTypeAnnotation',
84
+ 'VoidLiteralTypeAnnotation',
85
+ );
69
86
  }
70
87
  isProperty(property) {
71
88
  return property.type === 'ObjectTypeProperty';
@@ -84,7 +101,7 @@ class FlowParser {
84
101
  language() {
85
102
  return 'Flow';
86
103
  }
87
- nameForGenericTypeAnnotation(typeAnnotation) {
104
+ getTypeAnnotationName(typeAnnotation) {
88
105
  var _typeAnnotation$id;
89
106
  return typeAnnotation === null || typeAnnotation === void 0
90
107
  ? void 0
@@ -122,7 +139,6 @@ class FlowParser {
122
139
  buildModuleSchema,
123
140
  Visitor,
124
141
  this,
125
- resolveTypeAnnotation,
126
142
  flowTranslateTypeAnnotation,
127
143
  );
128
144
  }
@@ -315,6 +331,151 @@ class FlowParser {
315
331
  convertKeywordToTypeAnnotation(keyword) {
316
332
  return keyword;
317
333
  }
334
+ argumentForProp(prop) {
335
+ return prop.argument;
336
+ }
337
+ nameForArgument(prop) {
338
+ return prop.argument.id.name;
339
+ }
340
+ isOptionalProperty(property) {
341
+ return (
342
+ property.value.type === 'NullableTypeAnnotation' || property.optional
343
+ );
344
+ }
345
+ getGetSchemaInfoFN() {
346
+ return getSchemaInfo;
347
+ }
348
+ getTypeAnnotationFromProperty(property) {
349
+ return property.value.type === 'NullableTypeAnnotation'
350
+ ? property.value.typeAnnotation
351
+ : property.value;
352
+ }
353
+ getGetTypeAnnotationFN() {
354
+ return getTypeAnnotation;
355
+ }
356
+ getResolvedTypeAnnotation(typeAnnotation, types, parser) {
357
+ invariant(
358
+ typeAnnotation != null,
359
+ 'resolveTypeAnnotation(): typeAnnotation cannot be null',
360
+ );
361
+ let node = typeAnnotation;
362
+ let nullable = false;
363
+ let typeResolutionStatus = {
364
+ successful: false,
365
+ };
366
+ for (;;) {
367
+ if (node.type === 'NullableTypeAnnotation') {
368
+ nullable = true;
369
+ node = node.typeAnnotation;
370
+ continue;
371
+ }
372
+ if (node.type !== 'GenericTypeAnnotation') {
373
+ break;
374
+ }
375
+ const typeAnnotationName = this.getTypeAnnotationName(node);
376
+ const resolvedTypeAnnotation = types[typeAnnotationName];
377
+ if (resolvedTypeAnnotation == null) {
378
+ break;
379
+ }
380
+ const _handleGenericTypeAnn = handleGenericTypeAnnotation(
381
+ node,
382
+ resolvedTypeAnnotation,
383
+ this,
384
+ ),
385
+ typeAnnotationNode = _handleGenericTypeAnn.typeAnnotation,
386
+ status = _handleGenericTypeAnn.typeResolutionStatus;
387
+ typeResolutionStatus = status;
388
+ node = typeAnnotationNode;
389
+ }
390
+ return {
391
+ nullable: nullable,
392
+ typeAnnotation: node,
393
+ typeResolutionStatus,
394
+ };
395
+ }
396
+ getResolveTypeAnnotationFN() {
397
+ return (typeAnnotation, types, parser) =>
398
+ this.getResolvedTypeAnnotation(typeAnnotation, types, parser);
399
+ }
400
+ extendsForProp(prop, types, parser) {
401
+ const argument = this.argumentForProp(prop);
402
+ if (!argument) {
403
+ console.log('null', prop);
404
+ }
405
+ const name = parser.nameForArgument(prop);
406
+ if (types[name] != null) {
407
+ // This type is locally defined in the file
408
+ return null;
409
+ }
410
+ switch (name) {
411
+ case 'ViewProps':
412
+ return {
413
+ type: 'ReactNativeBuiltInType',
414
+ knownTypeName: 'ReactNativeCoreViewProps',
415
+ };
416
+ default: {
417
+ throw new Error(`Unable to handle prop spread: ${name}`);
418
+ }
419
+ }
420
+ }
421
+ removeKnownExtends(typeDefinition, types) {
422
+ return typeDefinition.filter(
423
+ prop =>
424
+ prop.type !== 'ObjectTypeSpreadProperty' ||
425
+ this.extendsForProp(prop, types, this) === null,
426
+ );
427
+ }
428
+ getExtendsProps(typeDefinition, types) {
429
+ return typeDefinition
430
+ .filter(prop => prop.type === 'ObjectTypeSpreadProperty')
431
+ .map(prop => this.extendsForProp(prop, types, this))
432
+ .filter(Boolean);
433
+ }
434
+ getProps(typeDefinition, types) {
435
+ const nonExtendsProps = this.removeKnownExtends(typeDefinition, types);
436
+ const props = flattenProperties(nonExtendsProps, types, this)
437
+ .map(property => buildPropSchema(property, types, this))
438
+ .filter(Boolean);
439
+ return {
440
+ props,
441
+ extendsProps: this.getExtendsProps(typeDefinition, types),
442
+ };
443
+ }
444
+ getProperties(typeName, types) {
445
+ const typeAlias = types[typeName];
446
+ try {
447
+ return typeAlias.right.typeParameters.params[0].properties;
448
+ } catch (e) {
449
+ throw new Error(
450
+ `Failed to find type definition for "${typeName}", please check that you have a valid codegen flow file`,
451
+ );
452
+ }
453
+ }
454
+ nextNodeForTypeAlias(typeAnnotation) {
455
+ return typeAnnotation.right;
456
+ }
457
+ nextNodeForEnum(typeAnnotation) {
458
+ return typeAnnotation.body;
459
+ }
460
+ genericTypeAnnotationErrorMessage(typeAnnotation) {
461
+ return `A non GenericTypeAnnotation must be a type declaration ('${this.typeAlias}') or enum ('${this.enumDeclaration}'). Instead, got the unsupported ${typeAnnotation.type}.`;
462
+ }
463
+ extractTypeFromTypeAnnotation(typeAnnotation) {
464
+ return typeAnnotation.type === 'GenericTypeAnnotation'
465
+ ? typeAnnotation.id.name
466
+ : typeAnnotation.type;
467
+ }
468
+ getObjectProperties(typeAnnotation) {
469
+ return typeAnnotation.properties;
470
+ }
471
+ getLiteralValue(option) {
472
+ return option.value;
473
+ }
474
+ getPaperTopLevelNameDeprecated(typeAnnotation) {
475
+ return typeAnnotation.typeParameters.params.length > 1
476
+ ? typeAnnotation.typeParameters.params[1].value
477
+ : null;
478
+ }
318
479
  }
319
480
  module.exports = {
320
481
  FlowParser,
@@ -20,22 +20,50 @@ import type {
20
20
  NativeModuleEnumMembers,
21
21
  NativeModuleAliasMap,
22
22
  NativeModuleEnumMap,
23
+ PropTypeAnnotation,
24
+ ExtendsPropsShape,
23
25
  } from '../../CodegenSchema';
24
26
  import type {ParserType} from '../errors';
25
- import type {Parser} from '../parser';
26
- import type {ParserErrorCapturer, TypeDeclarationMap} from '../utils';
27
+ import type {
28
+ GetSchemaInfoFN,
29
+ GetTypeAnnotationFN,
30
+ Parser,
31
+ ResolveTypeAnnotationFN,
32
+ } from '../parser';
33
+ import type {
34
+ ParserErrorCapturer,
35
+ TypeDeclarationMap,
36
+ PropAST,
37
+ TypeResolutionStatus,
38
+ } from '../utils';
39
+
40
+ type ExtendsForProp = null | {
41
+ type: 'ReactNativeBuiltInType',
42
+ knownTypeName: 'ReactNativeCoreViewProps',
43
+ };
44
+
45
+ const invariant = require('invariant');
46
+
47
+ const {
48
+ getSchemaInfo,
49
+ getTypeAnnotation,
50
+ flattenProperties,
51
+ } = require('./components/componentsUtils');
27
52
 
28
53
  const {flowTranslateTypeAnnotation} = require('./modules');
29
54
 
30
55
  // $FlowFixMe[untyped-import] there's no flowtype flow-parser
31
56
  const flowParser = require('flow-parser');
32
57
 
33
- const {buildSchema} = require('../parsers-commons');
58
+ const {
59
+ buildSchema,
60
+ buildPropSchema,
61
+ buildModuleSchema,
62
+ handleGenericTypeAnnotation,
63
+ } = require('../parsers-commons');
34
64
  const {Visitor} = require('../parsers-primitives');
35
65
  const {buildComponentSchema} = require('./components');
36
66
  const {wrapComponentSchema} = require('../schema.js');
37
- const {buildModuleSchema} = require('../parsers-commons.js');
38
- const {resolveTypeAnnotation} = require('./utils');
39
67
 
40
68
  const fs = require('fs');
41
69
 
@@ -45,6 +73,11 @@ const {
45
73
 
46
74
  class FlowParser implements Parser {
47
75
  typeParameterInstantiation: string = 'TypeParameterInstantiation';
76
+ typeAlias: string = 'TypeAlias';
77
+ enumDeclaration: string = 'EnumDeclaration';
78
+ interfaceDeclaration: string = 'InterfaceDeclaration';
79
+ nullLiteralTypeAnnotation: string = 'NullLiteralTypeAnnotation';
80
+ undefinedLiteralTypeAnnotation: string = 'VoidLiteralTypeAnnotation';
48
81
 
49
82
  isProperty(property: $FlowFixMe): boolean {
50
83
  return property.type === 'ObjectTypeProperty';
@@ -66,7 +99,7 @@ class FlowParser implements Parser {
66
99
  return 'Flow';
67
100
  }
68
101
 
69
- nameForGenericTypeAnnotation(typeAnnotation: $FlowFixMe): string {
102
+ getTypeAnnotationName(typeAnnotation: $FlowFixMe): string {
70
103
  return typeAnnotation?.id?.name;
71
104
  }
72
105
 
@@ -106,7 +139,6 @@ class FlowParser implements Parser {
106
139
  buildModuleSchema,
107
140
  Visitor,
108
141
  this,
109
- resolveTypeAnnotation,
110
142
  flowTranslateTypeAnnotation,
111
143
  );
112
144
  }
@@ -329,6 +361,198 @@ class FlowParser implements Parser {
329
361
  convertKeywordToTypeAnnotation(keyword: string): string {
330
362
  return keyword;
331
363
  }
364
+
365
+ argumentForProp(prop: PropAST): $FlowFixMe {
366
+ return prop.argument;
367
+ }
368
+
369
+ nameForArgument(prop: PropAST): $FlowFixMe {
370
+ return prop.argument.id.name;
371
+ }
372
+
373
+ isOptionalProperty(property: $FlowFixMe): boolean {
374
+ return (
375
+ property.value.type === 'NullableTypeAnnotation' || property.optional
376
+ );
377
+ }
378
+
379
+ getGetSchemaInfoFN(): GetSchemaInfoFN {
380
+ return getSchemaInfo;
381
+ }
382
+
383
+ getTypeAnnotationFromProperty(property: PropAST): $FlowFixMe {
384
+ return property.value.type === 'NullableTypeAnnotation'
385
+ ? property.value.typeAnnotation
386
+ : property.value;
387
+ }
388
+
389
+ getGetTypeAnnotationFN(): GetTypeAnnotationFN {
390
+ return getTypeAnnotation;
391
+ }
392
+
393
+ getResolvedTypeAnnotation(
394
+ typeAnnotation: $FlowFixMe,
395
+ types: TypeDeclarationMap,
396
+ parser: Parser,
397
+ ): {
398
+ nullable: boolean,
399
+ typeAnnotation: $FlowFixMe,
400
+ typeResolutionStatus: TypeResolutionStatus,
401
+ } {
402
+ invariant(
403
+ typeAnnotation != null,
404
+ 'resolveTypeAnnotation(): typeAnnotation cannot be null',
405
+ );
406
+
407
+ let node = typeAnnotation;
408
+ let nullable = false;
409
+ let typeResolutionStatus: TypeResolutionStatus = {
410
+ successful: false,
411
+ };
412
+
413
+ for (;;) {
414
+ if (node.type === 'NullableTypeAnnotation') {
415
+ nullable = true;
416
+ node = node.typeAnnotation;
417
+ continue;
418
+ }
419
+
420
+ if (node.type !== 'GenericTypeAnnotation') {
421
+ break;
422
+ }
423
+
424
+ const typeAnnotationName = this.getTypeAnnotationName(node);
425
+ const resolvedTypeAnnotation = types[typeAnnotationName];
426
+ if (resolvedTypeAnnotation == null) {
427
+ break;
428
+ }
429
+
430
+ const {typeAnnotation: typeAnnotationNode, typeResolutionStatus: status} =
431
+ handleGenericTypeAnnotation(node, resolvedTypeAnnotation, this);
432
+ typeResolutionStatus = status;
433
+ node = typeAnnotationNode;
434
+ }
435
+
436
+ return {
437
+ nullable: nullable,
438
+ typeAnnotation: node,
439
+ typeResolutionStatus,
440
+ };
441
+ }
442
+
443
+ getResolveTypeAnnotationFN(): ResolveTypeAnnotationFN {
444
+ return (typeAnnotation, types, parser) =>
445
+ this.getResolvedTypeAnnotation(typeAnnotation, types, parser);
446
+ }
447
+ extendsForProp(
448
+ prop: PropAST,
449
+ types: TypeDeclarationMap,
450
+ parser: Parser,
451
+ ): ExtendsForProp {
452
+ const argument = this.argumentForProp(prop);
453
+ if (!argument) {
454
+ console.log('null', prop);
455
+ }
456
+ const name = parser.nameForArgument(prop);
457
+
458
+ if (types[name] != null) {
459
+ // This type is locally defined in the file
460
+ return null;
461
+ }
462
+
463
+ switch (name) {
464
+ case 'ViewProps':
465
+ return {
466
+ type: 'ReactNativeBuiltInType',
467
+ knownTypeName: 'ReactNativeCoreViewProps',
468
+ };
469
+ default: {
470
+ throw new Error(`Unable to handle prop spread: ${name}`);
471
+ }
472
+ }
473
+ }
474
+
475
+ removeKnownExtends(
476
+ typeDefinition: $ReadOnlyArray<PropAST>,
477
+ types: TypeDeclarationMap,
478
+ ): $ReadOnlyArray<PropAST> {
479
+ return typeDefinition.filter(
480
+ prop =>
481
+ prop.type !== 'ObjectTypeSpreadProperty' ||
482
+ this.extendsForProp(prop, types, this) === null,
483
+ );
484
+ }
485
+
486
+ getExtendsProps(
487
+ typeDefinition: $ReadOnlyArray<PropAST>,
488
+ types: TypeDeclarationMap,
489
+ ): $ReadOnlyArray<ExtendsPropsShape> {
490
+ return typeDefinition
491
+ .filter(prop => prop.type === 'ObjectTypeSpreadProperty')
492
+ .map(prop => this.extendsForProp(prop, types, this))
493
+ .filter(Boolean);
494
+ }
495
+
496
+ getProps(
497
+ typeDefinition: $ReadOnlyArray<PropAST>,
498
+ types: TypeDeclarationMap,
499
+ ): {
500
+ props: $ReadOnlyArray<NamedShape<PropTypeAnnotation>>,
501
+ extendsProps: $ReadOnlyArray<ExtendsPropsShape>,
502
+ } {
503
+ const nonExtendsProps = this.removeKnownExtends(typeDefinition, types);
504
+ const props = flattenProperties(nonExtendsProps, types, this)
505
+ .map(property => buildPropSchema(property, types, this))
506
+ .filter(Boolean);
507
+
508
+ return {
509
+ props,
510
+ extendsProps: this.getExtendsProps(typeDefinition, types),
511
+ };
512
+ }
513
+
514
+ getProperties(typeName: string, types: TypeDeclarationMap): $FlowFixMe {
515
+ const typeAlias = types[typeName];
516
+ try {
517
+ return typeAlias.right.typeParameters.params[0].properties;
518
+ } catch (e) {
519
+ throw new Error(
520
+ `Failed to find type definition for "${typeName}", please check that you have a valid codegen flow file`,
521
+ );
522
+ }
523
+ }
524
+
525
+ nextNodeForTypeAlias(typeAnnotation: $FlowFixMe): $FlowFixMe {
526
+ return typeAnnotation.right;
527
+ }
528
+
529
+ nextNodeForEnum(typeAnnotation: $FlowFixMe): $FlowFixMe {
530
+ return typeAnnotation.body;
531
+ }
532
+
533
+ genericTypeAnnotationErrorMessage(typeAnnotation: $FlowFixMe): string {
534
+ return `A non GenericTypeAnnotation must be a type declaration ('${this.typeAlias}') or enum ('${this.enumDeclaration}'). Instead, got the unsupported ${typeAnnotation.type}.`;
535
+ }
536
+
537
+ extractTypeFromTypeAnnotation(typeAnnotation: $FlowFixMe): string {
538
+ return typeAnnotation.type === 'GenericTypeAnnotation'
539
+ ? typeAnnotation.id.name
540
+ : typeAnnotation.type;
541
+ }
542
+
543
+ getObjectProperties(typeAnnotation: $FlowFixMe): $FlowFixMe {
544
+ return typeAnnotation.properties;
545
+ }
546
+
547
+ getLiteralValue(option: $FlowFixMe): $FlowFixMe {
548
+ return option.value;
549
+ }
550
+
551
+ getPaperTopLevelNameDeprecated(typeAnnotation: $FlowFixMe): $FlowFixMe {
552
+ return typeAnnotation.typeParameters.params.length > 1
553
+ ? typeAnnotation.typeParameters.params[1].value
554
+ : null;
555
+ }
332
556
  }
333
557
 
334
558
  module.exports = {