From 8d07613902b95b762364359146bf6af72e8ab42c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guilherme=20Ara=C3=BAjo?= Date: Sun, 14 Dec 2025 22:08:07 -0300 Subject: [PATCH 1/3] feat: create sitemap generator --- src/generators/index.mjs | 2 + src/generators/sitemap/index.mjs | 75 ++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 src/generators/sitemap/index.mjs 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; + }, +}; From 18c93577cc2426638f84616650e4ef048ec23fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guilherme=20Ara=C3=BAjo?= Date: Thu, 25 Dec 2025 15:42:00 -0300 Subject: [PATCH 2/3] refactor: review --- src/generators/sitemap/index.mjs | 42 ++++++++++++++++++----------- src/generators/sitemap/template.xml | 4 +++ 2 files changed, 30 insertions(+), 16 deletions(-) create mode 100644 src/generators/sitemap/template.xml diff --git a/src/generators/sitemap/index.mjs b/src/generators/sitemap/index.mjs index 9ad00d69..1ecf48e2 100644 --- a/src/generators/sitemap/index.mjs +++ b/src/generators/sitemap/index.mjs @@ -1,6 +1,8 @@ -import { writeFile } from 'node:fs/promises'; +import { readFile, writeFile } from 'node:fs/promises'; import { join } from 'node:path'; +import dedent from 'dedent'; + import { BASE_URL } from '../../constants.mjs'; /** @@ -27,6 +29,8 @@ export default { * @returns {Promise} */ async generate(entries, { output }) { + const lastmod = new Date().toISOString().split('T')[0]; + const apiPages = entries .filter(entry => entry.heading.depth === 1) .map(entry => { @@ -35,7 +39,7 @@ export default { return { loc: url, - lastmod: new Date().toISOString().split('T')[0], + lastmod, changefreq: 'weekly', priority: '0.8', }; @@ -44,7 +48,7 @@ export default { const mainPages = [ { loc: new URL('/docs/latest/api/', BASE_URL).href, - lastmod: new Date().toISOString().split('T')[0], + lastmod, changefreq: 'daily', priority: '1.0', }, @@ -52,19 +56,25 @@ export default { const allPages = [...mainPages, ...apiPages]; - const sitemap = ` - -${allPages - .map( - page => ` - ${page.loc} - ${page.lastmod} - ${page.changefreq} - ${page.priority} - ` - ) - .join('\n')} -`; + const template = await readFile( + join(import.meta.dirname, 'template.xml'), + 'utf-8' + ); + + const urlset = allPages + .map( + page => dedent` + + ${page.loc} + ${page.lastmod} + ${page.changefreq} + ${page.priority} + + ` + ) + .join('\n'); + + const sitemap = template.replace('__URLSET__', urlset); if (output) { await writeFile(join(output, 'sitemap.xml'), sitemap, 'utf-8'); diff --git a/src/generators/sitemap/template.xml b/src/generators/sitemap/template.xml new file mode 100644 index 00000000..84771792 --- /dev/null +++ b/src/generators/sitemap/template.xml @@ -0,0 +1,4 @@ + + +__URLSET__ + From 914652cbc4efdd1e4531dd1f95c0a0461ca031bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guilherme=20Ara=C3=BAjo?= Date: Thu, 25 Dec 2025 15:53:43 -0300 Subject: [PATCH 3/3] refactor: review --- src/generators/sitemap/index.mjs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/generators/sitemap/index.mjs b/src/generators/sitemap/index.mjs index 1ecf48e2..a6b9d590 100644 --- a/src/generators/sitemap/index.mjs +++ b/src/generators/sitemap/index.mjs @@ -45,23 +45,19 @@ export default { }; }); - const mainPages = [ - { - loc: new URL('/docs/latest/api/', BASE_URL).href, - lastmod, - changefreq: 'daily', - priority: '1.0', - }, - ]; - - const allPages = [...mainPages, ...apiPages]; + apiPages.push({ + loc: new URL('/docs/latest/api/', BASE_URL).href, + lastmod, + changefreq: 'daily', + priority: '1.0', + }); const template = await readFile( join(import.meta.dirname, 'template.xml'), 'utf-8' ); - const urlset = allPages + const urlset = apiPages .map( page => dedent`