@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
package/lib/path/index.js CHANGED
@@ -3,99 +3,56 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
7
-
8
- var virtualTypes = _interopRequireWildcard(require("./lib/virtual-types"));
9
-
10
- function _debug() {
11
- const data = _interopRequireDefault(require("debug"));
12
-
13
- _debug = function () {
14
- return data;
15
- };
16
-
17
- return data;
18
- }
19
-
20
- var _index = _interopRequireDefault(require("../index"));
21
-
22
- var _scope = _interopRequireDefault(require("../scope"));
23
-
24
- function t() {
25
- const data = _interopRequireWildcard(require("@babel/types"));
26
-
27
- t = function () {
28
- return data;
29
- };
30
-
31
- return data;
32
- }
33
-
34
- var _cache = require("../cache");
35
-
36
- function _generator() {
37
- const data = _interopRequireDefault(require("@babel/generator"));
38
-
39
- _generator = function () {
40
- return data;
41
- };
42
-
43
- return data;
44
- }
45
-
46
- var NodePath_ancestry = _interopRequireWildcard(require("./ancestry"));
47
-
48
- var NodePath_inference = _interopRequireWildcard(require("./inference"));
49
-
50
- var NodePath_replacement = _interopRequireWildcard(require("./replacement"));
51
-
52
- var NodePath_evaluation = _interopRequireWildcard(require("./evaluation"));
53
-
54
- var NodePath_conversion = _interopRequireWildcard(require("./conversion"));
55
-
56
- var NodePath_introspection = _interopRequireWildcard(require("./introspection"));
57
-
58
- var NodePath_context = _interopRequireWildcard(require("./context"));
59
-
60
- var NodePath_removal = _interopRequireWildcard(require("./removal"));
61
-
62
- var NodePath_modification = _interopRequireWildcard(require("./modification"));
63
-
64
- var NodePath_family = _interopRequireWildcard(require("./family"));
65
-
66
- var NodePath_comments = _interopRequireWildcard(require("./comments"));
67
-
68
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
69
-
70
- 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; } }
71
-
72
- const debug = (0, _debug().default)("babel");
73
-
6
+ exports.default = exports.SHOULD_STOP = exports.SHOULD_SKIP = exports.REMOVED = void 0;
7
+ var virtualTypes = require("./lib/virtual-types.js");
8
+ var _debug = require("debug");
9
+ var _index = require("../index.js");
10
+ var _index2 = require("../scope/index.js");
11
+ var _t = require("@babel/types");
12
+ var t = _t;
13
+ var cache = require("../cache.js");
14
+ var _generator = require("@babel/generator");
15
+ var NodePath_ancestry = require("./ancestry.js");
16
+ var NodePath_inference = require("./inference/index.js");
17
+ var NodePath_replacement = require("./replacement.js");
18
+ var NodePath_evaluation = require("./evaluation.js");
19
+ var NodePath_conversion = require("./conversion.js");
20
+ var NodePath_introspection = require("./introspection.js");
21
+ var NodePath_context = require("./context.js");
22
+ var NodePath_removal = require("./removal.js");
23
+ var NodePath_modification = require("./modification.js");
24
+ var NodePath_family = require("./family.js");
25
+ var NodePath_comments = require("./comments.js");
26
+ var NodePath_virtual_types_validator = require("./lib/virtual-types-validator.js");
27
+ const {
28
+ validate
29
+ } = _t;
30
+ const debug = _debug("babel");
31
+ const REMOVED = 1 << 0;
32
+ exports.REMOVED = REMOVED;
33
+ const SHOULD_STOP = 1 << 1;
34
+ exports.SHOULD_STOP = SHOULD_STOP;
35
+ const SHOULD_SKIP = 1 << 2;
36
+ exports.SHOULD_SKIP = SHOULD_SKIP;
74
37
  class NodePath {
75
38
  constructor(hub, parent) {
76
- this.parent = parent;
77
- this.hub = hub;
78
39
  this.contexts = [];
79
- this.data = {};
80
- this.shouldSkip = false;
81
- this.shouldStop = false;
82
- this.removed = false;
83
40
  this.state = null;
84
41
  this.opts = null;
42
+ this._traverseFlags = 0;
85
43
  this.skipKeys = null;
86
44
  this.parentPath = null;
87
- this.context = null;
88
45
  this.container = null;
89
46
  this.listKey = null;
90
- this.inList = false;
91
- this.parentKey = null;
92
47
  this.key = null;
93
48
  this.node = null;
94
- this.scope = null;
95
49
  this.type = null;
96
- this.typeAnnotation = null;
50
+ this.parent = parent;
51
+ this.hub = hub;
52
+ this.data = null;
53
+ this.context = null;
54
+ this.scope = null;
97
55
  }
98
-
99
56
  static get({
100
57
  hub,
101
58
  parentPath,
@@ -107,113 +64,130 @@ class NodePath {
107
64
  if (!hub && parentPath) {
108
65
  hub = parentPath.hub;
109
66
  }
110
-
111
67
  if (!parent) {
112
68
  throw new Error("To get a node path the parent needs to exist");
113
69
  }
114
-
115
70
  const targetNode = container[key];
116
- const paths = _cache.path.get(parent) || [];
117
-
118
- if (!_cache.path.has(parent)) {
119
- _cache.path.set(parent, paths);
120
- }
121
-
122
- let path;
123
-
124
- for (let i = 0; i < paths.length; i++) {
125
- const pathCheck = paths[i];
126
-
127
- if (pathCheck.node === targetNode) {
128
- path = pathCheck;
129
- break;
130
- }
131
- }
132
-
71
+ const paths = cache.getOrCreateCachedPaths(hub, parent);
72
+ let path = paths.get(targetNode);
133
73
  if (!path) {
134
74
  path = new NodePath(hub, parent);
135
- paths.push(path);
75
+ if (targetNode) paths.set(targetNode, path);
136
76
  }
137
-
138
77
  path.setup(parentPath, container, listKey, key);
139
78
  return path;
140
79
  }
141
-
142
80
  getScope(scope) {
143
- return this.isScope() ? new _scope.default(this) : scope;
81
+ return this.isScope() ? new _index2.default(this) : scope;
144
82
  }
145
-
146
83
  setData(key, val) {
84
+ if (this.data == null) {
85
+ this.data = Object.create(null);
86
+ }
147
87
  return this.data[key] = val;
148
88
  }
149
-
150
89
  getData(key, def) {
90
+ if (this.data == null) {
91
+ this.data = Object.create(null);
92
+ }
151
93
  let val = this.data[key];
152
- if (!val && def) val = this.data[key] = def;
94
+ if (val === undefined && def !== undefined) val = this.data[key] = def;
153
95
  return val;
154
96
  }
155
-
97
+ hasNode() {
98
+ return this.node != null;
99
+ }
156
100
  buildCodeFrameError(msg, Error = SyntaxError) {
157
101
  return this.hub.buildError(this.node, msg, Error);
158
102
  }
159
-
160
103
  traverse(visitor, state) {
161
104
  (0, _index.default)(this.node, visitor, this.scope, state, this);
162
105
  }
163
-
164
106
  set(key, node) {
165
- t().validate(this.node, key, node);
107
+ validate(this.node, key, node);
166
108
  this.node[key] = node;
167
109
  }
168
-
169
110
  getPathLocation() {
170
111
  const parts = [];
171
112
  let path = this;
172
-
173
113
  do {
174
114
  let key = path.key;
175
115
  if (path.inList) key = `${path.listKey}[${key}]`;
176
116
  parts.unshift(key);
177
117
  } while (path = path.parentPath);
178
-
179
118
  return parts.join(".");
180
119
  }
181
-
182
120
  debug(message) {
183
121
  if (!debug.enabled) return;
184
122
  debug(`${this.getPathLocation()} ${this.type}: ${message}`);
185
123
  }
186
-
187
124
  toString() {
188
- return (0, _generator().default)(this.node).code;
125
+ return (0, _generator.default)(this.node).code;
126
+ }
127
+ get inList() {
128
+ return !!this.listKey;
129
+ }
130
+ set inList(inList) {
131
+ if (!inList) {
132
+ this.listKey = null;
133
+ }
134
+ }
135
+ get parentKey() {
136
+ return this.listKey || this.key;
137
+ }
138
+ get shouldSkip() {
139
+ return !!(this._traverseFlags & SHOULD_SKIP);
140
+ }
141
+ set shouldSkip(v) {
142
+ if (v) {
143
+ this._traverseFlags |= SHOULD_SKIP;
144
+ } else {
145
+ this._traverseFlags &= ~SHOULD_SKIP;
146
+ }
147
+ }
148
+ get shouldStop() {
149
+ return !!(this._traverseFlags & SHOULD_STOP);
150
+ }
151
+ set shouldStop(v) {
152
+ if (v) {
153
+ this._traverseFlags |= SHOULD_STOP;
154
+ } else {
155
+ this._traverseFlags &= ~SHOULD_STOP;
156
+ }
157
+ }
158
+ get removed() {
159
+ return !!(this._traverseFlags & REMOVED);
160
+ }
161
+ set removed(v) {
162
+ if (v) {
163
+ this._traverseFlags |= REMOVED;
164
+ } else {
165
+ this._traverseFlags &= ~REMOVED;
166
+ }
189
167
  }
190
-
191
168
  }
192
-
193
- exports.default = NodePath;
194
169
  Object.assign(NodePath.prototype, NodePath_ancestry, NodePath_inference, NodePath_replacement, NodePath_evaluation, NodePath_conversion, NodePath_introspection, NodePath_context, NodePath_removal, NodePath_modification, NodePath_family, NodePath_comments);
195
-
196
- for (const type of t().TYPES) {
170
+ {
171
+ NodePath.prototype._guessExecutionStatusRelativeToDifferentFunctions = NodePath_introspection._guessExecutionStatusRelativeTo;
172
+ }
173
+ for (const type of t.TYPES) {
197
174
  const typeKey = `is${type}`;
198
- const fn = t()[typeKey];
199
-
175
+ const fn = t[typeKey];
200
176
  NodePath.prototype[typeKey] = function (opts) {
201
177
  return fn(this.node, opts);
202
178
  };
203
-
204
179
  NodePath.prototype[`assert${type}`] = function (opts) {
205
180
  if (!fn(this.node, opts)) {
206
181
  throw new TypeError(`Expected node path of type ${type}`);
207
182
  }
208
183
  };
209
184
  }
210
-
211
- for (const type in virtualTypes) {
185
+ Object.assign(NodePath.prototype, NodePath_virtual_types_validator);
186
+ for (const type of Object.keys(virtualTypes)) {
212
187
  if (type[0] === "_") continue;
213
- if (t().TYPES.indexOf(type) < 0) t().TYPES.push(type);
214
- const virtualType = virtualTypes[type];
188
+ if (!t.TYPES.includes(type)) t.TYPES.push(type);
189
+ }
190
+ var _default = NodePath;
191
+ exports.default = _default;
215
192
 
216
- NodePath.prototype[`is${type}`] = function (opts) {
217
- return virtualType.checkPath(this, opts);
218
- };
219
- }
193
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["virtualTypes","require","_debug","_index","_index2","_t","t","cache","_generator","NodePath_ancestry","NodePath_inference","NodePath_replacement","NodePath_evaluation","NodePath_conversion","NodePath_introspection","NodePath_context","NodePath_removal","NodePath_modification","NodePath_family","NodePath_comments","NodePath_virtual_types_validator","validate","debug","buildDebug","REMOVED","exports","SHOULD_STOP","SHOULD_SKIP","NodePath","constructor","hub","parent","contexts","state","opts","_traverseFlags","skipKeys","parentPath","container","listKey","key","node","type","data","context","scope","get","Error","targetNode","paths","getOrCreateCachedPaths","path","set","setup","getScope","isScope","Scope","setData","val","Object","create","getData","def","undefined","hasNode","buildCodeFrameError","msg","SyntaxError","buildError","traverse","visitor","getPathLocation","parts","inList","unshift","join","message","enabled","toString","generator","code","parentKey","shouldSkip","v","shouldStop","removed","assign","prototype","_guessExecutionStatusRelativeToDifferentFunctions","_guessExecutionStatusRelativeTo","TYPES","typeKey","fn","TypeError","keys","includes","push","_default","default"],"sources":["../../src/path/index.ts"],"sourcesContent":["import type { HubInterface } from \"../hub.ts\";\nimport type TraversalContext from \"../context.ts\";\nimport type { ExplodedTraverseOptions } from \"../index.ts\";\nimport * as virtualTypes from \"./lib/virtual-types.ts\";\nimport buildDebug from \"debug\";\nimport traverse from \"../index.ts\";\nimport type { Visitor } from \"../types.ts\";\nimport Scope from \"../scope/index.ts\";\nimport { validate } from \"@babel/types\";\nimport * as t from \"@babel/types\";\nimport * as cache from \"../cache.ts\";\nimport generator from \"@babel/generator\";\n\n// NodePath is split across many files.\nimport * as NodePath_ancestry from \"./ancestry.ts\";\nimport * as NodePath_inference from \"./inference/index.ts\";\nimport * as NodePath_replacement from \"./replacement.ts\";\nimport * as NodePath_evaluation from \"./evaluation.ts\";\nimport * as NodePath_conversion from \"./conversion.ts\";\nimport * as NodePath_introspection from \"./introspection.ts\";\nimport * as NodePath_context from \"./context.ts\";\nimport * as NodePath_removal from \"./removal.ts\";\nimport * as NodePath_modification from \"./modification.ts\";\nimport * as NodePath_family from \"./family.ts\";\nimport * as NodePath_comments from \"./comments.ts\";\nimport * as NodePath_virtual_types_validator from \"./lib/virtual-types-validator.ts\";\nimport type { NodePathAssertions } from \"./generated/asserts.ts\";\nimport type { NodePathValidators } from \"./generated/validators.ts\";\n\nconst debug = buildDebug(\"babel\");\n\nexport const REMOVED = 1 << 0;\nexport const SHOULD_STOP = 1 << 1;\nexport const SHOULD_SKIP = 1 << 2;\n\nclass NodePath<T extends t.Node = t.Node> {\n constructor(hub: HubInterface, parent: t.ParentMaps[T[\"type\"]]) {\n this.parent = parent;\n this.hub = hub;\n this.data = null;\n\n this.context = null;\n this.scope = null;\n }\n\n declare parent: t.ParentMaps[T[\"type\"]];\n declare hub: HubInterface;\n declare data: Record<string | symbol, unknown>;\n // TraversalContext is configured by setContext\n declare context: TraversalContext;\n declare scope: Scope;\n\n contexts: Array<TraversalContext> = [];\n state: any = null;\n opts: ExplodedTraverseOptions | null = null;\n // this.shouldSkip = false; this.shouldStop = false; this.removed = false;\n _traverseFlags: number = 0;\n skipKeys: Record<string, boolean> | null = null;\n parentPath: t.ParentMaps[T[\"type\"]] extends null\n ? null\n : NodePath<t.ParentMaps[T[\"type\"]]> | null = null;\n container: t.Node | Array<t.Node> | null = null;\n listKey: string | null = null;\n key: string | number | null = null;\n node: T = null;\n type: T[\"type\"] | null = null;\n\n static get({\n hub,\n parentPath,\n parent,\n container,\n listKey,\n key,\n }: {\n hub?: HubInterface;\n parentPath: NodePath | null;\n parent: t.Node;\n container: t.Node | t.Node[];\n listKey?: string;\n key: string | number;\n }): NodePath {\n if (!hub && parentPath) {\n hub = parentPath.hub;\n }\n\n if (!parent) {\n throw new Error(\"To get a node path the parent needs to exist\");\n }\n\n const targetNode =\n // @ts-expect-error key must present in container\n container[key];\n\n const paths = cache.getOrCreateCachedPaths(hub, parent);\n\n let path = paths.get(targetNode);\n if (!path) {\n path = new NodePath(hub, parent);\n if (targetNode) paths.set(targetNode, path);\n }\n\n path.setup(parentPath, container, listKey, key);\n\n return path;\n }\n\n getScope(scope: Scope): Scope {\n return this.isScope() ? new Scope(this) : scope;\n }\n\n setData(key: string | symbol, val: any): any {\n if (this.data == null) {\n this.data = Object.create(null);\n }\n return (this.data[key] = val);\n }\n\n getData(key: string | symbol, def?: any): any {\n if (this.data == null) {\n this.data = Object.create(null);\n }\n let val = this.data[key];\n if (val === undefined && def !== undefined) val = this.data[key] = def;\n return val;\n }\n\n hasNode(): this is NodePath<NonNullable<this[\"node\"]>> {\n return this.node != null;\n }\n\n buildCodeFrameError(\n msg: string,\n Error: new () => Error = SyntaxError,\n ): Error {\n return this.hub.buildError(this.node, msg, Error);\n }\n\n traverse<T>(visitor: Visitor<T>, state: T): void;\n traverse(visitor: Visitor): void;\n traverse(visitor: any, state?: any) {\n traverse(this.node, visitor, this.scope, state, this);\n }\n\n set(key: string, node: any) {\n validate(this.node, key, node);\n // @ts-expect-error key must present in this.node\n this.node[key] = node;\n }\n\n getPathLocation(): string {\n const parts = [];\n let path: NodePath = this;\n do {\n let key = path.key;\n if (path.inList) key = `${path.listKey}[${key}]`;\n parts.unshift(key);\n } while ((path = path.parentPath));\n return parts.join(\".\");\n }\n\n debug(message: string) {\n if (!debug.enabled) return;\n debug(`${this.getPathLocation()} ${this.type}: ${message}`);\n }\n\n toString() {\n return generator(this.node).code;\n }\n\n get inList() {\n return !!this.listKey;\n }\n\n set inList(inList) {\n if (!inList) {\n this.listKey = null;\n }\n // ignore inList = true as it should depend on `listKey`\n }\n\n get parentKey(): string {\n return (this.listKey || this.key) as string;\n }\n\n get shouldSkip() {\n return !!(this._traverseFlags & SHOULD_SKIP);\n }\n\n set shouldSkip(v) {\n if (v) {\n this._traverseFlags |= SHOULD_SKIP;\n } else {\n this._traverseFlags &= ~SHOULD_SKIP;\n }\n }\n\n get shouldStop() {\n return !!(this._traverseFlags & SHOULD_STOP);\n }\n\n set shouldStop(v) {\n if (v) {\n this._traverseFlags |= SHOULD_STOP;\n } else {\n this._traverseFlags &= ~SHOULD_STOP;\n }\n }\n\n get removed() {\n return !!(this._traverseFlags & REMOVED);\n }\n set removed(v) {\n if (v) {\n this._traverseFlags |= REMOVED;\n } else {\n this._traverseFlags &= ~REMOVED;\n }\n }\n}\n\nObject.assign(\n NodePath.prototype,\n NodePath_ancestry,\n NodePath_inference,\n NodePath_replacement,\n NodePath_evaluation,\n NodePath_conversion,\n NodePath_introspection,\n NodePath_context,\n NodePath_removal,\n NodePath_modification,\n NodePath_family,\n NodePath_comments,\n);\n\nif (!process.env.BABEL_8_BREAKING) {\n // @ts-expect-error The original _guessExecutionStatusRelativeToDifferentFunctions only worked for paths in\n // different functions, but _guessExecutionStatusRelativeTo works as a replacement in those cases.\n NodePath.prototype._guessExecutionStatusRelativeToDifferentFunctions =\n NodePath_introspection._guessExecutionStatusRelativeTo;\n}\n\n// we can not use `import { TYPES } from \"@babel/types\"` here\n// because the transformNamedBabelTypesImportToDestructuring plugin in babel.config.js\n// does not offer live bindings for `TYPES`\n// we can change to `import { TYPES }` when we are publishing ES modules only\nfor (const type of t.TYPES) {\n const typeKey = `is${type}`;\n // @ts-expect-error typeKey must present in t\n const fn = t[typeKey];\n // @ts-expect-error augmenting NodePath prototype\n NodePath.prototype[typeKey] = function (opts: any) {\n return fn(this.node, opts);\n };\n\n // @ts-expect-error augmenting NodePath prototype\n NodePath.prototype[`assert${type}`] = function (opts: any) {\n if (!fn(this.node, opts)) {\n throw new TypeError(`Expected node path of type ${type}`);\n }\n };\n}\n\n// Register virtual types validators after base types validators\nObject.assign(NodePath.prototype, NodePath_virtual_types_validator);\n\nfor (const type of Object.keys(virtualTypes) as (keyof typeof virtualTypes)[]) {\n if (type[0] === \"_\") continue;\n if (!t.TYPES.includes(type)) t.TYPES.push(type);\n}\n\ntype NodePathMixins = typeof NodePath_ancestry &\n typeof NodePath_inference &\n typeof NodePath_replacement &\n typeof NodePath_evaluation &\n typeof NodePath_conversion &\n typeof NodePath_introspection &\n typeof NodePath_context &\n typeof NodePath_removal &\n typeof NodePath_modification &\n typeof NodePath_family &\n typeof NodePath_comments;\n\n// @ts-expect-error TS throws because ensureBlock returns the body node path\n// however, we don't use the return value and treat it as a transform and\n// assertion utilities. For better type inference we annotate it as an\n// assertion method\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ninterface NodePath<T>\n extends NodePathAssertions,\n NodePathValidators,\n NodePathMixins {\n /**\n * @see ./conversion.ts for implementation\n */\n ensureBlock<\n T extends\n | t.Loop\n | t.WithStatement\n | t.Function\n | t.LabeledStatement\n | t.CatchClause,\n >(\n this: NodePath<T>,\n ): asserts this is NodePath<T & { body: t.BlockStatement }>;\n}\n\nexport default NodePath;\n"],"mappings":"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"}
@@ -3,92 +3,105 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getTypeAnnotation = getTypeAnnotation;
7
6
  exports._getTypeAnnotation = _getTypeAnnotation;
8
- exports.isBaseType = isBaseType;
9
- exports.couldBeBaseType = couldBeBaseType;
10
7
  exports.baseTypeStrictlyMatches = baseTypeStrictlyMatches;
8
+ exports.couldBeBaseType = couldBeBaseType;
9
+ exports.getTypeAnnotation = getTypeAnnotation;
10
+ exports.isBaseType = isBaseType;
11
11
  exports.isGenericType = isGenericType;
12
-
13
- var inferers = _interopRequireWildcard(require("./inferers"));
14
-
15
- function t() {
16
- const data = _interopRequireWildcard(require("@babel/types"));
17
-
18
- t = function () {
19
- return data;
20
- };
21
-
22
- return data;
23
- }
24
-
25
- 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; } }
26
-
12
+ var inferers = require("./inferers.js");
13
+ var _t = require("@babel/types");
14
+ const {
15
+ anyTypeAnnotation,
16
+ isAnyTypeAnnotation,
17
+ isArrayTypeAnnotation,
18
+ isBooleanTypeAnnotation,
19
+ isEmptyTypeAnnotation,
20
+ isFlowBaseAnnotation,
21
+ isGenericTypeAnnotation,
22
+ isIdentifier,
23
+ isMixedTypeAnnotation,
24
+ isNumberTypeAnnotation,
25
+ isStringTypeAnnotation,
26
+ isTSArrayType,
27
+ isTSTypeAnnotation,
28
+ isTSTypeReference,
29
+ isTupleTypeAnnotation,
30
+ isTypeAnnotation,
31
+ isUnionTypeAnnotation,
32
+ isVoidTypeAnnotation,
33
+ stringTypeAnnotation,
34
+ voidTypeAnnotation
35
+ } = _t;
27
36
  function getTypeAnnotation() {
28
- if (this.typeAnnotation) return this.typeAnnotation;
29
- let type = this._getTypeAnnotation() || t().anyTypeAnnotation();
30
- if (t().isTypeAnnotation(type)) type = type.typeAnnotation;
31
- return this.typeAnnotation = type;
37
+ let type = this.getData("typeAnnotation");
38
+ if (type != null) {
39
+ return type;
40
+ }
41
+ type = this._getTypeAnnotation() || anyTypeAnnotation();
42
+ if (isTypeAnnotation(type) || isTSTypeAnnotation(type)) {
43
+ type = type.typeAnnotation;
44
+ }
45
+ this.setData("typeAnnotation", type);
46
+ return type;
32
47
  }
