scripts/update-sitemap-loc.js (59 lines of code) (raw):
const { js2xml, xml2js } = require('xml-js');
const { stat, readFile, writeFile } = require('node:fs/promises');
const Listr = require('listr');
const sitemapXMLs = [
[
'../website/build/sitemap.xml',
'../doc/build/sitemap.xml',
'../blog/en/build/sitemap.xml',
],
[
'../website/build/zh/sitemap.xml',
'../doc/build/zh/sitemap.xml',
'../blog/zh/build/sitemap.xml',
],
];
const tasks = new Listr([
{
title: `Check sitemap.xml files exist`,
task: () => Promise.all(
sitemapXMLs
.flat()
.map((f) => stat(f).then((stat) => (stat.isFile()
? Promise.resolve()
: Promise.reject(new Error(`${f} is not a file`))))),
),
},
{
title: `Merge sitemap.xml files`,
task: () => new Listr(
sitemapXMLs.map((group) => ({
title: `Merge ${group[0]}`,
task: () => Promise.all(
group.map((f) => readFile(f, 'utf8').then((xml) => xml2js(xml, { compact: true }))),
)
.then((sitemaps) => {
const res = sitemaps[0];
for (let i = 1; i < sitemaps.length; i += 1) {
res.urlset.url = [
...res.urlset.url,
...sitemaps[i].urlset.url,
];
}
return res;
})
.then((sitemap) => writeFile(group[0], js2xml(sitemap, { compact: true }, 'utf-8'))),
})),
{ concurrent: sitemapXMLs.length },
),
},
]);
tasks
.run()
.then(() => {
console.log(`[Finish] Generate sitemap.xml`);
})
.catch((err) => {
console.error(err);
process.exit(1);
});