import { readFileSync } from "node:fs"; import { join } from "node:path"; import { describe, expect, it } from "@suaveplan/testing/runner"; describe("dep-graph", () => { it("runtime deps are locked to the approved set", { timeout: 5000, }, () => { const pkg = JSON.parse( readFileSync(join(__dirname, "..", "package.json"), "utf8") ) as { dependencies?: Record }; const runtime = Object.keys(pkg.dependencies ?? {}).sort(); expect(runtime).toEqual([ "@suaveplan/crypto-cipher", "@suaveplan/crypto-curve", "@suaveplan/crypto-hash", "@suaveplan/crypto-utils", "@suaveplan/error", "@suaveplan/types", "tslib", "zod", ]); }); it("no peerDependencies", { timeout: 5000 }, () => { const pkg = JSON.parse( readFileSync(join(__dirname, "..", "package.json"), "utf8") ) as { peerDependencies?: Record }; expect(pkg.peerDependencies).toBeUndefined(); }); it("does not depend on any @noble/* package directly", { timeout: 5000, }, () => { // Every @noble/* import must go through one of the @suaveplan/crypto-* // selector packages. check-crypto-selects enforces the impl routing. const pkg = JSON.parse( readFileSync(join(__dirname, "..", "package.json"), "utf8") ) as { dependencies?: Record }; const nobleDeps = Object.keys(pkg.dependencies ?? {}).filter((d) => d.startsWith("@noble/") ); expect(nobleDeps).toEqual([]); }); });