seedproject-web/content-pipeline/scripts/list-drafts.mjs

39 lines
1.4 KiB
JavaScript
Raw Normal View History

#!/usr/bin/env node
// List pending drafts awaiting review.
// Usage: node content-pipeline/scripts/list-drafts.mjs
import { readdirSync, existsSync, readFileSync } from "node:fs";
import { dirname, resolve, join } from "node:path";
import { fileURLToPath } from "node:url";
import { loadJson, readFrontmatter, fmString } from "./lib/util.mjs";
const HERE = dirname(fileURLToPath(import.meta.url));
const PIPELINE = resolve(HERE, "..");
const cfg = loadJson(join(PIPELINE, "config.json"));
const draftsRoot = join(cfg.paths.projectRoot, cfg.paths.draftsDir);
if (!existsSync(draftsRoot)) {
console.log("No drafts directory yet.");
process.exit(0);
}
const dirs = readdirSync(draftsRoot, { withFileTypes: true }).filter((d) => d.isDirectory());
if (!dirs.length) {
console.log("No drafts pending.");
process.exit(0);
}
console.log(`Pending drafts (${dirs.length}):\n`);
for (const d of dirs) {
const mdx = join(draftsRoot, d.name, "index.mdx");
const hasCover = existsSync(join(draftsRoot, d.name, "cover.jpg"));
let title = "(no index.mdx)";
let cat = "";
if (existsSync(mdx)) {
const fm = readFrontmatter(readFileSync(mdx, "utf8"));
title = fmString(fm, "title") || d.name;
cat = fmString(fm, "category") || "";
}
console.log(`${d.name}`);
console.log(` ${title}${cat ? ` [${cat}]` : ""} cover:${hasCover ? "yes" : "NO"}`);
console.log(` approve: node content-pipeline/scripts/approve.mjs ${d.name}\n`);
}