| const fs = require('fs'); |
| const path = require('path'); |
| |
| function isMarkdownFile(file) { |
| return file.endsWith('.md') || file.endsWith('.mdx'); |
| } |
| |
| function removeFirstCommentAfterFrontmatter(content, ext) { |
| const frontmatterRegex = /^---\n([\s\S]*?)\n---\n*/; |
| const frontmatterMatch = content.match(frontmatterRegex); |
| |
| if (!frontmatterMatch) return content; |
| |
| const frontmatter = frontmatterMatch[0]; |
| const rest = content.slice(frontmatter.length); |
| |
| let commentRegex; |
| if (ext === '.mdx') { |
| // MDX: JSX-style comment |
| commentRegex = /^([\s\n]*?)\{\/\*[\s\S]*?\*\/\}\s*/; |
| } else { |
| // MD: HTML-style comment |
| commentRegex = /^([\s\n]*?)<!--[\s\S]*?-->\s*/; |
| } |
| |
| const newRest = rest.replace(commentRegex, ''); |
| |
| return frontmatter + newRest; |
| } |
| |
| function processFile(filePath) { |
| const ext = path.extname(filePath); |
| const content = fs.readFileSync(filePath, 'utf8'); |
| const updated = removeFirstCommentAfterFrontmatter(content, ext); |
| |
| if (updated !== content) { |
| fs.writeFileSync(filePath, updated, 'utf8'); |
| console.log(`✅ Updated: ${filePath}`); |
| } else { |
| console.log(`⏭ Skipped (no changes): ${filePath}`); |
| } |
| } |
| |
| function processDirectory(dirPath) { |
| const entries = fs.readdirSync(dirPath, { withFileTypes: true }); |
| |
| for (const entry of entries) { |
| const fullPath = path.join(dirPath, entry.name); |
| |
| if (entry.isDirectory()) { |
| processDirectory(fullPath); // recursive |
| } else if (entry.isFile() && isMarkdownFile(entry.name)) { |
| processFile(fullPath); |
| } |
| } |
| } |
| |
| // Usage: node clean-meta-comments.js ./docs |
| const inputDir = process.argv[2]; |
| if (!inputDir) { |
| console.error('❌ Please provide a directory path.\nUsage: node clean-meta-comments.js ./docs'); |
| process.exit(1); |
| } |
| |
| processDirectory(path.resolve(inputDir)); |