mirror of
				https://github.com/mermaid-js/mermaid.git
				synced 2025-10-26 08:24:07 +01:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			sidv/testA
			...
			add-flowch
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 0b4f129220 | ||
|   | 5f8749418e | 
| @@ -1,30 +0,0 @@ | ||||
| /** | ||||
|  * Shared common options for both ESBuild and Vite | ||||
|  */ | ||||
| export const packageOptions = { | ||||
|   parser: { | ||||
|     name: 'mermaid-parser', | ||||
|     packageName: 'parser', | ||||
|     file: 'index.ts', | ||||
|   }, | ||||
|   mermaid: { | ||||
|     name: 'mermaid', | ||||
|     packageName: 'mermaid', | ||||
|     file: 'mermaid.ts', | ||||
|   }, | ||||
|   'mermaid-example-diagram': { | ||||
|     name: 'mermaid-example-diagram', | ||||
|     packageName: 'mermaid-example-diagram', | ||||
|     file: 'detector.ts', | ||||
|   }, | ||||
|   'mermaid-zenuml': { | ||||
|     name: 'mermaid-zenuml', | ||||
|     packageName: 'mermaid-zenuml', | ||||
|     file: 'detector.ts', | ||||
|   }, | ||||
|   'mermaid-flowchart-elk': { | ||||
|     name: 'mermaid-flowchart-elk', | ||||
|     packageName: 'mermaid-flowchart-elk', | ||||
|     file: 'detector.ts', | ||||
|   }, | ||||
| } as const; | ||||
| @@ -1,5 +0,0 @@ | ||||
| import { generate } from 'langium-cli'; | ||||
|  | ||||
| export async function generateLangium() { | ||||
|   await generate({ file: `./packages/parser/langium-config.json` }); | ||||
| } | ||||
| @@ -1,124 +0,0 @@ | ||||
| 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'; | ||||
|  | ||||
| /** | ||||
|  * All of the keys in the mermaid config that have a mermaid diagram config. | ||||
|  */ | ||||
| const MERMAID_CONFIG_DIAGRAM_KEYS = [ | ||||
|   'flowchart', | ||||
|   'sequence', | ||||
|   'gantt', | ||||
|   'journey', | ||||
|   'class', | ||||
|   'state', | ||||
|   'er', | ||||
|   'pie', | ||||
|   'quadrantChart', | ||||
|   'xyChart', | ||||
|   'requirement', | ||||
|   'mindmap', | ||||
|   'timeline', | ||||
|   'gitGraph', | ||||
|   'c4', | ||||
|   'sankey', | ||||
|   'block', | ||||
|   'packet', | ||||
| ] as const; | ||||
|  | ||||
| /** | ||||
|  * Generate default values from the JSON Schema. | ||||
|  * | ||||
|  * AJV does not support nested default values yet (or default values with $ref), | ||||
|  * so we need to manually find them (this may be fixed in ajv v9). | ||||
|  * | ||||
|  * @param mermaidConfigSchema - The Mermaid JSON Schema to use. | ||||
|  * @returns The default mermaid config object. | ||||
|  */ | ||||
| function generateDefaults(mermaidConfigSchema: JSONSchemaType<MermaidConfig>) { | ||||
|   const ajv = new Ajv2019({ | ||||
|     useDefaults: true, | ||||
|     allowUnionTypes: true, | ||||
|     strict: true, | ||||
|   }); | ||||
|  | ||||
|   ajv.addKeyword({ | ||||
|     keyword: 'meta:enum', // used by jsonschema2md | ||||
|     errors: false, | ||||
|   }); | ||||
|   ajv.addKeyword({ | ||||
|     keyword: 'tsType', // used by json-schema-to-typescript | ||||
|     errors: false, | ||||
|   }); | ||||
|  | ||||
|   // ajv currently doesn't support nested default values, see https://github.com/ajv-validator/ajv/issues/1718 | ||||
|   // (may be fixed in v9) so we need to manually use sub-schemas | ||||
|   const mermaidDefaultConfig = {}; | ||||
|  | ||||
|   assert.ok(mermaidConfigSchema.$defs); | ||||
|   const baseDiagramConfig = mermaidConfigSchema.$defs.BaseDiagramConfig; | ||||
|  | ||||
|   for (const key of MERMAID_CONFIG_DIAGRAM_KEYS) { | ||||
|     const subSchemaRef = mermaidConfigSchema.properties[key].$ref; | ||||
|     const [root, defs, defName] = subSchemaRef.split('/'); | ||||
|     assert.strictEqual(root, '#'); | ||||
|     assert.strictEqual(defs, '$defs'); | ||||
|     const subSchema = { | ||||
|       $schema: mermaidConfigSchema.$schema, | ||||
|       $defs: mermaidConfigSchema.$defs, | ||||
|       ...mermaidConfigSchema.$defs[defName], | ||||
|     } as JSONSchemaType<BaseDiagramConfig>; | ||||
|  | ||||
|     const validate = ajv.compile(subSchema); | ||||
|  | ||||
|     mermaidDefaultConfig[key] = {}; | ||||
|  | ||||
|     for (const required of subSchema.required ?? []) { | ||||
|       if (subSchema.properties[required] === undefined && baseDiagramConfig.properties[required]) { | ||||
|         mermaidDefaultConfig[key][required] = baseDiagramConfig.properties[required].default; | ||||
|       } | ||||
|     } | ||||
|     if (!validate(mermaidDefaultConfig[key])) { | ||||
|       throw new Error( | ||||
|         `schema for subconfig ${key} does not have valid defaults! Errors were ${JSON.stringify( | ||||
|           validate.errors, | ||||
|           undefined, | ||||
|           2 | ||||
|         )}` | ||||
|       ); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   const validate = ajv.compile(mermaidConfigSchema); | ||||
|  | ||||
|   if (!validate(mermaidDefaultConfig)) { | ||||
|     throw new Error( | ||||
|       `Mermaid config JSON Schema does not have valid defaults! Errors were ${JSON.stringify( | ||||
|         validate.errors, | ||||
|         undefined, | ||||
|         2 | ||||
|       )}` | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   return mermaidDefaultConfig; | ||||
| } | ||||
|  | ||||
| export const loadSchema = (src: string, filename: string): JSONSchemaType<MermaidConfig> => { | ||||
|   const jsonSchema = load(src, { | ||||
|     filename, | ||||
|     // only allow JSON types in our YAML doc (will probably be default in YAML 1.3) | ||||
|     // e.g. `true` will be parsed a boolean `true`, `True` will be parsed as string `"True"`. | ||||
|     schema: JSON_SCHEMA, | ||||
|   }) as JSONSchemaType<MermaidConfig>; | ||||
|   return jsonSchema; | ||||
| }; | ||||
|  | ||||
| export const getDefaults = (schema: JSONSchemaType<MermaidConfig>) => { | ||||
|   return `export default ${JSON.stringify(generateDefaults(schema), undefined, 2)};`; | ||||
| }; | ||||
|  | ||||
| export const getSchema = (schema: JSONSchemaType<MermaidConfig>) => { | ||||
|   return `export default ${JSON.stringify(schema, undefined, 2)};`; | ||||
| }; | ||||
| @@ -1,25 +0,0 @@ | ||||
| /* eslint-disable no-console */ | ||||
| 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`); | ||||
|     if (out.length > 0) { | ||||
|       console.log(out.toString()); | ||||
|     } | ||||
|   } catch (e) { | ||||
|     console.error(e); | ||||
|     if (e.stdout.length > 0) { | ||||
|       console.error(e.stdout.toString()); | ||||
|     } | ||||
|     if (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,143 +0,0 @@ | ||||
| # This file contains coding related terms | ||||
| ALPHANUM | ||||
| antiscript | ||||
| APPLYCLASS | ||||
| ARROWHEADSTYLE | ||||
| ARROWTYPE | ||||
| autonumber | ||||
| axisl-line | ||||
| Bigdecimal | ||||
| birel | ||||
| BIREL | ||||
| bqstring | ||||
| BQUOTE | ||||
| bramp | ||||
| BRKT | ||||
| brotli | ||||
| callbackargs | ||||
| callbackname | ||||
| classdef | ||||
| classdefid | ||||
| classentity | ||||
| classname | ||||
| COLONSEP | ||||
| COMPOSIT_STATE | ||||
| concat | ||||
| controlx | ||||
| controly | ||||
| CSSCLASS | ||||
| CYLINDEREND | ||||
| CYLINDERSTART | ||||
| datakey | ||||
| DEND | ||||
| descr | ||||
| distp | ||||
| distq | ||||
| divs | ||||
| docref | ||||
| DOMID | ||||
| doublecircle | ||||
| DOUBLECIRCLEEND | ||||
| DOUBLECIRCLESTART | ||||
| DQUOTE | ||||
| DSTART | ||||
| edgesep | ||||
| EMPTYSTR | ||||
| enddate | ||||
| ERDIAGRAM | ||||
| flatmap | ||||
| forwardable | ||||
| frontmatter | ||||
| funs | ||||
| gantt | ||||
| GENERICTYPE | ||||
| getBoundarys | ||||
| grammr | ||||
| graphtype | ||||
| iife | ||||
| interp | ||||
| introdcued | ||||
| INVTRAPEND | ||||
| INVTRAPSTART | ||||
| JDBC | ||||
| jison | ||||
| Kaufmann | ||||
| keyify | ||||
| LABELPOS | ||||
| LABELTYPE | ||||
| lcov | ||||
| LEFTOF | ||||
| Lexa | ||||
| linebreak | ||||
| LINETYPE | ||||
| LINKSTYLE | ||||
| LLABEL | ||||
| loglevel | ||||
| LOGMSG | ||||
| lookaheads | ||||
| mdast | ||||
| metafile | ||||
| minlen | ||||
| Mstartx | ||||
| MULT | ||||
| NODIR | ||||
| NSTR | ||||
| outdir | ||||
| Qcontrolx | ||||
| reinit | ||||
| rels | ||||
| reqs | ||||
| rewritelinks | ||||
| rgba | ||||
| RIGHTOF | ||||
| sankey | ||||
| sequencenumber | ||||
| shrc | ||||
| signaltype | ||||
| someclass | ||||
| SPACELINE | ||||
| SPACELIST | ||||
| STADIUMEND | ||||
| STADIUMSTART | ||||
| startdate | ||||
| startx | ||||
| starty | ||||
| STMNT | ||||
| stopx | ||||
| stopy | ||||
| strikethrough | ||||
| stringifying | ||||
| struct | ||||
| STYLECLASS | ||||
| STYLEOPTS | ||||
| subcomponent | ||||
| subcomponents | ||||
| subconfig | ||||
| SUBROUTINEEND | ||||
| SUBROUTINESTART | ||||
| Subschemas | ||||
| substr | ||||
| TAGEND | ||||
| TAGSTART | ||||
| techn | ||||
| TESTSTR | ||||
| TEXTDATA | ||||
| TEXTLENGTH | ||||
| titlevalue | ||||
| topbar | ||||
| TRAPEND | ||||
| TRAPSTART | ||||
| treemap | ||||
| ts-nocheck | ||||
| tsdoc | ||||
| typeof | ||||
| typestr | ||||
| unshift | ||||
| verifymethod | ||||
| VERIFYMTHD | ||||
| WARN_DOCSDIR_DOESNT_MATCH | ||||
| xhost | ||||
| yaxis | ||||
| yfunc | ||||
| yytext | ||||
| zenuml | ||||
| @@ -1,9 +0,0 @@ | ||||
| # Contributors to mermaidjs, one per line | ||||
| Ashish Jain | ||||
| cpettitt | ||||
| Dong Cai | ||||
| Nikolay Rozhkov | ||||
| Peng Xiao | ||||
| Per Brolin | ||||
| 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,74 +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 | ||||
| Doctave | ||||
| DokuWiki | ||||
| dompurify | ||||
| elkjs | ||||
| fontawesome | ||||
| Foswiki | ||||
| Gitea | ||||
| graphlib | ||||
| Grav | ||||
| iconify | ||||
| Inkdrop | ||||
| jiti | ||||
| jsdocs | ||||
| jsfiddle | ||||
| jsonschema | ||||
| katex | ||||
| khroma | ||||
| langium | ||||
| mathml | ||||
| matplotlib | ||||
| mdbook | ||||
| Mermerd | ||||
| mkdocs | ||||
| Nextra | ||||
| nodenext | ||||
| npmjs | ||||
| pageview | ||||
| pathe | ||||
| phpbb | ||||
| pixelmatch | ||||
| Podlite | ||||
| presetAttributify | ||||
| pyplot | ||||
| redmine | ||||
| rehype | ||||
| rscratch | ||||
| shiki | ||||
| sparkline | ||||
| sphinxcontrib | ||||
| ssim | ||||
| stylis | ||||
| Swimm | ||||
| tsbuildinfo | ||||
| tseslint | ||||
| Tuleap | ||||
| Typora | ||||
| unocss | ||||
| unplugin | ||||
| unstub | ||||
| vite | ||||
| vitest | ||||
| Zune | ||||
| @@ -1,39 +0,0 @@ | ||||
| Adamiecki | ||||
| arrowend | ||||
| bmatrix | ||||
| braintree | ||||
| catmull | ||||
| compositTitleSize | ||||
| doublecircle | ||||
| elems | ||||
| gantt | ||||
| gitgraph | ||||
| gzipped | ||||
| knsv | ||||
| Knut | ||||
| marginx | ||||
| marginy | ||||
| Markdownish | ||||
| mermaidjs | ||||
| mindmap | ||||
| mindmaps | ||||
| multigraph | ||||
| nodesep | ||||
| NOTEGROUP | ||||
| Pinterest | ||||
| rankdir | ||||
| ranksep | ||||
| rect | ||||
| rects | ||||
| sandboxed | ||||
| siebling | ||||
| statediagram | ||||
| substate | ||||
| Sveidqvist | ||||
| unfixable | ||||
| Viewbox | ||||
| viewports | ||||
| visio | ||||
| vitepress | ||||
| xlink | ||||
| xychart | ||||
| @@ -1,4 +0,0 @@ | ||||
| BRANDES | ||||
| handdrawn | ||||
| KOEPF | ||||
| newbranch | ||||
| @@ -1,67 +0,0 @@ | ||||
| import { build } from 'esbuild'; | ||||
| import { mkdir, writeFile } from 'node:fs/promises'; | ||||
| import { packageOptions } from '../.build/common.js'; | ||||
| import { generateLangium } from '../.build/generateLangium.js'; | ||||
| import type { MermaidBuildOptions } from './util.js'; | ||||
| import { defaultOptions, getBuildConfig } from './util.js'; | ||||
|  | ||||
| const shouldVisualize = process.argv.includes('--visualize'); | ||||
|  | ||||
| const buildPackage = async (entryName: keyof typeof packageOptions) => { | ||||
|   const commonOptions = { ...defaultOptions, entryName } as const; | ||||
|   const buildConfigs = [ | ||||
|     // package.mjs | ||||
|     { ...commonOptions }, | ||||
|     // package.min.mjs | ||||
|     { | ||||
|       ...commonOptions, | ||||
|       minify: true, | ||||
|       metafile: shouldVisualize, | ||||
|     }, | ||||
|     // package.core.mjs | ||||
|     { ...commonOptions, core: true }, | ||||
|   ]; | ||||
|  | ||||
|   if (entryName === 'mermaid') { | ||||
|     const iifeOptions: MermaidBuildOptions = { ...commonOptions, format: 'iife' }; | ||||
|     buildConfigs.push( | ||||
|       // mermaid.js | ||||
|       { ...iifeOptions }, | ||||
|       // mermaid.min.js | ||||
|       { ...iifeOptions, minify: true, metafile: shouldVisualize } | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   const results = await Promise.all(buildConfigs.map((option) => build(getBuildConfig(option)))); | ||||
|  | ||||
|   if (shouldVisualize) { | ||||
|     for (const { metafile } of results) { | ||||
|       if (!metafile?.outputs) { | ||||
|         continue; | ||||
|       } | ||||
|       const fileName = Object.keys(metafile.outputs) | ||||
|         .find((file) => !file.includes('chunks') && file.endsWith('js')) | ||||
|         .replace('dist/', ''); | ||||
|       // Upload metafile into https://esbuild.github.io/analyze/ | ||||
|       await writeFile(`stats/${fileName}.meta.json`, JSON.stringify(metafile)); | ||||
|     } | ||||
|   } | ||||
| }; | ||||
|  | ||||
| const handler = (e) => { | ||||
|   // eslint-disable-next-line no-console | ||||
|   console.error(e); | ||||
|   process.exit(1); | ||||
| }; | ||||
|  | ||||
| const main = async () => { | ||||
|   await generateLangium(); | ||||
|   await mkdir('stats', { recursive: true }); | ||||
|   const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[]; | ||||
|   // it should build `parser` before `mermaid` because it's a dependency | ||||
|   for (const pkg of packageNames) { | ||||
|     await buildPackage(pkg).catch(handler); | ||||
|   } | ||||
| }; | ||||
|  | ||||
| void main(); | ||||
| @@ -1,15 +0,0 @@ | ||||
| import { readFile } from 'node:fs/promises'; | ||||
| import { transformJison } from '../.build/jisonTransformer.js'; | ||||
| import type { Plugin } from 'esbuild'; | ||||
|  | ||||
| export const jisonPlugin: Plugin = { | ||||
|   name: 'jison', | ||||
|   setup(build) { | ||||
|     build.onLoad({ filter: /\.jison$/ }, async (args) => { | ||||
|       // Load the file from the file system | ||||
|       const source = await readFile(args.path, 'utf8'); | ||||
|       const contents = transformJison(source); | ||||
|       return { contents, warnings: [] }; | ||||
|     }); | ||||
|   }, | ||||
| }; | ||||
| @@ -1,35 +0,0 @@ | ||||
| import type { JSONSchemaType } from 'ajv/dist/2019.js'; | ||||
| import type { MermaidConfig } from '../packages/mermaid/src/config.type.js'; | ||||
| import { readFile } from 'node:fs/promises'; | ||||
| import { getDefaults, getSchema, loadSchema } from '../.build/jsonSchema.js'; | ||||
|  | ||||
| /** | ||||
|  * ESBuild plugin that handles JSON Schemas saved as a `.schema.yaml` file. | ||||
|  * | ||||
|  * Use `my-example.schema.yaml?only-defaults=true` to only load the default values. | ||||
|  */ | ||||
|  | ||||
| export const jsonSchemaPlugin = { | ||||
|   name: 'json-schema-plugin', | ||||
|   setup(build) { | ||||
|     let schema: JSONSchemaType<MermaidConfig> | undefined = undefined; | ||||
|     let content = ''; | ||||
|  | ||||
|     build.onLoad({ filter: /config\.schema\.yaml$/ }, async (args) => { | ||||
|       // Load the file from the file system | ||||
|       const source = await readFile(args.path, 'utf8'); | ||||
|       const resolvedSchema: JSONSchemaType<MermaidConfig> = | ||||
|         content === source && schema ? schema : loadSchema(source, args.path); | ||||
|       if (content !== source) { | ||||
|         content = source; | ||||
|         schema = resolvedSchema; | ||||
|       } | ||||
|       const contents = args.suffix.includes('only-defaults') | ||||
|         ? getDefaults(resolvedSchema) | ||||
|         : getSchema(resolvedSchema); | ||||
|       return { contents, warnings: [] }; | ||||
|     }); | ||||
|   }, | ||||
| }; | ||||
|  | ||||
| export default jsonSchemaPlugin; | ||||
| @@ -1,117 +0,0 @@ | ||||
| /* eslint-disable no-console */ | ||||
| import chokidar from 'chokidar'; | ||||
| import cors from 'cors'; | ||||
| import { context } from 'esbuild'; | ||||
| import type { Request, Response } from 'express'; | ||||
| import express from 'express'; | ||||
| import { packageOptions } from '../.build/common.js'; | ||||
| import { generateLangium } from '../.build/generateLangium.js'; | ||||
| import { defaultOptions, getBuildConfig } from './util.js'; | ||||
|  | ||||
| const configs = Object.values(packageOptions).map(({ packageName }) => | ||||
|   getBuildConfig({ ...defaultOptions, minify: false, core: false, entryName: packageName }) | ||||
| ); | ||||
| const mermaidIIFEConfig = getBuildConfig({ | ||||
|   ...defaultOptions, | ||||
|   minify: false, | ||||
|   core: false, | ||||
|   entryName: 'mermaid', | ||||
|   format: 'iife', | ||||
| }); | ||||
| configs.push(mermaidIIFEConfig); | ||||
|  | ||||
| const contexts = await Promise.all( | ||||
|   configs.map(async (config) => ({ config, context: await context(config) })) | ||||
| ); | ||||
|  | ||||
| let rebuildCounter = 1; | ||||
| const rebuildAll = async () => { | ||||
|   const buildNumber = rebuildCounter++; | ||||
|   const timeLabel = `Rebuild ${buildNumber} Time (total)`; | ||||
|   console.time(timeLabel); | ||||
|   await Promise.all( | ||||
|     contexts.map(async ({ config, context }) => { | ||||
|       const buildVariant = `Rebuild ${buildNumber} Time (${Object.keys(config.entryPoints!)[0]} ${config.format})`; | ||||
|       console.time(buildVariant); | ||||
|       await context.rebuild(); | ||||
|       console.timeEnd(buildVariant); | ||||
|     }) | ||||
|   ).catch((e) => console.error(e)); | ||||
|   console.timeEnd(timeLabel); | ||||
| }; | ||||
|  | ||||
| let clients: { id: number; response: Response }[] = []; | ||||
| function eventsHandler(request: Request, response: Response) { | ||||
|   const headers = { | ||||
|     'Content-Type': 'text/event-stream', | ||||
|     Connection: 'keep-alive', | ||||
|     'Cache-Control': 'no-cache', | ||||
|   }; | ||||
|   response.writeHead(200, headers); | ||||
|   const clientId = Date.now(); | ||||
|   clients.push({ | ||||
|     id: clientId, | ||||
|     response, | ||||
|   }); | ||||
|   request.on('close', () => { | ||||
|     clients = clients.filter((client) => client.id !== clientId); | ||||
|   }); | ||||
| } | ||||
|  | ||||
| let timeoutID: NodeJS.Timeout | undefined = undefined; | ||||
|  | ||||
| /** | ||||
|  * Debounce file change events to avoid rebuilding multiple times. | ||||
|  */ | ||||
| function handleFileChange() { | ||||
|   if (timeoutID !== undefined) { | ||||
|     clearTimeout(timeoutID); | ||||
|   } | ||||
|   // eslint-disable-next-line @typescript-eslint/no-misused-promises | ||||
|   timeoutID = setTimeout(async () => { | ||||
|     await rebuildAll(); | ||||
|     sendEventsToAll(); | ||||
|     timeoutID = undefined; | ||||
|   }, 100); | ||||
| } | ||||
|  | ||||
| function sendEventsToAll() { | ||||
|   clients.forEach(({ response }) => response.write(`data: ${Date.now()}\n\n`)); | ||||
| } | ||||
|  | ||||
| async function createServer() { | ||||
|   await generateLangium(); | ||||
|   handleFileChange(); | ||||
|   const app = express(); | ||||
|   chokidar | ||||
|     .watch('**/src/**/*.{js,ts,langium,yaml,json}', { | ||||
|       ignoreInitial: true, | ||||
|       ignored: [/node_modules/, /dist/, /docs/, /coverage/], | ||||
|     }) | ||||
|     // eslint-disable-next-line @typescript-eslint/no-misused-promises | ||||
|     .on('all', async (event, path) => { | ||||
|       // Ignore other events. | ||||
|       if (!['add', 'change'].includes(event)) { | ||||
|         return; | ||||
|       } | ||||
|       console.log(`${path} changed. Rebuilding...`); | ||||
|       if (path.endsWith('.langium')) { | ||||
|         await generateLangium(); | ||||
|       } | ||||
|       handleFileChange(); | ||||
|     }); | ||||
|  | ||||
|   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('demos')); | ||||
|   app.use(express.static('cypress/platform')); | ||||
|  | ||||
|   app.listen(9000, () => { | ||||
|     console.log(`Listening on http://localhost:9000`); | ||||
|   }); | ||||
| } | ||||
|  | ||||
| void createServer(); | ||||
							
								
								
									
										101
									
								
								.esbuild/util.ts
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								.esbuild/util.ts
									
									
									
									
									
								
							| @@ -1,101 +0,0 @@ | ||||
| import { resolve } from 'path'; | ||||
| import { fileURLToPath } from 'url'; | ||||
| import type { BuildOptions } from 'esbuild'; | ||||
| import { readFileSync } from 'fs'; | ||||
| import jsonSchemaPlugin from './jsonSchemaPlugin.js'; | ||||
| import { packageOptions } from '../.build/common.js'; | ||||
| import { jisonPlugin } from './jisonPlugin.js'; | ||||
|  | ||||
| const __dirname = fileURLToPath(new URL('.', import.meta.url)); | ||||
|  | ||||
| export interface MermaidBuildOptions { | ||||
|   minify: boolean; | ||||
|   core: boolean; | ||||
|   metafile: boolean; | ||||
|   format: 'esm' | 'iife'; | ||||
|   entryName: keyof typeof packageOptions; | ||||
| } | ||||
|  | ||||
| export const defaultOptions: Omit<MermaidBuildOptions, 'entryName'> = { | ||||
|   minify: false, | ||||
|   metafile: false, | ||||
|   core: false, | ||||
|   format: 'esm', | ||||
| } as const; | ||||
|  | ||||
| const buildOptions = (override: BuildOptions): BuildOptions => { | ||||
|   return { | ||||
|     bundle: true, | ||||
|     minify: true, | ||||
|     keepNames: true, | ||||
|     platform: 'browser', | ||||
|     tsconfig: 'tsconfig.json', | ||||
|     resolveExtensions: ['.ts', '.js', '.json', '.jison', '.yaml'], | ||||
|     external: ['require', 'fs', 'path'], | ||||
|     outdir: 'dist', | ||||
|     plugins: [jisonPlugin, jsonSchemaPlugin], | ||||
|     sourcemap: 'external', | ||||
|     ...override, | ||||
|   }; | ||||
| }; | ||||
|  | ||||
| const getFileName = (fileName: string, { core, format, minify }: MermaidBuildOptions) => { | ||||
|   if (core) { | ||||
|     fileName += '.core'; | ||||
|   } else if (format === 'esm') { | ||||
|     fileName += '.esm'; | ||||
|   } | ||||
|   if (minify) { | ||||
|     fileName += '.min'; | ||||
|   } | ||||
|   return fileName; | ||||
| }; | ||||
|  | ||||
| export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => { | ||||
|   const { core, entryName, metafile, format, minify } = options; | ||||
|   const external: string[] = ['require', 'fs', 'path']; | ||||
|   const { name, file, packageName } = packageOptions[entryName]; | ||||
|   const outFileName = getFileName(name, options); | ||||
|   const output: BuildOptions = buildOptions({ | ||||
|     absWorkingDir: resolve(__dirname, `../packages/${packageName}`), | ||||
|     entryPoints: { | ||||
|       [outFileName]: `src/${file}`, | ||||
|     }, | ||||
|     metafile, | ||||
|     minify, | ||||
|     logLevel: 'info', | ||||
|     chunkNames: `chunks/${outFileName}/[name]-[hash]`, | ||||
|     define: { | ||||
|       'import.meta.vitest': 'undefined', | ||||
|     }, | ||||
|   }); | ||||
|  | ||||
|   if (core) { | ||||
|     const { dependencies } = JSON.parse( | ||||
|       readFileSync(resolve(__dirname, `../packages/${packageName}/package.json`), 'utf-8') | ||||
|     ); | ||||
|     // Core build is used to generate file without bundled dependencies. | ||||
|     // This is used by downstream projects to bundle dependencies themselves. | ||||
|     // Ignore dependencies and any dependencies of dependencies | ||||
|     external.push(...Object.keys(dependencies)); | ||||
|     output.external = external; | ||||
|   } | ||||
|  | ||||
|   if (format === 'iife') { | ||||
|     output.format = 'iife'; | ||||
|     output.splitting = false; | ||||
|     output.globalName = '__esbuild_esm_mermaid'; | ||||
|     // Workaround for removing the .default access in esbuild IIFE. | ||||
|     // https://github.com/mermaid-js/mermaid/pull/4109#discussion_r1292317396 | ||||
|     output.footer = { | ||||
|       js: 'globalThis.mermaid = globalThis.__esbuild_esm_mermaid.default;', | ||||
|     }; | ||||
|     output.outExtension = { '.js': '.js' }; | ||||
|   } else { | ||||
|     output.format = 'esm'; | ||||
|     output.splitting = true; | ||||
|     output.outExtension = { '.js': '.mjs' }; | ||||
|   } | ||||
|  | ||||
|   return output; | ||||
| }; | ||||
							
								
								
									
										8
									
								
								.eslintignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.eslintignore
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| dist/** | ||||
| .github/** | ||||
| docs/Setup.md | ||||
| cypress.config.js | ||||
| cypress/plugins/index.js | ||||
| coverage | ||||
| *.json | ||||
| node_modules | ||||
							
								
								
									
										176
									
								
								.eslintrc.cjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								.eslintrc.cjs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | ||||
| module.exports = { | ||||
|   env: { | ||||
|     browser: true, | ||||
|     es6: true, | ||||
|     'jest/globals': true, | ||||
|     node: true, | ||||
|   }, | ||||
|   root: true, | ||||
|   parser: '@typescript-eslint/parser', | ||||
|   parserOptions: { | ||||
|     ecmaFeatures: { | ||||
|       experimentalObjectRestSpread: true, | ||||
|       jsx: true, | ||||
|     }, | ||||
|     tsconfigRootDir: __dirname, | ||||
|     sourceType: 'module', | ||||
|     ecmaVersion: 2020, | ||||
|     allowAutomaticSingleRunInference: true, | ||||
|     project: ['./tsconfig.eslint.json', './packages/*/tsconfig.json'], | ||||
|     parser: '@typescript-eslint/parser', | ||||
|   }, | ||||
|   extends: [ | ||||
|     'eslint:recommended', | ||||
|     'plugin:@typescript-eslint/recommended', | ||||
|     'plugin:json/recommended', | ||||
|     'plugin:markdown/recommended', | ||||
|     'plugin:@cspell/recommended', | ||||
|     'prettier', | ||||
|   ], | ||||
|   plugins: [ | ||||
|     '@typescript-eslint', | ||||
|     'no-only-tests', | ||||
|     'html', | ||||
|     'jest', | ||||
|     'jsdoc', | ||||
|     'json', | ||||
|     '@cspell', | ||||
|     'lodash', | ||||
|     'unicorn', | ||||
|   ], | ||||
|   ignorePatterns: [ | ||||
|     // this file is automatically generated by `pnpm run --filter mermaid types:build-config` | ||||
|     'packages/mermaid/src/config.type.ts', | ||||
|   ], | ||||
|   rules: { | ||||
|     curly: 'error', | ||||
|     'no-console': 'error', | ||||
|     'no-prototype-builtins': 'off', | ||||
|     'no-unused-vars': 'off', | ||||
|     'cypress/no-async-tests': 'off', | ||||
|     '@typescript-eslint/consistent-type-imports': 'error', | ||||
|     '@typescript-eslint/no-explicit-any': 'warn', | ||||
|     '@typescript-eslint/no-floating-promises': 'error', | ||||
|     '@typescript-eslint/no-misused-promises': 'error', | ||||
|     '@typescript-eslint/no-unused-vars': 'warn', | ||||
|     '@typescript-eslint/ban-ts-comment': [ | ||||
|       'error', | ||||
|       { | ||||
|         'ts-expect-error': 'allow-with-description', | ||||
|         'ts-ignore': 'allow-with-description', | ||||
|         'ts-nocheck': 'allow-with-description', | ||||
|         'ts-check': 'allow-with-description', | ||||
|         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: false, | ||||
|         checkStrings: false, | ||||
|         checkStringTemplates: false, | ||||
|       }, | ||||
|     ], | ||||
|     'no-empty': [ | ||||
|       'error', | ||||
|       { | ||||
|         allowEmptyCatch: true, | ||||
|       }, | ||||
|     ], | ||||
|     'no-only-tests/no-only-tests': 'error', | ||||
|     'lodash/import-scope': ['error', 'method'], | ||||
|     'unicorn/better-regex': 'error', | ||||
|     'unicorn/no-abusive-eslint-disable': 'error', | ||||
|     'unicorn/no-array-push-push': 'error', | ||||
|     'unicorn/no-for-loop': 'error', | ||||
|     'unicorn/no-instanceof-array': 'error', | ||||
|     'unicorn/no-typeof-undefined': 'error', | ||||
|     'unicorn/no-unnecessary-await': 'error', | ||||
|     'unicorn/no-unsafe-regex': 'warn', | ||||
|     'unicorn/no-useless-promise-resolve-reject': 'error', | ||||
|     'unicorn/prefer-array-find': 'error', | ||||
|     'unicorn/prefer-array-flat-map': 'error', | ||||
|     'unicorn/prefer-array-index-of': 'error', | ||||
|     'unicorn/prefer-array-some': 'error', | ||||
|     'unicorn/prefer-default-parameters': 'error', | ||||
|     'unicorn/prefer-includes': 'error', | ||||
|     'unicorn/prefer-negative-index': 'error', | ||||
|     'unicorn/prefer-object-from-entries': 'error', | ||||
|     'unicorn/prefer-string-starts-ends-with': 'error', | ||||
|     'unicorn/prefer-string-trim-start-end': 'error', | ||||
|     'unicorn/string-content': 'error', | ||||
|     'unicorn/prefer-spread': 'error', | ||||
|     'unicorn/no-lonely-if': 'error', | ||||
|   }, | ||||
|   overrides: [ | ||||
|     { | ||||
|       files: ['cypress/**', 'demos/**'], | ||||
|       rules: { | ||||
|         'no-console': 'off', | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       files: ['*.{js,jsx,mjs,cjs}'], | ||||
|       extends: ['plugin:jsdoc/recommended'], | ||||
|       rules: { | ||||
|         'jsdoc/check-indentation': 'off', | ||||
|         'jsdoc/check-alignment': 'off', | ||||
|         'jsdoc/check-line-alignment': 'off', | ||||
|         'jsdoc/multiline-blocks': 'off', | ||||
|         'jsdoc/newline-after-description': 'off', | ||||
|         'jsdoc/tag-lines': 'off', | ||||
|         'jsdoc/require-param-description': 'off', | ||||
|         'jsdoc/require-param-type': 'off', | ||||
|         'jsdoc/require-returns': 'off', | ||||
|         'jsdoc/require-returns-description': 'off', | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       files: ['*.{ts,tsx}'], | ||||
|       plugins: ['tsdoc'], | ||||
|       rules: { | ||||
|         'no-restricted-syntax': [ | ||||
|           'error', | ||||
|           { | ||||
|             selector: 'TSEnumDeclaration', | ||||
|             message: | ||||
|               'Prefer using TypeScript union types over TypeScript enum, since TypeScript enums have a bunch of issues, see https://dev.to/dvddpl/whats-the-problem-with-typescript-enums-2okj', | ||||
|           }, | ||||
|         ], | ||||
|         'tsdoc/syntax': 'error', | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       files: ['*.spec.{ts,js}', 'cypress/**', 'demos/**', '**/docs/**'], | ||||
|       rules: { | ||||
|         'jsdoc/require-jsdoc': 'off', | ||||
|         '@typescript-eslint/no-unused-vars': 'off', | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       files: ['*.html', '*.md', '**/*.md/*'], | ||||
|       rules: { | ||||
|         'no-var': 'error', | ||||
|         'no-undef': 'off', | ||||
|         '@typescript-eslint/no-unused-vars': 'off', | ||||
|         '@typescript-eslint/no-floating-promises': 'off', | ||||
|         '@typescript-eslint/no-misused-promises': 'off', | ||||
|       }, | ||||
|       parserOptions: { | ||||
|         project: null, | ||||
|       }, | ||||
|     }, | ||||
|   ], | ||||
| }; | ||||
							
								
								
									
										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 | ||||
|   | ||||
							
								
								
									
										11
									
								
								.github/lychee.toml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/lychee.toml
									
									
									
									
										vendored
									
									
								
							| @@ -35,16 +35,7 @@ exclude = [ | ||||
| '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", | ||||
|  | ||||
| # Drupal 403 | ||||
| "https://(www.)?drupal.org" | ||||
| "https://discord.gg" | ||||
| ] | ||||
|  | ||||
| # Exclude all private IPs from checking. | ||||
|   | ||||
							
								
								
									
										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/contributing.md#update-documentation) is used for all new features. | ||||
| - [ ] :bookmark: targeted `develop` branch | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/workflows/build-docs.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build-docs.yml
									
									
									
									
										vendored
									
									
								
							| @@ -18,7 +18,7 @@ jobs: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v4 | ||||
|  | ||||
|       - uses: pnpm/action-setup@v4 | ||||
|       - uses: pnpm/action-setup@v2 | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@v4 | ||||
|   | ||||
							
								
								
									
										6
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							| @@ -18,7 +18,7 @@ jobs: | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|  | ||||
|       - uses: pnpm/action-setup@v4 | ||||
|       - uses: pnpm/action-setup@v2 | ||||
|         # uses version from "packageManager" field in package.json | ||||
|  | ||||
|       - name: Setup Node.js | ||||
| @@ -37,13 +37,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 | ||||
|   | ||||
							
								
								
									
										6
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							| @@ -33,7 +33,7 @@ jobs: | ||||
|  | ||||
|       # 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 | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/workflows/dependency-review.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/dependency-review.yml
									
									
									
									
										vendored
									
									
								
							| @@ -17,4 +17,4 @@ jobs: | ||||
|       - name: 'Checkout Repository' | ||||
|         uses: actions/checkout@v4 | ||||
|       - name: 'Dependency Review' | ||||
|         uses: actions/dependency-review-action@v4 | ||||
|         uses: actions/dependency-review-action@v3 | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/workflows/e2e-applitools.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/e2e-applitools.yml
									
									
									
									
										vendored
									
									
								
							| @@ -32,7 +32,7 @@ jobs: | ||||
|  | ||||
|       - uses: actions/checkout@v4 | ||||
|  | ||||
|       - uses: pnpm/action-setup@v4 | ||||
|       - uses: pnpm/action-setup@v2 | ||||
|         # uses version from "packageManager" field in package.json | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|   | ||||
							
								
								
									
										127
									
								
								.github/workflows/e2e.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										127
									
								
								.github/workflows/e2e.yml
									
									
									
									
										vendored
									
									
								
							| @@ -1,3 +1,9 @@ | ||||
| # 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: | ||||
| @@ -11,20 +17,9 @@ 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 | ||||
|     }} | ||||
|   shouldRunParallel: ${{ secrets.CYPRESS_RECORD_KEY != '' && !(github.event_name == 'push' && github.ref == 'refs/heads/develop') }} | ||||
|   # For PRs and MergeQueues, the target commit is used, and for push events, github.event.previous is used. | ||||
|   targetHash: ${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || (github.event.before == '0000000000000000000000000000000000000000' && 'develop' || github.event.before)  }} | ||||
|  | ||||
| jobs: | ||||
|   cache: | ||||
|     runs-on: ubuntu-latest | ||||
| @@ -33,7 +28,7 @@ jobs: | ||||
|       options: --user 1001 | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|       - uses: pnpm/action-setup@v4 | ||||
|       - uses: pnpm/action-setup@v2 | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@v4 | ||||
|         with: | ||||
| @@ -53,19 +48,14 @@ jobs: | ||||
|         with: | ||||
|           ref: ${{ env.targetHash }} | ||||
|  | ||||
|       - name: Install dependencies | ||||
|       - name: Cypress run | ||||
|         uses: cypress-io/github-action@v4 | ||||
|         id: cypress-snapshot-gen | ||||
|         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 | ||||
|           start: pnpm run dev | ||||
|           wait-on: 'http://localhost:9000' | ||||
|           browser: chrome | ||||
|  | ||||
|   e2e: | ||||
|     runs-on: ubuntu-latest | ||||
| @@ -80,7 +70,7 @@ jobs: | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|  | ||||
|       - uses: pnpm/action-setup@v4 | ||||
|       - uses: pnpm/action-setup@v2 | ||||
|         # uses version from "packageManager" field in package.json | ||||
|  | ||||
|       - name: Setup Node.js | ||||
| @@ -91,53 +81,34 @@ jobs: | ||||
|       # These cached snapshots are downloaded, providing the reference snapshots. | ||||
|       - name: Cache snapshots | ||||
|         id: cache-snapshot | ||||
|         uses: actions/cache/restore@v4 | ||||
|         uses: actions/cache/restore@v3 | ||||
|         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" | ||||
|  | ||||
|       # 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.shouldRunParallel || ( matrix.containers == 1 ) }} | ||||
|         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: ${{ env.shouldRunParallel }} | ||||
|           parallel: ${{ env.shouldRunParallel }} | ||||
|           record: ${{ secrets.CYPRESS_RECORD_KEY != '' }} | ||||
|           parallel: ${{ secrets.CYPRESS_RECORD_KEY != '' }} | ||||
|         env: | ||||
|           CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} | ||||
|           VITEST_COVERAGE: true | ||||
|           CYPRESS_COMMIT: ${{ github.sha }} | ||||
|           ARGOS_TOKEN: ${{ secrets.ARGOS_TOKEN }} | ||||
|           ARGOS_PARALLEL: ${{ env.shouldRunParallel }} | ||||
|           ARGOS_PARALLEL_TOTAL: 4 | ||||
|           ARGOS_PARALLEL_INDEX: ${{ matrix.containers }} | ||||
|  | ||||
|       - 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: | ||||
| @@ -147,3 +118,55 @@ 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@v3 | ||||
|         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 | ||||
|         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 }}" | ||||
|   | ||||
							
								
								
									
										4
									
								
								.github/workflows/link-checker.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/link-checker.yml
									
									
									
									
										vendored
									
									
								
							| @@ -29,14 +29,14 @@ jobs: | ||||
