mirror of
				https://github.com/mermaid-js/mermaid.git
				synced 2025-10-31 02:44:17 +01:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			5237-unifi
			...
			sidv/class
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 345b75cc0e | ||
|   | 0ebea7744b | 
| @@ -22,9 +22,4 @@ export const packageOptions = { | ||||
|     packageName: 'mermaid-zenuml', | ||||
|     file: 'detector.ts', | ||||
|   }, | ||||
|   'mermaid-layout-elk': { | ||||
|     name: 'mermaid-layout-elk', | ||||
|     packageName: 'mermaid-layout-elk', | ||||
|     file: 'layouts.ts', | ||||
|   }, | ||||
| } as const; | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| import jison from 'jison'; | ||||
|  | ||||
| export const transformJison = (src: string): string => { | ||||
|   // @ts-ignore - Jison is not typed properly | ||||
|   const parser = new jison.Generator(src, { | ||||
|     moduleType: 'js', | ||||
|     'token-stack': true, | ||||
|   | ||||
| @@ -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, | ||||
|   | ||||
							
								
								
									
										9
									
								
								.build/langium-cli.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								.build/langium-cli.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| declare module 'langium-cli' { | ||||
|   export interface GenerateOptions { | ||||
|     file?: string; | ||||
|     mode?: 'development' | 'production'; | ||||
|     watch?: boolean; | ||||
|   } | ||||
|  | ||||
|   export function generate(options: GenerateOptions): Promise<boolean>; | ||||
| } | ||||
| @@ -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,142 +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 | ||||
| DAGA | ||||
| 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 | ||||
| roughjs | ||||
| 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,72 +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 | ||||
| roughjs | ||||
| rscratch | ||||
| sparkline | ||||
| sphinxcontrib | ||||
| ssim | ||||
| stylis | ||||
| Swimm | ||||
| tsbuildinfo | ||||
| Tuleap | ||||
| Typora | ||||
| unocss | ||||
| unplugin | ||||
| unstub | ||||
| vite | ||||
| vitest | ||||
| Zune | ||||
| @@ -1,41 +0,0 @@ | ||||
| Adamiecki | ||||
| arrowend | ||||
| bmatrix | ||||
| braintree | ||||
| catmull | ||||
| compositTitleSize | ||||
| doublecircle | ||||
| elems | ||||
| gantt | ||||
| gitgraph | ||||
| gzipped | ||||
| handdrawn | ||||
| knsv | ||||
| Knut | ||||
| marginx | ||||
| marginy | ||||
| Markdownish | ||||
| mermaidjs | ||||
| mindmap | ||||
| mindmaps | ||||
| mrtree | ||||
| multigraph | ||||
| nodesep | ||||
| NOTEGROUP | ||||
| Pinterest | ||||
| rankdir | ||||
| ranksep | ||||
| rect | ||||
| rects | ||||
| sandboxed | ||||
| siebling | ||||
| statediagram | ||||
| substate | ||||
| Sveidqvist | ||||
| unfixable | ||||
| Viewbox | ||||
| viewports | ||||
| visio | ||||
| vitepress | ||||
| xlink | ||||
| xychart | ||||
| @@ -1,4 +0,0 @@ | ||||
| circo | ||||
| handdrawnSeed | ||||
| neato | ||||
| newbranch | ||||
| @@ -1,14 +1,14 @@ | ||||
| import { build } from 'esbuild'; | ||||
| import { mkdir, writeFile } from 'node:fs/promises'; | ||||
| import { MermaidBuildOptions, defaultOptions, 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: MermaidBuildOptions = { ...defaultOptions, entryName } as const; | ||||
|   const buildConfigs: MermaidBuildOptions[] = [ | ||||
|   const commonOptions = { ...defaultOptions, entryName } as const; | ||||
|   const buildConfigs = [ | ||||
|     // package.mjs | ||||
|     { ...commonOptions }, | ||||
|     // package.min.mjs | ||||
| @@ -56,7 +56,7 @@ 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 | ||||
|   // it should build `parser` before `mermaid` because it's a dependecy | ||||
|   for (const pkg of packageNames) { | ||||
|     await buildPackage(pkg).catch(handler); | ||||
|   } | ||||
|   | ||||
| @@ -5,25 +5,38 @@ import { getBuildConfig, defaultOptions } 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 parserCtx = await context( | ||||
|   getBuildConfig({ ...defaultOptions, minify: false, core: false, entryName: 'parser' }) | ||||
| ); | ||||
| 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 mermaidCtx = await context( | ||||
|   getBuildConfig({ ...defaultOptions, minify: false, core: false, entryName: 'mermaid' }) | ||||
| ); | ||||
| const mermaidIIFECtx = await context( | ||||
|   getBuildConfig({ | ||||
|     ...defaultOptions, | ||||
|     minify: false, | ||||
|     core: false, | ||||
|     entryName: 'mermaid', | ||||
|     format: 'iife', | ||||
|   }) | ||||
| ); | ||||
| const externalCtx = await context( | ||||
|   getBuildConfig({ | ||||
|     ...defaultOptions, | ||||
|     minify: false, | ||||
|     core: false, | ||||
|     entryName: 'mermaid-example-diagram', | ||||
|   }) | ||||
| ); | ||||
| const zenumlCtx = await context( | ||||
|   getBuildConfig({ ...defaultOptions, minify: false, core: false, entryName: 'mermaid-zenuml' }) | ||||
| ); | ||||
| const contexts = [parserCtx, mermaidCtx, mermaidIIFECtx, externalCtx, zenumlCtx]; | ||||
|  | ||||
| const rebuildAll = async () => { | ||||
|   console.time('Rebuild time'); | ||||
|   await Promise.all(contexts.map((ctx) => ctx.rebuild())).catch((e) => console.error(e)); | ||||
|   await Promise.all(contexts.map((ctx) => ctx.rebuild())); | ||||
|   console.timeEnd('Rebuild time'); | ||||
| }; | ||||
|  | ||||
| @@ -88,9 +101,10 @@ async function createServer() { | ||||
|  | ||||
|   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/parser/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,7 +8,7 @@ import { jisonPlugin } from './jisonPlugin.js'; | ||||
|  | ||||
| const __dirname = fileURLToPath(new URL('.', import.meta.url)); | ||||
|  | ||||
| export interface MermaidBuildOptions extends BuildOptions { | ||||
| export interface MermaidBuildOptions { | ||||
|   minify: boolean; | ||||
|   core: boolean; | ||||
|   metafile: boolean; | ||||
| @@ -65,9 +65,6 @@ export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => { | ||||
|     minify, | ||||
|     logLevel: 'info', | ||||
|     chunkNames: `chunks/${outFileName}/[name]-[hash]`, | ||||
|     define: { | ||||
|       'import.meta.vitest': 'undefined', | ||||
|     }, | ||||
|   }); | ||||
|  | ||||
|   if (core) { | ||||
|   | ||||
| @@ -1 +0,0 @@ | ||||
| .gitignore | ||||
							
								
								
									
										11
									
								
								.eslintignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								.eslintignore
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| dist/** | ||||
| .github/** | ||||
| docs/Setup.md | ||||
| cypress.config.js | ||||
| cypress/plugins/index.js | ||||
| coverage | ||||
| *.json | ||||
| node_modules | ||||
|  | ||||
| # autogenereated by langium-cli | ||||
| generated/ | ||||
| @@ -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', | ||||
|   ], | ||||
| @@ -49,11 +49,8 @@ module.exports = { | ||||
|     '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 +61,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 +146,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 | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/release-drafter.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/release-drafter.yml
									
									
									
									
										vendored
									
									
								
							| @@ -25,6 +25,8 @@ categories: | ||||
| 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 | ||||
|   | ||||
							
								
								
									
										11
									
								
								.github/workflows/lint.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.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: | | ||||
|   | ||||
							
								
								
									
										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 | ||||
|   | ||||
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -35,7 +35,7 @@ cypress/snapshots/ | ||||
| .tsbuildinfo | ||||
| tsconfig.tsbuildinfo | ||||
|  | ||||
| #knsv*.html | ||||
| knsv*.html | ||||
| local*.html | ||||
| stats/ | ||||
|  | ||||
| @@ -47,8 +47,6 @@ stats/ | ||||
| demos/dev/** | ||||
| !/demos/dev/example.html | ||||
| !/demos/dev/reload.js | ||||
| tsx-0/** | ||||
| vite.config.ts.timestamp-* | ||||
|  | ||||
| # 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,10 +10,6 @@ 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 | ||||
| # TODO: Lots of errors to fix | ||||
| cypress/platform/state-refactor.html | ||||
|   | ||||
| @@ -3,6 +3,5 @@ | ||||
|   "printWidth": 100, | ||||
|   "singleQuote": true, | ||||
|   "useTabs": false, | ||||
|   "tabWidth": 2, | ||||
|   "trailingComma": "es5" | ||||
|   "tabWidth": 2 | ||||
| } | ||||
|   | ||||
| @@ -74,9 +74,6 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions) | ||||
|         output, | ||||
|       }, | ||||
|     }, | ||||
|     define: { | ||||
|       'import.meta.vitest': 'undefined', | ||||
|     }, | ||||
|     resolve: { | ||||
|       extensions: [], | ||||
|     }, | ||||
|   | ||||
| @@ -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,10 @@ 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/parser/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/intro/getting-started.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/intro/getting-started.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, | ||||
| }; | ||||
							
								
								
									
										8
									
								
								__mocks__/pieRenderer.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								__mocks__/pieRenderer.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| /** | ||||
|  * Mocked pie (picChart) diagram renderer | ||||
|  */ | ||||
| import { vi } from 'vitest'; | ||||
|  | ||||
| const draw = vi.fn().mockImplementation(() => ''); | ||||
|  | ||||
| export const renderer = { 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'"}`, | ||||
| }); | ||||
							
								
								
									
										205
									
								
								cSpell.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										205
									
								
								cSpell.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,205 @@ | ||||
| { | ||||
|   "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", | ||||
|     "frontmatter", | ||||
|     "ftplugin", | ||||
|     "gantt", | ||||
|     "gitea", | ||||
|     "gitgraph", | ||||
|     "globby", | ||||
|     "graphlib", | ||||
|     "graphviz", | ||||
|     "grav", | ||||
|     "greywolf", | ||||
|     "gzipped", | ||||
|     "huynh", | ||||
|     "huynhicode", | ||||
|     "iife", | ||||
|     "inkdrop", | ||||
|     "jaoude", | ||||
|     "jgreywolf", | ||||
|     "jison", | ||||
|     "jiti", | ||||
|     "kaufmann", | ||||
|     "khroma", | ||||
|     "klemm", | ||||
|     "klink", | ||||
|     "knsv", | ||||
|     "knut", | ||||
|     "knutsveidqvist", | ||||
|     "laganeckas", | ||||
|     "langium", | ||||
|     "linetype", | ||||
|     "lintstagedrc", | ||||
|     "logmsg", | ||||
|     "lucida", | ||||
|     "markdownish", | ||||
|     "matthieu", | ||||
|     "matthieumorel", | ||||
|     "mdast", | ||||
|     "mdbook", | ||||
|     "mermaidjs", | ||||
|     "mermerd", | ||||
|     "metafile", | ||||
|     "mindaugas", | ||||
|     "mindmap", | ||||
|     "mindmaps", | ||||
|     "mitigations", | ||||
|     "mkdocs", | ||||
|     "mmorel", | ||||
|     "mult", | ||||
|     "neurodiverse", | ||||
|     "nextra", | ||||
|     "nikolay", | ||||
|     "nirname", | ||||
|     "npmjs", | ||||
|     "orlandoni", | ||||
|     "outdir", | ||||
|     "pathe", | ||||
|     "pbrolin", | ||||
|     "phpbb", | ||||
|     "plantuml", | ||||
|     "playfair", | ||||
|     "pnpm", | ||||
|     "podlite", | ||||
|     "quence", | ||||
|     "radious", | ||||
|     "ranksep", | ||||
|     "rect", | ||||
|     "rects", | ||||
|     "reda", | ||||
|     "redmine", | ||||
|     "regexes", | ||||
|     "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", | ||||
|     "zune" | ||||
|   ], | ||||
|   "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; | ||||
| } | ||||
|  | ||||
| @@ -25,7 +25,7 @@ const batchId: string = | ||||
|     : Cypress.env('CYPRESS_COMMIT') || Date.now().toString()); | ||||
|  | ||||
| export const mermaidUrl = ( | ||||
|   graphStr: string | string[], | ||||
|   graphStr: string, | ||||
|   options: CypressMermaidConfig, | ||||
|   api: boolean | ||||
| ): string => { | ||||
| @@ -52,21 +52,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 +82,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,14 +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'); | ||||
|   }); | ||||
|   it('should sanitize backticks block diagram labels properly', () => { | ||||
|     cy.visit('http://localhost:9000/xss25.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', () => { | ||||
| @@ -206,7 +206,8 @@ graph TD | ||||
|   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.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' } | ||||
|     ); | ||||
|   }); | ||||
| }); | ||||
| @@ -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" | ||||
|       ` | ||||
|     ); | ||||
|   }); | ||||
| }); | ||||
| @@ -44,7 +44,7 @@ describe('pie chart', () => { | ||||
|       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); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
| @@ -59,7 +59,7 @@ describe('pie chart', () => { | ||||
|     ); | ||||
|     cy.get('svg').should((svg) => { | ||||
|       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(width).to.eq(984); | ||||
|       expect(svg).to.not.have.attr('style'); | ||||
|     }); | ||||
|   }); | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user