hermes-parser 0.11.1 → 0.12.0

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.
@@ -12,7 +12,11 @@ type INTENTIONAL_ANY = $FlowFixMe;
12
12
  type JSType = 'number' | 'string' | 'array' | 'boolean';
13
13
  type CBoolean = ?(number | boolean);
14
14
 
15
- type HermesParserWASM = $ReadOnly<{
15
+ type WASMModuleOverrides = $ReadOnly<{
16
+ quit(status: number, toThrow: Error): void,
17
+ }>;
18
+
19
+ export type HermesParserWASM = $ReadOnly<{
16
20
  HEAP8: Int8Array,
17
21
  HEAP16: Int16Array,
18
22
  HEAP32: Int32Array,
@@ -72,4 +76,4 @@ type HermesParserWASM = $ReadOnly<{
72
76
  stackRestore(ptr: number): void,
73
77
  }>;
74
78
 
75
- declare module.exports: HermesParserWASM;
79
+ declare module.exports: WASMModuleOverrides => HermesParserWASM;
@@ -18,6 +18,16 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
18
18
  *
19
19
  * @format
20
20
  */
21
+ function createSyntaxError(node, err) {
22
+ const syntaxError = new SyntaxError(err); // $FlowExpectedError[prop-missing]
23
+
24
+ syntaxError.loc = {
25
+ line: node.loc.start.line,
26
+ column: node.loc.start.column
27
+ };
28
+ return syntaxError;
29
+ }
30
+
21
31
  class HermesToBabelAdapter extends _HermesASTAdapter.default {
22
32
  fixSourceLocation(node) {
23
33
  var _this$sourceFilename;
@@ -113,6 +123,7 @@ class HermesToBabelAdapter extends _HermesASTAdapter.default {
113
123
  case 'TupleTypeLabeledElement':
114
124
  case 'TupleTypeSpreadElement':
115
125
  case 'ObjectTypeMappedTypeProperty':
126
+ case 'ComponentTypeAnnotation':
116
127
  return this.mapUnsupportedTypeAnnotation(node);
117
128
 
118
129
  case 'BigIntLiteral':
@@ -136,9 +147,15 @@ class HermesToBabelAdapter extends _HermesASTAdapter.default {
136
147
  case 'DeclareEnum':
137
148
  return this.mapDeclareEnum(node);
138
149
 
150
+ case 'DeclareComponent':
151
+ return this.mapDeclareComponent(node);
152
+
139
153
  case 'JSXElement':
140
154
  return this.mapJSXElement(node);
141
155
 
156
+ case 'ComponentDeclaration':
157
+ return this.mapComponentDeclaration(node);
158
+
142
159
  default:
143
160
  return this.mapNodeDefault(node);
144
161
  }
@@ -557,11 +574,195 @@ class HermesToBabelAdapter extends _HermesASTAdapter.default {
557
574
  return this.mapDeclareVariable(nodeUnprocessed);
558
575
  }
559
576
 
577
+ mapDeclareComponent(nodeUnprocessed) {
578
+ nodeUnprocessed.id.typeAnnotation = this.mapUnsupportedTypeAnnotation(nodeUnprocessed);
579
+ delete nodeUnprocessed.params;
580
+ delete nodeUnprocessed.rest;
581
+ delete nodeUnprocessed.typeParameters;
582
+ delete nodeUnprocessed.rendersType;
583
+ nodeUnprocessed.type = 'DeclareVariable';
584
+ return this.mapDeclareVariable(nodeUnprocessed);
585
+ }
586
+
560
587
  mapJSXElement(nodeUnprocessed) {
561
588
  delete nodeUnprocessed.openingElement.typeArguments;
562
589
  return this.mapNodeDefault(nodeUnprocessed);
563
590
  }
564
591
 
592
+ mapComponentDeclaration(nodeUnprocessed) {
593
+ let rendersType = nodeUnprocessed.rendersType;
594
+
595
+ if (rendersType == null) {
596
+ // Create empty loc for return type annotation nodes
597
+ const createRendersTypeLoc = () => ({
598
+ loc: {
599
+ start: { ...nodeUnprocessed.body.loc.end
600
+ },
601
+ end: { ...nodeUnprocessed.body.loc.end
602
+ },
603
+ rangeStart: nodeUnprocessed.body.loc.rangeStart,
604
+ rangeEnd: nodeUnprocessed.body.loc.rangeEnd
605
+ }
606
+ });
607
+
608
+ rendersType = {
609
+ type: 'GenericTypeAnnotation',
610
+ id: {
611
+ type: 'QualifiedTypeIdentifier',
612
+ qualification: {
613
+ type: 'Identifier',
614
+ name: 'React',
615
+ ...createRendersTypeLoc()
616
+ },
617
+ id: {
618
+ type: 'Identifier',
619
+ name: 'Node',
620
+ ...createRendersTypeLoc()
621
+ }
622
+ },
623
+ typeParameters: null,
624
+ ...createRendersTypeLoc()
625
+ };
626
+ }
627
+
628
+ function getParamName(paramName) {
629
+ switch (paramName.type) {
630
+ case 'Identifier':
631
+ return paramName.name;
632
+
633
+ case 'StringLiteral':
634
+ return paramName.value;
635
+
636
+ default:
637
+ throw createSyntaxError(paramName, `Unknown Component parameter name type of "${paramName.type}"`);
638
+ }
639
+ }
640
+
641
+ const properties = nodeUnprocessed.params.map(param => {
642
+ switch (param.type) {
643
+ case 'RestElement':
644
+ {
645
+ delete param.typeAnnotation;
646
+ return param;
647
+ }
648
+
649
+ case 'ComponentParameter':
650
+ {
651
+ if (getParamName(param.name) === 'ref') {
652
+ throw createSyntaxError(param, 'Component parameters named "ref" are currently not supported');
653
+ }
654
+
655
+ if (param.name.type === 'Identifier') {
656
+ delete param.name.typeAnnotation;
657
+ }
658
+
659
+ if (param.local.type === 'AssignmentPattern') {
660
+ delete param.local.left.typeAnnotation;
661
+ delete param.local.left.optional;
662
+ } else {
663
+ delete param.local.typeAnnotation;
664
+ delete param.local.optional;
665
+ }
666
+
667
+ return {
668
+ type: 'ObjectProperty',
669
+ key: param.name,
670
+ value: param.local,
671
+ method: false,
672
+ shorthand: param.shorthand,
673
+ computed: false,
674
+ loc: param.loc,
675
+ start: param.start,
676
+ end: param.end
677
+ };
678
+ }
679
+
680
+ default:
681
+ {
682
+ throw createSyntaxError(param, `Unknown Component parameter type of "${param.type}"`);
683
+ }
684
+ }
685
+ });
686
+
687
+ const paramsLoc = (() => {
688
+ if (properties.length === 0) {
689
+ // No props, approximate range via existing nodes.
690
+ const startLoc = nodeUnprocessed.typeParameters != null ? nodeUnprocessed.typeParameters.loc : nodeUnprocessed.id.loc;
691
+ return {
692
+ start: startLoc.end,
693
+ end: rendersType.loc.start,
694
+ startRange: startLoc.endRange,
695
+ endRange: rendersType.loc.startRange
696
+ };
697
+ }
698
+
699
+ return {
700
+ start: properties[0].loc.start,
701
+ end: properties[properties.length - 1].loc.end,
702
+ startRange: properties[0].loc.startRange,
703
+ endRange: properties[properties.length - 1].loc.endRange
704
+ };
705
+ })(); // Create empty loc for type annotation nodes
706
+
707
+
708
+ const createParamsTypeLoc = () => ({
709
+ loc: {
710
+ start: { ...paramsLoc.end
711
+ },
712
+ end: { ...paramsLoc.end
713
+ },
714
+ startRange: paramsLoc.endRange,
715
+ endRange: paramsLoc.endRange
716
+ }
717
+ });
718
+
719
+ const params = [{
720
+ type: 'ObjectPattern',
721
+ properties,
722
+ typeAnnotation: {
723
+ type: 'TypeAnnotation',
724
+ typeAnnotation: {
725
+ type: 'GenericTypeAnnotation',
726
+ id: {
727
+ type: 'Identifier',
728
+ name: '$ReadOnly',
729
+ ...createParamsTypeLoc()
730
+ },
731
+ typeParameters: {
732
+ type: 'TypeParameterInstantiation',
733
+ params: [{
734
+ type: 'ObjectTypeAnnotation',
735
+ callProperties: [],
736
+ properties: [],
737
+ indexers: [],
738
+ internalSlots: [],
739
+ exact: false,
740
+ inexact: true,
741
+ ...createParamsTypeLoc()
742
+ }],
743
+ ...createParamsTypeLoc()
744
+ },
745
+ ...createParamsTypeLoc()
746
+ },
747
+ ...createParamsTypeLoc()
748
+ },
749
+ loc: paramsLoc
750
+ }];
751
+ const functionComponent = {
752
+ type: 'FunctionDeclaration',
753
+ id: nodeUnprocessed.id,
754
+ typeParameters: nodeUnprocessed.typeParameters,
755
+ params,
756
+ returnType: rendersType,
757
+ body: nodeUnprocessed.body,
758
+ async: false,
759
+ generator: false,
760
+ predicate: null,
761
+ loc: nodeUnprocessed.loc
762
+ };
763
+ return this.mapNodeDefault(functionComponent);
764
+ }
765
+
565
766
  }
566
767
 
567
768
  exports.default = HermesToBabelAdapter;
@@ -14,6 +14,17 @@ import HermesASTAdapter from './HermesASTAdapter';
14
14
 
15
15
  declare var BigInt: ?(value: $FlowFixMe) => mixed;
16
16
 
17
+ function createSyntaxError(node: HermesNode, err: string): SyntaxError {
18
+ const syntaxError = new SyntaxError(err);
19
+ // $FlowExpectedError[prop-missing]
20
+ syntaxError.loc = {
21
+ line: node.loc.start.line,
22
+ column: node.loc.start.column,
23
+ };
24
+
25
+ return syntaxError;
26
+ }
27
+
17
28
  export default class HermesToBabelAdapter extends HermesASTAdapter {
18
29
  fixSourceLocation(node: HermesNode): void {
19
30
  const loc = node.loc;
@@ -85,6 +96,7 @@ export default class HermesToBabelAdapter extends HermesASTAdapter {
85
96
  case 'TupleTypeLabeledElement':
86
97
  case 'TupleTypeSpreadElement':
87
98
  case 'ObjectTypeMappedTypeProperty':
99
+ case 'ComponentTypeAnnotation':
88
100
  return this.mapUnsupportedTypeAnnotation(node);
89
101
  case 'BigIntLiteral':
90
102
  return this.mapBigIntLiteral(node);
@@ -100,8 +112,12 @@ export default class HermesToBabelAdapter extends HermesASTAdapter {
100
112
  return this.mapDeclareVariable(node);
101
113
  case 'DeclareEnum':
102
114
  return this.mapDeclareEnum(node);
115
+ case 'DeclareComponent':
116
+ return this.mapDeclareComponent(node);
103
117
  case 'JSXElement':
104
118
  return this.mapJSXElement(node);
119
+ case 'ComponentDeclaration':
120
+ return this.mapComponentDeclaration(node);
105
121
  default:
106
122
  return this.mapNodeDefault(node);
107
123
  }
@@ -539,8 +555,201 @@ export default class HermesToBabelAdapter extends HermesASTAdapter {
539
555
  return this.mapDeclareVariable(nodeUnprocessed);
540
556
  }
541
557
 
558
+ mapDeclareComponent(nodeUnprocessed: HermesNode): HermesNode {
559
+ nodeUnprocessed.id.typeAnnotation =
560
+ this.mapUnsupportedTypeAnnotation(nodeUnprocessed);
561
+
562
+ delete nodeUnprocessed.params;
563
+ delete nodeUnprocessed.rest;
564
+ delete nodeUnprocessed.typeParameters;
565
+ delete nodeUnprocessed.rendersType;
566
+
567
+ nodeUnprocessed.type = 'DeclareVariable';
568
+
569
+ return this.mapDeclareVariable(nodeUnprocessed);
570
+ }
571
+
542
572
  mapJSXElement(nodeUnprocessed: HermesNode): HermesNode {
543
573
  delete nodeUnprocessed.openingElement.typeArguments;
544
574
  return this.mapNodeDefault(nodeUnprocessed);
545
575
  }
576
+
577
+ mapComponentDeclaration(nodeUnprocessed: HermesNode): HermesNode {
578
+ let rendersType = nodeUnprocessed.rendersType;
579
+ if (rendersType == null) {
580
+ // Create empty loc for return type annotation nodes
581
+ const createRendersTypeLoc = () => ({
582
+ loc: {
583
+ start: {...nodeUnprocessed.body.loc.end},
584
+ end: {...nodeUnprocessed.body.loc.end},
585
+ rangeStart: nodeUnprocessed.body.loc.rangeStart,
586
+ rangeEnd: nodeUnprocessed.body.loc.rangeEnd,
587
+ },
588
+ });
589
+
590
+ rendersType = {
591
+ type: 'GenericTypeAnnotation',
592
+ id: {
593
+ type: 'QualifiedTypeIdentifier',
594
+ qualification: {
595
+ type: 'Identifier',
596
+ name: 'React',
597
+ ...createRendersTypeLoc(),
598
+ },
599
+ id: {
600
+ type: 'Identifier',
601
+ name: 'Node',
602
+ ...createRendersTypeLoc(),
603
+ },
604
+ },
605
+ typeParameters: null,
606
+ ...createRendersTypeLoc(),
607
+ };
608
+ }
609
+
610
+ function getParamName(paramName: HermesNode): string {
611
+ switch (paramName.type) {
612
+ case 'Identifier':
613
+ return paramName.name;
614
+ case 'StringLiteral':
615
+ return paramName.value;
616
+ default:
617
+ throw createSyntaxError(
618
+ paramName,
619
+ `Unknown Component parameter name type of "${paramName.type}"`,
620
+ );
621
+ }
622
+ }
623
+
624
+ const properties = nodeUnprocessed.params.map(param => {
625
+ switch (param.type) {
626
+ case 'RestElement': {
627
+ delete param.typeAnnotation;
628
+ return param;
629
+ }
630
+ case 'ComponentParameter': {
631
+ if (getParamName(param.name) === 'ref') {
632
+ throw createSyntaxError(
633
+ param,
634
+ 'Component parameters named "ref" are currently not supported',
635
+ );
636
+ }
637
+
638
+ if (param.name.type === 'Identifier') {
639
+ delete param.name.typeAnnotation;
640
+ }
641
+ if (param.local.type === 'AssignmentPattern') {
642
+ delete param.local.left.typeAnnotation;
643
+ delete param.local.left.optional;
644
+ } else {
645
+ delete param.local.typeAnnotation;
646
+ delete param.local.optional;
647
+ }
648
+
649
+ return {
650
+ type: 'ObjectProperty',
651
+ key: param.name,
652
+ value: param.local,
653
+ method: false,
654
+ shorthand: param.shorthand,
655
+ computed: false,
656
+ loc: param.loc,
657
+ start: param.start,
658
+ end: param.end,
659
+ };
660
+ }
661
+ default: {
662
+ throw createSyntaxError(
663
+ param,
664
+ `Unknown Component parameter type of "${param.type}"`,
665
+ );
666
+ }
667
+ }
668
+ });
669
+
670
+ const paramsLoc = (() => {
671
+ if (properties.length === 0) {
672
+ // No props, approximate range via existing nodes.
673
+ const startLoc =
674
+ nodeUnprocessed.typeParameters != null
675
+ ? nodeUnprocessed.typeParameters.loc
676
+ : nodeUnprocessed.id.loc;
677
+ return {
678
+ start: startLoc.end,
679
+ end: rendersType.loc.start,
680
+ startRange: startLoc.endRange,
681
+ endRange: rendersType.loc.startRange,
682
+ };
683
+ }
684
+
685
+ return {
686
+ start: properties[0].loc.start,
687
+ end: properties[properties.length - 1].loc.end,
688
+ startRange: properties[0].loc.startRange,
689
+ endRange: properties[properties.length - 1].loc.endRange,
690
+ };
691
+ })();
692
+
693
+ // Create empty loc for type annotation nodes
694
+ const createParamsTypeLoc = () => ({
695
+ loc: {
696
+ start: {...paramsLoc.end},
697
+ end: {...paramsLoc.end},
698
+ startRange: paramsLoc.endRange,
699
+ endRange: paramsLoc.endRange,
700
+ },
701
+ });
702
+
703
+ const params = [
704
+ {
705
+ type: 'ObjectPattern',
706
+ properties,
707
+ typeAnnotation: {
708
+ type: 'TypeAnnotation',
709
+ typeAnnotation: {
710
+ type: 'GenericTypeAnnotation',
711
+ id: {
712
+ type: 'Identifier',
713
+ name: '$ReadOnly',
714
+ ...createParamsTypeLoc(),
715
+ },
716
+ typeParameters: {
717
+ type: 'TypeParameterInstantiation',
718
+ params: [
719
+ {
720
+ type: 'ObjectTypeAnnotation',
721
+ callProperties: [],
722
+ properties: [],
723
+ indexers: [],
724
+ internalSlots: [],
725
+ exact: false,
726
+ inexact: true,
727
+ ...createParamsTypeLoc(),
728
+ },
729
+ ],
730
+ ...createParamsTypeLoc(),
731
+ },
732
+ ...createParamsTypeLoc(),
733
+ },
734
+ ...createParamsTypeLoc(),
735
+ },
736
+ loc: paramsLoc,
737
+ },
738
+ ];
739
+
740
+ const functionComponent = {
741
+ type: 'FunctionDeclaration',
742
+ id: nodeUnprocessed.id,
743
+ typeParameters: nodeUnprocessed.typeParameters,
744
+ params,
745
+ returnType: rendersType,
746
+ body: nodeUnprocessed.body,
747
+ async: false,
748
+ generator: false,
749
+ predicate: null,
750
+ loc: nodeUnprocessed.loc,
751
+ };
752
+
753
+ return this.mapNodeDefault(functionComponent);
754
+ }
546
755
  }
@@ -44,16 +44,16 @@ module.exports = {
44
44
  ClassDeclaration: ['id', 'typeParameters', 'superClass', 'superTypeParameters', 'implements', 'decorators', 'body'],
45
45
  ClassExpression: ['id', 'typeParameters', 'superClass', 'superTypeParameters', 'implements', 'decorators', 'body'],
46
46
  ClassImplements: ['id', 'typeParameters'],
47
- ComponentDeclaration: ['id', 'params', 'body', 'typeParameters', 'returnType'],
47
+ ComponentDeclaration: ['id', 'params', 'body', 'typeParameters', 'rendersType'],
48
48
  ComponentParameter: ['name', 'local'],
49
- ComponentTypeAnnotation: ['params', 'rest', 'typeParameters', 'returnType'],
49
+ ComponentTypeAnnotation: ['params', 'rest', 'typeParameters', 'rendersType'],
50
50
  ComponentTypeParameter: ['name', 'typeAnnotation'],
51
51
  ConditionalExpression: ['test', 'consequent', 'alternate'],
52
52
  ConditionalTypeAnnotation: ['checkType', 'extendsType', 'trueType', 'falseType'],
53
53
  ContinueStatement: ['label'],
54
54
  DebuggerStatement: [],
55
55
  DeclareClass: ['id', 'typeParameters', 'extends', 'implements', 'mixins', 'body'],
56
- DeclareComponent: ['id', 'params', 'rest', 'typeParameters', 'returnType'],
56
+ DeclareComponent: ['id', 'params', 'rest', 'typeParameters', 'rendersType'],
57
57
  DeclaredPredicate: ['value'],
58
58
  DeclareEnum: ['id', 'body'],
59
59
  DeclareExportAllDeclaration: ['source'],
@@ -118,7 +118,7 @@ const HERMES_AST_VISITOR_KEYS = {
118
118
  params: 'NodeList',
119
119
  body: 'Node',
120
120
  typeParameters: 'Node',
121
- returnType: 'Node'
121
+ rendersType: 'Node'
122
122
  },
123
123
  ComponentParameter: {
124
124
  name: 'Node',
@@ -128,7 +128,7 @@ const HERMES_AST_VISITOR_KEYS = {
128
128
  params: 'NodeList',
129
129
  rest: 'Node',
130
130
  typeParameters: 'Node',
131
- returnType: 'Node'
131
+ rendersType: 'Node'
132
132
  },
133
133
  ComponentTypeParameter: {
134
134
  name: 'Node',
@@ -162,7 +162,7 @@ const HERMES_AST_VISITOR_KEYS = {
162
162
  params: 'NodeList',
163
163
  rest: 'Node',
164
164
  typeParameters: 'Node',
165
- returnType: 'Node'
165
+ rendersType: 'Node'
166
166
  },
167
167
  DeclaredPredicate: {
168
168
  value: 'Node'
package/dist/index.js CHANGED
@@ -14,11 +14,12 @@ Object.defineProperty(exports, "__esModule", {
14
14
  });
15
15
  var _exportNames = {
16
16
  parse: true,
17
+ mutateESTreeASTForPrettier: true,
17
18
  FlowVisitorKeys: true,
18
19
  astArrayMutationHelpers: true,
19
20
  astNodeMutationHelpers: true
20
21
  };
21
- exports.astNodeMutationHelpers = exports.astArrayMutationHelpers = void 0;
22
+ exports.mutateESTreeASTForPrettier = exports.astNodeMutationHelpers = exports.astArrayMutationHelpers = void 0;
22
23
  exports.parse = parse;
23
24
 
24
25
  var HermesParser = _interopRequireWildcard(require("./HermesParser"));
@@ -66,6 +67,10 @@ var _astNodeMutationHelpers = _interopRequireWildcard(require("./transform/astNo
66
67
 
67
68
  exports.astNodeMutationHelpers = _astNodeMutationHelpers;
68
69
 
70
+ var _mutateESTreeASTForPrettier = _interopRequireDefault(require("./utils/mutateESTreeASTForPrettier"));
71
+
72
+ exports.mutateESTreeASTForPrettier = _mutateESTreeASTForPrettier.default;
73
+
69
74
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
70
75
 
71
76
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
@@ -90,3 +90,4 @@ export * from './traverse/getVisitorKeys';
90
90
  export {FlowVisitorKeys};
91
91
  export * as astArrayMutationHelpers from './transform/astArrayMutationHelpers';
92
92
  export * as astNodeMutationHelpers from './transform/astNodeMutationHelpers';
93
+ export {default as mutateESTreeASTForPrettier} from './utils/mutateESTreeASTForPrettier';
@@ -54,8 +54,9 @@ class SimpleTransform {
54
54
  }
55
55
  },
56
56
 
57
- leave(_node) {}
57
+ leave(_node) {},
58
58
 
59
+ visitorKeys: options.visitorKeys
59
60
  });
60
61
 
61
62
  return resultRootNode;
@@ -74,6 +74,7 @@ export class SimpleTransform {
74
74
  }
75
75
  },
76
76
  leave(_node: ESNode) {},
77
+ visitorKeys: options.visitorKeys,
77
78
  });
78
79
  return resultRootNode;
79
80
  }