|       - uses: actions/checkout@v4 | ||||
|  | ||||
|       - 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.9.1 | ||||
|         with: | ||||
|           args: >- | ||||
|             --config .github/lychee.toml | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/workflows/lint.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/lint.yml
									
									
									
									
										vendored
									
									
								
							| @@ -19,7 +19,7 @@ jobs: | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|  | ||||
|       - uses: pnpm/action-setup@v4 | ||||
|       - uses: pnpm/action-setup@v2 | ||||
|         # uses version from "packageManager" field in package.json | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/workflows/pr-labeler.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/pr-labeler.yml
									
									
									
									
										vendored
									
									
								
							| @@ -22,7 +22,7 @@ jobs: | ||||
|       pull-requests: write # write permission is required to label PRs | ||||
|     steps: | ||||
|       - name: Label PR | ||||
|         uses: release-drafter/release-drafter@v6 | ||||
|         uses: release-drafter/release-drafter@v5 | ||||
|         with: | ||||
|           config-name: pr-labeler.yml | ||||
|           disable-autolabeler: false | ||||
|   | ||||
							
								
								
									
										8
									
								
								.github/workflows/publish-docs.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/publish-docs.yml
									
									
									
									
										vendored
									
									
								
							| @@ -25,7 +25,7 @@ jobs: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@v4 | ||||
