@babel/traverse 7.1.0 → 7.23.2

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 (61) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/lib/cache.js +27 -7
  4. package/lib/cache.js.map +1 -0
  5. package/lib/context.js +22 -59
  6. package/lib/context.js.map +1 -0
  7. package/lib/hub.js +2 -6
  8. package/lib/hub.js.map +1 -0
  9. package/lib/index.js +42 -77
  10. package/lib/index.js.map +1 -0
  11. package/lib/path/ancestry.js +15 -62
  12. package/lib/path/ancestry.js.map +1 -0
  13. package/lib/path/comments.js +31 -24
  14. package/lib/path/comments.js.map +1 -0
  15. package/lib/path/context.js +68 -91
  16. package/lib/path/context.js.map +1 -0
  17. package/lib/path/conversion.js +275 -273
  18. package/lib/path/conversion.js.map +1 -0
  19. package/lib/path/evaluation.js +84 -149
  20. package/lib/path/evaluation.js.map +1 -0
  21. package/lib/path/family.js +189 -94
  22. package/lib/path/family.js.map +1 -0
  23. package/lib/path/index.js +106 -132
  24. package/lib/path/index.js.map +1 -0
  25. package/lib/path/inference/index.js +81 -64
  26. package/lib/path/inference/index.js.map +1 -0
  27. package/lib/path/inference/inferer-reference.js +22 -52
  28. package/lib/path/inference/inferer-reference.js.map +1 -0
  29. package/lib/path/inference/inferers.js +110 -125
  30. package/lib/path/inference/inferers.js.map +1 -0
  31. package/lib/path/inference/util.js +30 -0
  32. package/lib/path/inference/util.js.map +1 -0
  33. package/lib/path/introspection.js +182 -168
  34. package/lib/path/introspection.js.map +1 -0
  35. package/lib/path/lib/hoister.js +37 -54
  36. package/lib/path/lib/hoister.js.map +1 -0
  37. package/lib/path/lib/removal-hooks.js +4 -4
  38. package/lib/path/lib/removal-hooks.js.map +1 -0
  39. package/lib/path/lib/virtual-types-validator.js +161 -0
  40. package/lib/path/lib/virtual-types-validator.js.map +1 -0
  41. package/lib/path/lib/virtual-types.js +21 -189
  42. package/lib/path/lib/virtual-types.js.map +1 -0
  43. package/lib/path/modification.js +103 -98
  44. package/lib/path/modification.js.map +1 -0
  45. package/lib/path/removal.js +18 -23
  46. package/lib/path/removal.js.map +1 -0
  47. package/lib/path/replacement.js +91 -144
  48. package/lib/path/replacement.js.map +1 -0
  49. package/lib/scope/binding.js +28 -16
  50. package/lib/scope/binding.js.map +1 -0
  51. package/lib/scope/index.js +407 -414
  52. package/lib/scope/index.js.map +1 -0
  53. package/lib/scope/lib/renamer.js +45 -70
  54. package/lib/scope/lib/renamer.js.map +1 -0
  55. package/lib/traverse-node.js +29 -0
  56. package/lib/traverse-node.js.map +1 -0
  57. package/lib/types.js +3 -0
  58. package/lib/types.js.map +1 -0
  59. package/lib/visitors.js +77 -113
  60. package/lib/visitors.js.map +1 -0
  61. package/package.json +28 -17
@@ -3,210 +3,42 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.ForAwaitStatement = exports.NumericLiteralTypeAnnotation = exports.ExistentialTypeParam = exports.SpreadProperty = exports.RestProperty = exports.Flow = exports.Pure = exports.Generated = exports.User = exports.Var = exports.BlockScoped = exports.Referenced = exports.Scope = exports.Expression = exports.Statement = exports.BindingIdentifier = exports.ReferencedMemberExpression = exports.ReferencedIdentifier = void 0;
7
-
8
- function t() {
9
- const data = _interopRequireWildcard(require("@babel/types"));
10
-
11
- t = function () {
12
- return data;
13
- };
14
-
15
- return data;
16
- }
17
-
18
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
19
-
20
- const ReferencedIdentifier = {
21
- types: ["Identifier", "JSXIdentifier"],
22
-
23
- checkPath({
24
- node,
25
- parent
26
- }, opts) {
27
- if (!t().isIdentifier(node, opts) && !t().isJSXMemberExpression(parent, opts)) {
28
- if (t().isJSXIdentifier(node, opts)) {
29
- if (t().react.isCompatTag(node.name)) return false;
30
- } else {
31
- return false;
32
- }
33
- }
34
-
35
- return t().isReferenced(node, parent);
36
- }
37
-
38
- };
6
+ exports.Var = exports.User = exports.Statement = exports.SpreadProperty = exports.Scope = exports.RestProperty = exports.ReferencedMemberExpression = exports.ReferencedIdentifier = exports.Referenced = exports.Pure = exports.NumericLiteralTypeAnnotation = exports.Generated = exports.ForAwaitStatement = exports.Flow = exports.Expression = exports.ExistentialTypeParam = exports.BlockScoped = exports.BindingIdentifier = void 0;
7
+ const ReferencedIdentifier = ["Identifier", "JSXIdentifier"];
39
8
  exports.ReferencedIdentifier = ReferencedIdentifier;
40
- const ReferencedMemberExpression = {
41
- types: ["MemberExpression"],
42
-
43
- checkPath({
44
- node,
45
- parent
46
- }) {
47
- return t().isMemberExpression(node) && t().isReferenced(node, parent);
48
- }
49
-
50
- };
9
+ const ReferencedMemberExpression = ["MemberExpression"];
51
10
  exports.ReferencedMemberExpression = ReferencedMemberExpression;
