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.
- package/dist/HermesParserNodeDeserializers.js +10 -1
- package/dist/HermesParserWASM.js +1 -1
- package/dist/babel/TransformESTreeToBabel.js +20 -11
- package/dist/babel/TransformESTreeToBabel.js.flow +14 -11
- package/dist/estree/StripComponentSyntax.js +37 -63
- package/dist/estree/StripComponentSyntax.js.flow +36 -67
- package/dist/estree/StripFlowTypes.js +1 -0
- package/dist/estree/StripFlowTypes.js.flow +1 -0
- package/dist/estree/StripFlowTypesForBabel.js +18 -1
- package/dist/estree/StripFlowTypesForBabel.js.flow +17 -1
- package/dist/generated/ESTreeVisitorKeys.js +1 -0
- package/dist/generated/ParserVisitorKeys.js +4 -0
- package/dist/utils/createSyntaxError.js +25 -0
- package/dist/utils/createSyntaxError.js.flow +24 -0
- package/dist/utils/mutateESTreeASTForPrettier.js +13 -2
- package/dist/utils/mutateESTreeASTForPrettier.js.flow +14 -3
- package/package.json +2 -2
|
@@ -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
|
-
|
|
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
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
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
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
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: '
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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
|
|
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: ?
|
|
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
|
-
|
|
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
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
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: '
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
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
|
|
454
|
+
returnType,
|
|
486
455
|
body: node.body,
|
|
487
456
|
async: false,
|
|
488
457
|
generator: false,
|
|
@@ -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'],
|
|
@@ -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
|
-
|
|
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(
|
|
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
|
-
|
|
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.
|
|
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.
|
|
12
|
+
"hermes-estree": "0.17.1"
|
|
13
13
|
},
|
|
14
14
|
"devDependencies": {
|
|
15
15
|
"@babel/parser": "7.7.4",
|