129 lines
No EOL
3.5 KiB
TypeScript
129 lines
No EOL
3.5 KiB
TypeScript
import fs from 'fs';
|
|
import { globby } from 'globby';
|
|
import prettier from 'prettier';
|
|
import path from 'path';
|
|
|
|
async function generate() {
|
|
const prettierConfig = await prettier.resolveConfig('./.prettierrc');
|
|
|
|
// Ensure directories exist
|
|
fs.mkdirSync('public', { recursive: true });
|
|
fs.mkdirSync('out', { recursive: true });
|
|
|
|
// Get static pages
|
|
const pages = await globby([
|
|
'app/**/page.tsx',
|
|
'!app/**/_*/**',
|
|
'!app/**/api/**',
|
|
'!app/docs/**', // Exclude docs directory as we'll handle it separately
|
|
]);
|
|
|
|
// Get doc pages from the build output
|
|
const docPages = await globby(['out/docs/**/*.html'])
|
|
.then(pages => pages
|
|
.map(page => page
|
|
.replace('out', '')
|
|
.replace('/index.html', '')
|
|
.replace('.html', '')
|
|
)
|
|
.filter(page => !page.includes('/_'))
|
|
);
|
|
|
|
// Get blog pages from the build output
|
|
const blogPages = await globby(['out/blog/**/*.html'])
|
|
.then(pages => pages
|
|
.map(page => page
|
|
.replace('out', '')
|
|
.replace('/index.html', '')
|
|
.replace('.html', '')
|
|
)
|
|
.filter(page => !page.includes('/_') && !page.includes('/blog/index'))
|
|
);
|
|
|
|
const baseUrl = 'https://amical.ai';
|
|
|
|
const sitemap = `
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
${[
|
|
// Add static pages
|
|
...pages.map((page) => {
|
|
const path = page
|
|
.replace('app', '')
|
|
.replace('/page.tsx', '')
|
|
.replace('/(home)', '')
|
|
.replace(/\[\[\.\.\..*?\]\]/, '');
|
|
|
|
// Skip dynamic routes with parameters
|
|
if (path.includes('[') || path.includes(']')) {
|
|
return '';
|
|
}
|
|
|
|
const route = path === '' ? '' : path;
|
|
|
|
return `
|
|
<url>
|
|
<loc>${baseUrl}${route}</loc>
|
|
<lastmod>${new Date().toISOString()}</lastmod>
|
|
<changefreq>daily</changefreq>
|
|
<priority>0.7</priority>
|
|
</url>
|
|
`;
|
|
}),
|
|
// Add docs index page
|
|
`
|
|
<url>
|
|
<loc>${baseUrl}/docs</loc>
|
|
<lastmod>${new Date().toISOString()}</lastmod>
|
|
<changefreq>daily</changefreq>
|
|
<priority>0.7</priority>
|
|
</url>
|
|
`,
|
|
// Add doc pages
|
|
...docPages.map((path) => `
|
|
<url>
|
|
<loc>${baseUrl}${path}</loc>
|
|
<lastmod>${new Date().toISOString()}</lastmod>
|
|
<changefreq>daily</changefreq>
|
|
<priority>0.7</priority>
|
|
</url>
|
|
`),
|
|
// Add blog index page
|
|
`
|
|
<url>
|
|
<loc>${baseUrl}/blog</loc>
|
|
<lastmod>${new Date().toISOString()}</lastmod>
|
|
<changefreq>weekly</changefreq>
|
|
<priority>0.8</priority>
|
|
</url>
|
|
`,
|
|
// Add blog pages
|
|
...blogPages.map((path) => `
|
|
<url>
|
|
<loc>${baseUrl}${path}</loc>
|
|
<lastmod>${new Date().toISOString()}</lastmod>
|
|
<changefreq>weekly</changefreq>
|
|
<priority>0.7</priority>
|
|
</url>
|
|
`),
|
|
]
|
|
.filter(Boolean)
|
|
.join('')}
|
|
</urlset>
|
|
`;
|
|
|
|
const formatted = await prettier.format(sitemap, {
|
|
...prettierConfig,
|
|
parser: 'html',
|
|
});
|
|
|
|
fs.writeFileSync('public/sitemap.xml', formatted);
|
|
fs.writeFileSync('out/sitemap.xml', formatted);
|
|
|
|
console.log('✅ Generated sitemap.xml');
|
|
}
|
|
|
|
generate().catch((err) => {
|
|
console.error(err);
|
|
process.exit(1);
|
|
}); |