repositories / pi-ext
pi-ext
bugabingas pi extensions
owned by admin
scripts/check_frontmatter.mjs
Raw#!/usr/bin/env node
import { existsSync, readFileSync } from "node:fs";
import { resolve } from "node:path";
import { git, ROOT, rel, run, stripAnsi } from "./lib/common.mjs";
function markdownFiles() {
const paths = process.argv.slice(2);
if (paths.length > 0) return paths.map((path) => resolve(path));
return git(["ls-files", "-co", "--exclude-standard", "-z", "--", "*.md"], {
capture: true,
})
.stdout.split("\0")
.filter(Boolean)
.map((path) => resolve(ROOT, path));
}
let failed = false;
for (const path of markdownFiles()) {
if (!existsSync(path)) continue;
const markdown = readFileSync(path, "utf8");
if (
markdown !== "---" &&
!markdown.startsWith("---\n") &&
!markdown.startsWith("---\r\n")
)
continue;
if (!markdown.split(/\r?\n/).slice(1).includes("---")) {
failed = true;
console.error(`${rel(path)}: missing closing frontmatter fence`);
continue;
}
const result = run("yq", ["--front-matter", "extract", ".", path], {
capture: true,
check: false,
});
if (result.status === 0) continue;
failed = true;
const message =
result.error?.code === "ENOENT"
? "yq not found"
: stripAnsi(result.stderr || result.stdout || "invalid frontmatter");
console.error(`${rel(path)}: ${message}`);
}
process.exit(failed ? 1 : 0);