mirror of
https://github.com/tabler/tabler.git
synced 2026-08-07 20:02:23 +04:00
Migrate preview and docs packages from Eleventy to Astro (#2694)
Co-authored-by: Bartek <xbartoszdobija@gmail.com>
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
import type { APIRoute } from 'astro';
|
||||
import { site } from '@shared/lib/site';
|
||||
|
||||
export const prerender = true;
|
||||
|
||||
// Port of preview/pages/sitemap.liquid: one entry per page, file-style URLs
|
||||
// (build.format 'file'), index pages collapse to their directory URL.
|
||||
// Entry order mirrors the Eleventy `pages` collection: top-level pages first,
|
||||
// then nested ones, each group in reverse-alphabetical order.
|
||||
const pages = import.meta.glob('./**/*.astro');
|
||||
|
||||
const urls = Object.keys(pages)
|
||||
.map((file) => file.replace(/^\.\//, '').replace(/\.astro$/, '.html'))
|
||||
.sort((a, b) => {
|
||||
const depthA = a.split('/').length;
|
||||
const depthB = b.split('/').length;
|
||||
if (depthA !== depthB) return depthA - depthB;
|
||||
// byte-wise, descending — matches the Eleventy `pages` collection order
|
||||
return a < b ? 1 : -1;
|
||||
})
|
||||
.map((path) => {
|
||||
if (path === 'index.html') return '/';
|
||||
if (path.endsWith('/index.html')) return `/${path.slice(0, -'index.html'.length)}`;
|
||||
return `/${path}`;
|
||||
});
|
||||
|
||||
const escapeXml = (value: string) =>
|
||||
value
|
||||
.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"')
|
||||
.replace(/'/g, ''');
|
||||
|
||||
export const GET: APIRoute = () => {
|
||||
const environment = process.env.NODE_ENV || 'production';
|
||||
const baseUrl = environment !== 'development' ? site.previewUrl : '';
|
||||
// same shape as Liquid's `'now' | date_to_xmlschema` (UTC, +00:00 suffix)
|
||||
const lastModified = new Date().toISOString().replace(/\.\d{3}Z$/, '+00:00');
|
||||
const entries = urls
|
||||
.map(
|
||||
(url) => `<url>
|
||||
<loc>${escapeXml(`${baseUrl}${url}`)}</loc>
|
||||
<lastmod>${lastModified}</lastmod>
|
||||
</url>`,
|
||||
)
|
||||
.join('\n');
|
||||
const body = `<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset 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" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||||
|
||||
${entries}
|
||||
</urlset>
|
||||
`;
|
||||
|
||||
return new Response(body, {
|
||||
headers: {
|
||||
'Content-Type': 'application/xml; charset=utf-8',
|
||||
},
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user