repositories / pi-ext
pi-ext
bugabingas pi extensions
owned by admin
scripts/build/verify-cli.ts
Rawimport { existsSync, readFileSync } from "node:fs";
import { join } from "node:path";
import { allExtensionNames, DIST_ROOT, ROOT } from "./build.ts";
import { verifyCollection, verifyPackage } from "./verify.ts";
export async function main(argv = process.argv.slice(2)): Promise<number> {
const collection = argv.includes("--collection");
const selected = argv.filter((arg) => arg !== "--collection");
const names = selected.length
? selected
: allExtensionNames().filter((name) =>
existsSync(join(DIST_ROOT, name, "package.json")),
);
if (!names.length) {
console.error("no generated packages under dist/; run //:build-ext first");
return 1;
}
if (collection) {
const report = await verifyCollection(
names.map((name) => join(DIST_ROOT, name)),
);
for (const error of report.errors)
console.error(`ERROR collection: ${error}`);
for (const conflict of report.conflicts)
console.error(`ERROR collection: ${conflict}`);
if (report.ok)
console.log(
`OK collection: ${report.extensions.length} extensions, ${report.skills.length} skills, no conflicts`,
);
return report.ok ? 0 : 1;
}
let failed = 0;
for (const name of names) {
const dir = join(DIST_ROOT, name);
if (!existsSync(join(dir, "package.json"))) {
failed += 1;
console.error(`ERROR ${name}: no generated package at ${dir}`);
continue;
}
const source = JSON.parse(
readFileSync(join(ROOT, "extensions", name, "package.json"), "utf8"),
) as { "pi-ext"?: { externals?: Record<string, string> } };
const report = await verifyPackage(dir, {
externals: source["pi-ext"]?.externals,
});
if (report.ok) {
const registered = report.extensions
.map((e) => `${e.tools.length} tools, ${e.commands.length} commands`)
.join("; ");
console.log(`OK ${name}: loads relocated (${registered})`);
continue;
}
failed += 1;
for (const error of report.errors) console.error(`ERROR ${name}: ${error}`);
for (const spec of report.forbiddenImports)
console.error(`ERROR ${name}: forbidden import ${spec}`);
}
return failed ? 1 : 0;
}
process.exitCode = await main();