Newer
Older
express-blog / src / utils / qualifyLinks.js
const { baseUrl } = require("../utils/baseUrl");

const isDisabled = (item) => item?.disabled ?? false;
const isEnabled = (item) => !isDisabled(item);

function qualifyLink(href) {
  if (!href) return href;
  // Return unchanged if href is absolute URL or protocol-relative
  if (/^(?:[a-zA-Z][a-zA-Z\d+\-.]*:)?\/\//.test(href)) return href;
  // Prefix with baseUrl if relative
  return baseUrl + href;
}

const mapMenuTree = (links, transformFn) => {
  return links.filter(isEnabled).map((link) => {
    const processed = transformFn({ ...link });
    if (processed.submenu) {
      processed.submenu = mapMenuTree(processed.submenu, transformFn);
    }
    return processed;
  });
};

function qualifyNavLinks(links, baseUrl) {
  return mapMenuTree(links, (link) => {
    if (link.href) {
      link.href = qualifyLink(link.href, baseUrl);
    }
    return link;
  });
}

function qualifySitemapLinks(links) {
  return links.filter(isEnabled).map((item) => {
    const qualified = { ...item };

    if (typeof qualified.loc === "string") {
      qualified.loc = qualifyLink(qualified.loc);
    }

    if (Array.isArray(qualified.children)) {
      qualified.children = qualifySitemapLinks(qualified.children);
    }

    return qualified;
  });
}

module.exports = {
  qualifyNavLinks,
  mapMenuTree,
  qualifySitemapLinks,
  qualifyLink,
};