typedoc-theme-hierarchy
Version:
Hierarchy theme for typedoc
191 lines (183 loc) • 8.69 kB
JavaScript
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
};