@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
@@ -153,7 +153,6 @@ const _require3 = require('../../parsers-commons'),
153
153
  assertGenericTypeAnnotationHasExactlyOneTypeParameter =
154
154
  _require3.assertGenericTypeAnnotationHasExactlyOneTypeParameter,
155
155
  parseObjectProperty = _require3.parseObjectProperty,
156
- translateDefault = _require3.translateDefault,
157
156
  buildPropertySchema = _require3.buildPropertySchema;
158
157
  const _require4 = require('../../parsers-primitives'),
159
158
  emitArrayType = _require4.emitArrayType,
@@ -163,6 +162,7 @@ const _require4 = require('../../parsers-primitives'),
163
162
  emitFunction = _require4.emitFunction,
164
163
  emitNumber = _require4.emitNumber,
165
164
  emitInt32 = _require4.emitInt32,
165
+ emitGenericObject = _require4.emitGenericObject,
166
166
  emitObject = _require4.emitObject,
167
167
  emitPromise = _require4.emitPromise,
168
168
  emitRootTag = _require4.emitRootTag,
@@ -172,12 +172,13 @@ const _require4 = require('../../parsers-primitives'),
172
172
  emitMixed = _require4.emitMixed,
173
173
  emitUnion = _require4.emitUnion,
174
174
  typeAliasResolution = _require4.typeAliasResolution,
175
- translateArrayTypeAnnotation = _require4.translateArrayTypeAnnotation;
175
+ typeEnumResolution = _require4.typeEnumResolution;
176
176
  const _require5 = require('../../errors'),
177
177
  UnsupportedTypeAnnotationParserError =
178
178
  _require5.UnsupportedTypeAnnotationParserError,
179
179
  IncorrectModuleRegistryCallArgumentTypeParserError =
180
- _require5.IncorrectModuleRegistryCallArgumentTypeParserError;
180
+ _require5.IncorrectModuleRegistryCallArgumentTypeParserError,
181
+ UnsupportedGenericParserError = _require5.UnsupportedGenericParserError;
181
182
  const _require6 = require('../../error-utils'),
182
183
  throwIfModuleInterfaceNotFound = _require6.throwIfModuleInterfaceNotFound,
183
184
  throwIfModuleInterfaceIsMisnamed = _require6.throwIfModuleInterfaceIsMisnamed,
@@ -192,10 +193,7 @@ const _require6 = require('../../error-utils'),
192
193
  throwIfUntypedModule = _require6.throwIfUntypedModule,
193
194
  throwIfMoreThanOneModuleInterfaceParserError =
194
195
  _require6.throwIfMoreThanOneModuleInterfaceParserError;
195
- const _require7 = require('../parser'),
196
- FlowParser = _require7.FlowParser;
197
196
  const language = 'Flow';
