31 lines
1.3 KiB
JavaScript
31 lines
1.3 KiB
JavaScript
import * as path from "node:path";
|
|
import { fileURLToPath } from "node:url";
|
|
const exportConstPartialTrueRe = /export\s+const\s+partial\s*=\s*true/;
|
|
const leadingComponentRe = /^\s*<\s*([A-Za-z][A-Za-z0-9]*)\b/;
|
|
function shouldAddCharset(content, filePath, srcDir) {
|
|
const srcDirPath = fileURLToPath(srcDir).replace(/\\/g, "/");
|
|
const pagesDir = path.posix.join(srcDirPath, "pages");
|
|
const normalizedFilePath = filePath.replace(/\\/g, "/");
|
|
if (!normalizedFilePath.startsWith(pagesDir)) return false;
|
|
const segments = normalizedFilePath.slice(pagesDir.length).split("/");
|
|
if (segments.some((part) => part.startsWith("_"))) return false;
|
|
if (exportConstPartialTrueRe.test(content)) return false;
|
|
const stripped = content.replace(/\{\/\*[\s\S]*?\*\/\}/g, "");
|
|
for (const rawLine of stripped.split("\n")) {
|
|
const line = rawLine.trim();
|
|
if (!line) continue;
|
|
if (line.startsWith("import ") || line.startsWith("export ")) continue;
|
|
if (line.startsWith("//") || line.startsWith("/*")) continue;
|
|
if (line.startsWith("{")) continue;
|
|
const match = leadingComponentRe.exec(line);
|
|
if (match) {
|
|
const tag = match[1];
|
|
if (tag[0] >= "A" && tag[0] <= "Z") return false;
|
|
}
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
export {
|
|
shouldAddCharset
|
|
};
|