hermes-transform 0.28.0 → 0.29.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.
- package/dist/detachedNode.js +1 -0
- package/dist/detachedNode.js.flow +1 -0
- package/dist/generated/node-types.js +1 -12
- package/dist/generated/node-types.js.flow +2 -19
- package/dist/generated/special-case-node-types/misc.js +11 -0
- package/dist/generated/special-case-node-types/misc.js.flow +18 -0
- package/dist/src/detachedNode.js +178 -0
- package/dist/src/generated/node-types.js +2212 -0
- package/dist/src/generated/special-case-node-types/Comment.js +36 -0
- package/dist/src/generated/special-case-node-types/DeclareExportDeclaration.js +58 -0
- package/dist/src/generated/special-case-node-types/DeclareHook.js +33 -0
- package/dist/src/generated/special-case-node-types/ExportNamedDeclaration.js +44 -0
- package/dist/src/generated/special-case-node-types/Literal.js +97 -0
- package/dist/src/generated/special-case-node-types/ObjectTypeProperty.js +74 -0
- package/dist/src/generated/special-case-node-types/Property.js +136 -0
- package/dist/src/generated/special-case-node-types/misc.js +158 -0
- package/dist/src/generated/special-case-node-types.js +69 -0
- package/dist/src/index.js +53 -0
- package/dist/src/transform/Errors.js +43 -0
- package/dist/src/transform/MutationContext.js +81 -0
- package/dist/src/transform/TransformContext.js +213 -0
- package/dist/src/transform/comments/comments.js +308 -0
- package/dist/src/transform/comments/prettier/common/util.js +364 -0
- package/dist/src/transform/comments/prettier/language-js/comments.js +788 -0
- package/dist/src/transform/comments/prettier/language-js/loc.js +42 -0
- package/dist/src/transform/comments/prettier/language-js/printer-estree.js +32 -0
- package/dist/src/transform/comments/prettier/language-js/utils.js +119 -0
- package/dist/src/transform/comments/prettier/main/comments.js +440 -0
- package/dist/src/transform/comments/prettier/utils/get-last.js +13 -0
- package/dist/src/transform/mutations/AddComments.js +43 -0
- package/dist/src/transform/mutations/CloneCommentsTo.js +31 -0
- package/dist/src/transform/mutations/InsertStatement.js +91 -0
- package/dist/src/transform/mutations/ModifyNodeInPlace.js +59 -0
- package/dist/src/transform/mutations/RemoveComment.js +78 -0
- package/dist/src/transform/mutations/RemoveNode.js +205 -0
- package/dist/src/transform/mutations/RemoveStatement.js +59 -0
- package/dist/src/transform/mutations/ReplaceNode.js +92 -0
- package/dist/src/transform/mutations/ReplaceStatementWithMany.js +79 -0
- package/dist/src/transform/mutations/utils/getStatementParent.js +143 -0
- package/dist/src/transform/mutations/utils/isValidModuleDeclarationParent.js +43 -0
- package/dist/src/transform/parse.js +56 -0
- package/dist/src/transform/print.js +134 -0
- package/dist/src/transform/transform.js +36 -0
- package/dist/src/transform/transformAST.js +134 -0
- package/dist/src/traverse/NodeEventGenerator.js +353 -0
- package/dist/src/traverse/SafeEmitter.js +52 -0
- package/dist/src/traverse/esquery.js +37 -0
- package/dist/src/traverse/traverse.js +150 -0
- package/dist/transform/comments/prettier/language-js/comments.js +29 -1
- package/dist/transform/mutations/utils/getStatementParent.js.flow +7 -5
- package/package.json +5 -5
package/dist/detachedNode.js
CHANGED
|
@@ -147,6 +147,7 @@ function shallowCloneNode(node, newProps, config = {}) {
|
|
|
147
147
|
|
|
148
148
|
|
|
149
149
|
function deepCloneNode(node, newProps) {
|
|
150
|
+
// $FlowFixMe[unsafe-object-assign]
|
|
150
151
|
const clone = Object.assign(JSON.parse(JSON.stringify(node, (key, value) => {
|
|
151
152
|
// null out parent pointers
|
|
152
153
|
if (key === 'parent') {
|
|
@@ -37,7 +37,6 @@ var _exportNames = {
|
|
|
37
37
|
BigIntLiteralTypeAnnotation: true,
|
|
38
38
|
BigIntTypeAnnotation: true,
|
|
39
39
|
BinaryExpression: true,
|
|
40
|
-
BlockStatement: true,
|
|
41
40
|
BooleanLiteralTypeAnnotation: true,
|
|
42
41
|
BooleanTypeAnnotation: true,
|
|
43
42
|
BreakStatement: true,
|
|
@@ -219,7 +218,6 @@ exports.AwaitExpression = AwaitExpression;
|
|
|
219
218
|
exports.BigIntLiteralTypeAnnotation = BigIntLiteralTypeAnnotation;
|
|
220
219
|
exports.BigIntTypeAnnotation = BigIntTypeAnnotation;
|
|
221
220
|
exports.BinaryExpression = BinaryExpression;
|
|
222
|
-
exports.BlockStatement = BlockStatement;
|
|
223
221
|
exports.BooleanLiteralTypeAnnotation = BooleanLiteralTypeAnnotation;
|
|
224
222
|
exports.BooleanTypeAnnotation = BooleanTypeAnnotation;
|
|
225
223
|
exports.BreakStatement = BreakStatement;
|
|
@@ -512,15 +510,6 @@ function BinaryExpression(props) {
|
|
|
512
510
|
return node;
|
|
513
511
|
}
|
|
514
512
|
|
|
515
|
-
function BlockStatement(props) {
|
|
516
|
-
const node = (0, _detachedNode.detachedProps)(props.parent, {
|
|
517
|
-
type: 'BlockStatement',
|
|
518
|
-
body: props.body.map(n => (0, _detachedNode.asDetachedNodeForCodeGen)(n))
|
|
519
|
-
});
|
|
520
|
-
(0, _detachedNode.setParentPointersInDirectChildren)(node);
|
|
521
|
-
return node;
|
|
522
|
-
}
|
|
523
|
-
|
|
524
513
|
function BooleanLiteralTypeAnnotation(props) {
|
|
525
514
|
const node = (0, _detachedNode.detachedProps)(props.parent, {
|
|
526
515
|
type: 'BooleanLiteralTypeAnnotation',
|
|
@@ -1184,7 +1173,7 @@ function ImportExpression(props) {
|
|
|
1184
1173
|
const node = (0, _detachedNode.detachedProps)(props.parent, {
|
|
1185
1174
|
type: 'ImportExpression',
|
|
1186
1175
|
source: (0, _detachedNode.asDetachedNodeForCodeGen)(props.source),
|
|
1187
|
-
|
|
1176
|
+
options: (0, _detachedNode.asDetachedNodeForCodeGen)(props.options)
|
|
1188
1177
|
});
|
|
1189
1178
|
(0, _detachedNode.setParentPointersInDirectChildren)(node);
|
|
1190
1179
|
return node;
|
|
@@ -35,7 +35,6 @@ import type {
|
|
|
35
35
|
BigIntLiteralTypeAnnotation as BigIntLiteralTypeAnnotationType,
|
|
36
36
|
BigIntTypeAnnotation as BigIntTypeAnnotationType,
|
|
37
37
|
BinaryExpression as BinaryExpressionType,
|
|
38
|
-
BlockStatement as BlockStatementType,
|
|
39
38
|
BooleanLiteralTypeAnnotation as BooleanLiteralTypeAnnotationType,
|
|
40
39
|
BooleanTypeAnnotation as BooleanTypeAnnotationType,
|
|
41
40
|
BreakStatement as BreakStatementType,
|
|
@@ -269,10 +268,6 @@ export type BinaryExpressionProps = {
|
|
|
269
268
|
+operator: BinaryExpressionType['operator'],
|
|
270
269
|
};
|
|
271
270
|
|
|
272
|
-
export type BlockStatementProps = {
|
|
273
|
-
+body: $ReadOnlyArray<MaybeDetachedNode<BlockStatementType['body'][number]>>,
|
|
274
|
-
};
|
|
275
|
-
|
|
276
271
|
export type BooleanLiteralTypeAnnotationProps = {
|
|
277
272
|
+value: BooleanLiteralTypeAnnotationType['value'],
|
|
278
273
|
+raw: BooleanLiteralTypeAnnotationType['raw'],
|
|
@@ -686,7 +681,7 @@ export type ImportDefaultSpecifierProps = {
|
|
|
686
681
|
|
|
687
682
|
export type ImportExpressionProps = {
|
|
688
683
|
+source: MaybeDetachedNode<ImportExpressionType['source']>,
|
|
689
|
-
+
|
|
684
|
+
+options?: ?MaybeDetachedNode<ImportExpressionType['options']>,
|
|
690
685
|
};
|
|
691
686
|
|
|
692
687
|
export type ImportNamespaceSpecifierProps = {
|
|
@@ -1431,18 +1426,6 @@ export function BinaryExpression(props: {
|
|
|
1431
1426
|
return node;
|
|
1432
1427
|
}
|
|
1433
1428
|
|
|
1434
|
-
export function BlockStatement(props: {
|
|
1435
|
-
...BlockStatementProps,
|
|
1436
|
-
+parent?: ESNode,
|
|
1437
|
-
}): DetachedNode<BlockStatementType> {
|
|
1438
|
-
const node = detachedProps<BlockStatementType>((props.parent: $FlowFixMe), {
|
|
1439
|
-
type: 'BlockStatement',
|
|
1440
|
-
body: props.body.map(n => asDetachedNodeForCodeGen(n)),
|
|
1441
|
-
});
|
|
1442
|
-
setParentPointersInDirectChildren((node: $FlowFixMe));
|
|
1443
|
-
return node;
|
|
1444
|
-
}
|
|
1445
|
-
|
|
1446
1429
|
export function BooleanLiteralTypeAnnotation(props: {
|
|
1447
1430
|
...BooleanLiteralTypeAnnotationProps,
|
|
1448
1431
|
+parent?: ESNode,
|
|
@@ -2368,7 +2351,7 @@ export function ImportExpression(props: {
|
|
|
2368
2351
|
const node = detachedProps<ImportExpressionType>((props.parent: $FlowFixMe), {
|
|
2369
2352
|
type: 'ImportExpression',
|
|
2370
2353
|
source: asDetachedNodeForCodeGen(props.source),
|
|
2371
|
-
|
|
2354
|
+
options: asDetachedNodeForCodeGen(props.options),
|
|
2372
2355
|
});
|
|
2373
2356
|
setParentPointersInDirectChildren((node: $FlowFixMe));
|
|
2374
2357
|
return node;
|
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.ArrowFunctionExpression = ArrowFunctionExpression;
|
|
7
|
+
exports.BlockStatement = BlockStatement;
|
|
7
8
|
exports.ClassDeclaration = ClassDeclaration;
|
|
8
9
|
exports.DeclareFunction = DeclareFunction;
|
|
9
10
|
exports.Identifier = Identifier;
|
|
@@ -144,4 +145,14 @@ function MemberExpression(props) {
|
|
|
144
145
|
});
|
|
145
146
|
(0, _detachedNode.setParentPointersInDirectChildren)(node);
|
|
146
147
|
return node;
|
|
148
|
+
} // Ignore the hermes-specific `implicit` property.
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
function BlockStatement(props) {
|
|
152
|
+
const node = (0, _detachedNode.detachedProps)(props.parent, {
|
|
153
|
+
type: 'BlockStatement',
|
|
154
|
+
body: props.body.map(n => (0, _detachedNode.asDetachedNode)(n))
|
|
155
|
+
});
|
|
156
|
+
(0, _detachedNode.setParentPointersInDirectChildren)(node);
|
|
157
|
+
return node;
|
|
147
158
|
}
|
|
@@ -10,12 +10,14 @@
|
|
|
10
10
|
|
|
11
11
|
import type {
|
|
12
12
|
ArrowFunctionExpression as ArrowFunctionExpressionType,
|
|
13
|
+
BlockStatement as BlockStatementType,
|
|
13
14
|
ClassDeclaration as ClassDeclarationType,
|
|
14
15
|
DeclareFunction as DeclareFunctionType,
|
|
15
16
|
ESNode,
|
|
16
17
|
FunctionTypeAnnotation as FunctionTypeAnnotationType,
|
|
17
18
|
Identifier as IdentifierType,
|
|
18
19
|
InterpreterDirective as InterpreterDirectiveType,
|
|
20
|
+
Statement as StatementType,
|
|
19
21
|
Token as TokenType,
|
|
20
22
|
Comment as CommentType,
|
|
21
23
|
TemplateElement as TemplateElementType,
|
|
@@ -237,3 +239,19 @@ export function MemberExpression(props: {
|
|
|
237
239
|
setParentPointersInDirectChildren(node);
|
|
238
240
|
return node;
|
|
239
241
|
}
|
|
242
|
+
|
|
243
|
+
// Ignore the hermes-specific `implicit` property.
|
|
244
|
+
export type BlockStatementProps = {
|
|
245
|
+
+body: $ReadOnlyArray<MaybeDetachedNode<StatementType>>,
|
|
246
|
+
};
|
|
247
|
+
export function BlockStatement(props: {
|
|
248
|
+
...$ReadOnly<BlockStatementProps>,
|
|
249
|
+
+parent?: ESNode,
|
|
250
|
+
}): DetachedNode<BlockStatementType> {
|
|
251
|
+
const node = detachedProps<BlockStatementType>(props.parent, {
|
|
252
|
+
type: 'BlockStatement',
|
|
253
|
+
body: props.body.map(n => asDetachedNode(n)),
|
|
254
|
+
});
|
|
255
|
+
setParentPointersInDirectChildren(node);
|
|
256
|
+
return node;
|
|
257
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.asDetachedNode = void 0;
|
|
7
|
+
exports.asDetachedNodeForCodeGen = asDetachedNodeForCodeGen;
|
|
8
|
+
exports.deepCloneNode = deepCloneNode;
|
|
9
|
+
exports.detachedProps = detachedProps;
|
|
10
|
+
exports.getOriginalNode = getOriginalNode;
|
|
11
|
+
exports.isDetachedNode = isDetachedNode;
|
|
12
|
+
exports.setParentPointersInDirectChildren = setParentPointersInDirectChildren;
|
|
13
|
+
exports.shallowCloneNode = shallowCloneNode;
|
|
14
|
+
exports.updateAllParentPointers = updateAllParentPointers;
|
|
15
|
+
|
|
16
|
+
var _hermesParser = require("hermes-parser");
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
20
|
+
*
|
|
21
|
+
* This source code is licensed under the MIT license found in the
|
|
22
|
+
* LICENSE file in the root directory of this source tree.
|
|
23
|
+
*
|
|
24
|
+
*
|
|
25
|
+
* @format
|
|
26
|
+
*/
|
|
27
|
+
const DETACHED_MARKER = Symbol.for('hermes-transform - Detached AST Node');
|
|
28
|
+
const ORIGINAL_NODE = Symbol.for('hermes-transform - Original Node');
|
|
29
|
+
|
|
30
|
+
function isDetachedNode(node) {
|
|
31
|
+
// $FlowExpectedError[invalid-in-lhs] flow doesn't support symbols as keys
|
|
32
|
+
return DETACHED_MARKER in node;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function getOriginalNode(node) {
|
|
36
|
+
// $FlowExpectedError[prop-missing]
|
|
37
|
+
return node[ORIGINAL_NODE];
|
|
38
|
+
}
|
|
39
|
+
/* $FlowExpectedError[unclear-type] Type safety is not needed for generated
|
|
40
|
+
* code, this avoids us always having to pass a generic property within codegen */
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
function asDetachedNodeForCodeGen(node) {
|
|
44
|
+
if (node == null) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (isDetachedNode(node)) {
|
|
49
|
+
return node;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return shallowCloneNode(node, {});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const asDetachedNode = (node, {
|
|
56
|
+
useDeepClone
|
|
57
|
+
} = {
|
|
58
|
+
useDeepClone: false
|
|
59
|
+
}) => {
|
|
60
|
+
if (node == null) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (isDetachedNode(node)) {
|
|
65
|
+
return node;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return useDeepClone ? deepCloneNode(node, {}) : shallowCloneNode(node, {});
|
|
69
|
+
}; // used by the node type function codegen
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
exports.asDetachedNode = asDetachedNode;
|
|
73
|
+
|
|
74
|
+
function detachedProps(parent, props, config = {}) {
|
|
75
|
+
// $FlowExpectedError[incompatible-type]
|
|
76
|
+
const detachedNode = { ...props,
|
|
77
|
+
...((config == null ? void 0 : config.preserveLocation) !== true ? {
|
|
78
|
+
// if this is [0,0] AND the file has a docblock then prettier will insert newlines between
|
|
79
|
+
// certain detached nodes. Because of "intended" formatting behaviour (https://github.com/prettier/prettier/issues/12078)
|
|
80
|
+
// this can cause us to output weirdly formatted code that should have been collapsed.
|
|
81
|
+
//
|
|
82
|
+
// prettier works backwards from the position you give it to find newlines or non whitespace
|
|
83
|
+
// tokens and uses this to determine if newlines should be inserted between nodes.
|
|
84
|
+
// By placing the range at [1, 1] we can ensure a token is always found before a newline
|
|
85
|
+
// and therefore no newlines will be placed between nodes.
|
|
86
|
+
//
|
|
87
|
+
// NOTE: we will still run into the bug if there is weird code like a docblock with whitespace
|
|
88
|
+
// characters before it. However we assume this isn't going to happen because any file
|
|
89
|
+
// already formatted by prettier will have that whitespace removed.
|
|
90
|
+
// We considered a more complex solution involving traversing the AST and manually updating
|
|
91
|
+
// detached node ranges after mutations are applied - however this is a lot heavier and will
|
|
92
|
+
// probably never be needed.
|
|
93
|
+
range: [1, 1],
|
|
94
|
+
loc: {
|
|
95
|
+
start: {
|
|
96
|
+
line: 1,
|
|
97
|
+
column: 0
|
|
98
|
+
},
|
|
99
|
+
end: {
|
|
100
|
+
line: 1,
|
|
101
|
+
column: 0
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
} : {}),
|
|
105
|
+
// if not provided, then we purposely don't set this here
|
|
106
|
+
// and will rely on the tooling to update it as appropriate.
|
|
107
|
+
// nothing should be reading from this before it's set anyway.
|
|
108
|
+
parent: parent
|
|
109
|
+
}; // mark the node as detached
|
|
110
|
+
|
|
111
|
+
Object.defineProperty(detachedNode, DETACHED_MARKER, {
|
|
112
|
+
configurable: false,
|
|
113
|
+
enumerable: false,
|
|
114
|
+
value: true,
|
|
115
|
+
writable: false
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
if (config.originalNode) {
|
|
119
|
+
Object.defineProperty(detachedNode, ORIGINAL_NODE, {
|
|
120
|
+
configurable: false,
|
|
121
|
+
enumerable: false,
|
|
122
|
+
value: config.originalNode,
|
|
123
|
+
writable: false
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return detachedNode;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Shallowly clones the node, but not its children.
|
|
131
|
+
*/
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
function shallowCloneNode(node, newProps, config = {}) {
|
|
135
|
+
var _config$preserveLocat, _config$originalNode;
|
|
136
|
+
|
|
137
|
+
return detachedProps(null, { ...node,
|
|
138
|
+
...newProps
|
|
139
|
+
}, {
|
|
140
|
+
preserveLocation: (_config$preserveLocat = config.preserveLocation) != null ? _config$preserveLocat : true,
|
|
141
|
+
originalNode: (_config$originalNode = config.originalNode) != null ? _config$originalNode : node
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Deeply clones node and its entire tree.
|
|
146
|
+
*/
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
function deepCloneNode(node, newProps) {
|
|
150
|
+
// $FlowFixMe[unsafe-object-assign]
|
|
151
|
+
const clone = Object.assign(JSON.parse(JSON.stringify(node, (key, value) => {
|
|
152
|
+
// null out parent pointers
|
|
153
|
+
if (key === 'parent') {
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
return value;
|
|
158
|
+
})), newProps);
|
|
159
|
+
updateAllParentPointers(clone); // $FlowExpectedError[class-object-subtyping]
|
|
160
|
+
|
|
161
|
+
return detachedProps(null, clone);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Corrects the parent pointers in direct children of the given node
|
|
165
|
+
*/
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
function setParentPointersInDirectChildren(node) {
|
|
169
|
+
_hermesParser.astNodeMutationHelpers.setParentPointersInDirectChildren(node);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Traverses the entire subtree to ensure the parent pointers are set correctly
|
|
173
|
+
*/
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
function updateAllParentPointers(node) {
|
|
177
|
+
_hermesParser.astNodeMutationHelpers.updateAllParentPointers(node);
|
|
178
|
+
}
|