hermes-parser 0.16.0 → 0.17.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.
@@ -20,6 +20,8 @@ var _SimpleTraverser = require("../traverse/SimpleTraverser");
20
20
 
21
21
  var _ESTreeVisitorKeys = _interopRequireDefault(require("../generated/ESTreeVisitorKeys"));
22
22
 
23
+ var _createSyntaxError = require("../utils/createSyntaxError");
24
+
23
25
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24
26
 
25
27
  // Rely on the mapper to fix up parent relationships.
@@ -55,16 +57,6 @@ const FlowESTreeAndBabelVisitorKeys = { ..._ESTreeVisitorKeys.default,
55
57
  function nodeWith(node, overrideProps) {
56
58
  return _SimpleTransform.SimpleTransform.nodeWith(node, overrideProps, FlowESTreeAndBabelVisitorKeys);
57
59
  }
58
-
59
- function createSyntaxError(node, err) {
60
- const syntaxError = new SyntaxError(err); // $FlowExpectedError[prop-missing]
61
-
62
- syntaxError.loc = {
63
- line: node.loc.start.line,
64
- column: node.loc.start.column
65
- };
66
- return syntaxError;
67
- }
68
60
  /**
69
61
  * Babel node types
70
62
  *
@@ -250,7 +242,7 @@ function mapProperty(node) {
250
242
 
251
243
  if (node.method || node.kind !== 'init') {
252
244
  if (value.type !== 'FunctionExpression') {
253
- throw createSyntaxError(node, `Invalid method property, the value must be a "FunctionExpression" or "ArrowFunctionExpression. Instead got "${value.type}".`);
245
+ throw (0, _createSyntaxError.createSyntaxError)(node, `Invalid method property, the value must be a "FunctionExpression" or "ArrowFunctionExpression. Instead got "${value.type}".`);
254
246
  } // Properties under the FunctionExpression value that should be moved
255
247
  // to the ObjectMethod node itself.
256
248
 
@@ -749,6 +741,23 @@ function transformNode(node) {
749
741
  return node;
750
742
  }
751
743
 
744
+ case 'AsExpression':
745
+ {
746
+ const {
747
+ typeAnnotation
748
+ } = node; // $FlowExpectedError[cannot-write]
749
+
750
+ node.type = 'TypeCastExpression'; // $FlowExpectedError[cannot-write]
751
+
752
+ node.typeAnnotation = {
753
+ type: 'TypeAnnotation',
754
+ typeAnnotation,
755
+ loc: typeAnnotation.loc,
756
+ range: typeAnnotation.range
757
+ };
758
+ return node;
759
+ }
760
+
752
761
  /**
753
762
  * Babel has a different format for Literals
754
763
  */
@@ -49,6 +49,7 @@ import type {VisitorKeys} from '../generated/ESTreeVisitorKeys';
49
49
  import {SimpleTransform} from '../transform/SimpleTransform';
50
50
  import {SimpleTraverser} from '../traverse/SimpleTraverser';
51
51
  import FlowVisitorKeys from '../generated/ESTreeVisitorKeys';
52
+ import {createSyntaxError} from '../utils/createSyntaxError';
52
53
 
53
54
  // Rely on the mapper to fix up parent relationships.
54
55
  const EMPTY_PARENT: $FlowFixMe = null;
@@ -96,17 +97,6 @@ function nodeWith<T: ESNode>(node: T, overrideProps: Partial<T>): T {
96
97
  );
97
98
  }
98
99
 
