UNPKG

@mintlify/validation

Version:

Validates mint.json files

101 lines (100 loc) 4.09 kB
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; };