36 lines
No EOL
1.1 KiB
TypeScript
36 lines
No EOL
1.1 KiB
TypeScript
import { SitemapStream, streamToPromise } from 'sitemap'
|
|
import { App } from 'vinxi';
|
|
|
|
const BASE_URL = 'https://ca-euw-prd-calque-app.purplecoast-f5b7f657.westeurope.azurecontainerapps.io';
|
|
|
|
export async function GET() {
|
|
|
|
const sitemap = new SitemapStream({ hostname: BASE_URL });
|
|
|
|
sitemap.write({ url: BASE_URL, changefreq: 'monthly', });
|
|
|
|
for (const route of await getRoutes()) {
|
|
sitemap.write({ url: route, changefreq: 'monthly', });
|
|
}
|
|
|
|
sitemap.end();
|
|
|
|
return new Response(
|
|
(await streamToPromise(sitemap)).toString(),
|
|
{ status: 200, headers: { 'Content-Type': 'text/xml' } }
|
|
);
|
|
}
|
|
|
|
const getRoutes = async () => {
|
|
const router = ((globalThis as any).app as App).getRouter('client').internals.routes;
|
|
|
|
if (router === undefined) {
|
|
return [];
|
|
}
|
|
|
|
const routes = await router.getRoutes() as { page: boolean, $$route?: object, path: string }[];
|
|
|
|
return routes
|
|
.filter(r => r.page === true && r.$$route === undefined && !r.path.match(/^.+\*\d+$/))
|
|
.map(r => r.path.replace(/\/\(\w+\)/g, ''));
|
|
}; |