const fs = require('fs') const globby = require('globby') const matter = require('gray-matter') const prettier = require('prettier') const siteMetadata = require('../data/siteMetadata') ;(async () => { const prettierConfig = await prettier.resolveConfig('./.prettierrc.js') const pages = await globby([ 'pages/*.js', 'pages/*.tsx', 'data/blog/**/*.mdx', 'data/blog/**/*.md', 'public/tags/**/*.xml', '!pages/_*.js', '!pages/_*.tsx', '!pages/api', ]) const sitemap = ` ${pages .map((page) => { // Exclude drafts from the sitemap if (page.search('.md') >= 1 && fs.existsSync(page)) { const source = fs.readFileSync(page, 'utf8') const fm = matter(source) if (fm.data.draft) { return } if (fm.data.canonicalUrl) { return } } const path = page .replace('pages/', '/') .replace('data/blog', '/blog') .replace('public/', '/') .replace('.js', '') .replace('.tsx', '') .replace('.mdx', '') .replace('.md', '') .replace('/feed.xml', '') const route = path === '/index' ? '' : path if (page.search('pages/404.') > -1 || page.search(`pages/blog/[...slug].`) > -1) { return } return ` ${siteMetadata.siteUrl}${route} ` }) .join('')} ` const formatted = prettier.format(sitemap, { ...prettierConfig, parser: 'html', }) // eslint-disable-next-line no-sync fs.writeFileSync('public/sitemap.xml', formatted) })()