-
Notifications
You must be signed in to change notification settings - Fork 692
/
hierarchy.tsx
49 lines (41 loc) · 1.55 KB
/
hierarchy.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import type { DefaultThemeRenderContext } from "../DefaultThemeRenderContext";
import { JSX } from "../../../../utils";
import type { DeclarationHierarchy, Type } from "../../../../models";
const isLinkedReferenceType = (type: Type) =>
type.visit({
reference: (ref) => ref.reflection !== undefined,
}) ?? false;
function hasAnyLinkedReferenceType(h: DeclarationHierarchy | undefined): boolean {
if (!h) return false;
if (!h.isTarget && h.types.some(isLinkedReferenceType)) return true;
return hasAnyLinkedReferenceType(h.next);
}
export function hierarchy(context: DefaultThemeRenderContext, props: DeclarationHierarchy | undefined) {
if (!props) return;
const fullLink = hasAnyLinkedReferenceType(props) ? (
<>
{" "}
(<a href={context.relativeURL("hierarchy.html") + "#" + context.page.model.getFullName()}>view full</a>)
</>
) : (
<></>
);
return (
<section class="tsd-panel tsd-hierarchy">
<h4>Hierarchy{fullLink}</h4>
{hierarchyList(context, props)}
</section>
);
}
function hierarchyList(context: DefaultThemeRenderContext, props: DeclarationHierarchy) {
return (
<ul class="tsd-hierarchy">
{props.types.map((item, i, l) => (
<li>
{props.isTarget ? <span class="target">{item.toString()}</span> : context.type(item)}
{i === l.length - 1 && !!props.next && hierarchyList(context, props.next)}
</li>
))}
</ul>
);
}