mirror of
https://github.com/kamranahmedse/developer-roadmap.git
synced 2025-08-26 02:25:35 +02:00
Add sitemap generation
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
import { defineConfig } from 'astro/config';
|
import { defineConfig } from 'astro/config';
|
||||||
import { shouldIndexPage } from './src/lib/sitemap';
|
import { serializeSitemap, shouldIndexPage } from './sitemap.mjs';
|
||||||
|
|
||||||
// https://astro.build/config
|
// https://astro.build/config
|
||||||
import tailwind from '@astrojs/tailwind';
|
import tailwind from '@astrojs/tailwind';
|
||||||
@@ -29,6 +29,7 @@ export default defineConfig({
|
|||||||
}),
|
}),
|
||||||
sitemap({
|
sitemap({
|
||||||
filter: shouldIndexPage,
|
filter: shouldIndexPage,
|
||||||
|
serialize: serializeSitemap,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
54
sitemap.mjs
Normal file
54
sitemap.mjs
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
import path from 'node:path';
|
||||||
|
import fs from 'node:fs/promises';
|
||||||
|
|
||||||
|
async function getRoadmapIds() {
|
||||||
|
return fs.readdir(path.join(process.cwd(), 'src/roadmaps'));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function shouldIndexPage(page) {
|
||||||
|
return ![
|
||||||
|
'https://roadmap.sh/404/',
|
||||||
|
'https://roadmap.sh/terms/',
|
||||||
|
'https://roadmap.sh/privacy/',
|
||||||
|
].includes(page);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function serializeSitemap(item) {
|
||||||
|
const highPriorityPages = [
|
||||||
|
'https://roadmap.sh/',
|
||||||
|
'https://roadmap.sh/about/',
|
||||||
|
'https://roadmap.sh/roadmaps/',
|
||||||
|
'https://roadmap.sh/guides/',
|
||||||
|
'https://roadmap.sh/videos/',
|
||||||
|
...(await getRoadmapIds()).map((id) => `https://roadmap.sh/${id}/`),
|
||||||
|
];
|
||||||
|
|
||||||
|
// Roadmaps and other high priority pages
|
||||||
|
for (let pageUrl of highPriorityPages) {
|
||||||
|
if (item.url === pageUrl) {
|
||||||
|
return {
|
||||||
|
...item,
|
||||||
|
// @ts-ignore
|
||||||
|
changefreq: 'monthly',
|
||||||
|
priority: 1,
|
||||||
|
lastmod: new Date().toISOString(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Guide and video pages
|
||||||
|
if (
|
||||||
|
item.url.startsWith('https://roadmap.sh/guides/') ||
|
||||||
|
item.url.startsWith('https://roadmap.sh/videos/')
|
||||||
|
) {
|
||||||
|
return {
|
||||||
|
...item,
|
||||||
|
// @ts-ignore
|
||||||
|
changefreq: 'monthly',
|
||||||
|
priority: 0.9,
|
||||||
|
lastmod: new Date().toISOString(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined;
|
||||||
|
}
|
@@ -40,7 +40,7 @@ Now that we know what basic authentication is, the question is, how does it work
|
|||||||
### Step 1
|
### Step 1
|
||||||
When the browser first requests the server, the server tries to check the availability of the `Authorization` header in the request. Because it is the first request, no `Authorization` header is found in the request. So the server responds with the `401 Unauthorized` response code and also sends the `WWW-Authenticate` header with the value set to `Basic`, which tells the browser that it needs to trigger the basic authentication flow.
|
When the browser first requests the server, the server tries to check the availability of the `Authorization` header in the request. Because it is the first request, no `Authorization` header is found in the request. So the server responds with the `401 Unauthorized` response code and also sends the `WWW-Authenticate` header with the value set to `Basic`, which tells the browser that it needs to trigger the basic authentication flow.
|
||||||
|
|
||||||
```plaintext
|
```
|
||||||
401 Unauthorized
|
401 Unauthorized
|
||||||
WWW-Authenticate: Basic realm='user_pages'
|
WWW-Authenticate: Basic realm='user_pages'
|
||||||
```
|
```
|
||||||
|
@@ -1,16 +0,0 @@
|
|||||||
import type { SitemapItem } from '@astrojs/sitemap';
|
|
||||||
|
|
||||||
export function shouldIndexPage(page: string): boolean {
|
|
||||||
return ![
|
|
||||||
'https://roadmap.sh/404/',
|
|
||||||
'https://roadmap.sh/terms/',
|
|
||||||
'https://roadmap.sh/privacy/',
|
|
||||||
].includes(page);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function serialize(item: SitemapItem): SitemapItem {
|
|
||||||
console.log(item);
|
|
||||||
return {
|
|
||||||
...item,
|
|
||||||
};
|
|
||||||
}
|
|
@@ -11,7 +11,7 @@ import BaseLayout from '../layouts/BaseLayout.astro';
|
|||||||
<Icon icon='construction' class='hidden md:block' />
|
<Icon icon='construction' class='hidden md:block' />
|
||||||
<div class='text-left md:text-left'>
|
<div class='text-left md:text-left'>
|
||||||
<h1
|
<h1
|
||||||
class='font-extrabold text-transparent leading-tight text-2xl md:text-5xl bg-clip-text bg-gradient-to-t from-black to-gray-600'
|
class='font-extrabold text-transparent leading-4 text-2xl md:text-5xl bg-clip-text bg-gradient-to-t from-black to-gray-600'
|
||||||
>
|
>
|
||||||
Page not found!
|
Page not found!
|
||||||
</h1>
|
</h1>
|
||||||
|
Reference in New Issue
Block a user