| "use strict"; |
| |
| |
| |
| |
| |
| |
| var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { |
| if (k2 === undefined) k2 = k; |
| var desc = Object.getOwnPropertyDescriptor(m, k); |
| if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { |
| desc = { enumerable: true, get: function() { return m[k]; } }; |
| } |
| Object.defineProperty(o, k2, desc); |
| }) : (function(o, m, k, k2) { |
| if (k2 === undefined) k2 = k; |
| o[k2] = m[k]; |
| })); |
| var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { |
| Object.defineProperty(o, "default", { enumerable: true, value: v }); |
| }) : function(o, v) { |
| o["default"] = v; |
| }); |
| var __importStar = (this && this.__importStar) || (function () { |
| var ownKeys = function(o) { |
| ownKeys = Object.getOwnPropertyNames || function (o) { |
| var ar = []; |
| for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; |
| return ar; |
| }; |
| return ownKeys(o); |
| }; |
| return function (mod) { |
| if (mod && mod.__esModule) return mod; |
| var result = {}; |
| if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); |
| __setModuleDefault(result, mod); |
| return result; |
| }; |
| })(); |
| Object.defineProperty(exports, "__esModule", { value: true }); |
| exports.detectLanguage = detectLanguage; |
| exports.extractFunctions = extractFunctions; |
| exports.extractClasses = extractClasses; |
| exports.extractImports = extractImports; |
| exports.extractExports = extractExports; |
| exports.extractTodos = extractTodos; |
| exports.extractAllPatterns = extractAllPatterns; |
| exports.extractFromFiles = extractFromFiles; |
| exports.toPatternMatches = toPatternMatches; |
| const fs = __importStar(require("fs")); |
| |
| |
| |
| function detectLanguage(file) { |
| const ext = file.split('.').pop()?.toLowerCase() || ''; |
| const langMap = { |
| ts: 'typescript', tsx: 'typescript', js: 'javascript', jsx: 'javascript', |
| rs: 'rust', py: 'python', go: 'go', java: 'java', rb: 'ruby', |
| cpp: 'cpp', c: 'c', h: 'c', hpp: 'cpp', cs: 'csharp', |
| md: 'markdown', json: 'json', yaml: 'yaml', yml: 'yaml', |
| sql: 'sql', sh: 'shell', bash: 'shell', zsh: 'shell', |
| }; |
| return langMap[ext] || ext || 'unknown'; |
| } |
| |
| |
| |
| function extractFunctions(content) { |
| const patterns = [ |
| /function\s+(\w+)/g, |
| /const\s+(\w+)\s*=\s*(?:async\s*)?\([^)]*\)\s*=>/g, |
| /let\s+(\w+)\s*=\s*(?:async\s*)?\([^)]*\)\s*=>/g, |
| /(?:async\s+)?(?:public|private|protected)?\s+(\w+)\s*\([^)]*\)\s*[:{]/g, |
| /(\w+)\s*:\s*(?:async\s*)?\([^)]*\)\s*=>/g, |
| /def\s+(\w+)\s*\(/g, |
| /fn\s+(\w+)\s*[<(]/g, |
| /func\s+(\w+)\s*\(/g, |
| ]; |
| const funcs = new Set(); |
| const reserved = new Set(['if', 'for', 'while', 'switch', 'catch', 'try', 'else', 'return', 'new', 'class', 'function', 'async', 'await']); |
| for (const pattern of patterns) { |
| const regex = new RegExp(pattern.source, pattern.flags); |
| let match; |
| while ((match = regex.exec(content)) !== null) { |
| const name = match[1]; |
| if (name && !reserved.has(name) && name.length > 1) { |
| funcs.add(name); |
| } |
| } |
| } |
| return Array.from(funcs); |
| } |
| |
| |
| |
| function extractClasses(content) { |
| const patterns = [ |
| /class\s+(\w+)/g, |
| /interface\s+(\w+)/g, |
| /type\s+(\w+)\s*=/g, |
| /enum\s+(\w+)/g, |
| /struct\s+(\w+)/g, |
| ]; |
| const classes = new Set(); |
| for (const pattern of patterns) { |
| const regex = new RegExp(pattern.source, pattern.flags); |
| let match; |
| while ((match = regex.exec(content)) !== null) { |
| if (match[1]) |
| classes.add(match[1]); |
| } |
| } |
| return Array.from(classes); |
| } |
| |
| |
| |
| function extractImports(content) { |
| const patterns = [ |
| /import\s+.*?from\s+['"]([^'"]+)['"]/g, |
| /import\s+['"]([^'"]+)['"]/g, |
| /require\s*\(['"]([^'"]+)['"]\)/g, |
| /from\s+(\w+)\s+import/g, |
| /use\s+(\w+(?:::\w+)*)/g, |
| ]; |
| const imports = []; |
| for (const pattern of patterns) { |
| const regex = new RegExp(pattern.source, pattern.flags); |
| let match; |
| while ((match = regex.exec(content)) !== null) { |
| if (match[1]) |
| imports.push(match[1]); |
| } |
| } |
| return [...new Set(imports)]; |
| } |
| |
| |
| |
| function extractExports(content) { |
| const patterns = [ |
| /export\s+(?:default\s+)?(?:class|function|const|let|var|interface|type|enum)\s+(\w+)/g, |
| /export\s*\{\s*([^}]+)\s*\}/g, |
| /module\.exports\s*=\s*(\w+)/g, |
| /exports\.(\w+)\s*=/g, |
| /pub\s+(?:fn|struct|enum|type)\s+(\w+)/g, |
| ]; |
| const exports = []; |
| for (const pattern of patterns) { |
| const regex = new RegExp(pattern.source, pattern.flags); |
| let match; |
| while ((match = regex.exec(content)) !== null) { |
| if (match[1]) { |
| |
| const names = match[1].split(',').map(s => s.trim().split(/\s+as\s+/)[0].trim()); |
| exports.push(...names.filter(n => n && /^\w+$/.test(n))); |
| } |
| } |
| } |
| return [...new Set(exports)]; |
| } |
| |
| |
| |
| function extractTodos(content) { |
| const pattern = /\/\/\s*(TODO|FIXME|HACK|XXX|BUG|NOTE):\s*(.+)/gi; |
| const todos = []; |
| let match; |
| while ((match = pattern.exec(content)) !== null) { |
| todos.push(`${match[1]}: ${match[2].trim()}`); |
| } |
| return todos; |
| } |
| |
| |
| |
| function extractAllPatterns(filePath, content) { |
| try { |
| const fileContent = content ?? (fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf-8') : ''); |
| return { |
| file: filePath, |
| language: detectLanguage(filePath), |
| functions: extractFunctions(fileContent), |
| classes: extractClasses(fileContent), |
| imports: extractImports(fileContent), |
| exports: extractExports(fileContent), |
| todos: extractTodos(fileContent), |
| variables: [], |
| }; |
| } |
| catch { |
| return { |
| file: filePath, |
| language: detectLanguage(filePath), |
| functions: [], |
| classes: [], |
| imports: [], |
| exports: [], |
| todos: [], |
| variables: [], |
| }; |
| } |
| } |
| |
| |
| |
| function extractFromFiles(files, maxFiles = 100) { |
| return files.slice(0, maxFiles).map(f => extractAllPatterns(f)); |
| } |
| |
| |
| |
| function toPatternMatches(patterns) { |
| const matches = []; |
| for (const func of patterns.functions) { |
| matches.push({ type: 'function', match: func, file: patterns.file }); |
| } |
| for (const cls of patterns.classes) { |
| matches.push({ type: 'class', match: cls, file: patterns.file }); |
| } |
| for (const imp of patterns.imports) { |
| matches.push({ type: 'import', match: imp, file: patterns.file }); |
| } |
| for (const exp of patterns.exports) { |
| matches.push({ type: 'export', match: exp, file: patterns.file }); |
| } |
| for (const todo of patterns.todos) { |
| matches.push({ type: 'todo', match: todo, file: patterns.file }); |
| } |
| return matches; |
| } |
| exports.default = { |
| detectLanguage, |
| extractFunctions, |
| extractClasses, |
| extractImports, |
| extractExports, |
| extractTodos, |
| extractAllPatterns, |
| extractFromFiles, |
| toPatternMatches, |
| }; |
|
|