UNPKG

docusaurus-plugin-typedoc

Version:

A Docusaurus plugin to integrate TypeDoc ( + typedoc-plugin-markdown ) into a Docusaurus project.

84 lines (83 loc) 3.16 kB
import * as fs from 'fs'; import * as path from 'path'; import { adjustBaseDirectory } from '../utils/adjust-basedir.js'; export function writeSidebar(navigation, outputDir, sidebar, siteDir, docsPresetPath, numberPrefixParser) { if (sidebar?.autoConfiguration) { const sidebarFileName = sidebar.typescript ? 'typedoc-sidebar.ts' : 'typedoc-sidebar.cjs'; const sidebarPath = path.resolve(outputDir, sidebarFileName); let baseDir = path .relative(siteDir, outputDir) .split(path.sep) .slice(1) .join('/'); if (docsPresetPath) { baseDir = adjustBaseDirectory(baseDir, docsPresetPath); } const sidebarJson = getSidebar(navigation, baseDir, sidebar, numberPrefixParser); const sidebarContent = sidebar.typescript ? getTypescriptSidebar(sidebarJson, sidebar) : getJsSidebar(sidebarJson, sidebar); fs.writeFileSync(sidebarPath, sidebarContent); } } function getTypescriptSidebar(sidebarJson, sidebar) { return `import { SidebarsConfig } from '@docusaurus/plugin-content-docs'; const typedocSidebar: SidebarsConfig = { items: ${JSON.stringify(sidebarJson, null, sidebar.pretty ? 2 : 0)}}; export default typedocSidebar;`; } function getJsSidebar(sidebarJson, sidebar) { return `// @ts-check /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ const typedocSidebar = { items: ${JSON.stringify(sidebarJson, null, sidebar.pretty ? 2 : 0)}}; module.exports = typedocSidebar.items;`; } function getSidebar(navigation, basePath, options, numberPrefixParser) { return navigation .map((navigationItem) => getNavigationItem(navigationItem, basePath, options, numberPrefixParser)) .filter((navItem) => Boolean(navItem)); } function getNavigationItem(navigationItem, basePath, options, numberPrefixParser) { const navigationItemPath = navigationItem.path || navigationItem.url; const parsedUrl = numberPrefixParser === false ? navigationItemPath : navigationItemPath?.replace(/\d+-/g, ''); const getId = () => { const idParts = []; if (basePath.length > 0) { idParts.push(basePath); } if (parsedUrl) { idParts.push(parsedUrl.replace(/\\/g, '/')); } if (navigationItemPath) { return idParts.join('/').replace(/(.*)\.\w+$/, '$1'); } return null; }; const id = getId(); if (navigationItem.children?.length) { return { type: 'category', label: navigationItem.title, items: getSidebar(navigationItem.children, basePath, options, numberPrefixParser), ...(id && { link: { type: 'doc', id, }, }), }; } return id ? { type: 'doc', id, label: navigationItem.title, ...(navigationItem.isDeprecated && { className: options.deprecatedItemClassName, }), } : null; }