198
- const parser = new FlowParser();
199
197
  function translateTypeAnnotation(
200
198
  hasteModuleName,
201
199
  /**
@@ -204,8 +202,10 @@ function translateTypeAnnotation(
204
202
  flowTypeAnnotation,
205
203
  types,
206
204
  aliasMap,
205
+ enumMap,
207
206
  tryParse,
208
207
  cxxOnly,
208
+ parser,
209
209
  ) {
210
210
  const _resolveTypeAnnotatio = resolveTypeAnnotation(
211
211
  flowTypeAnnotation,
@@ -213,7 +213,7 @@ function translateTypeAnnotation(
213
213
  ),
214
214
  nullable = _resolveTypeAnnotatio.nullable,
215
215
  typeAnnotation = _resolveTypeAnnotatio.typeAnnotation,
216
- typeAliasResolutionStatus = _resolveTypeAnnotatio.typeAliasResolutionStatus;
216
+ typeResolutionStatus = _resolveTypeAnnotatio.typeResolutionStatus;
217
217
  switch (typeAnnotation.type) {
218
218
  case 'GenericTypeAnnotation': {
219
219
  switch (typeAnnotation.id.name) {
@@ -228,6 +228,7 @@ function translateTypeAnnotation(
228
228
  nullable,
229
229
  types,
230
230
  aliasMap,
231
+ enumMap,
231
232
  tryParse,
232
233
  cxxOnly,
233
234
  translateTypeAnnotation,
@@ -241,6 +242,7 @@ function translateTypeAnnotation(
241
242
  parser,
242
243
  types,
243
244
  aliasMap,
245
+ enumMap,
244
246
  cxxOnly,
245
247
  nullable,
246
248
  translateTypeAnnotation,
@@ -258,8 +260,10 @@ function translateTypeAnnotation(
258
260
  typeAnnotation.typeParameters.params[0],
259
261
  types,
260
262
  aliasMap,
263
+ enumMap,
261
264
  tryParse,
262
265
  cxxOnly,
266
+ parser,
263
267
  ),
264
268
  ),
265
269
  _unwrapNullable2 = _slicedToArray(_unwrapNullable, 2),
@@ -281,20 +285,72 @@ function translateTypeAnnotation(
281
285
  }
282
286
  case 'UnsafeObject':
283
287
  case 'Object': {
284
- return emitObject(nullable);
288
+ return emitGenericObject(nullable);
289
+ }
290
+ case '$Partial': {
291
+ if (typeAnnotation.typeParameters.params.length !== 1) {
292
+ throw new Error(
293
+ 'Partials only support annotating exactly one parameter.',
294
+ );
295
+ }
296
+ const annotatedElement =
297
+ types[typeAnnotation.typeParameters.params[0].id.name];
298
+ if (!annotatedElement) {
299
+ throw new Error(
300
+ 'Partials only support annotating a type parameter.',
301
+ );
302
+ }
303
+ const properties = annotatedElement.right.properties.map(prop => {
304
+ return {
305
+ name: prop.key.name,
306
+ optional: true,
307
+ typeAnnotation: translateTypeAnnotation(
308
+ hasteModuleName,
309
+ prop.value,
310
+ types,
311
+ aliasMap,
312
+ enumMap,
313
+ tryParse,
314
+ cxxOnly,
315
+ parser,
316
+ ),
317
+ };
318
+ });
319
+ return emitObject(nullable, properties);
285
320
  }
286
321
  default: {
287
- return translateDefault(
322
+ throw new UnsupportedGenericParserError(
288
323
  hasteModuleName,
289
324
  typeAnnotation,
290
- types,
291
- nullable,
292
325
  parser,
293
326
  );
294
327
  }
295
328
  }
296
329
  }
297
330
  case 'ObjectTypeAnnotation': {
331
+ // if there is any indexer, then it is a dictionary
332
+ if (typeAnnotation.indexers) {
333
+ const indexers = typeAnnotation.indexers.filter(
334
+ member => member.type === 'ObjectTypeIndexer',
335
+ );
336
+ if (indexers.length > 0) {
337
+ // check the property type to prevent developers from using unsupported types
338
+ // the return value from `translateTypeAnnotation` is unused
339
+ const propertyType = indexers[0].value;
340
+ translateTypeAnnotation(
341
+ hasteModuleName,
342
+ propertyType,
343
+ types,
344
+ aliasMap,
345
+ enumMap,
346
+ tryParse,
347
+ cxxOnly,
348
+ parser,
349
+ );
350
+ // no need to do further checking
351
+ return emitGenericObject(nullable);
352
+ }
353
+ }
298
354
  const objectTypeAnnotation = {
299
355
  type: 'ObjectTypeAnnotation',
300
356
  // $FlowFixMe[missing-type-arg]
@@ -306,6 +362,7 @@ function translateTypeAnnotation(
306
362
  hasteModuleName,
307
363
  types,
308
364
  aliasMap,
365
+ enumMap,
309
366
  tryParse,
310
367
  cxxOnly,
311
368
  nullable,
@@ -317,7 +374,7 @@ function translateTypeAnnotation(
317
374
  .filter(Boolean),
318
375
  };
319
376
  return typeAliasResolution(
320
- typeAliasResolutionStatus,
377
+ typeResolutionStatus,
321
378
  objectTypeAnnotation,
322
379
  aliasMap,
323
380
  nullable,
@@ -342,10 +399,11 @@ function translateTypeAnnotation(
342
399
  typeAnnotation,
343
400
  types,
344
401
  aliasMap,
402
+ enumMap,
345
403
  tryParse,
346
404
  cxxOnly,
347
405
  translateTypeAnnotation,
348
- language,
406
+ parser,
349
407
  );
350
408
  }
351
409
  case 'UnionTypeAnnotation': {
@@ -361,10 +419,22 @@ function translateTypeAnnotation(
361
419
  case 'MixedTypeAnnotation': {
362
420
  if (cxxOnly) {
363
421
  return emitMixed(nullable);
422
+ } else {
423
+ return emitGenericObject(nullable);
364
424
  }
365
- // Fallthrough
366
425
  }
367
-
426
+ case 'EnumStringBody':
427
+ case 'EnumNumberBody': {
428
+ return typeEnumResolution(
429
+ typeAnnotation,
430
+ typeResolutionStatus,
431
+ nullable,
432
+ hasteModuleName,
433
+ language,
434
+ enumMap,
435
+ parser,
436
+ );
437
+ }
368
438
  default: {
369
439
  throw new UnsupportedTypeAnnotationParserError(
370
440
  hasteModuleName,
@@ -389,6 +459,7 @@ function buildModuleSchema(
389
459
  */
390
460
  ast,
391
461
  tryParse,
462
+ parser,
392
463
  ) {
393
464
  const types = getTypes(ast);
394
465
  const moduleSpecs = Object.values(types).filter(isModuleInterface);
@@ -421,13 +492,11 @@ function buildModuleSchema(
421
492
  hasteModuleName,
422
493
  moduleSpec,
423
494
  callExpressions,
424
- language,
425
495
  );
426
496
  throwIfMoreThanOneModuleRegistryCalls(
427
497
  hasteModuleName,
428
498
  callExpressions,
429
499
  callExpressions.length,
430
- language,
431
500
  );
432
501
  const callExpression = callExpressions[0];
433
502
  const typeArguments = callExpression.typeArguments;
@@ -437,7 +506,6 @@ function buildModuleSchema(
437
506
  callExpression,
438
507
  methodName,
439
508
  callExpression.arguments.length,
440
- language,
441
509
  );
442
510
  if (callExpression.arguments[0].type !== 'Literal') {
443
511
  const type = callExpression.arguments[0].type;
@@ -446,7 +514,6 @@ function buildModuleSchema(
446
514
  callExpression.arguments[0],
447
515
  methodName,
448
516
  type,
449
- language,
450
517
  );
451
518
  }
452
519
  const $moduleName = callExpression.arguments[0].value;
@@ -456,7 +523,6 @@ function buildModuleSchema(
456
523
  callExpression,
457
524
  methodName,
458
525
  $moduleName,
459
- language,
460
526
  );
461
527
  throwIfIncorrectModuleRegistryCallTypeParameterParserError(
462
528
  hasteModuleName,
@@ -481,29 +547,36 @@ function buildModuleSchema(
481
547
  .filter(property => property.type === 'ObjectTypeProperty')
482
548
  .map(property => {
483
549
  const aliasMap = {};
550
+ const enumMap = {};
484
551
  return tryParse(() => ({
485
552
  aliasMap: aliasMap,
553
+ enumMap: enumMap,
486
554
  propertyShape: buildPropertySchema(
487
555
  hasteModuleName,
488
556
  property,
489
557
  types,
490
558
  aliasMap,
559
+ enumMap,
491
560
  tryParse,
492
561
  cxxOnly,
493
- language,
494
562
  resolveTypeAnnotation,
495
563
  translateTypeAnnotation,
564
+ parser,
496
565
  ),
497
566
  }));
498
567
  })
499
568
  .filter(Boolean)
500
569
  .reduce(
501
- (moduleSchema, {aliasMap, propertyShape}) => ({
570
+ (moduleSchema, {aliasMap, enumMap, propertyShape}) => ({
502
571
  type: 'NativeModule',
503
- aliases: _objectSpread(
504
- _objectSpread({}, moduleSchema.aliases),
572
+ aliasMap: _objectSpread(
573
+ _objectSpread({}, moduleSchema.aliasMap),
505
574
  aliasMap,
506
575
  ),
576
+ enumMap: _objectSpread(
577
+ _objectSpread({}, moduleSchema.enumMap),
578
+ enumMap,
579
+ ),
507
580
  spec: {
508
581
  properties: [...moduleSchema.spec.properties, propertyShape],
509
582
  },
@@ -512,7 +585,8 @@ function buildModuleSchema(
512
585
  }),
513
586
  {
514
587
  type: 'NativeModule',
515
- aliases: {},
588
+ aliasMap: {},
589
+ enumMap: {},
516
590
  spec: {
517
591
  properties: [],
518
592
  },
@@ -13,12 +13,15 @@
13
13
  import type {
14
14
  NamedShape,
15
15
  NativeModuleAliasMap,
16
+ NativeModuleEnumMap,
16
17
  NativeModuleBaseTypeAnnotation,
17
18
  NativeModuleTypeAnnotation,
18
19
  NativeModulePropertyShape,
19
20
  NativeModuleSchema,
20
21
  Nullable,
21
22
  } from '../../../CodegenSchema';
23
+
24
+ import type {Parser} from '../../parser';
22
25
  import type {ParserErrorCapturer, TypeDeclarationMap} from '../../utils';
23
26
 
24
27
  const {visit, isModuleRegistryCall, verifyPlatforms} = require('../../utils');
@@ -28,7 +31,6 @@ const {
28
31
  wrapNullable,
29
32
  assertGenericTypeAnnotationHasExactlyOneTypeParameter,
30
33
  parseObjectProperty,
31
- translateDefault,
32
34
  buildPropertySchema,
33
35
  } = require('../../parsers-commons');
34
36
  const {
@@ -39,6 +41,7 @@ const {
39
41
  emitFunction,
40
42
  emitNumber,
41
43
  emitInt32,
44
+ emitGenericObject,
42
45
  emitObject,
43
46
  emitPromise,
44
47
  emitRootTag,
@@ -48,12 +51,13 @@ const {
48
51
  emitMixed,
49
52
  emitUnion,
50
53
  typeAliasResolution,
51
- translateArrayTypeAnnotation,
54
+ typeEnumResolution,
52
55
  } = require('../../parsers-primitives');
53
56
 
54
57
  const {
55
58
  UnsupportedTypeAnnotationParserError,
56
59
  IncorrectModuleRegistryCallArgumentTypeParserError,
60
+ UnsupportedGenericParserError,
57
61
  } = require('../../errors');
58
62
 
59
63
  const {
@@ -67,10 +71,7 @@ const {
67
71
  throwIfMoreThanOneModuleInterfaceParserError,
68
72
  } = require('../../error-utils');
69
73
 
70
- const {FlowParser} = require('../parser');
71
-
72
74
  const language = 'Flow';
73
- const parser = new FlowParser();
74
75
 
75
76
  function translateTypeAnnotation(
76
77
  hasteModuleName: string,
@@ -80,10 +81,12 @@ function translateTypeAnnotation(
80
81
  flowTypeAnnotation: $FlowFixMe,
81
82
  types: TypeDeclarationMap,
82
83
  aliasMap: {...NativeModuleAliasMap},
84
+ enumMap: {...NativeModuleEnumMap},
83
85
  tryParse: ParserErrorCapturer,
84
86
  cxxOnly: boolean,
87
+ parser: Parser,
85
88
  ): Nullable<NativeModuleTypeAnnotation> {
86
- const {nullable, typeAnnotation, typeAliasResolutionStatus} =
89
+ const {nullable, typeAnnotation, typeResolutionStatus} =
87
90
  resolveTypeAnnotation(flowTypeAnnotation, types);
88
91
 
89
92
  switch (typeAnnotation.type) {
@@ -100,6 +103,7 @@ function translateTypeAnnotation(
100
103
  nullable,
101
104
  types,
102
105
  aliasMap,
106
+ enumMap,
103
107
  tryParse,
104
108
  cxxOnly,
105
109
  translateTypeAnnotation,
@@ -113,6 +117,7 @@ function translateTypeAnnotation(
113
117
  parser,
114
118
  types,
115
119
  aliasMap,
120
+ enumMap,
116
121
  cxxOnly,
117
122
  nullable,
118
123
  translateTypeAnnotation,
@@ -131,8 +136,10 @@ function translateTypeAnnotation(
131
136
  typeAnnotation.typeParameters.params[0],
132
137
  types,
133
138
  aliasMap,
139
+ enumMap,
134
140
  tryParse,
135
141
  cxxOnly,
142
+ parser,
136
143
  ),
137
144
  );
138
145
 
@@ -152,20 +159,77 @@ function translateTypeAnnotation(
152
159
  }
153
160
  case 'UnsafeObject':
154
161
  case 'Object': {
155
- return emitObject(nullable);
162
+ return emitGenericObject(nullable);
163
+ }
164
+ case '$Partial': {
165
+ if (typeAnnotation.typeParameters.params.length !== 1) {
166
+ throw new Error(
167
+ 'Partials only support annotating exactly one parameter.',
168
+ );
169
+ }
170
+
171
+ const annotatedElement =
172
+ types[typeAnnotation.typeParameters.params[0].id.name];
173
+
174
+ if (!annotatedElement) {
175
+ throw new Error(
176
+ 'Partials only support annotating a type parameter.',
177
+ );
178
+ }
179
+
180
+ const properties = annotatedElement.right.properties.map(prop => {
181
+ return {
182
+ name: prop.key.name,
183
+ optional: true,
184
+ typeAnnotation: translateTypeAnnotation(
185
+ hasteModuleName,
186
+ prop.value,
187
+ types,
188
+ aliasMap,
189
+ enumMap,
190
+ tryParse,
191
+ cxxOnly,
192
+ parser,
193
+ ),
194
+ };
195
+ });
196
+
197
+ return emitObject(nullable, properties);
156
198
  }
157
199
  default: {
158
- return translateDefault(
200
+ throw new UnsupportedGenericParserError(
159
201
  hasteModuleName,
160
202
  typeAnnotation,
161
- types,
162
- nullable,
163
203
  parser,
164
204
  );
165
205
  }
166
206
  }
167
207
  }
168
208
  case 'ObjectTypeAnnotation': {
209
+ // if there is any indexer, then it is a dictionary
210
+ if (typeAnnotation.indexers) {
211
+ const indexers = typeAnnotation.indexers.filter(
212
+ member => member.type === 'ObjectTypeIndexer',
213
+ );
214
+ if (indexers.length > 0) {
215
+ // check the property type to prevent developers from using unsupported types
216
+ // the return value from `translateTypeAnnotation` is unused
217
+ const propertyType = indexers[0].value;
218
+ translateTypeAnnotation(
219
+ hasteModuleName,
220
+ propertyType,
221
+ types,
222
+ aliasMap,
223
+ enumMap,
224
+ tryParse,
225
+ cxxOnly,
226
+ parser,
227
+ );
228
+ // no need to do further checking
229
+ return emitGenericObject(nullable);
230
+ }
231
+ }
232
+
169
233
  const objectTypeAnnotation = {
170
234
  type: 'ObjectTypeAnnotation',
171
235
  // $FlowFixMe[missing-type-arg]
@@ -181,6 +245,7 @@ function translateTypeAnnotation(
181
245
  hasteModuleName,
182
246
  types,
183
247
  aliasMap,
248
+ enumMap,
184
249
  tryParse,
185
250
  cxxOnly,
186
251
  nullable,
@@ -194,7 +259,7 @@ function translateTypeAnnotation(
194
259
  };
195
260
 
196
261
  return typeAliasResolution(
197
- typeAliasResolutionStatus,
262
+ typeResolutionStatus,
198
263
  objectTypeAnnotation,
199
264
  aliasMap,
200
265
  nullable,
@@ -219,10 +284,11 @@ function translateTypeAnnotation(
219
284
  typeAnnotation,
220
285
  types,
221
286
  aliasMap,
287
+ enumMap,
222
288
  tryParse,
223
289
  cxxOnly,
224
290
  translateTypeAnnotation,
225
- language,
291
+ parser,
226
292
  );
227
293
  }
228
294
  case 'UnionTypeAnnotation': {
@@ -238,8 +304,21 @@ function translateTypeAnnotation(
238
304
  case 'MixedTypeAnnotation': {
239
305
  if (cxxOnly) {
240
306
  return emitMixed(nullable);
307
+ } else {
308
+ return emitGenericObject(nullable);
241
309
  }
242
- // Fallthrough
310
+ }
311
+ case 'EnumStringBody':
312
+ case 'EnumNumberBody': {
313
+ return typeEnumResolution(
314
+ typeAnnotation,
315
+ typeResolutionStatus,
316
+ nullable,
317
+ hasteModuleName,
318
+ language,
319
+ enumMap,
320
+ parser,
321
+ );
243
322
  }
244
323
  default: {
245
324
  throw new UnsupportedTypeAnnotationParserError(
@@ -267,6 +346,7 @@ function buildModuleSchema(
267
346
  */
268
347
  ast: $FlowFixMe,
269
348
  tryParse: ParserErrorCapturer,
349
+ parser: Parser,
270
350
  ): NativeModuleSchema {
271
351
  const types = getTypes(ast);
272
352
  const moduleSpecs = (Object.values(types): $ReadOnlyArray<$FlowFixMe>).filter(
@@ -305,14 +385,12 @@ function buildModuleSchema(
305
385
  hasteModuleName,
306
386
  moduleSpec,
307
387
  callExpressions,
308
- language,
309
388
  );
310
389
 
311
390
  throwIfMoreThanOneModuleRegistryCalls(
312
391
  hasteModuleName,
313
392
  callExpressions,
314
393
  callExpressions.length,
315
- language,
316
394
  );
317
395
 
318
396
  const [callExpression] = callExpressions;
@@ -324,7 +402,6 @@ function buildModuleSchema(
324
402
  callExpression,
325
403
  methodName,
326
404
  callExpression.arguments.length,
327
- language,
328
405
  );
329
406
 
330
407
  if (callExpression.arguments[0].type !== 'Literal') {
@@ -334,7 +411,6 @@ function buildModuleSchema(
334
411
  callExpression.arguments[0],
335
412
  methodName,
336
413
  type,
337
- language,
338
414
  );
339
415
  }
340
416
 
@@ -346,7 +422,6 @@ function buildModuleSchema(
346
422
  callExpression,
347
423
  methodName,
348
424
  $moduleName,
349
- language,
350
425
  );
351
426
 
352
427
  throwIfIncorrectModuleRegistryCallTypeParameterParserError(
@@ -374,29 +449,37 @@ function buildModuleSchema(
374
449
  .filter(property => property.type === 'ObjectTypeProperty')
375
450
  .map<?{
376
451
  aliasMap: NativeModuleAliasMap,
452
+ enumMap: NativeModuleEnumMap,
377
453
  propertyShape: NativeModulePropertyShape,
378
454
  }>(property => {
379
455
  const aliasMap: {...NativeModuleAliasMap} = {};
456
+ const enumMap: {...NativeModuleEnumMap} = {};
380
457
  return tryParse(() => ({
381
458
  aliasMap: aliasMap,
459
+ enumMap: enumMap,
382
460
  propertyShape: buildPropertySchema(
383
461
  hasteModuleName,
384
462
  property,
385
463
  types,
386
464
  aliasMap,
465
+ enumMap,
387
466
  tryParse,
388
467
  cxxOnly,
389
- language,
390
468
  resolveTypeAnnotation,
391
469
  translateTypeAnnotation,
470
+ parser,
392
471
  ),
393
472
  }));
394
473
  })
395
474
  .filter(Boolean)
396
475
  .reduce(
397
- (moduleSchema: NativeModuleSchema, {aliasMap, propertyShape}) => ({
476
+ (
477
+ moduleSchema: NativeModuleSchema,
478
+ {aliasMap, enumMap, propertyShape},
479
+ ) => ({
398
480
  type: 'NativeModule',
399
- aliases: {...moduleSchema.aliases, ...aliasMap},
481
+ aliasMap: {...moduleSchema.aliasMap, ...aliasMap},
482
+ enumMap: {...moduleSchema.enumMap, ...enumMap},
400
483
  spec: {
401
484
  properties: [...moduleSchema.spec.properties, propertyShape],
402
485
  },
@@ -405,7 +488,8 @@ function buildModuleSchema(
405
488
  }),
406
489
  {
407
490
  type: 'NativeModule',
408
- aliases: {},
491
+ aliasMap: {},
492
+ enumMap: {},
409
493
  spec: {properties: []},
410
494
  moduleName,
411
495
  excludedPlatforms:
@@ -0,0 +1,10 @@
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 {Parser} from '../parser';
9
+
10
+ export declare class FlowParser implements Parser{}