openpetswithchatandmcp/scripts/test-plugins.mjs
2026-05-24 16:32:31 +02:00

66 lines
1.9 KiB
JavaScript

#!/usr/bin/env node
import { spawnSync } from "node:child_process";
import { readdir } from "node:fs/promises";
import { join } from "node:path";
import { fileURLToPath } from "node:url";
const repoRoot = fileURLToPath(new URL("..", import.meta.url));
const officialDir = join(repoRoot, "plugins", "official");
const files = [];
const tests = [];
async function pathExists(path) {
try {
await readdir(path);
return true;
} catch (error) {
if (error.code === "ENOENT") return false;
throw error;
}
}
async function collectPluginChecks() {
if (!(await pathExists(officialDir))) return;
const plugins = await readdir(officialDir, { withFileTypes: true });
for (const plugin of plugins) {
if (!plugin.isDirectory() || plugin.name.startsWith(".")) continue;
const pluginDir = join(officialDir, plugin.name);
files.push(join(pluginDir, "index.js"));
await collectTestFiles(pluginDir);
}
}
async function collectTestFiles(dir) {
const entries = await readdir(dir, { withFileTypes: true });
for (const entry of entries) {
if (entry.name.startsWith(".")) continue;
const path = join(dir, entry.name);
if (entry.isDirectory()) {
await collectTestFiles(path);
} else if (entry.isFile() && entry.name === "test.js") {
files.push(path);
tests.push(path);
}
}
}
await collectPluginChecks();
if (files.length === 0) {
console.log("No plugin JavaScript files found.");
process.exit(0);
}
for (const file of files) {
const result = spawnSync(process.execPath, ["--check", file], { stdio: "inherit" });
if (result.status !== 0) process.exit(result.status ?? 1);
}
for (const file of tests) {
const result = spawnSync(process.execPath, [file], { stdio: "inherit" });
if (result.status !== 0) process.exit(result.status ?? 1);
}
console.log(`Checked ${files.length} plugin JavaScript file${files.length === 1 ? "" : "s"}; ran ${tests.length} plugin test${tests.length === 1 ? "" : "s"}.`);