52
- const BindingIdentifier = {
53
- types: ["Identifier"],
54
-
55
- checkPath({
56
- node,
57
- parent
58
- }) {
59
- return t().isIdentifier(node) && t().isBinding(node, parent);
60
- }
61
-
62
- };
11
+ const BindingIdentifier = ["Identifier"];
63
12
  exports.BindingIdentifier = BindingIdentifier;
64
- const Statement = {
65
- types: ["Statement"],
66
-
67
- checkPath({
68
- node,
69
- parent
70
- }) {
71
- if (t().isStatement(node)) {
72
- if (t().isVariableDeclaration(node)) {
73
- if (t().isForXStatement(parent, {
74
- left: node
75
- })) return false;
76
- if (t().isForStatement(parent, {
77
- init: node
78
- })) return false;
79
- }
80
-
81
- return true;
82
- } else {
83
- return false;
84
- }
85
- }
86
-
87
- };
13
+ const Statement = ["Statement"];
88
14
  exports.Statement = Statement;
89
- const Expression = {
90
- types: ["Expression"],
91
-
92
- checkPath(path) {
93
- if (path.isIdentifier()) {
94
- return path.isReferencedIdentifier();
95
- } else {
96
- return t().isExpression(path.node);
97
- }
98
- }
99
-
100
- };
15
+ const Expression = ["Expression"];
101
16
  exports.Expression = Expression;
102
- const Scope = {
103
- types: ["Scopable"],
104
-
105
- checkPath(path) {
106
- return t().isScope(path.node, path.parent);
107
- }
108
-
109
- };
17
+ const Scope = ["Scopable", "Pattern"];
110
18
  exports.Scope = Scope;
111
- const Referenced = {
112
- checkPath(path) {
113
- return t().isReferenced(path.node, path.parent);
114
- }
115
-
116
- };
19
+ const Referenced = null;
117
20
  exports.Referenced = Referenced;
118
- const BlockScoped = {
119
- checkPath(path) {
120
- return t().isBlockScoped(path.node);
121
- }
122
-
123
- };
21
+ const BlockScoped = null;
124
22
  exports.BlockScoped = BlockScoped;
125
- const Var = {
126
- types: ["VariableDeclaration"],
127
-
128
- checkPath(path) {
129
- return t().isVar(path.node);
130
- }
131
-
132
- };
23
+ const Var = ["VariableDeclaration"];
133
24
  exports.Var = Var;
134
- const User = {
135
- checkPath(path) {
136
- return path.node && !!path.node.loc;
137
- }
138
-
139
- };
25
+ const User = null;
140
26
  exports.User = User;
141
- const Generated = {
142
- checkPath(path) {
143
- return !path.isUser();
144
- }
145
-
146
- };
27
+ const Generated = null;
147
28
  exports.Generated = Generated;
148
- const Pure = {
149
- checkPath(path, opts) {
150
- return path.scope.isPure(path.node, opts);
151
- }
152
-
153
- };
29
+ const Pure = null;
154
30
  exports.Pure = Pure;
155
- const Flow = {
156
- types: ["Flow", "ImportDeclaration", "ExportDeclaration", "ImportSpecifier"],
157
-
158
- checkPath({
159
- node
160
- }) {
161
- if (t().isFlow(node)) {
162
- return true;
163
- } else if (t().isImportDeclaration(node)) {
164
- return node.importKind === "type" || node.importKind === "typeof";
165
- } else if (t().isExportDeclaration(node)) {
166
- return node.exportKind === "type";
167
- } else if (t().isImportSpecifier(node)) {
168
- return node.importKind === "type" || node.importKind === "typeof";
169
- } else {
170
- return false;
171
- }
172
- }
173
-
174
- };
31
+ const Flow = ["Flow", "ImportDeclaration", "ExportDeclaration", "ImportSpecifier"];
175
32
  exports.Flow = Flow;
176
- const RestProperty = {
177
- types: ["RestElement"],
178
-
179
- checkPath(path) {
180
- return path.parentPath && path.parentPath.isObjectPattern();
181
- }
182
-
183
- };
33
+ const RestProperty = ["RestElement"];
184
34
  exports.RestProperty = RestProperty;
185
- const SpreadProperty = {
186
- types: ["RestElement"],
187
-
188
- checkPath(path) {
189
- return path.parentPath && path.parentPath.isObjectExpression();
190
- }
191
-
192
- };
35
+ const SpreadProperty = ["RestElement"];
193
36
  exports.SpreadProperty = SpreadProperty;
194
- const ExistentialTypeParam = {
195
- types: ["ExistsTypeAnnotation"]
196
- };
37
+ const ExistentialTypeParam = ["ExistsTypeAnnotation"];
197
38
  exports.ExistentialTypeParam = ExistentialTypeParam;
198
- const NumericLiteralTypeAnnotation = {
199
- types: ["NumberLiteralTypeAnnotation"]
200
- };
39
+ const NumericLiteralTypeAnnotation = ["NumberLiteralTypeAnnotation"];
201
40
  exports.NumericLiteralTypeAnnotation = NumericLiteralTypeAnnotation;