99
- function createSyntaxError(node: ESNode, err: string): SyntaxError {
100
- const syntaxError = new SyntaxError(err);
101
- // $FlowExpectedError[prop-missing]
102
- syntaxError.loc = {
103
- line: node.loc.start.line,
104
- column: node.loc.start.column,
105
- };
106
-
107
- return syntaxError;
108
- }
109
-
110
100
  /**
111
101
  * Babel node types
112
102
  *
@@ -982,6 +972,19 @@ function transformNode(node: ESNodeOrBabelNode): ESNodeOrBabelNode | null {
982
972
  node.range = [node.range[0] + 1, node.range[1] - 1];
983
973
  return node;
984
974
  }
975
+ case 'AsExpression': {
976
+ const {typeAnnotation} = node;
977
+ // $FlowExpectedError[cannot-write]
978
+ node.type = 'TypeCastExpression';
979
+ // $FlowExpectedError[cannot-write]
980
+ node.typeAnnotation = {
981
+ type: 'TypeAnnotation',
982
+ typeAnnotation,
983
+ loc: typeAnnotation.loc,
984
+ range: typeAnnotation.range,
985
+ };
986
+ return node;
987
+ }
985
988
 
986
989
  /**
987
990
  * Babel has a different format for Literals
@@ -28,20 +28,12 @@ var _astNodeMutationHelpers = require("../transform/astNodeMutationHelpers");
28
28
 
29
29
  var _SimpleTraverser = require("../traverse/SimpleTraverser");
30
30
 
31
+ var _createSyntaxError = require("../utils/createSyntaxError");
32
+
31
33
  const nodeWith = _SimpleTransform.SimpleTransform.nodeWith; // Rely on the mapper to fix up parent relationships.
32
34
 
33
35
  const EMPTY_PARENT = null;
34
36
 
35
- function createSyntaxError(node, err) {
36
- const syntaxError = new SyntaxError(err); // $FlowExpectedError[prop-missing]
37
-
38
- syntaxError.loc = {
39
- line: node.loc.start.line,
40
- column: node.loc.start.column
41
- };
42
- return syntaxError;
43
- }
44
-
45
37
  function createDefaultPosition() {
46
38
  return {
47
39
  line: 1,
@@ -82,7 +74,7 @@ function getComponentParameterName(paramName) {
82
74
  return paramName.value;
83
75
 
84
76
  default:
85
- throw createSyntaxError(paramName, `Unknown Component parameter name type of "${paramName.type}"`);
77
+ throw (0, _createSyntaxError.createSyntaxError)(paramName, `Unknown Component parameter name type of "${paramName.type}"`);
86
78
  }
87
79
  }
88
80
 
@@ -203,16 +195,7 @@ function mapComponentParameters(params) {
203
195
  let ref = null;
204
196
 
205
197
  if (refParam != null) {
206
- const refType = refParam.local;
207
- ref = {
208
- type: 'Identifier',
209
- name: 'ref',
210
- optional: false,
211
- typeAnnotation: refType.type === 'AssignmentPattern' ? refType.left.typeAnnotation : refType.typeAnnotation,
212
- loc: refParam.loc,
213
- range: refParam.range,
214
- parent: EMPTY_PARENT
215
- };
198
+ ref = refParam.local;
216
199
  }
217
200
 
218
201
  return {
@@ -236,10 +219,6 @@ function mapComponentParameter(param) {
236
219
 
237
220
  case 'ComponentParameter':
238
221
  {
239
- if (getComponentParameterName(param.name) === 'ref') {
240
- throw createSyntaxError(param, 'Component parameters named "ref" are currently not supported');
241
- }
242
-
243
222
  let value;
244
223
 
245
224
  if (param.local.type === 'AssignmentPattern') {
@@ -289,7 +268,7 @@ function mapComponentParameter(param) {
289
268
 
290
269
  default:
291
270
  {
292
- throw createSyntaxError(param, `Unknown Component parameter type of "${param.type}"`);
271
+ throw (0, _createSyntaxError.createSyntaxError)(param, `Unknown Component parameter type of "${param.type}"`);
293
272
  }
294
273
  }
295
274
  }
@@ -360,48 +339,43 @@ function createForwardRefWrapper(originalComponent) {
360
339
  }
361
340
 
362
341
  function mapComponentDeclaration(node) {
363
- let rendersType = node.rendersType;
364
-
365
- if (rendersType == null) {
366
- // Create empty loc for return type annotation nodes
367
- const createRendersTypeLoc = () => ({
368
- loc: {
369
- start: node.body.loc.end,
370
- end: node.body.loc.end
371
- },
372
- range: [node.body.range[1], node.body.range[1]],
373
- parent: EMPTY_PARENT
374
- });
342
+ // Create empty loc for return type annotation nodes
343
+ const createRendersTypeLoc = () => ({
344
+ loc: {
345
+ start: node.body.loc.end,
346
+ end: node.body.loc.end
347
+ },
348
+ range: [node.body.range[1], node.body.range[1]],
349
+ parent: EMPTY_PARENT
350
+ });
375
351
 
376
- rendersType = {
377
- type: 'TypeAnnotation',
378
- typeAnnotation: {
379
- type: 'GenericTypeAnnotation',
352
+ const returnType = {
353
+ type: 'TypeAnnotation',
354
+ typeAnnotation: {
355
+ type: 'GenericTypeAnnotation',
356
+ id: {
357
+ type: 'QualifiedTypeIdentifier',
358
+ qualification: {
359
+ type: 'Identifier',
360
+ name: 'React',
361
+ optional: false,
362
+ typeAnnotation: null,
363
+ ...createRendersTypeLoc()
364
+ },
380
365
  id: {
381
- type: 'QualifiedTypeIdentifier',
382
- qualification: {
383
- type: 'Identifier',
384
- name: 'React',
385
- optional: false,
386
- typeAnnotation: null,
387
- ...createRendersTypeLoc()
388
- },
389
- id: {
390
- type: 'Identifier',
391
- name: 'Node',
392
- optional: false,
393
- typeAnnotation: null,
394
- ...createRendersTypeLoc()
395
- },
366
+ type: 'Identifier',
367
+ name: 'Node',
368
+ optional: false,
369
+ typeAnnotation: null,
396
370
  ...createRendersTypeLoc()
397
371
  },
398
- typeParameters: null,
399
372
  ...createRendersTypeLoc()
400
373
  },
374
+ typeParameters: null,
401
375
  ...createRendersTypeLoc()
402
- };
403
- }
404
-
376
+ },
377
+ ...createRendersTypeLoc()
378
+ };
405
379
  const {
406
380
  props,
407
381
  ref
@@ -418,7 +392,7 @@ function mapComponentDeclaration(node) {
418
392
  __componentDeclaration: true,
419
393
  typeParameters: node.typeParameters,
420
394
  params: props == null ? [] : ref == null ? [props] : [props, ref],
421
- returnType: rendersType,
395
+ returnType,
422
396
  body: node.body,
423
397
  async: false,
424
398
  generator: false,
@@ -609,7 +583,7 @@ function transformProgram(program, _options) {
609
583
  {
610
584
  var _node$parent;
611
585
 
612
- throw createSyntaxError(node, `Components must be defined at the top level of a module or within a ` + `BlockStatement, instead got parent of "${(_node$parent = node.parent) == null ? void 0 : _node$parent.type}".`);
586
+ throw (0, _createSyntaxError.createSyntaxError)(node, `Components must be defined at the top level of a module or within a ` + `BlockStatement, instead got parent of "${(_node$parent = node.parent) == null ? void 0 : _node$parent.type}".`);
613
587
  }
614
588
 
615
589
  default:
@@ -38,28 +38,20 @@ import type {
38
38
  VariableDeclaration,
39
39
  ModuleDeclaration,
40
40
  Statement,
41
+ AssignmentPattern,
42
+ BindingName,
41
43
  } from 'hermes-estree';
42
44
 
43
45
  import {SimpleTransform} from '../transform/SimpleTransform';
44
46
  import {shallowCloneNode} from '../transform/astNodeMutationHelpers';
45
47
  import {SimpleTraverser} from '../traverse/SimpleTraverser';
48
+ import {createSyntaxError} from '../utils/createSyntaxError';
46
49
 
47
50
  const nodeWith = SimpleTransform.nodeWith;
48
51
 
49
52
  // Rely on the mapper to fix up parent relationships.
50
53
  const EMPTY_PARENT: $FlowFixMe = null;
51
54
 
52
- function createSyntaxError(node: ESNode, err: string): SyntaxError {
53
- const syntaxError = new SyntaxError(err);
54
- // $FlowExpectedError[prop-missing]
55
- syntaxError.loc = {
56
- line: node.loc.start.line,
57
- column: node.loc.start.column,
58
- };
59
-
60
- return syntaxError;
61
- }
62
-
63
55
  function createDefaultPosition(): Position {
64
56
  return {
65
57
  line: 1,
@@ -158,7 +150,7 @@ function mapComponentParameters(
158
150
  params: $ReadOnlyArray<ComponentParameter | RestElement>,
159
151
  ): $ReadOnly<{
160
152
  props: ?(ObjectPattern | Identifier),
161
- ref: ?Identifier,
153
+ ref: ?(BindingName | AssignmentPattern),
162
154
  }> {
163
155
  if (params.length === 0) {
164
156
  return {props: null, ref: null};
@@ -247,19 +239,7 @@ function mapComponentParameters(
247
239
 
248
240
  let ref = null;
249
241
  if (refParam != null) {
250
- const refType = refParam.local;
251
- ref = {
252
- type: 'Identifier',
253
- name: 'ref',
254
- optional: false,
255
- typeAnnotation:
256
- refType.type === 'AssignmentPattern'
257
- ? refType.left.typeAnnotation
258
- : refType.typeAnnotation,
259
- loc: refParam.loc,
260
- range: refParam.range,
261
- parent: EMPTY_PARENT,
262
- };
242
+ ref = refParam.local;
263
243
  }
264
244
 
265
245
  return {
@@ -280,13 +260,6 @@ function mapComponentParameter(
280
260
  return a;
281
261
  }
282
262
  case 'ComponentParameter': {
283
- if (getComponentParameterName(param.name) === 'ref') {
284
- throw createSyntaxError(
285
- param,
286
- 'Component parameters named "ref" are currently not supported',
287
- );
288
- }
289
-
290
263
  let value;
291
264
  if (param.local.type === 'AssignmentPattern') {
292
265
  value = nodeWith(param.local, {
@@ -424,46 +397,42 @@ function mapComponentDeclaration(node: ComponentDeclaration): {
424
397
  comp: FunctionDeclaration,
425
398
  forwardRefDetails: ?ForwardRefDetails,
426
399
  } {
427
- let rendersType = node.rendersType;
428
- if (rendersType == null) {
429
- // Create empty loc for return type annotation nodes
430
- const createRendersTypeLoc = () => ({
431
- loc: {
432
- start: node.body.loc.end,
433
- end: node.body.loc.end,
434
- },
435
- range: [node.body.range[1], node.body.range[1]],
436
- parent: EMPTY_PARENT,
437
- });
438
-
439
- rendersType = {
440
- type: 'TypeAnnotation',
441
- typeAnnotation: {
442
- type: 'GenericTypeAnnotation',
400
+ // Create empty loc for return type annotation nodes
401
+ const createRendersTypeLoc = () => ({
402
+ loc: {
403
+ start: node.body.loc.end,
404
+ end: node.body.loc.end,
405
+ },
406
+ range: [node.body.range[1], node.body.range[1]],
407
+ parent: EMPTY_PARENT,
408
+ });
409
+ const returnType: TypeAnnotation = {
410
+ type: 'TypeAnnotation',
411
+ typeAnnotation: {
412
+ type: 'GenericTypeAnnotation',
413
+ id: {
414
+ type: 'QualifiedTypeIdentifier',
415
+ qualification: {
416
+ type: 'Identifier',
417
+ name: 'React',
418
+ optional: false,
419
+ typeAnnotation: null,
420
+ ...createRendersTypeLoc(),
421
+ },
443
422
  id: {
444
- type: 'QualifiedTypeIdentifier',
445
- qualification: {
446
- type: 'Identifier',
447
- name: 'React',
448
- optional: false,
449
- typeAnnotation: null,
450
- ...createRendersTypeLoc(),
451
- },
452
- id: {
453
- type: 'Identifier',
454
- name: 'Node',
455
- optional: false,
456
- typeAnnotation: null,
457
- ...createRendersTypeLoc(),
458
- },
423
+ type: 'Identifier',
424
+ name: 'Node',
425
+ optional: false,
426
+ typeAnnotation: null,
459
427
  ...createRendersTypeLoc(),
460
428
  },
461
- typeParameters: null,
462
429
  ...createRendersTypeLoc(),
463
430
  },
431
+ typeParameters: null,
464
432
  ...createRendersTypeLoc(),
465
- };
466
- }
433
+ },
434
+ ...createRendersTypeLoc(),
435
+ };
467
436
 
468
437
  const {props, ref} = mapComponentParameters(node.params);
469
438
 
@@ -482,7 +451,7 @@ function mapComponentDeclaration(node: ComponentDeclaration): {
482
451
  __componentDeclaration: true,
483
452
  typeParameters: node.typeParameters,
484
453
  params: props == null ? [] : ref == null ? [props] : [props, ref],
485
- returnType: rendersType,
454
+ returnType,
486
455
  body: node.body,
487
456
  async: false,
488
457
  generator: false,
@@ -30,6 +30,7 @@ function transformProgram(program, _options) {
30
30
  return _SimpleTransform.SimpleTransform.transformProgram(program, {
31
31
  transform(node) {
32
32
  switch (node.type) {
33
+ case 'AsExpression':
33
34
  case 'TypeCastExpression':
34
35
  {
35
36
  return node.expression;
@@ -32,6 +32,7 @@ export function transformProgram(
32
32
  return SimpleTransform.transformProgram(program, {
33
33
  transform(node: ESNode) {
34
34
  switch (node.type) {
35
+ case 'AsExpression':
35
36
  case 'TypeCastExpression': {
36
37
  return node.expression;
37
38
  }
@@ -24,6 +24,8 @@ exports.transformProgram = transformProgram;
24
24
 
25
25
  var _SimpleTransform = require("../transform/SimpleTransform");
26
26
 
27
+ var _createSyntaxError = require("../utils/createSyntaxError");
28
+
27
29
  const nodeWith = _SimpleTransform.SimpleTransform.nodeWith; // Rely on the mapper to fix up parent relationships.
28
30
 
29
31
  const EMPTY_PARENT = null;
@@ -126,6 +128,22 @@ function transformProgram(program, _options) {
126
128
  return createSimpleGenericTypeAnnotation('bigint', node);
127
129
  }
128
130
 
131
+ case 'ObjectTypeAnnotation':
132
+ {
133
+ const shouldStrip = node.properties.some(prop => prop.type === 'ObjectTypeMappedTypeProperty');
134
+
135
+ if (shouldStrip) {
136
+ return createAnyTypeAnnotation(node);
137
+ }
138
+
139
+ return node;
140
+ }
141
+
142
+ case 'ObjectTypeMappedTypeProperty':
143
+ {
144
+ throw (0, _createSyntaxError.createSyntaxError)(node, `Invalid AST structure, ObjectTypeMappedTypeProperty found outside of an ObjectTypeAnnotation`);
145
+ }
146
+
129
147
  case 'IndexedAccessType':
130
148
  case 'OptionalIndexedAccessType':
131
149
  case 'KeyofTypeAnnotation':
@@ -133,7 +151,6 @@ function transformProgram(program, _options) {
133
151
  case 'InferTypeAnnotation':
134
152
  case 'TupleTypeLabeledElement':
135
153
  case 'TupleTypeSpreadElement':
136
- case 'ObjectTypeMappedTypeProperty':
137
154
  case 'ComponentTypeAnnotation':
138
155
  case 'TypeOperator':
139
156
  case 'TypePredicate':
@@ -32,6 +32,7 @@ import type {
32
32
  } from 'hermes-estree';
33
33
 
34
34
  import {SimpleTransform} from '../transform/SimpleTransform';
35
+ import {createSyntaxError} from '../utils/createSyntaxError';
35
36
 
36
37
  const nodeWith = SimpleTransform.nodeWith;
37
38
 
@@ -140,6 +141,22 @@ export function transformProgram(
140
141
  // Convert to simple generic type annotation
141
142
  return createSimpleGenericTypeAnnotation('bigint', node);
142
143
  }
144
+ case 'ObjectTypeAnnotation': {
145
+ const shouldStrip = node.properties.some(
146
+ prop => prop.type === 'ObjectTypeMappedTypeProperty',
147
+ );
148
+ if (shouldStrip) {
149
+ return createAnyTypeAnnotation(node);
150
+ }
151
+
152
+ return node;
153
+ }
154
+ case 'ObjectTypeMappedTypeProperty': {
155
+ throw createSyntaxError(
156
+ node,
157
+ `Invalid AST structure, ObjectTypeMappedTypeProperty found outside of an ObjectTypeAnnotation`,
158
+ );
159
+ }
143
160
  case 'IndexedAccessType':
144
161
  case 'OptionalIndexedAccessType':
145
162
  case 'KeyofTypeAnnotation':
@@ -147,7 +164,6 @@ export function transformProgram(
147
164
  case 'InferTypeAnnotation':
148
165
  case 'TupleTypeLabeledElement':
149
166
  case 'TupleTypeSpreadElement':
150
- case 'ObjectTypeMappedTypeProperty':
151
167
  case 'ComponentTypeAnnotation':
152
168
  case 'TypeOperator':
153
169
  case 'TypePredicate': {
@@ -27,6 +27,7 @@ module.exports = {
27
27
  ArrayPattern: ['elements', 'typeAnnotation'],
28
28
  ArrayTypeAnnotation: ['elementType'],
29
29
  ArrowFunctionExpression: ['id', 'params', 'body', 'typeParameters', 'returnType', 'predicate'],
30
+ AsExpression: ['expression', 'typeAnnotation'],
30
31
  AssignmentExpression: ['left', 'right'],
31
32
  AssignmentPattern: ['left', 'right'],
32
33
  AwaitExpression: ['argument'],
@@ -49,6 +49,10 @@ const HERMES_AST_VISITOR_KEYS = {
49
49
  returnType: 'Node',
50
50
  predicate: 'Node'
51
51
  },
52
+ AsExpression: {
53
+ expression: 'Node',
54
+ typeAnnotation: 'Node'
55
+ },
52
56
  AssignmentExpression: {
53
57
  left: 'Node',
54
58
  right: 'Node'
@@ -0,0 +1,25 @@
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
+ * @format
9
+ */
10
+ 'use strict';
11
+
12
+ Object.defineProperty(exports, "__esModule", {
13
+ value: true
14
+ });
15
+ exports.createSyntaxError = createSyntaxError;
16
+
17
+ function createSyntaxError(node, err) {
18
+ const syntaxError = new SyntaxError(err); // $FlowExpectedError[prop-missing]
19
+
20
+ syntaxError.loc = {
21
+ line: node.loc.start.line,
22
+ column: node.loc.start.column
23
+ };
24
+ return syntaxError;
25
+ }
@@ -0,0 +1,24 @@
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
+ * @flow strict
8
+ * @format
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ import type {ESNode} from 'hermes-estree';
14
+
15
+ export function createSyntaxError(node: ESNode, err: string): SyntaxError {
16
+ const syntaxError = new SyntaxError(err);
17
+ // $FlowExpectedError[prop-missing]
18
+ syntaxError.loc = {
19
+ line: node.loc.start.line,
20
+ column: node.loc.start.column,
21
+ };
22
+
23
+ return syntaxError;
24
+ }
@@ -17,7 +17,17 @@ exports.default = mutate;
17
17
  var _SimpleTransform = require("../transform/SimpleTransform");
