Luigit
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);