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 { shouldIndexPage } from './src/lib/sitemap';
|
||||
import { serializeSitemap, shouldIndexPage } from './sitemap.mjs';
|
||||
|
||||
// https://astro.build/config
|
||||
import tailwind from '@astrojs/tailwind';
|
||||
@@ -29,6 +29,7 @@ export default defineConfig({
|
||||
}),
|
||||
sitemap({
|
||||
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
|
||||
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
|
||||
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' />
|
||||
<div class='text-left md:text-left'>
|
||||
<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!
|
||||
</h1>
|
||||
|
Reference in New Issue
Block a user