33
-
48
+ const typeAnnotationInferringNodes = new WeakSet();
34
49
  function _getTypeAnnotation() {
35
50
  const node = this.node;
36
-
37
51
  if (!node) {
38
52
  if (this.key === "init" && this.parentPath.isVariableDeclarator()) {
39
53
  const declar = this.parentPath.parentPath;
40
54
  const declarParent = declar.parentPath;
41
-
42
55
  if (declar.key === "left" && declarParent.isForInStatement()) {
43
- return t().stringTypeAnnotation();
56
+ return stringTypeAnnotation();
44
57
  }
45
-
46
58
  if (declar.key === "left" && declarParent.isForOfStatement()) {
47
- return t().anyTypeAnnotation();
59
+ return anyTypeAnnotation();
48
60
  }
49
-
50
- return t().voidTypeAnnotation();
61
+ return voidTypeAnnotation();
51
62
  } else {
52
63
  return;
53
64
  }
54
65
  }
55
-
56
66
  if (node.typeAnnotation) {
57
67
  return node.typeAnnotation;
58
68
  }
59
-
60
- let inferer = inferers[node.type];
61
-
62
- if (inferer) {
63
- return inferer.call(this, node);
69
+ if (typeAnnotationInferringNodes.has(node)) {
70
+ return;
64
71
  }
65
-
66
- inferer = inferers[this.parentPath.type];
67
-
68
- if (inferer && inferer.validParent) {
69
- return this.parentPath.getTypeAnnotation();
72
+ typeAnnotationInferringNodes.add(node);
73
+ try {
74
+ var _inferer;
75
+ let inferer = inferers[node.type];
76
+ if (inferer) {
77
+ return inferer.call(this, node);
78
+ }
79
+ inferer = inferers[this.parentPath.type];
80
+ if ((_inferer = inferer) != null && _inferer.validParent) {
81
+ return this.parentPath.getTypeAnnotation();
82
+ }
83
+ } finally {
84
+ typeAnnotationInferringNodes.delete(node);
70
85
  }
71
86
  }
72
-
73
87
  function isBaseType(baseName, soft) {
74
88
  return _isBaseType(baseName, this.getTypeAnnotation(), soft);
75
89
  }
76
-
77
90
  function _isBaseType(baseName, type, soft) {
78
91
  if (baseName === "string") {
79
- return t().isStringTypeAnnotation(type);
92
+ return isStringTypeAnnotation(type);
80
93
  } else if (baseName === "number") {
81
- return t().isNumberTypeAnnotation(type);
94
+ return isNumberTypeAnnotation(type);
82
95
  } else if (baseName === "boolean") {
83
- return t().isBooleanTypeAnnotation(type);
96
+ return isBooleanTypeAnnotation(type);
84
97
  } else if (baseName === "any") {
85
- return t().isAnyTypeAnnotation(type);
98
+ return isAnyTypeAnnotation(type);
86
99
  } else if (baseName === "mixed") {
87
- return t().isMixedTypeAnnotation(type);
100
+ return isMixedTypeAnnotation(type);
88
101
  } else if (baseName === "empty") {
89
- return t().isEmptyTypeAnnotation(type);
102
+ return isEmptyTypeAnnotation(type);
90
103
  } else if (baseName === "void") {
91
- return t().isVoidTypeAnnotation(type);
104
+ return isVoidTypeAnnotation(type);
92
105
  } else {
93
106
  if (soft) {
94
107
  return false;
@@ -97,36 +110,40 @@ function _isBaseType(baseName, type, soft) {
97
110
  }
98
111
  }
99
112
  }
100
-
101
113
  function couldBeBaseType(name) {
102
114
  const type = this.getTypeAnnotation();
103
- if (t().isAnyTypeAnnotation(type)) return true;
104
-
105
- if (t().isUnionTypeAnnotation(type)) {
115
+ if (isAnyTypeAnnotation(type)) return true;
116
+ if (isUnionTypeAnnotation(type)) {
106
117
  for (const type2 of type.types) {
107
- if (t().isAnyTypeAnnotation(type2) || _isBaseType(name, type2, true)) {
118
+ if (isAnyTypeAnnotation(type2) || _isBaseType(name, type2, true)) {
108
119
  return true;
109
120
  }
110
121
  }
111
-
112
122
  return false;
113
123
  } else {
114
124
  return _isBaseType(name, type, true);
115
125
  }
116
126
  }
117
-
118
- function baseTypeStrictlyMatches(right) {
127
+ function baseTypeStrictlyMatches(rightArg) {
119
128
  const left = this.getTypeAnnotation();
120
- right = right.getTypeAnnotation();
121
-
122
- if (!t().isAnyTypeAnnotation(left) && t().isFlowBaseAnnotation(left)) {
129
+ const right = rightArg.getTypeAnnotation();
130
+ if (!isAnyTypeAnnotation(left) && isFlowBaseAnnotation(left)) {
123
131
  return right.type === left.type;
124
132
  }
133
+ return false;
125
134
  }
126
-
127
135
  function isGenericType(genericName) {
128
136
  const type = this.getTypeAnnotation();
129
- return t().isGenericTypeAnnotation(type) && t().isIdentifier(type.id, {
137
+ if (genericName === "Array") {
138
+ if (isTSArrayType(type) || isArrayTypeAnnotation(type) || isTupleTypeAnnotation(type)) {
139
+ return true;
140
+ }
141
+ }
142
+ return isGenericTypeAnnotation(type) && isIdentifier(type.id, {
143
+ name: genericName
144
+ }) || isTSTypeReference(type) && isIdentifier(type.typeName, {
130
145
  name: genericName
131
146
  });
132
- }
147
+ }
148
+
149
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["inferers","require","_t","anyTypeAnnotation","isAnyTypeAnnotation","isArrayTypeAnnotation","isBooleanTypeAnnotation","isEmptyTypeAnnotation","isFlowBaseAnnotation","isGenericTypeAnnotation","isIdentifier","isMixedTypeAnnotation","isNumberTypeAnnotation","isStringTypeAnnotation","isTSArrayType","isTSTypeAnnotation","isTSTypeReference","isTupleTypeAnnotation","isTypeAnnotation","isUnionTypeAnnotation","isVoidTypeAnnotation","stringTypeAnnotation","voidTypeAnnotation","getTypeAnnotation","type","getData","_getTypeAnnotation","typeAnnotation","setData","typeAnnotationInferringNodes","WeakSet","node","key","parentPath","isVariableDeclarator","declar","declarParent","isForInStatement","isForOfStatement","has","add","_inferer","inferer","call","validParent","delete","isBaseType","baseName","soft","_isBaseType","Error","couldBeBaseType","name","type2","types","baseTypeStrictlyMatches","rightArg","left","right","isGenericType","genericName","id","typeName"],"sources":["../../../src/path/inference/index.ts"],"sourcesContent":["import type NodePath from \"../index.ts\";\nimport * as inferers from \"./inferers.ts\";\nimport {\n anyTypeAnnotation,\n isAnyTypeAnnotation,\n isArrayTypeAnnotation,\n isBooleanTypeAnnotation,\n isEmptyTypeAnnotation,\n isFlowBaseAnnotation,\n isGenericTypeAnnotation,\n isIdentifier,\n isMixedTypeAnnotation,\n isNumberTypeAnnotation,\n isStringTypeAnnotation,\n isTSArrayType,\n isTSTypeAnnotation,\n isTSTypeReference,\n isTupleTypeAnnotation,\n isTypeAnnotation,\n isUnionTypeAnnotation,\n isVoidTypeAnnotation,\n stringTypeAnnotation,\n voidTypeAnnotation,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\n\n/**\n * Infer the type of the current `NodePath`.\n */\n\nexport function getTypeAnnotation(this: NodePath): t.FlowType | t.TSType {\n let type = this.getData(\"typeAnnotation\");\n if (type != null) {\n return type;\n }\n type = this._getTypeAnnotation() || anyTypeAnnotation();\n if (isTypeAnnotation(type) || isTSTypeAnnotation(type)) {\n type = type.typeAnnotation;\n }\n this.setData(\"typeAnnotation\", type);\n return type;\n}\n\n// Used to avoid infinite recursion in cases like\n// var b, c; if (0) { c = 1; b = c; } c = b;\n// It also works with indirect recursion.\nconst typeAnnotationInferringNodes = new WeakSet();\n\n/**\n * todo: split up this method\n */\n\nexport function _getTypeAnnotation(this: NodePath): any {\n const node = this.node;\n\n if (!node) {\n // handle initializerless variables, add in checks for loop initializers too\n if (this.key === \"init\" && this.parentPath.isVariableDeclarator()) {\n const declar = this.parentPath.parentPath;\n const declarParent = declar.parentPath;\n\n // for (let NODE in bar) {}\n if (declar.key === \"left\" && declarParent.isForInStatement()) {\n return stringTypeAnnotation();\n }\n\n // for (let NODE of bar) {}\n if (declar.key === \"left\" && declarParent.isForOfStatement()) {\n return anyTypeAnnotation();\n }\n\n return voidTypeAnnotation();\n } else {\n return;\n }\n }\n\n // @ts-expect-error typeAnnotation may not index node\n if (node.typeAnnotation) {\n // @ts-expect-error typeAnnotation may not index node\n return node.typeAnnotation;\n }\n\n if (typeAnnotationInferringNodes.has(node)) {\n // Bail out from type inference to avoid infinite loops\n return;\n }\n typeAnnotationInferringNodes.add(node);\n\n try {\n let inferer =\n // @ts-expect-error inferers do not cover all AST types\n inferers[node.type];\n if (inferer) {\n return inferer.call(this, node);\n }\n\n // @ts-expect-error inferers do not cover all AST types\n inferer = inferers[this.parentPath.type];\n if (inferer?.validParent) {\n return this.parentPath.getTypeAnnotation();\n }\n } finally {\n typeAnnotationInferringNodes.delete(node);\n }\n}\n\nexport function isBaseType(\n this: NodePath,\n baseName: string,\n soft?: boolean,\n): boolean {\n return _isBaseType(baseName, this.getTypeAnnotation(), soft);\n}\n\nfunction _isBaseType(\n baseName: string,\n type?: t.FlowType | t.TSType,\n soft?: boolean,\n): boolean {\n if (baseName === \"string\") {\n return isStringTypeAnnotation(type);\n } else if (baseName === \"number\") {\n return isNumberTypeAnnotation(type);\n } else if (baseName === \"boolean\") {\n return isBooleanTypeAnnotation(type);\n } else if (baseName === \"any\") {\n return isAnyTypeAnnotation(type);\n } else if (baseName === \"mixed\") {\n return isMixedTypeAnnotation(type);\n } else if (baseName === \"empty\") {\n return isEmptyTypeAnnotation(type);\n } else if (baseName === \"void\") {\n return isVoidTypeAnnotation(type);\n } else {\n if (soft) {\n return false;\n } else {\n throw new Error(`Unknown base type ${baseName}`);\n }\n }\n}\n\nexport function couldBeBaseType(this: NodePath, name: string): boolean {\n const type = this.getTypeAnnotation();\n if (isAnyTypeAnnotation(type)) return true;\n\n if (isUnionTypeAnnotation(type)) {\n for (const type2 of type.types) {\n if (isAnyTypeAnnotation(type2) || _isBaseType(name, type2, true)) {\n return true;\n }\n }\n return false;\n } else {\n return _isBaseType(name, type, true);\n }\n}\n\nexport function baseTypeStrictlyMatches(\n this: NodePath,\n rightArg: NodePath,\n): boolean {\n const left = this.getTypeAnnotation();\n const right = rightArg.getTypeAnnotation();\n\n if (!isAnyTypeAnnotation(left) && isFlowBaseAnnotation(left)) {\n return right.type === left.type;\n }\n return false;\n}\n\nexport function isGenericType(this: NodePath, genericName: string): boolean {\n const type = this.getTypeAnnotation();\n if (genericName === \"Array\") {\n // T[]\n if (\n isTSArrayType(type) ||\n isArrayTypeAnnotation(type) ||\n isTupleTypeAnnotation(type)\n ) {\n return true;\n }\n }\n return (\n (isGenericTypeAnnotation(type) &&\n isIdentifier(type.id, {\n name: genericName,\n })) ||\n (isTSTypeReference(type) &&\n isIdentifier(type.typeName, {\n name: genericName,\n }))\n );\n}\n"],"mappings":"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"}