Stately
PackagesGraph

Mermaid

Converters for Mermaid diagram syntax. Each diagram type has its own dedicated converter with type specific node/edge data interfaces.

Converters for Mermaid diagram syntax. Each diagram type has its own dedicated converter with type-specific node/edge data interfaces.

Resources

API

import {
  // Sequence diagram
  fromMermaidSequence, toMermaidSequence, mermaidSequenceConverter,
  // Flowchart
  fromMermaidFlowchart, toMermaidFlowchart, mermaidFlowchartConverter,
  // State diagram
  fromMermaidState, toMermaidState, mermaidStateConverter,
  // Class diagram
  fromMermaidClass, toMermaidClass, mermaidClassConverter,
  // ER diagram
  fromMermaidER, toMermaidER, mermaidERConverter,
  // Mindmap
  fromMermaidMindmap, toMermaidMindmap, mermaidMindmapConverter,
  // Block diagram
  fromMermaidBlock, toMermaidBlock, mermaidBlockConverter,
} from '@statelyai/graph/mermaid';

All converters follow the same pattern — to* exports a graph as Mermaid syntax, from* parses Mermaid syntax into a graph:

const graph = fromMermaidFlowchart(`flowchart LR
  A[Start] --> B{Decision}
  B -->|Yes| C[OK]
  B -->|No| D[Fail]
`);
// a graph containing:
// nodes: - A - B - C - D
// edges: - (A -> B) - (B -> C) - (B -> D)

const mermaid = toMermaidFlowchart(graph);

Sequence Diagram

Actors are nodes, messages are edges. Activations/deactivations are self-edges with data.kind.

const graph = fromMermaidSequence(`sequenceDiagram
  participant Browser
  participant API
  participant DB
  Browser->>API: GET /users
  API->>DB: SELECT * FROM users
  DB-->>API: rows
  API-->>Browser: 200 OK
`);
// a graph containing:
// nodes: - Browser - API - DB
// edges: - (Browser -> API) - (API -> DB) - (DB -> API) - (API -> Browser)

const mermaid = toMermaidSequence(graph);

Types: SequenceNodeData (actorType, alias), SequenceEdgeData (kind, stroke, arrowType), SequenceGraphData (autoNumber, blocks), SequenceBlock


Flowchart

Nodes with shapes, edges with arrows. Subgraphs map to compound nodes via parentId.

const graph = fromMermaidFlowchart(`flowchart TD
  subgraph CI[CI Pipeline]
    A[Push Code] --> B[Run Tests]
    B --> C{Pass?}
  end
  C -->|Yes| D[Deploy]
  C -->|No| E[Fix & Retry]
  E --> A
`);
// a graph containing:
// nodes: - CI - A - B - C - D - E
// edges: - (A -> B) - (B -> C) - (C -> D) - (C -> E) - (E -> A)

const mermaid = toMermaidFlowchart(graph);

Types: FlowchartNodeData (classes, link, tooltip), FlowchartEdgeData (stroke, arrowType, bidirectional), FlowchartGraphData (classDefs)


State Diagram

State ID is the label. Descriptions go in data.description. [*] maps to start/end pseudo-nodes.

const graph = fromMermaidState(`stateDiagram-v2
  [*] --> Idle
  Idle --> Loading: fetch
  Loading --> Error: fail
  Loading --> Success: done
  Error --> Loading: retry
  Success --> [*]
  state Loading {
    Requesting --> Parsing
  }
`);
// a graph containing:
// nodes: - [*]_start - Idle - Loading - Error - Success - [*]_end - Requesting - Parsing
// edges: - ([*]_start -> Idle) - (Idle -> Loading) - (Loading -> Error) - (Loading -> Success) - (Error -> Loading) - (Success -> [*]_end) - (Requesting -> Parsing)

const mermaid = toMermaidState(graph);

Types: StateNodeData (description, stateType, isStart, isEnd), StateEdgeData, StateGraphData


Class Diagram

Classes are nodes with members. Relationships (inheritance, composition, etc.) are edges with cardinality.

const graph = fromMermaidClass(`classDiagram
  class Animal {
    +String name
    +makeSound() void
  }
  class Dog {
    +fetch() void
  }
  class Cat {
    +purr() void
  }
  Animal <|-- Dog
  Animal <|-- Cat
`);
// a graph containing:
// nodes: - Animal - Dog - Cat
// edges: - (Animal -> Dog) - (Animal -> Cat)

const mermaid = toMermaidClass(graph);

Types: ClassNodeData (members, annotation, genericType), ClassEdgeData (relationType, sourceCardinality, targetCardinality)


ER Diagram

Entities are nodes with typed attributes. Relationships use crow's foot notation for cardinality.

const graph = fromMermaidER(`erDiagram
  CUSTOMER ||--o{ ORDER : places
  ORDER ||--|{ LINE_ITEM : contains
  CUSTOMER {
    string name PK
    string email
    int age
  }
  ORDER {
    int id PK
    date created
  }
`);
// a graph containing:
// nodes: - CUSTOMER - ORDER - LINE_ITEM
// edges: - (CUSTOMER -> ORDER) - (ORDER -> LINE_ITEM)

const mermaid = toMermaidER(graph);

Types: ERNodeData (attributes with type, name, key, comment), EREdgeData (sourceCardinality, targetCardinality, identifying)


Mindmap

Indentation-based hierarchy. Parent-child relationships become edges; nesting uses parentId.

const graph = fromMermaidMindmap(`mindmap
  root((Project Plan))
    Design
      Wireframes
      Prototypes
    Development
      Frontend
      Backend
    Testing
`);
// a graph containing:
// nodes: - root - Design - Wireframes - Prototypes - Development - Frontend - Backend - Testing
// edges: - (root -> Design) - (Design -> Wireframes) - (Design -> Prototypes) - (root -> Development) - (Development -> Frontend) - (Development -> Backend) - (root -> Testing)

const mermaid = toMermaidMindmap(graph);

Types: MindmapNodeData (icon), MindmapEdgeData, MindmapGraphData


Block Diagram

Grid-based layout with columns. Nested block:id ... end creates compound nodes.

const graph = fromMermaidBlock(`block-beta
  columns 3
  a["Frontend"] b["API Gateway"] c["Database"]
  a --> b
  b --> c
`);
// a graph containing:
// nodes: - a - b - c
// edges: - (a -> b) - (b -> c)

const mermaid = toMermaidBlock(graph);

Types: BlockNodeData (span), BlockEdgeData (stroke, arrowType), BlockGraphData (columns)

On this page