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.
Files changed (51) hide show
  1. package/dist/detachedNode.js +1 -0
  2. package/dist/detachedNode.js.flow +1 -0
  3. package/dist/generated/node-types.js +1 -12
  4. package/dist/generated/node-types.js.flow +2 -19
  5. package/dist/generated/special-case-node-types/misc.js +11 -0
  6. package/dist/generated/special-case-node-types/misc.js.flow +18 -0
  7. package/dist/src/detachedNode.js +178 -0
  8. package/dist/src/generated/node-types.js +2212 -0
  9. package/dist/src/generated/special-case-node-types/Comment.js +36 -0
  10. package/dist/src/generated/special-case-node-types/DeclareExportDeclaration.js +58 -0
  11. package/dist/src/generated/special-case-node-types/DeclareHook.js +33 -0
  12. package/dist/src/generated/special-case-node-types/ExportNamedDeclaration.js +44 -0
  13. package/dist/src/generated/special-case-node-types/Literal.js +97 -0
  14. package/dist/src/generated/special-case-node-types/ObjectTypeProperty.js +74 -0
  15. package/dist/src/generated/special-case-node-types/Property.js +136 -0
  16. package/dist/src/generated/special-case-node-types/misc.js +158 -0
  17. package/dist/src/generated/special-case-node-types.js +69 -0
  18. package/dist/src/index.js +53 -0
  19. package/dist/src/transform/Errors.js +43 -0
  20. package/dist/src/transform/MutationContext.js +81 -0
  21. package/dist/src/transform/TransformContext.js +213 -0
  22. package/dist/src/transform/comments/comments.js +308 -0
  23. package/dist/src/transform/comments/prettier/common/util.js +364 -0
  24. package/dist/src/transform/comments/prettier/language-js/comments.js +788 -0
  25. package/dist/src/transform/comments/prettier/language-js/loc.js +42 -0
  26. package/dist/src/transform/comments/prettier/language-js/printer-estree.js +32 -0
  27. package/dist/src/transform/comments/prettier/language-js/utils.js +119 -0
  28. package/dist/src/transform/comments/prettier/main/comments.js +440 -0
  29. package/dist/src/transform/comments/prettier/utils/get-last.js +13 -0
  30. package/dist/src/transform/mutations/AddComments.js +43 -0
  31. package/dist/src/transform/mutations/CloneCommentsTo.js +31 -0
  32. package/dist/src/transform/mutations/InsertStatement.js +91 -0
  33. package/dist/src/transform/mutations/ModifyNodeInPlace.js +59 -0
  34. package/dist/src/transform/mutations/RemoveComment.js +78 -0
  35. package/dist/src/transform/mutations/RemoveNode.js +205 -0
  36. package/dist/src/transform/mutations/RemoveStatement.js +59 -0
  37. package/dist/src/transform/mutations/ReplaceNode.js +92 -0
  38. package/dist/src/transform/mutations/ReplaceStatementWithMany.js +79 -0
  39. package/dist/src/transform/mutations/utils/getStatementParent.js +143 -0
  40. package/dist/src/transform/mutations/utils/isValidModuleDeclarationParent.js +43 -0
  41. package/dist/src/transform/parse.js +56 -0
  42. package/dist/src/transform/print.js +134 -0
  43. package/dist/src/transform/transform.js +36 -0
  44. package/dist/src/transform/transformAST.js +134 -0
  45. package/dist/src/traverse/NodeEventGenerator.js +353 -0
  46. package/dist/src/traverse/SafeEmitter.js +52 -0
  47. package/dist/src/traverse/esquery.js +37 -0
  48. package/dist/src/traverse/traverse.js +150 -0
  49. package/dist/transform/comments/prettier/language-js/comments.js +29 -1
  50. package/dist/transform/mutations/utils/getStatementParent.js.flow +7 -5
  51. package/package.json +5 -5
@@ -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') {
@@ -164,6 +164,7 @@ export function deepCloneNode<T: ESNode>(
164
164
  node: T,
165
165
  newProps: {...},
166
166
  ): DetachedNode<T> {
167
+ // $FlowFixMe[unsafe-object-assign]
167
168
  const clone: DetachedNode<T> = Object.assign(
168
169
  JSON.parse(
169
170
  JSON.stringify(node, (key, value) => {
@@ -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
- attributes: (0, _detachedNode.asDetachedNodeForCodeGen)(props.attributes)
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
- +attributes?: ?MaybeDetachedNode<ImportExpressionType['attributes']>,
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
- attributes: asDetachedNodeForCodeGen(props.attributes),
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
+ }