hermes-transform 0.8.0 → 0.10.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 (65) hide show
  1. package/ESLINT_LICENCE +19 -0
  2. package/PRETTIER_LICENCE +7 -0
  3. package/dist/detachedNode.js +100 -42
  4. package/dist/detachedNode.js.flow +116 -41
  5. package/dist/generated/TransformCloneSignatures.js.flow +18 -0
  6. package/dist/generated/TransformModifySignatures.js.flow +1127 -0
  7. package/dist/generated/TransformReplaceSignatures.js.flow +15 -1
  8. package/dist/generated/node-types.js +852 -883
  9. package/dist/generated/node-types.js.flow +1187 -1217
  10. package/dist/generated/special-case-node-types/Comment.js +36 -0
  11. package/dist/generated/special-case-node-types/Comment.js.flow +36 -0
  12. package/dist/generated/special-case-node-types/DeclareExportDeclaration.js +55 -0
  13. package/dist/generated/special-case-node-types/DeclareExportDeclaration.js.flow +97 -0
  14. package/dist/generated/special-case-node-types/ExportNamedDeclaration.js +42 -0
  15. package/dist/generated/special-case-node-types/ExportNamedDeclaration.js.flow +75 -0
  16. package/dist/generated/special-case-node-types/Literal.js +97 -0
  17. package/dist/generated/special-case-node-types/Literal.js.flow +139 -0
  18. package/dist/generated/special-case-node-types/ObjectTypeProperty.js +73 -0
  19. package/dist/generated/special-case-node-types/ObjectTypeProperty.js.flow +107 -0
  20. package/dist/generated/special-case-node-types/Property.js +136 -0
  21. package/dist/generated/special-case-node-types/Property.js.flow +237 -0
  22. package/dist/generated/special-case-node-types/misc.js +119 -0
  23. package/dist/generated/special-case-node-types/misc.js.flow +205 -0
  24. package/dist/generated/special-case-node-types.js +42 -180
  25. package/dist/generated/special-case-node-types.js.flow +7 -258
  26. package/dist/index.js +19 -3
  27. package/dist/index.js.flow +6 -2
  28. package/dist/transform/TransformContext.js +34 -11
  29. package/dist/transform/TransformContext.js.flow +90 -33
  30. package/dist/transform/comments/comments.js +34 -5
  31. package/dist/transform/comments/comments.js.flow +39 -4
  32. package/dist/transform/comments/prettier/main/comments.js +1 -1
  33. package/dist/transform/comments/prettier/main/comments.js.flow +2 -1
  34. package/dist/transform/mutations/InsertStatement.js +4 -3
  35. package/dist/transform/mutations/InsertStatement.js.flow +4 -3
  36. package/dist/transform/mutations/RemoveComment.js +3 -3
  37. package/dist/transform/mutations/RemoveComment.js.flow +3 -5
  38. package/dist/transform/mutations/RemoveNode.js +2 -2
  39. package/dist/transform/mutations/RemoveNode.js.flow +2 -2
  40. package/dist/transform/mutations/RemoveStatement.js +2 -2
  41. package/dist/transform/mutations/RemoveStatement.js.flow +2 -2
  42. package/dist/transform/mutations/ReplaceNode.js +10 -7
  43. package/dist/transform/mutations/ReplaceNode.js.flow +7 -5
  44. package/dist/transform/mutations/ReplaceStatementWithMany.js +2 -2
  45. package/dist/transform/mutations/ReplaceStatementWithMany.js.flow +7 -4
  46. package/dist/transform/mutations/utils/getStatementParent.js +3 -2
  47. package/dist/transform/mutations/utils/getStatementParent.js.flow +5 -2
  48. package/dist/transform/parse.js +55 -0
  49. package/dist/transform/parse.js.flow +55 -0
  50. package/dist/transform/print.js +160 -0
  51. package/dist/transform/print.js.flow +176 -0
  52. package/dist/transform/transform.js +6 -67
  53. package/dist/transform/transform.js.flow +6 -69
  54. package/dist/transform/{getTransformedAST.js → transformAST.js} +7 -16
  55. package/dist/transform/{getTransformedAST.js.flow → transformAST.js.flow} +7 -14
  56. package/dist/traverse/NodeEventGenerator.js.flow +1 -1
  57. package/dist/traverse/traverse.js +36 -35
  58. package/dist/traverse/traverse.js.flow +46 -27
  59. package/package.json +10 -5
  60. package/dist/getVisitorKeys.js +0 -33
  61. package/dist/getVisitorKeys.js.flow +0 -31
  62. package/dist/transform/mutations/utils/arrayUtils.js +0 -43
  63. package/dist/transform/mutations/utils/arrayUtils.js.flow +0 -50
  64. package/dist/traverse/SimpleTraverser.js +0 -118
  65. package/dist/traverse/SimpleTraverser.js.flow +0 -112
