UNPKG

next-dynamic-sitemap

Version:

A lightweight, zero-touch sitemap generator for any nextjs project

83 lines (82 loc) 2.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateURL = generateURL; exports.generateXMLSitemap = generateXMLSitemap; exports.parameterizePath = parameterizePath; const constants_1 = require("./constants"); const types_1 = require("./types"); const xml2js_1 = require("xml2js"); const lodash_1 = require("lodash"); function generateURL(path) { return new URL(path, constants_1.BASE_URL).toString(); } function getChangeFreqRanking(changeFreq) { switch (changeFreq) { case types_1.ChangeFreq.NEVER: return 0; case types_1.ChangeFreq.YEARLY: return 1; case types_1.ChangeFreq.MONTHLY: return 2; case types_1.ChangeFreq.WEEKLY: return 3; case types_1.ChangeFreq.DAILY: return 4; case types_1.ChangeFreq.HOURLY: return 5; case types_1.ChangeFreq.ALWAYS: return 6; } return 0; } function generateXMLSitemap(urls) { const urlMap = {}; for (const url of urls) { if (!urlMap[url.loc]) { urlMap[url.loc] = url; continue; } const existing = urlMap[url.loc]; if (!existing.lastmod || new Date(existing.lastmod) < new Date(url.lastmod || 0)) { existing.lastmod = url.lastmod; } if (!existing.priority || existing.priority < (url.priority || 0)) { existing.priority = url.priority; } if (getChangeFreqRanking(existing.changefreq) < getChangeFreqRanking(url.changefreq)) { existing.changefreq = url.changefreq; } } const dedupedUrls = (0, lodash_1.orderBy)(Object.values(urlMap), ["priority", "loc", "lastmod"], ["desc", "asc", "desc"]); const map = { urlset: { $: { xmlns: "http://www.sitemaps.org/schemas/sitemap/0.9", }, url: dedupedUrls, }, }; const builder = new xml2js_1.Builder(); return builder.buildObject(map); } function parameterizePath(pagePath, pageURLPath, params) { let parameterizedPath = pagePath; let lastmod = pageURLPath; for (let key in params) { const param = params[key]; if (typeof param === "string") { const replaceValue = new RegExp(`\\[${key}]`, "g"); parameterizedPath = parameterizedPath.replace(replaceValue, param); } } if (params.lastModified instanceof Date) { lastmod = params.lastModified.toISOString(); } return { loc: generateURL(parameterizedPath), lastmod, priority: 0.4, // generated pages are lower priority than static pages }; }