mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-08-21 01:06:43 +02:00
Compare commits
7 Commits
@mermaid-j
...
v10.9.3
Author | SHA1 | Date | |
---|---|---|---|
![]() |
85ec96a72d | ||
![]() |
9301a5788a | ||
![]() |
2bedd0ef87 | ||
![]() |
92a07ffe40 | ||
![]() |
4dd4997c4d | ||
![]() |
fc61512a0a | ||
![]() |
402abdf883 |
@@ -1,36 +0,0 @@
|
|||||||
export interface PackageOptions {
|
|
||||||
name: string;
|
|
||||||
packageName: string;
|
|
||||||
file: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shared common options for both ESBuild and Vite
|
|
||||||
*/
|
|
||||||
export const packageOptions = {
|
|
||||||
parser: {
|
|
||||||
name: 'mermaid-parser',
|
|
||||||
packageName: 'parser',
|
|
||||||
file: 'index.ts',
|
|
||||||
},
|
|
||||||
mermaid: {
|
|
||||||
name: 'mermaid',
|
|
||||||
packageName: 'mermaid',
|
|
||||||
file: 'mermaid.ts',
|
|
||||||
},
|
|
||||||
'mermaid-example-diagram': {
|
|
||||||
name: 'mermaid-example-diagram',
|
|
||||||
packageName: 'mermaid-example-diagram',
|
|
||||||
file: 'detector.ts',
|
|
||||||
},
|
|
||||||
'mermaid-zenuml': {
|
|
||||||
name: 'mermaid-zenuml',
|
|
||||||
packageName: 'mermaid-zenuml',
|
|
||||||
file: 'detector.ts',
|
|
||||||
},
|
|
||||||
'mermaid-layout-elk': {
|
|
||||||
name: 'mermaid-layout-elk',
|
|
||||||
packageName: 'mermaid-layout-elk',
|
|
||||||
file: 'layouts.ts',
|
|
||||||
},
|
|
||||||
} as const satisfies Record<string, PackageOptions>;
|
|
@@ -1,5 +0,0 @@
|
|||||||
import { generate } from 'langium-cli';
|
|
||||||
|
|
||||||
export async function generateLangium() {
|
|
||||||
await generate({ file: `./packages/parser/langium-config.json` });
|
|
||||||
}
|
|
@@ -1,127 +0,0 @@
|
|||||||
import { load, JSON_SCHEMA } from 'js-yaml';
|
|
||||||
import assert from 'node:assert';
|
|
||||||
import Ajv2019, { type JSONSchemaType } from 'ajv/dist/2019.js';
|
|
||||||
import type { MermaidConfig, BaseDiagramConfig } from '../packages/mermaid/src/config.type.js';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* All of the keys in the mermaid config that have a mermaid diagram config.
|
|
||||||
*/
|
|
||||||
const MERMAID_CONFIG_DIAGRAM_KEYS = [
|
|
||||||
'flowchart',
|
|
||||||
'sequence',
|
|
||||||
'gantt',
|
|
||||||
'journey',
|
|
||||||
'class',
|
|
||||||
'state',
|
|
||||||
'er',
|
|
||||||
'pie',
|
|
||||||
'quadrantChart',
|
|
||||||
'xyChart',
|
|
||||||
'requirement',
|
|
||||||
'mindmap',
|
|
||||||
'kanban',
|
|
||||||
'timeline',
|
|
||||||
'gitGraph',
|
|
||||||
'c4',
|
|
||||||
'sankey',
|
|
||||||
'block',
|
|
||||||
'packet',
|
|
||||||
'architecture',
|
|
||||||
'radar',
|
|
||||||
] as const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate default values from the JSON Schema.
|
|
||||||
*
|
|
||||||
* AJV does not support nested default values yet (or default values with $ref),
|
|
||||||
* so we need to manually find them (this may be fixed in ajv v9).
|
|
||||||
*
|
|
||||||
* @param mermaidConfigSchema - The Mermaid JSON Schema to use.
|
|
||||||
* @returns The default mermaid config object.
|
|
||||||
*/
|
|
||||||
function generateDefaults(mermaidConfigSchema: JSONSchemaType<MermaidConfig>) {
|
|
||||||
const ajv = new Ajv2019({
|
|
||||||
useDefaults: true,
|
|
||||||
allowUnionTypes: true,
|
|
||||||
strict: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
ajv.addKeyword({
|
|
||||||
keyword: 'meta:enum', // used by jsonschema2md
|
|
||||||
errors: false,
|
|
||||||
});
|
|
||||||
ajv.addKeyword({
|
|
||||||
keyword: 'tsType', // used by json-schema-to-typescript
|
|
||||||
errors: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
// ajv currently doesn't support nested default values, see https://github.com/ajv-validator/ajv/issues/1718
|
|
||||||
// (may be fixed in v9) so we need to manually use sub-schemas
|
|
||||||
const mermaidDefaultConfig = {};
|
|
||||||
|
|
||||||
assert.ok(mermaidConfigSchema.$defs);
|
|
||||||
const baseDiagramConfig = mermaidConfigSchema.$defs.BaseDiagramConfig;
|
|
||||||
|
|
||||||
for (const key of MERMAID_CONFIG_DIAGRAM_KEYS) {
|
|
||||||
const subSchemaRef = mermaidConfigSchema.properties[key].$ref;
|
|
||||||
const [root, defs, defName] = subSchemaRef.split('/');
|
|
||||||
assert.strictEqual(root, '#');
|
|
||||||
assert.strictEqual(defs, '$defs');
|
|
||||||
const subSchema = {
|
|
||||||
$schema: mermaidConfigSchema.$schema,
|
|
||||||
$defs: mermaidConfigSchema.$defs,
|
|
||||||
...mermaidConfigSchema.$defs[defName],
|
|
||||||
} as JSONSchemaType<BaseDiagramConfig>;
|
|
||||||
|
|
||||||
const validate = ajv.compile(subSchema);
|
|
||||||
|
|
||||||
mermaidDefaultConfig[key] = {};
|
|
||||||
|
|
||||||
for (const required of subSchema.required ?? []) {
|
|
||||||
if (subSchema.properties[required] === undefined && baseDiagramConfig.properties[required]) {
|
|
||||||
mermaidDefaultConfig[key][required] = baseDiagramConfig.properties[required].default;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!validate(mermaidDefaultConfig[key])) {
|
|
||||||
throw new Error(
|
|
||||||
`schema for subconfig ${key} does not have valid defaults! Errors were ${JSON.stringify(
|
|
||||||
validate.errors,
|
|
||||||
undefined,
|
|
||||||
2
|
|
||||||
)}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const validate = ajv.compile(mermaidConfigSchema);
|
|
||||||
|
|
||||||
if (!validate(mermaidDefaultConfig)) {
|
|
||||||
throw new Error(
|
|
||||||
`Mermaid config JSON Schema does not have valid defaults! Errors were ${JSON.stringify(
|
|
||||||
validate.errors,
|
|
||||||
undefined,
|
|
||||||
2
|
|
||||||
)}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return mermaidDefaultConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const loadSchema = (src: string, filename: string): JSONSchemaType<MermaidConfig> => {
|
|
||||||
const jsonSchema = load(src, {
|
|
||||||
filename,
|
|
||||||
// only allow JSON types in our YAML doc (will probably be default in YAML 1.3)
|
|
||||||
// e.g. `true` will be parsed a boolean `true`, `True` will be parsed as string `"True"`.
|
|
||||||
schema: JSON_SCHEMA,
|
|
||||||
}) as JSONSchemaType<MermaidConfig>;
|
|
||||||
return jsonSchema;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getDefaults = (schema: JSONSchemaType<MermaidConfig>) => {
|
|
||||||
return `export default ${JSON.stringify(generateDefaults(schema), undefined, 2)};`;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getSchema = (schema: JSONSchemaType<MermaidConfig>) => {
|
|
||||||
return `export default ${JSON.stringify(schema, undefined, 2)};`;
|
|
||||||
};
|
|
@@ -1,25 +0,0 @@
|
|||||||
/* eslint-disable no-console */
|
|
||||||
import { packageOptions } from './common.js';
|
|
||||||
import { execSync } from 'child_process';
|
|
||||||
|
|
||||||
const buildType = (packageName: string) => {
|
|
||||||
console.log(`Building types for ${packageName}`);
|
|
||||||
try {
|
|
||||||
const out = execSync(`tsc -p ./packages/${packageName}/tsconfig.json --emitDeclarationOnly`);
|
|
||||||
if (out.length > 0) {
|
|
||||||
console.log(out.toString());
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
if (e.stdout.length > 0) {
|
|
||||||
console.error(e.stdout.toString());
|
|
||||||
}
|
|
||||||
if (e.stderr.length > 0) {
|
|
||||||
console.error(e.stderr.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
for (const { packageName } of Object.values(packageOptions)) {
|
|
||||||
buildType(packageName);
|
|
||||||
}
|
|
@@ -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"]
|
||||||
|
}
|
@@ -13,7 +13,6 @@ bqstring
|
|||||||
BQUOTE
|
BQUOTE
|
||||||
bramp
|
bramp
|
||||||
BRKT
|
BRKT
|
||||||
brotli
|
|
||||||
callbackargs
|
callbackargs
|
||||||
callbackname
|
callbackname
|
||||||
classdef
|
classdef
|
||||||
@@ -26,10 +25,8 @@ concat
|
|||||||
controlx
|
controlx
|
||||||
controly
|
controly
|
||||||
CSSCLASS
|
CSSCLASS
|
||||||
curv
|
|
||||||
CYLINDEREND
|
CYLINDEREND
|
||||||
CYLINDERSTART
|
CYLINDERSTART
|
||||||
DAGA
|
|
||||||
datakey
|
datakey
|
||||||
DEND
|
DEND
|
||||||
descr
|
descr
|
||||||
@@ -47,17 +44,15 @@ edgesep
|
|||||||
EMPTYSTR
|
EMPTYSTR
|
||||||
enddate
|
enddate
|
||||||
ERDIAGRAM
|
ERDIAGRAM
|
||||||
eslint
|
|
||||||
flatmap
|
flatmap
|
||||||
forwardable
|
forwardable
|
||||||
frontmatter
|
frontmatter
|
||||||
funs
|
funs
|
||||||
gantt
|
gantt
|
||||||
GENERICTYPE
|
GENERICTYPE
|
||||||
|
getBoundarys
|
||||||
grammr
|
grammr
|
||||||
graphtype
|
graphtype
|
||||||
halign
|
|
||||||
iife
|
|
||||||
interp
|
interp
|
||||||
introdcued
|
introdcued
|
||||||
INVTRAPEND
|
INVTRAPEND
|
||||||
@@ -68,7 +63,6 @@ Kaufmann
|
|||||||
keyify
|
keyify
|
||||||
LABELPOS
|
LABELPOS
|
||||||
LABELTYPE
|
LABELTYPE
|
||||||
layoutstop
|
|
||||||
lcov
|
lcov
|
||||||
LEFTOF
|
LEFTOF
|
||||||
Lexa
|
Lexa
|
||||||
@@ -80,22 +74,18 @@ loglevel
|
|||||||
LOGMSG
|
LOGMSG
|
||||||
lookaheads
|
lookaheads
|
||||||
mdast
|
mdast
|
||||||
metafile
|
|
||||||
minlen
|
minlen
|
||||||
Mstartx
|
Mstartx
|
||||||
MULT
|
MULT
|
||||||
NODIR
|
NODIR
|
||||||
NSTR
|
NSTR
|
||||||
outdir
|
|
||||||
Qcontrolx
|
Qcontrolx
|
||||||
QSTR
|
|
||||||
reinit
|
reinit
|
||||||
rels
|
rels
|
||||||
reqs
|
reqs
|
||||||
rewritelinks
|
rewritelinks
|
||||||
rgba
|
rgba
|
||||||
RIGHTOF
|
RIGHTOF
|
||||||
roughjs
|
|
||||||
sankey
|
sankey
|
||||||
sequencenumber
|
sequencenumber
|
||||||
shrc
|
shrc
|
||||||
@@ -115,17 +105,13 @@ strikethrough
|
|||||||
stringifying
|
stringifying
|
||||||
struct
|
struct
|
||||||
STYLECLASS
|
STYLECLASS
|
||||||
STYLEDEF
|
|
||||||
STYLEOPTS
|
STYLEOPTS
|
||||||
subcomponent
|
subcomponent
|
||||||
subcomponents
|
subcomponents
|
||||||
subconfig
|
|
||||||
SUBROUTINEEND
|
SUBROUTINEEND
|
||||||
SUBROUTINESTART
|
SUBROUTINESTART
|
||||||
Subschemas
|
Subschemas
|
||||||
substr
|
substr
|
||||||
SVGG
|
|
||||||
SVGSVG
|
|
||||||
TAGEND
|
TAGEND
|
||||||
TAGSTART
|
TAGSTART
|
||||||
techn
|
techn
|
||||||
@@ -136,13 +122,11 @@ titlevalue
|
|||||||
topbar
|
topbar
|
||||||
TRAPEND
|
TRAPEND
|
||||||
TRAPSTART
|
TRAPSTART
|
||||||
treemap
|
|
||||||
ts-nocheck
|
ts-nocheck
|
||||||
tsdoc
|
tsdoc
|
||||||
typeof
|
typeof
|
||||||
typestr
|
typestr
|
||||||
unshift
|
unshift
|
||||||
urlsafe
|
|
||||||
verifymethod
|
verifymethod
|
||||||
VERIFYMTHD
|
VERIFYMTHD
|
||||||
WARN_DOCSDIR_DOESNT_MATCH
|
WARN_DOCSDIR_DOESNT_MATCH
|
||||||
|
@@ -2,10 +2,7 @@
|
|||||||
Ashish Jain
|
Ashish Jain
|
||||||
cpettitt
|
cpettitt
|
||||||
Dong Cai
|
Dong Cai
|
||||||
knsv
|
|
||||||
Knut Sveidqvist
|
|
||||||
Nikolay Rozhkov
|
Nikolay Rozhkov
|
||||||
Peng Xiao
|
Peng Xiao
|
||||||
Per Brolin
|
|
||||||
Sidharth Vinod
|
|
||||||
subhash-halder
|
subhash-halder
|
||||||
|
Vinod Sidharth
|
||||||
|
@@ -28,9 +28,6 @@ dictionaryDefinitions:
|
|||||||
- name: suggestions
|
- name: suggestions
|
||||||
words:
|
words:
|
||||||
- none
|
- none
|
||||||
- disp
|
|
||||||
- subproc
|
|
||||||
- tria
|
|
||||||
suggestWords:
|
suggestWords:
|
||||||
- seperator:separator
|
- seperator:separator
|
||||||
- vertice:vertex
|
- vertice:vertex
|
||||||
|
@@ -20,19 +20,14 @@ dagre-d3
|
|||||||
Deepdwn
|
Deepdwn
|
||||||
Docsify
|
Docsify
|
||||||
Docsy
|
Docsy
|
||||||
Doctave
|
|
||||||
DokuWiki
|
DokuWiki
|
||||||
dompurify
|
dompurify
|
||||||
elkjs
|
elkjs
|
||||||
fcose
|
|
||||||
fontawesome
|
fontawesome
|
||||||
Fonticons
|
|
||||||
Forgejo
|
|
||||||
Foswiki
|
Foswiki
|
||||||
Gitea
|
Gitea
|
||||||
graphlib
|
graphlib
|
||||||
Grav
|
Grav
|
||||||
icones
|
|
||||||
iconify
|
iconify
|
||||||
Inkdrop
|
Inkdrop
|
||||||
jiti
|
jiti
|
||||||
@@ -59,17 +54,13 @@ presetAttributify
|
|||||||
pyplot
|
pyplot
|
||||||
redmine
|
redmine
|
||||||
rehype
|
rehype
|
||||||
roughjs
|
|
||||||
rscratch
|
rscratch
|
||||||
shiki
|
|
||||||
Slidev
|
|
||||||
sparkline
|
sparkline
|
||||||
sphinxcontrib
|
sphinxcontrib
|
||||||
ssim
|
ssim
|
||||||
stylis
|
stylis
|
||||||
Swimm
|
Swimm
|
||||||
tsbuildinfo
|
tsbuildinfo
|
||||||
tseslint
|
|
||||||
Tuleap
|
Tuleap
|
||||||
Typora
|
Typora
|
||||||
unocss
|
unocss
|
||||||
|
@@ -1,31 +1,26 @@
|
|||||||
Adamiecki
|
Adamiecki
|
||||||
arrowend
|
arrowend
|
||||||
Bendpoints
|
|
||||||
bmatrix
|
bmatrix
|
||||||
braintree
|
braintree
|
||||||
catmull
|
catmull
|
||||||
compositTitleSize
|
compositTitleSize
|
||||||
curv
|
|
||||||
doublecircle
|
doublecircle
|
||||||
elems
|
elems
|
||||||
gantt
|
gantt
|
||||||
gitgraph
|
gitgraph
|
||||||
gzipped
|
gzipped
|
||||||
handDrawn
|
knsv
|
||||||
kanban
|
Knut
|
||||||
marginx
|
marginx
|
||||||
marginy
|
marginy
|
||||||
Markdownish
|
Markdownish
|
||||||
mermaidchart
|
|
||||||
mermaidjs
|
mermaidjs
|
||||||
mindmap
|
mindmap
|
||||||
mindmaps
|
mindmaps
|
||||||
mrtree
|
|
||||||
multigraph
|
multigraph
|
||||||
nodesep
|
nodesep
|
||||||
NOTEGROUP
|
NOTEGROUP
|
||||||
Pinterest
|
Pinterest
|
||||||
procs
|
|
||||||
rankdir
|
rankdir
|
||||||
ranksep
|
ranksep
|
||||||
rect
|
rect
|
||||||
@@ -34,6 +29,7 @@ sandboxed
|
|||||||
siebling
|
siebling
|
||||||
statediagram
|
statediagram
|
||||||
substate
|
substate
|
||||||
|
Sveidqvist
|
||||||
unfixable
|
unfixable
|
||||||
Viewbox
|
Viewbox
|
||||||
viewports
|
viewports
|
||||||
|
@@ -1,7 +1 @@
|
|||||||
BRANDES
|
|
||||||
circo
|
|
||||||
handDrawn
|
|
||||||
KOEPF
|
|
||||||
neato
|
|
||||||
newbranch
|
newbranch
|
||||||
validify
|
|
||||||
|
@@ -1,107 +0,0 @@
|
|||||||
import { build } from 'esbuild';
|
|
||||||
import { cp, mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
||||||
import { packageOptions } from '../.build/common.js';
|
|
||||||
import { generateLangium } from '../.build/generateLangium.js';
|
|
||||||
import type { MermaidBuildOptions } from './util.js';
|
|
||||||
import { defaultOptions, getBuildConfig } from './util.js';
|
|
||||||
|
|
||||||
const shouldVisualize = process.argv.includes('--visualize');
|
|
||||||
|
|
||||||
const buildPackage = async (entryName: keyof typeof packageOptions) => {
|
|
||||||
const commonOptions: MermaidBuildOptions = {
|
|
||||||
...defaultOptions,
|
|
||||||
options: packageOptions[entryName],
|
|
||||||
} as const;
|
|
||||||
const buildConfigs: MermaidBuildOptions[] = [
|
|
||||||
// package.mjs
|
|
||||||
{ ...commonOptions },
|
|
||||||
// package.min.mjs
|
|
||||||
{
|
|
||||||
...commonOptions,
|
|
||||||
minify: true,
|
|
||||||
metafile: shouldVisualize,
|
|
||||||
},
|
|
||||||
// package.core.mjs
|
|
||||||
{ ...commonOptions, core: true },
|
|
||||||
];
|
|
||||||
|
|
||||||
if (entryName === 'mermaid') {
|
|
||||||
const iifeOptions: MermaidBuildOptions = { ...commonOptions, format: 'iife' };
|
|
||||||
buildConfigs.push(
|
|
||||||
// mermaid.js
|
|
||||||
{ ...iifeOptions },
|
|
||||||
// mermaid.min.js
|
|
||||||
{ ...iifeOptions, minify: true, metafile: shouldVisualize },
|
|
||||||
// mermaid.tiny.min.js
|
|
||||||
{
|
|
||||||
...iifeOptions,
|
|
||||||
minify: true,
|
|
||||||
includeLargeFeatures: false,
|
|
||||||
metafile: shouldVisualize,
|
|
||||||
sourcemap: false,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (entryName === 'mermaid-zenuml') {
|
|
||||||
const iifeOptions: MermaidBuildOptions = {
|
|
||||||
...commonOptions,
|
|
||||||
format: 'iife',
|
|
||||||
globalName: 'mermaid-zenuml',
|
|
||||||
};
|
|
||||||
buildConfigs.push(
|
|
||||||
// mermaid-zenuml.js
|
|
||||||
{ ...iifeOptions },
|
|
||||||
// mermaid-zenuml.min.js
|
|
||||||
{ ...iifeOptions, minify: true, metafile: shouldVisualize }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const results = await Promise.all(buildConfigs.map((option) => build(getBuildConfig(option))));
|
|
||||||
|
|
||||||
if (shouldVisualize) {
|
|
||||||
for (const { metafile } of results) {
|
|
||||||
if (!metafile?.outputs) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const fileName = Object.keys(metafile.outputs)
|
|
||||||
.find((file) => !file.includes('chunks') && file.endsWith('js'))!
|
|
||||||
.replace('dist/', '');
|
|
||||||
// Upload metafile into https://esbuild.github.io/analyze/
|
|
||||||
await writeFile(`stats/${fileName}.meta.json`, JSON.stringify(metafile));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handler = (e) => {
|
|
||||||
// eslint-disable-next-line no-console
|
|
||||||
console.error(e);
|
|
||||||
process.exit(1);
|
|
||||||
};
|
|
||||||
|
|
||||||
const buildTinyMermaid = async () => {
|
|
||||||
await mkdir('./packages/tiny/dist', { recursive: true });
|
|
||||||
await rename(
|
|
||||||
'./packages/mermaid/dist/mermaid.tiny.min.js',
|
|
||||||
'./packages/tiny/dist/mermaid.tiny.js'
|
|
||||||
);
|
|
||||||
// Copy version from mermaid's package.json to tiny's package.json
|
|
||||||
const mermaidPkg = JSON.parse(await readFile('./packages/mermaid/package.json', 'utf8'));
|
|
||||||
const tinyPkg = JSON.parse(await readFile('./packages/tiny/package.json', 'utf8'));
|
|
||||||
tinyPkg.version = mermaidPkg.version;
|
|
||||||
|
|
||||||
await writeFile('./packages/tiny/package.json', JSON.stringify(tinyPkg, null, 2) + '\n');
|
|
||||||
await cp('./packages/mermaid/CHANGELOG.md', './packages/tiny/CHANGELOG.md');
|
|
||||||
};
|
|
||||||
|
|
||||||
const main = async () => {
|
|
||||||
await generateLangium();
|
|
||||||
await mkdir('stats', { recursive: true });
|
|
||||||
const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[];
|
|
||||||
// it should build `parser` before `mermaid` because it's a dependency
|
|
||||||
for (const pkg of packageNames) {
|
|
||||||
await buildPackage(pkg).catch(handler);
|
|
||||||
}
|
|
||||||
await buildTinyMermaid();
|
|
||||||
};
|
|
||||||
|
|
||||||
void main();
|
|
@@ -1,15 +0,0 @@
|
|||||||
import { readFile } from 'node:fs/promises';
|
|
||||||
import { transformJison } from '../.build/jisonTransformer.js';
|
|
||||||
import type { Plugin } from 'esbuild';
|
|
||||||
|
|
||||||
export const jisonPlugin: Plugin = {
|
|
||||||
name: 'jison',
|
|
||||||
setup(build) {
|
|
||||||
build.onLoad({ filter: /\.jison$/ }, async (args) => {
|
|
||||||
// Load the file from the file system
|
|
||||||
const source = await readFile(args.path, 'utf8');
|
|
||||||
const contents = transformJison(source);
|
|
||||||
return { contents, warnings: [] };
|
|
||||||
});
|
|
||||||
},
|
|
||||||
};
|
|
@@ -1,35 +0,0 @@
|
|||||||
import type { JSONSchemaType } from 'ajv/dist/2019.js';
|
|
||||||
import type { MermaidConfig } from '../packages/mermaid/src/config.type.js';
|
|
||||||
import { readFile } from 'node:fs/promises';
|
|
||||||
import { getDefaults, getSchema, loadSchema } from '../.build/jsonSchema.js';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ESBuild plugin that handles JSON Schemas saved as a `.schema.yaml` file.
|
|
||||||
*
|
|
||||||
* Use `my-example.schema.yaml?only-defaults=true` to only load the default values.
|
|
||||||
*/
|
|
||||||
|
|
||||||
export const jsonSchemaPlugin = {
|
|
||||||
name: 'json-schema-plugin',
|
|
||||||
setup(build) {
|
|
||||||
let schema: JSONSchemaType<MermaidConfig> | undefined = undefined;
|
|
||||||
let content = '';
|
|
||||||
|
|
||||||
build.onLoad({ filter: /config\.schema\.yaml$/ }, async (args) => {
|
|
||||||
// Load the file from the file system
|
|
||||||
const source = await readFile(args.path, 'utf8');
|
|
||||||
const resolvedSchema: JSONSchemaType<MermaidConfig> =
|
|
||||||
content === source && schema ? schema : loadSchema(source, args.path);
|
|
||||||
if (content !== source) {
|
|
||||||
content = source;
|
|
||||||
schema = resolvedSchema;
|
|
||||||
}
|
|
||||||
const contents = args.suffix.includes('only-defaults')
|
|
||||||
? getDefaults(resolvedSchema)
|
|
||||||
: getSchema(resolvedSchema);
|
|
||||||
return { contents, warnings: [] };
|
|
||||||
});
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
export default jsonSchemaPlugin;
|
|
@@ -1,122 +0,0 @@
|
|||||||
/* eslint-disable no-console */
|
|
||||||
import chokidar from 'chokidar';
|
|
||||||
import cors from 'cors';
|
|
||||||
import { context } from 'esbuild';
|
|
||||||
import type { Request, Response } from 'express';
|
|
||||||
import express from 'express';
|
|
||||||
import { packageOptions } from '../.build/common.js';
|
|
||||||
import { generateLangium } from '../.build/generateLangium.js';
|
|
||||||
import { defaultOptions, getBuildConfig } from './util.js';
|
|
||||||
|
|
||||||
const configs = Object.values(packageOptions).map(({ packageName }) =>
|
|
||||||
getBuildConfig({
|
|
||||||
...defaultOptions,
|
|
||||||
minify: false,
|
|
||||||
core: false,
|
|
||||||
options: packageOptions[packageName],
|
|
||||||
})
|
|
||||||
);
|
|
||||||
const mermaidIIFEConfig = getBuildConfig({
|
|
||||||
...defaultOptions,
|
|
||||||
minify: false,
|
|
||||||
core: false,
|
|
||||||
options: packageOptions.mermaid,
|
|
||||||
format: 'iife',
|
|
||||||
});
|
|
||||||
configs.push(mermaidIIFEConfig);
|
|
||||||
|
|
||||||
const contexts = await Promise.all(
|
|
||||||
configs.map(async (config) => ({ config, context: await context(config) }))
|
|
||||||
);
|
|
||||||
|
|
||||||
let rebuildCounter = 1;
|
|
||||||
const rebuildAll = async () => {
|
|
||||||
const buildNumber = rebuildCounter++;
|
|
||||||
const timeLabel = `Rebuild ${buildNumber} Time (total)`;
|
|
||||||
console.time(timeLabel);
|
|
||||||
await Promise.all(
|
|
||||||
contexts.map(async ({ config, context }) => {
|
|
||||||
const buildVariant = `Rebuild ${buildNumber} Time (${Object.keys(config.entryPoints!)[0]} ${config.format})`;
|
|
||||||
console.time(buildVariant);
|
|
||||||
await context.rebuild();
|
|
||||||
console.timeEnd(buildVariant);
|
|
||||||
})
|
|
||||||
).catch((e) => console.error(e));
|
|
||||||
console.timeEnd(timeLabel);
|
|
||||||
};
|
|
||||||
|
|
||||||
let clients: { id: number; response: Response }[] = [];
|
|
||||||
function eventsHandler(request: Request, response: Response) {
|
|
||||||
const headers = {
|
|
||||||
'Content-Type': 'text/event-stream',
|
|
||||||
Connection: 'keep-alive',
|
|
||||||
'Cache-Control': 'no-cache',
|
|
||||||
};
|
|
||||||
response.writeHead(200, headers);
|
|
||||||
const clientId = Date.now();
|
|
||||||
clients.push({
|
|
||||||
id: clientId,
|
|
||||||
response,
|
|
||||||
});
|
|
||||||
request.on('close', () => {
|
|
||||||
clients = clients.filter((client) => client.id !== clientId);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
let timeoutID: NodeJS.Timeout | undefined = undefined;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Debounce file change events to avoid rebuilding multiple times.
|
|
||||||
*/
|
|
||||||
function handleFileChange() {
|
|
||||||
if (timeoutID !== undefined) {
|
|
||||||
clearTimeout(timeoutID);
|
|
||||||
}
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
||||||
timeoutID = setTimeout(async () => {
|
|
||||||
await rebuildAll();
|
|
||||||
sendEventsToAll();
|
|
||||||
timeoutID = undefined;
|
|
||||||
}, 100);
|
|
||||||
}
|
|
||||||
|
|
||||||
function sendEventsToAll() {
|
|
||||||
clients.forEach(({ response }) => response.write(`data: ${Date.now()}\n\n`));
|
|
||||||
}
|
|
||||||
|
|
||||||
async function createServer() {
|
|
||||||
await generateLangium();
|
|
||||||
handleFileChange();
|
|
||||||
const app = express();
|
|
||||||
chokidar
|
|
||||||
.watch('**/src/**/*.{js,ts,langium,yaml,json}', {
|
|
||||||
ignoreInitial: true,
|
|
||||||
ignored: [/node_modules/, /dist/, /docs/, /coverage/],
|
|
||||||
})
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
||||||
.on('all', async (event, path) => {
|
|
||||||
// Ignore other events.
|
|
||||||
if (!['add', 'change'].includes(event)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
console.log(`${path} changed. Rebuilding...`);
|
|
||||||
if (path.endsWith('.langium')) {
|
|
||||||
await generateLangium();
|
|
||||||
}
|
|
||||||
handleFileChange();
|
|
||||||
});
|
|
||||||
|
|
||||||
app.use(cors());
|
|
||||||
app.get('/events', eventsHandler);
|
|
||||||
for (const { packageName } of Object.values(packageOptions)) {
|
|
||||||
app.use(express.static(`./packages/${packageName}/dist`));
|
|
||||||
}
|
|
||||||
app.use(express.static('demos'));
|
|
||||||
app.use(express.static('cypress/platform'));
|
|
||||||
|
|
||||||
app.listen(9000, () => {
|
|
||||||
console.log(`Listening on http://localhost:9000`);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void createServer();
|
|
119
.esbuild/util.ts
119
.esbuild/util.ts
@@ -1,119 +0,0 @@
|
|||||||
import { resolve } from 'path';
|
|
||||||
import { fileURLToPath } from 'url';
|
|
||||||
import type { BuildOptions } from 'esbuild';
|
|
||||||
import { readFileSync } from 'fs';
|
|
||||||
import jsonSchemaPlugin from './jsonSchemaPlugin.js';
|
|
||||||
import type { PackageOptions } from '../.build/common.js';
|
|
||||||
import { jisonPlugin } from './jisonPlugin.js';
|
|
||||||
|
|
||||||
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
|
||||||
|
|
||||||
export interface MermaidBuildOptions extends BuildOptions {
|
|
||||||
minify: boolean;
|
|
||||||
core: boolean;
|
|
||||||
metafile: boolean;
|
|
||||||
format: 'esm' | 'iife';
|
|
||||||
options: PackageOptions;
|
|
||||||
includeLargeFeatures: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const defaultOptions: Omit<MermaidBuildOptions, 'entryName' | 'options'> = {
|
|
||||||
minify: false,
|
|
||||||
metafile: false,
|
|
||||||
core: false,
|
|
||||||
format: 'esm',
|
|
||||||
includeLargeFeatures: true,
|
|
||||||
} as const;
|
|
||||||
|
|
||||||
const buildOptions = (override: BuildOptions): BuildOptions => {
|
|
||||||
return {
|
|
||||||
bundle: true,
|
|
||||||
minify: true,
|
|
||||||
keepNames: true,
|
|
||||||
platform: 'browser',
|
|
||||||
tsconfig: 'tsconfig.json',
|
|
||||||
resolveExtensions: ['.ts', '.js', '.json', '.jison', '.yaml'],
|
|
||||||
external: ['require', 'fs', 'path'],
|
|
||||||
outdir: 'dist',
|
|
||||||
plugins: [jisonPlugin, jsonSchemaPlugin],
|
|
||||||
sourcemap: 'external',
|
|
||||||
...override,
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
const getFileName = (
|
|
||||||
fileName: string,
|
|
||||||
{ core, format, minify, includeLargeFeatures }: MermaidBuildOptions
|
|
||||||
) => {
|
|
||||||
if (core) {
|
|
||||||
fileName += '.core';
|
|
||||||
} else if (format === 'esm') {
|
|
||||||
fileName += '.esm';
|
|
||||||
}
|
|
||||||
if (!includeLargeFeatures) {
|
|
||||||
fileName += '.tiny';
|
|
||||||
}
|
|
||||||
if (minify) {
|
|
||||||
fileName += '.min';
|
|
||||||
}
|
|
||||||
return fileName;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => {
|
|
||||||
const {
|
|
||||||
core,
|
|
||||||
format,
|
|
||||||
options: { name, file, packageName },
|
|
||||||
globalName = 'mermaid',
|
|
||||||
includeLargeFeatures,
|
|
||||||
...rest
|
|
||||||
} = options;
|
|
||||||
|
|
||||||
const external: string[] = ['require', 'fs', 'path'];
|
|
||||||
const outFileName = getFileName(name, options);
|
|
||||||
const output: BuildOptions = buildOptions({
|
|
||||||
...rest,
|
|
||||||
absWorkingDir: resolve(__dirname, `../packages/${packageName}`),
|
|
||||||
entryPoints: {
|
|
||||||
[outFileName]: `src/${file}`,
|
|
||||||
},
|
|
||||||
globalName,
|
|
||||||
logLevel: 'info',
|
|
||||||
chunkNames: `chunks/${outFileName}/[name]-[hash]`,
|
|
||||||
define: {
|
|
||||||
// This needs to be stringified for esbuild
|
|
||||||
includeLargeFeatures: `${includeLargeFeatures}`,
|
|
||||||
'import.meta.vitest': 'undefined',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
if (core) {
|
|
||||||
const { dependencies } = JSON.parse(
|
|
||||||
readFileSync(resolve(__dirname, `../packages/${packageName}/package.json`), 'utf-8')
|
|
||||||
);
|
|
||||||
// Core build is used to generate file without bundled dependencies.
|
|
||||||
// This is used by downstream projects to bundle dependencies themselves.
|
|
||||||
// Ignore dependencies and any dependencies of dependencies
|
|
||||||
external.push(...Object.keys(dependencies));
|
|
||||||
output.external = external;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (format === 'iife') {
|
|
||||||
output.format = 'iife';
|
|
||||||
output.splitting = false;
|
|
||||||
const originalGlobalName = output.globalName ?? 'mermaid';
|
|
||||||
output.globalName = `__esbuild_esm_mermaid_nm[${JSON.stringify(originalGlobalName)}]`;
|
|
||||||
// Workaround for removing the .default access in esbuild IIFE.
|
|
||||||
// https://github.com/mermaid-js/mermaid/pull/4109#discussion_r1292317396
|
|
||||||
output.footer = {
|
|
||||||
js: `globalThis[${JSON.stringify(originalGlobalName)}] = globalThis.${output.globalName}.default;`,
|
|
||||||
};
|
|
||||||
output.outExtension = { '.js': '.js' };
|
|
||||||
} else {
|
|
||||||
output.format = 'esm';
|
|
||||||
output.splitting = true;
|
|
||||||
output.outExtension = { '.js': '.mjs' };
|
|
||||||
}
|
|
||||||
|
|
||||||
return output;
|
|
||||||
};
|
|
8
.eslintignore
Normal file
8
.eslintignore
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
dist/**
|
||||||
|
.github/**
|
||||||
|
docs/Setup.md
|
||||||
|
cypress.config.js
|
||||||
|
cypress/plugins/index.js
|
||||||
|
coverage
|
||||||
|
*.json
|
||||||
|
node_modules
|
189
.eslintrc.cjs
Normal file
189
.eslintrc.cjs
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
module.exports = {
|
||||||
|
env: {
|
||||||
|
browser: true,
|
||||||
|
es6: true,
|
||||||
|
'jest/globals': true,
|
||||||
|
node: true,
|
||||||
|
},
|
||||||
|
root: true,
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
parserOptions: {
|
||||||
|
ecmaFeatures: {
|
||||||
|
experimentalObjectRestSpread: true,
|
||||||
|
jsx: true,
|
||||||
|
},
|
||||||
|
tsconfigRootDir: __dirname,
|
||||||
|
sourceType: 'module',
|
||||||
|
ecmaVersion: 2020,
|
||||||
|
allowAutomaticSingleRunInference: true,
|
||||||
|
project: ['./tsconfig.eslint.json', './packages/*/tsconfig.json'],
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
},
|
||||||
|
extends: [
|
||||||
|
'eslint:recommended',
|
||||||
|
'plugin:@typescript-eslint/recommended',
|
||||||
|
'plugin:json/recommended',
|
||||||
|
'plugin:markdown/recommended',
|
||||||
|
'plugin:@cspell/recommended',
|
||||||
|
'prettier',
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
'@typescript-eslint',
|
||||||
|
'no-only-tests',
|
||||||
|
'html',
|
||||||
|
'jest',
|
||||||
|
'jsdoc',
|
||||||
|
'json',
|
||||||
|
'@cspell',
|
||||||
|
'lodash',
|
||||||
|
'unicorn',
|
||||||
|
],
|
||||||
|
ignorePatterns: [
|
||||||
|
// this file is automatically generated by `pnpm run --filter mermaid types:build-config`
|
||||||
|
'packages/mermaid/src/config.type.ts',
|
||||||
|
],
|
||||||
|
rules: {
|
||||||
|
curly: 'error',
|
||||||
|
'no-console': 'error',
|
||||||
|
'no-prototype-builtins': 'off',
|
||||||
|
'no-unused-vars': 'off',
|
||||||
|
'cypress/no-async-tests': 'off',
|
||||||
|
'@typescript-eslint/consistent-type-imports': 'error',
|
||||||
|
'@typescript-eslint/no-explicit-any': 'warn',
|
||||||
|
'@typescript-eslint/no-floating-promises': 'error',
|
||||||
|
'@typescript-eslint/no-misused-promises': 'error',
|
||||||
|
'@typescript-eslint/no-unused-vars': 'warn',
|
||||||
|
'@typescript-eslint/ban-ts-comment': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
'ts-expect-error': 'allow-with-description',
|
||||||
|
'ts-ignore': 'allow-with-description',
|
||||||
|
'ts-nocheck': 'allow-with-description',
|
||||||
|
'ts-check': 'allow-with-description',
|
||||||
|
minimumDescriptionLength: 10,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'@typescript-eslint/naming-convention': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
selector: 'typeLike',
|
||||||
|
format: ['PascalCase'],
|
||||||
|
custom: {
|
||||||
|
regex: '^I[A-Z]',
|
||||||
|
match: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'json/*': ['error', 'allowComments'],
|
||||||
|
'@cspell/spellchecker': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
checkIdentifiers: true,
|
||||||
|
checkStrings: true,
|
||||||
|
checkStringTemplates: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'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: ['*.spec.{ts,js}', 'tests/**', 'cypress/**/*.js'],
|
||||||
|
rules: {
|
||||||
|
'@cspell/spellchecker': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
checkIdentifiers: false,
|
||||||
|
checkStrings: false,
|
||||||
|
checkStringTemplates: false,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
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,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -4,7 +4,7 @@ contact_links:
|
|||||||
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: Discord
|
||||||
url: https://discord.gg/sKeNQX4Wtj
|
url: https://discord.gg/AgrbSrBer3
|
||||||
about: Join our Community on Discord for Help and a casual chat.
|
about: Join our Community on Discord for Help and a casual chat.
|
||||||
- name: Documentation
|
- name: Documentation
|
||||||
url: https://mermaid.js.org
|
url: https://mermaid.js.org
|
||||||
|
2
.github/ISSUE_TEMPLATE/theme_proposal.yml
vendored
2
.github/ISSUE_TEMPLATE/theme_proposal.yml
vendored
@@ -29,7 +29,7 @@ body:
|
|||||||
label: Colors
|
label: Colors
|
||||||
description: |-
|
description: |-
|
||||||
A detailed list of the different colour values to use.
|
A detailed list of the different colour values to use.
|
||||||
See the [list of currently used variable names](https://mermaid-js.github.io/mermaid/#/theming?id=theme-variables-reference-table)
|
A list of currently used variable names can be found [here](https://mermaid-js.github.io/mermaid/#/theming?id=theme-variables-reference-table)
|
||||||
placeholder: |-
|
placeholder: |-
|
||||||
- background: #f4f4f4
|
- background: #f4f4f4
|
||||||
- primaryColor: #fff4dd
|
- primaryColor: #fff4dd
|
||||||
|
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
|
|
||||||
|
17
.github/lychee.toml
vendored
17
.github/lychee.toml
vendored
@@ -41,22 +41,7 @@ exclude = [
|
|||||||
"https://bundlephobia.com",
|
"https://bundlephobia.com",
|
||||||
|
|
||||||
# Chrome webstore migration issue. Temporary
|
# Chrome webstore migration issue. Temporary
|
||||||
"https://chromewebstore.google.com",
|
"https://chromewebstore.google.com"
|
||||||
|
|
||||||
# Drupal 403
|
|
||||||
"https://(www.)?drupal.org",
|
|
||||||
|
|
||||||
# Phbpp 403
|
|
||||||
"https://(www.)?phpbb.com",
|
|
||||||
|
|
||||||
# Swimm returns 404, even though the link is valid
|
|
||||||
"https://docs.swimm.io",
|
|
||||||
|
|
||||||
# Timeout
|
|
||||||
"https://huehive.co",
|
|
||||||
"https://foswiki.org",
|
|
||||||
"https://www.gnu.org",
|
|
||||||
"https://mermaid-preview.com"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# Exclude all private IPs from checking.
|
# Exclude all private IPs from checking.
|
||||||
|
2
.github/pull_request_template.md
vendored
2
.github/pull_request_template.md
vendored
@@ -15,4 +15,4 @@ Make sure you
|
|||||||
- [ ] :book: have read the [contribution guidelines](https://mermaid.js.org/community/contributing.html)
|
- [ ] :book: have read the [contribution guidelines](https://mermaid.js.org/community/contributing.html)
|
||||||
- [ ] :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://mermaid.js.org/community/contributing.html#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
|
||||||
|
36
.github/release-drafter.yml
vendored
Normal file
36
.github/release-drafter.yml
vendored
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
name-template: '$NEXT_PATCH_VERSION'
|
||||||
|
tag-template: '$NEXT_PATCH_VERSION'
|
||||||
|
categories:
|
||||||
|
- title: '🚨 **Breaking Changes**'
|
||||||
|
labels:
|
||||||
|
- 'Breaking Change'
|
||||||
|
- title: '🚀 Features'
|
||||||
|
labels:
|
||||||
|
- 'Type: Enhancement'
|
||||||
|
- 'feature' # deprecated, new PRs shouldn't have this
|
||||||
|
- title: '🐛 Bug Fixes'
|
||||||
|
labels:
|
||||||
|
- 'Type: Bug / Error'
|
||||||
|
- 'fix' # deprecated, new PRs shouldn't have this
|
||||||
|
- title: '🧰 Maintenance'
|
||||||
|
labels:
|
||||||
|
- 'Type: Other'
|
||||||
|
- 'chore' # deprecated, new PRs shouldn't have this
|
||||||
|
- title: '⚡️ Performance'
|
||||||
|
labels:
|
||||||
|
- 'Type: Performance'
|
||||||
|
- title: '📚 Documentation'
|
||||||
|
labels:
|
||||||
|
- 'Area: Documentation'
|
||||||
|
change-template: '- $TITLE (#$NUMBER) @$AUTHOR'
|
||||||
|
sort-by: title
|
||||||
|
sort-direction: ascending
|
||||||
|
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!** 🎉
|
2
.github/stale.yml
vendored
2
.github/stale.yml
vendored
@@ -15,5 +15,5 @@ markComment: >
|
|||||||
If you are still interested in this issue and it is still relevant you can comment to revive it.
|
If you are still interested in this issue and it is still relevant you can comment to revive it.
|
||||||
# Comment to post when closing a stale issue. Set to `false` to disable
|
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||||
closeComment: >
|
closeComment: >
|
||||||
This issue has been automatically closed due to a lack of activity.
|
This issue has been been automatically closed due to a lack of activity.
|
||||||
This is done to maintain a clean list of issues that the community is interested in developing.
|
This is done to maintain a clean list of issues that the community is interested in developing.
|
||||||
|
45
.github/workflows/autofix.yml
vendored
45
.github/workflows/autofix.yml
vendored
@@ -1,45 +0,0 @@
|
|||||||
name: autofix.ci # needed to securely identify the workflow
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches-ignore:
|
|
||||||
- 'renovate/**'
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
concurrency: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
autofix:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
|
||||||
# uses version from "packageManager" field in package.json
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
|
|
||||||
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@551dded8c6cc8a1054039c8bc0b8b48c51dfc6ef # main
|
|
8
.github/workflows/build-docs.yml
vendored
8
.github/workflows/build-docs.yml
vendored
@@ -8,8 +8,6 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
merge_group:
|
merge_group:
|
||||||
|
|
||||||
concurrency: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
@@ -18,12 +16,12 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
- uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
|
49
.github/workflows/build.yml
vendored
Normal file
49
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
name: Build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push: {}
|
||||||
|
merge_group:
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- synchronize
|
||||||
|
- ready_for_review
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-mermaid:
|
||||||
|
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: Run Build
|
||||||
|
run: pnpm run build
|
||||||
|
|
||||||
|
- name: Upload Mermaid Build as Artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: mermaid-build
|
||||||
|
path: packages/mermaid/dist
|
||||||
|
|
||||||
|
- name: Upload Mermaid Mindmap Build as Artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: mermaid-mindmap-build
|
||||||
|
path: packages/mermaid-mindmap/dist
|
2
.github/workflows/check-readme-in-sync.yml
vendored
2
.github/workflows/check-readme-in-sync.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Check for difference in README.md and docs/README.md
|
- name: Check for difference in README.md and docs/README.md
|
||||||
run: |
|
run: |
|
||||||
|
26
.github/workflows/checks.yml
vendored
Normal file
26
.github/workflows/checks.yml
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
on:
|
||||||
|
push:
|
||||||
|
merge_group:
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- synchronize
|
||||||
|
- ready_for_review
|
||||||
|
|
||||||
|
name: Static analysis on Test files
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check-tests:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: check tests
|
||||||
|
if: github.repository_owner == 'mermaid-js'
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- uses: testomatio/check-tests@stable
|
||||||
|
with:
|
||||||
|
framework: cypress
|
||||||
|
tests: './cypress/e2e/**/**.spec.js'
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
has-tests-label: true
|
11
.github/workflows/codeql.yml
vendored
11
.github/workflows/codeql.yml
vendored
@@ -11,9 +11,6 @@ on:
|
|||||||
- synchronize
|
- synchronize
|
||||||
- ready_for_review
|
- ready_for_review
|
||||||
|
|
||||||
permissions: # added using https://github.com/step-security/secure-repo
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
analyze:
|
analyze:
|
||||||
name: Analyze
|
name: Analyze
|
||||||
@@ -32,11 +29,11 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10
|
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 }}
|
||||||
@@ -48,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@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10
|
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
|
||||||
@@ -62,4 +59,4 @@ jobs:
|
|||||||
# make release
|
# make release
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10
|
uses: github/codeql-action/analyze@v2
|
||||||
|
4
.github/workflows/dependency-review.yml
vendored
4
.github/workflows/dependency-review.yml
vendored
@@ -15,6 +15,6 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: 'Checkout Repository'
|
- name: 'Checkout Repository'
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@v4
|
||||||
- name: 'Dependency Review'
|
- name: 'Dependency Review'
|
||||||
uses: actions/dependency-review-action@3b139cfc5fae8b618d3eae3675e383bb1769c019 # v4.5.0
|
uses: actions/dependency-review-action@v3
|
||||||
|
14
.github/workflows/e2e-applitools.yml
vendored
14
.github/workflows/e2e-applitools.yml
vendored
@@ -11,8 +11,6 @@ on:
|
|||||||
default: master
|
default: master
|
||||||
description: 'Parent branch to use for PRs'
|
description: 'Parent branch to use for PRs'
|
||||||
|
|
||||||
concurrency: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
@@ -32,31 +30,29 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
echo "::error,title=Not using Applitools::APPLITOOLS_API_KEY is empty, disabling Applitools for this run."
|
echo "::error,title=Not using Applitools::APPLITOOLS_API_KEY is empty, disabling Applitools for this run."
|
||||||
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
- uses: pnpm/action-setup@v4
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
|
|
||||||
- if: ${{ env.USE_APPLI }}
|
- if: ${{ env.USE_APPLI }}
|
||||||
name: Notify applitools of new batch
|
name: Notify applitools of new batch
|
||||||
# Copied from docs https://applitools.com/docs/topics/integrations/github-integration-ci-setup.html
|
# Copied from docs https://applitools.com/docs/topics/integrations/github-integration-ci-setup.html
|
||||||
|
run: curl -L -d '' -X POST "$APPLITOOLS_SERVER_URL/api/externals/github/push?apiKey=$APPLITOOLS_API_KEY&CommitSha=$GITHUB_SHA&BranchName=${APPLITOOLS_BRANCH}$&ParentBranchName=$APPLITOOLS_PARENT_BRANCH"
|
||||||
env:
|
env:
|
||||||
# e.g. mermaid-js/mermaid/my-branch
|
# e.g. mermaid-js/mermaid/my-branch
|
||||||
APPLITOOLS_BRANCH: ${{ github.repository }}/${{ github.ref_name }}
|
APPLITOOLS_BRANCH: ${{ github.repository }}/${{ github.ref_name }}
|
||||||
APPLITOOLS_PARENT_BRANCH: ${{ github.event.inputs.parent_branch }}
|
APPLITOOLS_PARENT_BRANCH: ${{ github.event.inputs.parent_branch }}
|
||||||
APPLITOOLS_API_KEY: ${{ secrets.APPLITOOLS_API_KEY }}
|
APPLITOOLS_API_KEY: ${{ secrets.APPLITOOLS_API_KEY }}
|
||||||
APPLITOOLS_SERVER_URL: 'https://eyesapi.applitools.com'
|
APPLITOOLS_SERVER_URL: 'https://eyesapi.applitools.com'
|
||||||
uses: wei/curl@012398a392d02480afa2720780031f8621d5f94c
|
|
||||||
with:
|
|
||||||
args: -X POST "$APPLITOOLS_SERVER_URL/api/externals/github/push?apiKey=$APPLITOOLS_API_KEY&CommitSha=$GITHUB_SHA&BranchName=${APPLITOOLS_BRANCH}$&ParentBranchName=$APPLITOOLS_PARENT_BRANCH"
|
|
||||||
|
|
||||||
- name: Cypress run
|
- name: Cypress run
|
||||||
uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12
|
uses: cypress-io/github-action@v4
|
||||||
id: cypress
|
id: cypress
|
||||||
with:
|
with:
|
||||||
start: pnpm run dev
|
start: pnpm run dev
|
||||||
|
70
.github/workflows/e2e-timings.yml
vendored
70
.github/workflows/e2e-timings.yml
vendored
@@ -1,70 +0,0 @@
|
|||||||
name: E2E - Generate Timings
|
|
||||||
|
|
||||||
on:
|
|
||||||
# run this workflow every night at 3am
|
|
||||||
schedule:
|
|
||||||
- cron: '28 3 * * *'
|
|
||||||
# or when the user triggers it from GitHub Actions page
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
concurrency: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
timings:
|
|
||||||
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@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
||||||
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
|
|
||||||
with:
|
|
||||||
node-version-file: '.node-version'
|
|
||||||
- name: Install dependencies
|
|
||||||
uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12
|
|
||||||
with:
|
|
||||||
runTests: false
|
|
||||||
|
|
||||||
- name: Cypress run
|
|
||||||
uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12
|
|
||||||
id: cypress
|
|
||||||
with:
|
|
||||||
install: false
|
|
||||||
start: pnpm run dev:coverage
|
|
||||||
wait-on: 'http://localhost:9000'
|
|
||||||
browser: chrome
|
|
||||||
publish-summary: false
|
|
||||||
env:
|
|
||||||
VITEST_COVERAGE: true
|
|
||||||
CYPRESS_COMMIT: ${{ github.sha }}
|
|
||||||
SPLIT: 1
|
|
||||||
SPLIT_INDEX: 0
|
|
||||||
SPLIT_FILE: 'cypress/timings.json'
|
|
||||||
|
|
||||||
- name: Compare timings
|
|
||||||
id: compare
|
|
||||||
run: |
|
|
||||||
OUTPUT=$(pnpm tsx scripts/compare-timings.ts)
|
|
||||||
echo "$OUTPUT" >> $GITHUB_STEP_SUMMARY
|
|
||||||
|
|
||||||
echo "output<<EOF" >> $GITHUB_OUTPUT
|
|
||||||
echo "$OUTPUT" >> $GITHUB_OUTPUT
|
|
||||||
echo "EOF" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Commit and create pull request
|
|
||||||
uses: peter-evans/create-pull-request@889dce9eaba7900ce30494f5e1ac7220b27e5c81
|
|
||||||
with:
|
|
||||||
add-paths: |
|
|
||||||
cypress/timings.json
|
|
||||||
commit-message: 'chore: update E2E timings'
|
|
||||||
branch: update-timings
|
|
||||||
title: Update E2E Timings
|
|
||||||
body: ${{ steps.compare.outputs.output }}
|
|
||||||
delete-branch: true
|
|
||||||
sign-commits: true
|
|
157
.github/workflows/e2e.yml
vendored
157
.github/workflows/e2e.yml
vendored
@@ -1,35 +1,25 @@
|
|||||||
|
# We use github cache to save snapshots between runs.
|
||||||
|
# For PRs and MergeQueues, the target commit is used, and for push events, github.event.previous is used.
|
||||||
|
# If a snapshot for a given Hash is not found, we checkout that commit, run the tests and cache the snapshots.
|
||||||
|
# These are then downloaded before running the E2E, providing the reference snapshots.
|
||||||
|
# If there are any errors, the diff image is uploaded to artifacts, and the user is notified.
|
||||||
|
|
||||||
name: E2E
|
name: E2E
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches-ignore:
|
||||||
- develop
|
- 'gh-readonly-queue/**'
|
||||||
- master
|
|
||||||
- release/**
|
|
||||||
pull_request:
|
pull_request:
|
||||||
merge_group:
|
merge_group:
|
||||||
|
|
||||||
concurrency: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
env:
|
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.
|
# For PRs and MergeQueues, the target commit is used, and for push events, github.event.previous is used.
|
||||||
targetHash: >-
|
targetHash: ${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || (github.event.before == '0000000000000000000000000000000000000000' && 'develop' || github.event.before) }}
|
||||||
${{
|
|
||||||
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
|
|
||||||
}}
|
|
||||||
RUN_VISUAL_TEST: >-
|
|
||||||
${{ github.repository == 'mermaid-js/mermaid' && (github.event_name != 'pull_request' || !startsWith(github.head_ref, 'renovate/')) }}
|
|
||||||
jobs:
|
jobs:
|
||||||
cache:
|
cache:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -37,39 +27,35 @@ jobs:
|
|||||||
image: cypress/browsers:node-20.11.0-chrome-121.0.6167.85-1-ff-120.0-edge-121.0.2277.83-1
|
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
|
options: --user 1001
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
- uses: pnpm/action-setup@v4
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
- name: Cache snapshots
|
- name: Cache snapshots
|
||||||
id: cache-snapshot
|
id: cache-snapshot
|
||||||
uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.2.1
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
|
save-always: true
|
||||||
path: ./cypress/snapshots
|
path: ./cypress/snapshots
|
||||||
key: ${{ runner.os }}-snapshots-${{ env.targetHash }}
|
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.
|
# 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
|
- name: Switch to base branch
|
||||||
if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }}
|
if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }}
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
ref: ${{ env.targetHash }}
|
ref: ${{ env.targetHash }}
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Cypress run
|
||||||
|
uses: cypress-io/github-action@v4
|
||||||
|
id: cypress-snapshot-gen
|
||||||
if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }}
|
if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }}
|
||||||
uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12
|
|
||||||
with:
|
with:
|
||||||
# just perform install
|
start: pnpm run dev
|
||||||
runTests: false
|
wait-on: 'http://localhost:9000'
|
||||||
|
browser: chrome
|
||||||
- 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
|
||||||
@@ -80,66 +66,49 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
containers: [1, 2, 3, 4, 5]
|
containers: [1, 2, 3, 4]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
- uses: pnpm/action-setup@v4
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
|
|
||||||
# These cached snapshots are downloaded, providing the reference snapshots.
|
# These cached snapshots are downloaded, providing the reference snapshots.
|
||||||
- name: Cache snapshots
|
- name: Cache snapshots
|
||||||
id: cache-snapshot
|
id: cache-snapshot
|
||||||
uses: actions/cache/restore@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.2.1
|
uses: actions/cache/restore@v3
|
||||||
with:
|
with:
|
||||||
path: ./cypress/snapshots
|
path: ./cypress/snapshots
|
||||||
key: ${{ runner.os }}-snapshots-${{ env.targetHash }}
|
key: ${{ runner.os }}-snapshots-${{ env.targetHash }}
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12
|
|
||||||
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@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12
|
uses: cypress-io/github-action@v4
|
||||||
id: cypress
|
id: cypress
|
||||||
|
# If CYPRESS_RECORD_KEY is set, run in parallel on all containers
|
||||||
|
# Otherwise (e.g. if running from fork), we run on a single container only
|
||||||
|
if: ${{ ( env.CYPRESS_RECORD_KEY != '' ) || ( matrix.containers == 1 ) }}
|
||||||
with:
|
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
|
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.RUN_VISUAL_TEST == 'true' && secrets.CYPRESS_RECORD_KEY != '' }}
|
record: ${{ secrets.CYPRESS_RECORD_KEY != '' }}
|
||||||
|
parallel: ${{ secrets.CYPRESS_RECORD_KEY != '' }}
|
||||||
env:
|
env:
|
||||||
ARGOS_PARALLEL: ${{ env.RUN_VISUAL_TEST == 'true' }}
|
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
||||||
ARGOS_PARALLEL_TOTAL: ${{ env.RUN_VISUAL_TEST == 'true' && strategy.job-total || 1 }}
|
|
||||||
ARGOS_PARALLEL_INDEX: ${{ env.RUN_VISUAL_TEST == 'true' && matrix.containers || 1 }}
|
|
||||||
CYPRESS_COMMIT: ${{ github.sha }}
|
|
||||||
CYPRESS_RECORD_KEY: ${{ env.RUN_VISUAL_TEST == 'true' && secrets.CYPRESS_RECORD_KEY || ''}}
|
|
||||||
SPLIT: ${{ strategy.job-total }}
|
|
||||||
SPLIT_INDEX: ${{ strategy.job-index }}
|
|
||||||
SPLIT_FILE: 'cypress/timings.json'
|
|
||||||
VITEST_COVERAGE: true
|
VITEST_COVERAGE: true
|
||||||
|
CYPRESS_COMMIT: ${{ github.sha }}
|
||||||
|
|
||||||
- name: Upload Coverage to Codecov
|
- name: Upload Coverage to Codecov
|
||||||
uses: codecov/codecov-action@13ce06bfc6bbe3ecf90edbbf1bc32fe5978ca1d3 # v5.3.1
|
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:
|
||||||
@@ -149,3 +118,55 @@ 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
|
||||||
|
|
||||||
|
# We upload the artifacts into numbered archives to prevent overwriting
|
||||||
|
- name: Upload Artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
if: ${{ always() }}
|
||||||
|
with:
|
||||||
|
name: snapshots-${{ matrix.containers }}
|
||||||
|
retention-days: 1
|
||||||
|
path: ./cypress/snapshots
|
||||||
|
|
||||||
|
combineArtifacts:
|
||||||
|
needs: e2e
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: ${{ always() }}
|
||||||
|
steps:
|
||||||
|
# Download all snapshot artifacts and merge them into a single folder
|
||||||
|
- name: Download All Artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
path: snapshots
|
||||||
|
pattern: snapshots-*
|
||||||
|
merge-multiple: true
|
||||||
|
|
||||||
|
# For successful push events, we save the snapshots cache
|
||||||
|
- name: Save snapshots cache
|
||||||
|
id: cache-upload
|
||||||
|
if: ${{ github.event_name == 'push' && needs.e2e.result != 'failure' }}
|
||||||
|
uses: actions/cache/save@v3
|
||||||
|
with:
|
||||||
|
path: ./snapshots
|
||||||
|
key: ${{ runner.os }}-snapshots-${{ github.event.after }}
|
||||||
|
|
||||||
|
- name: Flatten images to a folder
|
||||||
|
if: ${{ needs.e2e.result == 'failure' }}
|
||||||
|
run: |
|
||||||
|
mkdir errors
|
||||||
|
cd snapshots
|
||||||
|
find . -mindepth 2 -type d -name "*__diff_output__*" -exec sh -c 'mv "$0"/*.png ../errors/' {} \;
|
||||||
|
|
||||||
|
- name: Upload Error snapshots
|
||||||
|
if: ${{ needs.e2e.result == 'failure' }}
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
id: upload-artifacts
|
||||||
|
with:
|
||||||
|
name: error-snapshots
|
||||||
|
retention-days: 10
|
||||||
|
path: errors/
|
||||||
|
|
||||||
|
- name: Notify Users
|
||||||
|
if: ${{ needs.e2e.result == 'failure' }}
|
||||||
|
run: |
|
||||||
|
echo "::error title=Visual tests failed::You can view images that failed by downloading the error-snapshots artifact: ${{ steps.upload-artifacts.outputs.artifact-url }}"
|
||||||
|
8
.github/workflows/issue-triage.yml
vendored
8
.github/workflows/issue-triage.yml
vendored
@@ -4,17 +4,11 @@ on:
|
|||||||
issues:
|
issues:
|
||||||
types: [opened]
|
types: [opened]
|
||||||
|
|
||||||
permissions: # added using https://github.com/step-security/secure-repo
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
triage:
|
triage:
|
||||||
permissions:
|
|
||||||
issues: write # for andymckay/labeler to label issues
|
|
||||||
pull-requests: write # for andymckay/labeler to label PRs
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: andymckay/labeler@e6c4322d0397f3240f0e7e30a33b5c5df2d39e90 # 1.0.4
|
- uses: andymckay/labeler@1.0.4
|
||||||
with:
|
with:
|
||||||
repo-token: '${{ secrets.GITHUB_TOKEN }}'
|
repo-token: '${{ secrets.GITHUB_TOKEN }}'
|
||||||
add-labels: 'Status: Triage'
|
add-labels: 'Status: Triage'
|
||||||
|
9
.github/workflows/link-checker.yml
vendored
9
.github/workflows/link-checker.yml
vendored
@@ -19,9 +19,6 @@ on:
|
|||||||
# * is a special character in YAML so you have to quote this string
|
# * is a special character in YAML so you have to quote this string
|
||||||
- cron: '30 8 * * *'
|
- cron: '30 8 * * *'
|
||||||
|
|
||||||
permissions: # added using https://github.com/step-security/secure-repo
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
link-checker:
|
link-checker:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -29,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@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Restore lychee cache
|
- name: Restore lychee cache
|
||||||
uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.2.1
|
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@f613c4a64e50d792e0b31ec34bbcbba12263c6a6 # v2.3.0
|
uses: lycheeverse/lychee-action@v1.9.3
|
||||||
with:
|
with:
|
||||||
args: >-
|
args: >-
|
||||||
--config .github/lychee.toml
|
--config .github/lychee.toml
|
||||||
|
35
.github/workflows/lint.yml
vendored
35
.github/workflows/lint.yml
vendored
@@ -4,32 +4,26 @@ on:
|
|||||||
push:
|
push:
|
||||||
merge_group:
|
merge_group:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- synchronize
|
||||||
|
- ready_for_review
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
concurrency: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
docker-lint:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
||||||
|
|
||||||
- uses: hadolint/hadolint-action@54c9adbab1582c2ef04b2016b760714a4bfde3cf # v3.1.0
|
|
||||||
with:
|
|
||||||
verbose: true
|
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
- uses: pnpm/action-setup@v4
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
@@ -89,9 +83,14 @@ jobs:
|
|||||||
continue-on-error: ${{ github.event_name == 'push' }}
|
continue-on-error: ${{ github.event_name == 'push' }}
|
||||||
run: pnpm run docs:verify
|
run: pnpm run docs:verify
|
||||||
|
|
||||||
- uses: testomatio/check-tests@0ea638fcec1820cf2e7b9854fdbdd04128a55bd4 # stable
|
- 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:
|
with:
|
||||||
framework: cypress
|
message: 'Update docs'
|
||||||
tests: './cypress/e2e/**/**.spec.js'
|
add: 'docs/*'
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
has-tests-label: true
|
|
||||||
|
2
.github/workflows/pr-labeler.yml
vendored
2
.github/workflows/pr-labeler.yml
vendored
@@ -22,7 +22,7 @@ jobs:
|
|||||||
pull-requests: write # write permission is required to label PRs
|
pull-requests: write # write permission is required to label PRs
|
||||||
steps:
|
steps:
|
||||||
- name: Label PR
|
- name: Label PR
|
||||||
uses: release-drafter/release-drafter@b1476f6e6eb133afa41ed8589daba6dc69b4d3f5 # v6.1.0
|
uses: release-drafter/release-drafter@v5
|
||||||
with:
|
with:
|
||||||
config-name: pr-labeler.yml
|
config-name: pr-labeler.yml
|
||||||
disable-autolabeler: false
|
disable-autolabeler: false
|
||||||
|
12
.github/workflows/publish-docs.yml
vendored
12
.github/workflows/publish-docs.yml
vendored
@@ -23,12 +23,12 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
- uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
@@ -37,13 +37,13 @@ jobs:
|
|||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Setup Pages
|
- name: Setup Pages
|
||||||
uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0
|
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@56afc609e74202658d3ffba0e8f6dda462b719fa # v3.0.1
|
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@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5
|
uses: actions/deploy-pages@v2
|
||||||
|
23
.github/workflows/release-draft.yml
vendored
Normal file
23
.github/workflows/release-draft.yml
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
name: Draft Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
draft-release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write # write permission is required to create a GitHub release
|
||||||
|
pull-requests: read # required to read PR titles/labels
|
||||||
|
steps:
|
||||||
|
- name: Draft Release
|
||||||
|
uses: release-drafter/release-drafter@v5
|
||||||
|
with:
|
||||||
|
disable-autolabeler: true
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
@@ -9,14 +9,14 @@ jobs:
|
|||||||
publish-preview:
|
publish-preview:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
- uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
@@ -28,7 +28,7 @@ jobs:
|
|||||||
CYPRESS_CACHE_FOLDER: .cache/Cypress
|
CYPRESS_CACHE_FOLDER: .cache/Cypress
|
||||||
|
|
||||||
- name: Install Json
|
- name: Install Json
|
||||||
run: npm i json@11.0.0 --global
|
run: npm i json --global
|
||||||
|
|
||||||
- name: Publish
|
- name: Publish
|
||||||
working-directory: ./packages/mermaid
|
working-directory: ./packages/mermaid
|
||||||
|
43
.github/workflows/release-preview.yml
vendored
43
.github/workflows/release-preview.yml
vendored
@@ -1,43 +0,0 @@
|
|||||||
name: Preview release
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches: [develop]
|
|
||||||
types: [opened, synchronize, labeled, ready_for_review]
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.event.number }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
actions: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
preview:
|
|
||||||
if: ${{ github.repository_owner == 'mermaid-js' }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
id-token: write
|
|
||||||
issues: write
|
|
||||||
pull-requests: write
|
|
||||||
name: Publish preview release
|
|
||||||
timeout-minutes: 5
|
|
||||||
steps:
|
|
||||||
- name: Checkout Repo
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
|
|
||||||
with:
|
|
||||||
cache: pnpm
|
|
||||||
node-version-file: '.node-version'
|
|
||||||
|
|
||||||
- name: Install Packages
|
|
||||||
run: pnpm install --frozen-lockfile
|
|
||||||
|
|
||||||
- name: Publish packages
|
|
||||||
run: pnpx pkg-pr-new publish --pnpm './packages/*'
|
|
47
.github/workflows/release-publish.yml
vendored
Normal file
47
.github/workflows/release-publish.yml
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
name: Publish release
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: fregante/setup-git-user@v2
|
||||||
|
|
||||||
|
- 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
|
||||||
|
npm i json --global
|
||||||
|
env:
|
||||||
|
CYPRESS_CACHE_FOLDER: .cache/Cypress
|
||||||
|
|
||||||
|
- name: Prepare release
|
||||||
|
run: |
|
||||||
|
VERSION=${GITHUB_REF:10}
|
||||||
|
echo "Preparing release $VERSION"
|
||||||
|
git checkout -t origin/release/$VERSION
|
||||||
|
npm version --no-git-tag-version --allow-same-version $VERSION
|
||||||
|
git add package.json
|
||||||
|
git commit -nm "Bump version $VERSION"
|
||||||
|
git checkout -t origin/master
|
||||||
|
git merge -m "Release $VERSION" --no-ff release/$VERSION
|
||||||
|
git push --no-verify
|
||||||
|
|
||||||
|
- name: Publish
|
||||||
|
run: |
|
||||||
|
npm set //registry.npmjs.org/:_authToken $NPM_TOKEN
|
||||||
|
npm publish
|
||||||
|
env:
|
||||||
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
46
.github/workflows/release.yml
vendored
46
.github/workflows/release.yml
vendored
@@ -1,46 +0,0 @@
|
|||||||
name: Release
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
concurrency: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
|
|
||||||
permissions: # added using https://github.com/step-security/secure-repo
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
if: github.repository == 'mermaid-js/mermaid'
|
|
||||||
permissions:
|
|
||||||
contents: write # to create release (changesets/action)
|
|
||||||
id-token: write # OpenID Connect token needed for provenance
|
|
||||||
pull-requests: write # to create pull request (changesets/action)
|
|
||||||
name: Release
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout Repo
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
|
|
||||||
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@c8bada60c408975afd1a20b3db81d6eee6789308 # v1.4.9
|
|
||||||
with:
|
|
||||||
version: pnpm changeset:version
|
|
||||||
publish: pnpm changeset:publish
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
||||||
NPM_CONFIG_PROVENANCE: true
|
|
37
.github/workflows/scorecard.yml
vendored
37
.github/workflows/scorecard.yml
vendored
@@ -1,37 +0,0 @@
|
|||||||
name: Scorecard supply-chain security
|
|
||||||
on:
|
|
||||||
branch_protection_rule:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- develop
|
|
||||||
schedule:
|
|
||||||
- cron: 29 15 * * 0
|
|
||||||
permissions: read-all
|
|
||||||
jobs:
|
|
||||||
analysis:
|
|
||||||
name: Scorecard analysis
|
|
||||||
permissions:
|
|
||||||
id-token: write
|
|
||||||
security-events: write
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
||||||
with:
|
|
||||||
persist-credentials: false
|
|
||||||
- name: Run analysis
|
|
||||||
uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1
|
|
||||||
with:
|
|
||||||
results_file: results.sarif
|
|
||||||
results_format: sarif
|
|
||||||
publish_results: true
|
|
||||||
- name: Upload artifact
|
|
||||||
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
|
|
||||||
with:
|
|
||||||
name: SARIF file
|
|
||||||
path: results.sarif
|
|
||||||
retention-days: 5
|
|
||||||
- name: Upload to code-scanning
|
|
||||||
uses: github/codeql-action/upload-sarif@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10
|
|
||||||
with:
|
|
||||||
sarif_file: results.sarif
|
|
12
.github/workflows/test.yml
vendored
12
.github/workflows/test.yml
vendored
@@ -9,13 +9,13 @@ jobs:
|
|||||||
unit-test:
|
unit-test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
- uses: pnpm/action-setup@v4
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
@@ -38,12 +38,8 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
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: Verify out-of-tree build with TypeScript
|
|
||||||
run: |
|
|
||||||
pnpm test:check:tsc
|
|
||||||
|
|
||||||
- name: Upload Coverage to Codecov
|
- name: Upload Coverage to Codecov
|
||||||
uses: codecov/codecov-action@13ce06bfc6bbe3ecf90edbbf1bc32fe5978ca1d3 # v5.3.1
|
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:
|
||||||
|
2
.github/workflows/unlock-reopened-issues.yml
vendored
2
.github/workflows/unlock-reopened-issues.yml
vendored
@@ -8,6 +8,6 @@ jobs:
|
|||||||
triage:
|
triage:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: Dunning-Kruger/unlock-issues@b06b7f7e5c3f2eaa1c6d5d89f40930e4d6d9699e # v1
|
- uses: Dunning-Kruger/unlock-issues@v1
|
||||||
with:
|
with:
|
||||||
repo-token: '${{ secrets.GITHUB_TOKEN }}'
|
repo-token: '${{ secrets.GITHUB_TOKEN }}'
|
||||||
|
8
.github/workflows/update-browserlist.yml
vendored
8
.github/workflows/update-browserlist.yml
vendored
@@ -8,18 +8,18 @@ jobs:
|
|||||||
update-browser-list:
|
update-browser-list:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@v4
|
||||||
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
- uses: pnpm/action-setup@v4
|
||||||
- run: npx update-browserslist-db@latest
|
- run: npx update-browserslist-db@latest
|
||||||
- name: Commit changes
|
- name: Commit changes
|
||||||
uses: EndBug/add-and-commit@a94899bca583c204427a224a7af87c02f9b325d5 # v9.1.4
|
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
|
push: false
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # v7.0.6
|
uses: peter-evans/create-pull-request@v5
|
||||||
with:
|
with:
|
||||||
branch: update-browserslist
|
branch: update-browserslist
|
||||||
title: Update Browserslist
|
title: Update Browserslist
|
||||||
|
70
.github/workflows/validate-lockfile.yml
vendored
70
.github/workflows/validate-lockfile.yml
vendored
@@ -1,70 +0,0 @@
|
|||||||
name: Validate pnpm-lock.yaml
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- 'pnpm-lock.yaml'
|
|
||||||
- '**/package.json'
|
|
||||||
- '.github/workflows/validate-lockfile.yml'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
validate-lockfile:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Set up Node.js
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: 20
|
|
||||||
|
|
||||||
- uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
|
|
||||||
|
|
||||||
- name: Validate pnpm-lock.yaml entries
|
|
||||||
id: validate # give this step an ID so we can reference its outputs
|
|
||||||
run: |
|
|
||||||
issues=()
|
|
||||||
|
|
||||||
# 1) No tarball references
|
|
||||||
if grep -qF 'tarball:' pnpm-lock.yaml; then
|
|
||||||
issues+=("• Tarball references found (forbidden)")
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 2) No unwanted vitepress paths
|
|
||||||
if grep -qF 'packages/mermaid/src/vitepress' pnpm-lock.yaml; then
|
|
||||||
issues+=("• Disallowed path 'packages/mermaid/src/vitepress' present. Run `rm -rf packages/mermaid/src/vitepress && pnpm install` to regenerate.")
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 3) Lockfile only changes when package.json changes
|
|
||||||
git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.sha }} > changed.txt
|
|
||||||
if grep -q '^pnpm-lock.yaml$' changed.txt && ! grep -q 'package.json' changed.txt; then
|
|
||||||
issues+=("• pnpm-lock.yaml changed without any package.json modification")
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If any issues, output them and fail
|
|
||||||
if [ ${#issues[@]} -gt 0 ]; then
|
|
||||||
# Use the new GITHUB_OUTPUT approach to set a multiline output
|
|
||||||
{
|
|
||||||
echo "errors<<EOF"
|
|
||||||
printf '%s\n' "${issues[@]}"
|
|
||||||
echo "EOF"
|
|
||||||
} >> $GITHUB_OUTPUT
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Comment on PR if validation failed
|
|
||||||
if: failure()
|
|
||||||
uses: peter-evans/create-or-update-comment@v4
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
issue-number: ${{ github.event.pull_request.number }}
|
|
||||||
body: |
|
|
||||||
The following issue(s) were detected:
|
|
||||||
${{ steps.validate.outputs.errors }}
|
|
||||||
|
|
||||||
Please address these and push an update.
|
|
||||||
|
|
||||||
_Posted automatically by GitHub Actions_
|
|
7
.gitignore
vendored
7
.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,4 @@ stats/
|
|||||||
|
|
||||||
demos/dev/**
|
demos/dev/**
|
||||||
!/demos/dev/example.html
|
!/demos/dev/example.html
|
||||||
!/demos/dev/reload.js
|
|
||||||
tsx-0/**
|
tsx-0/**
|
||||||
vite.config.ts.timestamp-*
|
|
||||||
|
|
||||||
# autogenereated by langium-cli
|
|
||||||
generated/
|
|
||||||
|
@@ -1,2 +0,0 @@
|
|||||||
ignored:
|
|
||||||
- DL3002 # TODO: Last USER should not be root
|
|
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,2 +1,4 @@
|
|||||||
#!/usr/bin/env sh
|
#!/bin/sh
|
||||||
NODE_OPTIONS="--max_old_space_size=8192" pnpm run pre-commit
|
. "$(dirname "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
pnpm run pre-commit
|
||||||
|
@@ -1 +1 @@
|
|||||||
22.14.0
|
v20.11.1
|
||||||
|
@@ -11,10 +11,6 @@ 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
|
# Ignore the files creates in /demos/dev except for example.html
|
||||||
demos/dev/**
|
demos/dev/**
|
||||||
!/demos/dev/example.html
|
!/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,15 +1,13 @@
|
|||||||
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';
|
||||||
import jsonSchemaPlugin from './jsonSchemaPlugin.js';
|
import jsonSchemaPlugin from './jsonSchemaPlugin.js';
|
||||||
|
import { readFileSync } from 'fs';
|
||||||
import typescript from '@rollup/plugin-typescript';
|
import typescript from '@rollup/plugin-typescript';
|
||||||
import { visualizer } from 'rollup-plugin-visualizer';
|
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 { 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');
|
||||||
@@ -38,6 +36,24 @@ const visualizerOptions = (packageName: string, core = false): PluginOption[] =>
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const packageOptions = {
|
||||||
|
mermaid: {
|
||||||
|
name: 'mermaid',
|
||||||
|
packageName: 'mermaid',
|
||||||
|
file: 'mermaid.ts',
|
||||||
|
},
|
||||||
|
'mermaid-example-diagram': {
|
||||||
|
name: 'mermaid-example-diagram',
|
||||||
|
packageName: 'mermaid-example-diagram',
|
||||||
|
file: 'detector.ts',
|
||||||
|
},
|
||||||
|
'mermaid-zenuml': {
|
||||||
|
name: 'mermaid-zenuml',
|
||||||
|
packageName: 'mermaid-zenuml',
|
||||||
|
file: 'detector.ts',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
interface BuildOptions {
|
interface BuildOptions {
|
||||||
minify: boolean | 'esbuild';
|
minify: boolean | 'esbuild';
|
||||||
core?: boolean;
|
core?: boolean;
|
||||||
@@ -47,18 +63,43 @@ 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',
|
||||||
sourcemap,
|
sourcemap,
|
||||||
entryFileNames: `${name}.esm${minify ? '.min' : ''}.mjs`,
|
entryFileNames: `${name}.esm${minify ? '.min' : ''}.mjs`,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name,
|
||||||
|
format: 'umd',
|
||||||
|
sourcemap,
|
||||||
|
entryFileNames: `${name}${minify ? '.min' : ''}.js`,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
if (core) {
|
||||||
|
const { dependencies } = JSON.parse(
|
||||||
|
readFileSync(resolve(__dirname, `../packages/${packageName}/package.json`), 'utf-8')
|
||||||
|
);
|
||||||
|
// Core build is used to generate file without bundled dependencies.
|
||||||
|
// This is used by downstream projects to bundle dependencies themselves.
|
||||||
|
// Ignore dependencies and any dependencies of dependencies
|
||||||
|
// Adapted from the RegEx used by `rollup-plugin-node`
|
||||||
|
external.push(new RegExp('^(?:' + Object.keys(dependencies).join('|') + ')(?:/.+)?$'));
|
||||||
|
// This needs to be an array. Otherwise vite will build esm & umd with same name and overwrite esm with umd.
|
||||||
|
output = [
|
||||||
|
{
|
||||||
|
name,
|
||||||
|
format: 'esm',
|
||||||
|
sourcemap,
|
||||||
|
entryFileNames: `${name}.core.mjs`,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
const config: InlineConfig = {
|
const config: InlineConfig = {
|
||||||
configFile: false,
|
configFile: false,
|
||||||
build: {
|
build: {
|
||||||
@@ -85,19 +126,16 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions)
|
|||||||
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,
|
||||||
}),
|
}),
|
||||||
...visualizerOptions(packageName, core),
|
...visualizerOptions(packageName, core),
|
||||||
],
|
],
|
||||||
define: {
|
|
||||||
// Needs to be string
|
|
||||||
includeLargeFeatures: 'true',
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (watch && config.build) {
|
if (watch && config.build) {
|
||||||
@@ -111,28 +149,24 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions)
|
|||||||
|
|
||||||
const buildPackage = async (entryName: keyof typeof packageOptions) => {
|
const buildPackage = async (entryName: keyof typeof packageOptions) => {
|
||||||
await build(getBuildConfig({ minify: false, entryName }));
|
await build(getBuildConfig({ minify: false, entryName }));
|
||||||
|
await build(getBuildConfig({ minify: 'esbuild', entryName }));
|
||||||
|
await build(getBuildConfig({ minify: false, core: true, entryName }));
|
||||||
};
|
};
|
||||||
|
|
||||||
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,10 +1,10 @@
|
|||||||
import { transformJison } from '../.build/jisonTransformer.js';
|
import { transformJison } from './jisonTransformer.js';
|
||||||
|
|
||||||
const fileRegex = /\.(jison)$/;
|
const fileRegex = /\.(jison)$/;
|
||||||
|
|
||||||
export default function jison() {
|
export default function jison() {
|
||||||
return {
|
return {
|
||||||
name: 'jison',
|
name: 'jison',
|
||||||
|
|
||||||
transform(src: string, id: string) {
|
transform(src: string, id: string) {
|
||||||
if (fileRegex.test(id)) {
|
if (fileRegex.test(id)) {
|
||||||
return {
|
return {
|
||||||
|
@@ -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,5 +1,110 @@
|
|||||||
import type { PluginOption } from 'vite';
|
import { load, JSON_SCHEMA } from 'js-yaml';
|
||||||
import { getDefaults, getSchema, loadSchema } from '../.build/jsonSchema.js';
|
import assert from 'node:assert';
|
||||||
|
import Ajv2019, { type JSONSchemaType } from 'ajv/dist/2019.js';
|
||||||
|
import { PluginOption } from 'vite';
|
||||||
|
|
||||||
|
import type { MermaidConfig, BaseDiagramConfig } from '../packages/mermaid/src/config.type.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All of the keys in the mermaid config that have a mermaid diagram config.
|
||||||
|
*/
|
||||||
|
const MERMAID_CONFIG_DIAGRAM_KEYS = [
|
||||||
|
'flowchart',
|
||||||
|
'sequence',
|
||||||
|
'gantt',
|
||||||
|
'journey',
|
||||||
|
'class',
|
||||||
|
'state',
|
||||||
|
'er',
|
||||||
|
'pie',
|
||||||
|
'quadrantChart',
|
||||||
|
'xyChart',
|
||||||
|
'requirement',
|
||||||
|
'mindmap',
|
||||||
|
'timeline',
|
||||||
|
'gitGraph',
|
||||||
|
'c4',
|
||||||
|
'sankey',
|
||||||
|
'block',
|
||||||
|
] as const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate default values from the JSON Schema.
|
||||||
|
*
|
||||||
|
* AJV does not support nested default values yet (or default values with $ref),
|
||||||
|
* so we need to manually find them (this may be fixed in ajv v9).
|
||||||
|
*
|
||||||
|
* @param mermaidConfigSchema - The Mermaid JSON Schema to use.
|
||||||
|
* @returns The default mermaid config object.
|
||||||
|
*/
|
||||||
|
function generateDefaults(mermaidConfigSchema: JSONSchemaType<MermaidConfig>) {
|
||||||
|
const ajv = new Ajv2019({
|
||||||
|
useDefaults: true,
|
||||||
|
allowUnionTypes: true,
|
||||||
|
strict: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
ajv.addKeyword({
|
||||||
|
keyword: 'meta:enum', // used by jsonschema2md
|
||||||
|
errors: false,
|
||||||
|
});
|
||||||
|
ajv.addKeyword({
|
||||||
|
keyword: 'tsType', // used by json-schema-to-typescript
|
||||||
|
errors: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
// ajv currently doesn't support nested default values, see https://github.com/ajv-validator/ajv/issues/1718
|
||||||
|
// (may be fixed in v9) so we need to manually use sub-schemas
|
||||||
|
const mermaidDefaultConfig = {};
|
||||||
|
|
||||||
|
assert.ok(mermaidConfigSchema.$defs);
|
||||||
|
const baseDiagramConfig = mermaidConfigSchema.$defs.BaseDiagramConfig;
|
||||||
|
|
||||||
|
for (const key of MERMAID_CONFIG_DIAGRAM_KEYS) {
|
||||||
|
const subSchemaRef = mermaidConfigSchema.properties[key].$ref;
|
||||||
|
const [root, defs, defName] = subSchemaRef.split('/');
|
||||||
|
assert.strictEqual(root, '#');
|
||||||
|
assert.strictEqual(defs, '$defs');
|
||||||
|
const subSchema = {
|
||||||
|
$schema: mermaidConfigSchema.$schema,
|
||||||
|
$defs: mermaidConfigSchema.$defs,
|
||||||
|
...mermaidConfigSchema.$defs[defName],
|
||||||
|
} as JSONSchemaType<BaseDiagramConfig>;
|
||||||
|
|
||||||
|
const validate = ajv.compile(subSchema);
|
||||||
|
|
||||||
|
mermaidDefaultConfig[key] = {};
|
||||||
|
|
||||||
|
for (const required of subSchema.required ?? []) {
|
||||||
|
if (subSchema.properties[required] === undefined && baseDiagramConfig.properties[required]) {
|
||||||
|
mermaidDefaultConfig[key][required] = baseDiagramConfig.properties[required].default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!validate(mermaidDefaultConfig[key])) {
|
||||||
|
throw new Error(
|
||||||
|
`schema for subconfig ${key} does not have valid defaults! Errors were ${JSON.stringify(
|
||||||
|
validate.errors,
|
||||||
|
undefined,
|
||||||
|
2
|
||||||
|
)}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const validate = ajv.compile(mermaidConfigSchema);
|
||||||
|
|
||||||
|
if (!validate(mermaidDefaultConfig)) {
|
||||||
|
throw new Error(
|
||||||
|
`Mermaid config JSON Schema does not have valid defaults! Errors were ${JSON.stringify(
|
||||||
|
validate.errors,
|
||||||
|
undefined,
|
||||||
|
2
|
||||||
|
)}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mermaidDefaultConfig;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Vite plugin that handles JSON Schemas saved as a `.schema.yaml` file.
|
* Vite plugin that handles JSON Schemas saved as a `.schema.yaml` file.
|
||||||
@@ -16,13 +121,32 @@ export default function jsonSchemaPlugin(): PluginOption {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const jsonSchema = loadSchema(src, idAsUrl.pathname);
|
if (idAsUrl.searchParams.get('only-defaults')) {
|
||||||
return {
|
const jsonSchema = load(src, {
|
||||||
code: idAsUrl.searchParams.get('only-defaults')
|
filename: idAsUrl.pathname,
|
||||||
? getDefaults(jsonSchema)
|
// only allow JSON types in our YAML doc (will probably be default in YAML 1.3)
|
||||||
: getSchema(jsonSchema),
|
// e.g. `true` will be parsed a boolean `true`, `True` will be parsed as string `"True"`.
|
||||||
map: null, // no source map
|
schema: JSON_SCHEMA,
|
||||||
};
|
}) as JSONSchemaType<MermaidConfig>;
|
||||||
|
return {
|
||||||
|
code: `export default ${JSON.stringify(generateDefaults(jsonSchema), undefined, 2)};`,
|
||||||
|
map: null, // no source map
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
code: `export default ${JSON.stringify(
|
||||||
|
load(src, {
|
||||||
|
filename: idAsUrl.pathname,
|
||||||
|
// only allow JSON types in our YAML doc (will probably be default in YAML 1.3)
|
||||||
|
// e.g. `true` will be parsed a boolean `true`, `True` will be parsed as string `"True"`.
|
||||||
|
schema: JSON_SCHEMA,
|
||||||
|
}),
|
||||||
|
undefined,
|
||||||
|
2
|
||||||
|
)};`,
|
||||||
|
map: null, // provide source map if available
|
||||||
|
};
|
||||||
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
import express from 'express';
|
import 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();
|
||||||
|
@@ -256,7 +256,7 @@ mermaid.run({
|
|||||||
- Problem showing graph with php on localhost [\#502](https://github.com/knsv/mermaid/issues/502)
|
- Problem showing graph with php on localhost [\#502](https://github.com/knsv/mermaid/issues/502)
|
||||||
- logLevel's option doesnt work at 7.0.0 [\#501](https://github.com/knsv/mermaid/issues/501)
|
- logLevel's option doesnt work at 7.0.0 [\#501](https://github.com/knsv/mermaid/issues/501)
|
||||||
- How do I get the log for a render or parse attempt? [\#500](https://github.com/knsv/mermaid/issues/500)
|
- How do I get the log for a render or parse attempt? [\#500](https://github.com/knsv/mermaid/issues/500)
|
||||||
- Mermaid neutral style to built in latest release [\#499](https://github.com/knsv/mermaid/issues/499)
|
- Mermaid neutral style style to built in latest release [\#499](https://github.com/knsv/mermaid/issues/499)
|
||||||
- Any plans for adding a typescript definition file? [\#495](https://github.com/knsv/mermaid/issues/495)
|
- Any plans for adding a typescript definition file? [\#495](https://github.com/knsv/mermaid/issues/495)
|
||||||
- Gantt diagrams too narrow [\#493](https://github.com/knsv/mermaid/issues/493)
|
- Gantt diagrams too narrow [\#493](https://github.com/knsv/mermaid/issues/493)
|
||||||
- Flowchart edge labels placement [\#490](https://github.com/knsv/mermaid/issues/490)
|
- Flowchart edge labels placement [\#490](https://github.com/knsv/mermaid/issues/490)
|
||||||
@@ -833,7 +833,7 @@ mermaid.run({
|
|||||||
- Merge pull request \#1 from knsv/master [\#96](https://github.com/knsv/mermaid/pull/96) ([gkchic](https://github.com/gkchic))
|
- Merge pull request \#1 from knsv/master [\#96](https://github.com/knsv/mermaid/pull/96) ([gkchic](https://github.com/gkchic))
|
||||||
- Removed duplicated section in flowchart docs [\#94](https://github.com/knsv/mermaid/pull/94) ([kaime](https://github.com/kaime))
|
- Removed duplicated section in flowchart docs [\#94](https://github.com/knsv/mermaid/pull/94) ([kaime](https://github.com/kaime))
|
||||||
- Grammar changes to sequence page [\#93](https://github.com/knsv/mermaid/pull/93) ([gkchic](https://github.com/gkchic))
|
- Grammar changes to sequence page [\#93](https://github.com/knsv/mermaid/pull/93) ([gkchic](https://github.com/gkchic))
|
||||||
- GitHub buttons [\#89](https://github.com/knsv/mermaid/pull/89) ([gkchic](https://github.com/gkchic))
|
- Github buttons [\#89](https://github.com/knsv/mermaid/pull/89) ([gkchic](https://github.com/gkchic))
|
||||||
- Template change [\#88](https://github.com/knsv/mermaid/pull/88) ([gkchic](https://github.com/gkchic))
|
- Template change [\#88](https://github.com/knsv/mermaid/pull/88) ([gkchic](https://github.com/gkchic))
|
||||||
|
|
||||||
## [0.3.1](https://github.com/knsv/mermaid/tree/0.3.1) (2015-01-05)
|
## [0.3.1](https://github.com/knsv/mermaid/tree/0.3.1) (2015-01-05)
|
||||||
@@ -1002,4 +1002,4 @@ mermaid.run({
|
|||||||
|
|
||||||
## [0.1.0](https://github.com/knsv/mermaid/tree/0.1.0) (2014-11-16)
|
## [0.1.0](https://github.com/knsv/mermaid/tree/0.1.0) (2014-11-16)
|
||||||
|
|
||||||
\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/GitHub-Changelog-Generator)_
|
\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_
|
||||||
|
15
Dockerfile
15
Dockerfile
@@ -1,13 +1,2 @@
|
|||||||
FROM node:22.12.0-alpine3.19@sha256:40dc4b415c17b85bea9be05314b4a753f45a4e1716bb31c01182e6c53d51a654
|
FROM node:20.11.1-alpine3.19 AS base
|
||||||
|
RUN wget -qO- https://get.pnpm.io/install.sh | ENV="$HOME/.shrc" SHELL="$(which sh)" sh -
|
||||||
USER 0:0
|
|
||||||
|
|
||||||
RUN corepack enable \
|
|
||||||
&& corepack enable pnpm
|
|
||||||
|
|
||||||
RUN apk add --no-cache git~=2.43.4 \
|
|
||||||
&& git config --add --system safe.directory /mermaid
|
|
||||||
|
|
||||||
ENV NODE_OPTIONS="--max_old_space_size=8192"
|
|
||||||
|
|
||||||
EXPOSE 9000 3333
|
|
||||||
|
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"drips": {
|
|
||||||
"ethereum": {
|
|
||||||
"ownedBy": "0x0831DDFe60d009d9448CC976157b539089aB821E"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
44
README.md
44
README.md
@@ -15,7 +15,7 @@ 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/sKeNQX4Wtj" 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://discord.gg/AgrbSrBer3" title="Discord 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>
|
||||||
@@ -33,10 +33,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/sKeNQX4Wtj)
|
[](https://discord.gg/AgrbSrBer3)
|
||||||
[](https://twitter.com/mermaidjs_)
|
[](https://twitter.com/mermaidjs_)
|
||||||
[](https://argos-ci.com?utm_source=mermaid&utm_campaign=oss)
|
|
||||||
[](https://securityscorecards.dev/viewer/?uri=github.com/mermaid-js/mermaid)
|
|
||||||
|
|
||||||
<img src="./img/header.png" alt="" />
|
<img src="./img/header.png" alt="" />
|
||||||
|
|
||||||
@@ -44,7 +42,7 @@ Try Live Editor previews of future releases: <a href="https://develop.git.mermai
|
|||||||
|
|
||||||
**Thanks to all involved, people committing pull requests, people answering questions! 🙏**
|
**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='Banner for "The Official Guide to Mermaid.js" book'></a>
|
<a href="https://mermaid.js.org/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
|
||||||
|
|
||||||
## Table of content
|
## Table of content
|
||||||
|
|
||||||
@@ -83,10 +81,6 @@ You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-
|
|||||||
|
|
||||||
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](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).
|
||||||
|
|
||||||
Our PR Visual Regression Testing is powered by [Argos](https://argos-ci.com/?utm_source=mermaid&utm_campaign=oss) with their generous Open Source plan. It makes the process of reviewing PRs with visual changes a breeze.
|
|
||||||
|
|
||||||
[](https://argos-ci.com?utm_source=mermaid&utm_campaign=oss)
|
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
<a href="https://applitools.com/">
|
<a href="https://applitools.com/">
|
||||||
@@ -253,34 +247,6 @@ 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>]
|
||||||
|
|
||||||
```
|
|
||||||
gitGraph
|
|
||||||
commit
|
|
||||||
commit
|
|
||||||
branch develop
|
|
||||||
checkout develop
|
|
||||||
commit
|
|
||||||
commit
|
|
||||||
checkout main
|
|
||||||
merge develop
|
|
||||||
commit
|
|
||||||
commit
|
|
||||||
```
|
|
||||||
|
|
||||||
```mermaid
|
|
||||||
gitGraph
|
|
||||||
commit
|
|
||||||
commit
|
|
||||||
branch develop
|
|
||||||
checkout develop
|
|
||||||
commit
|
|
||||||
commit
|
|
||||||
checkout main
|
|
||||||
merge develop
|
|
||||||
commit
|
|
||||||
commit
|
|
||||||
```
|
|
||||||
|
|
||||||
### 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.org/syntax/gantt.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNptkU1vhCAQhv8KIenNugiI4rkf6bmXpvEyFVxJFDYyNt1u9r8X63Z7WQ9m5pknLzieaBeMpQ3dg0dsPUkPOhwteXZIXmJcbCT3xMAxkuh8Z8kIEclyMIB209fqKcwTICFvG4IvFy_oLrZ-g9F26ILfQgvNFN94VaRXQ1iWqpumZBcu1J8p1E1TXDx59eQNr5LyEqjJn6hv5QnGNlxevZJmdLLpy5xJSzut45biYCfb0iaVxvawjNjS1p-TCguG16PvaIPzYjO67e3BwX6GiTY9jPFKH43DMF_hGMDY1J4oHg-_f8hFTJFd8L3br3yZx4QHxENsdrt1nO8dDstH3oVpF50ZYMbhU6ud4qoGLqyqBJRCmO6j0HXPZdGbihUc6Pmc0QP49xD-b5X69ZQv2gjO81IwzWqhC1lKrjJ6pA3nVS7SMiVjrKirWlYp5fs3osgrWeo00lorLWvOzz8JVbXm">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -447,7 +413,7 @@ For public sites, it can be precarious to retrieve text from users on the intern
|
|||||||
|
|
||||||
As an extra level of security for sites with external users we are happy to introduce a new security level in which the diagram is rendered in a sandboxed iframe preventing javascript in the code from being executed. This is a great step forward for better security.
|
As an extra level of security for sites with external users we are happy to introduce a new security level in which the diagram is rendered in a sandboxed iframe preventing javascript in the code from being executed. This is a great step forward for better security.
|
||||||
|
|
||||||
_Unfortunately you cannot have a cake and eat it at the same time which in this case means that some of the interactive functionality gets blocked along with the possible malicious code._
|
_Unfortunately you can not have a cake and eat it at the same time which in this case means that some of the interactive functionality gets blocked along with the possible malicious code._
|
||||||
|
|
||||||
## Reporting vulnerabilities
|
## Reporting vulnerabilities
|
||||||
|
|
||||||
@@ -463,7 +429,7 @@ A quick note from Knut Sveidqvist:
|
|||||||
>
|
>
|
||||||
> _Thank you to [Tyler Long](https://github.com/tylerlong) who has been a collaborator since April 2017._
|
> _Thank you to [Tyler Long](https://github.com/tylerlong) who has been a collaborator since April 2017._
|
||||||
>
|
>
|
||||||
> _Thank you to the ever-growing list of [contributors](https://github.com/mermaid-js/mermaid/graphs/contributors) that brought the project this far!_
|
> _Thank you to the ever-growing list of [contributors](https://github.com/knsv/mermaid/graphs/contributors) that brought the project this far!_
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@@ -15,7 +15,7 @@ Mermaid
|
|||||||
<a href="https://mermaid.live/"><b>实时编辑器!</b></a>
|
<a href="https://mermaid.live/"><b>实时编辑器!</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/sKeNQX4Wtj" 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://discord.gg/AgrbSrBer3" title="Discord invite">🙌 加入我们</a>
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="./README.md">English</a>
|
<a href="./README.md">English</a>
|
||||||
@@ -34,7 +34,7 @@ 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/sKeNQX4Wtj)
|
[](https://discord.gg/AgrbSrBer3)
|
||||||
[](https://twitter.com/mermaidjs_)
|
[](https://twitter.com/mermaidjs_)
|
||||||
|
|
||||||
<img src="./img/header.png" alt="" />
|
<img src="./img/header.png" alt="" />
|
||||||
@@ -43,13 +43,13 @@ 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='Banner for "The Official Guide to Mermaid.js" book'></a>
|
<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>
|
||||||
|
|
||||||
## 关于 Mermaid
|
## 关于 Mermaid
|
||||||
|
|
||||||
<!-- <Main description> -->
|
<!-- <Main description> -->
|
||||||
|
|
||||||
Mermaid 是一个基于 JavaScript 的图表绘制工具,通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。Mermaid 诞生的主要目的是让文档的更新能够及时跟上开发进度。
|
Mermaid 是一个基于 Javascript 的图表绘制工具,通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。Mermaid 诞生的主要目的是让文档的更新能够及时跟上开发进度。
|
||||||
|
|
||||||
> Doc-Rot 是 Mermaid 致力于解决的一个难题。
|
> Doc-Rot 是 Mermaid 致力于解决的一个难题。
|
||||||
|
|
||||||
@@ -358,7 +358,7 @@ _很不幸的是,鱼与熊掌不可兼得,在这个场景下它意味着在
|
|||||||
|
|
||||||
> _特别感谢 [d3](https://d3js.org/) 和 [dagre-d3](https://github.com/cpettitt/dagre-d3) 这两个优秀的项目,它们提供了图形布局和绘图工具库!_ > _同样感谢 [js-sequence-diagram](https://bramp.github.io/js-sequence-diagrams) 提供了时序图语法的使用。 感谢 Jessica Peter 提供了甘特图渲染的灵感。_ > _感谢 [Tyler Long](https://github.com/tylerlong) 从 2017 年四月开始成为了项目的合作者。_
|
> _特别感谢 [d3](https://d3js.org/) 和 [dagre-d3](https://github.com/cpettitt/dagre-d3) 这两个优秀的项目,它们提供了图形布局和绘图工具库!_ > _同样感谢 [js-sequence-diagram](https://bramp.github.io/js-sequence-diagrams) 提供了时序图语法的使用。 感谢 Jessica Peter 提供了甘特图渲染的灵感。_ > _感谢 [Tyler Long](https://github.com/tylerlong) 从 2017 年四月开始成为了项目的合作者。_
|
||||||
>
|
>
|
||||||
> _感谢越来越多的 [贡献者们](https://github.com/mermaid-js/mermaid/graphs/contributors),没有你们,就没有这个项目的今天!_
|
> _感谢越来越多的 [贡献者们](https://github.com/knsv/mermaid/graphs/contributors),没有你们,就没有这个项目的今天!_
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
21
__mocks__/c4Renderer.js
Normal file
21
__mocks__/c4Renderer.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* Mocked C4Context diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const drawPersonOrSystemArray = vi.fn();
|
||||||
|
export const drawBoundary = vi.fn();
|
||||||
|
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
drawPersonOrSystemArray,
|
||||||
|
drawBoundary,
|
||||||
|
setConf,
|
||||||
|
draw,
|
||||||
|
};
|
16
__mocks__/classRenderer-v2.js
Normal file
16
__mocks__/classRenderer-v2.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* Mocked class diagram v2 renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setConf,
|
||||||
|
draw,
|
||||||
|
};
|
13
__mocks__/classRenderer.js
Normal file
13
__mocks__/classRenderer.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Mocked class diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
draw,
|
||||||
|
};
|
1
__mocks__/dagre-d3.ts
Normal file
1
__mocks__/dagre-d3.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
// DO NOT delete this file. It is used by vitest to mock the dagre-d3 module.
|
3
__mocks__/entity-decode/browser.ts
Normal file
3
__mocks__/entity-decode/browser.ts
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
module.exports = function (txt: string) {
|
||||||
|
return txt;
|
||||||
|
};
|
16
__mocks__/erRenderer.js
Normal file
16
__mocks__/erRenderer.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* Mocked er diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setConf,
|
||||||
|
draw,
|
||||||
|
};
|
24
__mocks__/flowRenderer-v2.js
Normal file
24
__mocks__/flowRenderer-v2.js
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
* Mocked flow (flowchart) diagram v2 renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
export const addVertices = vi.fn();
|
||||||
|
export const addEdges = vi.fn();
|
||||||
|
export const getClasses = vi.fn().mockImplementation(() => {
|
||||||
|
return {};
|
||||||
|
});
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setConf,
|
||||||
|
addVertices,
|
||||||
|
addEdges,
|
||||||
|
getClasses,
|
||||||
|
draw,
|
||||||
|
};
|
16
__mocks__/ganttRenderer.js
Normal file
16
__mocks__/ganttRenderer.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* Mocked gantt diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setConf,
|
||||||
|
draw,
|
||||||
|
};
|
13
__mocks__/gitGraphRenderer.js
Normal file
13
__mocks__/gitGraphRenderer.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Mocked git (graph) diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
draw,
|
||||||
|
};
|
15
__mocks__/journeyRenderer.js
Normal file
15
__mocks__/journeyRenderer.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* Mocked pie (picChart) diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setConf,
|
||||||
|
draw,
|
||||||
|
};
|
8
__mocks__/pieRenderer.ts
Normal file
8
__mocks__/pieRenderer.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* Mocked pie (picChart) diagram renderer
|
||||||
|
*/
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
const draw = vi.fn().mockImplementation(() => '');
|
||||||
|
|
||||||
|
export const renderer = { draw };
|
13
__mocks__/requirementRenderer.js
Normal file
13
__mocks__/requirementRenderer.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Mocked requirement diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
draw,
|
||||||
|
};
|
13
__mocks__/sankeyRenderer.js
Normal file
13
__mocks__/sankeyRenderer.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* Mocked Sankey diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
draw,
|
||||||
|
};
|
23
__mocks__/sequenceRenderer.js
Normal file
23
__mocks__/sequenceRenderer.js
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* Mocked sequence diagram renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const bounds = vi.fn();
|
||||||
|
export const drawActors = vi.fn();
|
||||||
|
export const drawActorsPopup = vi.fn();
|
||||||
|
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
bounds,
|
||||||
|
drawActors,
|
||||||
|
drawActorsPopup,
|
||||||
|
setConf,
|
||||||
|
draw,
|
||||||
|
};
|
22
__mocks__/stateRenderer-v2.js
Normal file
22
__mocks__/stateRenderer-v2.js
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/**
|
||||||
|
* Mocked state diagram v2 renderer
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
export const setConf = vi.fn();
|
||||||
|
export const getClasses = vi.fn().mockImplementation(() => {
|
||||||
|
return {};
|
||||||
|
});
|
||||||
|
export const stateDomId = vi.fn().mockImplementation(() => {
|
||||||
|
return 'mocked-stateDiagram-stateDomId';
|
||||||
|
});
|
||||||
|
export const draw = vi.fn().mockImplementation(() => {
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setConf,
|
||||||
|
getClasses,
|
||||||
|
draw,
|
||||||
|
};
|
@@ -1,10 +1,7 @@
|
|||||||
import eyesPlugin from '@applitools/eyes-cypress';
|
|
||||||
import { registerArgosTask } from '@argos-ci/cypress/task';
|
|
||||||
import coverage from '@cypress/code-coverage/task.js';
|
|
||||||
import { defineConfig } from 'cypress';
|
import { defineConfig } from 'cypress';
|
||||||
import { addMatchImageSnapshotPlugin } from 'cypress-image-snapshot/plugin.js';
|
import { addMatchImageSnapshotPlugin } from 'cypress-image-snapshot/plugin';
|
||||||
import cypressSplit from 'cypress-split';
|
import coverage from '@cypress/code-coverage/task';
|
||||||
|
import eyesPlugin from '@applitools/eyes-cypress';
|
||||||
export default eyesPlugin(
|
export default eyesPlugin(
|
||||||
defineConfig({
|
defineConfig({
|
||||||
projectId: 'n2sma2',
|
projectId: 'n2sma2',
|
||||||
@@ -14,22 +11,16 @@ export default eyesPlugin(
|
|||||||
specPattern: 'cypress/integration/**/*.{js,ts}',
|
specPattern: 'cypress/integration/**/*.{js,ts}',
|
||||||
setupNodeEvents(on, config) {
|
setupNodeEvents(on, config) {
|
||||||
coverage(on, config);
|
coverage(on, config);
|
||||||
cypressSplit(on, config);
|
|
||||||
on('before:browser:launch', (browser, launchOptions) => {
|
on('before:browser:launch', (browser, launchOptions) => {
|
||||||
if (browser.name === 'chrome' && browser.isHeadless) {
|
if (browser.name === 'chrome' && browser.isHeadless) {
|
||||||
launchOptions.args.push('--window-size=1440,1024', '--force-device-scale-factor=1');
|
launchOptions.args.push('--window-size=1440,1024', '--force-device-scale-factor=1');
|
||||||
}
|
}
|
||||||
return launchOptions;
|
return launchOptions;
|
||||||
});
|
});
|
||||||
|
addMatchImageSnapshotPlugin(on, config);
|
||||||
// copy any needed variables from process.env to config.env
|
// copy any needed variables from process.env to config.env
|
||||||
config.env.useAppli = process.env.USE_APPLI ? true : false;
|
config.env.useAppli = process.env.USE_APPLI ? true : false;
|
||||||
config.env.useArgos = process.env.RUN_VISUAL_TEST === 'true';
|
|
||||||
|
|
||||||
if (config.env.useArgos) {
|
|
||||||
registerArgosTask(on, config);
|
|
||||||
} else {
|
|
||||||
addMatchImageSnapshotPlugin(on, config);
|
|
||||||
}
|
|
||||||
// do not forget to return the changed config object!
|
// do not forget to return the changed config object!
|
||||||
return config;
|
return config;
|
||||||
},
|
},
|
||||||
|
@@ -29,14 +29,13 @@ export const mermaidUrl = (
|
|||||||
options: CypressMermaidConfig,
|
options: CypressMermaidConfig,
|
||||||
api: boolean
|
api: boolean
|
||||||
): string => {
|
): string => {
|
||||||
options.handDrawnSeed = 1;
|
|
||||||
const codeObject: CodeObject = {
|
const codeObject: CodeObject = {
|
||||||
code: graphStr,
|
code: graphStr,
|
||||||
mermaid: options,
|
mermaid: options,
|
||||||
};
|
};
|
||||||
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}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,15 +54,16 @@ export const imgSnapshotTest = (
|
|||||||
): void => {
|
): void => {
|
||||||
const options: CypressMermaidConfig = {
|
const options: CypressMermaidConfig = {
|
||||||
..._options,
|
..._options,
|
||||||
fontFamily: _options.fontFamily ?? 'courier',
|
fontFamily: _options.fontFamily || 'courier',
|
||||||
// @ts-ignore TODO: Fix type of fontSize
|
// @ts-ignore TODO: Fix type of fontSize
|
||||||
fontSize: _options.fontSize ?? '16px',
|
fontSize: _options.fontSize || '16px',
|
||||||
sequence: {
|
sequence: {
|
||||||
...(_options.sequence ?? {}),
|
...(_options.sequence || {}),
|
||||||
actorFontFamily: 'courier',
|
actorFontFamily: 'courier',
|
||||||
noteFontFamily: _options.sequence?.noteFontFamily
|
noteFontFamily:
|
||||||
? _options.sequence.noteFontFamily
|
_options.sequence && _options.sequence.noteFontFamily
|
||||||
: 'courier',
|
? _options.sequence.noteFontFamily
|
||||||
|
: 'courier',
|
||||||
messageFontFamily: 'courier',
|
messageFontFamily: 'courier',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -74,7 +74,7 @@ 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 => {
|
||||||
@@ -95,22 +95,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}`);
|
||||||
@@ -120,22 +106,22 @@ 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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const verifyNumber = (value: number, expected: number, deltaPercent = 10): void => {
|
|
||||||
expect(value).to.be.within(
|
|
||||||
expected * (1 - deltaPercent / 100),
|
|
||||||
expected * (1 + deltaPercent / 100)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
@@ -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', () => {
|
||||||
@@ -69,9 +69,7 @@ describe('Configuration', () => {
|
|||||||
.and('include', 'url(#');
|
.and('include', 'url(#');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
// This has been broken for a long time, but something about the Cypress environment was
|
it('should handle arrowMarkerAbsolute explicitly set to "false" as false', () => {
|
||||||
// rewriting the URL to be relative, causing the test to incorrectly pass.
|
|
||||||
it.skip('should handle arrowMarkerAbsolute explicitly set to "false" as false', () => {
|
|
||||||
renderGraph(
|
renderGraph(
|
||||||
`graph TD
|
`graph TD
|
||||||
A[Christmas] -->|Get money| B(Go shopping)
|
A[Christmas] -->|Get money| B(Go shopping)
|
||||||
@@ -114,58 +112,17 @@ describe('Configuration', () => {
|
|||||||
.first()
|
.first()
|
||||||
.should('have.attr', 'marker-end')
|
.should('have.attr', 'marker-end')
|
||||||
.should('exist')
|
.should('exist')
|
||||||
.and('include', 'url(http\\:\\/\\/localhost');
|
.and('include', 'url(http://localhost');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
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.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,11 +0,0 @@
|
|||||||
describe('IIFE', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
cy.visit('http://localhost:9000/iife.html');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render when using mermaid.min.js', () => {
|
|
||||||
cy.window().should('have.property', 'rendered', true);
|
|
||||||
cy.get('svg').should('be.visible');
|
|
||||||
cy.get('#d2').should('contain', 'Hello');
|
|
||||||
});
|
|
||||||
});
|
|
@@ -20,7 +20,7 @@ describe('Interaction', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('Graph: should handle a click on a node with a bound url', () => {
|
it('Graph: should handle a click on a node with a bound url', () => {
|
||||||
// When there is a URL, `cy.contains()` selects the `a` tag instead of the `span` tag. The .node is a child of `a`, so we have to use `find()` instead of `parent`.
|
// When there is a URL, cy.contains selects the a tag instead of the span. The .node is a child of a, so we have to use find instead of parent.
|
||||||
cy.contains('URLTest1').find('.node').click();
|
cy.contains('URLTest1').find('.node').click();
|
||||||
cy.location().should(({ href }) => {
|
cy.location().should(({ href }) => {
|
||||||
expect(href).to.eq('http://localhost:9000/empty.html');
|
expect(href).to.eq('http://localhost:9000/empty.html');
|
||||||
@@ -146,7 +146,7 @@ describe('Interaction', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Interaction - security level other, misspelling', () => {
|
describe('Interaction - security level other, missspelling', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
cy.visit('http://localhost:9000/click_security_other.html');
|
cy.visit('http://localhost:9000/click_security_other.html');
|
||||||
});
|
});
|
||||||
|
16
cypress/integration/other/webpackUsage.spec.js
Normal file
16
cypress/integration/other/webpackUsage.spec.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
describe('Sequencediagram', () => {
|
||||||
|
it('should render a simple sequence diagrams', () => {
|
||||||
|
const url = 'http://localhost:9000/webpackUsage.html';
|
||||||
|
|
||||||
|
cy.visit(url);
|
||||||
|
cy.get('body').find('svg').should('have.length', 1);
|
||||||
|
});
|
||||||
|
it('should handle html escapings properly', () => {
|
||||||
|
const url = 'http://localhost:9000/webpackUsage.html?test-html-escaping=true';
|
||||||
|
|
||||||
|
cy.visit(url);
|
||||||
|
cy.get('body').find('svg').should('have.length', 1);
|
||||||
|
|
||||||
|
cy.get('g.label > foreignobject > div').should('not.contain.text', '<b>');
|
||||||
|
});
|
||||||
|
});
|
@@ -10,6 +10,7 @@ describe('XSS', () => {
|
|||||||
cy.wait(1000).then(() => {
|
cy.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', () => {
|
||||||
|
@@ -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,252 +0,0 @@
|
|||||||
import { imgSnapshotTest, urlSnapshotTest } from '../../helpers/util.ts';
|
|
||||||
|
|
||||||
describe.skip('architecture diagram', () => {
|
|
||||||
it('should render a simple architecture diagram with groups', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`architecture-beta
|
|
||||||
group api(cloud)[API]
|
|
||||||
|
|
||||||
service db(database)[Database] in api
|
|
||||||
service disk1(disk)[Storage] in api
|
|
||||||
service disk2(disk)[Storage] in api
|
|
||||||
service server(server)[Server] in api
|
|
||||||
service gateway(internet)[Gateway]
|
|
||||||
|
|
||||||
db L--R server
|
|
||||||
disk1 T--B server
|
|
||||||
disk2 T--B db
|
|
||||||
server T--B gateway
|
|
||||||
`
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should render a simple architecture diagram with titleAndAccessibilities', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`architecture-beta
|
|
||||||
title Simple Architecture Diagram
|
|
||||||
accTitle: Accessibility Title
|
|
||||||
accDescr: Accessibility Description
|
|
||||||
group api(cloud)[API]
|
|
||||||
|
|
||||||
service db(database)[Database] in api
|
|
||||||
service disk1(disk)[Storage] in api
|
|
||||||
service disk2(disk)[Storage] in api
|
|
||||||
service server(server)[Server] in api
|
|
||||||
|
|
||||||
db:L -- R:server
|
|
||||||
disk1:T -- B:server
|
|
||||||
disk2:T -- B:db
|
|
||||||
`
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should render an architecture diagram with groups within groups', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`architecture-beta
|
|
||||||
group api[API]
|
|
||||||
group public[Public API] in api
|
|
||||||
group private[Private API] in api
|
|
||||||
|
|
||||||
service serv1(server)[Server] in public
|
|
||||||
|
|
||||||
service serv2(server)[Server] in private
|
|
||||||
service db(database)[Database] in private
|
|
||||||
|
|
||||||
service gateway(internet)[Gateway] in api
|
|
||||||
|
|
||||||
serv1 B--T serv2
|
|
||||||
serv2 L--R db
|
|
||||||
serv1 L--R gateway
|
|
||||||
`
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should render an architecture diagram with the fallback icon', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`architecture-beta
|
|
||||||
service unknown(iconnamedoesntexist)[Unknown Icon]
|
|
||||||
`
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should render an architecture diagram with split directioning', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`architecture-beta
|
|
||||||
service db(database)[Database]
|
|
||||||
service s3(disk)[Storage]
|
|
||||||
service serv1(server)[Server 1]
|
|
||||||
service serv2(server)[Server 2]
|
|
||||||
service disk(disk)[Disk]
|
|
||||||
|
|
||||||
db L--R s3
|
|
||||||
serv1 L--T s3
|
|
||||||
serv2 L--B s3
|
|
||||||
serv1 T--B disk
|
|
||||||
`
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should render an architecture diagram with directional arrows', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`architecture-beta
|
|
||||||
service servC(server)[Server 1]
|
|
||||||
service servL(server)[Server 2]
|
|
||||||
service servR(server)[Server 3]
|
|
||||||
service servT(server)[Server 4]
|
|
||||||
service servB(server)[Server 5]
|
|
||||||
|
|
||||||
servC (L--R) servL
|
|
||||||
servC (R--L) servR
|
|
||||||
servC (T--B) servT
|
|
||||||
servC (B--T) servB
|
|
||||||
|
|
||||||
servL (T--L) servT
|
|
||||||
servL (B--L) servB
|
|
||||||
servR (T--R) servT
|
|
||||||
servR (B--R) servB
|
|
||||||
`
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should render an architecture diagram with group edges', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`architecture-beta
|
|
||||||
group left_group(cloud)[Left]
|
|
||||||
group right_group(cloud)[Right]
|
|
||||||
group top_group(cloud)[Top]
|
|
||||||
group bottom_group(cloud)[Bottom]
|
|
||||||
group center_group(cloud)[Center]
|
|
||||||
|
|
||||||
service left_disk(disk)[Disk] in left_group
|
|
||||||
service right_disk(disk)[Disk] in right_group
|
|
||||||
service top_disk(disk)[Disk] in top_group
|
|
||||||
service bottom_disk(disk)[Disk] in bottom_group
|
|
||||||
service center_disk(disk)[Disk] in center_group
|
|
||||||
|
|
||||||
left_disk{group} (R--L) center_disk{group}
|
|
||||||
right_disk{group} (L--R) center_disk{group}
|
|
||||||
top_disk{group} (B--T) center_disk{group}
|
|
||||||
bottom_disk{group} (T--B) center_disk{group}
|
|
||||||
`
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should render an architecture diagram with edge labels', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`architecture-beta
|
|
||||||
service servC(server)[Server 1]
|
|
||||||
service servL(server)[Server 2]
|
|
||||||
service servR(server)[Server 3]
|
|
||||||
service servT(server)[Server 4]
|
|
||||||
service servB(server)[Server 5]
|
|
||||||
|
|
||||||
servC L-[Label]-R servL
|
|
||||||
servC R-[Label]-L servR
|
|
||||||
servC T-[Label]-B servT
|
|
||||||
servC B-[Label]-T servB
|
|
||||||
|
|
||||||
servL T-[Label]-L servT
|
|
||||||
servL B-[Label]-L servB
|
|
||||||
servR T-[Label]-R servT
|
|
||||||
servR B-[Label]-R servB
|
|
||||||
`
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should render an architecture diagram with simple junction edges', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`architecture-beta
|
|
||||||
service left_disk(disk)[Disk]
|
|
||||||
service top_disk(disk)[Disk]
|
|
||||||
service bottom_disk(disk)[Disk]
|
|
||||||
service top_gateway(internet)[Gateway]
|
|
||||||
service bottom_gateway(internet)[Gateway]
|
|
||||||
junction juncC
|
|
||||||
junction juncR
|
|
||||||
|
|
||||||
left_disk R--L juncC
|
|
||||||
top_disk B--T juncC
|
|
||||||
bottom_disk T--B juncC
|
|
||||||
juncC R--L juncR
|
|
||||||
top_gateway B--T juncR
|
|
||||||
bottom_gateway T--B juncR
|
|
||||||
`
|
|
||||||
);
|
|
||||||
});
|
|
||||||
it('should render an architecture diagram with complex junction edges', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`architecture-beta
|
|
||||||
group left
|
|
||||||
group right
|
|
||||||
service left_disk(disk)[Disk] in left
|
|
||||||
service top_disk(disk)[Disk] in left
|
|
||||||
service bottom_disk(disk)[Disk] in left
|
|
||||||
service top_gateway(internet)[Gateway] in right
|
|
||||||
service bottom_gateway(internet)[Gateway] in right
|
|
||||||
junction juncC in left
|
|
||||||
junction juncR in right
|
|
||||||
|
|
||||||
left_disk R--L juncC
|
|
||||||
top_disk B--T juncC
|
|
||||||
bottom_disk T--B juncC
|
|
||||||
|
|
||||||
|
|
||||||
top_gateway (B--T juncR
|
|
||||||
bottom_gateway (T--B juncR
|
|
||||||
|
|
||||||
juncC{group} R--L) juncR{group}
|
|
||||||
`
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render an architecture diagram with a reasonable height', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`architecture-beta
|
|
||||||
group federated(cloud)[Federated Environment]
|
|
||||||
service server1(server)[System] in federated
|
|
||||||
service edge(server)[Edge Device] in federated
|
|
||||||
server1:R -- L:edge
|
|
||||||
|
|
||||||
group on_prem(cloud)[Hub]
|
|
||||||
service firewall(server)[Firewall Device] in on_prem
|
|
||||||
service server(server)[Server] in on_prem
|
|
||||||
firewall:R -- L:server
|
|
||||||
|
|
||||||
service db1(database)[db1] in on_prem
|
|
||||||
service db2(database)[db2] in on_prem
|
|
||||||
service db3(database)[db3] in on_prem
|
|
||||||
service db4(database)[db4] in on_prem
|
|
||||||
service db5(database)[db5] in on_prem
|
|
||||||
service db6(database)[db6] in on_prem
|
|
||||||
|
|
||||||
junction mid in on_prem
|
|
||||||
server:B -- T:mid
|
|
||||||
|
|
||||||
junction 1Leftofmid in on_prem
|
|
||||||
1Leftofmid:R -- L:mid
|
|
||||||
1Leftofmid:B -- T:db1
|
|
||||||
|
|
||||||
junction 2Leftofmid in on_prem
|
|
||||||
2Leftofmid:R -- L:1Leftofmid
|
|
||||||
2Leftofmid:B -- T:db2
|
|
||||||
|
|
||||||
junction 3Leftofmid in on_prem
|
|
||||||
3Leftofmid:R -- L:2Leftofmid
|
|
||||||
3Leftofmid:B -- T:db3
|
|
||||||
|
|
||||||
junction 1RightOfMid in on_prem
|
|
||||||
mid:R -- L:1RightOfMid
|
|
||||||
1RightOfMid:B -- T:db4
|
|
||||||
|
|
||||||
junction 2RightOfMid in on_prem
|
|
||||||
1RightOfMid:R -- L:2RightOfMid
|
|
||||||
2RightOfMid:B -- T:db5
|
|
||||||
|
|
||||||
junction 3RightOfMid in on_prem
|
|
||||||
2RightOfMid:R -- L:3RightOfMid
|
|
||||||
3RightOfMid:B -- T:db6
|
|
||||||
|
|
||||||
edge:R -- L:firewall
|
|
||||||
`
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// Skipped as the layout is not deterministic, and causes issues in E2E tests.
|
|
||||||
describe.skip('architecture - external', () => {
|
|
||||||
it('should allow adding external icons', () => {
|
|
||||||
urlSnapshotTest('http://localhost:9000/architecture-external.html');
|
|
||||||
});
|
|
||||||
});
|
|
@@ -14,7 +14,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL2: should handle columns statement in sub-blocks', () => {
|
it('BL2: should handle colums statement in sub-blocks', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
id1["Hello"]
|
id1["Hello"]
|
||||||
@@ -30,7 +30,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL3: should align block widths and handle columns statement in sub-blocks', () => {
|
it('BL3: should align block widths and handle colums statement in sub-blocks', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
block
|
block
|
||||||
@@ -46,7 +46,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL4: should align block widths and handle columns statements in deeper sub-blocks then 1 level', () => {
|
it('BL4: should align block widths and handle colums statements in deeper sub-blocks then 1 level', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
columns 1
|
columns 1
|
||||||
@@ -66,7 +66,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL5: should align block widths and handle columns statements in deeper sub-blocks then 1 level (alt)', () => {
|
it('BL5: should align block widths and handle colums statements in deeper sub-blocks then 1 level (alt)', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
columns 1
|
columns 1
|
||||||
@@ -236,7 +236,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL17: width alignment - blocks should be equal in width', () => {
|
it('BL16: width alignment - blocks shold be equal in width', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
A("This is the text")
|
A("This is the text")
|
||||||
@@ -247,7 +247,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL18: block types 1 - square, rounded and circle', () => {
|
it('BL17: block types 1 - square, rounded and circle', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
A["square"]
|
A["square"]
|
||||||
@@ -258,7 +258,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL19: block types 2 - odd, diamond and hexagon', () => {
|
it('BL18: block types 2 - odd, diamond and hexagon', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
A>"rect_left_inv_arrow"]
|
A>"rect_left_inv_arrow"]
|
||||||
@@ -269,7 +269,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL20: block types 3 - stadium', () => {
|
it('BL19: block types 3 - stadium', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
A(["stadium"])
|
A(["stadium"])
|
||||||
@@ -278,7 +278,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL21: block types 4 - lean right, lean left, trapezoid and inv trapezoid', () => {
|
it('BL20: block types 4 - lean right, lean left, trapezoid and inv trapezoid', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
A[/"lean right"/]
|
A[/"lean right"/]
|
||||||
@@ -290,7 +290,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL22: block types 1 - square, rounded and circle', () => {
|
it('BL21: block types 1 - square, rounded and circle', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
A["square"]
|
A["square"]
|
||||||
@@ -301,7 +301,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL23: sizing - it should be possible to make a block wider', () => {
|
it('BL22: sizing - it should be possible to make a block wider', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
A("rounded"):2
|
A("rounded"):2
|
||||||
@@ -312,7 +312,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL24: sizing - it should be possible to make a composite block wider', () => {
|
it('BL23: sizing - it should be possible to make a composite block wider', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
block:2
|
block:2
|
||||||
@@ -324,7 +324,7 @@ describe('Block diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('BL25: block in the middle with space on each side', () => {
|
it('BL24: block in the middle with space on each side', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
columns 3
|
columns 3
|
||||||
@@ -335,7 +335,7 @@ describe('Block diagram', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('BL26: space and an edge', () => {
|
it('BL25: space and an edge', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
columns 5
|
columns 5
|
||||||
@@ -345,7 +345,7 @@ describe('Block diagram', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('BL27: block sizes for regular blocks', () => {
|
it('BL26: block sizes for regular blocks', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
columns 3
|
columns 3
|
||||||
@@ -354,7 +354,7 @@ describe('Block diagram', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('BL28: composite block with a set width - f should use the available space', () => {
|
it('BL27: composite block with a set width - f should use the available space', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
columns 3
|
columns 3
|
||||||
@@ -363,12 +363,11 @@ describe('Block diagram', () => {
|
|||||||
f
|
f
|
||||||
end
|
end
|
||||||
g
|
g
|
||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
it('BL23: composite block with a set width - f and g should split the available space', () => {
|
||||||
it('BL29: composite block with a set width - f and g should split the available space', () => {
|
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`block-beta
|
`block-beta
|
||||||
columns 3
|
columns 3
|
||||||
@@ -380,7 +379,7 @@ describe('Block diagram', () => {
|
|||||||
h
|
h
|
||||||
i
|
i
|
||||||
j
|
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');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -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(
|
||||||
[
|
[
|
||||||
`
|
`
|
||||||
@@ -581,63 +581,4 @@ class C13["With Città foreign language"]
|
|||||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('renders a class diagram with a generic class in a namespace', () => {
|
|
||||||
const diagramDefinition = `
|
|
||||||
classDiagram-v2
|
|
||||||
namespace Company.Project.Module {
|
|
||||||
class GenericClass~T~ {
|
|
||||||
+addItem(item: T)
|
|
||||||
+getItem() T
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
imgSnapshotTest(diagramDefinition);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('renders a class diagram with nested namespaces and relationships', () => {
|
|
||||||
const diagramDefinition = `
|
|
||||||
classDiagram-v2
|
|
||||||
namespace Company.Project.Module.SubModule {
|
|
||||||
class Report {
|
|
||||||
+generatePDF(data: List)
|
|
||||||
+generateCSV(data: List)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
namespace Company.Project.Module {
|
|
||||||
class Admin {
|
|
||||||
+generateReport()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Admin --> Report : generates
|
|
||||||
`;
|
|
||||||
|
|
||||||
imgSnapshotTest(diagramDefinition);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('renders a class diagram with multiple classes and relationships in a namespace', () => {
|
|
||||||
const diagramDefinition = `
|
|
||||||
classDiagram-v2
|
|
||||||
namespace Company.Project.Module {
|
|
||||||
class User {
|
|
||||||
+login(username: String, password: String)
|
|
||||||
+logout()
|
|
||||||
}
|
|
||||||
class Admin {
|
|
||||||
+addUser(user: User)
|
|
||||||
+removeUser(user: User)
|
|
||||||
+generateReport()
|
|
||||||
}
|
|
||||||
class Report {
|
|
||||||
+generatePDF(reportData: List)
|
|
||||||
+generateCSV(reportData: List)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Admin --> User : manages
|
|
||||||
Admin --> Report : generates
|
|
||||||
`;
|
|
||||||
|
|
||||||
imgSnapshotTest(diagramDefinition);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -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', () => {
|
||||||
@@ -429,7 +447,7 @@ describe('Class diagram', () => {
|
|||||||
classDiagram
|
classDiagram
|
||||||
class \`This\nTitle\nHas\nMany\nNewlines\` {
|
class \`This\nTitle\nHas\nMany\nNewlines\` {
|
||||||
+String Also
|
+String Also
|
||||||
-String Many
|
-Stirng Many
|
||||||
#int Members
|
#int Members
|
||||||
+And()
|
+And()
|
||||||
-Many()
|
-Many()
|
||||||
@@ -443,7 +461,7 @@ describe('Class diagram', () => {
|
|||||||
classDiagram
|
classDiagram
|
||||||
class \`This\nTitle\nHas\nMany\nNewlines\` {
|
class \`This\nTitle\nHas\nMany\nNewlines\` {
|
||||||
+String Also
|
+String Also
|
||||||
-String Many
|
-Stirng Many
|
||||||
#int Members
|
#int Members
|
||||||
+And()
|
+And()
|
||||||
-Many()
|
-Many()
|
||||||
@@ -459,7 +477,7 @@ describe('Class diagram', () => {
|
|||||||
namespace testingNamespace {
|
namespace testingNamespace {
|
||||||
class \`This\nTitle\nHas\nMany\nNewlines\` {
|
class \`This\nTitle\nHas\nMany\nNewlines\` {
|
||||||
+String Also
|
+String Also
|
||||||
-String Many
|
-Stirng Many
|
||||||
#int Members
|
#int Members
|
||||||
+And()
|
+And()
|
||||||
-Many()
|
-Many()
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user