@@ -14,261 +14,10 @@ The list of exported functions here must be kept in sync with the `NODES_WITH_SP
14
14
  list in `scripts/genTransformNodeTypes` to ensure there's no duplicates
15
15
  */
16
16
 
17
- import type {
18
- ESNode,
19
- ArrowFunctionExpression as ArrowFunctionExpressionType,
20
- RegExpLiteral as RegExpLiteralType,
21
- TemplateElement as TemplateElementType,
22
- Identifier as IdentifierType,
23
- BigIntLiteral as BigIntLiteralType,
24
- BooleanLiteral as BooleanLiteralType,
25
- NumericLiteral as NumericLiteralType,
26
- NullLiteral as NullLiteralType,
27
- StringLiteral as StringLiteralType,
28
- LineComment as LineCommentType,
29
- BlockComment as BlockCommentType,
30
- } from 'hermes-estree';
31
- import type {DetachedNode} from '../detachedNode';
32
-
33
- import {
34
- detachedProps,
35
- setParentPointersInDirectChildren,
36
- } from '../detachedNode';
37
-
38
- // hermes adds an `id` prop which is always null, and it adds an `expression`
39
- // boolean which is true when the body isn't a BlockStatement.
40
- // No need to make consumers set these
41
- export type ArrowFunctionExpressionProps = {
42
- +params: $ReadOnlyArray<
43
- DetachedNode<ArrowFunctionExpressionType['params'][number]>,
44
- >,
45
- +body: DetachedNode<ArrowFunctionExpressionType['body']>,
46
- +typeParameters?: ?DetachedNode<
47
- ArrowFunctionExpressionType['typeParameters'],
48
- >,
49
- +returnType?: ?DetachedNode<ArrowFunctionExpressionType['returnType']>,
50
- +predicate?: ?DetachedNode<ArrowFunctionExpressionType['predicate']>,
51
- +async: ArrowFunctionExpressionType['async'],
52
- };
53
- export function ArrowFunctionExpression({
54
- parent,
55
- ...props
56
- }: {
57
- ...$ReadOnly<ArrowFunctionExpressionProps>,
58
- +parent?: ESNode,
59
- }): DetachedNode<ArrowFunctionExpressionType> {
60
- const node = detachedProps<ArrowFunctionExpressionType>(parent, {
61
- type: 'ArrowFunctionExpression',
62
- id: null,
63
- // $FlowExpectedError[incompatible-use]
64
- expression: props.body.type !== 'BlockStatement',
65
- ...props,
66
- });
67
- setParentPointersInDirectChildren(node);
68
- return node;
69
- }
70
-
71
- // pattern/flags are on a subobject in the estree spec, but are flat on the hermes types
72
- // also the value is supposed to be a RegExp instance
73
- export type RegExpLiteralProps = {
74
- +pattern: RegExpLiteralType['regex']['pattern'],
75
- +flags: RegExpLiteralType['regex']['flags'],
76
- };
77
- export function RegExpLiteral({
78
- pattern,
79
- flags,
80
- parent,
81
- }: {
82
- ...$ReadOnly<RegExpLiteralProps>,
83
- +parent?: ESNode,
84
- }): DetachedNode<RegExpLiteralType> {
85
- const value = new RegExp(pattern, flags);
86
- return detachedProps<RegExpLiteralType>(parent, {
87
- type: 'Literal',
88
- value,
89
- raw: value.toString(),
90
- regex: {
91
- pattern,
92
- flags,
93
- },
94
- });
95
- }
96
-
97
- // raw/cooked are on a subobject in the estree spec, but are flat on the hermes types
98
- export type TemplateElementProps = {
99
- +tail: TemplateElementType['tail'],
100
- +cooked: TemplateElementType['value']['cooked'],
101
- +raw: TemplateElementType['value']['raw'],
102
- };
103
- export function TemplateElement({
104
- tail,
105
- parent,
106
- ...value
107
- }: {
108
- ...$ReadOnly<TemplateElementProps>,
109
- +parent?: ESNode,
110
- }): DetachedNode<TemplateElementType> {
111
- return detachedProps<TemplateElementType>(parent, {
112
- type: 'TemplateElement',
113
- tail,
114
- value,
115
- });
116
- }
117
-
118
- // Identifier has a bunch of stuff that usually you don't want to provide - so we have
119
- // this manual def to allow us to default some values
120
- export type IdentifierProps = {
121
- +name: IdentifierType['name'],
122
- +typeAnnotation?: ?DetachedNode<IdentifierType['typeAnnotation']>,
123
- +optional?: IdentifierType['optional'],
124
- };
125
- export function Identifier({
126
- parent,
127
- optional = false,
128
- typeAnnotation = null,
129
- ...props
130
- }: {
131
- ...$ReadOnly<IdentifierProps>,
132
- +parent?: ESNode,
133
- }): DetachedNode<IdentifierType> {
134
- const node = detachedProps<IdentifierType>(parent, {
135
- type: 'Identifier',
136
- optional,
137
- typeAnnotation,
138
- ...props,
139
- });
140
- setParentPointersInDirectChildren(node);
141
- return node;
142
- }
143
-
144
- //
145
- // Literals require a "raw" which is added by the estree transform, not hermes.
146
- //
147
-
148
- export type BigIntLiteralProps = {
149
- +value: $FlowFixMe /* bigint | null */,
150
- /**
151
- * Only set this if you want to use a source-code representation like 1_1n, etc.
152
- * By default "raw" will just be the exact number you've given.
153
- */
154
- +raw?: NumericLiteralType['raw'],
155
- };
156
- export function BigIntLiteral({
157
- parent,
158
- ...props
159
- }: {
160
- ...$ReadOnly<BigIntLiteralProps>,
161
- +parent?: ESNode,
162
- }): DetachedNode<BigIntLiteralType> {
163
- const node = detachedProps<BigIntLiteralType>(parent, {
164
- type: 'Literal',
165
- ...props,
166
- raw: props.raw ?? `${props.value}n`,
167
- bigint: `${props.value}`,
168
- });
169
- setParentPointersInDirectChildren(node);
170
- return node;
171
- }
172
-
173
- export type BooleanLiteralProps = {
174
- +value: BooleanLiteralType['value'],
175
- };
176
- export function BooleanLiteral({
177
- parent,
178
- value,
179
- }: {
180
- ...$ReadOnly<BooleanLiteralProps>,
181
- +parent?: ESNode,
182
- }): DetachedNode<BooleanLiteralType> {
183
- return detachedProps<BooleanLiteralType>(parent, {
184
- type: 'Literal',
185
- raw: value ? 'true' : 'false',
186
- value,
187
- });
188
- }
189
-
190
- export type NumericLiteralProps = {
191
- +value: NumericLiteralType['value'],
192
- /**
193
- * Only set this if you want to use a source-code representation like 1e100, 0x11, 1_1, etc.
194
- * By default "raw" will just be the exact number you've given.
195
- */
196
- +raw?: NumericLiteralType['raw'],
197
- };
198
- export function NumericLiteral({
199
- parent,
200
- ...props
201
- }: {
202
- ...$ReadOnly<NumericLiteralProps>,
203
- +parent?: ESNode,
204
- }): DetachedNode<NumericLiteralType> {
205
- return detachedProps<NumericLiteralType>(parent, {
206
- type: 'Literal',
207
- ...props,
208
- raw: props.raw ?? `${props.value}`,
209
- });
210
- }
211
-
212
- export type NullLiteralProps = {};
213
- export function NullLiteral({
214
- parent,
215
- }: {
216
- +parent?: ESNode,
217
- } = {}): DetachedNode<NullLiteralType> {
218
- return detachedProps<NullLiteralType>(parent, {
219
- type: 'Literal',
220
- value: null,
221
- raw: 'null',
222
- });
223
- }
224
-
225
- export type StringLiteralProps = {
226
- +value: StringLiteralType['value'],
227
- +raw?: StringLiteralType['raw'],
228
- };
229
- export function StringLiteral({
230
- parent,
231
- raw: rawIn,
232
- value,
233
- }: {
234
- ...$ReadOnly<StringLiteralProps>,
235
- +parent?: ESNode,
236
- }): DetachedNode<StringLiteralType> {
237
- const hasSingleQuote = value.includes('"');
238
- const hasDoubleQuote = value.includes("'");
239
- let raw = rawIn;
240
- if (raw == null) {
241
- if (hasSingleQuote && hasDoubleQuote) {
242
- raw = `'${value.replace(/'/g, "\\'")}'`;
243
- } else if (hasSingleQuote) {
244
- raw = `"${value}"`;
245
- } else {
246
- raw = `'${value}'`;
247
- }
248
- }
249
- return detachedProps<StringLiteralType>(parent, {
250
- type: 'Literal',
251
- raw,
252
- value,
253
- });
254
- }
255
-
256
- export type LineCommentProps = {+value: string};
257
- export function LineComment({value}: LineCommentProps): LineCommentType {
258
- // $FlowExpectedError[prop-missing]
259
- // $FlowExpectedError[incompatible-return]
260
- return detachedProps<LineCommentType>(undefined, {
261
- type: 'Line',
262
- value,
263
- });
264
- }
265
-
266
- export type BlockCommentProps = {+value: string};
267
- export function BlockComment({value}: BlockCommentProps): BlockCommentType {
268
- // $FlowExpectedError[prop-missing]
269
- // $FlowExpectedError[incompatible-return]
270
- return detachedProps<BlockCommentType>(undefined, {
271
- type: 'Block',
272
- value,
273
- });
274
- }
17
+ export * from './special-case-node-types/Comment';
18
+ export * from './special-case-node-types/DeclareExportDeclaration';
19
+ export * from './special-case-node-types/ExportNamedDeclaration';
20
+ export * from './special-case-node-types/Literal';
21
+ export * from './special-case-node-types/ObjectTypeProperty';
22
+ export * from './special-case-node-types/misc';
23
+ export * from './special-case-node-types/Property';
package/dist/index.js CHANGED
@@ -12,11 +12,11 @@
12
12
  Object.defineProperty(exports, "__esModule", {
13
13
  value: true
14
14
  });
