next-dynamic-sitemap
Version:
A lightweight, zero-touch sitemap generator for any nextjs project
83 lines (82 loc) • 2.73 kB
JavaScript
;
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
};
}