|  | ||||
|       - uses: pnpm/action-setup@v4 | ||||
|       - uses: pnpm/action-setup@v2 | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@v4 | ||||
| @@ -37,13 +37,13 @@ jobs: | ||||
|         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 | ||||
|   | ||||
							
								
								
									
										4
									
								
								.github/workflows/release-draft.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/release-draft.yml
									
									
									
									
										vendored
									
									
								
							| @@ -12,11 +12,11 @@ jobs: | ||||
|   draft-release: | ||||
|     runs-on: ubuntu-latest | ||||
|     permissions: | ||||
|       contents: write # write permission is required to create a GitHub release | ||||
|       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 | ||||
|         uses: release-drafter/release-drafter@v5 | ||||
|         with: | ||||
|           disable-autolabeler: true | ||||
|         env: | ||||
|   | ||||
| @@ -13,7 +13,7 @@ jobs: | ||||
|         with: | ||||
|           fetch-depth: 0 | ||||
|  | ||||
|       - uses: pnpm/action-setup@v4 | ||||
|       - uses: pnpm/action-setup@v2 | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@v4 | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/workflows/release-publish.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/release-publish.yml
									
									
									
									
										vendored
									
									
								
							| @@ -11,7 +11,7 @@ jobs: | ||||
|       - uses: actions/checkout@v4 | ||||
|       - uses: fregante/setup-git-user@v2 | ||||
|  | ||||
|       - uses: pnpm/action-setup@v4 | ||||
|       - uses: pnpm/action-setup@v2 | ||||
|         # uses version from "packageManager" field in package.json | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|   | ||||
							
								
								
									
										4
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							| @@ -11,7 +11,7 @@ jobs: | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|  | ||||
|       - uses: pnpm/action-setup@v4 | ||||
|       - uses: pnpm/action-setup@v2 | ||||
|         # uses version from "packageManager" field in package.json | ||||
|  | ||||
|       - name: Setup Node.js | ||||
| @@ -39,7 +39,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: | ||||
|   | ||||
							
								
								
									
										4
									
								
								.github/workflows/update-browserlist.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/update-browserlist.yml
									
									
									
									
										vendored
									
									
								
							| @@ -9,7 +9,7 @@ jobs: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@v4 | ||||
