{"version":3,"file":"index.cjs","names":["traverse: typeof _traverse","_traverse","analyze","traverse: typeof _traverse","_traverse","spread: string[]","state: LexerState","analyze","traverse: typeof _traverse","_traverse","analyze","traverse: typeof _traverse","_traverse","res: t.Identifier[]","path: NodePath<t.ObjectMethod>","spread: string[]","node","parentPath","params","result: IReturnData | undefined","analyze","direction: 'TB' | 'BT' | 'LR' | 'RL'","usedNodes: Set<string>","mermaidText: string","shape: string","closeShape: string","unusedSuffix: string","maxLabels: number[]","communities: Community[]","reindexedCommunities: Community[]","colors: string[]","colors: Array<{ background: string, foreground: string, border: string }>","r: number","g: number","b: number","p","q","dfs","graph","result: Set<TypedNode>[]","visited: Set<TypedNode>","onStack: Set<TypedNode>","stack: TypedNode[]","cycleNodes: TypedNode[]","dfs","suggestions: Suggestion[]","nodes: CustomNode[]","edges: Edge[]","inDegreeMap: Record<string, number>","outDegreeMap: Record<string, number>"],"sources":["../src/analyze/utils.ts","../src/analyze/setupScript.ts","../src/analyze/options.ts","../src/analyze/style.ts","../src/analyze/template.ts","../src/utils/traverse.ts","../src/analyze/tsx.ts","../src/mermaid.ts","../src/suggest/community.ts","../src/suggest/filter.ts","../src/suggest/split.ts","../src/suggest/utils.ts","../src/suggest/index.ts","../src/vis.ts"],"sourcesContent":["import type { NodePath } from '@babel/traverse';\nimport type * as t from '@babel/types';\n\nexport interface TypedNode {\n  label: string\n  type: NodeType\n  info?: Partial<{\n    line: number\n    column: number\n    comment: string\n    used: Set<string>\n  }>\n};\n\nexport enum NodeType {\n  var = 'var',\n  fun = 'fun',\n}\n\ninterface Options {\n  isComputed: boolean\n  isMethod: boolean\n  comment: string\n};\n\nexport type RelationType = 'get' | 'set' | 'call';\n\nexport class NodeCollection {\n  lineOffset = 0;\n  addInfo = true;\n  constructor(_lineOffset = 0, _addInfo = true) {\n    this.lineOffset = _lineOffset;\n    this.addInfo = _addInfo;\n  }\n\n  nodes = new Map<string, TypedNode>();\n\n  addNode(\n    label: string,\n    node: t.Node,\n    options: Partial<Options> = { isComputed: false, isMethod: false, comment: '' },\n  ) {\n    if (this.nodes.has(label)) {\n      return;\n    }\n    if (\n      (!options.isComputed && (\n        (node.type === 'VariableDeclarator' && [\n          'ArrowFunctionExpression',\n          'FunctionDeclaration',\n          'FunctionExpression',\n        ].includes(node.init?.type || ''))\n        || (node.type === 'ObjectProperty' && [\n          'ArrowFunctionExpression',\n          'FunctionDeclaration',\n          'FunctionExpression',\n        ].includes(node.value?.type || ''))\n        || node.type === 'FunctionDeclaration'\n        || node.type === 'ObjectMethod'\n        || node.type === 'ArrowFunctionExpression'\n        || node.type === 'FunctionExpression'\n      ))\n      || options.isMethod\n    ) {\n      this.nodes.set(label, {\n        label,\n        type: NodeType.fun,\n        ...(this.addInfo\n          ? {\n            info: {\n              line: (node.loc?.start.line || 1) - 1 + this.lineOffset,\n              column: node.loc?.start.column || 0,\n              ...options.comment\n                ? { comment: options.comment }\n                : {},\n            },\n          }\n          : {}),\n      });\n    }\n    else {\n      this.nodes.set(label, {\n        label,\n        type: NodeType.var,\n        ...(this.addInfo\n          ? {\n            info: {\n              line: (node.loc?.start.line || 1) - 1 + this.lineOffset,\n              column: node.loc?.start.column || 0,\n              ...options.comment\n                ? { comment: options.comment }\n                : {},\n            },\n          }\n          : {}),\n      });\n    }\n  }\n\n  addTypedNode(label: string, node: TypedNode) {\n    this.nodes.set(label, {\n      label,\n      type: node.type,\n      ...(this.addInfo\n        ? {\n          info: {\n            ...(node.info || {}),\n          },\n        }\n        : {}),\n    });\n  }\n\n  getNode(label: string) {\n    return this.nodes.get(label);\n  }\n\n  map(graph: {\n    nodes: Set<string>\n    edges: Map<string, Set<{ label: string, type: RelationType }>>\n  }) {\n    const nodes = new Set(Array.from(graph.nodes).map((node) => {\n      return this.nodes.get(node)!;\n    }).filter(node => !!node));\n\n    const edges = new Map(Array.from(graph.edges).map(([from, to]) => {\n      // dedupe by node label, preferring 'set' over 'get'\n      const labelMap = new Map<string, { node: TypedNode, type: RelationType }>();\n      for (const item of to) {\n        const node = this.nodes.get(item.label)!;\n        if (!node) {\n          continue;\n        }\n        const existing = labelMap.get(item.label);\n        if (!existing || (existing.type === 'get' && item.type === 'set')) {\n          labelMap.set(item.label, { node, type: item.type });\n        }\n      }\n      const items = Array.from(labelMap.values());\n      return [this.nodes.get(from)!, new Set(items)];\n    }));\n\n    return {\n      nodes,\n      edges,\n    };\n  }\n}\n\nexport function getComment(node: t.Node) {\n  let comment = '';\n\n  node.leadingComments?.forEach((_comment) => {\n    if (_comment.loc!.end.line > node.loc!.start.line) {\n      return;\n    }\n    if (_comment.value.trim().startsWith('*')) {\n      comment += `${_comment.value.trim().replace(/^\\s*\\*+\\s*\\**/gm, '').trim()}\\n`;\n    }\n  });\n\n  node.trailingComments?.forEach((_comment) => {\n    if (_comment.loc!.end.line > node.loc!.start.line) {\n      return;\n    }\n    if (_comment.value.trim().startsWith('*')) {\n      comment += `${_comment.value.trim().replace(/^\\s*\\*+\\s*\\**/gm, '').trim()}\\n`;\n    }\n    else {\n      comment += `${_comment.value.trim()}\\n`;\n    }\n  });\n\n  return comment.trim();\n}\n\nexport function isWritingNode(path: NodePath<t.Node>) {\n  // Check if the current node is inside an assignment expression (including nested MemberExpression)\n  const assignParent = path.findParent(p => p.isAssignmentExpression()) as NodePath<t.AssignmentExpression> | null;\n  if (assignParent) {\n    const leftNode = assignParent.node.left;\n    if (\n      leftNode.start != null\n      && path.node.start! >= leftNode.start\n      && path.node.end! <= (leftNode.end as number)\n    ) {\n      return true;\n    }\n  }\n\n  // Check if the current node is inside an update expression (including nested MemberExpression)\n  const updateParent = path.findParent(p => p.isUpdateExpression()) as NodePath<t.UpdateExpression> | null;\n  if (updateParent) {\n    const argNode = updateParent.node.argument as t.Node;\n    if (\n      argNode.start != null\n      && path.node.start! >= argNode.start\n      && path.node.end! <= (argNode.end as number)\n    ) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nexport function isCallingNode(path: NodePath<t.Identifier>) {\n  const parent = path.parentPath;\n  // 判断父节点是否为 CallExpression，并且当前节点是 callee\n  if (parent && parent.isCallExpression()) {\n    return parent.node.callee === path.node;\n  }\n  return false;\n}\n\nexport function getRelationType(path: NodePath<t.Node>) {\n  if (path.node.type === 'Identifier' && isCallingNode(path as NodePath<t.Identifier>)) {\n    return 'call';\n  }\n  if (isWritingNode(path)) {\n    return 'set';\n  }\n  return 'get';\n}\n","import type { NodePath, Scope, VisitNode } from '@babel/traverse';\nimport type * as t from '@babel/types';\nimport type { RelationType } from './utils';\nimport _traverse from '@babel/traverse';\nimport { babelParse } from '@vue/compiler-sfc';\nimport { getComment, getRelationType, NodeCollection, NodeType } from './utils';\n\nconst traverse: typeof _traverse\n  // @ts-expect-error unwarp default\n  = _traverse.default?.default || _traverse.default || _traverse;\n\nconst ignoreFunctionsName = ['defineProps', 'defineEmits', 'withDefaults'];\n\nexport const watchHooks = [\n  'watch',\n\n  // from `@vueuse/core`\n  'watchArray',\n  'watchAtMost',\n  'watchDebounced',\n  'watchDeep',\n  'watchIgnorable',\n  'watchImmediate',\n  'watchOnce',\n  'watchPausable',\n  'watchThrottled',\n  'watchTriggerable',\n  'watchWithFilter',\n];\n\nexport function processSetup(\n  ast: t.Node,\n  parentScope?: Scope,\n  parentPath?: t.Node,\n  _spread?: string[],\n  _lineOffset = 0,\n) {\n  const spread = _spread || [];\n\n  const nodeCollection = new NodeCollection(_lineOffset);\n\n  const graph = {\n    nodes: new Set<string>(),\n    edges: new Map<string, Set<{ label: string, type: RelationType }>>(),\n    spread: new Map<string, Set<string>>(),\n  };\n\n  traverse(ast, {\n    VariableDeclaration(path) {\n      path.node.declarations.forEach((declaration) => {\n        if (declaration.id.type === 'ArrayPattern') {\n          declaration.id.elements.forEach((element) => {\n            if (element?.type === 'Identifier') {\n              const name = element.name;\n              const binding = path.scope.getBinding(name);\n\n              if (\n                binding\n                && (path.parent.type === 'Program'\n                  || (parentPath?.type === 'ObjectMethod' && parentPath.body === path.parent)\n                )\n                && !(declaration.init?.type === 'CallExpression'\n                  && declaration.init?.callee.type === 'Identifier'\n                  && ignoreFunctionsName.includes(declaration.init?.callee.name)\n                )\n              ) {\n                graph.nodes.add(name);\n                nodeCollection.addNode(name, element, {\n                  comment: getComment(path.node),\n                });\n                if (!graph.edges.get(name)) {\n                  graph.edges.set(name, new Set());\n                }\n              }\n            }\n            if (element?.type === 'RestElement' && element.argument.type === 'Identifier') {\n              const name = element.argument.name;\n              const binding = path.scope.getBinding(name);\n\n              if (\n                binding\n                && (path.parent.type === 'Program'\n                  || (parentPath?.type === 'ObjectMethod' && parentPath.body === path.parent)\n                )\n                && !(declaration.init?.type === 'CallExpression'\n                  && declaration.init?.callee.type === 'Identifier'\n                  && ignoreFunctionsName.includes(declaration.init?.callee.name)\n                )\n              ) {\n                graph.nodes.add(name);\n                nodeCollection.addNode(name, element.argument, {\n                  comment: getComment(path.node),\n                });\n                if (!graph.edges.get(name)) {\n                  graph.edges.set(name, new Set());\n                }\n              }\n            }\n          });\n        }\n        if (declaration.id.type === 'ObjectPattern') {\n          declaration.id.properties.forEach((property) => {\n            if (property.type === 'ObjectProperty' && property.value.type === 'Identifier') {\n              const name = property.value.name;\n              const binding = path.scope.getBinding(name);\n              if (\n                binding\n                && (path.parent.type === 'Program'\n                  || (parentPath?.type === 'ObjectMethod' && parentPath.body === path.parent)\n                )\n                && !(declaration.init?.type === 'CallExpression'\n                  && declaration.init?.callee.type === 'Identifier'\n                  && ignoreFunctionsName.includes(declaration.init?.callee.name)\n                )\n              ) {\n                graph.nodes.add(name);\n                nodeCollection.addNode(name, property.value, {\n                  comment: getComment(property),\n                });\n                if (!graph.edges.get(name)) {\n                  graph.edges.set(name, new Set());\n                }\n              }\n            }\n\n            if (property.type === 'RestElement' && property.argument.type === 'Identifier') {\n              const name = property.argument.name;\n              const binding = path.scope.getBinding(name);\n              if (\n                binding\n                && (path.parent.type === 'Program'\n                  || (parentPath?.type === 'ObjectMethod' && parentPath.body === path.parent)\n                )\n                && !(declaration.init?.type === 'CallExpression'\n                  && declaration.init?.callee.type === 'Identifier'\n                  && ignoreFunctionsName.includes(declaration.init?.callee.name)\n                )\n              ) {\n                graph.nodes.add(name);\n                nodeCollection.addNode(name, property.argument, {\n                  comment: getComment(property),\n                });\n                if (!graph.edges.get(name)) {\n                  graph.edges.set(name, new Set());\n                }\n              }\n            }\n          });\n        }\n        if (declaration.id?.type === 'Identifier') {\n          const name = declaration.id.name;\n          const binding = path.scope.getBinding(name);\n          if (\n            binding\n            && (path.parent.type === 'Program'\n              || (parentPath?.type === 'ObjectMethod' && parentPath.body === path.parent)\n            )\n            && !(declaration.init?.type === 'CallExpression'\n              && declaration.init?.callee.type === 'Identifier'\n              && ignoreFunctionsName.includes(declaration.init?.callee.name)\n            )\n          ) {\n            graph.nodes.add(name);\n            nodeCollection.addNode(name, declaration, {\n              comment: getComment(path.node),\n            });\n            if (!graph.edges.get(name)) {\n              graph.edges.set(name, new Set());\n            }\n\n            if (spread.includes(name)) {\n              if (declaration.init?.type === 'ObjectExpression') {\n                declaration.init?.properties.forEach((prop) => {\n                  if (\n                    (prop.type === 'ObjectProperty' || prop.type === 'ObjectMethod')\n                    && prop.key.type === 'Identifier'\n                  ) {\n                    const keyName = prop.key.name;\n                    graph.nodes.add(keyName);\n                    nodeCollection.addNode(keyName, prop, {\n                      comment: getComment(prop),\n                    });\n                    if (!graph.edges.get(keyName)) {\n                      graph.edges.set(keyName, new Set());\n                    }\n                    if (graph.spread.has(name)) {\n                      graph.spread.get(name)?.add(keyName);\n                    }\n                    else {\n                      graph.spread.set(name, new Set([keyName]));\n                    }\n                  }\n                  else if (prop.type === 'SpreadElement') {\n                    console.warn('not support spread in spread');\n                  }\n                });\n              }\n              if (\n                declaration.init?.type === 'CallExpression'\n                && declaration.init?.callee.type === 'Identifier'\n                && declaration.init?.callee.name === 'reactive'\n              ) {\n                const arg = declaration.init?.arguments[0];\n                if (arg.type === 'ObjectExpression') {\n                  arg.properties.forEach((prop) => {\n                    if (\n                      (prop.type === 'ObjectProperty' || prop.type === 'ObjectMethod')\n                      && prop.key.type === 'Identifier'\n                    ) {\n                      const keyName = prop.key.name;\n                      graph.nodes.add(keyName);\n                      nodeCollection.addNode(keyName, prop, {\n                        comment: getComment(prop),\n                      });\n                      if (!graph.edges.get(keyName)) {\n                        graph.edges.set(keyName, new Set());\n                      }\n                      if (graph.spread.has(name)) {\n                        graph.spread.get(name)?.add(keyName);\n                      }\n                      else {\n                        graph.spread.set(name, new Set([keyName]));\n                      }\n                    }\n                    else if (prop.type === 'SpreadElement') {\n                      console.warn('not support spread in spread');\n                    }\n                  });\n                }\n              }\n            }\n          }\n        }\n      });\n    },\n    FunctionDeclaration(path) {\n      const name = path.node.id?.name;\n      if (name) {\n        const binding = path.scope.getBinding(name);\n        if (binding && (path.parent.type === 'Program'\n          || (parentPath?.type === 'ObjectMethod' && parentPath.body === path.parent)\n        )) {\n          graph.nodes.add(name);\n          nodeCollection.addNode(name, path.node.id!, {\n            isMethod: true,\n            comment: getComment(path.node),\n          });\n          if (!graph.edges.get(name)) {\n            graph.edges.set(name, new Set());\n          }\n        }\n      }\n    },\n  }, parentScope, parentPath);\n\n  function traverseHooks(node: t.ExpressionStatement | t.CallExpression, patentScope: Scope) {\n    if (\n      (\n        node.type === 'ExpressionStatement'\n        && node.expression.type === 'CallExpression'\n        && node.expression.callee.type === 'Identifier'\n      ) || (\n        node.type === 'CallExpression'\n        && node.callee.type === 'Identifier'\n      )\n    ) {\n      const hookName = (() => {\n        if (node.type === 'ExpressionStatement'\n          && node.expression.type === 'CallExpression'\n          && node.expression.callee.type === 'Identifier') {\n          return node.expression.callee.name;\n        }\n        if (node.type === 'CallExpression'\n          && node.callee.type === 'Identifier') {\n          return node.callee.name;\n        }\n      })() || '';\n\n      if (!hookName) {\n        return;\n      }\n\n      const hookBinding = patentScope.getBinding(hookName);\n      if (!(hookBinding === undefined || hookBinding?.scope.block.type === 'Program'\n        || parentScope === hookBinding?.scope)) {\n        return;\n      }\n\n      const expression = (node.type === 'ExpressionStatement'\n        ? node.expression\n        : node) as t.CallExpression;\n\n      const watchArgs = new Set<t.Identifier>();\n\n      if (hookName === 'provide') {\n        traverse(expression, {\n          Identifier(path1) {\n            const binding = path1.scope.getBinding(path1.node.name);\n            if (\n              graph.nodes.has(path1.node.name)\n              && (\n                (path1.parent.type !== 'MemberExpression'\n                  && path1.parent.type !== 'OptionalMemberExpression')\n                || path1.parent.object === path1.node\n              )\n              && (binding?.scope.block.type === 'Program'\n                || parentScope === binding?.scope)\n            ) {\n              const _node = nodeCollection.getNode(path1.node.name);\n              if (_node?.info?.used) {\n                _node?.info?.used?.add(hookName);\n              }\n              else if (_node) {\n                _node.info = {\n                  ..._node?.info,\n                  used: new Set([hookName]),\n                };\n              }\n            }\n          },\n        }, patentScope, node);\n      }\n      else if (watchHooks.includes(hookName)) {\n        if (expression.arguments[0].type === 'Identifier') {\n          const binding = patentScope.getBinding(expression.arguments[0].name);\n          if (\n            graph.nodes.has(expression.arguments[0].name)\n            && (binding?.scope.block.type === 'Program'\n              || parentScope === binding?.scope)\n          ) {\n            watchArgs.add(expression.arguments[0]);\n          }\n        }\n        else {\n          traverse(expression.arguments[0], {\n            Identifier(path1) {\n              const binding = path1.scope.getBinding(path1.node.name);\n              if (\n                graph.nodes.has(path1.node.name)\n                && (\n                  (path1.parent.type !== 'MemberExpression'\n                    && path1.parent.type !== 'OptionalMemberExpression')\n                  || path1.parent.object === path1.node\n                )\n                && (binding?.scope.block.type === 'Program'\n                  || parentScope === binding?.scope)\n              ) {\n                watchArgs.add(path1.node);\n              }\n            },\n          }, patentScope, node);\n        }\n      }\n      else if (hookName === 'useEffect' && expression.arguments[1].type === 'ArrayExpression') {\n        traverse(expression.arguments[1], {\n          Identifier(path1) {\n            const binding = path1.scope.getBinding(path1.node.name);\n            if (\n              graph.nodes.has(path1.node.name)\n              && (\n                (path1.parent.type !== 'MemberExpression'\n                  && path1.parent.type !== 'OptionalMemberExpression')\n                || path1.parent.object === path1.node\n              )\n              && (binding?.scope.block.type === 'Program'\n                || parentScope === binding?.scope)\n            ) {\n              watchArgs.add(path1.node);\n            }\n          },\n        }, patentScope, node);\n      }\n      expression.arguments.forEach((argNode, index) => {\n        if (watchHooks.includes(hookName) && index === 0 && argNode.type === 'Identifier') {\n          const _node = nodeCollection.getNode(argNode.name);\n          if (_node?.info?.used) {\n            _node?.info?.used?.add(hookName);\n          }\n          else if (_node) {\n            _node.info = {\n              ..._node?.info,\n              used: new Set([hookName]),\n            };\n          }\n          return;\n        }\n        if (argNode.type === 'Identifier') {\n          const binding = patentScope.getBinding(argNode.name);\n          if (\n            graph.nodes.has(argNode.name)\n            && (binding?.scope.block.type === 'Program'\n              || parentScope === binding?.scope)\n          ) {\n            const _node = nodeCollection.getNode(argNode.name);\n            if (_node?.info?.used) {\n              _node?.info?.used?.add(hookName);\n            }\n            else if (_node) {\n              _node.info = {\n                ..._node?.info,\n                used: new Set([hookName]),\n              };\n            }\n          }\n        }\n        else {\n          traverse(argNode, {\n            Identifier(path1) {\n              const binding = path1.scope.getBinding(path1.node.name);\n              if (\n                graph.nodes.has(path1.node.name)\n                && (\n                  (path1.parent.type !== 'MemberExpression'\n                    && path1.parent.type !== 'OptionalMemberExpression')\n                  || path1.parent.object === path1.node\n                )\n                && (binding?.scope.block.type === 'Program'\n                  || parentScope === binding?.scope)\n              ) {\n                if ([...watchHooks, 'useEffect'].includes(hookName) && watchArgs.size > 0) {\n                  const watchArgsNames = Array.from(watchArgs).map(arg => arg.name);\n                  watchArgs.forEach((watchArg) => {\n                    if (!watchArgsNames.includes(path1.node.name)) {\n                      graph.edges.get(watchArg.name)?.add({\n                        label: path1.node.name,\n                        type: getRelationType(path1),\n                      });\n                    }\n                  });\n                }\n                const _node = nodeCollection.getNode(path1.node.name);\n                if (_node?.info?.used) {\n                  _node?.info?.used?.add(hookName);\n                }\n                else if (_node) {\n                  _node.info = {\n                    ..._node?.info,\n                    used: new Set([hookName]),\n                  };\n                }\n              }\n            },\n          }, patentScope, node);\n        }\n      });\n    }\n  }\n\n  // get the relation between the variable and the function\n  traverse(ast, {\n    FunctionDeclaration(path) {\n      const name = path.node.id?.name;\n      if (name && graph.nodes.has(name)) {\n        traverse(path.node.body, {\n          Identifier(path1) {\n            const binding = path1.scope.getBinding(path1.node.name);\n            if (\n              graph.nodes.has(path1.node.name)\n              && (\n                (path1.parent.type !== 'MemberExpression'\n                  && path1.parent.type !== 'OptionalMemberExpression')\n                || path1.parent.object === path1.node\n              )\n              && (binding?.scope.block.type === 'Program'\n                || (parentScope === binding?.scope)\n              )\n            ) {\n              graph.edges.get(name)?.add({\n                label: path1.node.name,\n                type: getRelationType(path1),\n              });\n            }\n          },\n          MemberExpression(path1) {\n            if (\n              path1.node.object.type === 'Identifier'\n              && spread.includes(path1.node.object.name)\n            ) {\n              const binding = path1.scope.getBinding(path1.node.object.name);\n              if (\n                spread.includes(path1.node.object.name)\n                && path1.node.property.type === 'Identifier'\n                && (binding?.scope.block.type === 'Program'\n                  || (parentScope === binding?.scope)\n                )\n              ) {\n                graph.edges.get(name)?.add({\n                  label: path1.node.property.name,\n                  type: getRelationType(path1),\n                });\n              }\n            }\n          },\n        }, path.scope, path);\n      }\n    },\n\n    VariableDeclarator(path) {\n      if (path.node.init) {\n        if (path.node.id.type === 'ArrayPattern') {\n          path.node.id.elements.forEach((element) => {\n            if (element?.type === 'Identifier') {\n              const name = element.name;\n              if (name && graph.nodes.has(name) && path.node.init?.type === 'CallExpression') {\n                traverse(path.node.init, {\n                  Identifier(path1) {\n                    const binding = path1.scope.getBinding(path1.node.name);\n                    if (\n                      graph.nodes.has(path1.node.name)\n                      && (\n                        (path1.parent.type !== 'MemberExpression'\n                          && path1.parent.type !== 'OptionalMemberExpression')\n                        || path1.parent.object === path1.node\n                      )\n                      && (binding?.scope.block.type === 'Program'\n                        || (parentScope === binding?.scope)\n                      )\n                    ) {\n                      graph.edges.get(name)?.add({\n                        label: path1.node.name,\n                        type: getRelationType(path1),\n                      });\n                    }\n                  },\n                  MemberExpression(path1) {\n                    if (\n                      path1.node.object.type === 'Identifier'\n                      && spread.includes(path1.node.object.name)\n                    ) {\n                      const binding = path1.scope.getBinding(path1.node.object.name);\n                      if (\n                        spread.includes(path1.node.object.name)\n                        && path1.node.property.type === 'Identifier'\n                        && (binding?.scope.block.type === 'Program'\n                          || (parentScope === binding?.scope)\n                        )\n                      ) {\n                        graph.edges.get(name)?.add({\n                          label: path1.node.property.name,\n                          type: getRelationType(path1),\n                        });\n                      }\n                    }\n                  },\n                }, path.scope, path);\n              }\n            }\n          });\n        }\n        else if (path.node.id.type === 'ObjectPattern') {\n          path.node.id.properties.forEach((property) => {\n            if (property.type === 'ObjectProperty' && property.value.type === 'Identifier') {\n              const name = property.value.name;\n              if (name && graph.nodes.has(name) && path.node.init) {\n                traverse(path.node.init, {\n                  Identifier(path1) {\n                    const binding = path1.scope.getBinding(path1.node.name);\n                    if (\n                      graph.nodes.has(path1.node.name)\n                      && (\n                        (path1.parent.type !== 'MemberExpression'\n                          && path1.parent.type !== 'OptionalMemberExpression')\n                        || path1.parent.object === path1.node\n                      )\n                      && (binding?.scope.block.type === 'Program'\n                        || (parentScope === binding?.scope)\n                      )\n                    ) {\n                      graph.edges.get(name)?.add({\n                        label: path1.node.name,\n                        type: getRelationType(path1),\n                      });\n                    }\n                  },\n                  MemberExpression(path1) {\n                    if (\n                      path1.node.object.type === 'Identifier'\n                      && spread.includes(path1.node.object.name)\n                    ) {\n                      const binding = path1.scope.getBinding(path1.node.object.name);\n                      if (\n                        spread.includes(path1.node.object.name)\n                        && path1.node.property.type === 'Identifier'\n                        && (binding?.scope.block.type === 'Program'\n                          || (parentScope === binding?.scope)\n                        )\n                      ) {\n                        graph.edges.get(name)?.add({\n                          label: path1.node.property.name,\n                          type: getRelationType(path1),\n                        });\n                      }\n                    }\n                  },\n                }, path.scope, path);\n              }\n            }\n          });\n        }\n        else if ([\n          'CallExpression',\n          'ArrowFunctionExpression',\n          'FunctionDeclaration',\n        ].includes(path.node.init.type)\n        && path.node.id.type === 'Identifier'\n        ) {\n          if (path.node.init.type === 'CallExpression' && path.node.init.callee.type === 'Identifier' && [...watchHooks, 'watchEffect'].includes(path.node.init.callee.name)) {\n            traverseHooks(path.node.init, path.scope);\n          }\n          const name = path.node.id?.name;\n          if (name && graph.nodes.has(name)) {\n            traverse(path.node.init, {\n              Identifier(path1) {\n                const binding = path1.scope.getBinding(path1.node.name);\n                if (\n                  graph.nodes.has(path1.node.name)\n                  && (\n                    (path1.parent.type !== 'MemberExpression'\n                      && path1.parent.type !== 'OptionalMemberExpression')\n                    || path1.parent.object === path1.node\n                  )\n                  && (binding?.scope.block.type === 'Program'\n                    || (parentScope === binding?.scope)\n                  )\n                ) {\n                  graph.edges.get(name)?.add({\n                    label: path1.node.name,\n                    type: getRelationType(path1),\n                  });\n                }\n              },\n              MemberExpression(path1) {\n                if (\n                  path1.node.object.type === 'Identifier'\n                  && spread.includes(path1.node.object.name)\n                ) {\n                  const binding = path1.scope.getBinding(path1.node.object.name);\n                  if (\n                    spread.includes(path1.node.object.name)\n                    && path1.node.property.type === 'Identifier'\n                    && (binding?.scope.block.type === 'Program'\n                      || (parentScope === binding?.scope)\n                    )\n                  ) {\n                    graph.edges.get(name)?.add({\n                      label: path1.node.property.name,\n                      type: getRelationType(path1),\n                    });\n                  }\n                }\n              },\n            }, path.scope, path);\n          }\n        }\n        else if (path.node.id.type === 'Identifier') {\n          const name = path.node.id.name;\n          if (path.node.init.type === 'Identifier') {\n            const binding = path.scope.getBinding(path.node.init.name);\n            if (\n              graph.nodes.has(path.node.init.name)\n              && (binding?.scope.block.type === 'Program'\n                || (parentScope === binding?.scope)\n              )\n            ) {\n              graph.edges.get(name)?.add({\n                label: path.node.init.name,\n                type: getRelationType(path),\n              });\n            }\n          }\n          else {\n            traverse(path.node.init, {\n              Identifier(path1) {\n                const binding = path1.scope.getBinding(path1.node.name);\n                if (\n                  graph.nodes.has(path1.node.name)\n                  && (\n                    (path1.parent.type !== 'MemberExpression'\n                      && path1.parent.type !== 'OptionalMemberExpression')\n                    || path1.parent.object === path1.node\n                  )\n                  && (binding?.scope.block.type === 'Program'\n                    || (parentScope === binding?.scope)\n                  )\n                ) {\n                  graph.edges.get(name)?.add({\n                    label: path1.node.name,\n                    type: getRelationType(path1),\n                  });\n                }\n              },\n            }, path.scope, path);\n          }\n        }\n      }\n    },\n\n    ObjectMethod(path) {\n      if (path.node.key.type === 'Identifier' && graph.nodes.has(path.node.key.name)) {\n        const name = path.node.key.name;\n\n        traverse(path.node.body, {\n          Identifier(path1) {\n            const binding = path1.scope.getBinding(path1.node.name);\n            if (\n              graph.nodes.has(path1.node.name)\n              && (\n                (path1.parent.type !== 'MemberExpression'\n                  && path1.parent.type !== 'OptionalMemberExpression')\n                || path1.parent.object === path1.node\n              )\n              && (binding?.scope.block.type === 'Program'\n                || (parentScope === binding?.scope)\n              )\n            ) {\n              graph.edges.get(name)?.add({\n                label: path1.node.name,\n                type: getRelationType(path1),\n              });\n            }\n          },\n          MemberExpression(path1) {\n            if (\n              path1.node.object.type === 'Identifier'\n              && spread.includes(path1.node.object.name)\n            ) {\n              const binding = path1.scope.getBinding(path1.node.object.name);\n              if (\n                spread.includes(path1.node.object.name)\n                && path1.node.property.type === 'Identifier'\n                && (binding?.scope.block.type === 'Program'\n                  || (parentScope === binding?.scope)\n                )\n              ) {\n                graph.edges.get(name)?.add({\n                  label: path1.node.property.name,\n                  type: getRelationType(path1),\n                });\n              }\n            }\n          },\n        }, path.scope, path);\n      }\n    },\n\n    ObjectProperty(path) {\n      if (path.node.key.type === 'Identifier' && graph.nodes.has(path.node.key.name)) {\n        const name = path.node.key.name;\n\n        traverse(path.node.value, {\n          MemberExpression(path1) {\n            if (\n              path1.node.object.type === 'Identifier'\n              && spread.includes(path1.node.object.name)\n            ) {\n              const binding = path1.scope.getBinding(path1.node.object.name);\n              if (\n                spread.includes(path1.node.object.name)\n                && path1.node.property.type === 'Identifier'\n                && (binding?.scope.block.type === 'Program'\n                  || (parentScope === binding?.scope)\n                )\n              ) {\n                graph.edges.get(name)?.add({\n                  label: path1.node.property.name,\n                  type: getRelationType(path1),\n                });\n              }\n            }\n          },\n        }, path.scope, path);\n      }\n    },\n    ExpressionStatement(path) {\n      if (path.type === 'ExpressionStatement'\n        && path.node.expression.type === 'CallExpression'\n        && path.node.expression.callee.type === 'Identifier'\n      ) {\n        const name = path.node.expression.callee.name;\n        if (\n          graph.nodes.has(name)\n          && (path.scope.block.type === 'Program')\n        ) {\n          const _node = nodeCollection.getNode(name);\n          if (_node?.info?.used) {\n            _node?.info?.used?.add('Call Expression');\n          }\n          else if (_node) {\n            _node.info = {\n              ..._node?.info,\n              used: new Set(['Call Expression']),\n            };\n          }\n        }\n        else {\n          traverseHooks(path.node.expression, path.scope);\n        }\n      }\n      if (path.type === 'ExpressionStatement'\n        && path.node.expression.type === 'AssignmentExpression'\n        && path.node.expression.right.type === 'CallExpression'\n        && path.node.expression.right.callee.type === 'Identifier'\n      ) {\n        traverseHooks(path.node.expression.right, path.scope);\n      }\n    },\n  }, parentScope, parentPath);\n\n  return {\n    graph,\n    nodeCollection,\n  };\n}\n\nexport function analyze(\n  content: string,\n  lineOffset = 0,\n  jsx = false,\n) {\n  // console.log(content);\n  const ast = babelParse(content, { sourceType: 'module', plugins: [\n    'typescript',\n    ...jsx\n      ? ['jsx' as const]\n      : [],\n  ] });\n\n  // ---\n  const { graph, nodeCollection } = processSetup(ast, undefined, undefined, undefined, lineOffset);\n  return nodeCollection.map(graph);\n}\n","import type { NodePath } from '@babel/traverse';\nimport type * as t from '@babel/types';\nimport type { RelationType } from './utils';\nimport _traverse from '@babel/traverse';\nimport { babelParse } from '@vue/compiler-sfc';\nimport { processSetup, watchHooks } from './setupScript';\nimport { getComment, getRelationType, NodeCollection } from './utils';\n\nconst traverse: typeof _traverse\n  // @ts-expect-error unwarp default\n  = _traverse.default?.default || _traverse.default || _traverse;\n\nconst vueLifeCycleHooks = [\n  'beforeCreate',\n  'created',\n  'beforeMount',\n  'mounted',\n  'beforeUpdate',\n  'updated',\n  'beforeDestroy',\n  'destroyed',\n  'activated',\n  'deactivated',\n  'errorCaptured',\n  'renderTracked',\n  'renderTriggered',\n  'provide',\n];\n\nexport function analyze(\n  content: string,\n  lineOffset = 0,\n  jsx = false,\n) {\n  // console.log({lineOffset});\n  // console.log(content);\n  const ast = babelParse(content, { sourceType: 'module', plugins: [\n    'typescript',\n    ...jsx\n      ? ['jsx' as const]\n      : [],\n  ] });\n\n  // ---\n\n  let nodeCollection = new NodeCollection(lineOffset);\n\n  const tNodes = new Map<string, t.Identifier>();\n  const graph = {\n    nodes: new Set<string>(),\n    edges: new Map<string, Set<{ label: string, type: RelationType }>>(),\n  };\n\n  /** used in render block or setup return */\n  const nodesUsedInTemplate = new Set<string>();\n\n  function process(node: t.ObjectExpression, path: NodePath<t.ExportDefaultDeclaration>) {\n    traverse(node, {\n      ObjectProperty(path1) {\n        if (\n          (\n            path.node.declaration.type === 'ObjectExpression'\n            && path1.parent === path.node.declaration\n          ) || (\n            path.node.declaration.type === 'CallExpression'\n            && path1.parent === path.node.declaration.arguments[0]\n          )\n        ) {\n          // data\n          if (\n            path1.node.key.type === 'Identifier'\n            && path1.node.key.name === 'data'\n            && (\n              path1.node.value.type === 'ArrowFunctionExpression'\n              || path1.node.value.type === 'FunctionExpression'\n            )\n          ) {\n            const dataNode = path1.node.value;\n\n            traverse(dataNode, {\n              ReturnStatement(path2) {\n                if (path2.parent === dataNode.body) {\n                  if (path2.node.argument?.type === 'ObjectExpression') {\n                    path2.node.argument.properties.forEach((prop) => {\n                      if (prop.type === 'ObjectProperty') {\n                        if (prop.key.type === 'Identifier') {\n                          const name = prop.key.name;\n                          graph.nodes.add(name);\n                          tNodes.set(name, prop.key);\n                          nodeCollection.addNode(name, prop, {\n                            comment: getComment(prop),\n                          });\n                          if (!graph.edges.get(name)) {\n                            graph.edges.set(name, new Set());\n                          }\n                        }\n                      }\n                    });\n                  }\n                }\n              },\n            }, path1.scope, path1);\n          }\n\n          // computed\n          if (path1.node.key.type === 'Identifier' && path1.node.key.name === 'computed') {\n            const computedNode = path1.node;\n            if (computedNode.value.type === 'ObjectExpression') {\n              computedNode.value.properties.forEach((prop) => {\n                if (prop.type === 'ObjectProperty' || prop.type === 'ObjectMethod') {\n                  if (prop.key.type === 'Identifier') {\n                    const name = prop.key.name;\n                    graph.nodes.add(name);\n                    tNodes.set(name, prop.key);\n                    nodeCollection.addNode(name, prop, {\n                      isComputed: true,\n                      comment: getComment(prop),\n                    });\n                    if (!graph.edges.get(name)) {\n                      graph.edges.set(name, new Set());\n                    }\n                  }\n                }\n              });\n            }\n          }\n\n          // methods\n          if (path1.node.key.type === 'Identifier' && path1.node.key.name === 'methods') {\n            const methodsNode = path1.node;\n            if (methodsNode.value.type === 'ObjectExpression') {\n              methodsNode.value.properties.forEach((prop) => {\n                if (prop.type === 'ObjectProperty' || prop.type === 'ObjectMethod') {\n                  if (prop.key.type === 'Identifier') {\n                    const name = prop.key.name;\n                    graph.nodes.add(name);\n                    tNodes.set(name, prop.key);\n                    nodeCollection.addNode(name, prop, {\n                      isMethod: true,\n                      comment: getComment(prop),\n                    });\n                    if (!graph.edges.get(name)) {\n                      graph.edges.set(name, new Set());\n                    }\n                  }\n                }\n              });\n            }\n          }\n\n          if (\n            path1.node.key.type === 'Identifier'\n            && path1.node.key.name === 'render'\n            && (\n              path1.node.value.type === 'ArrowFunctionExpression'\n              || path1.node.value.type === 'FunctionExpression'\n            )\n          ) {\n            traverse(path1.node.value, {\n              ReturnStatement(path2) {\n                const templateNode = path2.node;\n                traverse(templateNode, {\n                  MemberExpression(path3) {\n                    if (path3.node.object && path3.node.object.type === 'ThisExpression') {\n                      if (path3.node.property && path3.node.property.type === 'Identifier') {\n                        nodesUsedInTemplate.add(path3.node.property.name);\n                      }\n                    }\n                  },\n                }, path2.scope, path2);\n              },\n            }, path1.scope, path1);\n          }\n        }\n      },\n      ObjectMethod(path1) {\n        if (\n          (\n            path.node.declaration.type === 'ObjectExpression'\n            && path1.parent === path.node.declaration\n          ) || (\n            path.node.declaration.type === 'CallExpression'\n            && path1.parent === path.node.declaration.arguments[0]\n          )\n        ) {\n          // setup\n          if (path1.node.key.type === 'Identifier' && path1.node.key.name === 'setup') {\n            const setupNode = path1.node;\n\n            const spread: string[] = [];\n\n            traverse(setupNode, {\n              ReturnStatement(path2) {\n                if (path2.node.argument?.type === 'ObjectExpression') {\n                  const returnNode = path2.node.argument;\n                  traverse(returnNode, {\n                    SpreadElement(path3) {\n                      // ...toRefs(xxx)\n                      if (\n                        path3.node.argument.type === 'CallExpression'\n                        && path3.node.argument.callee.type === 'Identifier'\n                        && path3.node.argument.callee.name === 'toRefs'\n                        && path3.node.argument.arguments[0].type === 'Identifier'\n                      ) {\n                        spread.push(path3.node.argument.arguments[0].name);\n                      }\n                      // ...xxx\n                      else if (\n                        path3.node.argument.type === 'Identifier'\n                      ) {\n                        spread.push(path3.node.argument.name);\n                      }\n                    },\n                  }, path2.scope, path2);\n                }\n                if (\n                  path2.node.argument?.type === 'FunctionExpression'\n                  || path2.node.argument?.type === 'ArrowFunctionExpression'\n                ) {\n                  const templateNode = path2.node.argument.body;\n                  traverse(templateNode, {\n                    Identifier(path3) {\n                      const binding = path3.scope.getBinding(path3.node.name);\n                      if (binding?.scope === path1.scope) {\n                        nodesUsedInTemplate.add(path3.node.name);\n                      }\n                    },\n                    JSXIdentifier(path3) {\n                      const binding = path3.scope.getBinding(path3.node.name);\n                      if (binding?.scope === path1.scope) {\n                        nodesUsedInTemplate.add(path3.node.name);\n                      }\n                    },\n                  }, path2.scope, path2);\n                }\n              },\n            }, path1.scope, path1);\n\n            const {\n              graph: {\n                nodes: tempNodes,\n                edges: tempEdges,\n                spread: tempSpread,\n              },\n              nodeCollection: tempNodeCollection,\n            } = processSetup(setupNode, path1.scope, setupNode, spread, lineOffset);\n\n            // 3 filter data by return\n            traverse(setupNode, {\n              ReturnStatement(path2) {\n                // only process return in setupNode scope\n                if (path2.scope !== path1.scope) {\n                  return;\n                }\n\n                if (path2.node.argument?.type === 'ObjectExpression') {\n                  const returnNode = path2.node.argument;\n                  traverse(returnNode, {\n                    ObjectProperty(path3) {\n                      if (path3.parent === returnNode) {\n                        if (\n                          path3.node.key.type === 'Identifier'\n                          && path3.node.value.type === 'Identifier'\n                          && tempNodes.has(path3.node.value.name)\n                        ) {\n                          const valName = path3.node.value.name;\n                          if (!graph.nodes.has(valName)) {\n                            graph.nodes.add(valName);\n                            tNodes.set(valName, path3.node.value);\n                            nodeCollection.addTypedNode(\n                              valName,\n                              tempNodeCollection.nodes.get(valName)!,\n                            );\n                          }\n                          if (!graph.edges.has(valName)) {\n                            graph.edges.set(valName, new Set([...Array.from(\n                              tempEdges.get(valName) || new Set<{ label: string, type: RelationType }>(),\n                            )]));\n                          }\n\n                          const name = path3.node.key.name;\n                          if (name !== valName) {\n                            graph.nodes.add(name);\n                            tNodes.set(name, path3.node.key);\n                            nodeCollection.addNode(name, path3.node.key, {\n                              comment: getComment(path3.node),\n                            });\n                            graph.edges.set(name, new Set([{\n                              label: valName,\n                              type: getRelationType(path3),\n                            }]));\n                          }\n                        }\n                      }\n                    },\n                    SpreadElement(path3) {\n                      // ...toRefs(xxx)\n                      if (\n                        path3.node.argument.type === 'CallExpression'\n                        && path3.node.argument.callee.type === 'Identifier'\n                        && path3.node.argument.callee.name === 'toRefs'\n                        && path3.node.argument.arguments[0].type === 'Identifier'\n                        && tempSpread.get(path3.node.argument.arguments[0].name)\n                      ) {\n                        tempSpread.get(path3.node.argument.arguments[0].name)?.forEach((name) => {\n                          graph.nodes.add(name);\n                          // @ts-expect-error Identifier\n                          tNodes.set(name, path3.node.argument.arguments[0]);\n                          nodeCollection.addTypedNode(name, tempNodeCollection.nodes.get(name)!);\n                          if (!graph.edges.get(name)) {\n                            graph.edges.set(name, new Set());\n                            tempEdges.get(name)?.forEach((edge) => {\n                              graph.edges.get(name)?.add(edge);\n                            });\n                          }\n                        });\n                      }\n                      // ...xxx\n                      else if (\n                        path3.node.argument.type === 'Identifier'\n                        && tempSpread.get(path3.node.argument.name)\n                      ) {\n                        tempSpread.get(path3.node.argument.name)?.forEach((name) => {\n                          graph.nodes.add(name);\n                          // @ts-expect-error Identifier\n                          tNodes.set(name, path3.node.argument);\n                          nodeCollection.addTypedNode(name, tempNodeCollection.nodes.get(name)!);\n                          if (!graph.edges.get(name)) {\n                            graph.edges.set(name, new Set());\n                            tempEdges.get(name)?.forEach((edge) => {\n                              graph.edges.get(name)?.add(edge);\n                            });\n                          }\n                        });\n                      }\n                    },\n                  }, path2.scope, path2);\n                }\n                else {\n                  graph.edges = tempEdges;\n                  graph.nodes = tempNodes;\n                  nodeCollection = tempNodeCollection;\n                }\n              },\n            }, path1.scope, path1);\n          }\n\n          // data\n          if (path1.node.key.type === 'Identifier' && path1.node.key.name === 'data') {\n            const dataNode = path1.node;\n\n            traverse(dataNode, {\n              ReturnStatement(path2) {\n                if (path2.parent === dataNode.body) {\n                  if (path2.node.argument?.type === 'ObjectExpression') {\n                    path2.node.argument.properties.forEach((prop) => {\n                      if (prop.type === 'ObjectProperty') {\n                        if (prop.key.type === 'Identifier') {\n                          const name = prop.key.name;\n                          graph.nodes.add(name);\n                          tNodes.set(name, prop.key);\n                          nodeCollection.addNode(name, prop, {\n                            comment: getComment(prop),\n                          });\n                          if (!graph.edges.get(name)) {\n                            graph.edges.set(name, new Set());\n                          }\n                        }\n                      }\n                    });\n                  }\n                }\n              },\n            }, path1.scope, path1);\n          }\n\n          // render\n          if (path1.node.key.type === 'Identifier' && path1.node.key.name === 'render') {\n            traverse(path1.node, {\n              ReturnStatement(path2) {\n                const templateNode = path2.node;\n                traverse(templateNode, {\n                  MemberExpression(path3) {\n                    if (path3.node.object && path3.node.object.type === 'ThisExpression') {\n                      if (path3.node.property && path3.node.property.type === 'Identifier') {\n                        nodesUsedInTemplate.add(path3.node.property.name);\n                      }\n                    }\n                  },\n                }, path2.scope, path2);\n              },\n            }, path1.scope, path1);\n          }\n        }\n      },\n    }, path.scope, path);\n\n    traverse(node, {\n      ObjectMethod(path1) {\n        if (\n          (\n            path.node.declaration.type === 'ObjectExpression'\n            && path1.parent === path.node.declaration\n          ) || (\n            path.node.declaration.type === 'CallExpression'\n            && path1.parent === path.node.declaration.arguments[0]\n          )\n        ) {\n          if (path1.node.key.type === 'Identifier' && vueLifeCycleHooks.includes(path1.node.key.name)) {\n            const hookName = path1.node.key.name;\n\n            traverse(path1.node.body, {\n              MemberExpression(path2) {\n                if (path2.node.object.type === 'ThisExpression' && path2.node.property.type === 'Identifier') {\n                  const _node = nodeCollection.getNode(path2.node.property.name);\n                  if (_node?.info?.used) {\n                    _node?.info?.used?.add(hookName);\n                  }\n                  else if (_node) {\n                    _node.info = {\n                      ..._node?.info,\n                      used: new Set([hookName]),\n                    };\n                  }\n                }\n              },\n            }, path1.scope, path1);\n          }\n        }\n      },\n      ObjectProperty(path1) {\n        if (\n          (\n            path.node.declaration.type === 'ObjectExpression'\n            && path1.parent === path.node.declaration\n          ) || (\n            path.node.declaration.type === 'CallExpression'\n            && path1.parent === path.node.declaration.arguments[0]\n          )\n        ) {\n          if (path1.node.key.type === 'Identifier' && path1.node.key.name === 'computed') {\n            const computedNode = path1.node;\n            if (computedNode.value.type === 'ObjectExpression') {\n              computedNode.value.properties.forEach((prop) => {\n                if (prop.type === 'ObjectMethod' && prop.key.type === 'Identifier') {\n                  const name = prop.key.name;\n                  traverse(prop, {\n                    MemberExpression(path2) {\n                      if (path2.node.object.type === 'ThisExpression' && path2.node.property.type === 'Identifier') {\n                        graph.edges.get(name)?.add({\n                          label: path2.node.property.name,\n                          type: getRelationType(path2),\n                        });\n                      }\n                    },\n                  }, path1.scope, path1);\n                }\n\n                if (\n                  prop.type === 'ObjectProperty'\n                  && prop.key.type === 'Identifier'\n                  && prop.value.type === 'ObjectExpression'\n                ) {\n                  const name = prop.key.name;\n                  prop.value.properties.forEach((prop1) => {\n                    if (\n                      prop1.type === 'ObjectProperty'\n                      && prop1.key.type === 'Identifier'\n                      && prop1.key.name === 'get'\n                    ) {\n                      traverse(prop1, {\n                        MemberExpression(path2) {\n                          if (\n                            path2.node.object.type === 'ThisExpression'\n                            && path2.node.property.type === 'Identifier'\n                          ) {\n                            graph.edges.get(name)?.add({\n                              label: path2.node.property.name,\n                              type: getRelationType(path2),\n                            });\n                          }\n                        },\n                      }, path1.scope, path1);\n                    }\n                  });\n                }\n              });\n            }\n          }\n\n          if (path1.node.key.type === 'Identifier' && path1.node.key.name === 'methods') {\n            const methodsNode = path1.node;\n            if (methodsNode.value.type === 'ObjectExpression') {\n              methodsNode.value.properties.forEach((prop) => {\n                if (\n                  (prop.type === 'ObjectMethod'\n                    || prop.type === 'ObjectProperty')\n                  && prop.key.type === 'Identifier'\n                ) {\n                  const name = prop.key.name;\n                  traverse(prop, {\n                    MemberExpression(path2) {\n                      if (path2.node.object.type === 'ThisExpression' && path2.node.property.type === 'Identifier') {\n                        graph.edges.get(name)?.add({\n                          label: path2.node.property.name,\n                          type: getRelationType(path2),\n                        });\n                      }\n                    },\n                  }, path1.scope, path1);\n                }\n              });\n            }\n          }\n\n          if (path1.node.key.type === 'Identifier' && [...watchHooks, ...vueLifeCycleHooks].includes(path1.node.key.name)) {\n            const hookName = path1.node.key.name;\n\n            if (watchHooks.includes(hookName) && path1.node.value.type === 'ObjectExpression') {\n              path1.node.value.properties.forEach((prop) => {\n                if ((prop.type === 'ObjectProperty' || prop.type === 'ObjectMethod') && (\n                  prop.key.type === 'Identifier' || prop.key.type === 'StringLiteral'\n                )) {\n                  const keyName = prop.key.type === 'Identifier'\n                    ? prop.key.name\n                    : prop.key.type === 'StringLiteral'\n                      ? prop.key.value.split('.')[0]\n                      : '';\n                  const watchArg = tNodes.get(keyName);\n\n                  const _node = nodeCollection.getNode(keyName);\n                  if (_node?.info?.used) {\n                    _node?.info?.used?.add(hookName);\n                  }\n                  else if (_node) {\n                    _node.info = {\n                      ..._node?.info,\n                      used: new Set([hookName]),\n                    };\n                  }\n\n                  traverse(path1.node.value, {\n                    MemberExpression(path2) {\n                      if (path2.node.object.type === 'ThisExpression' && path2.node.property.type === 'Identifier') {\n                        if (watchArg && watchArg.name !== path2.node.property.name) {\n                          graph.edges.get(watchArg.name)?.add({\n                            label: path2.node.property.name,\n                            type: getRelationType(path2),\n                          });\n                        }\n                      }\n                    },\n                  }, path1.scope, path1);\n                }\n              });\n            }\n            else {\n              traverse(path1.node.value, {\n                MemberExpression(path2) {\n                  if (path2.node.object.type === 'ThisExpression' && path2.node.property.type === 'Identifier') {\n                    const _node = nodeCollection.getNode(path2.node.property.name);\n                    if (_node?.info?.used) {\n                      _node?.info?.used?.add(hookName);\n                    }\n                    else if (_node) {\n                      _node.info = {\n                        ..._node?.info,\n                        used: new Set([hookName]),\n                      };\n                    }\n                  }\n                },\n              }, path1.scope, path1);\n            }\n          }\n        }\n      },\n    }, path.scope, path);\n  }\n\n  traverse(ast, {\n    ExportDefaultDeclaration(path) {\n      // export default {}\n      if (path.node.declaration.type === 'ObjectExpression') {\n        process(path.node.declaration, path);\n      }\n      // export default defineComponent({})\n      else if (path.node.declaration.type === 'CallExpression'\n        && path.node.declaration.callee.type === 'Identifier'\n        && path.node.declaration.callee.name === 'defineComponent'\n        && path.node.declaration.arguments[0].type === 'ObjectExpression'\n      ) {\n        process(path.node.declaration.arguments[0], path);\n      }\n    },\n  });\n\n  return {\n    graph: nodeCollection.map(graph),\n    nodesUsedInTemplate,\n  };\n}\n","// https://github.com/vuejs/core/blob/main/packages/compiler-sfc/src/style/cssVars.ts\n\nimport type { SFCStyleBlock } from '@vue/compiler-sfc';\n\nenum LexerState {\n  inParens,\n  inSingleQuoteString,\n  inDoubleQuoteString,\n}\n\nfunction lexBinding(content: string, start: number): number | null {\n  let state: LexerState = LexerState.inParens;\n  let parenDepth = 0;\n\n  for (let i = start; i < content.length; i++) {\n    const char = content.charAt(i);\n    switch (state) {\n      case LexerState.inParens:\n        if (char === '\\'') {\n          state = LexerState.inSingleQuoteString;\n        }\n        else if (char === '\"') {\n          state = LexerState.inDoubleQuoteString;\n        }\n        else if (char === '(') {\n          parenDepth++;\n        }\n        else if (char === ')') {\n          if (parenDepth > 0) {\n            parenDepth--;\n          }\n          else {\n            return i;\n          }\n        }\n        break;\n      case LexerState.inSingleQuoteString:\n        if (char === '\\'') {\n          state = LexerState.inParens;\n        }\n        break;\n      case LexerState.inDoubleQuoteString:\n        if (char === '\"') {\n          state = LexerState.inParens;\n        }\n        break;\n    }\n  }\n  return null;\n}\n\nfunction normalizeExpression(exp: string) {\n  exp = exp.trim();\n  if (\n    (exp[0] === '\\'' && exp[exp.length - 1] === '\\'')\n    || (exp[0] === '\"' && exp[exp.length - 1] === '\"')\n  ) {\n    return exp.slice(1, -1);\n  }\n  return exp;\n}\n\nconst vBindRE = /v-bind\\s*\\(/g;\n\nexport function analyze(\n  styles: SFCStyleBlock[],\n) {\n  const nodes = new Set<string>();\n\n  styles.forEach((style) => {\n    let match;\n    const content = style.content.replace(/\\/\\*([\\s\\S]*?)\\*\\/|\\/\\/.*/g, '');\n    // eslint-disable-next-line no-cond-assign\n    while ((match = vBindRE.exec(content))) {\n      const start = match.index + match[0].length;\n      const end = lexBinding(content, start);\n      if (end !== null) {\n        const variable = normalizeExpression(content.slice(start, end));\n        nodes.add(variable);\n      }\n    }\n  });\n\n  return nodes;\n}\n","import _traverse from '@babel/traverse';\nimport { babelParse, compileTemplate } from '@vue/compiler-sfc';\n\nconst traverse: typeof _traverse\n  // @ts-expect-error unwarp default\n  = _traverse.default?.default || _traverse.default || _traverse;\n\nexport function analyze(\n  content: string,\n) {\n  const id = 'template';\n  const { code } = compileTemplate({\n    id,\n    source: content,\n    filename: `${id}.js`,\n  });\n\n  // console.log(code);\n  const ast = babelParse(code, { sourceType: 'module', plugins: [\n    'typescript',\n  ] });\n\n  // ----\n\n  const nodes = new Set<string>();\n\n  traverse(ast, {\n    MemberExpression(path) {\n      if (path.type === 'MemberExpression') {\n        if (path.node.object && path.node.object.type === 'Identifier' && path.node.object.name === '_ctx') {\n          if (path.node.property && path.node.property.type === 'Identifier') {\n            nodes.add(path.node.property.name);\n          }\n        }\n      }\n    },\n    ObjectProperty(path) {\n      if (path.node.key.type === 'Identifier' && path.node.key.name === 'ref') {\n        if (path.node.value.type === 'StringLiteral') {\n          const name = path.node.value.value;\n          if (name) {\n            nodes.add(name);\n          }\n        }\n      }\n    },\n    // component\n    CallExpression(path) {\n      if (path.node.callee.type === 'Identifier' && path.node.callee.name === '_resolveComponent') {\n        if (path.node.arguments[0].type === 'StringLiteral') {\n          const name = path.node.arguments[0].value;\n          if (name) {\n            nodes.add(name);\n          }\n        }\n      }\n    },\n  });\n\n  return nodes;\n}\n","import type { NodePath, Scope } from '@babel/traverse';\nimport type * as t from '@babel/types';\nimport type { NodeCollection, RelationType } from '../analyze/utils';\nimport _traverse from '@babel/traverse';\nimport { getComment, getRelationType } from '../analyze/utils';\n\nexport const traverse: typeof _traverse\n  // @ts-expect-error unwarp default\n  = _traverse.default?.default || _traverse.default || _traverse;\n\nexport interface IReturnData {\n  graph: {\n    nodes: Set<string>\n    edges: Map<string, Set<{ label: string, type: RelationType }>>\n    spread?: Map<string, Set<string>>\n  }\n  nodeCollection: NodeCollection\n  nodesUsedInTemplate: Set<string>\n}\n\nexport interface IAddNode {\n  name: string\n  node: t.Node\n  path: NodePath<t.VariableDeclarator | t.FunctionDeclaration>\n  scope: Scope\n}\n\nexport interface IUsedNode {\n  name: string\n  path: NodePath<t.Identifier>\n  parentPath: NodePath<t.Node>\n}\n\nexport interface IAddEdge {\n  fromName: string\n  toName: string\n  path: NodePath<t.Identifier | t.MemberExpression>\n  scope: Scope\n  toScope?: Scope\n  collectionNodes: Set<string>\n}\n\nexport interface IParseVariable {\n  path: NodePath<t.VariableDeclarator>\n  rootScope: Scope\n}\n\nexport interface IParseNodeBase extends IParseVariable {\n  cb?: (params: IAddNode) => void\n}\n\nexport interface IParseEdgeBase extends IParseVariable {\n  cb?: (params: IAddEdge) => void\n  collectionNodes: Set<string>\n  spread?: string[]\n}\n\nexport interface IRescureObject {\n  node: t.ObjectPattern\n  rootScope: Scope\n  res: t.Identifier[]\n  parentScope: Scope\n  parentPath: NodePath<t.VariableDeclarator | t.ObjectProperty>\n}\n\nexport interface IRescureArray {\n  node: t.ArrayPattern\n  rootScope: Scope\n  res: t.Identifier[]\n  parentScope: Scope\n  parentPath: NodePath<t.VariableDeclarator | t.ArrayPattern>\n}\n\nexport interface IParseNodeFunction {\n  path: NodePath<t.FunctionDeclaration>\n  rootScope: Scope\n  cb?: (params: IAddNode) => void\n}\n\nexport interface IParseEdgeFunction {\n  path: NodePath<t.FunctionDeclaration>\n  rootScope: Scope\n  cb?: (params: IAddEdge) => void\n  collectionNodes: Set<string>\n}\n\nexport interface IParseReturnJSX {\n  path: NodePath<t.ReturnStatement>\n  parentPath: NodePath<t.Node>\n  cb?: (params: IUsedNode) => void\n}\n\nexport interface IParseSetup {\n  node: t.ObjectExpression\n  parentScope: Scope\n  parentPath: NodePath<t.ExportDefaultDeclaration>\n}\n\nexport interface ICollectSpread {\n  path: NodePath<t.ObjectMethod>\n  spread: string[]\n}\n\nexport interface IAddIdentifiesToGraphByScanReturn {\n  path: NodePath<t.ObjectMethod>\n  graph: IReturnData['graph']\n  nodeCollection: IReturnData['nodeCollection']\n  tempNodeCollection: IReturnData['nodeCollection']\n  tempEdges: IReturnData['graph']['edges']\n}\n\nexport interface IAddSpreadToGraphByScanReturn {\n  path: NodePath<t.ObjectMethod>\n  graph: IReturnData['graph']\n  nodeCollection: IReturnData['nodeCollection']\n  tempNodeCollection: IReturnData['nodeCollection']\n  tempEdges: IReturnData['graph']['edges']\n  tempSpread: Map<string, Set<string>>\n}\n\nexport interface IAddGraphBySpreadIdentifier {\n  path: NodePath<t.VariableDeclarator>\n  graph: IReturnData['graph'] & {\n    spread: Map<string, Set<string>>\n  }\n  nodeCollection: IReturnData['nodeCollection']\n  iname: string\n}\n\n/**\n * 递归遍历如下结构：\n * let { loc, loc: locd, loc: { start, end }, loc: { start: { line: { deep } }} } = node;\n * 解出 loc, locd, start, end, deep\n */\nexport function rescureObjectPattern({ node, rootScope, res, parentScope, parentPath }: IRescureObject) {\n  traverse(node, {\n    ObjectProperty(path1) {\n      if (path1.node.type === 'ObjectProperty'\n        && path1.node.key.type === 'Identifier' && path1.node.value.type === 'Identifier') {\n        const name = path1.node.value.name;\n        const _scope = path1.scope.getBinding(name)?.scope;\n        if (_scope && _scope === rootScope) {\n          res.push(path1.node.value);\n        }\n      }\n      else if (path1.node.type === 'ObjectProperty'\n        && path1.node.key.type === 'Identifier' && path1.node.value.type === 'ObjectPattern') {\n        rescureObjectPattern({\n          node: path1.node.value,\n          rootScope,\n          res,\n          parentScope: path1.scope,\n          parentPath: path1,\n        });\n      }\n    },\n    RestElement(path1) {\n      if (path1.node.argument.type === 'Identifier') {\n        const name = path1.node.argument.name;\n        const _scope = path1.scope.getBinding(name)?.scope;\n        if (_scope && _scope === rootScope) {\n          res.push(path1.node.argument);\n        }\n      }\n    },\n  }, parentScope, parentPath);\n}\n\n/**\n * 递归遍历如下结构：\n * let [foo, [bar, baz]] = [1, [[2], 3]];\n * 解出 foo, bar, baz\n */\nexport function rescureArrayPattern({ node, rootScope, res, parentScope, parentPath }: IRescureArray) {\n  traverse(node, {\n    Identifier(path1) {\n      if (path1.node.type === 'Identifier') {\n        const name = path1.node.name;\n        const _scope = path1.scope.getBinding(name)?.scope;\n        if (_scope && _scope === rootScope) {\n          res.push(path1.node);\n        }\n      }\n    },\n    ArrayPattern(path1) {\n      if (path1.node.type === 'ArrayPattern') {\n        rescureArrayPattern({\n          node: path1.node,\n          rootScope,\n          res,\n          parentScope: path1.scope,\n          parentPath: path1,\n        });\n      }\n    },\n  }, parentScope, parentPath);\n}\n\nexport function parseNodeIdentifierPattern({\n  path,\n  rootScope,\n  cb,\n}: IParseNodeBase) {\n  if (path.node.id.type !== 'Identifier') {\n    return;\n  }\n\n  if (path.node.init?.type === 'ArrowFunctionExpression' || path.node.init?.type === 'FunctionExpression') {\n    // const speak = () => {}\n    cb?.({\n      name: path.node.id.name,\n      node: path.node,\n      path,\n      scope: rootScope,\n    });\n  }\n  else {\n    // const open = 22\n    cb?.({\n      name: path.node.id.name,\n      node: path.node,\n      path,\n      scope: rootScope,\n    });\n  }\n}\n\nexport function parseNodeObjectPattern({ path, rootScope, cb }: IParseNodeBase) {\n  if (path.node.id.type !== 'ObjectPattern') {\n    return;\n  }\n\n  path.node.id.properties.forEach((property) => {\n    if (property.type === 'ObjectProperty'\n      && property.key.type === 'Identifier' && property.value.type === 'Identifier') {\n      // const { x } = obj\n      cb?.({\n        name: property.value.name,\n        node: property,\n        path,\n        scope: rootScope,\n      });\n    }\n    else if (property.type === 'ObjectProperty'\n      && property.key.type === 'Identifier' && property.value.type === 'AssignmentPattern') {\n      // const { x = 3 } = obj\n      cb?.({\n        name: property.key.name,\n        node: property,\n        path,\n        scope: rootScope,\n      });\n    }\n    else if (property.type === 'RestElement' && property.argument.type === 'Identifier') {\n      // const { ...rest } = obj\n      cb?.({\n        name: property.argument.name,\n        node: property,\n        path,\n        scope: rootScope,\n      });\n    }\n    else if (property.type === 'ObjectProperty'\n      && property.key.type === 'Identifier' && property.value.type === 'ObjectPattern') {\n      // let { loc, loc: locd, loc: { start, end } } = node;\n      const res: t.Identifier[] = [];\n      rescureObjectPattern({\n        node: property.value,\n        rootScope,\n        res,\n        parentScope: path.scope,\n        parentPath: path,\n      });\n      res.forEach(r => cb?.({\n        name: r.name,\n        node: r,\n        path,\n        scope: rootScope,\n      }));\n    }\n  });\n}\n\nexport function parseNodeArrayPattern({ path, rootScope, cb }: IParseNodeBase) {\n  if (path.node.id.type !== 'ArrayPattern') {\n    return;\n  }\n\n  path.node.id.elements.forEach((ele) => {\n    if (ele?.type === 'Identifier') {\n      // const [arr, brr] = array\n      cb?.({\n        name: ele.name,\n        node: ele,\n        path,\n        scope: rootScope,\n      });\n    }\n    else if (ele?.type === 'ArrayPattern') {\n      // let [foo, [bar, baz]] = array;\n      const res: t.Identifier[] = [];\n      rescureArrayPattern({\n        node: ele,\n        rootScope,\n        res,\n        parentScope: path.scope,\n        parentPath: path,\n      });\n      res.forEach(r => cb?.({\n        name: r.name,\n        node: r,\n        path,\n        scope: rootScope,\n      }));\n    }\n    else if (ele?.type === 'AssignmentPattern') {\n      if (ele.left.type === 'Identifier') {\n        // let [yy = 'b'] = array;\n        cb?.({\n          name: ele.left.name,\n          node: ele,\n          path,\n          scope: rootScope,\n        });\n      }\n    }\n    else if (ele?.type === 'RestElement') {\n      if (ele.argument.type === 'Identifier') {\n        // const [arr2, ...rest2] = array\n        cb?.({\n          name: ele.argument.name,\n          node: ele,\n          path,\n          scope: rootScope,\n        });\n      }\n    }\n  });\n}\n\nexport function parseNodeFunctionPattern({ path, rootScope, cb }: IParseNodeFunction) {\n  if (path.node.type !== 'FunctionDeclaration') {\n    return;\n  }\n  if (path.node.id?.type === 'Identifier') {\n    // function abc () {}\n    cb?.({\n      name: path.node.id.name,\n      node: path.node,\n      path,\n      scope: rootScope,\n    });\n  }\n}\n\nexport function parseEdgeLeftIdentifierPattern({ path, rootScope, cb, collectionNodes, spread }: IParseEdgeBase) {\n  if (!path.node.id || path.node.id.type !== 'Identifier') {\n    return;\n  }\n\n  if (path.node.init?.type\n    && [\n      'ArrowFunctionExpression',\n      'FunctionExpression',\n      'CallExpression',\n      'ObjectExpression',\n      'ArrayExpression',\n    ].includes(path.node.init.type)\n  ) {\n    // if (graph.nodes.has(path.node.id.name) && path.scope.getBinding(path.node.id.name)?.scope === rootScope) {\n    if (collectionNodes.has(path.node.id.name) && path.scope.getBinding(path.node.id.name)?.scope === rootScope) {\n      const name = path.node.id.name;\n      traverse(path.node.init, {\n        Identifier(path1) {\n          // graph.edges.get(name)?.add(path1.node.name);\n\n          const binding = path1.scope.getBinding(path1.node.name);\n          if (\n            binding?.scope === rootScope\n            && collectionNodes.has(path1.node.name)\n            && (\n              (path1.parent.type !== 'MemberExpression'\n                && path1.parent.type !== 'OptionalMemberExpression')\n              || path1.parent.object === path1.node\n            )\n          ) {\n            cb?.({\n              fromName: name,\n              toName: path1.node.name,\n              path: path1,\n              scope: rootScope,\n              collectionNodes,\n            });\n          }\n        },\n        MemberExpression(path1) {\n          if (spread?.length && path1.node.object.type === 'Identifier'\n            && spread.includes(path1.node.object.name)\n            && path1.node.property.type === 'Identifier') {\n            cb?.({\n              fromName: name,\n              toName: path1.node.property.name,\n              toScope: path1.scope.getBinding(path1.node.object.name)?.scope,\n              path: path1,\n              scope: rootScope,\n              collectionNodes,\n            });\n          }\n        },\n      }, path.scope, path);\n    }\n  }\n}\n\nexport function parseEdgeLeftObjectPattern({ path, rootScope, cb, collectionNodes }: IParseEdgeBase) {\n  if (!path.node.id || path.node.id.type !== 'ObjectPattern') {\n    return;\n  }\n  if (path.node.init?.type\n    && [\n      'ArrowFunctionExpression',\n      'FunctionExpression',\n      'CallExpression',\n      'ObjectExpression',\n      'ArrayExpression',\n    ].includes(path.node.init.type)\n  ) {\n    const res: t.Identifier[] = [];\n    rescureObjectPattern({\n      node: path.node.id,\n      rootScope,\n      res,\n      parentScope: path.scope,\n      parentPath: path,\n    });\n\n    // res.filter(r => (graph.nodes.has(r.name) && path.scope.getBinding(r.name)?.scope === rootScope));\n    res.filter(r => (collectionNodes.has(r.name) && path.scope.getBinding(r.name)?.scope === rootScope));\n\n    traverse(path.node.init, {\n      Identifier(path1) {\n        const binding = path1.scope.getBinding(path1.node.name);\n        if (\n          binding?.scope === rootScope\n          && collectionNodes.has(path1.node.name)\n          && (\n            (path1.parent.type !== 'MemberExpression'\n              && path1.parent.type !== 'OptionalMemberExpression')\n            || path1.parent.object === path1.node\n          )\n        ) {\n          res.forEach((r) => {\n            cb?.({\n              fromName: r.name,\n              toName: path1.node.name,\n              path: path1,\n              scope: rootScope,\n              collectionNodes,\n            });\n          });\n        }\n      },\n    }, path.scope, path);\n  }\n}\n\nexport function parseEdgeLeftArrayPattern({ path, rootScope, cb, collectionNodes }: IParseEdgeBase) {\n  if (!path.node.id || path.node.id.type !== 'ArrayPattern') {\n    return;\n  }\n  if (path.node.init?.type\n    && [\n      'ArrowFunctionExpression',\n      'FunctionExpression',\n      'CallExpression',\n      'ObjectExpression',\n      'ArrayExpression',\n    ].includes(path.node.init.type)\n  ) {\n    const res: t.Identifier[] = [];\n    rescureArrayPattern({\n      node: path.node.id,\n      rootScope,\n      res,\n      parentScope: path.scope,\n      parentPath: path,\n    });\n\n    res.filter(r => (collectionNodes.has(r.name) && path.scope.getBinding(r.name)?.scope === rootScope));\n\n    traverse(path.node.init, {\n      Identifier(path1) {\n        const binding = path1.scope.getBinding(path1.node.name);\n        if (\n          binding?.scope === rootScope\n          && collectionNodes.has(path1.node.name)\n          && (\n            (path1.parent.type !== 'MemberExpression'\n              && path1.parent.type !== 'OptionalMemberExpression')\n            || path1.parent.object === path1.node\n          )\n        ) {\n          res.forEach((r) => {\n            cb?.({\n              fromName: r.name,\n              toName: path1.node.name,\n              path: path1,\n              scope: rootScope,\n              collectionNodes,\n            });\n          });\n        }\n      },\n    }, path.scope, path);\n  }\n}\n\nexport function parseEdgeFunctionPattern({ path, rootScope, cb, collectionNodes }: IParseEdgeFunction) {\n  if (!path.node.id) {\n    return;\n  }\n  if (collectionNodes.has(path.node.id.name) && path.scope.getBinding(path.node.id.name)?.scope === rootScope) {\n    const name = path.node.id.name;\n    traverse(path.node.body, {\n      Identifier(path1) {\n        const binding = path1.scope.getBinding(path1.node.name);\n        if (binding?.scope === rootScope && collectionNodes.has(path1.node.name)) {\n          cb?.({\n            fromName: name,\n            toName: path1.node.name,\n            path: path1,\n            scope: rootScope,\n            collectionNodes,\n          });\n        }\n      },\n    }, path.scope, path);\n  }\n}\n\nexport function parseReturnJsxPattern({ path, parentPath, cb }: IParseReturnJSX) {\n  if (\n    path.node.argument\n    && (\n      // return () => (<div></div>)\n      // return function() (<div></div>)\n      (\n        (\n          path.node.argument.type === 'ArrowFunctionExpression'\n          || path.node.argument.type === 'FunctionExpression'\n        ) && (\n          path.node.argument.body.type === 'JSXElement'\n          || path.node.argument.body.type === 'JSXFragment'\n        )\n      )\n      // return (<div></div>)\n      || (\n        path.node.argument.type === 'JSXElement'\n        || path.node.argument.type === 'JSXFragment'\n      )\n    )\n  ) {\n    path.traverse({\n      Identifier(path1) {\n        // if (path1.scope.getBinding(path1.node.name)?.scope === parentPath.scope) {\n        //   nodesUsedInTemplate.add(path1.node.name);\n        // }\n        cb?.({\n          name: path1.node.name,\n          path: path1,\n          parentPath,\n        });\n      },\n    });\n  }\n}\n\nexport function traverseSetup({ node, parentScope, parentPath }: IParseSetup) {\n  let path: NodePath<t.ObjectMethod>;\n\n  traverse(node, {\n    ObjectMethod(path1) {\n      if (\n        (\n          parentPath.node.declaration.type === 'ObjectExpression'\n          && path1.parent === parentPath.node.declaration\n        ) || (\n          parentPath.node.declaration.type === 'CallExpression'\n          && path1.parent === parentPath.node.declaration.arguments[0]\n        )\n      ) {\n        if (path1.node.key.type === 'Identifier' && path1.node.key.name === 'setup') {\n          path = path1;\n        }\n      }\n    },\n  }, parentScope, parentPath);\n\n  return path!;\n}\n\nexport function collectionSpread({ path: path1, spread }: ICollectSpread) {\n  path1.traverse({\n    ReturnStatement(path2) {\n      // get setup return obj spread\n      if (path2.node.argument?.type === 'ObjectExpression') {\n        const returnNode = path2.node.argument;\n        traverse(returnNode, {\n          SpreadElement(path3) {\n            // ...toRefs(xxx)\n            if (\n              path3.node.argument.type === 'CallExpression'\n              && path3.node.argument.callee.type === 'Identifier'\n              && path3.node.argument.callee.name === 'toRefs'\n              && path3.node.argument.arguments[0].type === 'Identifier'\n            ) {\n              spread.push(path3.node.argument.arguments[0].name);\n            }\n            // ...xxx\n            else if (\n              path3.node.argument.type === 'Identifier'\n            ) {\n              spread.push(path3.node.argument.name);\n            }\n          },\n        }, path2.scope, path2);\n      }\n    },\n  });\n}\n\nexport function addIdentifiesToGraphByScanReturn(\n  { path: path1, graph, nodeCollection, tempNodeCollection, tempEdges }: IAddIdentifiesToGraphByScanReturn,\n) {\n  path1.traverse({\n    ReturnStatement(path2) {\n      // get setup return obj spread\n      if (path2.node.argument?.type === 'ObjectExpression') {\n        const returnNode = path2.node.argument;\n        traverse(returnNode, {\n          ObjectProperty(path3) {\n            // not spread node\n            if (path3.parent === returnNode) {\n              if (path3.node.key.type === 'Identifier' && path3.node.value.type === 'Identifier') {\n                const valName = path3.node.value.name;\n                if (!graph.nodes.has(valName)) {\n                  graph.nodes.add(valName);\n                  nodeCollection.addTypedNode(\n                    valName,\n                    tempNodeCollection.nodes.get(valName)!,\n                  );\n                }\n                if (!graph.edges.has(valName)) {\n                  graph.edges.set(valName, new Set([...Array.from(\n                    tempEdges.get(valName) || new Set<{ label: string, type: RelationType }>(),\n                  )]));\n                }\n\n                const name = path3.node.key.name;\n                if (name !== valName) {\n                  graph.nodes.add(name);\n                  nodeCollection.addNode(name, path3.node.key, {\n                    comment: getComment(path3.node),\n                  });\n                  graph.edges.set(name, new Set([{\n                    label: valName,\n                    type: getRelationType(path3),\n                  }]));\n                }\n              }\n            }\n          },\n        }, path2.scope, path2);\n      }\n    },\n  });\n}\n\nexport function addSpreadToGraphByScanReturn(\n  { path: path1, graph, nodeCollection, tempNodeCollection, tempEdges, tempSpread }: IAddSpreadToGraphByScanReturn,\n) {\n  path1.traverse({\n    ReturnStatement(path2) {\n      // get setup return obj spread\n      if (path2.node.argument?.type === 'ObjectExpression') {\n        const returnNode = path2.node.argument;\n        traverse(returnNode, {\n          SpreadElement(path3) {\n            // ...toRefs(xxx)\n            if (\n              path3.node.argument.type === 'CallExpression'\n              && path3.node.argument.callee.type === 'Identifier'\n              && path3.node.argument.callee.name === 'toRefs'\n              && path3.node.argument.arguments[0].type === 'Identifier'\n              && tempSpread.get(path3.node.argument.arguments[0].name)\n            ) {\n              tempSpread.get(path3.node.argument.arguments[0].name)?.forEach((name) => {\n                graph.nodes.add(name);\n                nodeCollection.addTypedNode(name, tempNodeCollection.nodes.get(name)!);\n                if (!graph.edges.get(name)) {\n                  graph.edges.set(name, new Set());\n                  tempEdges.get(name)?.forEach((edge) => {\n                    graph.edges.get(name)?.add(edge);\n                  });\n                }\n              });\n            }\n            // ...xxx\n            else if (\n              path3.node.argument.type === 'Identifier'\n              && tempSpread.get(path3.node.argument.name)\n            ) {\n              tempSpread.get(path3.node.argument.name)?.forEach((name) => {\n                graph.nodes.add(name);\n                nodeCollection.addTypedNode(name, tempNodeCollection.nodes.get(name)!);\n                if (!graph.edges.get(name)) {\n                  graph.edges.set(name, new Set());\n                  tempEdges.get(name)?.forEach((edge) => {\n                    graph.edges.get(name)?.add(edge);\n                  });\n                }\n              });\n            }\n          },\n        }, path2.scope, path2);\n      }\n    },\n  });\n}\n\nexport function addGraphBySpreadIdentifier({ path: path1, graph, nodeCollection, iname }: IAddGraphBySpreadIdentifier) {\n  if (path1.node.init?.type === 'ObjectExpression') {\n    path1.node.init?.properties.forEach((prop) => {\n      if (\n        (prop.type === 'ObjectProperty' || prop.type === 'ObjectMethod')\n        && prop.key.type === 'Identifier'\n      ) {\n        const keyName = prop.key.name;\n        graph.nodes.add(keyName);\n        nodeCollection.addNode(keyName, prop, {\n          comment: getComment(prop),\n        });\n        if (!graph.edges.get(keyName)) {\n          graph.edges.set(keyName, new Set());\n        }\n        if (graph.spread.has(iname)) {\n          graph.spread.get(iname)?.add(keyName);\n        }\n        else {\n          graph.spread.set(iname, new Set([keyName]));\n        }\n      }\n      else if (prop.type === 'SpreadElement') {\n        console.warn('not support spread in spread');\n      }\n    });\n  }\n\n  if (\n    path1.node.init?.type === 'CallExpression'\n    && path1.node.init?.callee.type === 'Identifier'\n    && path1.node.init?.callee.name === 'reactive'\n  ) {\n    const arg = path1.node.init?.arguments[0];\n    if (arg.type === 'ObjectExpression') {\n      arg.properties.forEach((prop) => {\n        if (\n          (prop.type === 'ObjectProperty' || prop.type === 'ObjectMethod')\n          && prop.key.type === 'Identifier'\n        ) {\n          const keyName = prop.key.name;\n          graph.nodes.add(keyName);\n          nodeCollection.addNode(keyName, prop, {\n            comment: getComment(prop),\n          });\n          if (!graph.edges.get(keyName)) {\n            graph.edges.set(keyName, new Set());\n          }\n          if (graph.spread.has(iname)) {\n            graph.spread.get(iname)?.add(keyName);\n          }\n          else {\n            graph.spread.set(iname, new Set([keyName]));\n          }\n        }\n        else if (prop.type === 'SpreadElement') {\n          console.warn('not support spread in spread');\n        }\n      });\n    }\n  }\n}\n","import type { NodePath, Scope } from '@babel/traverse';\nimport type * as t from '@babel/types';\nimport type {\n  IAddEdge,\n  IAddNode,\n  IReturnData,\n  IUsedNode,\n} from '../utils/traverse';\nimport type { RelationType } from './utils';\nimport _traverse from '@babel/traverse';\nimport { babelParse } from '@vue/compiler-sfc';\nimport {\n  addGraphBySpreadIdentifier,\n  addIdentifiesToGraphByScanReturn,\n  addSpreadToGraphByScanReturn,\n  collectionSpread,\n  parseEdgeFunctionPattern,\n  parseEdgeLeftArrayPattern,\n  parseEdgeLeftIdentifierPattern,\n  parseEdgeLeftObjectPattern,\n  parseNodeArrayPattern,\n  parseNodeFunctionPattern,\n  parseNodeIdentifierPattern,\n  parseNodeObjectPattern,\n  parseReturnJsxPattern,\n  traverse,\n  traverseSetup,\n} from '../utils/traverse';\nimport { getComment, getRelationType, NodeCollection } from './utils';\n\ninterface IProcessMain {\n  node: t.Node\n  type: 'vue' | 'react'\n  lineOffset?: number\n  addInfo?: boolean\n}\n\ninterface IProcessBranch {\n  node: t.ObjectExpression\n  lineOffset?: number\n  addInfo?: boolean\n  parentScope?: Scope\n  parentNode?: t.ExportDefaultDeclaration\n  parentPath: NodePath<t.ExportDefaultDeclaration>\n  spread?: string[]\n}\n\ntype IProcessReact = {\n  node: t.BlockStatement\n  lineOffset?: number\n  addInfo?: boolean\n  parentScope: Scope\n  parentNode: t.FunctionDeclaration\n  parentPath: NodePath<t.FunctionDeclaration>\n} | {\n  node: t.BlockStatement\n  lineOffset?: number\n  addInfo?: boolean\n  parentScope: Scope\n  parentNode: t.ClassMethod\n  parentPath: NodePath<t.ClassMethod>\n};\n\n// deal when setup return object\nfunction processByReturnNotJSX(params: IProcessBranch) {\n  const { node, parentPath, lineOffset, addInfo } = params;\n  const spread: string[] = [];\n\n  const nodeCollection = new NodeCollection(lineOffset, addInfo);\n\n  const graph = {\n    nodes: new Set<string>(),\n    edges: new Map<string, Set<{ label: string, type: RelationType }>>(),\n  };\n\n  // 解析return, 收集spread\n  const setupPath = traverseSetup({ node, parentScope: parentPath.scope, parentPath });\n\n  // setup return\n  collectionSpread({ path: setupPath, spread });\n\n  // 收集除return之外的所有节点和边\n  const {\n    graph: {\n      nodes: tempNodes,\n      edges: tempEdges,\n      spread: tempSpread,\n    },\n    nodeCollection: tempNodeCollection,\n    nodesUsedInTemplate,\n  } = processByReturnJSX({ node, parentPath, spread, lineOffset, addInfo });\n\n  // 根据return信息添加必要节点\n  addIdentifiesToGraphByScanReturn({\n    path: setupPath,\n    graph,\n    nodeCollection,\n    tempNodeCollection,\n    tempEdges,\n  });\n\n  // 根据return信息添加必要节点\n  addSpreadToGraphByScanReturn({\n    path: setupPath,\n    graph,\n    nodeCollection,\n    tempNodeCollection,\n    tempEdges,\n    tempSpread,\n  });\n\n  return {\n    graph,\n    nodeCollection,\n    nodesUsedInTemplate,\n  };\n}\n\n// deal when setup return jsx\nfunction processByReturnJSX(params: IProcessBranch) {\n  const { node, parentPath, spread = [], lineOffset, addInfo } = params;\n\n  const nodeCollection = new NodeCollection(lineOffset, addInfo);\n  const nodesUsedInTemplate = new Set<string>();\n\n  const graph = {\n    nodes: new Set<string>(),\n    edges: new Map<string, Set<{ label: string, type: RelationType }>>(),\n    spread: new Map<string, Set<string>>(),\n  };\n\n  function addNode({ name, node, path, scope }: IAddNode, commentParentNode?: t.Node) {\n    const binding = path.scope.getBinding(name);\n    if (scope === binding?.scope) {\n      graph.nodes.add(name);\n      nodeCollection.addNode(name, node, {\n        comment: commentParentNode\n          ? getComment(commentParentNode)\n          : '',\n      });\n      if (!graph.edges.get(name)) {\n        graph.edges.set(name, new Set());\n      }\n    }\n  }\n\n  function addEdge({ fromName, toName, path, scope, toScope, collectionNodes }: IAddEdge) {\n    const bindingScope = toScope || path.scope.getBinding(toName)?.scope;\n    if (scope === bindingScope && collectionNodes.has(toName)) {\n      graph.edges.get(fromName)?.add({\n        label: toName,\n        type: getRelationType(path),\n      });\n    }\n  }\n\n  function addUsed({ name, path, parentPath }: IUsedNode) {\n    const binding = path.scope.getBinding(name);\n    if (binding?.scope === parentPath.scope) {\n      nodesUsedInTemplate.add(name);\n    }\n  }\n\n  const setupPath = traverseSetup({ node, parentScope: parentPath.scope, parentPath });\n  const setupScope = setupPath.scope;\n  const setupNode = setupPath.node;\n\n  // 收集节点, 并收集spread依赖\n  traverse(setupNode, {\n    VariableDeclarator(path1) {\n      parseNodeIdentifierPattern({\n        path: path1,\n        rootScope: setupScope,\n        cb: (params) => {\n          if (!spread.includes(params.name)) {\n            addNode(params, path1.node);\n          }\n          else {\n            addGraphBySpreadIdentifier({\n              path: path1,\n              graph,\n              nodeCollection,\n              iname: params.name,\n            });\n          }\n        },\n      });\n\n      parseNodeObjectPattern({\n        path: path1,\n        rootScope: setupScope,\n        cb: addNode,\n      });\n\n      parseNodeArrayPattern({\n        path: path1,\n        rootScope: setupScope,\n        cb: addNode,\n      });\n    },\n    FunctionDeclaration(path1) {\n      parseNodeFunctionPattern({\n        path: path1,\n        rootScope: setupScope,\n        cb: addNode,\n      });\n    },\n  }, setupScope, setupPath);\n\n  // 搜集jsx模版使用节点\n  setupPath.traverse({\n    ReturnStatement(path2) {\n      // setup return jsx\n      parseReturnJsxPattern({\n        path: path2,\n        parentPath: setupPath,\n        cb: addUsed,\n      });\n    },\n  });\n\n  // 收集边\n  traverse(setupNode, {\n    VariableDeclarator(path1) {\n      parseEdgeLeftIdentifierPattern({\n        path: path1,\n        rootScope: setupScope,\n        collectionNodes: graph.nodes,\n        cb: addEdge,\n        spread,\n      });\n\n      parseEdgeLeftObjectPattern({\n        path: path1,\n        rootScope: setupScope,\n        collectionNodes: graph.nodes,\n        cb: addEdge,\n      });\n\n      parseEdgeLeftArrayPattern({\n        path: path1,\n        rootScope: setupScope,\n        collectionNodes: graph.nodes,\n        cb: addEdge,\n      });\n    },\n    FunctionDeclaration(path1) {\n      parseEdgeFunctionPattern({\n        path: path1,\n        rootScope: setupScope,\n        collectionNodes: graph.nodes,\n        cb: addEdge,\n      });\n    },\n  }, setupScope, setupPath);\n\n  return {\n    graph,\n    nodeCollection,\n    nodesUsedInTemplate,\n  };\n}\n\nfunction processByReact(params: IProcessReact) {\n  const { node, parentScope, parentPath, lineOffset, addInfo } = params;\n\n  const nodeCollection = new NodeCollection(lineOffset, addInfo);\n  const nodesUsedInTemplate = new Set<string>();\n\n  const graph = {\n    nodes: new Set<string>(),\n    edges: new Map<string, Set<{ label: string, type: RelationType }>>(),\n    spread: new Map<string, Set<string>>(),\n  };\n\n  function addNode({ name, node, path, scope }: IAddNode, commentParentNode?: t.Node) {\n    const binding = path.scope.getBinding(name);\n    if (scope === binding?.scope) {\n      graph.nodes.add(name);\n      nodeCollection.addNode(name, node, {\n        comment: commentParentNode\n          ? getComment(commentParentNode)\n          : '',\n      });\n      if (!graph.edges.get(name)) {\n        graph.edges.set(name, new Set());\n      }\n    }\n  }\n\n  function addEdge({ fromName, toName, path, scope, toScope, collectionNodes }: IAddEdge) {\n    const bindingScope = toScope || path.scope.getBinding(toName)?.scope;\n    if (scope === bindingScope && collectionNodes.has(toName)) {\n      graph.edges.get(fromName)?.add({\n        label: toName,\n        type: getRelationType(path),\n      });\n    }\n  }\n\n  function addUsed({ name, path, parentPath }: IUsedNode) {\n    const binding = path.scope.getBinding(name);\n    if (binding?.scope === parentPath.scope) {\n      nodesUsedInTemplate.add(name);\n    }\n  }\n\n  // 收集节点依赖\n  traverse(node, {\n    VariableDeclarator(path1) {\n      parseNodeIdentifierPattern({\n        path: path1,\n        rootScope: parentScope!,\n        cb: (params) => {\n          addNode(params, path1.node);\n        },\n      });\n\n      parseNodeObjectPattern({\n        path: path1,\n        rootScope: parentScope!,\n        cb: addNode,\n      });\n\n      parseNodeArrayPattern({\n        path: path1,\n        rootScope: parentScope!,\n        cb: addNode,\n      });\n    },\n    FunctionDeclaration(path1) {\n      parseNodeFunctionPattern({\n        path: path1,\n        rootScope: parentScope!,\n        cb: addNode,\n      });\n    },\n  }, parentScope, parentPath);\n\n  // 搜集jsx模版使用节点\n  traverse(node, {\n    ReturnStatement(path2) {\n      // setup return jsx\n      parseReturnJsxPattern({\n        path: path2,\n        parentPath,\n        cb: addUsed,\n      });\n    },\n  }, parentScope, parentPath);\n\n  // 收集边\n  traverse(node, {\n    VariableDeclarator(path1) {\n      parseEdgeLeftIdentifierPattern({\n        path: path1,\n        rootScope: parentScope!,\n        collectionNodes: graph.nodes,\n        cb: addEdge,\n      });\n\n      parseEdgeLeftObjectPattern({\n        path: path1,\n        rootScope: parentScope!,\n        collectionNodes: graph.nodes,\n        cb: addEdge,\n      });\n\n      parseEdgeLeftArrayPattern({\n        path: path1,\n        rootScope: parentScope!,\n        collectionNodes: graph.nodes,\n        cb: addEdge,\n      });\n    },\n    FunctionDeclaration(path1) {\n      parseEdgeFunctionPattern({\n        path: path1,\n        rootScope: parentScope!,\n        collectionNodes: graph.nodes,\n        cb: addEdge,\n      });\n    },\n  }, parentScope, parentPath);\n\n  return {\n    graph,\n    nodeCollection,\n    nodesUsedInTemplate,\n  };\n}\n\nexport function processTsx(params: IProcessMain) {\n  let result: IReturnData | undefined;\n\n  function process(params: IProcessBranch) {\n    const { node, parentPath } = params;\n    // resolve `return` then determine use processByReturnJSX or processByReturnNotJSX\n    const setupPath = traverseSetup({ node, parentScope: parentPath.scope, parentPath });\n\n    setupPath.traverse({\n      ReturnStatement(path) {\n        if (path.node.argument\n          && (path.node.argument.type === 'ArrowFunctionExpression'\n            || path.node.argument.type === 'FunctionExpression')\n          && (path.node.argument.body.type === 'JSXElement'\n            || path.node.argument.body.type === 'JSXFragment')\n        ) {\n          result = processByReturnJSX(params);\n        }\n        else {\n          result = processByReturnNotJSX(params);\n        }\n      },\n    });\n  }\n\n  traverse(params.node, {\n    ExportDefaultDeclaration(path) {\n      if (params.type === 'vue') {\n        if (path.node.declaration.type === 'ObjectExpression') {\n          // export default {}\n          process({\n            ...params,\n            node: path.node.declaration,\n            parentNode: path.node,\n            parentPath: path,\n          });\n        }\n        else if (\n          path.node.declaration.type === 'CallExpression'\n          && path.node.declaration.callee.type === 'Identifier'\n          && path.node.declaration.callee.name === 'defineComponent'\n          && path.node.declaration.arguments[0].type === 'ObjectExpression'\n        ) {\n          // export default defineComponent({})\n          process({\n            ...params,\n            node: path.node.declaration.arguments[0],\n            parentNode: path.node,\n            parentPath: path,\n          });\n        }\n      }\n      if (params.type === 'react') {\n        if (\n          (path.node.declaration.type === 'FunctionDeclaration'\n            || path.node.declaration.type === 'ArrowFunctionExpression')\n          && path.node.declaration.body.type === 'BlockStatement'\n        ) {\n          // export default function () {}\n\n          const functionPath = path.get('declaration') as NodePath<t.FunctionDeclaration>;\n\n          result = processByReact({\n            ...params,\n            node: path.node.declaration.body,\n            parentNode: functionPath.node,\n            parentPath: functionPath,\n            parentScope: functionPath.scope,\n          });\n        }\n        if (path.node.declaration.type === 'ClassDeclaration') {\n          // export default class Index {}\n\n          const renderFunction = path.node.declaration.body.body.find((node) => {\n            if (node.type === 'ClassMethod' && node.key.type === 'Identifier' && node.key.name === 'render') {\n              return node;\n            }\n            return undefined;\n          }) as t.ClassMethod;\n          if (!renderFunction) {\n            return;\n          }\n\n          const renderPath = path.get(`declaration.body.body.${\n            path.node.declaration.body.body.indexOf(renderFunction)\n          }`) as NodePath<t.ClassMethod>;\n\n          result = processByReact({\n            ...params,\n            node: renderFunction.body,\n            parentNode: renderFunction,\n            parentPath: renderPath,\n            parentScope: renderPath.scope,\n          });\n        }\n      }\n    },\n  });\n\n  return result!;\n}\n\nexport function analyze(\n  content: string,\n  type = 'vue' as 'vue' | 'react',\n  lineOffset = 0,\n  addInfo = true,\n) {\n  const ast = babelParse(content, { sourceType: 'module', plugins: [\n    'typescript',\n    'jsx',\n  ] });\n\n  const { graph, nodeCollection, nodesUsedInTemplate } = processTsx({\n    node: ast,\n    type,\n    lineOffset,\n    addInfo,\n  });\n\n  return {\n    graph: nodeCollection.map(graph),\n    nodesUsedInTemplate,\n  };\n}\n","import type { RelationType, TypedNode } from './analyze/utils';\n\ninterface MermaidOptions {\n  direction?: 'TB' | 'BT' | 'LR' | 'RL'\n}\n\nexport function getMermaidText(\n  graph: {\n    nodes: Set<TypedNode>\n    edges: Map<TypedNode, Set<{ node: TypedNode, type: RelationType }>>\n  },\n  nodesUsedInTemplate: Set<string>,\n  nodesUsedInStyle: Set<string> = new Set(),\n  options: MermaidOptions = {},\n): string {\n  const direction: 'TB' | 'BT' | 'LR' | 'RL' = options.direction || 'TB';\n  const usedNodes: Set<string> = new Set([...nodesUsedInTemplate, ...nodesUsedInStyle]);\n\n  let mermaidText: string = `flowchart ${direction}\n    %% Legend:\n    %% () = variable node\n    %% [] = function node\n    %% * suffix = unused in template/style\n    %% A --> B means A depends on B\\n`;\n\n  graph.nodes.forEach((node: TypedNode) => {\n    const shape: string = node.type === 'var'\n      ? '('\n      : '[';\n    const closeShape: string = node.type === 'var'\n      ? ')'\n      : ']';\n    const unusedSuffix: string = !(usedNodes.has(node.label) || node.info?.used?.size)\n      ? '*'\n      : '';\n    mermaidText += `    ${node.label}${shape}${node.label}${unusedSuffix}${closeShape}\\n`;\n  });\n\n  graph.edges.forEach((edge, key) => {\n    edge.forEach((to) => {\n      if (!to || !to.node.label) {\n        return;\n      }\n      mermaidText += `    ${key.label} --> ${to.node.label}\\n`;\n    });\n  });\n\n  return mermaidText;\n}\n","import type { RelationType, TypedNode } from '../analyze/utils';\n\nexport interface Community {\n  id: number\n  nodes: Set<TypedNode>\n}\n\nexport interface CommunityResult {\n  communities: Community[]\n  nodeToCommuntiy: Map<TypedNode, number>\n}\n\nconst COMMON_PREFIXES = ['handle', 'on', 'is', 'has', 'can', 'should', 'get', 'set', 'update', 'toggle', 'reset', 'clear', 'init', 'fetch', 'load', 'save', 'delete', 'remove', 'add', 'create', 'show', 'hide', 'open', 'close', 'enable', 'disable', 'validate', 'check', 'use'];\nconst COMMON_SUFFIXES = ['change', 'changed', 'handler', 'callback', 'listener', 'state', 'value', 'data', 'list', 'items', 'count', 'index', 'id', 'name', 'type', 'status', 'error', 'loading', 'visible', 'disabled', 'enabled', 'active', 'selected', 'checked', 'open', 'closed'];\n\n/**\n * Extract the base/root word from an identifier by removing common prefixes/suffixes.\n * Only removes prefixes at the start and suffixes at the end.\n * e.g., \"handleOpenChange\" -> [\"open\"]\n *       \"isVisible\" -> [\"visible\"]\n *       \"userName\" -> [\"user\", \"name\"]\n */\nexport function extractBaseWords(identifier: string): string[] {\n  const tokens = identifier\n    .replace(/([a-z])([A-Z])/g, '$1_$2')\n    .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n    .toLowerCase()\n    .split(/[_\\-\\s]+/)\n    .filter(Boolean);\n\n  if (tokens.length === 0) {\n    return [];\n  }\n\n  if (tokens.length === 1) {\n    return tokens;\n  }\n\n  let start = 0;\n  if (COMMON_PREFIXES.includes(tokens[0])) {\n    start = 1;\n  }\n\n  let end = tokens.length;\n  if (COMMON_SUFFIXES.includes(tokens[tokens.length - 1])) {\n    end = tokens.length - 1;\n  }\n\n  const words = tokens.slice(start, end);\n\n  if (words.length === 0) {\n    return tokens.slice(start > 0\n      ? start\n      : 0);\n  }\n\n  return words;\n}\n\n/**\n * Calculate semantic similarity between two identifiers.\n * Returns a value between 0 and 1.\n *\n * Considers:\n * 1. Shared base words (e.g., \"open\" in \"isOpen\" and \"handleOpenChange\")\n * 2. One identifier contains the other as a substring\n * 3. Common naming patterns (handler/state pairs)\n */\nexport function calculateSemanticSimilarity(labelA: string, labelB: string): number {\n  if (labelA === labelB) {\n    return 1;\n  }\n\n  const lowerA = labelA.toLowerCase();\n  const lowerB = labelB.toLowerCase();\n\n  if (lowerA.includes(lowerB) || lowerB.includes(lowerA)) {\n    const shorter = lowerA.length < lowerB.length\n      ? lowerA\n      : lowerB;\n    const longer = lowerA.length < lowerB.length\n      ? lowerB\n      : lowerA;\n    return shorter.length / longer.length;\n  }\n\n  const wordsA = extractBaseWords(labelA);\n  const wordsB = extractBaseWords(labelB);\n\n  if (wordsA.length === 0 || wordsB.length === 0) {\n    return 0;\n  }\n\n  const setA = new Set(wordsA);\n  const setB = new Set(wordsB);\n\n  let sharedCount = 0;\n  for (const word of setA) {\n    if (setB.has(word)) {\n      sharedCount++;\n    }\n  }\n\n  if (sharedCount === 0) {\n    return 0;\n  }\n\n  const jaccardSimilarity = sharedCount / (setA.size + setB.size - sharedCount);\n\n  return jaccardSimilarity;\n}\n\ninterface BuildWeightedGraphOptions {\n  semanticWeight?: number\n  similarityThreshold?: number\n}\n\n/**\n * Calculate semantic similarity using cached base words.\n * Returns a value between 0 and 1.\n */\nfunction calculateSemanticSimilarityCached(\n  labelA: string,\n  labelB: string,\n  wordsA: string[],\n  wordsB: string[],\n): number {\n  if (labelA === labelB) {\n    return 1;\n  }\n\n  const lowerA = labelA.toLowerCase();\n  const lowerB = labelB.toLowerCase();\n\n  if (lowerA.includes(lowerB) || lowerB.includes(lowerA)) {\n    const shorter = lowerA.length < lowerB.length\n      ? lowerA\n      : lowerB;\n    const longer = lowerA.length < lowerB.length\n      ? lowerB\n      : lowerA;\n    return shorter.length / longer.length;\n  }\n\n  if (wordsA.length === 0 || wordsB.length === 0) {\n    return 0;\n  }\n\n  const setA = new Set(wordsA);\n  const setB = new Set(wordsB);\n\n  let sharedCount = 0;\n  for (const word of setA) {\n    if (setB.has(word)) {\n      sharedCount++;\n    }\n  }\n\n  if (sharedCount === 0) {\n    return 0;\n  }\n\n  return sharedCount / (setA.size + setB.size - sharedCount);\n}\n\n/**\n * Build a weighted graph that combines structural connections with semantic similarity.\n *\n * Optimized algorithm:\n * 1. Cache extractBaseWords results to avoid repeated computation\n * 2. Build word-to-nodes bucket map, only compare nodes within same bucket\n *    This reduces O(N²) to O(B × K²) where B = number of buckets, K = avg nodes per bucket\n */\nfunction buildWeightedGraph(\n  graph: Map<TypedNode, Set<{ node: TypedNode, type: RelationType }>>,\n  options: BuildWeightedGraphOptions = {},\n): Map<TypedNode, Map<TypedNode, number>> {\n  const { semanticWeight = 1.0, similarityThreshold = 0.3 } = options;\n\n  const weighted = new Map<TypedNode, Map<TypedNode, number>>();\n  const allNodes = new Set<TypedNode>();\n\n  for (const [node, edges] of graph) {\n    allNodes.add(node);\n    for (const edge of edges) {\n      allNodes.add(edge.node);\n    }\n  }\n\n  for (const node of allNodes) {\n    weighted.set(node, new Map());\n  }\n\n  const structuralWeight = 0.85;\n\n  for (const [node, edges] of graph) {\n    for (const edge of edges) {\n      const currentWeight = weighted.get(node)!.get(edge.node) || 0;\n      weighted.get(node)!.set(edge.node, Math.max(currentWeight, structuralWeight));\n\n      const reverseWeight = weighted.get(edge.node)!.get(node) || 0;\n      weighted.get(edge.node)!.set(node, Math.max(reverseWeight, structuralWeight));\n    }\n  }\n\n  if (semanticWeight > 0) {\n    const nodeWordsCache = new Map<TypedNode, string[]>();\n    const wordToBucket = new Map<string, Set<TypedNode>>();\n\n    for (const node of allNodes) {\n      const words = extractBaseWords(node.label);\n      nodeWordsCache.set(node, words);\n\n      for (const word of words) {\n        if (!wordToBucket.has(word)) {\n          wordToBucket.set(word, new Set());\n        }\n        wordToBucket.get(word)!.add(node);\n      }\n    }\n\n    const comparedPairs = new Set<string>();\n\n    for (const [_, bucket] of wordToBucket) {\n      if (bucket.size < 2) {\n        continue;\n      }\n\n      const bucketNodes = Array.from(bucket);\n      for (let i = 0; i < bucketNodes.length; i++) {\n        for (let j = i + 1; j < bucketNodes.length; j++) {\n          const nodeA = bucketNodes[i];\n          const nodeB = bucketNodes[j];\n\n          const comparedKey = [nodeA.label, nodeB.label].sort().join('|');\n          if (comparedPairs.has(comparedKey)) {\n            continue;\n          }\n          comparedPairs.add(comparedKey);\n\n          const wordsA = nodeWordsCache.get(nodeA)!;\n          const wordsB = nodeWordsCache.get(nodeB)!;\n          const similarity = calculateSemanticSimilarityCached(\n            nodeA.label,\n            nodeB.label,\n            wordsA,\n            wordsB,\n          );\n\n          if (similarity > similarityThreshold) {\n            const semanticEdgeWeight = similarity * semanticWeight;\n\n            // Only enhance existing structural connections with semantic weight\n            // Check actual edge existence in weighted graph, not by label\n            const currentAB = weighted.get(nodeA)!.get(nodeB);\n            if (typeof currentAB === 'number') {\n              weighted.get(nodeA)!.set(nodeB, Math.min(Math.max(currentAB, semanticEdgeWeight), 2.0));\n            }\n\n            const currentBA = weighted.get(nodeB)!.get(nodeA);\n            if (typeof currentBA === 'number') {\n              weighted.get(nodeB)!.set(nodeA, Math.min(Math.max(currentBA, semanticEdgeWeight), 2.0));\n            }\n          }\n        }\n      }\n    }\n  }\n\n  return weighted;\n}\n\nfunction buildUndirectedGraph(\n  graph: Map<TypedNode, Set<{ node: TypedNode, type: RelationType }>>,\n): Map<TypedNode, Set<TypedNode>> {\n  const undirected = new Map<TypedNode, Set<TypedNode>>();\n\n  for (const [node, edges] of graph) {\n    if (!undirected.has(node)) {\n      undirected.set(node, new Set());\n    }\n    for (const edge of edges) {\n      undirected.get(node)!.add(edge.node);\n      if (!undirected.has(edge.node)) {\n        undirected.set(edge.node, new Set());\n      }\n      undirected.get(edge.node)!.add(node);\n    }\n  }\n\n  return undirected;\n}\n\nfunction createSeededRandom(seed?: number): () => number {\n  if (seed === undefined) {\n    return Math.random;\n  }\n  let state = seed;\n  return () => {\n    state = (state * 1103515245 + 12345) & 0x7FFFFFFF;\n    return state / 0x7FFFFFFF;\n  };\n}\n\nfunction shuffleArray<T>(array: T[], random: () => number = Math.random): T[] {\n  const result = [...array];\n  for (let i = result.length - 1; i > 0; i--) {\n    const j = Math.floor(random() * (i + 1));\n    [result[i], result[j]] = [result[j], result[i]];\n  }\n  return result;\n}\n\nexport interface DetectCommunitiesOptions {\n  maxIterations?: number\n  seed?: number\n  /**\n   * Weight for semantic similarity (0-1).\n   * Higher values give more importance to naming patterns.\n   * Default: 1.0\n   */\n  semanticWeight?: number\n  /**\n   * Minimum semantic similarity threshold for enhancing existing edges (0-1).\n   * Only structurally connected node pairs with similarity above this threshold\n   * will have their edge weight enhanced by semantic similarity.\n   * Note: Semantic similarity alone does not create new edges.\n   * Default: 0.3\n   */\n  similarityThreshold?: number\n}\n\n/**\n * Label Propagation Algorithm for community detection with semantic awareness.\n *\n * Each node starts with its own unique label. In each iteration,\n * nodes adopt the most frequent label among their neighbors,\n * weighted by both structural connections and semantic similarity.\n *\n * Semantic similarity considers:\n * - Shared base words (e.g., \"open\" in \"isOpen\" and \"handleOpenChange\")\n * - Substring relationships\n * - Common naming patterns (handler/state pairs)\n *\n * This helps identify groups of nodes that are tightly connected\n * and could potentially be extracted into separate hooks.\n */\nexport function detectCommunities(\n  graph: Map<TypedNode, Set<{ node: TypedNode, type: RelationType }>>,\n  options: DetectCommunitiesOptions = {},\n): CommunityResult {\n  const { maxIterations = 100, semanticWeight = 1.0, similarityThreshold = 0.3 } = options;\n  const random = createSeededRandom(options.seed);\n  const weightedGraph = buildWeightedGraph(graph, { semanticWeight, similarityThreshold });\n  const nodes = Array.from(weightedGraph.keys());\n\n  if (nodes.length === 0) {\n    return { communities: [], nodeToCommuntiy: new Map() };\n  }\n\n  const labels = new Map<TypedNode, number>();\n  nodes.forEach((node, index) => {\n    labels.set(node, index);\n  });\n\n  let changed = true;\n  let iterations = 0;\n\n  while (changed && iterations < maxIterations) {\n    changed = false;\n    iterations++;\n\n    const shuffledNodes = shuffleArray(nodes, random);\n\n    for (const node of shuffledNodes) {\n      const neighbors = weightedGraph.get(node);\n      if (!neighbors || neighbors.size === 0) {\n        continue;\n      }\n\n      const labelWeights = new Map<number, number>();\n      for (const [neighbor, weight] of neighbors) {\n        const neighborLabel = labels.get(neighbor)!;\n        labelWeights.set(neighborLabel, (labelWeights.get(neighborLabel) || 0) + weight);\n      }\n\n      let maxWeight = 0;\n      let maxLabels: number[] = [];\n      for (const [label, weight] of labelWeights) {\n        if (weight > maxWeight) {\n          maxWeight = weight;\n          maxLabels = [label];\n        }\n        else if (weight === maxWeight) {\n          maxLabels.push(label);\n        }\n      }\n\n      const currentLabel = labels.get(node)!;\n      if (maxLabels.includes(currentLabel)) {\n        continue;\n      }\n\n      const newLabel = maxLabels[Math.floor(random() * maxLabels.length)];\n      if (newLabel !== currentLabel) {\n        labels.set(node, newLabel);\n        changed = true;\n      }\n    }\n  }\n\n  const communityMap = new Map<number, Set<TypedNode>>();\n  for (const [node, label] of labels) {\n    if (!communityMap.has(label)) {\n      communityMap.set(label, new Set());\n    }\n    communityMap.get(label)!.add(node);\n  }\n\n  const communities: Community[] = [];\n  const nodeToCommuntiy = new Map<TypedNode, number>();\n  let communityId = 0;\n\n  for (const [_, nodeSet] of communityMap) {\n    communities.push({\n      id: communityId,\n      nodes: nodeSet,\n    });\n    for (const node of nodeSet) {\n      nodeToCommuntiy.set(node, communityId);\n    }\n    communityId++;\n  }\n\n  communities.sort((a, b) => b.nodes.size - a.nodes.size);\n\n  const reindexedCommunities: Community[] = [];\n  const newNodeToCommunity = new Map<TypedNode, number>();\n\n  communities.forEach((community, newId) => {\n    reindexedCommunities.push({\n      id: newId,\n      nodes: community.nodes,\n    });\n    for (const node of community.nodes) {\n      newNodeToCommunity.set(node, newId);\n    }\n  });\n\n  return {\n    communities: reindexedCommunities,\n    nodeToCommuntiy: newNodeToCommunity,\n  };\n}\n\n/**\n * Generate HSL colors for communities.\n * Uses golden ratio to distribute hues evenly.\n */\nexport function generateCommunityColors(communityCount: number): string[] {\n  const colors: string[] = [];\n  const goldenRatio = 0.618033988749895;\n  let hue = 0.1;\n\n  for (let i = 0; i < communityCount; i++) {\n    hue = (hue + goldenRatio) % 1;\n    const h = Math.floor(hue * 360);\n    const s = 65 + (i % 3) * 10;\n    const l = 45 + (i % 2) * 10;\n    colors.push(`hsl(${h}, ${s}%, ${l}%)`);\n  }\n\n  return colors;\n}\n\n/**\n * Generate RGBA colors for VS Code decorations.\n * Returns both background (low opacity) and foreground (high opacity) colors.\n */\nexport function generateCommunityColorsRGBA(communityCount: number): Array<{\n  background: string\n  foreground: string\n  border: string\n}> {\n  const colors: Array<{ background: string, foreground: string, border: string }> = [];\n  const goldenRatio = 0.618033988749895;\n  let hue = 0.1;\n\n  for (let i = 0; i < communityCount; i++) {\n    hue = (hue + goldenRatio) % 1;\n    const h = hue * 360;\n    const s = 0.45;\n    const l = 0.55;\n\n    const { r, g, b } = hslToRgb(h, s, l);\n\n    colors.push({\n      background: `rgba(${r}, ${g}, ${b}, 0.15)`,\n      foreground: `rgba(${r}, ${g}, ${b}, 0.9)`,\n      border: `rgba(${r}, ${g}, ${b}, 0.5)`,\n    });\n  }\n\n  return colors;\n}\n\nfunction hslToRgb(h: number, s: number, l: number): { r: number, g: number, b: number } {\n  h = h / 360;\n\n  let r: number, g: number, b: number;\n\n  if (s === 0) {\n    r = g = b = l;\n  }\n  else {\n    const hue2rgb = (p: number, q: number, t: number) => {\n      if (t < 0) { t += 1; }\n      if (t > 1) { t -= 1; }\n      if (t < 1 / 6) { return p + (q - p) * 6 * t; }\n      if (t < 1 / 2) { return q; }\n      if (t < 2 / 3) { return p + (q - p) * (2 / 3 - t) * 6; }\n      return p;\n    };\n\n    const q = l < 0.5\n      ? l * (1 + s)\n      : l + s - l * s;\n    const p = 2 * l - q;\n    r = hue2rgb(p, q, h + 1 / 3);\n    g = hue2rgb(p, q, h);\n    b = hue2rgb(p, q, h - 1 / 3);\n  }\n\n  return {\n    r: Math.round(r * 255),\n    g: Math.round(g * 255),\n    b: Math.round(b * 255),\n  };\n}\n","import type { RelationType, TypedNode } from '../analyze/utils';\nimport { NodeType } from '../analyze/utils';\n\n/**\n * Filter out nodes that have no indegree.\n */\nexport function noIndegreeFilter(\n  graph: Map<TypedNode, Set<{ node: TypedNode, type: RelationType }>>,\n) {\n  const nodes = Array.from(graph.keys());\n  const indegree = new Map<TypedNode, number>();\n  nodes.forEach((node) => {\n    indegree.set(node, 0);\n  });\n  graph.forEach((targets, node) => {\n    targets.forEach((target) => {\n      indegree.set(target.node, (indegree.get(target.node) || 0) + 1);\n    });\n  });\n  return nodes.filter(node => indegree.get(node) === 0);\n}\n\n/**\n * Filter out nodes that have no outdegree.\n */\nexport function noOutdegreeFilter(\n  graph: Map<TypedNode, Set<TypedNode>>,\n) {\n  const zeroOutdegreeNodes = [];\n\n  for (const [node, edges] of graph.entries()) {\n    if (edges.size === 0) {\n      zeroOutdegreeNodes.push(node);\n    }\n  }\n\n  return zeroOutdegreeNodes;\n}\n\n// ---\n\nfunction removeVariable(\n  graph: Map<TypedNode, Set<TypedNode>>,\n  targets: Set<TypedNode>,\n) {\n  const newTarget = new Set<TypedNode>();\n  targets.forEach((target) => {\n    if (target.type === NodeType.var) {\n      const nodes = graph.get(target);\n      nodes?.forEach((node) => {\n        newTarget.add(node);\n      });\n    }\n    if (target.type === NodeType.fun) {\n      newTarget.add(target);\n    }\n  });\n  return newTarget;\n}\n\n/**\n * only save function nodes\n */\nexport function onlyFunctions(\n  graph: Map<TypedNode, Set<TypedNode>>,\n): Map<TypedNode, Set<TypedNode>> {\n  const result = new Map<TypedNode, Set<TypedNode>>();\n  graph.forEach((targets, node) => {\n    if (node.type === NodeType.fun) {\n      const nodes = removeVariable(graph, targets);\n      result.set(node, nodes);\n    }\n  });\n  return result;\n}\n\n// ---\n\nexport function findLinearPaths(graph: Map<TypedNode, Set<{ node: TypedNode, type: RelationType }>>) {\n  const linearPaths = [] as TypedNode[][];\n  const visitedNodes = new Set<TypedNode>();\n  const nodeInDegrees = new Map<TypedNode, number>();\n\n  // 计算每个节点的入度\n  for (const [node, edges] of graph.entries()) {\n    if (!nodeInDegrees.has(node)) {\n      nodeInDegrees.set(node, 0); // 确保每个节点都在入度映射中\n    }\n    for (const edge of edges) {\n      const inDegree = nodeInDegrees.get(edge.node) || 0;\n      nodeInDegrees.set(edge.node, inDegree + 1);\n    }\n  }\n\n  function dfs(node: TypedNode, path: TypedNode[]) {\n    if (visitedNodes.has(node)) {\n      return;\n    }\n\n    path.push(node);\n    visitedNodes.add(node);\n\n    const edges = graph.get(node) || new Set();\n\n    if (edges.size === 0 || edges.size > 1) {\n      if (path.length > 1) {\n        addOrUpdatePath([...path]);\n      }\n    }\n    else {\n      const nextNode = Array.from(edges)[0].node;\n      const nextNodeInDegree = nodeInDegrees.get(nextNode) || 0;\n\n      // 确保下一个节点只有一个入度\n      if (nextNodeInDegree === 1) {\n        dfs(nextNode, path);\n      }\n    }\n\n    path.pop();\n    visitedNodes.delete(node);\n  }\n\n  function addOrUpdatePath(newPath: TypedNode[]) {\n    let shouldAddNewPath = true;\n\n    for (let i = linearPaths.length - 1; i >= 0; i--) {\n      const existingPath = linearPaths[i];\n      if (isSubpath(existingPath, newPath)) {\n        linearPaths.splice(i, 1); // remove the shorter path\n      }\n      else if (isSubpath(newPath, existingPath)) {\n        shouldAddNewPath = false;\n        break;\n      }\n    }\n\n    if (shouldAddNewPath && newPath.length > 2) {\n      linearPaths.push(newPath);\n    }\n  }\n\n  function isSubpath(shortPath: TypedNode[], longPath: TypedNode[]) {\n    if (shortPath.length >= longPath.length) {\n      return false;\n    }\n\n    for (let i = 0; i <= longPath.length - shortPath.length; i++) {\n      let isSub = true;\n      for (let j = 0; j < shortPath.length; j++) {\n        if (shortPath[j] !== longPath[i + j]) {\n          isSub = false;\n          break;\n        }\n      }\n      if (isSub) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  for (const node of graph.keys()) {\n    dfs(node, []);\n  }\n\n  return linearPaths;\n}\n\n// ---\n\nexport function findArticulationPoints(graph: Map<TypedNode, Set<{ node: TypedNode, type: RelationType }>>) {\n  const noIndegreeNodes = noIndegreeFilter(graph);\n  let time = 0;\n  const low = new Map<TypedNode, number>();\n  const disc = new Map<TypedNode, number>();\n  const parent = new Map<TypedNode, TypedNode | null>();\n  const ap = new Set<TypedNode>();\n  const visited = new Set<TypedNode>();\n\n  function APUtil(graph: Map<TypedNode, Set<{ node: TypedNode, type: RelationType }>>, node: TypedNode) {\n    let children = 0;\n    disc.set(node, time);\n    low.set(node, time);\n    time++;\n    visited.add(node);\n\n    for (const neighbor of graph.get(node) || []) {\n      if (!visited.has(neighbor.node)) {\n        children++;\n        parent.set(neighbor.node, node);\n        APUtil(graph, neighbor.node);\n        low.set(node, Math.min(low.get(node)!, low.get(neighbor.node)!));\n        if (parent.get(node) === null && children > 1) {\n          ap.add(node);\n        }\n        if (parent.get(node) !== null && low.get(neighbor.node)! >= disc.get(node)!) {\n          ap.add(node);\n        }\n      }\n      else if (neighbor.node !== parent.get(node)) {\n        low.set(node, Math.min(low.get(node)!, disc.get(neighbor.node)!));\n      }\n    }\n  }\n\n  for (const node of graph.keys()) {\n    if (!visited.has(node) && !noIndegreeNodes.includes(node)) {\n      APUtil(graph, node);\n    }\n  }\n  return ap;\n}\n","import type { RelationType, TypedNode } from '../analyze/utils';\n\nfunction dfs(\n  graph: Map<TypedNode, Set<{ node: TypedNode, type: RelationType }>>,\n  node: TypedNode,\n  targets: Set<{ node: TypedNode, type: RelationType }>,\n  visited: Set<TypedNode>,\n  component: Set<TypedNode>,\n) {\n  component.add(node);\n  visited.add(node);\n  targets.forEach((target) => {\n    if (!visited.has(target.node)) {\n      dfs(graph, target.node, graph.get(target.node) || new Set(), visited, component);\n    }\n  });\n}\n\nfunction haveIntersection(setA: Set<TypedNode>, setB: Set<TypedNode>): boolean {\n  for (const item of setA) {\n    if (setB.has(item)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction mergeSets(arr: Set<TypedNode>[]): Set<TypedNode>[] {\n  let result: Set<TypedNode>[] = [...arr];\n  for (let i = 0; i < result.length; i++) {\n    for (let j = i + 1; j < result.length; j++) {\n      if (haveIntersection(result[i], result[j])) {\n        const newSet = new Set([...result[i], ...result[j]]);\n        result.splice(j, 1);\n        result.splice(i, 1);\n        result = [...result, newSet];\n        return mergeSets(result);\n      }\n    }\n  }\n  return result;\n}\n\nexport function splitGraph(\n  graph: Map<TypedNode, Set<{ node: TypedNode, type: RelationType }>>,\n) {\n  const components = [] as Set<TypedNode>[];\n\n  const sorted = Array.from(graph).sort((a, b) => b[1].size - a[1].size);\n\n  (new Map(sorted)).forEach((targets, node) => {\n    const visited = new Set<TypedNode>();\n    if (!visited.has(node)) {\n      const component = new Set<TypedNode>();\n      dfs(graph, node, targets, visited, component);\n      components.push(component);\n    }\n  });\n\n  return mergeSets(components).map((component) => {\n    const subGraph = new Map<TypedNode, Set<{ node: TypedNode, type: RelationType }>>();\n    component.forEach((node) => {\n      const targets = graph.get(node);\n      if (targets) {\n        subGraph.set(node, targets);\n      }\n    });\n    return subGraph;\n  });\n}\n","import type { RelationType, TypedNode } from '../analyze/utils';\n\nexport function hasCycle(\n  graph: Map<TypedNode, Set<{ node: TypedNode, type: RelationType }>>,\n): { hasCycle: boolean, cycleNodes: TypedNode[] } {\n  const visited: Set<TypedNode> = new Set();\n  const onStack: Set<TypedNode> = new Set();\n  const stack: TypedNode[] = [];\n  let cycleNodes: TypedNode[] = [];\n\n  function dfs(node: TypedNode): boolean {\n    if (visited.has(node)) {\n      if (onStack.has(node)) {\n        // 只有当环中所有边都是写(set) 或全是 调用(call) 才算循环\n        const idx = stack.indexOf(node);\n        const cycle = stack.slice(idx);\n        const allNotGet = cycle.every((curr, i) => {\n          const next = cycle[(i + 1) % cycle.length];\n          return Array.from(graph.get(curr) || []).some(\n            edge => edge.node === next && edge.type !== 'get',\n          );\n        });\n\n        if (allNotGet) {\n          cycleNodes = cycle;\n          return true;\n        }\n        return false;\n      }\n      return false;\n    }\n\n    visited.add(node);\n    onStack.add(node);\n    stack.push(node);\n\n    for (const neighbor of (graph.get(node) || new Set())) {\n      // 检查自环：自己依赖自己且 type 为 'set' 也算环\n      if (neighbor.node === node && neighbor.type !== 'get') {\n        cycleNodes = [node];\n        return true;\n      }\n      if (dfs(neighbor.node)) {\n        return true;\n      }\n    }\n\n    onStack.delete(node);\n    stack.pop();\n    return false;\n  }\n\n  for (const [node, targets] of graph) {\n    if (dfs(node)) {\n      return { hasCycle: true, cycleNodes };\n    }\n  }\n\n  return { hasCycle: false, cycleNodes: [] };\n}\n","import type { RelationType, TypedNode } from '../analyze/utils';\nimport { NodeType } from '../analyze/utils';\nimport { detectCommunities } from './community';\nimport { findArticulationPoints, findLinearPaths, noIndegreeFilter } from './filter';\nimport { splitGraph } from './split';\nimport { hasCycle } from './utils';\n\nexport enum SuggestionType {\n  info = 'info',\n  warning = 'warning',\n  error = 'error',\n}\n\nexport interface Suggestion {\n  type: SuggestionType\n  message: string\n  nodeInfo?: TypedNode | Array<TypedNode>\n};\n\nexport function gen(\n  graph: {\n    nodes: Set<TypedNode>\n    edges: Map<TypedNode, Set<{ node: TypedNode, type: RelationType }>>\n  },\n  nodesUsedInTemplate: Set<string>,\n  nodesUsedInStyle: Set<string> = new Set(),\n  options?: Partial<{\n    ellipsis: boolean\n    communitySeed: number\n  }>,\n) {\n  const {\n    ellipsis = true,\n    communitySeed,\n  } = options ?? {};\n\n  const usedNodes = new Set([...nodesUsedInTemplate, ...nodesUsedInStyle]);\n\n  const suggestions: Suggestion[] = [];\n  const splitedGraph = splitGraph(graph.edges);\n  splitedGraph.forEach((g) => {\n    const nodes = Array.from(g.keys());\n\n    if (splitedGraph.length > 1) {\n      if (nodes.length > 2 && nodes.some(node => !usedNodes.has(node.label))) {\n        suggestions.push({\n          type: SuggestionType.info,\n          message: `Nodes [${\n            (ellipsis && nodes.length > 10)\n              ? `${nodes.slice(0, 10).map(node => node.label).join(',')}...(${nodes.length})`\n              : nodes.map(node => node.label).join(',')\n          }] are isolated, perhaps you can refactor them to an isolated file.`,\n          nodeInfo: nodes,\n        });\n      }\n    }\n\n    if (nodes.length > 1 && nodes.every(node => !usedNodes.has(node.label) && !node.info?.used?.size)) {\n      suggestions.push({\n        type: SuggestionType.info,\n        message: `Nodes [${\n          (ellipsis && nodes.length > 10)\n            ? `${nodes.slice(0, 10).map(node => node.label).join(',')}...`\n            : nodes.map(node => node.label).join(',')\n        }] are not used, perhaps you can remove them.`,\n        nodeInfo: nodes,\n      });\n    }\n    const hasCycleResult = hasCycle(g);\n    if (hasCycleResult.hasCycle) {\n      suggestions.push({\n        type: SuggestionType.error,\n        message: `There is a loop call in nodes [${\n          hasCycleResult.cycleNodes.map(node => node.label).join(',')\n        }], perhaps you can refactor it.`,\n        nodeInfo: hasCycleResult.cycleNodes,\n      });\n    }\n\n    const paths = findLinearPaths(g);\n    paths.forEach((path) => {\n      const firstUsedNodeIndex = path.findIndex(node => usedNodes.has(node.label));\n      const reverseLastNotUsedNodeIndex = path.slice().reverse().findIndex(node => !usedNodes.has(node.label));\n      const lastNotUsedNodeIndex = reverseLastNotUsedNodeIndex !== -1\n        ? path.length - 1 - reverseLastNotUsedNodeIndex\n        : -1;\n\n      if (firstUsedNodeIndex > -1 && firstUsedNodeIndex < lastNotUsedNodeIndex) {\n        suggestions.push({\n          type: SuggestionType.warning,\n          message: `Nodes [${\n            (ellipsis && path.length > 10)\n              ? `${path.slice(0, 10).map(node => node.label).join(',')}...(${path.length})`\n              : path.map(node => node.label).join(',')\n          }] are have function chain calls, perhaps you can refactor it.`,\n          nodeInfo: path,\n        });\n      }\n    });\n\n    if (g.size > 5) {\n      const ap = findArticulationPoints(g);\n      ap.forEach((node) => {\n        if (node.type === NodeType.fun) {\n          suggestions.push({\n            type: SuggestionType.info,\n\n            message: `Node [${\n              node.label\n            }] is an articulation point, perhaps you need to pay special attention to this node.`,\n            nodeInfo: node,\n          });\n        }\n      });\n    }\n  });\n\n  const noIndegreeNodes = noIndegreeFilter(graph.edges);\n  noIndegreeNodes.forEach((node) => {\n    if (!usedNodes.has(node.label) && !node.info?.used?.size) {\n      suggestions.push({\n        type: SuggestionType.info,\n        message: `Node [${node.label}] is not used, perhaps you can remove it.`,\n        nodeInfo: node,\n      });\n    }\n  });\n\n  const communityResult = detectCommunities(graph.edges, { seed: communitySeed });\n  const { communities } = communityResult;\n\n  const extractableCommunities = communities.filter((community) => {\n    const nodes = Array.from(community.nodes);\n    if (nodes.length < 3 || nodes.length > 15) {\n      return false;\n    }\n\n    const hasUsedNode = nodes.some(node => usedNodes.has(node.label));\n    const hasUnusedNode = nodes.some(node => !usedNodes.has(node.label));\n\n    return hasUsedNode && hasUnusedNode;\n  });\n\n  extractableCommunities.forEach((community) => {\n    const nodes = Array.from(community.nodes);\n    const unusedNodes = nodes.filter(node => !usedNodes.has(node.label));\n\n    if (unusedNodes.length >= 2) {\n      suggestions.push({\n        type: SuggestionType.info,\n        message: `Nodes [${\n          (ellipsis && nodes.length > 10)\n            ? `${nodes.slice(0, 10).map(node => node.label).join(',')}...(${nodes.length})`\n            : nodes.map(node => node.label).join(',')\n        }] form a tightly coupled group, consider extracting them into a composable/hook.`,\n        nodeInfo: nodes,\n      });\n    }\n  });\n\n  if (communities.length > 3) {\n    const independentCommunities = communities.filter((community) => {\n      const nodes = Array.from(community.nodes);\n      return nodes.length >= 2 && nodes.every(node => !usedNodes.has(node.label) && !node.info?.used?.size);\n    });\n\n    if (independentCommunities.length >= 2) {\n      const allNodes = independentCommunities.flatMap(c => Array.from(c.nodes));\n      suggestions.push({\n        type: SuggestionType.info,\n        message: `Found ${independentCommunities.length} independent variable groups that are not used in template. Consider removing or extracting them.`,\n        nodeInfo: allNodes,\n      });\n    }\n  }\n\n  const largeCommunities = communities.filter(c => c.nodes.size > 10);\n  largeCommunities.forEach((community) => {\n    const nodes = Array.from(community.nodes);\n    const functionNodes = nodes.filter(n => n.type === NodeType.fun);\n\n    if (functionNodes.length > 5) {\n      suggestions.push({\n        type: SuggestionType.warning,\n        message: `Community with ${nodes.length} nodes has ${functionNodes.length} functions. This group is complex, consider splitting into smaller composables.`,\n        nodeInfo: nodes,\n      });\n    }\n  });\n\n  return suggestions;\n}\n","import type { Data, Edge, Node } from 'vis-network';\nimport type { RelationType, TypedNode } from './analyze/utils';\n\ntype CustomNode = Node & {\n  info: TypedNode['info']\n};\n\nfunction filterNodeUserd(used: Set<string> | undefined) {\n  const usedArray = Array.from(used || []);\n  return new Set(usedArray.filter(u => ![\n    'Assignment Expression',\n    'Call Expression',\n  ].includes(u)));\n}\n\nexport function getVisData(\n  graph: {\n    nodes: Set<TypedNode>\n    edges: Map<TypedNode, Set<{ node: TypedNode, type: RelationType }>>\n  },\n  nodesUsedInTemplate: Set<string>,\n  nodesUsedInStyle: Set<string> = new Set(),\n) {\n  const usedNodes = new Set([...nodesUsedInTemplate, ...nodesUsedInStyle]);\n\n  const nodes: CustomNode[] = [];\n  const edges: Edge[] = [];\n\n  const inDegreeMap: Record<string, number> = {};\n  const outDegreeMap: Record<string, number> = {};\n  graph.edges.forEach((edge) => {\n    edge.forEach((to) => {\n      if (to) {\n        inDegreeMap[to.node.label] = (inDegreeMap[to.node.label] || 0) + 1;\n      }\n    });\n  });\n  graph.edges.forEach((edge, key) => {\n    outDegreeMap[key.label] = edge.size;\n  });\n\n  graph.nodes.forEach((node) => {\n    const inDegree = inDegreeMap[node.label] || 0;\n    const outDegree = outDegreeMap[node.label] || 0;\n\n    nodes.push({\n      id: node.label,\n      label: node.label,\n      shape: node.type === 'var'\n        ? 'dot'\n        : 'diamond',\n      group: usedNodes.has(node.label) || node.info?.used?.size\n        ? 'used'\n        : 'normal',\n      size: 20 + 1.6 ** ((inDegree * 0.75 + outDegree * 0.25)),\n      title: `${\n        filterNodeUserd(node.info?.used).size\n          ? `used by ${Array.from(filterNodeUserd(node.info?.used))?.map(i => `\\`${i}\\``).join(',')}\\n\\n`\n          : ''\n      }${\n        usedNodes.has(node.label)\n          ? `used in ${\n            [\n              nodesUsedInStyle.has(node.label)\n                ? 'style'\n                : '',\n              nodesUsedInTemplate.has(node.label)\n                ? 'template'\n                : '',\n            ].filter(Boolean).join(' and ')\n          }\\n\\n`\n          : ''\n      }${node.info?.comment || ''}`.trim() || undefined,\n      info: node.info,\n    });\n  });\n\n  graph.edges.forEach((edge, key) => {\n    edge.forEach((to) => {\n      if (!to) {\n        return;\n      }\n      edges.push({\n        from: key.label,\n        to: to.node.label,\n        arrows: {\n          to: {\n            enabled: true,\n            scaleFactor: 0.8,\n          },\n        },\n      });\n    });\n  });\n\n  return {\n    nodes,\n    edges,\n  };\n}\n"],"mappings":"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"}