UNPKG

summarizer-cli

Version:

CLI tool to summarize functions or whole file using LLM

132 lines (111 loc) 4.82 kB
import fs from 'fs/promises'; import path from 'path'; export const extractFunctionFromFile = async (filePath, functionName) => { const fileContent = await fs.readFile(filePath, 'utf-8'); const fileExtension = path.extname(filePath).toLowerCase(); const language = getLanguageFromExtension(fileExtension); const patterns = getFunctionPatterns(language, functionName); for (const pattern of patterns) { const match = fileContent.match(pattern); if (match && match.length > 0) { return match[0].trim(); } } throw new Error(`Function "${functionName}" not found in ${filePath}`); } const getLanguageFromExtension = (extension) => { const languageMap = { '.js': 'javascript', '.jsx': 'javascript', '.ts': 'typescript', '.tsx': 'typescript', '.py': 'python', '.java': 'java', '.cpp': 'cpp', '.c': 'c', '.cs': 'csharp', '.php': 'php', '.rb': 'ruby', '.go': 'go', '.rs': 'rust', '.kt': 'kotlin', '.swift': 'swift' }; return languageMap[extension] || 'unknown'; } const getFunctionPatterns = (language, functionName) => { const escapedName = functionName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); switch (language) { case 'javascript': case 'typescript': return [ new RegExp(`function\\s+${escapedName}\\s*\\([^)]*\\)\\s*{[\\s\\S]*?^}`, 'gm'), new RegExp(`(?:const|let|var)\\s+${escapedName}\\s*=\\s*(?:async\\s+)?\\([^)]*\\)\\s*=>\\s*{[\\s\\S]*?^}`, 'gm'), new RegExp(`(?:const|let|var)\\s+${escapedName}\\s*=\\s*(?:async\\s+)?[^=\\s]+\\s*=>\\s*{[\\s\\S]*?^}`, 'gm'), new RegExp(`${escapedName}\\s*\\([^)]*\\)\\s*{[\\s\\S]*?^\\s*}`, 'gm'), new RegExp(`async\\s+function\\s+${escapedName}\\s*\\([^)]*\\)\\s*{[\\s\\S]*?^}`, 'gm'), new RegExp(`(?:async\\s+)?${escapedName}\\s*\\([^)]*\\)\\s*{[\\s\\S]*?^\\s*}`, 'gm'), new RegExp(`export\\s+(?:async\\s+)?function\\s+${escapedName}\\s*\\([^)]*\\)\\s*{[\\s\\S]*?^}`, 'gm') ]; case 'python': return [ new RegExp(`def\\s+${escapedName}\\s*\\([^)]*\\):[\\s\\S]*?(?=^\\S|^def\\s|^class\\s|^$|\\Z)`, 'gm'), new RegExp(`async\\s+def\\s+${escapedName}\\s*\\([^)]*\\):[\\s\\S]*?(?=^\\S|^def\\s|^class\\s|^async\\s+def\\s|^$|\\Z)`, 'gm'), new RegExp(`def\\s+${escapedName}\\s*\\([^)]*\\):[\\s\\S]*?(?=^\\s{0,4}\\S|^$|\\Z)`, 'gm') ]; case 'java': return [ new RegExp(`(?:public|private|protected)?\\s*(?:static)?\\s*(?:final)?\\s*(?:\\w+\\s+)?${escapedName}\\s*\\([^)]*\\)\\s*(?:throws\\s+[\\w,\\s]+)?\\s*{[\\s\\S]*?^\\s*}`, 'gm') ]; case 'cpp': case 'c': return [ new RegExp(`(?:\\w+\\s+)*${escapedName}\\s*\\([^)]*\\)\\s*{[\\s\\S]*?^}`, 'gm'), new RegExp(`\\w+\\s+${escapedName}\\s*\\([^)]*\\)\\s*{[\\s\\S]*?^}`, 'gm') ]; case 'csharp': return [ new RegExp(`(?:public|private|protected|internal)?\\s*(?:static)?\\s*(?:virtual|override)?\\s*(?:async)?\\s*\\w+\\s+${escapedName}\\s*\\([^)]*\\)\\s*{[\\s\\S]*?^\\s*}`, 'gm') ]; case 'php': return [ new RegExp(`function\\s+${escapedName}\\s*\\([^)]*\\)\\s*{[\\s\\S]*?^}`, 'gm'), new RegExp(`(?:public|private|protected)?\\s*(?:static)?\\s*function\\s+${escapedName}\\s*\\([^)]*\\)\\s*{[\\s\\S]*?^\\s*}`, 'gm') ]; case 'ruby': return [ new RegExp(`def\\s+${escapedName}[\\s\\S]*?^end`, 'gm') ]; case 'go': return [ new RegExp(`func\\s+${escapedName}\\s*\\([^)]*\\)(?:\\s*\\([^)]*\\))?\\s*{[\\s\\S]*?^}`, 'gm'), new RegExp(`func\\s*\\([^)]*\\)\\s*${escapedName}\\s*\\([^)]*\\)(?:\\s*\\([^)]*\\))?\\s*{[\\s\\S]*?^}`, 'gm') ]; case 'rust': return [ new RegExp(`fn\\s+${escapedName}\\s*\\([^)]*\\)(?:\\s*->\\s*[^{]+)?\\s*{[\\s\\S]*?^}`, 'gm') ]; case 'kotlin': return [ new RegExp(`fun\\s+${escapedName}\\s*\\([^)]*\\)(?:\\s*:\\s*[^{]+)?\\s*{[\\s\\S]*?^}`, 'gm') ]; case 'swift': return [ new RegExp(`func\\s+${escapedName}\\s*\\([^)]*\\)(?:\\s*->\\s*[^{]+)?\\s*{[\\s\\S]*?^}`, 'gm') ]; default: // Fallback - Common Patterns return [ new RegExp(`function\\s+${escapedName}\\s*\\([^)]*\\)\\s*{[\\s\\S]*?^}`, 'gm'), new RegExp(`def\\s+${escapedName}\\s*\\([^)]*\\):[\\s\\S]*?(?=^\\S|^def\\s|^class\\s|^$|\\Z)`, 'gm'), new RegExp(`${escapedName}\\s*\\([^)]*\\)\\s*{[\\s\\S]*?^}`, 'gm') ]; } } export async function extractFunctionFromFileAdvanced(filePath, functionName) { try { return await extractFunctionFromFile(filePath, functionName); } catch (error) { throw error; } }