* Render a merged symbol (with all its overloads).
( symbol: MergedSymbol, symbolLookup: SymbolLookup, )
| 94 | * Render a merged symbol (with all its overloads). |
| 95 | */ |
| 96 | async function renderMergedSymbol( |
| 97 | symbol: MergedSymbol, |
| 98 | symbolLookup: SymbolLookup, |
| 99 | ): Promise<string> { |
| 100 | const primaryNode = symbol.nodes[0] |
| 101 | if (!primaryNode) return '' // Safety check - should never happen |
| 102 | |
| 103 | const lines: string[] = [] |
| 104 | const id = createSymbolId(symbol.kind, symbol.name) |
| 105 | const hasOverloads = symbol.nodes.length > 1 |
| 106 | |
| 107 | lines.push(`<article class="docs-symbol" id="${id}">`) |
| 108 | |
| 109 | // Header |
| 110 | lines.push(`<header class="docs-symbol-header">`) |
| 111 | lines.push( |
| 112 | `<a href="#${id}" class="docs-anchor" aria-label="Link to ${escapeHtml(symbol.name)}">#</a>`, |
| 113 | ) |
| 114 | lines.push(`<h3 class="docs-symbol-name">${escapeHtml(symbol.name)}</h3>`) |
| 115 | lines.push(`<span class="docs-badge docs-badge--${symbol.kind}">${symbol.kind}</span>`) |
| 116 | if (primaryNode.functionDef?.isAsync) { |
| 117 | lines.push(`<span class="docs-badge docs-badge--async">async</span>`) |
| 118 | } |
| 119 | if (hasOverloads) { |
| 120 | lines.push(`<span class="docs-overload-count">${symbol.nodes.length} overloads</span>`) |
| 121 | } |
| 122 | lines.push(`</header>`) |
| 123 | |
| 124 | // Signatures |
| 125 | const signatures = symbol.nodes |
| 126 | .slice(0, hasOverloads ? MAX_OVERLOAD_SIGNATURES : 1) |
| 127 | .map(n => getNodeSignature(n)) |
| 128 | .filter(Boolean) as string[] |
| 129 | |
| 130 | const description = symbol.jsDoc?.doc?.trim() |
| 131 | const signaturePromise = |
| 132 | signatures.length > 0 ? highlightCodeBlock(signatures.join('\n'), 'typescript') : null |
| 133 | const descriptionPromise = description ? renderMarkdown(description, symbolLookup) : null |
| 134 | const jsDocTagsPromise = |
| 135 | symbol.jsDoc?.tags && symbol.jsDoc.tags.length > 0 |
| 136 | ? renderJsDocTags(symbol.jsDoc.tags, symbolLookup) |
| 137 | : null |
| 138 | const [highlightedSignature, renderedDescription, renderedJsDocTags] = await Promise.all([ |
| 139 | signaturePromise, |
| 140 | descriptionPromise, |
| 141 | jsDocTagsPromise, |
| 142 | ]) |
| 143 | |
| 144 | if (highlightedSignature) { |
| 145 | lines.push(`<div class="docs-signature">${highlightedSignature}</div>`) |
| 146 | |
| 147 | if (symbol.nodes.length > MAX_OVERLOAD_SIGNATURES) { |
| 148 | const remaining = symbol.nodes.length - MAX_OVERLOAD_SIGNATURES |
| 149 | lines.push(`<p class="docs-more-overloads">+ ${remaining} more overloads</p>`) |
| 150 | } |
| 151 | } |
| 152 | |
| 153 | // Description |
no test coverage detected