47 lines
1.4 KiB
TypeScript
47 lines
1.4 KiB
TypeScript
import { readFileSync } from "node:fs";
|
|
import { join, resolve } from "node:path";
|
|
import { describe, expect, it } from "@suaveplan/testing/runner";
|
|
|
|
const PKG_ROOT = resolve(__dirname, "..");
|
|
const PKG_JSON = JSON.parse(
|
|
readFileSync(join(PKG_ROOT, "package.json"), "utf8")
|
|
) as { exports: Record<string, unknown>; dependencies: Record<string, string> };
|
|
|
|
const REQUIRED_SURFACES = [
|
|
".",
|
|
"./karaoke",
|
|
"./karaoke/lrc-parser",
|
|
"./karaoke/use-lyrics",
|
|
"./karaoke/lyrics-display",
|
|
"./error-codes",
|
|
];
|
|
|
|
describe("subpath exports", () => {
|
|
it("every public surface has a subpath entry", { timeout: 5000 }, () => {
|
|
for (const surface of REQUIRED_SURFACES) {
|
|
expect(PKG_JSON.exports[surface]).toBeDefined();
|
|
}
|
|
});
|
|
|
|
it("sideEffects=false", { timeout: 5000 }, () => {
|
|
const raw = JSON.parse(
|
|
readFileSync(join(PKG_ROOT, "package.json"), "utf8")
|
|
) as { sideEffects: boolean };
|
|
expect(raw.sideEffects).toBe(false);
|
|
});
|
|
|
|
it("runtime dependency set matches allowlist", {
|
|
timeout: 5000,
|
|
}, () => {
|
|
const deps = Object.keys(PKG_JSON.dependencies).sort();
|
|
expect(deps).toEqual(
|
|
[
|
|
"@suaveplan/error",
|
|
"@suaveplan/react-audio",
|
|
"@suaveplan/types",
|
|
"tslib",
|
|
].sort()
|
|
);
|
|
});
|
|
});
|