parent
af8a79c48d
commit
ba1b876e14
3 changed files with 390 additions and 1 deletions
@ -0,0 +1,237 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/frontend</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2021-09-04T17:09:59.269Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/backend</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2021-09-04T17:10:19.270Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/devops</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2021-09-04T17:10:44.437Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/react</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2021-09-04T17:11:05.241Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/postgresql-dba</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2021-09-04T17:04:01.161Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/android</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2021-09-04T17:04:18.383Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/qa</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2021-09-04T17:01:41.946Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/ci-cd</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-07-09T19:59:14.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/sso</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-07-01T19:59:14.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/oauth</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-06-28T19:59:14.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/jwt-authentication</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-06-20T19:59:14.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/token-authentication</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-06-02T20:59:14.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/session-authentication</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-05-26T20:59:14.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/basic-authentication</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-05-19T20:59:14.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/character-encodings</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-05-14T20:59:14.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/unfamiliar-codebase</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-05-04T20:59:14.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/why-build-it-and-they-will-come-wont-work-anymore</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-05-04T12:59:14.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/dhcp-in-one-picture</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-04-28T15:48:21.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/ssl-tls-https-ssh</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-04-22T15:48:21.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/asymptotic-notation</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-04-03T15:48:21.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/big-o-notation</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-03-15T15:48:21.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/random-numbers</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-03-14T15:48:21.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/scaling-databases</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-02-18T15:48:21.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/what-is-internet</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-02-29T15:48:21.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/torrent-client</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-01-17T15:48:21.191Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/levels-of-seniority</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2019-12-03T12:13:00.860Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/design-patterns-for-humans</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2019-10-09T12:00:00.860Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/journey-to-http2</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2018-12-04T12:00:00.860Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/dns-in-one-picture</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2018-12-04T12:00:00.860Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/http-caching</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2018-11-29T17:00:00.860Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/history-of-javascript</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2017-10-28T17:00:00.860Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides/proxy-servers</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2020-07-24T12:40:18</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/about</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2021-09-04T18:03:52.068Z</lastmod> |
||||||
|
<priority>0.8</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/guides</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2021-09-04T20:56:05.377Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2021-09-04T20:58:19.326Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/roadmaps</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2021-09-04T18:05:27.986Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/signup</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2021-09-04T18:05:54.681Z</lastmod> |
||||||
|
<priority>0.9</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/thanks</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2021-09-04T17:38:08.556Z</lastmod> |
||||||
|
<priority>0.5</priority> |
||||||
|
</url> |
||||||
|
<url> |
||||||
|
<loc>https://roadmap.sh/watch</loc> |
||||||
|
<changefreq>monthly</changefreq> |
||||||
|
<lastmod>2021-09-04T18:06:47.417Z</lastmod> |
||||||
|
<priority>1.0</priority> |
||||||
|
</url> |
||||||
|
</urlset> |
@ -0,0 +1,149 @@ |
|||||||
|
// This is a development script executed in the build step of pages
|
||||||
|
const fs = require('fs'); |
||||||
|
const path = require('path'); |
||||||
|
const glob = require('glob'); |
||||||
|
const guides = require('../content/guides.json'); |
||||||
|
const roadmaps = require('../content/roadmaps.json'); |
||||||
|
|
||||||
|
const DOMAIN = 'https://roadmap.sh'; |
||||||
|
const PAGES_DIR = path.join(__dirname, '../pages'); |
||||||
|
const STORAGE_PATH = path.join(__dirname, '../content'); |
||||||
|
const SITEMAP_PATH = path.join(__dirname, '../public/sitemap.xml'); |
||||||
|
|
||||||
|
const PAGES_PATH = path.join(__dirname, '../pages'); |
||||||
|
const ROADMAPS_PATH = path.join(__dirname, '../content/roadmaps'); |
||||||
|
const GUIDES_PATH = path.join(__dirname, '../content/guides'); |
||||||
|
|
||||||
|
// Set the header
|
||||||
|
const xmlHeader = `<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">`;
|
||||||
|
|
||||||
|
// Wrap all pages in <urlset> tags
|
||||||
|
const xmlUrlWrapper = nodes => `${xmlHeader} |
||||||
|
${nodes} |
||||||
|
</urlset>`; |
||||||
|
|
||||||
|
function getSlugPriority(pageSlug) { |
||||||
|
if (pageSlug === '/') { |
||||||
|
return '1.0'; |
||||||
|
} |
||||||
|
|
||||||
|
const slugPriorities = [ |
||||||
|
[ |
||||||
|
'/roadmaps', |
||||||
|
'/guides', |
||||||
|
'/watch', |
||||||
|
'/podcasts' |
||||||
|
], // 1.0
|
||||||
|
['/signup'], // 0.9
|
||||||
|
['/about'] // 0.8
|
||||||
|
]; |
||||||
|
|
||||||
|
const foundIndex = slugPriorities.findIndex( |
||||||
|
routes => routes.some(route => pageSlug.startsWith(route)) |
||||||
|
); |
||||||
|
|
||||||
|
if (foundIndex !== -1) { |
||||||
|
return parseFloat((10 - foundIndex) / 10) |
||||||
|
.toFixed(1); |
||||||
|
} |
||||||
|
|
||||||
|
return 0.5; |
||||||
|
} |
||||||
|
|
||||||
|
function getPageRoutes() { |
||||||
|
const files = glob.sync(`${PAGES_PATH}/**/*.tsx`, { |
||||||
|
ignore: [ |
||||||
|
'**/_*.tsx', // private non-page files e.g. _document.js
|
||||||
|
'**/[[]*[]].tsx', // Ignore dynamic pages i.e. `page/[something].js` files
|
||||||
|
'**/[[]*[]]/*.tsx', // Ignore files inside dynamic pages i.e. `[something]/abc.js`
|
||||||
|
'**/components/*.tsx' // Ignore the component files
|
||||||
|
] |
||||||
|
}); |
||||||
|
|
||||||
|
const pageRoutes = {}; |
||||||
|
files.forEach(file => { |
||||||
|
const pageName = file.replace(PAGES_PATH, '').replace('.tsx', ''); |
||||||
|
const pagePath = pageName.replace('/index', '') || '/'; |
||||||
|
|
||||||
|
pageRoutes[pagePath] = { page: `${pageName}` }; |
||||||
|
}); |
||||||
|
|
||||||
|
return pageRoutes; |
||||||
|
} |
||||||
|
|
||||||
|
function generateNode({ |
||||||
|
slug, |
||||||
|
basePath, |
||||||
|
fileName, |
||||||
|
priority = null, |
||||||
|
date = null, |
||||||
|
frequency = 'monthly' |
||||||
|
}) { |
||||||
|
const pagePath = path.join(basePath, fileName); |
||||||
|
let pageStats = {}; |
||||||
|
try { |
||||||
|
pageStats = fs.lstatSync(pagePath); |
||||||
|
} catch (e) { |
||||||
|
console.log(`File not found: ${pagePath}`); |
||||||
|
pageStats = { mtime: (new Date()) }; |
||||||
|
} |
||||||
|
|
||||||
|
return `<url>
|
||||||
|
<loc>${DOMAIN}${slug}</loc> |
||||||
|
<changefreq>${frequency}</changefreq> |
||||||
|
<lastmod>${date || pageStats.mtime.toISOString()}</lastmod> |
||||||
|
<priority>${priority || getSlugPriority(slug)}</priority> |
||||||
|
</url>`; |
||||||
|
} |
||||||
|
|
||||||
|
function generateSiteMap() { |
||||||
|
const pageRoutes = getPageRoutes(); |
||||||
|
const pageSlugs = Object.keys(pageRoutes) |
||||||
|
.filter(route => ![ |
||||||
|
'/privacy', |
||||||
|
'/terms' |
||||||
|
].includes(route)); |
||||||
|
|
||||||
|
const pagesChunk = pageSlugs.map(pageSlug => { |
||||||
|
return generateNode({ |
||||||
|
basePath: PAGES_DIR, |
||||||
|
fileName: `${pageRoutes[pageSlug].page}.tsx`, |
||||||
|
slug: pageSlug |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
const guidesChunk = guides.map(guide => { |
||||||
|
return generateNode({ |
||||||
|
basePath: GUIDES_PATH, |
||||||
|
fileName: `${guide.id}.md`, |
||||||
|
slug: `/guides/${guide.id}`, |
||||||
|
date: guide.updatedAt, |
||||||
|
priority: '1.0' |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
const roadmapsChunk = roadmaps.map((roadmap, roadmapCounter) => { |
||||||
|
return generateNode({ |
||||||
|
basePath: ROADMAPS_PATH, |
||||||
|
fileName: `${roadmapCounter + 1}-${roadmap.id}/meta.json`, |
||||||
|
slug: `/${roadmap.id}`, |
||||||
|
date: roadmap.updatedAt, |
||||||
|
priority: '1.0' |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
const nodes = [ |
||||||
|
...roadmapsChunk, |
||||||
|
...guidesChunk, |
||||||
|
...pagesChunk |
||||||
|
]; |
||||||
|
|
||||||
|
const sitemap = `${xmlUrlWrapper(nodes.join('\n'))}`; |
||||||
|
|
||||||
|
fs.writeFileSync(SITEMAP_PATH, sitemap); |
||||||
|
|
||||||
|
console.log(`sitemap.xml with ${nodes.length} entries was written to ${SITEMAP_PATH}`); |
||||||
|
} |
||||||
|
|
||||||
|
generateSiteMap(); |
Loading…
Reference in new issue