const fs = require('fs'); const path = require('path'); const SITE_URL = 'https://yuzhiran.com'; const OUT_DIR = path.join(__dirname, '..', 'out'); const PRIORITIES = { '/': 1.0, '/tools': 0.9, '/courses': 0.9, '/skills': 0.8, '/marketplace': 0.8, '/practices': 0.8, '/contents': 0.8, '/prompts': 0.8, '/prompts/workshop': 0.7, '/models': 0.7, '/sandbox': 0.7, '/sandbox/compare': 0.6, '/sandbox/code': 0.6, '/sandbox/share': 0.6, '/discover': 0.7, '/discover/hot': 0.6, '/discover/tools': 0.6, '/discover/daily': 0.6, '/community': 0.6, '/circles': 0.6, '/resources': 0.7, '/about': 0.5, '/privacy': 0.3, '/terms': 0.3, '/ai-agreement': 0.3, '/search': 0.5, }; function walkDir(dir, basePath = '') { const entries = fs.readdirSync(dir, { withFileTypes: true }); const urls = []; for (const entry of entries) { const fullPath = path.join(dir, entry.name); const relativeName = path.join(basePath, entry.name); if (entry.isDirectory()) { if (entry.name.startsWith('_') || entry.name.startsWith('.')) continue; urls.push(...walkDir(fullPath, relativeName)); } else if (entry.name === 'page.html' || entry.name.endsWith('.html')) { if (relativeName === 'index.html' || relativeName === 'page.html') { urls.push({ path: '/', file: fullPath }); } else { let urlPath = '/' + relativeName.replace(/\.html$/, '').replace(/\/index$/, '').replace(/\/page$/, ''); urls.push({ path: urlPath, file: fullPath }); } } } return urls; } function generateSitemap(urls) { const now = new Date().toISOString().split('T')[0]; let xml = '\n'; xml += '\n'; const seen = new Set(); for (const url of urls) { if (seen.has(url.path)) continue; seen.add(url.path); if (url.path.startsWith('/admin') || url.path.startsWith('/_next') || url.path.startsWith('/api') || url.path === '/404') continue; if (url.path.includes('/[') || url.path.includes(']')) continue; const depth = url.path.split('/').filter(Boolean).length; const changefreq = depth <= 1 ? 'weekly' : 'monthly'; const priority = PRIORITIES[url.path]; const computedPriority = priority !== undefined ? priority : Math.max(0.1, 0.7 - depth * 0.1); xml += ' \n'; xml += ` ${SITE_URL}${url.path}\n`; xml += ` ${now}\n`; xml += ` ${changefreq}\n`; xml += ` ${computedPriority.toFixed(1)}\n`; xml += ' \n'; } xml += ''; return xml; } if (!fs.existsSync(OUT_DIR)) { console.error('out/ directory not found. Run next build first.'); process.exit(1); } const urls = walkDir(OUT_DIR); console.log(`Found ${urls.length} HTML pages in output.`); const sitemap = generateSitemap(urls); const outputPath = path.join(OUT_DIR, 'sitemap.xml'); fs.writeFileSync(outputPath, sitemap, 'utf-8'); console.log(`Generated sitemap.xml with ${sitemap.split('').length - 1} URLs → ${outputPath}`); // Copy robots.txt from public/ to out/ const robotsSrc = path.join(__dirname, '..', 'public', 'robots.txt'); const robotsDst = path.join(OUT_DIR, 'robots.txt'); if (fs.existsSync(robotsSrc)) { fs.copyFileSync(robotsSrc, robotsDst); console.log(`Copied robots.txt → ${robotsDst}`); }