computer-scienceangular-roadmapbackend-roadmapblockchain-roadmapdba-roadmapdeveloper-roadmapdevops-roadmapfrontend-roadmapgo-roadmaphactoberfestjava-roadmapjavascript-roadmapnodejs-roadmappython-roadmapqa-roadmapreact-roadmaproadmapstudy-planvue-roadmapweb3-roadmap
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
4.8 KiB
132 lines
4.8 KiB
const fs = require('fs'); |
|
const path = require('path'); |
|
const yaml = require('json-to-pretty-yaml'); |
|
const roadmapMetas = require('./roadmap-metas.cjs'); |
|
|
|
const oldAssetsPath = path.join(__dirname, 'developer-roadmap/public'); |
|
const newAssetsPath = path.join(__dirname, '../public/'); |
|
|
|
// Create JSONs dir |
|
const newJsonsPath = path.join(newAssetsPath, 'jsons'); |
|
if (fs.existsSync(newJsonsPath)) { |
|
fs.rmSync(newJsonsPath, { recursive: true }); |
|
} |
|
|
|
fs.mkdirSync(newJsonsPath); |
|
|
|
// Create PDFs dir |
|
const newPdfsPath = path.join(newAssetsPath, 'pdfs'); |
|
if (fs.existsSync(newPdfsPath)) { |
|
fs.rmSync(newPdfsPath, { recursive: true }); |
|
} |
|
|
|
fs.mkdirSync(newPdfsPath); |
|
|
|
const oldRoadmapsDirPath = path.join(__dirname, 'developer-roadmap/content/roadmaps'); |
|
const newRoadmapsDirPath = path.join(__dirname, '../src/roadmaps'); |
|
|
|
if (fs.existsSync(newRoadmapsDirPath)) { |
|
fs.rmSync(newRoadmapsDirPath, { recursive: true }); |
|
} |
|
|
|
fs.mkdirSync(newRoadmapsDirPath); |
|
|
|
const oldRoadmaps = fs |
|
.readdirSync(oldRoadmapsDirPath) |
|
.map((roadmapDirName) => path.join(oldRoadmapsDirPath, roadmapDirName)); |
|
|
|
const orderInfo = {}; |
|
const typeCounter = { |
|
role: 1, |
|
tool: 1, |
|
}; |
|
|
|
// Calculate the sorting information for the roadmaps |
|
oldRoadmaps.forEach((oldRoadmapPath) => { |
|
const roadmapId = path.basename(oldRoadmapPath).replace(/\d+-/g, '').toLowerCase(); |
|
const oldRoadmapMeta = require(path.join(oldRoadmapPath, 'meta.json')); |
|
|
|
orderInfo[roadmapId] = typeCounter[oldRoadmapMeta.type]; |
|
typeCounter[oldRoadmapMeta.type] += 1; |
|
}); |
|
|
|
// Iterate and create new roadmaps |
|
oldRoadmaps.forEach((oldRoadmapPath) => { |
|
const roadmapId = path.basename(oldRoadmapPath).replace(/\d+-/g, '').toLowerCase(); |
|
|
|
const metaToMerge = roadmapMetas[roadmapId] ?? {}; |
|
const oldRoadmapMeta = require(path.join(oldRoadmapPath, 'meta.json')); |
|
const isTextual = oldRoadmapMeta?.landingPath?.endsWith('.md'); |
|
|
|
const hasContentDir = fs.existsSync(path.join(oldRoadmapPath, 'content')); |
|
|
|
const roadmapFileContent = isTextual |
|
? fs.readFileSync(path.join(oldRoadmapPath, oldRoadmapMeta.landingPath), 'utf8') |
|
: ''; |
|
|
|
const roadmapFileContentWithUpdatedUrls = roadmapFileContent |
|
.replace(/\[\!\[\]\((.+?\.png)\)\]\((.+?\.png)\)/g, '[![](/assets$1)](/assets$2)') |
|
.replace(/\[\!\[\]\((.+?\.svg)\)\]\((.+?\.svg)\)/g, '[![](/assets$1)](/assets$2)') |
|
.replace(/\[\!\[\]\((.+?\.svg)\)\]\((.+?\.png)\)/g, '[![](/assets$1)](/assets$2)') |
|
.replace(/assetshttp\//g, 'http') |
|
.replace(/assetshttps:\/\//g, 'https://') |
|
.replace(/\/http/g, 'http') |
|
.replace(/]\(\/roadmaps\/(.+?)\.png\)/g, '](/assets/roadmaps/$1.png)') |
|
.replace(/]\(\/roadmaps\/(.+?)\.svg\)/g, '](/assets/roadmaps/$1.svg)') |
|
.replace(/<iframe/g, '<iframe class="w-full aspect-video mb-5"') |
|
.replace(/<iframe(.+?)\s?\/>/g, '<iframe$1></iframe>'); |
|
|
|
const hasJson = fs.existsSync(path.join(oldAssetsPath, `/project/${roadmapId}.json`)); |
|
|
|
const newRoadmapMeta = { |
|
...( hasJson ? { jsonUrl: `/jsons/${roadmapId}.json`} : {}), |
|
pdfUrl: `/pdfs/${roadmapId}.pdf`, |
|
order: orderInfo[roadmapId], |
|
featuredTitle: |
|
oldRoadmapMeta.featuredTitle === 'Software Design and Architecture' |
|
? 'Software Design' |
|
: oldRoadmapMeta.featuredTitle, |
|
featuredDescription: oldRoadmapMeta.featuredDescription, |
|
title: oldRoadmapMeta.title, |
|
description: oldRoadmapMeta.description, |
|
isNew: oldRoadmapMeta.isNew, |
|
hasTopics: hasContentDir, |
|
...metaToMerge, |
|
seo: oldRoadmapMeta.seo, |
|
relatedRoadmaps: oldRoadmapMeta.relatedRoadmaps, |
|
sitemap: { |
|
priority: 1, |
|
changefreq: 'monthly', |
|
}, |
|
tags: ['roadmap', 'main-sitemap', `${oldRoadmapMeta.type === 'tool' ? 'skill' : oldRoadmapMeta.type}-roadmap`], |
|
}; |
|
|
|
const frontmatter = yaml.stringify(newRoadmapMeta); |
|
const newRoadmapDirPath = path.join(newRoadmapsDirPath, roadmapId); |
|
const newRoadmapFilePath = path.join(newRoadmapDirPath, `/${roadmapId}.md`); |
|
|
|
fs.mkdirSync(newRoadmapDirPath); |
|
fs.writeFileSync(newRoadmapFilePath, `---\n${frontmatter}---\n\n${roadmapFileContentWithUpdatedUrls}`); |
|
|
|
const jsonFile = path.join(oldAssetsPath, oldRoadmapMeta.jsonUrl || '/unknown'); |
|
const pdfFile = path.join(oldAssetsPath, oldRoadmapMeta.pdfUrl || '/unknown'); |
|
|
|
if (fs.existsSync(jsonFile)) { |
|
fs.copyFileSync(jsonFile, path.join(newJsonsPath, `${roadmapId}.json`)); |
|
} |
|
|
|
if (fs.existsSync(pdfFile)) { |
|
fs.copyFileSync(pdfFile, path.join(newPdfsPath, `${roadmapId}.pdf`)); |
|
} |
|
|
|
// Copy the content directory |
|
const oldRoadmapContentDir = path.join(oldRoadmapPath, 'content'); |
|
if (fs.existsSync(oldRoadmapContentDir)) { |
|
fs.cpSync(oldRoadmapContentDir, path.join(newRoadmapDirPath, 'content'), { recursive: true }); |
|
} |
|
}); |
|
|
|
const roadmapAssets = path.join(oldAssetsPath, 'roadmaps'); |
|
if (fs.existsSync(roadmapAssets)) { |
|
fs.cpSync(roadmapAssets, path.join(newAssetsPath, 'roadmaps'), { recursive: true }); |
|
}
|
|
|