@react-native/codegen 0.72.1 → 0.72.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/lib/CodegenSchema.d.ts +348 -0
  2. package/lib/CodegenSchema.js.flow +31 -3
  3. package/lib/SchemaValidator.d.ts +11 -0
  4. package/lib/cli/combine/combine-js-to-schema.js +8 -8
  5. package/lib/cli/combine/combine-js-to-schema.js.flow +8 -7
  6. package/lib/cli/parser/parser.js +8 -15
  7. package/lib/cli/parser/parser.js.flow +8 -14
  8. package/lib/generators/Utils.js +16 -0
  9. package/lib/generators/Utils.js.flow +20 -0
  10. package/lib/generators/__test_fixtures__/fixtures.js +2 -1
  11. package/lib/generators/__test_fixtures__/fixtures.js.flow +2 -1
  12. package/lib/generators/components/ComponentsGeneratorUtils.js +10 -1
  13. package/lib/generators/components/ComponentsGeneratorUtils.js.flow +12 -2
  14. package/lib/generators/components/CppHelpers.js +8 -15
  15. package/lib/generators/components/CppHelpers.js.flow +8 -19
  16. package/lib/generators/components/GenerateEventEmitterCpp.js +7 -3
  17. package/lib/generators/components/GenerateEventEmitterCpp.js.flow +7 -3
  18. package/lib/generators/components/GenerateEventEmitterH.js +2 -2
  19. package/lib/generators/components/GenerateEventEmitterH.js.flow +1 -2
  20. package/lib/generators/components/GeneratePropsH.js +3 -4
  21. package/lib/generators/components/GeneratePropsH.js.flow +2 -4
  22. package/lib/generators/components/GeneratePropsJavaDelegate.js +2 -0
  23. package/lib/generators/components/GeneratePropsJavaDelegate.js.flow +2 -0
  24. package/lib/generators/components/GeneratePropsJavaInterface.js +3 -0
  25. package/lib/generators/components/GeneratePropsJavaInterface.js.flow +3 -0
  26. package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js +8 -0
  27. package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js.flow +12 -0
  28. package/lib/generators/components/GenerateTests.js +3 -2
  29. package/lib/generators/components/GenerateTests.js.flow +3 -1
  30. package/lib/generators/components/GenerateViewConfigJs.js +5 -2
  31. package/lib/generators/components/GenerateViewConfigJs.js.flow +5 -2
  32. package/lib/generators/components/JavaHelpers.js +9 -0
  33. package/lib/generators/components/JavaHelpers.js.flow +12 -1
  34. package/lib/generators/components/__test_fixtures__/fixtures.js +41 -0
  35. package/lib/generators/components/__test_fixtures__/fixtures.js.flow +42 -0
  36. package/lib/generators/modules/GenerateModuleCpp.js +9 -4
  37. package/lib/generators/modules/GenerateModuleCpp.js.flow +11 -3
  38. package/lib/generators/modules/GenerateModuleH.js +185 -33
  39. package/lib/generators/modules/GenerateModuleH.js.flow +203 -25
  40. package/lib/generators/modules/GenerateModuleJavaSpec.js +2 -2
  41. package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +5 -5
  42. package/lib/generators/modules/GenerateModuleJniCpp.js +2 -2
  43. package/lib/generators/modules/GenerateModuleJniCpp.js.flow +5 -5
  44. package/lib/generators/modules/GenerateModuleObjCpp/index.js +2 -2
  45. package/lib/generators/modules/GenerateModuleObjCpp/index.js.flow +2 -2
  46. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +2 -2
  47. package/lib/generators/modules/Utils.js +4 -0
  48. package/lib/generators/modules/Utils.js.flow +6 -0
  49. package/lib/generators/modules/__test_fixtures__/fixtures.js +152 -10
  50. package/lib/generators/modules/__test_fixtures__/fixtures.js.flow +152 -10
  51. package/lib/parsers/error-utils.js +1 -19
  52. package/lib/parsers/error-utils.js.flow +1 -19
  53. package/lib/parsers/errors.d.ts +10 -0
  54. package/lib/parsers/errors.js +9 -29
  55. package/lib/parsers/errors.js.flow +2 -20
  56. package/lib/parsers/flow/Visitor.js +37 -0
  57. package/lib/parsers/flow/Visitor.js.flow +41 -0
  58. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +20 -2
  59. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +20 -2
  60. package/lib/parsers/flow/components/commands.js +3 -0
  61. package/lib/parsers/flow/components/commands.js.flow +2 -1
  62. package/lib/parsers/flow/components/componentsUtils.js +10 -0
  63. package/lib/parsers/flow/components/componentsUtils.js.flow +11 -1
  64. package/lib/parsers/flow/components/events.js.flow +1 -1
  65. package/lib/parsers/flow/components/extends.js.flow +1 -1
  66. package/lib/parsers/flow/components/index.js.flow +1 -1
  67. package/lib/parsers/flow/components/options.js.flow +1 -1
  68. package/lib/parsers/flow/components/props.js.flow +1 -1
  69. package/lib/parsers/flow/modules/__test_fixtures__/failures.js +54 -0
  70. package/lib/parsers/flow/modules/__test_fixtures__/failures.js.flow +56 -0
  71. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js +64 -1
  72. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js.flow +66 -1
  73. package/lib/parsers/flow/modules/index.js +99 -25
  74. package/lib/parsers/flow/modules/index.js.flow +106 -22
  75. package/lib/parsers/flow/parser.d.ts +10 -0
  76. package/lib/parsers/flow/parser.js +122 -32
  77. package/lib/parsers/flow/parser.js.flow +144 -24
  78. package/lib/parsers/flow/utils.js +33 -19
  79. package/lib/parsers/flow/utils.js.flow +37 -22
  80. package/lib/parsers/parser.d.ts +17 -0
  81. package/lib/parsers/parser.js.flow +102 -17
  82. package/lib/parsers/parserMock.js +87 -30
  83. package/lib/parsers/parserMock.js.flow +118 -24
  84. package/lib/parsers/parsers-commons.js +121 -119
  85. package/lib/parsers/parsers-commons.js.flow +130 -131
  86. package/lib/parsers/parsers-primitives.js +75 -12
  87. package/lib/parsers/parsers-primitives.js.flow +92 -13
  88. package/lib/parsers/schema/index.d.ts +10 -0
  89. package/lib/parsers/typescript/Visitor.js +42 -0
  90. package/lib/parsers/typescript/Visitor.js.flow +47 -0
  91. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +22 -0
  92. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +22 -0
  93. package/lib/parsers/typescript/components/commands.js +3 -0
  94. package/lib/parsers/typescript/components/commands.js.flow +2 -1
  95. package/lib/parsers/typescript/components/componentsUtils.js +5 -0
  96. package/lib/parsers/typescript/components/componentsUtils.js.flow +6 -1
  97. package/lib/parsers/typescript/components/events.js.flow +1 -1
  98. package/lib/parsers/typescript/components/extends.js.flow +1 -1
  99. package/lib/parsers/typescript/components/index.js.flow +1 -1
  100. package/lib/parsers/typescript/components/options.js.flow +1 -1
  101. package/lib/parsers/typescript/components/props.js.flow +1 -1
  102. package/lib/parsers/typescript/modules/__test_fixtures__/failures.js +52 -0
  103. package/lib/parsers/typescript/modules/__test_fixtures__/failures.js.flow +54 -0
  104. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js +142 -0
  105. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js.flow +146 -0
  106. package/lib/parsers/typescript/modules/index.js +266 -87
  107. package/lib/parsers/typescript/modules/index.js.flow +230 -48
  108. package/lib/parsers/typescript/parser.d.ts +10 -0
  109. package/lib/parsers/typescript/parser.js +131 -25
  110. package/lib/parsers/typescript/parser.js.flow +137 -26
  111. package/lib/parsers/typescript/utils.js +40 -20
  112. package/lib/parsers/typescript/utils.js.flow +44 -24
  113. package/lib/parsers/utils.js +0 -125
  114. package/lib/parsers/utils.js.flow +3 -70
  115. package/package.json +4 -1
  116. package/lib/parsers/flow/index.js +0 -80
  117. package/lib/parsers/flow/index.js.flow +0 -85
  118. package/lib/parsers/typescript/index.js +0 -85
  119. package/lib/parsers/typescript/index.js.flow +0 -94
