157 lines
5.4 KiB
JavaScript
157 lines
5.4 KiB
JavaScript
|
|
const fs = require('fs');
|
||
|
|
const path = require('path');
|
||
|
|
|
||
|
|
// Since we don't have puppeteer or mermaid-cli, create a guide for manual conversion
|
||
|
|
|
||
|
|
const diagrams = [
|
||
|
|
'system-context',
|
||
|
|
'container-architecture',
|
||
|
|
'blockchain-architecture',
|
||
|
|
'workflow-state-machine',
|
||
|
|
'data-flow',
|
||
|
|
'deployment-architecture'
|
||
|
|
];
|
||
|
|
|
||
|
|
console.log('='.repeat(70));
|
||
|
|
console.log('DIAGRAM PNG CONVERSION GUIDE');
|
||
|
|
console.log('='.repeat(70));
|
||
|
|
console.log();
|
||
|
|
console.log('Since automated PNG conversion is not available in this environment,');
|
||
|
|
console.log('here are your options to convert the diagrams:');
|
||
|
|
console.log();
|
||
|
|
console.log('OPTION 1: Mermaid Live (Easiest - No Installation Needed)');
|
||
|
|
console.log('─'.repeat(70));
|
||
|
|
console.log('1. Go to: https://mermaid.live');
|
||
|
|
console.log('2. Upload or paste content from each .mermaid file');
|
||
|
|
console.log('3. Click the menu icon (hamburger) → Download');
|
||
|
|
console.log('4. Choose "Download as PNG"');
|
||
|
|
console.log();
|
||
|
|
console.log('Files to convert:');
|
||
|
|
diagrams.forEach((d, i) => {
|
||
|
|
console.log(` ${i+1}. ${d}.mermaid → ${d}.png`);
|
||
|
|
});
|
||
|
|
console.log();
|
||
|
|
console.log('OPTION 2: Using NPM mermaid-cli');
|
||
|
|
console.log('─'.repeat(70));
|
||
|
|
console.log('Local installation (no sudo needed):');
|
||
|
|
console.log(' npm install --save-dev @mermaid-js/mermaid-cli');
|
||
|
|
console.log();
|
||
|
|
console.log('Then run:');
|
||
|
|
diagrams.forEach(d => {
|
||
|
|
console.log(` npx mmdc -i ${d}.mermaid -o ${d}.png -t dark -b transparent`);
|
||
|
|
});
|
||
|
|
console.log();
|
||
|
|
console.log('Or batch convert all:');
|
||
|
|
console.log(' for file in *.mermaid; do');
|
||
|
|
console.log(' npx mmdc -i "$file" -o "${file%.mermaid}.png" -t dark -b transparent');
|
||
|
|
console.log(' done');
|
||
|
|
console.log();
|
||
|
|
console.log('OPTION 3: Using Docker');
|
||
|
|
console.log('─'.repeat(70));
|
||
|
|
diagrams.forEach(d => {
|
||
|
|
console.log(`docker run --rm -v $(pwd):/data mermaid/mermaid-cli:latest \\`);
|
||
|
|
console.log(` -i /data/${d}.mermaid -o /data/${d}.png -t dark -b transparent`);
|
||
|
|
console.log();
|
||
|
|
});
|
||
|
|
console.log('OPTION 4: Browser Screenshot Method');
|
||
|
|
console.log('─'.repeat(70));
|
||
|
|
console.log('1. Open each .html file in your browser:');
|
||
|
|
diagrams.forEach(d => {
|
||
|
|
console.log(` file:///sessions/cool-elegant-faraday/mnt/Goa-GEL/${d}.html`);
|
||
|
|
});
|
||
|
|
console.log();
|
||
|
|
console.log('2. Use browser DevTools:');
|
||
|
|
console.log(' - Press F12');
|
||
|
|
console.log(' - Right-click on diagram → Inspect');
|
||
|
|
console.log(' - In DevTools, use Capture Node Screenshot');
|
||
|
|
console.log();
|
||
|
|
console.log('3. Or use system screenshot tool:');
|
||
|
|
console.log(' - Take screenshot of rendered diagram');
|
||
|
|
console.log(' - Crop and save as PNG');
|
||
|
|
console.log();
|
||
|
|
console.log('OPTION 5: Using Online Converter with CLI');
|
||
|
|
console.log('─'.repeat(70));
|
||
|
|
console.log('Using curl to convert via kroki.io:');
|
||
|
|
diagrams.forEach(d => {
|
||
|
|
console.log(`curl -X POST --data-binary @${d}.mermaid \\`);
|
||
|
|
console.log(` -H "Content-Type: text/plain" \\`);
|
||
|
|
console.log(` https://kroki.io/mermaid/png -o ${d}.png`);
|
||
|
|
});
|
||
|
|
console.log();
|
||
|
|
console.log('='.repeat(70));
|
||
|
|
console.log('CURRENT STATUS');
|
||
|
|
console.log('='.repeat(70));
|
||
|
|
console.log();
|
||
|
|
console.log('✓ Created 6 mermaid diagram files (.mermaid)');
|
||
|
|
console.log('✓ Created 6 HTML preview files (.html)');
|
||
|
|
console.log('✓ Created comprehensive README.md');
|
||
|
|
console.log();
|
||
|
|
console.log('Next: Choose one of the 5 options above to create PNG files');
|
||
|
|
console.log();
|
||
|
|
|
||
|
|
// Try Option 5: kroki.io if curl is available
|
||
|
|
console.log('ATTEMPTING: Option 5 (kroki.io online converter)...');
|
||
|
|
console.log('─'.repeat(70));
|
||
|
|
|
||
|
|
const exec = require('child_process').exec;
|
||
|
|
|
||
|
|
const convertWithKroki = (diagram) => {
|
||
|
|
return new Promise((resolve) => {
|
||
|
|
const mermaidFile = path.join(__dirname, `${diagram}.mermaid`);
|
||
|
|
const pngFile = path.join(__dirname, `${diagram}.png`);
|
||
|
|
|
||
|
|
if (!fs.existsSync(mermaidFile)) {
|
||
|
|
console.log(`✗ ${diagram}.mermaid not found`);
|
||
|
|
resolve(false);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
exec(`curl -s -X POST --data-binary @"${mermaidFile}" -H "Content-Type: text/plain" https://kroki.io/mermaid/png -o "${pngFile}"`, (error) => {
|
||
|
|
if (error) {
|
||
|
|
console.log(`✗ ${diagram}: ${error.message.split('\n')[0]}`);
|
||
|
|
resolve(false);
|
||
|
|
} else {
|
||
|
|
// Verify file was created and has content
|
||
|
|
if (fs.existsSync(pngFile) && fs.statSync(pngFile).size > 0) {
|
||
|
|
console.log(`✓ ${diagram}.png created (${(fs.statSync(pngFile).size / 1024).toFixed(1)} KB)`);
|
||
|
|
resolve(true);
|
||
|
|
} else {
|
||
|
|
console.log(`✗ ${diagram}: Failed to create PNG`);
|
||
|
|
resolve(false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
});
|
||
|
|
};
|
||
|
|
|
||
|
|
// Try kroki conversion sequentially
|
||
|
|
(async () => {
|
||
|
|
console.log();
|
||
|
|
let successCount = 0;
|
||
|
|
for (const diagram of diagrams) {
|
||
|
|
const success = await convertWithKroki(diagram);
|
||
|
|
if (success) successCount++;
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log();
|
||
|
|
console.log('─'.repeat(70));
|
||
|
|
if (successCount === diagrams.length) {
|
||
|
|
console.log(`✓ ALL DIAGRAMS CONVERTED SUCCESSFULLY (${successCount}/${diagrams.length})`);
|
||
|
|
console.log();
|
||
|
|
console.log('PNG files created:');
|
||
|
|
diagrams.forEach(d => {
|
||
|
|
const pngPath = path.join(__dirname, `${d}.png`);
|
||
|
|
if (fs.existsSync(pngPath)) {
|
||
|
|
const size = (fs.statSync(pngPath).size / 1024).toFixed(1);
|
||
|
|
console.log(` ✓ ${d}.png (${size} KB)`);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
} else if (successCount > 0) {
|
||
|
|
console.log(`⚠ PARTIAL SUCCESS: ${successCount}/${diagrams.length} diagrams converted`);
|
||
|
|
} else {
|
||
|
|
console.log('✗ Kroki conversion failed (network may be unreachable)');
|
||
|
|
console.log('Use one of the manual options above');
|
||
|
|
}
|
||
|
|
console.log();
|
||
|
|
})();
|