flow-parser 0.318.0 → 0.320.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 (103) hide show
  1. package/flow_parser.js +9498 -9488
  2. package/oxidized/FlowParser.js +249 -0
  3. package/oxidized/FlowParser.js.flow +457 -0
  4. package/oxidized/FlowParserDeserializer.js +209 -0
  5. package/oxidized/FlowParserDeserializer.js.flow +323 -0
  6. package/oxidized/FlowParserNodeDeserializers.js +1781 -0
  7. package/oxidized/FlowParserNodeDeserializers.js.flow +18 -0
  8. package/oxidized/FlowParserWASM.js +1 -0
  9. package/oxidized/FlowParserWASM.js.flow +119 -0
  10. package/oxidized/HermesAST.js.flow +57 -0
  11. package/oxidized/HermesParserDecodeUTF8String.js +45 -0
  12. package/oxidized/HermesParserDecodeUTF8String.js.flow +65 -0
  13. package/oxidized/ParserOptions.js +8 -0
  14. package/oxidized/ParserOptions.js.flow +55 -0
  15. package/oxidized/babel/TransformESTreeToBabel.js +1063 -0
  16. package/oxidized/babel/TransformESTreeToBabel.js.flow +1357 -0
  17. package/oxidized/estree/StripFlowTypes.js +158 -0
  18. package/oxidized/estree/StripFlowTypes.js.flow +158 -0
  19. package/oxidized/estree/StripFlowTypesForBabel.js +191 -0
  20. package/oxidized/estree/StripFlowTypesForBabel.js.flow +238 -0
  21. package/oxidized/estree/TransformComponentSyntax.js +764 -0
  22. package/oxidized/estree/TransformComponentSyntax.js.flow +882 -0
  23. package/oxidized/estree/TransformEnumSyntax.js +92 -0
  24. package/oxidized/estree/TransformEnumSyntax.js.flow +125 -0
  25. package/oxidized/estree/TransformMatchSyntax.js +990 -0
  26. package/oxidized/estree/TransformMatchSyntax.js.flow +991 -0
  27. package/oxidized/estree/TransformRecordSyntax.js +283 -0
  28. package/oxidized/estree/TransformRecordSyntax.js.flow +310 -0
  29. package/oxidized/generated/ESTreeVisitorKeys.js +234 -0
  30. package/oxidized/generated/ESTreeVisitorKeys.js.flow +22 -0
  31. package/oxidized/getModuleDocblock.js +87 -0
  32. package/oxidized/getModuleDocblock.js.flow +119 -0
  33. package/oxidized/index.js +220 -0
  34. package/oxidized/index.js.flow +183 -0
  35. package/oxidized/oxidized-src/FlowParser.js +249 -0
  36. package/oxidized/oxidized-src/FlowParserDeserializer.js +209 -0
  37. package/oxidized/oxidized-src/FlowParserNodeDeserializers.js +1781 -0
  38. package/oxidized/oxidized-src/HermesParserDecodeUTF8String.js +45 -0
  39. package/oxidized/oxidized-src/ParserOptions.js +8 -0
  40. package/oxidized/oxidized-src/babel/TransformESTreeToBabel.js +1063 -0
  41. package/oxidized/oxidized-src/estree/StripFlowTypes.js +158 -0
  42. package/oxidized/oxidized-src/estree/StripFlowTypesForBabel.js +191 -0
  43. package/oxidized/oxidized-src/estree/TransformComponentSyntax.js +764 -0
  44. package/oxidized/oxidized-src/estree/TransformEnumSyntax.js +92 -0
  45. package/oxidized/oxidized-src/estree/TransformMatchSyntax.js +990 -0
  46. package/oxidized/oxidized-src/estree/TransformRecordSyntax.js +283 -0
  47. package/oxidized/oxidized-src/generated/ESTreeVisitorKeys.js +234 -0
  48. package/oxidized/oxidized-src/getModuleDocblock.js +87 -0
  49. package/oxidized/oxidized-src/index.js +220 -0
  50. package/oxidized/oxidized-src/transform/SimpleTransform.js +95 -0
  51. package/oxidized/oxidized-src/transform/astArrayMutationHelpers.js +52 -0
  52. package/oxidized/oxidized-src/transform/astNodeMutationHelpers.js +142 -0
  53. package/oxidized/oxidized-src/transform/print/comments/comments.js +245 -0
  54. package/oxidized/oxidized-src/transform/print/comments/prettier/common/util.js +235 -0
  55. package/oxidized/oxidized-src/transform/print/comments/prettier/language-js/comments.js +663 -0
  56. package/oxidized/oxidized-src/transform/print/comments/prettier/language-js/loc.js +30 -0
  57. package/oxidized/oxidized-src/transform/print/comments/prettier/language-js/printer-estree.js +23 -0
  58. package/oxidized/oxidized-src/transform/print/comments/prettier/language-js/utils.js +89 -0
  59. package/oxidized/oxidized-src/transform/print/comments/prettier/main/comments.js +374 -0
  60. package/oxidized/oxidized-src/transform/print/comments/prettier/utils/get-last.js +5 -0
  61. package/oxidized/oxidized-src/transform/print/detachedNodeTypes.js +1 -0
  62. package/oxidized/oxidized-src/transform/print/print.js +68 -0
  63. package/oxidized/oxidized-src/traverse/SimpleTraverser.js +90 -0
  64. package/oxidized/oxidized-src/traverse/getVisitorKeys.js +29 -0
  65. package/oxidized/oxidized-src/utils/Builders.js +181 -0
  66. package/oxidized/oxidized-src/utils/GenID.js +37 -0
  67. package/oxidized/oxidized-src/utils/createSyntaxError.js +15 -0
  68. package/oxidized/oxidized-src/utils/isReservedWord.js +53 -0
  69. package/oxidized/oxidized-src/utils/mutateESTreeASTForPrettier.js +85 -0
  70. package/oxidized/transform/SimpleTransform.js +95 -0
  71. package/oxidized/transform/SimpleTransform.js.flow +168 -0
  72. package/oxidized/transform/astArrayMutationHelpers.js +52 -0
  73. package/oxidized/transform/astArrayMutationHelpers.js.flow +71 -0
  74. package/oxidized/transform/astNodeMutationHelpers.js +142 -0
  75. package/oxidized/transform/astNodeMutationHelpers.js.flow +252 -0
  76. package/oxidized/transform/print/comments/comments.js +245 -0
  77. package/oxidized/transform/print/comments/comments.js.flow +330 -0
  78. package/oxidized/transform/print/comments/prettier/common/util.js +235 -0
  79. package/oxidized/transform/print/comments/prettier/language-js/comments.js +663 -0
  80. package/oxidized/transform/print/comments/prettier/language-js/loc.js +30 -0
  81. package/oxidized/transform/print/comments/prettier/language-js/printer-estree.js +23 -0
  82. package/oxidized/transform/print/comments/prettier/language-js/utils.js +89 -0
  83. package/oxidized/transform/print/comments/prettier/main/comments.js +374 -0
  84. package/oxidized/transform/print/comments/prettier/utils/get-last.js +5 -0
  85. package/oxidized/transform/print/detachedNodeTypes.js +1 -0
  86. package/oxidized/transform/print/detachedNodeTypes.js.flow +24 -0
  87. package/oxidized/transform/print/print.js +68 -0
  88. package/oxidized/transform/print/print.js.flow +87 -0
  89. package/oxidized/traverse/SimpleTraverser.js +90 -0
  90. package/oxidized/traverse/SimpleTraverser.js.flow +133 -0
  91. package/oxidized/traverse/getVisitorKeys.js +29 -0
  92. package/oxidized/traverse/getVisitorKeys.js.flow +36 -0
  93. package/oxidized/utils/Builders.js +181 -0
  94. package/oxidized/utils/Builders.js.flow +218 -0
  95. package/oxidized/utils/GenID.js +37 -0
  96. package/oxidized/utils/GenID.js.flow +39 -0
  97. package/oxidized/utils/createSyntaxError.js +15 -0
  98. package/oxidized/utils/createSyntaxError.js.flow +24 -0
  99. package/oxidized/utils/isReservedWord.js +53 -0
  100. package/oxidized/utils/isReservedWord.js.flow +57 -0
  101. package/oxidized/utils/mutateESTreeASTForPrettier.js +85 -0
  102. package/oxidized/utils/mutateESTreeASTForPrettier.js.flow +130 -0
  103. package/package.json +6 -4
