36 lines
1.5 KiB
JavaScript
36 lines
1.5 KiB
JavaScript
import { colors, fs } from 'vuepress/utils';
|
|
import { getSiteMap } from './getSitemap.js';
|
|
import { getSiteMapTemplate } from './getSitemapTemplate.js';
|
|
import { logger } from './logger.js';
|
|
export const outputSitemap = async (app, options, hostname) => {
|
|
const { dir, options: { base }, } = app;
|
|
const [sitemapPath, sitemapContent] = await getSiteMap(app, options, hostname);
|
|
const [templatePath, templateContent] = getSiteMapTemplate(options);
|
|
fs.writeFileSync(app.dir.dest(sitemapPath), sitemapContent);
|
|
fs.writeFileSync(app.dir.dest(templatePath), templateContent);
|
|
logger.succeed(`Generating sitemap to ${colors.cyan(sitemapPath)}`);
|
|
const robotTxtPath = dir.dest('robots.txt');
|
|
const sitemapDeclaration = `Sitemap: ${hostname}${base}${sitemapPath}\n`;
|
|
const { succeed } = logger.load(`Appending sitemap path to ${colors.cyan('robots.txt')}`);
|
|
if (fs.existsSync(robotTxtPath)) {
|
|
const robotsTxt = await fs.readFile(robotTxtPath, 'utf-8');
|
|
const siteMapRegex = /^Sitemap: .*$/mu;
|
|
if (siteMapRegex.test(robotsTxt)) {
|
|
await fs.writeFile(robotTxtPath, robotsTxt.replace(siteMapRegex, sitemapDeclaration), { encoding: 'utf-8', flag: 'w' });
|
|
}
|
|
else {
|
|
await fs.writeFile(robotTxtPath, `\n${sitemapDeclaration}`, {
|
|
encoding: 'utf-8',
|
|
flag: 'a',
|
|
});
|
|
}
|
|
}
|
|
else {
|
|
await fs.writeFile(robotTxtPath, sitemapDeclaration, {
|
|
encoding: 'utf-8',
|
|
flag: 'w',
|
|
});
|
|
}
|
|
succeed();
|
|
};
|