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