{"version":3,"sources":["../../src/ast-explorer/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @fileoverview OrdoJS Dev Tools - AST Explorer\n *\n * AST explorer for analyzing and visualizing abstract syntax trees.\n */\n\nimport { EventEmitter } from 'events';\nimport type { ASTNode } from '../types/index.js';\n\n/**\n * AST explorer for analyzing abstract syntax trees\n */\nexport class ASTExplorer extends EventEmitter {\n  private astNodes: Map<string, ASTNode>;\n  private isRunning: boolean;\n  private port: number;\n\n  /**\n   * Create a new ASTExplorer instance\n   *\n   * @param port - WebSocket port for AST explorer\n   */\n  constructor(port: number = 24681) {\n    super();\n\n    this.astNodes = new Map();\n    this.isRunning = false;\n    this.port = port;\n  }\n\n  /**\n   * Start the AST explorer\n   */\n  async start(): Promise<void> {\n    if (this.isRunning) {\n      console.warn('AST explorer is already running');\n      return;\n    }\n\n    try {\n      // Start WebSocket server for AST explorer communication\n      await this.startWebSocketServer();\n\n      this.isRunning = true;\n      console.log(`AST explorer started on port ${this.port}`);\n\n      this.emit('started');\n    } catch (error) {\n      console.error('Failed to start AST explorer:', error);\n      this.emit('error', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Stop the AST explorer\n   */\n  async stop(): Promise<void> {\n    if (!this.isRunning) {\n      console.warn('AST explorer is not running');\n      return;\n    }\n\n    try {\n      // Clean up WebSocket server\n      await this.stopWebSocketServer();\n\n      this.isRunning = false;\n      console.log('AST explorer stopped');\n\n      this.emit('stopped');\n    } catch (error) {\n      console.error('Failed to stop AST explorer:', error);\n      this.emit('error', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Parse source code and create AST\n   *\n   * @param sourceCode - Source code to parse\n   * @param fileName - File name for the AST\n   * @returns AST root node\n   */\n  parseSourceCode(sourceCode: string, fileName: string): ASTNode {\n    try {\n      // This would integrate with the OrdoJS compiler to get the actual AST\n      // For now, we'll create a placeholder AST structure\n      const astNode: ASTNode = {\n        type: 'Program',\n        position: {\n          start: { line: 1, column: 1 },\n          end: { line: 1, column: sourceCode.length }\n        },\n        children: [],\n        value: sourceCode\n      };\n\n      this.astNodes.set(fileName, astNode);\n      this.emit('astParsed', { fileName, astNode });\n\n      return astNode;\n    } catch (error) {\n      console.error('Failed to parse source code:', error);\n      this.emit('error', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Get AST for a file\n   *\n   * @param fileName - File name\n   * @returns AST node or undefined\n   */\n  getAST(fileName: string): ASTNode | undefined {\n    return this.astNodes.get(fileName);\n  }\n\n  /**\n   * Get all ASTs\n   *\n   * @returns Map of all ASTs\n   */\n  getAllASTs(): Map<string, ASTNode> {\n    return new Map(this.astNodes);\n  }\n\n  /**\n   * Find nodes by type\n   *\n   * @param fileName - File name\n   * @param nodeType - Node type to search for\n   * @returns Array of matching nodes\n   */\n  findNodesByType(fileName: string, nodeType: string): ASTNode[] {\n    const ast = this.astNodes.get(fileName);\n    if (!ast) {\n      return [];\n    }\n\n    return this.findNodesRecursive(ast, nodeType);\n  }\n\n  /**\n   * Find nodes by value\n   *\n   * @param fileName - File name\n   * @param value - Value to search for\n   * @returns Array of matching nodes\n   */\n  findNodesByValue(fileName: string, value: string): ASTNode[] {\n    const ast = this.astNodes.get(fileName);\n    if (!ast) {\n      return [];\n    }\n\n    return this.findNodesByValueRecursive(ast, value);\n  }\n\n  /**\n   * Get node path from root\n   *\n   * @param fileName - File name\n   * @param targetNode - Target node\n   * @returns Array of nodes from root to target\n   */\n  getNodePath(fileName: string, targetNode: ASTNode): ASTNode[] {\n    const ast = this.astNodes.get(fileName);\n    if (!ast) {\n      return [];\n    }\n\n    return this.findNodePath(ast, targetNode);\n  }\n\n  /**\n   * Get AST statistics\n   *\n   * @param fileName - File name\n   * @returns AST statistics\n   */\n  getASTStats(fileName: string): {\n    totalNodes: number;\n    nodeTypes: Record<string, number>;\n    maxDepth: number;\n    averageDepth: number;\n  } {\n    const ast = this.astNodes.get(fileName);\n    if (!ast) {\n      return {\n        totalNodes: 0,\n        nodeTypes: {},\n        maxDepth: 0,\n        averageDepth: 0\n      };\n    }\n\n    const stats = this.calculateASTStats(ast);\n    return stats;\n  }\n\n  /**\n   * Clear all ASTs\n   */\n  clearASTs(): void {\n    this.astNodes.clear();\n    this.emit('astsCleared');\n  }\n\n  /**\n   * Recursively find nodes by type\n   *\n   * @param node - Current node\n   * @param nodeType - Node type to search for\n   * @returns Array of matching nodes\n   */\n  private findNodesRecursive(node: ASTNode, nodeType: string): ASTNode[] {\n    const results: ASTNode[] = [];\n\n    if (node.type === nodeType) {\n      results.push(node);\n    }\n\n    if (node.children) {\n      for (const child of node.children) {\n        results.push(...this.findNodesRecursive(child, nodeType));\n      }\n    }\n\n    return results;\n  }\n\n  /**\n   * Recursively find nodes by value\n   *\n   * @param node - Current node\n   * @param value - Value to search for\n   * @returns Array of matching nodes\n   */\n  private findNodesByValueRecursive(node: ASTNode, value: string): ASTNode[] {\n    const results: ASTNode[] = [];\n\n    if (node.value && node.value.includes(value)) {\n      results.push(node);\n    }\n\n    if (node.children) {\n      for (const child of node.children) {\n        results.push(...this.findNodesByValueRecursive(child, value));\n      }\n    }\n\n    return results;\n  }\n\n  /**\n   * Find path from root to target node\n   *\n   * @param node - Current node\n   * @param targetNode - Target node\n   * @param path - Current path\n   * @returns Path to target node or empty array\n   */\n  private findNodePath(node: ASTNode, targetNode: ASTNode, path: ASTNode[] = []): ASTNode[] {\n    const currentPath = [...path, node];\n\n    if (node === targetNode) {\n      return currentPath;\n    }\n\n    if (node.children) {\n      for (const child of node.children) {\n        const result = this.findNodePath(child, targetNode, currentPath);\n        if (result.length > 0) {\n          return result;\n        }\n      }\n    }\n\n    return [];\n  }\n\n  /**\n   * Calculate AST statistics\n   *\n   * @param node - Root node\n   * @param depth - Current depth\n   * @returns AST statistics\n   */\n  private calculateASTStats(node: ASTNode, depth: number = 0): {\n    totalNodes: number;\n    nodeTypes: Record<string, number>;\n    maxDepth: number;\n    averageDepth: number;\n  } {\n    let totalNodes = 1;\n    const nodeTypes: Record<string, number> = { [node.type]: 1 };\n    let maxDepth = depth;\n    let totalDepth = depth;\n\n    if (node.children) {\n      for (const child of node.children) {\n        const childStats = this.calculateASTStats(child, depth + 1);\n        totalNodes += childStats.totalNodes;\n        maxDepth = Math.max(maxDepth, childStats.maxDepth);\n        totalDepth += childStats.totalNodes * (depth + 1);\n\n        for (const [type, count] of Object.entries(childStats.nodeTypes)) {\n          nodeTypes[type] = (nodeTypes[type] || 0) + count;\n        }\n      }\n    }\n\n    return {\n      totalNodes,\n      nodeTypes,\n      maxDepth,\n      averageDepth: totalDepth / totalNodes\n    };\n  }\n\n  /**\n   * Start WebSocket server for AST explorer communication\n   */\n  private async startWebSocketServer(): Promise<void> {\n    // Implementation for WebSocket server\n    // This would handle communication with the browser extension\n    console.log('Starting WebSocket server for AST explorer...');\n  }\n\n  /**\n   * Stop WebSocket server\n   */\n  private async stopWebSocketServer(): Promise<void> {\n    // Implementation for stopping WebSocket server\n    console.log('Stopping WebSocket server for AST explorer...');\n  }\n}\n"]}