@mintlify/common
Version:
Commonly shared code within Mintlify
63 lines (62 loc) • 2.56 kB
JavaScript
import { divisionPropertyNameMap, divisions, } from '@mintlify/validation';
const excludedBreadcrumbDivisions = new Set(['versions', 'languages']);
function getStringProperty(obj, key) {
if (!(key in obj)) {
return '';
}
const value = Reflect.get(obj, key);
return typeof value === 'string' ? value : '';
}
function getDivisionTitle(item, key) {
if (key === 'groups') {
return getStringProperty(item, 'group');
}
if (key === 'products') {
return getStringProperty(item, 'name') || getStringProperty(item, 'product');
}
return getStringProperty(item, divisionPropertyNameMap[key]);
}
const MAX_RECURSION_DEPTH = 100;
export function generatePathToBreadcrumbsMapForDocsConfig(navigation) {
const pathToBreadcrumbs = new Map();
generatePathToBreadcrumbsMapForDocsConfigRecursive(navigation, pathToBreadcrumbs, []);
return pathToBreadcrumbs;
}
function generatePathToBreadcrumbsMapForDocsConfigRecursive(nav, map, currentBreadcrumbs = []) {
if ('pages' in nav) {
generatePathToBreadcrumbsMapForPagesRecursive(nav.pages, currentBreadcrumbs, map);
}
for (const key of [...divisions, 'groups']) {
if (key in nav) {
const items = nav[key];
if (!Array.isArray(items)) {
continue;
}
const includeDivisionInBreadcrumbs = key === 'groups' || !excludedBreadcrumbDivisions.has(key);
for (const item of items) {
const divisionTitle = includeDivisionInBreadcrumbs ? getDivisionTitle(item, key) : '';
const newBreadcrumbs = divisionTitle
? [...currentBreadcrumbs, divisionTitle]
: currentBreadcrumbs;
generatePathToBreadcrumbsMapForDocsConfigRecursive(item, map, newBreadcrumbs);
}
}
}
}
export function generatePathToBreadcrumbsMapForPagesRecursive(pages, currentBreadcrumbs, map, depth = 0) {
if (depth >= MAX_RECURSION_DEPTH)
return;
for (const entry of pages) {
if (typeof entry === 'string') {
const nonEmptyBreadcrumbs = currentBreadcrumbs.filter((crumb) => !!crumb.trim());
map.set(entry, [...nonEmptyBreadcrumbs]);
}
else {
currentBreadcrumbs.push(entry.group);
if ('pages' in entry && Array.isArray(entry.pages)) {
generatePathToBreadcrumbsMapForPagesRecursive(entry.pages, currentBreadcrumbs, map, depth + 1);
}
currentBreadcrumbs.pop();
}
}
}