15
- exports.traverseWithContext = exports.traverse = exports.transform = exports.t = exports.SimpleTraverser = void 0;
15
+ exports.traverseWithContext = exports.traverse = exports.transform = exports.t = exports.print = exports.parse = exports.cloneJSDocCommentsToNewNode = exports.asDetachedNode = exports.SimpleTraverser = void 0;
16
16
 
17
- var _SimpleTraverser = require("./traverse/SimpleTraverser");
17
+ var _hermesParser = require("hermes-parser");
18
18
 
19
- exports.SimpleTraverser = _SimpleTraverser.SimpleTraverser;
19
+ exports.SimpleTraverser = _hermesParser.SimpleTraverser;
20
20
 
21
21
  var _traverse = require("./traverse/traverse");
22
22
 
@@ -27,10 +27,26 @@ var _transform = require("./transform/transform");
27
27
 
28
28
  exports.transform = _transform.transform;
29
29
 
30
+ var _parse = require("./transform/parse");
31
+
32
+ exports.parse = _parse.parse;
33
+
34
+ var _print = require("./transform/print");
35
+
36
+ exports.print = _print.print;
37
+
30
38
  var _t = _interopRequireWildcard(require("./generated/node-types"));
31
39
 
32
40
  exports.t = _t;
33
41
 
