diff --git a/src/generators/index.mjs b/src/generators/index.mjs index 09a4c1a0..24294f92 100644 --- a/src/generators/index.mjs +++ b/src/generators/index.mjs @@ -14,6 +14,7 @@ import llmsTxt from './llms-txt/index.mjs'; import manPage from './man-page/index.mjs'; import metadata from './metadata/index.mjs'; import oramaDb from './orama-db/index.mjs'; +import sitemap from './sitemap/index.mjs'; import web from './web/index.mjs'; export const publicGenerators = { @@ -27,6 +28,7 @@ export const publicGenerators = { 'api-links': apiLinks, 'orama-db': oramaDb, 'llms-txt': llmsTxt, + sitemap, web, }; diff --git a/src/generators/sitemap/index.mjs b/src/generators/sitemap/index.mjs new file mode 100644 index 00000000..9ad00d69 --- /dev/null +++ b/src/generators/sitemap/index.mjs @@ -0,0 +1,75 @@ +import { writeFile } from 'node:fs/promises'; +import { join } from 'node:path'; + +import { BASE_URL } from '../../constants.mjs'; + +/** + * This generator generates a sitemap.xml file for search engine optimization + * + * @typedef {Array} Input + * + * @type {GeneratorMetadata} + */ +export default { + name: 'sitemap', + + version: '1.0.0', + + description: 'Generates a sitemap.xml file for search engine optimization', + + dependsOn: 'metadata', + + /** + * Generates a sitemap.xml file + * + * @param {Input} entries + * @param {Partial} options + * @returns {Promise} + */ + async generate(entries, { output }) { + const apiPages = entries + .filter(entry => entry.heading.depth === 1) + .map(entry => { + const path = entry.api_doc_source.replace(/^doc\//, '/docs/latest/'); + const url = new URL(path, BASE_URL).href; + + return { + loc: url, + lastmod: new Date().toISOString().split('T')[0], + changefreq: 'weekly', + priority: '0.8', + }; + }); + + const mainPages = [ + { + loc: new URL('/docs/latest/api/', BASE_URL).href, + lastmod: new Date().toISOString().split('T')[0], + changefreq: 'daily', + priority: '1.0', + }, + ]; + + const allPages = [...mainPages, ...apiPages]; + + const sitemap = ` + +${allPages + .map( + page => ` + ${page.loc} + ${page.lastmod} + ${page.changefreq} + ${page.priority} + ` + ) + .join('\n')} +`; + + if (output) { + await writeFile(join(output, 'sitemap.xml'), sitemap, 'utf-8'); + } + + return sitemap; + }, +};