Luigit
repositories / pi-ext

pi-ext

bugabingas pi extensions

owned by admin

scripts/build/verify-cli.ts

Raw
import { 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();