@mintlify/prebuild
Version:
Helpful functions for Mintlify's prebuild step
86 lines (85 loc) • 3.62 kB
JavaScript
import { slugToTitle, optionallyAddLeadingSlash, removeLeadingSlash, optionallyRemoveTrailingSlash, } from '@mintlify/common';
import { divisions, } from '@mintlify/validation';
import { addWarning } from './prebuild/warnings.js';
const handleUnknownPage = (page, type) => {
addWarning({
type: 'missing-nav-page',
message: `"${page}" is referenced in the ${type}.json navigation but the file does not exist.`,
});
return {
title: slugToTitle(page),
href: optionallyAddLeadingSlash(page),
};
};
export const generateDecoratedMintNavigationFromPages = (filenamePageMetadataMap, mintConfigNav) => {
const createNav = (nav) => {
return {
...nav,
pages: nav.pages.map((page) => {
if (typeof page === 'string') {
const cleanedPage = optionallyRemoveTrailingSlash(removeLeadingSlash(page));
const pageMetadata = filenamePageMetadataMap[cleanedPage] ?? filenamePageMetadataMap[page];
if (pageMetadata) {
return pageMetadata;
}
else {
return handleUnknownPage(page, 'mint');
}
}
return createNav(page);
}),
};
};
return mintConfigNav.map((nav) => createNav(nav));
};
export const generateDecoratedDocsNavigationFromPages = (filenamePageMetadataMap, docsConfigNav) => {
const { global, ...nav } = docsConfigNav;
const stripInheritedHiddenFromPage = (pageMetadata, parentHidden) => {
if (!parentHidden || pageMetadata.hidden !== true) {
return pageMetadata;
}
const { hidden: _hidden, ...rest } = pageMetadata;
return rest;
};
const generateDecoratedPages = (page, parentHidden) => {
const cleanedPage = optionallyRemoveTrailingSlash(removeLeadingSlash(page));
const pageMetadata = filenamePageMetadataMap[cleanedPage] ?? filenamePageMetadataMap[page];
if (pageMetadata) {
return stripInheritedHiddenFromPage(pageMetadata, parentHidden);
}
else {
return handleUnknownPage(page, 'docs');
}
};
const traverseNav = (nav, parentHidden = false) => {
let processed = { ...nav };
const effectiveHidden = 'hidden' in processed && typeof processed.hidden === 'boolean'
? processed.hidden
: parentHidden;
if ('openapi' in processed) {
const { openapi: _, ...rest } = processed;
processed = { ...rest };
}
if ('root' in processed && typeof processed.root === 'string') {
processed.root = generateDecoratedPages(processed.root, effectiveHidden);
}
if ('pages' in processed) {
const processedPages = processed.pages.map((page) => typeof page === 'string'
? generateDecoratedPages(page, effectiveHidden)
: traverseNav(page, effectiveHidden));
// eslint-disable-next-line @typescript-eslint/no-explicit-any
processed.pages = processedPages;
}
['groups', ...divisions].forEach((division) => {
const divisionNav = processed[division];
if (Array.isArray(divisionNav)) {
processed = {
...processed,
[division]: divisionNav.map((item) => traverseNav(item, effectiveHidden)),
};
}
});
return processed;
};
return { global, ...traverseNav(nav) };
};