/** * Serializes sitemap entries to a clean, indented XML STRING — valid for crawlers * and (with `cssUrl`) styled in the browser via plain CSS. * * Two viewing modes: * - No cssUrl → the browser's native formatted XML tree (indented, collapsible). * - With cssUrl → a `` directive; the project's * CSS styles the XML tags (cards, labels via ::before). NOT XSLT — that's being * removed from browsers and shows a deprecation warning. CSS is safe and * W3C-standard. * * // app/sitemap.xml/route.ts * import { buildSitemapXml } from '@intecion/ipal-kit' * import { sitemap } from '@/lib/content' * export const dynamic = 'force-dynamic' * export async function GET() { * const entries = await sitemap() * const xml = buildSitemapXml(entries, { cssUrl: '/sitemap.css' }) * return new Response(xml, { * headers: { 'Content-Type': 'application/xml; charset=utf-8' }, * }) * } * * Put sitemap.css in the project's /public and style the tags (see docs/seo.md * for a starter). Note: is an XML tag, not — CSS can't make it a * clickable link (some browsers auto-detect URLs); the win is readability, not * clickability. * * NOTE: if you use this custom route, DON'T also keep app/sitemap.ts — pick one. * Two sitemaps confuse crawlers. */ export function buildSitemapXml(entries, opts = {}) { const { cssUrl } = opts; const esc = (s)=>s.replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, '''); const urls = entries.map((e)=>{ const parts = [ ` ${esc(e.url)}` ]; if (e.lastModified) { const iso = e.lastModified instanceof Date ? e.lastModified.toISOString() : String(e.lastModified); parts.push(` ${esc(iso)}`); } if (e.changeFrequency) parts.push(` ${e.changeFrequency}`); if (typeof e.priority === 'number') parts.push(` ${e.priority}`); const alternates = e.alternates?.languages; if (alternates) { for (const [lang, href] of Object.entries(alternates)){ if (typeof href === 'string') { parts.push(` `); } } } return ` \n${parts.join('\n')}\n `; }).join('\n'); const stylesheet = cssUrl ? `\n` : ''; return `\n` + stylesheet + `\n` + urls + `\n`; } //# sourceMappingURL=buildSitemapXml.js.map