202
- const ForAwaitStatement = {
203
- types: ["ForOfStatement"],
204
-
205
- checkPath({
206
- node
207
- }) {
208
- return node.await === true;
209
- }
41
+ const ForAwaitStatement = ["ForOfStatement"];
42
+ exports.ForAwaitStatement = ForAwaitStatement;
210
43
 
211
- };
212
- exports.ForAwaitStatement = ForAwaitStatement;
44
+ //# sourceMappingURL=virtual-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ReferencedIdentifier","exports","ReferencedMemberExpression","BindingIdentifier","Statement","Expression","Scope","Referenced","BlockScoped","Var","User","Generated","Pure","Flow","RestProperty","SpreadProperty","ExistentialTypeParam","NumericLiteralTypeAnnotation","ForAwaitStatement"],"sources":["../../../src/path/lib/virtual-types.ts"],"sourcesContent":["import type * as t from \"@babel/types\";\n\nexport interface VirtualTypeAliases {\n BindingIdentifier: t.Identifier;\n BlockScoped: t.Node;\n ExistentialTypeParam: t.ExistsTypeAnnotation;\n Expression: t.Expression;\n Flow: t.Flow | t.ImportDeclaration | t.ExportDeclaration | t.ImportSpecifier;\n ForAwaitStatement: t.ForOfStatement;\n Generated: t.Node;\n NumericLiteralTypeAnnotation: t.NumberLiteralTypeAnnotation;\n Pure: t.Node;\n Referenced: t.Node;\n ReferencedIdentifier: t.Identifier | t.JSXIdentifier;\n ReferencedMemberExpression: t.MemberExpression;\n RestProperty: t.RestElement;\n Scope: t.Scopable | t.Pattern;\n SpreadProperty: t.RestElement;\n Statement: t.Statement;\n User: t.Node;\n Var: t.VariableDeclaration;\n}\n\ntype VirtualTypeMapping = readonly (t.Node[\"type\"] | keyof t.Aliases)[] | null;\n\nexport const ReferencedIdentifier: VirtualTypeMapping = [\n \"Identifier\",\n \"JSXIdentifier\",\n] as const;\n\nexport const ReferencedMemberExpression: VirtualTypeMapping = [\n \"MemberExpression\",\n] as const;\n\nexport const BindingIdentifier: VirtualTypeMapping = [\"Identifier\"] as const;\n\nexport const Statement: VirtualTypeMapping = [\"Statement\"] as const;\n\nexport const Expression: VirtualTypeMapping = [\"Expression\"] as const;\n\nexport const Scope: VirtualTypeMapping = [\"Scopable\", \"Pattern\"] as const;\n\nexport const Referenced: VirtualTypeMapping = null;\n\nexport const BlockScoped: VirtualTypeMapping = null;\n\nexport const Var: VirtualTypeMapping = [\"VariableDeclaration\"];\n\nexport const User: VirtualTypeMapping = null;\n\nexport const Generated: VirtualTypeMapping = null;\n\nexport const Pure: VirtualTypeMapping = null;\n\nexport const Flow: VirtualTypeMapping = [\n \"Flow\",\n \"ImportDeclaration\",\n \"ExportDeclaration\",\n \"ImportSpecifier\",\n] as const;\n\n// TODO: 7.0 Backwards Compat\nexport const RestProperty: VirtualTypeMapping = [\"RestElement\"] as const;\n\nexport const SpreadProperty: VirtualTypeMapping = [\"RestElement\"] as const;\n\nexport const ExistentialTypeParam: VirtualTypeMapping = [\n \"ExistsTypeAnnotation\",\n] as const;\n\nexport const NumericLiteralTypeAnnotation: VirtualTypeMapping = [\n \"NumberLiteralTypeAnnotation\",\n] as const;\n\nexport const ForAwaitStatement: VirtualTypeMapping = [\n \"ForOfStatement\",\n] as const;\n"],"mappings":";;;;;;AAyBO,MAAMA,oBAAwC,GAAG,CACtD,YAAY,EACZ,eAAe,CACP;AAACC,OAAA,CAAAD,oBAAA,GAAAA,oBAAA;AAEJ,MAAME,0BAA8C,GAAG,CAC5D,kBAAkB,CACV;AAACD,OAAA,CAAAC,0BAAA,GAAAA,0BAAA;AAEJ,MAAMC,iBAAqC,GAAG,CAAC,YAAY,CAAU;AAACF,OAAA,CAAAE,iBAAA,GAAAA,iBAAA;AAEtE,MAAMC,SAA6B,GAAG,CAAC,WAAW,CAAU;AAACH,OAAA,CAAAG,SAAA,GAAAA,SAAA;AAE7D,MAAMC,UAA8B,GAAG,CAAC,YAAY,CAAU;AAACJ,OAAA,CAAAI,UAAA,GAAAA,UAAA;AAE/D,MAAMC,KAAyB,GAAG,CAAC,UAAU,EAAE,SAAS,CAAU;AAACL,OAAA,CAAAK,KAAA,GAAAA,KAAA;AAEnE,MAAMC,UAA8B,GAAG,IAAI;AAACN,OAAA,CAAAM,UAAA,GAAAA,UAAA;AAE5C,MAAMC,WAA+B,GAAG,IAAI;AAACP,OAAA,CAAAO,WAAA,GAAAA,WAAA;AAE7C,MAAMC,GAAuB,GAAG,CAAC,qBAAqB,CAAC;AAACR,OAAA,CAAAQ,GAAA,GAAAA,GAAA;AAExD,MAAMC,IAAwB,GAAG,IAAI;AAACT,OAAA,CAAAS,IAAA,GAAAA,IAAA;AAEtC,MAAMC,SAA6B,GAAG,IAAI;AAACV,OAAA,CAAAU,SAAA,GAAAA,SAAA;AAE3C,MAAMC,IAAwB,GAAG,IAAI;AAACX,OAAA,CAAAW,IAAA,GAAAA,IAAA;AAEtC,MAAMC,IAAwB,GAAG,CACtC,MAAM,EACN,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,CACT;AAACZ,OAAA,CAAAY,IAAA,GAAAA,IAAA;AAGJ,MAAMC,YAAgC,GAAG,CAAC,aAAa,CAAU;AAACb,OAAA,CAAAa,YAAA,GAAAA,YAAA;AAElE,MAAMC,cAAkC,GAAG,CAAC,aAAa,CAAU;AAACd,OAAA,CAAAc,cAAA,GAAAA,cAAA;AAEpE,MAAMC,oBAAwC,GAAG,CACtD,sBAAsB,CACd;AAACf,OAAA,CAAAe,oBAAA,GAAAA,oBAAA;AAEJ,MAAMC,4BAAgD,GAAG,CAC9D,6BAA6B,CACrB;AAAChB,OAAA,CAAAgB,4BAAA,GAAAA,4BAAA;AAEJ,MAAMC,iBAAqC,GAAG,CACnD,gBAAgB,CACR;AAACjB,OAAA,CAAAiB,iBAAA,GAAAA,iBAAA"}
@@ -3,165 +3,179 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.insertBefore = insertBefore;
7
6
  exports._containerInsert = _containerInsert;
