import { readFileSync } from "node:fs"; import { resolve } from "node:path"; import { describe, expect, it } from "@suaveplan/testing/runner"; const PKG_JSON = JSON.parse( readFileSync(resolve(__dirname, "..", "package.json"), "utf8") ) as { dependencies?: Record; devDependencies?: Record; }; describe("dep-graph", () => { it("declares the four required runtime suaveplan deps", { timeout: 5000, }, () => { const deps = PKG_JSON.dependencies ?? {}; expect(deps["@suaveplan/api-types"]).toBeDefined(); expect(deps["@suaveplan/error"]).toBeDefined(); expect(deps["@suaveplan/events"]).toBeDefined(); expect(deps["@suaveplan/fsm"]).toBeDefined(); expect(deps["@suaveplan/retry"]).toBeDefined(); }); it("uses workspace ranges for internal deps", { timeout: 5000 }, () => { const deps = PKG_JSON.dependencies ?? {}; for (const [name, range] of Object.entries(deps)) { if (name.startsWith("@suaveplan/")) { expect(range, `${name} should use workspace range`).toMatch( /^workspace:/ ); } } }); it("root barrel has no export-star", { timeout: 5000 }, () => { const indexSrc = readFileSync( resolve(__dirname, "..", "src", "index.ts"), "utf8" ); // Forbid `export *` per CLAUDE.md rule 10. Namespace re-exports // (`export * as X`) are not used here. expect(/export\s+\*\s+from/.test(indexSrc)).toBe(false); expect(/export\s+\*\s+as/.test(indexSrc)).toBe(false); }); });