@babel/traverse 7.19.6 → 7.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of @babel/traverse might be problematic. Click here for more details.

Files changed (60) hide show
  1. package/lib/cache.js +0 -3
  2. package/lib/cache.js.map +1 -1
  3. package/lib/context.js +7 -21
  4. package/lib/context.js.map +1 -1
  5. package/lib/hub.js +0 -6
  6. package/lib/hub.js.map +1 -1
  7. package/lib/index.js +3 -21
  8. package/lib/index.js.map +1 -1
  9. package/lib/path/ancestry.js +3 -23
  10. package/lib/path/ancestry.js.map +1 -1
  11. package/lib/path/comments.js +0 -4
  12. package/lib/path/comments.js.map +1 -1
  13. package/lib/path/context.js +11 -52
  14. package/lib/path/context.js.map +1 -1
  15. package/lib/path/conversion.js +16 -75
  16. package/lib/path/conversion.js.map +1 -1
  17. package/lib/path/evaluation.js +9 -85
  18. package/lib/path/evaluation.js.map +1 -1
  19. package/lib/path/family.js +6 -73
  20. package/lib/path/family.js.map +1 -1
  21. package/lib/path/index.js +2 -61
  22. package/lib/path/index.js.map +1 -1
  23. package/lib/path/inference/index.js +2 -27
  24. package/lib/path/inference/index.js.map +1 -1
  25. package/lib/path/inference/inferer-reference.js +10 -32
  26. package/lib/path/inference/inferer-reference.js.map +1 -1
  27. package/lib/path/inference/inferers.js +4 -44
  28. package/lib/path/inference/inferers.js.map +1 -1
  29. package/lib/path/inference/util.js +0 -4
  30. package/lib/path/inference/util.js.map +1 -1
  31. package/lib/path/introspection.js +17 -59
  32. package/lib/path/introspection.js.map +1 -1
  33. package/lib/path/lib/hoister.js +7 -23
  34. package/lib/path/lib/hoister.js.map +1 -1
  35. package/lib/path/lib/removal-hooks.js +7 -3
  36. package/lib/path/lib/removal-hooks.js.map +1 -1
  37. package/lib/path/lib/virtual-types-validator.js +0 -23
  38. package/lib/path/lib/virtual-types-validator.js.map +1 -1
  39. package/lib/path/lib/virtual-types.js +1 -0
  40. package/lib/path/lib/virtual-types.js.map +1 -1
  41. package/lib/path/modification.js +12 -47
  42. package/lib/path/modification.js.map +1 -1
  43. package/lib/path/removal.js +0 -16
  44. package/lib/path/removal.js.map +1 -1
  45. package/lib/path/replacement.js +8 -50
  46. package/lib/path/replacement.js.map +1 -1
  47. package/lib/scope/binding.js +2 -14
  48. package/lib/scope/binding.js.map +1 -1
  49. package/lib/scope/index.js +22 -184
  50. package/lib/scope/index.js.map +1 -1
  51. package/lib/scope/lib/renamer.js +2 -25
  52. package/lib/scope/lib/renamer.js.map +1 -1
  53. package/lib/traverse-node.js +0 -7
  54. package/lib/traverse-node.js.map +1 -1
  55. package/lib/visitors.js +13 -44
  56. package/lib/visitors.js.map +1 -1
  57. package/package.json +4 -4
  58. package/scripts/generators/asserts.js +0 -25
  59. package/scripts/generators/validators.js +0 -27
  60. package/scripts/package.json +0 -1
package/lib/path/index.js CHANGED
@@ -4,60 +4,36 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = exports.SHOULD_STOP = exports.SHOULD_SKIP = exports.REMOVED = void 0;
7
-
8
7
  var virtualTypes = require("./lib/virtual-types");
9
-
10
8
  var _debug = require("debug");
11
-
12
9
  var _index = require("../index");
13
-
14
10
  var _scope = require("../scope");
15
-
16
11
  var _t = require("@babel/types");
