@ordojs/dev-tools
Version:
Advanced developer tools for OrdoJS with component inspector, AST explorer, and performance profiling
1 lines • 14.2 kB
Source Map (JSON)
{"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"]}