mirror of
				https://github.com/mermaid-js/mermaid.git
				synced 2025-11-04 04:44:08 +01:00 
			
		
		
		
	Compare commits
	
		
			49 Commits
		
	
	
		
			add-blog-p
			...
			sidv/esbui
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					398969154a | ||
| 
						 | 
					f640b711ef | ||
| 
						 | 
					a39122b905 | ||
| 
						 | 
					1e652e7e62 | ||
| 
						 | 
					d8b91dbcf6 | ||
| 
						 | 
					978d017fd8 | ||
| 
						 | 
					dce65c6059 | ||
| 
						 | 
					d9faa6964e | ||
| 
						 | 
					91658a0c30 | ||
| 
						 | 
					d70de89dd8 | ||
| 
						 | 
					0644fdfee6 | ||
| 
						 | 
					698395ef52 | ||
| 
						 | 
					9eba560020 | ||
| 
						 | 
					ac1ff75806 | ||
| 
						 | 
					32abb54d8a | ||
| 
						 | 
					871b4ba226 | ||
| 
						 | 
					92378b5aa2 | ||
| 
						 | 
					26001d63d6 | ||
| 
						 | 
					edfc3933f9 | ||
| 
						 | 
					150d459a3d | ||
| 
						 | 
					df3de3dac7 | ||
| 
						 | 
					18ce8ea865 | ||
| 
						 | 
					26877c3f71 | ||
| 
						 | 
					32c45dd69b | ||
| 
						 | 
					fe83a78faf | ||
| 
						 | 
					665ef4195e | ||
| 
						 | 
					91e0b22c9a | ||
| 
						 | 
					ce5a1e7423 | ||
| 
						 | 
					f2d7e69bc9 | ||
| 
						 | 
					0f5e66e494 | ||
| 
						 | 
					986162db07 | ||
| 
						 | 
					908479a5e1 | ||
| 
						 | 
					63f4c5eb84 | ||
| 
						 | 
					6cc34dc9fd | ||
| 
						 | 
					ed04d73617 | ||
| 
						 | 
					220a9dcb61 | ||
| 
						 | 
					192aac388e | ||
| 
						 | 
					284ef24deb | ||
| 
						 | 
					a88789fe07 | ||
| 
						 | 
					fa5459d48b | ||
| 
						 | 
					2239996f3a | ||
| 
						 | 
					ac91b9db7a | ||
| 
						 | 
					e0951150b4 | ||
| 
						 | 
					dd2cacea15 | ||
| 
						 | 
					a0d9069eb0 | ||
| 
						 | 
					f48e48d5fd | ||
| 
						 | 
					1f5e6761df | ||
| 
						 | 
					ab8fb60b23 | ||
| 
						 | 
					9763c0370e | 
@@ -2,11 +2,6 @@
 | 
			
		||||
 * Shared common options for both ESBuild and Vite
 | 
			
		||||
 */
 | 
			
		||||
