-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathrelationships-page.ts
More file actions
84 lines (75 loc) · 1.99 KB
/
relationships-page.ts
File metadata and controls
84 lines (75 loc) · 1.99 KB
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import { type Relationship, type RelationshipsPageProps } from '../types';
import { generatedHeader } from './common';
import { relationDedupKey, relationToMermaid } from './erd';
/**
* Renders the relationships overview page with a cross-reference table and a Mermaid ER diagram.
*/
export function renderRelationshipsPage(props: RelationshipsPageProps): string {
return [
...renderHeader(props),
...renderCrossReferenceTable(props.relations),
...renderErDiagram(props.relations),
].join('\n');
}
/**
* Renders all relationships as a model/field/related-model/type cross-reference table.
*/
function renderCrossReferenceTable(relations: Relationship[]): string[] {
if (relations.length === 0) {
return [];
}
const lines = [
'## Cross-Reference',
'',
'| Model | Field | Related Model | Type |',
'| --- | --- | --- | --- |',
];
for (const rel of relations) {
lines.push(
`| [${rel.from}](./models/${rel.from}.md) | ${rel.field} | [${rel.to}](./models/${rel.to}.md) | ${rel.type} |`,
);
}
lines.push('');
return lines;
}
/**
* Renders a Mermaid ER diagram with deduplicated relationship connectors.
*/
function renderErDiagram(
relations: RelationshipsPageProps['relations'],
): string[] {
const seen = new Set<string>();
const mermaidLines: string[] = [];
for (const rel of relations) {
const key = relationDedupKey(rel);
if (seen.has(key)) {
continue;
}
seen.add(key);
mermaidLines.push(relationToMermaid(rel));
}
if (mermaidLines.length === 0) {
return [];
}
return [
'## Entity Relationship Diagram',
'',
'```mermaid',
'erDiagram',
...mermaidLines,
'```',
'',
];
}
/**
* Renders the relationships page header with breadcrumb back to the index.
*/
function renderHeader(props: RelationshipsPageProps): string[] {
return [
...generatedHeader(props.genCtx, props.includeGeneratedHeader),
'[Index](./index.md) / Relationships',
'',
'# Relationships',
'',
];
}