hermes-transform 0.9.0 → 0.10.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.
Files changed (64) hide show
  1. package/dist/detachedNode.js +9 -27
  2. package/dist/detachedNode.js.flow +21 -34
  3. package/dist/generated/TransformCloneSignatures.js.flow +331 -316
  4. package/dist/generated/TransformModifySignatures.js.flow +171 -157
  5. package/dist/generated/TransformReplaceSignatures.js.flow +16 -2
  6. package/dist/generated/node-types.js +254 -60
  7. package/dist/generated/node-types.js.flow +258 -103
  8. package/dist/generated/special-case-node-types/Comment.js +36 -0
  9. package/dist/generated/special-case-node-types/Comment.js.flow +36 -0
  10. package/dist/generated/special-case-node-types/DeclareExportDeclaration.js +55 -0
  11. package/dist/generated/special-case-node-types/DeclareExportDeclaration.js.flow +97 -0
  12. package/dist/generated/special-case-node-types/ExportNamedDeclaration.js +42 -0
  13. package/dist/generated/special-case-node-types/ExportNamedDeclaration.js.flow +75 -0
  14. package/dist/generated/special-case-node-types/Literal.js +97 -0
  15. package/dist/generated/special-case-node-types/Literal.js.flow +139 -0
  16. package/dist/generated/special-case-node-types/ObjectTypeProperty.js +73 -0
  17. package/dist/generated/special-case-node-types/ObjectTypeProperty.js.flow +107 -0
  18. package/dist/generated/special-case-node-types/Property.js +136 -0
  19. package/dist/generated/special-case-node-types/Property.js.flow +237 -0
  20. package/dist/generated/special-case-node-types/misc.js +119 -0
  21. package/dist/generated/special-case-node-types/misc.js.flow +205 -0
  22. package/dist/generated/special-case-node-types.js +42 -174
  23. package/dist/generated/special-case-node-types.js.flow +7 -274
  24. package/dist/index.js +19 -3
  25. package/dist/index.js.flow +6 -2
  26. package/dist/transform/TransformContext.js +1 -1
  27. package/dist/transform/TransformContext.js.flow +2 -2
  28. package/dist/transform/comments/comments.js +11 -0
  29. package/dist/transform/comments/comments.js.flow +16 -1
  30. package/dist/transform/comments/prettier/main/comments.js +1 -1
  31. package/dist/transform/comments/prettier/main/comments.js.flow +2 -1
  32. package/dist/transform/mutations/InsertStatement.js +3 -3
  33. package/dist/transform/mutations/InsertStatement.js.flow +3 -3
  34. package/dist/transform/mutations/RemoveComment.js +3 -3
  35. package/dist/transform/mutations/RemoveComment.js.flow +3 -5
  36. package/dist/transform/mutations/RemoveNode.js +2 -2
  37. package/dist/transform/mutations/RemoveNode.js.flow +2 -2
  38. package/dist/transform/mutations/RemoveStatement.js +2 -2
  39. package/dist/transform/mutations/RemoveStatement.js.flow +2 -2
  40. package/dist/transform/mutations/ReplaceNode.js +4 -6
  41. package/dist/transform/mutations/ReplaceNode.js.flow +2 -3
  42. package/dist/transform/mutations/ReplaceStatementWithMany.js +2 -2
  43. package/dist/transform/mutations/ReplaceStatementWithMany.js.flow +2 -2
  44. package/dist/transform/mutations/utils/getStatementParent.js +3 -2
  45. package/dist/transform/mutations/utils/getStatementParent.js.flow +5 -2
  46. package/dist/transform/parse.js +55 -0
  47. package/dist/transform/parse.js.flow +55 -0
  48. package/dist/transform/print.js +160 -0
  49. package/dist/transform/print.js.flow +176 -0
  50. package/dist/transform/transform.js +6 -67
  51. package/dist/transform/transform.js.flow +6 -69
  52. package/dist/transform/{getTransformedAST.js → transformAST.js} +7 -31
  53. package/dist/transform/{getTransformedAST.js.flow → transformAST.js.flow} +8 -33
  54. package/dist/traverse/NodeEventGenerator.js +3 -3
  55. package/dist/traverse/NodeEventGenerator.js.flow +3 -3
  56. package/dist/traverse/traverse.js +36 -35
  57. package/dist/traverse/traverse.js.flow +45 -26
  58. package/package.json +5 -4
  59. package/dist/getVisitorKeys.js +0 -33
  60. package/dist/getVisitorKeys.js.flow +0 -31
  61. package/dist/transform/mutations/utils/arrayUtils.js +0 -43
  62. package/dist/transform/mutations/utils/arrayUtils.js.flow +0 -50
  63. package/dist/traverse/SimpleTraverser.js +0 -118
  64. package/dist/traverse/SimpleTraverser.js.flow +0 -112
