@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
@@ -15,7 +15,6 @@ import type {
15
15
  NamedShape,
16
16
  NativeModuleAliasMap,
17
17
  NativeModuleBaseTypeAnnotation,
18
- NativeModuleEnumDeclaration,
19
18
  NativeModuleSchema,
20
19
  NativeModuleTypeAnnotation,
21
20
  NativeModuleFunctionTypeAnnotation,
@@ -27,6 +26,13 @@ import type {
27
26
  import type {Parser} from './parser';
28
27
  import type {ParserType} from './errors';
29
28
  import type {ParserErrorCapturer, TypeDeclarationMap} from './utils';
29
+ import type {ComponentSchemaBuilderConfig} from './schema.js';
30
+
31
+ const {
32
+ getConfigType,
33
+ extractNativeModuleName,
34
+ createParserErrorCapturer,
35
+ } = require('./utils');
30
36
 
31
37
  const {
32
38
  throwIfPropertyValueTypeIsUnsupported,
@@ -38,13 +44,11 @@ const {
38
44
  const {
39
45
  MissingTypeParameterGenericParserError,
40
46
  MoreThanOneTypeParameterGenericParserError,
41
- UnsupportedEnumDeclarationParserError,
42
- UnsupportedGenericParserError,
43
- UnsupportedObjectPropertyTypeAnnotationParserError,
44
47
  UnnamedFunctionParamParserError,
45
48
  } = require('./errors');
46
49
 
47
50
  const invariant = require('invariant');
51
+ import type {NativeModuleEnumMap} from '../CodegenSchema';
48
52
 
49
53
  function wrapModuleSchema(
50
54
  nativeModuleSchema: NativeModuleSchema,
@@ -116,15 +120,9 @@ function assertGenericTypeAnnotationHasExactlyOneTypeParameter(
116
120
  function isObjectProperty(property: $FlowFixMe, language: ParserType): boolean {
117
121
  switch (language) {
118
122
  case 'Flow':
119
- return (
120
- property.type === 'ObjectTypeProperty' ||
121
- property.type === 'ObjectTypeIndexer'
122
- );
123
+ return property.type === 'ObjectTypeProperty';
123
124
  case 'TypeScript':
124
- return (
125
- property.type === 'TSPropertySignature' ||
126
- property.type === 'TSIndexSignature'
127
- );
125
+ return property.type === 'TSPropertySignature';
128
126
  default:
129
127
  return false;
130
128
  }
@@ -135,6 +133,7 @@ function parseObjectProperty(
135
133
  hasteModuleName: string,
136
134
  types: TypeDeclarationMap,
137
135
  aliasMap: {...NativeModuleAliasMap},
136
+ enumMap: {...NativeModuleEnumMap},
138
137
  tryParse: ParserErrorCapturer,
139
138
  cxxOnly: boolean,
140
139
  nullable: boolean,
@@ -143,35 +142,13 @@ function parseObjectProperty(
143
142
  ): NamedShape<Nullable<NativeModuleBaseTypeAnnotation>> {
144
143
  const language = parser.language();
145
144
 
146
- if (!isObjectProperty(property, language)) {
147
- throw new UnsupportedObjectPropertyTypeAnnotationParserError(
148
- hasteModuleName,
149
- property,
150
- property.type,
151
- language,
152
- );
153
- }
154
-
155
- const {optional = false} = property;
156
145
  const name = parser.getKeyName(property, hasteModuleName);
146
+ const {optional = false} = property;
157
147
  const languageTypeAnnotation =
158
148
  language === 'TypeScript'
159
149
  ? property.typeAnnotation.typeAnnotation
160
150
  : property.value;
161
151
 
162
- if (
163
- property.type === 'ObjectTypeIndexer' ||
164
- property.type === 'TSIndexSignature'
165
- ) {
166
- return {
167
- name,
168
- optional,
169
- typeAnnotation: wrapNullable(nullable, {
170
- type: 'GenericObjectTypeAnnotation',
171
- }), //TODO: use `emitObject` for typeAnnotation
172
- };
173
- }
174
-
175
152
  const [propertyTypeAnnotation, isPropertyNullable] =
176
153
  unwrapNullable<$FlowFixMe>(
177
154
  translateTypeAnnotation(
@@ -179,8 +156,10 @@ function parseObjectProperty(
179
156
  languageTypeAnnotation,
180
157
  types,
181
158
  aliasMap,
159
+ enumMap,
182
160
  tryParse,
183
161
  cxxOnly,
162
+ parser,
184
163
  ),
185
164
  );
186
165
 
@@ -194,7 +173,6 @@ function parseObjectProperty(
194
173
  languageTypeAnnotation,
195
174
  property.key,
196
175
  propertyTypeAnnotation.type,
197
- language,
198
176
  );
199
177
  }
200
178
 
@@ -205,118 +183,43 @@ function parseObjectProperty(
205
183
  };
206
184
  }
207
185
 
208
- function translateDefault(
209
- hasteModuleName: string,
210
- typeAnnotation: $FlowFixMe,
211
- types: TypeDeclarationMap,
212
- nullable: boolean,
213
- parser: Parser,
214
- ): Nullable<NativeModuleEnumDeclaration> {
215
- const maybeEnumDeclaration =
216
- types[parser.nameForGenericTypeAnnotation(typeAnnotation)];
217
-
218
- if (maybeEnumDeclaration && parser.isEnumDeclaration(maybeEnumDeclaration)) {
219
- const memberType = parser.getMaybeEnumMemberType(maybeEnumDeclaration);
220
-
221
- if (
222
- memberType === 'NumberTypeAnnotation' ||
223
- memberType === 'StringTypeAnnotation'
224
- ) {
225
- return wrapNullable(nullable, {
226
- type: 'EnumDeclaration',
227
- memberType: memberType,
228
- });
229
- } else {
230
- throw new UnsupportedEnumDeclarationParserError(
231
- hasteModuleName,
232
- typeAnnotation,
233
- memberType,
234
- parser.language(),
235
- );
236
- }
237
- }
238
-
239
- throw new UnsupportedGenericParserError(
240
- hasteModuleName,
241
- typeAnnotation,
242
- parser,
243
- );
244
- }
245
-
246
- function getTypeAnnotationParameters(
247
- typeAnnotation: $FlowFixMe,
248
- language: ParserType,
249
- ): $ReadOnlyArray<$FlowFixMe> {
250
- return language === 'Flow'
251
- ? typeAnnotation.params
252
- : typeAnnotation.parameters;
253
- }
254
-
255
- function getFunctionNameFromParameter(
256
- param: NamedShape<Nullable<NativeModuleParamTypeAnnotation>>,
257
- language: ParserType,
258
- ): $FlowFixMe {
259
- return language === 'Flow' ? param.name : param.typeAnnotation;
260
- }
261
-
262
- function getParameterName(param: $FlowFixMe, language: ParserType): string {
263
- return language === 'Flow' ? param.name.name : param.name;
264
- }
265
-
266
- function getParameterTypeAnnotation(
267
- param: $FlowFixMe,
268
- language: ParserType,
269
- ): $FlowFixMe {
270
- return language === 'Flow'
271
- ? param.typeAnnotation
272
- : param.typeAnnotation.typeAnnotation;
273
- }
274
-
275
- function getTypeAnnotationReturnType(
276
- typeAnnotation: $FlowFixMe,
277
- language: ParserType,
278
- ): $FlowFixMe {
279
- return language === 'Flow'
280
- ? typeAnnotation.returnType
281
- : typeAnnotation.typeAnnotation.typeAnnotation;
282
- }
283
-
284
186
  function translateFunctionTypeAnnotation(
285
187
  hasteModuleName: string,
286
188
  // TODO(T108222691): Use flow-types for @babel/parser
287
189
  // TODO(T71778680): This is a FunctionTypeAnnotation. Type this.
288
- typeAnnotation: $FlowFixMe,
190
+ functionTypeAnnotation: $FlowFixMe,
289
191
  types: TypeDeclarationMap,
290
192
  aliasMap: {...NativeModuleAliasMap},
193
+ enumMap: {...NativeModuleEnumMap},
291
194
  tryParse: ParserErrorCapturer,
292
195
  cxxOnly: boolean,
293
196
  translateTypeAnnotation: $FlowFixMe,
294
- language: ParserType,
197
+ parser: Parser,
295
198
  ): NativeModuleFunctionTypeAnnotation {
296
199
  type Param = NamedShape<Nullable<NativeModuleParamTypeAnnotation>>;
297
200
  const params: Array<Param> = [];
298
201
 
299
- for (const param of getTypeAnnotationParameters(typeAnnotation, language)) {
202
+ for (const param of parser.getFunctionTypeAnnotationParameters(
203
+ functionTypeAnnotation,
204
+ )) {
300
205
  const parsedParam = tryParse(() => {
301
- if (getFunctionNameFromParameter(param, language) == null) {
302
- throw new UnnamedFunctionParamParserError(
303
- param,
304
- hasteModuleName,
305
- language,
306
- );
206
+ if (parser.getFunctionNameFromParameter(param) == null) {
207
+ throw new UnnamedFunctionParamParserError(param, hasteModuleName);
307
208
  }
308
209
 
309
- const paramName = getParameterName(param, language);
210
+ const paramName = parser.getParameterName(param);
310
211
 
311
212
  const [paramTypeAnnotation, isParamTypeAnnotationNullable] =
312
213
  unwrapNullable<$FlowFixMe>(
313
214
  translateTypeAnnotation(
314
215
  hasteModuleName,
315
- getParameterTypeAnnotation(param, language),
216
+ parser.getParameterTypeAnnotation(param),
316
217
  types,
317
218
  aliasMap,
219
+ enumMap,
318
220
  tryParse,
319
221
  cxxOnly,
222
+ parser,
320
223
  ),
321
224
  );
322
225
 
@@ -351,19 +254,20 @@ function translateFunctionTypeAnnotation(
351
254
  unwrapNullable<$FlowFixMe>(
352
255
  translateTypeAnnotation(
353
256
  hasteModuleName,
354
- getTypeAnnotationReturnType(typeAnnotation, language),
257
+ parser.getFunctionTypeAnnotationReturnType(functionTypeAnnotation),
355
258
  types,
356
259
  aliasMap,
260
+ enumMap,
357
261
  tryParse,
358
262
  cxxOnly,
263
+ parser,
359
264
  ),
360
265
  );
361
266
 
362
267
  throwIfUnsupportedFunctionReturnTypeAnnotationParserError(
363
268
  hasteModuleName,
364
- typeAnnotation,
269
+ functionTypeAnnotation,
365
270
  'FunctionTypeAnnotation',
366
- language,
367
271
  cxxOnly,
368
272
  returnTypeAnnotation.type,
369
273
  );
@@ -388,17 +292,18 @@ function buildPropertySchema(
388
292
  property: $FlowFixMe,
389
293
  types: TypeDeclarationMap,
390
294
  aliasMap: {...NativeModuleAliasMap},
295
+ enumMap: {...NativeModuleEnumMap},
391
296
  tryParse: ParserErrorCapturer,
392
297
  cxxOnly: boolean,
393
- language: ParserType,
394
298
  resolveTypeAnnotation: $FlowFixMe,
395
299
  translateTypeAnnotation: $FlowFixMe,
300
+ parser: Parser,
396
301
  ): NativeModulePropertyShape {
397
302
  let nullable: boolean = false;
398
303
  let {key, value} = property;
399
304
  const methodName: string = key.name;
400
305
 
401
- if (language === 'TypeScript') {
306
+ if (parser.language() === 'TypeScript') {
402
307
  value =
403
308
  property.type === 'TSMethodSignature'
404
309
  ? property
@@ -412,7 +317,7 @@ function buildPropertySchema(
412
317
  property.value,
413
318
  key.name,
414
319
  value.type,
415
- language,
320
+ parser.language(),
416
321
  );
417
322
 
418
323
  return {
@@ -425,15 +330,114 @@ function buildPropertySchema(
425
330
  value,
426
331
  types,
427
332
  aliasMap,
333
+ enumMap,
428
334
  tryParse,
429
335
  cxxOnly,
430
336
  translateTypeAnnotation,
431
- language,
337
+ parser,
432
338
  ),
433
339
  ),
434
340
  };
435
341
  }
436
342
 
343
+ function buildSchemaFromConfigType(
344
+ configType: 'module' | 'component' | 'none',
345
+ filename: ?string,
346
+ ast: $FlowFixMe,
347
+ wrapComponentSchema: (config: ComponentSchemaBuilderConfig) => SchemaType,
348
+ buildComponentSchema: (
349
+ ast: $FlowFixMe,
350
+ parser: Parser,
351
+ ) => ComponentSchemaBuilderConfig,
352
+ buildModuleSchema: (
353
+ hasteModuleName: string,
354
+ ast: $FlowFixMe,
355
+ tryParse: ParserErrorCapturer,
356
+ parser: Parser,
357
+ ) => NativeModuleSchema,
358
+ parser: Parser,
359
+ ): SchemaType {
360
+ switch (configType) {
361
+ case 'component': {
362
+ return wrapComponentSchema(buildComponentSchema(ast, parser));
363
+ }
364
+ case 'module': {
365
+ if (filename === undefined || filename === null) {
366
+ throw new Error('Filepath expected while parasing a module');
367
+ }
368
+ const nativeModuleName = extractNativeModuleName(filename);
369
+
370
+ const [parsingErrors, tryParse] = createParserErrorCapturer();
371
+
372
+ const schema = tryParse(() =>
373
+ buildModuleSchema(nativeModuleName, ast, tryParse, parser),
374
+ );
375
+
376
+ if (parsingErrors.length > 0) {
377
+ /**
378
+ * TODO(T77968131): We have two options:
379
+ * - Throw the first error, but indicate there are more then one errors.
380
+ * - Display all errors, nicely formatted.
381
+ *
382
+ * For the time being, we're just throw the first error.
383
+ **/
384
+
385
+ throw parsingErrors[0];
386
+ }
387
+
388
+ invariant(
389
+ schema != null,
390
+ 'When there are no parsing errors, the schema should not be null',
391
+ );
392
+
393
+ return wrapModuleSchema(schema, nativeModuleName);
394
+ }
395
+ default:
396
+ return {modules: {}};
397
+ }
398
+ }
399
+
400
+ function buildSchema(
401
+ contents: string,
402
+ filename: ?string,
403
+ wrapComponentSchema: (config: ComponentSchemaBuilderConfig) => SchemaType,
404
+ buildComponentSchema: (
405
+ ast: $FlowFixMe,
406
+ parser: Parser,
407
+ ) => ComponentSchemaBuilderConfig,
408
+ buildModuleSchema: (
409
+ hasteModuleName: string,
410
+ ast: $FlowFixMe,
411
+ tryParse: ParserErrorCapturer,
412
+ parser: Parser,
413
+ ) => NativeModuleSchema,
414
+ Visitor: ({isComponent: boolean, isModule: boolean}) => {
415
+ [type: string]: (node: $FlowFixMe) => void,
416
+ },
417
+ parser: Parser,
418
+ ): SchemaType {
419
+ // Early return for non-Spec JavaScript files
420
+ if (
421
+ !contents.includes('codegenNativeComponent') &&
422
+ !contents.includes('TurboModule')
423
+ ) {
424
+ return {modules: {}};
425
+ }
426
+
427
+ const ast = parser.getAst(contents);
428
+ const configType = getConfigType(ast, Visitor);
429
+
430
+ return buildSchemaFromConfigType(
431
+ configType,
432
+ filename,
433
+ ast,
434
+ wrapComponentSchema,
435
+ buildComponentSchema,
436
+ buildModuleSchema,
437
+ parser,
438
+ );
439
+ }
440
+
437
441
  module.exports = {
438
442
  wrapModuleSchema,
439
443
  unwrapNullable,
@@ -441,7 +445,8 @@ module.exports = {
441
445
  assertGenericTypeAnnotationHasExactlyOneTypeParameter,
442
446
  isObjectProperty,
443
447
  parseObjectProperty,
444
- translateDefault,
445
448
  translateFunctionTypeAnnotation,
446
449
  buildPropertySchema,
450
+ buildSchemaFromConfigType,
451
+ buildSchema,
447
452
  };
@@ -80,7 +80,10 @@ function _arrayWithHoles(arr) {
80
80
  }
81
81
  const _require = require('./errors'),
82
82
  UnsupportedUnionTypeAnnotationParserError =
83
- _require.UnsupportedUnionTypeAnnotationParserError;
83
+ _require.UnsupportedUnionTypeAnnotationParserError,
84
+ UnsupportedTypeAnnotationParserError =
85
+ _require.UnsupportedTypeAnnotationParserError,
86
+ ParserError = _require.ParserError;
84
87
  const _require2 = require('./error-utils'),
85
88
  throwIfArrayElementTypeAnnotationIsUnsupported =
86
89
  _require2.throwIfArrayElementTypeAnnotationIsUnsupported;
@@ -134,20 +137,22 @@ function emitFunction(
134
137
  typeAnnotation,
135
138
  types,
136
139
  aliasMap,
140
+ enumMap,
137
141
  tryParse,
138
142
  cxxOnly,
139
143
  translateTypeAnnotation,
140
- language,
144
+ parser,
141
145
  ) {
142
146
  const translateFunctionTypeAnnotationValue = translateFunctionTypeAnnotation(
143
147
  hasteModuleName,
144
148
  typeAnnotation,
145
149
  types,
146
150
  aliasMap,
151
+ enumMap,
147
152
  tryParse,
148
153
  cxxOnly,
149
154
  translateTypeAnnotation,
150
- language,
155
+ parser,
151
156
  );
152
157
  return wrapNullable(nullable, translateFunctionTypeAnnotationValue);
153
158
  }
@@ -162,19 +167,19 @@ function emitString(nullable) {
162
167
  });
163
168
  }
164
169
  function typeAliasResolution(
165
- typeAliasResolutionStatus,
170
+ typeResolution,
166
171
  objectTypeAnnotation,
167
172
  aliasMap,
168
173
  nullable,
169
174
  ) {
170
- if (!typeAliasResolutionStatus.successful) {
175
+ if (!typeResolution.successful) {
171
176
  return wrapNullable(nullable, objectTypeAnnotation);
172
177
  }
173
178
 
174
179
  /**
175
180
  * All aliases RHS are required.
176
181
  */
177
- aliasMap[typeAliasResolutionStatus.aliasName] = objectTypeAnnotation;
182
+ aliasMap[typeResolution.name] = objectTypeAnnotation;
178
183
 
179
184
  /**
180
185
  * Nullability of type aliases is transitive.
@@ -207,7 +212,51 @@ function typeAliasResolution(
207
212
  */
208
213
  return wrapNullable(nullable, {
209
214
  type: 'TypeAliasTypeAnnotation',
210
- name: typeAliasResolutionStatus.aliasName,
215
+ name: typeResolution.name,
216
+ });
217
+ }
218
+ function typeEnumResolution(
219
+ typeAnnotation,
220
+ typeResolution,
221
+ nullable,
222
+ hasteModuleName,
223
+ language,
224
+ enumMap,
225
+ parser,
226
+ ) {
227
+ if (!typeResolution.successful || typeResolution.type !== 'enum') {
228
+ throw new UnsupportedTypeAnnotationParserError(
229
+ hasteModuleName,
230
+ typeAnnotation,
231
+ language,
232
+ );
233
+ }
234
+ const enumName = typeResolution.name;
235
+ const enumMemberType = parser.parseEnumMembersType(typeAnnotation);
236
+ try {
237
+ parser.validateEnumMembersSupported(typeAnnotation, enumMemberType);
238
+ } catch (e) {
239
+ if (e instanceof Error) {
240
+ throw new ParserError(
241
+ hasteModuleName,
242
+ typeAnnotation,
243
+ `Failed parsing the enum ${enumName} in ${hasteModuleName} with the error: ${e.message}`,
244
+ );
245
+ } else {
246
+ throw e;
247
+ }
248
+ }
249
+ const enumMembers = parser.parseEnumMembers(typeAnnotation);
250
+ enumMap[enumName] = {
251
+ name: enumName,
252
+ type: 'EnumDeclarationWithMembers',
253
+ memberType: enumMemberType,
254
+ members: enumMembers,
255
+ };
256
+ return wrapNullable(nullable, {
257
+ name: enumName,
258
+ type: 'EnumDeclaration',
259
+ memberType: enumMemberType,
211
260
  });
212
261
  }
213
262
  function emitPromise(
@@ -217,6 +266,7 @@ function emitPromise(
217
266
  nullable,
218
267
  types,
219
268
  aliasMap,
269
+ enumMap,
220
270
  tryParse,
221
271
  cxxOnly,
222
272
  translateTypeAnnotation,
@@ -243,8 +293,10 @@ function emitPromise(
243
293
  typeAnnotation.typeParameters.params[0],
244
294
  types,
245
295
  aliasMap,
296
+ enumMap,
246
297
  tryParse,
247
298
  cxxOnly,
299
+ parser,
248
300
  ),
249
301
  });
250
302
  } catch {
@@ -254,11 +306,17 @@ function emitPromise(
254
306
  }
255
307
  }
256
308
  }
257
- function emitObject(nullable) {
309
+ function emitGenericObject(nullable) {
258
310
  return wrapNullable(nullable, {
259
311
  type: 'GenericObjectTypeAnnotation',
260
312
  });
261
313
  }
314
+ function emitObject(nullable, properties) {
315
+ return wrapNullable(nullable, {
316
+ type: 'ObjectTypeAnnotation',
317
+ properties,
318
+ });
319
+ }
262
320
  function emitFloat(nullable) {
263
321
  return wrapNullable(nullable, {
264
322
  type: 'FloatTypeAnnotation',
@@ -275,7 +333,6 @@ function emitUnion(nullable, hasteModuleName, typeAnnotation, parser) {
275
333
  hasteModuleName,
276
334
  typeAnnotation,
277
335
  unionTypes,
278
- parser.language(),
279
336
  );
280
337
  }
281
338
  return wrapNullable(nullable, {
@@ -287,12 +344,13 @@ function translateArrayTypeAnnotation(
287
344
  hasteModuleName,
288
345
  types,
289
346
  aliasMap,
347
+ enumMap,
290
348
  cxxOnly,
291
349
  arrayType,
292
350
  elementType,
293
351
  nullable,
294
- language,
295
352
  translateTypeAnnotation,
353
+ parser,
296
354
  ) {
297
355
  try {
298
356
  /**
@@ -306,6 +364,7 @@ function translateArrayTypeAnnotation(
306
364
  elementType,
307
365
  types,
308
366
  aliasMap,
367
+ enumMap,
309
368
  /**
310
369
  * TODO(T72031674): Ensure that all ParsingErrors that are thrown
311
370
  * while parsing the array element don't get captured and collected.
@@ -316,6 +375,7 @@ function translateArrayTypeAnnotation(
316
375
  */
317
376
  nullGuard,
318
377
  cxxOnly,
378
+ parser,
319
379
  ),
320
380
  ),
321
381
  _unwrapNullable2 = _slicedToArray(_unwrapNullable, 2),
@@ -326,7 +386,6 @@ function translateArrayTypeAnnotation(
326
386
  elementType,
327
387
  arrayType,
328
388
  _elementType.type,
329
- language,
330
389
  );
331
390
  return wrapNullable(nullable, {
332
391
  type: 'ArrayTypeAnnotation',
@@ -345,6 +404,7 @@ function emitArrayType(
345
404
  parser,
346
405
  types,
347
406
  aliasMap,
407
+ enumMap,
348
408
  cxxOnly,
349
409
  nullable,
350
410
  translateTypeAnnotation,
@@ -358,12 +418,13 @@ function emitArrayType(
358
418
  hasteModuleName,
359
419
  types,
360
420
  aliasMap,
421
+ enumMap,
361
422
  cxxOnly,
362
423
  typeAnnotation.type,
363
424
  typeAnnotation.typeParameters.params[0],
364
425
  nullable,
365
- parser.language(),
366
426
  translateTypeAnnotation,
427
+ parser,
367
428
  );
368
429
  }
369
430
  module.exports = {
@@ -374,6 +435,7 @@ module.exports = {
374
435
  emitFunction,
375
436
  emitInt32,
376
437
  emitNumber,
438
+ emitGenericObject,
377
439
  emitObject,
378
440
  emitPromise,
379
441
  emitRootTag,
@@ -383,5 +445,6 @@ module.exports = {
383
445
  emitMixed,
384
446
  emitUnion,
385
447
  typeAliasResolution,
448
+ typeEnumResolution,
386
449
  translateArrayTypeAnnotation,
387
450
  };