context.js.map 15.1 KB
{"version":3,"names":["call","key","opts","debug","node","_call","type","fns","fn","ret","state","then","Error","_traverseFlags","isDenylisted","denylist","blacklist","indexOf","restoreContext","path","context","visit","shouldSkip","currentContext","shouldStop","traverseNode","scope","skipKeys","skip","skipKey","stop","SHOULD_SKIP","SHOULD_STOP","setScope","noScope","parentPath","listKey","isMethod","target","getScope","init","setContext","resync","removed","_resyncParent","_resyncList","_resyncKey","parent","container","Array","isArray","i","length","setKey","Object","keys","inList","newContainer","_resyncRemoved","_markRemoved","popContext","contexts","pop","undefined","pushContext","push","setup","requeue","pathToQueue","maybeQueue","_getQueueContexts"],"sources":["../../src/path/context.ts"],"sourcesContent":["// This file contains methods responsible for maintaining a TraversalContext.\n\nimport { traverseNode } from \"../traverse-node\";\nimport { SHOULD_SKIP, SHOULD_STOP } from \"./index\";\nimport type TraversalContext from \"../context\";\nimport type NodePath from \"./index\";\nimport type * as t from \"@babel/types\";\n\nexport function call(this: NodePath, key: string): boolean {\n  const opts = this.opts;\n\n  this.debug(key);\n\n  if (this.node) {\n    if (this._call(opts[key])) return true;\n  }\n\n  if (this.node) {\n    return this._call(opts[this.node.type] && opts[this.node.type][key]);\n  }\n\n  return false;\n}\n\nexport function _call(this: NodePath, fns?: Array<Function>): boolean {\n  if (!fns) return false;\n\n  for (const fn of fns) {\n    if (!fn) continue;\n\n    const node = this.node;\n    if (!node) return true;\n\n    const ret = fn.call(this.state, this, this.state);\n    if (ret && typeof ret === \"object\" && typeof ret.then === \"function\") {\n      throw new Error(\n        `You appear to be using a plugin with an async traversal visitor, ` +\n          `which your current version of Babel does not support. ` +\n          `If you're using a published plugin, you may need to upgrade ` +\n          `your @babel/core version.`,\n      );\n    }\n    if (ret) {\n      throw new Error(`Unexpected return value from visitor method ${fn}`);\n    }\n\n    // node has been replaced, it will have been requeued\n    if (this.node !== node) return true;\n\n    // this.shouldSkip || this.shouldStop || this.removed\n    if (this._traverseFlags > 0) return true;\n  }\n\n  return false;\n}\n\nexport function isDenylisted(this: NodePath): boolean {\n  const denylist = this.opts.denylist ?? this.opts.blacklist;\n  return denylist && denylist.indexOf(this.node.type) > -1;\n}\n\n// TODO: Remove in Babel 8\nexport { isDenylisted as isBlacklisted };\n\nfunction restoreContext(path: NodePath, context: TraversalContext) {\n  if (path.context !== context) {\n    path.context = context;\n    path.state = context.state;\n    path.opts = context.opts;\n  }\n}\n\nexport function visit(this: NodePath): boolean {\n  if (!this.node) {\n    return false;\n  }\n\n  if (this.isDenylisted()) {\n    return false;\n  }\n\n  if (this.opts.shouldSkip && this.opts.shouldSkip(this)) {\n    return false;\n  }\n\n  const currentContext = this.context;\n  // Note: We need to check \"this.shouldSkip\" first because\n  // another visitor can set it to true. Usually .shouldSkip is false\n  // before calling the enter visitor, but it can be true in case of\n  // a requeued node (e.g. by .replaceWith()) that is then marked\n  // with .skip().\n  if (this.shouldSkip || this.call(\"enter\")) {\n    this.debug(\"Skip...\");\n    return this.shouldStop;\n  }\n  restoreContext(this, currentContext);\n\n  this.debug(\"Recursing into...\");\n  this.shouldStop = traverseNode(\n    this.node,\n    this.opts,\n    this.scope,\n    this.state,\n    this,\n    this.skipKeys,\n  );\n\n  restoreContext(this, currentContext);\n\n  this.call(\"exit\");\n\n  return this.shouldStop;\n}\n\nexport function skip(this: NodePath) {\n  this.shouldSkip = true;\n}\n\nexport function skipKey(this: NodePath, key: string) {\n  if (this.skipKeys == null) {\n    this.skipKeys = {};\n  }\n  this.skipKeys[key] = true;\n}\n\nexport function stop(this: NodePath) {\n  // this.shouldSkip = true; this.shouldStop = true;\n  this._traverseFlags |= SHOULD_SKIP | SHOULD_STOP;\n}\n\nexport function setScope(this: NodePath) {\n  if (this.opts && this.opts.noScope) return;\n\n  let path = this.parentPath;\n\n  // Skip method scope if is computed method key or decorator expression\n  if (\n    (this.key === \"key\" || this.listKey === \"decorators\") &&\n    path.isMethod()\n  ) {\n    path = path.parentPath;\n  }\n\n  let target;\n  while (path && !target) {\n    if (path.opts && path.opts.noScope) return;\n\n    target = path.scope;\n    path = path.parentPath;\n  }\n\n  this.scope = this.getScope(target);\n  if (this.scope) this.scope.init();\n}\n\nexport function setContext<S = unknown>(\n  this: NodePath,\n  context?: TraversalContext<S>,\n) {\n  if (this.skipKeys != null) {\n    this.skipKeys = {};\n  }\n  // this.shouldSkip = false; this.shouldStop = false; this.removed = false;\n  this._traverseFlags = 0;\n\n  if (context) {\n    this.context = context;\n    this.state = context.state;\n    this.opts = context.opts;\n  }\n\n  this.setScope();\n\n  return this;\n}\n\n/**\n * Here we resync the node paths `key` and `container`. If they've changed according\n * to what we have stored internally then we attempt to resync by crawling and looking\n * for the new values.\n */\n\nexport function resync(this: NodePath) {\n  if (this.removed) return;\n\n  this._resyncParent();\n  this._resyncList();\n  this._resyncKey();\n  //this._resyncRemoved();\n}\n\nexport function _resyncParent(this: NodePath) {\n  if (this.parentPath) {\n    this.parent = this.parentPath.node;\n  }\n}\n\nexport function _resyncKey(this: NodePath) {\n  if (!this.container) return;\n\n  if (\n    this.node ===\n    // @ts-expect-error this.key should present in this.container\n    this.container[this.key]\n  ) {\n    return;\n  }\n\n  // grrr, path key is out of sync. this is likely due to a modification to the AST\n  // not done through our path APIs\n\n  if (Array.isArray(this.container)) {\n    for (let i = 0; i < this.container.length; i++) {\n      if (this.container[i] === this.node) {\n        return this.setKey(i);\n      }\n    }\n  } else {\n    for (const key of Object.keys(this.container)) {\n      // @ts-expect-error this.key should present in this.container\n      if (this.container[key] === this.node) {\n        return this.setKey(key);\n      }\n    }\n  }\n\n  // ¯\\_(ツ)_/¯ who knows where it's gone lol\n  this.key = null;\n}\n\nexport function _resyncList(this: NodePath) {\n  if (!this.parent || !this.inList) return;\n\n  const newContainer =\n    // @ts-expect-error this.listKey should present in this.parent\n    this.parent[this.listKey];\n  if (this.container === newContainer) return;\n\n  // container is out of sync. this is likely the result of it being reassigned\n  this.container = newContainer || null;\n}\n\nexport function _resyncRemoved(this: NodePath) {\n  if (\n    this.key == null ||\n    !this.container ||\n    // @ts-expect-error this.key should present in this.container\n    this.container[this.key] !== this.node\n  ) {\n    this._markRemoved();\n  }\n}\n\nexport function popContext(this: NodePath) {\n  this.contexts.pop();\n  if (this.contexts.length > 0) {\n    this.setContext(this.contexts[this.contexts.length - 1]);\n  } else {\n    this.setContext(undefined);\n  }\n}\n\nexport function pushContext(this: NodePath, context: TraversalContext) {\n  this.contexts.push(context);\n  this.setContext(context);\n}\n\nexport function setup(\n  this: NodePath,\n  parentPath: NodePath | undefined,\n  container: t.Node,\n  listKey: string,\n  key: string | number,\n) {\n  this.listKey = listKey;\n  this.container = container;\n\n  this.parentPath = parentPath || this.parentPath;\n  this.setKey(key);\n}\n\nexport function setKey(this: NodePath, key: string | number) {\n  this.key = key;\n  this.node =\n    // @ts-expect-error this.key must present in this.container\n    this.container[this.key];\n  this.type = this.node?.type;\n}\n\nexport function requeue(this: NodePath, pathToQueue = this) {\n  if (pathToQueue.removed) return;\n\n  // If a path is skipped, and then replaced with a\n  // new one, the new one shouldn't probably be skipped.\n  if (process.env.BABEL_8_BREAKING) {\n    pathToQueue.shouldSkip = false;\n  }\n\n  // TODO(loganfsmyth): This should be switched back to queue in parent contexts\n  // automatically once #2892 and #4135 have been resolved. See #4140.\n  // let contexts = this._getQueueContexts();\n  const contexts = this.contexts;\n\n  for (const context of contexts) {\n    context.maybeQueue(pathToQueue);\n  }\n}\n\nexport function _getQueueContexts(this: NodePath) {\n  let path = this;\n  let contexts = this.contexts;\n  while (!contexts.length) {\n    path = path.parentPath;\n    if (!path) break;\n    contexts = path.contexts;\n  }\n  return contexts;\n}\n"],"mappings":"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"}