17
-
18
12
  var t = _t;
19
-
20
13
  var _cache = require("../cache");
21
-
22
14
  var _generator = require("@babel/generator");
23
-
24
15
  var NodePath_ancestry = require("./ancestry");
25
-
26
16
  var NodePath_inference = require("./inference");
27
-
28
17
  var NodePath_replacement = require("./replacement");
29
-
30
18
  var NodePath_evaluation = require("./evaluation");
31
-
32
19
  var NodePath_conversion = require("./conversion");
33
-
34
20
  var NodePath_introspection = require("./introspection");
35
-
36
21
  var NodePath_context = require("./context");
37
-
38
22
  var NodePath_removal = require("./removal");
39
-
40
23
  var NodePath_modification = require("./modification");
41
-
42
24
  var NodePath_family = require("./family");
43
-
44
25
  var NodePath_comments = require("./comments");
45
-
46
26
  var NodePath_virtual_types_validator = require("./lib/virtual-types-validator");
47
-
48
27
  const {
49
28
  validate
50
29
  } = _t;
51
-
52
30
  const debug = _debug("babel");
53
-
54
31
  const REMOVED = 1 << 0;
55
32
  exports.REMOVED = REMOVED;
56
33
  const SHOULD_STOP = 1 << 1;
57
34
  exports.SHOULD_STOP = SHOULD_STOP;
58
35
  const SHOULD_SKIP = 1 << 2;
59
36
  exports.SHOULD_SKIP = SHOULD_SKIP;
