import { readFile, stat } from "node:fs/promises";
import path from "node:path";
import { fileURLToPath } from "node:url";
const siteRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
const errors = [];
const requiredFiles = [
"index.html",
"en.html",
"styles.css",
"app.js",
"language.js",
"release-index.js",
"assets/goodbuddy-light.png",
"assets/goodbuddy-dark.png",
"assets/linux-plain.svg",
"assets/devicon-LICENSE",
"assets/fonts/inter-latin-variable.woff2",
"assets/fonts/inter-OFL.txt",
"scripts/app.test.mjs",
"scripts/release-index.test.mjs",
"README.md",
];
const report = (condition, message) => {
if (!condition) {
errors.push(message);
}
};
const readSiteFile = async (relativePath) => {
try {
return await readFile(path.join(siteRoot, relativePath), "utf8");
} catch {
errors.push(`缺少文件:${relativePath}`);
return "";
}
};
await Promise.all(
requiredFiles.map(async (relativePath) => {
try {
const fileStats = await stat(path.join(siteRoot, relativePath));
report(fileStats.isFile(), `不是普通文件:${relativePath}`);
} catch {
errors.push(`缺少文件:${relativePath}`);
}
}),
);
const [html, englishHtml, css, appJs, languageJs, releaseIndexJs, fontLicense] =
await Promise.all([
readSiteFile("index.html"),
readSiteFile("en.html"),
readSiteFile("styles.css"),
readSiteFile("app.js"),
readSiteFile("language.js"),
readSiteFile("release-index.js"),
readSiteFile("assets/fonts/inter-OFL.txt"),
]);
for (const [relativePath, content] of [
["index.html", html],
["en.html", englishHtml],
["styles.css", css],
["app.js", appJs],
["language.js", languageJs],
["release-index.js", releaseIndexJs],
]) {
report(!/[ \t]+$/m.test(content), `${relativePath} 包含行尾空白`);
report(!content.includes("\t"), `${relativePath} 包含 Tab 缩进`);
}
report(//.test(html), "页面语言必须是 zh-CN");
report(//.test(englishHtml), "英文页面语言必须是 en");
report(//.test(
html,
),
"canonical 地址必须指向 GitHub Pages 正式站点",
);
report(
//.test(
englishHtml,
),
"英文 canonical 地址必须指向 GitHub Pages 英文站点",
);
for (const [relativePath, content] of [
["index.html", html],
["en.html", englishHtml],
]) {
report(
/hreflang="zh-CN"\s+href="https:\/\/mesalogo\.github\.io\/goodbuddy\/"/.test(content),
`${relativePath} 缺少中文 alternate 链接`,
);
report(
/hreflang="en"\s+href="https:\/\/mesalogo\.github\.io\/goodbuddy\/en\.html"/.test(
content,
),
`${relativePath} 缺少英文 alternate 链接`,
);
report(
/