@babel/traverse 7.22.5 → 7.22.7

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.

package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > The Babel Traverse module maintains the overall tree state, and is responsible for replacing, removing, and adding nodes
4
4
 
5
- See our website [@babel/traverse](https://babeljs.io/docs/en/babel-traverse) for more information or the [issues](https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22pkg%3A%20traverse%22+is%3Aopen) associated with this package.
5
+ See our website [@babel/traverse](https://babeljs.io/docs/babel-traverse) for more information or the [issues](https://github.com/babel/babel/issues?utf8=%E2%9C%93&q=is%3Aissue+label%3A%22pkg%3A%20traverse%22+is%3Aopen) associated with this package.
6
6
 
7
7
  ## Install
8
8
 
package/lib/cache.js CHANGED
@@ -6,9 +6,11 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.clear = clear;
7
7
  exports.clearPath = clearPath;
8
8
  exports.clearScope = clearScope;
9
+ exports.getCachedPaths = getCachedPaths;
10
+ exports.getOrCreateCachedPaths = getOrCreateCachedPaths;
9
11
  exports.scope = exports.path = void 0;
10
- let path = new WeakMap();
11
- exports.path = path;
12
+ let pathsCache = new WeakMap();
13
+ exports.path = pathsCache;
12
14
  let scope = new WeakMap();
13
15
  exports.scope = scope;
14
16
  function clear() {
@@ -16,10 +18,22 @@ function clear() {
16
18
  clearScope();
17
19
  }
18
20
  function clearPath() {
19
- exports.path = path = new WeakMap();
21
+ exports.path = pathsCache = new WeakMap();
20
22
  }
21
23
  function clearScope() {
22
24
  exports.scope = scope = new WeakMap();
23
25
  }
26
+ const nullHub = Object.freeze({});
27
+ function getCachedPaths(hub, parent) {
28
+ var _pathsCache$get;
29
+ return (_pathsCache$get = pathsCache.get(hub != null ? hub : nullHub)) == null ? void 0 : _pathsCache$get.get(parent);
30
+ }
31
+ function getOrCreateCachedPaths(hub, parent) {
32
+ let parents = pathsCache.get(hub != null ? hub : nullHub);
33
+ if (!parents) pathsCache.set(hub != null ? hub : nullHub, parents = new WeakMap());
34
+ let paths = parents.get(parent);
35
+ if (!paths) parents.set(parent, paths = new Map());
36
+ return paths;
37
+ }
24
38
 
25
39
  //# sourceMappingURL=cache.js.map
package/lib/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["path","WeakMap","exports","scope","clear","clearPath","clearScope"],"sources":["../src/cache.ts"],"sourcesContent":["import type { Node } from \"@babel/types\";\nimport type NodePath from \"./path\";\nimport type Scope from \"./scope\";\n\nexport let path: WeakMap<Node, Map<Node, NodePath>> = new WeakMap();\nexport let scope: WeakMap<Node, Scope> = new WeakMap();\n\nexport function clear() {\n clearPath();\n clearScope();\n}\n\nexport function clearPath() {\n path = new WeakMap();\n}\n\nexport function clearScope() {\n scope = new WeakMap();\n}\n"],"mappings":";;;;;;;;;AAIO,IAAIA,IAAwC,GAAG,IAAIC,OAAO,CAAC,CAAC;AAACC,OAAA,CAAAF,IAAA,GAAAA,IAAA;AAC7D,IAAIG,KAA2B,GAAG,IAAIF,OAAO,CAAC,CAAC;AAACC,OAAA,CAAAC,KAAA,GAAAA,KAAA;AAEhD,SAASC,KAAKA,CAAA,EAAG;EACtBC,SAAS,CAAC,CAAC;EACXC,UAAU,CAAC,CAAC;AACd;AAEO,SAASD,SAASA,CAAA,EAAG;EAC1BH,OAAA,CAAAF,IAAA,GAAAA,IAAI,GAAG,IAAIC,OAAO,CAAC,CAAC;AACtB;AAEO,SAASK,UAAUA,CAAA,EAAG;EAC3BJ,OAAA,CAAAC,KAAA,GAAAA,KAAK,GAAG,IAAIF,OAAO,CAAC,CAAC;AACvB"}
1
+ {"version":3,"names":["pathsCache","WeakMap","exports","path","scope","clear","clearPath","clearScope","nullHub","Object","freeze","getCachedPaths","hub","parent","_pathsCache$get","get","getOrCreateCachedPaths","parents","set","paths","Map"],"sources":["../src/cache.ts"],"sourcesContent":["import type { Node } from \"@babel/types\";\nimport type NodePath from \"./path\";\nimport type Scope from \"./scope\";\nimport type { HubInterface } from \"./hub\";\n\nlet pathsCache: WeakMap<\n HubInterface | typeof nullHub,\n WeakMap<Node, Map<Node, NodePath>>\n> = new WeakMap();\nexport { pathsCache as path };\nexport let scope: WeakMap<Node, Scope> = new WeakMap();\n\nexport function clear() {\n clearPath();\n clearScope();\n}\n\nexport function clearPath() {\n pathsCache = new WeakMap();\n}\n\nexport function clearScope() {\n scope = new WeakMap();\n}\n\n// NodePath#hub can be null, but it's not a valid weakmap key because it\n// cannot be collected by GC. Use an object, knowing tht it will not be\n// collected anyway. It's not a memory leak because pathsCache.get(nullHub)\n// is itself a weakmap, so its entries can still be collected.\nconst nullHub = Object.freeze({} as const);\n\nexport function getCachedPaths(hub: HubInterface | null, parent: Node) {\n return pathsCache.get(hub ?? nullHub)?.get(parent);\n}\n\nexport function getOrCreateCachedPaths(hub: HubInterface | null, parent: Node) {\n let parents = pathsCache.get(hub ?? nullHub);\n if (!parents) pathsCache.set(hub ?? nullHub, (parents = new WeakMap()));\n\n let paths = parents.get(parent);\n if (!paths) parents.set(parent, (paths = new Map()));\n\n return paths;\n}\n"],"mappings":";;;;;;;;;;;AAKA,IAAIA,UAGH,GAAG,IAAIC,OAAO,CAAC,CAAC;AAACC,OAAA,CAAAC,IAAA,GAAAH,UAAA;AAEX,IAAII,KAA2B,GAAG,IAAIH,OAAO,CAAC,CAAC;AAACC,OAAA,CAAAE,KAAA,GAAAA,KAAA;AAEhD,SAASC,KAAKA,CAAA,EAAG;EACtBC,SAAS,CAAC,CAAC;EACXC,UAAU,CAAC,CAAC;AACd;AAEO,SAASD,SAASA,CAAA,EAAG;EAC1BJ,OAAA,CAAAC,IAAA,GAAAH,UAAU,GAAG,IAAIC,OAAO,CAAC,CAAC;AAC5B;AAEO,SAASM,UAAUA,CAAA,EAAG;EAC3BL,OAAA,CAAAE,KAAA,GAAAA,KAAK,GAAG,IAAIH,OAAO,CAAC,CAAC;AACvB;AAMA,MAAMO,OAAO,GAAGC,MAAM,CAACC,MAAM,CAAC,CAAC,CAAU,CAAC;AAEnC,SAASC,cAAcA,CAACC,GAAwB,EAAEC,MAAY,EAAE;EAAA,IAAAC,eAAA;EACrE,QAAAA,eAAA,GAAOd,UAAU,CAACe,GAAG,CAACH,GAAG,WAAHA,GAAG,GAAIJ,OAAO,CAAC,qBAA9BM,eAAA,CAAgCC,GAAG,CAACF,MAAM,CAAC;AACpD;AAEO,SAASG,sBAAsBA,CAACJ,GAAwB,EAAEC,MAAY,EAAE;EAC7E,IAAII,OAAO,GAAGjB,UAAU,CAACe,GAAG,CAACH,GAAG,WAAHA,GAAG,GAAIJ,OAAO,CAAC;EAC5C,IAAI,CAACS,OAAO,EAAEjB,UAAU,CAACkB,GAAG,CAACN,GAAG,WAAHA,GAAG,GAAIJ,OAAO,EAAGS,OAAO,GAAG,IAAIhB,OAAO,CAAC,CAAE,CAAC;EAEvE,IAAIkB,KAAK,GAAGF,OAAO,CAACF,GAAG,CAACF,MAAM,CAAC;EAC/B,IAAI,CAACM,KAAK,EAAEF,OAAO,CAACC,GAAG,CAACL,MAAM,EAAGM,KAAK,GAAG,IAAIC,GAAG,CAAC,CAAE,CAAC;EAEpD,OAAOD,KAAK;AACd"}
package/lib/index.js CHANGED
@@ -35,18 +35,21 @@ const {
35
35
  removeProperties,
36
36
  traverseFast
37
37
  } = _t;
38
- function traverse(parent, opts = {}, scope, state, parentPath) {
38
+ function traverse(parent, opts = {}, scope, state, parentPath, visitSelf) {
39
39
  if (!parent) return;
40
40
  if (!opts.noScope && !scope) {
41
41
  if (parent.type !== "Program" && parent.type !== "File") {
42
42
  throw new Error("You must pass a scope and parentPath unless traversing a Program/File. " + `Instead of that you tried to traverse a ${parent.type} node without ` + "passing scope and parentPath.");
43
43
  }
44
44
  }
45
+ if (!parentPath && visitSelf) {
46
+ throw new Error("visitSelf can only be used when providing a NodePath.");
47
+ }
45
48
  if (!VISITOR_KEYS[parent.type]) {
46
49
  return;
47
50
  }
48
51
  visitors.explode(opts);
49
- (0, _traverseNode.traverseNode)(parent, opts, scope, state, parentPath);
52
+ (0, _traverseNode.traverseNode)(parent, opts, scope, state, parentPath, null, visitSelf);
50
53
  }
51
54
  var _default = traverse;
52
55
  exports.default = _default;
@@ -62,7 +65,6 @@ traverse.node = function (node, opts, scope, state, path, skipKeys) {
62
65
  };
63
66
  traverse.clearNode = function (node, opts) {
64
67
  removeProperties(node, opts);
65
- cache.path.delete(node);
66
68
  };
67
69
  traverse.removeProperties = function (tree, opts) {
68
70
  traverseFast(tree, traverse.clearNode, opts);
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["visitors","require","exports","_t","cache","_traverseNode","_path","_scope","_hub","VISITOR_KEYS","removeProperties","traverseFast","traverse","parent","opts","scope","state","parentPath","noScope","type","Error","explode","traverseNode","_default","default","verify","cheap","node","enter","path","skipKeys","clearNode","delete","tree","hasDenylistedType","has","stop","hasType","denylistTypes","includes","denylist"],"sources":["../src/index.ts"],"sourcesContent":["import * as visitors from \"./visitors\";\nimport {\n VISITOR_KEYS,\n removeProperties,\n type RemovePropertiesOptions,\n traverseFast,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport * as cache from \"./cache\";\nimport type NodePath from \"./path\";\nimport type { default as Scope, Binding } from \"./scope\";\nimport type { ExplodedVisitor, Visitor } from \"./types\";\nimport { traverseNode } from \"./traverse-node\";\n\nexport type { ExplodedVisitor, Visitor, Binding };\nexport { default as NodePath } from \"./path\";\nexport { default as Scope } from \"./scope\";\nexport { default as Hub } from \"./hub\";\nexport type { HubInterface } from \"./hub\";\n\nexport { visitors };\n\nexport type TraverseOptions<S = t.Node> = {\n scope?: Scope;\n noScope?: boolean;\n denylist?: string[];\n shouldSkip?: (node: NodePath) => boolean;\n} & Visitor<S>;\n\nexport type ExplodedTraverseOptions<S = t.Node> = TraverseOptions<S> &\n ExplodedVisitor<S>;\n\nfunction traverse<S>(\n parent: t.Node,\n opts: TraverseOptions<S>,\n scope: Scope | undefined,\n state: S,\n parentPath?: NodePath,\n): void;\n\nfunction traverse(\n parent: t.Node,\n opts: TraverseOptions,\n scope?: Scope,\n state?: any,\n parentPath?: NodePath,\n): void;\n\nfunction traverse<Options extends TraverseOptions>(\n parent: t.Node,\n // @ts-expect-error provide {} as default value for Options\n opts: Options = {},\n scope?: Scope,\n state?: any,\n parentPath?: NodePath,\n) {\n if (!parent) return;\n\n if (!opts.noScope && !scope) {\n if (parent.type !== \"Program\" && parent.type !== \"File\") {\n throw new Error(\n \"You must pass a scope and parentPath unless traversing a Program/File. \" +\n `Instead of that you tried to traverse a ${parent.type} node without ` +\n \"passing scope and parentPath.\",\n );\n }\n }\n\n if (!VISITOR_KEYS[parent.type]) {\n return;\n }\n\n visitors.explode(opts as Visitor);\n\n traverseNode(parent, opts as ExplodedVisitor, scope, state, parentPath);\n}\n\nexport default traverse;\n\ntraverse.visitors = visitors;\ntraverse.verify = visitors.verify;\ntraverse.explode = visitors.explode;\n\ntraverse.cheap = function (node: t.Node, enter: (node: t.Node) => void) {\n traverseFast(node, enter);\n return;\n};\n\ntraverse.node = function (\n node: t.Node,\n opts: ExplodedTraverseOptions,\n scope?: Scope,\n state?: any,\n path?: NodePath,\n skipKeys?: Record<string, boolean>,\n) {\n traverseNode(node, opts, scope, state, path, skipKeys);\n // traverse.node always returns undefined\n};\n\ntraverse.clearNode = function (node: t.Node, opts?: RemovePropertiesOptions) {\n removeProperties(node, opts);\n\n cache.path.delete(node);\n};\n\ntraverse.removeProperties = function (\n tree: t.Node,\n opts?: RemovePropertiesOptions,\n) {\n traverseFast(tree, traverse.clearNode, opts);\n return tree;\n};\n\ntype HasDenylistedTypeState = {\n has: boolean;\n type: t.Node[\"type\"];\n};\nfunction hasDenylistedType(path: NodePath, state: HasDenylistedTypeState) {\n if (path.node.type === state.type) {\n state.has = true;\n path.stop();\n }\n}\n\ntraverse.hasType = function (\n tree: t.Node,\n type: t.Node[\"type\"],\n denylistTypes?: Array<string>,\n): boolean {\n // the node we're searching in is denylisted\n if (denylistTypes?.includes(tree.type)) return false;\n\n // the type we're looking for is the same as the passed node\n if (tree.type === type) return true;\n\n const state: HasDenylistedTypeState = {\n has: false,\n type: type,\n };\n\n traverse(\n tree,\n {\n noScope: true,\n denylist: denylistTypes,\n enter: hasDenylistedType,\n },\n null,\n state,\n );\n\n return state.has;\n};\n\ntraverse.cache = cache;\n"],"mappings":"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"}
1
+ {"version":3,"names":["visitors","require","exports","_t","cache","_traverseNode","_path","_scope","_hub","VISITOR_KEYS","removeProperties","traverseFast","traverse","parent","opts","scope","state","parentPath","visitSelf","noScope","type","Error","explode","traverseNode","_default","default","verify","cheap","node","enter","path","skipKeys","clearNode","tree","hasDenylistedType","has","stop","hasType","denylistTypes","includes","denylist"],"sources":["../src/index.ts"],"sourcesContent":["import * as visitors from \"./visitors\";\nimport {\n VISITOR_KEYS,\n removeProperties,\n type RemovePropertiesOptions,\n traverseFast,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport * as cache from \"./cache\";\nimport type NodePath from \"./path\";\nimport type { default as Scope, Binding } from \"./scope\";\nimport type { ExplodedVisitor, Visitor } from \"./types\";\nimport { traverseNode } from \"./traverse-node\";\n\nexport type { ExplodedVisitor, Visitor, Binding };\nexport { default as NodePath } from \"./path\";\nexport { default as Scope } from \"./scope\";\nexport { default as Hub } from \"./hub\";\nexport type { HubInterface } from \"./hub\";\n\nexport { visitors };\n\nexport type TraverseOptions<S = t.Node> = {\n scope?: Scope;\n noScope?: boolean;\n denylist?: string[];\n shouldSkip?: (node: NodePath) => boolean;\n} & Visitor<S>;\n\nexport type ExplodedTraverseOptions<S = t.Node> = TraverseOptions<S> &\n ExplodedVisitor<S>;\n\nfunction traverse<S>(\n parent: t.Node,\n opts: TraverseOptions<S>,\n scope: Scope | undefined,\n state: S,\n parentPath?: NodePath,\n visitSelf?: boolean,\n): void;\n\nfunction traverse(\n parent: t.Node,\n opts: TraverseOptions,\n scope?: Scope,\n state?: any,\n parentPath?: NodePath,\n visitSelf?: boolean,\n): void;\n\nfunction traverse<Options extends TraverseOptions>(\n parent: t.Node,\n // @ts-expect-error provide {} as default value for Options\n opts: Options = {},\n scope?: Scope,\n state?: any,\n parentPath?: NodePath,\n visitSelf?: boolean,\n) {\n if (!parent) return;\n\n if (!opts.noScope && !scope) {\n if (parent.type !== \"Program\" && parent.type !== \"File\") {\n throw new Error(\n \"You must pass a scope and parentPath unless traversing a Program/File. \" +\n `Instead of that you tried to traverse a ${parent.type} node without ` +\n \"passing scope and parentPath.\",\n );\n }\n }\n\n if (!parentPath && visitSelf) {\n throw new Error(\"visitSelf can only be used when providing a NodePath.\");\n }\n\n if (!VISITOR_KEYS[parent.type]) {\n return;\n }\n\n visitors.explode(opts as Visitor);\n\n traverseNode(\n parent,\n opts as ExplodedVisitor,\n scope,\n state,\n parentPath,\n /* skipKeys */ null,\n visitSelf,\n );\n}\n\nexport default traverse;\n\ntraverse.visitors = visitors;\ntraverse.verify = visitors.verify;\ntraverse.explode = visitors.explode;\n\ntraverse.cheap = function (node: t.Node, enter: (node: t.Node) => void) {\n traverseFast(node, enter);\n return;\n};\n\ntraverse.node = function (\n node: t.Node,\n opts: ExplodedTraverseOptions,\n scope?: Scope,\n state?: any,\n path?: NodePath,\n skipKeys?: Record<string, boolean>,\n) {\n traverseNode(node, opts, scope, state, path, skipKeys);\n // traverse.node always returns undefined\n};\n\ntraverse.clearNode = function (node: t.Node, opts?: RemovePropertiesOptions) {\n removeProperties(node, opts);\n};\n\ntraverse.removeProperties = function (\n tree: t.Node,\n opts?: RemovePropertiesOptions,\n) {\n traverseFast(tree, traverse.clearNode, opts);\n return tree;\n};\n\ntype HasDenylistedTypeState = {\n has: boolean;\n type: t.Node[\"type\"];\n};\nfunction hasDenylistedType(path: NodePath, state: HasDenylistedTypeState) {\n if (path.node.type === state.type) {\n state.has = true;\n path.stop();\n }\n}\n\ntraverse.hasType = function (\n tree: t.Node,\n type: t.Node[\"type\"],\n denylistTypes?: Array<string>,\n): boolean {\n // the node we're searching in is denylisted\n if (denylistTypes?.includes(tree.type)) return false;\n\n // the type we're looking for is the same as the passed node\n if (tree.type === type) return true;\n\n const state: HasDenylistedTypeState = {\n has: false,\n type: type,\n };\n\n traverse(\n tree,\n {\n noScope: true,\n denylist: denylistTypes,\n enter: hasDenylistedType,\n },\n null,\n state,\n );\n\n return state.has;\n};\n\ntraverse.cache = cache;\n"],"mappings":"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"}
package/lib/path/index.js CHANGED
@@ -68,11 +68,7 @@ class NodePath {
68
68
  throw new Error("To get a node path the parent needs to exist");
69
69
  }
70
70
  const targetNode = container[key];
71
- let paths = _cache.path.get(parent);
72
- if (!paths) {
73
- paths = new Map();
74
- _cache.path.set(parent, paths);
75
- }
71
+ const paths = (0, _cache.getOrCreateCachedPaths)(hub, parent);
76
72
  let path = paths.get(targetNode);
77
73
  if (!path) {
78
74
  path = new NodePath(hub, parent);
@@ -1 +1 @@
1
- {"version":3,"names":["virtualTypes","require","_debug","_index","_scope","_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","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","_guessExecutionStatusRelativeToDifferentFunctions","_guessExecutionStatusRelativeTo","TYPES","typeKey","fn","TypeError","keys","includes","push","_default","default"],"sources":["../../src/path/index.ts"],"sourcesContent":["import type { HubInterface } from \"../hub\";\nimport type TraversalContext from \"../context\";\nimport type { ExplodedTraverseOptions } from \"..\";\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 { NodePathAssertions } 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: 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 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 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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"}
1
+ {"version":3,"names":["virtualTypes","require","_debug","_index","_scope","_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\";\nimport type TraversalContext from \"../context\";\nimport type { ExplodedTraverseOptions } from \"..\";\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 { getOrCreateCachedPaths } 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 { NodePathAssertions } 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: 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 = 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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"}
@@ -1 +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 as null;\n\nexport const BlockScoped: VirtualTypeMapping = null as null;\n\nexport const Var: VirtualTypeMapping = [\"VariableDeclaration\"];\n\nexport const User: VirtualTypeMapping = null as null;\n\nexport const Generated: VirtualTypeMapping = null as null;\n\nexport const Pure: VirtualTypeMapping = null as 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,IAAY;AAACN,OAAA,CAAAM,UAAA,GAAAA,UAAA;AAEpD,MAAMC,WAA+B,GAAG,IAAY;AAACP,OAAA,CAAAO,WAAA,GAAAA,WAAA;AAErD,MAAMC,GAAuB,GAAG,CAAC,qBAAqB,CAAC;AAACR,OAAA,CAAAQ,GAAA,GAAAA,GAAA;AAExD,MAAMC,IAAwB,GAAG,IAAY;AAACT,OAAA,CAAAS,IAAA,GAAAA,IAAA;AAE9C,MAAMC,SAA6B,GAAG,IAAY;AAACV,OAAA,CAAAU,SAAA,GAAAA,SAAA;AAEnD,MAAMC,IAAwB,GAAG,IAAY;AAACX,OAAA,CAAAW,IAAA,GAAAA,IAAA;AAE9C,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"}
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"}
@@ -158,7 +158,7 @@ function insertAfter(nodes_) {
158
158
  }
159
159
  function updateSiblingKeys(fromIndex, incrementBy) {
160
160
  if (!this.parent) return;
161
- const paths = _cache.path.get(this.parent);
161
+ const paths = (0, _cache.getCachedPaths)(this.hub, this.parent) || [];
162
162
  for (const [, path] of paths) {
163
163
  if (typeof path.key === "number" && path.key >= fromIndex) {
164
164
  path.key += incrementBy;
@@ -1 +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","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","pathCache","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 { path as pathCache } from \"../cache\";\nimport PathHoister from \"./lib/hoister\";\nimport NodePath from \"./index\";\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\";\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 && 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 = pathCache.get(this.parent);\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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"}
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","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\";\nimport PathHoister from \"./lib/hoister\";\nimport NodePath from \"./index\";\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\";\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 && 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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"}
@@ -46,7 +46,9 @@ function _remove() {
46
46
  }
47
47
  function _markRemoved() {
48
48
  this._traverseFlags |= _index.SHOULD_SKIP | _index.REMOVED;
49
- if (this.parent) _cache.path.get(this.parent).delete(this.node);
49
+ if (this.parent) {
50
+ (0, _cache.getCachedPaths)(this.hub, this.parent).delete(this.node);
51
+ }
50
52
  this.node = null;
51
53
  }
52
54
  function _assertUnremoved() {
@@ -1 +1 @@
1
- {"version":3,"names":["_removalHooks","require","_cache","_index","remove","_this$opts","_assertUnremoved","resync","opts","noScope","_removeFromScope","_callRemovalHooks","_markRemoved","shareCommentsWithSiblings","_remove","bindings","getBindingIdentifiers","Object","keys","forEach","name","scope","removeBinding","fn","hooks","parentPath","Array","isArray","container","splice","key","updateSiblingKeys","_replaceWith","_traverseFlags","SHOULD_SKIP","REMOVED","parent","pathCache","get","delete","node","removed","buildCodeFrameError"],"sources":["../../src/path/removal.ts"],"sourcesContent":["// This file contains methods responsible for removing a node.\n\nimport { hooks } from \"./lib/removal-hooks\";\nimport { path as pathCache } from \"../cache\";\nimport type NodePath from \"./index\";\nimport { REMOVED, SHOULD_SKIP } from \"./index\";\n\nexport function remove(this: NodePath) {\n this._assertUnremoved();\n\n this.resync();\n if (!this.opts?.noScope) {\n this._removeFromScope();\n }\n\n if (this._callRemovalHooks()) {\n this._markRemoved();\n return;\n }\n\n this.shareCommentsWithSiblings();\n this._remove();\n this._markRemoved();\n}\n\nexport function _removeFromScope(this: NodePath) {\n const bindings = this.getBindingIdentifiers();\n Object.keys(bindings).forEach(name => this.scope.removeBinding(name));\n}\n\nexport function _callRemovalHooks(this: NodePath) {\n for (const fn of hooks) {\n if (fn(this, this.parentPath)) return true;\n }\n}\n\nexport function _remove(this: NodePath) {\n if (Array.isArray(this.container)) {\n this.container.splice(this.key as number, 1);\n this.updateSiblingKeys(this.key as number, -1);\n } else {\n this._replaceWith(null);\n }\n}\n\nexport function _markRemoved(this: NodePath) {\n // this.shouldSkip = true; this.removed = true;\n this._traverseFlags |= SHOULD_SKIP | REMOVED;\n if (this.parent) pathCache.get(this.parent).delete(this.node);\n this.node = null;\n}\n\nexport function _assertUnremoved(this: NodePath) {\n if (this.removed) {\n throw this.buildCodeFrameError(\n \"NodePath has been removed so is read-only.\",\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AAEA,IAAAA,aAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAF,OAAA;AAEO,SAASG,MAAMA,CAAA,EAAiB;EAAA,IAAAC,UAAA;EACrC,IAAI,CAACC,gBAAgB,CAAC,CAAC;EAEvB,IAAI,CAACC,MAAM,CAAC,CAAC;EACb,IAAI,GAAAF,UAAA,GAAC,IAAI,CAACG,IAAI,aAATH,UAAA,CAAWI,OAAO,GAAE;IACvB,IAAI,CAACC,gBAAgB,CAAC,CAAC;EACzB;EAEA,IAAI,IAAI,CAACC,iBAAiB,CAAC,CAAC,EAAE;IAC5B,IAAI,CAACC,YAAY,CAAC,CAAC;IACnB;EACF;EAEA,IAAI,CAACC,yBAAyB,CAAC,CAAC;EAChC,IAAI,CAACC,OAAO,CAAC,CAAC;EACd,IAAI,CAACF,YAAY,CAAC,CAAC;AACrB;AAEO,SAASF,gBAAgBA,CAAA,EAAiB;EAC/C,MAAMK,QAAQ,GAAG,IAAI,CAACC,qBAAqB,CAAC,CAAC;EAC7CC,MAAM,CAACC,IAAI,CAACH,QAAQ,CAAC,CAACI,OAAO,CAACC,IAAI,IAAI,IAAI,CAACC,KAAK,CAACC,aAAa,CAACF,IAAI,CAAC,CAAC;AACvE;AAEO,SAAST,iBAAiBA,CAAA,EAAiB;EAChD,KAAK,MAAMY,EAAE,IAAIC,mBAAK,EAAE;IACtB,IAAID,EAAE,CAAC,IAAI,EAAE,IAAI,CAACE,UAAU,CAAC,EAAE,OAAO,IAAI;EAC5C;AACF;AAEO,SAASX,OAAOA,CAAA,EAAiB;EACtC,IAAIY,KAAK,CAACC,OAAO,CAAC,IAAI,CAACC,SAAS,CAAC,EAAE;IACjC,IAAI,CAACA,SAAS,CAACC,MAAM,CAAC,IAAI,CAACC,GAAG,EAAY,CAAC,CAAC;IAC5C,IAAI,CAACC,iBAAiB,CAAC,IAAI,CAACD,GAAG,EAAY,CAAC,CAAC,CAAC;EAChD,CAAC,MAAM;IACL,IAAI,CAACE,YAAY,CAAC,IAAI,CAAC;EACzB;AACF;AAEO,SAASpB,YAAYA,CAAA,EAAiB;EAE3C,IAAI,CAACqB,cAAc,IAAIC,kBAAW,GAAGC,cAAO;EAC5C,IAAI,IAAI,CAACC,MAAM,EAAEC,WAAS,CAACC,GAAG,CAAC,IAAI,CAACF,MAAM,CAAC,CAACG,MAAM,CAAC,IAAI,CAACC,IAAI,CAAC;EAC7D,IAAI,CAACA,IAAI,GAAG,IAAI;AAClB;AAEO,SAASlC,gBAAgBA,CAAA,EAAiB;EAC/C,IAAI,IAAI,CAACmC,OAAO,EAAE;IAChB,MAAM,IAAI,CAACC,mBAAmB,CAC5B,4CACF,CAAC;EACH;AACF"}
1
+ {"version":3,"names":["_removalHooks","require","_cache","_index","remove","_this$opts","_assertUnremoved","resync","opts","noScope","_removeFromScope","_callRemovalHooks","_markRemoved","shareCommentsWithSiblings","_remove","bindings","getBindingIdentifiers","Object","keys","forEach","name","scope","removeBinding","fn","hooks","parentPath","Array","isArray","container","splice","key","updateSiblingKeys","_replaceWith","_traverseFlags","SHOULD_SKIP","REMOVED","parent","getCachedPaths","hub","delete","node","removed","buildCodeFrameError"],"sources":["../../src/path/removal.ts"],"sourcesContent":["// This file contains methods responsible for removing a node.\n\nimport { hooks } from \"./lib/removal-hooks\";\nimport { getCachedPaths } from \"../cache\";\nimport type NodePath from \"./index\";\nimport { REMOVED, SHOULD_SKIP } from \"./index\";\n\nexport function remove(this: NodePath) {\n this._assertUnremoved();\n\n this.resync();\n if (!this.opts?.noScope) {\n this._removeFromScope();\n }\n\n if (this._callRemovalHooks()) {\n this._markRemoved();\n return;\n }\n\n this.shareCommentsWithSiblings();\n this._remove();\n this._markRemoved();\n}\n\nexport function _removeFromScope(this: NodePath) {\n const bindings = this.getBindingIdentifiers();\n Object.keys(bindings).forEach(name => this.scope.removeBinding(name));\n}\n\nexport function _callRemovalHooks(this: NodePath) {\n for (const fn of hooks) {\n if (fn(this, this.parentPath)) return true;\n }\n}\n\nexport function _remove(this: NodePath) {\n if (Array.isArray(this.container)) {\n this.container.splice(this.key as number, 1);\n this.updateSiblingKeys(this.key as number, -1);\n } else {\n this._replaceWith(null);\n }\n}\n\nexport function _markRemoved(this: NodePath) {\n // this.shouldSkip = true; this.removed = true;\n this._traverseFlags |= SHOULD_SKIP | REMOVED;\n if (this.parent) {\n getCachedPaths(this.hub, this.parent).delete(this.node);\n }\n this.node = null;\n}\n\nexport function _assertUnremoved(this: NodePath) {\n if (this.removed) {\n throw this.buildCodeFrameError(\n \"NodePath has been removed so is read-only.\",\n );\n }\n}\n"],"mappings":";;;;;;;;;;;AAEA,IAAAA,aAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAF,OAAA;AAEO,SAASG,MAAMA,CAAA,EAAiB;EAAA,IAAAC,UAAA;EACrC,IAAI,CAACC,gBAAgB,CAAC,CAAC;EAEvB,IAAI,CAACC,MAAM,CAAC,CAAC;EACb,IAAI,GAAAF,UAAA,GAAC,IAAI,CAACG,IAAI,aAATH,UAAA,CAAWI,OAAO,GAAE;IACvB,IAAI,CAACC,gBAAgB,CAAC,CAAC;EACzB;EAEA,IAAI,IAAI,CAACC,iBAAiB,CAAC,CAAC,EAAE;IAC5B,IAAI,CAACC,YAAY,CAAC,CAAC;IACnB;EACF;EAEA,IAAI,CAACC,yBAAyB,CAAC,CAAC;EAChC,IAAI,CAACC,OAAO,CAAC,CAAC;EACd,IAAI,CAACF,YAAY,CAAC,CAAC;AACrB;AAEO,SAASF,gBAAgBA,CAAA,EAAiB;EAC/C,MAAMK,QAAQ,GAAG,IAAI,CAACC,qBAAqB,CAAC,CAAC;EAC7CC,MAAM,CAACC,IAAI,CAACH,QAAQ,CAAC,CAACI,OAAO,CAACC,IAAI,IAAI,IAAI,CAACC,KAAK,CAACC,aAAa,CAACF,IAAI,CAAC,CAAC;AACvE;AAEO,SAAST,iBAAiBA,CAAA,EAAiB;EAChD,KAAK,MAAMY,EAAE,IAAIC,mBAAK,EAAE;IACtB,IAAID,EAAE,CAAC,IAAI,EAAE,IAAI,CAACE,UAAU,CAAC,EAAE,OAAO,IAAI;EAC5C;AACF;AAEO,SAASX,OAAOA,CAAA,EAAiB;EACtC,IAAIY,KAAK,CAACC,OAAO,CAAC,IAAI,CAACC,SAAS,CAAC,EAAE;IACjC,IAAI,CAACA,SAAS,CAACC,MAAM,CAAC,IAAI,CAACC,GAAG,EAAY,CAAC,CAAC;IAC5C,IAAI,CAACC,iBAAiB,CAAC,IAAI,CAACD,GAAG,EAAY,CAAC,CAAC,CAAC;EAChD,CAAC,MAAM;IACL,IAAI,CAACE,YAAY,CAAC,IAAI,CAAC;EACzB;AACF;AAEO,SAASpB,YAAYA,CAAA,EAAiB;EAE3C,IAAI,CAACqB,cAAc,IAAIC,kBAAW,GAAGC,cAAO;EAC5C,IAAI,IAAI,CAACC,MAAM,EAAE;IACf,IAAAC,qBAAc,EAAC,IAAI,CAACC,GAAG,EAAE,IAAI,CAACF,MAAM,CAAC,CAACG,MAAM,CAAC,IAAI,CAACC,IAAI,CAAC;EACzD;EACA,IAAI,CAACA,IAAI,GAAG,IAAI;AAClB;AAEO,SAASlC,gBAAgBA,CAAA,EAAiB;EAC/C,IAAI,IAAI,CAACmC,OAAO,EAAE;IAChB,MAAM,IAAI,CAACC,mBAAmB,CAC5B,4CACF,CAAC;EACH;AACF"}
@@ -39,12 +39,12 @@ const {
39
39
  yieldExpression
40
40
  } = _t;
41
41
  function replaceWithMultiple(nodes) {
42
- var _pathCache$get;
42
+ var _getCachedPaths;
43
43
  this.resync();
44
44
  nodes = this._verifyNodeList(nodes);
45
45
  inheritLeadingComments(nodes[0], this.node);
46
46
  inheritTrailingComments(nodes[nodes.length - 1], this.node);
47
- (_pathCache$get = _cache.path.get(this.parent)) == null ? void 0 : _pathCache$get.delete(this.node);
47
+ (_getCachedPaths = (0, _cache.getCachedPaths)(this.hub, this.parent)) == null ? void 0 : _getCachedPaths.delete(this.node);
48
48
  this.node = this.container[this.key] = null;
49
49
  const paths = this.insertAfter(nodes);
50
50
  if (this.node) {
@@ -122,7 +122,7 @@ function replaceWith(replacementPath) {
122
122
  return [nodePath ? this.get(nodePath) : this];
123
123
  }
124
124
  function _replaceWith(node) {
125
- var _pathCache$get2;
125
+ var _getCachedPaths2;
126
126
  if (!this.container) {
127
127
  throw new ReferenceError("Container is falsy");
128
128
  }
@@ -132,7 +132,7 @@ function _replaceWith(node) {
132
132
  validate(this.parent, this.key, node);
133
133
  }
134
134
  this.debug(`Replace with ${node == null ? void 0 : node.type}`);
135
- (_pathCache$get2 = _cache.path.get(this.parent)) == null ? void 0 : _pathCache$get2.set(node, this).delete(this.node);
135
+ (_getCachedPaths2 = (0, _cache.getCachedPaths)(this.hub, this.parent)) == null ? void 0 : _getCachedPaths2.set(node, this).delete(this.node);
136
136
  this.node = this.container[this.key] = node;
137
137
  }
138
138
  function replaceExpressionWithStatements(nodes) {
@@ -1 +1 @@
1
- {"version":3,"names":["_codeFrame","require","_index","_index2","_cache","_parser","_t","_helperHoistVariables","FUNCTION_TYPES","arrowFunctionExpression","assignmentExpression","awaitExpression","blockStatement","callExpression","cloneNode","expressionStatement","identifier","inheritLeadingComments","inheritTrailingComments","inheritsComments","isExpression","isProgram","isStatement","removeComments","returnStatement","toSequenceExpression","validate","yieldExpression","replaceWithMultiple","nodes","_pathCache$get","resync","_verifyNodeList","node","length","pathCache","get","parent","delete","container","key","paths","insertAfter","requeue","remove","replaceWithSourceString","replacement","ast","parse","err","loc","message","codeFrameColumns","start","line","column","code","expressionAST","program","body","expression","traverse","removeProperties","replaceWith","replacementPath","removed","Error","NodePath","Array","isArray","nodePath","isNodeType","canHaveVariableDeclarationOrExpression","canSwapBetweenExpressionAndStatement","parentPath","isExportDefaultDeclaration","replaceExpressionWithStatements","oldNode","_replaceWith","type","setScope","_pathCache$get2","ReferenceError","inList","debug","set","nodesAsSequenceExpression","scope","functionParent","getFunctionParent","isParentAsync","is","isParentGenerator","callee","hoistVariables","id","push","completionRecords","getCompletionRecords","path","isExpressionStatement","loop","findParent","isLoop","uid","getData","generateDeclaredUidIdentifier","pushContainer","setData","name","arrowFunctionToExpression","newCallee","needToAwaitFunction","hasType","needToYieldFunction","replaceInline","_containerInsertAfter"],"sources":["../../src/path/replacement.ts"],"sourcesContent":["// This file contains methods responsible for replacing a node with another.\n\nimport { codeFrameColumns } from \"@babel/code-frame\";\nimport traverse from \"../index\";\nimport NodePath from \"./index\";\nimport { path as pathCache } from \"../cache\";\nimport { parse } from \"@babel/parser\";\nimport {\n FUNCTION_TYPES,\n arrowFunctionExpression,\n assignmentExpression,\n awaitExpression,\n blockStatement,\n callExpression,\n cloneNode,\n expressionStatement,\n identifier,\n inheritLeadingComments,\n inheritTrailingComments,\n inheritsComments,\n isExpression,\n isProgram,\n isStatement,\n removeComments,\n returnStatement,\n toSequenceExpression,\n validate,\n yieldExpression,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport hoistVariables from \"@babel/helper-hoist-variables\";\n\n/**\n * Replace a node with an array of multiple. This method performs the following steps:\n *\n * - Inherit the comments of first provided node with that of the current node.\n * - Insert the provided nodes after the current node.\n * - Remove the current node.\n */\n\nexport function replaceWithMultiple(\n this: NodePath,\n nodes: t.Node | t.Node[],\n): NodePath[] {\n this.resync();\n\n nodes = this._verifyNodeList(nodes);\n inheritLeadingComments(nodes[0], this.node);\n inheritTrailingComments(nodes[nodes.length - 1], this.node);\n pathCache.get(this.parent)?.delete(this.node);\n this.node =\n // @ts-expect-error this.key must present in this.container\n this.container[this.key] = null;\n const paths = this.insertAfter(nodes);\n\n if (this.node) {\n this.requeue();\n } else {\n this.remove();\n }\n return paths;\n}\n\n/**\n * Parse a string as an expression and replace the current node with the result.\n *\n * NOTE: This is typically not a good idea to use. Building source strings when\n * transforming ASTs is an antipattern and SHOULD NOT be encouraged. Even if it's\n * easier to use, your transforms will be extremely brittle.\n */\n\nexport function replaceWithSourceString(this: NodePath, replacement: string) {\n this.resync();\n let ast: t.File;\n\n try {\n replacement = `(${replacement})`;\n // @ts-expect-error todo: use babel-types ast typings in Babel parser\n ast = parse(replacement);\n } catch (err) {\n const loc = err.loc;\n if (loc) {\n err.message +=\n \" - make sure this is an expression.\\n\" +\n codeFrameColumns(replacement, {\n start: {\n line: loc.line,\n column: loc.column + 1,\n },\n });\n err.code = \"BABEL_REPLACE_SOURCE_ERROR\";\n }\n throw err;\n }\n\n const expressionAST = (ast.program.body[0] as t.ExpressionStatement)\n .expression;\n traverse.removeProperties(expressionAST);\n return this.replaceWith(expressionAST);\n}\n\n/**\n * Replace the current node with another.\n */\n\nexport function replaceWith<R extends t.Node>(\n this: NodePath,\n replacementPath: R | NodePath<R>,\n): [NodePath<R>] {\n this.resync();\n\n if (this.removed) {\n throw new Error(\"You can't replace this node, we've already removed it\");\n }\n\n let replacement: t.Node =\n replacementPath instanceof NodePath\n ? replacementPath.node\n : replacementPath;\n\n if (!replacement) {\n throw new Error(\n \"You passed `path.replaceWith()` a falsy node, use `path.remove()` instead\",\n );\n }\n\n if (this.node === replacement) {\n return [this as NodePath<R>];\n }\n\n if (this.isProgram() && !isProgram(replacement)) {\n throw new Error(\n \"You can only replace a Program root node with another Program node\",\n );\n }\n\n if (Array.isArray(replacement)) {\n throw new Error(\n \"Don't use `path.replaceWith()` with an array of nodes, use `path.replaceWithMultiple()`\",\n );\n }\n\n if (typeof replacement === \"string\") {\n throw new Error(\n \"Don't use `path.replaceWith()` with a source string, use `path.replaceWithSourceString()`\",\n );\n }\n\n let nodePath = \"\";\n\n if (this.isNodeType(\"Statement\") && isExpression(replacement)) {\n if (\n !this.canHaveVariableDeclarationOrExpression() &&\n !this.canSwapBetweenExpressionAndStatement(replacement) &&\n !this.parentPath.isExportDefaultDeclaration()\n ) {\n // replacing a statement with an expression so wrap it in an expression statement\n replacement = expressionStatement(replacement);\n nodePath = \"expression\";\n }\n }\n\n if (this.isNodeType(\"Expression\") && isStatement(replacement)) {\n if (\n !this.canHaveVariableDeclarationOrExpression() &&\n !this.canSwapBetweenExpressionAndStatement(replacement)\n ) {\n // replacing an expression with a statement so let's explode it\n return this.replaceExpressionWithStatements([replacement]) as [\n NodePath<R>,\n ];\n }\n }\n\n const oldNode = this.node;\n if (oldNode) {\n inheritsComments(replacement, oldNode);\n removeComments(oldNode);\n }\n\n // replace the node\n this._replaceWith(replacement);\n this.type = replacement.type;\n\n // potentially create new scope\n this.setScope();\n\n // requeue for visiting\n this.requeue();\n\n return [\n nodePath ? (this.get(nodePath) as NodePath<R>) : (this as NodePath<R>),\n ];\n}\n\n/**\n * Description\n */\n\nexport function _replaceWith(this: NodePath, node: t.Node) {\n if (!this.container) {\n throw new ReferenceError(\"Container is falsy\");\n }\n\n if (this.inList) {\n // @ts-expect-error todo(flow->ts): check if validate accepts a numeric key\n validate(this.parent, this.key, [node]);\n } else {\n validate(this.parent, this.key as string, node);\n }\n\n this.debug(`Replace with ${node?.type}`);\n pathCache.get(this.parent)?.set(node, this).delete(this.node);\n\n this.node =\n // @ts-expect-error this.key must present in this.container\n this.container[this.key] = node;\n}\n\n/**\n * This method takes an array of statements nodes and then explodes it\n * into expressions. This method retains completion records which is\n * extremely important to retain original semantics.\n */\n\nexport function replaceExpressionWithStatements(\n this: NodePath,\n nodes: Array<t.Statement>,\n) {\n this.resync();\n\n const nodesAsSequenceExpression = toSequenceExpression(nodes, this.scope);\n\n if (nodesAsSequenceExpression) {\n return this.replaceWith(nodesAsSequenceExpression)[0].get(\"expressions\");\n }\n\n const functionParent = this.getFunctionParent();\n const isParentAsync = functionParent?.is(\"async\");\n const isParentGenerator = functionParent?.is(\"generator\");\n\n const container = arrowFunctionExpression([], blockStatement(nodes));\n\n this.replaceWith(callExpression(container, []));\n // replaceWith changes the type of \"this\", but it isn't trackable by TS\n type ThisType = NodePath<\n t.CallExpression & {\n callee: t.ArrowFunctionExpression & { body: t.BlockStatement };\n }\n >;\n\n // hoist variable declaration in do block\n // `(do { var x = 1; x;})` -> `var x; (() => { x = 1; return x; })()`\n const callee = (this as ThisType).get(\"callee\");\n hoistVariables(\n callee.get(\"body\"),\n (id: t.Identifier) => {\n this.scope.push({ id });\n },\n \"var\",\n );\n\n // add implicit returns to all ending expression statements\n const completionRecords: Array<NodePath> = (this as ThisType)\n .get(\"callee\")\n .getCompletionRecords();\n for (const path of completionRecords) {\n if (!path.isExpressionStatement()) continue;\n\n const loop = path.findParent(path => path.isLoop());\n if (loop) {\n let uid = loop.getData(\"expressionReplacementReturnUid\");\n\n if (!uid) {\n uid = callee.scope.generateDeclaredUidIdentifier(\"ret\");\n callee\n .get(\"body\")\n .pushContainer(\"body\", returnStatement(cloneNode(uid)));\n loop.setData(\"expressionReplacementReturnUid\", uid);\n } else {\n uid = identifier(uid.name);\n }\n\n path\n .get(\"expression\")\n .replaceWith(\n assignmentExpression(\"=\", cloneNode(uid), path.node.expression),\n );\n } else {\n path.replaceWith(returnStatement(path.node.expression));\n }\n }\n\n // This is an IIFE, so we don't need to worry about the noNewArrows assumption\n callee.arrowFunctionToExpression();\n // Fixme: we can not `assert this is NodePath<t.FunctionExpression>` in `arrowFunctionToExpression`\n // because it is not a class method known at compile time.\n const newCallee = callee as unknown as NodePath<t.FunctionExpression>;\n\n // (() => await xxx)() -> await (async () => await xxx)();\n const needToAwaitFunction =\n isParentAsync &&\n traverse.hasType(\n (this.get(\"callee.body\") as NodePath<t.BlockStatement>).node,\n \"AwaitExpression\",\n FUNCTION_TYPES,\n );\n const needToYieldFunction =\n isParentGenerator &&\n traverse.hasType(\n (this.get(\"callee.body\") as NodePath<t.BlockStatement>).node,\n \"YieldExpression\",\n FUNCTION_TYPES,\n );\n if (needToAwaitFunction) {\n newCallee.set(\"async\", true);\n // yield* will await the generator return result\n if (!needToYieldFunction) {\n this.replaceWith(awaitExpression((this as ThisType).node));\n }\n }\n if (needToYieldFunction) {\n newCallee.set(\"generator\", true);\n this.replaceWith(yieldExpression((this as ThisType).node, true));\n }\n\n return newCallee.get(\"body.body\");\n}\n\nexport function replaceInline(this: NodePath, nodes: t.Node | Array<t.Node>) {\n this.resync();\n\n if (Array.isArray(nodes)) {\n if (Array.isArray(this.container)) {\n nodes = this._verifyNodeList(nodes);\n const paths = this._containerInsertAfter(nodes);\n this.remove();\n return paths;\n } else {\n return this.replaceWithMultiple(nodes);\n }\n } else {\n return this.replaceWith(nodes);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_codeFrame","require","_index","_index2","_cache","_parser","_t","_helperHoistVariables","FUNCTION_TYPES","arrowFunctionExpression","assignmentExpression","awaitExpression","blockStatement","callExpression","cloneNode","expressionStatement","identifier","inheritLeadingComments","inheritTrailingComments","inheritsComments","isExpression","isProgram","isStatement","removeComments","returnStatement","toSequenceExpression","validate","yieldExpression","replaceWithMultiple","nodes","_getCachedPaths","resync","_verifyNodeList","node","length","getCachedPaths","hub","parent","delete","container","key","paths","insertAfter","requeue","remove","replaceWithSourceString","replacement","ast","parse","err","loc","message","codeFrameColumns","start","line","column","code","expressionAST","program","body","expression","traverse","removeProperties","replaceWith","replacementPath","removed","Error","NodePath","Array","isArray","nodePath","isNodeType","canHaveVariableDeclarationOrExpression","canSwapBetweenExpressionAndStatement","parentPath","isExportDefaultDeclaration","replaceExpressionWithStatements","oldNode","_replaceWith","type","setScope","get","_getCachedPaths2","ReferenceError","inList","debug","set","nodesAsSequenceExpression","scope","functionParent","getFunctionParent","isParentAsync","is","isParentGenerator","callee","hoistVariables","id","push","completionRecords","getCompletionRecords","path","isExpressionStatement","loop","findParent","isLoop","uid","getData","generateDeclaredUidIdentifier","pushContainer","setData","name","arrowFunctionToExpression","newCallee","needToAwaitFunction","hasType","needToYieldFunction","replaceInline","_containerInsertAfter"],"sources":["../../src/path/replacement.ts"],"sourcesContent":["// This file contains methods responsible for replacing a node with another.\n\nimport { codeFrameColumns } from \"@babel/code-frame\";\nimport traverse from \"../index\";\nimport NodePath from \"./index\";\nimport { getCachedPaths } from \"../cache\";\nimport { parse } from \"@babel/parser\";\nimport {\n FUNCTION_TYPES,\n arrowFunctionExpression,\n assignmentExpression,\n awaitExpression,\n blockStatement,\n callExpression,\n cloneNode,\n expressionStatement,\n identifier,\n inheritLeadingComments,\n inheritTrailingComments,\n inheritsComments,\n isExpression,\n isProgram,\n isStatement,\n removeComments,\n returnStatement,\n toSequenceExpression,\n validate,\n yieldExpression,\n} from \"@babel/types\";\nimport type * as t from \"@babel/types\";\nimport hoistVariables from \"@babel/helper-hoist-variables\";\n\n/**\n * Replace a node with an array of multiple. This method performs the following steps:\n *\n * - Inherit the comments of first provided node with that of the current node.\n * - Insert the provided nodes after the current node.\n * - Remove the current node.\n */\n\nexport function replaceWithMultiple(\n this: NodePath,\n nodes: t.Node | t.Node[],\n): NodePath[] {\n this.resync();\n\n nodes = this._verifyNodeList(nodes);\n inheritLeadingComments(nodes[0], this.node);\n inheritTrailingComments(nodes[nodes.length - 1], this.node);\n getCachedPaths(this.hub, this.parent)?.delete(this.node);\n this.node =\n // @ts-expect-error this.key must present in this.container\n this.container[this.key] = null;\n const paths = this.insertAfter(nodes);\n\n if (this.node) {\n this.requeue();\n } else {\n this.remove();\n }\n return paths;\n}\n\n/**\n * Parse a string as an expression and replace the current node with the result.\n *\n * NOTE: This is typically not a good idea to use. Building source strings when\n * transforming ASTs is an antipattern and SHOULD NOT be encouraged. Even if it's\n * easier to use, your transforms will be extremely brittle.\n */\n\nexport function replaceWithSourceString(this: NodePath, replacement: string) {\n this.resync();\n let ast: t.File;\n\n try {\n replacement = `(${replacement})`;\n // @ts-expect-error todo: use babel-types ast typings in Babel parser\n ast = parse(replacement);\n } catch (err) {\n const loc = err.loc;\n if (loc) {\n err.message +=\n \" - make sure this is an expression.\\n\" +\n codeFrameColumns(replacement, {\n start: {\n line: loc.line,\n column: loc.column + 1,\n },\n });\n err.code = \"BABEL_REPLACE_SOURCE_ERROR\";\n }\n throw err;\n }\n\n const expressionAST = (ast.program.body[0] as t.ExpressionStatement)\n .expression;\n traverse.removeProperties(expressionAST);\n return this.replaceWith(expressionAST);\n}\n\n/**\n * Replace the current node with another.\n */\n\nexport function replaceWith<R extends t.Node>(\n this: NodePath,\n replacementPath: R | NodePath<R>,\n): [NodePath<R>] {\n this.resync();\n\n if (this.removed) {\n throw new Error(\"You can't replace this node, we've already removed it\");\n }\n\n let replacement: t.Node =\n replacementPath instanceof NodePath\n ? replacementPath.node\n : replacementPath;\n\n if (!replacement) {\n throw new Error(\n \"You passed `path.replaceWith()` a falsy node, use `path.remove()` instead\",\n );\n }\n\n if (this.node === replacement) {\n return [this as NodePath<R>];\n }\n\n if (this.isProgram() && !isProgram(replacement)) {\n throw new Error(\n \"You can only replace a Program root node with another Program node\",\n );\n }\n\n if (Array.isArray(replacement)) {\n throw new Error(\n \"Don't use `path.replaceWith()` with an array of nodes, use `path.replaceWithMultiple()`\",\n );\n }\n\n if (typeof replacement === \"string\") {\n throw new Error(\n \"Don't use `path.replaceWith()` with a source string, use `path.replaceWithSourceString()`\",\n );\n }\n\n let nodePath = \"\";\n\n if (this.isNodeType(\"Statement\") && isExpression(replacement)) {\n if (\n !this.canHaveVariableDeclarationOrExpression() &&\n !this.canSwapBetweenExpressionAndStatement(replacement) &&\n !this.parentPath.isExportDefaultDeclaration()\n ) {\n // replacing a statement with an expression so wrap it in an expression statement\n replacement = expressionStatement(replacement);\n nodePath = \"expression\";\n }\n }\n\n if (this.isNodeType(\"Expression\") && isStatement(replacement)) {\n if (\n !this.canHaveVariableDeclarationOrExpression() &&\n !this.canSwapBetweenExpressionAndStatement(replacement)\n ) {\n // replacing an expression with a statement so let's explode it\n return this.replaceExpressionWithStatements([replacement]) as [\n NodePath<R>,\n ];\n }\n }\n\n const oldNode = this.node;\n if (oldNode) {\n inheritsComments(replacement, oldNode);\n removeComments(oldNode);\n }\n\n // replace the node\n this._replaceWith(replacement);\n this.type = replacement.type;\n\n // potentially create new scope\n this.setScope();\n\n // requeue for visiting\n this.requeue();\n\n return [\n nodePath ? (this.get(nodePath) as NodePath<R>) : (this as NodePath<R>),\n ];\n}\n\n/**\n * Description\n */\n\nexport function _replaceWith(this: NodePath, node: t.Node) {\n if (!this.container) {\n throw new ReferenceError(\"Container is falsy\");\n }\n\n if (this.inList) {\n // @ts-expect-error todo(flow->ts): check if validate accepts a numeric key\n validate(this.parent, this.key, [node]);\n } else {\n validate(this.parent, this.key as string, node);\n }\n\n this.debug(`Replace with ${node?.type}`);\n getCachedPaths(this.hub, this.parent)?.set(node, this).delete(this.node);\n\n this.node =\n // @ts-expect-error this.key must present in this.container\n this.container[this.key] = node;\n}\n\n/**\n * This method takes an array of statements nodes and then explodes it\n * into expressions. This method retains completion records which is\n * extremely important to retain original semantics.\n */\n\nexport function replaceExpressionWithStatements(\n this: NodePath,\n nodes: Array<t.Statement>,\n) {\n this.resync();\n\n const nodesAsSequenceExpression = toSequenceExpression(nodes, this.scope);\n\n if (nodesAsSequenceExpression) {\n return this.replaceWith(nodesAsSequenceExpression)[0].get(\"expressions\");\n }\n\n const functionParent = this.getFunctionParent();\n const isParentAsync = functionParent?.is(\"async\");\n const isParentGenerator = functionParent?.is(\"generator\");\n\n const container = arrowFunctionExpression([], blockStatement(nodes));\n\n this.replaceWith(callExpression(container, []));\n // replaceWith changes the type of \"this\", but it isn't trackable by TS\n type ThisType = NodePath<\n t.CallExpression & {\n callee: t.ArrowFunctionExpression & { body: t.BlockStatement };\n }\n >;\n\n // hoist variable declaration in do block\n // `(do { var x = 1; x;})` -> `var x; (() => { x = 1; return x; })()`\n const callee = (this as ThisType).get(\"callee\");\n hoistVariables(\n callee.get(\"body\"),\n (id: t.Identifier) => {\n this.scope.push({ id });\n },\n \"var\",\n );\n\n // add implicit returns to all ending expression statements\n const completionRecords: Array<NodePath> = (this as ThisType)\n .get(\"callee\")\n .getCompletionRecords();\n for (const path of completionRecords) {\n if (!path.isExpressionStatement()) continue;\n\n const loop = path.findParent(path => path.isLoop());\n if (loop) {\n let uid = loop.getData(\"expressionReplacementReturnUid\");\n\n if (!uid) {\n uid = callee.scope.generateDeclaredUidIdentifier(\"ret\");\n callee\n .get(\"body\")\n .pushContainer(\"body\", returnStatement(cloneNode(uid)));\n loop.setData(\"expressionReplacementReturnUid\", uid);\n } else {\n uid = identifier(uid.name);\n }\n\n path\n .get(\"expression\")\n .replaceWith(\n assignmentExpression(\"=\", cloneNode(uid), path.node.expression),\n );\n } else {\n path.replaceWith(returnStatement(path.node.expression));\n }\n }\n\n // This is an IIFE, so we don't need to worry about the noNewArrows assumption\n callee.arrowFunctionToExpression();\n // Fixme: we can not `assert this is NodePath<t.FunctionExpression>` in `arrowFunctionToExpression`\n // because it is not a class method known at compile time.\n const newCallee = callee as unknown as NodePath<t.FunctionExpression>;\n\n // (() => await xxx)() -> await (async () => await xxx)();\n const needToAwaitFunction =\n isParentAsync &&\n traverse.hasType(\n (this.get(\"callee.body\") as NodePath<t.BlockStatement>).node,\n \"AwaitExpression\",\n FUNCTION_TYPES,\n );\n const needToYieldFunction =\n isParentGenerator &&\n traverse.hasType(\n (this.get(\"callee.body\") as NodePath<t.BlockStatement>).node,\n \"YieldExpression\",\n FUNCTION_TYPES,\n );\n if (needToAwaitFunction) {\n newCallee.set(\"async\", true);\n // yield* will await the generator return result\n if (!needToYieldFunction) {\n this.replaceWith(awaitExpression((this as ThisType).node));\n }\n }\n if (needToYieldFunction) {\n newCallee.set(\"generator\", true);\n this.replaceWith(yieldExpression((this as ThisType).node, true));\n }\n\n return newCallee.get(\"body.body\");\n}\n\nexport function replaceInline(this: NodePath, nodes: t.Node | Array<t.Node>) {\n this.resync();\n\n if (Array.isArray(nodes)) {\n if (Array.isArray(this.container)) {\n nodes = this._verifyNodeList(nodes);\n const paths = this._containerInsertAfter(nodes);\n this.remove();\n return paths;\n } else {\n return this.replaceWithMultiple(nodes);\n }\n } else {\n return this.replaceWith(nodes);\n }\n}\n"],"mappings":"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"}