1
+ import { dbToTypes } from "../../data/datatypes" ;
2
+ import { jsonToMermaid } from "./mermaid" ;
3
+ import { databases } from "../../data/databases" ;
4
+
5
+ export function jsonToDocumentation ( obj ) {
6
+
7
+ const documentationSummary = obj . tables
8
+ . map ( ( table ) => {
9
+ return `\t- [${ table . name } ](#${ table . name } )` ;
10
+ } ) . join ( "\n" ) ;
11
+
12
+ const documentationEntities = obj . tables
13
+ . map ( ( table ) => {
14
+ let enums = "" ;
15
+ let indexes = table . indices . length > 0 ? table . indices . map ( ( index ) => {
16
+ return `| ${ index . name } | ${ index . unique ? "✅" : "" } | ${ index . fields . join ( ", " ) } |` ;
17
+ } ) . join ( "\n" ) : "" ;
18
+ const fields = table . fields
19
+ . map ( ( field ) => {
20
+ const fieldType =
21
+ field . type +
22
+ ( ( dbToTypes [ obj . database ] [ field . type ] . isSized ||
23
+ dbToTypes [ obj . database ] [ field . type ] . hasPrecision ) &&
24
+ field . size &&
25
+ field . size !== ""
26
+ ? "(" + field . size + ")"
27
+ : "" ) ;
28
+ enums += ( field . type === "ENUM" && field . values && field . values . length > 0 ) ?
29
+ `##### ${ field . name } \n\n${ field . values . map ( ( index ) => `- ${ index } ` ) . join ( "\n" ) } \n` : "" ;
30
+ return `| **${ field . name } ** | ${ fieldType } | ${ field . primary ? "🔑 PK, " : "" } ` +
31
+ `${ field . nullable ? "null " : "not null " } ${ field . unique ? ", unique" : "" } ${ field . increment ?", autoincrement" :"" } ` +
32
+ `${ field . default ? `, default: ${ field . default } ` : "" } | ` +
33
+ `${ relationshipByField ( table . id , obj . relationships , field . id ) } ` +
34
+ ` |${ field . comment ? field . comment : "" } |` ;
35
+ } ) . join ( "\n" ) ;
36
+ return `### ${ table . name } \n${ table . comment ? table . comment : "" } \n` +
37
+ `| Name | Type | Settings | References | Note |\n` +
38
+ `|-------------|---------------|-------------------------------|-------------------------------|--------------------------------|\n` +
39
+ `${ fields } \n${ enums . length > 0 ? "\n#### Enums\n" + enums : "" } \n` +
40
+ `${ indexes . length > 0 ? "\n#### Indexes\n| Name | Unique | Fields |\n|------|--------|--------|\n" + indexes : "" } ` ;
41
+ } ) . join ( "\n" ) ;
42
+
43
+ function relationshipByField ( table , relationships , fieldId ) {
44
+ return relationships . filter ( r => r . startTableId === table && r . startFieldId === fieldId )
45
+ . map ( ( rel ) => rel . name ) ;
46
+
47
+ }
48
+
49
+ const documentationRelationships = obj . relationships ?. length
50
+ ? obj . relationships
51
+ . map ( ( r ) => {
52
+ const startTable = obj . tables [ r . startTableId ] . name ;
53
+ const endTable = obj . tables [ r . endTableId ] . name ;
54
+ return `- **${ startTable } to ${ endTable } **: ${ r . cardinality } \n` ;
55
+ } ) . join ( "" ) : "" ;
56
+
57
+ const documentationTypes = databases [ obj . database ] . hasTypes && obj . types . length > 0 ? obj . types . map ( ( type ) => {
58
+ return `| Name | fields | Note |\n` +
59
+ `|-------------|---------------|--------------------------------|\n` +
60
+ `| ${ type . name } | ${ type . fields . map ( ( field ) => field . name ) . join ( ", " ) } | ${ type . comment ? type . comment : "" } |` ;
61
+ } ) . join ( "\n" ) : "" ;
62
+
63
+ return `# ${ obj . title } documentation\n## Summary\n\n- [Introduction](#introduction)\n- [Database Type](#database-type)\n` +
64
+ `- [Table Structure](#table-structure)\n${ documentationSummary } \n- [Relationships](#relationships)\n- [Database Diagram](#database-Diagram)\n\n` +
65
+ `## Introduction\n\n## Database type\n\n- **Database system:** ` +
66
+ `${ databases [ obj . database ] . name } \n## Table structure\n\n${ documentationEntities } ` +
67
+ `\n## Relationships\n\n${ documentationRelationships } \n` +
68
+ `${ databases [ obj . database ] . hasTypes && obj . types . length > 0 ? `## Types\n\n` + documentationTypes + `\n\n` : "" } ` +
69
+ `## Database Diagram\n\n\`\`\`mermaid\n${ jsonToMermaid ( obj ) } \n\`\`\`` ;
70
+ }
0 commit comments