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