feat(publication): share policy for manifest routes, canonicals, indexing and sitemap

This commit is contained in:
DeCentN2Madness committed 2026-10-07 12:09:06 -07:00
1 parent ea2f1eaa05
commit cd097d0e76
40 files changed
+846 -282

No files matched your search

+7 -23
View File
@@ -1,24 +1,8 @@
import fs from 'node:fs/promises';
import path from 'node:path';
import { build } from 'astro';
import { fileURLToPath } from 'node:url';
const root = path.resolve(new URL('..', import.meta.url).pathname);
async function walk(dir) {
const output = [];
for (const entry of await fs.readdir(dir, { withFileTypes: true })) {
const target = path.join(dir, entry.name);
if (entry.isDirectory()) output.push(...await walk(target));
else if (/\.mdx?$/.test(entry.name)) output.push(target);
}
return output;
}
const files = [...await walk(path.join(root, 'src/content/pages')), ...await walk(path.join(root, 'src/content/blog'))];
const urls = [];
for (const file of files) {
const source = await fs.readFile(file, 'utf8');
const canonical = source.match(/^canonical:\s*["']?([^"'\n]+)["']?/m)?.[1];
const draft = source.match(/^draft:\s*(true|false)/m)?.[1] === 'true';
if (canonical && !draft) urls.push(canonical);
}
const xml = `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${urls.sort().map((url) => ` <url><loc>${url}</loc></url>`).join('\n')}\n</urlset>\n`;
await fs.writeFile(path.join(root, 'public/sitemap.xml'), xml);
console.log(`Generated sitemap with ${urls.length} URLs.`);
// Compatibility command: the build generates sitemap.xml from the same
// publication manifest as HTML routes. Never maintain a second public copy.
const root = fileURLToPath(new URL('../', import.meta.url));
process.chdir(root);
await build({ root });