@@ -0,0 +1,205 @@
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-local
8
+ * @format
9
+ */
10
+
11
+ import type {
12
+ ArrowFunctionExpression as ArrowFunctionExpressionType,
13
+ ClassDeclaration as ClassDeclarationType,
14
+ DeclareFunction as DeclareFunctionType,
15
+ ESNode,
16
+ FunctionTypeAnnotation as FunctionTypeAnnotationType,
17
+ Identifier as IdentifierType,
18
+ InterpreterDirective as InterpreterDirectiveType,
19
+ Token as TokenType,
20
+ Comment as CommentType,
21
+ TemplateElement as TemplateElementType,
22
+ Program as ProgramType,
23
+ DocblockMetadata as DocblockMetadataType,
24
+ } from 'hermes-estree';
25
+ import type {DetachedNode, MaybeDetachedNode} from '../../detachedNode';
26
+
27
+ import {
28
+ asDetachedNode,
29
+ detachedProps,
30
+ setParentPointersInDirectChildren,
31
+ } from '../../detachedNode';
32
+
33
+ /*********************************************************************
34
+ * this file should only contain one-off variant node type functions *
35
+ * if you are creating multiple variants for the same "type", then *
36
+ * put them in their own file to help keep things organised *
37
+ *********************************************************************/
38
+
39
+ // hermes adds an `id` prop which is always null, and it adds an `expression`
40
+ // boolean which is true when the body isn't a BlockStatement.
41
+ // No need to make consumers set these
42
+ export type ArrowFunctionExpressionProps = {
43
+ +params: $ReadOnlyArray<
44
+ MaybeDetachedNode<ArrowFunctionExpressionType['params'][number]>,
45
+ >,
46
+ +body: MaybeDetachedNode<ArrowFunctionExpressionType['body']>,
47
+ +typeParameters?: ?MaybeDetachedNode<
48
+ ArrowFunctionExpressionType['typeParameters'],
49
+ >,
50
+ +returnType?: ?MaybeDetachedNode<ArrowFunctionExpressionType['returnType']>,
51
+ +predicate?: ?MaybeDetachedNode<ArrowFunctionExpressionType['predicate']>,
52
+ +async: ArrowFunctionExpressionType['async'],
53
+ };
54
+ export function ArrowFunctionExpression(props: {
55
+ ...$ReadOnly<ArrowFunctionExpressionProps>,
56
+ +parent?: ESNode,
57
+ }): DetachedNode<ArrowFunctionExpressionType> {
58
+ const node = detachedProps<ArrowFunctionExpressionType>(props.parent, {
59
+ type: 'ArrowFunctionExpression',
60
+ id: null,
61
+ // $FlowExpectedError[incompatible-use]
62
+ expression: props.body.type !== 'BlockStatement',
63
+ params: props.params.map(n => asDetachedNode(n)),
64
+ body: asDetachedNode(props.body),
65
+ typeParameters: asDetachedNode(props.typeParameters),
66
+ returnType: asDetachedNode(props.returnType),
67
+ predicate: asDetachedNode(props.predicate),
68
+ async: props.async,
69
+ });
70
+ setParentPointersInDirectChildren(node);
71
+ return node;
72
+ }
73
+
74
+ export type ClassDeclarationProps = {
75
+ +id?: ?MaybeDetachedNode<ClassDeclarationType['id']>,
76
+ +typeParameters?: ?MaybeDetachedNode<ClassDeclarationType['typeParameters']>,
77
+ +superClass?: ?MaybeDetachedNode<ClassDeclarationType['superClass']>,
78
+ +superTypeParameters?: ?MaybeDetachedNode<
79
+ ClassDeclarationType['superTypeParameters'],
80
+ >,
81
+ // make this optional as it's rarer that people would want to include them
82
+ +implements?: $ReadOnlyArray<
83
+ MaybeDetachedNode<ClassDeclarationType['implements'][number]>,
84
+ >,
85
+ // make this optional as it's rarer that people would want to include them
86
+ +decorators?: $ReadOnlyArray<
87
+ MaybeDetachedNode<ClassDeclarationType['decorators'][number]>,
88
+ >,
89
+ +body: MaybeDetachedNode<ClassDeclarationType['body']>,
90
+ };
91
+ export function ClassDeclaration(props: {
92
+ ...$ReadOnly<ClassDeclarationProps>,
93
+ +parent?: ESNode,
94
+ }): DetachedNode<ClassDeclarationType> {
95
+ const node = detachedProps<ClassDeclarationType>(props.parent, {
96
+ type: 'ClassDeclaration',
97
+ id: asDetachedNode(props.id),
98
+ typeParameters: asDetachedNode(props.typeParameters),
99
+ superClass: asDetachedNode(props.superClass),
100
+ superTypeParameters: asDetachedNode(props.superTypeParameters),
101
+ decorators: (props.decorators ?? []).map(n => asDetachedNode(n)),
102
+ implements: (props.implements ?? []).map(n => asDetachedNode(n)),
103
+ body: asDetachedNode(props.body),
104
+ });
105
+ setParentPointersInDirectChildren(node);
106
+ return node;
107
+ }
108
+
109
+ // raw/cooked are on a subobject in the estree spec, but are flat on the hermes types
110
+ export type TemplateElementProps = {
111
+ +tail: TemplateElementType['tail'],
112
+ +cooked: TemplateElementType['value']['cooked'],
113
+ +raw: TemplateElementType['value']['raw'],
114
+ };
115
+ export function TemplateElement(props: {
116
+ ...$ReadOnly<TemplateElementProps>,
117
+ +parent?: ESNode,
118
+ }): DetachedNode<TemplateElementType> {
119
+ return detachedProps<TemplateElementType>(props.parent, {
120
+ type: 'TemplateElement',
121
+ tail: props.tail,
122
+ value: {
123
+ cooked: props.cooked,
124
+ raw: props.raw,
125
+ },
126
+ });
127
+ }
128
+
129
+ // Identifier has a bunch of stuff that usually you don't want to provide - so we have
130
+ // this manual def to allow us to default some values
131
+ export type IdentifierProps = {
132
+ +name: IdentifierType['name'],
133
+ +typeAnnotation?: ?MaybeDetachedNode<IdentifierType['typeAnnotation']>,
134
+ +optional?: IdentifierType['optional'],
135
+ };
136
+ export function Identifier(props: {
137
+ ...$ReadOnly<IdentifierProps>,
138
+ +parent?: ESNode,
139
+ }): DetachedNode<IdentifierType> {
140
+ const node = detachedProps<IdentifierType>(props.parent, {
141
+ type: 'Identifier',
142
+ name: props.name,
143
+ optional: props.optional ?? false,
144
+ typeAnnotation: asDetachedNode(props.typeAnnotation),
145
+ });
146
+ setParentPointersInDirectChildren(node);
147
+ return node;
148
+ }
149
+
150
+ export type ProgramProps = {
151
+ +sourceType: ProgramType['sourceType'],
152
+ +body: $ReadOnlyArray<MaybeDetachedNode<ProgramType['body'][number]>>,
153
+ +tokens: $ReadOnlyArray<MaybeDetachedNode<TokenType>>,
154
+ +comments: $ReadOnlyArray<MaybeDetachedNode<CommentType>>,
155
+ +interpreter: null | string,
156
+ +docblock: null | DocblockMetadataType,
157
+ };
158
+ export function Program(props: {
159
+ ...$ReadOnly<ProgramProps>,
160
+ }): DetachedNode<ProgramType> {
161
+ return detachedProps<ProgramType>(null, {
162
+ type: 'Program',
163
+ sourceType: props.sourceType,
164
+ body: props.body.map(n => asDetachedNode(n)),
165
+ tokens: props.tokens,
166
+ comments: props.comments,
167
+ interpreter:
168
+ props.interpreter != null
169
+ ? // $FlowFixMe[incompatible-call]
170
+ asDetachedNode<InterpreterDirectiveType>({
171
+ type: 'InterpreterDirective',
172
+ value: props.interpreter,
173
+ })
174
+ : null,
175
+ docblock: props.docblock,
176
+ });
177
+ }
178
+
179
+ // the type annotation is stored on the Identifier's typeAnnotation
180
+ // which is super awkward to work with and type - so we flatten the input
181
+ // and put it in the right spot after
182
+ export type DeclareFunctionProps = {
183
+ +name: string,
184
+ +functionType: MaybeDetachedNode<FunctionTypeAnnotationType>,
185
+ +predicate?: ?MaybeDetachedNode<DeclareFunctionType['predicate']>,
186
+ };
187
+ export function DeclareFunction(props: {
188
+ ...$ReadOnly<DeclareFunctionProps>,
189
+ +parent?: ESNode,
190
+ }): DetachedNode<DeclareFunctionType> {
191
+ const node = detachedProps<DeclareFunctionType>(props.parent, {
192
+ type: 'DeclareFunction',
193
+ id: detachedProps(null, {
194
+ type: 'Identifier',
195
+ name: props.name,
196
+ typeAnnotation: detachedProps(null, {
197
+ type: 'TypeAnnotation',
198
+ typeAnnotation: asDetachedNode(props.functionType),
199
+ }),
200
+ }),
201
+ predicate: asDetachedNode(props.predicate),
202
+ });
203
+ setParentPointersInDirectChildren(node);
204
+ return node;
205
+ }
@@ -3,191 +3,59 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.ArrowFunctionExpression = ArrowFunctionExpression;
7
- exports.BigIntLiteral = BigIntLiteral;
8
- exports.BlockComment = BlockComment;
9
- exports.BooleanLiteral = BooleanLiteral;
10
- exports.ClassDeclaration = ClassDeclaration;
11
- exports.Identifier = Identifier;
12
- exports.LineComment = LineComment;
13
- exports.NullLiteral = NullLiteral;
14
- exports.NumericLiteral = NumericLiteral;
15
- exports.RegExpLiteral = RegExpLiteral;
16
- exports.StringLiteral = StringLiteral;
17
- exports.TemplateElement = TemplateElement;
18
6
 