18
18
 
19
19
  // https://github.com/prettier/prettier/blob/d962466a828f8ef51435e3e8840178d90b7ec6cd/src/language-js/parse/postprocess/index.js#L161-L182
20
- function transformChainExpression(node) {
20
+ function transformChainExpression(node, comments) {
21
+ if (comments != null) {
22
+ var _node$comments;
23
+
24
+ // $FlowExpectedError[prop-missing]
25
+ const joinedComments = comments.concat((_node$comments = node.comments) != null ? _node$comments : []); // $FlowExpectedError[prop-missing]
26
+ // $FlowFixMe[cannot-write]
27
+
28
+ node.comments = joinedComments;
29
+ }
30
+
21
31
  switch (node.type) {
22
32
  case 'CallExpression':
23
33
  // $FlowExpectedError[cannot-spread-interface]
@@ -56,7 +66,8 @@ function mutate(rootNode, visitorKeys) {
56
66
 
57
67
 
58
68
  if (node.type === 'ChainExpression') {
59
- return transformChainExpression(node.expression);
69
+ // $FlowFixMe[prop-missing]
70
+ return transformChainExpression(node.expression, node == null ? void 0 : node.comments);
60
71
  } // Prettier currently relies on comparing the `node` vs `node.value` start positions to know if an
61
72
  // `ObjectTypeProperty` is a method or not (instead of using the `node.method` boolean). To correctly print
62
73
  // the node when its not a method we need the start position to be different from the `node.value`s start
@@ -10,12 +10,22 @@
10
10
 
11
11
  'use strict';
12
12
 
13
- import type {ESNode, Program} from 'hermes-estree';
13
+ import type {ESNode, Program, Comment} from 'hermes-estree';
14
14
  import type {VisitorKeysType} from '../traverse/getVisitorKeys';
15
15
  import {SimpleTransform} from '../transform/SimpleTransform';
16
16
 
17
17
  // https://github.com/prettier/prettier/blob/d962466a828f8ef51435e3e8840178d90b7ec6cd/src/language-js/parse/postprocess/index.js#L161-L182
18
- function transformChainExpression(node: ESNode): ESNode {
18
+ function transformChainExpression(
19
+ node: ESNode,
20
+ comments: ?$ReadOnlyArray<Comment>,
21
+ ): ESNode {
22
+ if (comments != null) {
23
+ // $FlowExpectedError[prop-missing]
24
+ const joinedComments = comments.concat(node.comments ?? []);
25
+ // $FlowExpectedError[prop-missing]
26
+ // $FlowFixMe[cannot-write]
27
+ node.comments = joinedComments;
28
+ }
19
29
  switch (node.type) {
20
30
  case 'CallExpression':
21
31
  // $FlowExpectedError[cannot-spread-interface]
@@ -59,7 +69,8 @@ export default function mutate(
59
69
  // so we have to apply their transform to our AST so it can actually format it.
60
70
  // Note: Only needed for prettier V2, this is supported in V3
61
71
  if (node.type === 'ChainExpression') {
62
- return transformChainExpression(node.expression);
72
+ // $FlowFixMe[prop-missing]
73
+ return transformChainExpression(node.expression, node?.comments);
63
74
  }
64
75
 
65
76
  // Prettier currently relies on comparing the `node` vs `node.value` start positions to know if an
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hermes-parser",
3
- "version": "0.16.0",
3
+ "version": "0.17.1",
4
4
  "description": "A JavaScript parser built from the Hermes engine",
5
5
  "main": "dist/index.js",
6
6
  "license": "MIT",
@@ -9,7 +9,7 @@
9
9
  "url": "git@github.com:facebook/hermes.git"
10
10
  },
11
11
  "dependencies": {
12
- "hermes-estree": "0.16.0"
12
+ "hermes-estree": "0.17.1"
13
13
  },
14
14
  "devDependencies": {
15
15
  "@babel/parser": "7.7.4",