39 lines
1.2 KiB
JavaScript
39 lines
1.2 KiB
JavaScript
import { readdir, readFile } from "node:fs/promises";
|
|
import { extname, join, relative } from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
const outputDirectory = fileURLToPath(new URL("../out/", import.meta.url));
|
|
const scannedExtensions = new Set([".html", ".js", ".txt"]);
|
|
const forbiddenEndpoint = "api.github.com";
|
|
|
|
async function collectFiles(directory) {
|
|
const entries = await readdir(directory, { withFileTypes: true });
|
|
const files = [];
|
|
|
|
for (const entry of entries) {
|
|
const path = join(directory, entry.name);
|
|
if (entry.isDirectory()) {
|
|
files.push(...(await collectFiles(path)));
|
|
} else if (scannedExtensions.has(extname(entry.name))) {
|
|
files.push(path);
|
|
}
|
|
}
|
|
|
|
return files;
|
|
}
|
|
|
|
const files = await collectFiles(outputDirectory);
|
|
const violations = [];
|
|
|
|
for (const file of files) {
|
|
if ((await readFile(file, "utf8")).includes(forbiddenEndpoint)) {
|
|
violations.push(relative(outputDirectory, file));
|
|
}
|
|
}
|
|
|
|
if (violations.length > 0) {
|
|
throw new Error(`Static export contains browser-visible GitHub API endpoints:\n${violations.join("\n")}`);
|
|
}
|
|
|
|
console.log(`Static export verified: ${files.length} files contain no GitHub API endpoints.`);
|