@mintlify/validation
Version:
Validates mint.json files
101 lines (100 loc) • 4.09 kB
JavaScript
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import { divisions } from '../schemas/v2/properties/index.js';
import { upgradeToDocsConfig } from './upgradeToDocsConfig.js';
export const convertMintDecoratedNavToDocsDecoratedNav = (param) => {
const { type, decoratedNavigation, ignoreUnknownPages } = param;
let docsConfig;
if (type === 'mint') {
const { mintConfig } = param;
docsConfig = upgradeToDocsConfig(mintConfig);
}
else {
docsConfig = param.docsConfig;
}
const pagesAcc = {};
for (const decoratedNavigationEntry of decoratedNavigation) {
mapDecoratedNavigationToPages(decoratedNavigationEntry, pagesAcc);
}
const decoratedDocsConfig = generateDecoratedDocsNavigationFromPages(pagesAcc, docsConfig.navigation, ignoreUnknownPages);
return decoratedDocsConfig;
};
/**
* These functions are copied from other packages to avoid circular dependencies
*/
const generateDecoratedDocsNavigationFromPages = (filenamePageMetadataMap, docsConfigNav, ignoreUnknownPages) => {
const { global } = docsConfigNav, nav = __rest(docsConfigNav, ["global"]);
const generateDecoratedPages = (page) => {
const href = optionallyAddLeadingSlash(page);
const pageMetadata = filenamePageMetadataMap[href];
if (pageMetadata) {
return pageMetadata;
}
else if (!ignoreUnknownPages) {
console.log(`⚠️ "${page}" is defined in the docs.json navigation but the file does not exist.`);
return {
title: slugToTitle(page),
href,
};
}
};
const traverseNav = (nav) => {
let processed = Object.assign({}, nav);
if ('openapi' in processed) {
const { openapi: _ } = processed, rest = __rest(processed, ["openapi"]);
processed = Object.assign({}, rest);
}
if ('pages' in processed) {
processed.pages = processed.pages
.map((page) => typeof page === 'string' ? generateDecoratedPages(page) : traverseNav(page))
.filter((page) => page !== undefined);
}
['groups', ...divisions].forEach((division) => {
const divisionNav = processed[division];
if (Array.isArray(divisionNav)) {
processed = Object.assign(Object.assign({}, processed), { [division]: divisionNav.map((item) => traverseNav(item)) });
}
});
return processed;
};
return Object.assign({ global }, traverseNav(nav));
};
const mapDecoratedNavigationToPages = (entry, pagesAcc) => {
if (isGroup(entry)) {
for (const page of entry.pages) {
mapDecoratedNavigationToPages(page, pagesAcc);
}
}
else {
pagesAcc[entry.href] = entry;
}
};
const isGroup = (decoratedNavigation) => {
return decoratedNavigation.hasOwnProperty('group') && decoratedNavigation.hasOwnProperty('pages');
};
function optionallyAddLeadingSlash(filePath) {
if (filePath.startsWith('/')) {
return filePath;
}
return '/' + filePath;
}
const slugToTitle = (slug) => {
const indexOfQuestionMark = slug.indexOf('?');
if (indexOfQuestionMark > -1) {
slug = slug.substring(0, indexOfQuestionMark);
}
const slugArr = slug.split('/');
let defaultTitle = slugArr[slugArr.length - 1].split('-').join(' '); //replace all dashes
defaultTitle = defaultTitle.split('_').join(' '); //replace all underscores
defaultTitle = defaultTitle.charAt(0).toUpperCase() + defaultTitle.slice(1); //capitalize first letter
return defaultTitle;
};