|       - uses: pnpm/action-setup@v4 | ||||
|       - uses: pnpm/action-setup@v2 | ||||
|       - run: npx update-browserslist-db@latest | ||||
|       - name: Commit changes | ||||
|         uses: EndBug/add-and-commit@v9 | ||||
| @@ -19,7 +19,7 @@ jobs: | ||||
|           message: 'chore: update browsers list' | ||||
|           push: false | ||||
|       - name: Create Pull Request | ||||
|         uses: peter-evans/create-pull-request@v6 | ||||
|         uses: peter-evans/create-pull-request@v5 | ||||
|         with: | ||||
|           branch: update-browserslist | ||||
|           title: Update Browserslist | ||||
|   | ||||
							
								
								
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -46,9 +46,4 @@ 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': ['tsx scripts/fixCSpell.ts'], | ||||
|   '**/*.jison': ['pnpm -w run lint:jison'], | ||||
| }; | ||||
|   | ||||
| @@ -1 +1 @@ | ||||
| 20.12.2 | ||||
| v20.11.0 | ||||
|   | ||||
							
								
								
									
										1
									
								
								.npmrc
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								.npmrc
									
									
									
									
									
								
							| @@ -1,4 +1,3 @@ | ||||
| registry=https://registry.npmjs.org | ||||
| auto-install-peers=true | ||||
| strict-peer-dependencies=false | ||||
| package-import-method=clone-or-copy | ||||
|   | ||||
| @@ -1,7 +1,6 @@ | ||||
| dist | ||||
| cypress/platform/xss3.html | ||||
| .cache | ||||
| .pnpm-store | ||||
| coverage | ||||
| # Autogenerated by PNPM | ||||
| pnpm-lock.yaml | ||||
| @@ -11,8 +10,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 | ||||
| @@ -3,6 +3,5 @@ | ||||
|   "printWidth": 100, | ||||
|   "singleQuote": true, | ||||
|   "useTabs": false, | ||||
|   "tabWidth": 2, | ||||
|   "trailingComma": "es5" | ||||
|   "tabWidth": 2 | ||||
| } | ||||
|   | ||||
| @@ -1,15 +1,13 @@ | ||||
| import type { InlineConfig } from 'vite'; | ||||
| import { build, type PluginOption } from 'vite'; | ||||
| import { build, InlineConfig, type PluginOption } from 'vite'; | ||||
| import { resolve } from 'path'; | ||||
| import { fileURLToPath } from 'url'; | ||||
| import jisonPlugin from './jisonPlugin.js'; | ||||
| import jsonSchemaPlugin from './jsonSchemaPlugin.js'; | ||||
| import { readFileSync } from 'fs'; | ||||
| import typescript from '@rollup/plugin-typescript'; | ||||
| import { visualizer } from 'rollup-plugin-visualizer'; | ||||
| import type { TemplateType } from 'rollup-plugin-visualizer/dist/plugin/template-types.js'; | ||||
| import istanbul from 'vite-plugin-istanbul'; | ||||
| import { packageOptions } from '../.build/common.js'; | ||||
| import { generateLangium } from '../.build/generateLangium.js'; | ||||
|  | ||||
| const visualize = process.argv.includes('--visualize'); | ||||
| const watch = process.argv.includes('--watch'); | ||||
| @@ -38,6 +36,24 @@ const visualizerOptions = (packageName: string, core = false): PluginOption[] => | ||||
|   ); | ||||
| }; | ||||
|  | ||||
| const packageOptions = { | ||||
|   mermaid: { | ||||
|     name: 'mermaid', | ||||
|     packageName: 'mermaid', | ||||
|     file: 'mermaid.ts', | ||||
|   }, | ||||
|   'mermaid-example-diagram': { | ||||
|     name: 'mermaid-example-diagram', | ||||
|     packageName: 'mermaid-example-diagram', | ||||
|     file: 'detector.ts', | ||||
|   }, | ||||
|   'mermaid-zenuml': { | ||||
|     name: 'mermaid-zenuml', | ||||
|     packageName: 'mermaid-zenuml', | ||||
|     file: 'detector.ts', | ||||
|   }, | ||||
| }; | ||||
|  | ||||
| interface BuildOptions { | ||||
|   minify: boolean | 'esbuild'; | ||||
|   core?: boolean; | ||||
| @@ -47,18 +63,43 @@ interface BuildOptions { | ||||
|  | ||||
| export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions): InlineConfig => { | ||||
|   const external: (string | RegExp)[] = ['require', 'fs', 'path']; | ||||
|   // eslint-disable-next-line no-console | ||||
|   console.log(entryName, packageOptions[entryName]); | ||||
|   const { name, file, packageName } = packageOptions[entryName]; | ||||
|   const output: OutputOptions = [ | ||||
|   let output: OutputOptions = [ | ||||
|     { | ||||
|       name, | ||||
|       format: 'esm', | ||||
|       sourcemap, | ||||
|       entryFileNames: `${name}.esm${minify ? '.min' : ''}.mjs`, | ||||
|     }, | ||||
|     { | ||||
|       name, | ||||
|       format: 'umd', | ||||
|       sourcemap, | ||||
|       entryFileNames: `${name}${minify ? '.min' : ''}.js`, | ||||
|     }, | ||||
|   ]; | ||||
|  | ||||
|   if (core) { | ||||
|     const { dependencies } = JSON.parse( | ||||
|       readFileSync(resolve(__dirname, `../packages/${packageName}/package.json`), 'utf-8') | ||||
|     ); | ||||
|     // Core build is used to generate file without bundled dependencies. | ||||
|     // This is used by downstream projects to bundle dependencies themselves. | ||||
|     // Ignore dependencies and any dependencies of dependencies | ||||
|     // Adapted from the RegEx used by `rollup-plugin-node` | ||||
|     external.push(new RegExp('^(?:' + Object.keys(dependencies).join('|') + ')(?:/.+)?$')); | ||||
|     // This needs to be an array. Otherwise vite will build esm & umd with same name and overwrite esm with umd. | ||||
|     output = [ | ||||
|       { | ||||
|         name, | ||||
|         format: 'esm', | ||||
|         sourcemap, | ||||
|         entryFileNames: `${name}.core.mjs`, | ||||
|       }, | ||||
|     ]; | ||||
|   } | ||||
|  | ||||
|   const config: InlineConfig = { | ||||
|     configFile: false, | ||||
|     build: { | ||||
| @@ -85,9 +126,10 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions) | ||||
|     plugins: [ | ||||
|       jisonPlugin(), | ||||
|       jsonSchemaPlugin(), // handles `.schema.yaml` files | ||||
|       // @ts-expect-error According to the type definitions, rollup plugins are incompatible with vite | ||||
|       typescript({ compilerOptions: { declaration: false } }), | ||||
|       istanbul({ | ||||
|         exclude: ['node_modules', 'test/', '__mocks__', 'generated'], | ||||
|         exclude: ['node_modules', 'test/', '__mocks__'], | ||||
|         extension: ['.js', '.ts'], | ||||
|         requireEnv: true, | ||||
|         forceBuildInstrument: coverage, | ||||
| @@ -107,28 +149,24 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions) | ||||
|  | ||||
| const buildPackage = async (entryName: keyof typeof packageOptions) => { | ||||
|   await build(getBuildConfig({ minify: false, entryName })); | ||||
|   await build(getBuildConfig({ minify: 'esbuild', entryName })); | ||||
|   await build(getBuildConfig({ minify: false, core: true, entryName })); | ||||
| }; | ||||
|  | ||||
| const main = async () => { | ||||
|   const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[]; | ||||
|   for (const pkg of packageNames.filter( | ||||
|     (pkg) => !mermaidOnly || pkg === 'mermaid' || pkg === 'parser' | ||||
|   )) { | ||||
|   for (const pkg of packageNames.filter((pkg) => !mermaidOnly || pkg === 'mermaid')) { | ||||
|     await buildPackage(pkg); | ||||
|   } | ||||
| }; | ||||
|  | ||||
| await generateLangium(); | ||||
|  | ||||
| if (watch) { | ||||
|   await build(getBuildConfig({ minify: false, watch, core: false, entryName: 'parser' })); | ||||
|   void build(getBuildConfig({ minify: false, watch, core: false, entryName: 'mermaid' })); | ||||
|   build(getBuildConfig({ minify: false, watch, core: false, entryName: 'mermaid' })); | ||||
|   if (!mermaidOnly) { | ||||
|     void build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-example-diagram' })); | ||||
|     void build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-zenuml' })); | ||||
|     build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-example-diagram' })); | ||||
|     build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-zenuml' })); | ||||
|   } | ||||
| } else if (visualize) { | ||||
|   await build(getBuildConfig({ minify: false, watch, core: false, entryName: 'parser' })); | ||||
|   await build(getBuildConfig({ minify: false, core: true, entryName: 'mermaid' })); | ||||
|   await build(getBuildConfig({ minify: false, core: false, entryName: 'mermaid' })); | ||||
| } else { | ||||
|   | ||||
| @@ -1,10 +1,10 @@ | ||||
| import { transformJison } from '../.build/jisonTransformer.js'; | ||||
|  | ||||
| import { transformJison } from './jisonTransformer.js'; | ||||
| const fileRegex = /\.(jison)$/; | ||||
|  | ||||
| export default function jison() { | ||||
|   return { | ||||
|     name: 'jison', | ||||
|  | ||||
|     transform(src: string, id: string) { | ||||
|       if (fileRegex.test(id)) { | ||||
|         return { | ||||
|   | ||||
| @@ -1,5 +1,110 @@ | ||||
| import type { PluginOption } from 'vite'; | ||||
| import { getDefaults, getSchema, loadSchema } from '../.build/jsonSchema.js'; | ||||
| import { load, JSON_SCHEMA } from 'js-yaml'; | ||||
| import assert from 'node:assert'; | ||||
| import Ajv2019, { type JSONSchemaType } from 'ajv/dist/2019.js'; | ||||
| import { PluginOption } from 'vite'; | ||||
|  | ||||
| import type { MermaidConfig, BaseDiagramConfig } from '../packages/mermaid/src/config.type.js'; | ||||
|  | ||||
| /** | ||||
|  * All of the keys in the mermaid config that have a mermaid diagram config. | ||||
|  */ | ||||
| const MERMAID_CONFIG_DIAGRAM_KEYS = [ | ||||
|   'flowchart', | ||||
|   'sequence', | ||||
|   'gantt', | ||||
|   'journey', | ||||
|   'class', | ||||
|   'state', | ||||
|   'er', | ||||
|   'pie', | ||||
|   'quadrantChart', | ||||
|   'xyChart', | ||||
|   'requirement', | ||||
|   'mindmap', | ||||
|   'timeline', | ||||
|   'gitGraph', | ||||
|   'c4', | ||||
|   'sankey', | ||||
|   'block', | ||||
| ] as const; | ||||
|  | ||||
| /** | ||||
|  * Generate default values from the JSON Schema. | ||||
|  * | ||||
|  * AJV does not support nested default values yet (or default values with $ref), | ||||
|  * so we need to manually find them (this may be fixed in ajv v9). | ||||
|  * | ||||
|  * @param mermaidConfigSchema - The Mermaid JSON Schema to use. | ||||
|  * @returns The default mermaid config object. | ||||
|  */ | ||||
| function generateDefaults(mermaidConfigSchema: JSONSchemaType<MermaidConfig>) { | ||||
|   const ajv = new Ajv2019({ | ||||
|     useDefaults: true, | ||||
|     allowUnionTypes: true, | ||||
|     strict: true, | ||||
|   }); | ||||
|  | ||||
|   ajv.addKeyword({ | ||||
|     keyword: 'meta:enum', // used by jsonschema2md | ||||
|     errors: false, | ||||
|   }); | ||||
|   ajv.addKeyword({ | ||||
|     keyword: 'tsType', // used by json-schema-to-typescript | ||||
|     errors: false, | ||||
|   }); | ||||
|  | ||||
|   // ajv currently doesn't support nested default values, see https://github.com/ajv-validator/ajv/issues/1718 | ||||
|   // (may be fixed in v9) so we need to manually use sub-schemas | ||||
|   const mermaidDefaultConfig = {}; | ||||
|  | ||||
|   assert.ok(mermaidConfigSchema.$defs); | ||||
|   const baseDiagramConfig = mermaidConfigSchema.$defs.BaseDiagramConfig; | ||||
|  | ||||
|   for (const key of MERMAID_CONFIG_DIAGRAM_KEYS) { | ||||
|     const subSchemaRef = mermaidConfigSchema.properties[key].$ref; | ||||
|     const [root, defs, defName] = subSchemaRef.split('/'); | ||||
|     assert.strictEqual(root, '#'); | ||||
|     assert.strictEqual(defs, '$defs'); | ||||
|     const subSchema = { | ||||
|       $schema: mermaidConfigSchema.$schema, | ||||
|       $defs: mermaidConfigSchema.$defs, | ||||
|       ...mermaidConfigSchema.$defs[defName], | ||||
|     } as JSONSchemaType<BaseDiagramConfig>; | ||||
|  | ||||
|     const validate = ajv.compile(subSchema); | ||||
|  | ||||
|     mermaidDefaultConfig[key] = {}; | ||||
|  | ||||
|     for (const required of subSchema.required ?? []) { | ||||
|       if (subSchema.properties[required] === undefined && baseDiagramConfig.properties[required]) { | ||||
|         mermaidDefaultConfig[key][required] = baseDiagramConfig.properties[required].default; | ||||
|       } | ||||
|     } | ||||
|     if (!validate(mermaidDefaultConfig[key])) { | ||||
|       throw new Error( | ||||
|         `schema for subconfig ${key} does not have valid defaults! Errors were ${JSON.stringify( | ||||
|           validate.errors, | ||||
|           undefined, | ||||
|           2 | ||||
|         )}` | ||||
|       ); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   const validate = ajv.compile(mermaidConfigSchema); | ||||
|  | ||||
|   if (!validate(mermaidDefaultConfig)) { | ||||
|     throw new Error( | ||||
|       `Mermaid config JSON Schema does not have valid defaults! Errors were ${JSON.stringify( | ||||
|         validate.errors, | ||||
|         undefined, | ||||
|         2 | ||||
|       )}` | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   return mermaidDefaultConfig; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Vite plugin that handles JSON Schemas saved as a `.schema.yaml` file. | ||||
| @@ -16,13 +121,32 @@ export default function jsonSchemaPlugin(): PluginOption { | ||||
|         return; | ||||
|       } | ||||
|  | ||||
|       const jsonSchema = loadSchema(src, idAsUrl.pathname); | ||||
|       return { | ||||
|         code: idAsUrl.searchParams.get('only-defaults') | ||||
|           ? getDefaults(jsonSchema) | ||||
|           : getSchema(jsonSchema), | ||||
|         map: null, // no source map | ||||
|       }; | ||||
|       if (idAsUrl.searchParams.get('only-defaults')) { | ||||
|         const jsonSchema = load(src, { | ||||
|           filename: idAsUrl.pathname, | ||||
|           // only allow JSON types in our YAML doc (will probably be default in YAML 1.3) | ||||
|           // e.g. `true` will be parsed a boolean `true`, `True` will be parsed as string `"True"`. | ||||
|           schema: JSON_SCHEMA, | ||||
|         }) as JSONSchemaType<MermaidConfig>; | ||||
|         return { | ||||
|           code: `export default ${JSON.stringify(generateDefaults(jsonSchema), undefined, 2)};`, | ||||
|           map: null, // no source map | ||||
|         }; | ||||
|       } else { | ||||
|         return { | ||||
|           code: `export default ${JSON.stringify( | ||||
|             load(src, { | ||||
|               filename: idAsUrl.pathname, | ||||
|               // only allow JSON types in our YAML doc (will probably be default in YAML 1.3) | ||||
|               // e.g. `true` will be parsed a boolean `true`, `True` will be parsed as string `"True"`. | ||||
|               schema: JSON_SCHEMA, | ||||
|             }), | ||||
|             undefined, | ||||
|             2 | ||||
|           )};`, | ||||
|           map: null, // provide source map if available | ||||
|         }; | ||||
|       } | ||||
|     }, | ||||
|   }; | ||||
| } | ||||
|   | ||||
| @@ -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,17 +14,16 @@ async function createServer() { | ||||
|   }); | ||||
|  | ||||
|   app.use(cors()); | ||||
|   for (const { packageName } of Object.values(packageOptions)) { | ||||
|     app.use(express.static(`./packages/${packageName}/dist`)); | ||||
|   } | ||||
|   app.use(express.static('./packages/mermaid/dist')); | ||||
|   app.use(express.static('./packages/mermaid-zenuml/dist')); | ||||
|   app.use(express.static('./packages/mermaid-example-diagram/dist')); | ||||
|   app.use(vite.middlewares); | ||||
|   app.use(express.static('demos')); | ||||
|   app.use(express.static('cypress/platform')); | ||||
|  | ||||
|   app.listen(9000, () => { | ||||
|     // eslint-disable-next-line no-console | ||||
|     console.log(`Listening on http://localhost:9000`); | ||||
|   }); | ||||
| } | ||||
|  | ||||
| void createServer(); | ||||
| createServer(); | ||||
|   | ||||
							
								
								
									
										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" | ||||
|   ] | ||||
| } | ||||
|   | ||||
| @@ -1,2 +1,2 @@ | ||||
| FROM node:20.12.2-alpine3.19 AS base | ||||
| FROM node:20.11.0-alpine3.19 AS base | ||||
| RUN wget -qO- https://get.pnpm.io/install.sh | ENV="$HOME/.shrc" SHELL="$(which sh)" sh - | ||||
|   | ||||
| @@ -1,7 +0,0 @@ | ||||
| { | ||||
|   "drips": { | ||||
|     "ethereum": { | ||||
|       "ownedBy": "0x0831DDFe60d009d9448CC976157b539089aB821E" | ||||
|     } | ||||
|   } | ||||
| } | ||||
							
								
								
									
										39
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										39
									
								
								README.md
									
									
									
									
									
								
							| @@ -35,7 +35,6 @@ Try Live Editor previews of future releases: <a href="https://develop.git.mermai | ||||
| [](https://www.npmjs.com/package/mermaid) | ||||
| [](https://discord.gg/AgrbSrBer3) | ||||
| [](https://twitter.com/mermaidjs_) | ||||
| [](https://argos-ci.com) | ||||
|  | ||||
| <img src="./img/header.png" alt="" /> | ||||
|  | ||||
| @@ -43,7 +42,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> | ||||
| <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> | ||||
|  | ||||
| ## Table of content | ||||
|  | ||||
| @@ -54,7 +53,7 @@ Try Live Editor previews of future releases: <a href="https://develop.git.mermai | ||||
| - [Examples](#examples) | ||||
| - [Release](#release) | ||||
| - [Related projects](#related-projects) | ||||
| - [Contributors](#contributors---) | ||||
| - [Contributors](#contributors) | ||||
| - [Security and safe diagrams](#security-and-safe-diagrams) | ||||
| - [Reporting vulnerabilities](#reporting-vulnerabilities) | ||||
| - [Appreciation](#appreciation) | ||||
| @@ -75,12 +74,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). | ||||
| For video tutorials, visit our [Tutorials](./docs/ecosystem/tutorials.md) page. | ||||
| Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](./docs/ecosystem/integrations-community.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-community.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/ecosystem/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. | ||||
|  | ||||
| @@ -92,11 +91,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 | ||||
| @@ -116,12 +115,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! | ||||
| @@ -133,7 +132,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! | ||||
| @@ -142,7 +141,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 | ||||
| @@ -166,7 +165,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 | ||||
| @@ -208,7 +207,7 @@ class Class10 { | ||||
|  | ||||
| ``` | ||||
|  | ||||
| ### 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 | ||||
| @@ -230,7 +229,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 | ||||
| @@ -248,7 +247,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 | ||||
| @@ -286,7 +285,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 | ||||
| @@ -312,7 +311,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 | ||||
| @@ -406,7 +405,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 | ||||
|  | ||||
|   | ||||
| @@ -43,7 +43,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 +57,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/ecosystem/tutorials.md) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](./docs/ecosystem/integrations-community.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/ecosystem/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 +88,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 +105,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 +114,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 +138,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 +178,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 +200,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 +218,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 +244,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 +338,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, | ||||
| }; | ||||
							
								
								
									
										210
									
								
								cSpell.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								cSpell.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,210 @@ | ||||
| { | ||||
|   "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", | ||||
|     "catmull", | ||||
|     "città", | ||||
|     "classdef", | ||||
|     "codedoc", | ||||
|     "codemia", | ||||
|     "colour", | ||||
|     "colours", | ||||
|     "commitlint", | ||||
|     "cpettitt", | ||||
|     "customizability", | ||||
|     "cuzon", | ||||
|     "cytoscape", | ||||
|     "dagre", | ||||
|     "deepdwn", | ||||
|     "descr", | ||||
|     "docsify", | ||||
|     "docsy", | ||||
|     "doku", | ||||
|     "dompurify", | ||||
|     "dont", | ||||
|     "doublecircle", | ||||
|     "edgechromium", | ||||
|     "elems", | ||||
|     "elkjs", | ||||
|     "elle", | ||||
|     "faber", | ||||
|     "flatmap", | ||||
|     "foswiki", | ||||
|     "frontmatter", | ||||
|     "ftplugin", | ||||
|     "gantt", | ||||
|     "gitea", | ||||
|     "gitgraph", | ||||
|     "globby", | ||||
|     "graphlib", | ||||
|     "graphviz", | ||||
|     "grav", | ||||
|     "greywolf", | ||||
|     "gzipped", | ||||
|     "huynh", | ||||
|     "huynhicode", | ||||
|     "inkdrop", | ||||
|     "jaoude", | ||||
|     "jgreywolf", | ||||
|     "jison", | ||||
|     "jiti", | ||||
|     "kaufmann", | ||||
|     "khroma", | ||||
|     "klemm", | ||||
|     "klink", | ||||
|     "knsv", | ||||
|     "knut", | ||||
|     "knutsveidqvist", | ||||
|     "laganeckas", | ||||
|     "linetype", | ||||
|     "lintstagedrc", | ||||
|     "logmsg", | ||||
|     "lucida", | ||||
|     "markdownish", | ||||
|     "matthieu", | ||||
|     "matthieumorel", | ||||
|     "mdast", | ||||
|     "mdbook", | ||||
|     "mermaidjs", | ||||
|     "mermerd", | ||||
|     "mindaugas", | ||||
|     "mindmap", | ||||
|     "mindmaps", | ||||
|     "mitigations", | ||||
|     "mkdocs", | ||||
|     "mmorel", | ||||
|     "mult", | ||||
|     "neurodiverse", | ||||
|     "nextra", | ||||
|     "nikolay", | ||||
|     "nirname", | ||||
|     "npmjs", | ||||
|     "orlandoni", | ||||
|     "pathe", | ||||
|     "pbrolin", | ||||
|     "phpbb", | ||||
|     "pixelmatch", | ||||
|     "plantuml", | ||||
|     "playfair", | ||||
|     "pnpm", | ||||
|     "podlite", | ||||
|     "quence", | ||||
|     "radious", | ||||
|     "ranksep", | ||||
|     "rect", | ||||
|     "rects", | ||||
|     "reda", | ||||
|     "redmine", | ||||
|     "regexes", | ||||
|     "rehype", | ||||
|     "roledescription", | ||||
|     "rozhkov", | ||||
|     "sandboxed", | ||||
|     "sankey", | ||||
|     "setupgraphviewbox", | ||||
|     "shiki", | ||||
|     "sidharth", | ||||
|     "sidharthv", | ||||
|     "sphinxcontrib", | ||||
|     "ssim", | ||||
|     "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", | ||||
|     "xychart", | ||||
|     "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 | ||||
| @@ -2,8 +2,6 @@ import { defineConfig } from 'cypress'; | ||||
| import { addMatchImageSnapshotPlugin } from 'cypress-image-snapshot/plugin'; | ||||
| import coverage from '@cypress/code-coverage/task'; | ||||
| import eyesPlugin from '@applitools/eyes-cypress'; | ||||
| import { registerArgosTask } from '@argos-ci/cypress/task'; | ||||
|  | ||||
| export default eyesPlugin( | ||||
|   defineConfig({ | ||||
|     projectId: 'n2sma2', | ||||
| @@ -19,17 +17,10 @@ export default eyesPlugin( | ||||
|           } | ||||
|           return launchOptions; | ||||
|         }); | ||||
|         addMatchImageSnapshotPlugin(on, config); | ||||
|         // copy any needed variables from process.env to config.env | ||||
|         config.env.useAppli = process.env.USE_APPLI ? true : false; | ||||
|         config.env.useArgos = !!process.env.CI; | ||||
|  | ||||
|         if (config.env.useArgos) { | ||||
|           registerArgosTask(on, config, { | ||||
|             token: 'fc3a35cf5200db928d65b2047861582d9444032b', | ||||
|           }); | ||||
|         } else { | ||||
|           addMatchImageSnapshotPlugin(on, config); | ||||
|         } | ||||
|         // do not forget to return the changed config object! | ||||
|         return config; | ||||
|       }, | ||||
|   | ||||
| @@ -35,7 +35,7 @@ export const mermaidUrl = ( | ||||
|   }; | ||||
|   const objStr: string = JSON.stringify(codeObject); | ||||
|   let url = `http://localhost:9000/e2e.html?graph=${utf8ToB64(objStr)}`; | ||||
|   if (api && typeof graphStr === 'string') { | ||||
|   if (api) { | ||||
|     url = `http://localhost:9000/xss.html?graph=${graphStr}`; | ||||
|   } | ||||
|  | ||||
| @@ -54,15 +54,16 @@ export const imgSnapshotTest = ( | ||||
| ): void => { | ||||
|   const options: CypressMermaidConfig = { | ||||
|     ..._options, | ||||
|     fontFamily: _options.fontFamily ?? 'courier', | ||||
|     fontFamily: _options.fontFamily || 'courier', | ||||
|     // @ts-ignore TODO: Fix type of fontSize | ||||
|     fontSize: _options.fontSize ?? '16px', | ||||
|     fontSize: _options.fontSize || '16px', | ||||
|     sequence: { | ||||
|       ...(_options.sequence ?? {}), | ||||
|       ...(_options.sequence || {}), | ||||
|       actorFontFamily: 'courier', | ||||
|       noteFontFamily: _options.sequence?.noteFontFamily | ||||
|         ? _options.sequence.noteFontFamily | ||||
|         : 'courier', | ||||
|       noteFontFamily: | ||||
|         _options.sequence && _options.sequence.noteFontFamily | ||||
|           ? _options.sequence.noteFontFamily | ||||
|           : 'courier', | ||||
|       messageFontFamily: 'courier', | ||||
|     }, | ||||
|   }; | ||||
| @@ -94,22 +95,8 @@ export const openURLAndVerifyRendering = ( | ||||
|   options: CypressMermaidConfig, | ||||
|   validation?: any | ||||
| ): void => { | ||||
|   const name: string = (options.name ?? cy.state('runnable').fullTitle()).replace(/\s+/g, '-'); | ||||
|  | ||||
|   cy.visit(url); | ||||
|   cy.window().should('have.property', 'rendered', true); | ||||
|   cy.get('svg').should('be.visible'); | ||||
|  | ||||
|   if (validation) { | ||||
|     cy.get('svg').should(validation); | ||||
|   } | ||||
|  | ||||
|   verifyScreenshot(name); | ||||
| }; | ||||
|  | ||||
| export const verifyScreenshot = (name: string): void => { | ||||
|   const useAppli: boolean = Cypress.env('useAppli'); | ||||
|   const useArgos: boolean = Cypress.env('useArgos'); | ||||
|   const name: string = (options.name || cy.state('runnable').fullTitle()).replace(/\s+/g, '-'); | ||||
|  | ||||
|   if (useAppli) { | ||||
|     cy.log(`Opening eyes ${Cypress.spec.name} --- ${name}`); | ||||
| @@ -119,14 +106,21 @@ export const verifyScreenshot = (name: string): void => { | ||||
|       batchName: Cypress.spec.name, | ||||
|       batchId: batchId + Cypress.spec.name, | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   cy.visit(url); | ||||
|   cy.window().should('have.property', 'rendered', true); | ||||
|   cy.get('svg').should('be.visible'); | ||||
|  | ||||
|   if (validation) { | ||||
|     cy.get('svg').should(validation); | ||||
|   } | ||||
|  | ||||
|   if (useAppli) { | ||||
|     cy.log(`Check eyes ${Cypress.spec.name}`); | ||||
|     cy.eyesCheckWindow('Click!'); | ||||
|     cy.log(`Closing eyes ${Cypress.spec.name}`); | ||||
|     cy.eyesClose(); | ||||
|   } else if (useArgos) { | ||||
|     cy.argosScreenshot(name, { | ||||
|       threshold: 0.01, | ||||
|     }); | ||||
|   } else { | ||||
|     cy.matchImageSnapshot(name); | ||||
|   } | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| import { renderGraph, verifyScreenshot } from '../../helpers/util.ts'; | ||||
| import { renderGraph } from '../../helpers/util.ts'; | ||||
| describe('Configuration', () => { | ||||
|   describe('arrowMarkerAbsolute', () => { | ||||
|     it('should handle default value false of arrowMarkerAbsolute', () => { | ||||
| @@ -118,52 +118,11 @@ describe('Configuration', () => { | ||||
|     it('should not taint the initial configuration when using multiple directives', () => { | ||||
|       const url = 'http://localhost:9000/regression/issue-1874.html'; | ||||
|       cy.visit(url); | ||||
|       cy.window().should('have.property', 'rendered', true); | ||||
|       verifyScreenshot( | ||||
|  | ||||
|       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'); | ||||
|         }); | ||||
|       verifyScreenshot( | ||||
|         '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'); | ||||
|         }); | ||||
|       verifyScreenshot( | ||||
|         '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,11 +0,0 @@ | ||||
| describe('IIFE', () => { | ||||
|   beforeEach(() => { | ||||
|     cy.visit('http://localhost:9000/iife.html'); | ||||
|   }); | ||||
|  | ||||
|   it('should render when using mermaid.min.js', () => { | ||||
|     cy.window().should('have.property', 'rendered', true); | ||||
|     cy.get('svg').should('be.visible'); | ||||
|     cy.get('#d2').should('contain', 'Hello'); | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										16
									
								
								cypress/integration/other/webpackUsage.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								cypress/integration/other/webpackUsage.spec.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| describe('Sequencediagram', () => { | ||||
|   it('should render a simple sequence diagrams', () => { | ||||
|     const url = 'http://localhost:9000/webpackUsage.html'; | ||||
|  | ||||
|     cy.visit(url); | ||||
|     cy.get('body').find('svg').should('have.length', 1); | ||||
|   }); | ||||
|   it('should handle html escapings properly', () => { | ||||
|     const url = 'http://localhost:9000/webpackUsage.html?test-html-escaping=true'; | ||||
|  | ||||
|     cy.visit(url); | ||||
|     cy.get('body').find('svg').should('have.length', 1); | ||||
|  | ||||
|     cy.get('g.label > foreignobject > div').should('not.contain.text', '<b>'); | ||||
|   }); | ||||
| }); | ||||
| @@ -10,6 +10,7 @@ describe('XSS', () => { | ||||
|     cy.wait(1000).then(() => { | ||||
|       cy.get('.mermaid').should('exist'); | ||||
|     }); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('should not allow tags in the css', () => { | ||||
| @@ -136,9 +137,4 @@ describe('XSS', () => { | ||||
|     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'); | ||||
|   }); | ||||
| }); | ||||
|   | ||||
| @@ -30,6 +30,7 @@ describe('C4 diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a simple C4Container diagram', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -49,6 +50,7 @@ describe('C4 diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a simple C4Component diagram', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -67,6 +69,7 @@ describe('C4 diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a simple C4Dynamic diagram', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -90,6 +93,7 @@ describe('C4 diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a simple C4Deployment diagram', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -113,5 +117,6 @@ describe('C4 diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
| }); | ||||
|   | ||||
| @@ -32,6 +32,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 1 } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('2: should render a simple class diagrams with cardinality', () => { | ||||
| @@ -60,6 +61,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('3: should render a simple class diagram with different visibilities', () => { | ||||
| @@ -77,6 +79,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('4: should render a simple class diagram with comments', () => { | ||||
| @@ -106,6 +109,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('5: should render a simple class diagram with abstract method', () => { | ||||
| @@ -117,6 +121,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('6: should render a simple class diagram with static method', () => { | ||||
| @@ -128,6 +133,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('7: should render a simple class diagram with Generic class', () => { | ||||
| @@ -147,6 +153,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('8: should render a simple class diagram with Generic class and relations', () => { | ||||
| @@ -167,6 +174,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('9: should render a simple class diagram with clickable link', () => { | ||||
| @@ -188,6 +196,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('10: should render a simple class diagram with clickable callback', () => { | ||||
| @@ -209,6 +218,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('11: should render a simple class diagram with return type on method', () => { | ||||
| @@ -223,6 +233,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('12: should render a simple class diagram with generic types', () => { | ||||
| @@ -238,6 +249,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('13: should render a simple class diagram with css classes applied', () => { | ||||
| @@ -255,6 +267,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('14: should render a simple class diagram with css classes applied directly', () => { | ||||
| @@ -270,6 +283,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('15: should render a simple class diagram with css classes applied to multiple classes', () => { | ||||
| @@ -284,6 +298,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('16: should render multiple class diagrams', () => { | ||||
| @@ -336,6 +351,7 @@ describe('Class diagram', () => { | ||||
|       ], | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   // it('17: should render a class diagram when useMaxWidth is true (default)', () => { | ||||
| @@ -405,6 +421,7 @@ describe('Class diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 1 } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('should render class diagram with newlines in title', () => { | ||||
| @@ -422,6 +439,7 @@ describe('Class diagram', () => { | ||||
|           +quack() | ||||
|         } | ||||
|       `); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('should render class diagram with many newlines in title', () => { | ||||
|   | ||||
| @@ -218,6 +218,7 @@ describe('Entity Relationship Diagram', () => { | ||||
|         `, | ||||
|       { loglevel: 1 } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('should render entities with keys', () => { | ||||
|   | ||||
| @@ -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'); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
|   | ||||
| @@ -760,51 +760,6 @@ A ~~~ B | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   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,18 +904,6 @@ 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)', () => { | ||||
|   | ||||
| @@ -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( | ||||
|       ` | ||||
| @@ -573,28 +548,7 @@ describe('Gantt diagram', () => { | ||||
|       ` | ||||
|     ); | ||||
|   }); | ||||
|   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( | ||||
|       ` | ||||
|   | ||||
| @@ -943,594 +943,4 @@ gitGraph TB: | ||||
|       { 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,67 +0,0 @@ | ||||
| import { imgSnapshotTest } from '../../helpers/util'; | ||||
|  | ||||
| describe('packet structure', () => { | ||||
|   it('should render a simple packet diagram', () => { | ||||
|     imgSnapshotTest( | ||||
|       `packet-beta | ||||
|   title Hello world | ||||
|   0-10: "hello" | ||||
| ` | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render a complex packet diagram', () => { | ||||
|     imgSnapshotTest( | ||||
|       `packet-beta | ||||
|         0-15: "Source Port" | ||||
|         16-31: "Destination Port" | ||||
|         32-63: "Sequence Number" | ||||
|         64-95: "Acknowledgment Number" | ||||
|         96-99: "Data Offset" | ||||
|         100-105: "Reserved" | ||||
|         106: "URG" | ||||
|         107: "ACK" | ||||
|         108: "PSH" | ||||
|         109: "RST" | ||||
|         110: "SYN" | ||||
|         111: "FIN" | ||||
|         112-127: "Window" | ||||
|         128-143: "Checksum" | ||||
|         144-159: "Urgent Pointer" | ||||
|         160-191: "(Options and Padding)" | ||||
|         192-223: "data" | ||||
|       ` | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render a complex packet diagram with showBits false', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|       --- | ||||
|       title: "Packet Diagram" | ||||
|       config: | ||||
|         packet: | ||||
|           showBits: false | ||||
|       --- | ||||
|       packet-beta | ||||
|         0-15: "Source Port" | ||||
|         16-31: "Destination Port" | ||||
|         32-63: "Sequence Number" | ||||
|         64-95: "Acknowledgment Number" | ||||
|         96-99: "Data Offset" | ||||
|         100-105: "Reserved" | ||||
|         106: "URG" | ||||
|         107: "ACK" | ||||
|         108: "PSH" | ||||
|         109: "RST" | ||||
|         110: "SYN" | ||||
|         111: "FIN" | ||||
|         112-127: "Window" | ||||
|         128-143: "Checksum" | ||||
|         144-159: "Urgent Pointer" | ||||
|         160-191: "(Options and Padding)" | ||||
|         192-223: "data" | ||||
|       ` | ||||
|     ); | ||||
|   }); | ||||
| }); | ||||
| @@ -1,4 +1,4 @@ | ||||
| import { imgSnapshotTest } from '../../helpers/util.ts'; | ||||
| import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts'; | ||||
|  | ||||
| describe('Quadrant Chart', () => { | ||||
|   it('should render if only chart type is provided', () => { | ||||
| @@ -8,6 +8,7 @@ describe('Quadrant Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a complete quadrant chart', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -20,7 +21,7 @@ describe('Quadrant Chart', () => { | ||||
|     quadrant-2 Need to promote | ||||
|     quadrant-3 Re-evaluate | ||||
|     quadrant-4 May be improved | ||||
|     Campaign A: [0.3, 0.61] | ||||
|     Campaign A: [0.3, 0.6] | ||||
|     Campaign B: [0.45, 0.23] | ||||
|     Campaign C: [0.57, 0.69] | ||||
|     Campaign D: [0.78, 0.34] | ||||
| @@ -29,6 +30,7 @@ describe('Quadrant Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render without points', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -44,6 +46,7 @@ describe('Quadrant Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should able to render y-axix on right side', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -54,12 +57,13 @@ describe('Quadrant Chart', () => { | ||||
|     x-axis Low Reach --> High Reach | ||||
|     y-axis Low Engagement --> High Engagement | ||||
|     quadrant-1 We should expand | ||||
|     quadrant-2 Need to promot | ||||
|     quadrant-2 Need to promote | ||||
|     quadrant-3 Re-evaluate | ||||
|     quadrant-4 May be improved | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should able to render x-axix on bottom', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -76,6 +80,7 @@ describe('Quadrant Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should able to render x-axix on bottom and y-axis on right', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -92,6 +97,7 @@ describe('Quadrant Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render without title', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -106,6 +112,7 @@ describe('Quadrant Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should use all the config', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -128,6 +135,7 @@ describe('Quadrant Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should use all the theme variable', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -150,6 +158,7 @@ describe('Quadrant Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render x-axis labels in the center, if x-axis has two labels', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -171,6 +180,7 @@ describe('Quadrant Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render y-axis labels in the center, if y-axis has two labels', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -192,6 +202,7 @@ describe('Quadrant Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render both axes labels on the left and bottom, if both axes have only one label', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -213,52 +224,6 @@ describe('Quadrant Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('it should render data points with styles', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|   quadrantChart | ||||
|     title Reach and engagement of campaigns | ||||
|     x-axis Reach --> | ||||
|     y-axis Engagement --> | ||||
|     quadrant-1 We should expand | ||||
|     quadrant-2 Need to promote | ||||
|     quadrant-3 Re-evaluate | ||||
|     quadrant-4 May be improved | ||||
|     Campaign A: [0.3, 0.6] radius: 20 | ||||
|     Campaign B: [0.45, 0.23]     color: #ff0000   | ||||
|     Campaign C: [0.57, 0.69]  stroke-color: #ff00ff   | ||||
|     Campaign D: [0.78, 0.34]        stroke-width: 3px     | ||||
|     Campaign E: [0.40, 0.34] radius: 20,   color: #ff0000  , stroke-color  : #ff00ff,     stroke-width    :   3px    | ||||
|     Campaign F: [0.35, 0.78] stroke-width: 3px , color: #ff0000, radius: 20, stroke-color:     #ff00ff | ||||
|     Campaign G: [0.22, 0.22] stroke-width: 3px  , color: #309708  ,  radius  : 20  ,  stroke-color:    #5060ff | ||||
|     Campaign H: [0.22, 0.44] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('it should render data points with styles + classes', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|   quadrantChart | ||||
|     title Reach and engagement of campaigns | ||||
|     x-axis Reach --> | ||||
|     y-axis Engagement --> | ||||
|     quadrant-1 We should expand | ||||
|     quadrant-2 Need to promote | ||||
|     quadrant-3 Re-evaluate | ||||
|     quadrant-4 May be improved | ||||
|     Campaign A:::class1: [0.3, 0.6] radius: 20 | ||||
|     Campaign B: [0.45, 0.23] color: #ff0000 | ||||
|     Campaign C: [0.57, 0.69] stroke-color: #ff00ff | ||||
|     Campaign D:::class2: [0.78, 0.34] stroke-width: 3px | ||||
|     Campaign E:::class2: [0.40, 0.34] radius: 20, color: #ff0000, stroke-color: #ff00ff, stroke-width: 3px | ||||
|     Campaign F:::class1: [0.35, 0.78] | ||||
|     classDef class1 color: #908342, radius : 10, stroke-color: #310085, stroke-width: 10px | ||||
|     classDef class2 color: #f00fff, radius : 10 | ||||
|     ` | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
| }); | ||||
|   | ||||
| @@ -44,5 +44,6 @@ describe('Requirement diagram', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
| }); | ||||
|   | ||||
| @@ -1,6 +1,8 @@ | ||||
| /// <reference types="Cypress" /> | ||||
|  | ||||
| import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts'; | ||||
|  | ||||
| describe('Sequence diagram', () => { | ||||
| context('Sequence diagram', () => { | ||||
|   it('should render a sequence diagram with boxes', () => { | ||||
|     renderGraph( | ||||
|       ` | ||||
| @@ -66,19 +68,6 @@ describe('Sequence diagram', () => { | ||||
|       { sequence: { actorFontFamily: 'courier' } } | ||||
|     ); | ||||
|   }); | ||||
|   it('should render bidirectional arrows', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|       sequenceDiagram | ||||
|       Alice<<->>John: Hello John, how are you? | ||||
|       Alice<<-->>John: Hi Alice, I can hear you! | ||||
|       John<<->>Alice: This also works the other way | ||||
|       John<<-->>Alice: Yes | ||||
|       Alice->John: Test | ||||
|       John->>Alice: Still works | ||||
|       ` | ||||
|     ); | ||||
|   }); | ||||
|   it('should handle different line breaks', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
| @@ -242,7 +231,7 @@ describe('Sequence diagram', () => { | ||||
|       ` | ||||
|     ); | ||||
|   }); | ||||
|   describe('font settings', () => { | ||||
|   context('font settings', () => { | ||||
|     it('should render different note fonts when configured', () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
| @@ -339,7 +328,7 @@ describe('Sequence diagram', () => { | ||||
|       ); | ||||
|     }); | ||||
|   }); | ||||
|   describe('auth width scaling', () => { | ||||
|   context('auth width scaling', () => { | ||||
|     it('should render long actor descriptions', () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
| @@ -386,7 +375,7 @@ describe('Sequence diagram', () => { | ||||
|         {} | ||||
|       ); | ||||
|     }); | ||||
|     it('should have actor-top and actor-bottom classes on top and bottom actor box and symbol and actor-box and actor-man classes for text tags', () => { | ||||
|     it('should have actor-top and actor-bottom classes on top and bottom actor box and symbol', () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|         sequenceDiagram | ||||
| @@ -405,9 +394,6 @@ describe('Sequence diagram', () => { | ||||
|       cy.get('.actor-man').should('have.class', 'actor-bottom'); | ||||
|       cy.get('.actor.actor-bottom').should('not.have.class', 'actor-top'); | ||||
|       cy.get('.actor-man.actor-bottom').should('not.have.class', 'actor-top'); | ||||
|  | ||||
|       cy.get('text.actor-box').should('include.text', 'Alice'); | ||||
|       cy.get('text.actor-man').should('include.text', 'Bob'); | ||||
|     }); | ||||
|     it('should render long notes left of actor', () => { | ||||
|       imgSnapshotTest( | ||||
| @@ -475,18 +461,6 @@ describe('Sequence diagram', () => { | ||||
|         {} | ||||
|       ); | ||||
|     }); | ||||
|     it('should render notes over actors and participant', () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|         sequenceDiagram | ||||
|         actor Alice | ||||
|         participant Charlie | ||||
|         note over Alice: some note | ||||
|         note over Charlie: other note | ||||
|       `, | ||||
|         {} | ||||
|       ); | ||||
|     }); | ||||
|     it('should render long messages from an actor to the left to one to the right', () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
| @@ -528,7 +502,7 @@ describe('Sequence diagram', () => { | ||||
|       ); | ||||
|     }); | ||||
|   }); | ||||
|   describe('background rects', () => { | ||||
|   context('background rects', () => { | ||||
|     it('should render a single and nested rects', () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
| @@ -808,7 +782,7 @@ describe('Sequence diagram', () => { | ||||
|       ); | ||||
|     }); | ||||
|   }); | ||||
|   describe('directives', () => { | ||||
|   context('directives', () => { | ||||
|     it('should override config with directive settings', () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
| @@ -833,14 +807,11 @@ describe('Sequence diagram', () => { | ||||
|         note left of Alice: config: mirrorActors=true<br/>directive: mirrorActors=false | ||||
|         Bob->>Alice: Short as well | ||||
|       `, | ||||
|         { | ||||
|           logLevel: 0, | ||||
|           sequence: { mirrorActors: true, noteFontSize: 18, noteFontFamily: 'Arial' }, | ||||
|         } | ||||
|         { logLevel: 0, sequence: { mirrorActors: true, noteFontSize: 18, noteFontFamily: 'Arial' } } | ||||
|       ); | ||||
|     }); | ||||
|   }); | ||||
|   describe('links', () => { | ||||
|   context('links', () => { | ||||
|     it('should support actor links', () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
| @@ -856,7 +827,7 @@ describe('Sequence diagram', () => { | ||||
|       ); | ||||
|       cy.get('#actor0_popup').should((popupMenu) => { | ||||
|         const style = popupMenu.attr('style'); | ||||
|         // expect(style).to.undefined; | ||||
|         expect(style).to.undefined; | ||||
|       }); | ||||
|       cy.get('#root-0').click(); | ||||
|       cy.get('#actor0_popup').should((popupMenu) => { | ||||
| @@ -887,10 +858,7 @@ describe('Sequence diagram', () => { | ||||
|         a->>j: Hello John, how are you? | ||||
|         j-->>a: Great! | ||||
|       `, | ||||
|         { | ||||
|           logLevel: 0, | ||||
|           sequence: { mirrorActors: true, noteFontSize: 18, noteFontFamily: 'Arial' }, | ||||
|         } | ||||
|         { logLevel: 0, sequence: { mirrorActors: true, noteFontSize: 18, noteFontFamily: 'Arial' } } | ||||
|       ); | ||||
|     }); | ||||
|     it('should support actor links and properties when not mirrored EXPERIMENTAL: USE WITH CAUTION', () => { | ||||
| @@ -931,7 +899,7 @@ describe('Sequence diagram', () => { | ||||
|       ); | ||||
|     }); | ||||
|   }); | ||||
|   describe('svg size', () => { | ||||
|   context('svg size', () => { | ||||
|     it('should render a sequence diagram when useMaxWidth is true (default)', () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
| @@ -1010,7 +978,7 @@ describe('Sequence diagram', () => { | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
|   describe('render after error', () => { | ||||
|   context('render after error', () => { | ||||
|     it('should render diagram after fixing destroy participant error', () => { | ||||
|       cy.on('uncaught:exception', (err) => { | ||||
|         return false; | ||||
|   | ||||
| @@ -8,6 +8,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 1, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render a simple state diagrams', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -19,6 +20,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render a long descriptions instead of id when available', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -30,6 +32,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render a long descriptions with additional descriptions', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -41,6 +44,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render a single state with short descriptions', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -51,6 +55,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render a transition descriptions with new lines', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -64,6 +69,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render a state with a note', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -77,6 +83,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render a state with on the left side when so specified', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -90,6 +97,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render a state with a note together with another state', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -105,6 +113,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render a note with multiple lines in it', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -147,6 +156,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render a simple state diagrams 2', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -159,6 +169,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render a simple state diagrams with labels', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -174,6 +185,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render state descriptions', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -186,6 +198,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render composite states', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -204,6 +217,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render multiple composite states', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -273,6 +287,7 @@ describe('State diagram', () => { | ||||
|     `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render concurrency states', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -296,6 +311,7 @@ describe('State diagram', () => { | ||||
|     `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('v2 should render a state with states in it', () => { | ||||
|     imgSnapshotTest( | ||||
|   | ||||
| @@ -10,6 +10,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a long descriptions instead of id when available', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -21,6 +22,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a long descriptions with additional descriptions', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -32,6 +34,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a single state with short descriptions', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -42,6 +45,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a transition descriptions with new lines', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -55,6 +59,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a state with a note', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -68,6 +73,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a state with on the left side when so specified', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -81,6 +87,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a state with a note together with another state', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -96,6 +103,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a note with multiple lines in it', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -138,6 +146,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a simple state diagrams 2', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -150,6 +159,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a simple state diagrams with labels', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -165,6 +175,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render state descriptions', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -177,6 +188,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render composite states', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -195,6 +207,7 @@ describe('State diagram', () => { | ||||
|       `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render multiple composit states', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -264,6 +277,7 @@ describe('State diagram', () => { | ||||
|     `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render concurrency states', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -287,6 +301,7 @@ describe('State diagram', () => { | ||||
|     `, | ||||
|       { logLevel: 0, fontFamily: 'courier' } | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should render a state with states in it', () => { | ||||
|     imgSnapshotTest( | ||||
|   | ||||
| @@ -10,6 +10,7 @@ describe('themeCSS balancing, it', () => { | ||||
|           `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('should not allow unbalanced CSS definitions 2', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -20,6 +21,7 @@ describe('themeCSS balancing, it', () => { | ||||
|           `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| @@ -43,6 +45,7 @@ describe('Pie Chart', () => { | ||||
|           `, | ||||
|           { theme } | ||||
|         ); | ||||
|         cy.get('svg'); | ||||
|       }); | ||||
|       it('should render a flowchart diagram', () => { | ||||
|         imgSnapshotTest( | ||||
| @@ -67,6 +70,7 @@ describe('Pie Chart', () => { | ||||
|           `, | ||||
|           { theme } | ||||
|         ); | ||||
|         cy.get('svg'); | ||||
|       }); | ||||
|       it('should render a new flowchart diagram', () => { | ||||
|         imgSnapshotTest( | ||||
| @@ -92,6 +96,7 @@ describe('Pie Chart', () => { | ||||
|           `, | ||||
|           { theme } | ||||
|         ); | ||||
|         cy.get('svg'); | ||||
|       }); | ||||
|       it('should render a sequence diagram', () => { | ||||
|         imgSnapshotTest( | ||||
| @@ -120,6 +125,7 @@ describe('Pie Chart', () => { | ||||
|           `, | ||||
|           { theme } | ||||
|         ); | ||||
|         cy.get('svg'); | ||||
|       }); | ||||
|  | ||||
|       it('should render a class diagram', () => { | ||||
| @@ -169,6 +175,7 @@ describe('Pie Chart', () => { | ||||
|           `, | ||||
|           { theme } | ||||
|         ); | ||||
|         cy.get('svg'); | ||||
|       }); | ||||
|       it('should render a state diagram', () => { | ||||
|         imgSnapshotTest( | ||||
| @@ -203,6 +210,7 @@ stateDiagram | ||||
|           `, | ||||
|           { theme } | ||||
|         ); | ||||
|         cy.get('svg'); | ||||
|       }); | ||||
|       it('should render a state diagram (v2)', () => { | ||||
|         imgSnapshotTest( | ||||
| @@ -237,6 +245,7 @@ stateDiagram-v2 | ||||
|           `, | ||||
|           { theme } | ||||
|         ); | ||||
|         cy.get('svg'); | ||||
|       }); | ||||
|       it('should render a er diagram', () => { | ||||
|         imgSnapshotTest( | ||||
| @@ -257,6 +266,7 @@ erDiagram | ||||
|           `, | ||||
|           { theme } | ||||
|         ); | ||||
|         cy.get('svg'); | ||||
|       }); | ||||
|       it('should render a user journey diagram', () => { | ||||
|         imgSnapshotTest( | ||||
| @@ -277,6 +287,7 @@ erDiagram | ||||
|                         `, | ||||
|           { theme } | ||||
|         ); | ||||
|         cy.get('svg'); | ||||
|       }); | ||||
|       it('should render a gantt diagram', () => { | ||||
|         cy.clock(new Date('2014-01-06').getTime()); | ||||
| @@ -315,6 +326,7 @@ erDiagram | ||||
|        `, | ||||
|           { theme } | ||||
|         ); | ||||
|         cy.get('svg'); | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
|   | ||||
| @@ -9,6 +9,7 @@ describe('XY Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('Should render a complete chart', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -34,6 +35,7 @@ describe('XY Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('y-axis title not required', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -46,6 +48,7 @@ describe('XY Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('Should render a chart without y-axis with different range', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -57,6 +60,7 @@ describe('XY Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('x axis title not required', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -68,6 +72,7 @@ describe('XY Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('Multiple plots can be rendered', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -82,6 +87,7 @@ describe('XY Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('Decimals and negative numbers are supported', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -92,6 +98,7 @@ describe('XY Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('Render spark line with "plotReservedSpacePercent"', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -109,6 +116,7 @@ describe('XY Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('Render spark bar without displaying other property', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -135,6 +143,7 @@ describe('XY Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('Should use all the config from directive', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -149,6 +158,7 @@ describe('XY Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('Should use all the config from yaml', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -189,6 +199,7 @@ describe('XY Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('Render with show axis title false', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -205,11 +216,12 @@ describe('XY Chart', () => { | ||||
|         title "Sales Revenue" | ||||
|         x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] | ||||
|         y-axis "Revenue (in $)" 4000 --> 11000 | ||||
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6010] | ||||
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000] | ||||
|         line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('Render with show axis label false', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -231,6 +243,7 @@ describe('XY Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('Render with show axis tick false', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -239,19 +252,20 @@ describe('XY Chart', () => { | ||||
|       config: | ||||
|         xyChart: | ||||
|           xAxis: | ||||
|             showTick: true | ||||
|             showTick: false | ||||
|           yAxis: | ||||
|             showTick: true | ||||
|             showTick: false | ||||
|       --- | ||||
|       xychart-beta | ||||
|         title "Sales Revenue" | ||||
|         x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] | ||||
|         y-axis "Revenue (in $)" 4000 --> 11000 | ||||
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 5000] | ||||
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000] | ||||
|         line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('Render with show axis line false', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -268,11 +282,12 @@ describe('XY Chart', () => { | ||||
|         title "Sales Revenue" | ||||
|         x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] | ||||
|         y-axis "Revenue (in $)" 4000 --> 11000 | ||||
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6001] | ||||
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000] | ||||
|         line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|   it('Render all the theme color', () => { | ||||
|     imgSnapshotTest( | ||||
| @@ -302,17 +317,6 @@ describe('XY Chart', () => { | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('should use the correct distances between data points', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|       xychart-beta | ||||
|         x-axis 0 --> 2 | ||||
|         line [0, 1, 0, 1] | ||||
|         bar [1, 0, 1, 0] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
| }); | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|     <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css" | ||||
| @@ -33,9 +33,7 @@ | ||||
|         background-image: radial-gradient(#fff 1%, transparent 11%), | ||||
|           radial-gradient(#fff 1%, transparent 11%); | ||||
|         background-size: 20px 20px; | ||||
|         background-position: | ||||
|           0 0, | ||||
|           10px 10px; | ||||
|         background-position: 0 0, 10px 10px; | ||||
|         background-repeat: repeat; | ||||
|       } | ||||
|       .malware { | ||||
|   | ||||
| @@ -27,7 +27,7 @@ const code3 = `flowchart TD | ||||
| A(<img scr='https://iconscout.com/ms-icon-310x310.png' width='20' height='20' />) | ||||
| B(<b>Bold text!</b>)`; | ||||
|  | ||||
| if (/test-html-escaping/.exec(location.href)) { | ||||
| if (location.href.match('test-html-escaping')) { | ||||
|   code = code3; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|     <link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap" | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| <!doctype html> | ||||
| <!DOCTYPE html> | ||||
| <html> | ||||
|   <head> | ||||
|     <meta charset="utf-8" /> | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| <!doctype html> | ||||
| <!DOCTYPE html> | ||||
| <html> | ||||
|   <head> | ||||
|     <meta charset="utf-8" /> | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| <!doctype html> | ||||
| <!DOCTYPE html> | ||||
| <html> | ||||
|   <head> | ||||
|     <meta charset="utf-8" /> | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user