export const packageOptions = {
 | 
			
		||||
  parser: {
 | 
			
		||||
    name: 'mermaid-parser',
 | 
			
		||||
    packageName: 'parser',
 | 
			
		||||
    file: 'index.ts',
 | 
			
		||||
  },
 | 
			
		||||
  mermaid: {
 | 
			
		||||
    name: 'mermaid',
 | 
			
		||||
    packageName: 'mermaid',
 | 
			
		||||
@@ -22,9 +17,4 @@ export const packageOptions = {
 | 
			
		||||
    packageName: 'mermaid-zenuml',
 | 
			
		||||
    file: 'detector.ts',
 | 
			
		||||
  },
 | 
			
		||||
  'mermaid-flowchart-elk': {
 | 
			
		||||
    name: 'mermaid-flowchart-elk',
 | 
			
		||||
    packageName: 'mermaid-flowchart-elk',
 | 
			
		||||
    file: 'detector.ts',
 | 
			
		||||
  },
 | 
			
		||||
} as const;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +0,0 @@
 | 
			
		||||
import { generate } from 'langium-cli';
 | 
			
		||||
 | 
			
		||||
export async function generateLangium() {
 | 
			
		||||
  await generate({ file: `./packages/parser/langium-config.json` });
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
import { load, JSON_SCHEMA } from 'js-yaml';
 | 
			
		||||
import assert from 'node:assert';
 | 
			
		||||
import Ajv2019, { type JSONSchemaType } from 'ajv/dist/2019.js';
 | 
			
		||||
 | 
			
		||||
import type { MermaidConfig, BaseDiagramConfig } from '../packages/mermaid/src/config.type.js';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -16,15 +17,12 @@ const MERMAID_CONFIG_DIAGRAM_KEYS = [
 | 
			
		||||
  'er',
 | 
			
		||||
  'pie',
 | 
			
		||||
  'quadrantChart',
 | 
			
		||||
  'xyChart',
 | 
			
		||||
  'requirement',
 | 
			
		||||
  'mindmap',
 | 
			
		||||
  'timeline',
 | 
			
		||||
  'gitGraph',
 | 
			
		||||
  'c4',
 | 
			
		||||
  'sankey',
 | 
			
		||||
  'block',
 | 
			
		||||
  'packet',
 | 
			
		||||
] as const;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -36,7 +34,7 @@ const MERMAID_CONFIG_DIAGRAM_KEYS = [
 | 
			
		||||
 * @param mermaidConfigSchema - The Mermaid JSON Schema to use.
 | 
			
		||||
 * @returns The default mermaid config object.
 | 
			
		||||
 */
 | 
			
		||||
function generateDefaults(mermaidConfigSchema: JSONSchemaType<MermaidConfig>) {
 | 
			
		||||
export function generateDefaults(mermaidConfigSchema: JSONSchemaType<MermaidConfig>) {
 | 
			
		||||
  const ajv = new Ajv2019({
 | 
			
		||||
    useDefaults: true,
 | 
			
		||||
    allowUnionTypes: true,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +0,0 @@
 | 
			
		||||
import { packageOptions } from './common.js';
 | 
			
		||||
import { execSync } from 'child_process';
 | 
			
		||||
 | 
			
		||||
const buildType = (packageName: string) => {
 | 
			
		||||
  console.log(`Building types for ${packageName}`);
 | 
			
		||||
  try {
 | 
			
		||||
    const out = execSync(`tsc -p ./packages/${packageName}/tsconfig.json --emitDeclarationOnly`);
 | 
			
		||||
    out.length > 0 && console.log(out.toString());
 | 
			
		||||
  } catch (e) {
 | 
			
		||||
    console.error(e);
 | 
			
		||||
    e.stdout.length > 0 && console.error(e.stdout.toString());
 | 
			
		||||
    e.stderr.length > 0 && console.error(e.stderr.toString());
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
for (const { packageName } of Object.values(packageOptions)) {
 | 
			
		||||
  buildType(packageName);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										3
									
								
								.commitlintrc.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.commitlintrc.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
{
 | 
			
		||||
  "extends": ["@commitlint/config-conventional"]
 | 
			
		||||
}
 | 
			
		||||
@@ -1,140 +0,0 @@
 | 
			
		||||
# This file contains coding related terms
 | 
			
		||||
ALPHANUM
 | 
			
		||||
antiscript
 | 
			
		||||
APPLYCLASS
 | 
			
		||||
ARROWHEADSTYLE
 | 
			
		||||
ARROWTYPE
 | 
			
		||||
autonumber
 | 
			
		||||
axisl-line
 | 
			
		||||
Bigdecimal
 | 
			
		||||
birel
 | 
			
		||||
BIREL
 | 
			
		||||
bqstring
 | 
			
		||||
BQUOTE
 | 
			
		||||
bramp
 | 
			
		||||
BRKT
 | 
			
		||||
callbackargs
 | 
			
		||||
callbackname
 | 
			
		||||
classdef
 | 
			
		||||
classdefid
 | 
			
		||||
classentity
 | 
			
		||||
classname
 | 
			
		||||
COLONSEP
 | 
			
		||||
COMPOSIT_STATE
 | 
			
		||||
concat
 | 
			
		||||
controlx
 | 
			
		||||
controly
 | 
			
		||||
CSSCLASS
 | 
			
		||||
CYLINDEREND
 | 
			
		||||
CYLINDERSTART
 | 
			
		||||
datakey
 | 
			
		||||
DEND
 | 
			
		||||
descr
 | 
			
		||||
distp
 | 
			
		||||
distq
 | 
			
		||||
divs
 | 
			
		||||
docref
 | 
			
		||||
DOMID
 | 
			
		||||
doublecircle
 | 
			
		||||
DOUBLECIRCLEEND
 | 
			
		||||
DOUBLECIRCLESTART
 | 
			
		||||
DQUOTE
 | 
			
		||||
DSTART
 | 
			
		||||
edgesep
 | 
			
		||||
EMPTYSTR
 | 
			
		||||
enddate
 | 
			
		||||
ERDIAGRAM
 | 
			
		||||
flatmap
 | 
			
		||||
forwardable
 | 
			
		||||
frontmatter
 | 
			
		||||
funs
 | 
			
		||||
gantt
 | 
			
		||||
GENERICTYPE
 | 
			
		||||
getBoundarys
 | 
			
		||||
grammr
 | 
			
		||||
graphtype
 | 
			
		||||
iife
 | 
			
		||||
interp
 | 
			
		||||
introdcued
 | 
			
		||||
INVTRAPEND
 | 
			
		||||
INVTRAPSTART
 | 
			
		||||
JDBC
 | 
			
		||||
jison
 | 
			
		||||
Kaufmann
 | 
			
		||||
keyify
 | 
			
		||||
LABELPOS
 | 
			
		||||
LABELTYPE
 | 
			
		||||
lcov
 | 
			
		||||
LEFTOF
 | 
			
		||||
Lexa
 | 
			
		||||
linebreak
 | 
			
		||||
LINETYPE
 | 
			
		||||
LINKSTYLE
 | 
			
		||||
LLABEL
 | 
			
		||||
loglevel
 | 
			
		||||
LOGMSG
 | 
			
		||||
lookaheads
 | 
			
		||||
mdast
 | 
			
		||||
metafile
 | 
			
		||||
minlen
 | 
			
		||||
Mstartx
 | 
			
		||||
MULT
 | 
			
		||||
NODIR
 | 
			
		||||
NSTR
 | 
			
		||||
outdir
 | 
			
		||||
Qcontrolx
 | 
			
		||||
reinit
 | 
			
		||||
rels
 | 
			
		||||
reqs
 | 
			
		||||
rewritelinks
 | 
			
		||||
rgba
 | 
			
		||||
RIGHTOF
 | 
			
		||||
sankey
 | 
			
		||||
sequencenumber
 | 
			
		||||
shrc
 | 
			
		||||
signaltype
 | 
			
		||||
someclass
 | 
			
		||||
SPACELINE
 | 
			
		||||
SPACELIST
 | 
			
		||||
STADIUMEND
 | 
			
		||||
STADIUMSTART
 | 
			
		||||
startdate
 | 
			
		||||
startx
 | 
			
		||||
starty
 | 
			
		||||
STMNT
 | 
			
		||||
stopx
 | 
			
		||||
stopy
 | 
			
		||||
strikethrough
 | 
			
		||||
stringifying
 | 
			
		||||
struct
 | 
			
		||||
STYLECLASS
 | 
			
		||||
STYLEOPTS
 | 
			
		||||
subcomponent
 | 
			
		||||
subcomponents
 | 
			
		||||
SUBROUTINEEND
 | 
			
		||||
SUBROUTINESTART
 | 
			
		||||
Subschemas
 | 
			
		||||
substr
 | 
			
		||||
TAGEND
 | 
			
		||||
TAGSTART
 | 
			
		||||
techn
 | 
			
		||||
TESTSTR
 | 
			
		||||
TEXTDATA
 | 
			
		||||
TEXTLENGTH
 | 
			
		||||
titlevalue
 | 
			
		||||
topbar
 | 
			
		||||
TRAPEND
 | 
			
		||||
TRAPSTART
 | 
			
		||||
ts-nocheck
 | 
			
		||||
tsdoc
 | 
			
		||||
typeof
 | 
			
		||||
typestr
 | 
			
		||||
unshift
 | 
			
		||||
verifymethod
 | 
			
		||||
VERIFYMTHD
 | 
			
		||||
WARN_DOCSDIR_DOESNT_MATCH
 | 
			
		||||
xhost
 | 
			
		||||
yaxis
 | 
			
		||||
yfunc
 | 
			
		||||
yytext
 | 
			
		||||
zenuml
 | 
			
		||||
@@ -1,8 +0,0 @@
 | 
			
		||||
# Contributors to mermaidjs, one per line
 | 
			
		||||
Ashish Jain
 | 
			
		||||
cpettitt
 | 
			
		||||
Dong Cai
 | 
			
		||||
Nikolay Rozhkov
 | 
			
		||||
Peng Xiao
 | 
			
		||||
subhash-halder
 | 
			
		||||
Vinod Sidharth
 | 
			
		||||
@@ -1,52 +0,0 @@
 | 
			
		||||
# yaml-language-server: $schema=https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json
 | 
			
		||||
 | 
			
		||||
$schema: https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json
 | 
			
		||||
 | 
			
		||||
dictionaryDefinitions:
 | 
			
		||||
  - name: code-terms
 | 
			
		||||
    path: ./code-terms.txt
 | 
			
		||||
    description: A list of coding related terms.
 | 
			
		||||
    addWords: true
 | 
			
		||||
  - name: mermaid-terms
 | 
			
		||||
    path: ./mermaid-terms.txt
 | 
			
		||||
    description: A list of terms related to the mermaid project.
 | 
			
		||||
    addWords: true
 | 
			
		||||
  - name: misc-terms
 | 
			
		||||
    path: ./misc-terms.txt
 | 
			
		||||
    description: A list of miscellaneous terms.
 | 
			
		||||
  - name: 3rd-party-terms
 | 
			
		||||
    path: ./libraries.txt
 | 
			
		||||
    description: A list of 3rd party terms from dependencies.
 | 
			
		||||
    addWords: true
 | 
			
		||||
  - name: contributors
 | 
			
		||||
    path: ./contributors.txt
 | 
			
		||||
    description: A list of contributors to the mermaid project.
 | 
			
		||||
    type: 'W'
 | 
			
		||||
    addWords: true
 | 
			
		||||
 | 
			
		||||
  # cspell:disable
 | 
			
		||||
  - name: suggestions
 | 
			
		||||
    words:
 | 
			
		||||
      - none
 | 
			
		||||
    suggestWords:
 | 
			
		||||
      - seperator:separator
 | 
			
		||||
      - vertice:vertex
 | 
			
		||||
  # cspell:enable
 | 
			
		||||
 | 
			
		||||
patterns:
 | 
			
		||||
  - name: character-set-cyrillic
 | 
			
		||||
    pattern: '/\p{Script_Extensions=Cyrillic}+/gu'
 | 
			
		||||
  - name: svg-block
 | 
			
		||||
    pattern: '<svg[\S\s]+?</svg>'
 | 
			
		||||
  - name: json-property
 | 
			
		||||
    pattern: '/"[\w/@-]+":/g'
 | 
			
		||||
 | 
			
		||||
dictionaries:
 | 
			
		||||
  - mermaid-terms
 | 
			
		||||
  - suggestions
 | 
			
		||||
  - contributors
 | 
			
		||||
 | 
			
		||||
ignorePaths:
 | 
			
		||||
  - '*.txt' # do not spell check local dictionaries
 | 
			
		||||
 | 
			
		||||
# cspell:dictionary misc-terms
 | 
			
		||||
@@ -1,71 +0,0 @@
 | 
			
		||||
# Add third party library terms below
 | 
			
		||||
acyclicer
 | 
			
		||||
Antlr
 | 
			
		||||
Appli
 | 
			
		||||
applitools
 | 
			
		||||
Asciidoctor
 | 
			
		||||
Astah
 | 
			
		||||
automerge
 | 
			
		||||
bilkent
 | 
			
		||||
bisheng
 | 
			
		||||
Blazor
 | 
			
		||||
codedoc
 | 
			
		||||
Codemia
 | 
			
		||||
codepaths
 | 
			
		||||
csstree
 | 
			
		||||
cytoscape
 | 
			
		||||
cytoscape-cose-bilkent
 | 
			
		||||
dagre
 | 
			
		||||
dagre-d3
 | 
			
		||||
Deepdwn
 | 
			
		||||
Docsify
 | 
			
		||||
Docsy
 | 
			
		||||
DokuWiki
 | 
			
		||||
dompurify
 | 
			
		||||
elkjs
 | 
			
		||||
fontawesome
 | 
			
		||||
Foswiki
 | 
			
		||||
Gitea
 | 
			
		||||
graphlib
 | 
			
		||||
Grav
 | 
			
		||||
iconify
 | 
			
		||||
Inkdrop
 | 
			
		||||
jiti
 | 
			
		||||
jsdocs
 | 
			
		||||
jsfiddle
 | 
			
		||||
jsonschema
 | 
			
		||||
katex
 | 
			
		||||
khroma
 | 
			
		||||
langium
 | 
			
		||||
mathml
 | 
			
		||||
matplotlib
 | 
			
		||||
mdbook
 | 
			
		||||
Mermerd
 | 
			
		||||
mkdocs
 | 
			
		||||
Nextra
 | 
			
		||||
nodenext
 | 
			
		||||
npmjs
 | 
			
		||||
pageview
 | 
			
		||||
pathe
 | 
			
		||||
phpbb
 | 
			
		||||
pixelmatch
 | 
			
		||||
Podlite
 | 
			
		||||
presetAttributify
 | 
			
		||||
pyplot
 | 
			
		||||
redmine
 | 
			
		||||
rehype
 | 
			
		||||
rscratch
 | 
			
		||||
sparkline
 | 
			
		||||
sphinxcontrib
 | 
			
		||||
ssim
 | 
			
		||||
stylis
 | 
			
		||||
Swimm
 | 
			
		||||
tsbuildinfo
 | 
			
		||||
Tuleap
 | 
			
		||||
Typora
 | 
			
		||||
unocss
 | 
			
		||||
unplugin
 | 
			
		||||
unstub
 | 
			
		||||
vite
 | 
			
		||||
vitest
 | 
			
		||||
Zune
 | 
			
		||||
@@ -1,39 +0,0 @@
 | 
			
		||||
Adamiecki
 | 
			
		||||
arrowend
 | 
			
		||||
bmatrix
 | 
			
		||||
braintree
 | 
			
		||||
catmull
 | 
			
		||||
compositTitleSize
 | 
			
		||||
doublecircle
 | 
			
		||||
elems
 | 
			
		||||
gantt
 | 
			
		||||
gitgraph
 | 
			
		||||
gzipped
 | 
			
		||||
knsv
 | 
			
		||||
Knut
 | 
			
		||||
marginx
 | 
			
		||||
marginy
 | 
			
		||||
Markdownish
 | 
			
		||||
mermaidjs
 | 
			
		||||
mindmap
 | 
			
		||||
mindmaps
 | 
			
		||||
multigraph
 | 
			
		||||
nodesep
 | 
			
		||||
NOTEGROUP
 | 
			
		||||
Pinterest
 | 
			
		||||
rankdir
 | 
			
		||||
ranksep
 | 
			
		||||
rect
 | 
			
		||||
rects
 | 
			
		||||
sandboxed
 | 
			
		||||
siebling
 | 
			
		||||
statediagram
 | 
			
		||||
substate
 | 
			
		||||
Sveidqvist
 | 
			
		||||
unfixable
 | 
			
		||||
Viewbox
 | 
			
		||||
viewports
 | 
			
		||||
visio
 | 
			
		||||
vitepress
 | 
			
		||||
xlink
 | 
			
		||||
xychart
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
newbranch
 | 
			
		||||
@@ -1,50 +1,21 @@
 | 
			
		||||
import { build } from 'esbuild';
 | 
			
		||||
import { mkdir, writeFile } from 'node:fs/promises';
 | 
			
		||||
import { getBuildConfig } from './util.js';
 | 
			
		||||
import { packageOptions } from '../.build/common.js';
 | 
			
		||||
import { generateLangium } from '../.build/generateLangium.js';
 | 
			
		||||
import { MermaidBuildOptions, defaultOptions, getBuildConfig } from './util.js';
 | 
			
		||||
 | 
			
		||||
const shouldVisualize = process.argv.includes('--visualize');
 | 
			
		||||
 | 
			
		||||
const buildPackage = async (entryName: keyof typeof packageOptions) => {
 | 
			
		||||
  const commonOptions = { ...defaultOptions, entryName } as const;
 | 
			
		||||
  const buildConfigs = [
 | 
			
		||||
    // package.mjs
 | 
			
		||||
    { ...commonOptions },
 | 
			
		||||
    // package.min.mjs
 | 
			
		||||
    {
 | 
			
		||||
      ...commonOptions,
 | 
			
		||||
      minify: true,
 | 
			
		||||
      metafile: shouldVisualize,
 | 
			
		||||
    },
 | 
			
		||||
    // package.core.mjs
 | 
			
		||||
    { ...commonOptions, core: true },
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  if (entryName === 'mermaid') {
 | 
			
		||||
    const iifeOptions: MermaidBuildOptions = { ...commonOptions, format: 'iife' };
 | 
			
		||||
    buildConfigs.push(
 | 
			
		||||
      // mermaid.js
 | 
			
		||||
      { ...iifeOptions },
 | 
			
		||||
      // mermaid.min.js
 | 
			
		||||
      { ...iifeOptions, minify: true, metafile: shouldVisualize }
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const results = await Promise.all(buildConfigs.map((option) => build(getBuildConfig(option))));
 | 
			
		||||
 | 
			
		||||
  if (shouldVisualize) {
 | 
			
		||||
    for (const { metafile } of results) {
 | 
			
		||||
      if (!metafile) {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
      const fileName = Object.keys(metafile.outputs)
 | 
			
		||||
        .filter((file) => !file.includes('chunks') && file.endsWith('js'))[0]
 | 
			
		||||
        .replace('dist/', '');
 | 
			
		||||
      // Upload metafile into https://esbuild.github.io/analyze/
 | 
			
		||||
      await writeFile(`stats/${fileName}.meta.json`, JSON.stringify(metafile));
 | 
			
		||||
    }
 | 
			
		||||
  await build(getBuildConfig({ entryName, minify: false }));
 | 
			
		||||
  const { metafile } = await build(
 | 
			
		||||
    getBuildConfig({ entryName, minify: true, metafile: shouldVisualize })
 | 
			
		||||
  );
 | 
			
		||||
  if (metafile) {
 | 
			
		||||
    // Upload metafile into https://esbuild.github.io/analyze/
 | 
			
		||||
    await writeFile(`stats/meta-${entryName}.json`, JSON.stringify(metafile));
 | 
			
		||||
  }
 | 
			
		||||
  await build(getBuildConfig({ entryName, minify: false, core: true }));
 | 
			
		||||
  await build(getBuildConfig({ entryName, minify: true, format: 'iife' }));
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const handler = (e) => {
 | 
			
		||||
@@ -53,10 +24,8 @@ const handler = (e) => {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const main = async () => {
 | 
			
		||||
  await generateLangium();
 | 
			
		||||
  await mkdir('stats').catch(() => {});
 | 
			
		||||
  const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[];
 | 
			
		||||
  // it should build `parser` before `mermaid` because it's a dependency
 | 
			
		||||
  for (const pkg of packageNames) {
 | 
			
		||||
    await buildPackage(pkg).catch(handler);
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,96 +1,32 @@
 | 
			
		||||
import express from 'express';
 | 
			
		||||
import type { NextFunction, Request, Response } from 'express';
 | 
			
		||||
import cors from 'cors';
 | 
			
		||||
import { getBuildConfig, defaultOptions } from './util.js';
 | 
			
		||||
import { getBuildConfig } from './util.js';
 | 
			
		||||
import { context } from 'esbuild';
 | 
			
		||||
import chokidar from 'chokidar';
 | 
			
		||||
import { generateLangium } from '../.build/generateLangium.js';
 | 
			
		||||
import { packageOptions } from '../.build/common.js';
 | 
			
		||||
 | 
			
		||||
const configs = Object.values(packageOptions).map(({ packageName }) =>
 | 
			
		||||
  getBuildConfig({ ...defaultOptions, minify: false, core: false, entryName: packageName })
 | 
			
		||||
);
 | 
			
		||||
const mermaidIIFEConfig = getBuildConfig({
 | 
			
		||||
  ...defaultOptions,
 | 
			
		||||
  minify: false,
 | 
			
		||||
  core: false,
 | 
			
		||||
  entryName: 'mermaid',
 | 
			
		||||
  format: 'iife',
 | 
			
		||||
});
 | 
			
		||||
configs.push(mermaidIIFEConfig);
 | 
			
		||||
 | 
			
		||||
const contexts = await Promise.all(configs.map((config) => context(config)));
 | 
			
		||||
 | 
			
		||||
const rebuildAll = async () => {
 | 
			
		||||
  console.time('Rebuild time');
 | 
			
		||||
  await Promise.all(contexts.map((ctx) => ctx.rebuild())).catch((e) => console.error(e));
 | 
			
		||||
  console.timeEnd('Rebuild time');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
let clients: { id: number; response: Response }[] = [];
 | 
			
		||||
function eventsHandler(request: Request, response: Response, next: NextFunction) {
 | 
			
		||||
  const headers = {
 | 
			
		||||
    'Content-Type': 'text/event-stream',
 | 
			
		||||
    Connection: 'keep-alive',
 | 
			
		||||
    'Cache-Control': 'no-cache',
 | 
			
		||||
  };
 | 
			
		||||
  response.writeHead(200, headers);
 | 
			
		||||
  const clientId = Date.now();
 | 
			
		||||
  clients.push({
 | 
			
		||||
    id: clientId,
 | 
			
		||||
    response,
 | 
			
		||||
  });
 | 
			
		||||
  request.on('close', () => {
 | 
			
		||||
    clients = clients.filter((client) => client.id !== clientId);
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
let timeoutId: NodeJS.Timeout | undefined = undefined;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Debounce file change events to avoid rebuilding multiple times.
 | 
			
		||||
 */
 | 
			
		||||
function handleFileChange() {
 | 
			
		||||
  if (timeoutId !== undefined) {
 | 
			
		||||
    clearTimeout(timeoutId);
 | 
			
		||||
  }
 | 
			
		||||
  timeoutId = setTimeout(async () => {
 | 
			
		||||
    await rebuildAll();
 | 
			
		||||
    sendEventsToAll();
 | 
			
		||||
    timeoutId = undefined;
 | 
			
		||||
  }, 100);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function sendEventsToAll() {
 | 
			
		||||
  clients.forEach(({ response }) => response.write(`data: ${Date.now()}\n\n`));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function createServer() {
 | 
			
		||||
  await generateLangium();
 | 
			
		||||
  handleFileChange();
 | 
			
		||||
  const app = express();
 | 
			
		||||
  chokidar
 | 
			
		||||
    .watch('**/src/**/*.{js,ts,langium,yaml,json}', {
 | 
			
		||||
      ignoreInitial: true,
 | 
			
		||||
      ignored: [/node_modules/, /dist/, /docs/, /coverage/],
 | 
			
		||||
    })
 | 
			
		||||
    .on('all', async (event, path) => {
 | 
			
		||||
      // Ignore other events.
 | 
			
		||||
      if (!['add', 'change'].includes(event)) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
      if (/\.langium$/.test(path)) {
 | 
			
		||||
        await generateLangium();
 | 
			
		||||
      }
 | 
			
		||||
      console.log(`${path} changed. Rebuilding...`);
 | 
			
		||||
      handleFileChange();
 | 
			
		||||
    });
 | 
			
		||||
  const mermaidCtx = await context(
 | 
			
		||||
    getBuildConfig({ minify: false, core: false, entryName: 'mermaid' })
 | 
			
		||||
  );
 | 
			
		||||
  const mermaidIIFECtx = await context(
 | 
			
		||||
    getBuildConfig({ minify: false, core: false, entryName: 'mermaid', format: 'iife' })
 | 
			
		||||
  );
 | 
			
		||||
  const externalCtx = await context(
 | 
			
		||||
    getBuildConfig({ minify: false, core: false, entryName: 'mermaid-example-diagram' })
 | 
			
		||||
  );
 | 
			
		||||
  const zenuml = await context(
 | 
			
		||||
    getBuildConfig({ minify: false, core: false, entryName: 'mermaid-zenuml' })
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  mermaidCtx.watch();
 | 
			
		||||
  mermaidIIFECtx.watch();
 | 
			
		||||
  externalCtx.watch();
 | 
			
		||||
  zenuml.watch();
 | 
			
		||||
 | 
			
		||||
  app.use(cors());
 | 
			
		||||
  app.get('/events', eventsHandler);
 | 
			
		||||
  for (const { packageName } of Object.values(packageOptions)) {
 | 
			
		||||
    app.use(express.static(`./packages/${packageName}/dist`));
 | 
			
		||||
  }
 | 
			
		||||
  app.use(express.static('./packages/mermaid/dist'));
 | 
			
		||||
  app.use(express.static('./packages/mermaid-zenuml/dist'));
 | 
			
		||||
  app.use(express.static('./packages/mermaid-example-diagram/dist'));
 | 
			
		||||
  app.use(express.static('demos'));
 | 
			
		||||
  app.use(express.static('cypress/platform'));
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,21 +8,14 @@ import { jisonPlugin } from './jisonPlugin.js';
 | 
			
		||||
 | 
			
		||||
const __dirname = fileURLToPath(new URL('.', import.meta.url));
 | 
			
		||||
 | 
			
		||||
export interface MermaidBuildOptions {
 | 
			
		||||
interface MermaidBuildOptions {
 | 
			
		||||
  minify: boolean;
 | 
			
		||||
  core: boolean;
 | 
			
		||||
  metafile: boolean;
 | 
			
		||||
  format: 'esm' | 'iife';
 | 
			
		||||
  core?: boolean;
 | 
			
		||||
  metafile?: boolean;
 | 
			
		||||
  format?: 'esm' | 'iife';
 | 
			
		||||
  entryName: keyof typeof packageOptions;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const defaultOptions: Omit<MermaidBuildOptions, 'entryName'> = {
 | 
			
		||||
  minify: false,
 | 
			
		||||
  metafile: false,
 | 
			
		||||
  core: false,
 | 
			
		||||
  format: 'esm',
 | 
			
		||||
} as const;
 | 
			
		||||
 | 
			
		||||
const buildOptions = (override: BuildOptions): BuildOptions => {
 | 
			
		||||
  return {
 | 
			
		||||
    bundle: true,
 | 
			
		||||
@@ -39,35 +32,24 @@ const buildOptions = (override: BuildOptions): BuildOptions => {
 | 
			
		||||
  };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const getFileName = (fileName: string, { core, format, minify }: MermaidBuildOptions) => {
 | 
			
		||||
  if (core) {
 | 
			
		||||
    fileName += '.core';
 | 
			
		||||
  } else if (format === 'esm') {
 | 
			
		||||
    fileName += '.esm';
 | 
			
		||||
  }
 | 
			
		||||
  if (minify) {
 | 
			
		||||
    fileName += '.min';
 | 
			
		||||
  }
 | 
			
		||||
  return fileName;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => {
 | 
			
		||||
  const { core, entryName, metafile, format, minify } = options;
 | 
			
		||||
export const getBuildConfig = ({
 | 
			
		||||
  minify,
 | 
			
		||||
  core,
 | 
			
		||||
  entryName,
 | 
			
		||||
  metafile,
 | 
			
		||||
  format,
 | 
			
		||||
}: MermaidBuildOptions): BuildOptions => {
 | 
			
		||||
  const external: string[] = ['require', 'fs', 'path'];
 | 
			
		||||
  const { name, file, packageName } = packageOptions[entryName];
 | 
			
		||||
  const outFileName = getFileName(name, options);
 | 
			
		||||
  let output: BuildOptions = buildOptions({
 | 
			
		||||
    absWorkingDir: resolve(__dirname, `../packages/${packageName}`),
 | 
			
		||||
    entryPoints: {
 | 
			
		||||
      [outFileName]: `src/${file}`,
 | 
			
		||||
      [`${name}${core ? '.core' : format === 'iife' ? '' : '.esm'}${
 | 
			
		||||
        minify ? '.min' : ''
 | 
			
		||||
      }`]: `src/${file}`,
 | 
			
		||||
    },
 | 
			
		||||
    metafile,
 | 
			
		||||
    minify,
 | 
			
		||||
    logLevel: 'info',
 | 
			
		||||
    chunkNames: `chunks/${outFileName}/[name]-[hash]`,
 | 
			
		||||
    define: {
 | 
			
		||||
      'import.meta.vitest': 'undefined',
 | 
			
		||||
    },
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  if (core) {
 | 
			
		||||
@@ -85,8 +67,6 @@ export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => {
 | 
			
		||||
    output.format = 'iife';
 | 
			
		||||
    output.splitting = false;
 | 
			
		||||
    output.globalName = '__esbuild_esm_mermaid';
 | 
			
		||||
    // Workaround for removing the .default access in esbuild IIFE.
 | 
			
		||||
    // https://github.com/mermaid-js/mermaid/pull/4109#discussion_r1292317396
 | 
			
		||||
    output.footer = {
 | 
			
		||||
      js: 'globalThis.mermaid = globalThis.__esbuild_esm_mermaid.default;',
 | 
			
		||||
    };
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
.gitignore
 | 
			
		||||
							
								
								
									
										8
									
								
								.eslintignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.eslintignore
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
dist/**
 | 
			
		||||
.github/**
 | 
			
		||||
docs/Setup.md
 | 
			
		||||
cypress.config.js
 | 
			
		||||
cypress/plugins/index.js
 | 
			
		||||
coverage
 | 
			
		||||
*.json
 | 
			
		||||
node_modules
 | 
			
		||||
@@ -14,7 +14,7 @@ module.exports = {
 | 
			
		||||
    },
 | 
			
		||||
    tsconfigRootDir: __dirname,
 | 
			
		||||
    sourceType: 'module',
 | 
			
		||||
    ecmaVersion: 2022,
 | 
			
		||||
    ecmaVersion: 2020,
 | 
			
		||||
    allowAutomaticSingleRunInference: true,
 | 
			
		||||
    project: ['./tsconfig.eslint.json', './packages/*/tsconfig.json'],
 | 
			
		||||
    parser: '@typescript-eslint/parser',
 | 
			
		||||
@@ -23,7 +23,7 @@ module.exports = {
 | 
			
		||||
    'eslint:recommended',
 | 
			
		||||
    'plugin:@typescript-eslint/recommended',
 | 
			
		||||
    'plugin:json/recommended',
 | 
			
		||||
    'plugin:markdown/recommended-legacy',
 | 
			
		||||
    'plugin:markdown/recommended',
 | 
			
		||||
    'plugin:@cspell/recommended',
 | 
			
		||||
    'prettier',
 | 
			
		||||
  ],
 | 
			
		||||
@@ -48,12 +48,8 @@ module.exports = {
 | 
			
		||||
    'no-prototype-builtins': 'off',
 | 
			
		||||
    'no-unused-vars': 'off',
 | 
			
		||||
    'cypress/no-async-tests': 'off',
 | 
			
		||||
    '@typescript-eslint/consistent-type-imports': 'error',
 | 
			
		||||
    '@typescript-eslint/no-explicit-any': 'warn',
 | 
			
		||||
    '@typescript-eslint/no-floating-promises': 'error',
 | 
			
		||||
    '@typescript-eslint/no-misused-promises': 'error',
 | 
			
		||||
    '@typescript-eslint/no-unused-vars': 'warn',
 | 
			
		||||
    '@typescript-eslint/consistent-type-definitions': 'error',
 | 
			
		||||
    '@typescript-eslint/ban-ts-comment': [
 | 
			
		||||
      'error',
 | 
			
		||||
      {
 | 
			
		||||
@@ -64,24 +60,13 @@ module.exports = {
 | 
			
		||||
        minimumDescriptionLength: 10,
 | 
			
		||||
      },
 | 
			
		||||
    ],
 | 
			
		||||
    '@typescript-eslint/naming-convention': [
 | 
			
		||||
      'error',
 | 
			
		||||
      {
 | 
			
		||||
        selector: 'typeLike',
 | 
			
		||||
        format: ['PascalCase'],
 | 
			
		||||
        custom: {
 | 
			
		||||
          regex: '^I[A-Z]',
 | 
			
		||||
          match: false,
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
    ],
 | 
			
		||||
    'json/*': ['error', 'allowComments'],
 | 
			
		||||
    '@cspell/spellchecker': [
 | 
			
		||||
      'error',
 | 
			
		||||
      {
 | 
			
		||||
        checkIdentifiers: true,
 | 
			
		||||
        checkStrings: true,
 | 
			
		||||
        checkStringTemplates: true,
 | 
			
		||||
        checkIdentifiers: false,
 | 
			
		||||
        checkStrings: false,
 | 
			
		||||
        checkStringTemplates: false,
 | 
			
		||||
      },
 | 
			
		||||
    ],
 | 
			
		||||
    'no-empty': [
 | 
			
		||||
@@ -160,19 +145,6 @@ module.exports = {
 | 
			
		||||
        '@typescript-eslint/no-unused-vars': 'off',
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      files: ['*.spec.{ts,js}', 'tests/**', 'cypress/**/*.js'],
 | 
			
		||||
      rules: {
 | 
			
		||||
        '@cspell/spellchecker': [
 | 
			
		||||
          'error',
 | 
			
		||||
          {
 | 
			
		||||
            checkIdentifiers: false,
 | 
			
		||||
            checkStrings: false,
 | 
			
		||||
            checkStringTemplates: false,
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      files: ['*.html', '*.md', '**/*.md/*'],
 | 
			
		||||
      rules: {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.github/ISSUE_TEMPLATE/bug_report.yml
									
									
									
									
										vendored
									
									
								
							@@ -17,9 +17,6 @@ body:
 | 
			
		||||
        - Use a clear and concise title
 | 
			
		||||
        - Fill out the text fields with as much detail as possible.
 | 
			
		||||
        - Never be shy to give us screenshots and/or code samples. It will help!
 | 
			
		||||
 | 
			
		||||
        There is a chance that the bug is already fixed in the git `develop` branch, but is not released yet. 
 | 
			
		||||
        So please check in [Live Editor - Develop](https://develop.git.mermaid.live) before raising an issue.
 | 
			
		||||
  - type: textarea
 | 
			
		||||
    attributes:
 | 
			
		||||
      label: Description
 | 
			
		||||
@@ -46,7 +43,7 @@ body:
 | 
			
		||||
    attributes:
 | 
			
		||||
      label: Code Sample
 | 
			
		||||
      description: |-
 | 
			
		||||
        If applicable, add the code sample or a link to the [Live Editor - Develop](https://develop.git.mermaid.live).
 | 
			
		||||
        If applicable, add the code sample or a link to the [Live Editor](https://mermaid.live).
 | 
			
		||||
        Any text pasted here will be rendered as a Code block.
 | 
			
		||||
      render: text
 | 
			
		||||
  - type: textarea
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								.github/ISSUE_TEMPLATE/config.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								.github/ISSUE_TEMPLATE/config.yml
									
									
									
									
										vendored
									
									
								
							@@ -3,18 +3,12 @@ contact_links:
 | 
			
		||||
  - name: GitHub Discussions
 | 
			
		||||
    url: https://github.com/mermaid-js/mermaid/discussions
 | 
			
		||||
    about: Ask the Community questions or share your own graphs in our discussions.
 | 
			
		||||
  - name: Discord
 | 
			
		||||
    url: https://discord.gg/AgrbSrBer3
 | 
			
		||||
    about: Join our Community on Discord for Help and a casual chat.
 | 
			
		||||
  - name: Slack
 | 
			
		||||
    url: https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE
 | 
			
		||||
    about: Join our Community on Slack for Help and a casual chat.
 | 
			
		||||
  - name: Documentation
 | 
			
		||||
    url: https://mermaid.js.org
 | 
			
		||||
    url: https://mermaid-js.github.io
 | 
			
		||||
    about: Read our documentation for all that Mermaid.js can offer.
 | 
			
		||||
  - name: Live Editor
 | 
			
		||||
    url: https://mermaid.live
 | 
			
		||||
    about: Try the live editor to preview graphs in no time.
 | 
			
		||||
  - name: Live Editor - Develop
 | 
			
		||||
    url: https://develop.git.mermaid.live
 | 
			
		||||
    about: Try unreleased changes in the develop branch.
 | 
			
		||||
  - name: Live Editor - Next
 | 
			
		||||
    url: https://next.git.mermaid.live
 | 
			
		||||
    about: Try unreleased changes in the next branch.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								.github/codecov.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/codecov.yaml
									
									
									
									
										vendored
									
									
								
							@@ -15,4 +15,3 @@ coverage:
 | 
			
		||||
      # Turing off for now as code coverage isn't stable and causes unnecessary build failures.
 | 
			
		||||
      # default:
 | 
			
		||||
      #   threshold: 2%
 | 
			
		||||
    patch: off
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								.github/lychee.toml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/lychee.toml
									
									
									
									
										vendored
									
									
								
							@@ -34,14 +34,8 @@ exclude = [
 | 
			
		||||
# Don't check files that are generated during the build via `pnpm docs:code`
 | 
			
		||||
'packages/mermaid/src/docs/config/setup/*',
 | 
			
		||||
 | 
			
		||||
# Ignore Discord invite
 | 
			
		||||
"https://discord.gg",
 | 
			
		||||
 | 
			
		||||
# BundlePhobia has frequent downtime
 | 
			
		||||
"https://bundlephobia.com",
 | 
			
		||||
 | 
			
		||||
# Chrome webstore migration issue. Temporary
 | 
			
		||||
"https://chromewebstore.google.com"
 | 
			
		||||
# Ignore slack invite
 | 
			
		||||
"https://join.slack.com/"
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
# Exclude all private IPs from checking.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								.github/pr-labeler.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								.github/pr-labeler.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,22 +1,4 @@
 | 
			
		||||
# yaml-language-server: $schema=https://raw.githubusercontent.com/release-drafter/release-drafter/master/schema.json
 | 
			
		||||
autolabeler:
 | 
			
		||||
  - label: 'Type: Bug / Error'
 | 
			
		||||
    branch:
 | 
			
		||||
      - '/bug\/.+/'
 | 
			
		||||
      - '/fix\/.+/'
 | 
			
		||||
  - label: 'Type: Enhancement'
 | 
			
		||||
    branch:
 | 
			
		||||
      - '/feature\/.+/'
 | 
			
		||||
      - '/feat\/.+/'
 | 
			
		||||
  - label: 'Type: Other'
 | 
			
		||||
    branch:
 | 
			
		||||
      - '/other\/.+/'
 | 
			
		||||
      - '/chore\/.+/'
 | 
			
		||||
      - '/test\/.+/'
 | 
			
		||||
      - '/refactor\/.+/'
 | 
			
		||||
  - label: 'Area: Documentation'
 | 
			
		||||
    branch:
 | 
			
		||||
      - '/docs\/.+/'
 | 
			
		||||
 | 
			
		||||
template: |
 | 
			
		||||
  This field is unused, as we only use this config file for labeling PRs.
 | 
			
		||||
'Type: Bug / Error': ['bug/*', fix/*]
 | 
			
		||||
'Type: Enhancement': ['feature/*', 'feat/*']
 | 
			
		||||
'Type: Other': ['other/*', 'chore/*', 'test/*', 'refactor/*']
 | 
			
		||||
'Area: Documentation': ['docs/*']
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								.github/pull_request_template.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/pull_request_template.md
									
									
									
									
										vendored
									
									
								
							@@ -12,7 +12,7 @@ Describe the way your implementation works or what design decisions you made if
 | 
			
		||||
 | 
			
		||||
Make sure you
 | 
			
		||||
 | 
			
		||||
- [ ] :book: have read the [contribution guidelines](https://mermaid.js.org/community/contributing.html)
 | 
			
		||||
- [ ] :book: have read the [contribution guidelines](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md)
 | 
			
		||||
- [ ] :computer: have added necessary unit/e2e tests.
 | 
			
		||||
- [ ] :notebook: have added documentation. Make sure [`MERMAID_RELEASE_VERSION`](https://mermaid.js.org/community/contributing.html#update-documentation) is used for all new features.
 | 
			
		||||
- [ ] :notebook: have added documentation. Make sure [`MERMAID_RELEASE_VERSION`](https://github.com/mermaid-js/mermaid/blob/develop/packages/mermaid/src/docs/community/development.md#3-update-documentation) is used for all new features.
 | 
			
		||||
- [ ] :bookmark: targeted `develop` branch
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								.github/release-drafter.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.github/release-drafter.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,30 +1,19 @@
 | 
			
		||||
name-template: '$NEXT_PATCH_VERSION'
 | 
			
		||||
tag-template: '$NEXT_PATCH_VERSION'
 | 
			
		||||
categories:
 | 
			
		||||
  - title: '🚨 **Breaking Changes**'
 | 
			
		||||
    labels:
 | 
			
		||||
      - 'Breaking Change'
 | 
			
		||||
  - title: '🚀 Features'
 | 
			
		||||
    labels:
 | 
			
		||||
      - 'Type: Enhancement'
 | 
			
		||||
      - 'feature' # deprecated, new PRs shouldn't have this
 | 
			
		||||
  - title: '🐛 Bug Fixes'
 | 
			
		||||
    labels:
 | 
			
		||||
      - 'Type: Bug / Error'
 | 
			
		||||
      - 'fix' # deprecated, new PRs shouldn't have this
 | 
			
		||||
  - title: '🧰 Maintenance'
 | 
			
		||||
    labels:
 | 
			
		||||
      - 'Type: Other'
 | 
			
		||||
      - 'chore' # deprecated, new PRs shouldn't have this
 | 
			
		||||
  - title: '⚡️ Performance'
 | 
			
		||||
    labels:
 | 
			
		||||
      - 'Type: Performance'
 | 
			
		||||
  - title: '📚 Documentation'
 | 
			
		||||
    labels:
 | 
			
		||||
      - 'Area: Documentation'
 | 
			
		||||
    label: 'Type: Other'
 | 
			
		||||
change-template: '- $TITLE (#$NUMBER) @$AUTHOR'
 | 
			
		||||
sort-by: title
 | 
			
		||||
sort-direction: ascending
 | 
			
		||||
branches:
 | 
			
		||||
  - develop
 | 
			
		||||
exclude-labels:
 | 
			
		||||
  - 'Skip changelog'
 | 
			
		||||
no-changes-template: 'This release contains minor changes and bugfixes.'
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								.github/workflows/build-docs.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/build-docs.yml
									
									
									
									
										vendored
									
									
								
							@@ -16,20 +16,20 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Checkout
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - uses: pnpm/action-setup@v2
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node.js
 | 
			
		||||
        uses: actions/setup-node@v4
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: pnpm
 | 
			
		||||
          node-version-file: '.node-version'
 | 
			
		||||
          node-version: 18
 | 
			
		||||
 | 
			
		||||
      - name: Install Packages
 | 
			
		||||
        run: pnpm install --frozen-lockfile
 | 
			
		||||
 | 
			
		||||
      - name: Verify release version
 | 
			
		||||
      - name: Verify release verion
 | 
			
		||||
        if: ${{ github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/heads/release')) }}
 | 
			
		||||
        run: pnpm --filter mermaid run docs:verify-version
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							@@ -15,17 +15,20 @@ permissions:
 | 
			
		||||
jobs:
 | 
			
		||||
  build-mermaid:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        node-version: [18.x]
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - uses: pnpm/action-setup@v2
 | 
			
		||||
        # uses version from "packageManager" field in package.json
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node.js
 | 
			
		||||
        uses: actions/setup-node@v4
 | 
			
		||||
      - name: Setup Node.js ${{ matrix.node-version }}
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: pnpm
 | 
			
		||||
          node-version-file: '.node-version'
 | 
			
		||||
          node-version: ${{ matrix.node-version }}
 | 
			
		||||
 | 
			
		||||
      - name: Install Packages
 | 
			
		||||
        run: |
 | 
			
		||||
@@ -37,13 +40,13 @@ jobs:
 | 
			
		||||
        run: pnpm run build
 | 
			
		||||
 | 
			
		||||
      - name: Upload Mermaid Build as Artifact
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        uses: actions/upload-artifact@v3
 | 
			
		||||
        with:
 | 
			
		||||
          name: mermaid-build
 | 
			
		||||
          path: packages/mermaid/dist
 | 
			
		||||
 | 
			
		||||
      - name: Upload Mermaid Mindmap Build as Artifact
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        uses: actions/upload-artifact@v3
 | 
			
		||||
        with:
 | 
			
		||||
          name: mermaid-mindmap-build
 | 
			
		||||
          path: packages/mermaid-mindmap/dist
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/check-readme-in-sync.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/check-readme-in-sync.yml
									
									
									
									
										vendored
									
									
								
							@@ -18,7 +18,7 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Checkout repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - name: Check for difference in README.md and docs/README.md
 | 
			
		||||
        run: |
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/checks.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/checks.yml
									
									
									
									
										vendored
									
									
								
							@@ -15,7 +15,7 @@ jobs:
 | 
			
		||||
    name: check tests
 | 
			
		||||
    if: github.repository_owner == 'mermaid-js'
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
      - uses: testomatio/check-tests@stable
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							@@ -29,11 +29,11 @@ jobs:
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Checkout repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      # Initializes the CodeQL tools for scanning.
 | 
			
		||||
      - name: Initialize CodeQL
 | 
			
		||||
        uses: github/codeql-action/init@v3
 | 
			
		||||
        uses: github/codeql-action/init@v2
 | 
			
		||||
        with:
 | 
			
		||||
          config-file: ./.github/codeql/codeql-config.yml
 | 
			
		||||
          languages: ${{ matrix.language }}
 | 
			
		||||
@@ -45,7 +45,7 @@ jobs:
 | 
			
		||||
      # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
 | 
			
		||||
      # If this step fails, then you should remove it and run the build manually (see below)
 | 
			
		||||
      - name: Autobuild
 | 
			
		||||
        uses: github/codeql-action/autobuild@v3
 | 
			
		||||
        uses: github/codeql-action/autobuild@v2
 | 
			
		||||
 | 
			
		||||
      # ℹ️ Command-line programs to run using the OS shell.
 | 
			
		||||
      # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
 | 
			
		||||
@@ -59,4 +59,4 @@ jobs:
 | 
			
		||||
      #   make release
 | 
			
		||||
 | 
			
		||||
      - name: Perform CodeQL Analysis
 | 
			
		||||
        uses: github/codeql-action/analyze@v3
 | 
			
		||||
        uses: github/codeql-action/analyze@v2
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								.github/workflows/dependency-review.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/dependency-review.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
# Dependency Review Action
 | 
			
		||||
#
 | 
			
		||||
# This Action will scan dependency manifest files that change as part of a Pull Request, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging.
 | 
			
		||||
# This Action will scan dependency manifest files that change as part of a Pull Reqest, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging.
 | 
			
		||||
#
 | 
			
		||||
# Source repository: https://github.com/actions/dependency-review-action
 | 
			
		||||
# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement
 | 
			
		||||
@@ -15,6 +15,6 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: 'Checkout Repository'
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
      - name: 'Dependency Review'
 | 
			
		||||
        uses: actions/dependency-review-action@v4
 | 
			
		||||
        uses: actions/dependency-review-action@v3
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										16
									
								
								.github/workflows/e2e-applitools.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								.github/workflows/e2e-applitools.yml
									
									
									
									
										vendored
									
									
								
							@@ -21,24 +21,24 @@ env:
 | 
			
		||||
jobs:
 | 
			
		||||
  e2e-applitools:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container:
 | 
			
		||||
      image: cypress/browsers:node-20.11.0-chrome-121.0.6167.85-1-ff-120.0-edge-121.0.2277.83-1
 | 
			
		||||
      options: --user 1001
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        node-version: [18.x]
 | 
			
		||||
    steps:
 | 
			
		||||
      - if: ${{ ! env.USE_APPLI }}
 | 
			
		||||
        name: Warn if not using Applitools
 | 
			
		||||
        run: |
 | 
			
		||||
          echo "::error,title=Not using Applitools::APPLITOOLS_API_KEY is empty, disabling Applitools for this run."
 | 
			
		||||
          echo "::error,title=Not using Applitols::APPLITOOLS_API_KEY is empty, disabling Applitools for this run."
 | 
			
		||||
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - uses: pnpm/action-setup@v2
 | 
			
		||||
        # uses version from "packageManager" field in package.json
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node.js
 | 
			
		||||
        uses: actions/setup-node@v4
 | 
			
		||||
      - name: Setup Node.js ${{ matrix.node-version }}
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          node-version-file: '.node-version'
 | 
			
		||||
          node-version: ${{ matrix.node-version }}
 | 
			
		||||
 | 
			
		||||
      - if: ${{ env.USE_APPLI }}
 | 
			
		||||
        name: Notify applitools of new batch
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										167
									
								
								.github/workflows/e2e.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										167
									
								
								.github/workflows/e2e.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,143 +1,43 @@
 | 
			
		||||
# We use github cache to save snapshots between runs.
 | 
			
		||||
# For PRs and MergeQueues, the target commit is used, and for push events, github.event.previous is used.
 | 
			
		||||
# If a snapshot for a given Hash is not found, we checkout that commit, run the tests and cache the snapshots.
 | 
			
		||||
# These are then downloaded before running the E2E, providing the reference snapshots.
 | 
			
		||||
# If there are any errors, the diff image is uploaded to artifacts, and the user is notified.
 | 
			
		||||
 | 
			
		||||
name: E2E
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    branches-ignore:
 | 
			
		||||
      - 'gh-readonly-queue/**'
 | 
			
		||||
  pull_request:
 | 
			
		||||
  merge_group:
 | 
			
		||||
 | 
			
		||||
permissions:
 | 
			
		||||
  contents: read
 | 
			
		||||
 | 
			
		||||
env:
 | 
			
		||||
  # For PRs and MergeQueues, the target commit is used, and for push events to non-develop branches, github.event.previous is used if available. Otherwise, 'develop' is used.
 | 
			
		||||
  targetHash: >-
 | 
			
		||||
    ${{ 
 | 
			
		||||
      github.event.pull_request.base.sha || 
 | 
			
		||||
      github.event.merge_group.base_sha || 
 | 
			
		||||
      (
 | 
			
		||||
        (
 | 
			
		||||
          (github.event_name == 'push' && github.ref == 'refs/heads/develop') || 
 | 
			
		||||
          github.event.before == '0000000000000000000000000000000000000000'
 | 
			
		||||
        ) && 'develop'
 | 
			
		||||
      ) || 
 | 
			
		||||
      github.event.before
 | 
			
		||||
    }}
 | 
			
		||||
jobs:
 | 
			
		||||
  cache:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container:
 | 
			
		||||
      image: cypress/browsers:node-20.11.0-chrome-121.0.6167.85-1-ff-120.0-edge-121.0.2277.83-1
 | 
			
		||||
      options: --user 1001
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: pnpm/action-setup@v2
 | 
			
		||||
      - name: Setup Node.js
 | 
			
		||||
        uses: actions/setup-node@v4
 | 
			
		||||
        with:
 | 
			
		||||
          node-version-file: '.node-version'
 | 
			
		||||
      - name: Cache snapshots
 | 
			
		||||
        id: cache-snapshot
 | 
			
		||||
        uses: actions/cache@v4
 | 
			
		||||
        with:
 | 
			
		||||
          save-always: true
 | 
			
		||||
          path: ./cypress/snapshots
 | 
			
		||||
          key: ${{ runner.os }}-snapshots-${{ env.targetHash }}
 | 
			
		||||
 | 
			
		||||
      # If a snapshot for a given Hash is not found, we checkout that commit, run the tests and cache the snapshots.
 | 
			
		||||
      - name: Switch to base branch
 | 
			
		||||
        if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }}
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        with:
 | 
			
		||||
          ref: ${{ env.targetHash }}
 | 
			
		||||
 | 
			
		||||
      - name: Install dependencies
 | 
			
		||||
        if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }}
 | 
			
		||||
        uses: cypress-io/github-action@v6
 | 
			
		||||
        with:
 | 
			
		||||
          # just perform install
 | 
			
		||||
          runTests: false
 | 
			
		||||
 | 
			
		||||
      - name: Calculate bundle size
 | 
			
		||||
        if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true'}}
 | 
			
		||||
        run: |
 | 
			
		||||
          pnpm run build:viz
 | 
			
		||||
          mkdir -p cypress/snapshots/stats/base
 | 
			
		||||
          mv stats cypress/snapshots/stats/base
 | 
			
		||||
 | 
			
		||||
      - name: Cypress run
 | 
			
		||||
        uses: cypress-io/github-action@v6
 | 
			
		||||
        id: cypress-snapshot-gen
 | 
			
		||||
        if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }}
 | 
			
		||||
        with:
 | 
			
		||||
          install: false
 | 
			
		||||
          start: pnpm run dev
 | 
			
		||||
          wait-on: 'http://localhost:9000'
 | 
			
		||||
          browser: chrome
 | 
			
		||||
 | 
			
		||||
  e2e:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container:
 | 
			
		||||
      image: cypress/browsers:node-20.11.0-chrome-121.0.6167.85-1-ff-120.0-edge-121.0.2277.83-1
 | 
			
		||||
      options: --user 1001
 | 
			
		||||
    needs: cache
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        node-version: [18.x]
 | 
			
		||||
        containers: [1, 2, 3, 4]
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - uses: pnpm/action-setup@v2
 | 
			
		||||
        # uses version from "packageManager" field in package.json
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node.js
 | 
			
		||||
        uses: actions/setup-node@v4
 | 
			
		||||
      - name: Setup Node.js ${{ matrix.node-version }}
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          node-version-file: '.node-version'
 | 
			
		||||
 | 
			
		||||
      # These cached snapshots are downloaded, providing the reference snapshots.
 | 
			
		||||
      - name: Cache snapshots
 | 
			
		||||
        id: cache-snapshot
 | 
			
		||||
        uses: actions/cache/restore@v4
 | 
			
		||||
        with:
 | 
			
		||||
          path: ./cypress/snapshots
 | 
			
		||||
          key: ${{ runner.os }}-snapshots-${{ env.targetHash }}
 | 
			
		||||
 | 
			
		||||
      - name: Install dependencies
 | 
			
		||||
        uses: cypress-io/github-action@v6
 | 
			
		||||
        with:
 | 
			
		||||
          runTests: false
 | 
			
		||||
 | 
			
		||||
      - name: Output size diff
 | 
			
		||||
        if: ${{ matrix.containers == 1 }}
 | 
			
		||||
        run: |
 | 
			
		||||
          pnpm run build:viz
 | 
			
		||||
          mv stats cypress/snapshots/stats/head
 | 
			
		||||
          echo '## Bundle size difference' >> "$GITHUB_STEP_SUMMARY"
 | 
			
		||||
          echo '' >> "$GITHUB_STEP_SUMMARY"
 | 
			
		||||
          npx tsx scripts/size.ts >> "$GITHUB_STEP_SUMMARY"
 | 
			
		||||
          node-version: ${{ matrix.node-version }}
 | 
			
		||||
 | 
			
		||||
      # Install NPM dependencies, cache them correctly
 | 
			
		||||
      # and run all Cypress tests
 | 
			
		||||
      - name: Cypress run
 | 
			
		||||
        uses: cypress-io/github-action@v6
 | 
			
		||||
        uses: cypress-io/github-action@v4
 | 
			
		||||
        id: cypress
 | 
			
		||||
        # If CYPRESS_RECORD_KEY is set, run in parallel on all containers
 | 
			
		||||
        # Otherwise (e.g. if running from fork), we run on a single container only
 | 
			
		||||
        if: ${{ ( env.CYPRESS_RECORD_KEY != '' ) || ( matrix.containers == 1 ) }}
 | 
			
		||||
        with:
 | 
			
		||||
          install: false
 | 
			
		||||
          start: pnpm run dev:coverage
 | 
			
		||||
          wait-on: 'http://localhost:9000'
 | 
			
		||||
          browser: chrome
 | 
			
		||||
          # Disable recording if we don't have an API key
 | 
			
		||||
          # e.g. if this action was run from a fork
 | 
			
		||||
          record: ${{ secrets.CYPRESS_RECORD_KEY != '' }}
 | 
			
		||||
@@ -146,9 +46,8 @@ jobs:
 | 
			
		||||
          CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
 | 
			
		||||
          VITEST_COVERAGE: true
 | 
			
		||||
          CYPRESS_COMMIT: ${{ github.sha }}
 | 
			
		||||
 | 
			
		||||
      - name: Upload Coverage to Codecov
 | 
			
		||||
        uses: codecov/codecov-action@v4
 | 
			
		||||
        uses: codecov/codecov-action@v3
 | 
			
		||||
        # Run step only pushes to develop and pull_requests
 | 
			
		||||
        if: ${{ steps.cypress.conclusion == 'success' && (github.event_name == 'pull_request' || github.ref == 'refs/heads/develop')}}
 | 
			
		||||
        with:
 | 
			
		||||
@@ -158,55 +57,9 @@ jobs:
 | 
			
		||||
          fail_ci_if_error: false
 | 
			
		||||
          verbose: true
 | 
			
		||||
          token: 6845cc80-77ee-4e17-85a1-026cd95e0766
 | 
			
		||||
 | 
			
		||||
      # We upload the artifacts into numbered archives to prevent overwriting
 | 
			
		||||
      - name: Upload Artifacts
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        if: ${{ always() }}
 | 
			
		||||
        with:
 | 
			
		||||
          name: snapshots-${{ matrix.containers }}
 | 
			
		||||
          retention-days: 1
 | 
			
		||||
          path: ./cypress/snapshots
 | 
			
		||||
 | 
			
		||||
  combineArtifacts:
 | 
			
		||||
    needs: e2e
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    if: ${{ always() }}
 | 
			
		||||
    steps:
 | 
			
		||||
      # Download all snapshot artifacts and merge them into a single folder
 | 
			
		||||
      - name: Download All Artifacts
 | 
			
		||||
        uses: actions/download-artifact@v4
 | 
			
		||||
        with:
 | 
			
		||||
          path: snapshots
 | 
			
		||||
          pattern: snapshots-*
 | 
			
		||||
          merge-multiple: true
 | 
			
		||||
 | 
			
		||||
      # For successful push events, we save the snapshots cache
 | 
			
		||||
      - name: Save snapshots cache
 | 
			
		||||
        id: cache-upload
 | 
			
		||||
        if: ${{ github.event_name == 'push' && needs.e2e.result != 'failure' }}
 | 
			
		||||
        uses: actions/cache/save@v4
 | 
			
		||||
        with:
 | 
			
		||||
          path: ./snapshots
 | 
			
		||||
          key: ${{ runner.os }}-snapshots-${{ github.event.after }}
 | 
			
		||||
 | 
			
		||||
      - name: Flatten images to a folder
 | 
			
		||||
        if: ${{ needs.e2e.result == 'failure'  }}
 | 
			
		||||
        run: |
 | 
			
		||||
          mkdir errors
 | 
			
		||||
          cd snapshots
 | 
			
		||||
          find . -mindepth 2 -type d -name "*__diff_output__*" -exec sh -c 'mv "$0"/*.png ../errors/' {} \;
 | 
			
		||||
 | 
			
		||||
      - name: Upload Error snapshots
 | 
			
		||||
        if: ${{ needs.e2e.result == 'failure' }}
 | 
			
		||||
        uses: actions/upload-artifact@v4
 | 
			
		||||
        id: upload-artifacts
 | 
			
		||||
        uses: actions/upload-artifact@v3
 | 
			
		||||
        if: ${{ failure() && steps.cypress.conclusion == 'failure' }}
 | 
			
		||||
        with:
 | 
			
		||||
          name: error-snapshots
 | 
			
		||||
          retention-days: 10
 | 
			
		||||
          path: errors/
 | 
			
		||||
 | 
			
		||||
      - name: Notify Users
 | 
			
		||||
        if: ${{ needs.e2e.result == 'failure' }}
 | 
			
		||||
        run: |
 | 
			
		||||
          echo "::error title=Visual tests failed::You can view images that failed by downloading the error-snapshots artifact: ${{ steps.upload-artifacts.outputs.artifact-url }}"
 | 
			
		||||
          path: cypress/snapshots/**/__diff_output__/*
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								.github/workflows/link-checker.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/link-checker.yml
									
									
									
									
										vendored
									
									
								
							@@ -26,17 +26,17 @@ jobs:
 | 
			
		||||
      # lychee only uses the GITHUB_TOKEN to avoid rate-limiting
 | 
			
		||||
      contents: read
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - name: Restore lychee cache
 | 
			
		||||
        uses: actions/cache@v4
 | 
			
		||||
        uses: actions/cache@v3
 | 
			
		||||
        with:
 | 
			
		||||
          path: .lycheecache
 | 
			
		||||
          key: cache-lychee-${{ github.sha }}
 | 
			
		||||
          restore-keys: cache-lychee-
 | 
			
		||||
 | 
			
		||||
      - name: Link Checker
 | 
			
		||||
        uses: lycheeverse/lychee-action@v1.9.3
 | 
			
		||||
        uses: lycheeverse/lychee-action@v1.8.0
 | 
			
		||||
        with:
 | 
			
		||||
          args: >-
 | 
			
		||||
            --config .github/lychee.toml
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										29
									
								
								.github/workflows/lint.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								.github/workflows/lint.yml
									
									
									
									
										vendored
									
									
								
							@@ -16,17 +16,20 @@ permissions:
 | 
			
		||||
jobs:
 | 
			
		||||
  lint:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        node-version: [18.x]
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - uses: pnpm/action-setup@v2
 | 
			
		||||
        # uses version from "packageManager" field in package.json
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node.js
 | 
			
		||||
        uses: actions/setup-node@v4
 | 
			
		||||
      - name: Setup Node.js ${{ matrix.node-version }}
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: pnpm
 | 
			
		||||
          node-version-file: '.node-version'
 | 
			
		||||
          node-version: ${{ matrix.node-version }}
 | 
			
		||||
 | 
			
		||||
      - name: Install Packages
 | 
			
		||||
        run: |
 | 
			
		||||
@@ -59,22 +62,8 @@ jobs:
 | 
			
		||||
            ERROR_MESSAGE+=' `pnpm run --filter mermaid types:build-config`'
 | 
			
		||||
            ERROR_MESSAGE+=' on your local machine.'
 | 
			
		||||
            echo "::error title=Lint failure::${ERROR_MESSAGE}"
 | 
			
		||||
            # make sure to return an error exitcode so that GitHub actions shows a red-cross
 | 
			
		||||
            exit 1
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
      - name: Verify no circular dependencies
 | 
			
		||||
        working-directory: ./packages/mermaid
 | 
			
		||||
        shell: bash
 | 
			
		||||
        run: |
 | 
			
		||||
          if ! pnpm run --filter mermaid checkCircle; then
 | 
			
		||||
            ERROR_MESSAGE='Circular dependency detected.'
 | 
			
		||||
            ERROR_MESSAGE+=' This should be fixed by removing the circular dependency.'
 | 
			
		||||
            ERROR_MESSAGE+=' Run `pnpm run --filter mermaid checkCircle` on your local machine'
 | 
			
		||||
            ERROR_MESSAGE+=' to see the circular dependency.'
 | 
			
		||||
            echo "::error title=Lint failure::${ERROR_MESSAGE}"
 | 
			
		||||
            # make sure to return an error exitcode so that GitHub actions shows a red-cross
 | 
			
		||||
            exit 1
 | 
			
		||||
              # make sure to return an error exitcode so that GitHub actions shows a red-cross
 | 
			
		||||
              exit 1
 | 
			
		||||
          fi
 | 
			
		||||
 | 
			
		||||
      - name: Verify Docs
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								.github/workflows/pr-labeler-config-validator.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								.github/workflows/pr-labeler-config-validator.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
name: Validate PR Labeler Configuration
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    paths:
 | 
			
		||||
      - .github/workflows/pr-labeler-config-validator.yml
 | 
			
		||||
      - .github/workflows/pr-labeler.yml
 | 
			
		||||
      - .github/pr-labeler.yml
 | 
			
		||||
  pull_request:
 | 
			
		||||
    paths:
 | 
			
		||||
      - .github/workflows/pr-labeler-config-validator.yml
 | 
			
		||||
      - .github/workflows/pr-labeler.yml
 | 
			
		||||
      - .github/pr-labeler.yml
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  pr-labeler:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Checkout Repository
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
      - name: Validate Configuration
 | 
			
		||||
        uses: Yash-Singh1/pr-labeler-config-validator@releases/v0.0.3
 | 
			
		||||
        with:
 | 
			
		||||
          configuration-path: .github/pr-labeler.yml
 | 
			
		||||
							
								
								
									
										22
									
								
								.github/workflows/pr-labeler.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								.github/workflows/pr-labeler.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,31 +1,13 @@
 | 
			
		||||
name: Apply labels to PR
 | 
			
		||||
on:
 | 
			
		||||
  pull_request_target:
 | 
			
		||||
    # required for pr-labeler to support PRs from forks
 | 
			
		||||
    # ===================== ⛔ ☢️ 🚫 ⚠️ Warning ⚠️ 🚫 ☢️ ⛔ =======================
 | 
			
		||||
    # Be very careful what you put in this GitHub Action workflow file to avoid
 | 
			
		||||
    # malicious PRs from getting access to the Mermaid-js repo.
 | 
			
		||||
    #
 | 
			
		||||
    # Please read the following first before reviewing/merging:
 | 
			
		||||
    # - https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target
 | 
			
		||||
    # - https://securitylab.github.com/research/github-actions-preventing-pwn-requests/
 | 
			
		||||
    types: [opened, reopened, synchronize]
 | 
			
		||||
 | 
			
		||||
permissions:
 | 
			
		||||
  contents: read
 | 
			
		||||
    types: [opened]
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  pr-labeler:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    permissions:
 | 
			
		||||
      contents: read # read permission is required to read config file
 | 
			
		||||
      pull-requests: write # write permission is required to label PRs
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Label PR
 | 
			
		||||
        uses: release-drafter/release-drafter@v6
 | 
			
		||||
        with:
 | 
			
		||||
          config-name: pr-labeler.yml
 | 
			
		||||
          disable-autolabeler: false
 | 
			
		||||
          disable-releaser: true
 | 
			
		||||
        uses: TimonVS/pr-labeler-action@v4
 | 
			
		||||
        env:
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								.github/workflows/publish-docs.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/workflows/publish-docs.yml
									
									
									
									
										vendored
									
									
								
							@@ -23,27 +23,27 @@ jobs:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Checkout
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - uses: pnpm/action-setup@v2
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node.js
 | 
			
		||||
        uses: actions/setup-node@v4
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: pnpm
 | 
			
		||||
          node-version-file: '.node-version'
 | 
			
		||||
          node-version: 18
 | 
			
		||||
 | 
			
		||||
      - name: Install Packages
 | 
			
		||||
        run: pnpm install --frozen-lockfile
 | 
			
		||||
 | 
			
		||||
      - name: Setup Pages
 | 
			
		||||
        uses: actions/configure-pages@v4
 | 
			
		||||
        uses: actions/configure-pages@v3
 | 
			
		||||
 | 
			
		||||
      - name: Run Build
 | 
			
		||||
        run: pnpm --filter mermaid run docs:build:vitepress
 | 
			
		||||
 | 
			
		||||
      - name: Upload artifact
 | 
			
		||||
        uses: actions/upload-pages-artifact@v3
 | 
			
		||||
        uses: actions/upload-pages-artifact@v1
 | 
			
		||||
        with:
 | 
			
		||||
          path: packages/mermaid/src/vitepress/.vitepress/dist
 | 
			
		||||
 | 
			
		||||
@@ -56,4 +56,4 @@ jobs:
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Deploy to GitHub Pages
 | 
			
		||||
        id: deployment
 | 
			
		||||
        uses: actions/deploy-pages@v4
 | 
			
		||||
        uses: actions/deploy-pages@v2
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								.github/workflows/release-draft.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/workflows/release-draft.yml
									
									
									
									
										vendored
									
									
								
							@@ -3,21 +3,13 @@ name: Draft Release
 | 
			
		||||
on:
 | 
			
		||||
  push:
 | 
			
		||||
    branches:
 | 
			
		||||
      - master
 | 
			
		||||
 | 
			
		||||
permissions:
 | 
			
		||||
  contents: read
 | 
			
		||||
      - develop
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  draft-release:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    permissions:
 | 
			
		||||
      contents: write # write permission is required to create a GitHub release
 | 
			
		||||
      pull-requests: read # required to read PR titles/labels
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Draft Release
 | 
			
		||||
        uses: release-drafter/release-drafter@v6
 | 
			
		||||
        with:
 | 
			
		||||
          disable-autolabeler: true
 | 
			
		||||
        uses: toolmantim/release-drafter@v5
 | 
			
		||||
        env:
 | 
			
		||||
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,17 +9,17 @@ jobs:
 | 
			
		||||
  publish-preview:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
 | 
			
		||||
      - uses: pnpm/action-setup@v2
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node.js
 | 
			
		||||
        uses: actions/setup-node@v4
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: pnpm
 | 
			
		||||
          node-version-file: '.node-version'
 | 
			
		||||
          node-version: 18.x
 | 
			
		||||
 | 
			
		||||
      - name: Install Packages
 | 
			
		||||
        run: |
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								.github/workflows/release-publish.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/release-publish.yml
									
									
									
									
										vendored
									
									
								
							@@ -8,17 +8,17 @@ jobs:
 | 
			
		||||
  publish:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
      - uses: fregante/setup-git-user@v2
 | 
			
		||||
 | 
			
		||||
      - uses: pnpm/action-setup@v2
 | 
			
		||||
        # uses version from "packageManager" field in package.json
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node.js
 | 
			
		||||
        uses: actions/setup-node@v4
 | 
			
		||||
      - name: Setup Node.js v18
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: pnpm
 | 
			
		||||
          node-version-file: '.node-version'
 | 
			
		||||
          node-version: 18.x
 | 
			
		||||
 | 
			
		||||
      - name: Install Packages
 | 
			
		||||
        run: |
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							@@ -8,17 +8,20 @@ permissions:
 | 
			
		||||
jobs:
 | 
			
		||||
  unit-test:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    strategy:
 | 
			
		||||
      matrix:
 | 
			
		||||
        node-version: [18.x]
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
 | 
			
		||||
      - uses: pnpm/action-setup@v2
 | 
			
		||||
        # uses version from "packageManager" field in package.json
 | 
			
		||||
 | 
			
		||||
      - name: Setup Node.js
 | 
			
		||||
        uses: actions/setup-node@v4
 | 
			
		||||
      - name: Setup Node.js ${{ matrix.node-version }}
 | 
			
		||||
        uses: actions/setup-node@v3
 | 
			
		||||
        with:
 | 
			
		||||
          cache: pnpm
 | 
			
		||||
          node-version-file: '.node-version'
 | 
			
		||||
          node-version: ${{ matrix.node-version }}
 | 
			
		||||
 | 
			
		||||
      - name: Install Packages
 | 
			
		||||
        run: |
 | 
			
		||||
@@ -39,7 +42,7 @@ jobs:
 | 
			
		||||
          pnpm exec vitest run ./packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts --coverage
 | 
			
		||||
 | 
			
		||||
      - name: Upload Coverage to Codecov
 | 
			
		||||
        uses: codecov/codecov-action@v4
 | 
			
		||||
        uses: codecov/codecov-action@v3
 | 
			
		||||
        # Run step only pushes to develop and pull_requests
 | 
			
		||||
        if: ${{ github.event_name == 'pull_request' || github.ref == 'refs/heads/develop' }}
 | 
			
		||||
        with:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								.github/workflows/update-browserlist.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/workflows/update-browserlist.yml
									
									
									
									
										vendored
									
									
								
							@@ -8,18 +8,11 @@ jobs:
 | 
			
		||||
  update-browser-list:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - uses: pnpm/action-setup@v2
 | 
			
		||||
      - run: npx update-browserslist-db@latest
 | 
			
		||||
      - uses: actions/checkout@v3
 | 
			
		||||
      - run: npx browserslist@latest --update-db
 | 
			
		||||
      - name: Commit changes
 | 
			
		||||
        uses: EndBug/add-and-commit@v9
 | 
			
		||||
        with:
 | 
			
		||||
          author_name: ${{ github.actor }}
 | 
			
		||||
          author_email: ${{ github.actor }}@users.noreply.github.com
 | 
			
		||||
          message: 'chore: update browsers list'
 | 
			
		||||
          push: false
 | 
			
		||||
      - name: Create Pull Request
 | 
			
		||||
        uses: peter-evans/create-pull-request@v6
 | 
			
		||||
        with:
 | 
			
		||||
          branch: update-browserslist
 | 
			
		||||
          title: Update Browserslist
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -46,8 +46,3 @@ stats/
 | 
			
		||||
 | 
			
		||||
demos/dev/**
 | 
			
		||||
!/demos/dev/example.html
 | 
			
		||||
!/demos/dev/reload.js
 | 
			
		||||
tsx-0/**
 | 
			
		||||
 | 
			
		||||
# autogenereated by langium-cli
 | 
			
		||||
generated/
 | 
			
		||||
							
								
								
									
										4
									
								
								.husky/commit-msg
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										4
									
								
								.husky/commit-msg
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
# . "$(dirname "$0")/_/husky.sh"
 | 
			
		||||
 | 
			
		||||
# npx --no-install commitlint --edit $1
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
. "$(dirname "$0")/_/husky.sh"
 | 
			
		||||
 | 
			
		||||
NODE_OPTIONS="--max_old_space_size=8192" pnpm run pre-commit
 | 
			
		||||
pnpm run pre-commit
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,6 @@ export default {
 | 
			
		||||
    // https://prettier.io/docs/en/cli.html#--cache
 | 
			
		||||
    'prettier --write',
 | 
			
		||||
  ],
 | 
			
		||||
  '.cspell/*.txt': ['tsx scripts/fixCSpell.ts'],
 | 
			
		||||
  'cSpell.json': ['ts-node-esm scripts/fixCSpell.ts'],
 | 
			
		||||
  '**/*.jison': ['pnpm -w run lint:jison'],
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
20.12.2
 | 
			
		||||
							
								
								
									
										2
									
								
								.npmrc
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								.npmrc
									
									
									
									
									
								
							@@ -1,4 +1,2 @@
 | 
			
		||||
registry=https://registry.npmjs.org
 | 
			
		||||
auto-install-peers=true
 | 
			
		||||
strict-peer-dependencies=false
 | 
			
		||||
package-import-method=clone-or-copy
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
dist
 | 
			
		||||
cypress/platform/xss3.html
 | 
			
		||||
.cache
 | 
			
		||||
.pnpm-store
 | 
			
		||||
coverage
 | 
			
		||||
# Autogenerated by PNPM
 | 
			
		||||
pnpm-lock.yaml
 | 
			
		||||
@@ -11,8 +10,3 @@ stats
 | 
			
		||||
.nyc_output
 | 
			
		||||
# Autogenerated by `pnpm run --filter mermaid types:build-config`
 | 
			
		||||
packages/mermaid/src/config.type.ts
 | 
			
		||||
# autogenereated by langium-cli
 | 
			
		||||
generated/
 | 
			
		||||
# Ignore the files creates in /demos/dev except for example.html
 | 
			
		||||
demos/dev/**
 | 
			
		||||
!/demos/dev/example.html
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,5 @@
 | 
			
		||||
  "printWidth": 100,
 | 
			
		||||
  "singleQuote": true,
 | 
			
		||||
  "useTabs": false,
 | 
			
		||||
  "tabWidth": 2,
 | 
			
		||||
  "trailingComma": "es5"
 | 
			
		||||
  "tabWidth": 2
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,6 @@ import { visualizer } from 'rollup-plugin-visualizer';
 | 
			
		||||
import type { TemplateType } from 'rollup-plugin-visualizer/dist/plugin/template-types.js';
 | 
			
		||||
import istanbul from 'vite-plugin-istanbul';
 | 
			
		||||
import { packageOptions } from '../.build/common.js';
 | 
			
		||||
import { generateLangium } from '../.build/generateLangium.js';
 | 
			
		||||
 | 
			
		||||
const visualize = process.argv.includes('--visualize');
 | 
			
		||||
const watch = process.argv.includes('--watch');
 | 
			
		||||
@@ -74,9 +73,6 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions)
 | 
			
		||||
        output,
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    define: {
 | 
			
		||||
      'import.meta.vitest': 'undefined',
 | 
			
		||||
    },
 | 
			
		||||
    resolve: {
 | 
			
		||||
      extensions: [],
 | 
			
		||||
    },
 | 
			
		||||
@@ -86,7 +82,7 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions)
 | 
			
		||||
      // @ts-expect-error According to the type definitions, rollup plugins are incompatible with vite
 | 
			
		||||
      typescript({ compilerOptions: { declaration: false } }),
 | 
			
		||||
      istanbul({
 | 
			
		||||
        exclude: ['node_modules', 'test/', '__mocks__', 'generated'],
 | 
			
		||||
        exclude: ['node_modules', 'test/', '__mocks__'],
 | 
			
		||||
        extension: ['.js', '.ts'],
 | 
			
		||||
        requireEnv: true,
 | 
			
		||||
        forceBuildInstrument: coverage,
 | 
			
		||||
@@ -110,24 +106,18 @@ const buildPackage = async (entryName: keyof typeof packageOptions) => {
 | 
			
		||||
 | 
			
		||||
const main = async () => {
 | 
			
		||||
  const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[];
 | 
			
		||||
  for (const pkg of packageNames.filter(
 | 
			
		||||
    (pkg) => !mermaidOnly || pkg === 'mermaid' || pkg === 'parser'
 | 
			
		||||
  )) {
 | 
			
		||||
  for (const pkg of packageNames.filter((pkg) => !mermaidOnly || pkg === 'mermaid')) {
 | 
			
		||||
    await buildPackage(pkg);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
await generateLangium();
 | 
			
		||||
 | 
			
		||||
if (watch) {
 | 
			
		||||
  await build(getBuildConfig({ minify: false, watch, core: false, entryName: 'parser' }));
 | 
			
		||||
  build(getBuildConfig({ minify: false, watch, core: false, entryName: 'mermaid' }));
 | 
			
		||||
  if (!mermaidOnly) {
 | 
			
		||||
    build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-example-diagram' }));
 | 
			
		||||
    build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-zenuml' }));
 | 
			
		||||
  }
 | 
			
		||||
} else if (visualize) {
 | 
			
		||||
  await build(getBuildConfig({ minify: false, watch, core: false, entryName: 'parser' }));
 | 
			
		||||
  await build(getBuildConfig({ minify: false, core: true, entryName: 'mermaid' }));
 | 
			
		||||
  await build(getBuildConfig({ minify: false, core: false, entryName: 'mermaid' }));
 | 
			
		||||
} else {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
import express from 'express';
 | 
			
		||||
import cors from 'cors';
 | 
			
		||||
import { createServer as createViteServer } from 'vite';
 | 
			
		||||
import { packageOptions } from '../.build/common.js';
 | 
			
		||||
 | 
			
		||||
async function createServer() {
 | 
			
		||||
  const app = express();
 | 
			
		||||
@@ -15,9 +14,9 @@ async function createServer() {
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  app.use(cors());
 | 
			
		||||
  for (const { packageName } of Object.values(packageOptions)) {
 | 
			
		||||
    app.use(express.static(`./packages/${packageName}/dist`));
 | 
			
		||||
  }
 | 
			
		||||
  app.use(express.static('./packages/mermaid/dist'));
 | 
			
		||||
  app.use(express.static('./packages/mermaid-zenuml/dist'));
 | 
			
		||||
  app.use(express.static('./packages/mermaid-example-diagram/dist'));
 | 
			
		||||
  app.use(vite.middlewares);
 | 
			
		||||
  app.use(express.static('demos'));
 | 
			
		||||
  app.use(express.static('cypress/platform'));
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.vscode/extensions.json
									
									
									
									
										vendored
									
									
								
							@@ -2,7 +2,7 @@
 | 
			
		||||
  "recommendations": [
 | 
			
		||||
    "dbaeumer.vscode-eslint",
 | 
			
		||||
    "esbenp.prettier-vscode",
 | 
			
		||||
    "vitest.explorer",
 | 
			
		||||
    "zixuanchen.vitest-explorer",
 | 
			
		||||
    "luniclynx.bison"
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							@@ -18,8 +18,7 @@
 | 
			
		||||
      "type": "node",
 | 
			
		||||
      "request": "launch",
 | 
			
		||||
      "args": ["scripts/docs.cli.mts"],
 | 
			
		||||
      // we'll need to change this to --import in Node.JS v20.6.0 and up
 | 
			
		||||
      "runtimeArgs": ["--loader", "tsx/esm"],
 | 
			
		||||
      "runtimeArgs": ["--loader", "ts-node/esm"],
 | 
			
		||||
      "cwd": "${workspaceRoot}/packages/mermaid",
 | 
			
		||||
      "skipFiles": ["<node_internals>/**", "**/node_modules/**"],
 | 
			
		||||
      "smartStep": true,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -68,7 +68,7 @@ try {
 | 
			
		||||
 | 
			
		||||
### Init deprecated and InitThrowsErrors removed
 | 
			
		||||
 | 
			
		||||
The config passed to `init` was not being used earlier.
 | 
			
		||||
The config passed to `init` was not being used eariler.
 | 
			
		||||
It will now be used.
 | 
			
		||||
The `init` function is deprecated and will be removed in the next major release.
 | 
			
		||||
init currently works as a wrapper to `initialize` and `run`.
 | 
			
		||||
@@ -195,7 +195,7 @@ mermaid.run({
 | 
			
		||||
- "Cannot activate" in sequenceDiagram [\#647](https://github.com/knsv/mermaid/issues/647)
 | 
			
		||||
- Link \("click" statement\) in flowchart does not work in exported SVG [\#646](https://github.com/knsv/mermaid/issues/646)
 | 
			
		||||
- How to pass styling [\#639](https://github.com/knsv/mermaid/issues/639)
 | 
			
		||||
- The live editor can't show seq diagram with notes for 8.0.0-alpha.3 [\#638](https://github.com/knsv/mermaid/issues/638)
 | 
			
		||||
- The live editor cant show seq diagram with notes for 8.0.0-alpha.3 [\#638](https://github.com/knsv/mermaid/issues/638)
 | 
			
		||||
- import mermaid.css with ES6 + NPM [\#634](https://github.com/knsv/mermaid/issues/634)
 | 
			
		||||
- Actor line cuts through other elements [\#633](https://github.com/knsv/mermaid/issues/633)
 | 
			
		||||
- Graph TD line out of the picture \(left side\) [\#630](https://github.com/knsv/mermaid/issues/630)
 | 
			
		||||
@@ -504,7 +504,7 @@ mermaid.run({
 | 
			
		||||
 | 
			
		||||
- Docs css: code hard to read [\#324](https://github.com/knsv/mermaid/issues/324)
 | 
			
		||||
- About Markpad integration [\#323](https://github.com/knsv/mermaid/issues/323)
 | 
			
		||||
- How to link backwards in flowchat? [\#321](https://github.com/knsv/mermaid/issues/321)
 | 
			
		||||
- How to link backwords in flowchat? [\#321](https://github.com/knsv/mermaid/issues/321)
 | 
			
		||||
- Help with editor [\#310](https://github.com/knsv/mermaid/issues/310)
 | 
			
		||||
- +1 [\#293](https://github.com/knsv/mermaid/issues/293)
 | 
			
		||||
- Basic chart does not render on Chome, but does in Firefox [\#290](https://github.com/knsv/mermaid/issues/290)
 | 
			
		||||
@@ -619,7 +619,7 @@ mermaid.run({
 | 
			
		||||
- render to png from the cli does not display the marker-end arrow heads [\#181](https://github.com/knsv/mermaid/issues/181)
 | 
			
		||||
- Links in sequence diagrams [\#159](https://github.com/knsv/mermaid/issues/159)
 | 
			
		||||
- comment characters `%%` cause parse error [\#141](https://github.com/knsv/mermaid/issues/141)
 | 
			
		||||
- Add a reversed asymmetric shape [\#124](https://github.com/knsv/mermaid/issues/124)
 | 
			
		||||
- Add a reversed assymetric shape [\#124](https://github.com/knsv/mermaid/issues/124)
 | 
			
		||||
- Add syntax for double headed arrows [\#123](https://github.com/knsv/mermaid/issues/123)
 | 
			
		||||
- Support for font-awesome [\#49](https://github.com/knsv/mermaid/issues/49)
 | 
			
		||||
 | 
			
		||||
@@ -659,7 +659,7 @@ mermaid.run({
 | 
			
		||||
- Auto linewrap for notes in sequence diagrams [\#178](https://github.com/knsv/mermaid/issues/178)
 | 
			
		||||
- Execute code after initialize [\#176](https://github.com/knsv/mermaid/issues/176)
 | 
			
		||||
- Autoscaling for all diagram types [\#175](https://github.com/knsv/mermaid/issues/175)
 | 
			
		||||
- Problem with click event callback [\#174](https://github.com/knsv/mermaid/issues/174)
 | 
			
		||||
- Problem wit click event callback [\#174](https://github.com/knsv/mermaid/issues/174)
 | 
			
		||||
- How to escape characters? [\#170](https://github.com/knsv/mermaid/issues/170)
 | 
			
		||||
- it can not work [\#167](https://github.com/knsv/mermaid/issues/167)
 | 
			
		||||
- UML Class diagram [\#154](https://github.com/knsv/mermaid/issues/154)
 | 
			
		||||
@@ -762,7 +762,7 @@ mermaid.run({
 | 
			
		||||
- subgraph background is black in rendered flowchart PNG via CLI [\#121](https://github.com/knsv/mermaid/issues/121)
 | 
			
		||||
- Integrate editor at https://github.com/naseer/mermaid-webapp [\#110](https://github.com/knsv/mermaid/issues/110)
 | 
			
		||||
- Internet Explorer Support [\#99](https://github.com/knsv/mermaid/issues/99)
 | 
			
		||||
- Asymmetric shapes not documented [\#82](https://github.com/knsv/mermaid/issues/82)
 | 
			
		||||
- Assymetric shapes not documented [\#82](https://github.com/knsv/mermaid/issues/82)
 | 
			
		||||
- NoModificationAllowedError [\#23](https://github.com/knsv/mermaid/issues/23)
 | 
			
		||||
- Improve arrows [\#3](https://github.com/knsv/mermaid/issues/3)
 | 
			
		||||
 | 
			
		||||
@@ -908,7 +908,7 @@ mermaid.run({
 | 
			
		||||
 | 
			
		||||
- Question marks don't render properly with /dist/mermaid.full.min.js [\#30](https://github.com/knsv/mermaid/issues/30)
 | 
			
		||||
- Error with some characters [\#25](https://github.com/knsv/mermaid/issues/25)
 | 
			
		||||
- Provide parse function in browser without `require`? [\#21](https://github.com/knsv/mermaid/issues/21)
 | 
			
		||||
- Provide parse function in browser widthout `require`? [\#21](https://github.com/knsv/mermaid/issues/21)
 | 
			
		||||
- Better label text support [\#18](https://github.com/knsv/mermaid/issues/18)
 | 
			
		||||
- Cap-cased words break parser [\#8](https://github.com/knsv/mermaid/issues/8)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -59,8 +59,8 @@ representative at an online or offline event.
 | 
			
		||||
## Enforcement
 | 
			
		||||
 | 
			
		||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
 | 
			
		||||
reported to the community leaders responsible for enforcement at <security@mermaid.live>.
 | 
			
		||||
 | 
			
		||||
reported to the community leaders responsible for enforcement at security@mermaid.live
 | 
			
		||||
.
 | 
			
		||||
All complaints will be reviewed and investigated promptly and fairly.
 | 
			
		||||
 | 
			
		||||
All community leaders are obligated to respect the privacy and security of the
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
./packages/mermaid/src/docs/community/contributing.md
 | 
			
		||||
							
								
								
									
										76
									
								
								CONTRIBUTING.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								CONTRIBUTING.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,76 @@
 | 
			
		||||
# Contributing
 | 
			
		||||
 | 
			
		||||
Please read in detail about how to contribute documentation and code on the [Mermaid documentation site.](https://mermaid-js.github.io/mermaid/#/development)
 | 
			
		||||
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
# Mermaid contribution cheat-sheet
 | 
			
		||||
 | 
			
		||||
## Requirements
 | 
			
		||||
 | 
			
		||||
- [volta](https://volta.sh/) to manage node versions.
 | 
			
		||||
- [Node.js](https://nodejs.org/en/). `volta install node`
 | 
			
		||||
- [pnpm](https://pnpm.io/) package manager. `volta install pnpm`
 | 
			
		||||
 | 
			
		||||
## Development Installation
 | 
			
		||||
 | 
			
		||||
If you don't have direct access to push to mermaid repositories, make a fork first. Then clone. Or clone directly from mermaid-js:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
git clone git@github.com:mermaid-js/mermaid.git
 | 
			
		||||
cd mermaid
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Install required packages:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
# npx is required for first install as volta support for pnpm is not added yet.
 | 
			
		||||
npx pnpm install
 | 
			
		||||
pnpm test # run unit tests
 | 
			
		||||
pnpm dev # starts a dev server
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Open <http://localhost:9000> in your browser after starting the dev server.
 | 
			
		||||
You can also duplicate the `example.html` file in `demos/dev`, rename it and add your own mermaid code to it.
 | 
			
		||||
That will be served at <http://localhost:9000/dev/your-file-name.html>.
 | 
			
		||||
 | 
			
		||||
### Docker
 | 
			
		||||
 | 
			
		||||
If you are using docker and docker-compose, you have self-documented `run` bash script, which is a convenient alias for docker-compose commands:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
./run install # npx pnpm install
 | 
			
		||||
./run test # pnpm test
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Testing
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
# Run unit test
 | 
			
		||||
pnpm test
 | 
			
		||||
# Run unit test in watch mode
 | 
			
		||||
pnpm test:watch
 | 
			
		||||
# Run E2E test
 | 
			
		||||
pnpm e2e
 | 
			
		||||
# Debug E2E tests
 | 
			
		||||
pnpm dev
 | 
			
		||||
pnpm cypress:open # in another terminal
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Branch name format:
 | 
			
		||||
 | 
			
		||||
```text
 | 
			
		||||
   [feature | bug | chore | docs]/[issue number]_[short description using dashes ('-') or underscores ('_') instead of spaces]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
eg: `feature/2945_state-diagram-new-arrow-florbs`, `bug/1123_fix_random_ugly_red_text`
 | 
			
		||||
 | 
			
		||||
## Documentation
 | 
			
		||||
 | 
			
		||||
Documentation is necessary for all non bugfix/refactoring changes.
 | 
			
		||||
 | 
			
		||||
Only make changes to files that are in [`/packages/mermaid/src/docs`](packages/mermaid/src/docs)
 | 
			
		||||
 | 
			
		||||
**_DO NOT CHANGE FILES IN `/docs`_**
 | 
			
		||||
 | 
			
		||||
[Join our slack community if you want closer contact!](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE)
 | 
			
		||||
@@ -1,2 +0,0 @@
 | 
			
		||||
FROM node:20.12.2-alpine3.19 AS base
 | 
			
		||||
RUN wget -qO- https://get.pnpm.io/install.sh | ENV="$HOME/.shrc" SHELL="$(which sh)" sh -
 | 
			
		||||
							
								
								
									
										77
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										77
									
								
								README.md
									
									
									
									
									
								
							@@ -15,14 +15,11 @@ Generate diagrams from markdown-like text.
 | 
			
		||||
<a href="https://mermaid.live/"><b>Live Editor!</b></a>
 | 
			
		||||
</p>
 | 
			
		||||
<p align="center">
 | 
			
		||||
 <a href="https://mermaid.js.org">📖 Documentation</a> | <a href="https://mermaid.js.org/intro/">🚀 Getting Started</a> | <a href="https://www.jsdelivr.com/package/npm/mermaid">🌐 CDN</a> | <a href="https://discord.gg/AgrbSrBer3" title="Discord invite">🙌 Join Us</a>
 | 
			
		||||
 <a href="https://mermaid.js.org">📖 Documentation</a> | <a href="https://mermaid.js.org/intro/">🚀 Getting Started</a> | <a href="https://www.jsdelivr.com/package/npm/mermaid">🌐 CDN</a> | <a href="https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE" title="Slack invite">🙌 Join Us</a>
 | 
			
		||||
</p>
 | 
			
		||||
<p align="center">
 | 
			
		||||
<a href="./README.zh-CN.md">简体中文</a>
 | 
			
		||||
</p>
 | 
			
		||||
<p align="center">
 | 
			
		||||
Try Live Editor previews of future releases: <a href="https://develop.git.mermaid.live/" title="Try the mermaid version from the develop branch.">Develop</a> | <a href="https://next.git.mermaid.live/" title="Try the mermaid version from the next branch.">Next</a>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<br>
 | 
			
		||||
<br>
 | 
			
		||||
@@ -33,8 +30,8 @@ Try Live Editor previews of future releases: <a href="https://develop.git.mermai
 | 
			
		||||
[](https://app.codecov.io/github/mermaid-js/mermaid/tree/develop)
 | 
			
		||||
[](https://www.jsdelivr.com/package/npm/mermaid)
 | 
			
		||||
[](https://www.npmjs.com/package/mermaid)
 | 
			
		||||
[](https://discord.gg/AgrbSrBer3)
 | 
			
		||||
[](https://twitter.com/mermaidjs_)
 | 
			
		||||
[](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE)
 | 
			
		||||
[](https://twitter.com/mermaidjs_)
 | 
			
		||||
 | 
			
		||||
<img src="./img/header.png" alt="" />
 | 
			
		||||
 | 
			
		||||
@@ -42,23 +39,7 @@ Try Live Editor previews of future releases: <a href="https://develop.git.mermai
 | 
			
		||||
 | 
			
		||||
**Thanks to all involved, people committing pull requests, people answering questions! 🙏**
 | 
			
		||||
 | 
			
		||||
<a href="https://mermaid.js.org/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
 | 
			
		||||
 | 
			
		||||
## Table of content
 | 
			
		||||
 | 
			
		||||
<details>
 | 
			
		||||
<summary>Expand contents</summary>
 | 
			
		||||
 | 
			
		||||
- [About](#about)
 | 
			
		||||
- [Examples](#examples)
 | 
			
		||||
- [Release](#release)
 | 
			
		||||
- [Related projects](#related-projects)
 | 
			
		||||
- [Contributors](#contributors---)
 | 
			
		||||
- [Security and safe diagrams](#security-and-safe-diagrams)
 | 
			
		||||
- [Reporting vulnerabilities](#reporting-vulnerabilities)
 | 
			
		||||
- [Appreciation](#appreciation)
 | 
			
		||||
 | 
			
		||||
</details>
 | 
			
		||||
<a href="https://mermaid-js.github.io/mermaid/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
 | 
			
		||||
 | 
			
		||||
## About
 | 
			
		||||
 | 
			
		||||
@@ -74,12 +55,12 @@ Mermaid addresses this problem by enabling users to create easily modifiable dia
 | 
			
		||||
<br/>
 | 
			
		||||
 | 
			
		||||
Mermaid allows even non-programmers to easily create detailed diagrams through the [Mermaid Live Editor](https://mermaid.live/).<br/>
 | 
			
		||||
For video tutorials, visit our [Tutorials](https://mermaid.js.org/ecosystem/tutorials.html) page.
 | 
			
		||||
Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](https://mermaid.js.org/ecosystem/integrations-community.html).
 | 
			
		||||
[Tutorials](./docs/config/Tutorials.md) has video tutorials.
 | 
			
		||||
Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](./docs/ecosystem/integrations.md).
 | 
			
		||||
 | 
			
		||||
You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](https://mermaid.js.org/ecosystem/integrations-community.html).
 | 
			
		||||
You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](./docs/ecosystem/integrations.md).
 | 
			
		||||
 | 
			
		||||
For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](https://mermaid.js.org/intro/getting-started.html), [Usage](https://mermaid.js.org/config/usage.html) and [Tutorials](https://mermaid.js.org/ecosystem/tutorials.html).
 | 
			
		||||
For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](./docs/community/n00b-overview.md), [Usage](./docs/config/usage.md) and [Tutorials](./docs/config/Tutorials.md).
 | 
			
		||||
 | 
			
		||||
In our release process we rely heavily on visual regression tests using [applitools](https://applitools.com/). Applitools is a great service which has been easy to use and integrate with our tests.
 | 
			
		||||
 | 
			
		||||
@@ -91,11 +72,11 @@ In our release process we rely heavily on visual regression tests using [applito
 | 
			
		||||
 | 
			
		||||
## Examples
 | 
			
		||||
 | 
			
		||||
**The following are some examples of the diagrams, charts and graphs that can be made using Mermaid. Click here to jump into the [text syntax](https://mermaid.js.org/intro/syntax-reference.html).**
 | 
			
		||||
**The following are some examples of the diagrams, charts and graphs that can be made using Mermaid. Click here to jump into the [text syntax](https://mermaid-js.github.io/mermaid/#/n00b-syntaxReference).**
 | 
			
		||||
 | 
			
		||||
<!-- <Flowchart> -->
 | 
			
		||||
 | 
			
		||||
### Flowchart [<a href="https://mermaid.js.org/syntax/flowchart.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNpNkMtqwzAQRX9FzKqFJK7t1km8KDQP6KJQSLOLvZhIY1tgS0GWmgbb_165IaFaiXvOFTPqgGtBkEJR6zOv0Fj2scsU8-ft8I5G5Gw6fe339GN7tnrYaafE45WvRsLW3Ya4bKVWwzVe_xU-FfVsc9hR62rLwvw_2591z7Y3FuUwgYZMg1L4ObrRzMBW1FAGqb8KKtCLGWRq8Ko7CbS0FdJqA2mBdUsTQGf110VxSK1xdJM2EkuDzd2qNQrypQ7s5TQuXcrW-ie5VoUsx9yZ2seVtac2DYIRz0ppK3eccd0ErRTjD1XfyyRIomSBUUzJPMaXOBb8GC4XRfQcFmL-FEYIwzD8AggvcHE">live editor</a>]
 | 
			
		||||
### Flowchart [<a href="https://mermaid-js.github.io/mermaid/#/flowchart">docs</a> - <a href="https://mermaid.live/edit#pako:eNpNkMtqwzAQRX9FzKqFJK7t1km8KDQP6KJQSLOLvZhIY1tgS0GWmgbb_165IaFaiXvOFTPqgGtBkEJR6zOv0Fj2scsU8-ft8I5G5Gw6fe339GN7tnrYaafE45WvRsLW3Ya4bKVWwzVe_xU-FfVsc9hR62rLwvw_2591z7Y3FuUwgYZMg1L4ObrRzMBW1FAGqb8KKtCLGWRq8Ko7CbS0FdJqA2mBdUsTQGf110VxSK1xdJM2EkuDzd2qNQrypQ7s5TQuXcrW-ie5VoUsx9yZ2seVtac2DYIRz0ppK3eccd0ErRTjD1XfyyRIomSBUUzJPMaXOBb8GC4XRfQcFmL-FEYIwzD8AggvcHE">live editor</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
flowchart LR
 | 
			
		||||
@@ -115,12 +96,12 @@ C -->|One| D[Result 1]
 | 
			
		||||
C -->|Two| E[Result 2]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Sequence diagram [<a href="https://mermaid.js.org/syntax/sequenceDiagram.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNo9kMluwjAQhl_F-AykQMuSA1WrbuLQQ3v1ZbAnsVXHkzrjVhHi3etQwKfRv4w-z0FqMihL2eF3wqDxyUEdoVHhwTuNk-12RzaU4g29JzHMY2HpV0BE0VO6V8ETtdkGz1Zb1F8qiPyG5LX84mrLAmpwoWNh-5a0pWCiAxUwGBXeiVHEU4oq8V_6AHYUwAu2lLLTjVQ4bc1rT2yleI0IfJG320faZ9ABbk-Jz3hZnFxBduR9L2oiM5Jj2WBswJn8-cMArSRbbFDJMo8GK0ielVThmKOpNcD4bBxTlGUFvsOxhMT02QctS44JL6HzAS-iJzCYOwfJfTscunYd542aQuXqQU_RZ9kyt11ZFIM9rR3btJ9qaorOGQuR7c9mWSznyzXMF7hcLeBusTB6P9usq_ntrDKrm9kc5PF4_AMJE56Z">live editor</a>]
 | 
			
		||||
### Sequence diagram [<a href="https://mermaid-js.github.io/mermaid/#/sequenceDiagram">docs</a> - <a href="https://mermaid.live/edit#pako:eNo9kMluwjAQhl_F-AykQMuSA1WrbuLQQ3v1ZbAnsVXHkzrjVhHi3etQwKfRv4w-z0FqMihL2eF3wqDxyUEdoVHhwTuNk-12RzaU4g29JzHMY2HpV0BE0VO6V8ETtdkGz1Zb1F8qiPyG5LX84mrLAmpwoWNh-5a0pWCiAxUwGBXeiVHEU4oq8V_6AHYUwAu2lLLTjVQ4bc1rT2yleI0IfJG320faZ9ABbk-Jz3hZnFxBduR9L2oiM5Jj2WBswJn8-cMArSRbbFDJMo8GK0ielVThmKOpNcD4bBxTlGUFvsOxhMT02QctS44JL6HzAS-iJzCYOwfJfTscunYd542aQuXqQU_RZ9kyt11ZFIM9rR3btJ9qaorOGQuR7c9mWSznyzXMF7hcLeBusTB6P9usq_ntrDKrm9kc5PF4_AMJE56Z">live editor</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
sequenceDiagram
 | 
			
		||||
Alice->>John: Hello John, how are you?
 | 
			
		||||
loop HealthCheck
 | 
			
		||||
loop Healthcheck
 | 
			
		||||
    John->>John: Fight against hypochondria
 | 
			
		||||
end
 | 
			
		||||
Note right of John: Rational thoughts!
 | 
			
		||||
@@ -132,7 +113,7 @@ Bob-->>John: Jolly good!
 | 
			
		||||
```mermaid
 | 
			
		||||
sequenceDiagram
 | 
			
		||||
Alice->>John: Hello John, how are you?
 | 
			
		||||
loop HealthCheck
 | 
			
		||||
loop Healthcheck
 | 
			
		||||
    John->>John: Fight against hypochondria
 | 
			
		||||
end
 | 
			
		||||
Note right of John: Rational thoughts!
 | 
			
		||||
@@ -141,7 +122,7 @@ John->>Bob: How about you?
 | 
			
		||||
Bob-->>John: Jolly good!
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Gantt chart [<a href="https://mermaid.js.org/syntax/gantt.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNp90cGOgyAQBuBXIZxtFbG29bbZ3fsmvXKZylhJEAyOTZrGd1_sto3xsHMBhu-HBO689hp5xS_giJQbsCbjHTv9jcp9-q63SKhZpb3DhMXSOIiE5ZkoNpnYZGXynh6U-4jBK7JnVfBYJo9QvgjtEya1cj8QwFq0TMz4lZqxTBg0hOF5m1jifI2Lf7Bc490CyxUu1rhc4GLGPOEdhg6Mjq92V44xxanFDhWv4lRjA6MlxZWbIh17DYTf2pAPvGrADphwGMmfbq7mFYURX-jLwCVA91bWg8YYunO69Y8vMgPFI2vvGnOZ-2Owsd0S9UOVpvP29mKoHc_b2nfpYHQLgdrrsUzLvDxALrHcS9hJqeuzOB6avBCN3mciBz5N0y_wxZ0J">live editor</a>]
 | 
			
		||||
### Gantt chart [<a href="https://mermaid-js.github.io/mermaid/#/gantt">docs</a> - <a href="https://mermaid.live/edit#pako:eNp90cGOgyAQBuBXIZxtFbG29bbZ3fsmvXKZylhJEAyOTZrGd1_sto3xsHMBhu-HBO689hp5xS_giJQbsCbjHTv9jcp9-q63SKhZpb3DhMXSOIiE5ZkoNpnYZGXynh6U-4jBK7JnVfBYJo9QvgjtEya1cj8QwFq0TMz4lZqxTBg0hOF5m1jifI2Lf7Bc490CyxUu1rhc4GLGPOEdhg6Mjq92V44xxanFDhWv4lRjA6MlxZWbIh17DYTf2pAPvGrADphwGMmfbq7mFYURX-jLwCVA91bWg8YYunO69Y8vMgPFI2vvGnOZ-2Owsd0S9UOVpvP29mKoHc_b2nfpYHQLgdrrsUzLvDxALrHcS9hJqeuzOB6avBCN3mciBz5N0y_wxZ0J">live editor</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
gantt
 | 
			
		||||
@@ -165,7 +146,7 @@ gantt
 | 
			
		||||
    Parallel 4   :         des6, after des4, 1d
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Class diagram [<a href="https://mermaid.js.org/syntax/classDiagram.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkTFPwzAQhf-K5QlQ2zQJJG1UBaGWDYmBgYEwXO1LYuTEwXYqlZL_jt02asXm--690zvfgTLFkWaUSTBmI6DS0BTt2lfzkKx-p1PytEO9f1FtdaQkI2ulZNGuVqK1qEtgmOfk7BitSzKdOhg59XuNGgk0RDxed-_IOr6uf8cZ6UhTZ8bvHqS5ub1mr9svZPbjk6DEBlu7AQuXyBkx4gcvDk9cUMJq0XT_YaW0kNK5j-ufAoRzcihaQvLcoN4Jv50vvVxw_xrnD3RCG9QNCO4-8OgpqK1dpoJm7smxhF7agp6kfcfB4jMXVmmalW4tnFDorXrbt4xmVvc4is53GKFUwNF5DtTuO3-sShjrJjLVlqLyvNfS4drazmRB4NuzSti6386YagIjeA3a1rtlEiRRsoAoxiSN4SGOOduGy0UZ3YclT-dhBHQYhj8dc6_I">live editor</a>]
 | 
			
		||||
### Class diagram [<a href="https://mermaid-js.github.io/mermaid/#/classDiagram">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkTFPwzAQhf-K5QlQ2zQJJG1UBaGWDYmBgYEwXO1LYuTEwXYqlZL_jt02asXm--690zvfgTLFkWaUSTBmI6DS0BTt2lfzkKx-p1PytEO9f1FtdaQkI2ulZNGuVqK1qEtgmOfk7BitSzKdOhg59XuNGgk0RDxed-_IOr6uf8cZ6UhTZ8bvHqS5ub1mr9svZPbjk6DEBlu7AQuXyBkx4gcvDk9cUMJq0XT_YaW0kNK5j-ufAoRzcihaQvLcoN4Jv50vvVxw_xrnD3RCG9QNCO4-8OgpqK1dpoJm7smxhF7agp6kfcfB4jMXVmmalW4tnFDorXrbt4xmVvc4is53GKFUwNF5DtTuO3-sShjrJjLVlqLyvNfS4drazmRB4NuzSti6386YagIjeA3a1rtlEiRRsoAoxiSN4SGOOduGy0UZ3YclT-dhBHQYhj8dc6_I">live editor</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
classDiagram
 | 
			
		||||
@@ -184,7 +165,13 @@ class Class10 {
 | 
			
		||||
  int id
 | 
			
		||||
  size()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace Namespace01 {
 | 
			
		||||
  class Class11
 | 
			
		||||
  class Class12 {
 | 
			
		||||
    int id
 | 
			
		||||
    size()
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```mermaid
 | 
			
		||||
@@ -204,10 +191,16 @@ class Class10 {
 | 
			
		||||
  int id
 | 
			
		||||
  size()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace Namespace01 {
 | 
			
		||||
  class Class11
 | 
			
		||||
  class Class12 {
 | 
			
		||||
    int id
 | 
			
		||||
    size()
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### State diagram [<a href="https://mermaid.js.org/syntax/stateDiagram.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkEFvgzAMhf8K8nEqpYSNthx22Xbcqcexg0sCiZQQlDhIFeK_L8A6TfXp6fOz9ewJGssFVOAJSbwr7ByadGR1n8T6evpO0vQ1uZDSekOrXGFsPqJPO6q-2-imH8f_0TeHXm50lfelsAMjnEHFY6xpMdRAUhhRQxUlFy0GTTXU_RytYeAx-AdXZB1ULWovdoCB7OXWN1CRC-Ju-r3uz6UtchGHJqDbsPygU57iysb2reoWHpyOWBINvsqypb3vFMlw3TfWZF5xiY7keC6zkpUnZIUojwW-FAVvrvn51LLnvOXHQ84Q5nn-AVtLcwk">live editor</a>]
 | 
			
		||||
### State diagram [<a href="https://mermaid-js.github.io/mermaid/#/stateDiagram">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkEFvgzAMhf8K8nEqpYSNthx22Xbcqcexg0sCiZQQlDhIFeK_L8A6TfXp6fOz9ewJGssFVOAJSbwr7ByadGR1n8T6evpO0vQ1uZDSekOrXGFsPqJPO6q-2-imH8f_0TeHXm50lfelsAMjnEHFY6xpMdRAUhhRQxUlFy0GTTXU_RytYeAx-AdXZB1ULWovdoCB7OXWN1CRC-Ju-r3uz6UtchGHJqDbsPygU57iysb2reoWHpyOWBINvsqypb3vFMlw3TfWZF5xiY7keC6zkpUnZIUojwW-FAVvrvn51LLnvOXHQ84Q5nn-AVtLcwk">live editor</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
stateDiagram-v2
 | 
			
		||||
@@ -229,7 +222,7 @@ Moving --> Crash
 | 
			
		||||
Crash --> [*]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Pie chart [<a href="https://mermaid.js.org/syntax/pie.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNo9jsFugzAMhl8F-VzBgEEh13Uv0F1zcYkTIpEEBadShXj3BU3dzf_n77e8wxQUgYDVkvQSbsFsEgpRtEN_5i_kvzx05XiC-xvUHVzAUXRoVe7v0heFBJ7JkQSRR0Ua08ISpD-ymlaFTN_KcoggNC4bXQATh5-Xn0BwTPSWbhZNRPdvLQEV5dIO_FrPZ43dOJ-cgtfWnDzFJeOZed1EVZ3r0lie06Ocgqs2q2aMPD_HvuqbfsCmpf7aYte2anrU46Cbz1qr60fdIBzH8QvW9lkl">live editor</a>]
 | 
			
		||||
### Pie chart [<a href="https://mermaid-js.github.io/mermaid/#/pie">docs</a> - <a href="https://mermaid.live/edit#pako:eNo9jsFugzAMhl8F-VzBgEEh13Uv0F1zcYkTIpEEBadShXj3BU3dzf_n77e8wxQUgYDVkvQSbsFsEgpRtEN_5i_kvzx05XiC-xvUHVzAUXRoVe7v0heFBJ7JkQSRR0Ua08ISpD-ymlaFTN_KcoggNC4bXQATh5-Xn0BwTPSWbhZNRPdvLQEV5dIO_FrPZ43dOJ-cgtfWnDzFJeOZed1EVZ3r0lie06Ocgqs2q2aMPD_HvuqbfsCmpf7aYte2anrU46Cbz1qr60fdIBzH8QvW9lkl">live editor</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
pie
 | 
			
		||||
@@ -247,7 +240,7 @@ pie
 | 
			
		||||
 | 
			
		||||
### Git graph [experimental - <a href="https://mermaid.live/edit#pako:eNqNkMFugzAMhl8F-VyVAR1tOW_aA-zKxSSGRCMJCk6lCvHuNZPKZdM0n-zf3_8r8QIqaIIGMqnB8kfEybQ--y4VnLP8-9RF9Mpkmm40hmlnDKmvkPiH_kfS7nFo_VN0FAf6XwocQGgxa_nGsm1bYEOOWmik1dRjGrmF1q-Cpkkj07u2HCI0PY4zHQATh8-7V9BwTPSE3iwOEd1OjQE1iWkBvk_bzQY7s0Sq4Hs7bHqKo8iGeZqbPN_WR7mpSd1RHpvPVhuMbG7XOq_L-oJlRfW5wteq0qorrpe-PBW9Pr8UJcK6rg-BLYPQ">live editor</a>]
 | 
			
		||||
 | 
			
		||||
### Bar chart (using gantt chart) [<a href="https://mermaid.js.org/syntax/gantt.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNptkU1vhCAQhv8KIenNugiI4rkf6bmXpvEyFVxJFDYyNt1u9r8X63Z7WQ9m5pknLzieaBeMpQ3dg0dsPUkPOhwteXZIXmJcbCT3xMAxkuh8Z8kIEclyMIB209fqKcwTICFvG4IvFy_oLrZ-g9F26ILfQgvNFN94VaRXQ1iWqpumZBcu1J8p1E1TXDx59eQNr5LyEqjJn6hv5QnGNlxevZJmdLLpy5xJSzut45biYCfb0iaVxvawjNjS1p-TCguG16PvaIPzYjO67e3BwX6GiTY9jPFKH43DMF_hGMDY1J4oHg-_f8hFTJFd8L3br3yZx4QHxENsdrt1nO8dDstH3oVpF50ZYMbhU6ud4qoGLqyqBJRCmO6j0HXPZdGbihUc6Pmc0QP49xD-b5X69ZQv2gjO81IwzWqhC1lKrjJ6pA3nVS7SMiVjrKirWlYp5fs3osgrWeo00lorLWvOzz8JVbXm">live editor</a>]
 | 
			
		||||
### Bar chart (using gantt chart) [<a href="https://mermaid-js.github.io/mermaid/#/gantt">docs</a> - <a href="https://mermaid.live/edit#pako:eNptkU1vhCAQhv8KIenNugiI4rkf6bmXpvEyFVxJFDYyNt1u9r8X63Z7WQ9m5pknLzieaBeMpQ3dg0dsPUkPOhwteXZIXmJcbCT3xMAxkuh8Z8kIEclyMIB209fqKcwTICFvG4IvFy_oLrZ-g9F26ILfQgvNFN94VaRXQ1iWqpumZBcu1J8p1E1TXDx59eQNr5LyEqjJn6hv5QnGNlxevZJmdLLpy5xJSzut45biYCfb0iaVxvawjNjS1p-TCguG16PvaIPzYjO67e3BwX6GiTY9jPFKH43DMF_hGMDY1J4oHg-_f8hFTJFd8L3br3yZx4QHxENsdrt1nO8dDstH3oVpF50ZYMbhU6ud4qoGLqyqBJRCmO6j0HXPZdGbihUc6Pmc0QP49xD-b5X69ZQv2gjO81IwzWqhC1lKrjJ6pA3nVS7SMiVjrKirWlYp5fs3osgrWeo00lorLWvOzz8JVbXm">live editor</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
gantt
 | 
			
		||||
@@ -285,7 +278,7 @@ gantt
 | 
			
		||||
    5    : 0, 5
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### User Journey diagram [<a href="https://mermaid.js.org/syntax/userJourney.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNplkMFuwjAQRH9l5TMiTVIC-FqqnjhxzWWJN4khsSN7XRSh_HsdKBVt97R6Mzsj-yoqq0hIAXCywRkaSwNxWHNHsB_hYt1ZmwYUfiueKtbWwIcFtjf5zgH2eCZgQgkrCXt64GgMg2fUzkvIn5Xd_V5COtMFvCH_62ht_5yk7MU8sn61HDTfxD8VYiF6cj1qFd94nWkpuKWYKWRcFdUYOi5FaaZoDYNCpnel2Toha-w8LQQGtofRVEKyC_Qw7TQ2DvsfV2dRUTy6Ch6H-UMb7TlGVtbUupl5cF3ELfPgZZLM8rLR3IbjsrJ94rVq0XH7uS2SIis2mOVUrHNc5bmqjul2U2evaa3WL2mGYpqmL2BGiho">live editor</a>]
 | 
			
		||||
### User Journey diagram [<a href="https://mermaid-js.github.io/mermaid/#/user-journey">docs</a> - <a href="https://mermaid.live/edit#pako:eNplkMFuwjAQRH9l5TMiTVIC-FqqnjhxzWWJN4khsSN7XRSh_HsdKBVt97R6Mzsj-yoqq0hIAXCywRkaSwNxWHNHsB_hYt1ZmwYUfiueKtbWwIcFtjf5zgH2eCZgQgkrCXt64GgMg2fUzkvIn5Xd_V5COtMFvCH_62ht_5yk7MU8sn61HDTfxD8VYiF6cj1qFd94nWkpuKWYKWRcFdUYOi5FaaZoDYNCpnel2Toha-w8LQQGtofRVEKyC_Qw7TQ2DvsfV2dRUTy6Ch6H-UMb7TlGVtbUupl5cF3ELfPgZZLM8rLR3IbjsrJ94rVq0XH7uS2SIis2mOVUrHNc5bmqjul2U2evaa3WL2mGYpqmL2BGiho">live editor</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
  journey
 | 
			
		||||
@@ -311,7 +304,7 @@ gantt
 | 
			
		||||
      Sit down: 3: Me
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### C4 diagram [<a href="https://mermaid.js.org/syntax/c4.html">docs</a>]
 | 
			
		||||
### C4 diagram [<a href="https://mermaid-js.github.io/mermaid/#/c4c">docs</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
C4Context
 | 
			
		||||
@@ -405,7 +398,7 @@ The above command generates files into the `dist` folder and publishes them to <
 | 
			
		||||
 | 
			
		||||
Mermaid is a growing community and is always accepting new contributors. There's a lot of different ways to help out and we're always looking for extra hands! Look at [this issue](https://github.com/mermaid-js/mermaid/issues/866) if you want to know where to start helping out.
 | 
			
		||||
 | 
			
		||||
Detailed information about how to contribute can be found in the [contribution guide](https://mermaid.js.org/community/contributing.html)
 | 
			
		||||
Detailed information about how to contribute can be found in the [contribution guide](CONTRIBUTING.md)
 | 
			
		||||
 | 
			
		||||
## Security and safe diagrams
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -12,19 +12,15 @@ Mermaid
 | 
			
		||||
<p>
 | 
			
		||||
 | 
			
		||||
<p align="center">
 | 
			
		||||
<a href="https://mermaid.live/"><b>实时编辑器!</b></a>
 | 
			
		||||
<a href="https://mermaid.live/"><b>Live Editor!</b></a>
 | 
			
		||||
</p>
 | 
			
		||||
<p align="center">
 | 
			
		||||
 <a href="https://mermaid.js.org">📖 文档</a> | <a href="https://mermaid.js.org/intro/">🚀 入门</a> | <a href="https://www.jsdelivr.com/package/npm/mermaid">🌐 CDN</a> | <a href="https://discord.gg/AgrbSrBer3" title="Discord invite">🙌 加入我们</a>
 | 
			
		||||
 <a href="https://mermaid.js.org">📖 文档</a> | <a href="https://mermaid.js.org/intro/">🚀 入门</a> | <a href="https://www.jsdelivr.com/package/npm/mermaid">🌐 CDN</a> | <a href="https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE" title="Slack invite">🙌 加入我们</a>
 | 
			
		||||
</p>
 | 
			
		||||
<p align="center">
 | 
			
		||||
<a href="./README.md">English</a>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<p align="center">
 | 
			
		||||
尝试未来版本的实时编辑器预览: <a href="https://develop.git.mermaid.live/" title="尝试来自develop分支的mermaid版本。">Develop</a> | <a href="https://next.git.mermaid.live/" title="尝试来自next分支的mermaid版本。">Next</a>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<br>
 | 
			
		||||
<br>
 | 
			
		||||
 | 
			
		||||
@@ -34,8 +30,8 @@ Mermaid
 | 
			
		||||
[](https://app.codecov.io/github/mermaid-js/mermaid/tree/develop)
 | 
			
		||||
[](https://www.jsdelivr.com/package/npm/mermaid)
 | 
			
		||||
[](https://www.npmjs.com/package/mermaid)
 | 
			
		||||
[](https://discord.gg/AgrbSrBer3)
 | 
			
		||||
[](https://twitter.com/mermaidjs_)
 | 
			
		||||
[](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE)
 | 
			
		||||
[](https://twitter.com/mermaidjs_)
 | 
			
		||||
 | 
			
		||||
<img src="./img/header.png" alt="" />
 | 
			
		||||
 | 
			
		||||
@@ -43,7 +39,7 @@ Mermaid
 | 
			
		||||
 | 
			
		||||
**感谢所有参与进来提交 PR,解答疑问的人们! 🙏**
 | 
			
		||||
 | 
			
		||||
<a href="https://mermaid.js.org/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
 | 
			
		||||
<a href="https://mermaid-js.github.io/mermaid/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
 | 
			
		||||
 | 
			
		||||
## 关于 Mermaid
 | 
			
		||||
 | 
			
		||||
@@ -57,20 +53,20 @@ Mermaid 是一个基于 Javascript 的图表绘制工具,通过解析类 Markd
 | 
			
		||||
Mermaid 通过允许用户创建便于修改的图表来解决这一难题,它也可以作为生产脚本(或其他代码)的一部分。<br/>
 | 
			
		||||
<br/>
 | 
			
		||||
Mermaid 甚至能让非程序员也能通过 [Mermaid Live Editor](https://mermaid.live/) 轻松创建详细的图表。<br/>
 | 
			
		||||
你可以访问 [教程](https://mermaid.js.org/ecosystem/tutorials.html) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](https://mermaid.js.org/ecosystem/integrations-community.html) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。
 | 
			
		||||
你可以访问 [教程](./docs/config/Tutorials.md) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](./docs/ecosystem/integrations.md) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。
 | 
			
		||||
 | 
			
		||||
如果想要查看关于 Mermaid 更详细的介绍及基础使用方式,可以查看 [入门指引](https://mermaid.js.org/intro/getting-started.html), [用法](https://mermaid.js.org/config/usage.html) 和 [教程](https://mermaid.js.org/ecosystem/tutorials.html).
 | 
			
		||||
如果想要查看关于 Mermaid 更详细的介绍及基础使用方式,可以查看 [入门指引](./docs/community/n00b-overview.md), [用法](./docs/config/usage.md) 和 [教程](./docs/config/Tutorials.md).
 | 
			
		||||
 | 
			
		||||
<!-- </Main description> -->
 | 
			
		||||
 | 
			
		||||
## 示例
 | 
			
		||||
 | 
			
		||||
**下面是一些可以使用 Mermaid 创建的图表示例。点击 [语法](https://mermaid.js.org/intro/syntax-reference.html) 查看详情。**
 | 
			
		||||
**下面是一些可以使用 Mermaid 创建的图表示例。点击 [语法](https://mermaid-js.github.io/mermaid/#/n00b-syntaxReference) 查看详情。**
 | 
			
		||||
 | 
			
		||||
<table>
 | 
			
		||||
<!-- <Flowchart> -->
 | 
			
		||||
 | 
			
		||||
### 流程图 [<a href="https://mermaid.js.org/syntax/flowchart.html">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiZ3JhcGggVERcbiAgICBBW0hhcmRdIC0tPnxUZXh0fCBCKFJvdW5kKVxuICAgIEIgLS0-IEN7RGVjaXNpb259XG4gICAgQyAtLT58T25lfCBEW1Jlc3VsdCAxXVxuICAgIEMgLS0-fFR3b3wgRVtSZXN1bHQgMl0iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ">live editor</a>]
 | 
			
		||||
### 流程图 [<a href="https://mermaid-js.github.io/mermaid/#/flowchart">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiZ3JhcGggVERcbiAgICBBW0hhcmRdIC0tPnxUZXh0fCBCKFJvdW5kKVxuICAgIEIgLS0-IEN7RGVjaXNpb259XG4gICAgQyAtLT58T25lfCBEW1Jlc3VsdCAxXVxuICAgIEMgLS0-fFR3b3wgRVtSZXN1bHQgMl0iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ">live editor</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
flowchart LR
 | 
			
		||||
@@ -88,12 +84,12 @@ C -->|One| D[Result 1]
 | 
			
		||||
C -->|Two| E[Result 2]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 时序图 [<a href="https://mermaid.js.org/syntax/sequenceDiagram.html">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG5BbGljZS0-PkpvaG46IEhlbGxvIEpvaG4sIGhvdyBhcmUgeW91P1xubG9vcCBIZWFsdGhjaGVja1xuICAgIEpvaG4tPj5Kb2huOiBGaWdodCBhZ2FpbnN0IGh5cG9jaG9uZHJpYVxuZW5kXG5Ob3RlIHJpZ2h0IG9mIEpvaG46IFJhdGlvbmFsIHRob3VnaHRzIVxuSm9obi0tPj5BbGljZTogR3JlYXQhXG5Kb2huLT4-Qm9iOiBIb3cgYWJvdXQgeW91P1xuQm9iLS0-PkpvaG46IEpvbGx5IGdvb2QhIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0">live editor</a>]
 | 
			
		||||
### 时序图 [<a href="https://mermaid-js.github.io/mermaid/#/sequenceDiagram">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG5BbGljZS0-PkpvaG46IEhlbGxvIEpvaG4sIGhvdyBhcmUgeW91P1xubG9vcCBIZWFsdGhjaGVja1xuICAgIEpvaG4tPj5Kb2huOiBGaWdodCBhZ2FpbnN0IGh5cG9jaG9uZHJpYVxuZW5kXG5Ob3RlIHJpZ2h0IG9mIEpvaG46IFJhdGlvbmFsIHRob3VnaHRzIVxuSm9obi0tPj5BbGljZTogR3JlYXQhXG5Kb2huLT4-Qm9iOiBIb3cgYWJvdXQgeW91P1xuQm9iLS0-PkpvaG46IEpvbGx5IGdvb2QhIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0">live editor</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
sequenceDiagram
 | 
			
		||||
Alice->>John: Hello John, how are you?
 | 
			
		||||
loop HealthCheck
 | 
			
		||||
loop Healthcheck
 | 
			
		||||
    John->>John: Fight against hypochondria
 | 
			
		||||
end
 | 
			
		||||
Note right of John: Rational thoughts!
 | 
			
		||||
@@ -105,7 +101,7 @@ Bob-->>John: Jolly good!
 | 
			
		||||
```mermaid
 | 
			
		||||
sequenceDiagram
 | 
			
		||||
Alice->>John: Hello John, how are you?
 | 
			
		||||
loop HealthCheck
 | 
			
		||||
loop Healthcheck
 | 
			
		||||
    John->>John: Fight against hypochondria
 | 
			
		||||
end
 | 
			
		||||
Note right of John: Rational thoughts!
 | 
			
		||||
@@ -114,7 +110,7 @@ John->>Bob: How about you?
 | 
			
		||||
Bob-->>John: Jolly good!
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 甘特图 [<a href="https://mermaid.js.org/syntax/gantt.html">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiZ2FudHRcbnNlY3Rpb24gU2VjdGlvblxuQ29tcGxldGVkIDpkb25lLCAgICBkZXMxLCAyMDE0LTAxLTA2LDIwMTQtMDEtMDhcbkFjdGl2ZSAgICAgICAgOmFjdGl2ZSwgIGRlczIsIDIwMTQtMDEtMDcsIDNkXG5QYXJhbGxlbCAxICAgOiAgICAgICAgIGRlczMsIGFmdGVyIGRlczEsIDFkXG5QYXJhbGxlbCAyICAgOiAgICAgICAgIGRlczQsIGFmdGVyIGRlczEsIDFkXG5QYXJhbGxlbCAzICAgOiAgICAgICAgIGRlczUsIGFmdGVyIGRlczMsIDFkXG5QYXJhbGxlbCA0ICAgOiAgICAgICAgIGRlczYsIGFmdGVyIGRlczQsIDFkIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0">live editor</a>]
 | 
			
		||||
### 甘特图 [<a href="https://mermaid-js.github.io/mermaid/#/gantt">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiZ2FudHRcbnNlY3Rpb24gU2VjdGlvblxuQ29tcGxldGVkIDpkb25lLCAgICBkZXMxLCAyMDE0LTAxLTA2LDIwMTQtMDEtMDhcbkFjdGl2ZSAgICAgICAgOmFjdGl2ZSwgIGRlczIsIDIwMTQtMDEtMDcsIDNkXG5QYXJhbGxlbCAxICAgOiAgICAgICAgIGRlczMsIGFmdGVyIGRlczEsIDFkXG5QYXJhbGxlbCAyICAgOiAgICAgICAgIGRlczQsIGFmdGVyIGRlczEsIDFkXG5QYXJhbGxlbCAzICAgOiAgICAgICAgIGRlczUsIGFmdGVyIGRlczMsIDFkXG5QYXJhbGxlbCA0ICAgOiAgICAgICAgIGRlczYsIGFmdGVyIGRlczQsIDFkIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0">live editor</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
gantt
 | 
			
		||||
@@ -138,7 +134,7 @@ gantt
 | 
			
		||||
    Parallel 4   :         des6, after des4, 1d
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 类图 [<a href="https://mermaid.js.org/syntax/classDiagram.html">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiY2xhc3NEaWFncmFtXG5DbGFzczAxIDx8LS0gQXZlcnlMb25nQ2xhc3MgOiBDb29sXG48PGludGVyZmFjZT4-IENsYXNzMDFcbkNsYXNzMDkgLS0-IEMyIDogV2hlcmUgYW0gaT9cbkNsYXNzMDkgLS0qIEMzXG5DbGFzczA5IC0tfD4gQ2xhc3MwN1xuQ2xhc3MwNyA6IGVxdWFscygpXG5DbGFzczA3IDogT2JqZWN0W10gZWxlbWVudERhdGFcbkNsYXNzMDEgOiBzaXplKClcbkNsYXNzMDEgOiBpbnQgY2hpbXBcbkNsYXNzMDEgOiBpbnQgZ29yaWxsYVxuY2xhc3MgQ2xhc3MxMCB7XG4gID4-c2VydmljZT4-XG4gIGludCBpZFxuICBzaXplKClcbn0iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ">live editor</a>]
 | 
			
		||||
### 类图 [<a href="https://mermaid-js.github.io/mermaid/#/classDiagram">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiY2xhc3NEaWFncmFtXG5DbGFzczAxIDx8LS0gQXZlcnlMb25nQ2xhc3MgOiBDb29sXG48PGludGVyZmFjZT4-IENsYXNzMDFcbkNsYXNzMDkgLS0-IEMyIDogV2hlcmUgYW0gaT9cbkNsYXNzMDkgLS0qIEMzXG5DbGFzczA5IC0tfD4gQ2xhc3MwN1xuQ2xhc3MwNyA6IGVxdWFscygpXG5DbGFzczA3IDogT2JqZWN0W10gZWxlbWVudERhdGFcbkNsYXNzMDEgOiBzaXplKClcbkNsYXNzMDEgOiBpbnQgY2hpbXBcbkNsYXNzMDEgOiBpbnQgZ29yaWxsYVxuY2xhc3MgQ2xhc3MxMCB7XG4gID4-c2VydmljZT4-XG4gIGludCBpZFxuICBzaXplKClcbn0iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ">live editor</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
classDiagram
 | 
			
		||||
@@ -178,7 +174,7 @@ class Class10 {
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 状态图 [<a href="https://mermaid.js.org/syntax/stateDiagram.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkLsOwjAMRX-l8ojahTEDCzB26kgYrMYtkfJAqVMJVf13QiIKqqfr44d8vUDvFYGAiZHponEMaJv5KF2V4na4V01zqjrWxhSUZYapuEetn7UbCy16P_5HzwGnR6FZfpdCDZaCRa3SWcunQQI_yJIEkaSiAaNhCdKtqRUj--7lehAcItUQn-pnBMSAZtroVWn2YYOU07b4z29Y37gJVYk">live editor</a>]
 | 
			
		||||
### 状态图 [[<a href="https://mermaid-js.github.io/mermaid/#/stateDiagram">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkLsOwjAMRX-l8ojahTEDCzB26kgYrMYtkfJAqVMJVf13QiIKqqfr44d8vUDvFYGAiZHponEMaJv5KF2V4na4V01zqjrWxhSUZYapuEetn7UbCy16P_5HzwGnR6FZfpdCDZaCRa3SWcunQQI_yJIEkaSiAaNhCdKtqRUj--7lehAcItUQn-pnBMSAZtroVWn2YYOU07b4z29Y37gJVYk">live editor</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
stateDiagram-v2
 | 
			
		||||
@@ -200,7 +196,7 @@ Moving --> Crash
 | 
			
		||||
Crash --> [*]
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 饼图 [<a href="https://mermaid.js.org/syntax/pie.html">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoicGllXG5cIkRvZ3NcIiA6IDQyLjk2XG5cIkNhdHNcIiA6IDUwLjA1XG5cIlJhdHNcIiA6IDEwLjAxIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0">live editor</a>]
 | 
			
		||||
### 饼图 [<a href="https://mermaid-js.github.io/mermaid/#/pie">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoicGllXG5cIkRvZ3NcIiA6IDQyLjk2XG5cIkNhdHNcIiA6IDUwLjA1XG5cIlJhdHNcIiA6IDEwLjAxIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0">live editor</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
pie
 | 
			
		||||
@@ -218,7 +214,7 @@ pie
 | 
			
		||||
 | 
			
		||||
### Git 图 [实验特性 - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiZ2l0R3JhcGg6XG5vcHRpb25zXG57XG4gICAgXCJub2RlU3BhY2luZ1wiOiAxNTAsXG4gICAgXCJub2RlUmFkaXVzXCI6IDEwXG59XG5lbmRcbmNvbW1pdFxuYnJhbmNoIG5ld2JyYW5jaFxuY2hlY2tvdXQgbmV3YnJhbmNoXG5jb21taXRcbmNvbW1pdFxuY2hlY2tvdXQgbWFzdGVyXG5jb21taXRcbmNvbW1pdFxubWVyZ2UgbmV3YnJhbmNoXG4iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ">live editor</a>]
 | 
			
		||||
 | 
			
		||||
### 用户体验旅程图 [<a href="https://mermaid.js.org/syntax/userJourney.html">文档</a> - <a href="https://mermaid.live/edit#pako:eNpljzEPgkAMhf9K05nFGJdbJXFiYmVpuKIncDVHL4QQ_ruHaILaqXnf63vpjLVYRoMAd4nB81R5SKNOO4ZiglFC6_wVLL3JwLU68XARUHnhTQcoqGVQJgMnAwV_5GSMj0HJhcHAcU_y7d7AYVUzOJP-ddyk3ydZGf0n66uldPqCPxWYYc-hJ2fTj_OqVqg3Tplo0mq5odhphZVfkpWiSjn5Go2GyBnGhyXl3NE1UI-moW7g5QkSoF5m">live editor</a>]
 | 
			
		||||
### 用户体验旅程图 [<a href="https://mermaid-js.github.io/mermaid/#/user-journey">文档</a> - <a href="https://mermaid.live/edit#pako:eNpljzEPgkAMhf9K05nFGJdbJXFiYmVpuKIncDVHL4QQ_ruHaILaqXnf63vpjLVYRoMAd4nB81R5SKNOO4ZiglFC6_wVLL3JwLU68XARUHnhTQcoqGVQJgMnAwV_5GSMj0HJhcHAcU_y7d7AYVUzOJP-ddyk3ydZGf0n66uldPqCPxWYYc-hJ2fTj_OqVqg3Tplo0mq5odhphZVfkpWiSjn5Go2GyBnGhyXl3NE1UI-moW7g5QkSoF5m">live editor</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
  journey
 | 
			
		||||
@@ -244,7 +240,7 @@ pie
 | 
			
		||||
      Sit down: 3: Me
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### C4 图 [<a href="https://mermaid.js.org/syntax/c4.html">文档</a>]
 | 
			
		||||
### C4 图 [<a href="https://mermaid-js.github.io/mermaid/#/c4c">文档</a>]
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
C4Context
 | 
			
		||||
@@ -338,7 +334,7 @@ npm publish
 | 
			
		||||
 | 
			
		||||
Mermaid 是一个不断发展中的社区,并且还在接收新的贡献者。有很多不同的方式可以参与进来,而且我们还在寻找额外的帮助。如果你想知道如何开始贡献,请查看 [这个 issue](https://github.com/mermaid-js/mermaid/issues/866)。
 | 
			
		||||
 | 
			
		||||
关于如何贡献的详细信息可以在 [贡献指南](https://mermaid.js.org/community/contributing.html) 中找到。
 | 
			
		||||
关于如何贡献的详细信息可以在 [贡献指南](CONTRIBUTING.md) 中找到。
 | 
			
		||||
 | 
			
		||||
## 安全
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								__mocks__/c4Renderer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								__mocks__/c4Renderer.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Mocked C4Context diagram renderer
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { vi } from 'vitest';
 | 
			
		||||
 | 
			
		||||
export const drawPersonOrSystemArray = vi.fn();
 | 
			
		||||
export const drawBoundary = vi.fn();
 | 
			
		||||
 | 
			
		||||
export const setConf = vi.fn();
 | 
			
		||||
 | 
			
		||||
export const draw = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return '';
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  drawPersonOrSystemArray,
 | 
			
		||||
  drawBoundary,
 | 
			
		||||
  setConf,
 | 
			
		||||
  draw,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										16
									
								
								__mocks__/classRenderer-v2.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								__mocks__/classRenderer-v2.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Mocked class diagram v2 renderer
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { vi } from 'vitest';
 | 
			
		||||
 | 
			
		||||
export const setConf = vi.fn();
 | 
			
		||||
 | 
			
		||||
export const draw = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return '';
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  setConf,
 | 
			
		||||
  draw,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										13
									
								
								__mocks__/classRenderer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								__mocks__/classRenderer.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Mocked class diagram renderer
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { vi } from 'vitest';
 | 
			
		||||
 | 
			
		||||
export const draw = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return '';
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  draw,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										1
									
								
								__mocks__/dagre-d3.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								__mocks__/dagre-d3.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
// DO NOT delete this file. It is used by vitest to mock the dagre-d3 module.
 | 
			
		||||
							
								
								
									
										3
									
								
								__mocks__/entity-decode/browser.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								__mocks__/entity-decode/browser.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
module.exports = function (txt: string) {
 | 
			
		||||
  return txt;
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										16
									
								
								__mocks__/erRenderer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								__mocks__/erRenderer.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Mocked er diagram renderer
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { vi } from 'vitest';
 | 
			
		||||
 | 
			
		||||
export const setConf = vi.fn();
 | 
			
		||||
 | 
			
		||||
export const draw = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return '';
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  setConf,
 | 
			
		||||
  draw,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										24
									
								
								__mocks__/flowRenderer-v2.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								__mocks__/flowRenderer-v2.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Mocked flow (flowchart) diagram v2 renderer
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { vi } from 'vitest';
 | 
			
		||||
 | 
			
		||||
export const setConf = vi.fn();
 | 
			
		||||
export const addVertices = vi.fn();
 | 
			
		||||
export const addEdges = vi.fn();
 | 
			
		||||
export const getClasses = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return {};
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export const draw = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return '';
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  setConf,
 | 
			
		||||
  addVertices,
 | 
			
		||||
  addEdges,
 | 
			
		||||
  getClasses,
 | 
			
		||||
  draw,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										16
									
								
								__mocks__/ganttRenderer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								__mocks__/ganttRenderer.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Mocked gantt diagram renderer
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { vi } from 'vitest';
 | 
			
		||||
 | 
			
		||||
export const setConf = vi.fn();
 | 
			
		||||
 | 
			
		||||
export const draw = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return '';
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  setConf,
 | 
			
		||||
  draw,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										13
									
								
								__mocks__/gitGraphRenderer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								__mocks__/gitGraphRenderer.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Mocked git (graph) diagram renderer
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { vi } from 'vitest';
 | 
			
		||||
 | 
			
		||||
export const draw = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return '';
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  draw,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										15
									
								
								__mocks__/journeyRenderer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								__mocks__/journeyRenderer.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Mocked pie (picChart) diagram renderer
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { vi } from 'vitest';
 | 
			
		||||
export const setConf = vi.fn();
 | 
			
		||||
 | 
			
		||||
export const draw = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return '';
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  setConf,
 | 
			
		||||
  draw,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										13
									
								
								__mocks__/pieRenderer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								__mocks__/pieRenderer.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Mocked pie (picChart) diagram renderer
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { vi } from 'vitest';
 | 
			
		||||
 | 
			
		||||
export const draw = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return '';
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  draw,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										13
									
								
								__mocks__/requirementRenderer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								__mocks__/requirementRenderer.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Mocked requirement diagram renderer
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { vi } from 'vitest';
 | 
			
		||||
 | 
			
		||||
export const draw = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return '';
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  draw,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										13
									
								
								__mocks__/sankeyRenderer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								__mocks__/sankeyRenderer.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Mocked Sankey diagram renderer
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { vi } from 'vitest';
 | 
			
		||||
 | 
			
		||||
export const draw = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return '';
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  draw,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										23
									
								
								__mocks__/sequenceRenderer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								__mocks__/sequenceRenderer.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Mocked sequence diagram renderer
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { vi } from 'vitest';
 | 
			
		||||
 | 
			
		||||
export const bounds = vi.fn();
 | 
			
		||||
export const drawActors = vi.fn();
 | 
			
		||||
export const drawActorsPopup = vi.fn();
 | 
			
		||||
 | 
			
		||||
export const setConf = vi.fn();
 | 
			
		||||
 | 
			
		||||
export const draw = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return '';
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  bounds,
 | 
			
		||||
  drawActors,
 | 
			
		||||
  drawActorsPopup,
 | 
			
		||||
  setConf,
 | 
			
		||||
  draw,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										22
									
								
								__mocks__/stateRenderer-v2.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								__mocks__/stateRenderer-v2.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Mocked state diagram v2 renderer
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import { vi } from 'vitest';
 | 
			
		||||
 | 
			
		||||
export const setConf = vi.fn();
 | 
			
		||||
export const getClasses = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return {};
 | 
			
		||||
});
 | 
			
		||||
export const stateDomId = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return 'mocked-stateDiagram-stateDomId';
 | 
			
		||||
});
 | 
			
		||||
export const draw = vi.fn().mockImplementation(() => {
 | 
			
		||||
  return '';
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  setConf,
 | 
			
		||||
  getClasses,
 | 
			
		||||
  draw,
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										19
									
								
								applitools.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								applitools.config.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
 | 
			
		||||
const { defineConfig } = require('cypress');
 | 
			
		||||
 | 
			
		||||
module.exports = defineConfig({
 | 
			
		||||
  testConcurrency: 1,
 | 
			
		||||
  browser: [
 | 
			
		||||
    // Add browsers with different viewports
 | 
			
		||||
    //   { width: 800, height: 600, name: 'chrome' },
 | 
			
		||||
    //   { width: 700, height: 500, name: 'firefox' },
 | 
			
		||||
    //   { width: 1600, height: 1200, name: 'ie11' },
 | 
			
		||||
    //   { width: 1024, height: 768, name: 'edgechromium' },
 | 
			
		||||
    //   { width: 800, height: 600, name: 'safari' },
 | 
			
		||||
    //   // Add mobile emulation devices in Portrait mode
 | 
			
		||||
    //   { deviceName: 'iPhone X', screenOrientation: 'portrait' },
 | 
			
		||||
    //   { deviceName: 'Pixel 2', screenOrientation: 'portrait' },
 | 
			
		||||
  ],
 | 
			
		||||
  // set batch name to the configuration
 | 
			
		||||
  // batchName: `Mermaid ${process.env.APPLI_BRANCH ?? "'no APPLI_BRANCH set'"}`,
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										198
									
								
								cSpell.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								cSpell.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,198 @@
 | 
			
		||||
{
 | 
			
		||||
  "version": "0.2",
 | 
			
		||||
  "language": "en",
 | 
			
		||||
  "words": [
 | 
			
		||||
    "acyclicer",
 | 
			
		||||
    "adamiecki",
 | 
			
		||||
    "alois",
 | 
			
		||||
    "aloisklink",
 | 
			
		||||
    "antiscript",
 | 
			
		||||
    "antlr",
 | 
			
		||||
    "appli",
 | 
			
		||||
    "applitools",
 | 
			
		||||
    "asciidoctor",
 | 
			
		||||
    "ashish",
 | 
			
		||||
    "ashishjain",
 | 
			
		||||
    "astah",
 | 
			
		||||
    "bbox",
 | 
			
		||||
    "bilkent",
 | 
			
		||||
    "bisheng",
 | 
			
		||||
    "blrs",
 | 
			
		||||
    "braintree",
 | 
			
		||||
    "brkt",
 | 
			
		||||
    "brolin",
 | 
			
		||||
    "brotli",
 | 
			
		||||
    "città",
 | 
			
		||||
    "classdef",
 | 
			
		||||
    "codedoc",
 | 
			
		||||
    "colour",
 | 
			
		||||
    "commitlint",
 | 
			
		||||
    "cpettitt",
 | 
			
		||||
    "customizability",
 | 
			
		||||
    "cuzon",
 | 
			
		||||
    "cytoscape",
 | 
			
		||||
    "dagre",
 | 
			
		||||
    "deepdwn",
 | 
			
		||||
    "descr",
 | 
			
		||||
    "docsify",
 | 
			
		||||
    "docsy",
 | 
			
		||||
    "doku",
 | 
			
		||||
    "dompurify",
 | 
			
		||||
    "edgechromium",
 | 
			
		||||
    "elkjs",
 | 
			
		||||
    "elle",
 | 
			
		||||
    "faber",
 | 
			
		||||
    "flatmap",
 | 
			
		||||
    "foswiki",
 | 
			
		||||
    "ftplugin",
 | 
			
		||||
    "gantt",
 | 
			
		||||
    "gitea",
 | 
			
		||||
    "gitgraph",
 | 
			
		||||
    "globby",
 | 
			
		||||
    "graphlib",
 | 
			
		||||
    "graphviz",
 | 
			
		||||
    "grav",
 | 
			
		||||
    "greywolf",
 | 
			
		||||
    "gzipped",
 | 
			
		||||
    "huynh",
 | 
			
		||||
    "huynhicode",
 | 
			
		||||
    "inkdrop",
 | 
			
		||||
    "jaoude",
 | 
			
		||||
    "jgreywolf",
 | 
			
		||||
    "jison",
 | 
			
		||||
    "jiti",
 | 
			
		||||
    "kaufmann",
 | 
			
		||||
    "khroma",
 | 
			
		||||
    "klemm",
 | 
			
		||||
    "klink",
 | 
			
		||||
    "knsv",
 | 
			
		||||
    "knut",
 | 
			
		||||
    "knutsveidqvist",
 | 
			
		||||
    "laganeckas",
 | 
			
		||||
    "linetype",
 | 
			
		||||
    "lintstagedrc",
 | 
			
		||||
    "logmsg",
 | 
			
		||||
    "lucida",
 | 
			
		||||
    "markdownish",
 | 
			
		||||
    "matthieu",
 | 
			
		||||
    "matthieumorel",
 | 
			
		||||
    "mdast",
 | 
			
		||||
    "mdbook",
 | 
			
		||||
    "mermaidjs",
 | 
			
		||||
    "mermerd",
 | 
			
		||||
    "metafile",
 | 
			
		||||
    "mindaugas",
 | 
			
		||||
    "mindmap",
 | 
			
		||||
    "mindmaps",
 | 
			
		||||
    "mitigations",
 | 
			
		||||
    "mkdocs",
 | 
			
		||||
    "mmorel",
 | 
			
		||||
    "mult",
 | 
			
		||||
    "neurodiverse",
 | 
			
		||||
    "nextra",
 | 
			
		||||
    "nikolay",
 | 
			
		||||
    "nirname",
 | 
			
		||||
    "orlandoni",
 | 
			
		||||
    "pathe",
 | 
			
		||||
    "pbrolin",
 | 
			
		||||
    "phpbb",
 | 
			
		||||
    "plantuml",
 | 
			
		||||
    "playfair",
 | 
			
		||||
    "pnpm",
 | 
			
		||||
    "podlite",
 | 
			
		||||
    "quence",
 | 
			
		||||
    "radious",
 | 
			
		||||
    "ranksep",
 | 
			
		||||
    "rect",
 | 
			
		||||
    "rects",
 | 
			
		||||
    "reda",
 | 
			
		||||
    "redmine",
 | 
			
		||||
    "rehype",
 | 
			
		||||
    "roledescription",
 | 
			
		||||
    "rozhkov",
 | 
			
		||||
    "sandboxed",
 | 
			
		||||
    "sankey",
 | 
			
		||||
    "setupgraphviewbox",
 | 
			
		||||
    "shiki",
 | 
			
		||||
    "sidharth",
 | 
			
		||||
    "sidharthv",
 | 
			
		||||
    "sphinxcontrib",
 | 
			
		||||
    "startx",
 | 
			
		||||
    "starty",
 | 
			
		||||
    "statediagram",
 | 
			
		||||
    "steph",
 | 
			
		||||
    "stopx",
 | 
			
		||||
    "stopy",
 | 
			
		||||
    "stylis",
 | 
			
		||||
    "subhash-halder",
 | 
			
		||||
    "substate",
 | 
			
		||||
    "sulais",
 | 
			
		||||
    "sveidqvist",
 | 
			
		||||
    "swimm",
 | 
			
		||||
    "techn",
 | 
			
		||||
    "teststr",
 | 
			
		||||
    "textlength",
 | 
			
		||||
    "treemap",
 | 
			
		||||
    "ts-nocheck",
 | 
			
		||||
    "tsdoc",
 | 
			
		||||
    "tuleap",
 | 
			
		||||
    "tylerlong",
 | 
			
		||||
    "typora",
 | 
			
		||||
    "ugge",
 | 
			
		||||
    "unist",
 | 
			
		||||
    "unocss",
 | 
			
		||||
    "upvoting",
 | 
			
		||||
    "valign",
 | 
			
		||||
    "verdana",
 | 
			
		||||
    "viewports",
 | 
			
		||||
    "vinod",
 | 
			
		||||
    "visio",
 | 
			
		||||
    "vitepress",
 | 
			
		||||
    "vueuse",
 | 
			
		||||
    "xlink",
 | 
			
		||||
    "yash",
 | 
			
		||||
    "yokozuna",
 | 
			
		||||
    "zenuml"
 | 
			
		||||
  ],
 | 
			
		||||
  "patterns": [
 | 
			
		||||
    { "name": "Markdown links", "pattern": "\\((.*)\\)", "description": "" },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "Markdown code blocks",
 | 
			
		||||
      "pattern": "/^(\\s*`{3,}).*[\\s\\S]*?^\\1/gmx",
 | 
			
		||||
      "description": "Taken from the cSpell example at https://cspell.org/configuration/patterns/#verbose-regular-expressions"
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "Inline code blocks",
 | 
			
		||||
      "pattern": "\\`([^\\`\\r\\n]+?)\\`",
 | 
			
		||||
      "description": "https://stackoverflow.com/questions/41274241/how-to-capture-inline-markdown-code-but-not-a-markdown-code-fence-with-regex"
 | 
			
		||||
    },
 | 
			
		||||
    { "name": "Link contents", "pattern": "\\<a(.*)\\>", "description": "" },
 | 
			
		||||
    { "name": "Snippet references", "pattern": "-- snippet:(.*)", "description": "" },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "Snippet references 2",
 | 
			
		||||
      "pattern": "\\<\\[sample:(.*)",
 | 
			
		||||
      "description": "another kind of snippet reference"
 | 
			
		||||
    },
 | 
			
		||||
    { "name": "Multi-line code blocks", "pattern": "/^\\s*```[\\s\\S]*?^\\s*```/gm" },
 | 
			
		||||
    {
 | 
			
		||||
      "name": "HTML Tags",
 | 
			
		||||
      "pattern": "<[^>]*>",
 | 
			
		||||
      "description": "Reference: https://stackoverflow.com/questions/11229831/regular-expression-to-remove-html-tags-from-a-string"
 | 
			
		||||
    }
 | 
			
		||||
  ],
 | 
			
		||||
  "ignoreRegExpList": [
 | 
			
		||||
    "Markdown links",
 | 
			
		||||
    "Markdown code blocks",
 | 
			
		||||
    "Inline code blocks",
 | 
			
		||||
    "Link contents",
 | 
			
		||||
    "Snippet references",
 | 
			
		||||
    "Snippet references 2",
 | 
			
		||||
    "Multi-line code blocks",
 | 
			
		||||
    "HTML Tags"
 | 
			
		||||
  ],
 | 
			
		||||
  "ignorePaths": [
 | 
			
		||||
    "packages/mermaid/src/docs/CHANGELOG.md",
 | 
			
		||||
    "packages/mermaid/src/docs/.vitepress/redirect.ts",
 | 
			
		||||
    "packages/mermaid/src/docs/.vitepress/contributor-names.json"
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
@@ -1,45 +0,0 @@
 | 
			
		||||
# yaml-language-server: $schema=https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json
 | 
			
		||||
 | 
			
		||||
$schema: https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json
 | 
			
		||||
version: '0.2'
 | 
			
		||||
language: en-US,en-GB
 | 
			
		||||
 | 
			
		||||
import:
 | 
			
		||||
  - ./.cspell/cspell.config.yaml
 | 
			
		||||
 | 
			
		||||
ignoreRegExpList:
 | 
			
		||||
  - character-set-cyrillic
 | 
			
		||||
  - svg-block
 | 
			
		||||
ignorePaths:
 | 
			
		||||
  - '*lock.{yaml,json}'
 | 
			
		||||
  - dist
 | 
			
		||||
  - CHANGELOG.md
 | 
			
		||||
  - packages/mermaid/src/docs/.vitepress/redirect.ts
 | 
			
		||||
  - packages/mermaid/src/docs/.vitepress/contributor-names.json
 | 
			
		||||
  - backup
 | 
			
		||||
  - '**/*.spec.{js,ts}' # checked by eslint
 | 
			
		||||
  - 'tests/webpack/src/index.js' # checked by eslint
 | 
			
		||||
  - 'cypress/**/*.js' # checked by eslint
 | 
			
		||||
  - '*.csv'
 | 
			
		||||
  - '*.patch'
 | 
			
		||||
  - 'docs/**/*.html'
 | 
			
		||||
  - 'cypress/platform/**'
 | 
			
		||||
dictionaries:
 | 
			
		||||
  - misc-terms
 | 
			
		||||
overrides:
 | 
			
		||||
  - filename:
 | 
			
		||||
      - '**/*.{jison,ts,mts,cjs,mjs,js,json,yaml,yml,md,html}'
 | 
			
		||||
      - 'run'
 | 
			
		||||
      - Dockerfile
 | 
			
		||||
    ignoreRegExpList:
 | 
			
		||||
      - js-unicode-escape
 | 
			
		||||
    dictionaries:
 | 
			
		||||
      - code-terms
 | 
			
		||||
      - 3rd-party-terms
 | 
			
		||||
      - fonts
 | 
			
		||||
      - html
 | 
			
		||||
      - lorem-ipsum
 | 
			
		||||
  - filename: '**/package.json'
 | 
			
		||||
    ignoreRegExpList:
 | 
			
		||||
      - json-property
 | 
			
		||||
# cspell:dictionaries code-terms
 | 
			
		||||
							
								
								
									
										24
									
								
								cypress.config.cjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								cypress.config.cjs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
/* eslint-disable @typescript-eslint/no-var-requires */
 | 
			
		||||
 | 
			
		||||
const { defineConfig } = require('cypress');
 | 
			
		||||
const { addMatchImageSnapshotPlugin } = require('cypress-image-snapshot/plugin');
 | 
			
		||||
const coverage = require('@cypress/code-coverage/task');
 | 
			
		||||
 | 
			
		||||
module.exports = defineConfig({
 | 
			
		||||
  projectId: 'n2sma2',
 | 
			
		||||
  e2e: {
 | 
			
		||||
    specPattern: 'cypress/integration/**/*.{js,jsx,ts,tsx}',
 | 
			
		||||
    setupNodeEvents(on, config) {
 | 
			
		||||
      coverage(on, config);
 | 
			
		||||
      addMatchImageSnapshotPlugin(on, config);
 | 
			
		||||
      // copy any needed variables from process.env to config.env
 | 
			
		||||
      config.env.useAppli = process.env.USE_APPLI ? true : false;
 | 
			
		||||
 | 
			
		||||
      // do not forget to return the changed config object!
 | 
			
		||||
      return config;
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  video: false,
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
require('@applitools/eyes-cypress')(module);
 | 
			
		||||
@@ -1,30 +0,0 @@
 | 
			
		||||
import { defineConfig } from 'cypress';
 | 
			
		||||
import { addMatchImageSnapshotPlugin } from 'cypress-image-snapshot/plugin';
 | 
			
		||||
import coverage from '@cypress/code-coverage/task';
 | 
			
		||||
import eyesPlugin from '@applitools/eyes-cypress';
 | 
			
		||||
export default eyesPlugin(
 | 
			
		||||
  defineConfig({
 | 
			
		||||
    projectId: 'n2sma2',
 | 
			
		||||
    viewportWidth: 1440,
 | 
			
		||||
    viewportHeight: 1024,
 | 
			
		||||
    e2e: {
 | 
			
		||||
      specPattern: 'cypress/integration/**/*.{js,ts}',
 | 
			
		||||
      setupNodeEvents(on, config) {
 | 
			
		||||
        coverage(on, config);
 | 
			
		||||
        on('before:browser:launch', (browser, launchOptions) => {
 | 
			
		||||
          if (browser.name === 'chrome' && browser.isHeadless) {
 | 
			
		||||
            launchOptions.args.push('--window-size=1440,1024', '--force-device-scale-factor=1');
 | 
			
		||||
          }
 | 
			
		||||
          return launchOptions;
 | 
			
		||||
        });
 | 
			
		||||
        addMatchImageSnapshotPlugin(on, config);
 | 
			
		||||
        // copy any needed variables from process.env to config.env
 | 
			
		||||
        config.env.useAppli = process.env.USE_APPLI ? true : false;
 | 
			
		||||
 | 
			
		||||
        // do not forget to return the changed config object!
 | 
			
		||||
        return config;
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    video: false,
 | 
			
		||||
  })
 | 
			
		||||
);
 | 
			
		||||
@@ -10,7 +10,7 @@ interface CypressConfig {
 | 
			
		||||
type CypressMermaidConfig = MermaidConfig & CypressConfig;
 | 
			
		||||
 | 
			
		||||
interface CodeObject {
 | 
			
		||||
  code: string | string[];
 | 
			
		||||
  code: string;
 | 
			
		||||
  mermaid: CypressMermaidConfig;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -18,14 +18,10 @@ const utf8ToB64 = (str: string): string => {
 | 
			
		||||
  return Buffer.from(decodeURIComponent(encodeURIComponent(str))).toString('base64');
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const batchId: string =
 | 
			
		||||
  'mermaid-batch-' +
 | 
			
		||||
  (Cypress.env('useAppli')
 | 
			
		||||
    ? Date.now().toString()
 | 
			
		||||
    : Cypress.env('CYPRESS_COMMIT') || Date.now().toString());
 | 
			
		||||
const batchId: string = 'mermaid-batch-' + Cypress.env('CYPRESS_COMMIT') || Date.now().toString();
 | 
			
		||||
 | 
			
		||||
export const mermaidUrl = (
 | 
			
		||||
  graphStr: string | string[],
 | 
			
		||||
  graphStr: string,
 | 
			
		||||
  options: CypressMermaidConfig,
 | 
			
		||||
  api: boolean
 | 
			
		||||
): string => {
 | 
			
		||||
@@ -52,21 +48,29 @@ export const imgSnapshotTest = (
 | 
			
		||||
  api = false,
 | 
			
		||||
  validation?: any
 | 
			
		||||
): void => {
 | 
			
		||||
  const options: CypressMermaidConfig = {
 | 
			
		||||
    ..._options,
 | 
			
		||||
    fontFamily: _options.fontFamily || 'courier',
 | 
			
		||||
    // @ts-ignore TODO: Fix type of fontSize
 | 
			
		||||
    fontSize: _options.fontSize || '16px',
 | 
			
		||||
    sequence: {
 | 
			
		||||
      ...(_options.sequence || {}),
 | 
			
		||||
      actorFontFamily: 'courier',
 | 
			
		||||
      noteFontFamily:
 | 
			
		||||
        _options.sequence && _options.sequence.noteFontFamily
 | 
			
		||||
          ? _options.sequence.noteFontFamily
 | 
			
		||||
          : 'courier',
 | 
			
		||||
      messageFontFamily: 'courier',
 | 
			
		||||
    },
 | 
			
		||||
  };
 | 
			
		||||
  cy.log(JSON.stringify(_options));
 | 
			
		||||
  const options: CypressMermaidConfig = Object.assign(_options);
 | 
			
		||||
  if (!options.fontFamily) {
 | 
			
		||||
    options.fontFamily = 'courier';
 | 
			
		||||
  }
 | 
			
		||||
  if (!options.sequence) {
 | 
			
		||||
    options.sequence = {};
 | 
			
		||||
  }
 | 
			
		||||
  if (!options.sequence || (options.sequence && !options.sequence.actorFontFamily)) {
 | 
			
		||||
    options.sequence.actorFontFamily = 'courier';
 | 
			
		||||
  }
 | 
			
		||||
  if (options.sequence && !options.sequence.noteFontFamily) {
 | 
			
		||||
    options.sequence.noteFontFamily = 'courier';
 | 
			
		||||
  }
 | 
			
		||||
  options.sequence.actorFontFamily = 'courier';
 | 
			
		||||
  options.sequence.noteFontFamily = 'courier';
 | 
			
		||||
  options.sequence.messageFontFamily = 'courier';
 | 
			
		||||
  if (options.sequence && !options.sequence.actorFontFamily) {
 | 
			
		||||
    options.sequence.actorFontFamily = 'courier';
 | 
			
		||||
  }
 | 
			
		||||
  if (!options.fontSize) {
 | 
			
		||||
    options.fontSize = 16;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const url: string = mermaidUrl(graphStr, options, api);
 | 
			
		||||
  openURLAndVerifyRendering(url, options, validation);
 | 
			
		||||
@@ -74,15 +78,16 @@ export const imgSnapshotTest = (
 | 
			
		||||
 | 
			
		||||
export const urlSnapshotTest = (
 | 
			
		||||
  url: string,
 | 
			
		||||
  options: CypressMermaidConfig,
 | 
			
		||||
  _options: CypressMermaidConfig,
 | 
			
		||||
  _api = false,
 | 
			
		||||
  validation?: any
 | 
			
		||||
): void => {
 | 
			
		||||
  const options: CypressMermaidConfig = Object.assign(_options);
 | 
			
		||||
  openURLAndVerifyRendering(url, options, validation);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const renderGraph = (
 | 
			
		||||
  graphStr: string | string[],
 | 
			
		||||
  graphStr: string,
 | 
			
		||||
  options: CypressMermaidConfig = {},
 | 
			
		||||
  api = false
 | 
			
		||||
): void => {
 | 
			
		||||
 
 | 
			
		||||
@@ -117,54 +117,13 @@ describe('Configuration', () => {
 | 
			
		||||
    });
 | 
			
		||||
    it('should not taint the initial configuration when using multiple directives', () => {
 | 
			
		||||
      const url = 'http://localhost:9000/regression/issue-1874.html';
 | 
			
		||||
      cy.viewport(1440, 1024);
 | 
			
		||||
      cy.visit(url);
 | 
			
		||||
      cy.window().should('have.property', 'rendered', true);
 | 
			
		||||
      cy.get('svg').should('be.visible');
 | 
			
		||||
 | 
			
		||||
      cy.get('svg');
 | 
			
		||||
      cy.matchImageSnapshot(
 | 
			
		||||
        'configuration.spec-should-not-taint-initial-configuration-when-using-multiple-directives'
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  describe('suppressErrorRendering', () => {
 | 
			
		||||
    beforeEach(() => {
 | 
			
		||||
      cy.on('uncaught:exception', (err, runnable) => {
 | 
			
		||||
        return !err.message.includes('Parse error on line');
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('should not render error diagram if suppressErrorRendering is set', () => {
 | 
			
		||||
      const url = 'http://localhost:9000/suppressError.html?suppressErrorRendering=true';
 | 
			
		||||
      cy.visit(url);
 | 
			
		||||
      cy.window().should('have.property', 'rendered', true);
 | 
			
		||||
      cy.get('#test')
 | 
			
		||||
        .find('svg')
 | 
			
		||||
        .should(($svg) => {
 | 
			
		||||
          // all failing diagrams should not appear!
 | 
			
		||||
          expect($svg).to.have.length(2);
 | 
			
		||||
          // none of the diagrams should be error diagrams
 | 
			
		||||
          expect($svg).to.not.contain('Syntax error');
 | 
			
		||||
        });
 | 
			
		||||
      cy.matchImageSnapshot(
 | 
			
		||||
        'configuration.spec-should-not-render-error-diagram-if-suppressErrorRendering-is-set'
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('should render error diagram if suppressErrorRendering is not set', () => {
 | 
			
		||||
      const url = 'http://localhost:9000/suppressError.html';
 | 
			
		||||
      cy.visit(url);
 | 
			
		||||
      cy.window().should('have.property', 'rendered', true);
 | 
			
		||||
      cy.get('#test')
 | 
			
		||||
        .find('svg')
 | 
			
		||||
        .should(($svg) => {
 | 
			
		||||
          // all five diagrams should be rendered
 | 
			
		||||
          expect($svg).to.have.length(5);
 | 
			
		||||
          // some of the diagrams should be error diagrams
 | 
			
		||||
          expect($svg).to.contain('Syntax error');
 | 
			
		||||
        });
 | 
			
		||||
      cy.matchImageSnapshot(
 | 
			
		||||
        'configuration.spec-should-render-error-diagram-if-suppressErrorRendering-is-not-set'
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
import { urlSnapshotTest, openURLAndVerifyRendering } from '../../helpers/util.ts';
 | 
			
		||||
 | 
			
		||||
describe('Flowchart elk', () => {
 | 
			
		||||
  it('should use dagre as fallback', () => {
 | 
			
		||||
    urlSnapshotTest('http://localhost:9000/flow-elk.html', {
 | 
			
		||||
      name: 'flow-elk fallback to dagre',
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
  it('should allow overriding with external package', () => {
 | 
			
		||||
    urlSnapshotTest('http://localhost:9000/flow-elk.html?elk=true', {
 | 
			
		||||
      name: 'flow-elk overriding dagre with elk',
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
@@ -1,12 +1,14 @@
 | 
			
		||||
describe('Rerendering', () => {
 | 
			
		||||
  it('should be able to render after an error has occurred', () => {
 | 
			
		||||
    const url = 'http://localhost:9000/render-after-error.html';
 | 
			
		||||
    cy.viewport(1440, 1024);
 | 
			
		||||
    cy.visit(url);
 | 
			
		||||
    cy.get('#graphDiv').should('exist');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should be able to render and rerender a graph via API', () => {
 | 
			
		||||
    const url = 'http://localhost:9000/rerender.html';
 | 
			
		||||
    cy.viewport(1440, 1024);
 | 
			
		||||
    cy.visit(url);
 | 
			
		||||
    cy.get('#graph [id^=flowchart-A]').should('have.text', 'XMas');
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -132,9 +132,4 @@ describe('XSS', () => {
 | 
			
		||||
    cy.wait(1000);
 | 
			
		||||
    cy.get('#the-malware').should('not.exist');
 | 
			
		||||
  });
 | 
			
		||||
  it('should sanitize backticks in class names properly', () => {
 | 
			
		||||
    cy.visit('http://localhost:9000/xss24.html');
 | 
			
		||||
    cy.wait(1000);
 | 
			
		||||
    cy.get('#the-malware').should('not.exist');
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -1,386 +0,0 @@
 | 
			
		||||
import { imgSnapshotTest } from '../../helpers/util';
 | 
			
		||||
/* eslint-disable no-useless-escape */
 | 
			
		||||
describe('Block diagram', () => {
 | 
			
		||||
  it('BL1: should calculate the block widths', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
  columns 2
 | 
			
		||||
  block
 | 
			
		||||
    id2["I am a wide one"]
 | 
			
		||||
    id1
 | 
			
		||||
  end
 | 
			
		||||
  id["Next row"]
 | 
			
		||||
      `
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL2: should handle colums statement in sub-blocks', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
  id1["Hello"]
 | 
			
		||||
  block
 | 
			
		||||
    columns 3
 | 
			
		||||
    id2["to"]
 | 
			
		||||
    id3["the"]
 | 
			
		||||
    id4["World"]
 | 
			
		||||
    id5["World"]
 | 
			
		||||
  end
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL3: should align block widths and handle colums statement in sub-blocks', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
  block
 | 
			
		||||
    columns 1
 | 
			
		||||
    id1
 | 
			
		||||
    id2
 | 
			
		||||
    id2.1
 | 
			
		||||
  end
 | 
			
		||||
  id3
 | 
			
		||||
  id4
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL4: should align block widths and handle colums statements in deeper sub-blocks then 1 level', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
  columns 1
 | 
			
		||||
  block
 | 
			
		||||
    columns 1
 | 
			
		||||
    block
 | 
			
		||||
      columns 3
 | 
			
		||||
      id1
 | 
			
		||||
      id2
 | 
			
		||||
      id2.1(("XYZ"))
 | 
			
		||||
    end
 | 
			
		||||
    id48
 | 
			
		||||
  end
 | 
			
		||||
  id3
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL5: should align block widths and handle colums statements in deeper sub-blocks then 1 level (alt)', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
  columns 1
 | 
			
		||||
  block
 | 
			
		||||
    id1
 | 
			
		||||
    id2
 | 
			
		||||
    block
 | 
			
		||||
      columns 1
 | 
			
		||||
      id3("Wider then")
 | 
			
		||||
      id5(("id5"))
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
  id4
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL6: should handle block arrows and spece statements', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
    columns 3
 | 
			
		||||
    space:3
 | 
			
		||||
    ida idb idc
 | 
			
		||||
    id1  id2
 | 
			
		||||
      blockArrowId<["Label"]>(right)
 | 
			
		||||
      blockArrowId2<["Label"]>(left)
 | 
			
		||||
      blockArrowId3<["Label"]>(up)
 | 
			
		||||
      blockArrowId4<["Label"]>(down)
 | 
			
		||||
      blockArrowId5<["Label"]>(x)
 | 
			
		||||
      blockArrowId6<["Label"]>(y)
 | 
			
		||||
      blockArrowId6<["Label"]>(x, down)
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL7: should handle different types of edges', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
      columns 3
 | 
			
		||||
      A space:5
 | 
			
		||||
      A --o B
 | 
			
		||||
      A --> C
 | 
			
		||||
      A --x D
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL8: should handle sub-blocks without columns statements', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
      columns 2
 | 
			
		||||
      C A B
 | 
			
		||||
      block
 | 
			
		||||
        D
 | 
			
		||||
        E
 | 
			
		||||
      end
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL9: should handle edges from blocks in sub blocks to other blocks', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
      columns 3
 | 
			
		||||
      B space
 | 
			
		||||
      block
 | 
			
		||||
        D
 | 
			
		||||
      end
 | 
			
		||||
      D --> B
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL10: should handle edges from composite blocks', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
      columns 3
 | 
			
		||||
      B space
 | 
			
		||||
      block BL
 | 
			
		||||
        D
 | 
			
		||||
      end
 | 
			
		||||
      BL --> B
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL11: should handle edges to composite blocks', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
      columns 3
 | 
			
		||||
      B space
 | 
			
		||||
      block BL
 | 
			
		||||
        D
 | 
			
		||||
      end
 | 
			
		||||
      B --> BL
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL12: edges should handle labels', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
      A
 | 
			
		||||
      space
 | 
			
		||||
      A -- "apa" --> E
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL13: should handle block arrows in different directions', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
      columns 3
 | 
			
		||||
      space blockArrowId1<["down"]>(down) space
 | 
			
		||||
      blockArrowId2<["right"]>(right) blockArrowId3<["Sync"]>(x, y) blockArrowId4<["left"]>(left)
 | 
			
		||||
      space blockArrowId5<["up"]>(up) space
 | 
			
		||||
      blockArrowId6<["x"]>(x) space blockArrowId7<["y"]>(y)
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL14: should style statements and class statements', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
    A
 | 
			
		||||
    B
 | 
			
		||||
    classDef blue fill:#66f,stroke:#333,stroke-width:2px;
 | 
			
		||||
    class A blue
 | 
			
		||||
    style B fill:#f9F,stroke:#333,stroke-width:4px
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL15: width alignment - D and E should share available space', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
  block
 | 
			
		||||
    D
 | 
			
		||||
    E
 | 
			
		||||
  end
 | 
			
		||||
  db("This is the text in the box")
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL16: width alignment - C should be as wide as the composite block', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
  block
 | 
			
		||||
    A("This is the text")
 | 
			
		||||
    B
 | 
			
		||||
  end
 | 
			
		||||
  C
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL16: width alignment - blocks shold be equal in width', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
    A("This is the text")
 | 
			
		||||
    B
 | 
			
		||||
    C
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL17: block types 1 - square, rounded and circle', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
    A["square"]
 | 
			
		||||
    B("rounded")
 | 
			
		||||
    C(("circle"))
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL18: block types 2 - odd, diamond and hexagon', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
    A>"rect_left_inv_arrow"]
 | 
			
		||||
    B{"diamond"}
 | 
			
		||||
    C{{"hexagon"}}
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL19: block types 3 - stadium', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
    A(["stadium"])
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL20: block types 4 - lean right, lean left, trapezoid and inv trapezoid', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
    A[/"lean right"/]
 | 
			
		||||
    B[\"lean left"\]
 | 
			
		||||
    C[/"trapezoid"\]
 | 
			
		||||
    D[\"trapezoid alt"/]
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL21: block types 1 - square, rounded and circle', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
    A["square"]
 | 
			
		||||
    B("rounded")
 | 
			
		||||
    C(("circle"))
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL22: sizing - it should be possible to make a block wider', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
      A("rounded"):2
 | 
			
		||||
      B:2
 | 
			
		||||
      C
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL23: sizing - it should be possible to make a composite block wider', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
      block:2
 | 
			
		||||
        A
 | 
			
		||||
      end
 | 
			
		||||
      B
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('BL24: block in the middle with space on each side', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
        columns 3
 | 
			
		||||
        space
 | 
			
		||||
        middle["In the middle"]
 | 
			
		||||
        space
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('BL25: space and an edge', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
  columns 5
 | 
			
		||||
    A space B
 | 
			
		||||
    A --x B
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('BL26: block sizes for regular blocks', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
  columns 3
 | 
			
		||||
    a["A wide one"] b:2 c:2 d
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('BL27: composite block with a set width - f should use the available space', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
  columns 3
 | 
			
		||||
  a:3
 | 
			
		||||
  block:e:3
 | 
			
		||||
      f
 | 
			
		||||
  end
 | 
			
		||||
  g
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('BL23: composite block with a set width - f and g should split the available space', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `block-beta
 | 
			
		||||
  columns 3
 | 
			
		||||
  a:3
 | 
			
		||||
  block:e:3
 | 
			
		||||
      f
 | 
			
		||||
      g
 | 
			
		||||
  end
 | 
			
		||||
  h
 | 
			
		||||
  i
 | 
			
		||||
  j
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
@@ -386,6 +386,30 @@ describe('Class diagram V2', () => {
 | 
			
		||||
      { logLevel: 1, flowchart: { htmlLabels: false } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('18: should handle the direction statement with LR', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      classDiagram
 | 
			
		||||
        direction LR
 | 
			
		||||
        class Student {
 | 
			
		||||
          -idCard : IdCard
 | 
			
		||||
        }
 | 
			
		||||
        class IdCard{
 | 
			
		||||
          -id : int
 | 
			
		||||
          -name : string
 | 
			
		||||
        }
 | 
			
		||||
        class Bike{
 | 
			
		||||
          -id : int
 | 
			
		||||
          -name : string
 | 
			
		||||
        }
 | 
			
		||||
        Student "1" --o "1" IdCard : carries
 | 
			
		||||
        Student "1" --o "1" Bike : rides
 | 
			
		||||
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1, flowchart: { htmlLabels: false } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('17a: should handle the direction statement with BT', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
@@ -433,31 +457,7 @@ describe('Class diagram V2', () => {
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('18a: should handle the direction statement with LR', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      classDiagram
 | 
			
		||||
        direction LR
 | 
			
		||||
        class Student {
 | 
			
		||||
          -idCard : IdCard
 | 
			
		||||
        }
 | 
			
		||||
        class IdCard{
 | 
			
		||||
          -id : int
 | 
			
		||||
          -name : string
 | 
			
		||||
        }
 | 
			
		||||
        class Bike{
 | 
			
		||||
          -id : int
 | 
			
		||||
          -name : string
 | 
			
		||||
        }
 | 
			
		||||
        Student "1" --o "1" IdCard : carries
 | 
			
		||||
        Student "1" --o "1" Bike : rides
 | 
			
		||||
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1, flowchart: { htmlLabels: false } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('18b: should render a simple class diagram with notes', () => {
 | 
			
		||||
  it('18: should render a simple class diagram with notes', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      classDiagram-v2
 | 
			
		||||
@@ -562,23 +562,4 @@ class C13["With Città foreign language"]
 | 
			
		||||
      `
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('should render a simple class diagram with no members', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      classDiagram-v2
 | 
			
		||||
        class Class10
 | 
			
		||||
        `,
 | 
			
		||||
      { logLevel: 1, flowchart: { htmlLabels: false } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('should render a simple class diagram with style definition', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      classDiagram-v2
 | 
			
		||||
        class Class10
 | 
			
		||||
        style Class10 fill:#f9f,stroke:#333,stroke-width:4px
 | 
			
		||||
        `,
 | 
			
		||||
      { logLevel: 1, flowchart: { htmlLabels: false } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -501,16 +501,4 @@ describe('Class diagram', () => {
 | 
			
		||||
        B : -methods()
 | 
			
		||||
      `);
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should handle notes with anchor tag having target attribute', () => {
 | 
			
		||||
    renderGraph(
 | 
			
		||||
      `classDiagram
 | 
			
		||||
        class test { }
 | 
			
		||||
        note for test "<a href='https://mermaid.js.org/' target="_blank"><code>note about mermaid</code></a>"`
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    cy.get('svg').then((svg) => {
 | 
			
		||||
      cy.get('a').should('have.attr', 'target', '_blank').should('have.attr', 'rel', 'noopener');
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import { imgSnapshotTest, urlSnapshotTest } from '../../helpers/util.ts';
 | 
			
		||||
import { imgSnapshotTest } from '../../helpers/util.ts';
 | 
			
		||||
 | 
			
		||||
describe('Configuration and directives - nodes should be light blue', () => {
 | 
			
		||||
  it('No config - use default', () => {
 | 
			
		||||
@@ -14,6 +14,7 @@ describe('Configuration and directives - nodes should be light blue', () => {
 | 
			
		||||
        `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
  it('Settings from initialize - nodes should be green', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
@@ -27,6 +28,7 @@ graph TD
 | 
			
		||||
          end          `,
 | 
			
		||||
      { theme: 'forest' }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
  it('Settings from initialize overriding themeVariable - nodes should be red', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
@@ -44,6 +46,7 @@ graph TD
 | 
			
		||||
        `,
 | 
			
		||||
      { theme: 'base', themeVariables: { primaryColor: '#ff0000' }, logLevel: 0 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
  it('Settings from directive - nodes should be grey', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
@@ -59,24 +62,7 @@ graph TD
 | 
			
		||||
        `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('Settings from frontmatter - nodes should be grey', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
---
 | 
			
		||||
config:
 | 
			
		||||
  theme: neutral
 | 
			
		||||
---
 | 
			
		||||
graph TD
 | 
			
		||||
          A(Start) --> B[/Another/]
 | 
			
		||||
          A[/Another/] --> C[End]
 | 
			
		||||
          subgraph section
 | 
			
		||||
            B
 | 
			
		||||
            C
 | 
			
		||||
          end
 | 
			
		||||
        `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('Settings from directive overriding theme variable - nodes should be red', () => {
 | 
			
		||||
@@ -93,6 +79,7 @@ graph TD
 | 
			
		||||
        `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
  it('Settings from initialize and directive - nodes should be grey', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
@@ -108,6 +95,7 @@ graph TD
 | 
			
		||||
        `,
 | 
			
		||||
      { theme: 'forest' }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
  it('Theme from initialize, directive overriding theme variable - nodes should be red', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
@@ -123,71 +111,8 @@ graph TD
 | 
			
		||||
        `,
 | 
			
		||||
      { theme: 'base' }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
  it('Theme from initialize, frontmatter overriding theme variable - nodes should be red', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
---
 | 
			
		||||
config:
 | 
			
		||||
  theme: base
 | 
			
		||||
  themeVariables:
 | 
			
		||||
    primaryColor: '#ff0000'
 | 
			
		||||
---
 | 
			
		||||
graph TD
 | 
			
		||||
          A(Start) --> B[/Another/]
 | 
			
		||||
          A[/Another/] --> C[End]
 | 
			
		||||
          subgraph section
 | 
			
		||||
            B
 | 
			
		||||
            C
 | 
			
		||||
          end
 | 
			
		||||
        `,
 | 
			
		||||
      { theme: 'forest' }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('Theme from initialize, frontmatter overriding theme variable, directive overriding primaryColor - nodes should be red', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
---
 | 
			
		||||
config:
 | 
			
		||||
  theme: base
 | 
			
		||||
  themeVariables:
 | 
			
		||||
    primaryColor: '#00ff00'
 | 
			
		||||
---
 | 
			
		||||
%%{init: {'theme': 'base', 'themeVariables':{ 'primaryColor': '#ff0000'}}}%%
 | 
			
		||||
graph TD
 | 
			
		||||
          A(Start) --> B[/Another/]
 | 
			
		||||
          A[/Another/] --> C[End]
 | 
			
		||||
          subgraph section
 | 
			
		||||
            B
 | 
			
		||||
            C
 | 
			
		||||
          end
 | 
			
		||||
        `,
 | 
			
		||||
      { theme: 'forest' }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render if values are not quoted properly', () => {
 | 
			
		||||
    // #ff0000 is not quoted properly, and will evaluate to null.
 | 
			
		||||
    // This test ensures that the rendering still works.
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `---
 | 
			
		||||
config:
 | 
			
		||||
  theme: base
 | 
			
		||||
  themeVariables:
 | 
			
		||||
    primaryColor: #ff0000
 | 
			
		||||
---
 | 
			
		||||
graph TD
 | 
			
		||||
          A(Start) --> B[/Another/]
 | 
			
		||||
          A[/Another/] --> C[End]
 | 
			
		||||
          subgraph section
 | 
			
		||||
            B
 | 
			
		||||
            C
 | 
			
		||||
          end
 | 
			
		||||
        `,
 | 
			
		||||
      { theme: 'forest' }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('Theme variable from initialize, theme from directive - nodes should be red', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
@@ -202,11 +127,14 @@ graph TD
 | 
			
		||||
        `,
 | 
			
		||||
      { themeVariables: { primaryColor: '#ff0000' } }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
  describe('when rendering several diagrams', () => {
 | 
			
		||||
    it('diagrams should not taint later diagrams', () => {
 | 
			
		||||
      const url = 'http://localhost:9000/theme-directives.html';
 | 
			
		||||
      urlSnapshotTest(url, {});
 | 
			
		||||
      cy.visit(url);
 | 
			
		||||
      cy.get('svg');
 | 
			
		||||
      cy.matchImageSnapshot('conf-and-directives.spec-when-rendering-several-diagrams-diagram-1');
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										12
									
								
								cypress/integration/rendering/debug.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								cypress/integration/rendering/debug.spec.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
import { imgSnapshotTest } from '../../helpers/util.ts';
 | 
			
		||||
 | 
			
		||||
describe('Flowchart', () => {
 | 
			
		||||
  it('34: testing the label width in percy', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `graph TD
 | 
			
		||||
      A[Christmas]
 | 
			
		||||
      `,
 | 
			
		||||
      { theme: 'forest', fontFamily: '"Noto Sans SC", sans-serif' }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
@@ -305,21 +305,4 @@ ORDER ||--|{ LINE-ITEM : contains
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render entities with entity name aliases', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
    erDiagram
 | 
			
		||||
      p[Person] {
 | 
			
		||||
        varchar(64) firstName
 | 
			
		||||
        varchar(64) lastName
 | 
			
		||||
      }
 | 
			
		||||
      c["Customer Account"] {
 | 
			
		||||
        varchar(128) email
 | 
			
		||||
      }
 | 
			
		||||
      p ||--o| c : has
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -844,42 +844,3 @@ end
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
describe('Title and arrow styling #4813', () => {
 | 
			
		||||
  it('should render a flowchart with title', () => {
 | 
			
		||||
    const titleString = 'Test Title';
 | 
			
		||||
    renderGraph(
 | 
			
		||||
      `---
 | 
			
		||||
      title: ${titleString}
 | 
			
		||||
      ---
 | 
			
		||||
      flowchart LR
 | 
			
		||||
      A-->B
 | 
			
		||||
      A-->C`,
 | 
			
		||||
      { flowchart: { defaultRenderer: 'elk' } }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg').should((svg) => {
 | 
			
		||||
      const title = svg[0].querySelector('text');
 | 
			
		||||
      expect(title.textContent).to.contain(titleString);
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('Render with stylized arrows', () => {
 | 
			
		||||
    renderGraph(
 | 
			
		||||
      `
 | 
			
		||||
      flowchart LR
 | 
			
		||||
      A-->B
 | 
			
		||||
      B-.-oC
 | 
			
		||||
      C==xD
 | 
			
		||||
      D ~~~ A`,
 | 
			
		||||
      { flowchart: { defaultRenderer: 'elk' } }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg').should((svg) => {
 | 
			
		||||
      const edges = svg[0].querySelectorAll('.edges path');
 | 
			
		||||
      console.log(edges);
 | 
			
		||||
      expect(edges[0]).to.have.attr('pattern', 'solid');
 | 
			
		||||
      expect(edges[1]).to.have.attr('pattern', 'dotted');
 | 
			
		||||
      expect(edges[2]).to.have.css('stroke-width', '3.5px');
 | 
			
		||||
      expect(edges[3]).to.have.css('stroke-width', '1.5px');
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -729,82 +729,6 @@ A ~~~ B
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('5064: Should render when subgraph child has links to outside node and subgraph', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `flowchart TB
 | 
			
		||||
    Out --> In
 | 
			
		||||
    subgraph Sub
 | 
			
		||||
      In
 | 
			
		||||
    end
 | 
			
		||||
    Sub --> In`
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('5059: Should render when subgraph contains only subgraphs, has link to outside and itself is part of a link', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `flowchart
 | 
			
		||||
 | 
			
		||||
      subgraph Main
 | 
			
		||||
        subgraph Child1
 | 
			
		||||
          Node1
 | 
			
		||||
          Node2
 | 
			
		||||
        end
 | 
			
		||||
        subgraph Child2
 | 
			
		||||
          Node3
 | 
			
		||||
          Node4
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      Main --> Out1
 | 
			
		||||
      Child2 --> Out2`
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('3258: Should render subgraphs with main graph nodeSpacing and rankSpacing', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `---
 | 
			
		||||
      title: Subgraph nodeSpacing and rankSpacing example
 | 
			
		||||
      ---
 | 
			
		||||
      flowchart LR
 | 
			
		||||
        X --> Y
 | 
			
		||||
        subgraph X
 | 
			
		||||
          direction LR
 | 
			
		||||
          A
 | 
			
		||||
          C
 | 
			
		||||
        end
 | 
			
		||||
        subgraph Y
 | 
			
		||||
          B
 | 
			
		||||
          D
 | 
			
		||||
        end
 | 
			
		||||
      `,
 | 
			
		||||
      { flowchart: { nodeSpacing: 1, rankSpacing: 1 } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('3258: Should render subgraphs with large nodeSpacing and rankSpacing', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `---
 | 
			
		||||
      title: Subgraph nodeSpacing and rankSpacing example
 | 
			
		||||
      config:
 | 
			
		||||
        flowchart: 
 | 
			
		||||
          nodeSpacing: 250
 | 
			
		||||
          rankSpacing: 250
 | 
			
		||||
      ---
 | 
			
		||||
      flowchart LR
 | 
			
		||||
        X --> Y
 | 
			
		||||
        subgraph X
 | 
			
		||||
          direction LR
 | 
			
		||||
          A
 | 
			
		||||
          C
 | 
			
		||||
        end
 | 
			
		||||
        subgraph Y
 | 
			
		||||
          B
 | 
			
		||||
          D
 | 
			
		||||
        end
 | 
			
		||||
      `
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  describe('Markdown strings flowchart (#4220)', () => {
 | 
			
		||||
    describe('html labels', () => {
 | 
			
		||||
      it('With styling and classes', () => {
 | 
			
		||||
@@ -949,106 +873,5 @@ end
 | 
			
		||||
        );
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it('should not auto wrap when markdownAutoWrap is false', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `flowchart TD
 | 
			
		||||
    angular_velocity["\`**angular_velocity**
 | 
			
		||||
      *angular_displacement / duration*
 | 
			
		||||
      [rad/s, 1/s]
 | 
			
		||||
      {vector}\`"]
 | 
			
		||||
    frequency["frequency\n(1 / period_duration)\n[Hz, 1/s]"]`,
 | 
			
		||||
        { markdownAutoWrap: false }
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
  describe('Subgraph title margins', () => {
 | 
			
		||||
    it('Should render subgraphs with title margins set (LR)', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `flowchart LR
 | 
			
		||||
 | 
			
		||||
          subgraph TOP
 | 
			
		||||
              direction TB
 | 
			
		||||
              subgraph B1
 | 
			
		||||
                  direction RL
 | 
			
		||||
                  i1 -->f1
 | 
			
		||||
              end
 | 
			
		||||
              subgraph B2
 | 
			
		||||
                  direction BT
 | 
			
		||||
                  i2 -->f2
 | 
			
		||||
              end
 | 
			
		||||
          end
 | 
			
		||||
          A --> TOP --> B
 | 
			
		||||
          B1 --> B2
 | 
			
		||||
        `,
 | 
			
		||||
        { flowchart: { subGraphTitleMargin: { top: 10, bottom: 5 } } }
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('Should render subgraphs with title margins set (TD)', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `flowchart TD
 | 
			
		||||
 | 
			
		||||
          subgraph TOP
 | 
			
		||||
              direction LR
 | 
			
		||||
              subgraph B1
 | 
			
		||||
                  direction RL
 | 
			
		||||
                  i1 -->f1
 | 
			
		||||
              end
 | 
			
		||||
              subgraph B2
 | 
			
		||||
                  direction BT
 | 
			
		||||
                  i2 -->f2
 | 
			
		||||
              end
 | 
			
		||||
          end
 | 
			
		||||
          A --> TOP --> B
 | 
			
		||||
          B1 --> B2
 | 
			
		||||
        `,
 | 
			
		||||
        { flowchart: { subGraphTitleMargin: { top: 8, bottom: 16 } } }
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('Should render subgraphs with title margins set (LR) and htmlLabels set to false', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `flowchart LR
 | 
			
		||||
 | 
			
		||||
          subgraph TOP
 | 
			
		||||
              direction TB
 | 
			
		||||
              subgraph B1
 | 
			
		||||
                  direction RL
 | 
			
		||||
                  i1 -->f1
 | 
			
		||||
              end
 | 
			
		||||
              subgraph B2
 | 
			
		||||
                  direction BT
 | 
			
		||||
                  i2 -->f2
 | 
			
		||||
              end
 | 
			
		||||
          end
 | 
			
		||||
          A --> TOP --> B
 | 
			
		||||
          B1 --> B2
 | 
			
		||||
        `,
 | 
			
		||||
        {
 | 
			
		||||
          htmlLabels: false,
 | 
			
		||||
          flowchart: { htmlLabels: false, subGraphTitleMargin: { top: 10, bottom: 5 } },
 | 
			
		||||
        }
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('Should render subgraphs with title margins and edge labels', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `flowchart LR
 | 
			
		||||
 | 
			
		||||
          subgraph TOP
 | 
			
		||||
              direction TB
 | 
			
		||||
              subgraph B1
 | 
			
		||||
                  direction RL
 | 
			
		||||
                  i1 --lb1-->f1
 | 
			
		||||
              end
 | 
			
		||||
              subgraph B2
 | 
			
		||||
                  direction BT
 | 
			
		||||
                  i2 --lb2-->f2
 | 
			
		||||
              end
 | 
			
		||||
          end
 | 
			
		||||
          A --lb3--> TOP --lb4--> B
 | 
			
		||||
          B1 --lb5--> B2
 | 
			
		||||
        `,
 | 
			
		||||
        { flowchart: { subGraphTitleMargin: { top: 10, bottom: 5 } } }
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -92,31 +92,6 @@ describe('Gantt diagram', () => {
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('should handle multiple dependencies syntax with after and until', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      gantt
 | 
			
		||||
      dateFormat  YYYY-MM-DD
 | 
			
		||||
      axisFormat  %d/%m
 | 
			
		||||
      title Adding GANTT diagram to mermaid
 | 
			
		||||
      excludes weekdays 2014-01-10
 | 
			
		||||
      todayMarker off
 | 
			
		||||
 | 
			
		||||
      section team's critical event
 | 
			
		||||
      deadline A           :milestone, crit, deadlineA, 2024-02-01, 0
 | 
			
		||||
      deadline B           :milestone, crit, deadlineB, 2024-02-15, 0
 | 
			
		||||
      boss on leave        :bossaway, 2024-01-28, 2024-02-11
 | 
			
		||||
 | 
			
		||||
      section new intern
 | 
			
		||||
      onboarding           :onboarding, 2024-01-02, 1w
 | 
			
		||||
      literature review    :litreview, 2024-01-02, 10d
 | 
			
		||||
      project A            :projectA, after onboarding litreview, until deadlineA bossaway
 | 
			
		||||
      chilling             :chilling, after projectA, until deadlineA
 | 
			
		||||
      project B            :projectB, after deadlineA, until deadlineB
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('should FAIL redering a gantt chart for issue #1060 with invalid date', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
@@ -270,10 +245,7 @@ describe('Gantt diagram', () => {
 | 
			
		||||
      const style = svg.attr('style');
 | 
			
		||||
      expect(style).to.match(/^max-width: [\d.]+px;$/);
 | 
			
		||||
      const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
 | 
			
		||||
      expect(maxWidthValue).to.be.within(
 | 
			
		||||
        Cypress.config().viewportWidth * 0.95,
 | 
			
		||||
        Cypress.config().viewportWidth * 1.05
 | 
			
		||||
      );
 | 
			
		||||
      expect(maxWidthValue).to.be.within(984 * 0.95, 984 * 1.05);
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
@@ -313,11 +285,11 @@ describe('Gantt diagram', () => {
 | 
			
		||||
      { gantt: { useMaxWidth: false } }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg').should((svg) => {
 | 
			
		||||
      // const height = parseFloat(svg.attr('height'));
 | 
			
		||||
      const width = parseFloat(svg.attr('width'));
 | 
			
		||||
      expect(width).to.be.within(
 | 
			
		||||
        Cypress.config().viewportWidth * 0.95,
 | 
			
		||||
        Cypress.config().viewportWidth * 1.05
 | 
			
		||||
      );
 | 
			
		||||
      // use within because the absolute value can be slightly different depending on the environment ±5%
 | 
			
		||||
      // expect(height).to.be.within(484 * 0.95, 484 * 1.05);
 | 
			
		||||
      expect(width).to.be.within(984 * 0.95, 984 * 1.05);
 | 
			
		||||
      expect(svg).to.not.have.attr('style');
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
@@ -358,48 +330,6 @@ describe('Gantt diagram', () => {
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render a gantt diagram with tick is 2 milliseconds', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      gantt
 | 
			
		||||
        title A Gantt Diagram
 | 
			
		||||
        dateFormat   SSS
 | 
			
		||||
        axisFormat   %Lms
 | 
			
		||||
        tickInterval 2millisecond
 | 
			
		||||
        excludes     weekends
 | 
			
		||||
 | 
			
		||||
        section Section
 | 
			
		||||
        A task           : a1, 000, 6ms
 | 
			
		||||
        Another task     : after a1, 6ms
 | 
			
		||||
        section Another
 | 
			
		||||
        Task in sec      : a2, 006, 3ms
 | 
			
		||||
        another task     : 3ms
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render a gantt diagram with tick is 2 seconds', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      gantt
 | 
			
		||||
        title A Gantt Diagram
 | 
			
		||||
        dateFormat   ss
 | 
			
		||||
        axisFormat   %Ss
 | 
			
		||||
        tickInterval 2second
 | 
			
		||||
        excludes     weekends
 | 
			
		||||
 | 
			
		||||
        section Section
 | 
			
		||||
        A task           : a1, 00, 6s
 | 
			
		||||
        Another task     : after a1, 6s
 | 
			
		||||
        section Another
 | 
			
		||||
        Task in sec      : 06, 3s
 | 
			
		||||
        another task     : 3s
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render a gantt diagram with tick is 15 minutes', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
@@ -548,53 +478,6 @@ describe('Gantt diagram', () => {
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  // TODO: fix it
 | 
			
		||||
  //
 | 
			
		||||
  // This test is skipped deliberately
 | 
			
		||||
  // because it fails and blocks our development pipeline
 | 
			
		||||
  // It was added as an attempt to fix gantt performance issues
 | 
			
		||||
  //
 | 
			
		||||
  // https://github.com/mermaid-js/mermaid/issues/3274
 | 
			
		||||
  //
 | 
			
		||||
  it.skip('should render a gantt diagram with very large intervals, skipping excludes if interval > 5 years', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gantt
 | 
			
		||||
        title A long Gantt Diagram
 | 
			
		||||
        dateFormat   YYYY-MM-DD
 | 
			
		||||
        axisFormat   %m-%d
 | 
			
		||||
        tickInterval 1day
 | 
			
		||||
        excludes     weekends
 | 
			
		||||
        section Section
 | 
			
		||||
        A task           : a1, 9999-10-01, 30d
 | 
			
		||||
        Another task     : after a1, 20d
 | 
			
		||||
        section Another
 | 
			
		||||
        Task in sec      : 2022-10-20, 12d
 | 
			
		||||
        another task     : 24d
 | 
			
		||||
      `
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('should render a gantt diagram exculding friday and saturday', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gantt
 | 
			
		||||
      title A Gantt Diagram
 | 
			
		||||
      dateFormat  YYYY-MM-DD
 | 
			
		||||
      excludes weekends
 | 
			
		||||
      weekend friday
 | 
			
		||||
      section Section1
 | 
			
		||||
      A task :a1, 2024-02-28, 10d`
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('should render a gantt diagram exculding saturday and sunday', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gantt
 | 
			
		||||
      title A Gantt Diagram
 | 
			
		||||
      dateFormat  YYYY-MM-DD
 | 
			
		||||
      excludes weekends
 | 
			
		||||
      weekend saturday
 | 
			
		||||
      section Section1
 | 
			
		||||
      A task :a1, 2024-02-28, 10d`
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('should render when compact is true', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
@@ -629,106 +512,4 @@ describe('Gantt diagram', () => {
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it("should render when there's a semicolon in the title", () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      gantt
 | 
			
		||||
      title ;Gantt With a Semicolon in the Title
 | 
			
		||||
      dateFormat  YYYY-MM-DD
 | 
			
		||||
      section Section
 | 
			
		||||
      A task           :a1, 2014-01-01, 30d
 | 
			
		||||
      Another task     :after a1  , 20d
 | 
			
		||||
      section Another
 | 
			
		||||
      Task in sec      :2014-01-12  , 12d
 | 
			
		||||
      another task      : 24d
 | 
			
		||||
    `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it("should render when there's a semicolon in a section is true", () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      gantt
 | 
			
		||||
      title Gantt Digram
 | 
			
		||||
      dateFormat  YYYY-MM-DD
 | 
			
		||||
      section ;Section With a Semicolon
 | 
			
		||||
      A task           :a1, 2014-01-01, 30d
 | 
			
		||||
      Another task     :after a1  , 20d
 | 
			
		||||
      section Another
 | 
			
		||||
      Task in sec      :2014-01-12  , 12d
 | 
			
		||||
      another task      : 24d
 | 
			
		||||
    `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it("should render when there's a semicolon in the task data", () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      gantt
 | 
			
		||||
      title Gantt Digram
 | 
			
		||||
      dateFormat  YYYY-MM-DD
 | 
			
		||||
      section Section
 | 
			
		||||
      ;A task with a semiclon           :a1, 2014-01-01, 30d
 | 
			
		||||
      Another task     :after a1  , 20d
 | 
			
		||||
      section Another
 | 
			
		||||
      Task in sec      :2014-01-12  , 12d
 | 
			
		||||
      another task      : 24d
 | 
			
		||||
    `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it("should render when there's a hashtag in the title", () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      gantt
 | 
			
		||||
      title #Gantt With a Hashtag in the Title
 | 
			
		||||
      dateFormat  YYYY-MM-DD
 | 
			
		||||
      section Section
 | 
			
		||||
      A task           :a1, 2014-01-01, 30d
 | 
			
		||||
      Another task     :after a1  , 20d
 | 
			
		||||
      section Another
 | 
			
		||||
      Task in sec      :2014-01-12  , 12d
 | 
			
		||||
      another task      : 24d
 | 
			
		||||
    `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it("should render when there's a hashtag in a section is true", () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      gantt
 | 
			
		||||
      title Gantt Digram
 | 
			
		||||
      dateFormat  YYYY-MM-DD
 | 
			
		||||
      section #Section With a Hashtag
 | 
			
		||||
      A task           :a1, 2014-01-01, 30d
 | 
			
		||||
      Another task     :after a1  , 20d
 | 
			
		||||
      section Another
 | 
			
		||||
      Task in sec      :2014-01-12  , 12d
 | 
			
		||||
      another task      : 24d
 | 
			
		||||
    `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it("should render when there's a hashtag in the task data", () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      gantt
 | 
			
		||||
      title Gantt Digram
 | 
			
		||||
      dateFormat  YYYY-MM-DD
 | 
			
		||||
      section Section
 | 
			
		||||
      #A task with a hashtag           :a1, 2014-01-01, 30d
 | 
			
		||||
      Another task     :after a1  , 20d
 | 
			
		||||
      section Another
 | 
			
		||||
      Task in sec      :2014-01-12  , 12d
 | 
			
		||||
      another task      : 24d
 | 
			
		||||
    `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,7 @@ describe('Git Graph diagram', () => {
 | 
			
		||||
      `gitGraph
 | 
			
		||||
       commit id: "Normal Commit"
 | 
			
		||||
       commit id: "Reverse Commit" type: REVERSE
 | 
			
		||||
       commit id: "Highlight Commit" type: HIGHLIGHT
 | 
			
		||||
       commit id: "Hightlight Commit" type: HIGHLIGHT
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
@@ -36,7 +36,7 @@ describe('Git Graph diagram', () => {
 | 
			
		||||
      `gitGraph
 | 
			
		||||
       commit id: "Normal Commit with tag" tag: "v1.0.0"
 | 
			
		||||
       commit id: "Reverse Commit with tag" type: REVERSE tag: "RC_1"
 | 
			
		||||
       commit id: "Highlight Commit" type: HIGHLIGHT  tag: "8.8.4"
 | 
			
		||||
       commit id: "Hightlight Commit" type: HIGHLIGHT  tag: "8.8.4"
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
@@ -102,7 +102,7 @@ describe('Git Graph diagram', () => {
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('8: should render a simple gitgraph with more than 8 branches &  overriding variables', () => {
 | 
			
		||||
  it('8: should render a simple gitgraph with more than 8 branchs &  overriding variables', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': {
 | 
			
		||||
        'gitBranchLabel0': '#ffffff',
 | 
			
		||||
@@ -358,7 +358,7 @@ gitGraph
 | 
			
		||||
      `gitGraph TB:
 | 
			
		||||
       commit id: "Normal Commit"
 | 
			
		||||
       commit id: "Reverse Commit" type: REVERSE
 | 
			
		||||
       commit id: "Highlight Commit" type: HIGHLIGHT
 | 
			
		||||
       commit id: "Hightlight Commit" type: HIGHLIGHT
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
@@ -368,7 +368,7 @@ gitGraph
 | 
			
		||||
      `gitGraph TB:
 | 
			
		||||
       commit id: "Normal Commit with tag" tag: "v1.0.0"
 | 
			
		||||
       commit id: "Reverse Commit with tag" type: REVERSE tag: "RC_1"
 | 
			
		||||
       commit id: "Highlight Commit" type: HIGHLIGHT  tag: "8.8.4"
 | 
			
		||||
       commit id: "Hightlight Commit" type: HIGHLIGHT  tag: "8.8.4"
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
@@ -434,7 +434,7 @@ gitGraph
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('22: should render a simple gitgraph with more than 8 branches &  overriding variables | Vertical Branch', () => {
 | 
			
		||||
  it('22: should render a simple gitgraph with more than 8 branchs &  overriding variables | Vertical Branch', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': {
 | 
			
		||||
        'gitBranchLabel0': '#ffffff',
 | 
			
		||||
@@ -701,836 +701,4 @@ gitGraph TB:
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('34: should render a simple gitgraph with two branches from same commit', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
      branch feature-001
 | 
			
		||||
      commit id:"3-abcdefg"
 | 
			
		||||
      commit id:"4-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      branch feature-002
 | 
			
		||||
      commit id:"5-abcdefg"
 | 
			
		||||
      checkout feature-001
 | 
			
		||||
      merge feature-002
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('35: should render a simple gitgraph with two branches from same commit | Vertical Branch', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph TB:
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
      branch feature-001
 | 
			
		||||
      commit id:"3-abcdefg"
 | 
			
		||||
      commit id:"4-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      branch feature-002
 | 
			
		||||
      commit id:"5-abcdefg"
 | 
			
		||||
      checkout feature-001
 | 
			
		||||
      merge feature-002
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('36: should render GitGraph with branch that is not used immediately', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph LR:
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
      branch x
 | 
			
		||||
      checkout main
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
      checkout x
 | 
			
		||||
      commit id:"3-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      merge x
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('37: should render GitGraph with branch that is not used immediately | Vertical Branch', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph TB:
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
      branch x
 | 
			
		||||
      checkout main
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
      checkout x
 | 
			
		||||
      commit id:"3-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      merge x
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('38: should render GitGraph with branch and sub-branch neither of which used immediately', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph LR:
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
      branch x
 | 
			
		||||
      checkout main
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
      checkout x
 | 
			
		||||
      commit id:"3-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      merge x
 | 
			
		||||
      checkout x
 | 
			
		||||
      branch y
 | 
			
		||||
      checkout x
 | 
			
		||||
      commit id:"4-abcdefg"
 | 
			
		||||
      checkout y
 | 
			
		||||
      commit id:"5-abcdefg"
 | 
			
		||||
      checkout x
 | 
			
		||||
      merge y
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('39: should render GitGraph with branch and sub-branch neither of which used immediately | Vertical Branch', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph TB:
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
      branch x
 | 
			
		||||
      checkout main
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
      checkout x
 | 
			
		||||
      commit id:"3-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      merge x
 | 
			
		||||
      checkout x
 | 
			
		||||
      branch y
 | 
			
		||||
      checkout x
 | 
			
		||||
      commit id:"4-abcdefg"
 | 
			
		||||
      checkout y
 | 
			
		||||
      commit id:"5-abcdefg"
 | 
			
		||||
      checkout x
 | 
			
		||||
      merge y
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('40: should render a simple gitgraph with cherry pick merge commit', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph
 | 
			
		||||
      commit id: "ZERO"
 | 
			
		||||
      branch feature
 | 
			
		||||
      branch release
 | 
			
		||||
      checkout feature
 | 
			
		||||
      commit id: "A"
 | 
			
		||||
      commit id: "B"
 | 
			
		||||
      checkout main
 | 
			
		||||
      merge feature id: "M"
 | 
			
		||||
      checkout release
 | 
			
		||||
      cherry-pick id: "M" parent:"B"`
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('41: should render default GitGraph with parallelCommits set to false', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
      branch develop
 | 
			
		||||
      commit id:"3-abcdefg"
 | 
			
		||||
      commit id:"4-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      branch feature
 | 
			
		||||
      commit id:"5-abcdefg"
 | 
			
		||||
      commit id:"6-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      commit id:"7-abcdefg"
 | 
			
		||||
      commit id:"8-abcdefg"
 | 
			
		||||
      `,
 | 
			
		||||
      { gitGraph: { parallelCommits: false } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('42: should render GitGraph with parallel commits', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
      branch develop
 | 
			
		||||
      commit id:"3-abcdefg"
 | 
			
		||||
      commit id:"4-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      branch feature
 | 
			
		||||
      commit id:"5-abcdefg"
 | 
			
		||||
      commit id:"6-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      commit id:"7-abcdefg"
 | 
			
		||||
      commit id:"8-abcdefg"
 | 
			
		||||
      `,
 | 
			
		||||
      { gitGraph: { parallelCommits: true } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('43: should render GitGraph with parallel commits | Vertical Branch', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph TB:
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
      branch develop
 | 
			
		||||
      commit id:"3-abcdefg"
 | 
			
		||||
      commit id:"4-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      branch feature
 | 
			
		||||
      commit id:"5-abcdefg"
 | 
			
		||||
      commit id:"6-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      commit id:"7-abcdefg"
 | 
			
		||||
      commit id:"8-abcdefg"
 | 
			
		||||
      `,
 | 
			
		||||
      { gitGraph: { parallelCommits: true } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('44: should render GitGraph with unconnected branches and no parallel commits', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph
 | 
			
		||||
      branch dev
 | 
			
		||||
      branch v2
 | 
			
		||||
      branch feat
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      commit id:"3-abcdefg"
 | 
			
		||||
      checkout dev
 | 
			
		||||
      commit id:"4-abcdefg"
 | 
			
		||||
      checkout v2
 | 
			
		||||
      commit id:"5-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      commit id:"6-abcdefg"
 | 
			
		||||
      `,
 | 
			
		||||
      { gitGraph: { parallelCommits: false } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('45: should render GitGraph with unconnected branches and parallel commits', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph
 | 
			
		||||
      branch dev
 | 
			
		||||
      branch v2
 | 
			
		||||
      branch feat
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      commit id:"3-abcdefg"
 | 
			
		||||
      checkout dev
 | 
			
		||||
      commit id:"4-abcdefg"
 | 
			
		||||
      checkout v2
 | 
			
		||||
      commit id:"5-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      commit id:"6-abcdefg"
 | 
			
		||||
      `,
 | 
			
		||||
      { gitGraph: { parallelCommits: true } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('46: should render GitGraph with unconnected branches and parallel commits | Vertical Branch', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph TB:
 | 
			
		||||
      branch dev
 | 
			
		||||
      branch v2
 | 
			
		||||
      branch feat
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      commit id:"3-abcdefg"
 | 
			
		||||
      checkout dev
 | 
			
		||||
      commit id:"4-abcdefg"
 | 
			
		||||
      checkout v2
 | 
			
		||||
      commit id:"5-abcdefg"
 | 
			
		||||
      checkout main
 | 
			
		||||
      commit id:"6-abcdefg"
 | 
			
		||||
      `,
 | 
			
		||||
      { gitGraph: { parallelCommits: true } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('46: should render GitGraph with merge back and merge forward', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph LR:
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
 | 
			
		||||
      branch branch-A
 | 
			
		||||
      branch branch-B
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
 | 
			
		||||
      checkout branch-A
 | 
			
		||||
      merge branch-B
 | 
			
		||||
 | 
			
		||||
      checkout branch-B
 | 
			
		||||
      merge branch-A
 | 
			
		||||
      `,
 | 
			
		||||
      { gitGraph: { parallelCommits: true } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('47: should render GitGraph with merge back and merge forward | Vertical Branch', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph TB:
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
 | 
			
		||||
      branch branch-A
 | 
			
		||||
      branch branch-B
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
 | 
			
		||||
      checkout branch-A
 | 
			
		||||
      merge branch-B
 | 
			
		||||
 | 
			
		||||
      checkout branch-B
 | 
			
		||||
      merge branch-A
 | 
			
		||||
      `,
 | 
			
		||||
      { gitGraph: { parallelCommits: true } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('48: should render GitGraph with merge on a new branch | Vertical Branch', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph LR:
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
 | 
			
		||||
      branch branch-B order: 2
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
 | 
			
		||||
      branch branch-A
 | 
			
		||||
      merge main
 | 
			
		||||
 | 
			
		||||
      checkout branch-B
 | 
			
		||||
      merge branch-A
 | 
			
		||||
      `,
 | 
			
		||||
      { gitGraph: { parallelCommits: true } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('49: should render GitGraph with merge on a new branch | Vertical Branch', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `gitGraph TB:
 | 
			
		||||
      commit id:"1-abcdefg"
 | 
			
		||||
 | 
			
		||||
      branch branch-B order: 2
 | 
			
		||||
      commit id:"2-abcdefg"
 | 
			
		||||
 | 
			
		||||
      branch branch-A
 | 
			
		||||
      merge main
 | 
			
		||||
 | 
			
		||||
      checkout branch-B
 | 
			
		||||
      merge branch-A
 | 
			
		||||
      `,
 | 
			
		||||
      { gitGraph: { parallelCommits: true } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  describe('Git-Graph Bottom-to-Top Orientation Tests', () => {
 | 
			
		||||
    it('50: should render a simple gitgraph with commit on main branch | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `gitGraph BT:
 | 
			
		||||
         commit id: "1"
 | 
			
		||||
         commit id: "2"
 | 
			
		||||
         commit id: "3"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('51: should render a simple gitgraph with commit on main branch with Id | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `gitGraph BT:
 | 
			
		||||
         commit id: "One"
 | 
			
		||||
         commit id: "Two"
 | 
			
		||||
         commit id: "Three"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('52: should render a simple gitgraph with different commitTypes on main branch | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `gitGraph BT:
 | 
			
		||||
         commit id: "Normal Commit"
 | 
			
		||||
         commit id: "Reverse Commit" type: REVERSE
 | 
			
		||||
         commit id: "Highlight Commit" type: HIGHLIGHT
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('53: should render a simple gitgraph with tags commitTypes on main branch | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `gitGraph BT:
 | 
			
		||||
         commit id: "Normal Commit with tag" tag: "v1.0.0"
 | 
			
		||||
         commit id: "Reverse Commit with tag" type: REVERSE tag: "RC_1"
 | 
			
		||||
         commit id: "Highlight Commit" type: HIGHLIGHT  tag: "8.8.4"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('54: should render a simple gitgraph with two branches | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `gitGraph BT:
 | 
			
		||||
         commit id: "1"
 | 
			
		||||
         commit id: "2"
 | 
			
		||||
         branch develop
 | 
			
		||||
         checkout develop
 | 
			
		||||
         commit id: "3"
 | 
			
		||||
         commit id: "4"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id: "5"
 | 
			
		||||
         commit id: "6"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('55: should render a simple gitgraph with two branches and merge commit | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `gitGraph BT:
 | 
			
		||||
         commit id: "1"
 | 
			
		||||
         commit id: "2"
 | 
			
		||||
         branch develop
 | 
			
		||||
         checkout develop
 | 
			
		||||
         commit id: "3"
 | 
			
		||||
         commit id: "4"
 | 
			
		||||
         checkout main
 | 
			
		||||
         merge develop
 | 
			
		||||
         commit id: "5"
 | 
			
		||||
         commit id: "6"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('56: should render a simple gitgraph with three branches and tagged merge commit | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `gitGraph BT:
 | 
			
		||||
         commit id: "1"
 | 
			
		||||
         commit id: "2"
 | 
			
		||||
         branch nice_feature
 | 
			
		||||
         checkout nice_feature
 | 
			
		||||
         commit id: "3"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id: "4"
 | 
			
		||||
         checkout nice_feature
 | 
			
		||||
         branch very_nice_feature
 | 
			
		||||
         checkout very_nice_feature
 | 
			
		||||
         commit id: "5"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id: "6"
 | 
			
		||||
         checkout nice_feature
 | 
			
		||||
         commit id: "7"
 | 
			
		||||
         checkout main
 | 
			
		||||
         merge nice_feature id: "12345" tag: "my merge commit"
 | 
			
		||||
         checkout very_nice_feature
 | 
			
		||||
         commit id: "8"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id: "9"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('57: should render a simple gitgraph with more than 8 branches &  overriding variables | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': {
 | 
			
		||||
          'gitBranchLabel0': '#ffffff',
 | 
			
		||||
          'gitBranchLabel1': '#ffffff',
 | 
			
		||||
          'gitBranchLabel2': '#ffffff',
 | 
			
		||||
          'gitBranchLabel3': '#ffffff',
 | 
			
		||||
          'gitBranchLabel4': '#ffffff',
 | 
			
		||||
          'gitBranchLabel5': '#ffffff',
 | 
			
		||||
          'gitBranchLabel6': '#ffffff',
 | 
			
		||||
          'gitBranchLabel7': '#ffffff',
 | 
			
		||||
    } } }%%
 | 
			
		||||
    gitGraph BT:
 | 
			
		||||
      checkout main
 | 
			
		||||
      branch branch1
 | 
			
		||||
      branch branch2
 | 
			
		||||
      branch branch3
 | 
			
		||||
      branch branch4
 | 
			
		||||
      branch branch5
 | 
			
		||||
      branch branch6
 | 
			
		||||
      branch branch7
 | 
			
		||||
      branch branch8
 | 
			
		||||
      branch branch9
 | 
			
		||||
      checkout branch1
 | 
			
		||||
      commit id: "1"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('58: should render a simple gitgraph with rotated labels | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'gitGraph': {
 | 
			
		||||
          'rotateCommitLabel': true
 | 
			
		||||
    } } }%%
 | 
			
		||||
          gitGraph BT:
 | 
			
		||||
          commit id: "75f7219e83b321cd3fdde7dcf83bc7c1000a6828"
 | 
			
		||||
          commit id: "0db4784daf82736dec4569e0dc92980d328c1f2e"
 | 
			
		||||
          commit id: "7067e9973f9eaa6cd4a4b723c506d1eab598e83e"
 | 
			
		||||
          commit id: "66972321ad6c199013b5b31f03b3a86fa3f9817d"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('59: should render a simple gitgraph with horizontal labels | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'gitGraph': {
 | 
			
		||||
          'rotateCommitLabel': false
 | 
			
		||||
    } } }%%
 | 
			
		||||
          gitGraph BT:
 | 
			
		||||
          commit id: "Alpha"
 | 
			
		||||
          commit id: "Beta"
 | 
			
		||||
          commit id: "Gamma"
 | 
			
		||||
          commit id: "Delta"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('60: should render a simple gitgraph with cherry pick commit | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `
 | 
			
		||||
      gitGraph BT:
 | 
			
		||||
         commit id: "ZERO"
 | 
			
		||||
         branch develop
 | 
			
		||||
         commit id:"A"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id:"ONE"
 | 
			
		||||
         checkout develop
 | 
			
		||||
         commit id:"B"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id:"TWO"
 | 
			
		||||
         cherry-pick id:"A"
 | 
			
		||||
         commit id:"THREE"
 | 
			
		||||
         checkout develop
 | 
			
		||||
         commit id:"C"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('61: should render a gitgraph with cherry pick commit with custom tag | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `
 | 
			
		||||
      gitGraph BT:
 | 
			
		||||
         commit id: "ZERO"
 | 
			
		||||
         branch develop
 | 
			
		||||
         commit id:"A"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id:"ONE"
 | 
			
		||||
         checkout develop
 | 
			
		||||
         commit id:"B"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id:"TWO"
 | 
			
		||||
         cherry-pick id:"A" tag: "snapshot"
 | 
			
		||||
         commit id:"THREE"
 | 
			
		||||
         checkout develop
 | 
			
		||||
         commit id:"C"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('62: should render a gitgraph with cherry pick commit with no tag | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `
 | 
			
		||||
      gitGraph BT:
 | 
			
		||||
         commit id: "ZERO"
 | 
			
		||||
         branch develop
 | 
			
		||||
         commit id:"A"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id:"ONE"
 | 
			
		||||
         checkout develop
 | 
			
		||||
         commit id:"B"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id:"TWO"
 | 
			
		||||
         cherry-pick id:"A" tag: ""
 | 
			
		||||
         commit id:"THREE"
 | 
			
		||||
         checkout develop
 | 
			
		||||
         commit id:"C"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('63: should render a simple gitgraph with two cherry pick commit | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `
 | 
			
		||||
      gitGraph BT:
 | 
			
		||||
         commit id: "ZERO"
 | 
			
		||||
         branch develop
 | 
			
		||||
         commit id:"A"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id:"ONE"
 | 
			
		||||
         checkout develop
 | 
			
		||||
         commit id:"B"
 | 
			
		||||
         branch featureA
 | 
			
		||||
         commit id:"FIX"
 | 
			
		||||
         commit id: "FIX-2"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id:"TWO"
 | 
			
		||||
         cherry-pick id:"A"
 | 
			
		||||
         commit id:"THREE"
 | 
			
		||||
         cherry-pick id:"FIX"
 | 
			
		||||
         checkout develop
 | 
			
		||||
         commit id:"C"
 | 
			
		||||
         merge featureA
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('64: should render commits for more than 8 branches | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `
 | 
			
		||||
        gitGraph BT:
 | 
			
		||||
        checkout main
 | 
			
		||||
        %% Make sure to manually set the ID of all commits, for consistent visual tests
 | 
			
		||||
        commit id: "1-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        branch branch1
 | 
			
		||||
        commit id: "2-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        merge branch1
 | 
			
		||||
        branch branch2
 | 
			
		||||
        commit id: "3-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        merge branch2
 | 
			
		||||
        branch branch3
 | 
			
		||||
        commit id: "4-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        merge branch3
 | 
			
		||||
        branch branch4
 | 
			
		||||
        commit id: "5-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        merge branch4
 | 
			
		||||
        branch branch5
 | 
			
		||||
        commit id: "6-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        merge branch5
 | 
			
		||||
        branch branch6
 | 
			
		||||
        commit id: "7-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        merge branch6
 | 
			
		||||
        branch branch7
 | 
			
		||||
        commit id: "8-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        merge branch7
 | 
			
		||||
        branch branch8
 | 
			
		||||
        commit id: "9-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        merge branch8
 | 
			
		||||
        branch branch9
 | 
			
		||||
        commit id: "10-abcdefg"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('65: should render a simple gitgraph with three branches,custom merge commit id,tag,type | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `gitGraph BT:
 | 
			
		||||
         commit id: "1"
 | 
			
		||||
         commit id: "2"
 | 
			
		||||
         branch nice_feature
 | 
			
		||||
         checkout nice_feature
 | 
			
		||||
         commit id: "3"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id: "4"
 | 
			
		||||
         checkout nice_feature
 | 
			
		||||
         branch very_nice_feature
 | 
			
		||||
         checkout very_nice_feature
 | 
			
		||||
         commit id: "5"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id: "6"
 | 
			
		||||
         checkout nice_feature
 | 
			
		||||
         commit id: "7"
 | 
			
		||||
         checkout main
 | 
			
		||||
         merge nice_feature id: "customID" tag: "customTag" type: REVERSE
 | 
			
		||||
         checkout very_nice_feature
 | 
			
		||||
         commit id: "8"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id: "9"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('66: should render a simple gitgraph with a title | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `---
 | 
			
		||||
  title: simple gitGraph
 | 
			
		||||
  ---
 | 
			
		||||
  gitGraph BT:
 | 
			
		||||
    commit id: "1-abcdefg"
 | 
			
		||||
  `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('67: should render a simple gitgraph overlapping commits | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `gitGraph BT:
 | 
			
		||||
         commit id:"s1"
 | 
			
		||||
         commit id:"s2"
 | 
			
		||||
         branch branch1
 | 
			
		||||
         commit id:"s3"
 | 
			
		||||
         commit id:"s4"
 | 
			
		||||
         checkout main
 | 
			
		||||
         commit id:"s5"
 | 
			
		||||
         checkout branch1
 | 
			
		||||
         commit id:"s6"
 | 
			
		||||
         commit id:"s7"
 | 
			
		||||
         merge main
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('68: should render a simple gitgraph with two branches from same commit | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `gitGraph BT:
 | 
			
		||||
        commit id:"1-abcdefg"
 | 
			
		||||
        commit id:"2-abcdefg"
 | 
			
		||||
        branch feature-001
 | 
			
		||||
        commit id:"3-abcdefg"
 | 
			
		||||
        commit id:"4-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        branch feature-002
 | 
			
		||||
        commit id:"5-abcdefg"
 | 
			
		||||
        checkout feature-001
 | 
			
		||||
        merge feature-002
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('69: should render GitGraph with branch that is not used immediately | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `gitGraph BT:
 | 
			
		||||
        commit id:"1-abcdefg"
 | 
			
		||||
        branch x
 | 
			
		||||
        checkout main
 | 
			
		||||
        commit id:"2-abcdefg"
 | 
			
		||||
        checkout x
 | 
			
		||||
        commit id:"3-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        merge x
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('70: should render GitGraph with branch and sub-branch neither of which used immediately | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `gitGraph BT:
 | 
			
		||||
        commit id:"1-abcdefg"
 | 
			
		||||
        branch x
 | 
			
		||||
        checkout main
 | 
			
		||||
        commit id:"2-abcdefg"
 | 
			
		||||
        checkout x
 | 
			
		||||
        commit id:"3-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        merge x
 | 
			
		||||
        checkout x
 | 
			
		||||
        branch y
 | 
			
		||||
        checkout x
 | 
			
		||||
        commit id:"4-abcdefg"
 | 
			
		||||
        checkout y
 | 
			
		||||
        commit id:"5-abcdefg"
 | 
			
		||||
        checkout x
 | 
			
		||||
        merge y
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('71: should render GitGraph with parallel commits | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `gitGraph BT:
 | 
			
		||||
        commit id:"1-abcdefg"
 | 
			
		||||
        commit id:"2-abcdefg"
 | 
			
		||||
        branch develop
 | 
			
		||||
        commit id:"3-abcdefg"
 | 
			
		||||
        commit id:"4-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        branch feature
 | 
			
		||||
        commit id:"5-abcdefg"
 | 
			
		||||
        commit id:"6-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        commit id:"7-abcdefg"
 | 
			
		||||
        commit id:"8-abcdefg"
 | 
			
		||||
        `,
 | 
			
		||||
        { gitGraph: { parallelCommits: true } }
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('72: should render GitGraph with unconnected branches and parallel commits | Vertical Branch - Bottom-to-top', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `gitGraph BT:
 | 
			
		||||
        branch dev
 | 
			
		||||
        branch v2
 | 
			
		||||
        branch feat
 | 
			
		||||
        commit id:"1-abcdefg"
 | 
			
		||||
        commit id:"2-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        commit id:"3-abcdefg"
 | 
			
		||||
        checkout dev
 | 
			
		||||
        commit id:"4-abcdefg"
 | 
			
		||||
        checkout v2
 | 
			
		||||
        commit id:"5-abcdefg"
 | 
			
		||||
        checkout main
 | 
			
		||||
        commit id:"6-abcdefg"
 | 
			
		||||
        `,
 | 
			
		||||
        { gitGraph: { parallelCommits: true } }
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('73: should render a simple gitgraph with three branches and tagged merge commit using switch instead of checkout', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `gitGraph
 | 
			
		||||
         commit id: "1"
 | 
			
		||||
         commit id: "2"
 | 
			
		||||
         branch nice_feature
 | 
			
		||||
         switch nice_feature
 | 
			
		||||
         commit id: "3"
 | 
			
		||||
         switch main
 | 
			
		||||
         commit id: "4"
 | 
			
		||||
         switch nice_feature
 | 
			
		||||
         branch very_nice_feature
 | 
			
		||||
         switch very_nice_feature
 | 
			
		||||
         commit id: "5"
 | 
			
		||||
         switch main
 | 
			
		||||
         commit id: "6"
 | 
			
		||||
         switch nice_feature
 | 
			
		||||
         commit id: "7"
 | 
			
		||||
         switch main
 | 
			
		||||
         merge nice_feature id: "12345" tag: "my merge commit"
 | 
			
		||||
         switch very_nice_feature
 | 
			
		||||
         commit id: "8"
 | 
			
		||||
         switch main
 | 
			
		||||
         commit id: "9"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
    it('74: should render commits for more than 8 branches using switch instead of checkout', () => {
 | 
			
		||||
      imgSnapshotTest(
 | 
			
		||||
        `
 | 
			
		||||
        gitGraph
 | 
			
		||||
        switch main
 | 
			
		||||
        %% Make sure to manually set the ID of all commits, for consistent visual tests
 | 
			
		||||
        commit id: "1-abcdefg"
 | 
			
		||||
        switch main
 | 
			
		||||
        branch branch1
 | 
			
		||||
        commit id: "2-abcdefg"
 | 
			
		||||
        switch main
 | 
			
		||||
        merge branch1
 | 
			
		||||
        branch branch2
 | 
			
		||||
        commit id: "3-abcdefg"
 | 
			
		||||
        switch main
 | 
			
		||||
        merge branch2
 | 
			
		||||
        branch branch3
 | 
			
		||||
        commit id: "4-abcdefg"
 | 
			
		||||
        switch main
 | 
			
		||||
        merge branch3
 | 
			
		||||
        branch branch4
 | 
			
		||||
        commit id: "5-abcdefg"
 | 
			
		||||
        switch main
 | 
			
		||||
        merge branch4
 | 
			
		||||
        branch branch5
 | 
			
		||||
        commit id: "6-abcdefg"
 | 
			
		||||
        switch main
 | 
			
		||||
        merge branch5
 | 
			
		||||
        branch branch6
 | 
			
		||||
        commit id: "7-abcdefg"
 | 
			
		||||
        switch main
 | 
			
		||||
        merge branch6
 | 
			
		||||
        branch branch7
 | 
			
		||||
        commit id: "8-abcdefg"
 | 
			
		||||
        switch main
 | 
			
		||||
        merge branch7
 | 
			
		||||
        branch branch8
 | 
			
		||||
        commit id: "9-abcdefg"
 | 
			
		||||
        switch main
 | 
			
		||||
        merge branch8
 | 
			
		||||
        branch branch9
 | 
			
		||||
        commit id: "10-abcdefg"
 | 
			
		||||
        `,
 | 
			
		||||
        {}
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -1,36 +0,0 @@
 | 
			
		||||
import { imgSnapshotTest } from '../../helpers/util';
 | 
			
		||||
 | 
			
		||||
describe('Katex', () => {
 | 
			
		||||
  it('1: should render a complex Katex flowchart no htmlLabels', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `graph LR
 | 
			
		||||
      A["$$f(\\relax{x}) = \\int_{-\\infty}^\\infty \\hat{f}(\\xi)\\,e^{2 \\pi i \\xi x}\\,d\\xi$$"] -->|"$$\\Bigg(\\bigg(\\Big(\\big((\\frac{-b\\pm\\sqrt{b^2-4ac}}{2a})\\big)\\Big)\\bigg)\\Bigg)$$"| B("$$1+\\frac{e^{-2\\pi}} {1+\\frac{e^{-4\\pi}} {1+\\frac{e^{-6\\pi}} {1+\\frac{e^{-8\\pi}} {1+\\cdots}}}}$$")
 | 
			
		||||
      A -->|"$$\\overbrace{a+b+c}^{\\text{note}}$$"| C("$$\\phase{-78^\\circ}$$")
 | 
			
		||||
      B --> D("$$x = \\begin{cases} a &\\text{if } b \\\\ c &\\text{if } d \\end{cases}$$")
 | 
			
		||||
      C --> E("$$x(t)=c_1\\begin{bmatrix}-\\cos{t}+\\sin{t}\\\\ 2\\cos{t} \\end{bmatrix}e^{2t}$$")`,
 | 
			
		||||
      { fontFamily: 'courier' }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('2: should render a Katex flowchart containing the Greek alphabet', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `graph LR
 | 
			
		||||
      A["$$\\alpha\\beta\\gamma\\delta\\epsilon\\zeta\\eta\\theta\\iota\\kappa\\lambda\\mu\\nu\\xi\\omicron\\pi\\rho\\sigma\\tau\\upsilon\\phi\\chi\\psi\\omega$$"] --> B["$$\\Alpha\\Beta\\Gamma\\Delta\\Epsilon\\Zeta\\Eta\\Theta\\Iota\\Kappa\\Lambda\\Mu\\Nu\\Xi\\Omicron\\Pi\\Rho\\Sigma\\Tau\\Upsilon\\Phi\\Chi\\Psi\\Omega$$"]`,
 | 
			
		||||
      { fontFamily: 'courier' }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  it('3: should render a Katex flowchart containing set theory symbols', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `graph LR
 | 
			
		||||
      A["$$\\forall\\complement\\therefore\\emptyset\\exists\\subset\\because\\empty\\exist\\supset\\mapsto\\varnothing\\nexists\\mid\\to\\implies\\in\\land\\gets\\impliedby\\isin\\lor\\leftrightarrow\\iff\\notin\\ni\\notni\\lnot$$"] --> B["$$\\nabla\\Im\\Reals\\jmath\\partial\\image\\wp\\aleph\\Game\\weierp\\alef\\Finv\\N\\Z\\alefsym\\cnums\\natnums\\beth\\Complex\\R\\gimel\\ell\\Re\\daleth\\hbar\\real\\eth\\hslash\\reals$$"]`,
 | 
			
		||||
      { fontFamily: 'courier' }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
  // TODO: changes made to develop between Feb 13 - Feb 23 cause this test to no longer function
 | 
			
		||||
  // it.skip('4: should render an error box originating from Katex', () => {
 | 
			
		||||
  //   imgSnapshotTest(
 | 
			
		||||
  //     `graph LR
 | 
			
		||||
  //     A["$$\\shouldBeError$$"]`,
 | 
			
		||||
  //     { fontFamily: 'courier' }
 | 
			
		||||
  //   );
 | 
			
		||||
  // });
 | 
			
		||||
});
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
import { urlSnapshotTest } from '../../helpers/util.ts';
 | 
			
		||||
 | 
			
		||||
describe('Marker Unique IDs Per Diagram', () => {
 | 
			
		||||
  it('should render a blue arrow tip in second digram', () => {
 | 
			
		||||
    urlSnapshotTest('http://localhost:9000/marker_unique_id.html', {
 | 
			
		||||
      logLevel: 1,
 | 
			
		||||
      flowchart: { htmlLabels: false },
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
@@ -1,67 +0,0 @@
 | 
			
		||||
import { imgSnapshotTest } from '../../helpers/util';
 | 
			
		||||
 | 
			
		||||
describe('packet structure', () => {
 | 
			
		||||
  it('should render a simple packet diagram', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `packet-beta
 | 
			
		||||
  title Hello world
 | 
			
		||||
  0-10: "hello"
 | 
			
		||||
`
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render a complex packet diagram', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `packet-beta
 | 
			
		||||
        0-15: "Source Port"
 | 
			
		||||
        16-31: "Destination Port"
 | 
			
		||||
        32-63: "Sequence Number"
 | 
			
		||||
        64-95: "Acknowledgment Number"
 | 
			
		||||
        96-99: "Data Offset"
 | 
			
		||||
        100-105: "Reserved"
 | 
			
		||||
        106: "URG"
 | 
			
		||||
        107: "ACK"
 | 
			
		||||
        108: "PSH"
 | 
			
		||||
        109: "RST"
 | 
			
		||||
        110: "SYN"
 | 
			
		||||
        111: "FIN"
 | 
			
		||||
        112-127: "Window"
 | 
			
		||||
        128-143: "Checksum"
 | 
			
		||||
        144-159: "Urgent Pointer"
 | 
			
		||||
        160-191: "(Options and Padding)"
 | 
			
		||||
        192-223: "data"
 | 
			
		||||
      `
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render a complex packet diagram with showBits false', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      ---
 | 
			
		||||
      title: "Packet Diagram"
 | 
			
		||||
      config:
 | 
			
		||||
        packet:
 | 
			
		||||
          showBits: false
 | 
			
		||||
      ---
 | 
			
		||||
      packet-beta
 | 
			
		||||
        0-15: "Source Port"
 | 
			
		||||
        16-31: "Destination Port"
 | 
			
		||||
        32-63: "Sequence Number"
 | 
			
		||||
        64-95: "Acknowledgment Number"
 | 
			
		||||
        96-99: "Data Offset"
 | 
			
		||||
        100-105: "Reserved"
 | 
			
		||||
        106: "URG"
 | 
			
		||||
        107: "ACK"
 | 
			
		||||
        108: "PSH"
 | 
			
		||||
        109: "RST"
 | 
			
		||||
        110: "SYN"
 | 
			
		||||
        111: "FIN"
 | 
			
		||||
        112-127: "Window"
 | 
			
		||||
        128-143: "Checksum"
 | 
			
		||||
        144-159: "Urgent Pointer"
 | 
			
		||||
        160-191: "(Options and Padding)"
 | 
			
		||||
        192-223: "data"
 | 
			
		||||
      `
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
@@ -1,85 +1,89 @@
 | 
			
		||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts';
 | 
			
		||||
 | 
			
		||||
describe('pie chart', () => {
 | 
			
		||||
describe('Pie Chart', () => {
 | 
			
		||||
  it('should render a simple pie diagram', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `pie title Sports in Sweden
 | 
			
		||||
        "Bandy": 40
 | 
			
		||||
        "Ice-Hockey": 80
 | 
			
		||||
        "Football": 90
 | 
			
		||||
      `
 | 
			
		||||
    pie title Sports in Sweden
 | 
			
		||||
       "Bandy" : 40
 | 
			
		||||
       "Ice-Hockey" : 80
 | 
			
		||||
       "Football" : 90
 | 
			
		||||
      `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render a simple pie diagram with long labels', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `pie title NETFLIX
 | 
			
		||||
        "Time spent looking for movie": 90
 | 
			
		||||
        "Time spent watching it": 10
 | 
			
		||||
      `
 | 
			
		||||
      pie title NETFLIX
 | 
			
		||||
         "Time spent looking for movie" : 90
 | 
			
		||||
         "Time spent watching it" : 10
 | 
			
		||||
        `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render a simple pie diagram with capital letters for labels', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `pie title What Voldemort doesn't have?
 | 
			
		||||
        "FRIENDS": 2
 | 
			
		||||
        "FAMILY": 3
 | 
			
		||||
        "NOSE": 45
 | 
			
		||||
      `
 | 
			
		||||
      pie title What Voldemort doesn't have?
 | 
			
		||||
         "FRIENDS" : 2
 | 
			
		||||
         "FAMILY" : 3
 | 
			
		||||
         "NOSE" : 45
 | 
			
		||||
        `,
 | 
			
		||||
      {}
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render a pie diagram when useMaxWidth is true (default)', () => {
 | 
			
		||||
    renderGraph(
 | 
			
		||||
      `pie title Sports in Sweden
 | 
			
		||||
        "Bandy": 40
 | 
			
		||||
        "Ice-Hockey": 80
 | 
			
		||||
        "Football": 90
 | 
			
		||||
      `
 | 
			
		||||
    pie title Sports in Sweden
 | 
			
		||||
       "Bandy" : 40
 | 
			
		||||
       "Ice-Hockey" : 80
 | 
			
		||||
       "Football" : 90
 | 
			
		||||
      `,
 | 
			
		||||
      { pie: { useMaxWidth: true } }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg').should((svg) => {
 | 
			
		||||
      expect(svg).to.have.attr('width', '100%');
 | 
			
		||||
      // expect(svg).to.have.attr('height');
 | 
			
		||||
      // const height = parseFloat(svg.attr('height'));
 | 
			
		||||
      // expect(height).to.eq(450);
 | 
			
		||||
      const style = svg.attr('style');
 | 
			
		||||
      expect(style).to.match(/^max-width: [\d.]+px;$/);
 | 
			
		||||
      const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
 | 
			
		||||
      expect(maxWidthValue).to.be.within(590, 600); // depends on installed fonts: 596.2 on my PC, 597.5 on CI
 | 
			
		||||
      expect(maxWidthValue).to.eq(984);
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render a pie diagram when useMaxWidth is false', () => {
 | 
			
		||||
    renderGraph(
 | 
			
		||||
      `pie title Sports in Sweden
 | 
			
		||||
        "Bandy": 40
 | 
			
		||||
        "Ice-Hockey": 80
 | 
			
		||||
        "Football": 90
 | 
			
		||||
      `
 | 
			
		||||
    pie title Sports in Sweden
 | 
			
		||||
       "Bandy" : 40
 | 
			
		||||
       "Ice-Hockey" : 80
 | 
			
		||||
       "Football" : 90
 | 
			
		||||
      `,
 | 
			
		||||
      { pie: { useMaxWidth: false } }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg').should((svg) => {
 | 
			
		||||
      // const height = parseFloat(svg.attr('height'));
 | 
			
		||||
      const width = parseFloat(svg.attr('width'));
 | 
			
		||||
      expect(width).to.be.within(590, 600); // depends on installed fonts: 596.2 on my PC, 597.5 on CI
 | 
			
		||||
      // expect(height).to.eq(450);
 | 
			
		||||
      expect(width).to.eq(984);
 | 
			
		||||
      expect(svg).to.not.have.attr('style');
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render a pie diagram when textPosition is setted', () => {
 | 
			
		||||
  it('should render a pie diagram when textPosition is set', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `pie
 | 
			
		||||
        "Dogs": 50
 | 
			
		||||
        "Cats": 25
 | 
			
		||||
      `,
 | 
			
		||||
      `
 | 
			
		||||
        pie
 | 
			
		||||
          "Dogs": 50
 | 
			
		||||
          "Cats": 25
 | 
			
		||||
        `,
 | 
			
		||||
      { logLevel: 1, pie: { textPosition: 0.9 } }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render a pie diagram with showData', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `pie showData
 | 
			
		||||
        "Dogs": 50
 | 
			
		||||
        "Cats": 25
 | 
			
		||||
      `
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user