hermes-parser 0.16.0 → 0.17.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.
@@ -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
 
@@ -237,7 +229,7 @@ function mapComponentParameter(param) {
237
229
  case 'ComponentParameter':
238
230
  {
239
231
  if (getComponentParameterName(param.name) === 'ref') {
240
- throw createSyntaxError(param, 'Component parameters named "ref" are currently not supported');
232
+ throw (0, _createSyntaxError.createSyntaxError)(param, 'Component parameters named "ref" are currently not supported');
241
233
  }
242
234
 
243
235
  let value;
@@ -289,7 +281,7 @@ function mapComponentParameter(param) {
289
281
 
290
282
  default:
291
283
  {
292
- throw createSyntaxError(param, `Unknown Component parameter type of "${param.type}"`);
284
+ throw (0, _createSyntaxError.createSyntaxError)(param, `Unknown Component parameter type of "${param.type}"`);
293
285
  }
294
286
  }
295
287
  }
@@ -360,48 +352,43 @@ function createForwardRefWrapper(originalComponent) {
360
352
  }
361
353
 
362
354
  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
- });
355
+ // Create empty loc for return type annotation nodes
356
+ const createRendersTypeLoc = () => ({
357
+ loc: {
358
+ start: node.body.loc.end,
359
+ end: node.body.loc.end
360
+ },
361
+ range: [node.body.range[1], node.body.range[1]],
362
+ parent: EMPTY_PARENT
363
+ });
375
364
 
376
- rendersType = {
377
- type: 'TypeAnnotation',
378
- typeAnnotation: {
379
- type: 'GenericTypeAnnotation',
365
+ const returnType = {
366
+ type: 'TypeAnnotation',
367
+ typeAnnotation: {
368
+ type: 'GenericTypeAnnotation',
369
+ id: {
370
+ type: 'QualifiedTypeIdentifier',
371
+ qualification: {
372
+ type: 'Identifier',
373
+ name: 'React',
374
+ optional: false,
375
+ typeAnnotation: null,
376
+ ...createRendersTypeLoc()
377
+ },
380
378
  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
- },
379
+ type: 'Identifier',
380
+ name: 'Node',
381
+ optional: false,
382
+ typeAnnotation: null,
396
383
  ...createRendersTypeLoc()
397
384
  },
398
- typeParameters: null,
399
385
  ...createRendersTypeLoc()
400
386
  },
387
+ typeParameters: null,
401
388
  ...createRendersTypeLoc()
402
- };
403
- }
404
-
389
+ },
390
+ ...createRendersTypeLoc()
391
+ };
405
392
  const {
406
393
  props,
407
394
  ref
@@ -418,7 +405,7 @@ function mapComponentDeclaration(node) {
418
405
  __componentDeclaration: true,
419
406
  typeParameters: node.typeParameters,
420
407
  params: props == null ? [] : ref == null ? [props] : [props, ref],
421
- returnType: rendersType,
408
+ returnType,
422
409
  body: node.body,
423
410
  async: false,
424
411
  generator: false,
@@ -609,7 +596,7 @@ function transformProgram(program, _options) {
609
596
  {
610
597
  var _node$parent;
611
598
 
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}".`);
599
+ 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
600
  }
614
601
 
615
602
  default:
@@ -43,23 +43,13 @@ import type {
43
43
  import {SimpleTransform} from '../transform/SimpleTransform';
44
44
  import {shallowCloneNode} from '../transform/astNodeMutationHelpers';
45
45
  import {SimpleTraverser} from '../traverse/SimpleTraverser';
46
+ import {createSyntaxError} from '../utils/createSyntaxError';
46
47
 
47
48
  const nodeWith = SimpleTransform.nodeWith;
48
49
 
49
50
  // Rely on the mapper to fix up parent relationships.
50
51
  const EMPTY_PARENT: $FlowFixMe = null;
51
52
 
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
53
  function createDefaultPosition(): Position {
64
54
  return {
65
55
  line: 1,
@@ -424,46 +414,42 @@ function mapComponentDeclaration(node: ComponentDeclaration): {
424
414
  comp: FunctionDeclaration,
425
415
  forwardRefDetails: ?ForwardRefDetails,
426
416
  } {
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',
417
+ // Create empty loc for return type annotation nodes
418
+ const createRendersTypeLoc = () => ({
419
+ loc: {
420
+ start: node.body.loc.end,
421
+ end: node.body.loc.end,
422
+ },
423
+ range: [node.body.range[1], node.body.range[1]],
424
+ parent: EMPTY_PARENT,
425
+ });
426
+ const returnType: TypeAnnotation = {
427
+ type: 'TypeAnnotation',
428
+ typeAnnotation: {
429
+ type: 'GenericTypeAnnotation',
430
+ id: {
431
+ type: 'QualifiedTypeIdentifier',
432
+ qualification: {
433
+ type: 'Identifier',
434
+ name: 'React',
435
+ optional: false,
436
+ typeAnnotation: null,
437
+ ...createRendersTypeLoc(),
438
+ },
443
439
  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
- },
440
+ type: 'Identifier',
441
+ name: 'Node',
442
+ optional: false,
443
+ typeAnnotation: null,
459
444
  ...createRendersTypeLoc(),
460
445
  },
461
- typeParameters: null,
462
446
  ...createRendersTypeLoc(),
463
447
  },
448
+ typeParameters: null,
464
449
  ...createRendersTypeLoc(),
465
- };
466
- }
450
+ },
451
+ ...createRendersTypeLoc(),
452
+ };
467
453
 
468
454
  const {props, ref} = mapComponentParameters(node.params);
469
455
 
@@ -482,7 +468,7 @@ function mapComponentDeclaration(node: ComponentDeclaration): {
482
468
  __componentDeclaration: true,
483
469
  typeParameters: node.typeParameters,
484
470
  params: props == null ? [] : ref == null ? [props] : [props, ref],
485
- returnType: rendersType,
471
+ returnType,
486
472
  body: node.body,
487
473
  async: false,
488
474
  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
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hermes-parser",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
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.0"
13
13
  },
14
14
  "devDependencies": {
15
15
  "@babel/parser": "7.7.4",