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); });