import { promises as fs } from "fs"; import path from "path"; import minimist from "minimist"; const args = minimist(process.argv.slice(2)); const mode = args["blog"] ? "blog" : args["docs"] ? "docs" : "all"; const fileExists = async (filePath) => { try { await fs.access(filePath); return true; } catch { return false; } }; // Function to delete or update specific lines from a file const manageLinesInFile = async ( action, filePath, startLine, endLine, updatedContent = "", ) => { if (!(await fileExists(filePath))) { console.log(`File ${filePath} does not exist.`); return; } try { const data = await fs.readFile(filePath, "utf8"); const lines = data.split("\n"); if (endLine === null || endLine === undefined) { endLine = startLine; } if (action === "update") { lines.splice(startLine - 1, endLine - startLine + 1, updatedContent); } else if (action === "remove") { lines.splice(startLine - 1, endLine - startLine + 1); } else { throw new Error('Invalid action. Use "update" or "remove".'); } await fs.writeFile(filePath, lines.join("\n"), "utf8"); const relativePath = path.basename(filePath); if (startLine === endLine) { console.log( `${relativePath} : ${action === "update" ? "Updated" : "Removed"} line ${startLine}`, ); } else { console.log( `${relativePath} : ${action === "update" ? "Updated" : "Removed"} lines ${startLine} to ${endLine}`, ); } } catch (err) { console.error(`Error modifying file ${filePath}:`, err); } }; const deleteFolderRecursive = async (folderPath) => { if (!(await fileExists(folderPath))) { console.log(`${folderPath} does not exist.`); return; } const stat = await fs.stat(folderPath); if (stat.isDirectory()) { const files = await fs.readdir(folderPath); await Promise.all( files.map((file) => deleteFolderRecursive(`${folderPath}/${file}`)), ); await fs.rmdir(folderPath); } else { await fs.unlink(folderPath); } }; (async () => { if (!mode) return; const appDir = path.join(process.cwd(), "app"); const configDir = path.join(process.cwd(), "config"); const componentsDir = path.join(process.cwd(), "components"); const contentDir = path.join(process.cwd(), "content"); const contentlayerPath = path.join(process.cwd(), "contentlayer.config.ts"); const nextConfigPath = path.join(process.cwd(), "next.config.js"); const staticDir = path.join(process.cwd(), "public", "_static"); const typesDir = path.join(process.cwd(), "types"); switch (mode) { case "blog": console.log("Deleting blog-related content only\n"); // contentlayer.config.ts await manageLinesInFile('update', contentlayerPath, 109, null, "documentTypes: [Page, Doc],"); await manageLinesInFile('remove', contentlayerPath, 43, 90); // docs.ts await manageLinesInFile('remove', path.join(configDir, "docs.ts"), 31, 34); await manageLinesInFile('remove', path.join(configDir, "docs.ts"), 5, 8); // marketing.ts await manageLinesInFile('remove', path.join(configDir, "marketing.ts"), 5, 8); // remove folders & files await deleteFolderRecursive(path.join(appDir, "(marketing)", "(blog-post)")); await deleteFolderRecursive(path.join(appDir, "(marketing)", "blog")); await deleteFolderRecursive(path.join(componentsDir, "content", "author.tsx")); await deleteFolderRecursive(path.join(componentsDir, "content", "blog-card.tsx")); await deleteFolderRecursive(path.join(componentsDir, "content", "blog-header-layout.tsx")); await deleteFolderRecursive(path.join(componentsDir, "content", "blog-posts.tsx")); await deleteFolderRecursive(path.join(contentDir, "blog")); await deleteFolderRecursive(path.join(contentDir, "docs", "configuration", "blog.mdx")); await deleteFolderRecursive(path.join(configDir, "blog.ts")); await deleteFolderRecursive(path.join(staticDir, "avatars")); console.log("\nDone."); break; case "docs": console.log("Deleting docs-related content only\n"); // contentlayer.config.ts await manageLinesInFile('update', contentlayerPath, 109, null, "documentTypes: [Page, Post],"); await manageLinesInFile('remove', contentlayerPath, 23, 42); // hero-landing.tsx await manageLinesInFile('update', path.join(componentsDir, "sections", "hero-landing.tsx"), 37, null, 'href="/login"'); await manageLinesInFile('update', path.join(componentsDir, "sections", "hero-landing.tsx"), 44, null, "Go to Login Page"); // mobile-nav.tsx await manageLinesInFile('remove', path.join(componentsDir, "layout", "mobile-nav.tsx"), 124, 129); await manageLinesInFile('update', path.join(componentsDir, "layout", "mobile-nav.tsx"), 21, 29, "const links = marketingConfig.mainNav;"); await manageLinesInFile('remove', path.join(componentsDir, "layout", "mobile-nav.tsx"), 13, null); await manageLinesInFile('remove', path.join(componentsDir, "layout", "mobile-nav.tsx"), 9, null); await manageLinesInFile('remove', path.join(componentsDir, "layout", "mobile-nav.tsx"), 5, null); // navbar.tsx await manageLinesInFile('update', path.join(componentsDir, "layout", "navbar.tsx"), 29, null, "const links = marketingConfig.mainNav;"); await manageLinesInFile('remove', path.join(componentsDir, "layout", "navbar.tsx"), 81, 102); await manageLinesInFile('remove', path.join(componentsDir, "layout", "navbar.tsx"), 48, null); await manageLinesInFile('remove', path.join(componentsDir, "layout", "navbar.tsx"), 31, 38); await manageLinesInFile('remove', path.join(componentsDir, "layout", "navbar.tsx"), 15, null); await manageLinesInFile('remove', path.join(componentsDir, "layout", "navbar.tsx"), 8, null); // dashboard.ts await manageLinesInFile('remove', path.join(configDir, "dashboard.ts"), 38, null); // marketing.ts await manageLinesInFile('remove', path.join(configDir, "marketing.ts"), 9, 12); // types/index.d.ts await manageLinesInFile('remove', path.join(typesDir, "index.d.ts"), 34, 44); // remove folders & files await deleteFolderRecursive(path.join(appDir, "(docs)")); await deleteFolderRecursive(path.join(componentsDir, "docs")); await deleteFolderRecursive(path.join(configDir, "docs.ts")); await deleteFolderRecursive(path.join(contentDir, "docs")); await deleteFolderRecursive(path.join(staticDir, "docs")); console.log("\nDone."); break; default: console.log("Deleting all content\n"); // hero-landing.tsx await manageLinesInFile('update', path.join(componentsDir, "sections", "hero-landing.tsx"), 37, null, 'href="/login"'); await manageLinesInFile('update', path.join(componentsDir, "sections", "hero-landing.tsx"), 44, null, "Go to Login Page"); // mobile-nav.tsx await manageLinesInFile('remove', path.join(componentsDir, "layout", "mobile-nav.tsx"), 124, 129); await manageLinesInFile('update', path.join(componentsDir, "layout", "mobile-nav.tsx"), 21, 29, "const links = marketingConfig.mainNav;"); await manageLinesInFile('remove', path.join(componentsDir, "layout", "mobile-nav.tsx"), 13, null); await manageLinesInFile('remove', path.join(componentsDir, "layout", "mobile-nav.tsx"), 9, null); await manageLinesInFile('remove', path.join(componentsDir, "layout", "mobile-nav.tsx"), 5, null); // navbar.tsx await manageLinesInFile('update', path.join(componentsDir, "layout", "navbar.tsx"), 29, null, "const links = marketingConfig.mainNav;"); await manageLinesInFile('remove', path.join(componentsDir, "layout", "navbar.tsx"), 81, 102); await manageLinesInFile('remove', path.join(componentsDir, "layout", "navbar.tsx"), 48, null); await manageLinesInFile('remove', path.join(componentsDir, "layout", "navbar.tsx"), 31, 38); await manageLinesInFile('remove', path.join(componentsDir, "layout", "navbar.tsx"), 15, null); await manageLinesInFile('remove', path.join(componentsDir, "layout", "navbar.tsx"), 8, null); // config files await manageLinesInFile('remove', path.join(configDir, "dashboard.ts"), 38, null); await manageLinesInFile('remove', path.join(configDir, "marketing.ts"), 5, 12); // types/index.d.ts await manageLinesInFile('remove', path.join(typesDir, "index.d.ts"), 34, 44); // next.config.js await manageLinesInFile('update', nextConfigPath, 30, null, "module.exports = nextConfig;"); await manageLinesInFile('remove', nextConfigPath, 1, 2); // remove folders & files await deleteFolderRecursive(path.join(appDir, "(docs)")); await deleteFolderRecursive(path.join(appDir, "(marketing)", "(blog-post)")); await deleteFolderRecursive(path.join(appDir, "(marketing)", "[slug]")); await deleteFolderRecursive(path.join(appDir, "(marketing)", "blog")); await deleteFolderRecursive(path.join(componentsDir, "content")); await deleteFolderRecursive(path.join(componentsDir, "docs")); await deleteFolderRecursive(path.join(configDir, "blog.ts")); await deleteFolderRecursive(path.join(configDir, "docs.ts")); await deleteFolderRecursive(contentDir); await deleteFolderRecursive(path.join(staticDir, "avatars")); await deleteFolderRecursive(path.join(staticDir, "blog")); await deleteFolderRecursive(path.join(staticDir, "docs")); await deleteFolderRecursive(path.join(process.cwd(), "styles", "mdx.css")); await deleteFolderRecursive("contentlayer.config.ts"); await deleteFolderRecursive(path.join(process.cwd(), ".contentlayer")); console.log("\nDone."); break; } })();