#!/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);