@@ -43,17 +43,65 @@ describe('exportDOT', () => {
4343} ) ;
4444
4545describe ( 'exportMermaid' , ( ) => {
46- it ( 'generates valid Mermaid syntax' , ( ) => {
46+ it ( 'generates valid Mermaid syntax with flowchart LR default ' , ( ) => {
4747 const db = createTestDb ( ) ;
4848 const a = insertNode ( db , 'src/a.js' , 'file' , 'src/a.js' , 0 ) ;
4949 const b = insertNode ( db , 'src/b.js' , 'file' , 'src/b.js' , 0 ) ;
5050 insertEdge ( db , a , b , 'imports' ) ;
5151
5252 const mermaid = exportMermaid ( db ) ;
53- expect ( mermaid ) . toContain ( 'graph LR' ) ;
53+ expect ( mermaid ) . toContain ( 'flowchart LR' ) ;
5454 expect ( mermaid ) . toContain ( '-->' ) ;
5555 db . close ( ) ;
5656 } ) ;
57+
58+ it ( 'uses custom direction option' , ( ) => {
59+ const db = createTestDb ( ) ;
60+ const a = insertNode ( db , 'src/a.js' , 'file' , 'src/a.js' , 0 ) ;
61+ const b = insertNode ( db , 'src/b.js' , 'file' , 'src/b.js' , 0 ) ;
62+ insertEdge ( db , a , b , 'imports' ) ;
63+
64+ const mermaid = exportMermaid ( db , { direction : 'TB' } ) ;
65+ expect ( mermaid ) . toContain ( 'flowchart TB' ) ;
66+ db . close ( ) ;
67+ } ) ;
68+
69+ it ( 'groups files into directory subgraphs' , ( ) => {
70+ const db = createTestDb ( ) ;
71+ const a = insertNode ( db , 'src/a.js' , 'file' , 'src/a.js' , 0 ) ;
72+ const b = insertNode ( db , 'lib/b.js' , 'file' , 'lib/b.js' , 0 ) ;
73+ insertEdge ( db , a , b , 'imports' ) ;
74+
75+ const mermaid = exportMermaid ( db ) ;
76+ expect ( mermaid ) . toContain ( 'subgraph' ) ;
77+ expect ( mermaid ) . toContain ( '"src"' ) ;
78+ expect ( mermaid ) . toContain ( '"lib"' ) ;
79+ expect ( mermaid ) . toContain ( 'end' ) ;
80+ db . close ( ) ;
81+ } ) ;
82+
83+ it ( 'adds edge labels from edge kind' , ( ) => {
84+ const db = createTestDb ( ) ;
85+ const a = insertNode ( db , 'src/a.js' , 'file' , 'src/a.js' , 0 ) ;
86+ const b = insertNode ( db , 'src/b.js' , 'file' , 'src/b.js' , 0 ) ;
87+ insertEdge ( db , a , b , 'imports' ) ;
88+
89+ const mermaid = exportMermaid ( db ) ;
90+ expect ( mermaid ) . toContain ( '-->|imports|' ) ;
91+ db . close ( ) ;
92+ } ) ;
93+
94+ it ( 'collapses imports-type to imports label' , ( ) => {
95+ const db = createTestDb ( ) ;
96+ const a = insertNode ( db , 'src/a.js' , 'file' , 'src/a.js' , 0 ) ;
97+ const b = insertNode ( db , 'src/b.js' , 'file' , 'src/b.js' , 0 ) ;
98+ insertEdge ( db , a , b , 'imports-type' ) ;
99+
100+ const mermaid = exportMermaid ( db ) ;
101+ expect ( mermaid ) . toContain ( '-->|imports|' ) ;
102+ expect ( mermaid ) . not . toContain ( 'imports-type' ) ;
103+ db . close ( ) ;
104+ } ) ;
57105} ) ;
58106
59107describe ( 'exportDOT — function-level' , ( ) => {
@@ -107,12 +155,86 @@ describe('exportMermaid — function-level', () => {
107155 insertEdge ( db , fnA , fnB , 'calls' ) ;
108156
109157 const mermaid = exportMermaid ( db , { fileLevel : false } ) ;
110- expect ( mermaid ) . toContain ( 'graph LR' ) ;
158+ expect ( mermaid ) . toContain ( 'flowchart LR' ) ;
111159 expect ( mermaid ) . toContain ( 'doWork' ) ;
112160 expect ( mermaid ) . toContain ( 'helper' ) ;
113161 expect ( mermaid ) . toContain ( '-->' ) ;
114162 db . close ( ) ;
115163 } ) ;
164+
165+ it ( 'uses stadium shape for functions' , ( ) => {
166+ const db = createTestDb ( ) ;
167+ const fnA = insertNode ( db , 'doWork' , 'function' , 'src/a.js' , 5 ) ;
168+ const fnB = insertNode ( db , 'helper' , 'function' , 'src/b.js' , 10 ) ;
169+ insertEdge ( db , fnA , fnB , 'calls' ) ;
170+
171+ const mermaid = exportMermaid ( db , { fileLevel : false } ) ;
172+ expect ( mermaid ) . toContain ( '(["doWork"])' ) ;
173+ expect ( mermaid ) . toContain ( '(["helper"])' ) ;
174+ db . close ( ) ;
175+ } ) ;
176+
177+ it ( 'uses hexagon shape for classes' , ( ) => {
178+ const db = createTestDb ( ) ;
179+ const cls = insertNode ( db , 'MyClass' , 'class' , 'src/a.js' , 5 ) ;
180+ const fn = insertNode ( db , 'helper' , 'function' , 'src/b.js' , 10 ) ;
181+ insertEdge ( db , cls , fn , 'calls' ) ;
182+
183+ const mermaid = exportMermaid ( db , { fileLevel : false } ) ;
184+ expect ( mermaid ) . toContain ( '{{"MyClass"}}' ) ;
185+ db . close ( ) ;
186+ } ) ;
187+
188+ it ( 'uses subroutine shape for modules' , ( ) => {
189+ const db = createTestDb ( ) ;
190+ const mod = insertNode ( db , 'MyModule' , 'module' , 'src/a.js' , 5 ) ;
191+ const fn = insertNode ( db , 'helper' , 'function' , 'src/b.js' , 10 ) ;
192+ insertEdge ( db , mod , fn , 'calls' ) ;
193+
194+ const mermaid = exportMermaid ( db , { fileLevel : false } ) ;
195+ expect ( mermaid ) . toContain ( '[["MyModule"]]' ) ;
196+ db . close ( ) ;
197+ } ) ;
198+
199+ it ( 'adds edge labels for calls' , ( ) => {
200+ const db = createTestDb ( ) ;
201+ const fnA = insertNode ( db , 'doWork' , 'function' , 'src/a.js' , 5 ) ;
202+ const fnB = insertNode ( db , 'helper' , 'function' , 'src/b.js' , 10 ) ;
203+ insertEdge ( db , fnA , fnB , 'calls' ) ;
204+
205+ const mermaid = exportMermaid ( db , { fileLevel : false } ) ;
206+ expect ( mermaid ) . toContain ( '-->|calls|' ) ;
207+ db . close ( ) ;
208+ } ) ;
209+
210+ it ( 'groups functions by file into subgraphs' , ( ) => {
211+ const db = createTestDb ( ) ;
212+ const fnA = insertNode ( db , 'doWork' , 'function' , 'src/a.js' , 5 ) ;
213+ const fnB = insertNode ( db , 'helper' , 'function' , 'src/b.js' , 10 ) ;
214+ insertEdge ( db , fnA , fnB , 'calls' ) ;
215+
216+ const mermaid = exportMermaid ( db , { fileLevel : false } ) ;
217+ expect ( mermaid ) . toContain ( 'subgraph' ) ;
218+ expect ( mermaid ) . toContain ( '"src/a.js"' ) ;
219+ expect ( mermaid ) . toContain ( '"src/b.js"' ) ;
220+ expect ( mermaid ) . toContain ( 'end' ) ;
221+ db . close ( ) ;
222+ } ) ;
223+
224+ it ( 'applies role styling' , ( ) => {
225+ const db = createTestDb ( ) ;
226+ const fnA = insertNode ( db , 'doWork' , 'function' , 'src/a.js' , 5 ) ;
227+ const fnB = insertNode ( db , 'helper' , 'function' , 'src/b.js' , 10 ) ;
228+ // Add role to the nodes
229+ db . prepare ( 'UPDATE nodes SET role = ? WHERE id = ?' ) . run ( 'entry' , fnA ) ;
230+ db . prepare ( 'UPDATE nodes SET role = ? WHERE id = ?' ) . run ( 'utility' , fnB ) ;
231+ insertEdge ( db , fnA , fnB , 'calls' ) ;
232+
233+ const mermaid = exportMermaid ( db , { fileLevel : false } ) ;
234+ expect ( mermaid ) . toContain ( 'fill:#e8f5e9,stroke:#4caf50' ) ;
235+ expect ( mermaid ) . toContain ( 'fill:#f5f5f5,stroke:#9e9e9e' ) ;
236+ db . close ( ) ;
237+ } ) ;
116238} ) ;
117239
118240describe ( 'exportJSON' , ( ) => {
0 commit comments