testeranto
Version:
the AI powered BDD test framework for typescript projects
137 lines (136 loc) • 5.5 kB
JavaScript
/* eslint-disable @typescript-eslint/no-explicit-any */
import fs from "fs";
import path from "path";
// import { runGoList } from "../golingvuMetafile/goList";
// export function findGoFilesInProject(): string[] {
// // Use go list to find all Go files in the current module
// // const packages = runGoList("./...");
// const goFiles: string[] = [];
// for (const pkg of packages) {
// // Include all Go files including test files
// const fileTypes = [
// "GoFiles",
// "CgoFiles",
// "IgnoredGoFiles",
// "TestGoFiles",
// "XTestGoFiles",
// ];
// for (const fileType of fileTypes) {
// const files = (pkg as any)[fileType];
// if (files) {
// for (const file of files) {
// // Only include files with .go extension
// if (file.endsWith(".go")) {
// goFiles.push(path.join(pkg.Dir, file));
// }
// }
// }
// }
// }
// // Filter out any non-.go files that might have slipped through
// return goFiles.filter((file) => file.endsWith(".go"));
// }
export function collectGoDependencies(filePath, visited = new Set()) {
// Only process .go files
if (!filePath.endsWith(".go")) {
return [];
}
if (visited.has(filePath))
return [];
visited.add(filePath);
const dependencies = [filePath];
// Find the package this file belongs to by looking at the directory
const dir = path.dirname(filePath);
// Always include other .go files in the same directory
try {
const files = fs.readdirSync(dir);
for (const file of files) {
if (file.endsWith(".go") && file !== path.basename(filePath)) {
const fullPath = path.join(dir, file);
dependencies.push(fullPath);
}
}
}
catch (error) {
console.warn(`Could not read directory ${dir}:`, error);
}
// Parse imports from the file content to find local imports
try {
const content = fs.readFileSync(filePath, "utf-8");
const importRegex = /import\s*(?:\(\s*([\s\S]*?)\s*\)|"([^"]+)")/g;
let match;
while ((match = importRegex.exec(content)) !== null) {
if (match[2]) {
// Single import
const importPath = match[2].trim();
processImport(importPath, dir, dependencies, visited);
}
else if (match[1]) {
// Multi-line imports in parentheses
const importBlock = match[1];
const importLines = importBlock
.split("\n")
.map((line) => line.trim())
.filter((line) => line.length > 0 && !line.startsWith("//"));
for (const line of importLines) {
const lineMatch = line.match(/"([^"]+)"/);
if (lineMatch) {
const importPath = lineMatch[1].trim();
processImport(importPath, dir, dependencies, visited);
}
}
}
}
}
catch (error) {
console.warn(`Could not read file ${filePath} for import parsing:`, error);
}
return [...new Set(dependencies)];
}
function processImport(importPath, currentDir, dependencies, visited) {
// Check if it's a standard library import (no dots in first path element)
const firstPathElement = importPath.split("/")[0];
const isExternal = firstPathElement.includes(".");
// If it's not external, it's either standard library or local
// For local imports, they should be relative to the current module root
if (!isExternal) {
// Try to find the imported file locally
// Look in vendor directory first (common for Go projects)
const potentialPaths = [
path.join(process.cwd(), "vendor", importPath),
path.join(currentDir, importPath),
path.join(process.cwd(), importPath),
path.join(process.cwd(), "src", importPath),
];
for (const potentialPath of potentialPaths) {
// Check if it's a directory with .go files
if (fs.existsSync(potentialPath) &&
fs.statSync(potentialPath).isDirectory()) {
try {
const files = fs.readdirSync(potentialPath);
for (const file of files) {
// Only process .go files that aren't test files
if (file.endsWith(".go") && !file.endsWith("_test.go")) {
const fullPath = path.join(potentialPath, file);
// Ensure we're only adding .go files
dependencies.push(...collectGoDependencies(fullPath, visited));
}
}
break;
}
catch (error) {
console.warn(`Could not read directory ${potentialPath}:`, error);
}
}
// Check if it's a .go file directly
const goFilePath = potentialPath + ".go";
if (fs.existsSync(goFilePath) && fs.statSync(goFilePath).isFile()) {
// Ensure it's a .go file
if (goFilePath.endsWith(".go")) {
dependencies.push(...collectGoDependencies(goFilePath, visited));
break;
}
}
}
}
}