mermaid
Version:
Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.
5 lines (4 loc) • 11 kB
JavaScript
import{a as A}from"./chunk-R7JDMUKV.mjs";import{a as Y,b as H,c as w,d as X,e as J,f as x,g as T}from"./chunk-WUBWJARI.mjs";import{C as G}from"./chunk-4CAJECRU.mjs";import{a as I}from"./chunk-ZQN7UHIL.mjs";import{f as S,g as M,h as O}from"./chunk-4OADUZ5Q.mjs";import{a as B,c as k,e as N}from"./chunk-VRZKL3EH.mjs";import{b as P}from"./chunk-Z6V44ARX.mjs";import"./chunk-5IMINLNL.mjs";import"./chunk-ZNLK7HRR.mjs";import"./chunk-DZP67EKU.mjs";import"./chunk-2NMSUPJH.mjs";import"./chunk-VY2OSTJR.mjs";import"./chunk-STOV2HOB.mjs";import{_ as D}from"./chunk-QJSWEUOL.mjs";import{b as p}from"./chunk-H7VHZCWX.mjs";import{a as m}from"./chunk-AQ6EADP3.mjs";var _=m((t,e,o)=>Math.max(e,Math.min(o,t)),"clamp"),j=m((t="TB")=>{switch(t){case"BT":return"bottom";case"LR":return"right";case"RL":return"left";case"TB":default:return"top"}},"getDefaultSelfLoopSide"),K=m(t=>t==="flowchart"||t==="flowchart-v2"||t==="stateDiagram"||t==="er"||t==="classDiagram","shouldMergeSelfLoopSegments"),Q=["x","y","width","height","labelBBox","intersect","calcIntersect","diff","clusterNode"],V=m((t,e,o,a,r)=>{let g=[],h=new Set;if(o.forEach(({start:d,end:n})=>{d!==a&&h.add(d),n!==a&&h.add(n)}),h.forEach(d=>{let n=t.node(d);typeof n?.x=="number"&&typeof n?.y=="number"&&g.push(n)}),g.length===0&&o.forEach(({edge:d})=>{(d.points??[]).forEach(n=>{typeof n?.x=="number"&&typeof n?.y=="number"&&g.push(n)})}),g.length===0)return j(r);let l=g.reduce((d,n)=>({x:d.x+n.x/g.length,y:d.y+n.y/g.length}),{x:0,y:0}),c=l.x-e.x,s=l.y-e.y;return Math.abs(c)>Math.abs(s)?c>0?"right":"left":Math.abs(s)>0?s>0?"bottom":"top":j(r)},"getSelfLoopSide"),Z=m((t,e="top",o=0,a=0)=>{let r=t.x,g=t.y-o,h=t.width/2,l=t.height/2,c=Math.max(36,Math.min(100,t.width*.8)),s=_(Math.max(a,t.width*.35),36,c),d=_(Math.min(t.width,t.height)*.45,24,48);switch(e){case"bottom":{let n=g+l;return[{x:r-s/2,y:n},{x:r-s/2,y:n+d},{x:r+s/2,y:n+d},{x:r+s/2,y:n}]}case"right":{let n=r+h;return[{x:n,y:g-s/2},{x:n+d,y:g-s/2},{x:n+d,y:g+s/2},{x:n,y:g+s/2}]}case"left":{let n=r-h;return[{x:n,y:g-s/2},{x:n-d,y:g-s/2},{x:n-d,y:g+s/2},{x:n,y:g+s/2}]}case"top":default:{let n=g-l;return[{x:r-s/2,y:n},{x:r-s/2,y:n-d},{x:r+s/2,y:n-d},{x:r+s/2,y:n}]}}},"getSelfLoopPoints"),$=m((t,e,o="top",a=0,r={})=>{let h=t.x,l=t.y-a,c=r.width??0,s=r.height??0;switch(o){case"bottom":return{x:h,y:Math.max(...e.map(d=>d.y))+s/2+4};case"right":return{x:Math.max(...e.map(d=>d.x))+c/2+4,y:l};case"left":return{x:Math.min(...e.map(d=>d.x))-c/2-4,y:l};case"top":default:return{x:h,y:Math.min(...e.map(d=>d.y))-s/2-4}}},"getSelfLoopLabelPosition"),F=m((t,e=0,{mergeSelfLoops:o=!0}={})=>{let a=new Map,r=[],g=t.graph()?.rankdir;return t.edges().forEach(h=>{let l=t.edge(h);if(o&&l.selfLoop){let c=l.selfLoop.id;a.has(c)||a.set(c,[]),a.get(c).push({edge:l,start:h.v,end:h.w})}else r.push({edge:l,start:h.v,end:h.w})}),a.forEach(h=>{if(h.length!==3){h.forEach(u=>r.push(u));return}h.sort((u,E)=>u.edge.selfLoop.order-E.edge.selfLoop.order);let[l,c,s]=h,d=l.edge.originalEdge??c.edge.originalEdge??s.edge.originalEdge??c.edge,n=t.node(d.start);if(!n){h.forEach(u=>r.push(u));return}let i={width:c.edge.width,height:c.edge.height},L=V(t,n,h,d.start,g),b=Z(n,L,e,i.width??0),y=$(n,b,L,e,i),f={...c.edge,...d,id:d.id,points:b,start:d.start,end:d.end,x:y.x,y:y.y,width:i.width,height:i.height,labelStyle:c.edge.labelStyle,fromCluster:l.edge.fromCluster??c.edge.fromCluster??s.edge.fromCluster,toCluster:l.edge.toCluster??c.edge.toCluster??s.edge.toCluster};delete f.selfLoop,delete f.originalEdge,r.push({edge:f,start:f.start,end:f.end})}),r},"getEdgesToRender"),W=m(async({element:t,graph:e,diagramType:o,id:a,parentCluster:r,siteConfig:g})=>{let h=e.graph().rankdir;p.trace("Dir in recursive render - dir:",h);let{clusters:l,edgePaths:c,edgeLabels:s,nodes:d,rootGroups:n}=Y(t,{edgePathsClass:"edgePaths"});e.nodes()?p.info("Recursive render XXX",e.nodes()):p.info("No nodes found for",e),e.edges().length>0&&p.info("Recursive edges",e.edge(e.edges()[0]));let i=K(o);await Promise.all(e.nodes().map(async function(y){let f=e.node(y);if(r!==void 0){let u=JSON.parse(JSON.stringify(r.clusterData));p.trace(`Setting data for parent cluster XXX
Node.id = `,y,`
data=`,u.height,`
Parent cluster`,r.height),e.setNode(r.id,u),e.parent(y)||(p.trace("Setting parent",y,r.id),e.setParent(y,r.id,u))}if(p.info("(Insert) Node XXX"+y+": "+JSON.stringify(e.node(y))),f?.clusterNode){p.info("Cluster identified XBX",y,f.width,e.node(y));let{ranksep:u,nodesep:E}=e.graph();f.graph.setGraph({...f.graph.graph(),ranksep:u+25,nodesep:E});let R=await ne({element:d,graph:f.graph,diagramType:o,id:a,parentCluster:e.node(y),siteConfig:g}),C=R.elem;P(f,C),f.diff=R.diff||0,p.info("New compound node after recursive render XAX",y,"width",f.width,"height",f.height),k(C,f)}else e.children(y).length>0?(p.trace("Cluster - the non recursive path XBX",y,f.id,f,f.width,"Graph:",e),p.trace(X(f.id,e)),w.set(f.id,{id:X(f.id,e),node:f})):(p.trace("Node - the non recursive path XAX",y,d,e.node(y),h),await H(d,e.node(y),{config:g,dir:h}))})),await m(async()=>{let y=e.edges().map(async function(f){let u=e.edge(f.v,f.w,f.name);if(p.info("Edge "+f.v+" -> "+f.w+": "+JSON.stringify(f)),p.info("Edge "+f.v+" -> "+f.w+": ",f," ",JSON.stringify(e.edge(f))),p.info("Fix",w,"ids:",f.v,f.w,"Translating: ",w.get(f.v),w.get(f.w)),i&&u.selfLoop){if(u.selfLoop.order!==1)return;let E={...u.originalEdge,...u,id:u.selfLoop.id,startLabelLeft:u.originalEdge?.startLabelLeft??u.startLabelLeft,startLabelRight:u.originalEdge?.startLabelRight??u.startLabelRight,endLabelLeft:u.originalEdge?.endLabelLeft??u.endLabelLeft,endLabelRight:u.originalEdge?.endLabelRight??u.endLabelRight};await S(s,E),u.width=E.width,u.height=E.height,u.labelStyle=E.labelStyle;return}await S(s,u)});await Promise.all(y)},"processEdges")();let{subGraphTitleTotalMargin:b}=B(g);return{elem:n,graph:e,groups:{clusters:l,edgePaths:c,edgeLabels:s,nodes:d,rootGroups:n},diagramType:o,id:a,mergeSelfLoops:i,subGraphTitleTotalMargin:b}},"measureDagreGraph"),q=m(t=>{p.info("############################################# XXX"),p.info("### Layout ### XXX"),p.info("############################################# XXX"),A(t)},"runDagreGraphLayout"),v=m((t,e,o)=>{let a=t.node(e);if(!a)return;let r={...a};return a?.clusterNode?r.y=(a.y??0)+o:t.children(e).length>0?r.height=(a.height??0)+o:r.y=(a.y??0)+o/2,r},"normalizeDagreNode"),z=m((t,e)=>{Q.forEach(o=>{e[o]!==void 0&&(t[o]=e[o])})},"applyDagreNodeLayout"),ee=m((t,e,o,a)=>({...t,start:t.start??e,end:t.end??o,points:(t.points??[]).map(r=>({...r,y:typeof r.y=="number"?r.y+a:r.y}))}),"normalizeDagreEdge"),te=m((t,e)=>{let{graph:o,mergeSelfLoops:a,subGraphTitleTotalMargin:r=0}=e,g=new Map(t.nodes.map(l=>[l.id,l]));x(o).forEach(l=>{let c=v(o,l,r);if(!c)return;z(o.node(l),c);let s=g.get(l);s&&z(s,c)});let h=r/2;return t.edges=F(o,h,{mergeSelfLoops:a}).map(({edge:l,start:c,end:s})=>ee(l,c,s,h)),t},"applyDagreLayoutResult"),oe=m(async({elem:t,graph:e,groups:{clusters:o,edgePaths:a},diagramType:r,id:g,mergeSelfLoops:h,subGraphTitleTotalMargin:l})=>{let c=0;await Promise.all(x(e).map(async function(n){let i=e.node(n);if(p.info("Position XBX => "+n+": ("+i.x,","+i.y,") width: ",i.width," height: ",i.height),i?.clusterNode)i.y+=l,p.info("A tainted cluster node XBX1",n,i.id,i.width,i.height,i.x,i.y,e.parent(n)),w.get(i.id).node=i,N(i);else if(e.children(n).length>0){p.info("A pure cluster node XBX1",n,i.id,i.x,i.y,i.width,i.height,e.parent(n)),i.height+=l,e.node(i.parentId);let L=i?.padding/2||0,b=i?.labelBBox?.height||0,y=b-L||0;p.debug("OffsetY",y,"labelHeight",b,"halfPadding",L),await I(o,i),w.get(i.id).node=i}else{let L=e.node(i.parentId);i.y+=l/2,p.info("A regular node XBX1 - using the padding",i.id,"parent",i.parentId,i.width,i.height,i.x,i.y,"offsetY",i.offsetY,"parent",L,L?.offsetY,i),N(i)}}));let s=l/2;return F(e,s,{mergeSelfLoops:h}).forEach(function({edge:n,start:i,end:L}){p.info("Edge "+i+" -> "+L+": "+JSON.stringify(n),n),n.points.forEach(u=>u.y+=s);let b=e.node(i),y=e.node(L),f=O(a,n,w,r,b,y,g);M(n,f)}),e.nodes().forEach(function(n){let i=e.node(n);p.info(n,i.type,i.diff),i.isGroup&&(c=i.diff)}),p.warn("Returning from recursive render XAX",t,c),{elem:t,diff:c}},"paintDagreLayoutCore"),ne=m(async t=>{let e=await W(t);return q(e.graph),await oe(e)},"renderDagreSubgraph"),U=m(t=>{let e=new G({multigraph:!0,compound:!0}).setGraph({rankdir:t.direction,nodesep:t.config?.nodeSpacing||t.nodeSpacing||t.config?.flowchart?.nodeSpacing,ranksep:t.config?.rankSpacing||t.rankSpacing||t.config?.flowchart?.rankSpacing,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}});return t.nodes.forEach(o=>{e.setNode(o.id,{...o}),o.parentId&&e.setParent(o.id,o.parentId)}),p.debug("Edges:",t.edges),t.edges.forEach(o=>{if(o.start===o.end){let a=o.start,r=a+"---"+a+"---1",g=a+"---"+a+"---2",h=e.node(a);e.setNode(r,{domId:r,id:r,parentId:h.parentId,labelStyle:"",label:"",padding:0,shape:"labelRect",style:"",width:10,height:10}),e.setParent(r,h.parentId),e.setNode(g,{domId:g,id:g,parentId:h.parentId,labelStyle:"",padding:0,shape:"labelRect",label:"",style:"",width:10,height:10}),e.setParent(g,h.parentId);let l=structuredClone(o),c=structuredClone(o),s=structuredClone(o),d=structuredClone(o);c.originalEdge=l,c.selfLoop={id:l.id,order:0},s.originalEdge=l,s.selfLoop={id:l.id,order:1},d.originalEdge=l,d.selfLoop={id:l.id,order:2},c.label="",c.arrowTypeEnd="none",c.endLabelLeft="",c.endLabelRight="",c.startLabelLeft="",c.id=a+"-cyclic-special-1",s.startLabelRight="",s.startLabelLeft="",s.endLabelLeft="",s.endLabelRight="",s.arrowTypeStart="none",s.arrowTypeEnd="none",s.id=a+"-cyclic-special-mid",d.label="",d.startLabelRight="",d.startLabelLeft="",d.arrowTypeStart="none",h.isGroup&&(c.fromCluster=a,d.toCluster=a),d.id=a+"-cyclic-special-2",d.arrowTypeStart="none",e.setEdge(a,r,c,a+"-cyclic-special-0"),e.setEdge(r,g,s,a+"-cyclic-special-1"),e.setEdge(g,a,d,a+"-cyclic-special-2")}else e.setEdge(o.start,o.end,{...o},o.id)}),J(e),{graph:e}},"prepareLayoutForDagre"),re=m(async(t,{element:e,preparedLayout:o})=>{let a=o??U(t),r=D(),g=await W({element:e,graph:a.graph,diagramType:t.type,id:t.diagramId,parentCluster:void 0,siteConfig:r});return a.measuredLayout=g,g},"measureDagreLayout"),ie=m((t,e)=>{let o=e.preparedLayout?.measuredLayout;if(!o)throw new Error("runDagreLayoutCore requires measureDagreLayout to run first");return q(o.graph),te(t,o),o},"runDagreLayoutCore"),se=m((t,{measure:e})=>x(e.graph).map(o=>e.graph.node(o)).filter(Boolean),"getDagrePaintNodes"),de=m((t,e,{measure:o})=>t?o.graph.node(t):void 0,"getDagreEdgeNode"),xe=T({prepareLayout:U,measureLayout:re,runLayoutCore:ie,paintOptions:{clusterDb:w,getNodes:se,getEdgeNode:de,skipNode:m((t,{measure:e})=>!e.graph.hasNode(t.id),"skipNode"),isCluster:m((t,{measure:e})=>e.graph.hasNode(t.id)&&(e.graph.children(t.id)??[]).length>0,"isCluster")}});export{te as applyDagreLayoutResult,F as getEdgesToRender,re as measureDagreLayout,U as prepareLayoutForDagre,xe as render,ie as runDagreLayoutCore};