import * as fs from 'fs'; import * as path from 'path'; const MDX_DIR = path.join(process.cwd(), 'content/blog'); /** * Convert all Mermaid children syntax back to graph prop, * BUT use a regular double-quoted string with escaped newlines instead of template literals. * * MDXRemote RSC strips template literals! * * Convert: * * {`graph TD * A --> B`} * * * To: * B"} id="..." title="..." showShare={true} /> */ function convertToPlainStringProp(content: string): string { // Match {\`...\`} const mermaidChildrenRegex = /]*?)>\s*\{`([\s\S]*?)`\}\s*<\/Mermaid>/g; return content.replace(mermaidChildrenRegex, (match, propsStr, graphContent) => { // Escape double quotes in the graph content const escapedGraph = graphContent .replace(/\\/g, '\\\\') // escape backslashes first .replace(/"/g, '\\"') // escape double quotes .replace(/\n/g, '\\n'); // escape newlines // Clean up props string const cleanProps = propsStr.trim(); return ``; }); } function processFiles() { const files = fs.readdirSync(MDX_DIR).filter(f => f.endsWith('.mdx')); let fixCount = 0; for (const file of files) { const filePath = path.join(MDX_DIR, file); const content = fs.readFileSync(filePath, 'utf8'); const fixed = convertToPlainStringProp(content); if (content !== fixed) { fs.writeFileSync(filePath, fixed); fixCount++; console.log(`✅ Converted to plain string: ${file}`); } else { console.log(`- ${file} (no Mermaid children found)`); } } console.log(`\nTotal converted: ${fixCount}`); } processFiles();