mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-08-17 15:29:25 +02:00
Compare commits
3 Commits
@mermaid-j
...
sidv/liveR
Author | SHA1 | Date | |
---|---|---|---|
![]() |
5e210753b7 | ||
![]() |
350aaf9b51 | ||
![]() |
5cd792f027 |
@@ -2,11 +2,6 @@
|
|||||||
* Shared common options for both ESBuild and Vite
|
* Shared common options for both ESBuild and Vite
|
||||||
*/
|
*/
|
||||||
export const packageOptions = {
|
export const packageOptions = {
|
||||||
parser: {
|
|
||||||
name: 'mermaid-parser',
|
|
||||||
packageName: 'parser',
|
|
||||||
file: 'index.ts',
|
|
||||||
},
|
|
||||||
mermaid: {
|
mermaid: {
|
||||||
name: 'mermaid',
|
name: 'mermaid',
|
||||||
packageName: 'mermaid',
|
packageName: 'mermaid',
|
||||||
@@ -22,9 +17,4 @@ export const packageOptions = {
|
|||||||
packageName: 'mermaid-zenuml',
|
packageName: 'mermaid-zenuml',
|
||||||
file: 'detector.ts',
|
file: 'detector.ts',
|
||||||
},
|
},
|
||||||
'mermaid-layout-elk': {
|
|
||||||
name: 'mermaid-layout-elk',
|
|
||||||
packageName: 'mermaid-layout-elk',
|
|
||||||
file: 'layouts.ts',
|
|
||||||
},
|
|
||||||
} as const;
|
} as const;
|
||||||
|
@@ -1,5 +0,0 @@
|
|||||||
import { generate } from 'langium-cli';
|
|
||||||
|
|
||||||
export async function generateLangium() {
|
|
||||||
await generate({ file: `./packages/parser/langium-config.json` });
|
|
||||||
}
|
|
@@ -1,7 +1,6 @@
|
|||||||
import jison from 'jison';
|
import jison from 'jison';
|
||||||
|
|
||||||
export const transformJison = (src: string): string => {
|
export const transformJison = (src: string): string => {
|
||||||
// @ts-ignore - Jison is not typed properly
|
|
||||||
const parser = new jison.Generator(src, {
|
const parser = new jison.Generator(src, {
|
||||||
moduleType: 'js',
|
moduleType: 'js',
|
||||||
'token-stack': true,
|
'token-stack': true,
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
import { load, JSON_SCHEMA } from 'js-yaml';
|
import { load, JSON_SCHEMA } from 'js-yaml';
|
||||||
import assert from 'node:assert';
|
import assert from 'node:assert';
|
||||||
import Ajv2019, { type JSONSchemaType } from 'ajv/dist/2019.js';
|
import Ajv2019, { type JSONSchemaType } from 'ajv/dist/2019.js';
|
||||||
|
|
||||||
import type { MermaidConfig, BaseDiagramConfig } from '../packages/mermaid/src/config.type.js';
|
import type { MermaidConfig, BaseDiagramConfig } from '../packages/mermaid/src/config.type.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -16,15 +17,12 @@ const MERMAID_CONFIG_DIAGRAM_KEYS = [
|
|||||||
'er',
|
'er',
|
||||||
'pie',
|
'pie',
|
||||||
'quadrantChart',
|
'quadrantChart',
|
||||||
'xyChart',
|
|
||||||
'requirement',
|
'requirement',
|
||||||
'mindmap',
|
'mindmap',
|
||||||
'timeline',
|
'timeline',
|
||||||
'gitGraph',
|
'gitGraph',
|
||||||
'c4',
|
'c4',
|
||||||
'sankey',
|
'sankey',
|
||||||
'block',
|
|
||||||
'packet',
|
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -36,7 +34,7 @@ const MERMAID_CONFIG_DIAGRAM_KEYS = [
|
|||||||
* @param mermaidConfigSchema - The Mermaid JSON Schema to use.
|
* @param mermaidConfigSchema - The Mermaid JSON Schema to use.
|
||||||
* @returns The default mermaid config object.
|
* @returns The default mermaid config object.
|
||||||
*/
|
*/
|
||||||
function generateDefaults(mermaidConfigSchema: JSONSchemaType<MermaidConfig>) {
|
export function generateDefaults(mermaidConfigSchema: JSONSchemaType<MermaidConfig>) {
|
||||||
const ajv = new Ajv2019({
|
const ajv = new Ajv2019({
|
||||||
useDefaults: true,
|
useDefaults: true,
|
||||||
allowUnionTypes: true,
|
allowUnionTypes: true,
|
||||||
|
@@ -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);
|
|
||||||
}
|
|
@@ -1,8 +0,0 @@
|
|||||||
# Changesets
|
|
||||||
|
|
||||||
Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
|
|
||||||
with multi-package repos, or single-package repos to help you version and publish your code. You can
|
|
||||||
find the full documentation for it [in our repository](https://github.com/changesets/changesets)
|
|
||||||
|
|
||||||
We have a quick list of common questions to get you started engaging with this project in
|
|
||||||
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md)
|
|
@@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json",
|
|
||||||
"changelog": ["@changesets/changelog-github", { "repo": "mermaid-js/mermaid" }],
|
|
||||||
"commit": false,
|
|
||||||
"fixed": [],
|
|
||||||
"linked": [],
|
|
||||||
"access": "public",
|
|
||||||
"baseBranch": "master",
|
|
||||||
"updateInternalDependencies": "patch",
|
|
||||||
"bumpVersionsWithWorkspaceProtocolOnly": true,
|
|
||||||
"ignore": ["@mermaid-js/docs", "@mermaid-js/webpack-test", "@mermaid-js/mermaid-example-diagram"]
|
|
||||||
}
|
|
3
.commitlintrc.json
Normal file
3
.commitlintrc.json
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"extends": ["@commitlint/config-conventional"]
|
||||||
|
}
|
@@ -1,148 +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
|
|
||||||
DAGA
|
|
||||||
datakey
|
|
||||||
DEND
|
|
||||||
descr
|
|
||||||
distp
|
|
||||||
distq
|
|
||||||
divs
|
|
||||||
docref
|
|
||||||
DOMID
|
|
||||||
doublecircle
|
|
||||||
DOUBLECIRCLEEND
|
|
||||||
DOUBLECIRCLESTART
|
|
||||||
DQUOTE
|
|
||||||
DSTART
|
|
||||||
edgesep
|
|
||||||
EMPTYSTR
|
|
||||||
enddate
|
|
||||||
ERDIAGRAM
|
|
||||||
flatmap
|
|
||||||
forwardable
|
|
||||||
frontmatter
|
|
||||||
funs
|
|
||||||
gantt
|
|
||||||
GENERICTYPE
|
|
||||||
getBoundarys
|
|
||||||
grammr
|
|
||||||
graphtype
|
|
||||||
iife
|
|
||||||
interp
|
|
||||||
introdcued
|
|
||||||
INVTRAPEND
|
|
||||||
INVTRAPSTART
|
|
||||||
JDBC
|
|
||||||
jison
|
|
||||||
Kaufmann
|
|
||||||
keyify
|
|
||||||
LABELPOS
|
|
||||||
LABELTYPE
|
|
||||||
lcov
|
|
||||||
LEFTOF
|
|
||||||
Lexa
|
|
||||||
linebreak
|
|
||||||
LINETYPE
|
|
||||||
LINKSTYLE
|
|
||||||
LLABEL
|
|
||||||
loglevel
|
|
||||||
LOGMSG
|
|
||||||
lookaheads
|
|
||||||
mdast
|
|
||||||
metafile
|
|
||||||
minlen
|
|
||||||
Mstartx
|
|
||||||
MULT
|
|
||||||
NODIR
|
|
||||||
NSTR
|
|
||||||
outdir
|
|
||||||
Qcontrolx
|
|
||||||
reinit
|
|
||||||
rels
|
|
||||||
reqs
|
|
||||||
rewritelinks
|
|
||||||
rgba
|
|
||||||
RIGHTOF
|
|
||||||
roughjs
|
|
||||||
sankey
|
|
||||||
sequencenumber
|
|
||||||
shrc
|
|
||||||
signaltype
|
|
||||||
someclass
|
|
||||||
SPACELINE
|
|
||||||
SPACELIST
|
|
||||||
STADIUMEND
|
|
||||||
STADIUMSTART
|
|
||||||
startdate
|
|
||||||
startx
|
|
||||||
starty
|
|
||||||
STMNT
|
|
||||||
stopx
|
|
||||||
stopy
|
|
||||||
strikethrough
|
|
||||||
stringifying
|
|
||||||
struct
|
|
||||||
STYLECLASS
|
|
||||||
STYLEDEF
|
|
||||||
STYLEOPTS
|
|
||||||
subcomponent
|
|
||||||
subcomponents
|
|
||||||
subconfig
|
|
||||||
SUBROUTINEEND
|
|
||||||
SUBROUTINESTART
|
|
||||||
Subschemas
|
|
||||||
substr
|
|
||||||
SVGG
|
|
||||||
SVGSVG
|
|
||||||
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,76 +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
|
|
||||||
roughjs
|
|
||||||
rscratch
|
|
||||||
shiki
|
|
||||||
Slidev
|
|
||||||
sparkline
|
|
||||||
sphinxcontrib
|
|
||||||
ssim
|
|
||||||
stylis
|
|
||||||
Swimm
|
|
||||||
tsbuildinfo
|
|
||||||
tseslint
|
|
||||||
Tuleap
|
|
||||||
Typora
|
|
||||||
unocss
|
|
||||||
unplugin
|
|
||||||
unstub
|
|
||||||
vite
|
|
||||||
vitest
|
|
||||||
Zune
|
|
@@ -1,41 +0,0 @@
|
|||||||
Adamiecki
|
|
||||||
arrowend
|
|
||||||
bmatrix
|
|
||||||
braintree
|
|
||||||
catmull
|
|
||||||
compositTitleSize
|
|
||||||
doublecircle
|
|
||||||
elems
|
|
||||||
gantt
|
|
||||||
gitgraph
|
|
||||||
gzipped
|
|
||||||
handDrawn
|
|
||||||
knsv
|
|
||||||
Knut
|
|
||||||
marginx
|
|
||||||
marginy
|
|
||||||
Markdownish
|
|
||||||
mermaidjs
|
|
||||||
mindmap
|
|
||||||
mindmaps
|
|
||||||
mrtree
|
|
||||||
multigraph
|
|
||||||
nodesep
|
|
||||||
NOTEGROUP
|
|
||||||
Pinterest
|
|
||||||
rankdir
|
|
||||||
ranksep
|
|
||||||
rect
|
|
||||||
rects
|
|
||||||
sandboxed
|
|
||||||
siebling
|
|
||||||
statediagram
|
|
||||||
substate
|
|
||||||
Sveidqvist
|
|
||||||
unfixable
|
|
||||||
Viewbox
|
|
||||||
viewports
|
|
||||||
visio
|
|
||||||
vitepress
|
|
||||||
xlink
|
|
||||||
xychart
|
|
@@ -1,6 +0,0 @@
|
|||||||
BRANDES
|
|
||||||
circo
|
|
||||||
handDrawn
|
|
||||||
KOEPF
|
|
||||||
neato
|
|
||||||
newbranch
|
|
@@ -1,64 +1,31 @@
|
|||||||
import { build } from 'esbuild';
|
import { build } from 'esbuild';
|
||||||
import { mkdir, writeFile } from 'node:fs/promises';
|
import { mkdir, writeFile } from 'node:fs/promises';
|
||||||
|
import { getBuildConfig } from './util.js';
|
||||||
import { packageOptions } from '../.build/common.js';
|
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 shouldVisualize = process.argv.includes('--visualize');
|
||||||
|
|
||||||
const buildPackage = async (entryName: keyof typeof packageOptions) => {
|
const buildPackage = async (entryName: keyof typeof packageOptions) => {
|
||||||
const commonOptions: MermaidBuildOptions = { ...defaultOptions, entryName } as const;
|
await build(getBuildConfig({ entryName, minify: false }));
|
||||||
const buildConfigs: MermaidBuildOptions[] = [
|
const { metafile } = await build(
|
||||||
// package.mjs
|
getBuildConfig({ entryName, minify: true, metafile: shouldVisualize })
|
||||||
{ ...commonOptions },
|
);
|
||||||
// package.min.mjs
|
if (metafile) {
|
||||||
{
|
// Upload metafile into https://esbuild.github.io/analyze/
|
||||||
...commonOptions,
|
await writeFile(`stats/meta-${entryName}.json`, JSON.stringify(metafile));
|
||||||
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));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
await build(getBuildConfig({ entryName, minify: false, core: true }));
|
||||||
|
await build(getBuildConfig({ entryName, minify: true, format: 'iife' }));
|
||||||
};
|
};
|
||||||
|
|
||||||
const handler = (e) => {
|
const handler = (e) => {
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.error(e);
|
console.error(e);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
};
|
};
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
await generateLangium();
|
await mkdir('stats').catch(() => {});
|
||||||
await mkdir('stats', { recursive: true });
|
|
||||||
const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[];
|
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) {
|
for (const pkg of packageNames) {
|
||||||
await buildPackage(pkg).catch(handler);
|
await buildPackage(pkg).catch(handler);
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
import { readFile } from 'node:fs/promises';
|
import { readFile } from 'node:fs/promises';
|
||||||
import { transformJison } from '../.build/jisonTransformer.js';
|
import { transformJison } from '../.build/jisonTransformer.js';
|
||||||
import type { Plugin } from 'esbuild';
|
import { Plugin } from 'esbuild';
|
||||||
|
|
||||||
export const jisonPlugin: Plugin = {
|
export const jisonPlugin: Plugin = {
|
||||||
name: 'jison',
|
name: 'jison',
|
||||||
|
@@ -1,47 +1,30 @@
|
|||||||
/* 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 express from 'express';
|
||||||
import { packageOptions } from '../.build/common.js';
|
import type { NextFunction, Request, Response } from 'express';
|
||||||
import { generateLangium } from '../.build/generateLangium.js';
|
import cors from 'cors';
|
||||||
import { defaultOptions, getBuildConfig } from './util.js';
|
import { getBuildConfig } from './util.js';
|
||||||
|
import { context } from 'esbuild';
|
||||||
|
import chokidar from 'chokidar';
|
||||||
|
|
||||||
const configs = Object.values(packageOptions).map(({ packageName }) =>
|
const mermaidCtx = await context(
|
||||||
getBuildConfig({ ...defaultOptions, minify: false, core: false, entryName: packageName })
|
getBuildConfig({ minify: false, core: false, entryName: 'mermaid' })
|
||||||
);
|
);
|
||||||
const mermaidIIFEConfig = getBuildConfig({
|
const mermaidIIFECtx = await context(
|
||||||
...defaultOptions,
|
getBuildConfig({ minify: false, core: false, entryName: 'mermaid', format: 'iife' })
|
||||||
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) }))
|
|
||||||
);
|
);
|
||||||
|
const externalCtx = await context(
|
||||||
|
getBuildConfig({ minify: false, core: false, entryName: 'mermaid-example-diagram' })
|
||||||
|
);
|
||||||
|
const zenumlCtx = await context(
|
||||||
|
getBuildConfig({ minify: false, core: false, entryName: 'mermaid-zenuml' })
|
||||||
|
);
|
||||||
|
const contexts = [mermaidCtx, mermaidIIFECtx, externalCtx, zenumlCtx];
|
||||||
|
|
||||||
let rebuildCounter = 1;
|
|
||||||
const rebuildAll = async () => {
|
const rebuildAll = async () => {
|
||||||
const buildNumber = rebuildCounter++;
|
await Promise.all(contexts.map((ctx) => ctx.rebuild()));
|
||||||
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 }[] = [];
|
let clients: { id: number; response: Response }[] = [];
|
||||||
function eventsHandler(request: Request, response: Response) {
|
function eventsHandler(request: Request, response: Response, next: NextFunction) {
|
||||||
const headers = {
|
const headers = {
|
||||||
'Content-Type': 'text/event-stream',
|
'Content-Type': 'text/event-stream',
|
||||||
Connection: 'keep-alive',
|
Connection: 'keep-alive',
|
||||||
@@ -58,20 +41,19 @@ function eventsHandler(request: Request, response: Response) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
let timeoutID: NodeJS.Timeout | undefined = undefined;
|
let timeoutId: NodeJS.Timeout | undefined = undefined;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Debounce file change events to avoid rebuilding multiple times.
|
* Debounce file change events to avoid rebuilding multiple times.
|
||||||
*/
|
*/
|
||||||
function handleFileChange() {
|
function handleFileChange() {
|
||||||
if (timeoutID !== undefined) {
|
if (timeoutId !== undefined) {
|
||||||
clearTimeout(timeoutID);
|
clearTimeout(timeoutId);
|
||||||
}
|
}
|
||||||
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
timeoutId = setTimeout(async () => {
|
||||||
timeoutID = setTimeout(async () => {
|
|
||||||
await rebuildAll();
|
await rebuildAll();
|
||||||
sendEventsToAll();
|
sendEventsToAll();
|
||||||
timeoutID = undefined;
|
timeoutId = undefined;
|
||||||
}, 100);
|
}, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,32 +62,26 @@ function sendEventsToAll() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function createServer() {
|
async function createServer() {
|
||||||
await generateLangium();
|
|
||||||
handleFileChange();
|
|
||||||
const app = express();
|
const app = express();
|
||||||
chokidar
|
chokidar
|
||||||
.watch('**/src/**/*.{js,ts,langium,yaml,json}', {
|
.watch('**/src/**/*.{js,ts,yaml,json}', {
|
||||||
ignoreInitial: true,
|
ignoreInitial: true,
|
||||||
ignored: [/node_modules/, /dist/, /docs/, /coverage/],
|
ignored: [/node_modules/, /dist/, /docs/, /coverage/],
|
||||||
})
|
})
|
||||||
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
||||||
.on('all', async (event, path) => {
|
.on('all', async (event, path) => {
|
||||||
// Ignore other events.
|
// Ignore other events.
|
||||||
if (!['add', 'change'].includes(event)) {
|
if (!['add', 'change'].includes(event)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
console.log(`${path} changed. Rebuilding...`);
|
console.log(`${path} changed. Rebuilding...`);
|
||||||
if (path.endsWith('.langium')) {
|
|
||||||
await generateLangium();
|
|
||||||
}
|
|
||||||
handleFileChange();
|
handleFileChange();
|
||||||
});
|
});
|
||||||
|
|
||||||
app.use(cors());
|
app.use(cors());
|
||||||
app.get('/events', eventsHandler);
|
app.get('/events', eventsHandler);
|
||||||
for (const { packageName } of Object.values(packageOptions)) {
|
app.use(express.static('./packages/mermaid/dist'));
|
||||||
app.use(express.static(`./packages/${packageName}/dist`));
|
app.use(express.static('./packages/mermaid-zenuml/dist'));
|
||||||
}
|
app.use(express.static('./packages/mermaid-example-diagram/dist'));
|
||||||
app.use(express.static('demos'));
|
app.use(express.static('demos'));
|
||||||
app.use(express.static('cypress/platform'));
|
app.use(express.static('cypress/platform'));
|
||||||
|
|
||||||
@@ -114,4 +90,4 @@ async function createServer() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void createServer();
|
createServer();
|
||||||
|
@@ -8,21 +8,14 @@ import { jisonPlugin } from './jisonPlugin.js';
|
|||||||
|
|
||||||
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
||||||
|
|
||||||
export interface MermaidBuildOptions extends BuildOptions {
|
interface MermaidBuildOptions {
|
||||||
minify: boolean;
|
minify: boolean;
|
||||||
core: boolean;
|
core?: boolean;
|
||||||
metafile: boolean;
|
metafile?: boolean;
|
||||||
format: 'esm' | 'iife';
|
format?: 'esm' | 'iife';
|
||||||
entryName: keyof typeof packageOptions;
|
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 => {
|
const buildOptions = (override: BuildOptions): BuildOptions => {
|
||||||
return {
|
return {
|
||||||
bundle: true,
|
bundle: true,
|
||||||
@@ -39,35 +32,24 @@ const buildOptions = (override: BuildOptions): BuildOptions => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const getFileName = (fileName: string, { core, format, minify }: MermaidBuildOptions) => {
|
export const getBuildConfig = ({
|
||||||
if (core) {
|
minify,
|
||||||
fileName += '.core';
|
core,
|
||||||
} else if (format === 'esm') {
|
entryName,
|
||||||
fileName += '.esm';
|
metafile,
|
||||||
}
|
format,
|
||||||
if (minify) {
|
}: MermaidBuildOptions): BuildOptions => {
|
||||||
fileName += '.min';
|
|
||||||
}
|
|
||||||
return fileName;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => {
|
|
||||||
const { core, entryName, metafile, format, minify } = options;
|
|
||||||
const external: string[] = ['require', 'fs', 'path'];
|
const external: string[] = ['require', 'fs', 'path'];
|
||||||
const { name, file, packageName } = packageOptions[entryName];
|
const { name, file, packageName } = packageOptions[entryName];
|
||||||
const outFileName = getFileName(name, options);
|
let output: BuildOptions = buildOptions({
|
||||||
const output: BuildOptions = buildOptions({
|
|
||||||
absWorkingDir: resolve(__dirname, `../packages/${packageName}`),
|
absWorkingDir: resolve(__dirname, `../packages/${packageName}`),
|
||||||
entryPoints: {
|
entryPoints: {
|
||||||
[outFileName]: `src/${file}`,
|
[`${name}${core ? '.core' : format === 'iife' ? '' : '.esm'}${
|
||||||
|
minify ? '.min' : ''
|
||||||
|
}`]: `src/${file}`,
|
||||||
},
|
},
|
||||||
metafile,
|
metafile,
|
||||||
minify,
|
|
||||||
logLevel: 'info',
|
logLevel: 'info',
|
||||||
chunkNames: `chunks/${outFileName}/[name]-[hash]`,
|
|
||||||
define: {
|
|
||||||
'import.meta.vitest': 'undefined',
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (core) {
|
if (core) {
|
||||||
@@ -85,8 +67,6 @@ export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => {
|
|||||||
output.format = 'iife';
|
output.format = 'iife';
|
||||||
output.splitting = false;
|
output.splitting = false;
|
||||||
output.globalName = '__esbuild_esm_mermaid';
|
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 = {
|
output.footer = {
|
||||||
js: 'globalThis.mermaid = globalThis.__esbuild_esm_mermaid.default;',
|
js: 'globalThis.mermaid = globalThis.__esbuild_esm_mermaid.default;',
|
||||||
};
|
};
|
||||||
|
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
|
162
.eslintrc.cjs
Normal file
162
.eslintrc.cjs
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
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/no-floating-promises': 'error',
|
||||||
|
'@typescript-eslint/no-misused-promises': 'error',
|
||||||
|
'@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,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'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,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
5
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
5
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -17,9 +17,6 @@ body:
|
|||||||
- Use a clear and concise title
|
- Use a clear and concise title
|
||||||
- Fill out the text fields with as much detail as possible.
|
- Fill out the text fields with as much detail as possible.
|
||||||
- Never be shy to give us screenshots and/or code samples. It will help!
|
- Never be shy to give us screenshots and/or code samples. It will help!
|
||||||
|
|
||||||
There is a chance that the bug is already fixed in the git `develop` branch, but is not released yet.
|
|
||||||
So please check in [Live Editor - Develop](https://develop.git.mermaid.live) before raising an issue.
|
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Description
|
label: Description
|
||||||
@@ -46,7 +43,7 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: Code Sample
|
label: Code Sample
|
||||||
description: |-
|
description: |-
|
||||||
If applicable, add the code sample or a link to the [Live Editor - Develop](https://develop.git.mermaid.live).
|
If applicable, add the code sample or a link to the [Live Editor](https://mermaid.live).
|
||||||
Any text pasted here will be rendered as a Code block.
|
Any text pasted here will be rendered as a Code block.
|
||||||
render: text
|
render: text
|
||||||
- type: textarea
|
- type: textarea
|
||||||
|
14
.github/ISSUE_TEMPLATE/config.yml
vendored
14
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -3,18 +3,12 @@ contact_links:
|
|||||||
- name: GitHub Discussions
|
- name: GitHub Discussions
|
||||||
url: https://github.com/mermaid-js/mermaid/discussions
|
url: https://github.com/mermaid-js/mermaid/discussions
|
||||||
about: Ask the Community questions or share your own graphs in our discussions.
|
about: Ask the Community questions or share your own graphs in our discussions.
|
||||||
- name: Discord
|
- name: Slack
|
||||||
url: https://discord.gg/AgrbSrBer3
|
url: https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE
|
||||||
about: Join our Community on Discord for Help and a casual chat.
|
about: Join our Community on Slack for Help and a casual chat.
|
||||||
- name: Documentation
|
- name: Documentation
|
||||||
url: https://mermaid.js.org
|
url: https://mermaid-js.github.io
|
||||||
about: Read our documentation for all that Mermaid.js can offer.
|
about: Read our documentation for all that Mermaid.js can offer.
|
||||||
- name: Live Editor
|
- name: Live Editor
|
||||||
url: https://mermaid.live
|
url: https://mermaid.live
|
||||||
about: Try the live editor to preview graphs in no time.
|
about: Try the live editor to preview graphs in no time.
|
||||||
- name: Live Editor - Develop
|
|
||||||
url: https://develop.git.mermaid.live
|
|
||||||
about: Try unreleased changes in the develop branch.
|
|
||||||
- name: Live Editor - Next
|
|
||||||
url: https://next.git.mermaid.live
|
|
||||||
about: Try unreleased changes in the next branch.
|
|
||||||
|
1
.github/codecov.yaml
vendored
1
.github/codecov.yaml
vendored
@@ -15,4 +15,3 @@ coverage:
|
|||||||
# Turing off for now as code coverage isn't stable and causes unnecessary build failures.
|
# Turing off for now as code coverage isn't stable and causes unnecessary build failures.
|
||||||
# default:
|
# default:
|
||||||
# threshold: 2%
|
# threshold: 2%
|
||||||
patch: off
|
|
||||||
|
13
.github/lychee.toml
vendored
13
.github/lychee.toml
vendored
@@ -34,17 +34,8 @@ exclude = [
|
|||||||
# Don't check files that are generated during the build via `pnpm docs:code`
|
# Don't check files that are generated during the build via `pnpm docs:code`
|
||||||
'packages/mermaid/src/docs/config/setup/*',
|
'packages/mermaid/src/docs/config/setup/*',
|
||||||
|
|
||||||
# Ignore Discord invite
|
# Ignore slack invite
|
||||||
"https://discord.gg",
|
"https://join.slack.com/"
|
||||||
|
|
||||||
# BundlePhobia has frequent downtime
|
|
||||||
"https://bundlephobia.com",
|
|
||||||
|
|
||||||
# Chrome webstore migration issue. Temporary
|
|
||||||
"https://chromewebstore.google.com",
|
|
||||||
|
|
||||||
# Drupal 403
|
|
||||||
"https://(www.)?drupal.org"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# Exclude all private IPs from checking.
|
# Exclude all private IPs from checking.
|
||||||
|
26
.github/pr-labeler.yml
vendored
26
.github/pr-labeler.yml
vendored
@@ -1,22 +1,4 @@
|
|||||||
# yaml-language-server: $schema=https://raw.githubusercontent.com/release-drafter/release-drafter/master/schema.json
|
'Type: Bug / Error': ['bug/*', fix/*]
|
||||||
autolabeler:
|
'Type: Enhancement': ['feature/*', 'feat/*']
|
||||||
- label: 'Type: Bug / Error'
|
'Type: Other': ['other/*', 'chore/*', 'test/*', 'refactor/*']
|
||||||
branch:
|
'Area: Documentation': ['docs/*']
|
||||||
- '/bug\/.+/'
|
|
||||||
- '/fix\/.+/'
|
|
||||||
- label: 'Type: Enhancement'
|
|
||||||
branch:
|
|
||||||
- '/feature\/.+/'
|
|
||||||
- '/feat\/.+/'
|
|
||||||
- label: 'Type: Other'
|
|
||||||
branch:
|
|
||||||
- '/other\/.+/'
|
|
||||||
- '/chore\/.+/'
|
|
||||||
- '/test\/.+/'
|
|
||||||
- '/refactor\/.+/'
|
|
||||||
- label: 'Area: Documentation'
|
|
||||||
branch:
|
|
||||||
- '/docs\/.+/'
|
|
||||||
|
|
||||||
template: |
|
|
||||||
This field is unused, as we only use this config file for labeling PRs.
|
|
||||||
|
6
.github/pull_request_template.md
vendored
6
.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
|
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.
|
- [ ] :computer: have added necessary unit/e2e tests.
|
||||||
- [ ] :notebook: have added documentation. Make sure [`MERMAID_RELEASE_VERSION`](https://mermaid.js.org/community/contributing.html#update-documentation) is used for all new features.
|
- [ ] :notebook: have added documentation. Make sure [`MERMAID_RELEASE_VERSION`](https://github.com/mermaid-js/mermaid/blob/develop/packages/mermaid/src/docs/community/development.md#3-update-documentation) is used for all new features.
|
||||||
- [ ] :butterfly: If your PR makes a change that should be noted in one or more packages' changelogs, generate a changeset by running `pnpm changeset` and following the prompts. Changesets that add features should be `minor` and those that fix bugs should be `patch`. Please prefix changeset messages with `feat:`, `fix:`, or `chore:`.
|
- [ ] :bookmark: targeted `develop` branch
|
||||||
|
25
.github/release-drafter.yml
vendored
Normal file
25
.github/release-drafter.yml
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
name-template: '$NEXT_PATCH_VERSION'
|
||||||
|
tag-template: '$NEXT_PATCH_VERSION'
|
||||||
|
categories:
|
||||||
|
- title: '🚀 Features'
|
||||||
|
labels:
|
||||||
|
- 'Type: Enhancement'
|
||||||
|
- title: '🐛 Bug Fixes'
|
||||||
|
labels:
|
||||||
|
- 'Type: Bug / Error'
|
||||||
|
- title: '🧰 Maintenance'
|
||||||
|
label: 'Type: Other'
|
||||||
|
change-template: '- $TITLE (#$NUMBER) @$AUTHOR'
|
||||||
|
sort-by: title
|
||||||
|
sort-direction: ascending
|
||||||
|
branches:
|
||||||
|
- develop
|
||||||
|
exclude-labels:
|
||||||
|
- 'Skip changelog'
|
||||||
|
no-changes-template: 'This release contains minor changes and bugfixes.'
|
||||||
|
template: |
|
||||||
|
# Release Notes
|
||||||
|
|
||||||
|
$CHANGES
|
||||||
|
|
||||||
|
🎉 **Thanks to all contributors helping with this release!** 🎉
|
43
.github/workflows/autofix.yml
vendored
43
.github/workflows/autofix.yml
vendored
@@ -1,43 +0,0 @@
|
|||||||
name: autofix.ci # needed to securely identify the workflow
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches-ignore:
|
|
||||||
- 'renovate/**'
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
autofix:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v4
|
|
||||||
# uses version from "packageManager" field in package.json
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
cache: pnpm
|
|
||||||
node-version-file: '.node-version'
|
|
||||||
|
|
||||||
- name: Install Packages
|
|
||||||
run: |
|
|
||||||
pnpm install --frozen-lockfile
|
|
||||||
env:
|
|
||||||
CYPRESS_CACHE_FOLDER: .cache/Cypress
|
|
||||||
|
|
||||||
- name: Fix Linting
|
|
||||||
shell: bash
|
|
||||||
run: pnpm -w run lint:fix
|
|
||||||
|
|
||||||
- name: Sync `./src/config.type.ts` with `./src/schemas/config.schema.yaml`
|
|
||||||
shell: bash
|
|
||||||
run: pnpm run --filter mermaid types:build-config
|
|
||||||
|
|
||||||
- name: Build Docs
|
|
||||||
working-directory: ./packages/mermaid
|
|
||||||
run: pnpm run docs:build
|
|
||||||
|
|
||||||
- uses: autofix-ci/action@ff86a557419858bb967097bfc916833f5647fa8c
|
|
10
.github/workflows/build-docs.yml
vendored
10
.github/workflows/build-docs.yml
vendored
@@ -16,20 +16,20 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v2
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version-file: '.node-version'
|
node-version: 18
|
||||||
|
|
||||||
- name: Install Packages
|
- name: Install Packages
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Verify release version
|
- name: Verify release verion
|
||||||
if: ${{ github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/heads/release')) }}
|
if: ${{ github.event_name == 'push' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/heads/release')) }}
|
||||||
run: pnpm --filter mermaid run docs:verify-version
|
run: pnpm --filter mermaid run docs:verify-version
|
||||||
|
|
||||||
|
17
.github/workflows/build.yml
vendored
17
.github/workflows/build.yml
vendored
@@ -15,17 +15,20 @@ permissions:
|
|||||||
jobs:
|
jobs:
|
||||||
build-mermaid:
|
build-mermaid:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [18.x]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v2
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version-file: '.node-version'
|
node-version: ${{ matrix.node-version }}
|
||||||
|
|
||||||
- name: Install Packages
|
- name: Install Packages
|
||||||
run: |
|
run: |
|
||||||
@@ -37,13 +40,13 @@ jobs:
|
|||||||
run: pnpm run build
|
run: pnpm run build
|
||||||
|
|
||||||
- name: Upload Mermaid Build as Artifact
|
- name: Upload Mermaid Build as Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: mermaid-build
|
name: mermaid-build
|
||||||
path: packages/mermaid/dist
|
path: packages/mermaid/dist
|
||||||
|
|
||||||
- name: Upload Mermaid Mindmap Build as Artifact
|
- name: Upload Mermaid Mindmap Build as Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: mermaid-mindmap-build
|
name: mermaid-mindmap-build
|
||||||
path: packages/mermaid-mindmap/dist
|
path: packages/mermaid-mindmap/dist
|
||||||
|
2
.github/workflows/check-readme-in-sync.yml
vendored
2
.github/workflows/check-readme-in-sync.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Check for difference in README.md and docs/README.md
|
- name: Check for difference in README.md and docs/README.md
|
||||||
run: |
|
run: |
|
||||||
|
2
.github/workflows/checks.yml
vendored
2
.github/workflows/checks.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
|||||||
name: check tests
|
name: check tests
|
||||||
if: github.repository_owner == 'mermaid-js'
|
if: github.repository_owner == 'mermaid-js'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: testomatio/check-tests@stable
|
- uses: testomatio/check-tests@stable
|
||||||
|
8
.github/workflows/codeql.yml
vendored
8
.github/workflows/codeql.yml
vendored
@@ -29,11 +29,11 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v3
|
uses: github/codeql-action/init@v2
|
||||||
with:
|
with:
|
||||||
config-file: ./.github/codeql/codeql-config.yml
|
config-file: ./.github/codeql/codeql-config.yml
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
@@ -45,7 +45,7 @@ jobs:
|
|||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# 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)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v3
|
uses: github/codeql-action/autobuild@v2
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ 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
|
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||||
@@ -59,4 +59,4 @@ jobs:
|
|||||||
# make release
|
# make release
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v3
|
uses: github/codeql-action/analyze@v2
|
||||||
|
6
.github/workflows/dependency-review.yml
vendored
6
.github/workflows/dependency-review.yml
vendored
@@ -1,6 +1,6 @@
|
|||||||
# Dependency Review Action
|
# Dependency Review Action
|
||||||
#
|
#
|
||||||
# This Action will scan dependency manifest files that change as part of a Pull Request, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging.
|
# This Action will scan dependency manifest files that change as part of a Pull Reqest, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging.
|
||||||
#
|
#
|
||||||
# Source repository: https://github.com/actions/dependency-review-action
|
# Source repository: https://github.com/actions/dependency-review-action
|
||||||
# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement
|
# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement
|
||||||
@@ -15,6 +15,6 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: 'Checkout Repository'
|
- name: 'Checkout Repository'
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
- name: 'Dependency Review'
|
- name: 'Dependency Review'
|
||||||
uses: actions/dependency-review-action@v4
|
uses: actions/dependency-review-action@v3
|
||||||
|
18
.github/workflows/e2e-applitools.yml
vendored
18
.github/workflows/e2e-applitools.yml
vendored
@@ -21,24 +21,24 @@ env:
|
|||||||
jobs:
|
jobs:
|
||||||
e2e-applitools:
|
e2e-applitools:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
strategy:
|
||||||
image: cypress/browsers:node-20.11.0-chrome-121.0.6167.85-1-ff-120.0-edge-121.0.2277.83-1
|
matrix:
|
||||||
options: --user 1001
|
node-version: [18.x]
|
||||||
steps:
|
steps:
|
||||||
- if: ${{ ! env.USE_APPLI }}
|
- if: ${{ ! env.USE_APPLI }}
|
||||||
name: Warn if not using Applitools
|
name: Warn if not using Applitools
|
||||||
run: |
|
run: |
|
||||||
echo "::error,title=Not using Applitools::APPLITOOLS_API_KEY is empty, disabling Applitools for this run."
|
echo "::error,title=Not using Applitols::APPLITOOLS_API_KEY is empty, disabling Applitools for this run."
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v2
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version: ${{ matrix.node-version }}
|
||||||
|
|
||||||
- if: ${{ env.USE_APPLI }}
|
- if: ${{ env.USE_APPLI }}
|
||||||
name: Notify applitools of new batch
|
name: Notify applitools of new batch
|
||||||
|
118
.github/workflows/e2e.yml
vendored
118
.github/workflows/e2e.yml
vendored
@@ -2,142 +2,52 @@ name: E2E
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches-ignore:
|
|
||||||
- 'gh-readonly-queue/**'
|
|
||||||
pull_request:
|
pull_request:
|
||||||
merge_group:
|
merge_group:
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
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') }}
|
|
||||||
jobs:
|
jobs:
|
||||||
cache:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container:
|
|
||||||
image: cypress/browsers:node-20.11.0-chrome-121.0.6167.85-1-ff-120.0-edge-121.0.2277.83-1
|
|
||||||
options: --user 1001
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- uses: pnpm/action-setup@v4
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version-file: '.node-version'
|
|
||||||
- name: Cache snapshots
|
|
||||||
id: cache-snapshot
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
save-always: true
|
|
||||||
path: ./cypress/snapshots
|
|
||||||
key: ${{ runner.os }}-snapshots-${{ env.targetHash }}
|
|
||||||
|
|
||||||
# If a snapshot for a given Hash is not found, we checkout that commit, run the tests and cache the snapshots.
|
|
||||||
- name: Switch to base branch
|
|
||||||
if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }}
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
ref: ${{ env.targetHash }}
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }}
|
|
||||||
uses: cypress-io/github-action@v6
|
|
||||||
with:
|
|
||||||
# just perform install
|
|
||||||
runTests: false
|
|
||||||
|
|
||||||
- name: Calculate bundle size
|
|
||||||
if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true'}}
|
|
||||||
run: |
|
|
||||||
pnpm run build:viz
|
|
||||||
mkdir -p cypress/snapshots/stats/base
|
|
||||||
mv stats cypress/snapshots/stats/base
|
|
||||||
|
|
||||||
e2e:
|
e2e:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container:
|
|
||||||
image: cypress/browsers:node-20.11.0-chrome-121.0.6167.85-1-ff-120.0-edge-121.0.2277.83-1
|
|
||||||
options: --user 1001
|
|
||||||
needs: cache
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
|
node-version: [18.x]
|
||||||
containers: [1, 2, 3, 4]
|
containers: [1, 2, 3, 4]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v2
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version: ${{ matrix.node-version }}
|
||||||
|
|
||||||
# These cached snapshots are downloaded, providing the reference snapshots.
|
|
||||||
- name: Cache snapshots
|
|
||||||
id: cache-snapshot
|
|
||||||
uses: actions/cache/restore@v4
|
|
||||||
with:
|
|
||||||
path: ./cypress/snapshots
|
|
||||||
key: ${{ runner.os }}-snapshots-${{ env.targetHash }}
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
uses: cypress-io/github-action@v6
|
|
||||||
with:
|
|
||||||
runTests: false
|
|
||||||
|
|
||||||
- name: Output size diff
|
|
||||||
if: ${{ matrix.containers == 1 }}
|
|
||||||
run: |
|
|
||||||
pnpm run build:viz
|
|
||||||
mv stats cypress/snapshots/stats/head
|
|
||||||
echo '## Bundle size difference' >> "$GITHUB_STEP_SUMMARY"
|
|
||||||
echo '' >> "$GITHUB_STEP_SUMMARY"
|
|
||||||
npx tsx scripts/size.ts >> "$GITHUB_STEP_SUMMARY"
|
|
||||||
|
|
||||||
# Install NPM dependencies, cache them correctly
|
# Install NPM dependencies, cache them correctly
|
||||||
# and run all Cypress tests
|
# and run all Cypress tests
|
||||||
- name: Cypress run
|
- name: Cypress run
|
||||||
uses: cypress-io/github-action@v6
|
uses: cypress-io/github-action@v4
|
||||||
id: cypress
|
id: cypress
|
||||||
# If CYPRESS_RECORD_KEY is set, run in parallel on all containers
|
# 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
|
# Otherwise (e.g. if running from fork), we run on a single container only
|
||||||
if: ${{ env.shouldRunParallel == 'true' || ( matrix.containers == 1 ) }}
|
if: ${{ ( env.CYPRESS_RECORD_KEY != '' ) || ( matrix.containers == 1 ) }}
|
||||||
with:
|
with:
|
||||||
install: false
|
|
||||||
start: pnpm run dev:coverage
|
start: pnpm run dev:coverage
|
||||||
wait-on: 'http://localhost:9000'
|
wait-on: 'http://localhost:9000'
|
||||||
browser: chrome
|
|
||||||
# Disable recording if we don't have an API key
|
# Disable recording if we don't have an API key
|
||||||
# e.g. if this action was run from a fork
|
# e.g. if this action was run from a fork
|
||||||
record: ${{ env.shouldRunParallel == 'true' }}
|
record: ${{ secrets.CYPRESS_RECORD_KEY != '' }}
|
||||||
parallel: ${{ env.shouldRunParallel == 'true' }}
|
parallel: ${{ secrets.CYPRESS_RECORD_KEY != '' }}
|
||||||
env:
|
env:
|
||||||
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
||||||
VITEST_COVERAGE: true
|
VITEST_COVERAGE: true
|
||||||
CYPRESS_COMMIT: ${{ github.sha }}
|
CYPRESS_COMMIT: ${{ github.sha }}
|
||||||
ARGOS_TOKEN: ${{ secrets.ARGOS_TOKEN }}
|
|
||||||
ARGOS_PARALLEL: ${{ env.shouldRunParallel == 'true' }}
|
|
||||||
ARGOS_PARALLEL_TOTAL: 4
|
|
||||||
ARGOS_PARALLEL_INDEX: ${{ matrix.containers }}
|
|
||||||
|
|
||||||
- name: Upload Coverage to Codecov
|
- name: Upload Coverage to Codecov
|
||||||
uses: codecov/codecov-action@v4
|
uses: codecov/codecov-action@v3
|
||||||
# Run step only pushes to develop and pull_requests
|
# Run step only pushes to develop and pull_requests
|
||||||
if: ${{ steps.cypress.conclusion == 'success' && (github.event_name == 'pull_request' || github.ref == 'refs/heads/develop')}}
|
if: ${{ steps.cypress.conclusion == 'success' && (github.event_name == 'pull_request' || github.ref == 'refs/heads/develop')}}
|
||||||
with:
|
with:
|
||||||
@@ -147,3 +57,9 @@ jobs:
|
|||||||
fail_ci_if_error: false
|
fail_ci_if_error: false
|
||||||
verbose: true
|
verbose: true
|
||||||
token: 6845cc80-77ee-4e17-85a1-026cd95e0766
|
token: 6845cc80-77ee-4e17-85a1-026cd95e0766
|
||||||
|
- name: Upload Artifacts
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
if: ${{ failure() && steps.cypress.conclusion == 'failure' }}
|
||||||
|
with:
|
||||||
|
name: error-snapshots
|
||||||
|
path: cypress/snapshots/**/__diff_output__/*
|
||||||
|
6
.github/workflows/link-checker.yml
vendored
6
.github/workflows/link-checker.yml
vendored
@@ -26,17 +26,17 @@ jobs:
|
|||||||
# lychee only uses the GITHUB_TOKEN to avoid rate-limiting
|
# lychee only uses the GITHUB_TOKEN to avoid rate-limiting
|
||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Restore lychee cache
|
- name: Restore lychee cache
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: .lycheecache
|
path: .lycheecache
|
||||||
key: cache-lychee-${{ github.sha }}
|
key: cache-lychee-${{ github.sha }}
|
||||||
restore-keys: cache-lychee-
|
restore-keys: cache-lychee-
|
||||||
|
|
||||||
- name: Link Checker
|
- name: Link Checker
|
||||||
uses: lycheeverse/lychee-action@v1.9.3
|
uses: lycheeverse/lychee-action@v1.8.0
|
||||||
with:
|
with:
|
||||||
args: >-
|
args: >-
|
||||||
--config .github/lychee.toml
|
--config .github/lychee.toml
|
||||||
|
43
.github/workflows/lint.yml
vendored
43
.github/workflows/lint.yml
vendored
@@ -16,17 +16,20 @@ permissions:
|
|||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [18.x]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v2
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version-file: '.node-version'
|
node-version: ${{ matrix.node-version }}
|
||||||
|
|
||||||
- name: Install Packages
|
- name: Install Packages
|
||||||
run: |
|
run: |
|
||||||
@@ -59,22 +62,8 @@ jobs:
|
|||||||
ERROR_MESSAGE+=' `pnpm run --filter mermaid types:build-config`'
|
ERROR_MESSAGE+=' `pnpm run --filter mermaid types:build-config`'
|
||||||
ERROR_MESSAGE+=' on your local machine.'
|
ERROR_MESSAGE+=' on your local machine.'
|
||||||
echo "::error title=Lint failure::${ERROR_MESSAGE}"
|
echo "::error title=Lint failure::${ERROR_MESSAGE}"
|
||||||
# make sure to return an error exitcode so that GitHub actions shows a red-cross
|
# make sure to return an error exitcode so that GitHub actions shows a red-cross
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Verify no circular dependencies
|
|
||||||
working-directory: ./packages/mermaid
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
if ! pnpm run --filter mermaid checkCircle; then
|
|
||||||
ERROR_MESSAGE='Circular dependency detected.'
|
|
||||||
ERROR_MESSAGE+=' This should be fixed by removing the circular dependency.'
|
|
||||||
ERROR_MESSAGE+=' Run `pnpm run --filter mermaid checkCircle` on your local machine'
|
|
||||||
ERROR_MESSAGE+=' to see the circular dependency.'
|
|
||||||
echo "::error title=Lint failure::${ERROR_MESSAGE}"
|
|
||||||
# make sure to return an error exitcode so that GitHub actions shows a red-cross
|
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Verify Docs
|
- name: Verify Docs
|
||||||
@@ -82,3 +71,15 @@ jobs:
|
|||||||
working-directory: ./packages/mermaid
|
working-directory: ./packages/mermaid
|
||||||
continue-on-error: ${{ github.event_name == 'push' }}
|
continue-on-error: ${{ github.event_name == 'push' }}
|
||||||
run: pnpm run docs:verify
|
run: pnpm run docs:verify
|
||||||
|
|
||||||
|
- name: Rebuild Docs
|
||||||
|
if: ${{ steps.verifyDocs.outcome == 'failure' && github.event_name == 'push' }}
|
||||||
|
working-directory: ./packages/mermaid
|
||||||
|
run: pnpm run docs:build
|
||||||
|
|
||||||
|
- name: Commit changes
|
||||||
|
uses: EndBug/add-and-commit@v9
|
||||||
|
if: ${{ steps.verifyDocs.outcome == 'failure' && github.event_name == 'push' }}
|
||||||
|
with:
|
||||||
|
message: 'Update docs'
|
||||||
|
add: 'docs/*'
|
||||||
|
23
.github/workflows/pr-labeler-config-validator.yml
vendored
Normal file
23
.github/workflows/pr-labeler-config-validator.yml
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
name: Validate PR Labeler Configuration
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- .github/workflows/pr-labeler-config-validator.yml
|
||||||
|
- .github/workflows/pr-labeler.yml
|
||||||
|
- .github/pr-labeler.yml
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- .github/workflows/pr-labeler-config-validator.yml
|
||||||
|
- .github/workflows/pr-labeler.yml
|
||||||
|
- .github/pr-labeler.yml
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
pr-labeler:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout Repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
- name: Validate Configuration
|
||||||
|
uses: Yash-Singh1/pr-labeler-config-validator@releases/v0.0.3
|
||||||
|
with:
|
||||||
|
configuration-path: .github/pr-labeler.yml
|
22
.github/workflows/pr-labeler.yml
vendored
22
.github/workflows/pr-labeler.yml
vendored
@@ -1,31 +1,13 @@
|
|||||||
name: Apply labels to PR
|
name: Apply labels to PR
|
||||||
on:
|
on:
|
||||||
pull_request_target:
|
pull_request_target:
|
||||||
# required for pr-labeler to support PRs from forks
|
types: [opened]
|
||||||
# ===================== ⛔ ☢️ 🚫 ⚠️ Warning ⚠️ 🚫 ☢️ ⛔ =======================
|
|
||||||
# Be very careful what you put in this GitHub Action workflow file to avoid
|
|
||||||
# malicious PRs from getting access to the Mermaid-js repo.
|
|
||||||
#
|
|
||||||
# Please read the following first before reviewing/merging:
|
|
||||||
# - https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target
|
|
||||||
# - https://securitylab.github.com/research/github-actions-preventing-pwn-requests/
|
|
||||||
types: [opened, reopened, synchronize]
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
pr-labeler:
|
pr-labeler:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
|
||||||
contents: read # read permission is required to read config file
|
|
||||||
pull-requests: write # write permission is required to label PRs
|
|
||||||
steps:
|
steps:
|
||||||
- name: Label PR
|
- name: Label PR
|
||||||
uses: release-drafter/release-drafter@v6
|
uses: TimonVS/pr-labeler-action@v4
|
||||||
with:
|
|
||||||
config-name: pr-labeler.yml
|
|
||||||
disable-autolabeler: false
|
|
||||||
disable-releaser: true
|
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
14
.github/workflows/publish-docs.yml
vendored
14
.github/workflows/publish-docs.yml
vendored
@@ -23,27 +23,27 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v2
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version-file: '.node-version'
|
node-version: 18
|
||||||
|
|
||||||
- name: Install Packages
|
- name: Install Packages
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Setup Pages
|
- name: Setup Pages
|
||||||
uses: actions/configure-pages@v4
|
uses: actions/configure-pages@v3
|
||||||
|
|
||||||
- name: Run Build
|
- name: Run Build
|
||||||
run: pnpm --filter mermaid run docs:build:vitepress
|
run: pnpm --filter mermaid run docs:build:vitepress
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-pages-artifact@v3
|
uses: actions/upload-pages-artifact@v1
|
||||||
with:
|
with:
|
||||||
path: packages/mermaid/src/vitepress/.vitepress/dist
|
path: packages/mermaid/src/vitepress/.vitepress/dist
|
||||||
|
|
||||||
@@ -56,4 +56,4 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Deploy to GitHub Pages
|
- name: Deploy to GitHub Pages
|
||||||
id: deployment
|
id: deployment
|
||||||
uses: actions/deploy-pages@v4
|
uses: actions/deploy-pages@v2
|
||||||
|
15
.github/workflows/release-draft.yml
vendored
Normal file
15
.github/workflows/release-draft.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
name: Draft Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- develop
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
draft-release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Draft Release
|
||||||
|
uses: toolmantim/release-drafter@v5
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
@@ -9,17 +9,17 @@ jobs:
|
|||||||
publish-preview:
|
publish-preview:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v2
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version-file: '.node-version'
|
node-version: 18.x
|
||||||
|
|
||||||
- name: Install Packages
|
- name: Install Packages
|
||||||
run: |
|
run: |
|
||||||
|
10
.github/workflows/release-publish.yml
vendored
10
.github/workflows/release-publish.yml
vendored
@@ -8,17 +8,17 @@ jobs:
|
|||||||
publish:
|
publish:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
- uses: fregante/setup-git-user@v2
|
- uses: fregante/setup-git-user@v2
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v2
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js v18
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version-file: '.node-version'
|
node-version: 18.x
|
||||||
|
|
||||||
- name: Install Packages
|
- name: Install Packages
|
||||||
run: |
|
run: |
|
||||||
|
37
.github/workflows/release.yml
vendored
37
.github/workflows/release.yml
vendored
@@ -1,37 +0,0 @@
|
|||||||
name: Release
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
concurrency: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
name: Release
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout Repo
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v4
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
cache: pnpm
|
|
||||||
node-version-file: '.node-version'
|
|
||||||
|
|
||||||
- name: Install Packages
|
|
||||||
run: pnpm install --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Create Release Pull Request or Publish to npm
|
|
||||||
id: changesets
|
|
||||||
uses: changesets/action@v1
|
|
||||||
with:
|
|
||||||
version: pnpm changeset:version
|
|
||||||
publish: pnpm changeset:publish
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
15
.github/workflows/test.yml
vendored
15
.github/workflows/test.yml
vendored
@@ -8,17 +8,20 @@ permissions:
|
|||||||
jobs:
|
jobs:
|
||||||
unit-test:
|
unit-test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [18.x]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v4
|
- uses: pnpm/action-setup@v2
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version-file: '.node-version'
|
node-version: ${{ matrix.node-version }}
|
||||||
|
|
||||||
- name: Install Packages
|
- name: Install Packages
|
||||||
run: |
|
run: |
|
||||||
@@ -39,7 +42,7 @@ jobs:
|
|||||||
pnpm exec vitest run ./packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts --coverage
|
pnpm exec vitest run ./packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts --coverage
|
||||||
|
|
||||||
- name: Upload Coverage to Codecov
|
- name: Upload Coverage to Codecov
|
||||||
uses: codecov/codecov-action@v4
|
uses: codecov/codecov-action@v3
|
||||||
# Run step only pushes to develop and pull_requests
|
# Run step only pushes to develop and pull_requests
|
||||||
if: ${{ github.event_name == 'pull_request' || github.ref == 'refs/heads/develop' }}
|
if: ${{ github.event_name == 'pull_request' || github.ref == 'refs/heads/develop' }}
|
||||||
with:
|
with:
|
||||||
|
11
.github/workflows/update-browserlist.yml
vendored
11
.github/workflows/update-browserlist.yml
vendored
@@ -8,18 +8,11 @@ jobs:
|
|||||||
update-browser-list:
|
update-browser-list:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v3
|
||||||
- uses: pnpm/action-setup@v4
|
- run: npx browserslist@latest --update-db
|
||||||
- run: npx update-browserslist-db@latest
|
|
||||||
- name: Commit changes
|
- name: Commit changes
|
||||||
uses: EndBug/add-and-commit@v9
|
uses: EndBug/add-and-commit@v9
|
||||||
with:
|
with:
|
||||||
author_name: ${{ github.actor }}
|
author_name: ${{ github.actor }}
|
||||||
author_email: ${{ github.actor }}@users.noreply.github.com
|
author_email: ${{ github.actor }}@users.noreply.github.com
|
||||||
message: 'chore: update browsers list'
|
message: 'chore: update browsers list'
|
||||||
push: false
|
|
||||||
- name: Create Pull Request
|
|
||||||
uses: peter-evans/create-pull-request@v6
|
|
||||||
with:
|
|
||||||
branch: update-browserslist
|
|
||||||
title: Update Browserslist
|
|
||||||
|
8
.gitignore
vendored
8
.gitignore
vendored
@@ -35,7 +35,7 @@ cypress/snapshots/
|
|||||||
.tsbuildinfo
|
.tsbuildinfo
|
||||||
tsconfig.tsbuildinfo
|
tsconfig.tsbuildinfo
|
||||||
|
|
||||||
#knsv*.html
|
knsv*.html
|
||||||
local*.html
|
local*.html
|
||||||
stats/
|
stats/
|
||||||
|
|
||||||
@@ -46,9 +46,3 @@ stats/
|
|||||||
|
|
||||||
demos/dev/**
|
demos/dev/**
|
||||||
!/demos/dev/example.html
|
!/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
|
#!/bin/sh
|
||||||
. "$(dirname "$0")/_/husky.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
|
// https://prettier.io/docs/en/cli.html#--cache
|
||||||
'prettier --write',
|
'prettier --write',
|
||||||
],
|
],
|
||||||
'.cspell/*.txt': ['tsx scripts/fixCSpell.ts'],
|
'cSpell.json': ['ts-node-esm scripts/fixCSpell.ts'],
|
||||||
'**/*.jison': ['pnpm -w run lint:jison'],
|
'**/*.jison': ['pnpm -w run lint:jison'],
|
||||||
};
|
};
|
||||||
|
@@ -1 +0,0 @@
|
|||||||
20.12.2
|
|
2
.npmrc
2
.npmrc
@@ -1,4 +1,2 @@
|
|||||||
registry=https://registry.npmjs.org
|
|
||||||
auto-install-peers=true
|
auto-install-peers=true
|
||||||
strict-peer-dependencies=false
|
strict-peer-dependencies=false
|
||||||
package-import-method=clone-or-copy
|
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
dist
|
dist
|
||||||
cypress/platform/xss3.html
|
cypress/platform/xss3.html
|
||||||
.cache
|
.cache
|
||||||
.pnpm-store
|
|
||||||
coverage
|
coverage
|
||||||
# Autogenerated by PNPM
|
# Autogenerated by PNPM
|
||||||
pnpm-lock.yaml
|
pnpm-lock.yaml
|
||||||
@@ -11,10 +10,3 @@ stats
|
|||||||
.nyc_output
|
.nyc_output
|
||||||
# Autogenerated by `pnpm run --filter mermaid types:build-config`
|
# Autogenerated by `pnpm run --filter mermaid types:build-config`
|
||||||
packages/mermaid/src/config.type.ts
|
packages/mermaid/src/config.type.ts
|
||||||
# autogenereated by langium-cli
|
|
||||||
generated/
|
|
||||||
# Ignore the files creates in /demos/dev except for example.html
|
|
||||||
demos/dev/**
|
|
||||||
!/demos/dev/example.html
|
|
||||||
# TODO: Lots of errors to fix
|
|
||||||
cypress/platform/state-refactor.html
|
|
||||||
|
@@ -3,6 +3,5 @@
|
|||||||
"printWidth": 100,
|
"printWidth": 100,
|
||||||
"singleQuote": true,
|
"singleQuote": true,
|
||||||
"useTabs": false,
|
"useTabs": false,
|
||||||
"tabWidth": 2,
|
"tabWidth": 2
|
||||||
"trailingComma": "es5"
|
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
import type { InlineConfig } from 'vite';
|
import { build, InlineConfig, type PluginOption } from 'vite';
|
||||||
import { build, type PluginOption } from 'vite';
|
|
||||||
import { resolve } from 'path';
|
import { resolve } from 'path';
|
||||||
import { fileURLToPath } from 'url';
|
import { fileURLToPath } from 'url';
|
||||||
import jisonPlugin from './jisonPlugin.js';
|
import jisonPlugin from './jisonPlugin.js';
|
||||||
@@ -9,7 +8,6 @@ import { visualizer } from 'rollup-plugin-visualizer';
|
|||||||
import type { TemplateType } from 'rollup-plugin-visualizer/dist/plugin/template-types.js';
|
import type { TemplateType } from 'rollup-plugin-visualizer/dist/plugin/template-types.js';
|
||||||
import istanbul from 'vite-plugin-istanbul';
|
import istanbul from 'vite-plugin-istanbul';
|
||||||
import { packageOptions } from '../.build/common.js';
|
import { packageOptions } from '../.build/common.js';
|
||||||
import { generateLangium } from '../.build/generateLangium.js';
|
|
||||||
|
|
||||||
const visualize = process.argv.includes('--visualize');
|
const visualize = process.argv.includes('--visualize');
|
||||||
const watch = process.argv.includes('--watch');
|
const watch = process.argv.includes('--watch');
|
||||||
@@ -47,10 +45,9 @@ interface BuildOptions {
|
|||||||
|
|
||||||
export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions): InlineConfig => {
|
export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions): InlineConfig => {
|
||||||
const external: (string | RegExp)[] = ['require', 'fs', 'path'];
|
const external: (string | RegExp)[] = ['require', 'fs', 'path'];
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.log(entryName, packageOptions[entryName]);
|
console.log(entryName, packageOptions[entryName]);
|
||||||
const { name, file, packageName } = packageOptions[entryName];
|
const { name, file, packageName } = packageOptions[entryName];
|
||||||
const output: OutputOptions = [
|
let output: OutputOptions = [
|
||||||
{
|
{
|
||||||
name,
|
name,
|
||||||
format: 'esm',
|
format: 'esm',
|
||||||
@@ -76,18 +73,16 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions)
|
|||||||
output,
|
output,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
define: {
|
|
||||||
'import.meta.vitest': 'undefined',
|
|
||||||
},
|
|
||||||
resolve: {
|
resolve: {
|
||||||
extensions: [],
|
extensions: [],
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
jisonPlugin(),
|
jisonPlugin(),
|
||||||
jsonSchemaPlugin(), // handles `.schema.yaml` files
|
jsonSchemaPlugin(), // handles `.schema.yaml` files
|
||||||
|
// @ts-expect-error According to the type definitions, rollup plugins are incompatible with vite
|
||||||
typescript({ compilerOptions: { declaration: false } }),
|
typescript({ compilerOptions: { declaration: false } }),
|
||||||
istanbul({
|
istanbul({
|
||||||
exclude: ['node_modules', 'test/', '__mocks__', 'generated'],
|
exclude: ['node_modules', 'test/', '__mocks__'],
|
||||||
extension: ['.js', '.ts'],
|
extension: ['.js', '.ts'],
|
||||||
requireEnv: true,
|
requireEnv: true,
|
||||||
forceBuildInstrument: coverage,
|
forceBuildInstrument: coverage,
|
||||||
@@ -111,24 +106,18 @@ const buildPackage = async (entryName: keyof typeof packageOptions) => {
|
|||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[];
|
const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[];
|
||||||
for (const pkg of packageNames.filter(
|
for (const pkg of packageNames.filter((pkg) => !mermaidOnly || pkg === 'mermaid')) {
|
||||||
(pkg) => !mermaidOnly || pkg === 'mermaid' || pkg === 'parser'
|
|
||||||
)) {
|
|
||||||
await buildPackage(pkg);
|
await buildPackage(pkg);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
await generateLangium();
|
|
||||||
|
|
||||||
if (watch) {
|
if (watch) {
|
||||||
await build(getBuildConfig({ minify: false, watch, core: false, entryName: 'parser' }));
|
build(getBuildConfig({ minify: false, watch, core: false, entryName: 'mermaid' }));
|
||||||
void build(getBuildConfig({ minify: false, watch, core: false, entryName: 'mermaid' }));
|
|
||||||
if (!mermaidOnly) {
|
if (!mermaidOnly) {
|
||||||
void build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-example-diagram' }));
|
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-zenuml' }));
|
||||||
}
|
}
|
||||||
} else if (visualize) {
|
} 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: true, entryName: 'mermaid' }));
|
||||||
await build(getBuildConfig({ minify: false, core: false, entryName: 'mermaid' }));
|
await build(getBuildConfig({ minify: false, core: false, entryName: 'mermaid' }));
|
||||||
} else {
|
} else {
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import type { PluginOption } from 'vite';
|
import { PluginOption } from 'vite';
|
||||||
import { getDefaults, getSchema, loadSchema } from '../.build/jsonSchema.js';
|
import { getDefaults, getSchema, loadSchema } from '../.build/jsonSchema.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
import express from 'express';
|
import express from 'express';
|
||||||
import cors from 'cors';
|
import cors from 'cors';
|
||||||
import { createServer as createViteServer } from 'vite';
|
import { createServer as createViteServer } from 'vite';
|
||||||
import { packageOptions } from '../.build/common.js';
|
|
||||||
|
|
||||||
async function createServer() {
|
async function createServer() {
|
||||||
const app = express();
|
const app = express();
|
||||||
@@ -15,17 +14,16 @@ async function createServer() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
app.use(cors());
|
app.use(cors());
|
||||||
for (const { packageName } of Object.values(packageOptions)) {
|
app.use(express.static('./packages/mermaid/dist'));
|
||||||
app.use(express.static(`./packages/${packageName}/dist`));
|
app.use(express.static('./packages/mermaid-zenuml/dist'));
|
||||||
}
|
app.use(express.static('./packages/mermaid-example-diagram/dist'));
|
||||||
app.use(vite.middlewares);
|
app.use(vite.middlewares);
|
||||||
app.use(express.static('demos'));
|
app.use(express.static('demos'));
|
||||||
app.use(express.static('cypress/platform'));
|
app.use(express.static('cypress/platform'));
|
||||||
|
|
||||||
app.listen(9000, () => {
|
app.listen(9000, () => {
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.log(`Listening on http://localhost:9000`);
|
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": [
|
"recommendations": [
|
||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"esbenp.prettier-vscode",
|
"esbenp.prettier-vscode",
|
||||||
"vitest.explorer",
|
"zixuanchen.vitest-explorer",
|
||||||
"luniclynx.bison"
|
"luniclynx.bison"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
3
.vscode/launch.json
vendored
3
.vscode/launch.json
vendored
@@ -18,8 +18,7 @@
|
|||||||
"type": "node",
|
"type": "node",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"args": ["scripts/docs.cli.mts"],
|
"args": ["scripts/docs.cli.mts"],
|
||||||
// we'll need to change this to --import in Node.JS v20.6.0 and up
|
"runtimeArgs": ["--loader", "ts-node/esm"],
|
||||||
"runtimeArgs": ["--loader", "tsx/esm"],
|
|
||||||
"cwd": "${workspaceRoot}/packages/mermaid",
|
"cwd": "${workspaceRoot}/packages/mermaid",
|
||||||
"skipFiles": ["<node_internals>/**", "**/node_modules/**"],
|
"skipFiles": ["<node_internals>/**", "**/node_modules/**"],
|
||||||
"smartStep": true,
|
"smartStep": true,
|
||||||
|
14
CHANGELOG.md
14
CHANGELOG.md
@@ -68,7 +68,7 @@ try {
|
|||||||
|
|
||||||
### Init deprecated and InitThrowsErrors removed
|
### Init deprecated and InitThrowsErrors removed
|
||||||
|
|
||||||
The config passed to `init` was not being used earlier.
|
The config passed to `init` was not being used eariler.
|
||||||
It will now be used.
|
It will now be used.
|
||||||
The `init` function is deprecated and will be removed in the next major release.
|
The `init` function is deprecated and will be removed in the next major release.
|
||||||
init currently works as a wrapper to `initialize` and `run`.
|
init currently works as a wrapper to `initialize` and `run`.
|
||||||
@@ -195,7 +195,7 @@ mermaid.run({
|
|||||||
- "Cannot activate" in sequenceDiagram [\#647](https://github.com/knsv/mermaid/issues/647)
|
- "Cannot activate" in sequenceDiagram [\#647](https://github.com/knsv/mermaid/issues/647)
|
||||||
- Link \("click" statement\) in flowchart does not work in exported SVG [\#646](https://github.com/knsv/mermaid/issues/646)
|
- Link \("click" statement\) in flowchart does not work in exported SVG [\#646](https://github.com/knsv/mermaid/issues/646)
|
||||||
- How to pass styling [\#639](https://github.com/knsv/mermaid/issues/639)
|
- How to pass styling [\#639](https://github.com/knsv/mermaid/issues/639)
|
||||||
- The live editor can't show seq diagram with notes for 8.0.0-alpha.3 [\#638](https://github.com/knsv/mermaid/issues/638)
|
- The live editor cant show seq diagram with notes for 8.0.0-alpha.3 [\#638](https://github.com/knsv/mermaid/issues/638)
|
||||||
- import mermaid.css with ES6 + NPM [\#634](https://github.com/knsv/mermaid/issues/634)
|
- import mermaid.css with ES6 + NPM [\#634](https://github.com/knsv/mermaid/issues/634)
|
||||||
- Actor line cuts through other elements [\#633](https://github.com/knsv/mermaid/issues/633)
|
- Actor line cuts through other elements [\#633](https://github.com/knsv/mermaid/issues/633)
|
||||||
- Graph TD line out of the picture \(left side\) [\#630](https://github.com/knsv/mermaid/issues/630)
|
- Graph TD line out of the picture \(left side\) [\#630](https://github.com/knsv/mermaid/issues/630)
|
||||||
@@ -504,7 +504,7 @@ mermaid.run({
|
|||||||
|
|
||||||
- Docs css: code hard to read [\#324](https://github.com/knsv/mermaid/issues/324)
|
- Docs css: code hard to read [\#324](https://github.com/knsv/mermaid/issues/324)
|
||||||
- About Markpad integration [\#323](https://github.com/knsv/mermaid/issues/323)
|
- About Markpad integration [\#323](https://github.com/knsv/mermaid/issues/323)
|
||||||
- How to link backwards in flowchat? [\#321](https://github.com/knsv/mermaid/issues/321)
|
- How to link backwords in flowchat? [\#321](https://github.com/knsv/mermaid/issues/321)
|
||||||
- Help with editor [\#310](https://github.com/knsv/mermaid/issues/310)
|
- Help with editor [\#310](https://github.com/knsv/mermaid/issues/310)
|
||||||
- +1 [\#293](https://github.com/knsv/mermaid/issues/293)
|
- +1 [\#293](https://github.com/knsv/mermaid/issues/293)
|
||||||
- Basic chart does not render on Chome, but does in Firefox [\#290](https://github.com/knsv/mermaid/issues/290)
|
- Basic chart does not render on Chome, but does in Firefox [\#290](https://github.com/knsv/mermaid/issues/290)
|
||||||
@@ -619,7 +619,7 @@ mermaid.run({
|
|||||||
- render to png from the cli does not display the marker-end arrow heads [\#181](https://github.com/knsv/mermaid/issues/181)
|
- render to png from the cli does not display the marker-end arrow heads [\#181](https://github.com/knsv/mermaid/issues/181)
|
||||||
- Links in sequence diagrams [\#159](https://github.com/knsv/mermaid/issues/159)
|
- Links in sequence diagrams [\#159](https://github.com/knsv/mermaid/issues/159)
|
||||||
- comment characters `%%` cause parse error [\#141](https://github.com/knsv/mermaid/issues/141)
|
- comment characters `%%` cause parse error [\#141](https://github.com/knsv/mermaid/issues/141)
|
||||||
- Add a reversed asymmetric shape [\#124](https://github.com/knsv/mermaid/issues/124)
|
- Add a reversed assymetric shape [\#124](https://github.com/knsv/mermaid/issues/124)
|
||||||
- Add syntax for double headed arrows [\#123](https://github.com/knsv/mermaid/issues/123)
|
- Add syntax for double headed arrows [\#123](https://github.com/knsv/mermaid/issues/123)
|
||||||
- Support for font-awesome [\#49](https://github.com/knsv/mermaid/issues/49)
|
- Support for font-awesome [\#49](https://github.com/knsv/mermaid/issues/49)
|
||||||
|
|
||||||
@@ -659,7 +659,7 @@ mermaid.run({
|
|||||||
- Auto linewrap for notes in sequence diagrams [\#178](https://github.com/knsv/mermaid/issues/178)
|
- Auto linewrap for notes in sequence diagrams [\#178](https://github.com/knsv/mermaid/issues/178)
|
||||||
- Execute code after initialize [\#176](https://github.com/knsv/mermaid/issues/176)
|
- Execute code after initialize [\#176](https://github.com/knsv/mermaid/issues/176)
|
||||||
- Autoscaling for all diagram types [\#175](https://github.com/knsv/mermaid/issues/175)
|
- Autoscaling for all diagram types [\#175](https://github.com/knsv/mermaid/issues/175)
|
||||||
- Problem with click event callback [\#174](https://github.com/knsv/mermaid/issues/174)
|
- Problem wit click event callback [\#174](https://github.com/knsv/mermaid/issues/174)
|
||||||
- How to escape characters? [\#170](https://github.com/knsv/mermaid/issues/170)
|
- How to escape characters? [\#170](https://github.com/knsv/mermaid/issues/170)
|
||||||
- it can not work [\#167](https://github.com/knsv/mermaid/issues/167)
|
- it can not work [\#167](https://github.com/knsv/mermaid/issues/167)
|
||||||
- UML Class diagram [\#154](https://github.com/knsv/mermaid/issues/154)
|
- UML Class diagram [\#154](https://github.com/knsv/mermaid/issues/154)
|
||||||
@@ -762,7 +762,7 @@ mermaid.run({
|
|||||||
- subgraph background is black in rendered flowchart PNG via CLI [\#121](https://github.com/knsv/mermaid/issues/121)
|
- subgraph background is black in rendered flowchart PNG via CLI [\#121](https://github.com/knsv/mermaid/issues/121)
|
||||||
- Integrate editor at https://github.com/naseer/mermaid-webapp [\#110](https://github.com/knsv/mermaid/issues/110)
|
- Integrate editor at https://github.com/naseer/mermaid-webapp [\#110](https://github.com/knsv/mermaid/issues/110)
|
||||||
- Internet Explorer Support [\#99](https://github.com/knsv/mermaid/issues/99)
|
- Internet Explorer Support [\#99](https://github.com/knsv/mermaid/issues/99)
|
||||||
- Asymmetric shapes not documented [\#82](https://github.com/knsv/mermaid/issues/82)
|
- Assymetric shapes not documented [\#82](https://github.com/knsv/mermaid/issues/82)
|
||||||
- NoModificationAllowedError [\#23](https://github.com/knsv/mermaid/issues/23)
|
- NoModificationAllowedError [\#23](https://github.com/knsv/mermaid/issues/23)
|
||||||
- Improve arrows [\#3](https://github.com/knsv/mermaid/issues/3)
|
- Improve arrows [\#3](https://github.com/knsv/mermaid/issues/3)
|
||||||
|
|
||||||
@@ -908,7 +908,7 @@ mermaid.run({
|
|||||||
|
|
||||||
- Question marks don't render properly with /dist/mermaid.full.min.js [\#30](https://github.com/knsv/mermaid/issues/30)
|
- Question marks don't render properly with /dist/mermaid.full.min.js [\#30](https://github.com/knsv/mermaid/issues/30)
|
||||||
- Error with some characters [\#25](https://github.com/knsv/mermaid/issues/25)
|
- Error with some characters [\#25](https://github.com/knsv/mermaid/issues/25)
|
||||||
- Provide parse function in browser without `require`? [\#21](https://github.com/knsv/mermaid/issues/21)
|
- Provide parse function in browser widthout `require`? [\#21](https://github.com/knsv/mermaid/issues/21)
|
||||||
- Better label text support [\#18](https://github.com/knsv/mermaid/issues/18)
|
- Better label text support [\#18](https://github.com/knsv/mermaid/issues/18)
|
||||||
- Cap-cased words break parser [\#8](https://github.com/knsv/mermaid/issues/8)
|
- Cap-cased words break parser [\#8](https://github.com/knsv/mermaid/issues/8)
|
||||||
|
|
||||||
|
@@ -59,8 +59,8 @@ representative at an online or offline event.
|
|||||||
## Enforcement
|
## Enforcement
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
reported to the community leaders responsible for enforcement at <security@mermaid.live>.
|
reported to the community leaders responsible for enforcement at security@mermaid.live
|
||||||
|
.
|
||||||
All complaints will be reviewed and investigated promptly and fairly.
|
All complaints will be reviewed and investigated promptly and fairly.
|
||||||
|
|
||||||
All community leaders are obligated to respect the privacy and security of the
|
All community leaders are obligated to respect the privacy and security of the
|
||||||
|
@@ -1 +0,0 @@
|
|||||||
./packages/mermaid/src/docs/community/contributing.md
|
|
76
CONTRIBUTING.md
Normal file
76
CONTRIBUTING.md
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
# Contributing
|
||||||
|
|
||||||
|
Please read in detail about how to contribute documentation and code on the [Mermaid documentation site.](https://mermaid-js.github.io/mermaid/#/development)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Mermaid contribution cheat-sheet
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- [volta](https://volta.sh/) to manage node versions.
|
||||||
|
- [Node.js](https://nodejs.org/en/). `volta install node`
|
||||||
|
- [pnpm](https://pnpm.io/) package manager. `volta install pnpm`
|
||||||
|
|
||||||
|
## Development Installation
|
||||||
|
|
||||||
|
If you don't have direct access to push to mermaid repositories, make a fork first. Then clone. Or clone directly from mermaid-js:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone git@github.com:mermaid-js/mermaid.git
|
||||||
|
cd mermaid
|
||||||
|
```
|
||||||
|
|
||||||
|
Install required packages:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# npx is required for first install as volta support for pnpm is not added yet.
|
||||||
|
npx pnpm install
|
||||||
|
pnpm test # run unit tests
|
||||||
|
pnpm dev # starts a dev server
|
||||||
|
```
|
||||||
|
|
||||||
|
Open <http://localhost:9000> in your browser after starting the dev server.
|
||||||
|
You can also duplicate the `example.html` file in `demos/dev`, rename it and add your own mermaid code to it.
|
||||||
|
That will be served at <http://localhost:9000/dev/your-file-name.html>.
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
|
||||||
|
If you are using docker and docker-compose, you have self-documented `run` bash script, which is a convenient alias for docker-compose commands:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./run install # npx pnpm install
|
||||||
|
./run test # pnpm test
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Run unit test
|
||||||
|
pnpm test
|
||||||
|
# Run unit test in watch mode
|
||||||
|
pnpm test:watch
|
||||||
|
# Run E2E test
|
||||||
|
pnpm e2e
|
||||||
|
# Debug E2E tests
|
||||||
|
pnpm dev
|
||||||
|
pnpm cypress:open # in another terminal
|
||||||
|
```
|
||||||
|
|
||||||
|
## Branch name format:
|
||||||
|
|
||||||
|
```text
|
||||||
|
[feature | bug | chore | docs]/[issue number]_[short description using dashes ('-') or underscores ('_') instead of spaces]
|
||||||
|
```
|
||||||
|
|
||||||
|
eg: `feature/2945_state-diagram-new-arrow-florbs`, `bug/1123_fix_random_ugly_red_text`
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Documentation is necessary for all non bugfix/refactoring changes.
|
||||||
|
|
||||||
|
Only make changes to files that are in [`/packages/mermaid/src/docs`](packages/mermaid/src/docs)
|
||||||
|
|
||||||
|
**_DO NOT CHANGE FILES IN `/docs`_**
|
||||||
|
|
||||||
|
[Join our slack community if you want closer contact!](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE)
|
@@ -1,2 +0,0 @@
|
|||||||
FROM node:20.12.2-alpine3.19 AS base
|
|
||||||
RUN wget -qO- https://get.pnpm.io/install.sh | ENV="$HOME/.shrc" SHELL="$(which sh)" sh -
|
|
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"drips": {
|
|
||||||
"ethereum": {
|
|
||||||
"ownedBy": "0x0831DDFe60d009d9448CC976157b539089aB821E"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
78
README.md
78
README.md
@@ -15,14 +15,11 @@ Generate diagrams from markdown-like text.
|
|||||||
<a href="https://mermaid.live/"><b>Live Editor!</b></a>
|
<a href="https://mermaid.live/"><b>Live Editor!</b></a>
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://mermaid.js.org">📖 Documentation</a> | <a href="https://mermaid.js.org/intro/">🚀 Getting Started</a> | <a href="https://www.jsdelivr.com/package/npm/mermaid">🌐 CDN</a> | <a href="https://discord.gg/AgrbSrBer3" title="Discord invite">🙌 Join Us</a>
|
<a href="https://mermaid.js.org">📖 Documentation</a> | <a href="https://mermaid.js.org/intro/">🚀 Getting Started</a> | <a href="https://www.jsdelivr.com/package/npm/mermaid">🌐 CDN</a> | <a href="https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE" title="Slack invite">🙌 Join Us</a>
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="./README.zh-CN.md">简体中文</a>
|
<a href="./README.zh-CN.md">简体中文</a>
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
|
||||||
Try Live Editor previews of future releases: <a href="https://develop.git.mermaid.live/" title="Try the mermaid version from the develop branch.">Develop</a> | <a href="https://next.git.mermaid.live/" title="Try the mermaid version from the next branch.">Next</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
@@ -33,9 +30,8 @@ Try Live Editor previews of future releases: <a href="https://develop.git.mermai
|
|||||||
[](https://app.codecov.io/github/mermaid-js/mermaid/tree/develop)
|
[](https://app.codecov.io/github/mermaid-js/mermaid/tree/develop)
|
||||||
[](https://www.jsdelivr.com/package/npm/mermaid)
|
[](https://www.jsdelivr.com/package/npm/mermaid)
|
||||||
[](https://www.npmjs.com/package/mermaid)
|
[](https://www.npmjs.com/package/mermaid)
|
||||||
[](https://discord.gg/AgrbSrBer3)
|
[](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE)
|
||||||
[](https://twitter.com/mermaidjs_)
|
[](https://twitter.com/mermaidjs_)
|
||||||
[](https://argos-ci.com)
|
|
||||||
|
|
||||||
<img src="./img/header.png" alt="" />
|
<img src="./img/header.png" alt="" />
|
||||||
|
|
||||||
@@ -43,23 +39,7 @@ Try Live Editor previews of future releases: <a href="https://develop.git.mermai
|
|||||||
|
|
||||||
**Thanks to all involved, people committing pull requests, people answering questions! 🙏**
|
**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
|
|
||||||
|
|
||||||
<details>
|
|
||||||
<summary>Expand contents</summary>
|
|
||||||
|
|
||||||
- [About](#about)
|
|
||||||
- [Examples](#examples)
|
|
||||||
- [Release](#release)
|
|
||||||
- [Related projects](#related-projects)
|
|
||||||
- [Contributors](#contributors---)
|
|
||||||
- [Security and safe diagrams](#security-and-safe-diagrams)
|
|
||||||
- [Reporting vulnerabilities](#reporting-vulnerabilities)
|
|
||||||
- [Appreciation](#appreciation)
|
|
||||||
|
|
||||||
</details>
|
|
||||||
|
|
||||||
## About
|
## About
|
||||||
|
|
||||||
@@ -75,12 +55,12 @@ Mermaid addresses this problem by enabling users to create easily modifiable dia
|
|||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
Mermaid allows even non-programmers to easily create detailed diagrams through the [Mermaid Live Editor](https://mermaid.live/).<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.
|
[Tutorials](./docs/config/Tutorials.md) has video tutorials.
|
||||||
Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](https://mermaid.js.org/ecosystem/integrations-community.html).
|
Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](./docs/ecosystem/integrations.md).
|
||||||
|
|
||||||
You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](https://mermaid.js.org/ecosystem/integrations-community.html).
|
You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](./docs/ecosystem/integrations.md).
|
||||||
|
|
||||||
For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](https://mermaid.js.org/intro/getting-started.html), [Usage](https://mermaid.js.org/config/usage.html) and [Tutorials](https://mermaid.js.org/ecosystem/tutorials.html).
|
For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](./docs/community/n00b-overview.md), [Usage](./docs/config/usage.md) and [Tutorials](./docs/config/Tutorials.md).
|
||||||
|
|
||||||
In our release process we rely heavily on visual regression tests using [applitools](https://applitools.com/). Applitools is a great service which has been easy to use and integrate with our tests.
|
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 +72,11 @@ In our release process we rely heavily on visual regression tests using [applito
|
|||||||
|
|
||||||
## Examples
|
## 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> -->
|
||||||
|
|
||||||
### 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
|
flowchart LR
|
||||||
@@ -116,12 +96,12 @@ C -->|One| D[Result 1]
|
|||||||
C -->|Two| E[Result 2]
|
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
|
sequenceDiagram
|
||||||
Alice->>John: Hello John, how are you?
|
Alice->>John: Hello John, how are you?
|
||||||
loop HealthCheck
|
loop Healthcheck
|
||||||
John->>John: Fight against hypochondria
|
John->>John: Fight against hypochondria
|
||||||
end
|
end
|
||||||
Note right of John: Rational thoughts!
|
Note right of John: Rational thoughts!
|
||||||
@@ -133,7 +113,7 @@ Bob-->>John: Jolly good!
|
|||||||
```mermaid
|
```mermaid
|
||||||
sequenceDiagram
|
sequenceDiagram
|
||||||
Alice->>John: Hello John, how are you?
|
Alice->>John: Hello John, how are you?
|
||||||
loop HealthCheck
|
loop Healthcheck
|
||||||
John->>John: Fight against hypochondria
|
John->>John: Fight against hypochondria
|
||||||
end
|
end
|
||||||
Note right of John: Rational thoughts!
|
Note right of John: Rational thoughts!
|
||||||
@@ -142,7 +122,7 @@ John->>Bob: How about you?
|
|||||||
Bob-->>John: Jolly good!
|
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
|
gantt
|
||||||
@@ -166,7 +146,7 @@ gantt
|
|||||||
Parallel 4 : des6, after des4, 1d
|
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
|
classDiagram
|
||||||
@@ -185,7 +165,13 @@ class Class10 {
|
|||||||
int id
|
int id
|
||||||
size()
|
size()
|
||||||
}
|
}
|
||||||
|
namespace Namespace01 {
|
||||||
|
class Class11
|
||||||
|
class Class12 {
|
||||||
|
int id
|
||||||
|
size()
|
||||||
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
@@ -205,10 +191,16 @@ class Class10 {
|
|||||||
int id
|
int id
|
||||||
size()
|
size()
|
||||||
}
|
}
|
||||||
|
namespace Namespace01 {
|
||||||
|
class Class11
|
||||||
|
class Class12 {
|
||||||
|
int id
|
||||||
|
size()
|
||||||
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### State diagram [<a href="https://mermaid.js.org/syntax/stateDiagram.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkEFvgzAMhf8K8nEqpYSNthx22Xbcqcexg0sCiZQQlDhIFeK_L8A6TfXp6fOz9ewJGssFVOAJSbwr7ByadGR1n8T6evpO0vQ1uZDSekOrXGFsPqJPO6q-2-imH8f_0TeHXm50lfelsAMjnEHFY6xpMdRAUhhRQxUlFy0GTTXU_RytYeAx-AdXZB1ULWovdoCB7OXWN1CRC-Ju-r3uz6UtchGHJqDbsPygU57iysb2reoWHpyOWBINvsqypb3vFMlw3TfWZF5xiY7keC6zkpUnZIUojwW-FAVvrvn51LLnvOXHQ84Q5nn-AVtLcwk">live editor</a>]
|
### State diagram [<a href="https://mermaid-js.github.io/mermaid/#/stateDiagram">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkEFvgzAMhf8K8nEqpYSNthx22Xbcqcexg0sCiZQQlDhIFeK_L8A6TfXp6fOz9ewJGssFVOAJSbwr7ByadGR1n8T6evpO0vQ1uZDSekOrXGFsPqJPO6q-2-imH8f_0TeHXm50lfelsAMjnEHFY6xpMdRAUhhRQxUlFy0GTTXU_RytYeAx-AdXZB1ULWovdoCB7OXWN1CRC-Ju-r3uz6UtchGHJqDbsPygU57iysb2reoWHpyOWBINvsqypb3vFMlw3TfWZF5xiY7keC6zkpUnZIUojwW-FAVvrvn51LLnvOXHQ84Q5nn-AVtLcwk">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
stateDiagram-v2
|
stateDiagram-v2
|
||||||
@@ -230,7 +222,7 @@ Moving --> Crash
|
|||||||
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
|
pie
|
||||||
@@ -248,7 +240,7 @@ pie
|
|||||||
|
|
||||||
### Git graph [experimental - <a href="https://mermaid.live/edit#pako:eNqNkMFugzAMhl8F-VyVAR1tOW_aA-zKxSSGRCMJCk6lCvHuNZPKZdM0n-zf3_8r8QIqaIIGMqnB8kfEybQ--y4VnLP8-9RF9Mpkmm40hmlnDKmvkPiH_kfS7nFo_VN0FAf6XwocQGgxa_nGsm1bYEOOWmik1dRjGrmF1q-Cpkkj07u2HCI0PY4zHQATh8-7V9BwTPSE3iwOEd1OjQE1iWkBvk_bzQY7s0Sq4Hs7bHqKo8iGeZqbPN_WR7mpSd1RHpvPVhuMbG7XOq_L-oJlRfW5wteq0qorrpe-PBW9Pr8UJcK6rg-BLYPQ">live editor</a>]
|
### 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
|
gantt
|
||||||
@@ -286,7 +278,7 @@ gantt
|
|||||||
5 : 0, 5
|
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
|
journey
|
||||||
@@ -312,7 +304,7 @@ gantt
|
|||||||
Sit down: 3: Me
|
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
|
C4Context
|
||||||
@@ -406,7 +398,7 @@ The above command generates files into the `dist` folder and publishes them to <
|
|||||||
|
|
||||||
Mermaid is a growing community and is always accepting new contributors. There's a lot of different ways to help out and we're always looking for extra hands! Look at [this issue](https://github.com/mermaid-js/mermaid/issues/866) if you want to know where to start helping out.
|
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
|
## Security and safe diagrams
|
||||||
|
|
||||||
|
@@ -12,19 +12,15 @@ Mermaid
|
|||||||
<p>
|
<p>
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://mermaid.live/"><b>实时编辑器!</b></a>
|
<a href="https://mermaid.live/"><b>Live Editor!</b></a>
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://mermaid.js.org">📖 文档</a> | <a href="https://mermaid.js.org/intro/">🚀 入门</a> | <a href="https://www.jsdelivr.com/package/npm/mermaid">🌐 CDN</a> | <a href="https://discord.gg/AgrbSrBer3" title="Discord invite">🙌 加入我们</a>
|
<a href="https://mermaid.js.org">📖 文档</a> | <a href="https://mermaid.js.org/intro/">🚀 入门</a> | <a href="https://www.jsdelivr.com/package/npm/mermaid">🌐 CDN</a> | <a href="https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE" title="Slack invite">🙌 加入我们</a>
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="./README.md">English</a>
|
<a href="./README.md">English</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
尝试未来版本的实时编辑器预览: <a href="https://develop.git.mermaid.live/" title="尝试来自develop分支的mermaid版本。">Develop</a> | <a href="https://next.git.mermaid.live/" title="尝试来自next分支的mermaid版本。">Next</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
@@ -34,8 +30,8 @@ Mermaid
|
|||||||
[](https://app.codecov.io/github/mermaid-js/mermaid/tree/develop)
|
[](https://app.codecov.io/github/mermaid-js/mermaid/tree/develop)
|
||||||
[](https://www.jsdelivr.com/package/npm/mermaid)
|
[](https://www.jsdelivr.com/package/npm/mermaid)
|
||||||
[](https://www.npmjs.com/package/mermaid)
|
[](https://www.npmjs.com/package/mermaid)
|
||||||
[](https://discord.gg/AgrbSrBer3)
|
[](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE)
|
||||||
[](https://twitter.com/mermaidjs_)
|
[](https://twitter.com/mermaidjs_)
|
||||||
|
|
||||||
<img src="./img/header.png" alt="" />
|
<img src="./img/header.png" alt="" />
|
||||||
|
|
||||||
@@ -43,7 +39,7 @@ Mermaid
|
|||||||
|
|
||||||
**感谢所有参与进来提交 PR,解答疑问的人们! 🙏**
|
**感谢所有参与进来提交 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
|
## 关于 Mermaid
|
||||||
|
|
||||||
@@ -57,20 +53,20 @@ Mermaid 是一个基于 Javascript 的图表绘制工具,通过解析类 Markd
|
|||||||
Mermaid 通过允许用户创建便于修改的图表来解决这一难题,它也可以作为生产脚本(或其他代码)的一部分。<br/>
|
Mermaid 通过允许用户创建便于修改的图表来解决这一难题,它也可以作为生产脚本(或其他代码)的一部分。<br/>
|
||||||
<br/>
|
<br/>
|
||||||
Mermaid 甚至能让非程序员也能通过 [Mermaid Live Editor](https://mermaid.live/) 轻松创建详细的图表。<br/>
|
Mermaid 甚至能让非程序员也能通过 [Mermaid Live Editor](https://mermaid.live/) 轻松创建详细的图表。<br/>
|
||||||
你可以访问 [教程](https://mermaid.js.org/ecosystem/tutorials.html) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](https://mermaid.js.org/ecosystem/integrations-community.html) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。
|
你可以访问 [教程](./docs/config/Tutorials.md) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](./docs/ecosystem/integrations.md) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。
|
||||||
|
|
||||||
如果想要查看关于 Mermaid 更详细的介绍及基础使用方式,可以查看 [入门指引](https://mermaid.js.org/intro/getting-started.html), [用法](https://mermaid.js.org/config/usage.html) 和 [教程](https://mermaid.js.org/ecosystem/tutorials.html).
|
如果想要查看关于 Mermaid 更详细的介绍及基础使用方式,可以查看 [入门指引](./docs/community/n00b-overview.md), [用法](./docs/config/usage.md) 和 [教程](./docs/config/Tutorials.md).
|
||||||
|
|
||||||
<!-- </Main description> -->
|
<!-- </Main description> -->
|
||||||
|
|
||||||
## 示例
|
## 示例
|
||||||
|
|
||||||
**下面是一些可以使用 Mermaid 创建的图表示例。点击 [语法](https://mermaid.js.org/intro/syntax-reference.html) 查看详情。**
|
**下面是一些可以使用 Mermaid 创建的图表示例。点击 [语法](https://mermaid-js.github.io/mermaid/#/n00b-syntaxReference) 查看详情。**
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<!-- <Flowchart> -->
|
<!-- <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
|
flowchart LR
|
||||||
@@ -88,12 +84,12 @@ C -->|One| D[Result 1]
|
|||||||
C -->|Two| E[Result 2]
|
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
|
sequenceDiagram
|
||||||
Alice->>John: Hello John, how are you?
|
Alice->>John: Hello John, how are you?
|
||||||
loop HealthCheck
|
loop Healthcheck
|
||||||
John->>John: Fight against hypochondria
|
John->>John: Fight against hypochondria
|
||||||
end
|
end
|
||||||
Note right of John: Rational thoughts!
|
Note right of John: Rational thoughts!
|
||||||
@@ -105,7 +101,7 @@ Bob-->>John: Jolly good!
|
|||||||
```mermaid
|
```mermaid
|
||||||
sequenceDiagram
|
sequenceDiagram
|
||||||
Alice->>John: Hello John, how are you?
|
Alice->>John: Hello John, how are you?
|
||||||
loop HealthCheck
|
loop Healthcheck
|
||||||
John->>John: Fight against hypochondria
|
John->>John: Fight against hypochondria
|
||||||
end
|
end
|
||||||
Note right of John: Rational thoughts!
|
Note right of John: Rational thoughts!
|
||||||
@@ -114,7 +110,7 @@ John->>Bob: How about you?
|
|||||||
Bob-->>John: Jolly good!
|
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
|
gantt
|
||||||
@@ -138,7 +134,7 @@ gantt
|
|||||||
Parallel 4 : des6, after des4, 1d
|
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
|
classDiagram
|
||||||
@@ -178,7 +174,7 @@ class Class10 {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 状态图 [<a href="https://mermaid.js.org/syntax/stateDiagram.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkLsOwjAMRX-l8ojahTEDCzB26kgYrMYtkfJAqVMJVf13QiIKqqfr44d8vUDvFYGAiZHponEMaJv5KF2V4na4V01zqjrWxhSUZYapuEetn7UbCy16P_5HzwGnR6FZfpdCDZaCRa3SWcunQQI_yJIEkaSiAaNhCdKtqRUj--7lehAcItUQn-pnBMSAZtroVWn2YYOU07b4z29Y37gJVYk">live editor</a>]
|
### 状态图 [[<a href="https://mermaid-js.github.io/mermaid/#/stateDiagram">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkLsOwjAMRX-l8ojahTEDCzB26kgYrMYtkfJAqVMJVf13QiIKqqfr44d8vUDvFYGAiZHponEMaJv5KF2V4na4V01zqjrWxhSUZYapuEetn7UbCy16P_5HzwGnR6FZfpdCDZaCRa3SWcunQQI_yJIEkaSiAaNhCdKtqRUj--7lehAcItUQn-pnBMSAZtroVWn2YYOU07b4z29Y37gJVYk">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
stateDiagram-v2
|
stateDiagram-v2
|
||||||
@@ -200,7 +196,7 @@ Moving --> Crash
|
|||||||
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
|
pie
|
||||||
@@ -218,7 +214,7 @@ pie
|
|||||||
|
|
||||||
### Git 图 [实验特性 - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiZ2l0R3JhcGg6XG5vcHRpb25zXG57XG4gICAgXCJub2RlU3BhY2luZ1wiOiAxNTAsXG4gICAgXCJub2RlUmFkaXVzXCI6IDEwXG59XG5lbmRcbmNvbW1pdFxuYnJhbmNoIG5ld2JyYW5jaFxuY2hlY2tvdXQgbmV3YnJhbmNoXG5jb21taXRcbmNvbW1pdFxuY2hlY2tvdXQgbWFzdGVyXG5jb21taXRcbmNvbW1pdFxubWVyZ2UgbmV3YnJhbmNoXG4iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ">live editor</a>]
|
### 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
|
journey
|
||||||
@@ -244,7 +240,7 @@ pie
|
|||||||
Sit down: 3: Me
|
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
|
C4Context
|
||||||
@@ -338,7 +334,7 @@ npm publish
|
|||||||
|
|
||||||
Mermaid 是一个不断发展中的社区,并且还在接收新的贡献者。有很多不同的方式可以参与进来,而且我们还在寻找额外的帮助。如果你想知道如何开始贡献,请查看 [这个 issue](https://github.com/mermaid-js/mermaid/issues/866)。
|
Mermaid 是一个不断发展中的社区,并且还在接收新的贡献者。有很多不同的方式可以参与进来,而且我们还在寻找额外的帮助。如果你想知道如何开始贡献,请查看 [这个 issue](https://github.com/mermaid-js/mermaid/issues/866)。
|
||||||
|
|
||||||
关于如何贡献的详细信息可以在 [贡献指南](https://mermaid.js.org/community/contributing.html) 中找到。
|
关于如何贡献的详细信息可以在 [贡献指南](CONTRIBUTING.md) 中找到。
|
||||||
|
|
||||||
## 安全
|
## 安全
|
||||||
|
|
||||||
|
21
__mocks__/c4Renderer.js
Normal file
21
__mocks__/c4Renderer.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* Mocked C4Context diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const drawPersonOrSystemArray = vi.fn();
|
||||||
|
export const drawBoundary = vi.fn();
|
||||||
|
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
drawPersonOrSystemArray,
|
||||||
|
drawBoundary,
|
||||||
|
setConf,
|
||||||
|
draw,
|
||||||
|
};
|
16
__mocks__/classRenderer-v2.js
Normal file
16
__mocks__/classRenderer-v2.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* Mocked class diagram v2 renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setConf,
|
||||||
|
draw,
|
||||||
|
};
|
13
__mocks__/classRenderer.js
Normal file
13
__mocks__/classRenderer.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Mocked class diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
draw,
|
||||||
|
};
|
1
__mocks__/dagre-d3.ts
Normal file
1
__mocks__/dagre-d3.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
// DO NOT delete this file. It is used by vitest to mock the dagre-d3 module.
|
3
__mocks__/entity-decode/browser.ts
Normal file
3
__mocks__/entity-decode/browser.ts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
module.exports = function (txt: string) {
|
||||||
|
return txt;
|
||||||
|
};
|
16
__mocks__/erRenderer.js
Normal file
16
__mocks__/erRenderer.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* Mocked er diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setConf,
|
||||||
|
draw,
|
||||||
|
};
|
24
__mocks__/flowRenderer-v2.js
Normal file
24
__mocks__/flowRenderer-v2.js
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
* Mocked flow (flowchart) diagram v2 renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
export const addVertices = vi.fn();
|
||||||
|
export const addEdges = vi.fn();
|
||||||
|
export const getClasses = vi.fn().mockImplementation(() => {
|
||||||
|
return {};
|
||||||
|
});
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setConf,
|
||||||
|
addVertices,
|
||||||
|
addEdges,
|
||||||
|
getClasses,
|
||||||
|
draw,
|
||||||
|
};
|
16
__mocks__/ganttRenderer.js
Normal file
16
__mocks__/ganttRenderer.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* Mocked gantt diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setConf,
|
||||||
|
draw,
|
||||||
|
};
|
13
__mocks__/gitGraphRenderer.js
Normal file
13
__mocks__/gitGraphRenderer.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Mocked git (graph) diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
draw,
|
||||||
|
};
|
15
__mocks__/journeyRenderer.js
Normal file
15
__mocks__/journeyRenderer.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* Mocked pie (picChart) diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setConf,
|
||||||
|
draw,
|
||||||
|
};
|
13
__mocks__/pieRenderer.js
Normal file
13
__mocks__/pieRenderer.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Mocked pie (picChart) diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
draw,
|
||||||
|
};
|
13
__mocks__/requirementRenderer.js
Normal file
13
__mocks__/requirementRenderer.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Mocked requirement diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
draw,
|
||||||
|
};
|
13
__mocks__/sankeyRenderer.js
Normal file
13
__mocks__/sankeyRenderer.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Mocked Sankey diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
draw,
|
||||||
|
};
|
23
__mocks__/sequenceRenderer.js
Normal file
23
__mocks__/sequenceRenderer.js
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* Mocked sequence diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const bounds = vi.fn();
|
||||||
|
export const drawActors = vi.fn();
|
||||||
|
export const drawActorsPopup = vi.fn();
|
||||||
|
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
bounds,
|
||||||
|
drawActors,
|
||||||
|
drawActorsPopup,
|
||||||
|
setConf,
|
||||||
|
draw,
|
||||||
|
};
|
22
__mocks__/stateRenderer-v2.js
Normal file
22
__mocks__/stateRenderer-v2.js
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* Mocked state diagram v2 renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
export const getClasses = vi.fn().mockImplementation(() => {
|
||||||
|
return {};
|
||||||
|
});
|
||||||
|
export const stateDomId = vi.fn().mockImplementation(() => {
|
||||||
|
return 'mocked-stateDiagram-stateDomId';
|
||||||
|
});
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setConf,
|
||||||
|
getClasses,
|
||||||
|
draw,
|
||||||
|
};
|
19
applitools.config.js
Normal file
19
applitools.config.js
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||||
|
const { defineConfig } = require('cypress');
|
||||||
|
|
||||||
|
module.exports = defineConfig({
|
||||||
|
testConcurrency: 1,
|
||||||
|
browser: [
|
||||||
|
// Add browsers with different viewports
|
||||||
|
// { width: 800, height: 600, name: 'chrome' },
|
||||||
|
// { width: 700, height: 500, name: 'firefox' },
|
||||||
|
// { width: 1600, height: 1200, name: 'ie11' },
|
||||||
|
// { width: 1024, height: 768, name: 'edgechromium' },
|
||||||
|
// { width: 800, height: 600, name: 'safari' },
|
||||||
|
// // Add mobile emulation devices in Portrait mode
|
||||||
|
// { deviceName: 'iPhone X', screenOrientation: 'portrait' },
|
||||||
|
// { deviceName: 'Pixel 2', screenOrientation: 'portrait' },
|
||||||
|
],
|
||||||
|
// set batch name to the configuration
|
||||||
|
// batchName: `Mermaid ${process.env.APPLI_BRANCH ?? "'no APPLI_BRANCH set'"}`,
|
||||||
|
});
|
198
cSpell.json
Normal file
198
cSpell.json
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2",
|
||||||
|
"language": "en",
|
||||||
|
"words": [
|
||||||
|
"acyclicer",
|
||||||
|
"adamiecki",
|
||||||
|
"alois",
|
||||||
|
"aloisklink",
|
||||||
|
"antiscript",
|
||||||
|
"antlr",
|
||||||
|
"appli",
|
||||||
|
"applitools",
|
||||||
|
"asciidoctor",
|
||||||
|
"ashish",
|
||||||
|
"ashishjain",
|
||||||
|
"astah",
|
||||||
|
"bbox",
|
||||||
|
"bilkent",
|
||||||
|
"bisheng",
|
||||||
|
"blrs",
|
||||||
|
"braintree",
|
||||||
|
"brkt",
|
||||||
|
"brolin",
|
||||||
|
"brotli",
|
||||||
|
"città",
|
||||||
|
"classdef",
|
||||||
|
"codedoc",
|
||||||
|
"colour",
|
||||||
|
"commitlint",
|
||||||
|
"cpettitt",
|
||||||
|
"customizability",
|
||||||
|
"cuzon",
|
||||||
|
"cytoscape",
|
||||||
|
"dagre",
|
||||||
|
"deepdwn",
|
||||||
|
"descr",
|
||||||
|
"docsify",
|
||||||
|
"docsy",
|
||||||
|
"doku",
|
||||||
|
"dompurify",
|
||||||
|
"edgechromium",
|
||||||
|
"elkjs",
|
||||||
|
"elle",
|
||||||
|
"faber",
|
||||||
|
"flatmap",
|
||||||
|
"foswiki",
|
||||||
|
"ftplugin",
|
||||||
|
"gantt",
|
||||||
|
"gitea",
|
||||||
|
"gitgraph",
|
||||||
|
"globby",
|
||||||
|
"graphlib",
|
||||||
|
"graphviz",
|
||||||
|
"grav",
|
||||||
|
"greywolf",
|
||||||
|
"gzipped",
|
||||||
|
"huynh",
|
||||||
|
"huynhicode",
|
||||||
|
"inkdrop",
|
||||||
|
"jaoude",
|
||||||
|
"jgreywolf",
|
||||||
|
"jison",
|
||||||
|
"jiti",
|
||||||
|
"kaufmann",
|
||||||
|
"khroma",
|
||||||
|
"klemm",
|
||||||
|
"klink",
|
||||||
|
"knsv",
|
||||||
|
"knut",
|
||||||
|
"knutsveidqvist",
|
||||||
|
"laganeckas",
|
||||||
|
"linetype",
|
||||||
|
"lintstagedrc",
|
||||||
|
"logmsg",
|
||||||
|
"lucida",
|
||||||
|
"markdownish",
|
||||||
|
"matthieu",
|
||||||
|
"matthieumorel",
|
||||||
|
"mdast",
|
||||||
|
"mdbook",
|
||||||
|
"mermaidjs",
|
||||||
|
"mermerd",
|
||||||
|
"metafile",
|
||||||
|
"mindaugas",
|
||||||
|
"mindmap",
|
||||||
|
"mindmaps",
|
||||||
|
"mitigations",
|
||||||
|
"mkdocs",
|
||||||
|
"mmorel",
|
||||||
|
"mult",
|
||||||
|
"neurodiverse",
|
||||||
|
"nextra",
|
||||||
|
"nikolay",
|
||||||
|
"nirname",
|
||||||
|
"orlandoni",
|
||||||
|
"pathe",
|
||||||
|
"pbrolin",
|
||||||
|
"phpbb",
|
||||||
|
"plantuml",
|
||||||
|
"playfair",
|
||||||
|
"pnpm",
|
||||||
|
"podlite",
|
||||||
|
"quence",
|
||||||
|
"radious",
|
||||||
|
"ranksep",
|
||||||
|
"rect",
|
||||||
|
"rects",
|
||||||
|
"reda",
|
||||||
|
"redmine",
|
||||||
|
"rehype",
|
||||||
|
"roledescription",
|
||||||
|
"rozhkov",
|
||||||
|
"sandboxed",
|
||||||
|
"sankey",
|
||||||
|
"setupgraphviewbox",
|
||||||
|
"shiki",
|
||||||
|
"sidharth",
|
||||||
|
"sidharthv",
|
||||||
|
"sphinxcontrib",
|
||||||
|
"startx",
|
||||||
|
"starty",
|
||||||
|
"statediagram",
|
||||||
|
"steph",
|
||||||
|
"stopx",
|
||||||
|
"stopy",
|
||||||
|
"stylis",
|
||||||
|
"subhash-halder",
|
||||||
|
"substate",
|
||||||
|
"sulais",
|
||||||
|
"sveidqvist",
|
||||||
|
"swimm",
|
||||||
|
"techn",
|
||||||
|
"teststr",
|
||||||
|
"textlength",
|
||||||
|
"treemap",
|
||||||
|
"ts-nocheck",
|
||||||
|
"tsdoc",
|
||||||
|
"tuleap",
|
||||||
|
"tylerlong",
|
||||||
|
"typora",
|
||||||
|
"ugge",
|
||||||
|
"unist",
|
||||||
|
"unocss",
|
||||||
|
"upvoting",
|
||||||
|
"valign",
|
||||||
|
"verdana",
|
||||||
|
"viewports",
|
||||||
|
"vinod",
|
||||||
|
"visio",
|
||||||
|
"vitepress",
|
||||||
|
"vueuse",
|
||||||
|
"xlink",
|
||||||
|
"yash",
|
||||||
|
"yokozuna",
|
||||||
|
"zenuml"
|
||||||
|
],
|
||||||
|
"patterns": [
|
||||||
|
{ "name": "Markdown links", "pattern": "\\((.*)\\)", "description": "" },
|
||||||
|
{
|
||||||
|
"name": "Markdown code blocks",
|
||||||
|
"pattern": "/^(\\s*`{3,}).*[\\s\\S]*?^\\1/gmx",
|
||||||
|
"description": "Taken from the cSpell example at https://cspell.org/configuration/patterns/#verbose-regular-expressions"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Inline code blocks",
|
||||||
|
"pattern": "\\`([^\\`\\r\\n]+?)\\`",
|
||||||
|
"description": "https://stackoverflow.com/questions/41274241/how-to-capture-inline-markdown-code-but-not-a-markdown-code-fence-with-regex"
|
||||||
|
},
|
||||||
|
{ "name": "Link contents", "pattern": "\\<a(.*)\\>", "description": "" },
|
||||||
|
{ "name": "Snippet references", "pattern": "-- snippet:(.*)", "description": "" },
|
||||||
|
{
|
||||||
|
"name": "Snippet references 2",
|
||||||
|
"pattern": "\\<\\[sample:(.*)",
|
||||||
|
"description": "another kind of snippet reference"
|
||||||
|
},
|
||||||
|
{ "name": "Multi-line code blocks", "pattern": "/^\\s*```[\\s\\S]*?^\\s*```/gm" },
|
||||||
|
{
|
||||||
|
"name": "HTML Tags",
|
||||||
|
"pattern": "<[^>]*>",
|
||||||
|
"description": "Reference: https://stackoverflow.com/questions/11229831/regular-expression-to-remove-html-tags-from-a-string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ignoreRegExpList": [
|
||||||
|
"Markdown links",
|
||||||
|
"Markdown code blocks",
|
||||||
|
"Inline code blocks",
|
||||||
|
"Link contents",
|
||||||
|
"Snippet references",
|
||||||
|
"Snippet references 2",
|
||||||
|
"Multi-line code blocks",
|
||||||
|
"HTML Tags"
|
||||||
|
],
|
||||||
|
"ignorePaths": [
|
||||||
|
"packages/mermaid/src/docs/CHANGELOG.md",
|
||||||
|
"packages/mermaid/src/docs/.vitepress/redirect.ts",
|
||||||
|
"packages/mermaid/src/docs/.vitepress/contributor-names.json"
|
||||||
|
]
|
||||||
|
}
|
@@ -1,45 +0,0 @@
|
|||||||
# yaml-language-server: $schema=https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json
|
|
||||||
|
|
||||||
$schema: https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json
|
|
||||||
version: '0.2'
|
|
||||||
language: en-US,en-GB
|
|
||||||
|
|
||||||
import:
|
|
||||||
- ./.cspell/cspell.config.yaml
|
|
||||||
|
|
||||||
ignoreRegExpList:
|
|
||||||
- character-set-cyrillic
|
|
||||||
- svg-block
|
|
||||||
ignorePaths:
|
|
||||||
- '*lock.{yaml,json}'
|
|
||||||
- dist
|
|
||||||
- CHANGELOG.md
|
|
||||||
- packages/mermaid/src/docs/.vitepress/redirect.ts
|
|
||||||
- packages/mermaid/src/docs/.vitepress/contributor-names.json
|
|
||||||
- backup
|
|
||||||
- '**/*.spec.{js,ts}' # checked by eslint
|
|
||||||
- 'tests/webpack/src/index.js' # checked by eslint
|
|
||||||
- 'cypress/**/*.js' # checked by eslint
|
|
||||||
- '*.csv'
|
|
||||||
- '*.patch'
|
|
||||||
- 'docs/**/*.html'
|
|
||||||
- 'cypress/platform/**'
|
|
||||||
dictionaries:
|
|
||||||
- misc-terms
|
|
||||||
overrides:
|
|
||||||
- filename:
|
|
||||||
- '**/*.{jison,ts,mts,cjs,mjs,js,json,yaml,yml,md,html}'
|
|
||||||
- 'run'
|
|
||||||
- Dockerfile
|
|
||||||
ignoreRegExpList:
|
|
||||||
- js-unicode-escape
|
|
||||||
dictionaries:
|
|
||||||
- code-terms
|
|
||||||
- 3rd-party-terms
|
|
||||||
- fonts
|
|
||||||
- html
|
|
||||||
- lorem-ipsum
|
|
||||||
- filename: '**/package.json'
|
|
||||||
ignoreRegExpList:
|
|
||||||
- json-property
|
|
||||||
# cspell:dictionaries code-terms
|
|
24
cypress.config.cjs
Normal file
24
cypress.config.cjs
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||||
|
|
||||||
|
const { defineConfig } = require('cypress');
|
||||||
|
const { addMatchImageSnapshotPlugin } = require('cypress-image-snapshot/plugin');
|
||||||
|
const coverage = require('@cypress/code-coverage/task');
|
||||||
|
|
||||||
|
module.exports = defineConfig({
|
||||||
|
projectId: 'n2sma2',
|
||||||
|
e2e: {
|
||||||
|
specPattern: 'cypress/integration/**/*.{js,jsx,ts,tsx}',
|
||||||
|
setupNodeEvents(on, config) {
|
||||||
|
coverage(on, config);
|
||||||
|
addMatchImageSnapshotPlugin(on, config);
|
||||||
|
// copy any needed variables from process.env to config.env
|
||||||
|
config.env.useAppli = process.env.USE_APPLI ? true : false;
|
||||||
|
|
||||||
|
// do not forget to return the changed config object!
|
||||||
|
return config;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
video: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
require('@applitools/eyes-cypress')(module);
|
@@ -1,39 +0,0 @@
|
|||||||
import { defineConfig } from 'cypress';
|
|
||||||
import { addMatchImageSnapshotPlugin } from 'cypress-image-snapshot/plugin';
|
|
||||||
import coverage from '@cypress/code-coverage/task';
|
|
||||||
import eyesPlugin from '@applitools/eyes-cypress';
|
|
||||||
import { registerArgosTask } from '@argos-ci/cypress/task';
|
|
||||||
|
|
||||||
export default eyesPlugin(
|
|
||||||
defineConfig({
|
|
||||||
projectId: 'n2sma2',
|
|
||||||
viewportWidth: 1440,
|
|
||||||
viewportHeight: 1024,
|
|
||||||
e2e: {
|
|
||||||
specPattern: 'cypress/integration/**/*.{js,ts}',
|
|
||||||
setupNodeEvents(on, config) {
|
|
||||||
coverage(on, config);
|
|
||||||
on('before:browser:launch', (browser, launchOptions) => {
|
|
||||||
if (browser.name === 'chrome' && browser.isHeadless) {
|
|
||||||
launchOptions.args.push('--window-size=1440,1024', '--force-device-scale-factor=1');
|
|
||||||
}
|
|
||||||
return launchOptions;
|
|
||||||
});
|
|
||||||
// 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;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
video: false,
|
|
||||||
})
|
|
||||||
);
|
|
@@ -10,7 +10,7 @@ interface CypressConfig {
|
|||||||
type CypressMermaidConfig = MermaidConfig & CypressConfig;
|
type CypressMermaidConfig = MermaidConfig & CypressConfig;
|
||||||
|
|
||||||
interface CodeObject {
|
interface CodeObject {
|
||||||
code: string | string[];
|
code: string;
|
||||||
mermaid: CypressMermaidConfig;
|
mermaid: CypressMermaidConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -18,14 +18,10 @@ const utf8ToB64 = (str: string): string => {
|
|||||||
return Buffer.from(decodeURIComponent(encodeURIComponent(str))).toString('base64');
|
return Buffer.from(decodeURIComponent(encodeURIComponent(str))).toString('base64');
|
||||||
};
|
};
|
||||||
|
|
||||||
const batchId: string =
|
const batchId: string = 'mermaid-batch-' + Cypress.env('CYPRESS_COMMIT') || Date.now().toString();
|
||||||
'mermaid-batch-' +
|
|
||||||
(Cypress.env('useAppli')
|
|
||||||
? Date.now().toString()
|
|
||||||
: Cypress.env('CYPRESS_COMMIT') || Date.now().toString());
|
|
||||||
|
|
||||||
export const mermaidUrl = (
|
export const mermaidUrl = (
|
||||||
graphStr: string | string[],
|
graphStr: string,
|
||||||
options: CypressMermaidConfig,
|
options: CypressMermaidConfig,
|
||||||
api: boolean
|
api: boolean
|
||||||
): string => {
|
): string => {
|
||||||
@@ -35,7 +31,7 @@ export const mermaidUrl = (
|
|||||||
};
|
};
|
||||||
const objStr: string = JSON.stringify(codeObject);
|
const objStr: string = JSON.stringify(codeObject);
|
||||||
let url = `http://localhost:9000/e2e.html?graph=${utf8ToB64(objStr)}`;
|
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}`;
|
url = `http://localhost:9000/xss.html?graph=${graphStr}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,20 +48,29 @@ export const imgSnapshotTest = (
|
|||||||
api = false,
|
api = false,
|
||||||
validation?: any
|
validation?: any
|
||||||
): void => {
|
): void => {
|
||||||
const options: CypressMermaidConfig = {
|
cy.log(JSON.stringify(_options));
|
||||||
..._options,
|
const options: CypressMermaidConfig = Object.assign(_options);
|
||||||
fontFamily: _options.fontFamily ?? 'courier',
|
if (!options.fontFamily) {
|
||||||
// @ts-ignore TODO: Fix type of fontSize
|
options.fontFamily = 'courier';
|
||||||
fontSize: _options.fontSize ?? '16px',
|
}
|
||||||
sequence: {
|
if (!options.sequence) {
|
||||||
...(_options.sequence ?? {}),
|
options.sequence = {};
|
||||||
actorFontFamily: 'courier',
|
}
|
||||||
noteFontFamily: _options.sequence?.noteFontFamily
|
if (!options.sequence || (options.sequence && !options.sequence.actorFontFamily)) {
|
||||||
? _options.sequence.noteFontFamily
|
options.sequence.actorFontFamily = 'courier';
|
||||||
: 'courier',
|
}
|
||||||
messageFontFamily: 'courier',
|
if (options.sequence && !options.sequence.noteFontFamily) {
|
||||||
},
|
options.sequence.noteFontFamily = 'courier';
|
||||||
};
|
}
|
||||||
|
options.sequence.actorFontFamily = 'courier';
|
||||||
|
options.sequence.noteFontFamily = 'courier';
|
||||||
|
options.sequence.messageFontFamily = 'courier';
|
||||||
|
if (options.sequence && !options.sequence.actorFontFamily) {
|
||||||
|
options.sequence.actorFontFamily = 'courier';
|
||||||
|
}
|
||||||
|
if (!options.fontSize) {
|
||||||
|
options.fontSize = 16;
|
||||||
|
}
|
||||||
|
|
||||||
const url: string = mermaidUrl(graphStr, options, api);
|
const url: string = mermaidUrl(graphStr, options, api);
|
||||||
openURLAndVerifyRendering(url, options, validation);
|
openURLAndVerifyRendering(url, options, validation);
|
||||||
@@ -73,15 +78,16 @@ export const imgSnapshotTest = (
|
|||||||
|
|
||||||
export const urlSnapshotTest = (
|
export const urlSnapshotTest = (
|
||||||
url: string,
|
url: string,
|
||||||
options: CypressMermaidConfig,
|
_options: CypressMermaidConfig,
|
||||||
_api = false,
|
_api = false,
|
||||||
validation?: any
|
validation?: any
|
||||||
): void => {
|
): void => {
|
||||||
|
const options: CypressMermaidConfig = Object.assign(_options);
|
||||||
openURLAndVerifyRendering(url, options, validation);
|
openURLAndVerifyRendering(url, options, validation);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const renderGraph = (
|
export const renderGraph = (
|
||||||
graphStr: string | string[],
|
graphStr: string,
|
||||||
options: CypressMermaidConfig = {},
|
options: CypressMermaidConfig = {},
|
||||||
api = false
|
api = false
|
||||||
): void => {
|
): void => {
|
||||||
@@ -94,22 +100,8 @@ export const openURLAndVerifyRendering = (
|
|||||||
options: CypressMermaidConfig,
|
options: CypressMermaidConfig,
|
||||||
validation?: any
|
validation?: any
|
||||||
): void => {
|
): 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 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) {
|
if (useAppli) {
|
||||||
cy.log(`Opening eyes ${Cypress.spec.name} --- ${name}`);
|
cy.log(`Opening eyes ${Cypress.spec.name} --- ${name}`);
|
||||||
@@ -119,14 +111,21 @@ export const verifyScreenshot = (name: string): void => {
|
|||||||
batchName: Cypress.spec.name,
|
batchName: Cypress.spec.name,
|
||||||
batchId: batchId + 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.log(`Check eyes ${Cypress.spec.name}`);
|
||||||
cy.eyesCheckWindow('Click!');
|
cy.eyesCheckWindow('Click!');
|
||||||
cy.log(`Closing eyes ${Cypress.spec.name}`);
|
cy.log(`Closing eyes ${Cypress.spec.name}`);
|
||||||
cy.eyesClose();
|
cy.eyesClose();
|
||||||
} else if (useArgos) {
|
|
||||||
cy.argosScreenshot(name, {
|
|
||||||
threshold: 0.01,
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
cy.matchImageSnapshot(name);
|
cy.matchImageSnapshot(name);
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { renderGraph, verifyScreenshot } from '../../helpers/util.ts';
|
import { renderGraph } from '../../helpers/util.ts';
|
||||||
describe('Configuration', () => {
|
describe('Configuration', () => {
|
||||||
describe('arrowMarkerAbsolute', () => {
|
describe('arrowMarkerAbsolute', () => {
|
||||||
it('should handle default value false of arrowMarkerAbsolute', () => {
|
it('should handle default value false of arrowMarkerAbsolute', () => {
|
||||||
@@ -117,53 +117,13 @@ describe('Configuration', () => {
|
|||||||
});
|
});
|
||||||
it('should not taint the initial configuration when using multiple directives', () => {
|
it('should not taint the initial configuration when using multiple directives', () => {
|
||||||
const url = 'http://localhost:9000/regression/issue-1874.html';
|
const url = 'http://localhost:9000/regression/issue-1874.html';
|
||||||
|
cy.viewport(1440, 1024);
|
||||||
cy.visit(url);
|
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'
|
'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,12 +1,14 @@
|
|||||||
describe('Rerendering', () => {
|
describe('Rerendering', () => {
|
||||||
it('should be able to render after an error has occurred', () => {
|
it('should be able to render after an error has occurred', () => {
|
||||||
const url = 'http://localhost:9000/render-after-error.html';
|
const url = 'http://localhost:9000/render-after-error.html';
|
||||||
|
cy.viewport(1440, 1024);
|
||||||
cy.visit(url);
|
cy.visit(url);
|
||||||
cy.get('#graphDiv').should('exist');
|
cy.get('#graphDiv').should('exist');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should be able to render and rerender a graph via API', () => {
|
it('should be able to render and rerender a graph via API', () => {
|
||||||
const url = 'http://localhost:9000/rerender.html';
|
const url = 'http://localhost:9000/rerender.html';
|
||||||
|
cy.viewport(1440, 1024);
|
||||||
cy.visit(url);
|
cy.visit(url);
|
||||||
cy.get('#graph [id^=flowchart-A]').should('have.text', 'XMas');
|
cy.get('#graph [id^=flowchart-A]').should('have.text', 'XMas');
|
||||||
|
|
||||||
|
@@ -10,6 +10,7 @@ describe('XSS', () => {
|
|||||||
cy.wait(1000).then(() => {
|
cy.wait(1000).then(() => {
|
||||||
cy.get('.mermaid').should('exist');
|
cy.get('.mermaid').should('exist');
|
||||||
});
|
});
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not allow tags in the css', () => {
|
it('should not allow tags in the css', () => {
|
||||||
@@ -131,14 +132,4 @@ describe('XSS', () => {
|
|||||||
cy.wait(1000);
|
cy.wait(1000);
|
||||||
cy.get('#the-malware').should('not.exist');
|
cy.get('#the-malware').should('not.exist');
|
||||||
});
|
});
|
||||||
it('should sanitize backticks in class names properly', () => {
|
|
||||||
cy.visit('http://localhost:9000/xss24.html');
|
|
||||||
cy.wait(1000);
|
|
||||||
cy.get('#the-malware').should('not.exist');
|
|
||||||
});
|
|
||||||
it('should sanitize backticks block diagram labels properly', () => {
|
|
||||||
cy.visit('http://localhost:9000/xss25.html');
|
|
||||||
cy.wait(1000);
|
|
||||||
cy.get('#the-malware').should('not.exist');
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
@@ -11,27 +11,6 @@ describe('Git Graph diagram', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('Should render subgraphs with title margins and edge labels', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`flowchart LR
|
|
||||||
|
|
||||||
subgraph TOP
|
|
||||||
direction TB
|
|
||||||
subgraph B1
|
|
||||||
direction RL
|
|
||||||
i1 --lb1-->f1
|
|
||||||
end
|
|
||||||
subgraph B2
|
|
||||||
direction BT
|
|
||||||
i2 --lb2-->f2
|
|
||||||
end
|
|
||||||
end
|
|
||||||
A --lb3--> TOP --lb4--> B
|
|
||||||
B1 --lb5--> B2
|
|
||||||
`,
|
|
||||||
{ flowchart: { subGraphTitleMargin: { top: 10, bottom: 5 } } }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
// it(`ultraFastTest`, function () {
|
// it(`ultraFastTest`, function () {
|
||||||
// // Navigate to the url we want to test
|
// // Navigate to the url we want to test
|
||||||
// // ⭐️ Note to see visual bugs, run the test using the above URL for the 1st run.
|
// // ⭐️ Note to see visual bugs, run the test using the above URL for the 1st run.
|
||||||
|
@@ -1,387 +0,0 @@
|
|||||||
import { imgSnapshotTest } from '../../helpers/util';
|
|
||||||
/* eslint-disable no-useless-escape */
|
|
||||||
describe('Block diagram', () => {
|
|
||||||
it('BL1: should calculate the block widths', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 2
|
|
||||||
block
|
|
||||||
id2["I am a wide one"]
|
|
||||||
id1
|
|
||||||
end
|
|
||||||
id["Next row"]
|
|
||||||
`
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL2: should handle colums statement in sub-blocks', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
id1["Hello"]
|
|
||||||
block
|
|
||||||
columns 3
|
|
||||||
id2["to"]
|
|
||||||
id3["the"]
|
|
||||||
id4["World"]
|
|
||||||
id5["World"]
|
|
||||||
end
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL3: should align block widths and handle colums statement in sub-blocks', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
block
|
|
||||||
columns 1
|
|
||||||
id1
|
|
||||||
id2
|
|
||||||
id2.1
|
|
||||||
end
|
|
||||||
id3
|
|
||||||
id4
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL4: should align block widths and handle colums statements in deeper sub-blocks then 1 level', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 1
|
|
||||||
block
|
|
||||||
columns 1
|
|
||||||
block
|
|
||||||
columns 3
|
|
||||||
id1
|
|
||||||
id2
|
|
||||||
id2.1(("XYZ"))
|
|
||||||
end
|
|
||||||
id48
|
|
||||||
end
|
|
||||||
id3
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL5: should align block widths and handle colums statements in deeper sub-blocks then 1 level (alt)', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 1
|
|
||||||
block
|
|
||||||
id1
|
|
||||||
id2
|
|
||||||
block
|
|
||||||
columns 1
|
|
||||||
id3("Wider then")
|
|
||||||
id5(("id5"))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
id4
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL6: should handle block arrows and spece statements', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 3
|
|
||||||
space:3
|
|
||||||
ida idb idc
|
|
||||||
id1 id2
|
|
||||||
blockArrowId<["Label"]>(right)
|
|
||||||
blockArrowId2<["Label"]>(left)
|
|
||||||
blockArrowId3<["Label"]>(up)
|
|
||||||
blockArrowId4<["Label"]>(down)
|
|
||||||
blockArrowId5<["Label"]>(x)
|
|
||||||
blockArrowId6<["Label"]>(y)
|
|
||||||
blockArrowId6<["Label"]>(x, down)
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL7: should handle different types of edges', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 3
|
|
||||||
A space:5
|
|
||||||
A --o B
|
|
||||||
A --> C
|
|
||||||
A --x D
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL8: should handle sub-blocks without columns statements', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 2
|
|
||||||
C A B
|
|
||||||
block
|
|
||||||
D
|
|
||||||
E
|
|
||||||
end
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL9: should handle edges from blocks in sub blocks to other blocks', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 3
|
|
||||||
B space
|
|
||||||
block
|
|
||||||
D
|
|
||||||
end
|
|
||||||
D --> B
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL10: should handle edges from composite blocks', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 3
|
|
||||||
B space
|
|
||||||
block BL
|
|
||||||
D
|
|
||||||
end
|
|
||||||
BL --> B
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL11: should handle edges to composite blocks', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 3
|
|
||||||
B space
|
|
||||||
block BL
|
|
||||||
D
|
|
||||||
end
|
|
||||||
B --> BL
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL12: edges should handle labels', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
A
|
|
||||||
space
|
|
||||||
A -- "apa" --> E
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL13: should handle block arrows in different directions', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 3
|
|
||||||
space blockArrowId1<["down"]>(down) space
|
|
||||||
blockArrowId2<["right"]>(right) blockArrowId3<["Sync"]>(x, y) blockArrowId4<["left"]>(left)
|
|
||||||
space blockArrowId5<["up"]>(up) space
|
|
||||||
blockArrowId6<["x"]>(x) space blockArrowId7<["y"]>(y)
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL14: should style statements and class statements', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
A
|
|
||||||
B
|
|
||||||
classDef blue fill:#66f,stroke:#333,stroke-width:2px;
|
|
||||||
class A blue
|
|
||||||
style B fill:#f9F,stroke:#333,stroke-width:4px
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL15: width alignment - D and E should share available space', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
block
|
|
||||||
D
|
|
||||||
E
|
|
||||||
end
|
|
||||||
db("This is the text in the box")
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL16: width alignment - C should be as wide as the composite block', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
block
|
|
||||||
A("This is the text")
|
|
||||||
B
|
|
||||||
end
|
|
||||||
C
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL17: width alignment - blocks shold be equal in width', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
A("This is the text")
|
|
||||||
B
|
|
||||||
C
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL18: block types 1 - square, rounded and circle', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
A["square"]
|
|
||||||
B("rounded")
|
|
||||||
C(("circle"))
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL19: block types 2 - odd, diamond and hexagon', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
A>"rect_left_inv_arrow"]
|
|
||||||
B{"diamond"}
|
|
||||||
C{{"hexagon"}}
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL20: block types 3 - stadium', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
A(["stadium"])
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL21: block types 4 - lean right, lean left, trapezoid and inv trapezoid', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
A[/"lean right"/]
|
|
||||||
B[\"lean left"\]
|
|
||||||
C[/"trapezoid"\]
|
|
||||||
D[\"trapezoid alt"/]
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL22: block types 1 - square, rounded and circle', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
A["square"]
|
|
||||||
B("rounded")
|
|
||||||
C(("circle"))
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL23: sizing - it should be possible to make a block wider', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
A("rounded"):2
|
|
||||||
B:2
|
|
||||||
C
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL24: sizing - it should be possible to make a composite block wider', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
block:2
|
|
||||||
A
|
|
||||||
end
|
|
||||||
B
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL25: block in the middle with space on each side', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 3
|
|
||||||
space
|
|
||||||
middle["In the middle"]
|
|
||||||
space
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('BL26: space and an edge', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 5
|
|
||||||
A space B
|
|
||||||
A --x B
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('BL27: block sizes for regular blocks', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 3
|
|
||||||
a["A wide one"] b:2 c:2 d
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('BL28: composite block with a set width - f should use the available space', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 3
|
|
||||||
a:3
|
|
||||||
block:e:3
|
|
||||||
f
|
|
||||||
end
|
|
||||||
g
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('BL29: composite block with a set width - f and g should split the available space', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`block-beta
|
|
||||||
columns 3
|
|
||||||
a:3
|
|
||||||
block:e:3
|
|
||||||
f
|
|
||||||
g
|
|
||||||
end
|
|
||||||
h
|
|
||||||
i
|
|
||||||
j
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
@@ -1,7 +1,7 @@
|
|||||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts';
|
import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts';
|
||||||
|
|
||||||
describe('C4 diagram', () => {
|
describe('C4 diagram', () => {
|
||||||
it('C4.1 should render a simple C4Context diagram', () => {
|
it('should render a simple C4Context diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
C4Context
|
C4Context
|
||||||
@@ -30,8 +30,9 @@ describe('C4 diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
it('C4.2 should render a simple C4Container diagram', () => {
|
it('should render a simple C4Container diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
C4Container
|
C4Container
|
||||||
@@ -49,8 +50,9 @@ describe('C4 diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
it('C4.3 should render a simple C4Component diagram', () => {
|
it('should render a simple C4Component diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
C4Component
|
C4Component
|
||||||
@@ -67,8 +69,9 @@ describe('C4 diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
it('C4.4 should render a simple C4Dynamic diagram', () => {
|
it('should render a simple C4Dynamic diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
C4Dynamic
|
C4Dynamic
|
||||||
@@ -90,8 +93,9 @@ describe('C4 diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
it('C4.5 should render a simple C4Deployment diagram', () => {
|
it('should render a simple C4Deployment diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
C4Deployment
|
C4Deployment
|
||||||
@@ -113,5 +117,6 @@ describe('C4 diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -76,7 +76,7 @@ describe('Class diagram V2', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('2.1 should render a simple class diagram with different visibilities', () => {
|
it('should render a simple class diagram with different visibilities', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
classDiagram-v2
|
classDiagram-v2
|
||||||
@@ -93,7 +93,7 @@ describe('Class diagram V2', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('3: should render multiple class diagrams', () => {
|
it('should render multiple class diagrams', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
[
|
[
|
||||||
`
|
`
|
||||||
@@ -386,6 +386,30 @@ describe('Class diagram V2', () => {
|
|||||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('18: should handle the direction statement with LR', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
classDiagram
|
||||||
|
direction LR
|
||||||
|
class Student {
|
||||||
|
-idCard : IdCard
|
||||||
|
}
|
||||||
|
class IdCard{
|
||||||
|
-id : int
|
||||||
|
-name : string
|
||||||
|
}
|
||||||
|
class Bike{
|
||||||
|
-id : int
|
||||||
|
-name : string
|
||||||
|
}
|
||||||
|
Student "1" --o "1" IdCard : carries
|
||||||
|
Student "1" --o "1" Bike : rides
|
||||||
|
|
||||||
|
`,
|
||||||
|
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||||
|
);
|
||||||
|
});
|
||||||
it('17a: should handle the direction statement with BT', () => {
|
it('17a: should handle the direction statement with BT', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
@@ -433,31 +457,7 @@ describe('Class diagram V2', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('18a: should handle the direction statement with LR', () => {
|
it('18: should render a simple class diagram with notes', () => {
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
classDiagram
|
|
||||||
direction LR
|
|
||||||
class Student {
|
|
||||||
-idCard : IdCard
|
|
||||||
}
|
|
||||||
class IdCard{
|
|
||||||
-id : int
|
|
||||||
-name : string
|
|
||||||
}
|
|
||||||
class Bike{
|
|
||||||
-id : int
|
|
||||||
-name : string
|
|
||||||
}
|
|
||||||
Student "1" --o "1" IdCard : carries
|
|
||||||
Student "1" --o "1" Bike : rides
|
|
||||||
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('18b: should render a simple class diagram with notes', () => {
|
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
classDiagram-v2
|
classDiagram-v2
|
||||||
@@ -562,23 +562,4 @@ class C13["With Città foreign language"]
|
|||||||
`
|
`
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('should render a simple class diagram with no members', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
classDiagram-v2
|
|
||||||
class Class10
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should render a simple class diagram with style definition', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
classDiagram-v2
|
|
||||||
class Class10
|
|
||||||
style Class10 fill:#f9f,stroke:#333,stroke-width:4px
|
|
||||||
`,
|
|
||||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
@@ -32,6 +32,7 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 1 }
|
{ logLevel: 1 }
|
||||||
);
|
);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('2: should render a simple class diagrams with cardinality', () => {
|
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', () => {
|
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', () => {
|
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', () => {
|
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', () => {
|
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', () => {
|
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', () => {
|
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', () => {
|
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', () => {
|
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', () => {
|
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', () => {
|
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', () => {
|
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', () => {
|
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', () => {
|
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', () => {
|
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)', () => {
|
// it('17: should render a class diagram when useMaxWidth is true (default)', () => {
|
||||||
@@ -405,6 +421,7 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 1 }
|
{ logLevel: 1 }
|
||||||
);
|
);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render class diagram with newlines in title', () => {
|
it('should render class diagram with newlines in title', () => {
|
||||||
@@ -422,6 +439,7 @@ describe('Class diagram', () => {
|
|||||||
+quack()
|
+quack()
|
||||||
}
|
}
|
||||||
`);
|
`);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render class diagram with many newlines in title', () => {
|
it('should render class diagram with many newlines in title', () => {
|
||||||
@@ -483,16 +501,4 @@ describe('Class diagram', () => {
|
|||||||
B : -methods()
|
B : -methods()
|
||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should handle notes with anchor tag having target attribute', () => {
|
|
||||||
renderGraph(
|
|
||||||
`classDiagram
|
|
||||||
class test { }
|
|
||||||
note for test "<a href='https://mermaid.js.org/' target="_blank"><code>note about mermaid</code></a>"`
|
|
||||||
);
|
|
||||||
|
|
||||||
cy.get('svg').then((svg) => {
|
|
||||||
cy.get('a').should('have.attr', 'target', '_blank').should('have.attr', 'rel', 'noopener');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { imgSnapshotTest, urlSnapshotTest } from '../../helpers/util.ts';
|
import { imgSnapshotTest } from '../../helpers/util.ts';
|
||||||
|
|
||||||
describe('Configuration and directives - nodes should be light blue', () => {
|
describe('Configuration and directives - nodes should be light blue', () => {
|
||||||
it('No config - use default', () => {
|
it('No config - use default', () => {
|
||||||
@@ -14,6 +14,7 @@ describe('Configuration and directives - nodes should be light blue', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
it('Settings from initialize - nodes should be green', () => {
|
it('Settings from initialize - nodes should be green', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -27,6 +28,7 @@ graph TD
|
|||||||
end `,
|
end `,
|
||||||
{ theme: 'forest' }
|
{ theme: 'forest' }
|
||||||
);
|
);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
it('Settings from initialize overriding themeVariable - nodes should be red', () => {
|
it('Settings from initialize overriding themeVariable - nodes should be red', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -44,6 +46,7 @@ graph TD
|
|||||||
`,
|
`,
|
||||||
{ theme: 'base', themeVariables: { primaryColor: '#ff0000' }, logLevel: 0 }
|
{ theme: 'base', themeVariables: { primaryColor: '#ff0000' }, logLevel: 0 }
|
||||||
);
|
);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
it('Settings from directive - nodes should be grey', () => {
|
it('Settings from directive - nodes should be grey', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -59,24 +62,7 @@ graph TD
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
cy.get('svg');
|
||||||
it('Settings from frontmatter - nodes should be grey', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
---
|
|
||||||
config:
|
|
||||||
theme: neutral
|
|
||||||
---
|
|
||||||
graph TD
|
|
||||||
A(Start) --> B[/Another/]
|
|
||||||
A[/Another/] --> C[End]
|
|
||||||
subgraph section
|
|
||||||
B
|
|
||||||
C
|
|
||||||
end
|
|
||||||
`,
|
|
||||||
{}
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Settings from directive overriding theme variable - nodes should be red', () => {
|
it('Settings from directive overriding theme variable - nodes should be red', () => {
|
||||||
@@ -93,6 +79,7 @@ graph TD
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
it('Settings from initialize and directive - nodes should be grey', () => {
|
it('Settings from initialize and directive - nodes should be grey', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -108,6 +95,7 @@ graph TD
|
|||||||
`,
|
`,
|
||||||
{ theme: 'forest' }
|
{ theme: 'forest' }
|
||||||
);
|
);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
it('Theme from initialize, directive overriding theme variable - nodes should be red', () => {
|
it('Theme from initialize, directive overriding theme variable - nodes should be red', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -123,71 +111,8 @@ graph TD
|
|||||||
`,
|
`,
|
||||||
{ theme: 'base' }
|
{ theme: 'base' }
|
||||||
);
|
);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
it('Theme from initialize, frontmatter overriding theme variable - nodes should be red', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
---
|
|
||||||
config:
|
|
||||||
theme: base
|
|
||||||
themeVariables:
|
|
||||||
primaryColor: '#ff0000'
|
|
||||||
---
|
|
||||||
graph TD
|
|
||||||
A(Start) --> B[/Another/]
|
|
||||||
A[/Another/] --> C[End]
|
|
||||||
subgraph section
|
|
||||||
B
|
|
||||||
C
|
|
||||||
end
|
|
||||||
`,
|
|
||||||
{ theme: 'forest' }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('Theme from initialize, frontmatter overriding theme variable, directive overriding primaryColor - nodes should be red', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
---
|
|
||||||
config:
|
|
||||||
theme: base
|
|
||||||
themeVariables:
|
|
||||||
primaryColor: '#00ff00'
|
|
||||||
---
|
|
||||||
%%{init: {'theme': 'base', 'themeVariables':{ 'primaryColor': '#ff0000'}}}%%
|
|
||||||
graph TD
|
|
||||||
A(Start) --> B[/Another/]
|
|
||||||
A[/Another/] --> C[End]
|
|
||||||
subgraph section
|
|
||||||
B
|
|
||||||
C
|
|
||||||
end
|
|
||||||
`,
|
|
||||||
{ theme: 'forest' }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render if values are not quoted properly', () => {
|
|
||||||
// #ff0000 is not quoted properly, and will evaluate to null.
|
|
||||||
// This test ensures that the rendering still works.
|
|
||||||
imgSnapshotTest(
|
|
||||||
`---
|
|
||||||
config:
|
|
||||||
theme: base
|
|
||||||
themeVariables:
|
|
||||||
primaryColor: #ff0000
|
|
||||||
---
|
|
||||||
graph TD
|
|
||||||
A(Start) --> B[/Another/]
|
|
||||||
A[/Another/] --> C[End]
|
|
||||||
subgraph section
|
|
||||||
B
|
|
||||||
C
|
|
||||||
end
|
|
||||||
`,
|
|
||||||
{ theme: 'forest' }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Theme variable from initialize, theme from directive - nodes should be red', () => {
|
it('Theme variable from initialize, theme from directive - nodes should be red', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
@@ -202,11 +127,14 @@ graph TD
|
|||||||
`,
|
`,
|
||||||
{ themeVariables: { primaryColor: '#ff0000' } }
|
{ themeVariables: { primaryColor: '#ff0000' } }
|
||||||
);
|
);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
describe('when rendering several diagrams', () => {
|
describe('when rendering several diagrams', () => {
|
||||||
it('diagrams should not taint later diagrams', () => {
|
it('diagrams should not taint later diagrams', () => {
|
||||||
const url = 'http://localhost:9000/theme-directives.html';
|
const url = 'http://localhost:9000/theme-directives.html';
|
||||||
urlSnapshotTest(url, {});
|
cy.visit(url);
|
||||||
|
cy.get('svg');
|
||||||
|
cy.matchImageSnapshot('conf-and-directives.spec-when-rendering-several-diagrams-diagram-1');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
12
cypress/integration/rendering/debug.spec.js
Normal file
12
cypress/integration/rendering/debug.spec.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import { imgSnapshotTest } from '../../helpers/util.ts';
|
||||||
|
|
||||||
|
describe('Flowchart', () => {
|
||||||
|
it('34: testing the label width in percy', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`graph TD
|
||||||
|
A[Christmas]
|
||||||
|
`,
|
||||||
|
{ theme: 'forest', fontFamily: '"Noto Sans SC", sans-serif' }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
@@ -218,6 +218,7 @@ describe('Entity Relationship Diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ loglevel: 1 }
|
{ loglevel: 1 }
|
||||||
);
|
);
|
||||||
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render entities with keys', () => {
|
it('should render entities with keys', () => {
|
||||||
@@ -304,21 +305,4 @@ ORDER ||--|{ LINE-ITEM : contains
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render entities with entity name aliases', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`
|
|
||||||
erDiagram
|
|
||||||
p[Person] {
|
|
||||||
varchar(64) firstName
|
|
||||||
varchar(64) lastName
|
|
||||||
}
|
|
||||||
c["Customer Account"] {
|
|
||||||
varchar(128) email
|
|
||||||
}
|
|
||||||
p ||--o| c : has
|
|
||||||
`,
|
|
||||||
{ logLevel: 1 }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user