@react-native/codegen 0.72.1 → 0.72.3

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 (125) 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 +42 -19
  52. package/lib/parsers/error-utils.js.flow +46 -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 +16 -20
  67. package/lib/parsers/flow/components/index.js.flow +8 -7
  68. package/lib/parsers/flow/components/options.js.flow +1 -1
  69. package/lib/parsers/flow/components/props.js.flow +1 -1
  70. package/lib/parsers/flow/modules/__test_fixtures__/failures.js +54 -0
  71. package/lib/parsers/flow/modules/__test_fixtures__/failures.js.flow +56 -0
  72. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js +64 -1
  73. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js.flow +66 -1
  74. package/lib/parsers/flow/modules/index.js +112 -48
  75. package/lib/parsers/flow/modules/index.js.flow +115 -44
  76. package/lib/parsers/flow/parser.d.ts +10 -0
  77. package/lib/parsers/flow/parser.js +173 -32
  78. package/lib/parsers/flow/parser.js.flow +201 -24
  79. package/lib/parsers/flow/utils.js +33 -57
  80. package/lib/parsers/flow/utils.js.flow +37 -60
  81. package/lib/parsers/parser.d.ts +17 -0
  82. package/lib/parsers/parser.js.flow +124 -17
  83. package/lib/parsers/parserMock.js +101 -30
  84. package/lib/parsers/parserMock.js.flow +139 -24
  85. package/lib/parsers/parsers-commons.js +121 -119
  86. package/lib/parsers/parsers-commons.js.flow +136 -131
  87. package/lib/parsers/parsers-primitives.js +75 -12
  88. package/lib/parsers/parsers-primitives.js.flow +92 -13
  89. package/lib/parsers/schema/index.d.ts +10 -0
  90. package/lib/parsers/{typescript/components/schema.js.flow → schema.js.flow} +1 -1
  91. package/lib/parsers/typescript/Visitor.js +42 -0
  92. package/lib/parsers/typescript/Visitor.js.flow +47 -0
  93. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +22 -0
  94. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +22 -0
  95. package/lib/parsers/typescript/components/commands.js +3 -0
  96. package/lib/parsers/typescript/components/commands.js.flow +2 -1
  97. package/lib/parsers/typescript/components/componentsUtils.js +5 -0
  98. package/lib/parsers/typescript/components/componentsUtils.js.flow +6 -1
  99. package/lib/parsers/typescript/components/events.js.flow +1 -1
  100. package/lib/parsers/typescript/components/extends.js.flow +1 -1
  101. package/lib/parsers/typescript/components/index.js +15 -19
  102. package/lib/parsers/typescript/components/index.js.flow +8 -7
  103. package/lib/parsers/typescript/components/options.js.flow +1 -1
  104. package/lib/parsers/typescript/components/props.js.flow +1 -1
  105. package/lib/parsers/typescript/modules/__test_fixtures__/failures.js +52 -0
  106. package/lib/parsers/typescript/modules/__test_fixtures__/failures.js.flow +54 -0
  107. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js +142 -0
  108. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js.flow +146 -0
  109. package/lib/parsers/typescript/modules/index.js +276 -110
  110. package/lib/parsers/typescript/modules/index.js.flow +237 -68
  111. package/lib/parsers/typescript/parser.d.ts +10 -0
  112. package/lib/parsers/typescript/parser.js +175 -25
  113. package/lib/parsers/typescript/parser.js.flow +184 -26
  114. package/lib/parsers/typescript/utils.js +40 -51
  115. package/lib/parsers/typescript/utils.js.flow +44 -55
  116. package/lib/parsers/utils.js +0 -125
  117. package/lib/parsers/utils.js.flow +3 -70
  118. package/package.json +4 -1
  119. package/lib/parsers/flow/components/schema.js +0 -106
  120. package/lib/parsers/flow/components/schema.js.flow +0 -62
  121. package/lib/parsers/flow/index.js +0 -80
  122. package/lib/parsers/flow/index.js.flow +0 -85
  123. package/lib/parsers/typescript/index.js +0 -85
  124. package/lib/parsers/typescript/index.js.flow +0 -94
  125. /package/lib/parsers/{typescript/components/schema.js → schema.js} +0 -0
