import { readFile } from "node:fs/promises"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import { describe, expect, it } from "vitest"; const here = dirname(fileURLToPath(import.meta.url)); const pkgPath = resolve(here, "..", "package.json"); describe("dep-graph guard", () => { it("no @suaveplan/* in dependencies or peerDependencies", { timeout: 5000, }, async () => { const pkg = JSON.parse(await readFile(pkgPath, "utf8")) as { dependencies?: Record; peerDependencies?: Record; }; const sections: Array< [ "dependencies" | "peerDependencies", Record | undefined, ] > = [ ["dependencies", pkg.dependencies], ["peerDependencies", pkg.peerDependencies], ]; for (const [name, deps] of sections) { if (!deps) continue; const offending = Object.keys(deps).filter((k) => k.startsWith("@suaveplan/") ); expect( offending, `${name} contains @suaveplan/* deps: ${offending.join(", ")}` ).toEqual([]); } }); it("devDependencies may contain @suaveplan/testing only", { timeout: 5000, }, async () => { const pkg = JSON.parse(await readFile(pkgPath, "utf8")) as { devDependencies?: Record; }; const ours = Object.keys(pkg.devDependencies ?? {}).filter((k) => k.startsWith("@suaveplan/") ); const allowed = new Set(["@suaveplan/testing"]); for (const dep of ours) { expect( allowed.has(dep), `unexpected @suaveplan/* devDep: ${dep}` ).toBe(true); } }); it("cloakbrowser is a direct dependency", { timeout: 5000 }, async () => { const pkg = JSON.parse(await readFile(pkgPath, "utf8")) as { dependencies?: Record; }; expect(pkg.dependencies?.cloakbrowser).toBeDefined(); // Either a catalog reference or an absolute range is acceptable. expect(pkg.dependencies?.cloakbrowser).toMatch( /^(catalog:testing|\^?\d|~?\d|\d)/ ); }); });