vitepress-sidebar
Version:
A VitePress auto sidebar plugin that automatically creates a simple configuration.
1 lines • 6.39 kB
JavaScript
import{join as e,resolve as r}from"path";import{globSync as t}from"glob";import{existsSync as o,readdirSync as n,statSync as l}from"fs";import{isTrueMinimumNumberOfTimes as a,objMergeNewKey as i}from"qsu";import{debugPrint as s,deepDeleteKey as d,generateNotTogetherMessage as u,getDateFromFile as m,getDateFromFrontmatter as c,getExcludeFromFrontmatter as y,getOrderFromFrontmatter as p,getTitleFromMd as f,removePrefixFromTitleAndLink as F,sortByFileTypes as x,sortByObjectKey as h}from"./helper.js";import{createSidebarHmrPlugin as B}from"./external.js";function M(e,a,i,s,u){if("number"==typeof u.excludeByFolderDepth&&u.excludeByFolderDepth<=e)return[];const F=t("**",{cwd:a,maxDepth:1,ignore:u.excludeByGlobPattern||u.excludePattern||[],dot:!0,follow:u.followSymlinks??!1});let B=n(a);if(u.manualSortFileNameByPriority.length>0){const e=B.filter(e=>-1!==u.manualSortFileNameByPriority?.indexOf(e)),r=B.filter(e=>-1===u.manualSortFileNameByPriority?.indexOf(e));e.sort((e,r)=>u.manualSortFileNameByPriority.indexOf(e)-u.manualSortFileNameByPriority.indexOf(r)),B=[...e,...r]}let P=B.map(t=>{const n=r(a,t);let d=`${i}/${t}`.replace(/\/{2}/,"/");if(d=d.endsWith("/index.md")?d.replace("index.md",""):d.replace(/\.md$/,""),u.documentRootPath&&d.startsWith(u.documentRootPath)&&(1===e&&(d=d.replace(new RegExp(`^${u.documentRootPath}`,"g"),"")),u.scanStartPath||u.resolvePath?(d=d.replace(/^\//g,""),u.scanStartPath&&(d=d.replace(new RegExp(`^${u.scanStartPath}`,"g"),"")),d=d.replace(/^\/(?!$)/g,""),"/"===d&&(d="index.md")):d.startsWith("/")||(d=`/${d}`)),d||(d="index.md"),/\.vitepress/.test(n))return null;if(/node_modules/.test(n))return null;if(1===e&&"index.md"===t&&!u.includeRootIndexFile)return null;if(1!==e&&"index.md"===t&&!u.includeFolderIndexFile)return null;if(!u.includeDotFiles&&/^\./.test(t))return null;if(!F.includes(t))return null;if(l(n).isDirectory()){let l,a=M(e+1,n,d,t,u)||[],i=!1,s=f(t,n,u,!0,()=>{i=!0}),y=n,F=!1;const x=`${n}/index.md`,h=a.find(e=>e.text===t);return u.useFolderLinkFromSameNameSubFile&&h&&(y=r(n,`${h.text}.md`),s=f(t,y,u,!1,()=>{i=!0}),l=u.folderLinkNotIncludesFileName?`${d}/`:h.link,a=a.filter(e=>e.text!==t)),o(x)&&(u.includeFolderIndexFile&&(F=!0),u.useFolderLinkFromIndexFile&&(F=!0,y=x,l=`${d}/index.md`),u.useFolderTitleFromIndexFile&&!i&&(F=!0,y=x,s=f("index",y,u,!1))),l&&!1!==u.includeEmptyFolder||u.includeEmptyFolder||a.length>0||F?{text:s,...l?{link:l}:{},...a.length>0?{items:a}:{},...null===u.collapsed||void 0===u.collapsed||a.length<1||"number"==typeof u.collapseFromLevel&&e<u.collapseFromLevel?{}:{collapsed:e>=u.collapseDepth&&u.collapsed},...u.sortMenusByFrontmatterOrder?{order:p(y,u.frontmatterOrderDefaultValue)}:{},...u.sortMenusByFrontmatterDate?{date:c(n)}:{},...u.sortMenusByFileCreateDate?{date:m(n)}:{},...u.sortMenusByFileModifyDate?{date:m(n,!0)}:{}}:null}if(n.endsWith(".md")){if(y(n,u.excludeFilesByFrontmatterFieldName))return null;let e;const r=t.replace(/\.md$/,"");return e=u.useFolderLinkFromSameNameSubFile&&s===r?r:f(t,n,u,!1),{text:e,link:d,...u.sortMenusByFrontmatterOrder?{order:p(n,u.frontmatterOrderDefaultValue)}:{},...u.sortMenusByFrontmatterDate?{date:c(n)}:{},...u.sortMenusByFileCreateDate?{date:m(n)}:{},...u.sortMenusByFileModifyDate?{date:m(n,!0)}:{}}}return null}).filter(e=>null!==e);return u.sortMenusByName&&(P=h({arr:P,key:"text",desc:u.sortMenusOrderByDescending})),u.sortMenusByFileDatePrefix&&(P=h({arr:P,key:"text",desc:u.sortMenusOrderByDescending,dateSortFromTextWithPrefix:!0,datePrefixSeparator:u.prefixSeparator})),u.sortMenusByFrontmatterOrder&&(P=h({arr:P,key:"order",desc:u.sortMenusOrderByDescending,numerically:!0}),d(P,"order")),(u.sortMenusByFrontmatterDate||u.sortMenusByFileCreateDate||u.sortMenusByFileModifyDate)&&(P=h({arr:P,key:"date",desc:u.sortMenusOrderByDescending,dateSortFromFrontmatter:!0}),d(P,"date")),u.sortMenusOrderNumericallyFromTitle&&(P=h({arr:P,key:"text",desc:u.sortMenusOrderByDescending,numerically:!0})),u.sortMenusOrderNumericallyFromLink&&(P=h({arr:P,key:"link",desc:u.sortMenusOrderByDescending,numerically:!0})),u.sortFolderTo&&(P=x(P,u.sortFolderTo)),P}export function generateSidebar(r){const t={},o=Array.isArray(r);let n,l,i=!1;if(arguments.length>1)throw new Error("You must pass 1 argument, see the documentation for details.");n=void 0===r?[{}]:Array.isArray(r)?r:[r];for(let r=0;r<n.length;r+=1){const o=n[r];if(a([o.sortMenusByFrontmatterOrder,o.sortMenusByName,o.sortMenusByFileDatePrefix],2))throw new Error(u(["sortMenusByFrontmatterOrder","sortMenusByName","sortMenusByFileDatePrefix"]));if(a([o.sortMenusByFrontmatterOrder,o.sortMenusOrderNumericallyFromTitle,o.sortMenusOrderNumericallyFromLink],2))throw new Error(u(["sortMenusByFrontmatterOrder","sortMenusOrderNumericallyFromTitle","sortMenusOrderNumericallyFromLink"]));if(a([o.sortMenusByFrontmatterOrder,o.sortMenusByFrontmatterDate],2))throw new Error(u(["sortMenusByFrontmatterOrder","sortMenusByFrontmatterDate"]));if(o.removePrefixAfterOrdering&&!o.prefixSeparator)throw new Error("'prefixSeparator' should not use empty string");o.debugPrint&&!i&&(i=!0),o.documentRootPath=o?.documentRootPath??"/",/^\//.test(o.documentRootPath)||(o.documentRootPath=`/${o.documentRootPath}`),o.collapseDepth&&(o.collapsed=!0),o.prefixSeparator||(o.prefixSeparator="."),o.collapseDepth=o?.collapseDepth??1,o.manualSortFileNameByPriority=o?.manualSortFileNameByPriority??[],o.frontmatterOrderDefaultValue=o?.frontmatterOrderDefaultValue??0;let l=o.documentRootPath;o.scanStartPath&&(l=`${o.documentRootPath}/${o.scanStartPath}`.replace(/\/{2,}/g,"/").replace("/$",""));let s=M(1,e(process.cwd(),l),l,null,o);o.removePrefixAfterOrdering&&(s=F(s,o)),t[o.resolvePath||"/"]={base:o.basePath||o.resolvePath||"/",items:s?.items||(o.rootGroupText||o.rootGroupLink||!0===o.rootGroupCollapsed||!1===o.rootGroupCollapsed?[{text:o.rootGroupText,...o.rootGroupLink?{link:o.rootGroupLink}:{},items:s,...null===o.rootGroupCollapsed?{}:{collapsed:o.rootGroupCollapsed}}]:s)}}return l=o||1!==Object.keys(t).length?t:Object.values(t)[0].items,i&&s(n,l),l}export function withSidebar(e,r){let t;t=void 0===r?[{}]:Array.isArray(r)?r:[r];let o=!1;t.forEach(e=>{e?.debugPrint&&!o&&(o=!0,e.debugPrint=!1)});const n={themeConfig:{sidebar:generateSidebar(r)}};e?.themeConfig?.sidebar&&(e.themeConfig.sidebar={});const l=i(e,n),a=B(r),d=l.vite??{};return d.plugins=[...d.plugins??[],a],l.vite=d,o&&s(r,l),l}