19
- var _detachedNode = require("../detachedNode");
7
+ var _Comment = require("./special-case-node-types/Comment");
20
8
 
21
- /**
22
- * Copyright (c) Meta Platforms, Inc. and affiliates.
23
- *
24
- * This source code is licensed under the MIT license found in the
25
- * LICENSE file in the root directory of this source tree.
26
- *
27
- *
28
- * @format
29
- */
30
-
31
- /*
32
- These are a number of special-case node creation functions that we can't auto-generate.
33
- The list of exported functions here must be kept in sync with the `NODES_WITH_SPECIAL_HANDLING`
34
- list in `scripts/genTransformNodeTypes` to ensure there's no duplicates
35
- */
36
- function ArrowFunctionExpression(props) {
37
- const node = (0, _detachedNode.detachedProps)(props.parent, {
38
- type: 'ArrowFunctionExpression',
39
- id: null,
40
- // $FlowExpectedError[incompatible-use]
41
- expression: props.body.type !== 'BlockStatement',
42
- params: props.params.map(n => (0, _detachedNode.asDetachedNode)(n)),
43
- body: (0, _detachedNode.asDetachedNode)(props.body),
44
- typeParameters: (0, _detachedNode.asDetachedNode)(props.typeParameters),
45
- returnType: (0, _detachedNode.asDetachedNode)(props.returnType),
46
- predicate: (0, _detachedNode.asDetachedNode)(props.predicate),
47
- async: props.async
48
- });
49
- (0, _detachedNode.setParentPointersInDirectChildren)(node);
50
- return node;
51
- }
52
-
53
- function ClassDeclaration(props) {
54
- var _props$decorators, _props$implements;
55
-
56
- const node = (0, _detachedNode.detachedProps)(props.parent, {
57
- type: 'ClassDeclaration',
58
- id: (0, _detachedNode.asDetachedNode)(props.id),
59
- typeParameters: (0, _detachedNode.asDetachedNode)(props.typeParameters),
60
- superClass: (0, _detachedNode.asDetachedNode)(props.superClass),
61
- superTypeParameters: (0, _detachedNode.asDetachedNode)(props.superTypeParameters),
62
- decorators: ((_props$decorators = props.decorators) != null ? _props$decorators : []).map(n => (0, _detachedNode.asDetachedNode)(n)),
63
- implements: ((_props$implements = props.implements) != null ? _props$implements : []).map(n => (0, _detachedNode.asDetachedNode)(n)),
64
- body: (0, _detachedNode.asDetachedNode)(props.body)
65
- });
66
- (0, _detachedNode.setParentPointersInDirectChildren)(node);
67
- return node;
68
- } // pattern/flags are on a subobject in the estree spec, but are flat on the hermes types
69
- // also the value is supposed to be a RegExp instance
70
-
71
-
72
- function RegExpLiteral(props) {
73
- const value = new RegExp(props.pattern, props.flags);
74
- return (0, _detachedNode.detachedProps)(props.parent, {
75
- type: 'Literal',
76
- value,
77
- raw: value.toString(),
78
- regex: {
79
- pattern: props.pattern,
80
- flags: props.flags
81
- }
82
- });
83
- } // raw/cooked are on a subobject in the estree spec, but are flat on the hermes types
84
-
85
-
86
- function TemplateElement(props) {
87
- return (0, _detachedNode.detachedProps)(props.parent, {
88
- type: 'TemplateElement',
89
- tail: props.tail,
90
- value: {
91
- cooked: props.cooked,
92
- raw: props.raw
93
- }
94
- });
95
- } // Identifier has a bunch of stuff that usually you don't want to provide - so we have
96
- // this manual def to allow us to default some values
97
-
98
-
99
- function Identifier(props) {
100
- var _props$optional;
101
-
102
- const node = (0, _detachedNode.detachedProps)(props.parent, {
103
- type: 'Identifier',
104
- name: props.name,
105
- optional: (_props$optional = props.optional) != null ? _props$optional : false,
106
- typeAnnotation: (0, _detachedNode.asDetachedNode)(props.typeAnnotation)
107
- });
108
- (0, _detachedNode.setParentPointersInDirectChildren)(node);
109
- return node;
110
- } //
111
- // Literals require a "raw" which is added by the estree transform, not hermes.
112
- //
9
+ Object.keys(_Comment).forEach(function (key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ if (key in exports && exports[key] === _Comment[key]) return;
12
+ exports[key] = _Comment[key];
13
+ });
113
14
 
