@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
@@ -13,6 +13,7 @@
13
13
  import type {
14
14
  NamedShape,
15
15
  NativeModuleAliasMap,
16
+ NativeModuleEnumMap,
16
17
  NativeModuleBaseTypeAnnotation,
17
18
  NativeModulePropertyShape,
18
19
  NativeModuleTypeAnnotation,
@@ -20,16 +21,23 @@ import type {
20
21
  Nullable,
21
22
  } from '../../../CodegenSchema';
22
23
 
23
- import type {ParserErrorCapturer, TypeDeclarationMap} from '../../utils';
24
+ import type {Parser} from '../../parser';
25
+ import type {
26
+ ParserErrorCapturer,
27
+ TypeResolutionStatus,
28
+ TypeDeclarationMap,
29
+ } from '../../utils';
30
+ const {flattenIntersectionType} = require('../parseTopLevelType');
31
+ const {flattenProperties} = require('../components/componentsUtils');
24
32
 
25
33
  const {visit, isModuleRegistryCall, verifyPlatforms} = require('../../utils');
26
34
  const {resolveTypeAnnotation, getTypes} = require('../utils');
27
35
 
28
36
  const {
29
37
  parseObjectProperty,
30
- translateDefault,
31
38
  buildPropertySchema,
32
39
  } = require('../../parsers-commons');
40
+ const {typeEnumResolution} = require('../../parsers-primitives');
33
41
 
34
42
  const {
35
43
  emitArrayType,
@@ -39,6 +47,7 @@ const {
39
47
  emitFunction,
40
48
  emitNumber,
41
49
  emitInt32,
50
+ emitGenericObject,
42
51
  emitObject,
43
52
  emitPromise,
44
53
  emitRootTag,
@@ -68,10 +77,65 @@ const {
68
77
  throwIfIncorrectModuleRegistryCallTypeParameterParserError,
69
78
  } = require('../../error-utils');
70
79
 
71
- const {TypeScriptParser} = require('../parser');
72
-
73
80
  const language = 'TypeScript';
74
- const parser = new TypeScriptParser();
81
+
82
+ function translateObjectTypeAnnotation(
83
+ hasteModuleName: string,
84
+ /**
85
+ * TODO(T108222691): Use flow-types for @babel/parser
86
+ */
87
+ nullable: boolean,
88
+ objectMembers: $ReadOnlyArray<$FlowFixMe>,
89
+ typeResolutionStatus: TypeResolutionStatus,
90
+ baseTypes: $ReadOnlyArray<string>,
91
+ types: TypeDeclarationMap,
92
+ aliasMap: {...NativeModuleAliasMap},
93
+ enumMap: {...NativeModuleEnumMap},
94
+ tryParse: ParserErrorCapturer,
95
+ cxxOnly: boolean,
96
+ parser: Parser,
97
+ ): Nullable<NativeModuleTypeAnnotation> {
98
+ // $FlowFixMe[missing-type-arg]
99
+ const properties = objectMembers
100
+ .map<?NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>>(property => {
101
+ return tryParse(() => {
102
+ return parseObjectProperty(
103
+ property,
104
+ hasteModuleName,
105
+ types,
106
+ aliasMap,
107
+ enumMap,
108
+ tryParse,
109
+ cxxOnly,
110
+ nullable,
111
+ translateTypeAnnotation,
112
+ parser,
113
+ );
114
+ });
115
+ })
116
+ .filter(Boolean);
117
+
118
+ let objectTypeAnnotation;
119
+ if (baseTypes.length === 0) {
120
+ objectTypeAnnotation = {
121
+ type: 'ObjectTypeAnnotation',
122
+ properties,
123
+ };
124
+ } else {
125
+ objectTypeAnnotation = {
126
+ type: 'ObjectTypeAnnotation',
127
+ properties,
128
+ baseTypes,
129
+ };
130
+ }
131
+
132
+ return typeAliasResolution(
133
+ typeResolutionStatus,
134
+ objectTypeAnnotation,
135
+ aliasMap,
136
+ nullable,
137
+ );
138
+ }
75
139
 
76
140
  function translateTypeAnnotation(
77
141
  hasteModuleName: string,
@@ -81,10 +145,12 @@ function translateTypeAnnotation(
81
145
  typeScriptTypeAnnotation: $FlowFixMe,
82
146
  types: TypeDeclarationMap,
83
147
  aliasMap: {...NativeModuleAliasMap},
148
+ enumMap: {...NativeModuleEnumMap},
84
149
  tryParse: ParserErrorCapturer,
85
150
  cxxOnly: boolean,
151
+ parser: Parser,
86
152
  ): Nullable<NativeModuleTypeAnnotation> {
87
- const {nullable, typeAnnotation, typeAliasResolutionStatus} =
153
+ const {nullable, typeAnnotation, typeResolutionStatus} =
88
154
  resolveTypeAnnotation(typeScriptTypeAnnotation, types);
89
155
 
90
156
  switch (typeAnnotation.type) {
@@ -93,12 +159,13 @@ function translateTypeAnnotation(
93
159
  hasteModuleName,
94
160
  types,
95
161
  aliasMap,
162
+ enumMap,
96
163
  cxxOnly,
97
164
  'Array',
98
165
  typeAnnotation.elementType,
99
166
  nullable,
100
- language,
101
167
  translateTypeAnnotation,
168
+ parser,
102
169
  );
103
170
  }
104
171
  case 'TSTypeOperator': {
@@ -110,12 +177,13 @@ function translateTypeAnnotation(
110
177
  hasteModuleName,
111
178
  types,
112
179
  aliasMap,
180
+ enumMap,
113
181
  cxxOnly,
114
182
  'ReadonlyArray',
115
183
  typeAnnotation.typeAnnotation.elementType,
116
184
  nullable,
117
- language,
118
185
  translateTypeAnnotation,
186
+ parser,
119
187
  );
120
188
  } else {
121
189
  throw new UnsupportedGenericParserError(
@@ -138,6 +206,7 @@ function translateTypeAnnotation(
138
206
  nullable,
139
207
  types,
140
208
  aliasMap,
209
+ enumMap,
141
210
  tryParse,
142
211
  cxxOnly,
143
212
  translateTypeAnnotation,
@@ -151,6 +220,7 @@ function translateTypeAnnotation(
151
220
  parser,
152
221
  types,
153
222
  aliasMap,
223
+ enumMap,
154
224
  cxxOnly,
155
225
  nullable,
156
226
  translateTypeAnnotation,
@@ -170,49 +240,155 @@ function translateTypeAnnotation(
170
240
  }
171
241
  case 'UnsafeObject':
172
242
  case 'Object': {
173
- return emitObject(nullable);
243
+ return emitGenericObject(nullable);
244
+ }
245
+ case 'Partial': {
246
+ if (typeAnnotation.typeParameters.params.length !== 1) {
247
+ throw new Error(
248
+ 'Partials only support annotating exactly one parameter.',
249
+ );
250
+ }
251
+
252
+ const annotatedElement =
253
+ types[typeAnnotation.typeParameters.params[0].typeName.name];
254
+
255
+ if (!annotatedElement) {
256
+ throw new Error(
257
+ 'Partials only support annotating a type parameter.',
258
+ );
259
+ }
260
+
261
+ const properties = annotatedElement.typeAnnotation.members.map(
262
+ member => {
263
+ return {
264
+ name: member.key.name,
265
+ optional: true,
266
+ typeAnnotation: translateTypeAnnotation(
267
+ hasteModuleName,
268
+ member.typeAnnotation.typeAnnotation,
269
+ types,
270
+ aliasMap,
271
+ enumMap,
272
+ tryParse,
273
+ cxxOnly,
274
+ parser,
275
+ ),
276
+ };
277
+ },
278
+ );
279
+
280
+ return emitObject(nullable, properties);
174
281
  }
175
282
  default: {
176
- return translateDefault(
283
+ throw new UnsupportedGenericParserError(
177
284
  hasteModuleName,
178
285
  typeAnnotation,
179
- types,
180
- nullable,
181
286
  parser,
182
287
  );
183
288
  }
184
289
  }
185
290
  }
291
+ case 'TSInterfaceDeclaration': {
292
+ const baseTypes = (typeAnnotation.extends ?? []).map(
293
+ extend => extend.expression.name,
294
+ );
295
+ for (const baseType of baseTypes) {
296
+ // ensure base types exist and appear in aliasMap
297
+ translateTypeAnnotation(
298
+ hasteModuleName,
299
+ {
300
+ type: 'TSTypeReference',
301
+ typeName: {type: 'Identifier', name: baseType},
302
+ },
303
+ types,
304
+ aliasMap,
305
+ enumMap,
306
+ tryParse,
307
+ cxxOnly,
308
+ parser,
309
+ );
310
+ }
311
+
312
+ return translateObjectTypeAnnotation(
313
+ hasteModuleName,
314
+ nullable,
315
+ flattenProperties([typeAnnotation], types),
316
+ typeResolutionStatus,
317
+ baseTypes,
318
+ types,
319
+ aliasMap,
320
+ enumMap,
321
+ tryParse,
322
+ cxxOnly,
323
+ parser,
324
+ );
325
+ }
326
+ case 'TSIntersectionType': {
327
+ return translateObjectTypeAnnotation(
328
+ hasteModuleName,
329
+ nullable,
330
+ flattenProperties(
331
+ flattenIntersectionType(typeAnnotation, types),
332
+ types,
333
+ ),
334
+ typeResolutionStatus,
335
+ [],
336
+ types,
337
+ aliasMap,
338
+ enumMap,
339
+ tryParse,
340
+ cxxOnly,
341
+ parser,
342
+ );
343
+ }
186
344
  case 'TSTypeLiteral': {
187
- const objectTypeAnnotation = {
188
- type: 'ObjectTypeAnnotation',
189
- // $FlowFixMe[missing-type-arg]
190
- properties: (typeAnnotation.members: Array<$FlowFixMe>)
191
- .map<?NamedShape<Nullable<NativeModuleBaseTypeAnnotation>>>(
192
- property => {
193
- return tryParse(() => {
194
- return parseObjectProperty(
195
- property,
196
- hasteModuleName,
197
- types,
198
- aliasMap,
199
- tryParse,
200
- cxxOnly,
201
- nullable,
202
- translateTypeAnnotation,
203
- parser,
204
- );
205
- });
206
- },
207
- )
208
- .filter(Boolean),
209
- };
345
+ // if there is TSIndexSignature, then it is a dictionary
346
+ if (typeAnnotation.members) {
347
+ const indexSignatures = typeAnnotation.members.filter(
348
+ member => member.type === 'TSIndexSignature',
349
+ );
350
+ if (indexSignatures.length > 0) {
351
+ // check the property type to prevent developers from using unsupported types
352
+ // the return value from `translateTypeAnnotation` is unused
353
+ const propertyType = indexSignatures[0].typeAnnotation;
354
+ translateTypeAnnotation(
355
+ hasteModuleName,
356
+ propertyType,
357
+ types,
358
+ aliasMap,
359
+ enumMap,
360
+ tryParse,
361
+ cxxOnly,
362
+ parser,
363
+ );
364
+ // no need to do further checking
365
+ return emitGenericObject(nullable);
366
+ }
367
+ }
210
368
 
211
- return typeAliasResolution(
212
- typeAliasResolutionStatus,
213
- objectTypeAnnotation,
369
+ return translateObjectTypeAnnotation(
370
+ hasteModuleName,
371
+ nullable,
372
+ typeAnnotation.members,
373
+ typeResolutionStatus,
374
+ [],
375
+ types,
214
376
  aliasMap,
377
+ enumMap,
378
+ tryParse,
379
+ cxxOnly,
380
+ parser,
381
+ );
382
+ }
383
+ case 'TSEnumDeclaration': {
384
+ return typeEnumResolution(
385
+ typeAnnotation,
386
+ typeResolutionStatus,
215
387
  nullable,
388
+ hasteModuleName,
389
+ language,
390
+ enumMap,
391
+ parser,
216
392
  );
217
393
  }
218
394
  case 'TSBooleanKeyword': {
@@ -234,10 +410,11 @@ function translateTypeAnnotation(
234
410
  typeAnnotation,
235
411
  types,
236
412
  aliasMap,
413
+ enumMap,
237
414
  tryParse,
238
415
  cxxOnly,
239
416
  translateTypeAnnotation,
240
- language,
417
+ parser,
241
418
  );
242
419
  }
243
420
  case 'TSUnionType': {
@@ -275,6 +452,7 @@ function buildModuleSchema(
275
452
  */
276
453
  ast: $FlowFixMe,
277
454
  tryParse: ParserErrorCapturer,
455
+ parser: Parser,
278
456
  ): NativeModuleSchema {
279
457
  const types = getTypes(ast);
280
458
  const moduleSpecs = (Object.values(types): $ReadOnlyArray<$FlowFixMe>).filter(
@@ -313,14 +491,12 @@ function buildModuleSchema(
313
491
  hasteModuleName,
314
492
  moduleSpec,
315
493
  callExpressions,
316
- language,
317
494
  );
318
495
 
319
496
  throwIfMoreThanOneModuleRegistryCalls(
320
497
  hasteModuleName,
321
498
  callExpressions,
322
499
  callExpressions.length,
323
- language,
324
500
  );
325
501
 
326
502
  const [callExpression] = callExpressions;
@@ -332,7 +508,6 @@ function buildModuleSchema(
332
508
  callExpression,
333
509
  methodName,
334
510
  callExpression.arguments.length,
335
- language,
336
511
  );
337
512
 
338
513
  if (callExpression.arguments[0].type !== 'StringLiteral') {
@@ -342,7 +517,6 @@ function buildModuleSchema(
342
517
  callExpression.arguments[0],
343
518
  methodName,
344
519
  type,
345
- language,
346
520
  );
347
521
  }
348
522
 
@@ -354,7 +528,6 @@ function buildModuleSchema(
354
528
  callExpression,
355
529
  methodName,
356
530
  $moduleName,
357
- language,
358
531
  );
359
532
 
360
533
  throwIfIncorrectModuleRegistryCallTypeParameterParserError(
@@ -386,31 +559,39 @@ function buildModuleSchema(
386
559
  )
387
560
  .map<?{
388
561
  aliasMap: NativeModuleAliasMap,
562
+ enumMap: NativeModuleEnumMap,
389
563
  propertyShape: NativeModulePropertyShape,
390
564
  }>(property => {
391
565
  const aliasMap: {...NativeModuleAliasMap} = {};
566
+ const enumMap: {...NativeModuleEnumMap} = {};
392
567
 
393
568
  return tryParse(() => ({
394
569
  aliasMap: aliasMap,
570
+ enumMap: enumMap,
395
571
  propertyShape: buildPropertySchema(
396
572
  hasteModuleName,
397
573
  property,
398
574
  types,
399
575
  aliasMap,
576
+ enumMap,
400
577
  tryParse,
401
578
  cxxOnly,
402
- language,
403
579
  resolveTypeAnnotation,
404
580
  translateTypeAnnotation,
581
+ parser,
405
582
  ),
406
583
  }));
407
584
  })
408
585
  .filter(Boolean)
409
586
  .reduce(
410
- (moduleSchema: NativeModuleSchema, {aliasMap, propertyShape}) => {
587
+ (
588
+ moduleSchema: NativeModuleSchema,
589
+ {aliasMap, enumMap, propertyShape},
590
+ ) => {
411
591
  return {
412
592
  type: 'NativeModule',
413
- aliases: {...moduleSchema.aliases, ...aliasMap},
593
+ aliasMap: {...moduleSchema.aliasMap, ...aliasMap},
594
+ enumMap: {...moduleSchema.enumMap, ...enumMap},
414
595
  spec: {
415
596
  properties: [...moduleSchema.spec.properties, propertyShape],
416
597
  },
@@ -420,7 +601,8 @@ function buildModuleSchema(
420
601
  },
421
602
  {
422
603
  type: 'NativeModule',
423
- aliases: {},
604
+ aliasMap: {},
605
+ enumMap: {},
424
606
  spec: {properties: []},
425
607
  moduleName: moduleName,
426
608
  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 TypeScriptParser implements Parser{}
@@ -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('./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 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,111 @@ 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
+ }
102
208
  }
103
209
  module.exports = {
104
210
  TypeScriptParser,