Files
suaveplan/packages/foundation/flow/idempotency/tests/no-disallowed.test.ts
2026-05-27 23:47:53 +01:00

73 lines
2.4 KiB
TypeScript

/**
* Validates that `crypto.randomUUID` and `crypto.subtle` are only used in
* approved files and that no other disallowed globals appear in the source.
*/
import { readdirSync, readFileSync, statSync } from "node:fs";
import { relative, resolve } from "node:path";
import { describe, expect, it } from "@suaveplan/testing/runner";
const SRC_ROOT = resolve(import.meta.dirname, "../src");
// Files approved to use globalThis.crypto.randomUUID / crypto.subtle
const CRYPTO_APPROVED_FILES = new Set(["key/key-generator.ts"]);
function walkFiles(dir: string): string[] {
const results: string[] = [];
for (const entry of readdirSync(dir)) {
const full = resolve(dir, entry);
const stat = statSync(full);
if (stat.isDirectory()) {
results.push(...walkFiles(full));
} else if (
entry.endsWith(".ts") &&
!entry.endsWith(".test.ts") &&
!entry.endsWith(".bench.ts")
) {
results.push(full);
}
}
return results;
}
describe("no-disallowed globals", () => {
it("crypto.randomUUID only used in approved files", {
timeout: 5000,
}, () => {
const files = walkFiles(SRC_ROOT);
const violations: string[] = [];
for (const file of files) {
const rel = relative(SRC_ROOT, file);
const content = readFileSync(file, "utf-8");
if (
content.includes("randomUUID") &&
!CRYPTO_APPROVED_FILES.has(rel)
) {
violations.push(rel);
}
}
expect(violations).toEqual([]);
});
it("crypto.subtle only used in approved files", { timeout: 5000 }, () => {
const files = walkFiles(SRC_ROOT);
const violations: string[] = [];
for (const file of files) {
const rel = relative(SRC_ROOT, file);
const content = readFileSync(file, "utf-8");
if (
(content.includes("crypto.subtle") ||
content.includes("crypto.subtle")) &&
!CRYPTO_APPROVED_FILES.has(rel)
) {
violations.push(rel);
}
}
expect(violations).toEqual([]);
});
it("key-generator.ts is in the approved set", { timeout: 5000 }, () => {
expect(CRYPTO_APPROVED_FILES.has("key/key-generator.ts")).toBe(true);
});
});