UNPKG

@mintlify/common

Version:

Commonly shared code within Mintlify

63 lines (62 loc) 2.56 kB
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(); } } }