collab/mermaid/docs/diagrams/mermaid-api-sequence.mmdblame
View source
6dd74de1---
6dd74de2references:
6dd74de3 - "File: /packages/mermaid/src/mermaidAPI.ts"
6dd74de4 - "File: /packages/mermaid/src/mermaid.ts"
6dd74de5generationTime: 2025-01-28T16:30:00.000Z
6dd74de6---
6dd74de7sequenceDiagram
6dd74de8 participant User as User/Browser
6dd74de9 participant Mermaid as mermaid.ts
6dd74de10 participant Queue as executionQueue
6dd74de11 participant API as mermaidAPI.ts
6dd74de12 participant Config as configApi
6dd74de13 participant Preprocessor as preprocessDiagram
6dd74de14 participant DiagramAPI as diagram-api
6dd74de15 participant Diagram as Diagram.fromText
6dd74de16 participant Renderer as diagram.renderer
6dd74de17 participant Styles as Styling System
6dd74de18 participant DOM as DOM/SVG
6dd74de19
6dd74de20 Note over User, DOM: Mermaid Complete API Flow
6dd74de21
6dd74de22 %% Initialization Phase
6dd74de23 User->>+Mermaid: mermaid.initialize(config)
6dd74de24 Mermaid->>+API: mermaidAPI.initialize(config)
6dd74de25
6dd74de26 API->>API: assignWithDepth({}, userOptions)
6dd74de27 API->>API: handle legacy fontFamily config
6dd74de28 API->>Config: saveConfigFromInitialize(options)
6dd74de29
6dd74de30 alt Theme Configuration Available
6dd74de31 API->>API: check if theme in theme object
6dd74de32 API->>API: set themeVariables from theme
6dd74de33 else Default Theme
6dd74de34 API->>API: use default theme variables
6dd74de35 end
6dd74de36
6dd74de37 API->>Config: setSiteConfig(options) or getSiteConfig()
6dd74de38 API->>API: setLogLevel(config.logLevel)
6dd74de39 API->>DiagramAPI: addDiagrams()
6dd74de40
6dd74de41 API-->>-Mermaid: initialization complete
6dd74de42 Mermaid-->>-User: ready to render
6dd74de43
6dd74de44 %% Content Loaded Event
6dd74de45 User->>DOM: document.load event
6dd74de46 DOM->>+Mermaid: contentLoaded()
6dd74de47
6dd74de48 opt startOnLoad is true
6dd74de49 Mermaid->>Config: getConfig()
6dd74de50 Config-->>Mermaid: { startOnLoad: true }
6dd74de51 Mermaid->>Mermaid: run()
6dd74de52 end
6dd74de53
6dd74de54 Mermaid-->>-DOM: event handling complete
6dd74de55
6dd74de56 %% Main Run Function
6dd74de57 User->>+Mermaid: mermaid.run(options)
6dd74de58
6dd74de59 Mermaid->>Mermaid: runThrowsErrors(options)
6dd74de60 Mermaid->>Config: getConfig()
6dd74de61 Config-->>Mermaid: configuration object
6dd74de62
6dd74de63 alt nodes provided
6dd74de64 Mermaid->>Mermaid: use provided nodes
6dd74de65 else querySelector provided
6dd74de66 Mermaid->>DOM: document.querySelectorAll(querySelector)
6dd74de67 DOM-->>Mermaid: nodesToProcess
6dd74de68 end
6dd74de69
6dd74de70 Mermaid->>Mermaid: new InitIDGenerator(deterministicIds, seed)
6dd74de71
6dd74de72 loop For each diagram element
6dd74de73 Mermaid->>DOM: check element.getAttribute('data-processed')
6dd74de74
6dd74de75 opt not processed
6dd74de76 Mermaid->>DOM: element.setAttribute('data-processed', 'true')
6dd74de77 Mermaid->>Mermaid: generate unique id
6dd74de78 Mermaid->>DOM: get element.innerHTML
6dd74de79 Mermaid->>Mermaid: entityDecode and clean text
6dd74de80 Mermaid->>Mermaid: detectInit(txt)
6dd74de81
6dd74de82 Mermaid->>Queue: render(id, txt, element)
6dd74de83 end
6dd74de84 end
6dd74de85
6dd74de86 Mermaid-->>-User: processing initiated
6dd74de87
6dd74de88 %% Render Function (Queued)
6dd74de89 activate Queue
6dd74de90 Queue->>+API: mermaidAPI.render(id, text, container)
6dd74de91
6dd74de92 API->>DiagramAPI: addDiagrams()
6dd74de93 API->>+Preprocessor: processAndSetConfigs(text)
6dd74de94
6dd74de95 Preprocessor->>Preprocessor: preprocessDiagram(text)
6dd74de96 Preprocessor->>Config: reset()
6dd74de97 Preprocessor->>Config: addDirective(processed.config)
6dd74de98 Preprocessor-->>-API: { code, config }
6dd74de99
6dd74de100 API->>Config: getConfig()
6dd74de101 Config-->>API: current configuration
6dd74de102
6dd74de103 opt text length > maxTextSize
6dd74de104 API->>API: text = MAX_TEXTLENGTH_EXCEEDED_MSG
6dd74de105 end
6dd74de106
6dd74de107 API->>API: setup id selectors and element IDs
6dd74de108 API->>API: determine security level (sandbox/loose)
6dd74de109
6dd74de110 %% DOM Setup
6dd74de111 alt svgContainingElement provided
6dd74de112 alt isSandboxed
6dd74de113 API->>DOM: sandboxedIframe(select(svgContainingElement), iFrameID)
6dd74de114 API->>DOM: select iframe contentDocument body
6dd74de115 else
6dd74de116 API->>DOM: select(svgContainingElement)
6dd74de117 end
6dd74de118 else no container
6dd74de119 API->>API: removeExistingElements(document, id, divId, iFrameId)
6dd74de120 alt isSandboxed
6dd74de121 API->>DOM: sandboxedIframe(select('body'), iFrameID)
6dd74de122 else
6dd74de123 API->>DOM: select('body')
6dd74de124 end
6dd74de125 end
6dd74de126
6dd74de127 API->>DOM: appendDivSvgG(root, id, enclosingDivID, fontFamily, XMLNS_XLINK_STD)
6dd74de128
6dd74de129 %% Diagram Creation
6dd74de130 API->>+Diagram: Diagram.fromText(text, { title: processed.title })
6dd74de131
6dd74de132 Diagram->>DiagramAPI: detect diagram type
6dd74de133 Diagram->>DiagramAPI: load appropriate diagram
6dd74de134 Diagram-->>-API: diagram instance
6dd74de135
6dd74de136 opt parsing error occurred
6dd74de137 API->>+Diagram: Diagram.fromText('error')
6dd74de138 Diagram-->>-API: error diagram
6dd74de139 API->>API: store parseEncounteredException
6dd74de140 end
6dd74de141
6dd74de142 %% Style Generation
6dd74de143 API->>DOM: get svg element and firstChild
6dd74de144 API->>Renderer: diag.renderer.getClasses(text, diag)
6dd74de145 Renderer-->>API: diagramClassDefs
6dd74de146
6dd74de147 API->>+Styles: createUserStyles(config, diagramType, diagramClassDefs, idSelector)
6dd74de148
6dd74de149 Styles->>Styles: createCssStyles(config, classDefs)
6dd74de150
6dd74de151 opt config.themeCSS defined
6dd74de152 Styles->>Styles: append themeCSS
6dd74de153 end
6dd74de154
6dd74de155 opt fontFamily configured
6dd74de156 Styles->>Styles: add CSS variables for fonts
6dd74de157 end
6dd74de158
6dd74de159 opt classDefs exist
6dd74de160 loop For each styleClassDef
6dd74de161 opt has styles
6dd74de162 Styles->>Styles: cssImportantStyles for each CSS element
6dd74de163 end
6dd74de164 opt has textStyles
6dd74de165 Styles->>Styles: cssImportantStyles for tspan elements
6dd74de166 end
6dd74de167 end
6dd74de168 end
6dd74de169
6dd74de170 Styles->>Styles: getStyles(graphType, userCSSstyles, themeVariables)
6dd74de171 Styles->>Styles: serialize(compile(svgId{allStyles}), stringify)
6dd74de172 Styles-->>-API: compiled CSS rules
6dd74de173
6dd74de174 API->>DOM: create style element
6dd74de175 API->>DOM: style.innerHTML = rules
6dd74de176 API->>DOM: svg.insertBefore(style, firstChild)
6dd74de177
6dd74de178 %% Diagram Rendering
6dd74de179 API->>+Renderer: diag.renderer.draw(text, id, version, diag)
6dd74de180
6dd74de181 Renderer->>Renderer: diagram-specific rendering logic
6dd74de182 Renderer->>DOM: create SVG elements
6dd74de183 Renderer->>DOM: apply positioning and styling
6dd74de184 Renderer-->>-API: rendered diagram
6dd74de185
6dd74de186 opt rendering error
6dd74de187 alt suppressErrorRendering
6dd74de188 API->>API: removeTempElements()
6dd74de189 API->>Mermaid: throw error
6dd74de190 else
6dd74de191 API->>Renderer: errorRenderer.draw(text, id, version)
6dd74de192 end
6dd74de193 end
6dd74de194
6dd74de195 %% Accessibility and Cleanup
6dd74de196 API->>DOM: select svg element
6dd74de197 API->>Diagram: diag.db.getAccTitle()
6dd74de198 API->>Diagram: diag.db.getAccDescription()
6dd74de199 API->>API: addA11yInfo(diagramType, svgNode, a11yTitle, a11yDescr)
6dd74de200
6dd74de201 API->>DOM: set xmlns for foreignobject elements
6dd74de202 API->>DOM: get innerHTML from enclosing div
6dd74de203
6dd74de204 API->>+API: cleanUpSvgCode(svgCode, isSandboxed, arrowMarkerAbsolute)
6dd74de205
6dd74de206 opt not useArrowMarkerUrls and not sandboxed
6dd74de207 API->>API: replace marker-end URLs with anchors
6dd74de208 end
6dd74de209
6dd74de210 API->>API: decodeEntities(svgCode)
6dd74de211 API->>API: replace <br> with <br/>
6dd74de212 API-->>-API: cleaned SVG code
6dd74de213
6dd74de214 alt isSandboxed
6dd74de215 API->>+API: putIntoIFrame(svgCode, svgEl)
6dd74de216 API->>API: calculate iframe height
6dd74de217 API->>API: toBase64 encode SVG content
6dd74de218 API->>API: create iframe with sandbox attributes
6dd74de219 API-->>-API: iframe HTML
6dd74de220 else not loose security
6dd74de221 API->>API: DOMPurify.sanitize(svgCode, options)
6dd74de222 end
6dd74de223
6dd74de224 API->>API: attachFunctions()
6dd74de225 API->>API: removeTempElements()
6dd74de226
6dd74de227 opt parseEncounteredException
6dd74de228 API->>Mermaid: throw parseEncounteredException
6dd74de229 end
6dd74de230
6dd74de231 API-->>-Queue: { diagramType, svg: svgCode, bindFunctions }
6dd74de232
6dd74de233 %% Return to Web Integration
6dd74de234 activate Mermaid
6dd74de235 Queue-->>Mermaid: render result
6dd74de236 Mermaid->>DOM: element.innerHTML = svg
6dd74de237
6dd74de238 opt postRenderCallback
6dd74de239 Mermaid->>User: postRenderCallback(id)
6dd74de240 end
6dd74de241
6dd74de242 opt bindFunctions exist
6dd74de243 Mermaid->>DOM: bindFunctions(element)
6dd74de244 end
6dd74de245 deactivate Mermaid
6dd74de246
6dd74de247 %% Parse Function Flow
6dd74de248 User->>+Mermaid: mermaid.parse(text, parseOptions)
6dd74de249 activate Queue
6dd74de250
6dd74de251 Queue->>+API: mermaidAPI.parse(text, parseOptions)
6dd74de252
6dd74de253 API->>DiagramAPI: addDiagrams()
6dd74de254 API->>Preprocessor: processAndSetConfigs(text)
6dd74de255 Preprocessor-->>API: { code, config }
6dd74de256 API->>Diagram: getDiagramFromText(code)
6dd74de257 Diagram-->>API: diagram instance
6dd74de258 API-->>-Queue: { diagramType: diagram.type, config }
6dd74de259
6dd74de260 Queue-->>-Mermaid: parse result
6dd74de261 Mermaid-->>-User: ParseResult or false
6dd74de262
6dd74de263 %% External Diagram Registration
6dd74de264 User->>+Mermaid: registerExternalDiagrams(diagrams, options)
6dd74de265
6dd74de266 Mermaid->>DiagramAPI: addDiagrams()
6dd74de267 Mermaid->>DiagramAPI: registerLazyLoadedDiagrams(...diagrams)
6dd74de268
6dd74de269 opt lazyLoad is false
6dd74de270 Mermaid->>DiagramAPI: loadRegisteredDiagrams()
6dd74de271 end
6dd74de272
6dd74de273 Mermaid-->>-User: registration complete
6dd74de274
6dd74de275 %% Error Handling
6dd74de276 Note over Mermaid, API: Error Handling Throughout
6dd74de277 alt Error occurs
6dd74de278 API->>Mermaid: throw error
6dd74de279 Mermaid->>+Mermaid: handleError(error, errors, parseError)
6dd74de280
6dd74de281 Mermaid->>Mermaid: log.warn(error)
6dd74de282
6dd74de283 alt isDetailedError
6dd74de284 Mermaid->>User: parseError(error.str, error.hash)
6dd74de285 else
6dd74de286 Mermaid->>User: parseError(error)
6dd74de287 end
6dd74de288
6dd74de289 opt not suppressErrors
6dd74de290 Mermaid->>User: throw error
6dd74de291 end
6dd74de292
6dd74de293 Mermaid-->>-User: error handled
6dd74de294 end
6dd74de295
6dd74de296 %% Configuration Details
6dd74de297 Note over Config: Configuration Functions
6dd74de298 Note right of Config: Functions:<br/>- reset()<br/>- getConfig()<br/>- setConfig()<br/>- getSiteConfig()<br/>- updateSiteConfig()<br/>- saveConfigFromInitialize()
6dd74de299
6dd74de300 Note over Styles: CSS Generation
6dd74de301 Note right of Styles: Features:<br/>- createCssStyles()<br/>- createUserStyles()<br/>- cssImportantStyles()<br/>- Theme integration<br/>- Class definitions
6dd74de302
6dd74de303 Note over API: Security Levels
6dd74de304 Note right of API: Modes:<br/>- sandbox: iframe isolation<br/>- loose: minimal sanitization<br/>- default: DOMPurify sanitization
6dd74de305
6dd74de306 Note over API: Helper Functions
6dd74de307 Note right of API: Utilities:<br/>- cleanUpSvgCode()<br/>- putIntoIFrame()<br/>- appendDivSvgG()<br/>- removeExistingElements()