#!/usr/bin/env node // Generates sitemap.xml, robots.txt, and feed.xml for teknavglobal.com import { writeFileSync, mkdirSync } from 'fs'; import { createRequire } from 'module'; const SITE = 'https://www.teknavglobal.com'; // Load article data (CommonJS-compatible workaround for ES module data) const require = createRequire(import.meta.url); // Dynamic import of global-data.js const { articles, authors, siteConfig } = await import('../global-data.js'); function capDate(d) { const now = new Date().toISOString().split('T')[0]; return d > now ? now : d; } // ── sitemap.xml ───────────────────────────────────────────────────── const staticPages = [ { url: '/', priority: '1.0', freq: 'daily' }, { url: '/articles', priority: '0.9', freq: 'daily' }, { url: '/about', priority: '0.7', freq: 'monthly' }, { url: '/privacy', priority: '0.4', freq: 'yearly' }, { url: '/terms', priority: '0.4', freq: 'yearly' }, { url: '/editorial-policy', priority: '0.5', freq: 'monthly' }, ]; const articleEntries = articles.map(a => ({ url: `/article/${a.slug}`, lastmod: capDate(a.dateEn), priority: '0.8', freq: 'weekly', })); const allEntries = [...staticPages, ...articleEntries]; const sitemap = ` ${allEntries.map(e => ` ${SITE}${e.url} ${e.lastmod ? `${e.lastmod}` : ''} ${e.freq} ${e.priority} `).join('\n')} `; // ── robots.txt ────────────────────────────────────────────────────── const robots = `User-agent: * Allow: / Disallow: /api/ Disallow: /profile/ Disallow: /admin/ Sitemap: ${SITE}/sitemap.xml `; // ── feed.xml (RSS) ────────────────────────────────────────────────── const feed = ` Teknav — Deep Technology Analysis for Builders ${SITE} Technical analysis on AI engineering, security, software architecture, and emerging compute. en ${new Date().toUTCString()} ${SITE}/images/og/default.jpg Teknav ${SITE} ${articles .sort((a, b) => new Date(b.dateEn) - new Date(a.dateEn)) .map(a => { const author = authors.find(au => au.id === a.author); return ` <![CDATA[${a.title}]]> ${SITE}/article/${a.slug} ${SITE}/article/${a.slug} ${new Date(a.dateEn).toUTCString()} ${author ? `${author.name}` : ''} ${a.category} `; }).join('\n')} `; mkdirSync('public', { recursive: true }); writeFileSync('public/sitemap.xml', sitemap); writeFileSync('public/robots.txt', robots); writeFileSync('public/feed.xml', feed); console.log(`[seo] sitemap: ${allEntries.length} URLs | feed: ${articles.length} items`);