UNPKG

typedoc-theme-hierarchy

Version:
191 lines (183 loc) 8.69 kB
import { createRequire } from 'module'; const require = createRequire(import.meta.url); var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { get: (a, b) => (typeof require !== "undefined" ? require : a)[b] }) : x)(function(x) { if (typeof require !== "undefined") return require.apply(this, arguments); throw Error('Dynamic require of "' + x + '" is not supported'); }); // src/index.tsx import { JSX as JSX2 } from "typedoc"; // src/themes/OverrideTheme.tsx import fse from "fs-extra"; import path2 from "path"; import { DefaultTheme, RendererEvent } from "typedoc"; // src/themes/OverrideThemeContext.tsx import { DefaultThemeRenderContext } from "typedoc"; // src/partials/navigation.tsx import path from "path"; import * as process from "process"; import { JSX, ReflectionKind } from "typedoc"; var navigation = (context) => (props) => { const categories = formatFileHierarchy(props.model.project.children || []); return /* @__PURE__ */ JSX.createElement("div", { class: "tree" }, /* @__PURE__ */ JSX.createElement("div", { class: "tree-config" }, /* @__PURE__ */ JSX.createElement("button", { class: "tree-config__button tree-config__button--expand js-tree-expand", title: "Expand All" }, /* @__PURE__ */ JSX.createElement( "svg", { xmlns: "http://www.w3.org/2000/svg", x: "0px", y: "0px", viewBox: "0 0 490.72 490.72", fill: "currentColor" }, /* @__PURE__ */ JSX.createElement("path", { d: "M480.027,288.027H10.693c-5.867,0-10.667,4.8-10.667,10.667c0,5.867,4.8,10.667,10.667,10.667h213.333v144.96l-45.76-45.76c-4.267-4.053-10.987-3.947-15.04,0.213c-3.947,4.16-3.947,10.667,0,14.827l64,64c4.16,4.16,10.88,4.16,15.04,0l64-64c4.053-4.267,3.947-10.987-0.213-15.04c-4.16-3.947-10.667-3.947-14.827,0l-45.867,45.76V309.36h234.667c5.867,0,10.667-4.8,10.667-10.667C490.693,292.827,485.893,288.027,480.027,288.027z" }), /* @__PURE__ */ JSX.createElement("path", { d: "M10.693,224.027h469.333c5.867,0,10.667-4.8,10.667-10.667c0-5.867-4.8-10.667-10.667-10.667H245.36V36.4l45.76,45.76c4.267,4.053,10.987,3.947,15.04-0.213c3.947-4.16,3.947-10.667,0-14.827l-64-64c-4.16-4.16-10.88-4.16-15.04,0l-64,64c-4.053,4.267-3.947,10.987,0.213,15.04c4.16,3.947,10.667,3.947,14.827,0l45.867-45.76v166.293H10.693c-5.867,0-10.667,4.8-10.667,10.667C0.027,219.227,4.827,224.027,10.693,224.027z" }) )), /* @__PURE__ */ JSX.createElement( "button", { class: "tree-config__button tree-config__button--collapse js-tree-collapse", title: "Collapse All" }, /* @__PURE__ */ JSX.createElement("svg", { viewBox: "0 0 16 16", xmlns: "http://www.w3.org/2000/svg", fill: "currentColor" }, /* @__PURE__ */ JSX.createElement( "path", { "fill-rule": "evenodd", d: "M1 8a.5.5 0 0 1 .5-.5h13a.5.5 0 0 1 0 1h-13A.5.5 0 0 1 1 8zm7-8a.5.5 0 0 1 .5.5v3.793l1.146-1.147a.5.5 0 0 1 .708.708l-2 2a.5.5 0 0 1-.708 0l-2-2a.5.5 0 1 1 .708-.708L7.5 4.293V.5A.5.5 0 0 1 8 0zm-.5 11.707-1.146 1.147a.5.5 0 0 1-.708-.708l2-2a.5.5 0 0 1 .708 0l2 2a.5.5 0 0 1-.708.708L8.5 11.707V15.5a.5.5 0 0 1-1 0v-3.793z" } )) ), /* @__PURE__ */ JSX.createElement( "button", { class: "tree-config__button tree-config__button--target js-tree-target", title: "Scroll to current file" }, /* @__PURE__ */ JSX.createElement("svg", { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", fill: "currentColor" }, /* @__PURE__ */ JSX.createElement("circle", { cx: "12", cy: "12", r: "3" }), /* @__PURE__ */ JSX.createElement("path", { d: "M13 4.069V2h-2v2.069A8.008 8.008 0 0 0 4.069 11H2v2h2.069A8.007 8.007 0 0 0 11 19.931V22h2v-2.069A8.007 8.007 0 0 0 19.931 13H22v-2h-2.069A8.008 8.008 0 0 0 13 4.069zM12 18c-3.309 0-6-2.691-6-6s2.691-6 6-6 6 2.691 6 6-2.691 6-6 6z" })) )), /* @__PURE__ */ JSX.createElement("div", { class: "tree-content" }, /* @__PURE__ */ JSX.createElement(Navigation, { ...categories, context }))); }; var Navigation = ({ id, categories, items, context }) => /* @__PURE__ */ JSX.createElement("ul", { class: "js-category-list category", "data-id": id }, Object.entries(categories).map(([key, item]) => /* @__PURE__ */ JSX.createElement("li", null, /* @__PURE__ */ JSX.createElement("span", { class: "js-category-title category__title", "data-id": item.id }, /* @__PURE__ */ JSX.createElement("div", { class: "category__folder", "data-id": item.id }), key), /* @__PURE__ */ JSX.createElement(Navigation, { id: item.id, categories: item.categories, items: item.items, context }))), items.map((item) => /* @__PURE__ */ JSX.createElement("li", null, /* @__PURE__ */ JSX.createElement(Item, { item, context })))); var Item = ({ item, context }) => { if (`id` in item) { return /* @__PURE__ */ JSX.createElement(JSX.Fragment, null, /* @__PURE__ */ JSX.createElement( "a", { class: "category__link js-category-link category__link--ts", href: context.urlTo(item), "data-id": `/${context.router.getFullUrl(item)}` }, item.title ), /* @__PURE__ */ JSX.createElement("ul", null, item.children?.map((subItem) => /* @__PURE__ */ JSX.createElement("li", null, /* @__PURE__ */ JSX.createElement( "a", { class: "category__link js-category-link", href: context.urlTo(subItem), "data-id": `/${context.router.getFullUrl(subItem)}` }, context.icons[subItem.kind](), subItem.name ))))); } return /* @__PURE__ */ JSX.createElement(JSX.Fragment, null, /* @__PURE__ */ JSX.createElement("span", { class: "category__link category__link--disable js-category-link category__link--ts" }, item.title), /* @__PURE__ */ JSX.createElement("ul", null, item.children.map((subItem) => /* @__PURE__ */ JSX.createElement("li", null, /* @__PURE__ */ JSX.createElement( "a", { class: "category__link js-category-link", href: context.urlTo(subItem), "data-id": `/${context.router.getFullUrl(subItem)}` }, context.icons[subItem.kind](), subItem.name ))))); }; var getName = (item) => { const fullFileName = item.sources?.[0]?.fullFileName || ``; const targetFileName = fullFileName.replaceAll(path.sep, `/`); const currentDirName = process.cwd().replaceAll(path.sep, `/`); return targetFileName.replace(currentDirName, ``).slice(1); }; var formatFileHierarchy = (values) => { const result = { items: [], categories: {}, id: `root` }; for (const item of values) { const titleSplit = getName(item).split(`/`); addToCategory(result, item, titleSplit, 0); } return result; }; var addToCategory = (category, item, titleSplit, idx) => { if (idx === titleSplit.length - 1) { if (item.kind === ReflectionKind.Module) { item.title = titleSplit[idx] || ``; item.children = item.children || []; category.items.push(item); return; } const existsFile = category.items.find((existItem) => existItem.title === titleSplit[idx]); if (!existsFile) { category.items.push({ title: titleSplit[idx] ?? ``, children: [item] }); return; } existsFile.children?.push(item); return; } const title = titleSplit[idx]; if (!title) { return; } if (!category.categories[title]) { category.categories[title] = { items: [], categories: {}, id: `${category.id}-${title}` }; } const categoryToAdd = category.categories[title]; if (!categoryToAdd) { return; } addToCategory(categoryToAdd, item, titleSplit, idx + 1); }; // src/themes/OverrideThemeContext.tsx var OverrideThemeContext = class extends DefaultThemeRenderContext { navigation = (context) => navigation(this)(context); }; // src/themes/OverrideTheme.tsx var OverrideTheme = class extends DefaultTheme { constructor(renderer) { super(renderer); this.owner.on(RendererEvent.END, (event) => { fse.copySync( path2.join(__require.resolve(`typedoc-theme-hierarchy`), `../assets`), path2.join(event.outputDirectory, `assets`) ); }); } getRenderContext(page) { return new OverrideThemeContext(this.router, this, page, this.application.options); } }; // src/index.tsx var load = (app) => { app.renderer.hooks.on( `head.end`, (context) => /* @__PURE__ */ JSX2.createElement("link", { rel: "stylesheet", href: context.relativeURL(`assets/hierarchy.css`) }) ); app.renderer.hooks.on( `body.end`, (context) => /* @__PURE__ */ JSX2.createElement("script", { src: context.relativeURL(`assets/hierarchy-theme.js`) }) ); app.renderer.defineTheme(`hierarchy`, OverrideTheme); }; export { load };