@@ -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] Use flow-types for @babel/parser
42
+ const babelParser = require('@babel/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('../schema.js'),
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 TypeScriptParser {
45
58
  constructor() {
46
59
  _defineProperty(
@@ -49,31 +62,19 @@ class TypeScriptParser {
49
62
  'TSTypeParameterInstantiation',
50
63
  );
51
64
  }
52
- getKeyName(propertyOrIndex, hasteModuleName) {
53
- switch (propertyOrIndex.type) {
54
- case 'TSPropertySignature':
55
- return propertyOrIndex.key.name;
56
- case 'TSIndexSignature':
57
- return propertyOrIndex.parameters[0].name;
58
- default:
59
- throw new UnsupportedObjectPropertyTypeAnnotationParserError(
60
- hasteModuleName,
61
- propertyOrIndex,
62
- propertyOrIndex.type,
63
- this.language(),
64
- );
65
- }
65
+ isProperty(property) {
66
+ return property.type === 'TSPropertySignature';
66
67
  }
67
- getMaybeEnumMemberType(maybeEnumDeclaration) {
68
- if (maybeEnumDeclaration.members[0].initializer) {
69
- return maybeEnumDeclaration.members[0].initializer.type
70
- .replace('NumericLiteral', 'NumberTypeAnnotation')
71
- .replace('StringLiteral', 'StringTypeAnnotation');
68
+ getKeyName(property, hasteModuleName) {
69
+ if (!this.isProperty(property)) {
70
+ throw new UnsupportedObjectPropertyTypeAnnotationParserError(
71
+ hasteModuleName,
72
+ property,
73
+ property.type,
74
+ this.language(),
75
+ );
72
76
  }
73
- return 'StringTypeAnnotation';
74
- }
75
- isEnumDeclaration(maybeEnumDeclaration) {
76
- return maybeEnumDeclaration.type === 'TSEnumDeclaration';
77
+ return property.key.name;
77
78
  }
78
79
  language() {
79
80
  return 'TypeScript';
@@ -99,6 +100,155 @@ class TypeScriptParser {
99
100
  };
100
101
  return [...new Set(membersTypes.map(remapLiteral))];
101
102
  }
103
+ parseFile(filename) {
104
+ const contents = fs.readFileSync(filename, 'utf8');
105
+ return this.parseString(contents, filename);
106
+ }
107
+ parseString(contents, filename) {
108
+ return buildSchema(
109
+ contents,
110
+ filename,
111
+ wrapComponentSchema,
112
+ buildComponentSchema,
113
+ buildModuleSchema,
114
+ Visitor,
115
+ this,
116
+ );
117
+ }
118
+ parseModuleFixture(filename) {
119
+ const contents = fs.readFileSync(filename, 'utf8');
120
+ return this.parseString(contents, 'path/NativeSampleTurboModule.ts');
121
+ }
122
+ getAst(contents) {
123
+ return babelParser.parse(contents, {
124
+ sourceType: 'module',
125
+ plugins: ['typescript'],
126
+ }).program;
127
+ }
128
+ getFunctionTypeAnnotationParameters(functionTypeAnnotation) {
129
+ return functionTypeAnnotation.parameters;
130
+ }
131
+ getFunctionNameFromParameter(parameter) {
132
+ return parameter.typeAnnotation;
133
+ }
134
+ getParameterName(parameter) {
135
+ return parameter.name;
136
+ }
137
+ getParameterTypeAnnotation(parameter) {
138
+ return parameter.typeAnnotation.typeAnnotation;
139
+ }
140
+ getFunctionTypeAnnotationReturnType(functionTypeAnnotation) {
141
+ return functionTypeAnnotation.typeAnnotation.typeAnnotation;
142
+ }
143
+ parseEnumMembersType(typeAnnotation) {
144
+ var _typeAnnotation$membe;
145
+ const enumInitializer =
146
+ (_typeAnnotation$membe = typeAnnotation.members[0]) === null ||
147
+ _typeAnnotation$membe === void 0
148
+ ? void 0
149
+ : _typeAnnotation$membe.initializer;
150
+ const enumMembersType =
151
+ !enumInitializer || enumInitializer.type === 'StringLiteral'
152
+ ? 'StringTypeAnnotation'
153
+ : enumInitializer.type === 'NumericLiteral'
154
+ ? 'NumberTypeAnnotation'
155
+ : null;
156
+ if (!enumMembersType) {
157
+ throw new Error(
158
+ 'Enum values must be either blank, number, or string values.',
159
+ );
160
+ }
161
+ return enumMembersType;
162
+ }
163
+ validateEnumMembersSupported(typeAnnotation, enumMembersType) {
164
+ if (!typeAnnotation.members || typeAnnotation.members.length === 0) {
165
+ throw new Error('Enums should have at least one member.');
166
+ }
167
+ const enumInitializerType =
168
+ enumMembersType === 'StringTypeAnnotation'
169
+ ? 'StringLiteral'
170
+ : enumMembersType === 'NumberTypeAnnotation'
171
+ ? 'NumericLiteral'
172
+ : null;
173
+ typeAnnotation.members.forEach(member => {
174
+ var _member$initializer$t, _member$initializer;
175
+ if (
176
+ ((_member$initializer$t =
177
+ (_member$initializer = member.initializer) === null ||
178
+ _member$initializer === void 0
179
+ ? void 0
180
+ : _member$initializer.type) !== null &&
181
+ _member$initializer$t !== void 0
182
+ ? _member$initializer$t
183
+ : 'StringLiteral') !== enumInitializerType
184
+ ) {
185
+ throw new Error(
186
+ 'Enum values can not be mixed. They all must be either blank, number, or string values.',
187
+ );
188
+ }
189
+ });
190
+ }
191
+ parseEnumMembers(typeAnnotation) {
192
+ return typeAnnotation.members.map(member => {
193
+ var _member$initializer$v, _member$initializer2;
194
+ return {
195
+ name: member.id.name,
196
+ value:
197
+ (_member$initializer$v =
198
+ (_member$initializer2 = member.initializer) === null ||
199
+ _member$initializer2 === void 0
200
+ ? void 0
201
+ : _member$initializer2.value) !== null &&
202
+ _member$initializer$v !== void 0
203
+ ? _member$initializer$v
204
+ : member.id.name,
205
+ };
206
+ });
207
+ }
208
+ isModuleInterface(node) {
209
+ var _node$extends;
210
+ return (
211
+ node.type === 'TSInterfaceDeclaration' &&
212
+ ((_node$extends = node.extends) === null || _node$extends === void 0
213
+ ? void 0
214
+ : _node$extends.length) === 1 &&
215
+ node.extends[0].type === 'TSExpressionWithTypeArguments' &&
216
+ node.extends[0].expression.name === 'TurboModule'
217
+ );
218
+ }
219
+ extractAnnotatedElement(typeAnnotation, types) {
220
+ return types[typeAnnotation.typeParameters.params[0].typeName.name];
221
+ }
222
+
223
+ /**
224
+ * TODO(T108222691): Use flow-types for @babel/parser
225
+ */
226
+ getTypes(ast) {
227
+ return ast.body.reduce((types, node) => {
228
+ switch (node.type) {
229
+ case 'ExportNamedDeclaration': {
230
+ if (node.declaration) {
231
+ switch (node.declaration.type) {
232
+ case 'TSTypeAliasDeclaration':
233
+ case 'TSInterfaceDeclaration':
234
+ case 'TSEnumDeclaration': {
235
+ types[node.declaration.id.name] = node.declaration;
236
+ break;
237
+ }
238
+ }
239
+ }
240
+ break;
241
+ }
242
+ case 'TSTypeAliasDeclaration':
243
+ case 'TSInterfaceDeclaration':
244
+ case 'TSEnumDeclaration': {
245
+ types[node.id.name] = node;
246
+ break;
247
+ }
248
+ }
249
+ return types;
250
+ }, {});
251
+ }
102
252
  }
103
253
  module.exports = {
104
254
  TypeScriptParser,
@@ -10,9 +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
+ NativeModuleEnumMembers,
20
+ NativeModuleEnumMemberType,
21
+ } from '../../CodegenSchema';
14
22
  import type {ParserType} from '../errors';
15
23
  import type {Parser} from '../parser';
24
+ import type {TypeDeclarationMap} from '../utils';
25
+
26
+ // $FlowFixMe[untyped-import] Use flow-types for @babel/parser
27
+ const babelParser = require('@babel/parser');
28
+
29
+ const {buildSchema} = require('../parsers-commons');
30
+ const {Visitor} = require('./Visitor');
31
+ const {buildComponentSchema} = require('./components');
32
+ const {wrapComponentSchema} = require('../schema.js');
33
+ const {buildModuleSchema} = require('./modules');
34
+
35
+ const fs = require('fs');
16
36
 
17
37
  const {
18
38
  UnsupportedObjectPropertyTypeAnnotationParserError,
@@ -21,34 +41,20 @@ const {
21
41
  class TypeScriptParser implements Parser {
22
42
  typeParameterInstantiation: string = 'TSTypeParameterInstantiation';
23
43
 
24
- getKeyName(propertyOrIndex: $FlowFixMe, hasteModuleName: string): string {
25
- switch (propertyOrIndex.type) {
26
- case 'TSPropertySignature':
27
- return propertyOrIndex.key.name;
28
- case 'TSIndexSignature':
29
- return propertyOrIndex.parameters[0].name;
30
- default:
31
- throw new UnsupportedObjectPropertyTypeAnnotationParserError(
32
- hasteModuleName,
33
- propertyOrIndex,
34
- propertyOrIndex.type,
35
- this.language(),
36
- );
37
- }
44
+ isProperty(property: $FlowFixMe): boolean {
45
+ return property.type === 'TSPropertySignature';
38
46
  }
39
47
 
40
- getMaybeEnumMemberType(maybeEnumDeclaration: $FlowFixMe): string {
41
- if (maybeEnumDeclaration.members[0].initializer) {
42
- return maybeEnumDeclaration.members[0].initializer.type
43
- .replace('NumericLiteral', 'NumberTypeAnnotation')
44
- .replace('StringLiteral', 'StringTypeAnnotation');
48
+ getKeyName(property: $FlowFixMe, hasteModuleName: string): string {
49
+ if (!this.isProperty(property)) {
50
+ throw new UnsupportedObjectPropertyTypeAnnotationParserError(
51
+ hasteModuleName,
52
+ property,
53
+ property.type,
54
+ this.language(),
55
+ );
45
56
  }
46
-
47
- return 'StringTypeAnnotation';
48
- }
49
-
50
- isEnumDeclaration(maybeEnumDeclaration: $FlowFixMe): boolean {
51
- return maybeEnumDeclaration.type === 'TSEnumDeclaration';
57
+ return property.key.name;
52
58
  }
53
59
 
54
60
  language(): ParserType {
@@ -81,6 +87,158 @@ class TypeScriptParser implements Parser {
81
87
 
82
88
  return [...new Set(membersTypes.map(remapLiteral))];
83
89
  }
90
+
91
+ parseFile(filename: string): SchemaType {
92
+ const contents = fs.readFileSync(filename, 'utf8');
93
+
94
+ return this.parseString(contents, filename);
95
+ }
96
+
97
+ parseString(contents: string, filename: ?string): SchemaType {
98
+ return buildSchema(
99
+ contents,
100
+ filename,
101
+ wrapComponentSchema,
102
+ buildComponentSchema,
103
+ buildModuleSchema,
104
+ Visitor,
105
+ this,
106
+ );
107
+ }
108
+
109
+ parseModuleFixture(filename: string): SchemaType {
110
+ const contents = fs.readFileSync(filename, 'utf8');
111
+
112
+ return this.parseString(contents, 'path/NativeSampleTurboModule.ts');
113
+ }
114
+
115
+ getAst(contents: string): $FlowFixMe {
116
+ return babelParser.parse(contents, {
117
+ sourceType: 'module',
118
+ plugins: ['typescript'],
119
+ }).program;
120
+ }
121
+
122
+ getFunctionTypeAnnotationParameters(
123
+ functionTypeAnnotation: $FlowFixMe,
124
+ ): $ReadOnlyArray<$FlowFixMe> {
125
+ return functionTypeAnnotation.parameters;
126
+ }
127
+
128
+ getFunctionNameFromParameter(
129
+ parameter: NamedShape<Nullable<NativeModuleParamTypeAnnotation>>,
130
+ ): $FlowFixMe {
131
+ return parameter.typeAnnotation;
132
+ }
133
+
134
+ getParameterName(parameter: $FlowFixMe): string {
135
+ return parameter.name;
136
+ }
137
+
138
+ getParameterTypeAnnotation(parameter: $FlowFixMe): $FlowFixMe {
139
+ return parameter.typeAnnotation.typeAnnotation;
140
+ }
141
+
142
+ getFunctionTypeAnnotationReturnType(
143
+ functionTypeAnnotation: $FlowFixMe,
144
+ ): $FlowFixMe {
145
+ return functionTypeAnnotation.typeAnnotation.typeAnnotation;
146
+ }
147
+
148
+ parseEnumMembersType(typeAnnotation: $FlowFixMe): NativeModuleEnumMemberType {
149
+ const enumInitializer = typeAnnotation.members[0]?.initializer;
150
+ const enumMembersType: ?NativeModuleEnumMemberType =
151
+ !enumInitializer || enumInitializer.type === 'StringLiteral'
152
+ ? 'StringTypeAnnotation'
153
+ : enumInitializer.type === 'NumericLiteral'
154
+ ? 'NumberTypeAnnotation'
155
+ : null;
156
+ if (!enumMembersType) {
157
+ throw new Error(
158
+ 'Enum values must be either blank, number, or string values.',
159
+ );
160
+ }
161
+ return enumMembersType;
162
+ }
163
+
164
+ validateEnumMembersSupported(
165
+ typeAnnotation: $FlowFixMe,
166
+ enumMembersType: NativeModuleEnumMemberType,
167
+ ): void {
168
+ if (!typeAnnotation.members || typeAnnotation.members.length === 0) {
169
+ throw new Error('Enums should have at least one member.');
170
+ }
171
+
172
+ const enumInitializerType =
173
+ enumMembersType === 'StringTypeAnnotation'
174
+ ? 'StringLiteral'
175
+ : enumMembersType === 'NumberTypeAnnotation'
176
+ ? 'NumericLiteral'
177
+ : null;
178
+
179
+ typeAnnotation.members.forEach(member => {
180
+ if (
181
+ (member.initializer?.type ?? 'StringLiteral') !== enumInitializerType
182
+ ) {
183
+ throw new Error(
184
+ 'Enum values can not be mixed. They all must be either blank, number, or string values.',
185
+ );
186
+ }
187
+ });
188
+ }
189
+
190
+ parseEnumMembers(typeAnnotation: $FlowFixMe): NativeModuleEnumMembers {
191
+ return typeAnnotation.members.map(member => ({
192
+ name: member.id.name,
193
+ value: member.initializer?.value ?? member.id.name,
194
+ }));
195
+ }
196
+
197
+ isModuleInterface(node: $FlowFixMe): boolean {
198
+ return (
199
+ node.type === 'TSInterfaceDeclaration' &&
200
+ node.extends?.length === 1 &&
201
+ node.extends[0].type === 'TSExpressionWithTypeArguments' &&
202
+ node.extends[0].expression.name === 'TurboModule'
203
+ );
204
+ }
205
+
206
+ extractAnnotatedElement(
207
+ typeAnnotation: $FlowFixMe,
208
+ types: TypeDeclarationMap,
209
+ ): $FlowFixMe {
210
+ return types[typeAnnotation.typeParameters.params[0].typeName.name];
211
+ }
212
+
213
+ /**
214
+ * TODO(T108222691): Use flow-types for @babel/parser
215
+ */
216
+ getTypes(ast: $FlowFixMe): TypeDeclarationMap {
217
+ return ast.body.reduce((types, node) => {
218
+ switch (node.type) {
219
+ case 'ExportNamedDeclaration': {
220
+ if (node.declaration) {
221
+ switch (node.declaration.type) {
222
+ case 'TSTypeAliasDeclaration':
223
+ case 'TSInterfaceDeclaration':
224
+ case 'TSEnumDeclaration': {
225
+ types[node.declaration.id.name] = node.declaration;
226
+ break;
227
+ }
228
+ }
229
+ }
230
+ break;
231
+ }
232
+ case 'TSTypeAliasDeclaration':
233
+ case 'TSInterfaceDeclaration':
234
+ case 'TSEnumDeclaration': {
235
+ types[node.id.name] = node;
236
+ break;
237
+ }
238
+ }
239
+ return types;
240
+ }, {});
241
+ }
84
242
  }
85
243
  module.exports = {
86
244
  TypeScriptParser,
@@ -13,37 +13,6 @@
13
13
  const _require = require('./parseTopLevelType'),
14
14
  parseTopLevelType = _require.parseTopLevelType;
15
15
 
16
- /**
17
- * TODO(T108222691): Use flow-types for @babel/parser
18
- */
19
-
20
- function getTypes(ast) {
21
- return ast.body.reduce((types, node) => {
22
- switch (node.type) {
23
- case 'ExportNamedDeclaration': {
24
- if (node.declaration) {
25
- switch (node.declaration.type) {
26
- case 'TSTypeAliasDeclaration':
27
- case 'TSInterfaceDeclaration':
28
- case 'TSEnumDeclaration': {
29
- types[node.declaration.id.name] = node.declaration;
30
- break;
31
- }
32
- }
33
- }
34
- break;
35
- }
36
- case 'TSTypeAliasDeclaration':
37
- case 'TSInterfaceDeclaration':
38
- case 'TSEnumDeclaration': {
39
- types[node.id.name] = node;
40
- break;
41
- }
42
- }
43
- return types;
44
- }, {});
45
- }
46
-
47
16
  // $FlowFixMe[unclear-type] Use flow-types for @babel/parser
48
17
 
49
18
  const invariant = require('invariant');
@@ -61,41 +30,61 @@ function resolveTypeAnnotation(
61
30
  ? typeAnnotation.typeAnnotation
62
31
  : typeAnnotation;
63
32
  let nullable = false;
64
- let typeAliasResolutionStatus = {
33
+ let typeResolutionStatus = {
65
34
  successful: false,
66
35
  };
67
36
  for (;;) {
68
37
  const topLevelType = parseTopLevelType(node);
69
38
  nullable = nullable || topLevelType.optional;
70
39
  node = topLevelType.type;
71
- if (node.type === 'TSTypeReference') {
72
- typeAliasResolutionStatus = {
73
- successful: true,
74
- aliasName: node.typeName.name,
75
- };
76
- const resolvedTypeAnnotation = types[node.typeName.name];
77
- if (
78
- resolvedTypeAnnotation == null ||
79
- resolvedTypeAnnotation.type === 'TSEnumDeclaration'
80
- ) {
40
+ if (node.type !== 'TSTypeReference') {
41
+ break;
42
+ }
43
+ const resolvedTypeAnnotation = types[node.typeName.name];
44
+ if (resolvedTypeAnnotation == null) {
45
+ break;
46
+ }
47
+ switch (resolvedTypeAnnotation.type) {
48
+ case 'TSTypeAliasDeclaration': {
49
+ typeResolutionStatus = {
50
+ successful: true,
51
+ type: 'alias',
52
+ name: node.typeName.name,
53
+ };
54
+ node = resolvedTypeAnnotation.typeAnnotation;
81
55
  break;
82
56
  }
83
- invariant(
84
- resolvedTypeAnnotation.type === 'TSTypeAliasDeclaration',
85
- `GenericTypeAnnotation '${node.typeName.name}' must resolve to a TSTypeAliasDeclaration. Instead, it resolved to a '${resolvedTypeAnnotation.type}'`,
86
- );
87
- node = resolvedTypeAnnotation.typeAnnotation;
88
- } else {
89
- break;
57
+ case 'TSInterfaceDeclaration': {
58
+ typeResolutionStatus = {
59
+ successful: true,
60
+ type: 'alias',
61
+ name: node.typeName.name,
62
+ };
63
+ node = resolvedTypeAnnotation;
64
+ break;
65
+ }
66
+ case 'TSEnumDeclaration': {
67
+ typeResolutionStatus = {
68
+ successful: true,
69
+ type: 'enum',
70
+ name: node.typeName.name,
71
+ };
72
+ node = resolvedTypeAnnotation;
73
+ break;
74
+ }
75
+ default: {
76
+ throw new TypeError(
77
+ `A non GenericTypeAnnotation must be a type declaration ('TSTypeAliasDeclaration'), an interface ('TSInterfaceDeclaration'), or enum ('TSEnumDeclaration'). Instead, got the unsupported ${resolvedTypeAnnotation.type}.`,
78
+ );
79
+ }
90
80
  }
91
81
  }
92
82
  return {
93
83
  nullable: nullable,
94
84
  typeAnnotation: node,
95
- typeAliasResolutionStatus,
85
+ typeResolutionStatus,
96
86
  };
97
87
  }
98
88
  module.exports = {
99
89
  resolveTypeAnnotation,
100
- getTypes,
101
90
  };