42
+ var _detachedNode = require("./detachedNode");
43
+
44
+ exports.asDetachedNode = _detachedNode.asDetachedNode;
45
+
46
+ var _comments = require("./transform/comments/comments");
47
+
48
+ exports.cloneJSDocCommentsToNewNode = _comments.cloneJSDocCommentsToNewNode;
49
+
34
50
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
35
51
 
36
52
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -13,9 +13,13 @@
13
13
  export type {TraversalContextBase, Visitor} from './traverse/traverse';
14
14
  export type {TransformVisitor} from './transform/transform';
15
15
  export type {TransformContext} from './transform/TransformContext';
16
- export type {DetachedNode} from './detachedNode';
16
+ export type {DetachedNode, MaybeDetachedNode} from './detachedNode';
17
17
 
18
- export {SimpleTraverser} from './traverse/SimpleTraverser';
18
+ export {SimpleTraverser} from 'hermes-parser';
19
19
  export {traverse, traverseWithContext} from './traverse/traverse';
20
20
  export {transform} from './transform/transform';
21
+ export {parse} from './transform/parse';
22
+ export {print} from './transform/print';
21
23
  export * as t from './generated/node-types';
24
+ export {asDetachedNode} from './detachedNode';
25
+ export {cloneJSDocCommentsToNewNode} from './transform/comments/comments';
@@ -52,10 +52,9 @@ function getTransformContext() {
52
52
  return null;
53
53
  }