8
- exports._containerInsertBefore = _containerInsertBefore;
9
7
  exports._containerInsertAfter = _containerInsertAfter;
10
- exports.insertAfter = insertAfter;
11
- exports.updateSiblingKeys = updateSiblingKeys;
8
+ exports._containerInsertBefore = _containerInsertBefore;
12
9
  exports._verifyNodeList = _verifyNodeList;
13
- exports.unshiftContainer = unshiftContainer;
14
- exports.pushContainer = pushContainer;
15
10
  exports.hoist = hoist;
16
-
17
- var _cache = require("../cache");
18
-
19
- var _hoister = _interopRequireDefault(require("./lib/hoister"));
20
-
21
- var _index = _interopRequireDefault(require("./index"));
22
-
23
- function t() {
24
- const data = _interopRequireWildcard(require("@babel/types"));
25
-
26
- t = function () {
27
- return data;
28
- };
29
-
30
- return data;
31
- }
32
-
33
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
34
-
35
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
36
-
37
- function insertBefore(nodes) {
11
+ exports.insertAfter = insertAfter;
12
+ exports.insertBefore = insertBefore;
13
+ exports.pushContainer = pushContainer;
14
+ exports.unshiftContainer = unshiftContainer;
15
+ exports.updateSiblingKeys = updateSiblingKeys;
16
+ var _cache = require("../cache.js");
17
+ var _hoister = require("./lib/hoister.js");
18
+ var _index = require("./index.js");
19
+ var _t = require("@babel/types");
20
+ const {
21
+ arrowFunctionExpression,
22
+ assertExpression,
23
+ assignmentExpression,
24
+ blockStatement,
25
+ callExpression,
26
+ cloneNode,
27
+ expressionStatement,
28
+ isAssignmentExpression,
29
+ isCallExpression,
30
+ isExportNamedDeclaration,
31
+ isExpression,
32
+ isIdentifier,
33
+ isSequenceExpression,
34
+ isSuper,
35
+ thisExpression
36
+ } = _t;
37
+ function insertBefore(nodes_) {
38
38
  this._assertUnremoved();
39
-
40
- nodes = this._verifyNodeList(nodes);
39
+ const nodes = this._verifyNodeList(nodes_);
41
40
  const {
42
- parentPath
41
+ parentPath,
42
+ parent
43
43
  } = this;
44
-
45
- if (parentPath.isExpressionStatement() || parentPath.isLabeledStatement() || parentPath.isExportNamedDeclaration() || parentPath.isExportDefaultDeclaration() && this.isDeclaration()) {
44
+ if (parentPath.isExpressionStatement() || parentPath.isLabeledStatement() || isExportNamedDeclaration(parent) || parentPath.isExportDefaultDeclaration() && this.isDeclaration()) {
46
45
  return parentPath.insertBefore(nodes);
47
- } else if (this.isNodeType("Expression") && this.listKey !== "params" && this.listKey !== "arguments" || parentPath.isForStatement() && this.key === "init") {
46
+ } else if (this.isNodeType("Expression") && !this.isJSXElement() || parentPath.isForStatement() && this.key === "init") {
48
47
  if (this.node) nodes.push(this.node);
49
48
  return this.replaceExpressionWithStatements(nodes);
50
49
  } else if (Array.isArray(this.container)) {
51
50
  return this._containerInsertBefore(nodes);
52
51
  } else if (this.isStatementOrBlock()) {
53
- const shouldInsertCurrentNode = this.node && (!this.isExpressionStatement() || this.node.expression != null);
54
- this.replaceWith(t().blockStatement(shouldInsertCurrentNode ? [this.node] : []));
52
+ const node = this.node;
53
+ const shouldInsertCurrentNode = node && (!this.isExpressionStatement() || node.expression != null);
54
+ this.replaceWith(blockStatement(shouldInsertCurrentNode ? [node] : []));
55
55
  return this.unshiftContainer("body", nodes);
56
56
  } else {
57
57
  throw new Error("We don't know what to do with this node type. " + "We were previously a Statement but we can't fit in here?");
58
58
  }
59
59
  }
60
-
61
60
  function _containerInsert(from, nodes) {
62
61
  this.updateSiblingKeys(from, nodes.length);
63
62
  const paths = [];
64
63
  this.container.splice(from, 0, ...nodes);
65
-
66
64
  for (let i = 0; i < nodes.length; i++) {
65
+ var _this$context;
67
66
  const to = from + i;
68
67
  const path = this.getSibling(to);
69
68
  paths.push(path);
70
-
71
- if (this.context && this.context.queue) {
69
+ if ((_this$context = this.context) != null && _this$context.queue) {
72
70
  path.pushContext(this.context);
73
71
  }
74
72
  }
75
-
76
73
  const contexts = this._getQueueContexts();
77
-
78
74
  for (const path of paths) {
79
75
  path.setScope();
80
76
  path.debug("Inserted.");
81
-
82
77
  for (const context of contexts) {
83
78
  context.maybeQueue(path, true);
84
79
  }
85
80
  }
86
-
87
81
  return paths;
88
82
  }
89
-
90
83
  function _containerInsertBefore(nodes) {
91
84
  return this._containerInsert(this.key, nodes);
92
85
  }
93
-
94
86
  function _containerInsertAfter(nodes) {
95
87
  return this._containerInsert(this.key + 1, nodes);
96
88
  }
97
-
98
- function insertAfter(nodes) {
89
+ const last = arr => arr[arr.length - 1];
90
+ function isHiddenInSequenceExpression(path) {
91
+ return isSequenceExpression(path.parent) && (last(path.parent.expressions) !== path.node || isHiddenInSequenceExpression(path.parentPath));
92
+ }
93
+ function isAlmostConstantAssignment(node, scope) {
94
+ if (!isAssignmentExpression(node) || !isIdentifier(node.left)) {
95
+ return false;
96
+ }
97
+ const blockScope = scope.getBlockParent();
98
+ return blockScope.hasOwnBinding(node.left.name) && blockScope.getOwnBinding(node.left.name).constantViolations.length <= 1;
99
+ }
100
+ function insertAfter(nodes_) {
99
101
  this._assertUnremoved();
100
-
101
- nodes = this._verifyNodeList(nodes);
102
+ if (this.isSequenceExpression()) {
103
+ return last(this.get("expressions")).insertAfter(nodes_);
104
+ }
105
+ const nodes = this._verifyNodeList(nodes_);
102
106
  const {
103
- parentPath
107
+ parentPath,
108
+ parent
104
109
  } = this;
105
-
106
- if (parentPath.isExpressionStatement() || parentPath.isLabeledStatement() || parentPath.isExportNamedDeclaration() || parentPath.isExportDefaultDeclaration() && this.isDeclaration()) {
107
- return parentPath.insertAfter(nodes);
108
- } else if (this.isNodeType("Expression") || parentPath.isForStatement() && this.key === "init") {
110
+ if (parentPath.isExpressionStatement() || parentPath.isLabeledStatement() || isExportNamedDeclaration(parent) || parentPath.isExportDefaultDeclaration() && this.isDeclaration()) {
111
+ return parentPath.insertAfter(nodes.map(node => {
112
+ return isExpression(node) ? expressionStatement(node) : node;
113
+ }));
114
+ } else if (this.isNodeType("Expression") && !this.isJSXElement() && !parentPath.isJSXElement() || parentPath.isForStatement() && this.key === "init") {
109
115
  if (this.node) {
116
+ const node = this.node;
110
117
  let {
111
118
  scope
112
119
  } = this;
113
-
114
- if (parentPath.isMethod({
115
- computed: true,
116
- key: this.node
117
- })) {
118
- scope = scope.parent;
120
+ if (scope.path.isPattern()) {
121
+ assertExpression(node);
122
+ this.replaceWith(callExpression(arrowFunctionExpression([], node), []));
123
+ this.get("callee.body").insertAfter(nodes);
124
+ return [this];
125
+ }
126
+ if (isHiddenInSequenceExpression(this)) {
127
+ nodes.unshift(node);
128
+ } else if (isCallExpression(node) && isSuper(node.callee)) {
129
+ nodes.unshift(node);
130
+ nodes.push(thisExpression());
131
+ } else if (isAlmostConstantAssignment(node, scope)) {
132
+ nodes.unshift(node);
133
+ nodes.push(cloneNode(node.left));
134
+ } else if (scope.isPure(node, true)) {
135
+ nodes.push(node);
136
+ } else {
137
+ if (parentPath.isMethod({
138
+ computed: true,
139
+ key: node
140
+ })) {
141
+ scope = scope.parent;
142
+ }
143
+ const temp = scope.generateDeclaredUidIdentifier();
144
+ nodes.unshift(expressionStatement(assignmentExpression("=", cloneNode(temp), node)));
145
+ nodes.push(expressionStatement(cloneNode(temp)));
119
146
  }
120
-
121
- const temp = scope.generateDeclaredUidIdentifier();
122
- nodes.unshift(t().expressionStatement(t().assignmentExpression("=", t().cloneNode(temp), this.node)));
123
- nodes.push(t().expressionStatement(t().cloneNode(temp)));
124
147
  }
125
-
126
148
  return this.replaceExpressionWithStatements(nodes);
127
149
  } else if (Array.isArray(this.container)) {
128
150
  return this._containerInsertAfter(nodes);
129
151
  } else if (this.isStatementOrBlock()) {
130
- const shouldInsertCurrentNode = this.node && (!this.isExpressionStatement() || this.node.expression != null);
131
- this.replaceWith(t().blockStatement(shouldInsertCurrentNode ? [this.node] : []));
152
+ const node = this.node;
153
+ const shouldInsertCurrentNode = node && (!this.isExpressionStatement() || node.expression != null);
154
+ this.replaceWith(blockStatement(shouldInsertCurrentNode ? [node] : []));
132
155
  return this.pushContainer("body", nodes);
133
156
  } else {
134
157
  throw new Error("We don't know what to do with this node type. " + "We were previously a Statement but we can't fit in here?");
135
158
  }
136
159
  }
137
-
138
160
  function updateSiblingKeys(fromIndex, incrementBy) {
139
161
  if (!this.parent) return;
140
-
141
- const paths = _cache.path.get(this.parent);
142
-
143
- for (let i = 0; i < paths.length; i++) {
144
- const path = paths[i];
145
-
146
- if (path.key >= fromIndex) {
162
+ const paths = (0, _cache.getCachedPaths)(this.hub, this.parent) || [];
163
+ for (const [, path] of paths) {
164
+ if (typeof path.key === "number" && path.key >= fromIndex) {
147
165
  path.key += incrementBy;
148
166
  }
149
167
  }
150
168
  }
151
-
152
169
  function _verifyNodeList(nodes) {
153
170
  if (!nodes) {
154
171
  return [];
155
172
  }
156
-
157
- if (nodes.constructor !== Array) {
173
+ if (!Array.isArray(nodes)) {
158
174
  nodes = [nodes];
159
175
  }
160
-
161
176
  for (let i = 0; i < nodes.length; i++) {
162
177
  const node = nodes[i];
163
178
  let msg;
164
-
165
179
  if (!node) {
166
180
  msg = "has falsy node";
167
181
  } else if (typeof node !== "object") {
@@ -171,50 +185,41 @@ function _verifyNodeList(nodes) {
171
185
  } else if (node instanceof _index.default) {
172
186
  msg = "has a NodePath when it expected a raw object";
173
187
  }
174
-
175
188
  if (msg) {
176
189
  const type = Array.isArray(node) ? "array" : typeof node;
177
190
  throw new Error(`Node list ${msg} with the index of ${i} and type of ${type}`);
178
191
  }
179
192
  }
180
-
181
193
  return nodes;
182
194
  }
183
-
184
195
  function unshiftContainer(listKey, nodes) {
185
196
  this._assertUnremoved();
186
-
187
197
  nodes = this._verifyNodeList(nodes);
188
-
189
198
  const path = _index.default.get({
190
199
  parentPath: this,
191
200
  parent: this.node,
192
201
  container: this.node[listKey],
193
202
  listKey,
194
203
  key: 0
195
- });
196
-
197
- return path.insertBefore(nodes);
204
+ }).setContext(this.context);
205
+ return path._containerInsertBefore(nodes);
198
206
  }
199
-
200
207
  function pushContainer(listKey, nodes) {
201
208
  this._assertUnremoved();
202
-
203
- nodes = this._verifyNodeList(nodes);
209
+ const verifiedNodes = this._verifyNodeList(nodes);
204
210
  const container = this.node[listKey];
205
-
206
211
  const path = _index.default.get({
207
212
  parentPath: this,
208
213
  parent: this.node,
209
214
  container: container,
210
215
  listKey,
211
216
  key: container.length
212
- });
213
-
214
- return path.replaceWithMultiple(nodes);
217
+ }).setContext(this.context);
218
+ return path.replaceWithMultiple(verifiedNodes);
215
219
  }
216
-
217
220
  function hoist(scope = this.scope) {
218
221
  const hoister = new _hoister.default(this, scope);
219
222
  return hoister.run();
220
- }
223
+ }
224
+
225
+ //# sourceMappingURL=modification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_cache","require","_hoister","_index","_t","arrowFunctionExpression","assertExpression","assignmentExpression","blockStatement","callExpression","cloneNode","expressionStatement","isAssignmentExpression","isCallExpression","isExportNamedDeclaration","isExpression","isIdentifier","isSequenceExpression","isSuper","thisExpression","insertBefore","nodes_","_assertUnremoved","nodes","_verifyNodeList","parentPath","parent","isExpressionStatement","isLabeledStatement","isExportDefaultDeclaration","isDeclaration","isNodeType","isJSXElement","isForStatement","key","node","push","replaceExpressionWithStatements","Array","isArray","container","_containerInsertBefore","isStatementOrBlock","shouldInsertCurrentNode","expression","replaceWith","unshiftContainer","Error","_containerInsert","from","updateSiblingKeys","length","paths","splice","i","_this$context","to","path","getSibling","context","queue","pushContext","contexts","_getQueueContexts","setScope","debug","maybeQueue","_containerInsertAfter","last","arr","isHiddenInSequenceExpression","expressions","isAlmostConstantAssignment","scope","left","blockScope","getBlockParent","hasOwnBinding","name","getOwnBinding","constantViolations","insertAfter","get","map","isPattern","unshift","callee","isPure","isMethod","computed","temp","generateDeclaredUidIdentifier","pushContainer","fromIndex","incrementBy","getCachedPaths","hub","msg","type","NodePath","listKey","setContext","verifiedNodes","replaceWithMultiple","hoist","hoister","PathHoister","run"],"sources":["../../src/path/modification.ts"],"sourcesContent":["// This file contains methods that modify the path/node in some ways.\n\nimport { getCachedPaths } from \"../cache.ts\";\nimport PathHoister from \"./lib/hoister.ts\";\nimport NodePath from \"./index.ts\";\nimport {\n arrowFunctionExpression,\n assertExpression,\n assignmentExpression,\n blockStatement,\n callExpression,\n cloneNode,\n expressionStatement,\n isAssignmentExpression,\n isCallExpression,\n isExportNamedDeclaration,\n isExpression,\n isIdentifier,\n isSequenceExpression,\n isSuper,\n thisExpression,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport type Scope from \"../scope/index.ts\";\n\n/**\n * Insert the provided nodes before the current one.\n */\n\nexport function insertBefore(\n this: NodePath,\n nodes_: t.Node | t.Node[],\n): NodePath[] {\n this._assertUnremoved();\n\n const nodes = this._verifyNodeList(nodes_);\n\n const { parentPath, parent } = this;\n\n if (\n parentPath.isExpressionStatement() ||\n parentPath.isLabeledStatement() ||\n // https://github.com/babel/babel/issues/15293\n // When Babel transforms `export class String { field }`, the class properties plugin will inject the defineProperty\n // helper, which depends on the builtins e.g. String, Number, Symbol, etc. To prevent them from being shadowed by local\n // exports, the helper injector replaces the named export into `class _String { field }; export { _String as String }`,\n // with `parentPath` here changed to the moved ClassDeclaration, causing rare inconsistency between `parent` and `parentPath`.\n // Here we retrieve the parent type from the `parent` property. This is a temporary fix and we should revisit when\n // helpers should get injected.\n isExportNamedDeclaration(parent) ||\n (parentPath.isExportDefaultDeclaration() && this.isDeclaration())\n ) {\n return parentPath.insertBefore(nodes);\n } else if (\n (this.isNodeType(\"Expression\") && !this.isJSXElement()) ||\n (parentPath.isForStatement() && this.key === \"init\")\n ) {\n if (this.node) nodes.push(this.node);\n // @ts-expect-error todo(flow->ts): check that nodes is an array of statements\n return this.replaceExpressionWithStatements(nodes);\n } else if (Array.isArray(this.container)) {\n return this._containerInsertBefore(nodes);\n } else if (this.isStatementOrBlock()) {\n const node = this.node as t.Statement;\n const shouldInsertCurrentNode =\n node &&\n (!this.isExpressionStatement() ||\n (node as t.ExpressionStatement).expression != null);\n\n this.replaceWith(blockStatement(shouldInsertCurrentNode ? [node] : []));\n return (this as NodePath<t.BlockStatement>).unshiftContainer(\n \"body\",\n // @ts-expect-error Fixme: refine nodes to t.BlockStatement[\"body\"] when this is a BlockStatement path\n nodes,\n );\n } else {\n throw new Error(\n \"We don't know what to do with this node type. \" +\n \"We were previously a Statement but we can't fit in here?\",\n );\n }\n}\n\nexport function _containerInsert<N extends t.Node>(\n this: NodePath,\n from: number,\n nodes: N[],\n): NodePath<N>[] {\n this.updateSiblingKeys(from, nodes.length);\n\n const paths: NodePath<N>[] = [];\n\n // @ts-expect-error todo(flow->ts): this.container could be a NodePath\n this.container.splice(from, 0, ...nodes);\n for (let i = 0; i < nodes.length; i++) {\n const to = from + i;\n const path = this.getSibling(to) as NodePath<N>;\n paths.push(path);\n\n if (this.context?.queue) {\n path.pushContext(this.context);\n }\n }\n\n const contexts = this._getQueueContexts();\n\n for (const path of paths) {\n path.setScope();\n path.debug(\"Inserted.\");\n\n for (const context of contexts) {\n context.maybeQueue(path, true);\n }\n }\n\n return paths;\n}\n\nexport function _containerInsertBefore<N extends t.Node>(\n this: NodePath,\n nodes: N[],\n) {\n return this._containerInsert(this.key as number, nodes);\n}\n\nexport function _containerInsertAfter<N extends t.Node>(\n this: NodePath,\n nodes: N[],\n) {\n return this._containerInsert((this.key as number) + 1, nodes);\n}\n\nconst last = <T>(arr: T[]) => arr[arr.length - 1];\n\nfunction isHiddenInSequenceExpression(path: NodePath): boolean {\n return (\n isSequenceExpression(path.parent) &&\n (last(path.parent.expressions) !== path.node ||\n isHiddenInSequenceExpression(path.parentPath))\n );\n}\n\nfunction isAlmostConstantAssignment(\n node: t.Node,\n scope: Scope,\n): node is t.AssignmentExpression & { left: t.Identifier } {\n if (!isAssignmentExpression(node) || !isIdentifier(node.left)) {\n return false;\n }\n\n // Not every scope can contain variables. For example, we might be in\n // a ClassScope either in the ClassHeritage or in a computed key.\n const blockScope = scope.getBlockParent();\n\n // If the variable is defined in the current scope and only assigned here,\n // we can be sure that its value won't change.\n return (\n blockScope.hasOwnBinding(node.left.name) &&\n blockScope.getOwnBinding(node.left.name).constantViolations.length <= 1\n );\n}\n\n/**\n * Insert the provided nodes after the current one. When inserting nodes after an\n * expression, ensure that the completion record is correct by pushing the current node.\n */\n\nexport function insertAfter(\n this: NodePath,\n nodes_: t.Node | t.Node[],\n): NodePath[] {\n this._assertUnremoved();\n\n if (this.isSequenceExpression()) {\n return last(this.get(\"expressions\")).insertAfter(nodes_);\n }\n\n const nodes = this._verifyNodeList(nodes_);\n\n const { parentPath, parent } = this;\n if (\n parentPath.isExpressionStatement() ||\n parentPath.isLabeledStatement() ||\n // see insertBefore\n isExportNamedDeclaration(parent) ||\n (parentPath.isExportDefaultDeclaration() && this.isDeclaration())\n ) {\n return parentPath.insertAfter(\n nodes.map(node => {\n // Usually after an expression we can safely insert another expression:\n // A.insertAfter(B)\n // foo = A; -> foo = (A, B);\n // If A is an expression statement, it isn't safe anymore so we need to\n // convert B to an expression statement\n // A; -> A; B // No semicolon! It could break if followed by [!\n return isExpression(node) ? expressionStatement(node) : node;\n }),\n );\n } else if (\n (this.isNodeType(\"Expression\") &&\n !this.isJSXElement() &&\n !parentPath.isJSXElement()) ||\n (parentPath.isForStatement() && this.key === \"init\")\n ) {\n if (this.node) {\n const node = this.node as t.Expression | t.VariableDeclaration;\n let { scope } = this;\n\n if (scope.path.isPattern()) {\n assertExpression(node);\n\n this.replaceWith(callExpression(arrowFunctionExpression([], node), []));\n (this.get(\"callee.body\") as NodePath<t.Expression>).insertAfter(nodes);\n return [this];\n }\n\n if (isHiddenInSequenceExpression(this)) {\n nodes.unshift(node);\n }\n // We need to preserve the value of this expression.\n else if (isCallExpression(node) && isSuper(node.callee)) {\n nodes.unshift(node);\n // `super(...)` always evaluates to `this`.\n nodes.push(thisExpression());\n } else if (isAlmostConstantAssignment(node, scope)) {\n nodes.unshift(node);\n nodes.push(cloneNode(node.left));\n } else if (scope.isPure(node, true)) {\n // Insert the nodes before rather than after; it's not observable.\n nodes.push(node);\n } else {\n // Inserting after the computed key of a method should insert the\n // temporary binding in the method's parent's scope.\n if (parentPath.isMethod({ computed: true, key: node })) {\n scope = scope.parent;\n }\n const temp = scope.generateDeclaredUidIdentifier();\n nodes.unshift(\n expressionStatement(\n // @ts-expect-error todo(flow->ts): This can be a variable\n // declaration in the \"init\" of a for statement, but that's\n // invalid here.\n assignmentExpression(\"=\", cloneNode(temp), node),\n ),\n );\n nodes.push(expressionStatement(cloneNode(temp)));\n }\n }\n // @ts-expect-error todo(flow->ts): check that nodes is an array of statements\n return this.replaceExpressionWithStatements(nodes);\n } else if (Array.isArray(this.container)) {\n return this._containerInsertAfter(nodes);\n } else if (this.isStatementOrBlock()) {\n const node = this.node as t.Statement;\n const shouldInsertCurrentNode =\n node &&\n (!this.isExpressionStatement() ||\n (node as t.ExpressionStatement).expression != null);\n\n this.replaceWith(blockStatement(shouldInsertCurrentNode ? [node] : []));\n // @ts-expect-error Fixme: refine nodes to t.BlockStatement[\"body\"] when this is a BlockStatement path\n return this.pushContainer(\"body\", nodes);\n } else {\n throw new Error(\n \"We don't know what to do with this node type. \" +\n \"We were previously a Statement but we can't fit in here?\",\n );\n }\n}\n\n/**\n * Update all sibling node paths after `fromIndex` by `incrementBy`.\n */\n\nexport function updateSiblingKeys(\n this: NodePath,\n fromIndex: number,\n incrementBy: number,\n) {\n if (!this.parent) return;\n\n const paths = getCachedPaths(this.hub, this.parent) || ([] as never[]);\n\n for (const [, path] of paths) {\n if (typeof path.key === \"number\" && path.key >= fromIndex) {\n path.key += incrementBy;\n }\n }\n}\n\nexport function _verifyNodeList<N extends t.Node>(\n this: NodePath,\n nodes: N | N[],\n): N[] {\n if (!nodes) {\n return [];\n }\n\n if (!Array.isArray(nodes)) {\n nodes = [nodes];\n }\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n let msg;\n\n if (!node) {\n msg = \"has falsy node\";\n } else if (typeof node !== \"object\") {\n msg = \"contains a non-object node\";\n } else if (!node.type) {\n msg = \"without a type\";\n } else if (node instanceof NodePath) {\n msg = \"has a NodePath when it expected a raw object\";\n }\n\n if (msg) {\n const type = Array.isArray(node) ? \"array\" : typeof node;\n throw new Error(\n `Node list ${msg} with the index of ${i} and type of ${type}`,\n );\n }\n }\n\n return nodes;\n}\n\nexport function unshiftContainer<N extends t.Node, K extends keyof N & string>(\n this: NodePath<N>,\n listKey: K,\n nodes: N[K] extends (infer E)[]\n ? E | E[]\n : // todo: refine to t.Node[]\n // ? E extends t.Node\n // ? E | E[]\n // : never\n never,\n) {\n // todo: NodePaths<Nodes>\n this._assertUnremoved();\n\n // @ts-expect-error fixme\n nodes = this._verifyNodeList(nodes);\n\n // get the first path and insert our nodes before it, if it doesn't exist then it\n // doesn't matter, our nodes will be inserted anyway\n const path = NodePath.get({\n parentPath: this,\n parent: this.node,\n container: this.node[listKey] as unknown as t.Node | t.Node[],\n listKey,\n key: 0,\n }).setContext(this.context);\n\n return path._containerInsertBefore(\n // @ts-expect-error typings needed to narrow down nodes as t.Node[]\n nodes,\n );\n}\n\nexport function pushContainer<N extends t.Node, K extends keyof N & string>(\n this: NodePath<N>,\n listKey: K,\n nodes: N[K] extends (infer E)[]\n ? E | E[]\n : // todo: refine to t.Node[]\n // ? E extends t.Node\n // ? E | E[]\n // : never\n never,\n) {\n this._assertUnremoved();\n\n const verifiedNodes = this._verifyNodeList(\n // @ts-expect-error refine typings\n nodes,\n );\n\n // get an invisible path that represents the last node + 1 and replace it with our\n // nodes, effectively inlining it\n\n const container = this.node[listKey];\n const path = NodePath.get({\n parentPath: this,\n parent: this.node,\n container: container as unknown as t.Node | t.Node[],\n listKey,\n // @ts-expect-error TS cannot infer that container is t.Node[]\n key: container.length,\n }).setContext(this.context);\n\n return path.replaceWithMultiple(verifiedNodes);\n}\n\n/**\n * Hoist the current node to the highest scope possible and return a UID\n * referencing it.\n */\nexport function hoist<T extends t.Node>(\n this: NodePath<T>,\n scope: Scope = this.scope,\n) {\n const hoister = new PathHoister<T>(this, scope);\n return hoister.run();\n}\n"],"mappings":"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"}