15
+ var _DeclareExportDeclaration = require("./special-case-node-types/DeclareExportDeclaration");
114
16
 
115
- function BigIntLiteral(props) {
116
- var _props$raw;
17
+ Object.keys(_DeclareExportDeclaration).forEach(function (key) {
18
+ if (key === "default" || key === "__esModule") return;
19
+ if (key in exports && exports[key] === _DeclareExportDeclaration[key]) return;
20
+ exports[key] = _DeclareExportDeclaration[key];
21
+ });
117
22
 
118
- const node = (0, _detachedNode.detachedProps)(props.parent, {
119
- type: 'Literal',
120
- value: props.value,
121
- raw: (_props$raw = props.raw) != null ? _props$raw : `${props.value}n`,
122
- bigint: `${props.value}`
123
- });
124
- (0, _detachedNode.setParentPointersInDirectChildren)(node);
125
- return node;
126
- }
23
+ var _ExportNamedDeclaration = require("./special-case-node-types/ExportNamedDeclaration");
127
24
 
128
- function BooleanLiteral(props) {
129
- return (0, _detachedNode.detachedProps)(props.parent, {
130
- type: 'Literal',
131
- raw: props.value ? 'true' : 'false',
132
- value: props.value
133
- });
134
- }
25
+ Object.keys(_ExportNamedDeclaration).forEach(function (key) {
26
+ if (key === "default" || key === "__esModule") return;
27
+ if (key in exports && exports[key] === _ExportNamedDeclaration[key]) return;
28
+ exports[key] = _ExportNamedDeclaration[key];
29
+ });
135
30
 
