testeranto
Version:
the AI powered BDD test framework for typescript projects
98 lines (97 loc) • 3.51 kB
JavaScript
/* eslint-disable @typescript-eslint/no-unused-vars */
import fs from "fs";
import path from "path";
import { execSync } from "child_process";
export function runGoList(pattern) {
try {
// Handle directory paths by using '.' for the current directory when appropriate
let processedPattern = pattern;
// If it's a directory that exists, try to use it as a package path
if (fs.existsSync(pattern)) {
const stat = fs.statSync(pattern);
if (stat.isDirectory()) {
// Change to that directory and use '.' to list the current package
// But this might not work if the directory isn't a valid Go package
// So we'll try to use the relative path from the module root
const cwd = process.cwd();
try {
// Try to run go list from the target directory
const output = execSync(`go list -mod=readonly -json .`, {
encoding: "utf-8",
cwd: pattern,
stdio: ["pipe", "pipe", "pipe"],
});
return parseGoListOutput(output);
}
catch (error) {
// If that fails, fall back to using the absolute path as a pattern
processedPattern = pattern;
}
}
else if (stat.isFile() && pattern.endsWith(".go")) {
// For .go files, use their directory
processedPattern = path.dirname(pattern);
}
}
// Try to run go list with the processed pattern
const output = execSync(`go list -mod=readonly -json "${processedPattern}"`, {
encoding: "utf-8",
cwd: process.cwd(),
stdio: ["pipe", "pipe", "pipe"],
});
return parseGoListOutput(output);
}
catch (error) {
console.warn(`Error running 'go list -json ${pattern}':`, error);
// Return empty array instead of trying fallbacks that will likely also fail
return [];
}
}
// Helper function to parse the JSON output from go list
function parseGoListOutput(output) {
// The output is a sequence of JSON objects, not a JSON array
// We need to split them and parse individually
const objects = [];
let buffer = "";
let depth = 0;
let inString = false;
let escapeNext = false;
for (const char of output) {
if (escapeNext) {
buffer += char;
escapeNext = false;
continue;
}
if (char === "\\") {
escapeNext = true;
buffer += char;
continue;
}
if (char === '"') {
inString = !inString;
}
if (!inString) {
if (char === "{") {
depth++;
}
else if (char === "}") {
depth--;
if (depth === 0) {
try {
objects.push(JSON.parse(buffer + char));
buffer = "";
continue;
}
catch (e) {
console.warn("Failed to parse JSON object:", buffer + char);
buffer = "";
}
}
}
}
if (depth > 0 || buffer.length > 0) {
buffer += char;
}
}
return objects;
}