54
54
 
55
- return (0, _detachedNode.shallowCloneNode)(node);
55
+ return (0, _detachedNode.shallowCloneNode)(node, {});
56
56
  },
57
- // $FlowExpectedError[incompatible-exact]
58
- shallowCloneNodeWithOverrides: (node, newProps) => {
57
+ shallowCloneNodeWithOverrides: (node, newProps = {}) => {
59
58
  if (node == null) {
60
59
  return null;
61
60
  }
@@ -67,17 +66,23 @@ function getTransformContext() {
67
66
  return null;
68
67
  }
69
68
 
70
- return nodes.map(node => (0, _detachedNode.shallowCloneNode)(node));
69
+ return nodes.map(node => {
70
+ if (node == null) {
71
+ // $FlowExpectedError[incompatible-return]
72
+ return node;
73
+ }
74
+
75
+ return (0, _detachedNode.shallowCloneNode)(node, {});
76
+ });
71
77
  },
72
78
  deepCloneNode: node => {
73
79
  if (node == null) {
74
80
  return null;
75
81
  }
76
82
 
77
- return (0, _detachedNode.deepCloneNode)(node);
83
+ return (0, _detachedNode.deepCloneNode)(node, {});
78
84
  },
79
- // $FlowExpectedError[incompatible-exact]
80
- deepCloneNodeWithOverrides: (node, newProps) => {
85
+ deepCloneNodeWithOverrides: (node, newProps = {}) => {
81
86
  if (node == null) {
82
87
  return null;
83
88
  }
@@ -130,10 +135,14 @@ function getTransformContext() {
130
135
  };
131
136
  const insertAPIs = {
132
137
  insertAfterStatement: (target, nodesToInsert) => {
133
- pushMutation((0, _InsertStatement.createInsertStatementMutation)('after', target, toArray(nodesToInsert)));
138
+ pushMutation((0, _InsertStatement.createInsertStatementMutation)('after', target, toArray(nodesToInsert).map(n => (0, _detachedNode.asDetachedNode)(n, {
139
+ useDeepClone: true
140
+ }))));
134
141
  },
135
142
  insertBeforeStatement: (target, nodesToInsert) => {
136
- pushMutation((0, _InsertStatement.createInsertStatementMutation)('before', target, toArray(nodesToInsert)));
143
+ pushMutation((0, _InsertStatement.createInsertStatementMutation)('before', target, toArray(nodesToInsert).map(n => (0, _detachedNode.asDetachedNode)(n, {
144
+ useDeepClone: true
145
+ }))));
137
146
  }
138
147
  };
139
148
  const removeAPIs = {
@@ -146,10 +155,23 @@ function getTransformContext() {
146
155
  };
147
156
  const replaceAPIs = {
148
157
  replaceNode: (target, nodeToReplaceWith, options) => {
149
- pushMutation((0, _ReplaceNode.createReplaceNodeMutation)(target, nodeToReplaceWith, options));
158
+ pushMutation((0, _ReplaceNode.createReplaceNodeMutation)(target, (0, _detachedNode.asDetachedNode)(nodeToReplaceWith), options));
150
159
  },
151
160
  replaceStatementWithMany: (target, nodesToReplaceWith, options) => {
152
- pushMutation((0, _ReplaceStatementWithMany.createReplaceStatementWithManyMutation)(target, nodesToReplaceWith, options));
161
+ pushMutation((0, _ReplaceStatementWithMany.createReplaceStatementWithManyMutation)(target, nodesToReplaceWith.map(n => (0, _detachedNode.asDetachedNode)(n)), options));
162
+ }
163
+ };
164
+ const modifyAPIs = {
165
+ modifyNodeInPlace: (node, newProps = {}, options) => {
166
+ if (node == null) {
167
+ return;
168
+ }
169
+
170
+ const cloned = (0, _detachedNode.shallowCloneNode)(node, newProps, {
171
+ preserveLocation: true
172
+ }); // $FlowExpectedError[incompatible-call]
173
+
174
+ replaceAPIs.replaceNode(node, cloned, options);
153
175
  }
154
176
  };
155
177
  return {
@@ -163,6 +185,7 @@ function getTransformContext() {
163
185
  ...cloneAPIs,
164
186
  ...commentAPIs,
165
187
  ...insertAPIs,
188
+ ...modifyAPIs,
166
189
  ...removeAPIs,
167
190
  ...replaceAPIs
168
191
  };