import fs from 'node:fs/promises'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import type { Node } from '@roadmapsh/editor'; import matter from 'gray-matter'; import type { RoadmapFrontmatter } from '../src/lib/roadmap'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // Directory containing the roadmaps const ROADMAP_CONTENT_DIR = path.join(__dirname, '../src/data/roadmaps'); const allRoadmaps = await fs.readdir(ROADMAP_CONTENT_DIR); const editorRoadmapIds = new Set(); for (const roadmapId of allRoadmaps) { const roadmapFrontmatterDir = path.join( ROADMAP_CONTENT_DIR, roadmapId, `${roadmapId}.md`, ); const roadmapFrontmatterRaw = await fs.readFile( roadmapFrontmatterDir, 'utf-8', ); const { data } = matter(roadmapFrontmatterRaw); const roadmapFrontmatter = data as RoadmapFrontmatter; if (roadmapFrontmatter.renderer === 'editor') { editorRoadmapIds.add(roadmapId); } } for (const roadmapId of editorRoadmapIds) { const roadmapJSONDir = path.join( ROADMAP_CONTENT_DIR, roadmapId, `${roadmapId}.json`, ); const roadmapJSONRaw = await fs.readFile(roadmapJSONDir, 'utf-8'); const roadmapJSON = JSON.parse(roadmapJSONRaw); const roadmapNodes = roadmapJSON.nodes as Node[]; const updatedNodes = roadmapNodes.map((node) => { const width = +(node?.width || node?.style?.width || 0); const height = +(node?.height || node?.style?.height || 0); const ADDITIONAL_WIDTH = 1; // adding one `1px` in width to avoid the node to be cut in half // this is a quick fix to avoid the issue if (node?.style?.width) { node.style.width = width + ADDITIONAL_WIDTH; } if (node?.width) { node.width = width + ADDITIONAL_WIDTH; } return { ...node, measured: { width: width + ADDITIONAL_WIDTH, height, }, }; }); const updatedRoadmapJSON = { ...roadmapJSON, nodes: updatedNodes, }; const updatedRoadmapJSONString = JSON.stringify(updatedRoadmapJSON, null, 2); await fs.writeFile(roadmapJSONDir, updatedRoadmapJSONString, 'utf-8'); }