flow-api-translator 0.14.0 → 0.15.1

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.
@@ -606,10 +606,6 @@ const getTransforms = (originalCode, scopeManager, opts) => {
606
606
  case 'TupleTypeAnnotation':
607
607
  return transform.TupleTypeAnnotation(node);
608
608
 
609
- case 'TupleTypeLabeledElement':
610
- case 'TupleTypeSpreadElement':
611
- return unsupportedAnnotation(node, node.type);
612
-
613
609
  case 'TypeofTypeAnnotation':
614
610
  return transform.TypeofTypeAnnotation(node);
615
611
 
@@ -1202,6 +1198,17 @@ const getTransforms = (originalCode, scopeManager, opts) => {
1202
1198
  return unsupportedAnnotation(node, 'existential type');
1203
1199
  },
1204
1200
 
1201
+ ExportAllDeclaration(node) {
1202
+ return {
1203
+ type: 'ExportAllDeclaration',
1204
+ // flow does not currently support import/export assertions
1205
+ assertions: [],
1206
+ exportKind: node.exportKind,
1207
+ source: transform.StringLiteral(node.source),
1208
+ exported: node.exported == null ? null : transform.Identifier(node.exported)
1209
+ };
1210
+ },
1211
+
1205
1212
  ExportNamedDeclaration(node) {
1206
1213
  if (node.source != null || node.specifiers.length > 0) {
1207
1214
  // can never have a declaration with a source
@@ -1582,23 +1589,6 @@ const getTransforms = (originalCode, scopeManager, opts) => {
1582
1589
  };
1583
1590
  }
1584
1591
 
1585
- case '$Shape':
1586
- case '$Partial':
1587
- {
1588
- // `$Partial<T>` => `Partial<T>`
1589
- return {
1590
- type: 'TSTypeReference',
1591
- typeName: {
1592
- type: 'Identifier',
1593
- name: 'Partial'
1594
- },
1595
- typeParameters: {
1596
- type: 'TSTypeParameterInstantiation',
1597
- params: assertHasExactlyNTypeParameters(1)
1598
- }
1599
- };
1600
- }
1601
-
1602
1592
  case '$Values':
1603
1593
  {
1604
1594
  // `$Values<T>` => `T[keyof T]`
@@ -1971,6 +1961,28 @@ const getTransforms = (originalCode, scopeManager, opts) => {
1971
1961
  }
1972
1962
  };
1973
1963
  }
1964
+ // React.ElementProps<A> -> React.ComponentProps<A>
1965
+ // React$ElementProps<A> -> React.ComponentProps<A>
1966
+
1967
+ case 'React.ElementProps':
1968
+ case 'React$ElementProps':
1969
+ {
1970
+ return {
1971
+ type: 'TSTypeReference',
1972
+ typeName: {
1973
+ type: 'TSQualifiedName',
1974
+ left: getReactIdentifier(),
1975
+ right: {
1976
+ type: 'Identifier',
1977
+ name: 'ComponentProps'
1978
+ }
1979
+ },
1980
+ typeParameters: {
1981
+ type: 'TSTypeParameterInstantiation',
1982
+ params: assertHasExactlyNTypeParameters(1)
1983
+ }
1984
+ };
1985
+ }
1974
1986
  // React.ElementConfig<A> -> JSX.LibraryManagedAttributes<A, React.ComponentProps<A>>
1975
1987
  // React$ElementConfig<A> -> JSX.LibraryManagedAttributes<A, React.ComponentProps<A>>
1976
1988
 
@@ -2640,10 +2652,47 @@ const getTransforms = (originalCode, scopeManager, opts) => {
2640
2652
  },
2641
2653
 
2642
2654
  TupleTypeAnnotation(node) {
2643
- return {
2655
+ const allReadOnly = node.types.length > 0 && node.types.every(element => element.type === 'TupleTypeLabeledElement' && element.variance != null && element.variance.kind === 'plus');
2656
+ const tupleAnnot = {
2644
2657
  type: 'TSTupleType',
2645
- elementTypes: node.types.map(transformTypeAnnotationType)
2658
+ elementTypes: node.types.map(element => {
2659
+ switch (element.type) {
2660
+ case 'TupleTypeLabeledElement':
2661
+ if (!allReadOnly && element.variance != null) {
2662
+ return unsupportedAnnotation(element, 'tuple type element variance annotations');
2663
+ }
2664
+
2665
+ return {
2666
+ type: 'TSNamedTupleMember',
2667
+ label: transform.Identifier(element.label),
2668
+ optional: element.optional,
2669
+ elementType: transformTypeAnnotationType(element.elementType)
2670
+ };
2671
+
2672
+ case 'TupleTypeSpreadElement':
2673
+ {
2674
+ const annot = transformTypeAnnotationType(element.typeAnnotation);
2675
+ return {
2676
+ type: 'TSRestType',
2677
+ typeAnnotation: element.label != null ? {
2678
+ type: 'TSNamedTupleMember',
2679
+ label: transform.Identifier(element.label),
2680
+ optional: false,
2681
+ elementType: annot
2682
+ } : annot
2683
+ };
2684
+ }
2685
+
2686
+ default:
2687
+ return transformTypeAnnotationType(element);
2688
+ }
2689
+ })
2646
2690
  };
2691
+ return allReadOnly ? {
2692
+ type: 'TSTypeOperator',
2693
+ operator: 'readonly',
2694
+ typeAnnotation: tupleAnnot
2695
+ } : tupleAnnot;
2647
2696
  },
2648
2697
 
2649
2698
  TypeAlias(node) {
@@ -650,9 +650,6 @@ const getTransforms = (
650
650
  return transform.ThisTypeAnnotation(node);
651
651
  case 'TupleTypeAnnotation':
652
652
  return transform.TupleTypeAnnotation(node);
653
- case 'TupleTypeLabeledElement':
654
- case 'TupleTypeSpreadElement':
655
- return unsupportedAnnotation(node, node.type);
656
653
  case 'TypeofTypeAnnotation':
657
654
  return transform.TypeofTypeAnnotation(node);
658
655
  case 'UnionTypeAnnotation':
@@ -1337,6 +1334,19 @@ const getTransforms = (
1337
1334
  // It's also super deprecated - so let's not ever worry
1338
1335
  return unsupportedAnnotation(node, 'existential type');
1339
1336
  },
1337
+ ExportAllDeclaration(
1338
+ node: FlowESTree.ExportAllDeclaration,
1339
+ ): TSESTree.ExportAllDeclaration {
1340
+ return {
1341
+ type: 'ExportAllDeclaration',
1342
+ // flow does not currently support import/export assertions
1343
+ assertions: [],
1344
+ exportKind: node.exportKind,
1345
+ source: transform.StringLiteral(node.source),
1346
+ exported:
1347
+ node.exported == null ? null : transform.Identifier(node.exported),
1348
+ };
1349
+ },
1340
1350
  ExportNamedDeclaration(
1341
1351
  node: FlowESTree.ExportNamedDeclaration,
1342
1352
  ):
@@ -1747,22 +1757,6 @@ const getTransforms = (
1747
1757
  };
1748
1758
  }
1749
1759
 
1750
- case '$Shape':
1751
- case '$Partial': {
1752
- // `$Partial<T>` => `Partial<T>`
1753
- return {
1754
- type: 'TSTypeReference',
1755
- typeName: {
1756
- type: 'Identifier',
1757
- name: 'Partial',
1758
- },
1759
- typeParameters: {
1760
- type: 'TSTypeParameterInstantiation',
1761
- params: assertHasExactlyNTypeParameters(1),
1762
- },
1763
- };
1764
- }
1765
-
1766
1760
  case '$Values': {
1767
1761
  // `$Values<T>` => `T[keyof T]`
1768
1762
  const transformedType = assertHasExactlyNTypeParameters(1)[0];
@@ -2133,6 +2127,26 @@ const getTransforms = (
2133
2127
  },
2134
2128
  };
2135
2129
  }
2130
+ // React.ElementProps<A> -> React.ComponentProps<A>
2131
+ // React$ElementProps<A> -> React.ComponentProps<A>
2132
+ case 'React.ElementProps':
2133
+ case 'React$ElementProps': {
2134
+ return {
2135
+ type: 'TSTypeReference',
2136
+ typeName: {
2137
+ type: 'TSQualifiedName',
2138
+ left: getReactIdentifier(),
2139
+ right: {
2140
+ type: 'Identifier',
2141
+ name: 'ComponentProps',
2142
+ },
2143
+ },
2144
+ typeParameters: {
2145
+ type: 'TSTypeParameterInstantiation',
2146
+ params: assertHasExactlyNTypeParameters(1),
2147
+ },
2148
+ };
2149
+ }
2136
2150
  // React.ElementConfig<A> -> JSX.LibraryManagedAttributes<A, React.ComponentProps<A>>
2137
2151
  // React$ElementConfig<A> -> JSX.LibraryManagedAttributes<A, React.ComponentProps<A>>
2138
2152
  case 'React.ElementConfig':
@@ -2895,11 +2909,59 @@ const getTransforms = (
2895
2909
  },
2896
2910
  TupleTypeAnnotation(
2897
2911
  node: FlowESTree.TupleTypeAnnotation,
2898
- ): TSESTree.TSTupleType {
2899
- return {
2912
+ ): TSESTree.TSTupleType | TSESTree.TSTypeOperator {
2913
+ const allReadOnly =
2914
+ node.types.length > 0 &&
2915
+ node.types.every(
2916
+ element =>
2917
+ element.type === 'TupleTypeLabeledElement' &&
2918
+ element.variance != null &&
2919
+ element.variance.kind === 'plus',
2920
+ );
2921
+ const tupleAnnot = {
2900
2922
  type: 'TSTupleType',
2901
- elementTypes: node.types.map(transformTypeAnnotationType),
2923
+ elementTypes: node.types.map(element => {
2924
+ switch (element.type) {
2925
+ case 'TupleTypeLabeledElement':
2926
+ if (!allReadOnly && element.variance != null) {
2927
+ return unsupportedAnnotation(
2928
+ element,
2929
+ 'tuple type element variance annotations',
2930
+ );
2931
+ }
2932
+ return {
2933
+ type: 'TSNamedTupleMember',
2934
+ label: transform.Identifier(element.label),
2935
+ optional: element.optional,
2936
+ elementType: transformTypeAnnotationType(element.elementType),
2937
+ };
2938
+ case 'TupleTypeSpreadElement': {
2939
+ const annot = transformTypeAnnotationType(element.typeAnnotation);
2940
+ return {
2941
+ type: 'TSRestType',
2942
+ typeAnnotation:
2943
+ element.label != null
2944
+ ? {
2945
+ type: 'TSNamedTupleMember',
2946
+ label: transform.Identifier(element.label),
2947
+ optional: false,
2948
+ elementType: annot,
2949
+ }
2950
+ : annot,
2951
+ };
2952
+ }
2953
+ default:
2954
+ return transformTypeAnnotationType(element);
2955
+ }
2956
+ }),
2902
2957
  };
2958
+ return allReadOnly
2959
+ ? {
2960
+ type: 'TSTypeOperator',
2961
+ operator: 'readonly',
2962
+ typeAnnotation: tupleAnnot,
2963
+ }
2964
+ : tupleAnnot;
2903
2965
  },
2904
2966
  TypeAlias(node: FlowESTree.TypeAlias): TSESTree.TSTypeAliasDeclaration {
2905
2967
  return transform.DeclareTypeAlias(node);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flow-api-translator",
3
- "version": "0.14.0",
3
+ "version": "0.15.1",
4
4
  "description": "Toolkit for creating Flow and TypeScript compatible libraries from Flow source code.",
5
5
  "main": "dist/index.js",
6
6
  "license": "MIT",
@@ -12,10 +12,10 @@
12
12
  "@babel/code-frame": "^7.16.0",
13
13
  "@typescript-eslint/visitor-keys": "^5.42.0",
14
14
  "flow-enums-runtime": "^0.0.6",
15
- "hermes-eslint": "0.14.0",
16
- "hermes-estree": "0.14.0",
17
- "hermes-parser": "0.14.0",
18
- "hermes-transform": "0.14.0"
15
+ "hermes-eslint": "0.15.1",
16
+ "hermes-estree": "0.15.1",
17
+ "hermes-parser": "0.15.1",
18
+ "hermes-transform": "0.15.1"
19
19
  },
20
20
  "peerDependencies": {
21
21
  "prettier": "^3.0.0 || ^2.7.1"