@@ -0,0 +1,181 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.EMPTY_PARENT = void 0;
7
+ exports.callExpression = callExpression;
8
+ exports.conjunction = conjunction;
9
+ exports.createDefaultPosition = createDefaultPosition;
10
+ exports.disjunction = disjunction;
11
+ exports.etc = etc;
12
+ exports.ident = ident;
13
+ exports.iife = iife;
14
+ exports.nullLiteral = nullLiteral;
15
+ exports.numberLiteral = numberLiteral;
16
+ exports.stringLiteral = stringLiteral;
17
+ exports.throwStatement = throwStatement;
18
+ exports.typeofExpression = typeofExpression;
19
+ exports.variableDeclaration = variableDeclaration;
20
+ const EMPTY_PARENT = null;
21
+ exports.EMPTY_PARENT = EMPTY_PARENT;
22
+
23
+ function createDefaultPosition() {
24
+ return {
25
+ line: 1,
26
+ column: 0
27
+ };
28
+ }
29
+
30
+ function etc({
31
+ loc,
32
+ range,
33
+ parent
34
+ } = {}) {
35
+ return {
36
+ loc: {
37
+ start: (loc == null ? void 0 : loc.start) != null ? loc.start : createDefaultPosition(),
38
+ end: (loc == null ? void 0 : loc.end) != null ? loc.end : createDefaultPosition()
39
+ },
40
+ range: range != null ? range : [0, 0],
41
+ parent: parent != null ? parent : EMPTY_PARENT
42
+ };
43
+ }
44
+
45
+ function ident(name, info) {
46
+ return {
47
+ type: 'Identifier',
48
+ name,
49
+ optional: false,
50
+ typeAnnotation: null,
51
+ ...etc(info)
52
+ };
53
+ }
54
+
55
+ function stringLiteral(value, info) {
56
+ return {
57
+ type: 'Literal',
58
+ value,
59
+ raw: `"${value}"`,
60
+ literalType: 'string',
61
+ ...etc(info)
62
+ };
63
+ }
64
+
65
+ function numberLiteral(value, info) {
66
+ return {
67
+ type: 'Literal',
68
+ value,
69
+ raw: String(value),
70
+ literalType: 'numeric',
71
+ ...etc(info)
72
+ };
73
+ }
74
+
75
+ function nullLiteral(info) {
76
+ return {
77
+ type: 'Literal',
78
+ value: null,
79
+ raw: 'null',
80
+ literalType: 'null',
81
+ ...etc(info)
82
+ };
83
+ }
84
+
85
+ function conjunction(tests) {
86
+ if (tests.length === 0) {
87
+ throw new Error('Must have at least one test.');
88
+ }
89
+
90
+ return tests.reduce((acc, test) => ({
91
+ type: 'LogicalExpression',
92
+ left: acc,
93
+ right: test,
94
+ operator: '&&',
95
+ ...etc()
96
+ }));
97
+ }
98
+
99
+ function disjunction(tests) {
100
+ if (tests.length === 0) {
101
+ throw new Error('Must have at least one test.');
102
+ }
103
+
104
+ return tests.reduce((acc, test) => ({
105
+ type: 'LogicalExpression',
106
+ left: acc,
107
+ right: test,
108
+ operator: '||',
109
+ ...etc()
110
+ }));
111
+ }
112
+
113
+ function variableDeclaration(kind, id, init, info) {
114
+ return {
115
+ type: 'VariableDeclaration',
116
+ kind,
117
+ declarations: [{
118
+ type: 'VariableDeclarator',
119
+ init,
120
+ id,
121
+ ...etc(),
122
+ parent: EMPTY_PARENT
123
+ }],
124
+ ...etc(info)
125
+ };
126
+ }
127
+
128
+ function callExpression(callee, args, info) {
129
+ return {
130
+ type: 'CallExpression',
131
+ callee,
132
+ arguments: args,
133
+ typeArguments: null,
134
+ optional: false,
135
+ ...etc(info)
136
+ };
137
+ }
138
+
139
+ function throwStatement(arg, info) {
140
+ return {
141
+ type: 'ThrowStatement',
142
+ argument: callExpression(ident('Error'), [arg]),
143
+ ...etc(info)
144
+ };
145
+ }
146
+
147
+ function iife(statements, params = [], args = []) {
148
+ const callee = {
149
+ type: 'ArrowFunctionExpression',
150
+ params,
151
+ expression: false,
152
+ async: false,
153
+ predicate: null,
154
+ returnType: null,
155
+ typeParameters: null,
156
+ id: null,
157
+ body: {
158
+ type: 'BlockStatement',
159
+ body: statements,
160
+ ...etc()
161
+ },
162
+ ...etc()
163
+ };
164
+ return callExpression(callee, args);
165
+ }
166
+
167
+ function typeofExpression(arg, kind) {
168
+ return {
169
+ type: 'BinaryExpression',
170
+ left: {
171
+ type: 'UnaryExpression',
172
+ operator: 'typeof',
173
+ argument: arg,
174
+ prefix: true,
175
+ ...etc()
176
+ },
177
+ right: stringLiteral(kind),
178
+ operator: '===',
179
+ ...etc()
180
+ };
181
+ }
@@ -0,0 +1,37 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ const genPrefix = '$$gen$';
8
+
9
+ class GenID {
10
+ constructor(uniqueTransformPrefix) {
11
+ this.genN = 0;
12
+ this.used = new Set();
13
+ this.prefix = void 0;
14
+ this.prefix = `${genPrefix}${uniqueTransformPrefix}`;
15
+ }
16
+
17
+ id() {
18
+ let name;
19
+
20
+ do {
21
+ name = `${this.prefix}${this.genN}`;
22
+ this.genN++;
23
+ } while (this.used.has(name));
24
+
25
+ this.used.add(name);
26
+ return name;
27
+ }
28
+
29
+ addUsage(name) {
30
+ if (name.startsWith(this.prefix)) {
31
+ this.used.add(name);
32
+ }
33
+ }
34
+
35
+ }
36
+
37
+ exports.default = GenID;
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createSyntaxError = createSyntaxError;
7
+
8
+ function createSyntaxError(node, err) {
9
+ const syntaxError = new SyntaxError(err);
10
+ syntaxError.loc = {
11
+ line: node.loc.start.line,
12
+ column: node.loc.start.column
13
+ };
14
+ return syntaxError;
15
+ }
@@ -0,0 +1,53 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = isReservedWord;
7
+
8
+ function isReservedWord(name) {
9
+ switch (name) {
10
+ case 'await':
11
+ case 'break':
12
+ case 'case':
13
+ case 'catch':
14
+ case 'class':
15
+ case 'const':
16
+ case 'continue':
17
+ case 'debugger':
18
+ case 'default':
19
+ case 'delete':
20
+ case 'do':
21
+ case 'else':
22
+ case 'enum':
23
+ case 'export':
24
+ case 'extends':
25
+ case 'false':
26
+ case 'finally':
27
+ case 'for':
28
+ case 'function':
29
+ case 'if':
30
+ case 'import':
31
+ case 'in':
32
+ case 'instanceof':
33
+ case 'new':
34
+ case 'null':
35
+ case 'return':
36
+ case 'super':
37
+ case 'switch':
38
+ case 'this':
39
+ case 'throw':
40
+ case 'true':
41
+ case 'try':
42
+ case 'typeof':
43
+ case 'var':
44
+ case 'void':
45
+ case 'while':
46
+ case 'with':
47
+ case 'yield':
48
+ return true;
49
+
50
+ default:
51
+ return false;
52
+ }
53
+ }
@@ -0,0 +1,85 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = mutate;
7
+
8
+ var _SimpleTransform = require("../transform/SimpleTransform");
9
+
10
+ function transformChainExpression(node, comments) {
11
+ if (comments != null) {
12
+ var _node$comments;
13
+
14
+ const joinedComments = comments.concat((_node$comments = node.comments) != null ? _node$comments : []);
15
+ node.comments = joinedComments;
16
+ }
17
+
18
+ switch (node.type) {
19
+ case 'CallExpression':
20
+ return { ...node,
21
+ type: 'OptionalCallExpression',
22
+ callee: transformChainExpression(node.callee)
23
+ };
24
+
25
+ case 'MemberExpression':
26
+ return { ...node,
27
+ type: 'OptionalMemberExpression',
28
+ object: transformChainExpression(node.object)
29
+ };
30
+ }
31
+
32
+ return node;
33
+ }
34
+
35
+ function mutate(rootNode, visitorKeys) {
36
+ _SimpleTransform.SimpleTransform.transform(rootNode, {
37
+ transform(node) {
38
+ if (node.parent) {
39
+ delete node.parent;
40
+ }
41
+
42
+ if (node.type === 'ChainExpression') {
43
+ return transformChainExpression(node.expression, node == null ? void 0 : node.comments);
44
+ }
45
+
46
+ if (node.type === 'ObjectTypeProperty') {
47
+ if (node.method === false && node.kind === 'init' && node.range[0] === 1 && node.value.range[0] === 1) {
48
+ node.value = { ...node.value,
49
+ range: [2, node.value.range[1]]
50
+ };
51
+ }
52
+
53
+ return node;
54
+ }
55
+
56
+ if (node.type === 'ImportSpecifier') {
57
+ if (node.local.name === node.imported.name) {
58
+ if (node.local.range == null) {
59
+ node.local.range = [0, 0];
60
+ }
61
+
62
+ node.imported.range = [...node.local.range];
63
+ }
64
+
65
+ return node;
66
+ }
67
+
68
+ if (node.type === 'ExportSpecifier') {
69
+ if (node.local.name === node.exported.name) {
70
+ if (node.local.range == null) {
71
+ node.local.range = [0, 0];
72
+ }
73
+
74
+ node.exported.range = [...node.local.range];
75
+ }
76
+
77
+ return node;
78
+ }
79
+
80
+ return node;
81
+ },
82
+
83
+ visitorKeys
84
+ });
85
+ }
@@ -0,0 +1,95 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SimpleTransform = void 0;
7
+
8
+ var _SimpleTraverser = require("../traverse/SimpleTraverser");
9
+
10
+ var _astNodeMutationHelpers = require("./astNodeMutationHelpers");
11
+
12
+ function setParentPointer(node, parent) {
13
+ if (parent != null) {
14
+ if (Array.isArray(node)) {
15
+ for (const item of node) {
16
+ item.parent = parent;
17
+ }
18
+ } else {
19
+ node.parent = parent;
20
+ }
21
+ }
22
+ }
23
+
24
+ class SimpleTransform {
25
+ transform(rootNode, options) {
26
+ let resultRootNode = rootNode;
27
+
28
+ _SimpleTraverser.SimpleTraverser.traverse(rootNode, {
29
+ enter: (node, parent) => {
30
+ setParentPointer(node, parent);
31
+ const resultNode = options.transform(node);
32
+
33
+ if (resultNode !== node) {
34
+ let traversedResultNode = null;
35
+
36
+ if (resultNode != null) {
37
+ setParentPointer(resultNode, parent);
38
+
39
+ if (Array.isArray(resultNode)) {
40
+ traversedResultNode = resultNode.map(item => this.transform(item, options)).filter(item => item != null);
41
+ } else {
42
+ traversedResultNode = this.transform(resultNode, options);
43
+ }
44
+ }
45
+
46
+ if (parent == null) {
47
+ if (node !== rootNode) {
48
+ throw new Error('SimpleTransform infra error: Parent not set on non root node, this should not be possible');
49
+ }
50
+
51
+ if (Array.isArray(traversedResultNode)) {
52
+ throw new Error('SimpleTransform: invalid array result for root node');
53
+ } else {
54
+ resultRootNode = traversedResultNode;
55
+ }
56
+ } else if (traversedResultNode == null) {
57
+ (0, _astNodeMutationHelpers.removeNodeOnParent)(node, parent, options.visitorKeys);
58
+ } else {
59
+ (0, _astNodeMutationHelpers.replaceNodeOnParent)(node, parent, traversedResultNode, options.visitorKeys);
60
+ setParentPointer(traversedResultNode, parent);
61
+ }
62
+
63
+ throw _SimpleTraverser.SimpleTraverser.Skip;
64
+ }
65
+ },
66
+
67
+ leave(_node) {},
68
+
69
+ visitorKeys: options.visitorKeys
70
+ });
71
+
72
+ return resultRootNode;
73
+ }
74
+
75
+ static transform(node, options) {
76
+ return new SimpleTransform().transform(node, options);
77
+ }
78
+
79
+ static transformProgram(program, options) {
80
+ const result = SimpleTransform.transform(program, options);
81
+
82
+ if ((result == null ? void 0 : result.type) === 'Program') {
83
+ return result;
84
+ }
85
+
86
+ throw new Error('SimpleTransform.transformProgram: Expected program node.');
87
+ }
88
+
89
+ static nodeWith(node, overrideProps, visitorKeys) {
90
+ return (0, _astNodeMutationHelpers.nodeWith)(node, overrideProps, visitorKeys);
91
+ }
92
+
93
+ }
94
+
95
+ exports.SimpleTransform = SimpleTransform;
@@ -0,0 +1,168 @@
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 {VisitorKeysType} from '../traverse/getVisitorKeys';
14
+ import type {ESNode, Program} from 'flow-estree';
15
+
16
+ import {SimpleTraverser} from '../traverse/SimpleTraverser';
17
+ import {
18
+ nodeWith,
19
+ removeNodeOnParent,
20
+ replaceNodeOnParent,
21
+ } from './astNodeMutationHelpers';
22
+
23
+ /**
24
+ * Transform callback
25
+ * @param node The node we are visiting
26
+ * @returns
27
+ * - return input node, signals no changes were made will continue to the next node.
28
+ * - return new node, the old node will be replaced in the AST. The new node and its
29
+ * children are then traversed.
30
+ * - return null, signals the node should be deleted from the AST.
31
+ */
32
+ export type TransformCallback = (
33
+ node: ESNode,
34
+ ) => ESNode | ReadonlyArray<ESNode> | null;
35
+
36
+ export type TransformOptions = Readonly<{
37
+ /** The callback function which is called on entering each node. */
38
+ transform: TransformCallback,
39
+
40
+ /** The set of visitor keys to use for traversal. Defaults to the Flow ESTree visitor keys */
41
+ visitorKeys?: ?VisitorKeysType,
42
+ }>;
43
+
44
+ function setParentPointer(
45
+ node: ESNode | ReadonlyArray<ESNode>,
46
+ parent: ?ESNode,
47
+ ): void {
48
+ if (parent != null) {
49
+ if (Array.isArray(node)) {
50
+ for (const item of node) {
51
+ // $FlowExpectedError[cannot-write]
52
+ item.parent = parent;
53
+ }
54
+ } else {
55
+ // $FlowExpectedError[cannot-write]
56
+ node.parent = parent;
57
+ }
58
+ }
59
+ }
60
+
61
+ /**
62
+ * A simple class to recursively tranform AST trees.
63
+ */
64
+ export class SimpleTransform {
65
+ /**
66
+ * Transform the given AST tree.
67
+ * @param rootNode The root node to traverse.
68
+ * @param options The option object.
69
+ * @return The modified rootNode or a new node if the rootNode was transformed directly.
70
+ */
71
+ transform(rootNode: ESNode, options: TransformOptions): ESNode | null {
72
+ let resultRootNode: ESNode | null = rootNode;
73
+ SimpleTraverser.traverse(rootNode, {
74
+ enter: (node: ESNode, parent: ?ESNode) => {
75
+ // Ensure the parent pointers are correctly set before entering the node.
76
+ setParentPointer(node, parent);
77
+
78
+ const resultNode: ESNode | ReadonlyArray<ESNode> | null =
79
+ options.transform(node);
80
+ if (resultNode !== node) {
81
+ let traversedResultNode: ESNode | ReadonlyArray<ESNode> | null = null;
82
+
83
+ if (resultNode != null) {
84
+ // Ensure the new node has the correct parent pointers before recursing again.
85
+ setParentPointer(resultNode, parent);
86
+
87
+ if (Array.isArray(resultNode)) {
88
+ traversedResultNode = resultNode
89
+ .map(item => this.transform(item, options))
90
+ .filter(item => item != null);
91
+ } else {
92
+ traversedResultNode = this.transform(resultNode, options);
93
+ }
94
+ }
95
+
96
+ if (parent == null) {
97
+ if (node !== rootNode) {
98
+ throw new Error(
99
+ 'SimpleTransform infra error: Parent not set on non root node, this should not be possible',
100
+ );
101
+ }
102
+ if (Array.isArray(traversedResultNode)) {
103
+ throw new Error(
104
+ 'SimpleTransform: invalid array result for root node',
105
+ );
106
+ } else {
107
+ resultRootNode = traversedResultNode;
108
+ }
109
+ } else if (traversedResultNode == null) {
110
+ removeNodeOnParent(node, parent, options.visitorKeys);
111
+ } else {
112
+ replaceNodeOnParent(
113
+ node,
114
+ parent,
115
+ traversedResultNode,
116
+ options.visitorKeys,
117
+ );
118
+ setParentPointer(traversedResultNode, parent);
119
+ }
120
+
121
+ throw SimpleTraverser.Skip;
122
+ }
123
+ },
124
+ leave(_node: ESNode) {},
125
+ visitorKeys: options.visitorKeys,
126
+ });
127
+ return resultRootNode;
128
+ }
129
+
130
+ /**
131
+ * Transform the given AST tree.
132
+ * @param node The root node to traverse.
133
+ * @param options The option object.
134
+ */
135
+ static transform(node: ESNode, options: TransformOptions): ESNode | null {
136
+ return new SimpleTransform().transform(node, options);
137
+ }
138
+
139
+ static transformProgram(
140
+ program: Program,
141
+ options: TransformOptions,
142
+ ): Program {
143
+ const result = SimpleTransform.transform(program, options);
144
+ if (result?.type === 'Program') {
145
+ return result;
146
+ }
147
+ throw new Error('SimpleTransform.transformProgram: Expected program node.');
148
+ }
149
+
150
+ /**
151
+ * Return a new AST node with the given properties overrided if needed.
152
+ *
153
+ * This function takes care to only create new nodes when needed. Referential equality of nodes
154
+ * is important as its used to know if a node should be re-traversed.
155
+ *
156
+ * @param node The base AST node.
157
+ * @param overrideProps New properties to apply to the node.
158
+ * @return Either the orginal node if the properties matched the existing node or a new node with
159
+ * the new properties.
160
+ */
161
+ static nodeWith<T: ESNode>(
162
+ node: T,
163
+ overrideProps: Partial<T>,
164
+ visitorKeys?: VisitorKeysType,
165
+ ): T {
166
+ return nodeWith<T>(node, overrideProps, visitorKeys);
167
+ }
168
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.arrayIsEqual = arrayIsEqual;
7
+ exports.insertInArray = insertInArray;
8
+ exports.removeFromArray = removeFromArray;
9
+ exports.replaceInArray = replaceInArray;
10
+
11
+ function assertArrayBounds(array, index) {
12
+ if (index < 0 || index >= array.length) {
13
+ throw new Error(`Invalid Mutation: Tried to mutate an elements array with an out of bounds index. Index: ${index}, Array Size: ${array.length}`);
14
+ }
15
+ }
16
+
17
+ function arrayIsEqual(a1, a2) {
18
+ if (a1 === a2) {
19
+ return true;
20
+ }
21
+
22
+ if (a1.length !== a2.length) {
23
+ return false;
24
+ }
25
+
26
+ for (let i = 0; i < a1.length; i++) {
27
+ if (a1[i] !== a2[i]) {
28
+ return false;
29
+ }
30
+ }
31
+
32
+ return true;
33
+ }
34
+
35
+ function insertInArray(array, index, elements) {
36
+ if (index === array.length) {
37
+ return array.concat(elements);
38
+ }
39
+
40
+ assertArrayBounds(array, index);
41
+ return array.slice(0, index).concat(elements).concat(array.slice(index));
42
+ }
43
+
44
+ function removeFromArray(array, index) {
45
+ assertArrayBounds(array, index);
46
+ return [...array.slice(0, index), ...array.slice(index + 1)];
47
+ }
48
+
49
+ function replaceInArray(array, index, elements) {
50
+ assertArrayBounds(array, index);
51
+ return array.slice(0, index).concat(elements).concat(array.slice(index + 1));
52
+ }