jirehgrp
Version:
Scaffold frontend apps from Jireh templates (Next.js, React+Vite, Vanilla, etc.)
68 lines (67 loc) • 3.12 kB
JavaScript
// src/readmeGenerator.ts
import fs from "node:fs";
import path from "node:path";
import prompts from "prompts";
import degit from "degit";
import { readmeRegistry } from "./registry.js";
export async function writeReadme(targetDir, options) {
const { projectName, templateLabel, description = "A project created with jirehgrp-CLI", packageName = projectName, usage = "npm run dev", license = "MIT", includeGeneratedBy = true, } = options;
const templateEntry = readmeRegistry[templateLabel.toLowerCase()] || readmeRegistry["minimal"];
const tmpDir = path.join(targetDir, ".tmp_readme");
fs.mkdirSync(tmpDir, { recursive: true });
try {
const emitter = degit(templateEntry.repo, { cache: false, force: true });
await emitter.clone(tmpDir);
const templatePath = templateEntry.subdir
? path.join(tmpDir, templateEntry.subdir)
: path.join(tmpDir, "README.md");
console.log("🟢 tmpDir:", tmpDir);
console.log("🟢 Looking for README template at:", templatePath);
function listFilesRecursively(dir, prefix = "") {
const entries = fs.readdirSync(dir, { withFileTypes: true });
let results = [];
for (const entry of entries) {
const fullPath = path.join(dir, entry.name);
const relPath = path.join(prefix, entry.name);
if (entry.isDirectory()) {
results = results.concat(listFilesRecursively(fullPath, relPath));
}
else {
results.push(relPath);
}
}
return results;
}
console.log("🟢 Cloned temp folder contents:");
console.log(listFilesRecursively(tmpDir).map(f => " " + f).join("\n"));
if (!fs.existsSync(templatePath)) {
throw new Error(`README template not found: ${templatePath}`);
}
let templateContent = fs.readFileSync(templatePath, "utf-8");
const generatedByLine = "> Generated with ❤️ using the jirehgrp-CLI.";
let content = templateContent
.replace(/{{name}}/g, projectName)
.replace(/{{description}}/g, description)
.replace(/{{packageName}}/g, packageName)
.replace(/{{usage}}/g, usage)
.replace(/{{license}}/g, license)
.replace(/{{generatedByPlaceholder}}/g, includeGeneratedBy ? generatedByLine : "");
const response = await prompts({
type: "text",
name: "customContent",
message: "Edit the README content (leave empty to keep generated version):",
initial: content,
});
if (response.customContent && response.customContent.trim() !== "") {
content = response.customContent;
}
const outPath = path.join(targetDir, "README.md");
fs.writeFileSync(outPath, content, "utf-8");
console.log("✅ README.md generated");
}
finally {
if (fs.existsSync(tmpDir)) {
fs.rmSync(tmpDir, { recursive: true, force: true });
}
}
}