136
- function NumericLiteral(props) {
137
- var _props$raw2;
31
+ var _Literal = require("./special-case-node-types/Literal");
138
32
 
139
- return (0, _detachedNode.detachedProps)(props.parent, {
140
- type: 'Literal',
141
- value: props.value,
142
- raw: (_props$raw2 = props.raw) != null ? _props$raw2 : `${props.value}`
143
- });
144
- }
33
+ Object.keys(_Literal).forEach(function (key) {
34
+ if (key === "default" || key === "__esModule") return;
35
+ if (key in exports && exports[key] === _Literal[key]) return;
36
+ exports[key] = _Literal[key];
37
+ });
145
38
 
146
- function NullLiteral(props = { ...null
147
- }) {
148
- return (0, _detachedNode.detachedProps)(props.parent, {
149
- type: 'Literal',
150
- value: null,
151
- raw: 'null'
152
- });
153
- }
39
+ var _ObjectTypeProperty = require("./special-case-node-types/ObjectTypeProperty");
154
40
 
155
- function StringLiteral(props) {
156
- const hasSingleQuote = props.value.includes('"');
157
- const hasDoubleQuote = props.value.includes("'");
158
- let raw = props.raw;
41
+ Object.keys(_ObjectTypeProperty).forEach(function (key) {
42
+ if (key === "default" || key === "__esModule") return;
43
+ if (key in exports && exports[key] === _ObjectTypeProperty[key]) return;
44
+ exports[key] = _ObjectTypeProperty[key];
45
+ });
159
46
 
160
- if (raw == null) {
161
- if (hasSingleQuote && hasDoubleQuote) {
162
- raw = `'${props.value.replace(/'/g, "\\'")}'`;
163
- } else if (hasSingleQuote) {
164
- raw = `"${props.value}"`;
165
- } else {
166
- raw = `'${props.value}'`;
167
- }
168
- }
47
+ var _misc = require("./special-case-node-types/misc");
169
48
 
170
- return (0, _detachedNode.detachedProps)(props.parent, {
171
- type: 'Literal',
172
- raw,
173
- value: props.value
174
- });
175
- }
49
+ Object.keys(_misc).forEach(function (key) {
50
+ if (key === "default" || key === "__esModule") return;
51
+ if (key in exports && exports[key] === _misc[key]) return;
52
+ exports[key] = _misc[key];
53
+ });
176
54
 
177
- function LineComment(props) {
178
- // $FlowExpectedError[prop-missing]
179
- // $FlowExpectedError[incompatible-return]
180
- return (0, _detachedNode.detachedProps)(undefined, {
181
- type: 'Line',
182
- value: props.value
183
- });
184
- }
55
+ var _Property = require("./special-case-node-types/Property");
185
56
 
186
- function BlockComment(props) {
187
- // $FlowExpectedError[prop-missing]
188
- // $FlowExpectedError[incompatible-return]
189
- return (0, _detachedNode.detachedProps)(undefined, {
190
- type: 'Block',
191
- value: props.value
192
- });
193
- }
57
+ Object.keys(_Property).forEach(function (key) {
58
+ if (key === "default" || key === "__esModule") return;
59
+ if (key in exports && exports[key] === _Property[key]) return;
60
+ exports[key] = _Property[key];
61
+ });