UNPKG

jirehgrp

Version:

Scaffold frontend apps from Jireh templates (Next.js, React+Vite, Vanilla, etc.)

68 lines (67 loc) 3.12 kB
// 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 }); } } }