60
-
61
37
  class NodePath {
62
38
  constructor(hub, parent) {
63
39
  this.contexts = [];
@@ -77,7 +53,6 @@ class NodePath {
77
53
  this.context = null;
78
54
  this.scope = null;
79
55
  }
80
-
81
56
  static get({
82
57
  hub,
83
58
  parentPath,
@@ -89,97 +64,74 @@ class NodePath {
89
64
  if (!hub && parentPath) {
90
65
  hub = parentPath.hub;
91
66
  }
92
-
93
67
  if (!parent) {
94
68
  throw new Error("To get a node path the parent needs to exist");
95
69
  }
96
-
97
- const targetNode = container[key];
98
-
70
+ const targetNode =
71
+ container[key];
99
72
  let paths = _cache.path.get(parent);
100
-
101
73
  if (!paths) {
102
74
  paths = new Map();
103
-
104
75
  _cache.path.set(parent, paths);
105
76
  }
106
-
107
77
  let path = paths.get(targetNode);
108
-
109
78
  if (!path) {
110
79
  path = new NodePath(hub, parent);
111
80
  if (targetNode) paths.set(targetNode, path);
112
81
  }
113
-
114
82
  path.setup(parentPath, container, listKey, key);
115
83
  return path;
116
84
  }
117
-
118
85
  getScope(scope) {
119
86
  return this.isScope() ? new _scope.default(this) : scope;
120
87
  }
121
-
122
88
  setData(key, val) {
123
89
  if (this.data == null) {
124
90
  this.data = Object.create(null);
125
91
  }
126
-
127
92
  return this.data[key] = val;
128
93
  }
129
-
130
94
  getData(key, def) {
131
95
  if (this.data == null) {
132
96
  this.data = Object.create(null);
133
97
  }
134
-
135
98
  let val = this.data[key];
136
99
  if (val === undefined && def !== undefined) val = this.data[key] = def;
137
100
  return val;
138
101
  }
139
-
140
102
  hasNode() {
141
103
  return this.node != null;
142
104
  }
143
-
144
105
  buildCodeFrameError(msg, Error = SyntaxError) {
145
106
  return this.hub.buildError(this.node, msg, Error);
146
107
  }
147
-
148
108
  traverse(visitor, state) {
149
109
  (0, _index.default)(this.node, visitor, this.scope, state, this);
150
110
  }
151
-
152
111
  set(key, node) {
153
112
  validate(this.node, key, node);
154
113
  this.node[key] = node;
155
114
  }
156
-
157
115
  getPathLocation() {
158
116
  const parts = [];
159
117
  let path = this;
160
-
161
118
  do {
162
119
  let key = path.key;
163
120
  if (path.inList) key = `${path.listKey}[${key}]`;
164
121
  parts.unshift(key);
165
122
  } while (path = path.parentPath);
166
-
167
123
  return parts.join(".");
168
124
  }
169
-
170
125
  debug(message) {
171
126
  if (!debug.enabled) return;
172
127
  debug(`${this.getPathLocation()} ${this.type}: ${message}`);
173
128
  }
174
-
175
129
  toString() {
176
130
  return (0, _generator.default)(this.node).code;
177
131
  }
178
-
179
132
  get inList() {
180
133
  return !!this.listKey;
181
134
  }
182
-
183
135
  set inList(inList) {
184
136
  if (!inList) {
185
137
  this.listKey = null;
@@ -189,11 +141,9 @@ class NodePath {
189
141
  get parentKey() {
190
142
  return this.listKey || this.key;
191
143
  }
192
-
193
144
  get shouldSkip() {
194
145
  return !!(this._traverseFlags & SHOULD_SKIP);
195
146
  }
196
-
197
147
  set shouldSkip(v) {
198
148
  if (v) {
199
149
  this._traverseFlags |= SHOULD_SKIP;
@@ -201,11 +151,9 @@ class NodePath {
201
151
  this._traverseFlags &= ~SHOULD_SKIP;
202
152
  }
203
153
  }
204
-
205
154
  get shouldStop() {
206
155
  return !!(this._traverseFlags & SHOULD_STOP);
207
156
  }
208
-
209
157
  set shouldStop(v) {
210
158
  if (v) {
211
159
  this._traverseFlags |= SHOULD_STOP;
@@ -213,11 +161,9 @@ class NodePath {
213
161
  this._traverseFlags &= ~SHOULD_STOP;
214
162
  }
215
163
  }
216
-
217
164
  get removed() {
218
165
  return !!(this._traverseFlags & REMOVED);
219
166
  }
220
-
221
167
  set removed(v) {
222
168
  if (v) {
223
169
  this._traverseFlags |= REMOVED;
@@ -225,9 +171,7 @@ class NodePath {
225
171
  this._traverseFlags &= ~REMOVED;
226
172
  }
227
173
  }
228
-
229
174
  }
230
-
231
175
  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);
232
176
  {
233
177
  NodePath.prototype._guessExecutionStatusRelativeToDifferentFunctions = NodePath_introspection._guessExecutionStatusRelativeTo;
@@ -236,7 +180,6 @@ Object.assign(NodePath.prototype, NodePath_ancestry, NodePath_inference, NodePat
236
180
  for (const type of t.TYPES) {
237
181
  const typeKey = `is${type}`;
238
182
  const fn = t[typeKey];
239
-
240
183
  NodePath.prototype[typeKey] = function (opts) {
241
184
  return fn(this.node, opts);
242
185
  };
@@ -249,12 +192,10 @@ for (const type of t.TYPES) {
249
192
  }
250
193
 
251
194
  Object.assign(NodePath.prototype, NodePath_virtual_types_validator);
252
-
253
195
  for (const type of Object.keys(virtualTypes)) {
254
196
  if (type[0] === "_") continue;
255
197
  if (!t.TYPES.includes(type)) t.TYPES.push(type);
256
198
  }
257
-
258
199
  var _default = NodePath;
259
200
  exports.default = _default;
260
201
 
@@ -1 +1 @@
1
- {"version":3,"names":["validate","debug","buildDebug","REMOVED","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","pathCache","Map","set","path","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","NodePath_ancestry","NodePath_inference","NodePath_replacement","NodePath_evaluation","NodePath_conversion","NodePath_introspection","NodePath_context","NodePath_removal","NodePath_modification","NodePath_family","NodePath_comments","_guessExecutionStatusRelativeToDifferentFunctions","_guessExecutionStatusRelativeTo","t","TYPES","typeKey","fn","TypeError","NodePath_virtual_types_validator","keys","virtualTypes","includes","push"],"sources":["../../src/path/index.ts"],"sourcesContent":["import type { HubInterface } from \"../hub\";\nimport type TraversalContext from \"../context\";\nimport * as virtualTypes from \"./lib/virtual-types\";\nimport buildDebug from \"debug\";\nimport traverse from \"../index\";\nimport type { Visitor } from \"../types\";\nimport Scope from \"../scope\";\nimport { validate } from \"@babel/types\";\nimport * as t from \"@babel/types\";\nimport { path as pathCache } from \"../cache\";\nimport generator from \"@babel/generator\";\n\n// NodePath is split across many files.\nimport * as NodePath_ancestry from \"./ancestry\";\nimport * as NodePath_inference from \"./inference\";\nimport * as NodePath_replacement from \"./replacement\";\nimport * as NodePath_evaluation from \"./evaluation\";\nimport * as NodePath_conversion from \"./conversion\";\nimport * as NodePath_introspection from \"./introspection\";\nimport * as NodePath_context from \"./context\";\nimport * as NodePath_removal from \"./removal\";\nimport * as NodePath_modification from \"./modification\";\nimport * as NodePath_family from \"./family\";\nimport * as NodePath_comments from \"./comments\";\nimport * as NodePath_virtual_types_validator from \"./lib/virtual-types-validator\";\nimport type { NodePathAssetions } from \"./generated/asserts\";\nimport type { NodePathValidators } from \"./generated/validators\";\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: any = null;\n // this.shouldSkip = false; this.shouldStop = false; this.removed = false;\n _traverseFlags: number = 0;\n skipKeys: any = 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 let paths = pathCache.get(parent);\n if (!paths) {\n paths = new Map();\n pathCache.set(parent, paths);\n }\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 NodePathAssetions,\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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"}
1
+ {"version":3,"names":["validate","debug","buildDebug","REMOVED","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","pathCache","Map","set","path","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","NodePath_ancestry","NodePath_inference","NodePath_replacement","NodePath_evaluation","NodePath_conversion","NodePath_introspection","NodePath_context","NodePath_removal","NodePath_modification","NodePath_family","NodePath_comments","_guessExecutionStatusRelativeToDifferentFunctions","_guessExecutionStatusRelativeTo","t","TYPES","typeKey","fn","TypeError","NodePath_virtual_types_validator","keys","virtualTypes","includes","push"],"sources":["../../src/path/index.ts"],"sourcesContent":["import type { HubInterface } from \"../hub\";\nimport type TraversalContext from \"../context\";\nimport * as virtualTypes from \"./lib/virtual-types\";\nimport buildDebug from \"debug\";\nimport traverse from \"../index\";\nimport type { Visitor } from \"../types\";\nimport Scope from \"../scope\";\nimport { validate } from \"@babel/types\";\nimport * as t from \"@babel/types\";\nimport { path as pathCache } from \"../cache\";\nimport generator from \"@babel/generator\";\n\n// NodePath is split across many files.\nimport * as NodePath_ancestry from \"./ancestry\";\nimport * as NodePath_inference from \"./inference\";\nimport * as NodePath_replacement from \"./replacement\";\nimport * as NodePath_evaluation from \"./evaluation\";\nimport * as NodePath_conversion from \"./conversion\";\nimport * as NodePath_introspection from \"./introspection\";\nimport * as NodePath_context from \"./context\";\nimport * as NodePath_removal from \"./removal\";\nimport * as NodePath_modification from \"./modification\";\nimport * as NodePath_family from \"./family\";\nimport * as NodePath_comments from \"./comments\";\nimport * as NodePath_virtual_types_validator from \"./lib/virtual-types-validator\";\nimport type { NodePathAssetions } from \"./generated/asserts\";\nimport type { NodePathValidators } from \"./generated/validators\";\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: any = null;\n // this.shouldSkip = false; this.shouldStop = false; this.removed = false;\n _traverseFlags: number = 0;\n skipKeys: any = 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 let paths = pathCache.get(parent);\n if (!paths) {\n paths = new Map();\n pathCache.set(parent, paths);\n }\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 NodePathAssetions,\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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"}
@@ -9,11 +9,8 @@ exports.couldBeBaseType = couldBeBaseType;
9
9
  exports.getTypeAnnotation = getTypeAnnotation;
10
10
  exports.isBaseType = isBaseType;
11
11
  exports.isGenericType = isGenericType;
12
-
13
12
  var inferers = require("./inferers");
14
-
15
13
  var _t = require("@babel/types");
16
-
17
14
  const {
18
15
  anyTypeAnnotation,
19
16
  isAnyTypeAnnotation,
@@ -39,17 +36,13 @@ const {
39
36
 
40
37
  function getTypeAnnotation() {
41
38
  let type = this.getData("typeAnnotation");
42
-
43
39
  if (type != null) {
44
40
  return type;
45
41
  }
46
-
47
42
  type = this._getTypeAnnotation() || anyTypeAnnotation();
48
-
49
43
  if (isTypeAnnotation(type) || isTSTypeAnnotation(type)) {
50
44
  type = type.typeAnnotation;
51
45
  }
52
-
53
46
  this.setData("typeAnnotation", type);
54
47
  return type;
55
48
  }
@@ -58,7 +51,6 @@ const typeAnnotationInferringNodes = new WeakSet();
58
51
 
59
52
  function _getTypeAnnotation() {
60
53
  const node = this.node;
61
-
62
54
  if (!node) {
63
55
  if (this.key === "init" && this.parentPath.isVariableDeclarator()) {
64
56
  const declar = this.parentPath.parentPath;
@@ -71,7 +63,6 @@ function _getTypeAnnotation() {
71
63
  if (declar.key === "left" && declarParent.isForOfStatement()) {
72
64
  return anyTypeAnnotation();
73
65
  }
74
-
75
66
  return voidTypeAnnotation();
76
67
  } else {
77
68
  return;
@@ -81,24 +72,19 @@ function _getTypeAnnotation() {
81
72
  if (node.typeAnnotation) {
82
73
  return node.typeAnnotation;
83
74
  }
84
-
85
75
  if (typeAnnotationInferringNodes.has(node)) {
86
76
  return;
87
77
  }
88
-
89
78
  typeAnnotationInferringNodes.add(node);
90
-
91
79
  try {
92
80
  var _inferer;
93
-
94
- let inferer = inferers[node.type];
95
-
81
+ let inferer =
82
+ inferers[node.type];
96
83
  if (inferer) {
97
84
  return inferer.call(this, node);
98
85
  }
99
86
 
100
87
  inferer = inferers[this.parentPath.type];
101
-
102
88
  if ((_inferer = inferer) != null && _inferer.validParent) {
103
89
  return this.parentPath.getTypeAnnotation();
104
90
  }
@@ -106,11 +92,9 @@ function _getTypeAnnotation() {
106
92
  typeAnnotationInferringNodes.delete(node);
107
93
  }
108
94
  }
109
-
110
95
  function isBaseType(baseName, soft) {
111
96
  return _isBaseType(baseName, this.getTypeAnnotation(), soft);
112
97
  }
113
-
114
98
  function _isBaseType(baseName, type, soft) {
115
99
  if (baseName === "string") {
116
100
  return isStringTypeAnnotation(type);
@@ -134,44 +118,35 @@ function _isBaseType(baseName, type, soft) {
134
118
  }
135
119
  }
136
120
  }
137
-
138
121
  function couldBeBaseType(name) {
139
122
  const type = this.getTypeAnnotation();
140
123
  if (isAnyTypeAnnotation(type)) return true;
141
-
142
124
  if (isUnionTypeAnnotation(type)) {
143
125
  for (const type2 of type.types) {
144
126
  if (isAnyTypeAnnotation(type2) || _isBaseType(name, type2, true)) {
145
127
  return true;
146
128
  }
147
129
  }
148
-
149
130
  return false;
150
131
  } else {
151
132
  return _isBaseType(name, type, true);
152
133
  }
153
134
  }
154
-
155
135
  function baseTypeStrictlyMatches(rightArg) {
156
136
  const left = this.getTypeAnnotation();
157
137
  const right = rightArg.getTypeAnnotation();
158
-
159
138
  if (!isAnyTypeAnnotation(left) && isFlowBaseAnnotation(left)) {
160
139
  return right.type === left.type;
161
140
  }
162
-
163
141
  return false;
164
142
  }
165
-
166
143
  function isGenericType(genericName) {
167
144
  const type = this.getTypeAnnotation();
168
-
169
145
  if (genericName === "Array") {
170
146
  if (isTSArrayType(type) || isArrayTypeAnnotation(type) || isTupleTypeAnnotation(type)) {
171
147
  return true;
172
148
  }
173
149
  }
174
-
175
150
  return isGenericTypeAnnotation(type) && isIdentifier(type.id, {
176
151
  name: genericName
177
152
  }) || isTSTypeReference(type) && isIdentifier(type.typeName, {
@@ -1 +1 @@
1
- {"version":3,"names":["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","inferers","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\";\nimport * as inferers from \"./inferers\";\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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"}
1
+ {"version":3,"names":["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","inferers","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\";\nimport * as inferers from \"./inferers\";\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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"}
@@ -4,22 +4,18 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = _default;
7
-
8
7
  var _t = require("@babel/types");
9
-
10
8
  var _util = require("./util");
11
-
12
9
  const {
13
10
  BOOLEAN_NUMBER_BINARY_OPERATORS,
14
11
  createTypeAnnotationBasedOnTypeof,
15
12
  numberTypeAnnotation,
16
13
  voidTypeAnnotation
17
14
  } = _t;
18
-
19
15
  function _default(node) {
20
16
  if (!this.isReferenced()) return;
21
- const binding = this.scope.getBinding(node.name);
22
17
 
18
+ const binding = this.scope.getBinding(node.name);
23
19
  if (binding) {
24
20
  if (binding.identifier.typeAnnotation) {
25
21
  return binding.identifier.typeAnnotation;
@@ -32,55 +28,49 @@ function _default(node) {
32
28
  return voidTypeAnnotation();
33
29
  } else if (node.name === "NaN" || node.name === "Infinity") {
34
30
  return numberTypeAnnotation();
35
- } else if (node.name === "arguments") {}
31
+ } else if (node.name === "arguments") {
32
+ }
36
33
  }
37
-
38
34
  function getTypeAnnotationBindingConstantViolations(binding, path, name) {
39
35
  const types = [];
40
36
  const functionConstantViolations = [];
41
37
  let constantViolations = getConstantViolationsBefore(binding, path, functionConstantViolations);
42
38
  const testType = getConditionalAnnotation(binding, path, name);
43
-
44
39
  if (testType) {
45
40
  const testConstantViolations = getConstantViolationsBefore(binding, testType.ifStatement);
41
+
46
42
  constantViolations = constantViolations.filter(path => testConstantViolations.indexOf(path) < 0);
43
+
47
44
  types.push(testType.typeAnnotation);
48
45
  }
49
-
50
46
  if (constantViolations.length) {
47
+
51
48
  constantViolations.push(...functionConstantViolations);
52
49
 
53
50
  for (const violation of constantViolations) {
54
51
  types.push(violation.getTypeAnnotation());
55
52
  }
56
53
  }
57
-
58
54
  if (!types.length) {
59
55
  return;
60
56
  }
61
-
62
57
  return (0, _util.createUnionType)(types);
63
58
  }
64
-
65
59
  function getConstantViolationsBefore(binding, path, functions) {
66
60
  const violations = binding.constantViolations.slice();
67
61
  violations.unshift(binding.path);
68
62
  return violations.filter(violation => {
69
63
  violation = violation.resolve();
70
-
71
64
  const status = violation._guessExecutionStatusRelativeTo(path);
72
-
73
65
  if (functions && status === "unknown") functions.push(violation);
74
66
  return status === "before";
75
67
  });
76
68
  }
77
-
78
69
  function inferAnnotationFromBinaryExpression(name, path) {
79
70
  const operator = path.node.operator;
80
71
  const right = path.get("right").resolve();
81
72
  const left = path.get("left").resolve();
82
73
  let target;
83
-
84
74
  if (left.isIdentifier({
85
75
  name
86
76
  })) {
@@ -90,23 +80,19 @@ function inferAnnotationFromBinaryExpression(name, path) {
90
80
  })) {
91
81
  target = left;
92
82
  }
93
-
94
83
  if (target) {
95
84
  if (operator === "===") {
96
85
  return target.getTypeAnnotation();
97
86
  }
98
-
99
87
  if (BOOLEAN_NUMBER_BINARY_OPERATORS.indexOf(operator) >= 0) {
100
88
  return numberTypeAnnotation();
101
89
  }
102
-
103
90
  return;
104
91
  }
105
-
106
92
  if (operator !== "===" && operator !== "==") return;
93
+
107
94
  let typeofPath;
108
95
  let typePath;
109
-
110
96
  if (left.isUnaryExpression({
111
97
  operator: "typeof"
112
98
  })) {
@@ -118,48 +104,42 @@ function inferAnnotationFromBinaryExpression(name, path) {
118
104
  typeofPath = right;
119
105
  typePath = left;
120
106
  }
121
-
122
107
  if (!typeofPath) return;
123
108
  if (!typeofPath.get("argument").isIdentifier({
124
109
  name
125
110
  })) return;
111
+
126
112
  typePath = typePath.resolve();
127
113
  if (!typePath.isLiteral()) return;
114
+
128
115
  const typeValue = typePath.node.value;
129
116
  if (typeof typeValue !== "string") return;
117
+
130
118
  return createTypeAnnotationBasedOnTypeof(typeValue);
131
119
  }
132
-
133
120
  function getParentConditionalPath(binding, path, name) {
134
121
  let parentPath;
135
-
136
122
  while (parentPath = path.parentPath) {
137
123
  if (parentPath.isIfStatement() || parentPath.isConditionalExpression()) {
138
124
  if (path.key === "test") {
139
125
  return;
140
126
  }
141
-
142
127
  return parentPath;
143
128
  }
144
-
145
129
  if (parentPath.isFunction()) {
146
130
  if (parentPath.parentPath.scope.getBinding(name) !== binding) return;
147
131
  }
148
-
149
132
  path = parentPath;
150
133
  }
151
134
  }
152
-
153
135
  function getConditionalAnnotation(binding, path, name) {
154
136
  const ifStatement = getParentConditionalPath(binding, path, name);
155
137
  if (!ifStatement) return;
156
138
  const test = ifStatement.get("test");
157
139
  const paths = [test];
158
140
  const types = [];
159
-
160
141
  for (let i = 0; i < paths.length; i++) {
161
142
  const path = paths[i];
162
-
163
143
  if (path.isLogicalExpression()) {
164
144
  if (path.node.operator === "&&") {
165
145
  paths.push(path.get("left"));
@@ -170,14 +150,12 @@ function getConditionalAnnotation(binding, path, name) {
170
150
  if (type) types.push(type);
171
151
  }
172
152
  }
173
-
174
153
  if (types.length) {
175
154
  return {
176
155
  typeAnnotation: (0, _util.createUnionType)(types),
177
156
  ifStatement
178
157
  };
179
158
  }
180
-
181
159
  return getConditionalAnnotation(binding, ifStatement, name);
182
160
  }
183
161