@@ -38,9 +38,22 @@ function _toPrimitive(input, hint) {
38
38
  }
39
39
  return (hint === 'string' ? String : Number)(input);
40
40
  }
41
- const _require = require('../errors'),
41
+ // $FlowFixMe[untyped-import] there's no flowtype flow-parser
42
+ const flowParser = require('flow-parser');
43
+ const _require = require('../parsers-commons'),
44
+ buildSchema = _require.buildSchema;
45
+ const _require2 = require('./Visitor'),
46
+ Visitor = _require2.Visitor;
47
+ const _require3 = require('./components'),
48
+ buildComponentSchema = _require3.buildComponentSchema;
49
+ const _require4 = require('./components/schema'),
50
+ wrapComponentSchema = _require4.wrapComponentSchema;
51
+ const _require5 = require('./modules'),
52
+ buildModuleSchema = _require5.buildModuleSchema;
53
+ const fs = require('fs');
54
+ const _require6 = require('../errors'),
42
55
  UnsupportedObjectPropertyTypeAnnotationParserError =
43
- _require.UnsupportedObjectPropertyTypeAnnotationParserError;
56
+ _require6.UnsupportedObjectPropertyTypeAnnotationParserError;
44
57
  class FlowParser {
45
58
  constructor() {
46
59
  _defineProperty(
@@ -49,37 +62,19 @@ class FlowParser {
49
62
  'TypeParameterInstantiation',
50
63
  );
51
64
  }
52
- getKeyName(propertyOrIndex, hasteModuleName) {
53
- var _propertyOrIndex$id$n, _propertyOrIndex$id;
54
- switch (propertyOrIndex.type) {
55
- case 'ObjectTypeProperty':
56
- return propertyOrIndex.key.name;
57
- case 'ObjectTypeIndexer':
58
- // flow index name is optional
59
- return (_propertyOrIndex$id$n =
60
- (_propertyOrIndex$id = propertyOrIndex.id) === null ||
61
- _propertyOrIndex$id === void 0
62
- ? void 0
63
- : _propertyOrIndex$id.name) !== null &&
64
- _propertyOrIndex$id$n !== void 0
65
- ? _propertyOrIndex$id$n
66
- : 'key';
67
- default:
68
- throw new UnsupportedObjectPropertyTypeAnnotationParserError(
69
- hasteModuleName,
70
- propertyOrIndex,
71
- propertyOrIndex.type,
72
- this.language(),
73
- );
74
- }
75
- }
76
- getMaybeEnumMemberType(maybeEnumDeclaration) {
77
- return maybeEnumDeclaration.body.type
78
- .replace('EnumNumberBody', 'NumberTypeAnnotation')
79
- .replace('EnumStringBody', 'StringTypeAnnotation');
65
+ isProperty(property) {
66
+ return property.type === 'ObjectTypeProperty';
80
67
  }
81
- isEnumDeclaration(maybeEnumDeclaration) {
82
- return maybeEnumDeclaration.type === 'EnumDeclaration';
68
+ getKeyName(property, hasteModuleName) {
69
+ if (!this.isProperty(property)) {
70
+ throw new UnsupportedObjectPropertyTypeAnnotationParserError(
71
+ hasteModuleName,
72
+ property,
73
+ property.type,
74
+ this.language(),
75
+ );
76
+ }
77
+ return property.key.name;
83
78
  }
84
79
  language() {
85
80
  return 'Flow';
@@ -103,6 +98,101 @@ class FlowParser {
103
98
  };
104
99
  return [...new Set(membersTypes.map(remapLiteral))];
105
100
  }
101
+ parseFile(filename) {
102
+ const contents = fs.readFileSync(filename, 'utf8');
103
+ return this.parseString(contents, filename);
104
+ }
105
+ parseString(contents, filename) {
106
+ return buildSchema(
107
+ contents,
108
+ filename,
109
+ wrapComponentSchema,
110
+ buildComponentSchema,
111
+ buildModuleSchema,
112
+ Visitor,
113
+ this,
114
+ );
115
+ }
116
+ parseModuleFixture(filename) {
117
+ const contents = fs.readFileSync(filename, 'utf8');
118
+ return this.parseString(contents, 'path/NativeSampleTurboModule.js');
119
+ }
120
+ getAst(contents) {
121
+ return flowParser.parse(contents, {
122
+ enums: true,
123
+ });
124
+ }
125
+ getFunctionTypeAnnotationParameters(functionTypeAnnotation) {
126
+ return functionTypeAnnotation.params;
127
+ }
128
+ getFunctionNameFromParameter(parameter) {
129
+ return parameter.name;
130
+ }
131
+ getParameterName(parameter) {
132
+ return parameter.name.name;
133
+ }
134
+ getParameterTypeAnnotation(parameter) {
135
+ return parameter.typeAnnotation;
136
+ }
137
+ getFunctionTypeAnnotationReturnType(functionTypeAnnotation) {
138
+ return functionTypeAnnotation.returnType;
139
+ }
140
+ parseEnumMembersType(typeAnnotation) {
141
+ const enumMembersType =
142
+ typeAnnotation.type === 'EnumStringBody'
143
+ ? 'StringTypeAnnotation'
144
+ : typeAnnotation.type === 'EnumNumberBody'
145
+ ? 'NumberTypeAnnotation'
146
+ : null;
147
+ if (!enumMembersType) {
148
+ throw new Error(
149
+ `Unknown enum type annotation type. Got: ${typeAnnotation.type}. Expected: EnumStringBody or EnumNumberBody.`,
150
+ );
151
+ }
152
+ return enumMembersType;
153
+ }
154
+ validateEnumMembersSupported(typeAnnotation, enumMembersType) {
155
+ if (!typeAnnotation.members || typeAnnotation.members.length === 0) {
156
+ // passing mixed members to flow would result in a flow error
157
+ // if the tool is launched ignoring that error, the enum would appear like not having enums
158
+ throw new Error(
159
+ 'Enums should have at least one member and member values can not be mixed- they all must be either blank, number, or string values.',
160
+ );
161
+ }
162
+ typeAnnotation.members.forEach(member => {
163
+ if (
164
+ enumMembersType === 'StringTypeAnnotation' &&
165
+ (!member.init || typeof member.init.value === 'string')
166
+ ) {
167
+ return;
168
+ }
169
+ if (
170
+ enumMembersType === 'NumberTypeAnnotation' &&
171
+ member.init &&
172
+ typeof member.init.value === 'number'
173
+ ) {
174
+ return;
175
+ }
176
+ throw new Error(
177
+ 'Enums can not be mixed- they all must be either blank, number, or string values.',
178
+ );
179
+ });
180
+ }
181
+ parseEnumMembers(typeAnnotation) {
182
+ return typeAnnotation.members.map(member => {
183
+ var _member$init$value, _member$init;
184
+ return {
185
+ name: member.id.name,
186
+ value:
187
+ (_member$init$value =
188
+ (_member$init = member.init) === null || _member$init === void 0
189
+ ? void 0
190
+ : _member$init.value) !== null && _member$init$value !== void 0
191
+ ? _member$init$value
192
+ : member.id.name,
193
+ };
194
+ });
195
+ }
106
196
  }
107
197
  module.exports = {
108
198
  FlowParser,
@@ -10,10 +10,29 @@
10
10
 
11
11
  'use strict';
12
12
 
13
- import type {UnionTypeAnnotationMemberType} from '../../CodegenSchema.js';
13
+ import type {
14
+ UnionTypeAnnotationMemberType,
15
+ SchemaType,
16
+ NamedShape,
17
+ Nullable,
18
+ NativeModuleParamTypeAnnotation,
19
+ NativeModuleEnumMemberType,
20
+ NativeModuleEnumMembers,
21
+ } from '../../CodegenSchema';
14
22
  import type {ParserType} from '../errors';
15
23
  import type {Parser} from '../parser';
16
24
 
25
+ // $FlowFixMe[untyped-import] there's no flowtype flow-parser
26
+ const flowParser = require('flow-parser');
27
+
28
+ const {buildSchema} = require('../parsers-commons');
29
+ const {Visitor} = require('./Visitor');
30
+ const {buildComponentSchema} = require('./components');
31
+ const {wrapComponentSchema} = require('./components/schema');
32
+ const {buildModuleSchema} = require('./modules');
33
+
34
+ const fs = require('fs');
35
+
17
36
  const {
18
37
  UnsupportedObjectPropertyTypeAnnotationParserError,
19
38
  } = require('../errors');
@@ -21,31 +40,20 @@ const {
21
40
  class FlowParser implements Parser {
22
41
  typeParameterInstantiation: string = 'TypeParameterInstantiation';
23
42
 
24
- getKeyName(propertyOrIndex: $FlowFixMe, hasteModuleName: string): string {
25
- switch (propertyOrIndex.type) {
26
- case 'ObjectTypeProperty':
27
- return propertyOrIndex.key.name;
28
- case 'ObjectTypeIndexer':
29
- // flow index name is optional
30
- return propertyOrIndex.id?.name ?? 'key';
31
- default:
32
- throw new UnsupportedObjectPropertyTypeAnnotationParserError(
33
- hasteModuleName,
34
- propertyOrIndex,
35
- propertyOrIndex.type,
36
- this.language(),
37
- );
38
- }
39
- }
40
-
41
- getMaybeEnumMemberType(maybeEnumDeclaration: $FlowFixMe): string {
42
- return maybeEnumDeclaration.body.type
43
- .replace('EnumNumberBody', 'NumberTypeAnnotation')
44
- .replace('EnumStringBody', 'StringTypeAnnotation');
43
+ isProperty(property: $FlowFixMe): boolean {
44
+ return property.type === 'ObjectTypeProperty';
45
45
  }
46
46
 
47
- isEnumDeclaration(maybeEnumDeclaration: $FlowFixMe): boolean {
48
- return maybeEnumDeclaration.type === 'EnumDeclaration';
47
+ getKeyName(property: $FlowFixMe, hasteModuleName: string): string {
48
+ if (!this.isProperty(property)) {
49
+ throw new UnsupportedObjectPropertyTypeAnnotationParserError(
50
+ hasteModuleName,
51
+ property,
52
+ property.type,
53
+ this.language(),
54
+ );
55
+ }
56
+ return property.key.name;
49
57
  }
50
58
 
51
59
  language(): ParserType {
@@ -76,6 +84,118 @@ class FlowParser implements Parser {
76
84
 
77
85
  return [...new Set(membersTypes.map(remapLiteral))];
78
86
  }
87
+
88
+ parseFile(filename: string): SchemaType {
89
+ const contents = fs.readFileSync(filename, 'utf8');
90
+
91
+ return this.parseString(contents, filename);
92
+ }
93
+
94
+ parseString(contents: string, filename: ?string): SchemaType {
95
+ return buildSchema(
96
+ contents,
97
+ filename,
98
+ wrapComponentSchema,
99
+ buildComponentSchema,
100
+ buildModuleSchema,
101
+ Visitor,
102
+ this,
103
+ );
104
+ }
105
+
106
+ parseModuleFixture(filename: string): SchemaType {
107
+ const contents = fs.readFileSync(filename, 'utf8');
108
+
109
+ return this.parseString(contents, 'path/NativeSampleTurboModule.js');
110
+ }
111
+
112
+ getAst(contents: string): $FlowFixMe {
113
+ return flowParser.parse(contents, {
114
+ enums: true,
115
+ });
116
+ }
117
+
118
+ getFunctionTypeAnnotationParameters(
119
+ functionTypeAnnotation: $FlowFixMe,
120
+ ): $ReadOnlyArray<$FlowFixMe> {
121
+ return functionTypeAnnotation.params;
122
+ }
123
+
124
+ getFunctionNameFromParameter(
125
+ parameter: NamedShape<Nullable<NativeModuleParamTypeAnnotation>>,
126
+ ): $FlowFixMe {
127
+ return parameter.name;
128
+ }
129
+
130
+ getParameterName(parameter: $FlowFixMe): string {
131
+ return parameter.name.name;
132
+ }
133
+
134
+ getParameterTypeAnnotation(parameter: $FlowFixMe): $FlowFixMe {
135
+ return parameter.typeAnnotation;
136
+ }
137
+
138
+ getFunctionTypeAnnotationReturnType(
139
+ functionTypeAnnotation: $FlowFixMe,
140
+ ): $FlowFixMe {
141
+ return functionTypeAnnotation.returnType;
142
+ }
143
+
144
+ parseEnumMembersType(typeAnnotation: $FlowFixMe): NativeModuleEnumMemberType {
145
+ const enumMembersType: ?NativeModuleEnumMemberType =
146
+ typeAnnotation.type === 'EnumStringBody'
147
+ ? 'StringTypeAnnotation'
148
+ : typeAnnotation.type === 'EnumNumberBody'
149
+ ? 'NumberTypeAnnotation'
150
+ : null;
151
+ if (!enumMembersType) {
152
+ throw new Error(
153
+ `Unknown enum type annotation type. Got: ${typeAnnotation.type}. Expected: EnumStringBody or EnumNumberBody.`,
154
+ );
155
+ }
156
+ return enumMembersType;
157
+ }
158
+
159
+ validateEnumMembersSupported(
160
+ typeAnnotation: $FlowFixMe,
161
+ enumMembersType: NativeModuleEnumMemberType,
162
+ ): void {
163
+ if (!typeAnnotation.members || typeAnnotation.members.length === 0) {
164
+ // passing mixed members to flow would result in a flow error
165
+ // if the tool is launched ignoring that error, the enum would appear like not having enums
166
+ throw new Error(
167
+ 'Enums should have at least one member and member values can not be mixed- they all must be either blank, number, or string values.',
168
+ );
169
+ }
170
+
171
+ typeAnnotation.members.forEach(member => {
172
+ if (
173
+ enumMembersType === 'StringTypeAnnotation' &&
174
+ (!member.init || typeof member.init.value === 'string')
175
+ ) {
176
+ return;
177
+ }
178
+
179
+ if (
180
+ enumMembersType === 'NumberTypeAnnotation' &&
181
+ member.init &&
182
+ typeof member.init.value === 'number'
183
+ ) {
184
+ return;
185
+ }
186
+
187
+ throw new Error(
188
+ 'Enums can not be mixed- they all must be either blank, number, or string values.',
189
+ );
190
+ });
191
+ }
192
+
193
+ parseEnumMembers(typeAnnotation: $FlowFixMe): NativeModuleEnumMembers {
194
+ return typeAnnotation.members.map(member => ({
195
+ name: member.id.name,
196
+ value: member.init?.value ?? member.id.name,
197
+ }));
198
+ }
79
199
  }
80
200
 
81
201
  module.exports = {
@@ -61,38 +61,52 @@ function resolveTypeAnnotation(
61
61
  );
62
62
  let node = typeAnnotation;
63
63
  let nullable = false;
64
- let typeAliasResolutionStatus = {
64
+ let typeResolutionStatus = {
65
65
  successful: false,
66
66
  };
67
67
  for (;;) {
68
68
  if (node.type === 'NullableTypeAnnotation') {
69
69
  nullable = true;
70
70
  node = node.typeAnnotation;
71
- } else if (node.type === 'GenericTypeAnnotation') {
72
- typeAliasResolutionStatus = {
73
- successful: true,
74
- aliasName: node.id.name,
75
- };
76
- const resolvedTypeAnnotation = types[node.id.name];
77
- if (
78
- resolvedTypeAnnotation == null ||
79
- resolvedTypeAnnotation.type === 'EnumDeclaration'
80
- ) {
71
+ continue;
72
+ }
73
+ if (node.type !== 'GenericTypeAnnotation') {
74
+ break;
75
+ }
76
+ const resolvedTypeAnnotation = types[node.id.name];
77
+ if (resolvedTypeAnnotation == null) {
78
+ break;
79
+ }
80
+ switch (resolvedTypeAnnotation.type) {
81
+ case 'TypeAlias': {
82
+ typeResolutionStatus = {
83
+ successful: true,
84
+ type: 'alias',
85
+ name: node.id.name,
86
+ };
87
+ node = resolvedTypeAnnotation.right;
81
88
  break;
82
89
  }
83
- invariant(
84
- resolvedTypeAnnotation.type === 'TypeAlias',
85
- `GenericTypeAnnotation '${node.id.name}' must resolve to a TypeAlias. Instead, it resolved to a '${resolvedTypeAnnotation.type}'`,
86
- );
87
- node = resolvedTypeAnnotation.right;
88
- } else {
89
- break;
90
+ case 'EnumDeclaration': {
91
+ typeResolutionStatus = {
92
+ successful: true,
93
+ type: 'enum',
94
+ name: node.id.name,
95
+ };
96
+ node = resolvedTypeAnnotation.body;
97
+ break;
98
+ }
99
+ default: {
100
+ throw new TypeError(
101
+ `A non GenericTypeAnnotation must be a type declaration ('TypeAlias') or enum ('EnumDeclaration'). Instead, got the unsupported ${resolvedTypeAnnotation.type}.`,
102
+ );
103
+ }
90
104
  }
91
105
  }
92
106
  return {
93
107
  nullable: nullable,
94
108
  typeAnnotation: node,
95
- typeAliasResolutionStatus,
109
+ typeResolutionStatus,
96
110
  };
97
111
  }
98
112
  function getValueFromTypes(value, types) {
@@ -10,7 +10,7 @@
10
10
 
11
11
  'use strict';
12
12
 
13
- import type {TypeAliasResolutionStatus, TypeDeclarationMap} from '../utils';
13
+ import type {TypeResolutionStatus, TypeDeclarationMap} from '../utils';
14
14
 
15
15
  /**
16
16
  * This FlowFixMe is supposed to refer to an InterfaceDeclaration or TypeAlias
@@ -61,7 +61,7 @@ function resolveTypeAnnotation(
61
61
  ): {
62
62
  nullable: boolean,
63
63
  typeAnnotation: $FlowFixMe,
64
- typeAliasResolutionStatus: TypeAliasResolutionStatus,
64
+ typeResolutionStatus: TypeResolutionStatus,
65
65
  } {
66
66
  invariant(
67
67
  typeAnnotation != null,
@@ -70,7 +70,7 @@ function resolveTypeAnnotation(
70
70
 
71
71
  let node = typeAnnotation;
72
72
  let nullable = false;
73
- let typeAliasResolutionStatus: TypeAliasResolutionStatus = {
73
+ let typeResolutionStatus: TypeResolutionStatus = {
74
74
  successful: false,
75
75
  };
76
76
 
@@ -78,34 +78,49 @@ function resolveTypeAnnotation(
78
78
  if (node.type === 'NullableTypeAnnotation') {
79
79
  nullable = true;
80
80
  node = node.typeAnnotation;
81
- } else if (node.type === 'GenericTypeAnnotation') {
82
- typeAliasResolutionStatus = {
83
- successful: true,
84
- aliasName: node.id.name,
85
- };
86
- const resolvedTypeAnnotation = types[node.id.name];
87
- if (
88
- resolvedTypeAnnotation == null ||
89
- resolvedTypeAnnotation.type === 'EnumDeclaration'
90
- ) {
91
- break;
92
- }
81
+ continue;
82
+ }
93
83
 
94
- invariant(
95
- resolvedTypeAnnotation.type === 'TypeAlias',
96
- `GenericTypeAnnotation '${node.id.name}' must resolve to a TypeAlias. Instead, it resolved to a '${resolvedTypeAnnotation.type}'`,
97
- );
84
+ if (node.type !== 'GenericTypeAnnotation') {
85
+ break;
86
+ }
98
87
 
99
- node = resolvedTypeAnnotation.right;
100
- } else {
88
+ const resolvedTypeAnnotation = types[node.id.name];
89
+ if (resolvedTypeAnnotation == null) {
101
90
  break;
102
91
  }
92
+
93
+ switch (resolvedTypeAnnotation.type) {
94
+ case 'TypeAlias': {
95
+ typeResolutionStatus = {
96
+ successful: true,
97
+ type: 'alias',
98
+ name: node.id.name,
99
+ };
100
+ node = resolvedTypeAnnotation.right;
101
+ break;
102
+ }
103
+ case 'EnumDeclaration': {
104
+ typeResolutionStatus = {
105
+ successful: true,
106
+ type: 'enum',
107
+ name: node.id.name,
108
+ };
109
+ node = resolvedTypeAnnotation.body;
110
+ break;
111
+ }
112
+ default: {
113
+ throw new TypeError(
114
+ `A non GenericTypeAnnotation must be a type declaration ('TypeAlias') or enum ('EnumDeclaration'). Instead, got the unsupported ${resolvedTypeAnnotation.type}.`,
115
+ );
116
+ }
117
+ }
103
118
  }
104
119
 
105
120
  return {
106
121
  nullable: nullable,
107
122
  typeAnnotation: node,
108
- typeAliasResolutionStatus,
123
+ typeResolutionStatus,
109
124
  };
110
125
  }
111
126
 
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ import type { SchemaType } from "../CodegenSchema";
9
+ import type { ParserType } from "./errors";
10
+
11
+ // useful members only for downstream
12
+ export interface Parser {
13
+ language(): ParserType;
14
+ parseFile(filename: string): SchemaType;
15
+ parseString(contents: string, filename?: string): SchemaType;
16
+ parseModuleFixture(filename: string): SchemaType;
17
+ }
@@ -10,7 +10,15 @@
10
10
 
11
11
  'use strict';
12
12
 
13
- import type {UnionTypeAnnotationMemberType} from '../CodegenSchema.js';
13
+ import type {
14
+ UnionTypeAnnotationMemberType,
15
+ SchemaType,
16
+ NamedShape,
17
+ Nullable,
18
+ NativeModuleParamTypeAnnotation,
19
+ NativeModuleEnumMemberType,
20
+ NativeModuleEnumMembers,
21
+ } from '../CodegenSchema';
14
22
  import type {ParserType} from './errors';
15
23
 
16
24
  /**
@@ -24,25 +32,17 @@ export interface Parser {
24
32
  typeParameterInstantiation: string;
25
33
 
26
34
  /**
27
- * Given a property or an index declaration, it returns the key name.
28
- * @parameter propertyOrIndex: an object containing a property or an index declaration.
29
- * @parameter hasteModuleName: a string with the native module name.
30
- * @returns: the key name.
31
- * @throws if propertyOrIndex does not contain a property or an index declaration.
35
+ * Given a declaration, it returns true if it is a property
32
36
  */
33
- getKeyName(propertyOrIndex: $FlowFixMe, hasteModuleName: string): string;
37
+ isProperty(property: $FlowFixMe): boolean;
34
38
  /**
35
- * Given a type declaration, it possibly returns the name of the Enum type.
36
- * @parameter maybeEnumDeclaration: an object possibly containing an Enum declaration.
37
- * @returns: the name of the Enum type.
38
- */
39
- getMaybeEnumMemberType(maybeEnumDeclaration: $FlowFixMe): string;
40
- /**
41
- * Given a type declaration, it returns a boolean specifying if is an Enum declaration.
42
- * @parameter maybeEnumDeclaration: an object possibly containing an Enum declaration.
43
- * @returns: a boolean specifying if is an Enum declaration.
39
+ * Given a property declaration, it returns the key name.
40
+ * @parameter property: an object containing a property declaration.
41
+ * @parameter hasteModuleName: a string with the native module name.
42
+ * @returns: the key name.
43
+ * @throws if property does not contain a property declaration.
44
44
  */
45
- isEnumDeclaration(maybeEnumDeclaration: $FlowFixMe): boolean;
45
+ getKeyName(property: $FlowFixMe, hasteModuleName: string): string;
46
46
  /**
47
47
  * @returns: the Parser language.
48
48
  */
@@ -67,4 +67,89 @@ export interface Parser {
67
67
  remapUnionTypeAnnotationMemberNames(
68
68
  types: $FlowFixMe,
69
69
  ): UnionTypeAnnotationMemberType[];
70
+ /**
71
+ * Given the name of a file, it returns a Schema.
72
+ * @parameter filename: the name of the file.
73
+ * @returns: the Schema of the file.
74
+ */
75
+ parseFile(filename: string): SchemaType;
76
+ /**
77
+ * Given the content of a file, it returns a Schema.
78
+ * @parameter contents: the content of the file.
79
+ * @parameter filename: the name of the file.
80
+ * @returns: the Schema of the file.
81
+ */
82
+ parseString(contents: string, filename: ?string): SchemaType;
83
+ /**
84
+ * Given the name of a file, it returns a Schema.
85
+ * @parameter filename: the name of the file.
86
+ * @returns: the Schema of the file.
87
+ */
88
+ parseModuleFixture(filename: string): SchemaType;
89
+
90
+ /**
91
+ * Given the content of a file, it returns an AST.
92
+ * @parameter contents: the content of the file.
93
+ * @returns: the AST of the file.
94
+ */
95
+ getAst(contents: string): $FlowFixMe;
96
+
97
+ /**
98
+ * Given a FunctionTypeAnnotation, it returns an array of its parameters.
99
+ * @parameter functionTypeAnnotation: a FunctionTypeAnnotation
100
+ * @returns: the parameters of the FunctionTypeAnnotation.
101
+ */
102
+ getFunctionTypeAnnotationParameters(
103
+ functionTypeAnnotation: $FlowFixMe,
104
+ ): $ReadOnlyArray<$FlowFixMe>;
105
+
106
+ /**
107
+ * Given a parameter, it returns the function name of the parameter.
108
+ * @parameter parameter: a parameter of a FunctionTypeAnnotation.
109
+ * @returns: the function name of the parameter.
110
+ */
111
+ getFunctionNameFromParameter(
112
+ parameter: NamedShape<Nullable<NativeModuleParamTypeAnnotation>>,
113
+ ): $FlowFixMe;
114
+
115
+ /**
116
+ * Given a parameter, it returns its name.
117
+ * @parameter parameter: a parameter of a FunctionTypeAnnotation.
118
+ * @returns: the name of the parameter.
119
+ */
120
+ getParameterName(parameter: $FlowFixMe): string;
121
+
122
+ /**
123
+ * Given a parameter, it returns its typeAnnotation.
124
+ * @parameter parameter: a parameter of a FunctionTypeAnnotation.
125
+ * @returns: the typeAnnotation of the parameter.
126
+ */
127
+ getParameterTypeAnnotation(param: $FlowFixMe): $FlowFixMe;
128
+
129
+ /**
130
+ * Given a FunctionTypeAnnotation, it returns its returnType.
131
+ * @parameter functionTypeAnnotation: a FunctionTypeAnnotation
132
+ * @returns: the returnType of the FunctionTypeAnnotation.
133
+ */
134
+ getFunctionTypeAnnotationReturnType(
135
+ functionTypeAnnotation: $FlowFixMe,
136
+ ): $FlowFixMe;
137
+
138
+ /**
139
+ * Calculates an enum's members type
140
+ */
141
+ parseEnumMembersType(typeAnnotation: $FlowFixMe): NativeModuleEnumMemberType;
142
+
143
+ /**
144
+ * Throws if enum mebers are not supported
145
+ */
146
+ validateEnumMembersSupported(
147
+ typeAnnotation: $FlowFixMe,
148
+ enumMembersType: NativeModuleEnumMemberType,
149
+ ): void;
150
+
151
+ /**
152
+ * Calculates enum's members
153
+ */
154
+ parseEnumMembers(typeAnnotation: $FlowFixMe): NativeModuleEnumMembers;
70
155
  }