Sitemap: renamed server-sitemap to sitemap; added caching; set up redirect for retro-compatibility (#76)
This commit is contained in:
committed by
GitHub
parent
c00ec761d3
commit
2209e2988b
@@ -1,64 +0,0 @@
|
|||||||
import { getServerSideSitemap } from 'next-sitemap';
|
|
||||||
|
|
||||||
import { createCmsClient } from '@kit/cms';
|
|
||||||
|
|
||||||
import appConfig from '~/config/app.config';
|
|
||||||
|
|
||||||
export async function GET() {
|
|
||||||
const paths = getPaths();
|
|
||||||
const contentItems = await getContentItems();
|
|
||||||
|
|
||||||
return getServerSideSitemap([
|
|
||||||
...paths,
|
|
||||||
...contentItems.map((path) => {
|
|
||||||
return {
|
|
||||||
loc: new URL(path, appConfig.url).href,
|
|
||||||
lastmod: new Date().toISOString(),
|
|
||||||
};
|
|
||||||
}),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getPaths() {
|
|
||||||
const paths = [
|
|
||||||
'/',
|
|
||||||
'/faq',
|
|
||||||
'/blog',
|
|
||||||
'/docs',
|
|
||||||
'/pricing',
|
|
||||||
'/contact',
|
|
||||||
'/cookie-policy',
|
|
||||||
'/terms-of-service',
|
|
||||||
'/privacy-policy',
|
|
||||||
// add more paths here
|
|
||||||
];
|
|
||||||
|
|
||||||
return paths.map((path) => {
|
|
||||||
return {
|
|
||||||
loc: new URL(path, appConfig.url).href,
|
|
||||||
lastmod: new Date().toISOString(),
|
|
||||||
};
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getContentItems() {
|
|
||||||
const client = await createCmsClient();
|
|
||||||
|
|
||||||
const posts = client
|
|
||||||
.getContentItems({
|
|
||||||
collection: 'posts',
|
|
||||||
limit: Infinity,
|
|
||||||
})
|
|
||||||
.then((response) => response.items)
|
|
||||||
.then((posts) => posts.map((post) => `/blog/${post.slug}`));
|
|
||||||
|
|
||||||
const docs = client
|
|
||||||
.getContentItems({
|
|
||||||
collection: 'documentation',
|
|
||||||
limit: Infinity,
|
|
||||||
})
|
|
||||||
.then((response) => response.items)
|
|
||||||
.then((docs) => docs.map((doc) => `/docs/${doc.slug}`));
|
|
||||||
|
|
||||||
return Promise.all([posts, docs]).then((items) => items.flat());
|
|
||||||
}
|
|
||||||
85
apps/web/app/sitemap.xml/route.ts
Normal file
85
apps/web/app/sitemap.xml/route.ts
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
import { getServerSideSitemap } from 'next-sitemap';
|
||||||
|
|
||||||
|
import { createCmsClient } from '@kit/cms';
|
||||||
|
|
||||||
|
import appConfig from '~/config/app.config';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description The maximum age of the sitemap in seconds.
|
||||||
|
* This is used to set the cache-control header for the sitemap. The cache-control header is used to control how long the sitemap is cached.
|
||||||
|
* By default, the cache-control header is set to 'public, max-age=600, s-maxage=3600'.
|
||||||
|
* This means that the sitemap will be cached for 600 seconds (10 minutes) and will be considered stale after 3600 seconds (1 hour).
|
||||||
|
*/
|
||||||
|
const MAX_AGE = 60;
|
||||||
|
const S_MAX_AGE = 3600;
|
||||||
|
|
||||||
|
export async function GET() {
|
||||||
|
const paths = getPaths();
|
||||||
|
const contentItems = await getContentItems();
|
||||||
|
|
||||||
|
const headers = {
|
||||||
|
'Cache-Control': `public, max-age=${MAX_AGE}, s-maxage=${S_MAX_AGE}`,
|
||||||
|
};
|
||||||
|
|
||||||
|
return getServerSideSitemap([...paths, ...contentItems], headers);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPaths() {
|
||||||
|
const paths = [
|
||||||
|
'/',
|
||||||
|
'/faq',
|
||||||
|
'/blog',
|
||||||
|
'/docs',
|
||||||
|
'/pricing',
|
||||||
|
'/contact',
|
||||||
|
'/cookie-policy',
|
||||||
|
'/terms-of-service',
|
||||||
|
'/privacy-policy',
|
||||||
|
// add more paths here
|
||||||
|
];
|
||||||
|
|
||||||
|
return paths.map((path) => {
|
||||||
|
return {
|
||||||
|
loc: new URL(path, appConfig.url).href,
|
||||||
|
lastmod: new Date().toISOString(),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getContentItems() {
|
||||||
|
const client = await createCmsClient();
|
||||||
|
|
||||||
|
// do not paginate the content items
|
||||||
|
const limit = Infinity;
|
||||||
|
const posts = client
|
||||||
|
.getContentItems({
|
||||||
|
collection: 'posts',
|
||||||
|
limit,
|
||||||
|
})
|
||||||
|
.then((response) => response.items)
|
||||||
|
.then((posts) =>
|
||||||
|
posts.map((post) => ({
|
||||||
|
loc: new URL(`/blog/${post.slug}`, appConfig.url).href,
|
||||||
|
lastmod: post.publishedAt
|
||||||
|
? new Date(post.publishedAt).toISOString()
|
||||||
|
: new Date().toISOString(),
|
||||||
|
})),
|
||||||
|
);
|
||||||
|
|
||||||
|
const docs = client
|
||||||
|
.getContentItems({
|
||||||
|
collection: 'documentation',
|
||||||
|
limit,
|
||||||
|
})
|
||||||
|
.then((response) => response.items)
|
||||||
|
.then((docs) =>
|
||||||
|
docs.map((doc) => ({
|
||||||
|
loc: new URL(`/docs/${doc.slug}`, appConfig.url).href,
|
||||||
|
lastmod: doc.publishedAt
|
||||||
|
? new Date(doc.publishedAt).toISOString()
|
||||||
|
: new Date().toISOString(),
|
||||||
|
})),
|
||||||
|
);
|
||||||
|
|
||||||
|
return Promise.all([posts, docs]).then((items) => items.flat());
|
||||||
|
}
|
||||||
@@ -39,6 +39,7 @@ const config = {
|
|||||||
outputFileTracingIncludes: {
|
outputFileTracingIncludes: {
|
||||||
'/*': ['./content/**/*'],
|
'/*': ['./content/**/*'],
|
||||||
},
|
},
|
||||||
|
redirects: getRedirects,
|
||||||
experimental: {
|
experimental: {
|
||||||
mdxRs: true,
|
mdxRs: true,
|
||||||
reactCompiler: ENABLE_REACT_COMPILER,
|
reactCompiler: ENABLE_REACT_COMPILER,
|
||||||
@@ -95,6 +96,16 @@ function getRemotePatterns() {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function getRedirects() {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
source: '/server-sitemap.xml',
|
||||||
|
destination: '/sitemap.xml',
|
||||||
|
permanent: true,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description Aliases modules based on the environment variables
|
* @description Aliases modules based on the environment variables
|
||||||
* This will speed up the development server by not loading the modules that are not needed
|
* This will speed up the development server by not loading the modules that are not needed
|
||||||
|
|||||||
Reference in New Issue
Block a user