From 82ac6675357276d249f45b1b6e691285ed03c5d6 Mon Sep 17 00:00:00 2001 From: Per Brolin Date: Mon, 14 Nov 2022 10:03:24 +0100 Subject: [PATCH 001/309] Service functions added --- packages/mermaid/src/diagrams/pie/amonts.csv | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 packages/mermaid/src/diagrams/pie/amonts.csv diff --git a/packages/mermaid/src/diagrams/pie/amonts.csv b/packages/mermaid/src/diagrams/pie/amonts.csv new file mode 100644 index 000000000..25cf919dd --- /dev/null +++ b/packages/mermaid/src/diagrams/pie/amonts.csv @@ -0,0 +1,10 @@ +name,amounts +Foo, 33 +Rishab, 12 +Alexis, 41 +Tom, 16 +Courtney, 59 +Christina, 38 +Jack, 21 +Mickey, 25 +Paul, 30 From 02903be558dcc99cc006a223fc1987e5554b1933 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 14:28:28 +0530 Subject: [PATCH 002/309] feat: Split C4 & Flow --- .../mermaid/src/diagram-api/detectType.ts | 5 ++ .../src/diagram-api/diagram-orchestration.ts | 80 ++----------------- .../mermaid/src/diagrams/c4/c4Detector.ts | 19 ++++- packages/mermaid/src/diagrams/c4/c4Diagram.ts | 16 ++++ .../diagrams/flowchart/flowDetector copy.ts | 24 ++++++ .../src/diagrams/flowchart/flowDetector-v2.ts | 18 ++++- .../src/diagrams/flowchart/flowDetector.ts | 18 ++++- .../src/diagrams/flowchart/flowDiagram-v2.ts | 25 ++++++ .../src/diagrams/flowchart/flowDiagram.ts | 24 ++++++ 9 files changed, 153 insertions(+), 76 deletions(-) create mode 100644 packages/mermaid/src/diagrams/c4/c4Diagram.ts create mode 100644 packages/mermaid/src/diagrams/flowchart/flowDetector copy.ts create mode 100644 packages/mermaid/src/diagrams/flowchart/flowDiagram-v2.ts create mode 100644 packages/mermaid/src/diagrams/flowchart/flowDiagram.ts diff --git a/packages/mermaid/src/diagram-api/detectType.ts b/packages/mermaid/src/diagram-api/detectType.ts index 9536fded2..1ea4f2b4d 100644 --- a/packages/mermaid/src/diagram-api/detectType.ts +++ b/packages/mermaid/src/diagram-api/detectType.ts @@ -1,6 +1,7 @@ import { MermaidConfig } from '../config.type'; import { log } from '../logger'; import { DetectorRecord, DiagramDetector, DiagramLoader } from './types'; +import { ExternalDiagramDefinition } from '../diagram-api/types'; const directive = /[%]{2}[{]\s*(?:(?:(\w+)\s*:|(\w+))\s*(?:(?:(\w+))|((?:(?![}][%]{2}).|\r?\n)*))?\s*)(?:[}][%]{2})?/gi; @@ -43,6 +44,10 @@ export const detectType = function (text: string, config?: MermaidConfig): strin throw new Error(`No diagram type detected for text: ${text}`); }; +export const addDiagram = ({ id, detector, loader }: ExternalDiagramDefinition) => { + addDetector(id, detector, loader); +}; + export const addDetector = (key: string, detector: DiagramDetector, loader?: DiagramLoader) => { if (detectors[key]) { throw new Error(`Detector with key ${key} already exists`); diff --git a/packages/mermaid/src/diagram-api/diagram-orchestration.ts b/packages/mermaid/src/diagram-api/diagram-orchestration.ts index a26edb303..88dfcffeb 100644 --- a/packages/mermaid/src/diagram-api/diagram-orchestration.ts +++ b/packages/mermaid/src/diagram-api/diagram-orchestration.ts @@ -1,4 +1,7 @@ import { registerDiagram } from './diagramAPI'; +import c4 from '../diagrams/c4/c4Detector'; +import flowchart from '../diagrams/flowchart/flowDetector'; +import flowchartV2 from '../diagrams/flowchart/flowDetector-v2'; // @ts-ignore: TODO Fix ts errors import gitGraphParser from '../diagrams/git/parser/gitGraph'; @@ -7,13 +10,6 @@ import gitGraphDb from '../diagrams/git/gitGraphAst'; import gitGraphRenderer from '../diagrams/git/gitGraphRenderer'; import gitGraphStyles from '../diagrams/git/styles'; -// @ts-ignore: TODO Fix ts errors -import c4Parser from '../diagrams/c4/parser/c4Diagram'; -import { c4Detector } from '../diagrams/c4/c4Detector'; -import c4Db from '../diagrams/c4/c4Db'; -import c4Renderer from '../diagrams/c4/c4Renderer'; -import c4Styles from '../diagrams/c4/styles'; - // @ts-ignore: TODO Fix ts errors import classParser from '../diagrams/class/parser/classDiagram'; import { classDetector } from '../diagrams/class/classDetector'; @@ -30,15 +26,6 @@ import erDb from '../diagrams/er/erDb'; import erRenderer from '../diagrams/er/erRenderer'; import erStyles from '../diagrams/er/styles'; -// @ts-ignore: TODO Fix ts errors -import flowParser from '../diagrams/flowchart/parser/flow'; -import { flowDetector } from '../diagrams/flowchart/flowDetector'; -import { flowDetectorV2 } from '../diagrams/flowchart/flowDetector-v2'; -import flowDb from '../diagrams/flowchart/flowDb'; -import flowRenderer from '../diagrams/flowchart/flowRenderer'; -import flowRendererV2 from '../diagrams/flowchart/flowRenderer-v2'; -import flowStyles from '../diagrams/flowchart/styles'; - // @ts-ignore: TODO Fix ts errors import ganttParser from '../diagrams/gantt/parser/gantt'; import { ganttDetector } from '../diagrams/gantt/ganttDetector'; @@ -89,10 +76,10 @@ import { journeyDetector } from '../diagrams/user-journey/journeyDetector'; import journeyDb from '../diagrams/user-journey/journeyDb'; import journeyRenderer from '../diagrams/user-journey/journeyRenderer'; import journeyStyles from '../diagrams/user-journey/styles'; -import { setConfig } from '../config'; import errorRenderer from '../diagrams/error/errorRenderer'; import errorStyles from '../diagrams/error/styles'; +import { addDiagram } from './detectType'; let hasLoadedDiagrams = false; export const addDiagrams = () => { @@ -125,20 +112,7 @@ export const addDiagrams = () => { }, (text) => text.toLowerCase().trim() === 'error' ); - - registerDiagram( - 'c4', - { - parser: c4Parser, - db: c4Db, - renderer: c4Renderer, - styles: c4Styles, - init: (cnf) => { - c4Renderer.setConf(cnf.c4); - }, - }, - c4Detector - ); + addDiagram(c4); registerDiagram( 'class', { @@ -295,47 +269,9 @@ export const addDiagrams = () => { journeyDetector ); - registerDiagram( - 'flowchart', - { - parser: flowParser, - db: flowDb, - renderer: flowRendererV2, - styles: flowStyles, - init: (cnf) => { - if (!cnf.flowchart) { - cnf.flowchart = {}; - } - // TODO, broken as of 2022-09-14 (13809b50251845475e6dca65cc395761be38fbd2) - cnf.flowchart.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; - flowRenderer.setConf(cnf.flowchart); - flowDb.clear(); - flowDb.setGen('gen-1'); - }, - }, - flowDetector - ); - registerDiagram( - 'flowchart-v2', - { - parser: flowParser, - db: flowDb, - renderer: flowRendererV2, - styles: flowStyles, - init: (cnf) => { - if (!cnf.flowchart) { - cnf.flowchart = {}; - } - cnf.flowchart.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; - // flowchart-v2 uses dagre-wrapper, which doesn't have access to flowchart cnf - setConfig({ flowchart: { arrowMarkerAbsolute: cnf.arrowMarkerAbsolute } }); - flowRendererV2.setConf(cnf.flowchart); - flowDb.clear(); - flowDb.setGen('gen-2'); - }, - }, - flowDetectorV2 - ); + addDiagram(flowchart); + addDiagram(flowchartV2); + registerDiagram( 'gitGraph', { parser: gitGraphParser, db: gitGraphDb, renderer: gitGraphRenderer, styles: gitGraphStyles }, diff --git a/packages/mermaid/src/diagrams/c4/c4Detector.ts b/packages/mermaid/src/diagrams/c4/c4Detector.ts index 49ba95b8e..08b8bbf55 100644 --- a/packages/mermaid/src/diagrams/c4/c4Detector.ts +++ b/packages/mermaid/src/diagrams/c4/c4Detector.ts @@ -1,5 +1,20 @@ -import type { DiagramDetector } from '../../diagram-api/types'; +import type { ExternalDiagramDefinition } from '../../diagram-api/types'; -export const c4Detector: DiagramDetector = (txt) => { +const id = 'c4'; + +const detector = (txt: string) => { return txt.match(/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/) !== null; }; + +const loader = async () => { + const { diagram } = await import('./c4Diagram'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/c4/c4Diagram.ts b/packages/mermaid/src/diagrams/c4/c4Diagram.ts new file mode 100644 index 000000000..d51be7160 --- /dev/null +++ b/packages/mermaid/src/diagrams/c4/c4Diagram.ts @@ -0,0 +1,16 @@ +// @ts-ignore: TODO Fix ts errors +import c4Parser from './parser/c4Diagram'; +import c4Db from './c4Db'; +import c4Renderer from './c4Renderer'; +import c4Styles from './styles'; +import { MermaidConfig } from '../../config.type'; + +export const diagram = { + parser: c4Parser, + db: c4Db, + renderer: c4Renderer, + styles: c4Styles, + init: (cnf: MermaidConfig) => { + c4Renderer.setConf(cnf.c4); + }, +}; diff --git a/packages/mermaid/src/diagrams/flowchart/flowDetector copy.ts b/packages/mermaid/src/diagrams/flowchart/flowDetector copy.ts new file mode 100644 index 000000000..3d09f36ae --- /dev/null +++ b/packages/mermaid/src/diagrams/flowchart/flowDetector copy.ts @@ -0,0 +1,24 @@ +import type { DiagramDetector } from '../../diagram-api/types'; +import type { ExternalDiagramDefinition } from '../../diagram-api/types'; + +const id = 'flowchart'; + +const detector: DiagramDetector = (txt, config) => { + // If we have confired to only use new flow charts this function shohuld always return false + // as in not signalling true for a legacy flowchart + if (config?.flowchart?.defaultRenderer === 'dagre-wrapper') return false; + return txt.match(/^\s*graph/) !== null; +}; + +const loader = async () => { + const { diagram } = await import('./flowDiagram'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/flowchart/flowDetector-v2.ts b/packages/mermaid/src/diagrams/flowchart/flowDetector-v2.ts index c2ec736c7..565cd2104 100644 --- a/packages/mermaid/src/diagrams/flowchart/flowDetector-v2.ts +++ b/packages/mermaid/src/diagrams/flowchart/flowDetector-v2.ts @@ -1,8 +1,24 @@ import type { DiagramDetector } from '../../diagram-api/types'; +import type { ExternalDiagramDefinition } from '../../diagram-api/types'; -export const flowDetectorV2: DiagramDetector = (txt, config) => { +const id = 'flowchart-v2'; + +const detector: DiagramDetector = (txt, config) => { // If we have confgured to use dagre-wrapper then we should return true in this function for graph code thus making it use the new flowchart diagram if (config?.flowchart?.defaultRenderer === 'dagre-wrapper' && txt.match(/^\s*graph/) !== null) return true; return txt.match(/^\s*flowchart/) !== null; }; + +const loader = async () => { + const { diagram } = await import('./flowDiagram-v2'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/flowchart/flowDetector.ts b/packages/mermaid/src/diagrams/flowchart/flowDetector.ts index 740d12847..3d09f36ae 100644 --- a/packages/mermaid/src/diagrams/flowchart/flowDetector.ts +++ b/packages/mermaid/src/diagrams/flowchart/flowDetector.ts @@ -1,8 +1,24 @@ import type { DiagramDetector } from '../../diagram-api/types'; +import type { ExternalDiagramDefinition } from '../../diagram-api/types'; -export const flowDetector: DiagramDetector = (txt, config) => { +const id = 'flowchart'; + +const detector: DiagramDetector = (txt, config) => { // If we have confired to only use new flow charts this function shohuld always return false // as in not signalling true for a legacy flowchart if (config?.flowchart?.defaultRenderer === 'dagre-wrapper') return false; return txt.match(/^\s*graph/) !== null; }; + +const loader = async () => { + const { diagram } = await import('./flowDiagram'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/flowchart/flowDiagram-v2.ts b/packages/mermaid/src/diagrams/flowchart/flowDiagram-v2.ts new file mode 100644 index 000000000..8cd49de65 --- /dev/null +++ b/packages/mermaid/src/diagrams/flowchart/flowDiagram-v2.ts @@ -0,0 +1,25 @@ +// @ts-ignore: TODO Fix ts errors +import flowParser from './parser/flow'; +import flowDb from './flowDb'; +import flowRendererV2 from './flowRenderer-v2'; +import flowStyles from './styles'; +import { MermaidConfig } from '../../config.type'; +import { setConfig } from '../../config'; + +export const diagram = { + parser: flowParser, + db: flowDb, + renderer: flowRendererV2, + styles: flowStyles, + init: (cnf: MermaidConfig) => { + if (!cnf.flowchart) { + cnf.flowchart = {}; + } + cnf.flowchart.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; + // flowchart-v2 uses dagre-wrapper, which doesn't have access to flowchart cnf + setConfig({ flowchart: { arrowMarkerAbsolute: cnf.arrowMarkerAbsolute } }); + flowRendererV2.setConf(cnf.flowchart); + flowDb.clear(); + flowDb.setGen('gen-2'); + }, +}; diff --git a/packages/mermaid/src/diagrams/flowchart/flowDiagram.ts b/packages/mermaid/src/diagrams/flowchart/flowDiagram.ts new file mode 100644 index 000000000..d68a7c01d --- /dev/null +++ b/packages/mermaid/src/diagrams/flowchart/flowDiagram.ts @@ -0,0 +1,24 @@ +// @ts-ignore: TODO Fix ts errors +import flowParser from './parser/flow'; +import flowDb from './flowDb'; +import flowRenderer from './flowRenderer'; +import flowRendererV2 from './flowRenderer-v2'; +import flowStyles from './styles'; +import { MermaidConfig } from '../../config.type'; + +export const diagram = { + parser: flowParser, + db: flowDb, + renderer: flowRendererV2, + styles: flowStyles, + init: (cnf: MermaidConfig) => { + if (!cnf.flowchart) { + cnf.flowchart = {}; + } + // TODO, broken as of 2022-09-14 (13809b50251845475e6dca65cc395761be38fbd2) + cnf.flowchart.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; + flowRenderer.setConf(cnf.flowchart); + flowDb.clear(); + flowDb.setGen('gen-1'); + }, +}; From 5dec9eb2f54dcccd1df96766b6575c8a34080a93 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 16:09:10 +0530 Subject: [PATCH 003/309] fix: C4 type --- packages/mermaid/src/diagrams/c4/c4Diagram.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/mermaid/src/diagrams/c4/c4Diagram.ts b/packages/mermaid/src/diagrams/c4/c4Diagram.ts index d51be7160..6f8f25db2 100644 --- a/packages/mermaid/src/diagrams/c4/c4Diagram.ts +++ b/packages/mermaid/src/diagrams/c4/c4Diagram.ts @@ -4,8 +4,9 @@ import c4Db from './c4Db'; import c4Renderer from './c4Renderer'; import c4Styles from './styles'; import { MermaidConfig } from '../../config.type'; +import { DiagramDefinition } from '../../diagram-api/types'; -export const diagram = { +export const diagram: DiagramDefinition = { parser: c4Parser, db: c4Db, renderer: c4Renderer, From 4492c5ed4e29e3ef05d2f938cbebc7c884f8b4d4 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 16:09:36 +0530 Subject: [PATCH 004/309] chore(split): classDiagram --- .../src/diagrams/class/classDetector-V2.ts | 19 ++++++++++++++++-- .../src/diagrams/class/classDetector.ts | 19 ++++++++++++++++-- .../src/diagrams/class/classDiagram-v2.ts | 20 +++++++++++++++++++ .../src/diagrams/class/classDiagram.ts | 20 +++++++++++++++++++ 4 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 packages/mermaid/src/diagrams/class/classDiagram-v2.ts create mode 100644 packages/mermaid/src/diagrams/class/classDiagram.ts diff --git a/packages/mermaid/src/diagrams/class/classDetector-V2.ts b/packages/mermaid/src/diagrams/class/classDetector-V2.ts index d65caf9a8..51b93fb0d 100644 --- a/packages/mermaid/src/diagrams/class/classDetector-V2.ts +++ b/packages/mermaid/src/diagrams/class/classDetector-V2.ts @@ -1,9 +1,24 @@ -import type { DiagramDetector } from '../../diagram-api/types'; +import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-api/types'; -export const classDetectorV2: DiagramDetector = (txt, config) => { +const id = 'classDiagram'; + +const detector: DiagramDetector = (txt, config) => { // If we have confgured to use dagre-wrapper then we should return true in this function for classDiagram code thus making it use the new class diagram if (txt.match(/^\s*classDiagram/) !== null && config?.class?.defaultRenderer === 'dagre-wrapper') return true; // We have not opted to use the new renderer so we should return true if we detect a class diagram return txt.match(/^\s*classDiagram-v2/) !== null; }; + +const loader = async () => { + const { diagram } = await import('./classDiagram-v2'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/class/classDetector.ts b/packages/mermaid/src/diagrams/class/classDetector.ts index ef6389a60..dc2f4261f 100644 --- a/packages/mermaid/src/diagrams/class/classDetector.ts +++ b/packages/mermaid/src/diagrams/class/classDetector.ts @@ -1,8 +1,23 @@ -import type { DiagramDetector } from '../../diagram-api/types'; +import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-api/types'; -export const classDetector: DiagramDetector = (txt, config) => { +const id = 'class'; + +const detector: DiagramDetector = (txt, config) => { // If we have confgured to use dagre-wrapper then we should never return true in this function if (config?.class?.defaultRenderer === 'dagre-wrapper') return false; // We have not opted to use the new renderer so we should return true if we detect a class diagram return txt.match(/^\s*classDiagram/) !== null; }; + +const loader = async () => { + const { diagram } = await import('./classDiagram'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/class/classDiagram-v2.ts b/packages/mermaid/src/diagrams/class/classDiagram-v2.ts new file mode 100644 index 000000000..2f0bbf371 --- /dev/null +++ b/packages/mermaid/src/diagrams/class/classDiagram-v2.ts @@ -0,0 +1,20 @@ +import { DiagramDefinition } from '../../diagram-api/types'; +// @ts-ignore: TODO Fix ts errors +import parser from './parser/classDiagram'; +import db from './classDb'; +import styles from './styles'; +import renderer from './classRenderer-v2'; + +export const diagram: DiagramDefinition = { + parser, + db, + renderer, + styles, + init: (cnf) => { + if (!cnf.class) { + cnf.class = {}; + } + cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; + db.clear(); + }, +}; diff --git a/packages/mermaid/src/diagrams/class/classDiagram.ts b/packages/mermaid/src/diagrams/class/classDiagram.ts new file mode 100644 index 000000000..250d04176 --- /dev/null +++ b/packages/mermaid/src/diagrams/class/classDiagram.ts @@ -0,0 +1,20 @@ +import { DiagramDefinition } from '../../diagram-api/types'; +// @ts-ignore: TODO Fix ts errors +import parser from './parser/classDiagram'; +import db from './classDb'; +import styles from './styles'; +import renderer from './classRenderer'; + +export const diagram: DiagramDefinition = { + parser, + db, + renderer, + styles, + init: (cnf) => { + if (!cnf.class) { + cnf.class = {}; + } + cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; + db.clear(); + }, +}; From 43aa831dd292351176419793bde47a1a2c6de234 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 16:09:45 +0530 Subject: [PATCH 005/309] chore(split): ER --- .../mermaid/src/diagrams/er/erDetector.ts | 19 +++++++++++++++++-- packages/mermaid/src/diagrams/er/erDiagram.ts | 12 ++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 packages/mermaid/src/diagrams/er/erDiagram.ts diff --git a/packages/mermaid/src/diagrams/er/erDetector.ts b/packages/mermaid/src/diagrams/er/erDetector.ts index 5a87a949e..f73baa434 100644 --- a/packages/mermaid/src/diagrams/er/erDetector.ts +++ b/packages/mermaid/src/diagrams/er/erDetector.ts @@ -1,5 +1,20 @@ -import type { DiagramDetector } from '../../diagram-api/types'; +import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-api/types'; -export const erDetector: DiagramDetector = (txt) => { +const id = 'er'; + +const detector: DiagramDetector = (txt) => { return txt.match(/^\s*erDiagram/) !== null; }; + +const loader = async () => { + const { diagram } = await import('./erDiagram'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/er/erDiagram.ts b/packages/mermaid/src/diagrams/er/erDiagram.ts new file mode 100644 index 000000000..a5b0da9c1 --- /dev/null +++ b/packages/mermaid/src/diagrams/er/erDiagram.ts @@ -0,0 +1,12 @@ +// @ts-ignore: TODO Fix ts errors +import erParser from './parser/erDiagram'; +import erDb from './erDb'; +import erRenderer from './erRenderer'; +import erStyles from './styles'; + +export const diagram = { + parser: erParser, + db: erDb, + renderer: erRenderer, + styles: erStyles, +}; From 38e5c3a81ea3c54b365b500f17573b1bea5e18a2 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 16:09:56 +0530 Subject: [PATCH 006/309] chore(split): Gantt --- .../src/diagrams/gantt/ganttDetector.ts | 19 +++++++++++++++++-- .../src/diagrams/gantt/ganttDiagram.ts | 13 +++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 packages/mermaid/src/diagrams/gantt/ganttDiagram.ts diff --git a/packages/mermaid/src/diagrams/gantt/ganttDetector.ts b/packages/mermaid/src/diagrams/gantt/ganttDetector.ts index 5de167010..3fe2bbe7e 100644 --- a/packages/mermaid/src/diagrams/gantt/ganttDetector.ts +++ b/packages/mermaid/src/diagrams/gantt/ganttDetector.ts @@ -1,5 +1,20 @@ -import type { DiagramDetector } from '../../diagram-api/types'; +import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-api/types'; -export const ganttDetector: DiagramDetector = (txt) => { +const id = 'gantt'; + +const detector: DiagramDetector = (txt) => { return txt.match(/^\s*gantt/) !== null; }; + +const loader = async () => { + const { diagram } = await import('./ganttDiagram'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/gantt/ganttDiagram.ts b/packages/mermaid/src/diagrams/gantt/ganttDiagram.ts new file mode 100644 index 000000000..b1341052d --- /dev/null +++ b/packages/mermaid/src/diagrams/gantt/ganttDiagram.ts @@ -0,0 +1,13 @@ +// @ts-ignore: TODO Fix ts errors +import ganttParser from './parser/gantt'; +import ganttDb from './ganttDb'; +import ganttRenderer from './ganttRenderer'; +import ganttStyles from './styles'; +import { DiagramDefinition } from '../../diagram-api/types'; + +export const diagram: DiagramDefinition = { + parser: ganttParser, + db: ganttDb, + renderer: ganttRenderer, + styles: ganttStyles, +}; From 25bc381361a7d2e616bd7f4b8e535ec27c243e14 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 16:10:06 +0530 Subject: [PATCH 007/309] chore(split): gitGraph --- .../src/diagrams/git/gitGraphDetector.ts | 18 +++++++++++++++++- .../src/diagrams/git/gitGraphDiagram.ts | 13 +++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 packages/mermaid/src/diagrams/git/gitGraphDiagram.ts diff --git a/packages/mermaid/src/diagrams/git/gitGraphDetector.ts b/packages/mermaid/src/diagrams/git/gitGraphDetector.ts index f890501a5..46d09c6e5 100644 --- a/packages/mermaid/src/diagrams/git/gitGraphDetector.ts +++ b/packages/mermaid/src/diagrams/git/gitGraphDetector.ts @@ -1,5 +1,21 @@ import type { DiagramDetector } from '../../diagram-api/types'; +import type { ExternalDiagramDefinition } from '../../diagram-api/types'; -export const gitGraphDetector: DiagramDetector = (txt) => { +const id = 'gitGraph'; + +const detector: DiagramDetector = (txt) => { return txt.match(/^\s*gitGraph/) !== null; }; + +const loader = async () => { + const { diagram } = await import('./gitGraphDiagram'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/git/gitGraphDiagram.ts b/packages/mermaid/src/diagrams/git/gitGraphDiagram.ts new file mode 100644 index 000000000..9ef3506a0 --- /dev/null +++ b/packages/mermaid/src/diagrams/git/gitGraphDiagram.ts @@ -0,0 +1,13 @@ +// @ts-ignore: TODO Fix ts errors +import gitGraphParser from './parser/gitGraph'; +import gitGraphDb from './gitGraphAst'; +import gitGraphRenderer from './gitGraphRenderer'; +import gitGraphStyles from './styles'; +import { DiagramDefinition } from '../../diagram-api/types'; + +export const diagram: DiagramDefinition = { + parser: gitGraphParser, + db: gitGraphDb, + renderer: gitGraphRenderer, + styles: gitGraphStyles, +}; From f03364f3287f3a0185eca59bc53069592593d4cb Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 16:10:15 +0530 Subject: [PATCH 008/309] chore(split): Info --- .../mermaid/src/diagrams/info/infoDetector.ts | 19 +++++++++++++++++-- .../mermaid/src/diagrams/info/infoDiagram.ts | 13 +++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 packages/mermaid/src/diagrams/info/infoDiagram.ts diff --git a/packages/mermaid/src/diagrams/info/infoDetector.ts b/packages/mermaid/src/diagrams/info/infoDetector.ts index 8bccb578f..a022e3ccb 100644 --- a/packages/mermaid/src/diagrams/info/infoDetector.ts +++ b/packages/mermaid/src/diagrams/info/infoDetector.ts @@ -1,5 +1,20 @@ -import type { DiagramDetector } from '../../diagram-api/types'; +import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-api/types'; -export const infoDetector: DiagramDetector = (txt) => { +const id = 'info'; + +const detector: DiagramDetector = (txt) => { return txt.match(/^\s*info/) !== null; }; + +const loader = async () => { + const { diagram } = await import('./infoDiagram'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/info/infoDiagram.ts b/packages/mermaid/src/diagrams/info/infoDiagram.ts new file mode 100644 index 000000000..a8100a79f --- /dev/null +++ b/packages/mermaid/src/diagrams/info/infoDiagram.ts @@ -0,0 +1,13 @@ +import { DiagramDefinition } from '../../diagram-api/types'; +// @ts-ignore: TODO Fix ts errors +import parser from './parser/info'; +import db from './infoDb'; +import styles from './styles'; +import renderer from './infoRenderer'; + +export const diagram: DiagramDefinition = { + parser, + db, + renderer, + styles, +}; From e0cd76e6fd74491414319cd338756c8c8e9661d0 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 16:10:25 +0530 Subject: [PATCH 009/309] chore(split): Pie --- .../mermaid/src/diagrams/pie/pieDetector.ts | 19 +++++++++++++++++-- .../mermaid/src/diagrams/pie/pieDiagram.ts | 13 +++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 packages/mermaid/src/diagrams/pie/pieDiagram.ts diff --git a/packages/mermaid/src/diagrams/pie/pieDetector.ts b/packages/mermaid/src/diagrams/pie/pieDetector.ts index 65a011c7a..dd1224db9 100644 --- a/packages/mermaid/src/diagrams/pie/pieDetector.ts +++ b/packages/mermaid/src/diagrams/pie/pieDetector.ts @@ -1,5 +1,20 @@ -import type { DiagramDetector } from '../../diagram-api/types'; +import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-api/types'; -export const pieDetector: DiagramDetector = (txt) => { +const id = 'pie'; + +const detector: DiagramDetector = (txt) => { return txt.match(/^\s*pie/) !== null; }; + +const loader = async () => { + const { diagram } = await import('./pieDiagram'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/pie/pieDiagram.ts b/packages/mermaid/src/diagrams/pie/pieDiagram.ts new file mode 100644 index 000000000..3a586f668 --- /dev/null +++ b/packages/mermaid/src/diagrams/pie/pieDiagram.ts @@ -0,0 +1,13 @@ +import { DiagramDefinition } from '../../diagram-api/types'; +// @ts-ignore: TODO Fix ts errors +import parser from './parser/pie'; +import db from './pieDb'; +import styles from './styles'; +import renderer from './pieRenderer'; + +export const diagram: DiagramDefinition = { + parser, + db, + renderer, + styles, +}; From 6d5a6ad0c844fa5a9a4cfac1da5eb315c940d653 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 16:10:42 +0530 Subject: [PATCH 010/309] chore(split): Requirement --- .../requirement/requirementDetector.ts | 19 +++++++++++++++++-- .../requirement/requirementDiagram.ts | 13 +++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 packages/mermaid/src/diagrams/requirement/requirementDiagram.ts diff --git a/packages/mermaid/src/diagrams/requirement/requirementDetector.ts b/packages/mermaid/src/diagrams/requirement/requirementDetector.ts index 164da6c1a..1102fde0c 100644 --- a/packages/mermaid/src/diagrams/requirement/requirementDetector.ts +++ b/packages/mermaid/src/diagrams/requirement/requirementDetector.ts @@ -1,5 +1,20 @@ -import type { DiagramDetector } from '../../diagram-api/types'; +import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-api/types'; -export const requirementDetector: DiagramDetector = (txt) => { +const id = 'requirement'; + +const detector: DiagramDetector = (txt) => { return txt.match(/^\s*requirement(Diagram)?/) !== null; }; + +const loader = async () => { + const { diagram } = await import('./requirementDiagram'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/requirement/requirementDiagram.ts b/packages/mermaid/src/diagrams/requirement/requirementDiagram.ts new file mode 100644 index 000000000..37f6177b6 --- /dev/null +++ b/packages/mermaid/src/diagrams/requirement/requirementDiagram.ts @@ -0,0 +1,13 @@ +import { DiagramDefinition } from '../../diagram-api/types'; +// @ts-ignore: TODO Fix ts errors +import parser from './parser/requirementDiagram'; +import db from './requirementDb'; +import styles from './styles'; +import renderer from './requirementRenderer'; + +export const diagram: DiagramDefinition = { + parser, + db, + renderer, + styles, +}; From 4fd826ac8c73a659af31fd2acc630b07a2ff1f42 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 16:10:51 +0530 Subject: [PATCH 011/309] chore(split): Sequence --- .../src/diagrams/sequence/sequenceDetector.ts | 19 +++++++++++++++++-- .../src/diagrams/sequence/sequenceDiagram.ts | 13 +++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 packages/mermaid/src/diagrams/sequence/sequenceDiagram.ts diff --git a/packages/mermaid/src/diagrams/sequence/sequenceDetector.ts b/packages/mermaid/src/diagrams/sequence/sequenceDetector.ts index 52640b134..c436e65d4 100644 --- a/packages/mermaid/src/diagrams/sequence/sequenceDetector.ts +++ b/packages/mermaid/src/diagrams/sequence/sequenceDetector.ts @@ -1,5 +1,20 @@ -import type { DiagramDetector } from '../../diagram-api/types'; +import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-api/types'; -export const sequenceDetector: DiagramDetector = (txt) => { +const id = 'sequence'; + +const detector: DiagramDetector = (txt) => { return txt.match(/^\s*sequenceDiagram/) !== null; }; + +const loader = async () => { + const { diagram } = await import('./sequenceDiagram'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/sequence/sequenceDiagram.ts b/packages/mermaid/src/diagrams/sequence/sequenceDiagram.ts new file mode 100644 index 000000000..fdec7f86d --- /dev/null +++ b/packages/mermaid/src/diagrams/sequence/sequenceDiagram.ts @@ -0,0 +1,13 @@ +import { DiagramDefinition } from '../../diagram-api/types'; +// @ts-ignore: TODO Fix ts errors +import parser from './parser/sequenceDiagram'; +import db from './sequenceDb'; +import styles from './styles'; +import renderer from './sequenceRenderer'; + +export const diagram: DiagramDefinition = { + parser, + db, + renderer, + styles, +}; From 616c969a0397a5289e1f64be63b54120a5aafe4a Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 16:11:03 +0530 Subject: [PATCH 012/309] chore(split): Flow type --- packages/mermaid/src/diagrams/flowchart/flowDetector.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/mermaid/src/diagrams/flowchart/flowDetector.ts b/packages/mermaid/src/diagrams/flowchart/flowDetector.ts index 3d09f36ae..71e409331 100644 --- a/packages/mermaid/src/diagrams/flowchart/flowDetector.ts +++ b/packages/mermaid/src/diagrams/flowchart/flowDetector.ts @@ -1,10 +1,9 @@ -import type { DiagramDetector } from '../../diagram-api/types'; -import type { ExternalDiagramDefinition } from '../../diagram-api/types'; +import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-api/types'; const id = 'flowchart'; const detector: DiagramDetector = (txt, config) => { - // If we have confired to only use new flow charts this function shohuld always return false + // If we have confirmed to only use new flow charts this function should always return false // as in not signalling true for a legacy flowchart if (config?.flowchart?.defaultRenderer === 'dagre-wrapper') return false; return txt.match(/^\s*graph/) !== null; From 89b5eb56f24fbcd90052679abe3c80fb4a4aa5bd Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 16:11:19 +0530 Subject: [PATCH 013/309] chore(split): Orchestration --- .../src/diagram-api/diagram-orchestration.ts | 195 ++---------------- 1 file changed, 21 insertions(+), 174 deletions(-) diff --git a/packages/mermaid/src/diagram-api/diagram-orchestration.ts b/packages/mermaid/src/diagram-api/diagram-orchestration.ts index 88dfcffeb..69a01821a 100644 --- a/packages/mermaid/src/diagram-api/diagram-orchestration.ts +++ b/packages/mermaid/src/diagram-api/diagram-orchestration.ts @@ -2,64 +2,15 @@ import { registerDiagram } from './diagramAPI'; import c4 from '../diagrams/c4/c4Detector'; import flowchart from '../diagrams/flowchart/flowDetector'; import flowchartV2 from '../diagrams/flowchart/flowDetector-v2'; - -// @ts-ignore: TODO Fix ts errors -import gitGraphParser from '../diagrams/git/parser/gitGraph'; -import { gitGraphDetector } from '../diagrams/git/gitGraphDetector'; -import gitGraphDb from '../diagrams/git/gitGraphAst'; -import gitGraphRenderer from '../diagrams/git/gitGraphRenderer'; -import gitGraphStyles from '../diagrams/git/styles'; - -// @ts-ignore: TODO Fix ts errors -import classParser from '../diagrams/class/parser/classDiagram'; -import { classDetector } from '../diagrams/class/classDetector'; -import { classDetectorV2 } from '../diagrams/class/classDetector-V2'; -import classDb from '../diagrams/class/classDb'; -import classRenderer from '../diagrams/class/classRenderer'; -import classRendererV2 from '../diagrams/class/classRenderer-v2'; -import classStyles from '../diagrams/class/styles'; - -// @ts-ignore: TODO Fix ts errors -import erParser from '../diagrams/er/parser/erDiagram'; -import { erDetector } from '../diagrams/er/erDetector'; -import erDb from '../diagrams/er/erDb'; -import erRenderer from '../diagrams/er/erRenderer'; -import erStyles from '../diagrams/er/styles'; - -// @ts-ignore: TODO Fix ts errors -import ganttParser from '../diagrams/gantt/parser/gantt'; -import { ganttDetector } from '../diagrams/gantt/ganttDetector'; -import ganttDb from '../diagrams/gantt/ganttDb'; -import ganttRenderer from '../diagrams/gantt/ganttRenderer'; -import ganttStyles from '../diagrams/gantt/styles'; - -// @ts-ignore: TODO Fix ts errors -import infoParser from '../diagrams/info/parser/info'; -import infoDb from '../diagrams/info/infoDb'; -import infoRenderer from '../diagrams/info/infoRenderer'; -import { infoDetector } from '../diagrams/info/infoDetector'; -import infoStyles from '../diagrams/info/styles'; - -// @ts-ignore: TODO Fix ts errors -import pieParser from '../diagrams/pie/parser/pie'; -import { pieDetector } from '../diagrams/pie/pieDetector'; -import pieDb from '../diagrams/pie/pieDb'; -import pieRenderer from '../diagrams/pie/pieRenderer'; -import pieStyles from '../diagrams/pie/styles'; - -// @ts-ignore: TODO Fix ts errors -import requirementParser from '../diagrams/requirement/parser/requirementDiagram'; -import { requirementDetector } from '../diagrams/requirement/requirementDetector'; -import requirementDb from '../diagrams/requirement/requirementDb'; -import requirementRenderer from '../diagrams/requirement/requirementRenderer'; -import requirementStyles from '../diagrams/requirement/styles'; - -// @ts-ignore: TODO Fix ts errors -import sequenceParser from '../diagrams/sequence/parser/sequenceDiagram'; -import { sequenceDetector } from '../diagrams/sequence/sequenceDetector'; -import sequenceDb from '../diagrams/sequence/sequenceDb'; -import sequenceRenderer from '../diagrams/sequence/sequenceRenderer'; -import sequenceStyles from '../diagrams/sequence/styles'; +import er from '../diagrams/er/erDetector'; +import git from '../diagrams/git/gitGraphDetector'; +import gantt from '../diagrams/gantt/ganttDetector'; +import info from '../diagrams/info/infoDetector'; +import pie from '../diagrams/pie/pieDetector'; +import requirement from '../diagrams/requirement/requirementDetector'; +import sequence from '../diagrams/sequence/sequenceDetector'; +import classDiagram from '../diagrams/class/classDetector'; +import classDiagramV2 from '../diagrams/class/classDetector-V2'; // @ts-ignore: TODO Fix ts errors import stateParser from '../diagrams/state/parser/stateDiagram'; @@ -113,113 +64,18 @@ export const addDiagrams = () => { (text) => text.toLowerCase().trim() === 'error' ); addDiagram(c4); - registerDiagram( - 'class', - { - parser: classParser, - db: classDb, - renderer: classRenderer, - styles: classStyles, - init: (cnf) => { - if (!cnf.class) { - cnf.class = {}; - } - cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; - classDb.clear(); - }, - }, - classDetector - ); - registerDiagram( - 'classDiagram', - { - parser: classParser, - db: classDb, - renderer: classRendererV2, - styles: classStyles, - init: (cnf) => { - if (!cnf.class) { - cnf.class = {}; - } - cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; - classDb.clear(); - }, - }, - classDetectorV2 - ); - registerDiagram( - 'er', - { - parser: erParser, - db: erDb, - renderer: erRenderer, - styles: erStyles, - }, - erDetector - ); - registerDiagram( - 'gantt', - { - parser: ganttParser, - db: ganttDb, - renderer: ganttRenderer, - styles: ganttStyles, - }, - ganttDetector - ); - registerDiagram( - 'info', - { - parser: infoParser, - db: infoDb, - renderer: infoRenderer, - styles: infoStyles, - }, - infoDetector - ); - registerDiagram( - 'pie', - { - parser: pieParser, - db: pieDb, - renderer: pieRenderer, - styles: pieStyles, - }, - pieDetector - ); - registerDiagram( - 'requirement', - { - parser: requirementParser, - db: requirementDb, - renderer: requirementRenderer, - styles: requirementStyles, - }, - requirementDetector - ); - registerDiagram( - 'sequence', - { - parser: sequenceParser, - db: sequenceDb, - renderer: sequenceRenderer, - styles: sequenceStyles, - init: (cnf) => { - if (!cnf.sequence) { - cnf.sequence = {}; - } - cnf.sequence.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; - if ('sequenceDiagram' in cnf) { - throw new Error( - '`mermaid config.sequenceDiagram` has been renamed to `config.sequence`. Please update your mermaid config.' - ); - } - sequenceDb.setWrap(cnf.wrap); - sequenceRenderer.setConf(cnf.sequence); - }, - }, - sequenceDetector - ); + addDiagram(classDiagram); + addDiagram(classDiagramV2); + addDiagram(er); + addDiagram(gantt); + addDiagram(info); + addDiagram(pie); + addDiagram(requirement); + addDiagram(sequence); + addDiagram(flowchart); + addDiagram(flowchartV2); + addDiagram(git); + registerDiagram( 'state', { @@ -268,13 +124,4 @@ export const addDiagrams = () => { }, journeyDetector ); - - addDiagram(flowchart); - addDiagram(flowchartV2); - - registerDiagram( - 'gitGraph', - { parser: gitGraphParser, db: gitGraphDb, renderer: gitGraphRenderer, styles: gitGraphStyles }, - gitGraphDetector - ); }; From e5768454f1c3f5284ba3066e9df32ff9820f2373 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 16:19:38 +0530 Subject: [PATCH 014/309] chore(split): State Diagram --- .../src/diagram-api/diagram-orchestration.ts | 48 ++----------------- .../src/diagrams/state/stateDetector-V2.ts | 19 +++++++- .../src/diagrams/state/stateDetector.ts | 19 +++++++- .../src/diagrams/state/stateDiagram-v2.ts | 20 ++++++++ .../src/diagrams/state/stateDiagram.ts | 20 ++++++++ 5 files changed, 78 insertions(+), 48 deletions(-) create mode 100644 packages/mermaid/src/diagrams/state/stateDiagram-v2.ts create mode 100644 packages/mermaid/src/diagrams/state/stateDiagram.ts diff --git a/packages/mermaid/src/diagram-api/diagram-orchestration.ts b/packages/mermaid/src/diagram-api/diagram-orchestration.ts index 69a01821a..0f12a7ee7 100644 --- a/packages/mermaid/src/diagram-api/diagram-orchestration.ts +++ b/packages/mermaid/src/diagram-api/diagram-orchestration.ts @@ -11,15 +11,8 @@ import requirement from '../diagrams/requirement/requirementDetector'; import sequence from '../diagrams/sequence/sequenceDetector'; import classDiagram from '../diagrams/class/classDetector'; import classDiagramV2 from '../diagrams/class/classDetector-V2'; - -// @ts-ignore: TODO Fix ts errors -import stateParser from '../diagrams/state/parser/stateDiagram'; -import { stateDetector } from '../diagrams/state/stateDetector'; -import { stateDetectorV2 } from '../diagrams/state/stateDetector-V2'; -import stateDb from '../diagrams/state/stateDb'; -import stateRenderer from '../diagrams/state/stateRenderer'; -import stateRendererV2 from '../diagrams/state/stateRenderer-v2'; -import stateStyles from '../diagrams/state/styles'; +import state from '../diagrams/state/stateDetector'; +import stateV2 from '../diagrams/state/stateDetector-V2'; // @ts-ignore: TODO Fix ts errors import journeyParser from '../diagrams/user-journey/parser/journey'; @@ -75,41 +68,8 @@ export const addDiagrams = () => { addDiagram(flowchart); addDiagram(flowchartV2); addDiagram(git); - - registerDiagram( - 'state', - { - parser: stateParser, - db: stateDb, - renderer: stateRenderer, - styles: stateStyles, - init: (cnf) => { - if (!cnf.state) { - cnf.state = {}; - } - cnf.state.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; - stateDb.clear(); - }, - }, - stateDetector - ); - registerDiagram( - 'stateDiagram', - { - parser: stateParser, - db: stateDb, - renderer: stateRendererV2, - styles: stateStyles, - init: (cnf) => { - if (!cnf.state) { - cnf.state = {}; - } - cnf.state.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; - stateDb.clear(); - }, - }, - stateDetectorV2 - ); + addDiagram(state); + addDiagram(stateV2); registerDiagram( 'journey', { diff --git a/packages/mermaid/src/diagrams/state/stateDetector-V2.ts b/packages/mermaid/src/diagrams/state/stateDetector-V2.ts index 7fd9633c6..afc2e59fb 100644 --- a/packages/mermaid/src/diagrams/state/stateDetector-V2.ts +++ b/packages/mermaid/src/diagrams/state/stateDetector-V2.ts @@ -1,8 +1,23 @@ -import type { DiagramDetector } from '../../diagram-api/types'; +import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-api/types'; -export const stateDetectorV2: DiagramDetector = (text, config) => { +const id = 'stateDiagram'; + +const detector: DiagramDetector = (text, config) => { if (text.match(/^\s*stateDiagram-v2/) !== null) return true; if (text.match(/^\s*stateDiagram/) && config?.state?.defaultRenderer === 'dagre-wrapper') return true; return false; }; + +const loader = async () => { + const { diagram } = await import('./stateDiagram-v2'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/state/stateDetector.ts b/packages/mermaid/src/diagrams/state/stateDetector.ts index 614f327c2..89d6e45bf 100644 --- a/packages/mermaid/src/diagrams/state/stateDetector.ts +++ b/packages/mermaid/src/diagrams/state/stateDetector.ts @@ -1,8 +1,23 @@ -import type { DiagramDetector } from '../../diagram-api/types'; +import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-api/types'; -export const stateDetector: DiagramDetector = (txt, config) => { +const id = 'state'; + +const detector: DiagramDetector = (txt, config) => { // If we have confired to only use new state diagrams this function should always return false // as in not signalling true for a legacy state diagram if (config?.state?.defaultRenderer === 'dagre-wrapper') return false; return txt.match(/^\s*stateDiagram/) !== null; }; + +const loader = async () => { + const { diagram } = await import('./stateDiagram'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/state/stateDiagram-v2.ts b/packages/mermaid/src/diagrams/state/stateDiagram-v2.ts new file mode 100644 index 000000000..f7ee4f052 --- /dev/null +++ b/packages/mermaid/src/diagrams/state/stateDiagram-v2.ts @@ -0,0 +1,20 @@ +import { DiagramDefinition } from '../../diagram-api/types'; +// @ts-ignore: TODO Fix ts errors +import parser from './parser/stateDiagram'; +import db from './stateDb'; +import styles from './styles'; +import renderer from './stateRenderer-v2'; + +export const diagram: DiagramDefinition = { + parser, + db, + renderer, + styles, + init: (cnf) => { + if (!cnf.state) { + cnf.state = {}; + } + cnf.state.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; + db.clear(); + }, +}; diff --git a/packages/mermaid/src/diagrams/state/stateDiagram.ts b/packages/mermaid/src/diagrams/state/stateDiagram.ts new file mode 100644 index 000000000..570d599de --- /dev/null +++ b/packages/mermaid/src/diagrams/state/stateDiagram.ts @@ -0,0 +1,20 @@ +import { DiagramDefinition } from '../../diagram-api/types'; +// @ts-ignore: TODO Fix ts errors +import parser from './parser/stateDiagram'; +import db from './stateDb'; +import styles from './styles'; +import renderer from './stateRenderer'; + +export const diagram: DiagramDefinition = { + parser, + db, + renderer, + styles, + init: (cnf) => { + if (!cnf.state) { + cnf.state = {}; + } + cnf.state.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute; + db.clear(); + }, +}; From 0b4c6f647755ff681fdc04d626bfb91ca544ceef Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 16:22:38 +0530 Subject: [PATCH 015/309] chore(split): Journey --- .../src/diagram-api/diagram-orchestration.ts | 23 ++----------------- .../diagrams/user-journey/journeyDetector.ts | 19 +++++++++++++-- .../diagrams/user-journey/journeyDiagram.ts | 17 ++++++++++++++ 3 files changed, 36 insertions(+), 23 deletions(-) create mode 100644 packages/mermaid/src/diagrams/user-journey/journeyDiagram.ts diff --git a/packages/mermaid/src/diagram-api/diagram-orchestration.ts b/packages/mermaid/src/diagram-api/diagram-orchestration.ts index 0f12a7ee7..eed4269f6 100644 --- a/packages/mermaid/src/diagram-api/diagram-orchestration.ts +++ b/packages/mermaid/src/diagram-api/diagram-orchestration.ts @@ -13,13 +13,7 @@ import classDiagram from '../diagrams/class/classDetector'; import classDiagramV2 from '../diagrams/class/classDetector-V2'; import state from '../diagrams/state/stateDetector'; import stateV2 from '../diagrams/state/stateDetector-V2'; - -// @ts-ignore: TODO Fix ts errors -import journeyParser from '../diagrams/user-journey/parser/journey'; -import { journeyDetector } from '../diagrams/user-journey/journeyDetector'; -import journeyDb from '../diagrams/user-journey/journeyDb'; -import journeyRenderer from '../diagrams/user-journey/journeyRenderer'; -import journeyStyles from '../diagrams/user-journey/styles'; +import journey from '../diagrams/user-journey/journeyDetector'; import errorRenderer from '../diagrams/error/errorRenderer'; import errorStyles from '../diagrams/error/styles'; @@ -70,18 +64,5 @@ export const addDiagrams = () => { addDiagram(git); addDiagram(state); addDiagram(stateV2); - registerDiagram( - 'journey', - { - parser: journeyParser, - db: journeyDb, - renderer: journeyRenderer, - styles: journeyStyles, - init: (cnf) => { - journeyRenderer.setConf(cnf.journey); - journeyDb.clear(); - }, - }, - journeyDetector - ); + addDiagram(journey); }; diff --git a/packages/mermaid/src/diagrams/user-journey/journeyDetector.ts b/packages/mermaid/src/diagrams/user-journey/journeyDetector.ts index 535e7be9d..90b2fd6e1 100644 --- a/packages/mermaid/src/diagrams/user-journey/journeyDetector.ts +++ b/packages/mermaid/src/diagrams/user-journey/journeyDetector.ts @@ -1,5 +1,20 @@ -import type { DiagramDetector } from '../../diagram-api/types'; +import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-api/types'; -export const journeyDetector: DiagramDetector = (txt) => { +const id = 'journey'; + +const detector: DiagramDetector = (txt) => { return txt.match(/^\s*journey/) !== null; }; + +const loader = async () => { + const { diagram } = await import('./journeyDiagram'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/user-journey/journeyDiagram.ts b/packages/mermaid/src/diagrams/user-journey/journeyDiagram.ts new file mode 100644 index 000000000..c3a2a3c6b --- /dev/null +++ b/packages/mermaid/src/diagrams/user-journey/journeyDiagram.ts @@ -0,0 +1,17 @@ +import { DiagramDefinition } from '../../diagram-api/types'; +// @ts-ignore: TODO Fix ts errors +import parser from './parser/journey'; +import db from './journeyDb'; +import styles from './styles'; +import renderer from './journeyRenderer'; + +export const diagram: DiagramDefinition = { + parser, + db, + renderer, + styles, + init: (cnf) => { + renderer.setConf(cnf.journey); + db.clear(); + }, +}; From fa51121f29e0dbcb41744b454429cbe6d1f1bfe1 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 16:30:54 +0530 Subject: [PATCH 016/309] chore(split): Error --- .../src/diagram-api/diagram-orchestration.ts | 29 ++----------------- .../src/diagrams/error/errorDetector.ts | 20 +++++++++++++ .../src/diagrams/error/errorDiagram.ts | 21 ++++++++++++++ 3 files changed, 43 insertions(+), 27 deletions(-) create mode 100644 packages/mermaid/src/diagrams/error/errorDetector.ts create mode 100644 packages/mermaid/src/diagrams/error/errorDiagram.ts diff --git a/packages/mermaid/src/diagram-api/diagram-orchestration.ts b/packages/mermaid/src/diagram-api/diagram-orchestration.ts index eed4269f6..64a7e5ad8 100644 --- a/packages/mermaid/src/diagram-api/diagram-orchestration.ts +++ b/packages/mermaid/src/diagram-api/diagram-orchestration.ts @@ -1,4 +1,3 @@ -import { registerDiagram } from './diagramAPI'; import c4 from '../diagrams/c4/c4Detector'; import flowchart from '../diagrams/flowchart/flowDetector'; import flowchartV2 from '../diagrams/flowchart/flowDetector-v2'; @@ -14,9 +13,7 @@ import classDiagramV2 from '../diagrams/class/classDetector-V2'; import state from '../diagrams/state/stateDetector'; import stateV2 from '../diagrams/state/stateDetector-V2'; import journey from '../diagrams/user-journey/journeyDetector'; - -import errorRenderer from '../diagrams/error/errorRenderer'; -import errorStyles from '../diagrams/error/styles'; +import error from '../diagrams/error/errorDetector'; import { addDiagram } from './detectType'; let hasLoadedDiagrams = false; @@ -27,29 +24,7 @@ export const addDiagrams = () => { // This is added here to avoid race-conditions. // We could optimize the loading logic somehow. hasLoadedDiagrams = true; - registerDiagram( - 'error', - // Special diagram with error messages but setup as a regular diagram - { - db: { - clear: () => { - // Quite ok, clear needs to be there for error to work as a regular diagram - }, - }, - styles: errorStyles, - renderer: errorRenderer, - parser: { - parser: { yy: {} }, - parse: () => { - // no op - }, - }, - init: () => { - // no op - }, - }, - (text) => text.toLowerCase().trim() === 'error' - ); + addDiagram(error); addDiagram(c4); addDiagram(classDiagram); addDiagram(classDiagramV2); diff --git a/packages/mermaid/src/diagrams/error/errorDetector.ts b/packages/mermaid/src/diagrams/error/errorDetector.ts new file mode 100644 index 000000000..2bdcd7028 --- /dev/null +++ b/packages/mermaid/src/diagrams/error/errorDetector.ts @@ -0,0 +1,20 @@ +import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-api/types'; + +const id = 'error'; + +const detector: DiagramDetector = (text) => { + return text.toLowerCase().trim() === 'error'; +}; + +const loader = async () => { + const { diagram } = await import('./errorDiagram'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid/src/diagrams/error/errorDiagram.ts b/packages/mermaid/src/diagrams/error/errorDiagram.ts new file mode 100644 index 000000000..d081e1028 --- /dev/null +++ b/packages/mermaid/src/diagrams/error/errorDiagram.ts @@ -0,0 +1,21 @@ +import { DiagramDefinition } from '../../diagram-api/types'; +import styles from './styles'; +import renderer from './errorRenderer'; +export const diagram: DiagramDefinition = { + db: { + clear: () => { + // Quite ok, clear needs to be there for error to work as a regular diagram + }, + }, + styles, + renderer, + parser: { + parser: { yy: {} }, + parse: () => { + // no op + }, + }, + init: () => { + // no op + }, +}; From 0854bab12415d5842b7c5b5a950a43c3202407e8 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 16:51:50 +0530 Subject: [PATCH 017/309] fix: Remove diagram dependency from mermaidAPI --- packages/mermaid/src/mermaid.ts | 9 +-------- packages/mermaid/src/mermaidAPI.ts | 22 +++++----------------- 2 files changed, 6 insertions(+), 25 deletions(-) diff --git a/packages/mermaid/src/mermaid.ts b/packages/mermaid/src/mermaid.ts index ac8872ef6..3a8da77ad 100644 --- a/packages/mermaid/src/mermaid.ts +++ b/packages/mermaid/src/mermaid.ts @@ -13,7 +13,6 @@ import { ExternalDiagramDefinition } from './diagram-api/types'; export type { MermaidConfig, DetailedError, ExternalDiagramDefinition }; -let externalDiagramsRegistered = false; /** * ## init * @@ -50,12 +49,7 @@ const init = async function ( callback?: Function ) { try { - // Not really sure if we need to check this, or simply call initThrowsErrorsAsync directly. - if (externalDiagramsRegistered) { - await initThrowsErrorsAsync(config, nodes, callback); - } else { - initThrowsErrors(config, nodes, callback); - } + await initThrowsErrorsAsync(config, nodes, callback); } catch (e) { log.warn('Syntax Error rendering'); if (isDetailedError(e)) { @@ -343,7 +337,6 @@ const registerExternalDiagrams = async ( } else { await loadExternalDiagrams(diagrams); } - externalDiagramsRegistered = true; }; /** diff --git a/packages/mermaid/src/mermaidAPI.ts b/packages/mermaid/src/mermaidAPI.ts index faba5fef8..986d0b157 100644 --- a/packages/mermaid/src/mermaidAPI.ts +++ b/packages/mermaid/src/mermaidAPI.ts @@ -18,12 +18,7 @@ import { compile, serialize, stringify } from 'stylis'; import pkg from '../package.json'; import * as configApi from './config'; import { addDiagrams } from './diagram-api/diagram-orchestration'; -import classDb from './diagrams/class/classDb'; -import flowDb from './diagrams/flowchart/flowDb'; -import flowRenderer from './diagrams/flowchart/flowRenderer'; -import ganttDb from './diagrams/gantt/ganttDb'; import Diagram, { getDiagramFromText } from './Diagram'; -import errorRenderer from './diagrams/error/errorRenderer'; import { attachFunctions } from './interactionDb'; import { log, setLogLevel } from './logger'; import getStyles from './styles'; @@ -32,6 +27,7 @@ import utils, { directiveSanitizer } from './utils'; import DOMPurify from 'dompurify'; import { MermaidConfig } from './config.type'; import { evaluate } from './diagrams/common/common'; +import errorRenderer from './diagrams/error/errorRenderer'; /** * @param text @@ -271,7 +267,7 @@ const render = function ( // classDef if (graphType === 'flowchart' || graphType === 'flowchart-v2' || graphType === 'graph') { - const classes: any = flowRenderer.getClasses(text, diag); + const classes: any = diag.renderer.getClasses(text, diag); const htmlLabels = cnf.htmlLabels || cnf.flowchart?.htmlLabels; for (const className in classes) { if (htmlLabels) { @@ -364,14 +360,10 @@ const render = function ( switch (graphType) { case 'flowchart': case 'flowchart-v2': - cb(svgCode, flowDb.bindFunctions); - break; case 'gantt': - cb(svgCode, ganttDb.bindFunctions); - break; case 'class': case 'classDiagram': - cb(svgCode, classDb.bindFunctions); + cb(svgCode, diag.db.bindFunctions); break; default: cb(svgCode); @@ -544,7 +536,7 @@ const renderAsync = async function ( // classDef if (graphType === 'flowchart' || graphType === 'flowchart-v2' || graphType === 'graph') { - const classes: any = flowRenderer.getClasses(text, diag); + const classes: any = diag.renderer.getClasses(text, diag); const htmlLabels = cnf.htmlLabels || cnf.flowchart?.htmlLabels; for (const className in classes) { if (htmlLabels) { @@ -637,14 +629,10 @@ const renderAsync = async function ( switch (graphType) { case 'flowchart': case 'flowchart-v2': - cb(svgCode, flowDb.bindFunctions); - break; case 'gantt': - cb(svgCode, ganttDb.bindFunctions); - break; case 'class': case 'classDiagram': - cb(svgCode, classDb.bindFunctions); + cb(svgCode, diag.db.bindFunctions); break; default: cb(svgCode); From 7306b5ac4587197daa88a9c11634cb97d498fbd6 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 18 Nov 2022 17:52:55 +0530 Subject: [PATCH 018/309] feat: Add size inspection plugin --- .vite/build.ts | 5 +- package.json | 1 + packages/mermaid/package.json | 4 +- .../flowchart/parser/flow-direction.spec.js | 2 +- .../flowchart/parser/subgraph.spec.js | 2 +- packages/mermaid/src/utils.spec.js | 2 +- packages/mermaid/src/utils.ts | 2 +- pnpm-lock.yaml | 130 ++++++++++-------- vdocs/.vitepress/config.ts | 1 - 9 files changed, 82 insertions(+), 67 deletions(-) diff --git a/.vite/build.ts b/.vite/build.ts index 2b686b765..d9c8ffe30 100644 --- a/.vite/build.ts +++ b/.vite/build.ts @@ -1,8 +1,9 @@ -import { build, InlineConfig } from 'vite'; +import { build, InlineConfig, type PluginOption } from 'vite'; import { resolve } from 'path'; import { fileURLToPath } from 'url'; import jisonPlugin from './jisonPlugin.js'; import { readFileSync } from 'fs'; +import { visualizer } from 'rollup-plugin-visualizer'; const watch = process.argv.includes('--watch'); const mermaidOnly = process.argv.includes('--mermaid'); @@ -95,7 +96,7 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions) resolve: { extensions: ['.jison', '.js', '.ts', '.json'], }, - plugins: [jisonPlugin()], + plugins: [jisonPlugin(), visualizer({ template: 'network' }) as PluginOption], }; if (watch && config.build) { diff --git a/package.json b/package.json index ce5b12ce4..c30973985 100644 --- a/package.json +++ b/package.json @@ -107,6 +107,7 @@ "prettier-plugin-jsdoc": "^0.4.2", "remark": "^14.0.2", "rimraf": "^3.0.2", + "rollup-plugin-visualizer": "^5.8.3", "start-server-and-test": "^1.14.0", "ts-node": "^10.9.1", "typescript": "^4.8.4", diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index f8ff46325..a8f8ed371 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -55,7 +55,7 @@ "fast-clone": "^1.5.13", "graphlib": "^2.1.8", "khroma": "^2.0.0", - "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "moment-mini": "^2.24.0", "non-layered-tidy-tree-layout": "^2.0.2", "stylis": "^4.1.2", @@ -70,7 +70,7 @@ "@types/eslint": "^8.4.6", "@types/express": "^4.17.13", "@types/jsdom": "^20.0.0", - "@types/lodash": "^4.14.185", + "@types/lodash-es": "^4.17.6", "@types/prettier": "^2.7.0", "@types/stylis": "^4.0.2", "@types/uuid": "^8.3.4", diff --git a/packages/mermaid/src/diagrams/flowchart/parser/flow-direction.spec.js b/packages/mermaid/src/diagrams/flowchart/parser/flow-direction.spec.js index a56184f11..d6a41d15f 100644 --- a/packages/mermaid/src/diagrams/flowchart/parser/flow-direction.spec.js +++ b/packages/mermaid/src/diagrams/flowchart/parser/flow-direction.spec.js @@ -1,6 +1,6 @@ import flowDb from '../flowDb'; import flow from './flow'; -import filter from 'lodash/filter'; +import filter from 'lodash-es/filter'; import { setConfig } from '../../../config'; // import DOMPurify from 'dompurify'; diff --git a/packages/mermaid/src/diagrams/flowchart/parser/subgraph.spec.js b/packages/mermaid/src/diagrams/flowchart/parser/subgraph.spec.js index aa8e9217f..6fec233e7 100644 --- a/packages/mermaid/src/diagrams/flowchart/parser/subgraph.spec.js +++ b/packages/mermaid/src/diagrams/flowchart/parser/subgraph.spec.js @@ -1,6 +1,6 @@ import flowDb from '../flowDb'; import flow from './flow'; -import filter from 'lodash/filter'; +import filter from 'lodash-es/filter'; import { setConfig } from '../../../config'; setConfig({ diff --git a/packages/mermaid/src/utils.spec.js b/packages/mermaid/src/utils.spec.js index 4a511b3c0..ca2dfeab9 100644 --- a/packages/mermaid/src/utils.spec.js +++ b/packages/mermaid/src/utils.spec.js @@ -3,7 +3,7 @@ import utils from './utils'; import assignWithDepth from './assignWithDepth'; import { detectType } from './diagram-api/detectType'; import { addDiagrams } from './diagram-api/diagram-orchestration'; -import memoize from 'lodash/memoize'; +import memoize from 'lodash-es/memoize'; addDiagrams(); describe('when assignWithDepth: should merge objects within objects', function () { diff --git a/packages/mermaid/src/utils.ts b/packages/mermaid/src/utils.ts index f969ecc62..a6a9c2577 100644 --- a/packages/mermaid/src/utils.ts +++ b/packages/mermaid/src/utils.ts @@ -20,7 +20,7 @@ import { log } from './logger'; import { detectType } from './diagram-api/detectType'; import assignWithDepth from './assignWithDepth'; import { MermaidConfig } from './config.type'; -import memoize from 'lodash/memoize'; +import memoize from 'lodash-es/memoize'; // Effectively an enum of the supported curve types, accessible by name const d3CurveTypes = { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index de2066b8d..1142c0722 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -145,6 +145,9 @@ importers: rimraf: specifier: ^3.0.2 version: 3.0.2 + rollup-plugin-visualizer: + specifier: ^5.8.3 + version: 5.8.3_rollup@2.79.1 start-server-and-test: specifier: ^1.14.0 version: 1.14.0 @@ -165,7 +168,7 @@ importers: version: 1.0.0-alpha.28_ysryt2e75uhznkanan6iyjk4mi vitepress-plugin-mermaid: specifier: ^2.0.8 - version: 2.0.8_2q5vfj2vm6nj3r62ddjdsi7aoe + version: 2.0.8_qntmym4r3eiuu4ikfhr4jvwbjq vitepress-plugin-search: specifier: ^1.0.4-alpha.11 version: 1.0.4-alpha.15_pb3anlaclwt5smse4ujf447uy4 @@ -199,7 +202,7 @@ importers: khroma: specifier: ^2.0.0 version: 2.0.0 - lodash: + lodash-es: specifier: ^4.17.21 version: 4.17.21 moment-mini: @@ -239,9 +242,9 @@ importers: '@types/jsdom': specifier: ^20.0.0 version: 20.0.0 - '@types/lodash': - specifier: ^4.14.185 - version: 4.14.185 + '@types/lodash-es': + specifier: ^4.17.6 + version: 4.17.6 '@types/prettier': specifier: ^2.7.0 version: 2.7.0 @@ -2675,7 +2678,6 @@ packages: /@braintree/sanitize-url/6.0.0: resolution: {integrity: sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w==} - dev: false /@colors/colors/1.5.0: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -3930,8 +3932,10 @@ packages: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} dev: true - /@types/lodash/4.14.185: - resolution: {integrity: sha512-evMDG1bC4rgQg4ku9tKpuMh5iBNEwNa3tf9zRHdP1qlv+1WUg44xat4IxCE14gIpZRGUUWAx2VhItCZc25NfMA==} + /@types/lodash-es/4.17.6: + resolution: {integrity: sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==} + dependencies: + '@types/lodash': 4.14.188 dev: true /@types/lodash/4.14.188: @@ -5176,7 +5180,7 @@ packages: /axios/0.21.4_debug@4.3.2: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.2_debug@4.3.2 transitivePeerDependencies: - debug dev: true @@ -5184,7 +5188,7 @@ packages: /axios/0.26.0: resolution: {integrity: sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.2_debug@4.3.2 transitivePeerDependencies: - debug dev: true @@ -6519,12 +6523,10 @@ packages: engines: {node: '>=12'} dependencies: internmap: 2.0.3 - dev: false /d3-axis/3.0.0: resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} engines: {node: '>=12'} - dev: false /d3-brush/3.0.0: resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} @@ -6535,38 +6537,32 @@ packages: d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-transition: 3.0.1_d3-selection@3.0.0 - dev: false /d3-chord/3.0.1: resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} engines: {node: '>=12'} dependencies: d3-path: 3.0.1 - dev: false /d3-color/3.1.0: resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} engines: {node: '>=12'} - dev: false /d3-contour/4.0.0: resolution: {integrity: sha512-7aQo0QHUTu/Ko3cP9YK9yUTxtoDEiDGwnBHyLxG5M4vqlBkO/uixMRele3nfsfj6UXOcuReVpVXzAboGraYIJw==} engines: {node: '>=12'} dependencies: d3-array: 3.2.0 - dev: false /d3-delaunay/6.0.2: resolution: {integrity: sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==} engines: {node: '>=12'} dependencies: delaunator: 5.0.0 - dev: false /d3-dispatch/3.0.1: resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} engines: {node: '>=12'} - dev: false /d3-drag/3.0.0: resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} @@ -6574,7 +6570,6 @@ packages: dependencies: d3-dispatch: 3.0.1 d3-selection: 3.0.0 - dev: false /d3-dsv/3.0.1: resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} @@ -6584,19 +6579,16 @@ packages: commander: 7.2.0 iconv-lite: 0.6.3 rw: 1.3.3 - dev: false /d3-ease/3.0.1: resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} engines: {node: '>=12'} - dev: false /d3-fetch/3.0.1: resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} engines: {node: '>=12'} dependencies: d3-dsv: 3.0.1 - dev: false /d3-force/3.0.0: resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} @@ -6605,51 +6597,42 @@ packages: d3-dispatch: 3.0.1 d3-quadtree: 3.0.1 d3-timer: 3.0.1 - dev: false /d3-format/3.1.0: resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} engines: {node: '>=12'} - dev: false /d3-geo/3.0.1: resolution: {integrity: sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==} engines: {node: '>=12'} dependencies: d3-array: 3.2.0 - dev: false /d3-hierarchy/3.1.2: resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} engines: {node: '>=12'} - dev: false /d3-interpolate/3.0.1: resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} engines: {node: '>=12'} dependencies: d3-color: 3.1.0 - dev: false /d3-path/3.0.1: resolution: {integrity: sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==} engines: {node: '>=12'} - dev: false /d3-polygon/3.0.1: resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} engines: {node: '>=12'} - dev: false /d3-quadtree/3.0.1: resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} engines: {node: '>=12'} - dev: false /d3-random/3.0.1: resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} engines: {node: '>=12'} - dev: false /d3-scale-chromatic/3.0.0: resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} @@ -6657,7 +6640,6 @@ packages: dependencies: d3-color: 3.1.0 d3-interpolate: 3.0.1 - dev: false /d3-scale/4.0.2: resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} @@ -6668,38 +6650,32 @@ packages: d3-interpolate: 3.0.1 d3-time: 3.0.0 d3-time-format: 4.1.0 - dev: false /d3-selection/3.0.0: resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} engines: {node: '>=12'} - dev: false /d3-shape/3.1.0: resolution: {integrity: sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==} engines: {node: '>=12'} dependencies: d3-path: 3.0.1 - dev: false /d3-time-format/4.1.0: resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} engines: {node: '>=12'} dependencies: d3-time: 3.0.0 - dev: false /d3-time/3.0.0: resolution: {integrity: sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==} engines: {node: '>=12'} dependencies: d3-array: 3.2.0 - dev: false /d3-timer/3.0.1: resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} engines: {node: '>=12'} - dev: false /d3-transition/3.0.1_d3-selection@3.0.0: resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} @@ -6713,7 +6689,6 @@ packages: d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-timer: 3.0.1 - dev: false /d3-zoom/3.0.0: resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} @@ -6724,7 +6699,6 @@ packages: d3-interpolate: 3.0.1 d3-selection: 3.0.0 d3-transition: 3.0.1_d3-selection@3.0.0 - dev: false /d3/7.6.1: resolution: {integrity: sha512-txMTdIHFbcpLx+8a0IFhZsbp+PfBBPt8yfbmukZTQFroKuFqIwqswF0qE5JXWefylaAVpSXFoKm3yP+jpNLFLw==} @@ -6760,7 +6734,6 @@ packages: d3-timer: 3.0.1 d3-transition: 3.0.1_d3-selection@3.0.0 d3-zoom: 3.0.0 - dev: false /dagre-d3/0.6.4: resolution: {integrity: sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==} @@ -6769,14 +6742,12 @@ packages: dagre: 0.8.5 graphlib: 2.1.8 lodash: 4.17.21 - dev: false /dagre/0.8.5: resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==} dependencies: graphlib: 2.1.8 lodash: 4.17.21 - dev: false /dargs/7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} @@ -7016,7 +6987,6 @@ packages: resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} dependencies: robust-predicates: 3.0.1 - dev: false /delayed-stream/1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} @@ -7223,7 +7193,6 @@ packages: /dompurify/2.4.0: resolution: {integrity: sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA==} - dev: false /domutils/3.0.1: resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} @@ -8231,7 +8200,6 @@ packages: /fast-clone/1.5.13: resolution: {integrity: sha512-0ez7coyFBQFjZtId+RJqJ+EQs61w9xARfqjqK0AD9vIUkSxWD4HvPt80+5evebZ1tTnv1GYKrPTipx7kOW5ipA==} - dev: false /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -8412,6 +8380,18 @@ packages: optional: true dev: true + /follow-redirects/1.15.2_debug@4.3.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.2 + dev: true + /for-in/1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} @@ -8862,7 +8842,6 @@ packages: resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==} dependencies: lodash: 4.17.21 - dev: false /gray-matter/4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} @@ -9375,7 +9354,6 @@ packages: /internmap/2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} - dev: false /interpret/2.2.0: resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} @@ -10493,7 +10471,6 @@ packages: /khroma/2.0.0: resolution: {integrity: sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==} - dev: false /kind-of/3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} @@ -10731,6 +10708,10 @@ packages: p-locate: 5.0.0 dev: true + /lodash-es/4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false + /lodash.debounce/4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} dev: true @@ -11030,6 +11011,24 @@ packages: engines: {node: '>= 8'} dev: true + /mermaid/9.2.2: + resolution: {integrity: sha512-6s7eKMqFJGS+0MYjmx8f6ZigqKBJVoSx5ql2gw6a4Aa+WJ49QiEJg7gPwywaBg3DZMs79UP7trESp4+jmaQccw==} + dependencies: + '@braintree/sanitize-url': 6.0.0 + d3: 7.6.1 + dagre: 0.8.5 + dagre-d3: 0.6.4 + dompurify: 2.4.0 + fast-clone: 1.5.13 + graphlib: 2.1.8 + khroma: 2.0.0 + lodash: 4.17.21 + moment-mini: 2.29.4 + non-layered-tidy-tree-layout: 2.0.2 + stylis: 4.1.2 + uuid: 9.0.0 + dev: true + /methods/1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -11372,7 +11371,6 @@ packages: /moment-mini/2.29.4: resolution: {integrity: sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==} - dev: false /mri/1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} @@ -11510,7 +11508,6 @@ packages: /non-layered-tidy-tree-layout/2.0.2: resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} - dev: false /normalize-package-data/2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -12831,7 +12828,22 @@ packages: /robust-predicates/3.0.1: resolution: {integrity: sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==} - dev: false + + /rollup-plugin-visualizer/5.8.3_rollup@2.79.1: + resolution: {integrity: sha512-QGJk4Bqe4AOat5AjipOh8esZH1nck5X2KFpf4VytUdSUuuuSwvIQZjMGgjcxe/zXexltqaXp5Vx1V3LmnQH15Q==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + open: 8.4.0 + rollup: 2.79.1 + source-map: 0.7.4 + yargs: 17.6.2 + dev: true /rollup/2.79.1: resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} @@ -12849,7 +12861,6 @@ packages: /rw/1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - dev: false /rxjs/7.5.6: resolution: {integrity: sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==} @@ -13271,6 +13282,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /source-map/0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + /sourcemap-codec/1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} dev: true @@ -13621,7 +13637,6 @@ packages: /stylis/4.1.2: resolution: {integrity: sha512-Nn2CCrG2ZaFziDxaZPN43CXqn+j7tcdjPFCkRBkFue8QYXC2HdEwnw5TCBo4yQZ2WxKYeSi0fdoOrtEqgDrXbA==} - dev: false /subarg/1.0.0: resolution: {integrity: sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==} @@ -14086,7 +14101,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 '@types/node': 14.18.33 - acorn: 8.8.0 + acorn: 8.8.1 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 @@ -14477,7 +14492,6 @@ packages: /uuid/9.0.0: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} hasBin: true - dev: false /uvu/0.5.6: resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} @@ -14711,14 +14725,14 @@ packages: fsevents: 2.3.2 dev: true - /vitepress-plugin-mermaid/2.0.8_2q5vfj2vm6nj3r62ddjdsi7aoe: + /vitepress-plugin-mermaid/2.0.8_qntmym4r3eiuu4ikfhr4jvwbjq: resolution: {integrity: sha512-ywWxTeg9kMv7ZPf/igCBF4ZHhWZAyRtbPnA12ICQuNK2AMp7r5IHOfnuX1EJQf8gNdsh8bcvvSvm8Ll92fdOTw==} peerDependencies: mermaid: ^8.0.0 || ^9.0.0 vite-plugin-md: ^0.20.4 vitepress: ^0.21.6 || ^1.0.0 || ^1.0.0-alpha dependencies: - mermaid: link:packages/mermaid + mermaid: 9.2.2 vite-plugin-md: 0.20.4_2vrekto2ma5pf5j2eoe6xabo24 vitepress: 1.0.0-alpha.28_ysryt2e75uhznkanan6iyjk4mi dev: true diff --git a/vdocs/.vitepress/config.ts b/vdocs/.vitepress/config.ts index d3cdccc9a..48bb382c0 100644 --- a/vdocs/.vitepress/config.ts +++ b/vdocs/.vitepress/config.ts @@ -1,7 +1,6 @@ import { version } from '../../package.json'; import ExampleMarkdown from './mermaid-markdown-all'; import { defineConfig } from 'vitepress'; -import { update } from 'lodash'; export default defineConfig({ lang: 'en-US', From 2e028ce36d78c857693becedb2cac2549308a3ca Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 20 Nov 2022 00:38:35 +0530 Subject: [PATCH 019/309] chore: Unify `registerLazyLoadedDiagrams` --- cypress/platform/flow2.html | 46 +++++++++++++++++++ .../mermaid/src/diagram-api/detectType.ts | 6 ++- .../src/diagram-api/diagram-orchestration.ts | 36 ++++++++------- packages/mermaid/src/mermaid.ts | 15 +----- 4 files changed, 71 insertions(+), 32 deletions(-) create mode 100644 cypress/platform/flow2.html diff --git a/cypress/platform/flow2.html b/cypress/platform/flow2.html new file mode 100644 index 000000000..b23f00be6 --- /dev/null +++ b/cypress/platform/flow2.html @@ -0,0 +1,46 @@ + + + + + + +
+      graph TB
+      subgraph One
+        a1-->a2-->a3
+      end
+    
+
+      graph TB
+        a_a --> b_b:::apa --> c_c:::apa
+        classDef apa fill:#f9f,stroke:#333,stroke-width:4px;
+        class a_a apa;
+    
+
+      graph TB
+        a_a(Aftonbladet) --> b_b[gorilla]:::apa --> c_c{chimp}:::apa -->a_a
+        a_a --> c --> d_d --> c_c
+        classDef apa fill:#f9f,stroke:#333,stroke-width:4px;
+        class a_a apa;
+        click a_a "http://www.aftonbladet.se" "apa"
+    
+ + + + diff --git a/packages/mermaid/src/diagram-api/detectType.ts b/packages/mermaid/src/diagram-api/detectType.ts index 1ea4f2b4d..c27f79b6c 100644 --- a/packages/mermaid/src/diagram-api/detectType.ts +++ b/packages/mermaid/src/diagram-api/detectType.ts @@ -44,8 +44,10 @@ export const detectType = function (text: string, config?: MermaidConfig): strin throw new Error(`No diagram type detected for text: ${text}`); }; -export const addDiagram = ({ id, detector, loader }: ExternalDiagramDefinition) => { - addDetector(id, detector, loader); +export const registerLazyLoadedDiagrams = (...diagrams: ExternalDiagramDefinition[]) => { + for (const { id, detector, loader } of diagrams) { + addDetector(id, detector, loader); + } }; export const addDetector = (key: string, detector: DiagramDetector, loader?: DiagramLoader) => { diff --git a/packages/mermaid/src/diagram-api/diagram-orchestration.ts b/packages/mermaid/src/diagram-api/diagram-orchestration.ts index 64a7e5ad8..c6b8b579a 100644 --- a/packages/mermaid/src/diagram-api/diagram-orchestration.ts +++ b/packages/mermaid/src/diagram-api/diagram-orchestration.ts @@ -14,7 +14,7 @@ import state from '../diagrams/state/stateDetector'; import stateV2 from '../diagrams/state/stateDetector-V2'; import journey from '../diagrams/user-journey/journeyDetector'; import error from '../diagrams/error/errorDetector'; -import { addDiagram } from './detectType'; +import { registerLazyLoadedDiagrams } from './detectType'; let hasLoadedDiagrams = false; export const addDiagrams = () => { @@ -24,20 +24,22 @@ export const addDiagrams = () => { // This is added here to avoid race-conditions. // We could optimize the loading logic somehow. hasLoadedDiagrams = true; - addDiagram(error); - addDiagram(c4); - addDiagram(classDiagram); - addDiagram(classDiagramV2); - addDiagram(er); - addDiagram(gantt); - addDiagram(info); - addDiagram(pie); - addDiagram(requirement); - addDiagram(sequence); - addDiagram(flowchart); - addDiagram(flowchartV2); - addDiagram(git); - addDiagram(state); - addDiagram(stateV2); - addDiagram(journey); + registerLazyLoadedDiagrams( + error, + c4, + classDiagram, + classDiagramV2, + er, + gantt, + info, + pie, + requirement, + sequence, + flowchart, + flowchartV2, + git, + state, + stateV2, + journey + ); }; diff --git a/packages/mermaid/src/mermaid.ts b/packages/mermaid/src/mermaid.ts index 3a8da77ad..268a830ec 100644 --- a/packages/mermaid/src/mermaid.ts +++ b/packages/mermaid/src/mermaid.ts @@ -6,7 +6,7 @@ import type { MermaidConfig } from './config.type'; import { log } from './logger'; import utils from './utils'; import { mermaidAPI } from './mermaidAPI'; -import { addDetector } from './diagram-api/detectType'; +import { registerLazyLoadedDiagrams } from './diagram-api/detectType'; import { isDetailedError, type DetailedError } from './utils'; import { registerDiagram } from './diagram-api/diagramAPI'; import { ExternalDiagramDefinition } from './diagram-api/types'; @@ -175,17 +175,6 @@ const initThrowsErrors = function ( } }; -/** - * This is an internal function and should not be made public, as it will likely change. - * @internal - * @param diagrams - Array of {@link ExternalDiagramDefinition}. - */ -const registerLazyLoadedDiagrams = (diagrams: ExternalDiagramDefinition[]) => { - for (const { id, detector, loader } of diagrams) { - addDetector(id, detector, loader); - } -}; - /** * This is an internal function and should not be made public, as it will likely change. * @internal @@ -333,7 +322,7 @@ const registerExternalDiagrams = async ( } = {} ) => { if (lazyLoad) { - registerLazyLoadedDiagrams(diagrams); + registerLazyLoadedDiagrams(...diagrams); } else { await loadExternalDiagrams(diagrams); } From e861fbb5170a5ade38db52320f55dd580547e522 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 20 Nov 2022 11:09:08 +0530 Subject: [PATCH 020/309] feat: unbundle styles --- .vite/server.ts | 1 + .../mermaid/src/diagram-api/diagramAPI.ts | 26 +++++++++++++- packages/mermaid/src/mermaid.ts | 28 ++------------- packages/mermaid/src/styles.ts | 36 ++----------------- 4 files changed, 30 insertions(+), 61 deletions(-) diff --git a/.vite/server.ts b/.vite/server.ts index 334398dd8..ddd6afdd6 100644 --- a/.vite/server.ts +++ b/.vite/server.ts @@ -16,6 +16,7 @@ async function createServer() { // Create Vite server in middleware mode const vite = await createViteServer({ configFile: './vite.config.ts', + mode: 'production', server: { middlewareMode: true }, appType: 'custom', // don't include Vite's default HTML handling middlewares }); diff --git a/packages/mermaid/src/diagram-api/diagramAPI.ts b/packages/mermaid/src/diagram-api/diagramAPI.ts index 2727ae4ef..cacf02fe1 100644 --- a/packages/mermaid/src/diagram-api/diagramAPI.ts +++ b/packages/mermaid/src/diagram-api/diagramAPI.ts @@ -4,7 +4,7 @@ import { getConfig as _getConfig } from '../config'; import { sanitizeText as _sanitizeText } from '../diagrams/common/common'; import { setupGraphViewbox as _setupGraphViewbox } from '../setupGraphViewbox'; import { addStylesForDiagram } from '../styles'; -import { DiagramDefinition, DiagramDetector } from './types'; +import { DiagramDefinition, DiagramDetector, ExternalDiagramDefinition } from './types'; /* Packaging and exposing resources for externa diagrams so that they can import @@ -70,3 +70,27 @@ export class DiagramNotFoundError extends Error { super(`Diagram ${message} not found.`); } } + +/** + * This is an internal function and should not be made public, as it will likely change. + * @internal + * @param diagrams - Array of {@link ExternalDiagramDefinition}. + */ +export const loadExternalDiagrams = async (...diagrams: ExternalDiagramDefinition[]) => { + log.debug(`Loading ${diagrams.length} external diagrams`); + // Load all lazy loaded diagrams in parallel + const results = await Promise.allSettled( + diagrams.map(async ({ id, detector, loader }) => { + const { diagram } = await loader(); + registerDiagram(id, diagram, detector); + }) + ); + const failed = results.filter((result) => result.status === 'rejected'); + if (failed.length > 0) { + log.error(`Failed to load ${failed.length} external diagrams`); + for (const res of failed) { + log.error(res); + } + throw new Error(`Failed to load ${failed.length} external diagrams`); + } +}; diff --git a/packages/mermaid/src/mermaid.ts b/packages/mermaid/src/mermaid.ts index 268a830ec..da13d2d01 100644 --- a/packages/mermaid/src/mermaid.ts +++ b/packages/mermaid/src/mermaid.ts @@ -8,7 +8,7 @@ import utils from './utils'; import { mermaidAPI } from './mermaidAPI'; import { registerLazyLoadedDiagrams } from './diagram-api/detectType'; import { isDetailedError, type DetailedError } from './utils'; -import { registerDiagram } from './diagram-api/diagramAPI'; +import { loadExternalDiagrams } from './diagram-api/diagramAPI'; import { ExternalDiagramDefinition } from './diagram-api/types'; export type { MermaidConfig, DetailedError, ExternalDiagramDefinition }; @@ -175,30 +175,6 @@ const initThrowsErrors = function ( } }; -/** - * This is an internal function and should not be made public, as it will likely change. - * @internal - * @param diagrams - Array of {@link ExternalDiagramDefinition}. - */ -const loadExternalDiagrams = async (diagrams: ExternalDiagramDefinition[]) => { - log.debug(`Loading ${diagrams.length} external diagrams`); - // Load all lazy loaded diagrams in parallel - const results = await Promise.allSettled( - diagrams.map(async ({ id, detector, loader }) => { - const { diagram } = await loader(); - registerDiagram(id, diagram, detector); - }) - ); - const failed = results.filter((result) => result.status === 'rejected'); - if (failed.length > 0) { - log.error(`Failed to load ${failed.length} external diagrams`); - for (const res of failed) { - log.error(res); - } - throw new Error(`Failed to load ${failed.length} external diagrams`); - } -}; - /** * Equivalent to {@link init()}, except an error will be thrown on error. * @@ -324,7 +300,7 @@ const registerExternalDiagrams = async ( if (lazyLoad) { registerLazyLoadedDiagrams(...diagrams); } else { - await loadExternalDiagrams(diagrams); + await loadExternalDiagrams(...diagrams); } }; diff --git a/packages/mermaid/src/styles.ts b/packages/mermaid/src/styles.ts index 0c4a7e1a5..5e7907a80 100644 --- a/packages/mermaid/src/styles.ts +++ b/packages/mermaid/src/styles.ts @@ -1,39 +1,7 @@ -import classDiagram from './diagrams/class/styles'; -import er from './diagrams/er/styles'; -import error from './diagrams/error/styles'; -import flowchart from './diagrams/flowchart/styles'; -import gantt from './diagrams/gantt/styles'; -// import gitGraph from './diagrams/git/styles'; -import info from './diagrams/info/styles'; -import pie from './diagrams/pie/styles'; -import requirement from './diagrams/requirement/styles'; -import sequence from './diagrams/sequence/styles'; -import stateDiagram from './diagrams/state/styles'; -import journey from './diagrams/user-journey/styles'; -import c4 from './diagrams/c4/styles'; -import { FlowChartStyleOptions } from './diagrams/flowchart/styles'; +import type { FlowChartStyleOptions } from './diagrams/flowchart/styles'; import { log } from './logger'; -// TODO @knut: Inject from registerDiagram. -const themes: Record = { - flowchart, - 'flowchart-v2': flowchart, - sequence, - gantt, - classDiagram, - 'classDiagram-v2': classDiagram, - class: classDiagram, - stateDiagram, - state: stateDiagram, - // gitGraph, - info, - pie, - er, - error, - journey, - requirement, - c4, -}; +const themes: Record = {}; const getStyles = ( type: string, From b04517b146c63057262d576a0b8e0df7c9847dbd Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 20 Nov 2022 12:00:34 +0530 Subject: [PATCH 021/309] chore: Cleanup --- .../rendering/stateDiagram-v2.spec.js | 6 ++-- docs/community/newDiagram.md | 4 +-- docs/config/setup/modules/mermaidAPI.md | 20 +++++------ docs/intro/n00b-gettingStarted.md | 30 ++++++++-------- .../mermaid/src/diagram-api/diagramAPI.ts | 2 +- packages/mermaid/src/docs.mts | 2 +- .../src/docs/intro/n00b-gettingStarted.md | 34 +++++++++++-------- 7 files changed, 51 insertions(+), 47 deletions(-) diff --git a/cypress/integration/rendering/stateDiagram-v2.spec.js b/cypress/integration/rendering/stateDiagram-v2.spec.js index 3800a1bf5..5b43c890c 100644 --- a/cypress/integration/rendering/stateDiagram-v2.spec.js +++ b/cypress/integration/rendering/stateDiagram-v2.spec.js @@ -530,7 +530,7 @@ stateDiagram-v2 [*] --> A A --> B: test({ foo#colon; 'far' }) B --> [*] - classDef badBadEvent fill:#f00,color:white,font-weight:bold + classDef badBadEvent fill:#f00,color:white,font-weight:bold class B badBadEvent `, { logLevel: 0, fontFamily: 'courier' } @@ -543,14 +543,14 @@ stateDiagram-v2 classDef notMoving fill:white classDef movement font-style:italic; classDef badBadEvent fill:#f00,color:white,font-weight:bold - + [*] --> Still Still --> [*] Still --> Moving Moving --> Still Moving --> Crash Crash --> [*] - + class Still notMoving class Moving, Crash movement class Crash badBadEvent diff --git a/docs/community/newDiagram.md b/docs/community/newDiagram.md index 7f08e0d95..da86f9838 100644 --- a/docs/community/newDiagram.md +++ b/docs/community/newDiagram.md @@ -174,8 +174,8 @@ The syntax for adding title and description looks like this: accDescr: The description accDescr { - Syntax for a description text - written on multiple lines. + Syntax for a description text + written on multiple lines. } In a similar way to the directives the jison syntax are quite similar between the diagrams. diff --git a/docs/config/setup/modules/mermaidAPI.md b/docs/config/setup/modules/mermaidAPI.md index 0acfe4f97..b1387eb0e 100644 --- a/docs/config/setup/modules/mermaidAPI.md +++ b/docs/config/setup/modules/mermaidAPI.md @@ -80,7 +80,7 @@ mermaid.initialize(config); #### Defined in -[mermaidAPI.ts:949](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L949) +[mermaidAPI.ts:938](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L938) ## Functions @@ -111,7 +111,7 @@ Return the last node appended #### Defined in -[mermaidAPI.ts:292](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L292) +[mermaidAPI.ts:289](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L289) --- @@ -137,7 +137,7 @@ the cleaned up svgCode #### Defined in -[mermaidAPI.ts:243](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L243) +[mermaidAPI.ts:240](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L240) --- @@ -163,7 +163,7 @@ the string with all the user styles #### Defined in -[mermaidAPI.ts:170](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L170) +[mermaidAPI.ts:167](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L167) --- @@ -186,7 +186,7 @@ the string with all the user styles #### Defined in -[mermaidAPI.ts:220](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L220) +[mermaidAPI.ts:217](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L217) --- @@ -213,7 +213,7 @@ with an enclosing block that has each of the cssClasses followed by !important; #### Defined in -[mermaidAPI.ts:154](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L154) +[mermaidAPI.ts:151](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L151) --- @@ -233,7 +233,7 @@ with an enclosing block that has each of the cssClasses followed by !important; #### Defined in -[mermaidAPI.ts:128](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L128) +[mermaidAPI.ts:125](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L125) --- @@ -253,7 +253,7 @@ with an enclosing block that has each of the cssClasses followed by !important; #### Defined in -[mermaidAPI.ts:99](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L99) +[mermaidAPI.ts:96](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L96) --- @@ -279,7 +279,7 @@ Put the svgCode into an iFrame. Return the iFrame code #### Defined in -[mermaidAPI.ts:271](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L271) +[mermaidAPI.ts:268](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L268) --- @@ -305,4 +305,4 @@ Remove any existing elements from the given document #### Defined in -[mermaidAPI.ts:343](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L343) +[mermaidAPI.ts:340](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L340) diff --git a/docs/intro/n00b-gettingStarted.md b/docs/intro/n00b-gettingStarted.md index 5ee34972e..2f422758e 100644 --- a/docs/intro/n00b-gettingStarted.md +++ b/docs/intro/n00b-gettingStarted.md @@ -111,9 +111,9 @@ b. The importing of mermaid library through the `mermaid.esm.js` or `mermaid.esm Here is a mermaid diagram:
-        graph TD
-        A[Client] --> B[Load Balancer]
-        B --> C[Server01]
+        graph TD 
+        A[Client] --> B[Load Balancer] 
+        B --> C[Server01] 
         B --> D[Server02]
   
@@ -156,18 +156,18 @@ Please refer to the [Mindmap](./mindmap.md?id=integrating-with-your-librarywebsi Here is one mermaid diagram:
-            graph TD
-            A[Client] --> B[Load Balancer]
-            B --> C[Server1]
+            graph TD 
+            A[Client] --> B[Load Balancer] 
+            B --> C[Server1] 
             B --> D[Server2]
     
And here is another:
-            graph TD
+            graph TD 
             A[Client] -->|tcp_123| B
-            B(Load Balancer)
-            B -->|tcp_456| C[Server1]
+            B(Load Balancer) 
+            B -->|tcp_456| C[Server1] 
             B -->|tcp_456| D[Server2]
     
@@ -189,15 +189,15 @@ In this example mermaid.js is referenced in `src` as a separate JavaScript file,
-            graph LR
-            A --- B
-            B-->C[fa:fa-ban forbidden]
+            graph LR 
+            A --- B 
+            B-->C[fa:fa-ban forbidden] 
             B-->D(fa:fa-spinner);
     
-            graph TD
-            A[Client] --> B[Load Balancer]
-            B --> C[Server1]
+            graph TD 
+            A[Client] --> B[Load Balancer] 
+            B --> C[Server1] 
             B --> D[Server2]
     
+ +A summary of all options and their defaults is found [here][3]. +A description of each option follows below. + +## theme + +Theme , the CSS style sheet + +| Parameter | Description | Type | Required | Values | +| --------- | --------------- | ------ | -------- | ---------------------------------------------- | +| theme | Built in Themes | string | Optional | 'default', 'forest', 'dark', 'neutral', 'null' | + +**Notes:** To disable any pre-defined mermaid theme, use "null".
 "theme": "forest",
+"themeCSS": ".node rect { fill: red; }" 
+ +## fontFamily + +| Parameter | Description | Type | Required | Values | +| ---------- | ------------------------------------------------------ | ------ | -------- | --------------------------- | +| fontFamily | specifies the font to be used in the rendered diagrams | string | Required | Any Possible CSS FontFamily | + +**Notes:** Default value: '"trebuchet ms", verdana, arial, sans-serif;'. + +## logLevel + +| Parameter | Description | Type | Required | Values | +| --------- | ----------------------------------------------------- | ------ | -------- | -------- | --------------------------------------------- | +| logLevel | This option decides the amount of logging to be used. | string | number | Required | 'trace','debug','info','warn','error','fatal' | + +**Notes:** + +- Trace: 0 +- Debug: 1 +- Info: 2 +- Warn: 3 +- Error: 4 +- Fatal: 5 (default) + +## securityLevel + +| Parameter | Description | Type | Required | Values | +| ------------- | --------------------------------- | ------ | -------- | ------------------------------------------ | +| securityLevel | Level of trust for parsed diagram | string | Required | 'sandbox', 'strict', 'loose', 'antiscript' | + +**Notes**: + +- **strict**: (**default**) tags in text are encoded, click functionality is disabled +- **loose**: tags in text are allowed, click functionality is enabled +- **antiscript**: html tags in text are allowed, (only script element is removed), click + functionality is enabled +- **sandbox**: With this security level all rendering takes place in a sandboxed iframe. This + prevent any JavaScript from running in the context. This may hinder interactive functionality + of the diagram like scripts, popups in sequence diagram or links to other tabs/targets etc. + +## startOnLoad + +| Parameter | Description | Type | Required | Values | +| ----------- | -------------------------------------------- | ------- | -------- | ----------- | +| startOnLoad | Dictates whether mermaid starts on Page load | boolean | Required | true, false | + +**Notes:** Default value: true + +## arrowMarkerAbsolute + +| Parameter | Description | Type | Required | Values | +| ------------------- | ---------------------------------------------------------------------------- | ------- | -------- | ----------- | +| arrowMarkerAbsolute | Controls whether or arrow markers in html code are absolute paths or anchors | boolean | Required | true, false | + +**Notes**: + +This matters if you are using base tag settings. + +Default value: false + +## secure + +This option controls which currentConfig keys are considered _secure_ and can only be changed +via call to mermaidAPI.initialize. Calls to mermaidAPI.reinitialize cannot make changes to the +`secure` keys in the current currentConfig. This prevents malicious graph directives from +overriding a site's default security. + +**Notes**: + +Default value: \['secure', 'securityLevel', 'startOnLoad', 'maxTextSize'] + +## deterministicIds + +This option controls if the generated ids of nodes in the SVG are generated randomly or based +on a seed. If set to false, the IDs are generated based on the current date and thus are not +deterministic. This is the default behaviour. + +**Notes**: + +This matters if your files are checked into sourcecontrol e.g. git and should not change unless +content is changed. + +Default value: false + +## deterministicIDSeed + +This option is the optional seed for deterministic ids. if set to undefined but +deterministicIds is true, a simple number iterator is used. You can set this attribute to base +the seed on a static string. + +## flowchart + +The object containing configurations specific for flowcharts + +### diagramPadding + +| Parameter | Description | Type | Required | Values | +| -------------- | ----------------------------------------------- | ------- | -------- | ------------------ | +| diagramPadding | Amount of padding around the diagram as a whole | Integer | Required | Any Positive Value | + +**Notes:** + +The amount of padding around the diagram as a whole so that embedded diagrams have margins, +expressed in pixels + +Default value: 8 + +### htmlLabels + +| Parameter | Description | Type | Required | Values | +| ---------- | -------------------------------------------------------------------------------------------- | ------- | -------- | ----------- | +| htmlLabels | Flag for setting whether or not a html tag should be used for rendering labels on the edges. | boolean | Required | true, false | + +**Notes:** Default value: true. + +### nodeSpacing + +| Parameter | Description | Type | Required | Values | +| ----------- | --------------------------------------------------- | ------- | -------- | ------------------- | +| nodeSpacing | Defines the spacing between nodes on the same level | Integer | Required | Any positive Number | + +**Notes:** + +Pertains to horizontal spacing for TB (top to bottom) or BT (bottom to top) graphs, and the +vertical spacing for LR as well as RL graphs.\*\* + +Default value: 50 + +### rankSpacing + +| Parameter | Description | Type | Required | Values | +| ----------- | ----------------------------------------------------- | ------- | -------- | ------------------- | +| rankSpacing | Defines the spacing between nodes on different levels | Integer | Required | Any Positive Number | + +**Notes**: + +Pertains to vertical spacing for TB (top to bottom) or BT (bottom to top), and the horizontal +spacing for LR as well as RL graphs. + +Default value 50 + +### curve + +| Parameter | Description | Type | Required | Values | +| --------- | -------------------------------------------------- | ------ | -------- | ----------------------------- | +| curve | Defines how mermaid renders curves for flowcharts. | string | Required | 'basis', 'linear', 'cardinal' | + +**Notes:** + +Default Value: 'basis' + +### useMaxWidth + +| Parameter | Description | Type | Required | Values | +| ----------- | ----------- | ------- | -------- | ----------- | +| useMaxWidth | See notes | boolean | 4 | true, false | + +**Notes:** + +When this flag is set the height and width is set to 100% and is then scaling with the +available space if not the absolute space required is used. + +Default value: true + +### defaultRenderer + +| Parameter | Description | Type | Required | Values | +| --------------- | ----------- | ------- | -------- | ----------------------- | +| defaultRenderer | See notes | boolean | 4 | dagre-d3, dagre-wrapper | + +**Notes:** + +Decides which rendering engine that is to be used for the rendering. Legal values are: +dagre-d3 dagre-wrapper - wrapper for dagre implemented in mermaid + +Default value: 'dagre-wrapper' + +## sequence + +The object containing configurations specific for sequence diagrams + +### activationWidth + +| Parameter | Description | Type | Required | Values | +| --------------- | ---------------------------- | ------- | -------- | ------------------ | +| activationWidth | Width of the activation rect | Integer | Required | Any Positive Value | + +**Notes:** Default value :10 + +### diagramMarginX + +| Parameter | Description | Type | Required | Values | +| -------------- | ---------------------------------------------------- | ------- | -------- | ------------------ | +| diagramMarginX | Margin to the right and left of the sequence diagram | Integer | Required | Any Positive Value | + +**Notes:** Default value: 50 + +### diagramMarginY + +| Parameter | Description | Type | Required | Values | +| -------------- | ------------------------------------------------- | ------- | -------- | ------------------ | +| diagramMarginY | Margin to the over and under the sequence diagram | Integer | Required | Any Positive Value | + +**Notes:** Default value: 10 + +### actorMargin + +| Parameter | Description | Type | Required | Values | +| ----------- | --------------------- | ------- | -------- | ------------------ | +| actorMargin | Margin between actors | Integer | Required | Any Positive Value | + +**Notes:** Default value: 50 + +### width + +| Parameter | Description | Type | Required | Values | +| --------- | -------------------- | ------- | -------- | ------------------ | +| width | Width of actor boxes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 150 + +### height + +| Parameter | Description | Type | Required | Values | +| --------- | --------------------- | ------- | -------- | ------------------ | +| height | Height of actor boxes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 65 + +### boxMargin + +| Parameter | Description | Type | Required | Values | +| --------- | ------------------------ | ------- | -------- | ------------------ | +| boxMargin | Margin around loop boxes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 10 + +### boxTextMargin + +| Parameter | Description | Type | Required | Values | +| ------------- | -------------------------------------------- | ------- | -------- | ------------------ | +| boxTextMargin | Margin around the text in loop/alt/opt boxes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 5 + +### noteMargin + +| Parameter | Description | Type | Required | Values | +| ---------- | ------------------- | ------- | -------- | ------------------ | +| noteMargin | margin around notes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 10 + +### messageMargin + +| Parameter | Description | Type | Required | Values | +| ------------- | ---------------------- | ------- | -------- | ------------------ | +| messageMargin | Space between messages | Integer | Required | Any Positive Value | + +**Notes:** Default value: 35 + +### messageAlign + +| Parameter | Description | Type | Required | Values | +| ------------ | --------------------------- | ------ | -------- | ------------------------- | +| messageAlign | Multiline message alignment | string | Required | 'left', 'center', 'right' | + +**Notes:** Default value: 'center' + +### mirrorActors + +| Parameter | Description | Type | Required | Values | +| ------------ | --------------------------- | ------- | -------- | ----------- | +| mirrorActors | Mirror actors under diagram | boolean | Required | true, false | + +**Notes:** Default value: true + +### forceMenus + +| Parameter | Description | Type | Required | Values | +| ---------- | ----------------------------------------------------------------------- | ------- | -------- | ----------- | +| forceMenus | forces actor popup menus to always be visible (to support E2E testing). | Boolean | Required | True, False | + +**Notes:** + +Default value: false. + +### bottomMarginAdj + +| Parameter | Description | Type | Required | Values | +| --------------- | ------------------------------------------ | ------- | -------- | ------------------ | +| bottomMarginAdj | Prolongs the edge of the diagram downwards | Integer | Required | Any Positive Value | + +**Notes:** + +Depending on css styling this might need adjustment. + +Default value: 1 + +### useMaxWidth + +| Parameter | Description | Type | Required | Values | +| ----------- | ----------- | ------- | -------- | ----------- | +| useMaxWidth | See Notes | boolean | Required | true, false | + +**Notes:** When this flag is set to true, the height and width is set to 100% and is then +scaling with the available space. If set to false, the absolute space required is used. + +Default value: true + +### rightAngles + +| Parameter | Description | Type | Required | Values | +| ----------- | ------------------------------------ | ------- | -------- | ----------- | +| rightAngles | display curve arrows as right angles | boolean | Required | true, false | + +**Notes:** + +This will display arrows that start and begin at the same node as right angles, rather than a +curve + +Default value: false + +### showSequenceNumbers + +| Parameter | Description | Type | Required | Values | +| ------------------- | ------------------------------- | ------- | -------- | ----------- | +| showSequenceNumbers | This will show the node numbers | boolean | Required | true, false | + +**Notes:** Default value: false + +### actorFontSize + +| Parameter | Description | Type | Required | Values | +| ------------- | -------------------------------------------------- | ------- | -------- | ------------------ | +| actorFontSize | This sets the font size of the actor's description | Integer | Require | Any Positive Value | + +**Notes:** **Default value 14**.. + +### actorFontFamily + +| Parameter | Description | Type | Required | Values | +| --------------- | ---------------------------------------------------- | ------ | -------- | --------------------------- | +| actorFontFamily | This sets the font family of the actor's description | string | Required | Any Possible CSS FontFamily | + +**Notes:** Default value: "'Open Sans", sans-serif' + +### actorFontWeight + +This sets the font weight of the actor's description + +**Notes:** Default value: 400. + +### noteFontSize + +| Parameter | Description | Type | Required | Values | +| ------------ | ----------------------------------------------- | ------- | -------- | ------------------ | +| noteFontSize | This sets the font size of actor-attached notes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 14 + +### noteFontFamily + +| Parameter | Description | Type | Required | Values | +| -------------- | -------------------------------------------------- | ------ | -------- | --------------------------- | +| noteFontFamily | This sets the font family of actor-attached notes. | string | Required | Any Possible CSS FontFamily | + +**Notes:** Default value: ''"trebuchet ms", verdana, arial, sans-serif' + +### noteFontWeight + +This sets the font weight of the note's description + +**Notes:** Default value: 400 + +### noteAlign + +| Parameter | Description | Type | Required | Values | +| --------- | ---------------------------------------------------- | ------ | -------- | ------------------------- | +| noteAlign | This sets the text alignment of actor-attached notes | string | required | 'left', 'center', 'right' | + +**Notes:** Default value: 'center' + +### messageFontSize + +| Parameter | Description | Type | Required | Values | +| --------------- | ----------------------------------------- | ------- | -------- | ------------------- | +| messageFontSize | This sets the font size of actor messages | Integer | Required | Any Positive Number | + +**Notes:** Default value: 16 + +### messageFontFamily + +| Parameter | Description | Type | Required | Values | +| ----------------- | ------------------------------------------- | ------ | -------- | --------------------------- | +| messageFontFamily | This sets the font family of actor messages | string | Required | Any Possible CSS FontFamily | + +**Notes:** Default value: '"trebuchet ms", verdana, arial, sans-serif' + +### messageFontWeight + +This sets the font weight of the message's description + +**Notes:** Default value: 400. + +### wrap + +This sets the auto-wrap state for the diagram + +**Notes:** Default value: false. + +### wrapPadding + +This sets the auto-wrap padding for the diagram (sides only) + +**Notes:** Default value: 0. + +### labelBoxWidth + +This sets the width of the loop-box (loop, alt, opt, par) + +**Notes:** Default value: 50. + +### labelBoxHeight + +This sets the height of the loop-box (loop, alt, opt, par) + +**Notes:** Default value: 20. + +## gantt + +The object containing configurations specific for gantt diagrams + +### titleTopMargin + +### titleTopMargin + +| Parameter | Description | Type | Required | Values | +| -------------- | ---------------------------------------------- | ------- | -------- | ------------------ | +| titleTopMargin | Margin top for the text over the gantt diagram | Integer | Required | Any Positive Value | + +**Notes:** Default value: 25 + +### barHeight + +| Parameter | Description | Type | Required | Values | +| --------- | ----------------------------------- | ------- | -------- | ------------------ | +| barHeight | The height of the bars in the graph | Integer | Required | Any Positive Value | + +**Notes:** Default value: 20 + +### barGap + +| Parameter | Description | Type | Required | Values | +| --------- | ---------------------------------------------------------------- | ------- | -------- | ------------------ | +| barGap | The margin between the different activities in the gantt diagram | Integer | Optional | Any Positive Value | + +**Notes:** Default value: 4 + +### topPadding + +| Parameter | Description | Type | Required | Values | +| ---------- | -------------------------------------------------------------------------- | ------- | -------- | ------------------ | +| topPadding | Margin between title and gantt diagram and between axis and gantt diagram. | Integer | Required | Any Positive Value | + +**Notes:** Default value: 50 + +### rightPadding + +| Parameter | Description | Type | Required | Values | +| ------------ | ----------------------------------------------------------------------- | ------- | -------- | ------------------ | +| rightPadding | The space allocated for the section name to the right of the activities | Integer | Required | Any Positive Value | + +**Notes:** Default value: 75 + +### leftPadding + +| Parameter | Description | Type | Required | Values | +| ----------- | ---------------------------------------------------------------------- | ------- | -------- | ------------------ | +| leftPadding | The space allocated for the section name to the left of the activities | Integer | Required | Any Positive Value | + +**Notes:** Default value: 75 + +### gridLineStartPadding + +| Parameter | Description | Type | Required | Values | +| -------------------- | -------------------------------------------- | ------- | -------- | ------------------ | +| gridLineStartPadding | Vertical starting position of the grid lines | Integer | Required | Any Positive Value | + +**Notes:** Default value: 35 + +### fontSize + +| Parameter | Description | Type | Required | Values | +| --------- | ----------- | ------- | -------- | ------------------ | +| fontSize | Font size | Integer | Required | Any Positive Value | + +**Notes:** Default value: 11 + +### sectionFontSize + +| Parameter | Description | Type | Required | Values | +| --------------- | ---------------------- | ------- | -------- | ------------------ | +| sectionFontSize | Font size for sections | Integer | Required | Any Positive Value | + +**Notes:** Default value: 11 + +### numberSectionStyles + +| Parameter | Description | Type | Required | Values | +| ------------------- | ---------------------------------------- | ------- | -------- | ------------------ | +| numberSectionStyles | The number of alternating section styles | Integer | 4 | Any Positive Value | + +**Notes:** Default value: 4 + +### axisFormat + +| Parameter | Description | Type | Required | Values | +| ---------- | --------------------------- | ---- | -------- | ---------------- | +| axisFormat | Datetime format of the axis | 3 | Required | Date in yy-mm-dd | + +**Notes:** + +This might need adjustment to match your locale and preferences + +Default value: '%Y-%m-%d'. + +### useMaxWidth + +| Parameter | Description | Type | Required | Values | +| ----------- | ----------- | ------- | -------- | ----------- | +| useMaxWidth | See notes | boolean | 4 | true, false | + +**Notes:** + +When this flag is set the height and width is set to 100% and is then scaling with the +available space if not the absolute space required is used. + +Default value: true + +### topAxis + +| Parameter | Description | Type | Required | Values | +| --------- | ----------- | ------- | -------- | ----------- | +| topAxis | See notes | Boolean | 4 | True, False | + +**Notes:** when this flag is set date labels will be added to the top of the chart + +**Default value false**. + +## journey + +The object containing configurations specific for journey diagrams + +### diagramMarginX + +| Parameter | Description | Type | Required | Values | +| -------------- | ---------------------------------------------------- | ------- | -------- | ------------------ | +| diagramMarginX | Margin to the right and left of the sequence diagram | Integer | Required | Any Positive Value | + +**Notes:** Default value: 50 + +### diagramMarginY + +| Parameter | Description | Type | Required | Values | +| -------------- | -------------------------------------------------- | ------- | -------- | ------------------ | +| diagramMarginY | Margin to the over and under the sequence diagram. | Integer | Required | Any Positive Value | + +**Notes:** Default value: 10 + +### leftMargin + +| Parameter | Description | Type | Required | Values | +| ----------- | --------------------- | ------- | -------- | ------------------ | +| actorMargin | Margin between actors | Integer | Required | Any Positive Value | + +**Notes:** Default value: 50 + +### width + +| Parameter | Description | Type | Required | Values | +| --------- | -------------------- | ------- | -------- | ------------------ | +| width | Width of actor boxes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 150 + +### height + +| Parameter | Description | Type | Required | Values | +| --------- | --------------------- | ------- | -------- | ------------------ | +| height | Height of actor boxes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 65 + +### boxMargin + +| Parameter | Description | Type | Required | Values | +| --------- | ------------------------ | ------- | -------- | ------------------ | +| boxMargin | Margin around loop boxes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 10 + +### boxTextMargin + +| Parameter | Description | Type | Required | Values | +| ------------- | -------------------------------------------- | ------- | -------- | ------------------ | +| boxTextMargin | Margin around the text in loop/alt/opt boxes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 5 + +### noteMargin + +| Parameter | Description | Type | Required | Values | +| ---------- | ------------------- | ------- | -------- | ------------------ | +| noteMargin | Margin around notes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 10 + +### messageMargin + +| Parameter | Description | Type | Required | Values | +| ------------- | ----------------------- | ------- | -------- | ------------------ | +| messageMargin | Space between messages. | Integer | Required | Any Positive Value | + +**Notes:** + +Space between messages. + +Default value: 35 + +### messageAlign + +| Parameter | Description | Type | Required | Values | +| ------------ | --------------------------- | ---- | -------- | ------------------------- | +| messageAlign | Multiline message alignment | 3 | 4 | 'left', 'center', 'right' | + +**Notes:** Default value: 'center' + +### bottomMarginAdj + +| Parameter | Description | Type | Required | Values | +| --------------- | ------------------------------------------ | ------- | -------- | ------------------ | +| bottomMarginAdj | Prolongs the edge of the diagram downwards | Integer | 4 | Any Positive Value | + +**Notes:** + +Depending on css styling this might need adjustment. + +Default value: 1 + +### useMaxWidth + +| Parameter | Description | Type | Required | Values | +| ----------- | ----------- | ------- | -------- | ----------- | +| useMaxWidth | See notes | boolean | 4 | true, false | + +**Notes:** + +When this flag is set the height and width is set to 100% and is then scaling with the +available space if not the absolute space required is used. + +Default value: true + +### rightAngles + +| Parameter | Description | Type | Required | Values | +| ----------- | --------------------------------- | ---- | -------- | ----------- | +| rightAngles | Curved Arrows become Right Angles | 3 | 4 | true, false | + +**Notes:** + +This will display arrows that start and begin at the same node as right angles, rather than a +curves + +Default value: false + +## timeline + +The object containing configurations specific for timeline diagrams + +### diagramMarginX + +| Parameter | Description | Type | Required | Values | +| -------------- | ---------------------------------------------------- | ------- | -------- | ------------------ | +| diagramMarginX | Margin to the right and left of the sequence diagram | Integer | Required | Any Positive Value | + +**Notes:** Default value: 50 + +### diagramMarginY + +| Parameter | Description | Type | Required | Values | +| -------------- | -------------------------------------------------- | ------- | -------- | ------------------ | +| diagramMarginY | Margin to the over and under the sequence diagram. | Integer | Required | Any Positive Value | + +**Notes:** Default value: 10 + +### leftMargin + +| Parameter | Description | Type | Required | Values | +| ----------- | --------------------- | ------- | -------- | ------------------ | +| actorMargin | Margin between actors | Integer | Required | Any Positive Value | + +**Notes:** Default value: 50 + +### width + +| Parameter | Description | Type | Required | Values | +| --------- | -------------------- | ------- | -------- | ------------------ | +| width | Width of actor boxes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 150 + +### height + +| Parameter | Description | Type | Required | Values | +| --------- | --------------------- | ------- | -------- | ------------------ | +| height | Height of actor boxes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 65 + +### boxMargin + +| Parameter | Description | Type | Required | Values | +| --------- | ------------------------ | ------- | -------- | ------------------ | +| boxMargin | Margin around loop boxes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 10 + +### boxTextMargin + +| Parameter | Description | Type | Required | Values | +| ------------- | -------------------------------------------- | ------- | -------- | ------------------ | +| boxTextMargin | Margin around the text in loop/alt/opt boxes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 5 + +### noteMargin + +| Parameter | Description | Type | Required | Values | +| ---------- | ------------------- | ------- | -------- | ------------------ | +| noteMargin | Margin around notes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 10 + +### messageMargin + +| Parameter | Description | Type | Required | Values | +| ------------- | ----------------------- | ------- | -------- | ------------------ | +| messageMargin | Space between messages. | Integer | Required | Any Positive Value | + +**Notes:** + +Space between messages. + +Default value: 35 + +### messageAlign + +| Parameter | Description | Type | Required | Values | +| ------------ | --------------------------- | ---- | -------- | ------------------------- | +| messageAlign | Multiline message alignment | 3 | 4 | 'left', 'center', 'right' | + +**Notes:** Default value: 'center' + +### bottomMarginAdj + +| Parameter | Description | Type | Required | Values | +| --------------- | ------------------------------------------ | ------- | -------- | ------------------ | +| bottomMarginAdj | Prolongs the edge of the diagram downwards | Integer | 4 | Any Positive Value | + +**Notes:** + +Depending on css styling this might need adjustment. + +Default value: 1 + +### useMaxWidth + +| Parameter | Description | Type | Required | Values | +| ----------- | ----------- | ------- | -------- | ----------- | +| useMaxWidth | See notes | boolean | 4 | true, false | + +**Notes:** + +When this flag is set the height and width is set to 100% and is then scaling with the +available space if not the absolute space required is used. + +Default value: true + +### rightAngles + +| Parameter | Description | Type | Required | Values | +| ----------- | --------------------------------- | ---- | -------- | ----------- | +| rightAngles | Curved Arrows become Right Angles | 3 | 4 | true, false | + +**Notes:** + +This will display arrows that start and begin at the same node as right angles, rather than a +curves + +Default value: false + +## useMaxWidth + +| Parameter | Description | Type | Required | Values | +| ----------- | ----------- | ------- | -------- | ----------- | +| useMaxWidth | See notes | boolean | 4 | true, false | + +**Notes:** + +When this flag is set the height and width is set to 100% and is then scaling with the +available space if not the absolute space required is used. + +Default value: true + +## defaultRenderer + +| Parameter | Description | Type | Required | Values | +| --------------- | ----------- | ------- | -------- | ----------------------- | +| defaultRenderer | See notes | boolean | 4 | dagre-d3, dagre-wrapper | + +**Notes**: + +Decides which rendering engine that is to be used for the rendering. Legal values are: +dagre-d3 dagre-wrapper - wrapper for dagre implemented in mermaid + +Default value: 'dagre-d3' + +## useMaxWidth + +| Parameter | Description | Type | Required | Values | +| ----------- | ----------- | ------- | -------- | ----------- | +| useMaxWidth | See notes | boolean | 4 | true, false | + +**Notes:** + +When this flag is set the height and width is set to 100% and is then scaling with the +available space if not the absolute space required is used. + +Default value: true + +## defaultRenderer + +| Parameter | Description | Type | Required | Values | +| --------------- | ----------- | ------- | -------- | ----------------------- | +| defaultRenderer | See notes | boolean | 4 | dagre-d3, dagre-wrapper | + +**Notes:** + +Decides which rendering engine that is to be used for the rendering. Legal values are: +dagre-d3 dagre-wrapper - wrapper for dagre implemented in mermaid + +Default value: 'dagre-d3' + +## er + +The object containing configurations specific for entity relationship diagrams + +### diagramPadding + +| Parameter | Description | Type | Required | Values | +| -------------- | ----------------------------------------------- | ------- | -------- | ------------------ | +| diagramPadding | Amount of padding around the diagram as a whole | Integer | Required | Any Positive Value | + +**Notes:** + +The amount of padding around the diagram as a whole so that embedded diagrams have margins, +expressed in pixels + +Default value: 20 + +### layoutDirection + +| Parameter | Description | Type | Required | Values | +| --------------- | ---------------------------------------- | ------ | -------- | ---------------------- | +| layoutDirection | Directional bias for layout of entities. | string | Required | "TB", "BT", "LR", "RL" | + +**Notes:** + +'TB' for Top-Bottom, 'BT'for Bottom-Top, 'LR' for Left-Right, or 'RL' for Right to Left. + +T = top, B = bottom, L = left, and R = right. + +Default value: 'TB' + +### minEntityWidth + +| Parameter | Description | Type | Required | Values | +| -------------- | ---------------------------------- | ------- | -------- | ------------------ | +| minEntityWidth | The minimum width of an entity box | Integer | Required | Any Positive Value | + +**Notes:** Expressed in pixels. Default value: 100 + +### minEntityHeight + +| Parameter | Description | Type | Required | Values | +| --------------- | ----------------------------------- | ------- | -------- | ------------------ | +| minEntityHeight | The minimum height of an entity box | Integer | 4 | Any Positive Value | + +**Notes:** Expressed in pixels Default value: 75 + +### entityPadding + +| Parameter | Description | Type | Required | Values | +| ------------- | ------------------------------------------------------------ | ------- | -------- | ------------------ | +| entityPadding | Minimum internal padding between text in box and box borders | Integer | 4 | Any Positive Value | + +**Notes:** + +The minimum internal padding between text in an entity box and the enclosing box borders, +expressed in pixels. + +Default value: 15 + +### stroke + +| Parameter | Description | Type | Required | Values | +| --------- | ----------------------------------- | ------ | -------- | -------------------- | +| stroke | Stroke color of box edges and lines | string | 4 | Any recognized color | + +**Notes:** Default value: 'gray' + +### fill + +| Parameter | Description | Type | Required | Values | +| --------- | -------------------------- | ------ | -------- | -------------------- | +| fill | Fill color of entity boxes | string | 4 | Any recognized color | + +**Notes:** Default value: 'honeydew' + +### fontSize + +| Parameter | Description | Type | Required | Values | +| --------- | ------------------- | ------- | -------- | ------------------ | +| fontSize | Font Size in pixels | Integer | | Any Positive Value | + +**Notes:** + +Font size (expressed as an integer representing a number of pixels) Default value: 12 + +### useMaxWidth + +| Parameter | Description | Type | Required | Values | +| ----------- | ----------- | ------- | -------- | ----------- | +| useMaxWidth | See Notes | boolean | Required | true, false | + +**Notes:** + +When this flag is set to true, the diagram width is locked to 100% and scaled based on +available space. If set to false, the diagram reserves its absolute width. + +Default value: true + +## pie + +The object containing configurations specific for pie diagrams + +### useMaxWidth + +| Parameter | Description | Type | Required | Values | +| ----------- | ----------- | ------- | -------- | ----------- | +| useMaxWidth | See Notes | boolean | Required | true, false | + +**Notes:** + +When this flag is set to true, the diagram width is locked to 100% and scaled based on +available space. If set to false, the diagram reserves its absolute width. + +Default value: true + +## requirement + +The object containing configurations specific for req diagrams + +### useMaxWidth + +| Parameter | Description | Type | Required | Values | +| ----------- | ----------- | ------- | -------- | ----------- | +| useMaxWidth | See Notes | boolean | Required | true, false | + +**Notes:** + +When this flag is set to true, the diagram width is locked to 100% and scaled based on +available space. If set to false, the diagram reserves its absolute width. + +Default value: true + +## c4 + +The object containing configurations specific for c4 diagrams + +### diagramMarginX + +| Parameter | Description | Type | Required | Values | +| -------------- | ---------------------------------------------- | ------- | -------- | ------------------ | +| diagramMarginX | Margin to the right and left of the c4 diagram | Integer | Required | Any Positive Value | + +**Notes:** Default value: 50 + +### diagramMarginY + +| Parameter | Description | Type | Required | Values | +| -------------- | ------------------------------------------- | ------- | -------- | ------------------ | +| diagramMarginY | Margin to the over and under the c4 diagram | Integer | Required | Any Positive Value | + +**Notes:** Default value: 10 + +### c4ShapeMargin + +| Parameter | Description | Type | Required | Values | +| ------------- | --------------------- | ------- | -------- | ------------------ | +| c4ShapeMargin | Margin between shapes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 50 + +### c4ShapePadding + +| Parameter | Description | Type | Required | Values | +| -------------- | ---------------------- | ------- | -------- | ------------------ | +| c4ShapePadding | Padding between shapes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 20 + +### width + +| Parameter | Description | Type | Required | Values | +| --------- | --------------------- | ------- | -------- | ------------------ | +| width | Width of person boxes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 216 + +### height + +| Parameter | Description | Type | Required | Values | +| --------- | ---------------------- | ------- | -------- | ------------------ | +| height | Height of person boxes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 60 + +### boxMargin + +| Parameter | Description | Type | Required | Values | +| --------- | ------------------- | ------- | -------- | ------------------ | +| boxMargin | Margin around boxes | Integer | Required | Any Positive Value | + +**Notes:** Default value: 10 + +### useMaxWidth + +| Parameter | Description | Type | Required | Values | +| ----------- | ----------- | ------- | -------- | ----------- | +| useMaxWidth | See Notes | boolean | Required | true, false | + +**Notes:** When this flag is set to true, the height and width is set to 100% and is then +scaling with the available space. If set to false, the absolute space required is used. + +Default value: true + +### c4ShapeInRow + +| Parameter | Description | Type | Required | Values | +| ------------ | ----------- | ------- | -------- | ------------------ | +| c4ShapeInRow | See Notes | Integer | Required | Any Positive Value | + +**Notes:** How many shapes to place in each row. + +Default value: 4 + +### c4BoundaryInRow + +| Parameter | Description | Type | Required | Values | +| --------------- | ----------- | ------- | -------- | ------------------ | +| c4BoundaryInRow | See Notes | Integer | Required | Any Positive Value | + +**Notes:** How many boundarys to place in each row. + +Default value: 2 + +### personFontSize + +This sets the font size of Person shape for the diagram + +**Notes:** Default value: 14. + +### personFontFamily + +This sets the font family of Person shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### personFontWeight + +This sets the font weight of Person shape for the diagram + +**Notes:** Default value: normal. + +### external_personFontSize + +This sets the font size of External Person shape for the diagram + +**Notes:** Default value: 14. + +### external_personFontFamily + +This sets the font family of External Person shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### external_personFontWeight + +This sets the font weight of External Person shape for the diagram + +**Notes:** Default value: normal. + +### systemFontSize + +This sets the font size of System shape for the diagram + +**Notes:** Default value: 14. + +### systemFontFamily + +This sets the font family of System shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### systemFontWeight + +This sets the font weight of System shape for the diagram + +**Notes:** Default value: normal. + +### external_systemFontSize + +This sets the font size of External System shape for the diagram + +**Notes:** Default value: 14. + +### external_systemFontFamily + +This sets the font family of External System shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### external_systemFontWeight + +This sets the font weight of External System shape for the diagram + +**Notes:** Default value: normal. + +### system_dbFontSize + +This sets the font size of System DB shape for the diagram + +**Notes:** Default value: 14. + +### system_dbFontFamily + +This sets the font family of System DB shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### system_dbFontWeight + +This sets the font weight of System DB shape for the diagram + +**Notes:** Default value: normal. + +### external_system_dbFontSize + +This sets the font size of External System DB shape for the diagram + +**Notes:** Default value: 14. + +### external_system_dbFontFamily + +This sets the font family of External System DB shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### external_system_dbFontWeight + +This sets the font weight of External System DB shape for the diagram + +**Notes:** Default value: normal. + +### system_queueFontSize + +This sets the font size of System Queue shape for the diagram + +**Notes:** Default value: 14. + +### system_queueFontFamily + +This sets the font family of System Queue shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### system_queueFontWeight + +This sets the font weight of System Queue shape for the diagram + +**Notes:** Default value: normal. + +### external_system_queueFontSize + +This sets the font size of External System Queue shape for the diagram + +**Notes:** Default value: 14. + +### external_system_queueFontFamily + +This sets the font family of External System Queue shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### external_system_queueFontWeight + +This sets the font weight of External System Queue shape for the diagram + +**Notes:** Default value: normal. + +### boundaryFontSize + +This sets the font size of Boundary shape for the diagram + +**Notes:** Default value: 14. + +### boundaryFontFamily + +This sets the font family of Boundary shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### boundaryFontWeight + +This sets the font weight of Boundary shape for the diagram + +**Notes:** Default value: normal. + +### messageFontSize + +This sets the font size of Message shape for the diagram + +**Notes:** Default value: 12. + +### messageFontFamily + +This sets the font family of Message shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### messageFontWeight + +This sets the font weight of Message shape for the diagram + +**Notes:** Default value: normal. + +### containerFontSize + +This sets the font size of Container shape for the diagram + +**Notes:** Default value: 14. + +### containerFontFamily + +This sets the font family of Container shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### containerFontWeight + +This sets the font weight of Container shape for the diagram + +**Notes:** Default value: normal. + +### external_containerFontSize + +This sets the font size of External Container shape for the diagram + +**Notes:** Default value: 14. + +### external_containerFontFamily + +This sets the font family of External Container shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### external_containerFontWeight + +This sets the font weight of External Container shape for the diagram + +**Notes:** Default value: normal. + +### container_dbFontSize + +This sets the font size of Container DB shape for the diagram + +**Notes:** Default value: 14. + +### container_dbFontFamily + +This sets the font family of Container DB shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### container_dbFontWeight + +This sets the font weight of Container DB shape for the diagram + +**Notes:** Default value: normal. + +### external_container_dbFontSize + +This sets the font size of External Container DB shape for the diagram + +**Notes:** Default value: 14. + +### external_container_dbFontFamily + +This sets the font family of External Container DB shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### external_container_dbFontWeight + +This sets the font weight of External Container DB shape for the diagram + +**Notes:** Default value: normal. + +### container_queueFontSize + +This sets the font size of Container Queue shape for the diagram + +**Notes:** Default value: 14. + +### container_queueFontFamily + +This sets the font family of Container Queue shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### container_queueFontWeight + +This sets the font weight of Container Queue shape for the diagram + +**Notes:** Default value: normal. + +### external_container_queueFontSize + +This sets the font size of External Container Queue shape for the diagram + +**Notes:** Default value: 14. + +### external_container_queueFontFamily + +This sets the font family of External Container Queue shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### external_container_queueFontWeight + +This sets the font weight of External Container Queue shape for the diagram + +**Notes:** Default value: normal. + +### componentFontSize + +This sets the font size of Component shape for the diagram + +**Notes:** Default value: 14. + +### componentFontFamily + +This sets the font family of Component shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### componentFontWeight + +This sets the font weight of Component shape for the diagram + +**Notes:** Default value: normal. + +### external_componentFontSize + +This sets the font size of External Component shape for the diagram + +**Notes:** Default value: 14. + +### external_componentFontFamily + +This sets the font family of External Component shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### external_componentFontWeight + +This sets the font weight of External Component shape for the diagram + +**Notes:** Default value: normal. + +### component_dbFontSize + +This sets the font size of Component DB shape for the diagram + +**Notes:** Default value: 14. + +### component_dbFontFamily + +This sets the font family of Component DB shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### component_dbFontWeight + +This sets the font weight of Component DB shape for the diagram + +**Notes:** Default value: normal. + +### external_component_dbFontSize + +This sets the font size of External Component DB shape for the diagram + +**Notes:** Default value: 14. + +### external_component_dbFontFamily + +This sets the font family of External Component DB shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### external_component_dbFontWeight + +This sets the font weight of External Component DB shape for the diagram + +**Notes:** Default value: normal. + +### component_queueFontSize + +This sets the font size of Component Queue shape for the diagram + +**Notes:** Default value: 14. + +### component_queueFontFamily + +This sets the font family of Component Queue shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### component_queueFontWeight + +This sets the font weight of Component Queue shape for the diagram + +**Notes:** Default value: normal. + +### external_component_queueFontSize + +This sets the font size of External Component Queue shape for the diagram + +**Notes:** Default value: 14. + +### external_component_queueFontFamily + +This sets the font family of External Component Queue shape for the diagram + +**Notes:** Default value: "Open Sans", sans-serif. + +### external_component_queueFontWeight + +This sets the font weight of External Component Queue shape for the diagram + +**Notes:** Default value: normal. + +### wrap + +This sets the auto-wrap state for the diagram + +**Notes:** Default value: true. + +### wrapPadding + +This sets the auto-wrap padding for the diagram (sides only) + +**Notes:** Default value: 0. + +## parse + +### Parameters + +- `text` **[string][4]** +- `parseError` **[Function][5]?** + +Returns **[boolean][6]** + +## setSiteConfig + +## setSiteConfig + +| Function | Description | Type | Values | +| ------------- | ------------------------------------- | ----------- | --------------------------------------- | +| setSiteConfig | Sets the siteConfig to desired values | Put Request | Any Values, except ones in secure array | + +**Notes:** Sets the siteConfig. The siteConfig is a protected configuration for repeat use. Calls +to reset() will reset the currentConfig to siteConfig. Calls to reset(configApi.defaultConfig) +will reset siteConfig and currentConfig to the defaultConfig Note: currentConfig is set in this +function _Default value: At default, will mirror Global Config_ + +### Parameters + +- `conf` **MermaidConfig** The base currentConfig to use as siteConfig + +Returns **[object][7]** The siteConfig + +## getSiteConfig + +## getSiteConfig + +| Function | Description | Type | Values | +| ------------- | ------------------------------------------------- | ----------- | -------------------------------- | +| setSiteConfig | Returns the current siteConfig base configuration | Get Request | Returns Any Values in siteConfig | + +**Notes**: Returns **any** values in siteConfig. + +Returns **[object][7]** The siteConfig + +## setConfig + +## setConfig + +| Function | Description | Type | Values | +| ------------- | ------------------------------------- | ----------- | --------------------------------------- | +| setSiteConfig | Sets the siteConfig to desired values | Put Request | Any Values, except ones in secure array | + +**Notes**: Sets the currentConfig. The parameter conf is sanitized based on the siteConfig.secure +keys. Any values found in conf with key found in siteConfig.secure will be replaced with the +corresponding siteConfig value. + +### Parameters + +- `conf` **any** The potential currentConfig + +Returns **any** The currentConfig merged with the sanitized conf + +## render + +Function that renders an svg with a graph from a chart definition. Usage example below. + +```javascript +mermaidAPI.initialize({ + startOnLoad: true, +}); +$(function () { + const graphDefinition = 'graph TB\na-->b'; + const cb = function (svgGraph) { + console.log(svgGraph); + }; + mermaidAPI.render('id1', graphDefinition, cb); +}); +``` + +### Parameters + +- `id` **[string][4]** The id of the element to be rendered +- `text` **[string][4]** The graph definition +- `cb` **function (svgCode: [string][4], bindFunctions: function (element: [Element][8]): void): void** +- `container` **[Element][8]** Selector to element in which a div with the graph temporarily will be + inserted. If one is provided a hidden div will be inserted in the body of the page instead. The + element will be removed when rendering is completed. + +Returns **void** + +## getConfig + +## getConfig + +| Function | Description | Type | Return Values | +| --------- | ------------------------- | ----------- | ------------------------------ | +| getConfig | Obtains the currentConfig | Get Request | Any Values from current Config | + +**Notes**: Returns **any** the currentConfig + +Returns **any** The currentConfig + +## sanitize + +## sanitize + +| Function | Description | Type | Values | +| -------- | -------------------------------------- | ----------- | ------ | +| sanitize | Sets the siteConfig to desired values. | Put Request | None | + +Ensures options parameter does not attempt to override siteConfig secure keys **Notes**: modifies +options in-place + +### Parameters + +- `options` **any** The potential setConfig parameter + +## addDirective + +Pushes in a directive to the configuration + +### Parameters + +- `directive` **[object][7]** The directive to push in + +## reset + +## reset + +| Function | Description | Type | Required | Values | +| -------- | ---------------------------- | ----------- | -------- | ------ | +| reset | Resets currentConfig to conf | Put Request | Required | None | + +## conf + +| Parameter | Description | Type | Required | Values | +| --------- | -------------------------------------------------------------- | ---------- | -------- | -------------------------------------------- | +| conf | base set of values, which currentConfig could be **reset** to. | Dictionary | Required | Any Values, with respect to the secure Array | + +**Notes**: (default: current siteConfig ) (optional, default `getSiteConfig()`) + +### Parameters + +- `config` (optional, default `siteConfig`) + +Returns **void** + +## initialize + +### Parameters + +- `options` **MermaidConfig** + +## + +## mermaidAPI configuration defaults + +```html + +``` + +[1]: Setup.md?id=render +[2]: 8.6.0_docs.md +[3]: #mermaidapi-configuration-defaults +[4]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String +[5]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function +[6]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean +[7]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object +[8]: https://developer.mozilla.org/docs/Web/API/Element diff --git a/cypress/platform/ashish2.html b/cypress/platform/ashish2.html new file mode 100644 index 000000000..e10ea6a2d --- /dev/null +++ b/cypress/platform/ashish2.html @@ -0,0 +1,162 @@ + + + + + + + + + + +
Security check
+
+flowchart TD
+    A --> B
+    B --> C
+    A --> C
+    
+
+classDiagram
+        direction LR
+        class Student {
+          -idCard : IdCard
+        }
+        class IdCard{
+          -id : int
+          -name : string
+        }
+        class Bike{
+          -id : int
+          -name : string
+        }
+        Student "1" --o "1" IdCard : carries
+        Student "1" --o "1" Bike : rides
+    
+
+ timeline
+        title History of Social Media Platform
+          2002 : LinkedIn
+          2004 : Facebook : Google
+          2005 : Youtube
+          2006 : Twitter
+          2007 : Tumblr
+          2008s : Instagram
+          2010 : Pinterest
+    
+
+mindmap
+  root
+    child1((Circle))
+        grandchild 1
+        grandchild 2
+    child2(Round rectangle)
+        grandchild 3
+        grandchild 4
+    child3[Square]
+        grandchild 5
+        ::icon(mdi mdi-fire)
+        gc6((grand
child 6)) + ::icon(mdi mdi-fire) + gc7((grand
grand
child 8)) +
+
+      gantt
+        title Style today marker (vertical line should be 5px wide and half-transparent blue)
+        dateFormat YYYY-MM-DD
+        axisFormat %d
+        todayMarker stroke-width:5px,stroke:#00f,opacity:0.5
+        section Section1
+        Today: 1, -1h
+    
+ + + + + + + + diff --git a/cypress/platform/class.html b/cypress/platform/class.html index 85fae2a77..1d72c34a5 100644 --- a/cypress/platform/class.html +++ b/cypress/platform/class.html @@ -46,13 +46,9 @@
       %%{init: {'theme': 'base',  'fontFamily': 'courier', 'themeVariables': {  'primaryColor': '#fff000'}}}%%
       classDiagram-v2
-       class BankAccount{
-        +String owner
-        +BigDecimal balance
-        +deposit(amount) bool
-        +withdrawl(amount) int
-       }
-       cssClass "BankAccount" customCss
+classA <|-- classB : implements
+classC *-- classD : composition
+classE o-- classF : aggregation
     
         %%{init: {'theme': 'base',  'fontFamily': 'courier', 'themeVariables': {  'primaryColor': '#fff000'}}}%%
diff --git a/demos/timeline.html b/demos/timeline.html
new file mode 100644
index 000000000..f90f37675
--- /dev/null
+++ b/demos/timeline.html
@@ -0,0 +1,38 @@
+
+
+  
+    
+    
+    Mermaid Quick Test Page
+    
+    
+  
+
+  
+    
+        timeline
+        title My day
+        section Go to work
+          1930 : first step : second step
+               : third step
+          1940 : fourth step : fifth step
+				
+ + + + + diff --git a/packages/mermaid-example-diagram/src/mermaidUtils.ts b/packages/mermaid-example-diagram/src/mermaidUtils.ts index 8894abdff..698203f19 100644 --- a/packages/mermaid-example-diagram/src/mermaidUtils.ts +++ b/packages/mermaid-example-diagram/src/mermaidUtils.ts @@ -22,6 +22,7 @@ export const log: Record = { export let setLogLevel: (level: keyof typeof LEVELS | number | string) => void; export let getConfig: () => object; export let sanitizeText: (str: string) => string; +export let commonDb: any; /** * Placeholder for the real function that will be injected by mermaid. */ @@ -41,15 +42,17 @@ export let setupGraphViewbox: ( * @param _getConfig - getConfig from mermaid/src/diagramAPI.ts * @param _sanitizeText - sanitizeText from mermaid/src/diagramAPI.ts * @param _setupGraphViewbox - setupGraphViewbox from mermaid/src/diagramAPI.ts + * @param _commonDb */ export const injectUtils = ( _log: Record, _setLogLevel: typeof setLogLevel, _getConfig: typeof getConfig, _sanitizeText: typeof sanitizeText, - _setupGraphViewbox: typeof setupGraphViewbox + _setupGraphViewbox: typeof setupGraphViewbox, + _commonDb: any ) => { - _log.debug('Mermaid utils injected into example-diagram'); + _log.info('Mermaid utils injected into timeline-diagram'); log.trace = _log.trace; log.debug = _log.debug; log.info = _log.info; @@ -60,4 +63,6 @@ export const injectUtils = ( getConfig = _getConfig; sanitizeText = _sanitizeText; setupGraphViewbox = _setupGraphViewbox; + commonDb = _commonDb; + }; diff --git a/packages/mermaid-mindmap/src/mermaidUtils.ts b/packages/mermaid-mindmap/src/mermaidUtils.ts index 7d8ac38bf..4834b936d 100644 --- a/packages/mermaid-mindmap/src/mermaidUtils.ts +++ b/packages/mermaid-mindmap/src/mermaidUtils.ts @@ -26,6 +26,7 @@ export const log: Record = { export let setLogLevel: (level: keyof typeof LEVELS | number | string) => void; export let getConfig: () => object; export let sanitizeText: (str: string) => string; +export let commonDb: () => object; // eslint-disable @typescript-eslint/no-explicit-any export let setupGraphViewbox: ( graph: any, @@ -39,7 +40,8 @@ export const injectUtils = ( _setLogLevel: any, _getConfig: any, _sanitizeText: any, - _setupGraphViewbox: any + _setupGraphViewbox: any, + _commonDb: any ) => { _log.info('Mermaid utils injected'); log.trace = _log.trace; @@ -52,4 +54,5 @@ export const injectUtils = ( getConfig = _getConfig; sanitizeText = _sanitizeText; setupGraphViewbox = _setupGraphViewbox; + commonDb= _commonDb; }; diff --git a/packages/mermaid-mindmap/src/mindmapRenderer.js b/packages/mermaid-mindmap/src/mindmapRenderer.js index 9fd557e51..17f2d0097 100644 --- a/packages/mermaid-mindmap/src/mindmapRenderer.js +++ b/packages/mermaid-mindmap/src/mindmapRenderer.js @@ -11,7 +11,7 @@ cytoscape.use(coseBilkent); /** * @param {any} svg The svg element to draw the diagram onto - * @param {object} mindmap The mindmap data and hierarchy + * @param {object} mindmap The maindmap data and hierarchy * @param section * @param {object} conf The configuration object */ @@ -89,6 +89,7 @@ function addNodes(mindmap, cy, conf, level) { /** * @param node * @param conf + * @param cy */ function layoutMindmap(node, conf) { return new Promise((resolve) => { @@ -109,7 +110,7 @@ function layoutMindmap(node, conf) { renderEl.remove(); addNodes(node, cy, conf, 0); - // Make cytoscape care about the dimensions of the nodes + // Make cytoscape care about the dimensisions of the nodes cy.nodes().forEach(function (n) { n.layoutDimensions = () => { const data = n.data(); @@ -131,7 +132,10 @@ function layoutMindmap(node, conf) { }); } /** + * @param node * @param cy + * @param positionedMindmap + * @param conf */ function positionNodes(cy) { cy.nodes().map((node, id) => { @@ -169,7 +173,7 @@ export const draw = async (text, id, version, diagObj) => { log.debug('Renering info diagram\n' + text); const securityLevel = getConfig().securityLevel; - // Handle root and Document for when rendering in sandbox mode + // Handle root and Document for when rendering in sanbox mode let sandboxElement; if (securityLevel === 'sandbox') { sandboxElement = select('#i' + id); diff --git a/packages/mermaid-timeline/package.json b/packages/mermaid-timeline/package.json new file mode 100644 index 000000000..0c2ebf136 --- /dev/null +++ b/packages/mermaid-timeline/package.json @@ -0,0 +1,69 @@ +{ + "name": "@mermaid-js/mermaid-timeline", + "version": "9.2.0-rc2", + "description": "Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.", + "main": "dist/mermaid-timeline.core.mjs", + "module": "dist/mermaid-timeline.core.mjs", + "type": "module", + "exports": { + ".": { + "require": "./dist/mermaid-timeline.min.js", + "import": "./dist/mermaid-timeline.core.mjs" + }, + "./*": "./*" + }, + "keywords": [ + "diagram", + "markdown", + "timeline", + "mermaid" + ], + "scripts": { + "clean": "rimraf dist", + "build:types": "tsc -p ./tsconfig.json --emitDeclarationOnly", + "build:watch": "yarn build:code --watch", + "build:esbuild": "concurrently \"yarn build:code\" \"yarn build:types\"", + "build": "yarn clean; yarn build:esbuild", + "dev": "node .esbuild/serve.cjs", + "release": "yarn build", + "lint": "eslint --cache --ignore-path .gitignore . && yarn lint:jison && prettier --check .", + "lint:fix": "eslint --fix --ignore-path .gitignore . && prettier --write .", + "lint:jison": "ts-node-esm src/jison/lint.mts", + "todo-prepare": "concurrently \"husky install ../../.husky\" \"yarn build\"", + "todo-pre-commit": "lint-staged" + }, + "repository": { + "type": "git", + "url": "https://github.com/mermaid-js/mermaid" + }, + "author": "Knut Sveidqvist", + "license": "MIT", + "standard": { + "ignore": [ + "**/parser/*.js", + "dist/**/*.js", + "cypress/**/*.js" + ], + "globals": [ + "page" + ] + }, + "dependencies": { + "d3": "^7.0.0", + "khroma": "^2.0.0" + }, + "devDependencies": { + "concurrently": "^7.4.0", + "rimraf": "^3.0.2" + }, + "resolutions": { + "d3": "^7.0.0" + }, + "files": [ + "dist" + ], + "sideEffects": [ + "**/*.css", + "**/*.scss" + ] +} \ No newline at end of file diff --git a/packages/mermaid-timeline/src/detector.ts b/packages/mermaid-timeline/src/detector.ts new file mode 100644 index 000000000..411fe48d6 --- /dev/null +++ b/packages/mermaid-timeline/src/detector.ts @@ -0,0 +1,20 @@ +import type { ExternalDiagramDefinition } from 'mermaid'; + +const id = 'timeline'; + +const detector = (txt: string) => { + return txt.match(/^\s*timeline/) !== null; +}; + +const loader = async () => { + const { diagram } = await import('./diagram-definition'); + return { id, diagram }; +}; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid-timeline/src/diagram-definition.ts b/packages/mermaid-timeline/src/diagram-definition.ts new file mode 100644 index 000000000..9f18f261d --- /dev/null +++ b/packages/mermaid-timeline/src/diagram-definition.ts @@ -0,0 +1,14 @@ +// @ts-ignore: TODO Fix ts errors +import parser from './parser/timeline.jison'; +import * as db from './timelineDb'; +import renderer from './timelineRenderer'; +import styles from './styles'; +import { injectUtils } from './mermaidUtils'; + +export const diagram = { + db, + renderer, + parser, + styles, + injectUtils, +}; diff --git a/packages/mermaid-timeline/src/mermaidUtils.ts b/packages/mermaid-timeline/src/mermaidUtils.ts new file mode 100644 index 000000000..7dc3732a8 --- /dev/null +++ b/packages/mermaid-timeline/src/mermaidUtils.ts @@ -0,0 +1,70 @@ +const warning = () => null; +let localCommonDb = {}; + +export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal'; + +export const LEVELS: Record = { + trace: 0, + debug: 1, + info: 2, + warn: 3, + error: 4, + fatal: 5, +}; + +export const log: Record = { + trace: warning, + debug: warning, + info: warning, + warn: warning, + error: warning, + fatal: warning, +}; +export let setLogLevel: (level: keyof typeof LEVELS | number | string) => void; +export let getConfig: () => object; +export let sanitizeText: (str: string) => string; +export const getCommonDb=() => localCommonDb; +/** + * Placeholder for the real function that will be injected by mermaid. + */ +// eslint-disable @typescript-eslint/no-explicit-any +export let setupGraphViewbox: ( + graph: any, + svgElem: any, + padding: any, + useMaxWidth: boolean +) => void; + + + +/** + * Function called by mermaid that injects utility functions that help the diagram to be a good citizen. + * @param _log + * @param _setLogLevel + * @param _getConfig + * @param _sanitizeText + * @param _setupGraphViewbox + * @param _commonDb + */ +export const injectUtils = ( + _log: Record, + _setLogLevel: any, + _getConfig: any, + _sanitizeText: any, + _setupGraphViewbox: any, + _commonDb: any +) => { + _log.info('Mermaid utils injected into timeline-diagram'); + log.trace = _log.trace; + log.debug = _log.debug; + log.info = _log.info; + log.warn = _log.warn; + log.error = _log.error; + log.fatal = _log.fatal; + setLogLevel = _setLogLevel; + getConfig = _getConfig; + sanitizeText = _sanitizeText; + setupGraphViewbox = _setupGraphViewbox; + localCommonDb = _commonDb; + +}; diff --git a/packages/mermaid-timeline/src/parser/timeline.jison b/packages/mermaid-timeline/src/parser/timeline.jison new file mode 100644 index 000000000..4f8ac5cbc --- /dev/null +++ b/packages/mermaid-timeline/src/parser/timeline.jison @@ -0,0 +1,106 @@ +/** mermaid + * https://mermaidjs.github.io/ + * (c) 2015 Knut Sveidqvist + * MIT license. + */ +%lex +%options case-insensitive +%x acc_title +%x acc_descr +%x acc_descr_multiline + +// Directive states +%x open_directive type_directive arg_directive + + +%% + +\%\%\{ { this.begin('open_directive'); return 'open_directive'; } +((?:(?!\}\%\%)[^:.])*) { this.begin('type_directive'); return 'type_directive'; } +":" { this.popState(); this.begin('arg_directive'); return ':'; } +\}\%\% { this.popState(); this.popState(); return 'close_directive'; } +((?:(?!\}\%\%).|\n)*) return 'arg_directive'; +\%%(?!\{)[^\n]* /* skip comments */ +[^\}]\%\%[^\n]* /* skip comments */ +[\n]+ return 'NEWLINE'; +\s+ /* skip whitespace */ +\#[^\n]* /* skip comments */ + +"timeline" return 'timeline'; +"title"\s[^#\n;]+ return 'title'; +accTitle\s*":"\s* { this.begin("acc_title");return 'acc_title'; } +(?!\n|;|#)*[^\n]* { this.popState(); return "acc_title_value"; } +accDescr\s*":"\s* { this.begin("acc_descr");return 'acc_descr'; } +(?!\n|;|#)*[^\n]* { this.popState(); return "acc_descr_value"; } +accDescr\s*"{"\s* { this.begin("acc_descr_multiline");} +[\}] { this.popState(); } +[^\}]* return "acc_descr_multiline_value"; +"section"\s[^#:\n;]+ return 'section'; + +// event starting with "==>" keyword +":"\s[^#:\n;]+ return 'event'; +[^#:\n;]+ return 'period'; + + +<> return 'EOF'; +. return 'INVALID'; + +/lex + +%left '^' + +%start start + +%% /* language grammar */ + +start + : timeline document 'EOF' { return $2; } + | directive start + ; + +document + : /* empty */ { $$ = [] } + | document line {$1.push($2);$$ = $1} + ; + +line + : SPACE statement { $$ = $2 } + | statement { $$ = $1 } + | NEWLINE { $$=[];} + | EOF { $$=[];} + ; + +directive + : openDirective typeDirective closeDirective 'NEWLINE' + | openDirective typeDirective ':' argDirective closeDirective 'NEWLINE' + ; + +statement + : title {yy.getCommonDb().setDiagramTitle($1.substr(6));$$=$1.substr(6);} + | acc_title acc_title_value { $$=$2.trim();yy.getCommonDb().setAccTitle($$); } + | acc_descr acc_descr_value { $$=$2.trim();yy.getCommonDb().setAccDescription($$); } + | acc_descr_multiline_value { $$=$1.trim();yy.getCommonDb().setAccDescription($$); } + | section {yy.addSection($1.substr(8));$$=$1.substr(8);} + | period {yy.addTask($1,0,'');$$=$1;} + | period event {yy.addTask($1,0,$2.substr(2));$$=$1;} + | event {yy.addEvent($1.substr(2));$$=$1;} + | directive + ; + +openDirective + : open_directive { yy.parseDirective('%%{', 'open_directive'); } + ; + +typeDirective + : type_directive { yy.parseDirective($1, 'type_directive'); } + ; + +argDirective + : arg_directive { $1 = $1.trim().replace(/'/g, '"'); yy.parseDirective($1, 'arg_directive'); } + ; + +closeDirective + : close_directive { yy.parseDirective('}%%', 'close_directive', 'timeline'); } + ; + +%% diff --git a/packages/mermaid-timeline/src/parser/timeline.spec.js b/packages/mermaid-timeline/src/parser/timeline.spec.js new file mode 100644 index 000000000..cc54d9f78 --- /dev/null +++ b/packages/mermaid-timeline/src/parser/timeline.spec.js @@ -0,0 +1,150 @@ +import { parser } from './journey'; +import journeyDb from '../journeyDb'; + +const parserFnConstructor = (str) => { + return () => { + parser.parse(str); + }; +}; + +describe('when parsing a journey diagram it', function () { + beforeEach(function () { + parser.yy = journeyDb; + parser.yy.clear(); + }); + + it('should handle a title definition', function () { + const str = 'journey\ntitle Adding journey diagram functionality to mermaid'; + + expect(parserFnConstructor(str)).not.toThrow(); + }); + + it('should handle an accessibility description (accDescr)', function () { + const str = + 'journey\n' + + 'accDescr: A user journey for family shopping\n' + + 'title Adding journey diagram functionality to mermaid\n' + + 'section Order from website'; + + expect(parserFnConstructor(str)).not.toThrow(); + }); + it('should handle an accessibility multiline description (accDescr)', function () { + const str = + 'journey\n' + + `accDescr { + A user journey for + family shopping + }` + + 'title Adding journey diagram functionality to mermaid\n' + + 'accTitle: Adding acc journey diagram functionality to mermaid\n' + + 'section Order from website'; + + expect(parserFnConstructor(str)).not.toThrow(); + expect(journeyDb.getAccDescription()).toBe('A user journey for\nfamily shopping'); + expect(journeyDb.getDiagramTitle()).toBe('Adding journey diagram functionality to mermaid'); + expect(journeyDb.getAccTitle()).toBe('Adding acc journey diagram functionality to mermaid'); + }); + it('should handle an accessibility title (accDescr)', function () { + const str = `journey + accTitle: The title + section Order from website`; + + expect(parserFnConstructor(str)).not.toThrow(); + expect(journeyDb.getAccDescription()).toBe(''); + expect(journeyDb.getAccTitle()).toBe('The title'); + }); + + it('should handle a section definition', function () { + const str = + 'journey\n' + + 'title Adding journey diagram functionality to mermaid\n' + + 'section Order from website'; + + expect(parserFnConstructor(str)).not.toThrow(); + }); + it('should handle multiline section titles with different line breaks', function () { + const str = + 'journey\n' + + 'title Adding gantt diagram functionality to mermaid\n' + + 'section Line1
Line2
Line3
Line4Line5'; + + expect(parserFnConstructor(str)).not.toThrow(); + }); + + it('should handle a task definition', function () { + const str = + 'journey\n' + + 'title Adding journey diagram functionality to mermaid\n' + + 'section Documentation\n' + + 'A task: 5: Alice, Bob, Charlie\n' + + 'B task: 3:Bob, Charlie\n' + + 'C task: 5\n' + + 'D task: 5: Charlie, Alice\n' + + 'E task: 5:\n' + + 'section Another section\n' + + 'P task: 5:\n' + + 'Q task: 5:\n' + + 'R task: 5:'; + expect(parserFnConstructor(str)).not.toThrow(); + + const tasks = parser.yy.getTasks(); + expect(tasks.length).toEqual(8); + + expect(tasks[0]).toEqual({ + score: 5, + people: ['Alice', 'Bob', 'Charlie'], + section: 'Documentation', + task: 'A task', + type: 'Documentation', + }); + expect(tasks[1]).toEqual({ + score: 3, + people: ['Bob', 'Charlie'], + section: 'Documentation', + type: 'Documentation', + task: 'B task', + }); + expect(tasks[2]).toEqual({ + score: 5, + people: [], + section: 'Documentation', + type: 'Documentation', + task: 'C task', + }); + expect(tasks[3]).toEqual({ + score: 5, + people: ['Charlie', 'Alice'], + section: 'Documentation', + task: 'D task', + type: 'Documentation', + }); + expect(tasks[4]).toEqual({ + score: 5, + people: [''], + section: 'Documentation', + type: 'Documentation', + task: 'E task', + }); + expect(tasks[5]).toEqual({ + score: 5, + people: [''], + section: 'Another section', + type: 'Another section', + task: 'P task', + }); + expect(tasks[6]).toEqual({ + score: 5, + people: [''], + section: 'Another section', + type: 'Another section', + task: 'Q task', + }); + expect(tasks[7]).toEqual({ + score: 5, + people: [''], + section: 'Another section', + type: 'Another section', + task: 'R task', + }); + }); +}); diff --git a/packages/mermaid-timeline/src/styles.js b/packages/mermaid-timeline/src/styles.js new file mode 100644 index 000000000..51d69f58d --- /dev/null +++ b/packages/mermaid-timeline/src/styles.js @@ -0,0 +1,78 @@ +import { darken, lighten, isDark } from 'khroma'; + +const genSections = (options) => { + let sections = ''; + + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + options['lineColor' + i] = options['lineColor' + i] || options['cScaleInv' + i]; + if (isDark(options['lineColor' + i])) { + options['lineColor' + i] = lighten(options['lineColor' + i], 20); + } else { + options['lineColor' + i] = darken(options['lineColor' + i], 20); + } + } + + for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) { + const sw = '' + (17 - 3 * i); + sections += ` + .section-${i - 1} rect, .section-${i - 1} path, .section-${i - 1} circle, .section-${ + i - 1 + } path { + fill: ${options['cScale' + i]}; + } + .section-${i - 1} text { + fill: ${options['cScaleLabel' + i]}; + } + .node-icon-${i - 1} { + font-size: 40px; + color: ${options['cScaleLabel' + i]}; + } + .section-edge-${i - 1}{ + stroke: ${options['cScale' + i]}; + } + .edge-depth-${i - 1}{ + stroke-width: ${sw}; + } + .section-${i - 1} line { + stroke: ${options['cScaleInv' + i]} ; + stroke-width: 3; + } + + .disabled, .disabled circle, .disabled text { + fill: lightgray; + } + .disabled text { + fill: #efefef; + } + `; + } + return sections; +}; + +const getStyles = (options) => + ` + .edge { + stroke-width: 3; + } + ${genSections(options)} + .section-root rect, .section-root path, .section-root circle { + fill: ${options.git0}; + } + .section-root text { + fill: ${options.gitBranchLabel0}; + } + .icon-container { + height:100%; + display: flex; + justify-content: center; + align-items: center; + } + .edge { + fill: none; + } + .eventWrapper { + filter: brightness(120%); + + } +`; +export default getStyles; diff --git a/packages/mermaid-timeline/src/svgDraw.js b/packages/mermaid-timeline/src/svgDraw.js new file mode 100644 index 000000000..bed0e2942 --- /dev/null +++ b/packages/mermaid-timeline/src/svgDraw.js @@ -0,0 +1,604 @@ +import { arc as d3arc , select} from 'd3'; +const MAX_SECTIONS = 12; + +export const drawRect = function (elem, rectData) { + const rectElem = elem.append('rect'); + rectElem.attr('x', rectData.x); + rectElem.attr('y', rectData.y); + rectElem.attr('fill', rectData.fill); + rectElem.attr('stroke', rectData.stroke); + rectElem.attr('width', rectData.width); + rectElem.attr('height', rectData.height); + rectElem.attr('rx', rectData.rx); + rectElem.attr('ry', rectData.ry); + + if (typeof rectData.class !== 'undefined') { + rectElem.attr('class', rectData.class); + } + + return rectElem; +}; + +export const drawFace = function (element, faceData) { + const radius = 15; + const circleElement = element + .append('circle') + .attr('cx', faceData.cx) + .attr('cy', faceData.cy) + .attr('class', 'face') + .attr('r', radius) + .attr('stroke-width', 2) + .attr('overflow', 'visible'); + + const face = element.append('g'); + + //left eye + face + .append('circle') + .attr('cx', faceData.cx - radius / 3) + .attr('cy', faceData.cy - radius / 3) + .attr('r', 1.5) + .attr('stroke-width', 2) + .attr('fill', '#666') + .attr('stroke', '#666'); + + //right eye + face + .append('circle') + .attr('cx', faceData.cx + radius / 3) + .attr('cy', faceData.cy - radius / 3) + .attr('r', 1.5) + .attr('stroke-width', 2) + .attr('fill', '#666') + .attr('stroke', '#666'); + + /** @param {any} face */ + function smile(face) { + const arc = d3arc() + .startAngle(Math.PI / 2) + .endAngle(3 * (Math.PI / 2)) + .innerRadius(radius / 2) + .outerRadius(radius / 2.2); + //mouth + face + .append('path') + .attr('class', 'mouth') + .attr('d', arc) + .attr('transform', 'translate(' + faceData.cx + ',' + (faceData.cy + 2) + ')'); + } + + /** @param {any} face */ + function sad(face) { + const arc = d3arc() + .startAngle((3 * Math.PI) / 2) + .endAngle(5 * (Math.PI / 2)) + .innerRadius(radius / 2) + .outerRadius(radius / 2.2); + //mouth + face + .append('path') + .attr('class', 'mouth') + .attr('d', arc) + .attr('transform', 'translate(' + faceData.cx + ',' + (faceData.cy + 7) + ')'); + } + + /** @param {any} face */ + function ambivalent(face) { + face + .append('line') + .attr('class', 'mouth') + .attr('stroke', 2) + .attr('x1', faceData.cx - 5) + .attr('y1', faceData.cy + 7) + .attr('x2', faceData.cx + 5) + .attr('y2', faceData.cy + 7) + .attr('class', 'mouth') + .attr('stroke-width', '1px') + .attr('stroke', '#666'); + } + + if (faceData.score > 3) { + smile(face); + } else if (faceData.score < 3) { + sad(face); + } else { + ambivalent(face); + } + + return circleElement; +}; + +export const drawCircle = function (element, circleData) { + const circleElement = element.append('circle'); + circleElement.attr('cx', circleData.cx); + circleElement.attr('cy', circleData.cy); + circleElement.attr('class', 'actor-' + circleData.pos); + circleElement.attr('fill', circleData.fill); + circleElement.attr('stroke', circleData.stroke); + circleElement.attr('r', circleData.r); + + if (typeof circleElement.class !== 'undefined') { + circleElement.attr('class', circleElement.class); + } + + if (typeof circleData.title !== 'undefined') { + circleElement.append('title').text(circleData.title); + } + + return circleElement; +}; + +export const drawText = function (elem, textData) { + // Remove and ignore br:s + const nText = textData.text.replace(//gi, ' '); + + const textElem = elem.append('text'); + textElem.attr('x', textData.x); + textElem.attr('y', textData.y); + textElem.attr('class', 'legend'); + + textElem.style('text-anchor', textData.anchor); + + if (typeof textData.class !== 'undefined') { + textElem.attr('class', textData.class); + } + + const span = textElem.append('tspan'); + span.attr('x', textData.x + textData.textMargin * 2); + span.text(nText); + + return textElem; +}; + +export const drawLabel = function (elem, txtObject) { + /** + * @param {any} x + * @param {any} y + * @param {any} width + * @param {any} height + * @param {any} cut + */ + function genPoints(x, y, width, height, cut) { + return ( + x + + ',' + + y + + ' ' + + (x + width) + + ',' + + y + + ' ' + + (x + width) + + ',' + + (y + height - cut) + + ' ' + + (x + width - cut * 1.2) + + ',' + + (y + height) + + ' ' + + x + + ',' + + (y + height) + ); + } + const polygon = elem.append('polygon'); + polygon.attr('points', genPoints(txtObject.x, txtObject.y, 50, 20, 7)); + polygon.attr('class', 'labelBox'); + + txtObject.y = txtObject.y + txtObject.labelMargin; + txtObject.x = txtObject.x + 0.5 * txtObject.labelMargin; + drawText(elem, txtObject); +}; + +export const drawSection = function (elem, section, conf) { + const g = elem.append('g'); + + const rect = getNoteRect(); + rect.x = section.x; + rect.y = section.y; + rect.fill = section.fill; + rect.width = conf.width; + rect.height = conf.height; + rect.class = 'journey-section section-type-' + section.num; + rect.rx = 3; + rect.ry = 3; + drawRect(g, rect); + + _drawTextCandidateFunc(conf)( + section.text, + g, + rect.x, + rect.y, + rect.width, + rect.height, + { class: 'journey-section section-type-' + section.num }, + conf, + section.colour + ); +}; + +let taskCount = -1; +/** + * Draws an actor in the diagram with the attached line + * + * @param {any} elem The HTML element + * @param {any} task The task to render + * @param {any} conf The global configuration + */ +export const drawTask = function (elem, task, conf) { + const center = task.x + conf.width / 2; + const g = elem.append('g'); + taskCount++; + const maxHeight = 300 + 5 * 30; + g.append('line') + .attr('id', 'task' + taskCount) + .attr('x1', center) + .attr('y1', task.y) + .attr('x2', center) + .attr('y2', maxHeight) + .attr('class', 'task-line') + .attr('stroke-width', '1px') + .attr('stroke-dasharray', '4 2') + .attr('stroke', '#666'); + + drawFace(g, { + cx: center, + cy: 300 + (5 - task.score) * 30, + score: task.score, + }); + + const rect = getNoteRect(); + rect.x = task.x; + rect.y = task.y; + rect.fill = task.fill; + rect.width = conf.width; + rect.height = conf.height; + rect.class = 'task task-type-' + task.num; + rect.rx = 3; + rect.ry = 3; + drawRect(g, rect); + + let xPos = task.x + 14; + // task.people.forEach((person) => { + // const colour = task.actors[person].color; + + // const circle = { + // cx: xPos, + // cy: task.y, + // r: 7, + // fill: colour, + // stroke: '#000', + // title: person, + // pos: task.actors[person].position, + // }; + + // drawCircle(g, circle); + // xPos += 10; + // }); + + _drawTextCandidateFunc(conf)( + task.task, + g, + rect.x, + rect.y, + rect.width, + rect.height, + { class: 'task' }, + conf, + task.colour + ); +}; + +/** + * Draws a background rectangle + * + * @param {any} elem The html element + * @param {any} bounds The bounds of the drawing + */ +export const drawBackgroundRect = function (elem, bounds) { + const rectElem = drawRect(elem, { + x: bounds.startx, + y: bounds.starty, + width: bounds.stopx - bounds.startx, + height: bounds.stopy - bounds.starty, + fill: bounds.fill, + class: 'rect', + }); + rectElem.lower(); +}; + +export const getTextObj = function () { + return { + x: 0, + y: 0, + fill: undefined, + 'text-anchor': 'start', + width: 100, + height: 100, + textMargin: 0, + rx: 0, + ry: 0, + }; +}; + +export const getNoteRect = function () { + return { + x: 0, + y: 0, + width: 100, + anchor: 'start', + height: 100, + rx: 0, + ry: 0, + }; +}; + +const _drawTextCandidateFunc = (function () { + /** + * @param {any} content + * @param {any} g + * @param {any} x + * @param {any} y + * @param {any} width + * @param {any} height + * @param {any} textAttrs + * @param {any} colour + */ + function byText(content, g, x, y, width, height, textAttrs, colour) { + const text = g + .append('text') + .attr('x', x + width / 2) + .attr('y', y + height / 2 + 5) + .style('font-color', colour) + .style('text-anchor', 'middle') + .text(content); + _setTextAttrs(text, textAttrs); + } + + /** + * @param {any} content + * @param {any} g + * @param {any} x + * @param {any} y + * @param {any} width + * @param {any} height + * @param {any} textAttrs + * @param {any} conf + * @param {any} colour + */ + function byTspan(content, g, x, y, width, height, textAttrs, conf, colour) { + const { taskFontSize, taskFontFamily } = conf; + + const lines = content.split(//gi); + for (let i = 0; i < lines.length; i++) { + const dy = i * taskFontSize - (taskFontSize * (lines.length - 1)) / 2; + const text = g + .append('text') + .attr('x', x + width / 2) + .attr('y', y) + .attr('fill', colour) + .style('text-anchor', 'middle') + .style('font-size', taskFontSize) + .style('font-family', taskFontFamily); + text + .append('tspan') + .attr('x', x + width / 2) + .attr('dy', dy) + .text(lines[i]); + + text + .attr('y', y + height / 2.0) + .attr('dominant-baseline', 'central') + .attr('alignment-baseline', 'central'); + + _setTextAttrs(text, textAttrs); + } + } + + /** + * @param {any} content + * @param {any} g + * @param {any} x + * @param {any} y + * @param {any} width + * @param {any} height + * @param {any} textAttrs + * @param {any} conf + */ + function byFo(content, g, x, y, width, height, textAttrs, conf) { + const body = g.append('switch'); + const f = body + .append('foreignObject') + .attr('x', x) + .attr('y', y) + .attr('width', width) + .attr('height', height) + .attr('position', 'fixed'); + + const text = f + .append('xhtml:div') + .style('display', 'table') + .style('height', '100%') + .style('width', '100%'); + + text + .append('div') + .attr('class', 'label') + .style('display', 'table-cell') + .style('text-align', 'center') + .style('vertical-align', 'middle') + .text(content); + + byTspan(content, body, x, y, width, height, textAttrs, conf); + _setTextAttrs(text, textAttrs); + } + + /** + * @param {any} toText + * @param {any} fromTextAttrsDict + */ + function _setTextAttrs(toText, fromTextAttrsDict) { + for (const key in fromTextAttrsDict) { + if (key in fromTextAttrsDict) { + // noinspection JSUnfilteredForInLoop + toText.attr(key, fromTextAttrsDict[key]); + } + } + } + + return function (conf) { + return conf.textPlacement === 'fo' ? byFo : conf.textPlacement === 'old' ? byText : byTspan; + }; +})(); + +const initGraphics = function (graphics) { + graphics + .append('defs') + .append('marker') + .attr('id', 'arrowhead') + .attr('refX', 5) + .attr('refY', 2) + .attr('markerWidth', 6) + .attr('markerHeight', 4) + .attr('orient', 'auto') + .append('path') + .attr('d', 'M 0,0 V 4 L6,2 Z'); // this is actual shape for arrowhead +}; + +/** + * @param {string} text The text to be wrapped + * @param {number} width The max width of the text + */ +function wrap(text, width) { + text.each(function () { + var text = select(this), + words = text + .text() + .split(/(\s+|
)/) + .reverse(), + word, + line = [], + lineHeight = 1.1, // ems + y = text.attr('y'), + dy = parseFloat(text.attr('dy')), + tspan = text + .text(null) + .append('tspan') + .attr('x', 0) + .attr('y', y) + .attr('dy', dy + 'em'); + for (let j = 0; j < words.length; j++) { + word = words[words.length - 1 - j]; + line.push(word); + tspan.text(line.join(' ').trim()); + if (tspan.node().getComputedTextLength() > width || word === '
') { + line.pop(); + tspan.text(line.join(' ').trim()); + if (word === '
') { + line = ['']; + } else { + line = [word]; + } + + tspan = text + .append('tspan') + .attr('x', 0) + .attr('y', y) + .attr('dy', lineHeight + 'em') + .text(word); + } + } + }); +} + +export const drawNode = function (elem, node, fullSection, conf) { + const section = (fullSection % MAX_SECTIONS) - 1; + const nodeElem = elem.append('g'); + node.section = section; + nodeElem.attr( + 'class', + (node.class ? node.class + ' ' : '') + + 'timeline-node ' + + (section < 0 ? 'section-root' : 'section-' + section) + ); + const bkgElem = nodeElem.append('g'); + + // Create the wrapped text element + const textElem = nodeElem.append('g'); + + const txt = textElem + .append('text') + .text(node.descr) + .attr('dy', '1em') + .attr('alignment-baseline', 'middle') + .attr('dominant-baseline', 'middle') + .attr('text-anchor', 'middle') + .call(wrap, node.width); + const bbox = txt.node().getBBox(); + const fontSize = conf.fontSize && conf.fontSize.replace ? conf.fontSize.replace('px', '') : conf.fontSize; + node.height = bbox.height + fontSize * 1.1 * 0.5 + node.padding; + node.height = Math.max(node.height, node.maxHeight); + node.width = node.width + 2 * node.padding; + + textElem.attr('transform', 'translate(' + node.width / 2 + ', ' + node.padding / 2 + ')'); + + // Create the background element + defaultBkg(bkgElem, node, section, conf); + + + return node; +}; + + export const getVirtualNodeHeight = function (elem,node,conf) { + const textElem = elem.append('g'); + const txt = textElem + .append('text') + .text(node.descr) + .attr('dy', '1em') + .attr('alignment-baseline', 'middle') + .attr('dominant-baseline', 'middle') + .attr('text-anchor', 'middle') + .call(wrap, node.width); + const bbox = txt.node().getBBox(); + const fontSize = conf.fontSize && conf.fontSize.replace ? conf.fontSize.replace('px', '') : conf.fontSize; + textElem.remove(); + return bbox.height + fontSize * 1.1 * 0.5 + node.padding; +}; + + +const defaultBkg = function (elem, node, section) { + const rd = 5; + elem + .append('path') + .attr('id', 'node-' + node.id) + .attr('class', 'node-bkg node-' + node.type) + .attr( + 'd', + `M0 ${node.height - rd} v${-node.height + 2 * rd} q0,-5 5,-5 h${ + node.width - 2 * rd + } q5,0 5,5 v${node.height - rd} H0 Z` + ); + + elem + .append('line') + .attr('class', 'node-line-' + section) + .attr('x1', 0) + .attr('y1', node.height) + .attr('x2', node.width) + .attr('y2', node.height); +}; + +export default { + drawRect, + drawCircle, + drawSection, + drawText, + drawLabel, + drawTask, + drawBackgroundRect, + getTextObj, + getNoteRect, + initGraphics, + drawNode, + getVirtualNodeHeight, +}; diff --git a/packages/mermaid-timeline/src/timelineDb.js b/packages/mermaid-timeline/src/timelineDb.js new file mode 100644 index 000000000..dda3a97cb --- /dev/null +++ b/packages/mermaid-timeline/src/timelineDb.js @@ -0,0 +1,100 @@ +import { getCommonDb as _getCommonDb,log } from './mermaidUtils'; + +let currentSection = ''; +let currentTaskId = 0; + +const sections = []; +const tasks = []; +const rawTasks = []; + +export const getCommonDb = _getCommonDb; + +export const clear = function () { + sections.length = 0; + tasks.length = 0; + currentSection = ''; + rawTasks.length = 0; + _getCommonDb().clear(); +}; + +export const addSection = function (txt) { + currentSection = txt; + sections.push(txt); +}; + +export const getSections = function () { + return sections; +}; + +export const getTasks = function () { + let allItemsProcessed = compileTasks(); + const maxDepth = 100; + let iterationCount = 0; + while (!allItemsProcessed && iterationCount < maxDepth) { + allItemsProcessed = compileTasks(); + iterationCount++; + } + + tasks.push(...rawTasks); + + return tasks; +}; + +export const addTask = function (period, length, event) { + + const rawTask = { + id: currentTaskId++, + section: currentSection, + type: currentSection, + task: period, + score : length?length:0, + //if event is defined, then add it the events array + events: event?[event]:[], + }; + rawTasks.push(rawTask); +}; + +export const addEvent = function (event) { + // fetch current task with currnetTaskId + const currentTask = rawTasks.find((task) => task.id === currentTaskId - 1); + //add event to the events array + currentTask.events.push(event); +}; + + +export const addTaskOrg = function (descr) { + const newTask = { + section: currentSection, + type: currentSection, + description: descr, + task: descr, + classes: [], + }; + tasks.push(newTask); +}; + +const compileTasks = function () { + const compileTask = function (pos) { + return rawTasks[pos].processed; + }; + + let allProcessed = true; + for (let i = 0; i < rawTasks.length; i++) { + compileTask(i); + + allProcessed = allProcessed && rawTasks[i].processed; + } + return allProcessed; +}; + +export default { + clear, + getCommonDb, + addSection, + getSections, + getTasks, + addTask, + addTaskOrg, + addEvent, +}; + diff --git a/packages/mermaid-timeline/src/timelineDb.spec.js b/packages/mermaid-timeline/src/timelineDb.spec.js new file mode 100644 index 000000000..3a17ca202 --- /dev/null +++ b/packages/mermaid-timeline/src/timelineDb.spec.js @@ -0,0 +1,91 @@ +import journeyDb from './journeyDb'; + +describe('when using the journeyDb', function () { + beforeEach(function () { + journeyDb.clear(); + }); + + describe('when calling the clear function', function () { + beforeEach(function () { + journeyDb.addSection('weekends skip test'); + journeyDb.addTask('test1', '4: id1, id3'); + journeyDb.addTask('test2', '2: id2'); + journeyDb.clear(); + }); + + it.each` + fn | expected + ${'getTasks'} | ${[]} + ${'getAccTitle'} | ${''} + ${'getSections'} | ${[]} + ${'getActors'} | ${[]} + `('should clear $fn', ({ fn, expected }) => { + expect(journeyDb[fn]()).toEqual(expected); + }); + }); + + describe('when calling the clear function', function () { + beforeEach(function () { + journeyDb.addSection('weekends skip test'); + journeyDb.addTask('test1', '3: id1, id3'); + journeyDb.addTask('test2', '1: id2'); + journeyDb.clear(); + }); + it.each` + fn | expected + ${'getTasks'} | ${[]} + ${'getAccTitle'} | ${''} + ${'getAccDescription'} | ${''} + ${'getSections'} | ${[]} + `('should clear $fn', ({ fn, expected }) => { + expect(journeyDb[fn]()).toEqual(expected); + }); + }); + + describe('tasks and actors should be added', function () { + journeyDb.setAccTitle('Shopping'); + journeyDb.setAccDescription('A user journey for family shopping'); + journeyDb.addSection('Journey to the shops'); + journeyDb.addTask('Get car keys', ':5:Dad'); + journeyDb.addTask('Go to car', ':3:Dad, Mum, Child#1, Child#2'); + journeyDb.addTask('Drive to supermarket', ':4:Dad'); + journeyDb.addSection('Do shopping'); + journeyDb.addTask('Go shopping', ':5:Mum'); + + expect(journeyDb.getAccTitle()).toEqual('Shopping'); + expect(journeyDb.getAccDescription()).toEqual('A user journey for family shopping'); + expect(journeyDb.getTasks()).toEqual([ + { + score: 5, + people: ['Dad'], + section: 'Journey to the shops', + task: 'Get car keys', + type: 'Journey to the shops', + }, + { + score: 3, + people: ['Dad', 'Mum', 'Child#1', 'Child#2'], + section: 'Journey to the shops', + task: 'Go to car', + type: 'Journey to the shops', + }, + { + score: 4, + people: ['Dad'], + section: 'Journey to the shops', + task: 'Drive to supermarket', + type: 'Journey to the shops', + }, + { + score: 5, + people: ['Mum'], + section: 'Do shopping', + task: 'Go shopping', + type: 'Do shopping', + }, + ]); + expect(journeyDb.getActors()).toEqual(['Child#1', 'Child#2', 'Dad', 'Mum']); + + expect(journeyDb.getSections()).toEqual(['Journey to the shops', 'Do shopping']); + }); +}); diff --git a/packages/mermaid-timeline/src/timelineRenderer.ts b/packages/mermaid-timeline/src/timelineRenderer.ts new file mode 100644 index 000000000..aa3e2199c --- /dev/null +++ b/packages/mermaid-timeline/src/timelineRenderer.ts @@ -0,0 +1,415 @@ +// @ts-nocheck TODO: fix file +import { select } from 'd3'; +import svgDraw from './svgDraw'; +import { configureSvgSize } from '../../setupGraphViewbox'; +import addSVGAccessibilityFields from '../../accessibility'; + +import { log, getConfig, setupGraphViewbox } from './mermaidUtils'; + +export const setConf = function (cnf) { + const keys = Object.keys(cnf); + + keys.forEach(function (key) { + conf[key] = cnf[key]; + }); +}; + +export const draw = function (text, id, version, diagObj) { + //1. Fetch the configuration + const conf = getConfig(); + const LEFT_MARGIN = conf.leftMargin?conf.leftMargin:50; + + //2. Clear the diagram db before parsing + diagObj.db.clear(); + + //3. Parse the diagram text + diagObj.parser.parse(text + '\n'); + + log.info('timeline', diagObj.db); + + const securityLevel = conf.securityLevel; + // Handle root and Document for when rendering in sandbox mode + let sandboxElement; + if (securityLevel === 'sandbox') { + sandboxElement = select('#i' + id); + } + const root = + securityLevel === 'sandbox' + ? select(sandboxElement.nodes()[0].contentDocument.body) + : select('body'); + + // Init bounds + bounds.init(); + + + + const svg = root.select('#' + id); + + svg.append('g'); + + //4. Fetch the diagram data + const tasks = diagObj.db.getTasks(); + const title = diagObj.db.getCommonDb().getDiagramTitle(); + + //log tasks + log.info(tasks); + + //5. Initialize the diagram + svgDraw.initGraphics(svg); + + //bounds.insert(0, 0, LEFT_MARGIN, 0); + // fetch Sections + const sections = diagObj.db.getSections(); + // log sections + log.info(sections); + + let maxSectionHeight = 0; + let maxTaskHeight = 0; + let sectionBeginX = 0; + let sectionBeginY = 0; + let masterX = 50 + LEFT_MARGIN; + sectionBeginX = masterX; + let masterY = 50; + sectionBeginY=50; + //draw sections + let sectionNumber = 0; + + //Calculate the max height of the sections + sections.forEach(function (section) { + const sectionNode = { + number: sectionNumber, + descr: section, + section: sectionNumber, + width: 150, + padding: 20, + maxHeight: maxSectionHeight, + }; + const sectionHeight = svgDraw.getVirtualNodeHeight(svg, sectionNode, conf); + log.info('sectionHeight before draw', sectionHeight); + maxSectionHeight = Math.max(maxSectionHeight, sectionHeight +20); + }); + +//tasks length and maxEventCount +let maxEventCount = 0; + log.info('tasks.length', tasks.length); + //calculate max task height + // for loop till tasks.length + for (let i = 0; i < tasks.length; i++) { + const task = tasks[i]; + + const taskNode = { + number: i, + descr: task, + section: task.section, + width: 150, + padding: 20, + maxHeight: maxTaskHeight, + }; + const taskHeight = svgDraw.getVirtualNodeHeight(svg, taskNode, conf); + log.info('taskHeight before draw', taskHeight); + maxTaskHeight = Math.max(maxTaskHeight, taskHeight + 20); + + //calculate maxEventCount + maxEventCount = Math.max(maxEventCount, task.events.length); + } + + + log.info('maxSectionHeight before draw', maxSectionHeight); + log.info('maxTaskHeight before draw', maxTaskHeight); + + if (sections && sections.length > 0) { + sections.forEach((section) => { + + const sectionNode = { + number: sectionNumber, + descr: section, + section: sectionNumber, + width: 150, + padding: 20, + maxHeight: maxSectionHeight, + }; + //log section node + log.info('sectionNode', sectionNode); + const sectionNodeWrapper = svg.append('g'); + const node = svgDraw.drawNode(sectionNodeWrapper, sectionNode, sectionNumber, conf); + // add node to section list + //sectionList.push(node); + //const nodeHeight = node.height + 20; + //Post process the node + //append g + + sectionNodeWrapper.attr( + 'transform', + `translate(${masterX}, ${sectionBeginY})` + ); + //maxSectionHeight = Math.max(maxSectionHeight, nodeHeight); + masterY += maxSectionHeight + 50; + + + + //draw tasks for this section + //filter task where tasks.section == section + const tasksForSection = tasks.filter((task) => task.section === section); + if (tasksForSection.length > 0) { + + + drawTasks(svg, tasksForSection, sectionNumber, masterX, masterY, maxTaskHeight, conf, maxEventCount,false); + } + // todo replace with total width of section and its tasks + masterX += 200 * Math.max(tasksForSection.length, 1); + + masterY = sectionBeginY; + sectionNumber++; + }); + } else { + //draw tasks + drawTasks(svg, tasks, sectionNumber, masterX, masterY, maxTaskHeight, conf, maxEventCount,true); + } + + + + + // draw tasks + //drawTasks(svg, tasks, 0); + + const box = bounds.getBounds(); + if (title) { + svg + .append('text') + .text(title) + .attr('x', LEFT_MARGIN) + .attr('font-size', '4ex') + .attr('font-weight', 'bold') + .attr('y', 25); + } + + const height = box.stopy - box.starty + 2 * conf.diagramMarginY; + const width = LEFT_MARGIN + box.stopx + 2 * conf.diagramMarginX; + +// Setup the view box and size of the svg element + setupGraphViewbox(undefined, svg, conf.timeline.padding, conf.timeline.useMaxWidth); + + //5. Draw the diagram + const maxTaskLength = 500; + + // Draw activity line + svg + .append('line') + .attr('x1', LEFT_MARGIN) + .attr('y1', maxSectionHeight + maxTaskHeight +150) // One section head + one task + margins + .attr('x2', tasks && tasks.length? (tasks.length*200)+ 400 : 400) // Subtract stroke width so arrow point is retained + .attr('y2', maxSectionHeight + maxTaskHeight +150) + .attr('stroke-width', 4) + .attr('stroke', 'black') + .attr('marker-end', 'url(#arrowhead)'); + + const extraVertForTitle = title ? 70 : 0; + svg.attr('viewBox', `${box.startx} -25 ${width} ${height + extraVertForTitle}`); + svg.attr('preserveAspectRatio', 'xMinYMin meet'); + svg.attr('height', height + extraVertForTitle + 25); + + // addSVGAccessibilityFields(diagObj.db, diagram, id); +}; + +export const bounds = { + data: { + startx: undefined, + stopx: undefined, + starty: undefined, + stopy: undefined, + }, + verticalPos: 0, + + sequenceItems: [], + init: function () { + this.sequenceItems = []; + this.data = { + startx: undefined, + stopx: undefined, + starty: undefined, + stopy: undefined, + }; + this.verticalPos = 0; + }, + updateVal: function (obj, key, val, fun) { + if (typeof obj[key] === 'undefined') { + obj[key] = val; + } else { + obj[key] = fun(val, obj[key]); + } + }, + updateBounds: function (startx, starty, stopx, stopy) { + const conf = getConfig().timeline; + // eslint-disable-next-line @typescript-eslint/no-this-alias + const _self = this; + let cnt = 0; + /** @param {any} type */ + function updateFn(type) { + return function updateItemBounds(item) { + cnt++; + // The loop sequenceItems is a stack so the biggest margins in the beginning of the sequenceItems + const n = _self.sequenceItems.length - cnt + 1; + _self.updateVal(item, 'starty', starty - n * conf.boxMargin, Math.min); + _self.updateVal(item, 'stopy', stopy + n * conf.boxMargin, Math.max); + + _self.updateVal(bounds.data, 'startx', startx - n * conf.boxMargin, Math.min); + _self.updateVal(bounds.data, 'stopx', stopx + n * conf.boxMargin, Math.max); + + if (!(type === 'activation')) { + _self.updateVal(item, 'startx', startx - n * conf.boxMargin, Math.min); + _self.updateVal(item, 'stopx', stopx + n * conf.boxMargin, Math.max); + + _self.updateVal(bounds.data, 'starty', starty - n * conf.boxMargin, Math.min); + _self.updateVal(bounds.data, 'stopy', stopy + n * conf.boxMargin, Math.max); + } + }; + } + + this.sequenceItems.forEach(updateFn()); + }, + insert: function (startx, starty, stopx, stopy) { + const _startx = Math.min(startx, stopx); + const _stopx = Math.max(startx, stopx); + const _starty = Math.min(starty, stopy); + const _stopy = Math.max(starty, stopy); + + this.updateVal(bounds.data, 'startx', _startx, Math.min); + this.updateVal(bounds.data, 'starty', _starty, Math.min); + this.updateVal(bounds.data, 'stopx', _stopx, Math.max); + this.updateVal(bounds.data, 'stopy', _stopy, Math.max); + + this.updateBounds(_startx, _starty, _stopx, _stopy); + }, + bumpVerticalPos: function (bump) { + this.verticalPos = this.verticalPos + bump; + this.data.stopy = this.verticalPos; + }, + getVerticalPos: function () { + return this.verticalPos; + }, + getBounds: function () { + return this.data; + }, +}; + + + +export const drawTasks = function (diagram, tasks, sectionColor, masterX, masterY, maxTaskHeight,conf,maxEventCount, isWithoutSections) { + + const taskBeginY = masterY; + + const taskBeginX = masterX; + + // Draw the tasks + for (let i = 0; i < tasks.length; i++) { + + const task = tasks[i]; + // create node from task + const taskNode = { + descr: task.task, + section: sectionColor, + number : sectionColor, + width: 150, + padding: 20, + maxHeight: maxTaskHeight, + }; + + //log task node + log.info('taskNode', taskNode); + // create task wrapper + const taskWrapper = diagram.append('g').attr('class', 'taskWrapper'); + const node = svgDraw.drawNode(taskWrapper, taskNode, sectionColor, conf); + const taskHeight = node.height; + //log task height + log.info('taskHeight after draw', taskHeight); + taskWrapper.attr( + 'transform', + `translate(${masterX}, ${masterY})` + ); + + // update max task height + maxTaskHeight = Math.max(maxTaskHeight, taskHeight); + + + + // if task has events, draw them + if (task.events) { + // draw a line between the task and the events + const lineWrapper = diagram.append('g').attr('class', 'lineWrapper'); + + let linelength = maxTaskHeight; + + + + //add margin to task + masterY += 100; + linelength = linelength+ drawEvents(diagram, task.events, sectionColor, masterX, masterY, conf); + masterY -= 100; + + lineWrapper + .append('line') + .attr('x1', masterX + 190/2) + .attr('y1', masterY + maxTaskHeight) // One section head + one task + margins + .attr('x2', masterX + 190/2) // Subtract stroke width so arrow point is retained + .attr('y2', masterY + linelength + maxEventCount * 100) + .attr('stroke-width', 2) + .attr('stroke', 'black') + .attr('marker-end', 'url(#arrowhead)') + .attr('stroke-dasharray', "5,5"); + } + + + + masterX = masterX + 200; + if (isWithoutSections) { + sectionColor++; + } + } + + +// reset Y coordinate for next section + masterY= masterY -10; ; +}; + +export const drawEvents = function (diagram, events, sectionColor, masterX, masterY, conf) { + + let maxEventHeight = 0; + const eventBeginY = masterY; + masterY = masterY + 100 + // Draw the events + for (let i = 0; i < events.length; i++) { + const event = events[i]; + // create node from event + const eventNode = { + descr: event, + section: sectionColor, + number : sectionColor, + width: 150, + padding: 20, + maxHeight: 50, + }; + + //log task node + log.info('eventNode', eventNode); + // create event wrapper + const eventWrapper = diagram.append('g').attr('class', 'eventWrapper'); + const node = svgDraw.drawNode(eventWrapper, eventNode, sectionColor, conf) + const eventHeight = node.height; + maxEventHeight= maxEventHeight + eventHeight; + eventWrapper.attr( + 'transform', + `translate(${masterX}, ${masterY})` + ); + masterY = masterY + 10 + eventHeight; + + } + // set masterY back to eventBeginY + masterY = eventBeginY; + return maxEventHeight; + +}; + +export default { + setConf, + draw, +}; diff --git a/packages/mermaid-timeline/src/types/index.d.ts b/packages/mermaid-timeline/src/types/index.d.ts new file mode 100644 index 000000000..999ff2f49 --- /dev/null +++ b/packages/mermaid-timeline/src/types/index.d.ts @@ -0,0 +1,7 @@ +export {}; + +declare global { + interface Window { + mermaid: any; // 👈️ turn off type checking + } +} diff --git a/packages/mermaid-timeline/tsconfig.json b/packages/mermaid-timeline/tsconfig.json new file mode 100644 index 000000000..310137cc0 --- /dev/null +++ b/packages/mermaid-timeline/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "module": "esnext", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./dist" + }, + "include": ["./src/**/*.ts"], + "typeRoots": ["./src/types"] +} diff --git a/packages/mermaid/src/config.type.ts b/packages/mermaid/src/config.type.ts index ff199ca8b..63fe078fa 100644 --- a/packages/mermaid/src/config.type.ts +++ b/packages/mermaid/src/config.type.ts @@ -26,6 +26,7 @@ export interface MermaidConfig { sequence?: SequenceDiagramConfig; gantt?: GanttDiagramConfig; journey?: JourneyDiagramConfig; + timeline?: TimelineDiagramConfig; class?: ClassDiagramConfig; state?: StateDiagramConfig; er?: ErDiagramConfig; @@ -292,6 +293,29 @@ export interface JourneyDiagramConfig extends BaseDiagramConfig { sectionColours?: string[]; } +export interface TimelineDiagramConfig extends BaseDiagramConfig { + diagramMarginX?: number; + diagramMarginY?: number; + leftMargin?: number; + width?: number; + height?: number; + boxMargin?: number; + boxTextMargin?: number; + noteMargin?: number; + messageMargin?: number; + messageAlign?: string; + bottomMarginAdj?: number; + rightAngles?: boolean; + taskFontSize?: string | number; + taskFontFamily?: string; + taskMargin?: number; + activationWidth?: number; + textPlacement?: string; + actorColours?: string[]; + sectionFills?: string[]; + sectionColours?: string[]; +} + export interface GanttDiagramConfig extends BaseDiagramConfig { titleTopMargin?: number; barHeight?: number; diff --git a/packages/mermaid/src/defaultConfig.ts b/packages/mermaid/src/defaultConfig.ts index 37d4f71ff..5bb4a1bd8 100644 --- a/packages/mermaid/src/defaultConfig.ts +++ b/packages/mermaid/src/defaultConfig.ts @@ -861,6 +861,155 @@ const config: Partial = { sectionFills: ['#191970', '#8B008B', '#4B0082', '#2F4F4F', '#800000', '#8B4513', '#00008B'], sectionColours: ['#fff'], }, + /** The object containing configurations specific for timeline diagrams */ + timeline: { + /** + * | Parameter | Description | Type | Required | Values | + * | -------------- | ---------------------------------------------------- | ------- | -------- | ------------------ | + * | diagramMarginX | Margin to the right and left of the sequence diagram | Integer | Required | Any Positive Value | + * + * **Notes:** Default value: 50 + */ + diagramMarginX: 50, + + /** + * | Parameter | Description | Type | Required | Values | + * | -------------- | -------------------------------------------------- | ------- | -------- | ------------------ | + * | diagramMarginY | Margin to the over and under the sequence diagram. | Integer | Required | Any Positive Value | + * + * **Notes:** Default value: 10 + */ + diagramMarginY: 10, + + /** + * | Parameter | Description | Type | Required | Values | + * | ----------- | --------------------- | ------- | -------- | ------------------ | + * | actorMargin | Margin between actors | Integer | Required | Any Positive Value | + * + * **Notes:** Default value: 50 + */ + leftMargin: 150, + + /** + * | Parameter | Description | Type | Required | Values | + * | --------- | -------------------- | ------- | -------- | ------------------ | + * | width | Width of actor boxes | Integer | Required | Any Positive Value | + * + * **Notes:** Default value: 150 + */ + width: 150, + + /** + * | Parameter | Description | Type | Required | Values | + * | --------- | --------------------- | ------- | -------- | ------------------ | + * | height | Height of actor boxes | Integer | Required | Any Positive Value | + * + * **Notes:** Default value: 65 + */ + height: 50, + + /** + * | Parameter | Description | Type | Required | Values | + * | --------- | ------------------------ | ------- | -------- | ------------------ | + * | boxMargin | Margin around loop boxes | Integer | Required | Any Positive Value | + * + * **Notes:** Default value: 10 + */ + boxMargin: 10, + + /** + * | Parameter | Description | Type | Required | Values | + * | ------------- | -------------------------------------------- | ------- | -------- | ------------------ | + * | boxTextMargin | Margin around the text in loop/alt/opt boxes | Integer | Required | Any Positive Value | + * + * **Notes:** Default value: 5 + */ + boxTextMargin: 5, + + /** + * | Parameter | Description | Type | Required | Values | + * | ---------- | ------------------- | ------- | -------- | ------------------ | + * | noteMargin | Margin around notes | Integer | Required | Any Positive Value | + * + * **Notes:** Default value: 10 + */ + noteMargin: 10, + + /** + * | Parameter | Description | Type | Required | Values | + * | ------------- | ----------------------- | ------- | -------- | ------------------ | + * | messageMargin | Space between messages. | Integer | Required | Any Positive Value | + * + * **Notes:** + * + * Space between messages. + * + * Default value: 35 + */ + messageMargin: 35, + + /** + * | Parameter | Description | Type | Required | Values | + * | ------------ | --------------------------- | ---- | -------- | ------------------------- | + * | messageAlign | Multiline message alignment | 3 | 4 | 'left', 'center', 'right' | + * + * **Notes:** Default value: 'center' + */ + messageAlign: 'center', + + /** + * | Parameter | Description | Type | Required | Values | + * | --------------- | ------------------------------------------ | ------- | -------- | ------------------ | + * | bottomMarginAdj | Prolongs the edge of the diagram downwards | Integer | 4 | Any Positive Value | + * + * **Notes:** + * + * Depending on css styling this might need adjustment. + * + * Default value: 1 + */ + bottomMarginAdj: 1, + + /** + * | Parameter | Description | Type | Required | Values | + * | ----------- | ----------- | ------- | -------- | ----------- | + * | useMaxWidth | See notes | boolean | 4 | true, false | + * + * **Notes:** + * + * When this flag is set the height and width is set to 100% and is then scaling with the + * available space if not the absolute space required is used. + * + * Default value: true + */ + useMaxWidth: true, + + /** + * | Parameter | Description | Type | Required | Values | + * | ----------- | --------------------------------- | ---- | -------- | ----------- | + * | rightAngles | Curved Arrows become Right Angles | 3 | 4 | true, false | + * + * **Notes:** + * + * This will display arrows that start and begin at the same node as right angles, rather than a + * curves + * + * Default value: false + */ + rightAngles: false, + taskFontSize: 14, + taskFontFamily: '"Open Sans", sans-serif', + taskMargin: 50, + // width of activation box + activationWidth: 10, + + // text placement as: tspan | fo | old only text as before + textPlacement: 'fo', + actorColours: ['#8FBC8F', '#7CFC00', '#00FFFF', '#20B2AA', '#B0E0E6', '#FFFFE0'], + + sectionFills: ['#191970', '#8B008B', '#4B0082', '#2F4F4F', '#800000', '#8B4513', '#00008B'], + sectionColours: ['#fff'], + }, class: { /** * ### titleTopMargin diff --git a/packages/mermaid/src/diagram-api/diagramAPI.ts b/packages/mermaid/src/diagram-api/diagramAPI.ts index 748cc5f96..ddb22df2c 100644 --- a/packages/mermaid/src/diagram-api/diagramAPI.ts +++ b/packages/mermaid/src/diagram-api/diagramAPI.ts @@ -5,6 +5,8 @@ import { sanitizeText as _sanitizeText } from '../diagrams/common/common'; import { setupGraphViewbox as _setupGraphViewbox } from '../setupGraphViewbox'; import { addStylesForDiagram } from '../styles'; import { DiagramDefinition, DiagramDetector } from './types'; +import * as _commonDb from '../commonDb'; + /* Packaging and exposing resources for external diagrams so that they can import @@ -16,6 +18,7 @@ export const setLogLevel = _setLogLevel; export const getConfig = _getConfig; export const sanitizeText = (text: string) => _sanitizeText(text, getConfig()); export const setupGraphViewbox = _setupGraphViewbox; +export const getCommonDb = () => { return _commonDb }; const diagrams: Record = {}; export interface Detectors { @@ -46,7 +49,7 @@ export const registerDiagram = ( addStylesForDiagram(id, diagram.styles); if (diagram.injectUtils) { - diagram.injectUtils(log, setLogLevel, getConfig, sanitizeText, setupGraphViewbox); + diagram.injectUtils(log, setLogLevel, getConfig, sanitizeText, setupGraphViewbox,getCommonDb()); } }; diff --git a/packages/mermaid/src/diagram-api/types.ts b/packages/mermaid/src/diagram-api/types.ts index 23810d133..652f35402 100644 --- a/packages/mermaid/src/diagram-api/types.ts +++ b/packages/mermaid/src/diagram-api/types.ts @@ -6,6 +6,7 @@ export interface InjectUtils { _getConfig: any; _sanitizeText: any; _setupGraphViewbox: any; + _commonDb: any; } /** @@ -27,7 +28,8 @@ export interface DiagramDefinition { _setLogLevel: InjectUtils['_setLogLevel'], _getConfig: InjectUtils['_getConfig'], _sanitizeText: InjectUtils['_sanitizeText'], - _setupGraphViewbox: InjectUtils['_setupGraphViewbox'] + _setupGraphViewbox: InjectUtils['_setupGraphViewbox'], + _commonDb: InjectUtils['_commonDb'] ) => void; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5de78bdb1..2ba8f0776 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -349,6 +349,22 @@ importers: specifier: ^3.0.2 version: 3.0.2 + packages/mermaid-timeline: + dependencies: + d3: + specifier: ^7.0.0 + version: 7.6.1 + khroma: + specifier: ^2.0.0 + version: 2.0.0 + devDependencies: + concurrently: + specifier: ^7.4.0 + version: 7.5.0 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + tests/webpack: dependencies: '@mermaid-js/mermaid-mindmap': @@ -3634,7 +3650,7 @@ packages: /axios/0.21.4_debug@4.3.2: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2_debug@4.3.2 + follow-redirects: 1.15.2 transitivePeerDependencies: - debug dev: true @@ -6309,7 +6325,7 @@ packages: resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} dev: true - /follow-redirects/1.15.2_debug@4.3.2: + /follow-redirects/1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -6317,8 +6333,6 @@ packages: peerDependenciesMeta: debug: optional: true - dependencies: - debug: 4.3.2 dev: true /foreground-child/2.0.0: @@ -6911,7 +6925,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2_debug@4.3.2 + follow-redirects: 1.15.2 requires-port: 1.0.0 transitivePeerDependencies: - debug From 14ff8a857027bb24bb17fc34906271b2afdff568 Mon Sep 17 00:00:00 2001 From: ashishj Date: Wed, 23 Nov 2022 19:32:27 +0100 Subject: [PATCH 026/309] add runnning example --- cypress/platform/ashish2.html | 67 +++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 19 deletions(-) diff --git a/cypress/platform/ashish2.html b/cypress/platform/ashish2.html index e10ea6a2d..3fe223680 100644 --- a/cypress/platform/ashish2.html +++ b/cypress/platform/ashish2.html @@ -56,27 +56,56 @@
Security check
-flowchart TD
-    A --> B
-    B --> C
-    A --> C
+ timeline
+        title My day
+        section section with no tasks
+        section Go to work at the dog office
+          1930 : first step : second step
+               : third step
+          1940 : fourth step : fifth step
+        section Go home
+          1950 : India got independent and already won war against Pakistan
+          1960 : India fights poverty, looses war to China
+          1970 : Green Revolution comes to india
+        section Another section with no tasks
+          I am a big big big tasks
+          I am not so big tasks
+    
+
+ timeline
+        title England's History Timeline
+        section Stone Age
+          7600 BC : Britain's oldest known house was built in Orkney, Scotland
+          6000 BC : Sea levels rise and Britain becomes an island. The people who live here are hunter-gatherers.
+        section Broze Age
+          2300 BC : People arrive from Europe and settle in Britain. They bring farming and metalworking.
+               : New styles of pottery and ways of burying the dead appear.
+          2200 BC : The last major building works are completed at Stonehenge. People now bury their dead in stone circles.
+                  : The first metal objects are made in Britain.Some other nice things happen.
+
     
-classDiagram
-        direction LR
-        class Student {
-          -idCard : IdCard
-        }
-        class IdCard{
-          -id : int
-          -name : string
-        }
-        class Bike{
-          -id : int
-          -name : string
-        }
-        Student "1" --o "1" IdCard : carries
-        Student "1" --o "1" Bike : rides
+ timeline
+        title History of Social Media Platform
+        section Rise of Social Media
+          2002 : LinkedIn
+          2004 : Facebook : Google
+          2005 : Youtube
+          2006 : Twitter
+          2007 : Tumblr
+          2008s : Instagram
+          2010 : Pinterest
+    
+
+ timeline
+        title History of Social Media Platform
+          2002 : LinkedIn
+          2004 : Facebook : Google
+          2005 : Youtube
+          2006 : Twitter
+          2007 : Tumblr
+          2008s : Instagram
+          2010 : Pinterest
     
  timeline

From 5cfa919672ebeaaf5b45bc21a32d7cf49dd8cba2 Mon Sep 17 00:00:00 2001
From: Alois Klink 
Date: Sun, 27 Nov 2022 18:19:13 +0000
Subject: [PATCH 027/309] fix: support parsing indented mmd YAML from HTML

In order to parse the YAML front-matter in a Mermaid diagram, the
YAML seperators **MUST NOT** be indented, e.g.:

````markdown
```mermaid
---
title: This is fine.
---
```

```mermaid
  ---
  title: This is not fine, because the `---` are indented.
  ---
```
````

However, this makes it very difficult to write nice Mermaid diagrams in
HTML code-blocks.

This commit uses [`ts-dedent`](https://www.npmjs.com/package/ts-dedent)
to automatically remove the indentation from Mermaid diagrams when
parsed from HTML. Mermaid diagrams from mermaidAPI.render() are **NOT**
dedented, as that API is called from JavaScript code, and therefore
users can easily `dedent` their own diagrams.
---
 packages/mermaid/package.json   |  1 +
 packages/mermaid/src/mermaid.ts |  8 ++++----
 pnpm-lock.yaml                  | 16 +++++++++++-----
 3 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json
index 4b24fb661..ac905fd06 100644
--- a/packages/mermaid/package.json
+++ b/packages/mermaid/package.json
@@ -64,6 +64,7 @@
     "moment-mini": "^2.24.0",
     "non-layered-tidy-tree-layout": "^2.0.2",
     "stylis": "^4.1.2",
+    "ts-dedent": "^2.2.0",
     "uuid": "^9.0.0"
   },
   "devDependencies": {
diff --git a/packages/mermaid/src/mermaid.ts b/packages/mermaid/src/mermaid.ts
index 993f2f944..b0a7e4c3e 100644
--- a/packages/mermaid/src/mermaid.ts
+++ b/packages/mermaid/src/mermaid.ts
@@ -2,6 +2,8 @@
  * Web page integration module for the mermaid framework. It uses the mermaidAPI for mermaid
  * functionality and to render the diagrams to svg code!
  */
+import dedent from 'ts-dedent';
+
 import { MermaidConfig } from './config.type';
 import { log } from './logger';
 import utils from './utils';
@@ -147,8 +149,7 @@ const initThrowsErrors = function (
     txt = element.innerHTML;
 
     // transforms the html to pure text
-    txt = utils
-      .entityDecode(txt)
+    txt = dedent(utils.entityDecode(txt)) // removes indentation, required for YAML parsing
       .trim()
       .replace(//gi, '
'); @@ -288,8 +289,7 @@ const initThrowsErrorsAsync = async function ( txt = element.innerHTML; // transforms the html to pure text - txt = utils - .entityDecode(txt) + txt = dedent(utils.entityDecode(txt)) // removes indentation, required for YAML parsing .trim() .replace(//gi, '
'); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ebb71f65e..cc91b753c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -211,6 +211,9 @@ importers: stylis: specifier: ^4.1.2 version: 4.1.2 + ts-dedent: + specifier: ^2.2.0 + version: 2.2.0 uuid: specifier: ^9.0.0 version: 9.0.0 @@ -3634,7 +3637,7 @@ packages: /axios/0.21.4_debug@4.3.2: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2_debug@4.3.2 + follow-redirects: 1.15.2 transitivePeerDependencies: - debug dev: true @@ -6309,7 +6312,7 @@ packages: resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} dev: true - /follow-redirects/1.15.2_debug@4.3.2: + /follow-redirects/1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -6317,8 +6320,6 @@ packages: peerDependenciesMeta: debug: optional: true - dependencies: - debug: 4.3.2 dev: true /foreground-child/2.0.0: @@ -6911,7 +6912,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2_debug@4.3.2 + follow-redirects: 1.15.2 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -10613,6 +10614,11 @@ packages: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: true + /ts-dedent/2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: false + /ts-node/10.9.1_cbe7ovvae6zqfnmtgctpgpys54: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true From 4cc3b17d362b3c8edff9ac0ab7d7248a309fa988 Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Sun, 27 Nov 2022 18:25:37 +0000 Subject: [PATCH 028/309] docs(demos): fix indentation of YAML front-matter Mermaid diagrams that have YAML front-matter can now be indented in HTML code, see commit: 5cfa9196 (fix: support parsing indented mmd YAML from HTML, 2022-11-27) Some diagrams previously had a mix of tabs/spaces for indentation. In order for `dedent` to work, these diagrams had to be converted to using a consistent indentation. --- demos/classchart.html | 8 +++--- demos/er.html | 61 +++++++++++++++++++++---------------------- demos/flowchart.html | 12 ++++----- demos/git.html | 6 ++--- demos/journey.html | 6 ++--- demos/state.html | 20 +++++++------- 6 files changed, 56 insertions(+), 57 deletions(-) diff --git a/demos/classchart.html b/demos/classchart.html index 031f3b608..b879618b6 100644 --- a/demos/classchart.html +++ b/demos/classchart.html @@ -17,10 +17,10 @@

Class diagram demos

----
-title: Demo Class Diagram
----
-		classDiagram
+    ---
+    title: Demo Class Diagram
+    ---
+    classDiagram
       accTitle: Demo Class Diagram
       accDescr: This class diagram show the abstract Animal class, and 3 classes that inherit from it: Duck, Fish, and Zebra.
 
diff --git a/demos/er.html b/demos/er.html
index 06fbf020e..b5d1966f7 100644
--- a/demos/er.html
+++ b/demos/er.html
@@ -19,43 +19,42 @@
 
   
     
+      ---
+      title: This is a title
+      ---
+      erDiagram
+        %% title This is a title
+        %% accDescription Test a description
 
----
-title: This is a title
----
-erDiagram
-  %% title This is a title
-  %% accDescription Test a description
+        "Person . CUSTOMER"||--o{ ORDER : places
 
-  "Person . CUSTOMER"||--o{ ORDER : places
+        ORDER ||--|{ "€£LINE_ITEM ¥" : contains
 
-  ORDER ||--|{ "€£LINE_ITEM ¥" : contains
+        "Person . CUSTOMER" }|..|{ "Address//StreetAddress::[DELIVERY ADDRESS]" : uses
 
-  "Person . CUSTOMER" }|..|{ "Address//StreetAddress::[DELIVERY ADDRESS]" : uses
+        "Address//StreetAddress::[DELIVERY ADDRESS]" {
+            int customerID FK
+            string line1 "this is the first address line comment"
+            string line2
+            string city
+            string region
+            string state
+            string postal_code
+            string country
+            }
 
-  "Address//StreetAddress::[DELIVERY ADDRESS]" {
-      int customerID FK
-      string line1 "this is the first address line comment"
-      string line2
-      string city
-      string region
-      string state
-      string postal_code
-      string country
-      }
+            "a_~`!@#$^&*()-_=+[]{}|/;:'.?¡⁄™€£‹¢›∞fi§‡•°ª·º‚≠±œŒ∑„®†ˇ¥Á¨ˆˆØπ∏“«»åÅßÍ∂΃ϩ˙Ó∆Ô˚¬Ò…ÚæÆΩ¸≈π˛çÇ√◊∫ı˜µÂ≤¯≥˘÷¿" {
+              string name "this is an entity with an absurd name just to show characters that are now acceptable as long as the name is in double quotes"
+            }
 
-      "a_~`!@#$^&*()-_=+[]{}|/;:'.?¡⁄™€£‹¢›∞fi§‡•°ª·º‚≠±œŒ∑„®†ˇ¥Á¨ˆˆØπ∏“«»åÅßÍ∂΃ϩ˙Ó∆Ô˚¬Ò…ÚæÆΩ¸≈π˛çÇ√◊∫ı˜µÂ≤¯≥˘÷¿" {
-        string name "this is an entity with an absurd name just to show characters that are now acceptable as long as the name is in double quotes"
-      }
-
-      "€£LINE_ITEM ¥" {
-        int orderID FK
-        int currencyId FK
-        number price
-        number quantity
-        number adjustment
-        number final_price
-      }
+            "€£LINE_ITEM ¥" {
+              int orderID FK
+              int currencyId FK
+              number price
+              number quantity
+              number adjustment
+              number final_price
+            }
     
diff --git a/demos/flowchart.html b/demos/flowchart.html index 7251e586e..60e6160c3 100644 --- a/demos/flowchart.html +++ b/demos/flowchart.html @@ -17,9 +17,9 @@

Sample 1

graph

----
-title: This is a complicated flow
----
+    ---
+    title: This is a complicated flow
+    ---
     graph LR
       accTitle: This is a complicated flow
       accDescr: This is the descriptoin for the complicated flow.
@@ -224,9 +224,9 @@ title: This is a complicated flow
     

Sample 2

graph

----
-title: What to buy
----
+    ---
+    title: What to buy
+    ---
     graph TD
       accTitle: What to buy
       accDescr: Options of what to buy with Christmas money
diff --git a/demos/git.html b/demos/git.html
index 99c53d7d0..5e683152a 100644
--- a/demos/git.html
+++ b/demos/git.html
@@ -16,9 +16,9 @@
   
     

Git diagram demo

----
-title: Simple Git diagram
----
+    ---
+    title: Simple Git diagram
+    ---
     gitGraph:
     options
     {
diff --git a/demos/journey.html b/demos/journey.html
index dadcfb13c..96c89a215 100644
--- a/demos/journey.html
+++ b/demos/journey.html
@@ -16,9 +16,9 @@
   
     

Journey diagram demo

----
-title: My working day 
----
+    ---
+    title: My working day 
+    ---
      journey
       accTitle: Very simple journey demo
       accDescr: 2 main sections: work and home, each with just a few tasks
diff --git a/demos/state.html b/demos/state.html
index 3d070f379..9251e837c 100644
--- a/demos/state.html
+++ b/demos/state.html
@@ -17,11 +17,11 @@
     

State diagram demos

Very simple showing change from State1 to State2

----
-title: Very simple diagram
----
-		stateDiagram
-		  accTitle: This is the accessible title
+    ---
+    title: Very simple diagram
+    ---
+    stateDiagram
+      accTitle: This is the accessible title
       accDescr:This is an accessible description
       State1 --> State2
     
@@ -47,13 +47,13 @@ title: Very simple diagram

----
-title: Very simple diagram
----
-		stateDiagram
+    ---
+    title: Very simple diagram
+    ---
+    stateDiagram
       direction TB
 
-		  accTitle: This is the accessible title
+      accTitle: This is the accessible title
       accDescr: This is an accessible description
 
       classDef notMoving fill:white

From accba3f408d1f1a9a68a05fff9899e2d51627fe7 Mon Sep 17 00:00:00 2001
From: Alois Klink 
Date: Thu, 1 Dec 2022 22:43:03 +0000
Subject: [PATCH 029/309] chore: improve errors for bad YAML frontmatter

Adds a custom error message for any mermaid diagram that starts with
a `---`. Normally, these are expected to be part of a YAML front-matter
block, but indentation issues or a missing closing `---` may cause
these to be not parsed correctly.
---
 .../src/diagram-api/diagram-orchestration.ts  | 27 +++++++++++++++++++
 packages/mermaid/src/mermaidAPI.spec.ts       | 13 +++++++++
 packages/mermaid/src/utils.spec.js            |  4 +--
 3 files changed, 42 insertions(+), 2 deletions(-)

diff --git a/packages/mermaid/src/diagram-api/diagram-orchestration.ts b/packages/mermaid/src/diagram-api/diagram-orchestration.ts
index a26edb303..6c7ab6907 100644
--- a/packages/mermaid/src/diagram-api/diagram-orchestration.ts
+++ b/packages/mermaid/src/diagram-api/diagram-orchestration.ts
@@ -125,6 +125,33 @@ export const addDiagrams = () => {
     },
     (text) => text.toLowerCase().trim() === 'error'
   );
+  registerDiagram(
+    '---',
+    // --- diagram type may appear if YAML front-matter is not parsed correctly
+    {
+      db: {
+        clear: () => {
+          // Quite ok, clear needs to be there for --- to work as a regular diagram
+        },
+      },
+      styles: errorStyles, // should never be used
+      renderer: errorRenderer, // should never be used
+      parser: {
+        parser: { yy: {} },
+        parse: () => {
+          throw new Error(
+            'Diagrams beginning with --- are not valid. ' +
+              'If you were trying to use a YAML front-matter, please ensure that ' +
+              "you've correctly opened and closed the YAML front-matter with unindented `---` blocks"
+          );
+        },
+      },
+      init: () => null, // no op
+    },
+    (text) => {
+      return text.toLowerCase().trimStart().startsWith('---');
+    }
+  );
 
   registerDiagram(
     'c4',
diff --git a/packages/mermaid/src/mermaidAPI.spec.ts b/packages/mermaid/src/mermaidAPI.spec.ts
index 55d46ae7c..092661dc6 100644
--- a/packages/mermaid/src/mermaidAPI.spec.ts
+++ b/packages/mermaid/src/mermaidAPI.spec.ts
@@ -629,6 +629,19 @@ describe('mermaidAPI', function () {
       expect(mermaid.parseError).toEqual(undefined);
       expect(() => mermaidAPI.parse('this is not a mermaid diagram definition')).toThrow();
     });
+    it('throws for a nicer error for a invalid definition starting with `---`', function () {
+      expect(mermaid.parseError).toEqual(undefined);
+      expect(() =>
+        mermaidAPI.parse(`
+      ---
+      title: a malformed YAML front-matter
+      `)
+      ).toThrow(
+        'Diagrams beginning with --- are not valid. ' +
+          'If you were trying to use a YAML front-matter, please ensure that ' +
+          "you've correctly opened and closed the YAML front-matter with unindented `---` blocks"
+      );
+    });
     it('does not throw for a valid definition', function () {
       expect(() => mermaidAPI.parse('graph TD;A--x|text including URL space|B;')).not.toThrow();
     });
diff --git a/packages/mermaid/src/utils.spec.js b/packages/mermaid/src/utils.spec.js
index 54262f10e..bdf94d992 100644
--- a/packages/mermaid/src/utils.spec.js
+++ b/packages/mermaid/src/utils.spec.js
@@ -238,9 +238,9 @@ Alice->Bob: hi`;
     const type = detectType(str);
     expect(type).toBe('gitGraph');
   });
-  it('should not allow frontmatter with leading spaces', function () {
+  it('should handle malformed frontmatter (with leading spaces) with `---` error graphtype', function () {
     const str = '    ---\ntitle: foo\n---\n  gitGraph TB:\nbfs1:queue';
-    expect(() => detectType(str)).toThrow('No diagram type detected for text');
+    expect(detectType(str)).toBe('---');
   });
 });
 describe('when finding substring in array ', function () {

From 4f1b26fd765658b1cf01e0b1ab71597a5e44ec7b Mon Sep 17 00:00:00 2001
From: Knut Sveidqvist 
Date: Fri, 2 Dec 2022 08:06:16 +0100
Subject: [PATCH 030/309] Adding new flowchart renderer using cytoscape

---
 .vite/build.ts                                |   7 +
 cypress/platform/knsv2.html                   |  27 +-
 packages/mermaid-flowchart-v3/package.json    |  66 ++
 packages/mermaid-flowchart-v3/src/detector.ts |  24 +
 .../src/diagram-definition.ts                 |  14 +
 .../src/flowRenderer-v3.js                    | 674 ++++++++++++++++++
 .../mermaid-flowchart-v3/src/mermaidUtils.ts  |  56 ++
 packages/mermaid-flowchart-v3/src/styles.ts   | 114 +++
 packages/mermaid/src/dagre-wrapper/nodes.js   |   1 +
 .../mermaid/src/diagrams/flowchart/flowDb.js  |   9 +-
 .../src/diagrams/flowchart/parser/flow.jison  |   1 +
 pnpm-lock.yaml                                |  60 +-
 12 files changed, 1026 insertions(+), 27 deletions(-)
 create mode 100644 packages/mermaid-flowchart-v3/package.json
 create mode 100644 packages/mermaid-flowchart-v3/src/detector.ts
 create mode 100644 packages/mermaid-flowchart-v3/src/diagram-definition.ts
 create mode 100644 packages/mermaid-flowchart-v3/src/flowRenderer-v3.js
 create mode 100644 packages/mermaid-flowchart-v3/src/mermaidUtils.ts
 create mode 100644 packages/mermaid-flowchart-v3/src/styles.ts

diff --git a/.vite/build.ts b/.vite/build.ts
index 1be46ad5a..77cace03e 100644
--- a/.vite/build.ts
+++ b/.vite/build.ts
@@ -41,6 +41,11 @@ const packageOptions = {
     packageName: 'mermaid-mindmap',
     file: 'detector.ts',
   },
+  'mermaid-flowchart-v3': {
+    name: 'mermaid-flowchart-v3',
+    packageName: 'mermaid-flowchart-v3',
+    file: 'detector.ts',
+  },
   // 'mermaid-example-diagram-detector': {
   //   name: 'mermaid-example-diagram-detector',
   //   packageName: 'mermaid-example-diagram',
@@ -120,6 +125,7 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions)
   if (watch && config.build) {
     config.build.watch = {
       include: [
+        'packages/mermaid-flowchart-v3/src/**',
         'packages/mermaid-mindmap/src/**',
         'packages/mermaid/src/**',
         // 'packages/mermaid-example-diagram/src/**',
@@ -148,6 +154,7 @@ const main = async () => {
 if (watch) {
   build(getBuildConfig({ minify: false, watch, core: true, entryName: 'mermaid' }));
   if (!mermaidOnly) {
+    build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-flowchart-v3' }));
     build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-mindmap' }));
     // build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-example-diagram' }));
   }
diff --git a/cypress/platform/knsv2.html b/cypress/platform/knsv2.html
index ba7f41601..b5b8eea5e 100644
--- a/cypress/platform/knsv2.html
+++ b/cypress/platform/knsv2.html
@@ -56,14 +56,20 @@
   
     
Security check
-graph LR
-    subgraph external
-        inside
-    end
-    outside --> external
-    
-
-mindmap
+cyto LR
+      subgraph test
+        inside1 --> inside2
+      end
+      subgraph test2
+        inside3 --> inside4
+      end
+      out
+
+ a(letter a
a) ---> b(letter b)--> c(letter c) --> d -->e(letter e
e) --> a b <--> + d(letter b
d) +
+      mindmap
   root
     child1((Circle))
         grandchild 1
@@ -78,7 +84,7 @@ mindmap
         ::icon(mdi mdi-fire)
           gc7((grand
grand
child 8))
-
+    
       gantt
         title Style today marker (vertical line should be 5px wide and half-transparent blue)
         dateFormat YYYY-MM-DD
@@ -96,9 +102,10 @@ mindmap
 
     
     
+```
+
+You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/fcf53c98c25604c90a218104268c339be53035a6/src/lib/util/mermaid.ts) to see how the async loading is done.
diff --git a/packages/mermaid/src/docs/vite.config.ts b/packages/mermaid/src/docs/vite.config.ts
index 15652c21c..a1d92c736 100644
--- a/packages/mermaid/src/docs/vite.config.ts
+++ b/packages/mermaid/src/docs/vite.config.ts
@@ -36,6 +36,10 @@ export default defineConfig({
         __dirname,
         '../../../mermaid-mindmap/dist/mermaid-mindmap.esm.min.mjs'
       ), // Use this one to build
+      '@mermaid-js/mermaid-timeline': path.join(
+        __dirname,
+        '../../../mermaid-timeline/dist/mermaid-timeline.esm.min.mjs'
+      ),
     },
   },
   server: {

From d6ddf9568ef3ac93e23c546cb59168e0a38feb84 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Fri, 16 Dec 2022 00:49:35 +0530
Subject: [PATCH 066/309] Fix theming doc

---
 docs/book/class.png                         | Bin 0 -> 34954 bytes
 docs/book/cover.jpg                         | Bin 0 -> 17803 bytes
 docs/book/er.png                            | Bin 0 -> 13419 bytes
 docs/book/flowchart.png                     | Bin 0 -> 14794 bytes
 docs/book/gantt.png                         | Bin 0 -> 43239 bytes
 docs/book/index.html                        | 340 ++++++++++++++++++++
 docs/book/sequence-diagram.png              | Bin 0 -> 19823 bytes
 docs/book/state.png                         | Bin 0 -> 15574 bytes
 docs/config/theming.md                      |   6 -
 packages/mermaid/src/docs/config/theming.md |   6 -
 10 files changed, 340 insertions(+), 12 deletions(-)
 create mode 100644 docs/book/class.png
 create mode 100644 docs/book/cover.jpg
 create mode 100644 docs/book/er.png
 create mode 100644 docs/book/flowchart.png
 create mode 100644 docs/book/gantt.png
 create mode 100644 docs/book/index.html
 create mode 100644 docs/book/sequence-diagram.png
 create mode 100644 docs/book/state.png

diff --git a/docs/book/class.png b/docs/book/class.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b2f663d86f967ca5d96c5fffca73b6e8efb3ad4
GIT binary patch
literal 34954
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

y{(-`u^dIjWHRrLfhUK$DDj6 zAJZ;K3mKaPEk0j~wW~8}E9FG(;;Tw9#r*+vY)AgRg8gsuiRNcmHjMAH?C&^9I71TF z-v^s9p8s6C3j_cV0Q&z)x!$j}&etf4Jy?d__G8Y}xizNDG;ip^i%~$K8 zbK9qpe)8<+;=o?Z^3GgH1C{e zq>Zpj9r?`69=R*xnNW7wJ!H0rGhQV+X_)$Fy?|KvS);Ll#; zD7H39tmsy3QP~zZ1ta`pPC>cjqjBOY+f9NvvgRXTLnHm?Y{L0I31{|B$34B{g!>1NtU-p+uP-~e196Sb`@^7l&I z-!izuiw^_KE|SfWkcvw%V5NrmFsSE@edMF6qSRDRKnUYiOY~e{#`BhsPz9&{G3;;p zQMK<2_RHZ3xPWhJwKw0{{u!$$tJ9jTIJ3oQA=*-XTFttL?<#qGsOM5KOgT!$5UXvU zfMKjNS>5_^;`0Po=(~s-9=;brH?l|WIo~P?_uNVT08+{Wo{R3EMm4a|e8B$DYK!nxt3=L3^sjkHMfV_mhkTxJ4&5E_NVj_sD4ll$RNdu! zEsvxB;S;^|{7D*petLAQa{78N0k*mb!!MVt#oX&=jSXQ{3h{qDo0yEaeL0o_nL59r zVm}hdgYM=q!TF{%@Yy)e+Q=Gj8?T7beMsA?vTH8)dKq6=oy%A8M`*suVA^t%P(;h_ zq#Xwso&DU($cSNQyty`lrK&9-$0?z%#9HqT#mVyM`o@OW!ryVex;lcTi!UZpn`GTv zczw)aQhEt3mAHZ7K*U)zIgH@6qneiFGL9hMxQ(>!giY7-7cZ%-$DU(G)79xFEvVt7 zG4-k&D!o?{%k-lz;*)RT73Y%AE%1ZMuy@>Bk-IuF2Y$yh&sATMFyilyd!3ly8sCyc zQ|?hENr2d77~7|uD10C9U7@G2%MF6QZ&Z`bEcB?zeqR|(+1g)jbQLXol9@s5SkrB} zy*%LU{?=}B+E*;SPItE4p?zhR`RSu&COHI z>_=z(1BE1>1BDFlhgUc|IeC+9g>ZF|_{*X#Xix@XKPJucui+MmAegLkT@M;Q6xUL@ zY}ZmH=He%50s4N!R7R=wR7Ue0?oN#o<-fn^cBUz*^&DXc%dAYp=cDq^_#3yjNS~Uo)3^j^0>L%71a~I{32woqg9HgQ&>^@J+$BKc zK>~rs-KTTsy;*O5%vy8rn;-MS^(4_*X;m6;H8o*M9X__chSd`V&fKk;Kh_c_7MMLm|;3`$Wyu`vbbRglNN=n zMmq}wbo|Yfc3Z`1t^Rmm#nszyx2Lc-6;yU|6nrpjjE%nP1gTDDp{EIcA|H^dm<@qJ zPqR>eRtPM-@{k$lJB(h|5r_Q8G)qIMA<4CIe3tyd9p)y0<&7jR4mklIC{i&J0+E#_ zB4l~^4oa3t7WyIbBQ=HW)1NRV7Uus=h|d6baHB&Q3X{&N6ot8^d>Dy#;w}4I?av^0 zJF{e(5nv?3pz&XH{(pwz|4m;0h0AcL=Ds~-u1|x1-sA3XUBOFBDh1_k*jQ@Mz4+3} zyOTEgy34JH+yn49is)j7OxM7UHQ*ULfHz<{Bfa-gfg%&(@W>ymyce<^WTlpD^q}Dp zZdj^C(8u2=#~}2$`!!;`o69ON4A^pVuxg9HNXd_jn{@I_S)%-)xu#zbEwC`H4_YIpDMcOHA+7q3Kk0y zlv-r3PhNJnBZ~(KJf#3(05#b`T3kWIfGHwl=i=Kp48R&=CH~3r?`uaMpzG1g<$Jc5 zL-nd>b_v+x`C|#Z0*s=~+ReCt^O5U!%K zCl}ZFXGBCuOn{@UgB4s{Cj_hrU3#;ggBeF^GJ0QVVLcg{H#Fwz-a)6*3|agO}}RKg{kNHgB9|yC#%FdnUm(TRntNN zy#UZGjR9cc0>N+&rknZOe$wB5EvRiJ5?maQ;qm*zjWuQ`q-6pf5#e@bOkGF>W110; zQYQ=sKfFdx6$&He61e`Ue2y)2q#hm~f&NdG+5c4yBdmF)#ghPDM_G+ffsOEiC_oGm zoE9@Hc9fS(hY0(BqLkHLMtx)7-j#@N#&KC!7#d3zPD`mqBtJS}(8!yK=4l}gVMEp? zrkOI4n3QR+o(X>>PND>EnDo}Q&U$V0A?dgNmTk6%qVi1M`&6L@L75Z80~S9b!Xm|x z>QmL`-6t>lzKg+tHaL_PH|)(%-+4MGg?R=O0I;iV<7krZ^>Oq2ar<#0>h3C4=(1?3 z8o^okikc$IOv-U5i((xasNH(^`E!H?)s}FCc55Si$n(P@hTLN!#Dl_GG>kmDIVx3X zeCe|2g;QMM)xZp!M6x9s+b^N=#^iQgaq#-ae}5}gh%&!vj*TKZLmg{&<%cs|qjG1hw90a8n)7xr9qa){&nahrix8THa` z?VHLkL*G5U-s?)|r=iNSZThmGe1ECFcYMy(+H+NL^(E?Vd{O_I2u`T9(&}W4YLLo^ z^}hJV8e^5Pyr?!C?*OgpVTQdXT%1 z@@6|g!II*!W3K5KR?%fMQaO>DLV1<`^LbZxKvRsAvw!|FsloRX1gC3A1$Exb$#jhx z%fXLIe0q_Gdv`4TztNMHl$7RmgU|ci>|yXlMFi)KrOvwhzl1!k3%20Gg|gj*+dcPYsZ zzCor5ID8`PrvjNA`N`yDe-3S&Zce|?qy{&OsXVndg@U>n))-7bGH*(osX#9xDA&tw z6&DN1YaQy>MS4W4a_y`B2Pu$Mqp`R4`-MOmQ;qQlW zU3|t+<^`)vbh=Hy-g&Z5Z9Ywhd@HKKO;nNQfpV&iiX9fB4Z3kDU^aeqUi_RsR619) zhl^jD2sh}upPpFd%bPUDNa@PF>Pg*;4SAUxLBs<#+%T?d1R{hld5)A68K_H$EE0{i zVIsVL;y7!&(B^ae@xtCRt;~ankb|2hR$+Y5G!nJd^{VR)wWfv64ws<(p%g{(GkQMS z@81=uiCQevzS$BH5)8!3KXN}z7H!Z$dg>BxMWmFT5&r#>$s4efHG-QT8Ix@$z#x%n z6*<$-t=mOS!R__ard&?8`O7i6t$uhB5S((Oi=-4&aVTv)9k#^Hrxw2s=UO}TussYX zN2pA5;f6);4$P6p@W(VQh!1zY5%{Ei7_823U}7A|L|9p>d2X@cxExqvmXFF5jDq}D z2GhhA|E6?`tiN$s($K#^mPq`TqFC#pAAPwupJv5-l5F(tF(1fqGi6+tz^EDGUzU@U zCZxFwe)41HGvtbu#j)>Yu4IlC?}2OSAR1>`$@e6Z_otU-mEnC!SJ^$Xq{UG7GJ11j zxRrU(+kf)wCtPE0559PLB&AJfcTP`1XXP`8nmg{H9>Srt76uaZtJ2fsvlxP%lWJw- z4HdfSd615X`O57tXePtcWHGaI^gRBFm-wLfiA^T68C2&U-{VO2i7I}1 zLd!Ff?=?*icr9sE57Z)O28|yLn?i+=cjZP#cXraj5VN&+sfWV6d=UE4_u7)UVVX4j zq?j(@x=0WAw`*A52A;%5srC!RF|T>ugOr~B+y`YBKj+_}@LwhNMTV7VIiQpZ4p%x< z4+$g@DjHziumbo%e|KsGNKAO%hCth0hoVgUTQRcgxm|}(z7Z%PP7I|7CiN-dN zj_Wtg_-Ci`Ys@EViun6?`6X^dgx0fZ8CayDW+^C9c={7uoM0?@)^A*S8CTAmBUS4uv%F;Z1kC z8!w1%yN2)ELv!Ls7BenC7KA{6h4pTziNAjdN>u9;YI$-{s%K?0od- zt#jJ9=N~XjhKGa+oV}mmy@R@I%2-X4n`-5Y;s(4`f&#Oj4_V196<5+I<2qnlsbw)S zET;ae)W|U5NZ${bvw4YFAD=!uqB4(bhi!$s(a>0r^D|fPut~azsUoA}6OAI)O8G#*y5%lz&oj?cGlHpHLilZyzEuzTiE^aQs8ISg)gw1?e*68U zzMt60&-E`DGz>EuPw0zznIz33QPSBmMG6!EG&Msnq^j`g-K6(h^bO=c3sB$-?_oz* z-pKDI!XUs++lu)EJG<>pDV(Gewk3KTcj8KvmHo7dg#8VAGG`M5F+-D|HEotizu^Nl zmc3KB5|L#qz2>K@Axpui^29*h2&TnYvSXVZi8O(rZP z>rbM1L5=xO0~7?`C24s})DXYG#z{!ajgU-c#~XlmTMo|H!? z(S+NWz3T)N=}}LL8`gIib0YtfT@DTAmxiKvV%F0tCeoCVtS?IeYyZu2gd|Wv^ZihkPh{!_OAF;2Pzjng_+DZO6 zbJJBV$+{XhqA1Uy`P!V`lBab6fi_+?{Gc%boAY1}%?s9q5nj+-$x`hu5j^LmwkN%- z%_~rFi@~}1SPDmg#mpBd5usRG?fVzKB^;Ubgi2iy3>5N=HT-qPgn=i0RADBpek<5g zfKKe{5pKNAF-VjL`R$Li{)4Dje#4~&8(Tu}>RB0R3u{~C1$Dw`pER~au0D)bH$5<& znpgd`B$P=zVS2xBp{VF{s4hp@vB`g7LsI*qQA2BH!hd4u9ll+Z^9)RJFDmfXAd1C@4Z*l;q@Wp~t~KyJxgO zdjK;=W?MshthyZ#k{l83+KgO@{xDk4j}tJq+x_lQ`Inql z_l^IEfUvjee8Ud69x1Eu;)3W8kIIHAnfF1ZfJct+)Qh&aV8ymA1E8;26Mex%4`@?Q zKVE)9Lw1>tBWyMMAr?23nNj$#=1ZI7mJzb$bS+}!B{fmQnHy#v^%Zf<&8`~KUT(zW z4*3^?)eCkds+zao6QaoV^|(X%@G#boIaZGI%;BxncbF=c*?*r&H;JPg3%XIkLCg#s z(!R}~OR}bC@oVWm+WeEoqsx`rOU{4^q`#}S5KtejH9WA-nP0^-4ZY1yy?+(ZT&R4O z+3==oq6nelT>5-ar}57%>}OylP5hr;Qtm6ybFba=Oo8Zbe1P)IFV;tUvUgu+(3oFA zbCg_eaZyCKp85RviK7x^njhaJ2$eK(#$?>%Y-yIO~zSEXCz^>vT zgV=UeaZv&j<{@6sn8c9wLsHl=7*I{Rdt+1R0e^Jsg304Z+ZSDvHA8yVohLq#tv}LG zr>=Yz3shq$0@DCOUf&RfrWUK8e*oFsYsM3T=YKaoVVDCzTZ0Vgkip5u9YSh3L!m;& z7HJ<962?*QS-Sj|vcO_nBwv?!aUTFATwdXk;$TuE$PBhIF1j(P|3+v|`|wbrxKH9} zsGPms1oVsNhLN1KS*_StCG1M2EoGH1Dulqvflb|v;S+#~T$umeg6T@}2YujRa&2L6 zrZw;#99uWIBg(d~ zE0@y3ti+0ToaOTS(O0Sl@H-gSE!*Q_T3yIp=YKIh|LY4F6dO5K(%f)Gt)|f>w&<(D zGGW4+pLln6T-zA|UNX@8j4odS)aqU`6qM)0~1mp^DZzC z%l-YICTtatdsBK(iTFdtk86sXUPG_@Z&#Hj#fn>#TCCQ^u^dQKz5TiA+lvjVzYR=Y z;;(Y?N~fJoD^EQ({fGfwSoEipTU=f4S^F#Sk0-ipe%*9xf{+l|^>Qr0P#Q+EKaB;t zr68z{cujRq-@FpL+5tG@28sffHvBiT(Pg;pLCjSuXHkjA*x@TYa=<@&!9sBYK!^+R zmie65*-JlFw%`(zXbe5+*(UY@04O+D&-YuU0yJDi6HV zQ$MFznLT|DuBe#jWfWdIJTg|kgJ1o$W0L+ihW8C+`q_KS-Q0Nw`CdQOJ&1-|X?s>Mmb(cP|rCcf{D!@U zzN2f0v}r^4M8EN|@^MZ^g=&JL)b1oy5n0|)K=2%YHc?bBc50NM3EdVu|L*>@(WCOP3Z185d?1kL-uTQ;B-;*mrotA0dgb%YW?pVSIDK(wVyyKk z>H$oCS!w-2V?F% zq86>MD)~wAaPIr{pex>U(x{2f=UdXhyegvBkE5s!ZJzUn*_m&7zQyZq=p;NLB~CEH zElpWgG#U?M-S~pl)CTI-bb+Qn7#wH+Xl|c;Ohl_?sHMRttaYmn(NTrg(3^hcX8k^G zKY{%t;PN%euUou_5qNtGKGizX`F3|K9@2t4Gk?U2P&Jy0jjh+C2~Xd;wF@P-f}@vG zj1zpiu#r2fhGh-$ooZ%tYO+I-iALeq<8uKNBuQzWbm272izW%KrGFwj<&EZgGF$nr z+=C#pMi2R4y%M68@4`-3HH<4{te3?^|h?+!@ zNy_l6`?~Sw`Wm)K*s_y@Wh!)#TAs4w38~tP);&a&x6e`+y6dZLZT0-D7hoef>PC=i z>otNOL8Y=$zudH6XS%2^#pt5j@6b#&3FXO`WUtKqNH#80=rX4hao9fAHfT6`{= zKij;tDu^bf9l0=ifp$mZBV@$hL=vGny!@?m%J6kIU(NLcmhEt3q29t>eGm8Axsjk> z4=I+5^)ap3``{n&Wzu5Q7Tqk)1dtxWsiGh9p9G7~N%tXpvD^mNt0{Lk5z_GBPjw$B{A?GrxKF7%Ap8c@EI% zXK3^`yx=?gAiPUsK?3x;RGvXC;USysSF1pGi(2@#${S1}(x{lq(PK241C1^_+(OBs zseClRlk3*W5YKilXYel%!TJvqXN$Ntlqg+$j??cE1I^B^Pu%rG-xKGM;T%SJdLHTx zE+1k%tV92lnc}kvkwjI_n6G9-5Z|1!hzK)A{C_+UT4ZU8a&(*5jPDe@_8Zk$esMZ5 zdC`3-c43AK^FSI-NcNR{4mY4Cc@99Vj}ssKU>b*Zz53x3v(X7 zO?G+Gvz|7^?756;yeb16X7pC>usCu^x>}=2u?RI2Dh%ZIelIpWl#FWl{iRZ?N>e*wfj9D1@p3N z_mhWGs(8yv(?)h8F_HT=BPtRLE~AO;ul!a2WVtPRTX>&~o$^*(Ol8+WER3I|$rd&0MyBDki@5xRSdDR&YZ*670e3 zLp%y3Tj0AQOr-sW+7(ahx6w4tkv{IVvWCTt@h--+*o>}2Tez%hSM{}PrZHT-!z9nv z_p;Nx9Wm3%Ly6Iz;*>b!k7st)*ElxtHO)3Tq+Qum2C=2k_UO1460R?a>k656Xg*eg&xY~E^RNK+XyaFoG2OMh zk*|8*H6P~P#{_TgAIw@a4r4OB$CkWxJC@ep9Jgu5ehg&4u{kb_>5#|? zZlGHPLweoT;H_my`m}4(%u8#&Dqfr!?u|uC9Xro9bxBEnbx%s2?v^-^cI8>nM-i89 zZJBd1KuSG(xI-oc2I(!`1M*kDQ+96xeY59VL})!V4L0d8xR&vF+2IRQ*8vmS zecY>M^_tKru6xIef^l?qf@81whJA_Gu*XhjcgLla2I)ddYOWs{6cekqZj81!cn%WE zvf+ZG^Do#GEGknCqWo+WNAiXd-|7h+DJU!lT^}*fa5WJMxqp3VHa)Wu3pK3P=20ShaqR?bA#WPkeF1!vVl1dRfif{( zLc%S5)ETBkFvFP}Ngx?;V|>?w`sHfgvK(XM57R~`T|05$j>ajz{H?Yp`Cj=~45`IW zJ*GRQotM%9z1GC1?4Bge=B(isdXf)6_V)tj0S;0 z&l$UBm;1OoD_n+NTV7pDHvi^qiiE$pDeb-NCF{**qV%<)W2i_llGWir*J^dMiCaW8 zlWREMvsEQ8nlIA7AsRlY+r19zlF?7zze53}5g5hfM8GKI~;d%DI2a z4`sPmPp^e~lFN>K2jTEEb|-vLCW$iVS-TRmpn|Nw_EPK3Tm0QyNZ2awixM2l=4`@` zwe=tCS`7TSayISIo;(mF8|xYmdT!D+JVc;lueArJvlBdj)?9WIfyE&N%I*G%MA$RA zwi-M-Q&~b+$9n4n5h#{OLv}mz zrRRU|-eoI%g17{-J-bC`p)6d$$7&7lF&Z2GFmx45^Jx&iJT1RhXMeoqj57@(QPgL= zhy~UrTo#=sR<2Ecq@cT+52V_s>AVy2FIs|aV*a%biAJ);6jT&)J1z=^|3-3}^)Kg1 zHIlWqxC51M9hCCFJ)m({O&Km4qZIihewa}3Pxkoa$39-e*mcIEz+YGJt~N$Q--D=v zzZGp=q$;%IH+I(p!3tOwP86!!^^EJv*2}_8V^{T*VW%?s(DK2M(I4a?t-NUr%Q|6) zs-u*GEymTtkh53gg>lyq_~*;JV1=w)`ih!BMZ&14?_^P@qUyoaE5(QoXsp(4RHi>E z0BL(_=nDv(M{;X@x=naQu|u-`7#Z;BH?XpCO zibxqOP;ld|8|L4=8itIFpKg4*`5^say=NA6zBb3eQ1B(-drhEoT;@{^q(=Nz&SHd5E*%q5DL<5JFp znAgm#ptu$N_%lsE!)W|m?>;n-o>lb1i~t9-G@30rMKRg<_&R?5sLaaSqU1oLE?eYh z+vK{3{|rZ%stWpLpd2nTHoEM$_#d0ZrF1NZlu;2eu#yi>3dsQ)Y-knr^%t%vRK#ka zgtF`aD=Wy~bk7Ds6Ts#~6uVu+*sP>YD0e0!4<(YeRY+FpIJ7G?1*ga*{u_D**3~PN z*AD&kM7m3Kw^tCsIr;2Au(Iz=@Y?j=&qjm(y9zG|#T>@+kCJp(nP*L2rg4Q%yOgB< z&p=Q#TD(!F@UXVVZ&vB>@l)jmlFVr(a1z`~Zz=#yH3de^$6z0b$UB+Tq2>vw=c(8( zVYKHpt4B4~D5C?w&mdrSV107)AQXorr@Ws&Xh*F z%}txo9d#30Pk)UflNAmR8Jj2Q`ySYdSnu$Nxac(WedqM!rbFfjTowFm;b{|7tfoFV zh0ic(F{j|E6CPqWLNalgs^4>E()dLsR1CxHCNdIHUq1!@lwVKFnNjM2s*VKlL$j}#>1 z7{(qwN=De*6a~ZjD z4(*jOQu^`{wnC1hf%m~jcD!ulCo5ro9QK!HHBVygq#za>WDvZ!eF-6isi$}4tL1`v zUvxky+*TSC^YV&W2xKS8rO-}>oDVLyliZFc-9Jq-!WDe5Z7Z9LR-aB4cv||Hj2a96 zK-&wJ8tE;KL2Hw4p^gtSPCo*-pk zDONl5OoreHA@TSl4ont3=wk}GQpHceh)l#*>4mhV%T&z^^2s zk3E9t1wO&vXEL>a0#6{su*iS)D@HmmEH_vXB)-3w?3B{XCQwnts5(p9Uw&&Nnh%u* zuVc$yKE7#Y1Yo#Jz?c(5s~D@7ijAHHb$uQk)YRWvGMXj+gndiapfys|oV_rO?Mzcv6`Qp8VEroeH;9u0L6F5cx(Jjz(Ji{d=3Qk& z4(y-Is4S4tTFu96qawIo-ENsnoF*)h5-&60{Z zT>oBlm1S;Xgp)?~#76EfAHf^{mf-;xY%2yhH&=4@sB5#(+k{RyV}Qd4X-BXjBSnwf zQh&w1oqjwh0p-SRFc&_?bsaeS4s21i6ER#Gu^w124x+6!LkuTKyeekc`W*BAhJC1e z?xgGSHFHP+*dZRYe%7@Cae+0?$Y#~0i95&-(d}DGg6w5%-ev{Pnt=^RTNzti`v34} z+&cR}QL=``p?}Y4<8u(NK5ADp4&+Y-){BCaA4nvL-cOAc1kdalMcqOlcb|3rf+R*K z2Id6KscWeF&S0L&=uym*>fm)_{50NMbGgu%2pZCvph>W^JZ_ElnSq#S=J~p+=edcJ9EwdWAFo_ zVgBLn$c;#*l!YOtkQfz#0M#?XiKE_mUz-GyIDsitkYt(vYU+pU-*YgKOoB}+Q;O36 zkbS9#;mek$5PwnnAC^(@r&eMAlf>>K+Ul_GwuMfF3SA!w_aeT9=GWOg=GjY!cm2Pf zOST8XOa2Zd^^wn#T533h#ku((_7HMVigdj};s|4-?J~C`YKk)+C0-viql%9$(>BTS z(3>R9(C~36*jx7h?^ewJ)gGb$+=kBo3%soVow%P58zoKo`@uRssb!kh)ASrZFkZmE zWibPh>QU##Uc1HGjw6W202zuhFxueN~KApqc-Q zW~Q=Y+UTZxUTT5DBz^xf8KsZk&NDgyhkY~jkv;rOqb~V7#I=Ai*y%Mw$0$^CF1UUa zGx*2(>TrX(g^mpG?HMa6x_gY}j0d@fbThQCcq+7boGIx2@JJGh(*M;QzEX(^EHvU? zxZ&~7zRGXixTqb!Q>=q@hE&=G96M$aP>BUhhRDzS===;J$3Afg^bxJg4<@O z04a6a=0t=am3b@yn3^3KL@1XX>-h+SDh`2`(Rx6ar9 zBubC%QJ*Hl3}y$8Q(t5)9epq=C`XB|xx>Zt)3M95tLXu<9}>7O^L0*)xT6t=eFNuK znCh=E0qvc(3(t&>u(!5-E=*OI8&FvLoy@$vz#W4(&#_4df3V5wnV0q=R8hs-@%P*XWRa3)&$+i{}Z}n&)sD>F-Gq zGw^J0<>ppYIpH<23Dm9s50hiLax>qLU27sPz&HqIZ8P>~caE}b0BdqT{X zBiD26a|K(xd_P+<_}^#Y8=ALv-cxz}nlia}!vTnZrJVV_$zyuDD-6JJfrg-sfqvef z*AfFL$CaFJYQB?LNVQkq1YMtxdo{IKe%`Qe-Q!=EQ*WfC6_Ee{NeB(L#n$nM4^Qb z`+@|x!>X~B^}t#QVo%TnK4M+;6D@J?a2cz5S#O_sfBXC37B`FZ9^)rch|u_=mE76I z+K`6gtHy&F`kVcQ7mDK;ZlKh zdm7J2_wT#>0MwJi0go(uwLk)*XkbZbZG~th9ku$)UTe}T-3hbK5e}EAcSo;6-RL8W zSXG2ps+q3knTakdA9r=<9NM66zEh^}kKNB4fdy`L&I5Q881aC{uA=1fP2COyTq>ja zaa(<_fVd(OldnW1TfJ604?k#jVU*i7+|*c=y=TRh6=(@OC~DM023OLwT9vEF8r}s| zdId?$##_a=7B3S6HuV96JLecYt-o$M&c-j6+XUKPl^=a~qIk29VO3GH|JuvFlo9>p zD>h>Q&OyGsz%4C(@OD|dpf3;};{0Nh6luR2;a z(r>Bg$Kd=U@LypH6z%F^ln|K;D*bKsSJ-D*W8T~OtwPRx_nDF-dJ1i67W!L0*c#|~1w^Rogq(9StfRAiI7sc1UsFd0q^ zxK{o(b4#3plVe~^_cwlB95eC!UG{kTX1R4*LmCqc1DwSyPzkkf*|AMaIKXWSO zzf4!0=lbs^Vvtn~-3;24FpB4+L-cPW9$Dh*f1GUj&mNEYFBAEn2D%Lrr3{Es^21sE QcZx_!PE8grZTjKA0f;sM5dZ)H literal 0 HcmV?d00001 diff --git a/docs/book/flowchart.png b/docs/book/flowchart.png new file mode 100644 index 0000000000000000000000000000000000000000..714626b70e398905987bec0c460308fa7a84471f GIT binary patch literal 14794 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 literal 0 HcmV?d00001 diff --git a/docs/book/gantt.png b/docs/book/gantt.png new file mode 100644 index 0000000000000000000000000000000000000000..95c8d08a14bc4306426530921fd538b404dfc1da GIT binary patch literal 43239 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 + + + + + + The Official Guide to Mermaid.js + + + + + + + + + + + + + + + + +

+
+ + + + + + + + + + + + +
+
+
+

+ Get up to speed with using Mermaid diagrams along with real-world examples and expert tips + from the authors to facilitate a seamless development workflow +

+
+
+
+
+
+

+ Flowcharts is a diagram type that visualizes a process or an algorithm by showing the + steps in order, as well as the different paths the execution can take. +

+
+
+ +
+
+
+
+ +
+
+
+

+ Sequence diagrams lets you model and visualize interactions between different actors + or objects in a system, as well as the order of those interactions +

+
+
+
+
+
+

+ A class diagram is a graphical representation that is used to visualize and describe + an object-oriented system. +

+
+
+ +
+
+
+
+ +
+
+
+

+ An entity-relationship diagram is a graphical representation that is used to + visualize the different types of entities that exist within a system. +

+
+
+
+
+
+

+ Use State diagrams to model and document state machines, an abstract way of + representing a system or an algorithm. +

+
+
+ +
+
+
+
+ +
+
+
+

+ A Gantt chart is a graphical representation that is used to visualize and describe + tasks (events or activities) over time. +

+
+
+
+
+

+ These were a few of the diagrams supported by Mermaid. +

+
+ +
+
+

+ Book description +

+
+

+ Mermaid lets you represent diagrams using text and code which simplifies the maintenance + of complex diagrams. This is a great option for developers as they’re more familiar with + code, rather than special tools for generating diagrams. Besides, diagrams in code + simplify maintenance and ensure that the code is supported by version control systems. + In some cases, Mermaid makes refactoring support for name changes possible while also + enabling team collaboration for review distribution and updates. +

+

+ Developers working with any system will be able to put their knowledge to work with this + practical guide to using Mermaid for documentation. The book is also a great reference + for looking up the syntax for specific diagrams when authoring diagrams. +

+

+ You’ll start by getting up to speed with the importance of accurate and visual + documentation. Next, the book introduces Mermaid and establishes how to use it to create + effective documentation. By using different tools, editors, or a custom documentation + platform, you’ll also learn how to use Mermaid syntax for various diagrams. Later + chapters cover advanced configuration settings and theme options to manipulate your + diagram as per your needs. +

+

+ By the end of this Mermaid book, you’ll have become well-versed with the different types + of Mermaid diagrams and how they can be used in your workflows. +

+
+
+
+
+
+

+ What you will learn +

+
+
+
+
+
+
+
    +
  • + Understand good and bad documentation, and the art of effective documentation +
  • +
  • + Become well-versed with maintaining complex diagrams with ease +
  • +
  • + Learn how to set up a custom documentation system +
  • +
  • + Learn how to implement Mermaid diagrams in your workflows +
  • +
  • + Understand how to set up themes for a Mermaid diagram for an entire site +
  • +
  • + Discover how to draw different types of diagrams such as flowcharts, class + diagrams, Gantt charts, and more +
  • +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + +
+

+ Purchase The Official Guide to Mermaid.js +

+
+
+
+

+

Written by Knut Sveidqvist and Ashish Jain.

+

+ Knut is the creator of Mermaid and both authors are active core team members of the + Mermaid open-source project. +

+

+ + + +
+ + + diff --git a/docs/book/sequence-diagram.png b/docs/book/sequence-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..8c51ac1c5d6601960112784757061943d9d6dc8c GIT binary patch literal 19823 zcmdpe2T)T{+hza(=_1mlD~NRI9YsZ?DjlRF#n5Z$0R%*vfPi!mr1vT$bO^mjuc7yn zgx*3n?tc5%+1Y<~|DD<0nat$o+~nlkd(S=Z^FHtM+z3r|B{E_LVgLX@ru^pRdjJ3* z3IO1C+{HEk1UufA0RU=Z$}gX5gXRtvz5OO8n=z>Al$1va->BJ*X4uns-`=sJzSEA+ zr&~1z=lA?m?9g1+s%v!c6TVy4P#0NWuUk?_T{<^Ky&J~!^$TxsHDT1}$Gkz0zR3!^ z1q2R0dh}>nVU^V8C_s+6Z0T~?tL0cSeNdXqX4tPs|K-ar(M%96D?59S`U)TWDr;!N zmoFg?;Oy+=??I7YB;NdIG@9CHa%vlDQAK$fX*k0tCKg^^8y5#)toTnMSH}t6u6!(8bJ{Gs^%LL+`+s~!Rtap)WfiQL`o}n5upFq&R-BT?6^5w%kBn_p@w+^G1 zUC)V~C@BfKp|AcwZ)^e4j=Jb3yBVs3Y6|H%Il~+DbOfb1;C0HS2S#|Rawluer3{>p zyCF{{1Au3tn6#v%KT4MBZwiqCD>^OmJkZP0_rFU30AHYJ>{F<8hME_kRk93a-5nd$ zp;ouOv|Y)_X@d4;n;4N?C~nxa;sI_J?ngvAD(Dir^a#}Vq`>{U4H?-^K-@=iHBP8@%v z+LO2vD7~iCUVR)C?+UvJYU?P7WNld9Tf{kBkU8XWTjH@seira1VKFsP%R)rqXCs%= zB7@qKv#90l_Y>WcY2rM0C()~m5|Y*h2mHn$hYP|R(bp+sNVq@d1B7zh4>N{P4HzH1`{n)6m7Hrc^rdM1~DRLzWBV6kF=(9oz$7tu=erfCep?Unw8YN(eV zh^ewn;y8&~;dJa5Mw}B~mSDM&fqHqGiVHRdN?xBLhr1g>F-Av7#z56z|8AKRiMBAK z7L+N9U;n2koLG(kbY=pWD)+w*D_1y;{Tg(nr>mnE9)npgf0KtCX8545KZ&2zDF~yj zGPhd$?u9I8A8V1Rv{-o-FuU~tTxT^x*K|m~Is9=fZx_E?=7Q^DTj=-A$;8-}9&$e& z4gkJ^)Hokk24{-kh=oo04mMY=_Jc=i;5**e*hp-u3E2Ses zBqULcRAf(AKspWFwoung*MPCZVM`xpIlm3!A6L=49bu0)JIS_iw46-4`r!a8Oe3Qz z2C*AGf87P~a4iixc}g^r28DfoBPhVXwZIsJ!aFoqmVh>v0Qhg7v#AWn{vDR;4BgSh z5{_N~4otN%=VZ}~6V<`~dLeFjTX{OU2hyhhCQqD~9)HgaFDk^mlI|?YIiHZGb8-=9 zB>777Hw_rEj+4N8?V3G*=Sk>QyT3I+5Wl#i09wpA>cqPr>9w~0BZXeO0_Q7eW)v2Wuhd6|r}Zj7(d?)saPsrUL5bT2aEGcm#(iM`Em z-=rwKd%R~xdPn!0EInYUyAltK3oaKF!Dpq~U4hBV?&Ix>mj;<#d|yd?+WdTg@}WB? zlnhE{^YU!4@!Av(HbX(wj33@Uu#U~2Uj;L;CVDtW(1Pvk9(07CFcP#$qRIt0?|+)> zlDF>u3U(4|M1!jk??G4Lg2eTT7-ZU?_2;07cX|MdlRIsUlAZ16a&soyxc3a0XUM>% z*dF79{ObjvQ#~*8^TiKHN@uj8b%nFfS4NhspF)kR8ONF`DLZP?K-Z3?<&_&RImNYH zr8~3U5mCdVOxmYP**S63$r&|Fp9hFnexsLUC+Rm7k$E`3Vq5RF#T@WD5SsSrz~zi% z5=bmJ2Nwb2Mjn#1mW~%Qo_}^*?1E@Z(m>c)UW|ffe=bCS*JJT%_S6DFtRL8)gwqm^ z2{gDnbbG?^c1ADWmq|=4mZ8z_-bjmL*5g7OV35aSZ22-BKZ6^x?aD@d8}K*?&spO9 z4WPgT&l!OCH|k7zoEbvn8%@f_Mrk-c?1e?>d0XvnhvpjZX4fT)J@}7;_zZ)jg}_6X z=lUDD$YukRWsmJU123h6aL`{((Pt&;ODBXA9D;lE0cII+nDb1gw;;Vw=ON{aZ1=aF z(6T9jHg=)Wlx=S4+-Jh+Y`#jweQ?b4djE%z0O__aU3W}$P>Q>q9@Wub8G|2*^x z{-J!D@K_ZHHK?O(*(01O=J%XY9JRq+Zzow{Lg*x9?K3^!c?QUg^$HS-(_a~)`}&rS z1ujQM;}*uU{Ni^j!E$1>Qlq*K!1FV}#D{EmZSld*-Gr6rW3NTwr1uR@3@&Uus%pME z`jEA(2fdpuHN2yF%9>7Q`uW-uXK$;7J^%RLR(*Vl!=@YHY6r+9?e)@OSo9(+Wukvmt3ajUp zowNxPSG4G9z813v3Q%UXRE( zdfR|`0G@}jpxR|OWx5kIa8-RnCUy5H?zc-)v>Ajuns_m)B;%4U>KQgEEsd=tO{y80 zHsXSd+%hfTGT?Xe=Xebm3xm^ywjb2)!4*)IN;@jfjy%|_`CK+gAjl0Fl7+wgU7D*i z=i_1~ED*p#_xsrmn(VUmrVsSCo>_{tA}PKxzY55ucqRxC0GS<)xZ+f|`i}fUGG8$G z&W@KtHeOE9>DYyEnO?t?fCw#J>Bxg?CFM2n-(W7i3O4hj8#iMVBSWZuM6^T1fQ))$ zJ&B7oi%aM{4T(a}b9iYB>cf0<0;P-JS&WCp$@L1Zuh;cergL((YtE9!;BB7ue2`;v zN5$;i`kM|tznH#;?wZ0MCpN)qX%9np{;VZX9GxRr5KK7n%tcYRro)3Yx=n>ZQ zOiOaaPsH%G{QahoS!Z5xgV%l#G&fd_}C{{A2Du_94NbKA`G zQ*l#swpnwAK*b>^r$4Hu88 zIfd^%U)>pq5og7IH%@U6swW=%X5U0R1som}c5L2NO0~T3?XCSXzg+(wcu@Q#&`o5{ z%_#!kaE;H@Kvq}9O>c-YuHt)gIR z`0GHcTGdbY{3LtM7$qw|Ny07!3ZF* z9R}={MYz6Tz2eASXY%YDKgqZyLP!%p`C!mV1enS1TH#ZCE;Grr(ND4~Pl-}ZO1szC zE)s!Nq^&s=gBNqhAqjw=8tLRC`HoAF>~hnQ+*s(joQ$RRv10{qJ;>%<^x=RZ)i|my z&?1L@EXw5JfwmC=X&-@VMTNyv+JN8Wpc1x}3A+NiVsXB-)`SIvgzy3!&%KV2yeN&p z>#XZ>u8$M-64iX|2RxZ38k<{O>8r8(+{ULj>=*kdS~Z3bf1|tc=vs>i^d-^Xmv_Aw znud1ez3T zwGS{I@EMT;T70??f|xA)X4!9@2JQF+@Pqj-FLpMf8m(S{cZTW&)g z`F7DGGcc}F@9IZK_k6PO6=ul*Ji4Ul*?ScC^icyA;82o;K#+QJlEd6_?;61AVO3li z@#!P;(w+kP2XQpD*!k78jx(?%Rom8S2&|$Z$vF@FJ^8w{(L0iCiAk>OY{1^rD(wuj z;>ajB)#Baxnxt+7uE`*|*fT94Rjc~z2&Gs0@q~Iur0m&=;q^iiGDoLXpQ^+0YK3qr zEbF0VF?qAbr&9b5otd9TnKf}+eiy^Ce7i#|DHEj;wWSMTv=WXNSr*xj?Oye-cgrDb z?IC<~wQFZRo#zjW;>t))A2CJ>qMI#Q52vlA;c z#NoIEKuTj7B_u4I#x$EWmz-4(W3VKhiDh~6`1kH1GG5M-RJ3(*few6HaXZ9tRKDjV z$a%kz`HPIOHq@}Yh0s%<0daU$;&!8^VHu4>%1PAEV(8Eri+2rkn;hE9m@L_03$PSq zwiM)!lO?c>s>??v8sZKdR?j#m!iN2GFN=?>uajTyR5`a0p$@TFcwv-K@wZc->5LL+FeQ76KZv@Pbp3o8ujAMAHT65!C3Ue5KB3B+W% z>(+1>Wz7VfRCcG56g+nD&Yr5=hSFbeP6cuQNT@rn;`^~Ea8AZTr|**7?RnYmd}UmB z8EwraxMpo*e^C=EzLn>of5*MmwN2@qNzgM;XS{8C98sJxqBz!z>vW#ic0^lNwOLG= zvk_~4x%GKvXje8@sIadQmAfRqoF)ucd9QA@^n2D0Ase(2>UNzdqe)`DZlm$k-#WT` zm}h%l`#pMft167h#tV%^tl(f)qSL3EG)>DxC)Pn;wY@}t7mm&KlE6>x)wX}4oKBA~ zNUjE#i1A?ITJYc0b$M!U%6tD0O6=eU$#w(q;cW?JuX&o8-^ zbzeAUuJdf4aa0;{ikv~5`oBl3sH}91JbJ$4Hudc!QaFKrX^Y=}b}VRU&*2I`K~_%M zQa&nu9j_zM`Nqss%2N22!D{-Dd0;B&a#ycPMfim?}2He z4kE5E_g?rLx4WNmun%Du>E`&6TMq#|*qmO4iT6d%W4H3A;=QSc+p|#ul0ND<)M58p zJnB>({rQ+#pZQt3j4YlX$1q;~zJXJjTH|lRA1%q=Lf4)IIJ&pCv_F8>%t?+gccu(- z?oLJ6XYwfoAdK{Ag)!C1+$N1ByTMn?>;T^~zFpoWTPR0V=iSu2hr3i><{^%ei?ig9 z8=^^RuftO23^Mr7Fj!}BD2u*~>8+~Nh3lN7mEGQpW=Z8y4tz>Gbq<85iX5<)rEXc>j~0dMP09a;Xk zBcmc?1p~y5-uZ- z)7EQgAUp7_Y9UUW*|XeBr3TSN1(RoBaq+u-gepNMMF38oMNKb3KiMZFrB7wY;;93P z3H%m=m_E`NRT0W?)iru{>Ux)n8p{Hd{lUdjj2_KqQ9aE258kdZ#8s#H(Q) zW|bawbYq=Nn>axNbMfL#Ax{MS z##$PW=hi%0v{QZ@auRzTd-_?K8;7x!g2IT8Mx&ZV#RF8!L`=s>?i$(S6TJDWNH}IH zvBezk>+M3O9bJgfu0u}kl#@tf!1?x=K0CyE7m_qIR9dtTimd^DCqQ+`z%X+1x*@!H>#+?xri zD(X{e{Jl@PW!I$5c>N1F?-Mwl9QiTu^bbSISgS{lo$R!=HI}xSKcast=Xka=tQ$Re+Q2VzX%*)A{H38Ls6lU1v32QV&=Ecxkl~pOXE%fA6i!g8 z6t868y{CL3y4;KVy_+he(T|buzLmaX)^B9Hn=|Buqj((lsQvbFU0XR=%RpSz^eJWD9`3fFjZ@M6*zuuK+mvA=MTzSH>m5~^* z?35k#Es%@MEsRe%E_&!*1HJA^mVV!pZf57&}MDBC_*>z7I{53oNns4Z#wN?m(1sV z_KUwD-P6`@nNiAu%(}CoRanMux^sn!3EsQUR7T9#QbNZ(0MTa|$F5h{s6tkvQYFxQ z2P{gP^>VH^(EI=qKqyHYbt`BaSz#-4lA&TaEGjO2G^R*P-Y4bV@N3tL0^>LnI)eYC zH3E5Z^!typKmVm@k}m?Em($Y6XRUBb_$D%t{Ai_PAohaZ)yO-0rz6yNzI~n0?I5=@`l!28N@ zv{qUAvczCFVgJpTD^{`QK2{@bKq-rRn#HII0c ziL^ERX%l$sJC@*|ASS)c%A&b_oyt5t0y=xedJwsFc8=SpKm&FOD2HcLE7~I&O&T?F(ZNvugrOuSD)u^P2CFGNOqfty|oP+eqQ$XKdQlO6Q}14WsI{;qwwh^NID{;Y=HP{ z?P&WFc<&p&r>9az@sSzdZIrc&@C$0usWhg{yt492<7Z@_`+@$FW#yxPZh95%U)A-! z#k-p{IiI&lQA1c<%C$AK70846b6rXbmK85=_dD2AV(y(v#*e}z$UmTZQo<#<^`-TO zhe98lmzNctYQ7>X;+t}4u(e_gol3l{k=l2KGtD4eaksnBMR8t)Z{+=yGq|=!A?|i@ zdxG9g^{1noO3W73ScD2+=tT5Ob-a(uCE@iIoVcEgYdnR}l;S&0=brew#ug55OYh9w zs>O`0Z${gfjDFAT8Mlh-%10hPtVhdr#UP(jkQ5c9SJLjdyx35gmpExo z*o;(Ep9t{6HiO22xms_eG4E9`q=y7I`v=D61N+rY3g1Anpi2u$dU3m-jG=^QUS7s= z9rlyi5K~8phk9|vJ#$?bl|IMs+n$`9zpW|4cBBRJVm2nAi18vK(k*=R&~ErYQXchy z$B)9s_EJZ>Aa~<5f?mVpXYBhNYH0s{j441Sby=6L8r_fYFuI@q&QImVdyq?E;f%6VhUe6p{Dj(ieQsmq(L6z)Q2xl!eP=EP2M zYr5Bi6`hPWG0Z}OjM+z-b;vTDti!$jqy_hT0h0rah%=VR(U>ikB0Tlh&04EUBgYxS z&cl5wMD@dbB#oqF&_P^u!%`TKf7h{XE>|}Dj3dmw3pi}}kkOM6-gwGN1H#Nz1d1{h zHfYi!iqrEYo#H$z!F5v>2k51FI;q{NoOmvQW(#1COofZX!bfP`iYahP?&gy}v_$zX zc6^>ybe2*0kjvo=CE03Zn%7~BSDnimlV^E5on@O`l{kFz(VftSH`2!L8zNCSQ~YvQ zG78OgG11A=np35v2$@FbL*5GWYsdN9W92Qh!TlY&=GJ(PgSl{c%@kB}Z9AM{+PYZ! zo7XxE!Q+I}S-m|qkLUv^hMY+W3j+ggg$%@LEF1K$7|*qNd10g(Nd%q)B|3Sk2WLkx zv>B!urZRo(i+h@uEK`*glpG~HHuwFY;xG)S<{7x{I`XxeGLHR9WS#pCj^^3n0LHxS z@wo4+U_m5mEbx#OQL{$)3vg`;kMQd1E5X!7a3@&1%kIOiUqIwQryf59*P`Ie*=J>S zY**>;P8R0VrBDmEutP)C{`G}G<};bKQOi#>4xd=pf@J{YEx*Y$DpD2=#R?BID1uKU z&L5c}1|XZeevywf&qCV7N#pi4!&CcCL4L-5@`f_e4BOFA_FGp3m5j)XdIl-j@ z4x22=IXC#19E(HdGxXZ!Xc;S>1af;`MPmnVqWSvn$t_J=27m=~*lxtdh4Wobiq@sI6va>=}#WjYPYY`EfN3P7+yw&cj$AP84<_s%_iG-%D3#WknM=dwXm;b1NH9Af9L zW%%gV4O8#l3f_Lq^}vdeUASm(fC#O+97*=!Z0xcT70wJsfTUUdNWX#>X$OFlrykSn z+{0;GvfrqytGAoYj^=&aZs7n5efx)R#DGz5dqw)Z)*E)>qJQQ<1m-j8Q`*B*=q}Nh zW+SxyBGVa^RYr_EAMk8C%xk85$(R zBk*Qv_f3jXYjb4|>Rn4aM_FCP!#j6NE5P65`pOt4{Qg+2c}}(_nZ@UCT0l)m`_#*{ z<^Mc^zLI)z>BDPqYwbIjWB#k1@E`1n=I!VwlFxdkP}Bzxqkoa1CC05@E((H`kcvV7UUL z8(%vaJ;v0Uv3p^x)wFiK(pEyK=lL`*b$j0nE-NsSeR_+4MbB+vK1DNuOlaSrEY)H* zHRhg=bFwpKpCIPJY&&&IGVEKh*nlOl(=bRtSu$utz|e9?hvUTnOXtxD5yxDr!nPc0 z3D#no+MOBNRvlX->oKsGgUNmiIBHn{4&c=xP2Nqn83}-U0$fB&HdF4EEHyuI{c2!y zkR>jB@T(KyK&-aZYv&|r?{}7oPsqD5KyZ!2yICulX`_D7c!&cmO%aks=PI2WXr1l1 z4fb}vCm!P|{2(&q*4-l`$?Exm4WhId0ldYeTf&;P0J z_X++iQ_J@Bsg2&1jDI3D-e%Q=<(a0Z3|`22nGYn9A2p!9)e2|U?k_H6c}NS@pAF?0 zpS9ZYYPs^@AZ#jj+dsp_jb0d$oXG_Jnl8)rOZVQ?IJclxBgtCX#q?L&T%R>Gi8t&> zy7J##V4_h}sh0^EmF4{u`hzE!=`>;BixIuxMu+^YJ}rdL^bx!qh7|KJ7!235-k_WT zjgEeNdAdUOY0nMuIIuA2B(3KP{M|kqa#X-{63aCvr-M-fS+q&}xW9L&sKU}4jb^IP zF1W}SUf8PX7_A&Iie!HoU5y|cvE=227Gio>3kYqaziDCYy^O3yPo(-}J z({3yj)s4J(X3LlKKNd#AbkCWIotAc5`$`smdl-ELSbDt*IM4HI;j*$0xM>MJCO9DU z8&9%0KX^DJp`0P-9rW=yDHHxxk59FC-UAde?6jEP7S7nVAk#Ef669a?G^%3!)v_Gbjk zx7Um+)svGuX8T2wfYUOBL;bK6qV$3X)5Or=;1+bVA7M9n}sPBDY#O!wc-=eHm0@;BG)d^jbu1BpGHz@aRnFPfVzN z;zBOH8B2A#ZF1vb-poXPFMfd;}L05>0QFmPo-?!vj7lO!Cx`0$NMs(+Fw8XBlacTF%Ej>-f3lJm*FLiU2f*K@{F!mht60A6jlG3=ZL9XZk(?jdJb^w zj~0-ntcF=Aks@muCVZ+(?W){f>TVaFi#Z$y7Eb7QZWM3{`0&pZzjexf)wJm)FY^9u zUBhp2jy7T1a){neES2CFxv{#UzZDFYkmw@FWxTRTj*ZM`%DZv2==PO+qD2J3i8QR0 zc$QiT^D#mgyUcIhtFlhZ-)%mTE~lj~UI{u`yEgazcCxKW*q7REj(+iKpfXeVcBu~@ z=0Cy|P_VNqG<6+m=MesKb3$D441LZ=%DhkVa-0=Yr1_44xTmSFS7wIiRBJz}t3Z+~ zE=HFEbfe&XH#Kl#bWSr7A1Vt?S`H%sA5rTcJqv1D^u-I$=o2>k+|AGwqsAnG17x#% z$;e`_e0UHP!pNbx^)31eK3dLtQNb{?*|y~SKK}9VN7cC9%$`+8dFIV!Rdi4-Nd2E| z(k$9yM!<_W-Am44$aQQd0|%G?laQ0gwg)-bDEh|4%z+8yR{GIR(s? zaCe>j88VAWVX@lcjT9e~(MczXP2E+t-AlHjE)0(PeV_|Vw<(85QnZQ9Y%S0k2k>H=RsuDeP}<}{>4BT6Hnlg zl@&}^m@&{n-rP^QVpg*kH;(m&{k74Yk&38nO(N?iMEA08SeAU4Ya;eypFOs7_j4G?W{C8bqx`dKgrN$~iTvHH)9+B9xlC^Cm> z4{&|BubpkKc=xU&U9O52lQ>qbAoUFs<=z%-vu)2FS)yi@V)Ea~hqG3x@o~_~bK%WZ z)i;dWLO9ow1rBh#y>64l}CX#d;&G}2+(JF01bk_qP z`NBGy%OBd3M$?k`p(=B{&PXYy-04$rM~j~~%hBFSSp$VumQ3N=;1lP~yhrq^)tt@q z&sX?dZ=&p~zzi}RtqvVa$qDF7yEsb#6+ou5LYTl(h>!`oS3+?Q)|Q(zy!nwoj<8BxEp&`ye`#0dFFO6=BNdN zSMbX^Cf#iBW{e$gkIb*G|5@5|fWop{he&|luC8-){$@+k=LSE?Ra1$rTfqA|| z#Fy>E39JsCD|k7TB{BXcTJAtzOLaodhee;1YJ4v6nIwOz>wQVe{ToH@8~2}zx!gc9 zKgaKi)Le9-4ZRWB)3n=H11aQu88t97IZSl=S(b84Y=Fbp^t*m*fg(2#lI5x_%&var zy4w|9V2Q!>d(ZeIz3_WF#J%->M#{g&g2q}~zC09O!e*ul|Dl|FOv;JU1*Y#~e4GNJ zbqOBrHF~*VuHu;1%nE;%PKP~`RdP$}B}%Lg+~vzVKP7Ca?Bf245X5HP60cEYf1AIp zV#$7X^{-v$#h__QdBZKfjH%)4HRGV#@b>pdgM0Zk<=46(l>(ikWRM=~fn}xkf@dHX zdL{--O?25!!63mG*ngEOGs$pk+pJ9r!Aodgt;JOMjG{i((HYM&}q=Pv;XO zuw6P^W=BQo5?2R1fqJy>pvpM{up%hREqzkiik;dJM+NLyhTpk|VAbmnbGOO0ux7S{O|LXb}u~4!1uIu8Na?UN)yYpYZ5)DZ_ElY_+xb3-zPwJUy5+uW$s5A(!ht^VQFg z=@}th#@x$~u)$=0cuZmpqYqNP1%LG_H-oF%v$Yi@u9!D$hef9NMf(wSJX|o(#UkVNM(@15;^gI6}Ek+wH z=v;?4OnfCZ0_7O-5R2&^t#XFgz-~dj2qB~D1uFP|>gTW`I_#@nXXSv~gQy(Pw z?665^*sHCf8Sw^k)%Nt#=2(aJ{ea6O7w^4f@wVC^>+G?4HSAeXx+KU?eg|nBnP-y` z`&=|TgJue0`o2})i){FR(sh;l=m)h5Mt_ zU2(Bp6B?O(h9v`k_mBGueg2b@+v)1 zW&v;NnGo$#c94GQfm9nwUx1m@Jyz|NAhS<2l@&N`y1GVVH$EHE8pcmnd7WDQ+J4~5 zyJu{-cN8*X>$>9|#ZSSzUcuio#OY?<6Wp88jxIu!z3Ldou57<~Y-AKnS}5N47_!=_ zN_`XU$Kw&d!&ZCAXJ!lk_GqRxk7nld(P){52yJvCRVwz}7~hVQ&Y-w(;5eP&?`+Bn zyT2b{3w5XQ#ubbD_?!C+Ip`o?W&!y1ZS3Dd-TIDY;_x_&2K(U=*|uJkjVgn}G&f@i z>7D}sfh5Ty(F~w63v$U#xcYDeN5o@QL@n)$#9-P|#YI%_!#8K^lLcoHq&+ePH%svax@NtYo7xX}qia|6 zBQ1CH{IPtW8bWt>o`(s`wYvO}yll~Yy{?mf)OeiWntIqL<792ntk$pmX<&9L!=u5WoCc zP(u6_AczTy2PLz*l42*==iK?-w2xhE*!0lZJ$Iib`3dybxR!flz$9?vFirV-aR7&|#6hXv>7cg4(qG0zii;#wh%y;l1CaV4kIOW+RmB2Q#`k%ROCI(}7LWNM4AY>rV3nV=DcNnk4DNl$mn*to{HKT=|`O z8R$9sILBp)$#upc1aU)pvCtsAhNfU;&$gp#Hv}5)7Y6LI!LOGx026-&q5)Ql&=Tr6 zEadX_n-X&npO098lcOPsw-pNQ-qNj+c0c43LJs7Hq zNT)k7bT>Vy5&u3{8Czlc0049tfBHQ?`mqW-1atFR)_J+YYs%8jbDb?NW6F?s$^s{9 z`X@CPI~Qp*bn#^78Q{hy!y>rkus(V~-G0c)mjYi=i#-i#6hjk5gqgneRb{Rlk++Bz z{V`QSmLRwy8-NGX7vu&jlj!&Up@`~@cwX^Jy!qPkqP4(KOX^?7&_<^;3c)0(!1)~d zoT;+BuwWLM-JNl)a3$P32 zAU*%&xQO1F5)gHUdo))T+~$qW(F*iB9<#wmOeRAVhAH@3jB}dw`rAI7O=f<6eUtsO zdla%oO-L?7`0XFm?Sor-A-mhRs!6(8U()GBwhq|G?-rW=Yn|A<&z;PO#%0D)Muw-s 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 DRc_Wx literal 0 HcmV?d00001 diff --git a/docs/config/theming.md b/docs/config/theming.md index 8ccab7804..9b81be1b9 100644 --- a/docs/config/theming.md +++ b/docs/config/theming.md @@ -3,12 +3,6 @@ > ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT. > > ## Please edit the corresponding file in [/packages/mermaid/src/docs/config/theming.md](../../packages/mermaid/src/docs/config/theming.md). -> -> **Warning** -> -> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT. -> -> ## Please edit the corresponding file in [/packages/mermaid/src/docs/config/theming.md](../../packages/mermaid/src/docs/config/theming.md). # Theme Configuration diff --git a/packages/mermaid/src/docs/config/theming.md b/packages/mermaid/src/docs/config/theming.md index 3fcd1cda1..fb3026fec 100644 --- a/packages/mermaid/src/docs/config/theming.md +++ b/packages/mermaid/src/docs/config/theming.md @@ -1,9 +1,3 @@ -> **Warning** -> -> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT. -> -> ## Please edit the corresponding file in [/packages/mermaid/src/docs/config/theming.md](../../packages/mermaid/src/docs/config/theming.md). - # Theme Configuration Dynamic and integrated theme configuration was introduced in Mermaid version 8.7.0. From 61ef4692b0ecd5cd9255212f266652b42ce6595a Mon Sep 17 00:00:00 2001 From: ashishj Date: Thu, 15 Dec 2022 20:24:13 +0100 Subject: [PATCH 067/309] Updated documentation and examples --- packages/mermaid/src/docs/syntax/timeline.md | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/packages/mermaid/src/docs/syntax/timeline.md b/packages/mermaid/src/docs/syntax/timeline.md index 571072ec9..3438b4542 100644 --- a/packages/mermaid/src/docs/syntax/timeline.md +++ b/packages/mermaid/src/docs/syntax/timeline.md @@ -13,9 +13,6 @@ timeline 2004 : Facebook : Google 2005 : Youtube 2006 : Twitter - 2007 : Tumblr - 2008 : Instagram - 2010 : Pinterest ``` @@ -54,9 +51,6 @@ timeline 2004 : Facebook : Google 2005 : Youtube 2006 : Twitter - 2007 : Tumblr - 2008 : Instagram - 2010 : Pinterest ``` In this way we can use a text outline to generate a timeline diagram. @@ -83,7 +77,6 @@ timeline section 21st century Industry 4.0 : Internet, Robotics, Internet of Things Industry 5.0 : Artificial intelligence, Big data,3D printing - Industry 6.0 : Quantum computing, Nanotechnology : Human-Cyber Interface ``` As you can see, the time periods are placed in the sections, and the sections are placed in the order they are defined. @@ -125,9 +118,7 @@ However, if there is no section defined, then we have two possibilities: 2004 : Facebook : Google 2005 : Youtube 2006 : Twitter - 2007 : Tumblr - 2008 : Instagram - 2010 : Pinterest + ``` Note that this is no, section defined, and each time period and its corresponding events will have its own color scheme. @@ -156,9 +147,7 @@ let us look at same example, where we have disabled the multiColor option. 2004 : Facebook : Google 2005 : Youtube 2006 : Twitter - 2007 : Tumblr - 2008 : Instagram - 2010 : Pinterest + ``` ### Customizing Color scheme @@ -292,7 +281,7 @@ Timeline uses the experimental lazy loading & async rendering features which cou ```html ``` From 7855edae6babc14f9de9dd6de070d71e6800ba53 Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Thu, 15 Dec 2022 20:20:04 +0000 Subject: [PATCH 068/309] perf(er): pre-calculcate er UUID namespace Pre-calculate the entity-relationship diagram namespace UUID. This UUID is always constant, so we can pre-calculate it to save a bit of processing power on the client. Co-authored-by: "Ashley Engelund (weedySeaDragon @ github)" Co-authored-by: Sidharth Vinod --- .../mermaid/src/diagrams/er/erRenderer.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/mermaid/src/diagrams/er/erRenderer.js b/packages/mermaid/src/diagrams/er/erRenderer.js index 7a7920160..08b448219 100644 --- a/packages/mermaid/src/diagrams/er/erRenderer.js +++ b/packages/mermaid/src/diagrams/er/erRenderer.js @@ -643,11 +643,20 @@ export const draw = function (text, id, _version, diagObj) { svg.attr('viewBox', `${svgBounds.x - padding} ${svgBounds.y - padding} ${width} ${height}`); }; // draw -/** UUID namespace for ER diagram IDs */ -const MERMAID_ERDIAGRAM_UUID = uuid5( - 'https://mermaid-js.github.io/mermaid/syntax/entityRelationshipDiagram.html', - uuid5.URL -); +/** + * UUID namespace for ER diagram IDs + * + * This can be generated via running: + * + * ```js + * const { v5: uuid5 } = await import('uuid'); + * uuid5( + * 'https://mermaid-js.github.io/mermaid/syntax/entityRelationshipDiagram.html', + * uuid5.URL + * ); + * ``` + */ +const MERMAID_ERDIAGRAM_UUID = '28e9f9db-3c8d-5aa5-9faf-44286ae5937c'; /** * Return a unique id based on the given string. Start with the prefix, then a hyphen, then the From 528facf88d7b474eef03b829b314cfd9b373fe91 Mon Sep 17 00:00:00 2001 From: steph Date: Thu, 15 Dec 2022 13:11:07 -0800 Subject: [PATCH 069/309] minor syntax update --- docs/config/directives.md | 5 ++--- packages/mermaid/src/docs/config/directives.md | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/config/directives.md b/docs/config/directives.md index f011085c3..e845596ad 100644 --- a/docs/config/directives.md +++ b/docs/config/directives.md @@ -32,9 +32,8 @@ Mermaid basically supports two types of configuration options to be overridden b **NOTE:** These options listed here are not all the configuration options. To get hold of all the configuration options, please refer to the [defaultConfig.ts](https://github.com/mermaid-js/mermaid/blob/develop/packages/mermaid/src/defaultConfig.ts) in the source code. -::: info -We plan to publish a complete list of top-level configurations & all the diagram specific configurations, with their possible values in the docs soon. -::: +> **Note** +> We plan to publish a complete list of top-level configurations & all the diagram specific configurations, with their possible values in the docs soon. ## Declaring directives diff --git a/packages/mermaid/src/docs/config/directives.md b/packages/mermaid/src/docs/config/directives.md index 968ea337b..ac57e6d21 100644 --- a/packages/mermaid/src/docs/config/directives.md +++ b/packages/mermaid/src/docs/config/directives.md @@ -26,9 +26,9 @@ Mermaid basically supports two types of configuration options to be overridden b **NOTE:** These options listed here are not all the configuration options. To get hold of all the configuration options, please refer to the [defaultConfig.ts](https://github.com/mermaid-js/mermaid/blob/develop/packages/mermaid/src/defaultConfig.ts) in the source code. -::: info +```note We plan to publish a complete list of top-level configurations & all the diagram specific configurations, with their possible values in the docs soon. -::: +``` ## Declaring directives From 521a30dcd7dc1fa1041d85c30d1584f93053b6e8 Mon Sep 17 00:00:00 2001 From: Ashley Engelund Date: Fri, 16 Dec 2022 06:37:05 -0800 Subject: [PATCH 070/309] add a space near the start for symmetry and readability Co-authored-by: Sidharth Vinod --- packages/mermaid/src/diagrams/state/parser/stateDiagram.jison | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mermaid/src/diagrams/state/parser/stateDiagram.jison b/packages/mermaid/src/diagrams/state/parser/stateDiagram.jison index 74707c5d5..dc050b2ff 100644 --- a/packages/mermaid/src/diagrams/state/parser/stateDiagram.jison +++ b/packages/mermaid/src/diagrams/state/parser/stateDiagram.jison @@ -65,7 +65,7 @@ \%%[^\n]* /* skip comments */ "scale"\s+ { this.pushState('SCALE'); /* console.log('Got scale', yytext);*/ return 'scale'; } \d+ return 'WIDTH'; -\s+"width" {this.popState(); } +\s+"width" { this.popState(); } accTitle\s*":"\s* { this.begin("acc_title");return 'acc_title'; } (?!\n|;|#)*[^\n]* { this.popState(); return "acc_title_value"; } From bb9b0b015e85be9d229e54c9c745febc1013ca10 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Fri, 16 Dec 2022 16:28:24 +0100 Subject: [PATCH 071/309] #815 Styling subgraphs with color shades --- cSpell.json | 1 + cypress/platform/knsv2.html | 35 ++- .../src/flowRenderer-v3.js | 233 ++++++++++-------- .../mermaid-flowchart-v3/src/render-utils.js | 119 +++++++++ .../src/render-utils.spec.js | 39 +++ packages/mermaid-flowchart-v3/src/styles.ts | 23 ++ packages/mermaid/src/dagre-wrapper/edges.js | 3 +- packages/mermaid/src/themes/theme-base.js | 11 +- packages/mermaid/src/themes/theme-dark.js | 7 + packages/mermaid/src/themes/theme-default.js | 5 + packages/mermaid/src/themes/theme-forest.js | 7 + packages/mermaid/src/themes/theme-neutral.js | 6 + 12 files changed, 374 insertions(+), 115 deletions(-) create mode 100644 packages/mermaid-flowchart-v3/src/render-utils.js create mode 100644 packages/mermaid-flowchart-v3/src/render-utils.spec.js diff --git a/cSpell.json b/cSpell.json index c7630d7ee..cfffbcdb7 100644 --- a/cSpell.json +++ b/cSpell.json @@ -83,6 +83,7 @@ "treemap", "ts-nocheck", "tuleap", + "ugge", "unist", "verdana", "viewports", diff --git a/cypress/platform/knsv2.html b/cypress/platform/knsv2.html index d6af0549b..ae9de8fca 100644 --- a/cypress/platform/knsv2.html +++ b/cypress/platform/knsv2.html @@ -56,7 +56,7 @@
Security check
-cyto TD
+cyto TB
   %% I could not figure out how to use double quotes in labels in Mermaid
   subgraph ibm[IBM Espresso CPU]
     core0[IBM PowerPC Broadway Core 0]
@@ -111,8 +111,35 @@ cyto TD
     >
     
 cyto LR
-  B1 --be be--> B2
-  B1 --bo bo--> B3
+  B1 --be be--x B2
+  B1 --bo bo--o B3
+  subgraph Ugge
+      B2
+      B3
+      subgraph inner
+          B4
+          B5
+      end
+      subgraph inner2
+        subgraph deeper
+          C4
+          C5
+        end
+        C6
+      end
+
+      B4 --> C4
+
+      B3 -- X --> B4
+      B2 --> inner
+
+      C4 --> C5
+  end
+
+  subgraph outer
+      B6
+  end
+  B6 --> B5
   
inside1 --> inside2 & inside3 & inside4 & inside5 & inside6 a(letter a
a) ---> b(letter @@ -159,7 +186,7 @@ cyto LR // console.error('Mermaid error: ', err); }; mermaid.initialize({ - theme: 'base', + theme: 'dark', startOnLoad: true, logLevel: 0, flowchart: { diff --git a/packages/mermaid-flowchart-v3/src/flowRenderer-v3.js b/packages/mermaid-flowchart-v3/src/flowRenderer-v3.js index a799a35bf..677d97724 100644 --- a/packages/mermaid-flowchart-v3/src/flowRenderer-v3.js +++ b/packages/mermaid-flowchart-v3/src/flowRenderer-v3.js @@ -4,7 +4,8 @@ import { log, getConfig, setupGraphViewbox } from './mermaidUtils'; import { insertNode } from '../../mermaid/src/dagre-wrapper/nodes.js'; import insertMarkers from '../../mermaid/src/dagre-wrapper/markers.js'; import createLabel from '../../mermaid/src/dagre-wrapper/createLabel'; -import dagre from 'cytoscape-dagre'; +import { insertEdgeLabel, positionEdgeLabel } from '../../mermaid/src/dagre-wrapper/edges.js'; +import { findCommonAncestor } from './render-utils'; // Replace with other function to avoid dependency to dagre-d3 import { addHtmlLabel } from 'dagre-d3-es/src/dagre-js/label/add-html-label.js'; @@ -26,7 +27,7 @@ export const setConf = function (cnf) { } }; -const nodeDb = {}; +let nodeDb = {}; // /** // * Function that adds the vertices found during parsing to the graph to be rendered. @@ -381,10 +382,9 @@ export const addEdges = function (edges, diagObj, graph, svg) { edgeData.id = linkId; edgeData.classes = 'flowchart-link ' + linkNameStart + ' ' + linkNameEnd; - const labelEl = createLabel(edgeData.label, edgeData.labelStyle); - labelsEl.node().appendChild(labelEl); - const labelBox = labelEl.firstChild.getBoundingClientRect(); - // console.log('labelEl', labelEl); + const edgesNode = select(edges); + const labelEl = insertEdgeLabel(labelsEl, edgeData); + // console.log('labelEl', labelEl, edgeData.width); // Add the edge to the graph graph.edges.push({ id: 'e' + edge.start + edge.end, @@ -393,11 +393,11 @@ export const addEdges = function (edges, diagObj, graph, svg) { labelEl: labelEl, labels: [ { - width: labelBox.width, + width: edgeData.width, // width: 80, - height: labelBox.height, - orgWidth: labelBox.width, - orgHeight: labelBox.height, + height: edgeData.height, + orgWidth: edgeData.width, + orgHeight: edgeData.height, text: edgeData.label, layoutOptions: { 'edgeLabels.inline': 'true', @@ -413,9 +413,19 @@ export const addEdges = function (edges, diagObj, graph, svg) { return graph; }; -const addmarkers = function (svgPath, edgeData, diagramType, arrowMarkerAbsolute) { - // // TODO: Can we load this config only from the rendered graph type? - let url; +// TODO: break out and share with dagre wrapper. The current code in dagre wrapper also adds +// adds the line to the graph, but we don't need that here. This is why we cant use the dagre +// wrapper directly for this +/** + * Add the markers to the edge depending on the type of arrow is + * @param svgPath + * @param edgeData + * @param diagramType + * @param arrowMarkerAbsolute + */ +const addMarkersToEdge = function (svgPath, edgeData, diagramType, arrowMarkerAbsolute) { + let url = ''; + // Check configuration for absolute path if (arrowMarkerAbsolute) { url = window.location.protocol + @@ -426,6 +436,8 @@ const addmarkers = function (svgPath, edgeData, diagramType, arrowMarkerAbsolute url = url.replace(/\(/g, '\\('); url = url.replace(/\)/g, '\\)'); } + + // look in edge data and decide which marker to use switch (edgeData.arrowTypeStart) { case 'arrow_cross': svgPath.attr('marker-start', 'url(' + url + '#' + diagramType + '-crossStart' + ')'); @@ -526,114 +538,104 @@ const addSubGraphs = function (db) { if (parentLookupDb.parentById[subgraph.id] !== undefined) { data.parent = parentLookupDb.parentById[subgraph.id]; } - // cy.add({ - // group: 'nodes', - // data, - // }); }); return parentLookupDb; }; /* Reverse engineered with trial and error */ -const calcOffset = function (src, dest, sourceId, targetId) { - if (src === dest) { +const calcOffsetOld = function (src, dest, sourceId, targetId, srcDepth, targetDepth, so, to) { + // if (src === dest) { + // return src; + // } + // if (sourceId === 'B6') { + // return 0; + // } + // if (sourceId === 'B4') { + // return 318; + // } + if (srcDepth < targetDepth) { return src; } + if (srcDepth > targetDepth) { + return dest; + } + if (srcDepth === targetDepth) { + return src; + } + // if (src < dest) { + // return dest + src; + // } return 0; }; -const insertEdge = function (edgesEl, edge, edgeData, diagObj) { +const calcOffset = function (src, dest, parentLookupDb) { + const ancestor = findCommonAncestor(src, dest, parentLookupDb); + if (ancestor === undefined || ancestor === 'root') { + return { x: 0, y: 0 }; + } + + const ancestoprOffset = nodeDb[ancestor].offset; + return { x: ancestoprOffset.posX, y: ancestoprOffset.posY }; +}; + +const insertEdge = function (edgesEl, edge, edgeData, diagObj, parentLookupDb) { const srcOffset = nodeDb[edge.sources[0]].offset; const targetOffset = nodeDb[edge.targets[0]].offset; - const offset = { - x: calcOffset( - srcOffset.x, - targetOffset.x, - nodeDb[edge.sources[0]].id, - nodeDb[edge.targets[0]].id - ), - y: calcOffset( - srcOffset.y, - targetOffset.y, - nodeDb[edge.sources[0]].id, - nodeDb[edge.targets[0]].id - ), - }; - // console.log('srcOffset', srcOffset.x, targetOffset.x, srcOffset.y, targetOffset.y); + const offset = calcOffset(edge.sources[0], edge.targets[0], parentLookupDb); + const src = edge.sections[0].startPoint; const dest = edge.sections[0].endPoint; const segments = edge.sections[0].bendPoints ? edge.sections[0].bendPoints : []; - // const dest = edge.target().position(); - // const dest = edge.targetEndpoint(); + const segPoints = segments.map((segment) => [segment.x + offset.x, segment.y + offset.y]); const points = [ [src.x + offset.x, src.y + offset.y], ...segPoints, [dest.x + offset.x, dest.y + offset.y], ]; - // console.log('Edge ctrl points:', edge.segmentPoints(), 'Bounds:', bounds, edge.source(), points); - // console.log('Edge ctrl points:', points); - // const curve = line().curve(curveCardinal); + + // const curve = line().curve(curveBasis); const curve = line().curve(curveLinear); const edgePath = edgesEl .insert('path') .attr('d', curve(points)) - // .attr('d', points)) .attr('class', 'path') .attr('fill', 'none'); const edgeG = edgesEl.insert('g').attr('class', 'edgeLabel'); - const edgeEl = select(edgeG.node().appendChild(edge.labelEl)); - // console.log('Edge label', edgeEl, edge); - const box = edgeEl.node().firstChild.getBoundingClientRect(); - edgeEl.attr('width', box.width); - edgeEl.attr('height', box.height); - // edgeEl.height = 24; + const edgeWithLabel = select(edgeG.node().appendChild(edge.labelEl)); + const box = edgeWithLabel.node().firstChild.getBoundingClientRect(); + edgeWithLabel.attr('width', box.width); + edgeWithLabel.attr('height', box.height); + edgeG.attr( 'transform', - `translate(${edge.labels[0].x - box.width / 2}, ${edge.labels[0].y - box.height / 2})` + `translate(${edge.labels[0].x + offset.x}, ${edge.labels[0].y + offset.y})` ); - addmarkers(edgesEl, edgeData, diagObj.type, diagObj.arrowMarkerAbsolute); - // edgesEl - // .append('circle') - // .style('stroke', 'red') - // .style('fill', 'red') - // .attr('r', 1) - // .attr('cx', src.x) - // .attr('cy', src.y); - // edgesEl - // .append('circle') - // .style('stroke', 'white') - // .style('fill', 'white') - // .attr('r', 1) - // .attr('cx', segments[0].x) - // .attr('cy', segments[0].y); - // edgesEl - // .append('circle') - // .style('stroke', 'pink') - // .style('fill', 'pink') - // .attr('r', 1) - // .attr('cx', dest.x) - // .attr('cy', dest.y); + addMarkersToEdge(edgePath, edgeData, diagObj.type, diagObj.arrowMarkerAbsolute); }; /** - * + * Recursive function that iterates over an array of nodes and inserts the children of each node. + * It also recursively populates the inserts the children of the children and so on. * @param {*} graph * @param nodeArray * @param parentLookupDb */ const insertChildren = (nodeArray, parentLookupDb) => { nodeArray.forEach((node) => { + // Check if we have reached the end of the tree if (!node.children) { node.children = []; } + // Check if the node has children const childIds = parentLookupDb.childrenById[node.id]; - // console.log('UGH', node.id, childIds); + // If the node has children, add them to the node if (childIds) { childIds.forEach((childId) => { node.children.push(nodeDb[childId]); }); } + // Recursive call insertChildren(node.children, parentLookupDb); }); }; @@ -648,6 +650,7 @@ const insertChildren = (nodeArray, parentLookupDb) => { export const draw = function (text, id, _version, diagObj) { // Add temporary render element diagObj.db.clear(); + nodeDb = {}; diagObj.db.setGen('gen-2'); // Parse the graph definition diagObj.parser.parse(text); @@ -659,12 +662,13 @@ export const draw = function (text, id, _version, diagObj) { id: 'root', layoutOptions: { 'elk.hierarchyHandling': 'INCLUDE_CHILDREN', + // 'elk.hierarchyHandling': 'SEPARATE_CHILDREN', 'org.eclipse.elk.padding': '[top=100, left=100, bottom=110, right=110]', // 'org.eclipse.elk.layered.spacing.nodeNodeBetweenLayers': 120, // 'elk.layered.spacing.nodeNodeBetweenLayers': '140', 'elk.layered.spacing.edgeNodeBetweenLayers': '30', // 'elk.algorithm': 'layered', - 'elk.direction': 'WEST', + 'elk.direction': 'DOWN', // 'elk.port.side': 'SOUTH', // 'nodePlacement.strategy': 'SIMPLE', // 'org.eclipse.elk.spacing.labelLabel': 120, @@ -679,14 +683,27 @@ export const draw = function (text, id, _version, diagObj) { edges: [], }; log.info('Drawing flowchart using v3 renderer'); + + // Set the direction, // Fetch the default direction, use TD if none was found let dir = diagObj.db.getDirection(); - if (dir === undefined) { - dir = 'TD'; + switch (dir) { + case 'BT': + graph.layoutOptions['elk.direction'] = 'UP'; + break; + case 'TB': + graph.layoutOptions['elk.direction'] = 'DOWN'; + break; + case 'LR': + graph.layoutOptions['elk.direction'] = 'RIGHT'; + break; + case 'RL': + graph.layoutOptions['elk.direction'] = 'LEFT'; + break; } - const { securityLevel, flowchart: conf } = getConfig(); + // Find the root dom node to ne used in rendering // Handle root and document for when rendering in sandbox mode let sandboxElement; if (securityLevel === 'sandbox') { @@ -699,25 +716,46 @@ export const draw = function (text, id, _version, diagObj) { const doc = securityLevel === 'sandbox' ? sandboxElement.nodes()[0].contentDocument : document; const svg = root.select(`[id="${id}"]`); + + // Define the supported markers for the diagram const markers = ['point', 'circle', 'cross']; + + // Add the marker definitions to the svg as marker tags insertMarkers(svg, markers, diagObj.type, diagObj.arrowMarkerAbsolute); + // Fetch the vertices/nodes and edges/links from the parsed graph definition const vert = diagObj.db.getVertices(); + // Setup nodes from the subgraphs with type group, these will be used + // as nodes with children in the subgraph let subG; const subGraphs = diagObj.db.getSubGraphs(); log.info('Subgraphs - ', subGraphs); for (let i = subGraphs.length - 1; i >= 0; i--) { subG = subGraphs[i]; - log.info('Subgraph - ', subG); diagObj.db.addVertex(subG.id, subG.title, 'group', undefined, subG.classes, subG.dir); } + + // Add an element in the svg to be used to hold the subgraphs container + // elements const subGraphsEl = svg.insert('g').attr('class', 'subgraphs'); + // Create the lookup db for the subgraphs and their children to used when creating + // the tree structured graph const parentLookupDb = addSubGraphs(diagObj.db); + + // Add the nodes to the graph, this will entail creating the actual nodes + // in order to get the size of the node. You can't get the size of a node + // that is not in the dom so we need to add it to the dom, get the size + // we will position the nodes when we get the layout from elkjs graph = addVertices(vert, id, root, doc, diagObj, parentLookupDb, graph); + + // Time for the edges, we start with adding an element in the node to hold the edges const edgesEl = svg.insert('g').attr('class', 'edges edgePath'); + // Fetch the edges form the parsed graph definition const edges = diagObj.db.getEdges(); + + // Add the edges to the graph, this will entail creating the actual edges graph = addEdges(edges, diagObj, graph, svg); // Iterate through all nodes and add the top level nodes to the graph @@ -748,46 +786,21 @@ export const draw = function (text, id, _version, diagObj) { } }); insertChildren(graph.children, parentLookupDb); - // console.log('Graph (UGH)- ', JSON.parse(JSON.stringify(graph)), JSON.stringify(graph)); - // const graph2 = { - // id: 'root', - // layoutOptions: { 'elk.algorithm': 'layered' }, - // children: [ - // { - // id: 'N1', - // width: 30, - // height: 30, - // padding: 12, - // children: [ - // { id: 'n1', width: 30, height: 30 }, - // { id: 'n2', width: 30, height: 30 }, - // { id: 'n3', width: 30, height: 30 }, - // ], - // }, - // ], - // edges: [ - // { id: 'e1', sources: ['n1'], targets: ['n2'] }, - // { id: 'e2', sources: ['n1'], targets: ['n3'] }, - // ], - // }; elk.layout(graph).then(function (g) { - // elk.layout(graph2).then(function (g) { - // console.log('Layout (UGH)- ', g, JSON.stringify(g)); - drawNodes(0, 0, g.children, svg, subGraphsEl, diagObj); + drawNodes(0, 0, g.children, svg, subGraphsEl, diagObj, 0); g.edges.map((edge, id) => { - // console.log('Edge (UGH)- ', edge); - insertEdge(edgesEl, edge, edge.edgeData, diagObj); + insertEdge(edgesEl, edge, edge.edgeData, diagObj, parentLookupDb); }); setupGraphViewbox({}, svg, conf.diagramPadding, conf.useMaxWidth); resolve(); }); // Remove element after layout - // renderEl.remove(); + renderEl.remove(); }); }; -const drawNodes = (relX, relY, nodeArray, svg, subgraphsEl, diagObj) => { +const drawNodes = (relX, relY, nodeArray, svg, subgraphsEl, diagObj, depth) => { nodeArray.forEach(function (node) { if (node) { nodeDb[node.id].offset = { @@ -795,13 +808,15 @@ const drawNodes = (relX, relY, nodeArray, svg, subgraphsEl, diagObj) => { posY: node.y + relY, x: relX, y: relY, + depth, + width: node.width, + height: node.height, }; if (node.type === 'group') { const subgraphEl = subgraphsEl.insert('g').attr('class', 'subgraph'); subgraphEl .insert('rect') - .attr('class', 'subgraph node') - .attr('style', 'fill:#ccc;stroke:black;stroke-width:1') + .attr('class', 'subgraph subgraph-lvl-' + (depth % 5) + ' node') .attr('x', node.x + relX) .attr('y', node.y + relY) .attr('width', node.width) @@ -825,7 +840,7 @@ const drawNodes = (relX, relY, nodeArray, svg, subgraphsEl, diagObj) => { }); nodeArray.forEach(function (node) { if (node && node.type === 'group') { - drawNodes(relX + node.x, relY + node.y, node.children, svg, subgraphsEl, diagObj); + drawNodes(relX + node.x, relY + node.y, node.children, svg, subgraphsEl, diagObj, depth + 1); } }); }; diff --git a/packages/mermaid-flowchart-v3/src/render-utils.js b/packages/mermaid-flowchart-v3/src/render-utils.js new file mode 100644 index 000000000..20f6483d2 --- /dev/null +++ b/packages/mermaid-flowchart-v3/src/render-utils.js @@ -0,0 +1,119 @@ +export const findCommonAncestorCoPilot = (id1, id2, treeData) => { + const { parentById, childrenById } = treeData; + const parents1 = []; + const parents2 = []; + let cnt = 0; + let currentId = id1; + while (currentId) { + parents1.push(currentId); + currentId = parentById[currentId]; + cnt++; + if (cnt > 200) { + throw new Error('Infinite loop detected!'); + } + } + currentId = id2; + while (currentId) { + parents2.push(currentId); + currentId = parentById[currentId]; + cnt++; + if (cnt > 200) { + throw new Error('Infinite loop detected!'); + } + } + let commonAncestor = 'root'; + while (parents1.length && parents2.length) { + cnt++; + if (cnt > 200) { + throw new Error('Infinite loop detected!'); + } + const p1 = parents1.pop(); + const p2 = parents2.pop(); + if (p1 === p2) { + commonAncestor = p1; + } else { + break; + } + } + return commonAncestor; +}; + +export const findCommonAncestor = (id1, id2, treeData) => { + const { parentById } = treeData; + const visited = new Set(); + let currentId = id1; + while (currentId) { + visited.add(currentId); + if (currentId === id2) { + return currentId; + } + currentId = parentById[currentId]; + } + currentId = id2; + while (currentId) { + if (visited.has(currentId)) { + return currentId; + } + currentId = parentById[currentId]; + } + return 'root'; +}; + +export const findCommonAncestorKnut = (id1, id2, treeData) => { + const { parentById, childrenById } = treeData; + const parents1 = []; + const parents2 = []; + let cnt = 0; + let currentId = id1; + while (currentId) { + parents1.push(currentId); + currentId = parentById[currentId]; + cnt++; + if (cnt > 200) { + throw new Error('Infinite loop detected!'); + } + } + currentId = id2; + while (currentId) { + parents2.push(currentId); + currentId = parentById[currentId]; + if (currentId === 'root') { + return 'root'; + } + + if (parents1.includes(currentId)) { + return currentId; + } + + cnt++; + if (cnt > 200) { + throw new Error('Infinite loop detected!'); + } + } + return 'root'; +}; + +export const findCommonAncestorRecursive = (id1, id2, treeData) => { + const { parentById, childrenById } = treeData; + + // Base case: return the current node if it is the common ancestor + if (id1 === id2) { + return id1; + } + + // Recursive case: search for the common ancestor in the parent nodes + const parent1 = parentById[id1]; + const parent2 = parentById[id2]; + if (parent1 && parent2) { + return findCommonAncestor(parent1, parent2, treeData); + } + + // Edge case: one of the nodes is the root of the tree + if (parent1) { + return parent1; + } + if (parent2) { + return parent2; + } + return 'root'; +}; diff --git a/packages/mermaid-flowchart-v3/src/render-utils.spec.js b/packages/mermaid-flowchart-v3/src/render-utils.spec.js new file mode 100644 index 000000000..fcc04b4ee --- /dev/null +++ b/packages/mermaid-flowchart-v3/src/render-utils.spec.js @@ -0,0 +1,39 @@ +import { findCommonAncestor } from './render-utils'; +describe('when rendering a flowchart using elk ', function () { + let lookupDb; + beforeEach(function () { + /** + * root: + * B1 + * outer + * B6 + * Ugge + * B2 + * B3 + * inner + * B4 + * B5 + * inner2 + * C4 + * C5 + */ + lookupDb = JSON.parse( + '{"parentById":{"B4":"inner","B5":"inner","C4":"inner2","C5":"inner2","B2":"Ugge","B3":"Ugge","inner":"Ugge","inner2":"Ugge","B6":"outer"},"childrenById":{"inner":["B4","B5"],"inner2":["C4","C5"],"Ugge":["B2","B3","inner","inner2"],"outer":["B6"]}}' + ); + }); + it('Sieblings in a subgraph', function () { + expect(findCommonAncestor('B4', 'B5', lookupDb)).toBe('inner'); + }); + it('Find an uncle', function () { + expect(findCommonAncestor('B4', 'B2', lookupDb)).toBe('Ugge'); + }); + it('Find a cousin', function () { + expect(findCommonAncestor('B4', 'C4', lookupDb)).toBe('Ugge'); + }); + it('Find a grandparent', function () { + expect(findCommonAncestor('B4', 'B6', lookupDb)).toBe('root'); + }); + it('Sieblings in the root', function () { + expect(findCommonAncestor('B1', 'outer', lookupDb)).toBe('root'); + }); +}); diff --git a/packages/mermaid-flowchart-v3/src/styles.ts b/packages/mermaid-flowchart-v3/src/styles.ts index a89d33d3d..1f76ff435 100644 --- a/packages/mermaid-flowchart-v3/src/styles.ts +++ b/packages/mermaid-flowchart-v3/src/styles.ts @@ -15,6 +15,20 @@ export interface FlowChartStyleOptions { titleColor: string; } +const genSections = (options) => { + let sections = ''; + + for (let i = 0; i < 5; i++) { + sections += ` + .subgraph-lvl-${i} { + fill: ${options[`surface${i}`]}; + stroke: ${options[`surfacePeer${i}`]}; + } + `; + } + return sections; +}; + const getStyles = (options: FlowChartStyleOptions) => `.label { font-family: ${options.fontFamily}; @@ -109,6 +123,15 @@ const getStyles = (options: FlowChartStyleOptions) => font-size: 18px; fill: ${options.textColor}; } + .subgraph { + stroke-width:2; + rx:3; + } + // .subgraph-lvl-1 { + // fill:#ccc; + // // stroke:black; + // } + ${genSections(options)} `; export default getStyles; diff --git a/packages/mermaid/src/dagre-wrapper/edges.js b/packages/mermaid/src/dagre-wrapper/edges.js index 5213d0684..8f78403c0 100644 --- a/packages/mermaid/src/dagre-wrapper/edges.js +++ b/packages/mermaid/src/dagre-wrapper/edges.js @@ -107,6 +107,7 @@ export const insertEdgeLabel = (elem, edge) => { terminalLabels[edge.id].endRight = endEdgeLabelRight; setTerminalWidth(fo, edge.endLabelRight); } + return labelElement; }; /** @@ -463,7 +464,7 @@ export const insertEdge = function (elem, e, edge, clusterDb, diagramType, graph .attr('style', edge.style); // DEBUG code, adds a red circle at each edge coordinate - // edge.points.forEach(point => { + // edge.points.forEach((point) => { // elem // .append('circle') // .style('stroke', 'red') diff --git a/packages/mermaid/src/themes/theme-base.js b/packages/mermaid/src/themes/theme-base.js index c940a0055..8ff544feb 100644 --- a/packages/mermaid/src/themes/theme-base.js +++ b/packages/mermaid/src/themes/theme-base.js @@ -13,7 +13,6 @@ class Theme { * deducing colors for instance line color. Default value is #f4f4f4. */ this.background = '#f4f4f4'; - this.darkMode = false; this.primaryColor = '#fff4dd'; @@ -169,6 +168,16 @@ class Theme { this['cScaleLabel' + i] = this['cScaleLabel' + i] || this.scaleLabelColor; } + const multiplier = this.darkMode ? -4 : -1; + for (let i = 0; i < 5; i++) { + this['surface' + i] = + this['surface' + i] || + adjust(this.mainBkg, { h: 180, s: -15, l: multiplier * (5 + i * 3) }); + this['surfacePeer' + i] = + this['surfacePeer' + i] || + adjust(this.mainBkg, { h: 180, s: -15, l: multiplier * (8 + i * 3) }); + } + /* class */ this.classText = this.classText || this.textColor; diff --git a/packages/mermaid/src/themes/theme-dark.js b/packages/mermaid/src/themes/theme-dark.js index 5ba63e155..af21b4f13 100644 --- a/packages/mermaid/src/themes/theme-dark.js +++ b/packages/mermaid/src/themes/theme-dark.js @@ -196,6 +196,13 @@ class Theme { this['cScalePeer' + i] = this['cScalePeer' + i] || lighten(this['cScale' + i], 10); } + for (let i = 0; i < 5; i++) { + this['surface' + i] = + this['surface' + i] || adjust(this.mainBkg, { h: 30, s: -30, l: -(-10 + i * 4) }); + this['surfacePeer' + i] = + this['surfacePeer' + i] || adjust(this.mainBkg, { h: 30, s: -30, l: -(-7 + i * 4) }); + } + // Setup teh label color for the set this.scaleLabelColor = this.scaleLabelColor || (this.darkMode ? 'black' : this.labelTextColor); diff --git a/packages/mermaid/src/themes/theme-default.js b/packages/mermaid/src/themes/theme-default.js index 95710629b..969551ee6 100644 --- a/packages/mermaid/src/themes/theme-default.js +++ b/packages/mermaid/src/themes/theme-default.js @@ -147,6 +147,11 @@ class Theme { this['cScaleInv' + i] = this['cScaleInv' + i] || adjust(this['cScale' + i], { h: 180 }); } + for (let i = 0; i < 5; i++) { + this['surface' + i] = this['surface' + i] || adjust(this.mainBkg, { h: 30, l: -(5 + i * 5) }); + this['surfacePeer' + i] = + this['surfacePeer' + i] || adjust(this.mainBkg, { h: 30, l: -(7 + i * 5) }); + } // Setup the label color for the set this.scaleLabelColor = this.scaleLabelColor !== 'calculated' && this.scaleLabelColor diff --git a/packages/mermaid/src/themes/theme-forest.js b/packages/mermaid/src/themes/theme-forest.js index 860326dea..59adc9139 100644 --- a/packages/mermaid/src/themes/theme-forest.js +++ b/packages/mermaid/src/themes/theme-forest.js @@ -130,6 +130,13 @@ class Theme { this['cScaleLabel' + i] = this['cScaleLabel' + i] || this.scaleLabelColor; } + for (let i = 0; i < 5; i++) { + this['surface' + i] = + this['surface' + i] || adjust(this.mainBkg, { h: 30, s: -30, l: -(5 + i * 5) }); + this['surfacePeer' + i] = + this['surfacePeer' + i] || adjust(this.mainBkg, { h: 30, s: -30, l: -(8 + i * 5) }); + } + /* Flowchart variables */ this.nodeBkg = this.mainBkg; diff --git a/packages/mermaid/src/themes/theme-neutral.js b/packages/mermaid/src/themes/theme-neutral.js index f22710387..e7a136c6b 100644 --- a/packages/mermaid/src/themes/theme-neutral.js +++ b/packages/mermaid/src/themes/theme-neutral.js @@ -147,6 +147,12 @@ class Theme { this['cScaleLabel' + i] = this['cScaleLabel' + i] || this.scaleLabelColor; } + for (let i = 0; i < 5; i++) { + this['surface' + i] = this['surface' + i] || adjust(this.mainBkg, { l: -(5 + i * 5) }); + this['surfacePeer' + i] = + this['surfacePeer' + i] || adjust(this.mainBkg, { l: -(8 + i * 5) }); + } + /* Flowchart variables */ this.nodeBkg = this.mainBkg; From 1e3d76a0aa154826771a59c6b778a7cdffee097b Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Fri, 16 Dec 2022 16:31:20 +0000 Subject: [PATCH 072/309] docs(README.zh-CN): fix book image src Copied from https://github.com/mermaid-js/mermaid/commit/ec026eaf8230d9f97fe4004f8ef0d294ca16a098 --- README.zh-CN.md | 2 +- packages/mermaid/README.zh-CN.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 4bdbc4ae7..6b3e28b19 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -10,7 +10,7 @@ **感谢所有参与进来提交 PR,解答疑问的人们! 🙏** -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! +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! ## 关于 Mermaid diff --git a/packages/mermaid/README.zh-CN.md b/packages/mermaid/README.zh-CN.md index 0ccef27e4..f34c7a647 100644 --- a/packages/mermaid/README.zh-CN.md +++ b/packages/mermaid/README.zh-CN.md @@ -10,7 +10,7 @@ **感谢所有参与进来提交 PR,解答疑问的人们! 🙏** -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! +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! ## 关于 Mermaid From 570551548319ae2b5a77c60f1ee40ef70fc633df Mon Sep 17 00:00:00 2001 From: Tom PERRILLAT-COLLOMB Date: Fri, 16 Dec 2022 22:17:39 +0000 Subject: [PATCH 073/309] fix(generic): fix generic type regex instead of looking for single tildes, we are now looking for pairs, which avoid bugs when there is an odd number of tildes --- demos/classchart.html | 13 +++++++++++++ .../mermaid/src/diagrams/common/common.spec.js | 1 + packages/mermaid/src/diagrams/common/common.ts | 14 ++++++++++---- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/demos/classchart.html b/demos/classchart.html index 031f3b608..84cc7bec5 100644 --- a/demos/classchart.html +++ b/demos/classchart.html @@ -138,7 +138,20 @@ title: Demo Class Diagram Pineapple : -int leafCount() Pineapple : -int spikeCount()
+
+
+    classDiagram
+      class Person {
+        +Id : Guid
+        +FirstName : string
+        +LastName : string
+        -privateProperty : string
+        #ProtectedProperty : string
+        ~InternalProperty : string
+        ~AnotherInternalProperty : List~MyType~
+      }
+    

diff --git a/packages/mermaid/src/diagrams/common/common.spec.js b/packages/mermaid/src/diagrams/common/common.spec.js index 68f5138e7..3ebe8b1d6 100644 --- a/packages/mermaid/src/diagrams/common/common.spec.js +++ b/packages/mermaid/src/diagrams/common/common.spec.js @@ -68,5 +68,6 @@ describe('generic parser', function () { expect(parseGenericTypes('test ~Array~Array~string[]~~~')).toEqual( 'test >>' ); + expect(parseGenericTypes('~test')).toEqual('~test'); }); }); diff --git a/packages/mermaid/src/diagrams/common/common.ts b/packages/mermaid/src/diagrams/common/common.ts index 628908aab..d34a2df68 100644 --- a/packages/mermaid/src/diagrams/common/common.ts +++ b/packages/mermaid/src/diagrams/common/common.ts @@ -154,11 +154,17 @@ export const evaluate = (val?: string | boolean): boolean => export const parseGenericTypes = function (text: string): string { let cleanedText = text; - if (text.includes('~')) { - cleanedText = cleanedText.replace(/~([^~].*)/, '<$1'); - cleanedText = cleanedText.replace(/~([^~]*)$/, '>$1'); + if (text.split('~').length - 1 >= 2) { + let newCleanedText = cleanedText; - return parseGenericTypes(cleanedText); + // use a do...while loop instead of replaceAll to detect recursion + // e.g. Array~Array~T~~ + do { + cleanedText = newCleanedText; + newCleanedText = cleanedText.replace(/~([^\s,:;]+)~/, '<$1>'); + } while (newCleanedText != cleanedText); + + return parseGenericTypes(newCleanedText); } else { return cleanedText; } From 56e28a7f405a69827790397479c9d5485d0174eb Mon Sep 17 00:00:00 2001 From: Tom PERRILLAT-COLLOMB Date: Fri, 16 Dec 2022 22:35:20 +0000 Subject: [PATCH 074/309] test(generic): add generic type unit test --- packages/mermaid/src/diagrams/common/common.spec.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/mermaid/src/diagrams/common/common.spec.js b/packages/mermaid/src/diagrams/common/common.spec.js index 3ebe8b1d6..8fd6229da 100644 --- a/packages/mermaid/src/diagrams/common/common.spec.js +++ b/packages/mermaid/src/diagrams/common/common.spec.js @@ -69,5 +69,6 @@ describe('generic parser', function () { 'test >>' ); expect(parseGenericTypes('~test')).toEqual('~test'); + expect(parseGenericTypes('~test Array~string~')).toEqual('~test Array'); }); }); From a6ea439ef376d3d46a7ce6960d787d98b95532a4 Mon Sep 17 00:00:00 2001 From: Foo-x Date: Sun, 18 Dec 2022 23:44:14 +0900 Subject: [PATCH 075/309] docs: fix typo --- docs/community/newDiagram.md | 2 +- packages/mermaid/src/docs/community/newDiagram.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/community/newDiagram.md b/docs/community/newDiagram.md index 288af42cd..bb7e2a961 100644 --- a/docs/community/newDiagram.md +++ b/docs/community/newDiagram.md @@ -60,7 +60,7 @@ Place the renderer in the diagram folder. ### Step 3: Detection of the new diagram type -The second thing to do is to add the capability to detect the new new diagram to type to the detectType in utils.js. The detection should return a key for the new diagram type. +The second thing to do is to add the capability to detect the new diagram to type to the detectType in utils.js. The detection should return a key for the new diagram type. [This key will be used to as the aria roledescription](#aria-roledescription), so it should be a word that clearly describes the diagram type. For example, if your new diagram use a UML deployment diagram, a good key would be "UMLDeploymentDiagram" because assistive technologies such as a screen reader would voice that as "U-M-L Deployment diagram." Another good key would be "deploymentDiagram" because that would be voiced as "Deployment Diagram." A bad key would be "deployment" because that would not sufficiently describe the diagram. diff --git a/packages/mermaid/src/docs/community/newDiagram.md b/packages/mermaid/src/docs/community/newDiagram.md index 57a454671..75e17e4c9 100644 --- a/packages/mermaid/src/docs/community/newDiagram.md +++ b/packages/mermaid/src/docs/community/newDiagram.md @@ -55,7 +55,7 @@ Place the renderer in the diagram folder. ### Step 3: Detection of the new diagram type -The second thing to do is to add the capability to detect the new new diagram to type to the detectType in utils.js. The detection should return a key for the new diagram type. +The second thing to do is to add the capability to detect the new diagram to type to the detectType in utils.js. The detection should return a key for the new diagram type. [This key will be used to as the aria roledescription](#aria-roledescription), so it should be a word that clearly describes the diagram type. For example, if your new diagram use a UML deployment diagram, a good key would be "UMLDeploymentDiagram" because assistive technologies such as a screen reader would voice that as "U-M-L Deployment diagram." Another good key would be "deploymentDiagram" because that would be voiced as "Deployment Diagram." A bad key would be "deployment" because that would not sufficiently describe the diagram. From e46e918b232c41b85071baffe7ee6e5debbb92ee Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 19 Dec 2022 01:03:22 +0000 Subject: [PATCH 076/309] chore(deps): update pnpm to v7.18.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5d3e44494..596cac22b 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "9.3.0-rc1", "description": "Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.", "type": "module", - "packageManager": "pnpm@7.18.1", + "packageManager": "pnpm@7.18.2", "keywords": [ "diagram", "markdown", From 86946c9bfdc97940a388733c4ded4cd9199410d3 Mon Sep 17 00:00:00 2001 From: Frank Mayer Date: Mon, 19 Dec 2022 15:38:52 +0100 Subject: [PATCH 077/309] fixed Composition arrow Composition arrow was displayed as \*-- but should be *-- --- packages/mermaid/src/docs/syntax/classDiagram.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mermaid/src/docs/syntax/classDiagram.md b/packages/mermaid/src/docs/syntax/classDiagram.md index 8cd5796ff..50593f729 100644 --- a/packages/mermaid/src/docs/syntax/classDiagram.md +++ b/packages/mermaid/src/docs/syntax/classDiagram.md @@ -172,7 +172,7 @@ There are eight different types of relations defined for classes under UML which | Type | Description | | ------- | ------------- | | `<\|--` | Inheritance | -| `\*--` | Composition | +| `*--` | Composition | | `o--` | Aggregation | | `-->` | Association | | `--` | Link (Solid) | From fca58f59429da0221c8431b7c2c32441aea6c996 Mon Sep 17 00:00:00 2001 From: steph Date: Mon, 19 Dec 2022 17:45:25 -0800 Subject: [PATCH 078/309] remove text and add social icons --- docs/book/class.png | Bin 34954 -> 0 bytes docs/book/cover.jpg | Bin 17803 -> 0 bytes docs/book/er.png | Bin 13419 -> 0 bytes docs/book/flowchart.png | Bin 14794 -> 0 bytes docs/book/gantt.png | Bin 43239 -> 0 bytes docs/book/index.html | 340 ------------------ docs/book/sequence-diagram.png | Bin 19823 -> 0 bytes docs/book/state.png | Bin 15574 -> 0 bytes .../mermaid/src/docs/.vitepress/config.ts | 13 +- 9 files changed, 4 insertions(+), 349 deletions(-) delete mode 100644 docs/book/class.png delete mode 100644 docs/book/cover.jpg delete mode 100644 docs/book/er.png delete mode 100644 docs/book/flowchart.png delete mode 100644 docs/book/gantt.png delete mode 100644 docs/book/index.html delete mode 100644 docs/book/sequence-diagram.png delete mode 100644 docs/book/state.png diff --git a/docs/book/class.png b/docs/book/class.png deleted file mode 100644 index 5b2f663d86f967ca5d96c5fffca73b6e8efb3ad4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34954 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

y{(-`u^dIjWHRrLfhUK$DDj6 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 QcZx_!PE8grZTjKA0f;sM5dZ)H diff --git a/docs/book/flowchart.png b/docs/book/flowchart.png deleted file mode 100644 index 714626b70e398905987bec0c460308fa7a84471f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14794 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 diff --git a/docs/book/gantt.png b/docs/book/gantt.png deleted file mode 100644 index 95c8d08a14bc4306426530921fd538b404dfc1da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43239 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 - - - - - - The Official Guide to Mermaid.js - - - - - - - - - - - - - - - - -

-
- - - - - - - - - - - - -
-
-
-

- Get up to speed with using Mermaid diagrams along with real-world examples and expert tips - from the authors to facilitate a seamless development workflow -

-
-
-
-
-
-

- Flowcharts is a diagram type that visualizes a process or an algorithm by showing the - steps in order, as well as the different paths the execution can take. -

-
-
- -
-
-
-
- -
-
-
-

- Sequence diagrams lets you model and visualize interactions between different actors - or objects in a system, as well as the order of those interactions -

-
-
-
-
-
-

- A class diagram is a graphical representation that is used to visualize and describe - an object-oriented system. -

-
-
- -
-
-
-
- -
-
-
-

- An entity-relationship diagram is a graphical representation that is used to - visualize the different types of entities that exist within a system. -

-
-
-
-
-
-

- Use State diagrams to model and document state machines, an abstract way of - representing a system or an algorithm. -

-
-
- -
-
-
-
- -
-
-
-

- A Gantt chart is a graphical representation that is used to visualize and describe - tasks (events or activities) over time. -

-
-
-
-
-

- These were a few of the diagrams supported by Mermaid. -

-
- -
-
-

- Book description -

-
-

- Mermaid lets you represent diagrams using text and code which simplifies the maintenance - of complex diagrams. This is a great option for developers as they’re more familiar with - code, rather than special tools for generating diagrams. Besides, diagrams in code - simplify maintenance and ensure that the code is supported by version control systems. - In some cases, Mermaid makes refactoring support for name changes possible while also - enabling team collaboration for review distribution and updates. -

-

- Developers working with any system will be able to put their knowledge to work with this - practical guide to using Mermaid for documentation. The book is also a great reference - for looking up the syntax for specific diagrams when authoring diagrams. -

-

- You’ll start by getting up to speed with the importance of accurate and visual - documentation. Next, the book introduces Mermaid and establishes how to use it to create - effective documentation. By using different tools, editors, or a custom documentation - platform, you’ll also learn how to use Mermaid syntax for various diagrams. Later - chapters cover advanced configuration settings and theme options to manipulate your - diagram as per your needs. -

-

- By the end of this Mermaid book, you’ll have become well-versed with the different types - of Mermaid diagrams and how they can be used in your workflows. -

-
-
-
-
-
-

- What you will learn -

-
-
-
-
-
-
-
    -
  • - Understand good and bad documentation, and the art of effective documentation -
  • -
  • - Become well-versed with maintaining complex diagrams with ease -
  • -
  • - Learn how to set up a custom documentation system -
  • -
  • - Learn how to implement Mermaid diagrams in your workflows -
  • -
  • - Understand how to set up themes for a Mermaid diagram for an entire site -
  • -
  • - Discover how to draw different types of diagrams such as flowcharts, class - diagrams, Gantt charts, and more -
  • -
-
-
-
-
-
- - - - - - - - - - - - - - - - - -
-

- Purchase The Official Guide to Mermaid.js -

-
-
-
-

-

Written by Knut Sveidqvist and Ashish Jain.

-

- Knut is the creator of Mermaid and both authors are active core team members of the - Mermaid open-source project. -

-

- - - -
- - - diff --git a/docs/book/sequence-diagram.png b/docs/book/sequence-diagram.png deleted file mode 100644 index 8c51ac1c5d6601960112784757061943d9d6dc8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19823 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%0D)Muw-s z5EDEtWMbxW-`nUTWi8<{vX8rjuh+Y>r+@Ahi{mO@d4uzA9+Z0dEC|v1AOnDJ&(#ZMTH5=Lpaqy{a5Q;sZYBmj)F-pnjPoT!rAMgE>wnuuF;(Pe=m*nfS^$AAC4+fYBt_CsfNf2>D zf(Avi61!`#CI~Vt|A^>Jpa|bnmdJfCA>EQMZ6FA*VxsPn&dH=+RHlj(bfV=84O<=t zjNS`I3p_wA_XF5n+5i4hyjI?MWUbqG34^j$If{}Al+O~9zO6Rz>Ccj}n|tV!2CYdD zBy7EYvl2sg9CH&&QY6_Xtm0*#dG0J)N5WE5e^I`Q6$-rs@KLJ*{-xeTN-+V*E71J% zn0_y5Y$TxZ;qL84Pj059?|u?1wK%|XGf$7NO5q)fD{ut*r3?HTK72fqK9s{lWFoz= zMlZ!k1*g2dXAOkM>7~LfWBfL2?PlXhNDhm;5^%N~ntLN&tQ=&vnFpo&9&B~cJ47`) zB(YS>%k%lg;-~@yS1_Nw=<$kZ7tK-~e{^zI%f@NIeZx#`NMRP_x-Wrag7r;1Y3$a&rCmJu|HUuBN3%A}{~r54u8WA(9aA#PzU zf#rMVZC}p?xp8y9RSyKKkbj9S<^1oN#?>~x=1LMGzWBQ9w12sz_}&G%Lm5}d4GnU3 zHyXb^{_>?OtRwBs-#||3^#n@2$iAAb&I14HNa^y9i^Azu!>$0$i@_dP`=Tc1)7CSOkm?x@}4HH|4{f#Xj z*Jec>ma@b)WYc4FV?C}6u@qU~+eK;zzx<=LIrY&4AcK?VYFz50By}kVTwYM%PI>35 zuQwDJuaVUu{nt>kUpmgI&>n2$%OG_iAVBG2$VKk-qwIo)QpsZ%sp}W{r9{db#MAPs zOD#hVO1;Fs${s5I6`TCWb}-sTVMDf_`xwPetr%pyoQ9f`)^7d(x@v##%nup0!rFXJ zIz)ZuGPJ0uG2#rOjlS*su-};1ac)TCA2&8 zvM`+FR*J7U{aE^jH+LUG92T%zHBOB7XMMC-Dc)*v5MOYb_@Jdi_5=vq17j zv{`8~AsD1$u4D}z{|>+qJAj$bUhlC6CAN#gum9e>B%M9E{^#iamw&UTph@xnAwmP2 z@BQaIY2Ys&W3us(EZF!g9{JVW!WHDJgP$wBYMjmLlnQ->RMTTnb)fESNH5y>6S(=xM(`y z{xH_ z=qm<7MgS=M#*HC-1<~G%TnviuPwGi#A;pO6zn`~v%C^#Ti0piNJ_Bk{jp_NKc+81V zsJV1BYC2YkO2fWfO zPq=NOSnl%rHQjY3X@N5>4-c)iJUef;AkesoZ$P3pCQmMh^#R0~=0-X?ze|IaPMC?L zmmQ^Dfytr(JUYSBbM9~~bUG}s&D8QcHyL8_e58&s$Yjej>5fb@>nVK8)QGIW&&2|| zmsqGqUlaTh4e*qyu73DBU3vhZc~w!s>bpOQ(Vso92hm;@spKK$sO13qM7eIqku>;z zl{7HiYe#cZ(Yv@5s)Gj&NdrWA+|enuCqk11MFJ&$Je1{GuR?0;`CVyF?pk3Vgd zEn9+Z5cp;Xa}7@0#M+obx+j4jbv!(_FEkFnVxKQi+8!FJV{9f#YUxMG_*zWen-KAo z{a^r(hlYPG*v5DqjNMLX*bI5>(2A_Wb{>bnSS!GzQ$~BF^ zlPz;>0+27$K93J@>RfjQO)rsY*;upapYgtO8osma!Y@&G6CHhX8e9sZ<^98e^Qvvv z*Zin9s-vek8GYzk*~*tI8!9`1j{Pu4wD zJLB6Wf1CRPycS(dJ5ibL{@zfMsL+=_o$>D~$;H|v=m;Xsorr9F%!EEHG9mqnC_;fa z7wXJ{MAZU>O={rxg)9p;1OTn$vm9o}oAFM$?0`;&yI~siCPib6wGZ2$+jPvg%{#xg z8cBy>CMoXHw9Zd-uV|Q`**5W!7vj7(AWR0~{78Du=J%%69FR_hxUyi+$yd9v)GfVx zL6a~~L3hm`S`c_Q*G&3^qLp5a`ExRz2R>3k0|1Q^e&~nDJ$UsP5VsMu2IB))PlWjrxJBSz3zoak`l*Jon88>v$KjR#v1GRSg|?jfhdnL+sMCf&R@6YXh=+}K~)khs~C^i?nEc^^)J5hKFyg1iib7;U$?&w1i7%HT~(%a z?QLYfkw*(mepOstoLgcEt<^f#U^V~&p+@XX7X2K&PeCN9Q^d_)(t@te7|Pk?Zitv& zIN3KsgOy7vus>E-OdXd7Su-}{eWVMbP%Ysn6&_SvT7=8q@#j=vhTemtOhhmH;FRC_@s=+^v~*Mv*oP(L6n;jn9E_U@ z*<9f8f4&9+OlCpf_q6fNlm zxl?%LyMlk)TmCaIcBlTd;q#r>dHL5<@q?AV_D^T-T>9tXBtg||xixt;&!g^qbP!|7 z-ad_K`gxX1>vlKa-fyE?d%9LtB!=g)+q#=|XV=`xotyk%ZpOpA>bvJ`X`CpXz9v^D z?RVa;r6s@p8F%FV5tP4^d@k7Lr^ zu54c9-7R0IYBS8Rdan8GEVIPdV*7&M`qM(~IeQ`<)qkAY%`)38QOPGOW{a)Vrr+)6 z?Djt*8T@t@8_7gndz<-({X=7;_Tl^YC;UG>zh`;M>xG9uWNFUKmfBrrl)}&ap^07X zzmB-V@7>>HxZXFe-#Fd&?5=1(m)^jsW)+{d`nLe52-n7cW%ii;`7>}vcYb|&R^F`{ z+3zg2SXea9l-QHKd0U}sZOl#E+kfx+|7vN@Dt~|WmGt?ocdaD_kEg$nPmi`^Hu_fc$9$&xFIzO&19PyKh*JHRASaYwzxZ4q#+(j)!q{6+4}2afGG)s6N@ znVSx5A9v0|qG`NCViz@aZsp62|vSLV;AAK3E#`0i;Epy@cFBR3cS z58knPTlK#!eg^NtD!M%$o%k07>Y&nDSHM}GL3S#@f{2#w(-Zd0e%Yn45B-!X z;Q3X-nH>i=tF$ou!y@-Lq^pH;N!JfGC}UAV^Es5F*{(L!;6lAPq`)*9;9yn_69;gM*si-AWDj_-vIzPJ^%nv01smT zeAwSQ1pp+nm0rKn_E|Vs_70$!Ugy?_=Gv}ArFN4}y zUes%iI0>v~Wr@18vyrfdllqmRkFfAqU;94k;tnSjOGZ=5;$%Kpf z_g1>MCRh*eRPK30#xk+1k6-90<>?*4+V4z=AN13HYJXZeeG{s8m1b8kyY80JMx|B! z_B2(P9NFDTgrCfDgCM#W^5i=CUk;W01o1irIR0{7whpZiJiF%&8%vq;iI6T;Nd0o; z1s*>5G%=@9r5LMsrG>SD44joMLvF-ihAj5+yGGyv^S$}B;c2h76*0qUVZB?U+(^JQ zKGESqQYAmXLEy>0`QN|$iI4nzqB~C64T4m*g`G(GxP*eX#r ziTHWo{xwL9Q5hQtA4c}`mv_oSRr0w%wQtn9cq$&j#1zYaOGQ_WM|D&E?u8g!td2Lq z3vH&h>=jE;?I#rWHdRNf{! zTl-0hrW_~d43!5Y+iomX%Ka98Z9Ez)c?{UuD%B+!vD9_IF7_%AvdvFfa}jbmCDpds zKN{7*#=|@n57Vl8vY_Er;bl}YGoo#O@(wVSORncKeN;qxQ!jL_AuuXUMC&d+jFs2V zJq&~y0RwKJHEpyg(_}9YzsIRyM7;l6HXi^FakM%M@O3Y?0=`yj#W5Q-sbM7uj_*WW zF@HU${iLVx6twh#7zF+R6rv;po@)-7sKsRbar*OV zvSI0iTxT{hEXNg*is1Qp(>SKA6xg`*bWi$yu=^j=nTsz{eIC8@rin%uC!zjP+O`QwmZr1Jc zGsu3EqZ0K@wdBVvd+8|-D^n1scF!R{r<{^@pH1IwvC8M`foE6-)#~+&yq8bWpZd9E z57lj#&G$&g&XP0u-PVIvnBNTztci`3fqHPeC7wuRym-WPj2;o!bW+p`!=vj7(E$+V zzvn>D`$9tq;+w+moSG_Yw$JfcRJvZhscWwLm^Ds=M=L}?wK3QJx5tV`xazTnIVucg zgnAqpHH*DfEw#uA=r$~-`oF}jF-_-=nlULUV7=HzQ2XI9KL^-PH zSbLY_xIo4dwDYua6hV$S5_F}iDtx4PdatC7s9-&6BGpI1a%Jd>rsgs#y3;lv#t-z?{~5H3Iz#Uj8eZOQRw zaj1zZa$lB@5paL|0^VV9zrJBTBQ@?j))`L zz%m~@rTNK9Fn&l|t?4*~9D~L8fGT3ZKX0OBCqEqu{i1=WbXHtjH7U+1I3{;xtqNl_pq!(0(*8x(puKsfDzv?i}a7qGYI^3=O58 z+7F+>y&-d=`;NnldTvv!y5Xnsmw{x4Y$Fo0_1G_aNOnB-i44<16LDY=pa4*It!Abr z!<#I4m9@#{&BBX?w0|f84qOL_bk1n5BY@2=nOgUidr2hpGhZ9m_3Hio_G^|zG-X$T zJ$*1)lW%2JtC4*`AviUzBR1Fsz#|SsiQ1=}xe?fS|AT=R8?(cgz~xXmaf*&ptKh%t z&`AT00lYI_z;Phe-x=a_TtHNZr|#}&^P1UJ=4?DR%sxtBT(tkN6L3RH>ctJH433bA zyOy>|>)Hk89=%3LT>LZmnSK-AWMDKTLIRhrp}jB=UhTwEjH2#AmpZ$JO!ED0H_ij} z7@=a)MnGGuJ3bWbvNPL6W`$VL!|*Z1D;wz=^OCb>S7<;ER_nV1O1jn-cC2~CkzujZ zR}xg-Y#ogWWiXX0@!3dSOZ_f>unvjLANHtu$*U$3+X-t3{lANny8G}Cdn+hufA8hA z1RS;_JHo%d%zc4c);*sXr}xrxSof|;#AfC?Asx?-jX%G2CW>fvNAwjq1<&(MY#v59 zv~X6fG!3K9C_`$i6IVLb*VXhSxxr4MQq7y}P1jVc379A^kl(`-IFL8^((LlrHOG~; zxCXIoZ<l()ltez<7_-V!AhafVxY!%BJnpdw0)0qob&ws*()T4P}4cTkRLa?gpFY_tzWd z{&{)7S!a;+Q+4p1?Uiay^Ybhh3-nz!lMAp7ns{8JcuXM8rFNXEN{-x!ekq9ef1U(c zdejB44?KZjCEhYocRwOW0y)J+lAC2I;b}4-^H_8!{!h}V|2ykiYNbjb-Y;;2@BJz( z8A&buh22tB8+P98xclhOkpQ*&?*mLOMfxup4N*`Qg@YrRng&R;+-&6ncCPmW6 zxa8$`5+1}EXsXDkvHwHp%WkWO3bUL8f_ybHVM?cmLJRBh!Q)-K(m;DAfJnXBV*foa z@&y-xd{XnQC7ha@pH1!D8$UdU%?C8mxR!oviNDfY^Nw(3zjv&&C~W$s9bXvqEAXq@ zJugCwowCrTu(`Q2`f2$6`fo#-G7kxXl!RQ z0_K*i57hwbPF($4QWppDC4A%S!)z14Yxoi~Ivq#mit}m{-^|n>JsCx?4|Sf2P6ue_ z5@G#x7@hMjMiP)pT~ZB+5k6$&qrNXB|9S2|} z_A0H3VANZ^c2#H#2K6>T%$@kziyO3QTB3EAJMI`U{*;1xm^6o}4w+#niI<1?qhfJ-DbWt!BnSu2 zFdGJ>=ho^g>HUiXVb0FIdh_YV+Eo;*uN~+37c;XlVe3&lUXe9$GoJ010%gQ5R>_B~ zUwr^Z`jWY<$C-p5#j<<{9uFw~WD>^>+9R^R>FIF}mz!CC=#C+~rtdr<;9&sZ!h)m+ zyZl<4E27fa^}?5WIr{uge+de9KB=>K7u%lt@1~xZXb(*P`_2TM&s=%}E)zF9`5^Rx zJm^n*%@x<)xFMa{;I4fLfx2htGSmJJ4tftS?}Q^kRL)4molV1*+y$@h0TL*Uhugh! zgiUxLR0U|j%78O&*tA#A_MDCCVRJ1B&V0Wt^mGIiw7>dd>gEd7SpLVuw%ouFsm%mP z@9eF_@&l$i8(s{EftqSo@8YT|B3v7R+vB!`nT>@|fDL8N0GUVv5ubf$7`NobGo$?` zCtL~Pp$VmL+kV_E0a-mgWg~-+tZUi}u5RRrpOq~)bgf2^6)J}cYcx8w#_I?}!^JSA*e{`qEU zXIL*qONp3NRhL1CcK8!8!dB--eHzC9gBH1*j^}`hk@je#{TsZ)O5!^fPp&cQ;O}=@ zth+Otdb$oLmeK|?kRcCMbinIG9b&-vb$#Q3bEi%A)jCPS#g$Qf@fjhhlYgOw{@zP8 z81%zNnd{eifs9ve&gw49XPB{;l8n5(PM4WXn^YPrW~6d^A9holW|i<|;rLdwj{q|d zF66N#%}f6u$#=#e{eLTNDjH zoOYMS!N|v>RH#!gtc$JDRFBBU)?PtJhqBi!VIRtkiIcj$=Jluv3I9=vU~#})dG{or z*fLM?aVQP?^&7{3{KRkg5L6;FKgFye#*4%jV#S?-sma1bhR07D>@1tjW4E=5{Vtn+ zm3h8RTsn`ze`FV0R#x^+vAx+L0Sz$*Sp&VpK}!rdpS-ki9Kd~|tGln)aAJc^8&pU6 zB4&u2Y#}_pMDH{XKxtoT?5CT~Wafl^w!u0sN_hf$#}!jXzETc_cUc~f_S0n%fgf2> z;0&w?yb2X|xdT-+F4@Uh$t_wnr8W2uHElJs>c5sTG|VS^#6@zIIBHq}E|p0I&Rth~f4k98M5jcQzYO9=qu1 zjuI93zsPh&Ex!5qiFVvQaQ7n_SWYEoV;U*d?0~%qiY*m-wB1Z>c2oHtpwJxA+@A{? zX*a%1SZprfTF~nivkE(o8~9R8vmUgE=4d9uE#PhioV}Uw{?x>R2}_+Y64b`Xz*xR% z-=KEz<$dfjw8y}4GEc7fz$kUqp}Be7odxOq_h>If{*LuKu%eahoksCN@f(I3FUhg| zyOd6^SF*wgM`4=$55=p=A(fTr@oIv~<}SRk`riCT{zFFZW+Hn=y3=xm+fYr4a5GV+ zri@+tE7c4-EPd0KApwJ(5cO|7Pgb?>mhcvvK~I_-)&?>UqGU*JEK4pHm~PP7ut2Kx zg+P?4A?`crs-glwT3#w^R#Zf2`e!Lx?INiJ%`>i!8$+nOLr)NS)J zlJ$uqx7i zyG56(J26A7ojyVl8@B9S_rU{?bH<7A`ST_#s1q;21jFWv|U?yqJP+ zy>IWvh8h{gqBePs;soe!)iab zTMDF8%BQfOnXz>lT^Kk=A6su@Nzv`O%+A1K&p8hpMz=+a_4iCZR@;?e)6VvIX9HLM zWo6#$5y-#HFDcXZ3roOurcJXTTz+Q<8=GgATWj{a=Z&C$KYKDZ)W)F1)&A;jXfuy; zZ3Ewz#4#L4i;d(Bo*~t zd%vBde4Afxh2Wr_x0Bhd^hNqFfgriDL^L#+XLe%nozCpHz3u{|-L#d%(GS-ae9U|# zd*!pZSYI_LbeK|Twb^`znC$DF=F4^sO}w)gb>7imU3cWsUGDlzXk}?a5;r5w9(Nh_ z&1HDLzcoqvEt>i2=}-^pMIDs8~(^Ti;(atn_ryLEm27K`b&2j`&-X0?^v$x{hV`FZ$y_QTDRu zZ8Mee&XSWz&)11=uqEG@_2v%sp+jn~URRd)1FBqwbc?=2lz$~~3`4r)F>^M)+xBX? z;%1q`0zSje{C4v?Y7L!f51TUu)tk5D1vlDQRm!4IIX8zqb51w;3Sk?8L zc1o+4da`r;ktg^e)8%)oCqTGelNpVE;346ryHJ6m(K2H>*RHeT3#Y214B)RX+r}6J zP200^Nd0HOr#KF|_4W2dH8bv#n02h4+_*R7^L@3;`%l@`Rm7eyE{?~{ zJ~wD1oYaRS!J%5KdvW+$gOAUx(Cks)TBH;!r2Q4<#T{x)RHIM4l>!`t#HNl+?I-<+ zT<$jR2AcG!NQG(!;!=)xeu~vN5*!~DMOgzLRYMz+9mAKq)OTutVk-fMnLHELs=zeBsTI=G!!DTz&32_{K>rGMDQ zlWEf;Yc6uk&(mYTHk1N7s_l5OyYCnUiq0K`@8nkNhF@(FZ zok%D0ubUpPlI&kJke7*Ypl^$gzk5g|nX|)Dtr~;(7!fD+_H=l&K4)8!*Z$sE28W z1#j0L{fFi3I#v;lT}8Y>>z{qYjlUD4*naK-gwOMJ;Jw7Pld?AQI3@d-wNcXAJsjD= zhFJ!=zCRGBvgbcaEIy8M*Tdg8Mf{CtT$v=L$I_^!W{CJ6d=Va3C1aSc^SuYaH5*j~ zXsEB!qDAlT9Lki1$xY2BHQ=%>Qs;~E*P|v=`0m6RrM&&Q-Nzw;Lj`$1S=zf~LWRGU z_6g*)VZb&2hqoS50k({aljJYy$8wyHtX_M4^!f#8^3O@hXkr635#G{aZDQ%b0IQ1 zl$`)x(#Kgt&ndWQ*WifYJ5yQV(F-Ex^!mK5?SUR7k5;UKI`G$RztBw~6L!uYNZ`liDITAW#;7+LxaRfZl(60T$r`&@qh-n(BIo<5o*uDo!maj|nwLM6Pr(xS zD=b3x&cf8FEClwch7n4zvl5^meV$H-tYl)?{c^(;if$dun z%3_&+H#oX@z!9LvD|-drHuIg2!X>PBoQI}gzG6G`YYu<7_cMHAMhzI^nJrVpa$$5L zf9}1X*+46_HXKooq)R;E0`yNpwboF;OQY;|B8_s$Eks5z@8J7!XXS-`1aPQ!-)oEY z4Si~o4@jZ$B?-%0#ZY0N5{2*YQn?YqGou&h^$9O7@g2Kr>2oECMWe_3JVhH_DBq{4 z?&^83@*yOd29O}04#2G^uFII;mHJ4}huK*0(Grq}+Up36$V~2^j@qg}m?<-6?oj^; z+yyZ+c{iDJCagnT+_nsB_{;5RJEVt;lyU_fwimw-`q{5m6!PegwXRefkj{@!M;4p) z5jhH6Y-CD^>px6ep7X!F36u=}XQ^7^wfDAZ`8GazuU~S_0uk+=e*E_G`yv2g1eY`Q z4_~flt~EMhCN$GtZ{sp1xjhcM4(g{*jr6Iv;F;{q56hbJ2@AC&(wwS;%}-1GKj2nn zao1b)Xo>;q4R3$SPNHLU!H~4E`ntZzEffi1(v{GA@mI5 zfQsHZOgL^1`jrA)uqE@0CU|m0hzG(hzl#K_gbL&7^OmH9P2prz?t(N-uj{0=!)!6< zw#D&-aIl?WSlI!$c9=%qP)wD1!?v)MKF@L79TSurFkMNn11gjG$q^3>hrmQ#A7_DW zuA+6TM;cbExKcBtp?*OwAV6YuJGDjUN;Jv?@#l3_ja2GcI;ZMqC;c`yUy#8^>p<)9 z)e?MyydSi;CJFC+-TPq5(Y)>dfmseg=R(2?xl9g-@8wFVEG{x-9IExyedjvG^GV(lHYXW*piW%FSZ8BBhOuw(t zily^y%qRJp;I$(2R233ZVchuqi^d_%9}-ajhqa8JbKf)%qM(u0Oet2_B_%nCNJ_w2 z^3m$fIG6t=fmuSQ@*|dl5qb=`4bpCPc>nB^X~?7KhMg#;zuvZ35lT9QPn|zTHNTF2 zhw%+mTA)E*?4$|n7cHp3$5$ip86u7fG+seha>DsA?g2`U%_4s1V(w_vn*F!T2JZ75 z!!EX!k_^aoJ${1OGfX!UrDH!?=!|Zp1=FvJP>K2)8oSw!{B?0o_usK)wKD30Izdgh z>Y=lY(^+X6OODYe>#yn`rEV zg<@ALmnEUrVZBVFmb=>Z^Jfa6PbQjTDrHb#9T~wZgp918V2h>7cB7@+Nq=HSfK^?8 zJkysrqHhf}zcmknh@zK0*aH+oXDJ^gr=>bvbqpkHYLm=p#VVwno{|dY3(Fw`ab(WD zUBj`fxi|H`8czhOIaJ;7hB3e%*y z9N7V{cb-3cW~Iy>wtLi#q2s83sa(7|uES2NL~fGGXL!k%zTmvBgkbpBCu}~R=-W-7 z>1Vavf6d=Hq|vYMW~?fC3v5kUT&zM1nkRGJccj@pEM=eDX}KL?nqp@~r{9pU?QdME zi(^{;et5_8s4R?HC*J!>fQ%h7=y9V-KCWOFd8u7UVPyASI_0XgpP~py*B&)FLYCQT zx_+9%QU+I2Nh^$5zwO}dldxx=;3#E6Q%`>Gzp{e=5H%Ygv8xX&yp^vI4BsU9H+s1v zA1hCX)>}mkD5oi&?kc7gMH<69m02```b(^I7HGobFn_6=vd!vcIGeu+k~t>*2h3I* zg|PcLk0h66WpmNPGkXUu?}k@#WGwWqqVTo4_8U9fiZ*zqR98?U8|`{Z)zPpJO$ZN1 zgMV0|t=?70fa`a;phH<_TgS0j>}sd=6|*%{uvS3MH^AI-Z%!^E2`QF@o{n0g=fMgc zupEZP1|GgW-No?IB=~O087|P;mQjWCoPjTC){^>NODXHq7%xl|pG^9R*#05#Hj)cp zykGmz9F1Mg%jT8+@qKn@G%3vtS@FZG=*=p&YBe^W^E}0UF|yxBSl9%NnRE^e8yK^c z1i=a$JWXKkI$z)sn~KW0HyKu_v=mN%EBAmAIn$d$#C^BYWMiP`(FiuYlT-78<~MoK zzu(W9yPV2!)i=+cTet2ligON<9DNgD8{Ozwxm$K}3UK`{yy)CqYk6ec$=hJRrKa<& zFWa6qi?f04PJNr{@F2)Z{YxsiSo?``z>9rX{!FoHA>Ari))sG#6aQ2CrxWmEq#WW= zlwR|&rQ`iUe4k0Ry|qz7>fgl`;%tP1R;c)F(Zj#u<*b_$4_agop-xscyv)CrV59k{ zJMn%1;BnIthd>L`eU35Idg=3sIefzr35~$)d0tRnfWEL`A~NZykK0M=B8lDE49D5c zcwt;|PvzEeVRrn;Q1;>=t+6^+63y!~EJC|bW(J|$mYP*fG;TOy7vx(qJGnXDxxboo z82J^jRDPZuYj{|9QUr3+)zQJ=%3e|3mnsBWL*C*?Q(d22{T|GZ4rfjB8qWOu2gMtn z@Iv969Lk3RdpTzSq|<;2Q{eP)kan+-+FK9IkPgqxDo>mafNOI8jJX;3d`P?iA>g;D#)m(0W)b76v3gzO!phNuw>DFo zTWt;Q^h8^_~u?=@($_i98nQv|1a_cUwyT3U|Nf{$F@SQJ-RId%Q-Bl4@{ z`<`jvDWul7_47&2Bbk2%z6s38_#hm6r|>_^lPr>7_JvAcKj>0V0mrP!#e;IVlDX`~6&UbnTjSZU|G{1xhdw>H9uE+cH?E;*x6L%c`=y7NWIt;J7yJUnrB4;n2%y< zqZ8$vf@}?%!gU=d*(v^Cc>i?Ug}xcp39wnRhS)D<&x0NJNpVPmX58Z5am1ASdu!W{ zKYp;|q$WP>oNLpG{T(E=ks*;FC!7Nt*>AV3d1D<$SfzFyoa^2%rc6e*hKR@}?F1M1fL+0n3Cpnw0c;wsCD19|73D2!IC@j*ejEO~R{jd~V+`WrAh={Pky3eqF=_dJmQZ*4&+e z9lls|vrJciS>uUYh--|Qx0@n|oo0n?O*jbyO4PDC({WXqJ4i?`PNXZCe+}ILwLjg`lS?!*pfli^y-cRL5Lj;B3IPoU4 zy#osFHlihcpNI4Q66W_8gvavZKdbq7&4WlM(DZuo1|?>Ms~GQPqfbuec92 z?{o;W6^;OmLP7tUM(^z*?a`MUA*6+)2&c)XrDv%NobV0jo7SIic?E)xK@h@yIJ3U^ z-@%R9(2XaozO5(k@rKneateK_%4G%*%exz=?Pzccx(;V_2R9l_S)EA`2rhm zi=Zz1-}|{y)&s}u_LS&*e*xdMH`bYf0^~Wg;!#i|G52LpXUBp`?g+hWRL7Y~%iW@S z$U^Es8R{v?XWMJ>?)r;J&dcuiqr8?|BNxYe0w3=ha9mE|Pb}A2$?}lxCWTi6Mt;S& zk@pww@CMIBpa#G9i(q@6$!XT)_cE2YIMfn8@7WiZmkHRDf)8gdOfp{{kY`5IcxI7x zFi~y|`rySo6OOsOeQAjVFBfS8oHB@ZtJQ=uMafHE;)`g^zHsut@^y*HQm$_tR9_wcUycFx*`yLX1n?GiOiw zIDvBOVt+*$%)LTVz177D2Upnbu-n)M_0@HAvRsQK z_{ke30Mm5TvBtygvbBp$L6V=@FL1U`LdpY0q~iAWthFBc#M^fPX;xc&bKrgP3e{Pu zo-&EJZeGU-9?Zgs9hSQA0&?N5VE?7_ zyY>ZNcr}Hye$0Ol2y_QezU@>_ze5RqyKb7eqQ^(>$rj}>x33yY0*4k31x&`C|}7797f5?YW=$^-bh zF<{qT`LUXP^+6=p^Bm?zKQJYt^r?^i(@Z>1m z;#*(|!*^&2QDdO%ptviRjWGx^QYyoX$<5n7(8W+Fok=fyeN-FUY`3!UB^{4 zW^(dtJM9~KS=t{Rk^b;&5JtQLQ6y8x7nb63xD~z#!*l3WTCv!0D$O~yK2Z1NZ5a&i zE>kEpZ?z2z)5ujo@j`tb`g%GIb$W$t`E{6y>DwOdwp4ccCQudk?FBm5384nS*Js1Q zDnlG!h@gO@a`dx>X zQ=YSezm$%>ylba@)Cu%72+cy4y`G~MLI4hmVOFFBZyINfz0yTAEe8TGMU9#XkL@{v zyK%xv@wY#D5-`leLsV zKa<%8<6jfuxo&;LOt2(IUZg*m z`p3~(oYmv~$4jfFYm2Qa%;%X%|9;;zVb_6=Y$f~jaGB^?E9#oW%uJF7fF!B8@u%78 zVyb{s(*JHGvBF|gjcPOZ+Iv0iDY=WK7S?1Gcox+`^7kJOdX_#ng08wd!@7?3 z@>-t1h_WI0rMr-&%2oAb`~OWqF)=o5YADjXC%IP-hmz?mJDc%bee(O>hP9NAm+;c( z^Cfcvsn`j-Z*(q#DeH7N*jj+aKlO~v1u3zyjCf9<+nL^bg4>LN@kr4d8=}68xF5PT zF2!p$osf-gGmKX(_!g(mI&o$8v`Mq_+G6za!nQ5-(9b7CpZ6WW)nJS2@>_oa1_xA% z+5joNp20G1!Bp5UFWa%YH=7wM!JZ}qHhBYz=f)`B?_uK;apOeor-{>Uw zM~p(3&e31CayCdkwWhMX7acCnpIn3TN9l1$Gl@KIS_SyMgh*jfh|jKPGYNu6 z%&wWL7B^Unx(?9&t-FT4U>4t6?>9o+KIhry_sC8LM(-( zz`;o|XM8v6rQA~${HTVbts*zAFZF>w{(}hb)h)n)%zoA&fLRJ`Sp)=8TxQZYl8oKI zPak7EXhnIxU+DeuqahkUjLo}s@76r+QJa_n40&l}-*=hH7`Jc*7_*sHh62C!vDw~1 zBJD0cy>CuL^SHG8E{xH1d9gxLHl-Jgr+>k5YD#k70AL5NhntBCbVo{l#)jz!o@PI} zlESZR&cAj`ptMZ^iYHP}SUuJZPE+~4mvc`m?-}q&?^aH2N;WgKR`Pe}&L6jozH9XR zD_kj{Yr7Cr1<-Wnae<$OlYQ15+4PEJI}k;gr*5ee;Z}Lmri|parvANDVO*Q?~Nha(JQQgqUyvp)^wf8G~)#Vp=w2gMp0?eak)skCd`-r%hpOtK?ehMMH@El0xY+PMGljeF z#zy| zv;QW-RBMy^xz6S`7aS0MNMe=h8n6~H^{;ZdSAFF4eL^Rede8l{AP$q+ehTX9e5*=N zj_lnZ$`5HnV$Pr3|7VcBX>?YgcHGgL5Z5v`pUSKS5^-Z9N=>sG0lk3WWTt&C{2j~_deg?{QSClESW5<-a~L*>2OzR z0n=Ef>~~`!-8e2~IjxxgMkrmg0OPc`WRP?$MAi;DLaX?<*J*~#dOr8v)zf4pyLMT= zBn0qv=xnRV>Ptbkg~&gGw5RmGmC-7`1fQ2i*xzOwq^$f2k;|Yn=4Wg12RGr)Kt|vW zNIRZWBHuB;G)_0&j}w-<3Ffj`QP|alWr<16rz<%&vmfns8KiAh#V$TiJZ+`dFDUK8 z3G1FpY7$aWjj12fO71#&KU?6P{!AwV*M>BRT@aQQ!}Zk85d%onn#s!vinXIyO&DI= zx_W%CIp)BJ&Hf@#De{>|@Vc5jc8%boE9<%j8~%O!zWVt2z;f`DuDwVD&hgEad!#bP zBs#E+!kAJs5~Lfx>JdeX5W$?Ej&lbnyI~N`V=$AgE2$J)EB!|dM4Fh9$1)9DBgD*s z5~fbe7D|i}OQgwR3-5H&f5o(?(&7+-ODjMAeo^*6T@sWU^}dALr7l4`uy)ZO7c6jp?wv=mJO*HB8(`@L!I6@8qzro(JwtGT=jPF_=bBzN!#waUrZ4s4pkV#uY}(K$Z0Gd6^XJLn)l+5O zG8}6Bl{#5f4V`B{7{;cN?&O((hRO(*PekzGVK{Zo)X&cI<=1bI7ZT?nx|kkm zjlYeW#KaYk7Zmrwd>HSlsx?yqL%(o@@nNxcx*uxd&`-OJh`-iq2M)<1!m#=D-|P7a zU_u=0bDAm08nz-k|%Z!Gt~VI$nJdR9aWLg`*h?U7t@t6AF5m%p75rEahIl4NRn0z}F8g%M zIMsq4Pd$fd@L}fP+0D{AX|M#~ffPuPHim!+oRFx&arVm8{su26+y!jc6A?E=g`9DB zebHM>QIf)2sq@{+2Vm;pHM#I{PN_k_FQ|Kh73MxmtR}R{b8K=1ASM@w!|vqP|Mfu$ z{<_D?n_17N1h5qB>38Guc5RpfwQ84d8u#QZWDfW%ll~XFJ7aBSo;w2vH}p-mx=NX% z0M8!aPYIl1);(-hZda$hk$;Yc+E^k%=2Hp^D%f;-C;K(&p3q0BXhvj4>LOsyEWG!w z&f*2_4KLsbiOsP`!RK@KM31ZOgW*#+wG1{FXyKTc3qS9h;eCAvw(Avln7cF_Rvxr+ zXJHiV8P5(f%h1Qqll+Bv6fAhzC9m%ht@l?%nYQp(f<>J(q4k@&opxwT`VX6ifTjlZs-p`)zm#A6<5uyL*0E~G7sVkt z3zjz8bhx5mk4dT@fT-%r{mPOAvj^9=>#3Lu_8;58?{A5+iby5|3>P1K_^OmI$;O zk66Q{TNq`+t+*TfHYuXYrJ90Dvy|H zxZgtX1c_5RJ@8;%{Xu+6xPJV)5=q4#XMj5OY|nO}?6?K{w2ktv1U6!Mue2(CKyk;- zEZ!aJ$xJ=iVD5|`;41HK|2=7!p{+#q& z<7LDdi2b26G;=PHwF+G!?!OwIvldToG7Os5kQ)lC1I@O#DpZMqB85;9oC1^*3mXm#-BmlI3;swE zg_Of?IX+7DiC;K_w|>Q>jD>3O0V;AK0gEB@ef>jd^yemB;^Uj@;?9rI2(|!S_ERA1$>kSqnONu7yunaz!pFN zJt0FBV?C#(DVFhK{YZ|a+R897ORX3xNT#w9Ivo6&Gwm#sdKdUSHuHVu5dGhWIr%({ zh^_4f#no>cmzRQYf&4LLNsd?LUvICYsag62av|ZpfT`)!TgVR?_OXUg&)Bx-GJ++P zS~jy;IK)EEjB$@Rf?MRtAGpBtJ9{S)Sx36=!&Q^j~=k)F`T1T#yAL~&sm)8Yo+09W_(?>=@%4R@SO z2d1U+GT!JD_VTp#v2 zJ1{H!aO#g2AM64R4T-MuTEAkCN&xPqUWUdhn^1jw%c1W_8LTtb1Y!*KIcR*!FPm{3 z{=aUg2`+YP*dY{k;dU@3L0wF{;Eqv|H>Rz6wWTc_7uU}^-Cu7>9lm`I@L@K)yyPc; z+}3saI@nojO$rWIe2h{${>(CIOXRQ*2mHJiuwspg3-xaXA;4ICz)JHI3p6UvMD22d z*b9n1!O*c_KfhpPoMwS{e0rLNJO~poe|F4rJZ5Taa!T58uzy6Nge^i#^$t6YyOp+5 zAcUB4#7X7*!6s>kAI0{f)k8dLvKk2gi{;m-VgfH zB|bLyqli^C0{F*O7rT9$Z)d#-+azB{7qbIXn*913Tm*Bp_Y~A-GZi zUHH`#{&DQF4@3zf{(@^yvJThVPEZ-XrTg4goKgWqKUF~BX8;}ePDG*OyaZ~MIT6nT zGx6IE`Y#Hf0yO!aHUkwn&hc@#n{F{k1@h8B1huRb)<{NK23)`sq6AbnAJ98vk>+gn zhLk6-p0!Uj(3$|ht?1`5HjJDW8)A7}9n!+#GLO+19uto@l|#dL&b`UJhpws6H;Pz6 zxOwkwg0}^HL$}f7XlLRu1`O%p3>iW^IGMq2V6&^j8?Z_PniD`EGx;Yy{?iq3;n+U DRc_Wx diff --git a/packages/mermaid/src/docs/.vitepress/config.ts b/packages/mermaid/src/docs/.vitepress/config.ts index 707bdf03b..9b5f1547e 100644 --- a/packages/mermaid/src/docs/.vitepress/config.ts +++ b/packages/mermaid/src/docs/.vitepress/config.ts @@ -23,10 +23,13 @@ export default defineConfig({ pattern: 'https://github.com/mermaid-js/mermaid/edit/develop/packages/mermaid/src/docs/:path', text: 'Edit this page on GitHub', }, - sidebar: { '/': sidebarAll(), }, + socialLinks: [ + { icon: 'github', link: 'https://github.com/mermaid-js/mermaid' }, + { icon: 'slack', link: 'https://mermaid-talk.slack.com' }, + ], }, }); @@ -56,14 +59,6 @@ function nav() { text: '💻 Live Editor', link: 'https://mermaid.live', }, - { - text: 'Slack', - link: 'https://mermaid-talk.slack.com', - }, - { - text: 'GitHub', - link: 'https://github.com/mermaid-js/mermaid', - }, ]; } From 72d9e872846cf900ee19144aab853e76620314ee Mon Sep 17 00:00:00 2001 From: sidharthv96 Date: Tue, 20 Dec 2022 05:14:37 +0000 Subject: [PATCH 079/309] Update docs --- docs/syntax/classDiagram.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/syntax/classDiagram.md b/docs/syntax/classDiagram.md index c4fc07732..97032ff56 100644 --- a/docs/syntax/classDiagram.md +++ b/docs/syntax/classDiagram.md @@ -267,7 +267,7 @@ There are eight different types of relations defined for classes under UML which | Type | Description | | ------- | ------------- | | `<\|--` | Inheritance | -| `\*--` | Composition | +| `*--` | Composition | | `o--` | Aggregation | | `-->` | Association | | `--` | Link (Solid) | From 469bdcef2fb938d3d884826cf59329663e6aae96 Mon Sep 17 00:00:00 2001 From: steph Date: Sun, 18 Dec 2022 20:15:29 -0800 Subject: [PATCH 080/309] add support for vitepress blocks --- packages/mermaid/src/docs.mts | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/packages/mermaid/src/docs.mts b/packages/mermaid/src/docs.mts index 313d1f2de..a4ec0d718 100644 --- a/packages/mermaid/src/docs.mts +++ b/packages/mermaid/src/docs.mts @@ -146,9 +146,22 @@ const readSyncedUTF8file = (filename: string): string => { return readFileSync(filename, 'utf8'); }; -const transformToBlockQuote = (content: string, type: string) => { - const title = type === 'warning' ? 'Warning' : 'Note'; - return `> **${title}** \n> ${content.replace(/\n/g, '\n> ')}`; +const blockIcons: Record = { + tip: '💡 ', + danger: '‼️ ', +}; + +const capitalize = (word: string) => word[0].toUpperCase() + word.slice(1); + +const transformToBlockQuote = (content: string, type: string, customTitle?: string | null) => { + if (vitepress) { + const vitepressType = type === 'note' ? 'info' : type; + return `::: ${vitepressType} ${customTitle || ''}\n${content}\n:::`; + } else { + const icon = blockIcons[type] || ''; + const title = `${icon}${customTitle || capitalize(type)}`; + return `> **${title}** \n> ${content.replace(/\n/g, '\n> ')}`; + } }; const injectPlaceholders = (text: string): string => @@ -194,8 +207,8 @@ const transformMarkdown = (file: string) => { } // Transform codeblocks into block quotes. - if (['note', 'tip', 'warning'].includes(c.lang)) { - return [remark.parse(transformToBlockQuote(c.value, c.lang))]; + if (['note', 'tip', 'warning', 'danger'].includes(c.lang)) { + return [remark.parse(transformToBlockQuote(c.value, c.lang, c.meta))]; } return [c]; From 3beb828988e2255c210b0908eb5c70c9a17a511b Mon Sep 17 00:00:00 2001 From: Tom PERRILLAT-COLLOMB Date: Tue, 20 Dec 2022 18:35:03 +0100 Subject: [PATCH 081/309] chore(pr): add task in PR template --- .github/pull_request_template.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 41d9c4cff..3574c3599 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -14,4 +14,5 @@ Make sure you - [ ] :book: have read the [contribution guidelines](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md) - [ ] :computer: have added unit/e2e tests (if appropriate) +- [ ] :notebook: have added documentation (if appropriate) - [ ] :bookmark: targeted `develop` branch From 0f337d654f3f11c7828a2f1105790df619a806f9 Mon Sep 17 00:00:00 2001 From: Steph <35910788+huynhicode@users.noreply.github.com> Date: Tue, 20 Dec 2022 09:37:26 -0800 Subject: [PATCH 082/309] Update packages/mermaid/src/docs/syntax/gantt.md Co-authored-by: Alois Klink --- packages/mermaid/src/docs/syntax/gantt.md | 44 +++++++++++------------ 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/packages/mermaid/src/docs/syntax/gantt.md b/packages/mermaid/src/docs/syntax/gantt.md index 7ddb72734..920869fba 100644 --- a/packages/mermaid/src/docs/syntax/gantt.md +++ b/packages/mermaid/src/docs/syntax/gantt.md @@ -110,29 +110,27 @@ dateFormat YYYY-MM-DD The following formatting options are supported: -```markdown -Input Example Description: - -YYYY 2014 4 digit year -YY 14 2 digit year -Q 1..4 Quarter of year. Sets month to first month in quarter. -M MM 1..12 Month number -MMM MMMM January..Dec Month name in locale set by moment.locale() -D DD 1..31 Day of month -Do 1st..31st Day of month with ordinal -DDD DDDD 1..365 Day of year -X 1410715640.579 Unix timestamp -x 1410715640579 Unix ms timestamp -H HH 0..23 24 hour time -h hh 1..12 12 hour time used with a A. -a A am pm Post or ante meridiem -m mm 0..59 Minutes -s ss 0..59 Seconds -S 0..9 Tenths of a second -SS 0..99 Hundreds of a second -SSS 0..999 Thousandths of a second -Z ZZ +12:00 Offset from UTC as +-HH:mm, +-HHmm, or Z -``` +| Input | Example | Description | +| ---------- | -------------- | ------------------------------------------------------ | +| `YYYY` | 2014 | 4 digit year | +| `YY` | 14 | 2 digit year | +| `Q` | 1..4 | Quarter of year. Sets month to first month in quarter. | +| `M MM` | 1..12 | Month number | +| `MMM MMMM` | January..Dec | Month name in locale set by `moment.locale()` | +| `D DD` | 1..31 | Day of month | +| `Do` | 1st..31st | Day of month with ordinal | +| `DDD DDDD` | 1..365 | Day of year | +| `X` | 1410715640.579 | Unix timestamp | +| `x` | 1410715640579 | Unix ms timestamp | +| `H HH` | 0..23 | 24 hour time | +| `h hh` | 1..12 | 12 hour time used with `a A`. | +| `a A` | am pm | Post or ante meridiem | +| `m mm` | 0..59 | Minutes | +| `s ss` | 0..59 | Seconds | +| `S` | 0..9 | Tenths of a second | +| `SS` | 0..99 | Hundreds of a second | +| `SSS` | 0..999 | Thousandths of a second | +| `Z ZZ` | +12:00 | Offset from UTC as +-HH:mm, +-HHmm, or Z | More info in: https://momentjs.com/docs/#/parsing/string-format/ From b220718b96a432eb343489353e1d9bdb21e40b00 Mon Sep 17 00:00:00 2001 From: Steph <35910788+huynhicode@users.noreply.github.com> Date: Tue, 20 Dec 2022 09:37:42 -0800 Subject: [PATCH 083/309] Update packages/mermaid/src/docs/syntax/gantt.md Co-authored-by: Alois Klink --- packages/mermaid/src/docs/syntax/gantt.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/mermaid/src/docs/syntax/gantt.md b/packages/mermaid/src/docs/syntax/gantt.md index 920869fba..b51b3ab5c 100644 --- a/packages/mermaid/src/docs/syntax/gantt.md +++ b/packages/mermaid/src/docs/syntax/gantt.md @@ -183,8 +183,8 @@ tickInterval 1day The pattern is: -```markdown -/^([1-9][0-9]\*)(minute|hour|day|week|month)$/ +```javascript +/^([1-9][0-9]*)(minute|hour|day|week|month)$/ ``` More info in: [https://github.com/d3/d3-time#interval_every](https://github.com/d3/d3-time#interval_every) From 895c16a79343d94d0a84d6aa2ddd20c1405d90f9 Mon Sep 17 00:00:00 2001 From: Omer Rosenbaum <52040016+Omerr@users.noreply.github.com> Date: Wed, 21 Dec 2022 10:56:09 +0200 Subject: [PATCH 084/309] Add Swimm to the list of integrations --- packages/mermaid/src/docs/misc/integrations.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/mermaid/src/docs/misc/integrations.md b/packages/mermaid/src/docs/misc/integrations.md index 55d0e5b20..e16375872 100644 --- a/packages/mermaid/src/docs/misc/integrations.md +++ b/packages/mermaid/src/docs/misc/integrations.md @@ -15,6 +15,7 @@ They also serve as proof of concept, for the variety of things that can be built - [Azure Devops](https://docs.microsoft.com/en-us/azure/devops/project/wiki/wiki-markdown-guidance?view=azure-devops#add-mermaid-diagrams-to-a-wiki-page) (**Native support**) - [Tuleap](https://docs.tuleap.org/user-guide/writing-in-tuleap.html#graphs) (**Native support**) - [Joplin](https://joplinapp.org) (**Native support**) +- [Swimm](https://swimm.io) (**Native support**) - [Notion](https://notion.so) (**Native support**) - [Observable](https://observablehq.com/@observablehq/mermaid) (**Native support**) - [Obsidian](https://help.obsidian.md/How+to/Format+your+notes#Diagram) (**Native support**) From 22b66193dc774fc71115ae899f834dad3edb1fe9 Mon Sep 17 00:00:00 2001 From: steph Date: Wed, 21 Dec 2022 11:24:48 -0800 Subject: [PATCH 085/309] update outdate format info formatting --- docs/syntax/gantt.md | 100 +++++++++++----------- packages/mermaid/src/docs/syntax/gantt.md | 54 ++++++------ 2 files changed, 76 insertions(+), 78 deletions(-) diff --git a/docs/syntax/gantt.md b/docs/syntax/gantt.md index f54554bd4..5a9729d63 100644 --- a/docs/syntax/gantt.md +++ b/docs/syntax/gantt.md @@ -178,29 +178,27 @@ dateFormat YYYY-MM-DD The following formatting options are supported: -```markdown -Input Example Description: - -YYYY 2014 4 digit year -YY 14 2 digit year -Q 1..4 Quarter of year. Sets month to first month in quarter. -M MM 1..12 Month number -MMM MMMM January..Dec Month name in locale set by moment.locale() -D DD 1..31 Day of month -Do 1st..31st Day of month with ordinal -DDD DDDD 1..365 Day of year -X 1410715640.579 Unix timestamp -x 1410715640579 Unix ms timestamp -H HH 0..23 24 hour time -h hh 1..12 12 hour time used with a A. -a A am pm Post or ante meridiem -m mm 0..59 Minutes -s ss 0..59 Seconds -S 0..9 Tenths of a second -SS 0..99 Hundreds of a second -SSS 0..999 Thousandths of a second -Z ZZ +12:00 Offset from UTC as +-HH:mm, +-HHmm, or Z -``` +| Input | Example | Description | +| ---------- | -------------- | ------------------------------------------------------ | +| `YYYY` | 2014 | 4 digit year | +| `YY` | 14 | 2 digit year | +| `Q` | 1..4 | Quarter of year. Sets month to first month in quarter. | +| `M MM` | 1..12 | Month number | +| `MMM MMMM` | January..Dec | Month name in locale set by `moment.locale()` | +| `D DD` | 1..31 | Day of month | +| `Do` | 1st..31st | Day of month with ordinal | +| `DDD DDDD` | 1..365 | Day of year | +| `X` | 1410715640.579 | Unix timestamp | +| `x` | 1410715640579 | Unix ms timestamp | +| `H HH` | 0..23 | 24 hour time | +| `h hh` | 1..12 | 12 hour time used with `a A`. | +| `a A` | am pm | Post or ante meridiem | +| `m mm` | 0..59 | Minutes | +| `s ss` | 0..59 | Seconds | +| `S` | 0..9 | Tenths of a second | +| `SS` | 0..99 | Hundreds of a second | +| `SSS` | 0..999 | Thousandths of a second | +| `Z ZZ` | +12:00 | Offset from UTC as +-HH:mm, +-HHmm, or Z | More info in: https://momentjs.com/docs/#/parsing/string-format/ @@ -214,32 +212,32 @@ axisFormat %Y-%m-%d The following formatting strings are supported: -```markdown -%a - abbreviated weekday name. -%A - full weekday name. -%b - abbreviated month name. -%B - full month name. -%c - date and time, as "%a %b %e %H:%M:%S %Y". -%d - zero-padded day of the month as a decimal number [01,31]. -%e - space-padded day of the month as a decimal number [ 1,31]; equivalent to %\_d. -%H - hour (24-hour clock) as a decimal number [00,23]. -%I - hour (12-hour clock) as a decimal number [01,12]. -%j - day of the year as a decimal number [001,366]. -%m - month as a decimal number [01,12]. -%M - minute as a decimal number [00,59]. -%L - milliseconds as a decimal number [000, 999]. -%p - either AM or PM. -%S - second as a decimal number [00,61]. -%U - week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. -%w - weekday as a decimal number [0(Sunday),6]. -%W - week number of the year (Monday as the first day of the week) as a decimal number [00,53]. -%x - date, as "%m/%d/%Y". -%X - time, as "%H:%M:%S". -%y - year without century as a decimal number [00,99]. -%Y - year with century as a decimal number. -%Z - time zone offset, such as "-0700". -%% - a literal "%" character. -``` +| Format | Definition | +| ------ | ------------------------------------------------------------------------------------------ | +| %a | abbreviated weekday name | +| %A | full weekday name | +| %b | abbreviated month name | +| %B | full month name | +| %c | date and time, as "%a %b %e %H:%M:%S %Y" | +| %d | zero-padded day of the month as a decimal number \[01,31] | +| %e | space-padded day of the month as a decimal number \[ 1,31]; equivalent to %\_d | +| %H | hour (24-hour clock) as a decimal number \[00,23] | +| %I | hour (12-hour clock) as a decimal number \[01,12] | +| %j | day of the year as a decimal number \[001,366] | +| %m | month as a decimal number \[01,12] | +| %M | minute as a decimal number \[00,59] | +| %L | milliseconds as a decimal number \[000, 999] | +| %p | either AM or PM | +| %S | second as a decimal number \[00,61] | +| %U | week number of the year (Sunday as the first day of the week) as a decimal number \[00,53] | +| %w | weekday as a decimal number \[0(Sunday),6] | +| %W | week number of the year (Monday as the first day of the week) as a decimal number \[00,53] | +| %x | date, as "%m/%d/%Y" | +| %X | time, as "%H:%M:%S" | +| %y | year without century as a decimal number \[00,99] | +| %Y | year with century as a decimal number | +| %Z | time zone offset, such as "-0700" | +| %% | a literal "%" character | More info in: @@ -253,8 +251,8 @@ tickInterval 1day The pattern is: -```markdown -/^([1-9][0-9]\*)(minute|hour|day|week|month)$/ +```javascript +/^([1-9][0-9]*)(minute|hour|day|week|month)$/; ``` More info in: diff --git a/packages/mermaid/src/docs/syntax/gantt.md b/packages/mermaid/src/docs/syntax/gantt.md index b51b3ab5c..0cc915ca1 100644 --- a/packages/mermaid/src/docs/syntax/gantt.md +++ b/packages/mermaid/src/docs/syntax/gantt.md @@ -144,32 +144,32 @@ axisFormat %Y-%m-%d The following formatting strings are supported: -```markdown -%a - abbreviated weekday name. -%A - full weekday name. -%b - abbreviated month name. -%B - full month name. -%c - date and time, as "%a %b %e %H:%M:%S %Y". -%d - zero-padded day of the month as a decimal number [01,31]. -%e - space-padded day of the month as a decimal number [ 1,31]; equivalent to %\_d. -%H - hour (24-hour clock) as a decimal number [00,23]. -%I - hour (12-hour clock) as a decimal number [01,12]. -%j - day of the year as a decimal number [001,366]. -%m - month as a decimal number [01,12]. -%M - minute as a decimal number [00,59]. -%L - milliseconds as a decimal number [000, 999]. -%p - either AM or PM. -%S - second as a decimal number [00,61]. -%U - week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. -%w - weekday as a decimal number [0(Sunday),6]. -%W - week number of the year (Monday as the first day of the week) as a decimal number [00,53]. -%x - date, as "%m/%d/%Y". -%X - time, as "%H:%M:%S". -%y - year without century as a decimal number [00,99]. -%Y - year with century as a decimal number. -%Z - time zone offset, such as "-0700". -%% - a literal "%" character. -``` +| Format | Definition | +| ------ | ----------------------------------------------------------------------------------------- | +| %a | abbreviated weekday name | +| %A | full weekday name | +| %b | abbreviated month name | +| %B | full month name | +| %c | date and time, as "%a %b %e %H:%M:%S %Y" | +| %d | zero-padded day of the month as a decimal number [01,31] | +| %e | space-padded day of the month as a decimal number [ 1,31]; equivalent to %\_d | +| %H | hour (24-hour clock) as a decimal number [00,23] | +| %I | hour (12-hour clock) as a decimal number [01,12] | +| %j | day of the year as a decimal number [001,366] | +| %m | month as a decimal number [01,12] | +| %M | minute as a decimal number [00,59] | +| %L | milliseconds as a decimal number [000, 999] | +| %p | either AM or PM | +| %S | second as a decimal number [00,61] | +| %U | week number of the year (Sunday as the first day of the week) as a decimal number [00,53] | +| %w | weekday as a decimal number [0(Sunday),6] | +| %W | week number of the year (Monday as the first day of the week) as a decimal number [00,53] | +| %x | date, as "%m/%d/%Y" | +| %X | time, as "%H:%M:%S" | +| %y | year without century as a decimal number [00,99] | +| %Y | year with century as a decimal number | +| %Z | time zone offset, such as "-0700" | +| %% | a literal "%" character | More info in: [https://github.com/d3/d3-time-format/tree/v4.0.0#locale_format](https://github.com/d3/d3-time-format/tree/v4.0.0#locale_format) @@ -184,7 +184,7 @@ tickInterval 1day The pattern is: ```javascript -/^([1-9][0-9]*)(minute|hour|day|week|month)$/ +/^([1-9][0-9]*)(minute|hour|day|week|month)$/; ``` More info in: [https://github.com/d3/d3-time#interval_every](https://github.com/d3/d3-time#interval_every) From 69928e3ede028c8e2de0eee531e662c863a6013d Mon Sep 17 00:00:00 2001 From: steph Date: Wed, 21 Dec 2022 14:21:47 -0800 Subject: [PATCH 086/309] retrigger CI From 913ba34386c6dc10e52c212a6a2670860d58c8f3 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Thu, 22 Dec 2022 10:33:41 +0100 Subject: [PATCH 087/309] #815 Adding possibility to configure elk as renderer for flowcharts --- cypress/platform/knsv2.html | 96 +++++++++++++++---- docs/config/setup/modules/defaultConfig.md | 2 +- packages/mermaid-flowchart-v3/src/detector.ts | 11 ++- packages/mermaid/src/defaultConfig.ts | 5 +- .../src/diagrams/flowchart/flowDetector-v2.ts | 9 +- .../src/diagrams/flowchart/flowDetector.ts | 3 + 6 files changed, 99 insertions(+), 27 deletions(-) diff --git a/cypress/platform/knsv2.html b/cypress/platform/knsv2.html index ae9de8fca..84a491dc6 100644 --- a/cypress/platform/knsv2.html +++ b/cypress/platform/knsv2.html @@ -55,8 +55,9 @@
Security check
-
-cyto TB
+    
+%%{init: {"flowchart": {"defaultRenderer": "elk"}} }%%
+flowchart TB
   %% I could not figure out how to use double quotes in labels in Mermaid
   subgraph ibm[IBM Espresso CPU]
     core0[IBM PowerPC Broadway Core 0]
@@ -109,8 +110,65 @@ cyto TB
   rtc{{rtc}}
 
+
-cyto LR
+flowchart TB
+  %% I could not figure out how to use double quotes in labels in Mermaid
+  subgraph ibm[IBM Espresso CPU]
+    core0[IBM PowerPC Broadway Core 0]
+    core1[IBM PowerPC Broadway Core 1]
+    core2[IBM PowerPC Broadway Core 2]
+
+    rom[16 KB ROM]
+
+    core0 --- core2
+
+    rom --> core2
+  end
+
+  subgraph amd[AMD Latte GPU]
+    mem[Memory & I/O Bridge]
+    dram[DRAM Controller]
+    edram[32 MB EDRAM MEM1]
+    rom[512 B SEEPROM]
+
+    sata[SATA IF]
+    exi[EXI]
+
+    subgraph gx[GX]
+      sram[3 MB 1T-SRAM]
+    end
+
+    radeon[AMD Radeon R7xx GX2]
+
+    mem --- gx
+    mem --- radeon
+
+    rom --- mem
+
+    mem --- sata
+    mem --- exi
+
+    dram --- sata
+    dram --- exi
+  end
+
+  ddr3[2 GB DDR3 RAM MEM2]
+
+  mem --- ddr3
+  dram --- ddr3
+  edram --- ddr3
+
+  core1 --- mem
+
+  exi --- rtc
+  rtc{{rtc}}
+
+
+   +
+      flowchart LR
   B1 --be be--x B2
   B1 --bo bo--o B3
   subgraph Ugge
@@ -142,24 +200,19 @@ cyto LR
   B6 --> B5
   
- inside1 --> inside2 & inside3 & inside4 & inside5 & inside6 a(letter a
a) ---> b(letter - b)--> c(letter c) --> d -->e(letter e
e) --> a b <--> d(letter b
d)
-      mindmap
-  root
-    child1((Circle))
-        grandchild 1
-        grandchild 2
-    child2(Round rectangle)
-        grandchild 3
-        grandchild 4
-    child3[Square]
-        grandchild 5
-        ::icon(mdi mdi-fire)
-        gc6((grand
child 6)) - ::icon(mdi mdi-fire) - gc7((grand
grand
child 8)) -
+sequenceDiagram + Customer->>+Stripe: Makes a payment request + Stripe->>+Bank: Forwards the payment request to the bank + Bank->>+Customer: Asks for authorization + Customer->>+Bank: Provides authorization + Bank->>+Stripe: Sends a response with payment details + Stripe->>+Merchant: Sends a notification of payment receipt + Merchant->>+Stripe: Confirms the payment + Stripe->>+Customer: Sends a confirmation of payment + Customer->>+Merchant: Receives goods or services +
       gantt
         title Style today marker (vertical line should be 5px wide and half-transparent blue)
@@ -186,10 +239,11 @@ cyto LR
         // console.error('Mermaid error: ', err);
       };
       mermaid.initialize({
-        theme: 'dark',
+        // theme: 'forest',
         startOnLoad: true,
         logLevel: 0,
         flowchart: {
+          // defaultRenderer: 'elk',
           useMaxWidth: false,
           htmlLabels: true,
         },
diff --git a/docs/config/setup/modules/defaultConfig.md b/docs/config/setup/modules/defaultConfig.md
index 05f6f8a2c..4089ef00d 100644
--- a/docs/config/setup/modules/defaultConfig.md
+++ b/docs/config/setup/modules/defaultConfig.md
@@ -14,7 +14,7 @@
 
 #### Defined in
 
-[defaultConfig.ts:1933](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/defaultConfig.ts#L1933)
+[defaultConfig.ts:1934](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/defaultConfig.ts#L1934)
 
 ---
 
diff --git a/packages/mermaid-flowchart-v3/src/detector.ts b/packages/mermaid-flowchart-v3/src/detector.ts
index fd4f670c4..5ec09114a 100644
--- a/packages/mermaid-flowchart-v3/src/detector.ts
+++ b/packages/mermaid-flowchart-v3/src/detector.ts
@@ -3,11 +3,18 @@ import type { ExternalDiagramDefinition } from 'mermaid';
 const id = 'flowchart-v3';
 
 const detector = (txt: string, config) => {
+  if (config?.flowchart?.defaultRenderer === 'dagre-d3') {
+    return false;
+  }
+  if (config?.flowchart?.defaultRenderer === 'dagre-wrapper') {
+    return false;
+  }
+
   // If we have configured to use dagre-wrapper then we should return true in this function for graph code thus making it use the new flowchart diagram
-  if (config?.flowchart?.defaultRenderer === 'cytoscape' && txt.match(/^\s*graph/) !== null) {
+  if (txt.match(/^\s*graph/) !== null) {
     return true;
   }
-  return txt.match(/^\s*cyto/) !== null;
+  return txt.match(/^\s*flowchart/) !== null;
 };
 
 const loader = async () => {
diff --git a/packages/mermaid/src/defaultConfig.ts b/packages/mermaid/src/defaultConfig.ts
index 37d4f71ff..fb6d88d99 100644
--- a/packages/mermaid/src/defaultConfig.ts
+++ b/packages/mermaid/src/defaultConfig.ts
@@ -247,12 +247,13 @@ const config: Partial = {
     /**
      * | Parameter       | Description | Type    | Required | Values                  |
      * | --------------- | ----------- | ------- | -------- | ----------------------- |
-     * | defaultRenderer | See notes   | boolean | 4        | dagre-d3, dagre-wrapper |
+     * | defaultRenderer | See notes   | boolean | 4        | dagre-d3, dagre-wrapper, elk |
      *
      * **Notes:**
      *
      * Decides which rendering engine that is to be used for the rendering. Legal values are:
-     * dagre-d3 dagre-wrapper - wrapper for dagre implemented in mermaid
+     * dagre-d3 dagre-wrapper - wrapper for dagre implemented in mermaid, elk for layout using
+     * elkjs
      *
      * Default value: 'dagre-wrapper'
      */
diff --git a/packages/mermaid/src/diagrams/flowchart/flowDetector-v2.ts b/packages/mermaid/src/diagrams/flowchart/flowDetector-v2.ts
index c88a63fa6..3916325de 100644
--- a/packages/mermaid/src/diagrams/flowchart/flowDetector-v2.ts
+++ b/packages/mermaid/src/diagrams/flowchart/flowDetector-v2.ts
@@ -1,8 +1,15 @@
 import type { DiagramDetector } from '../../diagram-api/types';
 
 export const flowDetectorV2: DiagramDetector = (txt, config) => {
+  if (config?.flowchart?.defaultRenderer === 'dagre-d3') {
+    return false;
+  }
+  if (config?.flowchart?.defaultRenderer === 'elk') {
+    return false;
+  }
+
   // If we have configured to use dagre-wrapper then we should return true in this function for graph code thus making it use the new flowchart diagram
-  if (config?.flowchart?.defaultRenderer === 'dagre-wrapper' && txt.match(/^\s*graph/) !== null) {
+  if (txt.match(/^\s*graph/) !== null) {
     return true;
   }
   return txt.match(/^\s*flowchart/) !== null;
diff --git a/packages/mermaid/src/diagrams/flowchart/flowDetector.ts b/packages/mermaid/src/diagrams/flowchart/flowDetector.ts
index 02ef63f99..d46b7d8f5 100644
--- a/packages/mermaid/src/diagrams/flowchart/flowDetector.ts
+++ b/packages/mermaid/src/diagrams/flowchart/flowDetector.ts
@@ -6,5 +6,8 @@ export const flowDetector: DiagramDetector = (txt, config) => {
   if (config?.flowchart?.defaultRenderer === 'dagre-wrapper') {
     return false;
   }
+  if (config?.flowchart?.defaultRenderer === 'elk') {
+    return false;
+  }
   return txt.match(/^\s*graph/) !== null;
 };

From 1da20d7aa539e9291928b627d68cdd66960e647d Mon Sep 17 00:00:00 2001
From: Omer Rosenbaum 
Date: Thu, 22 Dec 2022 11:39:21 +0200
Subject: [PATCH 088/309] Added swimm to cSpell

---
 cSpell.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/cSpell.json b/cSpell.json
index 4e9e4945a..49cb8ada1 100644
--- a/cSpell.json
+++ b/cSpell.json
@@ -83,6 +83,7 @@
     "stylis",
     "substate",
     "sveidqvist",
+    "swimm",
     "techn",
     "teststr",
     "textlength",

From d75f70f8085afc98f273dd733a10a24e2963cf5a Mon Sep 17 00:00:00 2001
From: Omer Rosenbaum 
Date: Thu, 22 Dec 2022 11:41:54 +0200
Subject: [PATCH 089/309] Rebuild the docs -> update integrations with swimm

---
 docs/misc/integrations.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/docs/misc/integrations.md b/docs/misc/integrations.md
index 5f4d87792..50f3237cd 100644
--- a/docs/misc/integrations.md
+++ b/docs/misc/integrations.md
@@ -21,6 +21,7 @@ They also serve as proof of concept, for the variety of things that can be built
 - [Azure Devops](https://docs.microsoft.com/en-us/azure/devops/project/wiki/wiki-markdown-guidance?view=azure-devops#add-mermaid-diagrams-to-a-wiki-page) (**Native support**)
 - [Tuleap](https://docs.tuleap.org/user-guide/writing-in-tuleap.html#graphs) (**Native support**)
 - [Joplin](https://joplinapp.org) (**Native support**)
+- [Swimm](https://swimm.io) (**Native support**)
 - [Notion](https://notion.so) (**Native support**)
 - [Observable](https://observablehq.com/@observablehq/mermaid) (**Native support**)
 - [Obsidian](https://help.obsidian.md/How+to/Format+your+notes#Diagram) (**Native support**)

From c535b10534a5e6345e0e458c66e1cfb4ff2ca64e Mon Sep 17 00:00:00 2001
From: Knut Sveidqvist 
Date: Thu, 22 Dec 2022 11:00:30 +0100
Subject: [PATCH 090/309] Adding info in the docs for enabling elk flowcharts.

---
 docs/syntax/flowchart.md                      | 14 +++++++++++++-
 packages/mermaid/src/docs/syntax/flowchart.md | 16 +++++++++++++++-
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/docs/syntax/flowchart.md b/docs/syntax/flowchart.md
index 8b3859f8a..fa410623d 100644
--- a/docs/syntax/flowchart.md
+++ b/docs/syntax/flowchart.md
@@ -990,7 +990,19 @@ flowchart LR
     C -->|Two| E[Result two]
 ```
 
-## Configuration...
+## Configuration
+
+### Renderer
+
+The layout of the flowchart diagram can be don in multiple ways. The default rendering is done using an algorithm called dagre. It is possible to use another algorithm called **elk** for rendering flowcharts which is better for large and more complex diagrams. This is an expermental feature but worth exploring.
+
+This can be enabled using directives by adding this in the diagram code:
+
+    %%{init: {"flowchart": {"defaultRenderer": "elk"}} }%%
+
+Note that the site needs to use mermaid version 9.4+ for this to work and have this featured enabled in the lazy-loading configuration.
+
+### Width
 
 It is possible to adjust the width of the rendered flowchart.
 
diff --git a/packages/mermaid/src/docs/syntax/flowchart.md b/packages/mermaid/src/docs/syntax/flowchart.md
index 7f8284a2f..a66f795b7 100644
--- a/packages/mermaid/src/docs/syntax/flowchart.md
+++ b/packages/mermaid/src/docs/syntax/flowchart.md
@@ -669,7 +669,21 @@ flowchart LR
     C -->|Two| E[Result two]
 ```
 
-## Configuration...
+## Configuration
+
+### Renderer
+
+The layout of the flowchart diagram can be don in multiple ways. The default rendering is done using an algorithm called dagre. It is possible to use another algorithm called **elk** for rendering flowcharts which is better for large and more complex diagrams. This is an expermental feature but worth exploring.
+
+This can be enabled using directives by adding this in the diagram code:
+
+```
+%%{init: {"flowchart": {"defaultRenderer": "elk"}} }%%
+```
+
+Note that the site needs to use mermaid version 9.4+ for this to work and have this featured enabled in the lazy-loading configuration.
+
+### Width
 
 It is possible to adjust the width of the rendered flowchart.
 

From df42f96b5a1900fb1d830e1604128e3605cfc6e2 Mon Sep 17 00:00:00 2001
From: Tom PERRILLAT-COLLOMB 
Date: Thu, 22 Dec 2022 11:17:44 +0100
Subject: [PATCH 091/309] docs(classDiagram): add nested generic type example
 in docs

---
 demos/classchart.html                         |   2 +-
 docs/book/class.png                           | Bin 34954 -> 0 bytes
 docs/book/cover.jpg                           | Bin 17803 -> 0 bytes
 docs/book/er.png                              | Bin 13419 -> 0 bytes
 docs/book/flowchart.png                       | Bin 14794 -> 0 bytes
 docs/book/gantt.png                           | Bin 43239 -> 0 bytes
 docs/book/index.html                          | 340 ------------------
 docs/book/sequence-diagram.png                | Bin 19823 -> 0 bytes
 docs/book/state.png                           | Bin 15574 -> 0 bytes
 docs/syntax/classDiagram.md                   |   4 +-
 .../mermaid/src/docs/syntax/classDiagram.md   |   3 +-
 11 files changed, 6 insertions(+), 343 deletions(-)
 delete mode 100644 docs/book/class.png
 delete mode 100644 docs/book/cover.jpg
 delete mode 100644 docs/book/er.png
 delete mode 100644 docs/book/flowchart.png
 delete mode 100644 docs/book/gantt.png
 delete mode 100644 docs/book/index.html
 delete mode 100644 docs/book/sequence-diagram.png
 delete mode 100644 docs/book/state.png

diff --git a/demos/classchart.html b/demos/classchart.html
index 84cc7bec5..0f564d421 100644
--- a/demos/classchart.html
+++ b/demos/classchart.html
@@ -149,7 +149,7 @@ title: Demo Class Diagram
         -privateProperty : string
         #ProtectedProperty : string
         ~InternalProperty : string
-        ~AnotherInternalProperty : List~MyType~
+        ~AnotherInternalProperty : List~List~string~~
       }
     

diff --git a/docs/book/class.png b/docs/book/class.png deleted file mode 100644 index 5b2f663d86f967ca5d96c5fffca73b6e8efb3ad4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34954 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

y{(-`u^dIjWHRrLfhUK$DDj6 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 QcZx_!PE8grZTjKA0f;sM5dZ)H diff --git a/docs/book/flowchart.png b/docs/book/flowchart.png deleted file mode 100644 index 714626b70e398905987bec0c460308fa7a84471f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14794 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 diff --git a/docs/book/gantt.png b/docs/book/gantt.png deleted file mode 100644 index 95c8d08a14bc4306426530921fd538b404dfc1da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43239 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 - - - - - - The Official Guide to Mermaid.js - - - - - - - - - - - - - - - - -

-
- - - - - - - - - - - - -
-
-
-

- Get up to speed with using Mermaid diagrams along with real-world examples and expert tips - from the authors to facilitate a seamless development workflow -

-
-
-
-
-
-

- Flowcharts is a diagram type that visualizes a process or an algorithm by showing the - steps in order, as well as the different paths the execution can take. -

-
-
- -
-
-
-
- -
-
-
-

- Sequence diagrams lets you model and visualize interactions between different actors - or objects in a system, as well as the order of those interactions -

-
-
-
-
-
-

- A class diagram is a graphical representation that is used to visualize and describe - an object-oriented system. -

-
-
- -
-
-
-
- -
-
-
-

- An entity-relationship diagram is a graphical representation that is used to - visualize the different types of entities that exist within a system. -

-
-
-
-
-
-

- Use State diagrams to model and document state machines, an abstract way of - representing a system or an algorithm. -

-
-
- -
-
-
-
- -
-
-
-

- A Gantt chart is a graphical representation that is used to visualize and describe - tasks (events or activities) over time. -

-
-
-
-
-

- These were a few of the diagrams supported by Mermaid. -

-
- -
-
-

- Book description -

-
-

- Mermaid lets you represent diagrams using text and code which simplifies the maintenance - of complex diagrams. This is a great option for developers as they’re more familiar with - code, rather than special tools for generating diagrams. Besides, diagrams in code - simplify maintenance and ensure that the code is supported by version control systems. - In some cases, Mermaid makes refactoring support for name changes possible while also - enabling team collaboration for review distribution and updates. -

-

- Developers working with any system will be able to put their knowledge to work with this - practical guide to using Mermaid for documentation. The book is also a great reference - for looking up the syntax for specific diagrams when authoring diagrams. -

-

- You’ll start by getting up to speed with the importance of accurate and visual - documentation. Next, the book introduces Mermaid and establishes how to use it to create - effective documentation. By using different tools, editors, or a custom documentation - platform, you’ll also learn how to use Mermaid syntax for various diagrams. Later - chapters cover advanced configuration settings and theme options to manipulate your - diagram as per your needs. -

-

- By the end of this Mermaid book, you’ll have become well-versed with the different types - of Mermaid diagrams and how they can be used in your workflows. -

-
-
-
-
-
-

- What you will learn -

-
-
-
-
-
-
-
    -
  • - Understand good and bad documentation, and the art of effective documentation -
  • -
  • - Become well-versed with maintaining complex diagrams with ease -
  • -
  • - Learn how to set up a custom documentation system -
  • -
  • - Learn how to implement Mermaid diagrams in your workflows -
  • -
  • - Understand how to set up themes for a Mermaid diagram for an entire site -
  • -
  • - Discover how to draw different types of diagrams such as flowcharts, class - diagrams, Gantt charts, and more -
  • -
-
-
-
-
-
- - - - - - - - - - - - - - - - - -
-

- Purchase The Official Guide to Mermaid.js -

-
-
-
-

-

Written by Knut Sveidqvist and Ashish Jain.

-

- Knut is the creator of Mermaid and both authors are active core team members of the - Mermaid open-source project. -

-

- - - -
- - - diff --git a/docs/book/sequence-diagram.png b/docs/book/sequence-diagram.png deleted file mode 100644 index 8c51ac1c5d6601960112784757061943d9d6dc8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19823 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%0D)Muw-s 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 DRc_Wx diff --git a/docs/syntax/classDiagram.md b/docs/syntax/classDiagram.md index c4fc07732..132ef9f3e 100644 --- a/docs/syntax/classDiagram.md +++ b/docs/syntax/classDiagram.md @@ -206,7 +206,7 @@ class BankAccount{ #### Generic Types -Members can be defined using generic types, such as `List`, for fields, parameters, and return types by enclosing the type within `~` (**tilde**). Note: **nested** type declarations such as `List>` are not currently supported. +Members can be defined using generic types, such as `List`, for fields, parameters, and return types by enclosing the type within `~` (**tilde**). **Nested** type declarations such as `List>` are supported. Generics can be represented as part of a class definition and also in the parameters or the return value of a method/function: @@ -222,6 +222,7 @@ class Square~Shape~{ Square : -List~string~ messages Square : +setMessages(List~string~ messages) Square : +getMessages() List~string~ +Square : +getDistanceMatrix() List~List~int~~ ``` ```mermaid @@ -236,6 +237,7 @@ class Square~Shape~{ Square : -List~string~ messages Square : +setMessages(List~string~ messages) Square : +getMessages() List~string~ +Square : +getDistanceMatrix() List~List~int~~ ``` #### Visibility diff --git a/packages/mermaid/src/docs/syntax/classDiagram.md b/packages/mermaid/src/docs/syntax/classDiagram.md index 8cd5796ff..54a5cff23 100644 --- a/packages/mermaid/src/docs/syntax/classDiagram.md +++ b/packages/mermaid/src/docs/syntax/classDiagram.md @@ -123,7 +123,7 @@ class BankAccount{ #### Generic Types -Members can be defined using generic types, such as `List`, for fields, parameters, and return types by enclosing the type within `~` (**tilde**). Note: **nested** type declarations such as `List>` are not currently supported. +Members can be defined using generic types, such as `List`, for fields, parameters, and return types by enclosing the type within `~` (**tilde**). **Nested** type declarations such as `List>` are supported. Generics can be represented as part of a class definition and also in the parameters or the return value of a method/function: @@ -139,6 +139,7 @@ class Square~Shape~{ Square : -List~string~ messages Square : +setMessages(List~string~ messages) Square : +getMessages() List~string~ +Square : +getDistanceMatrix() List~List~int~~ ``` #### Visibility From d8aa44f0c50d93eb2d8c209dbb4121e3f0940fa3 Mon Sep 17 00:00:00 2001 From: nekikara Date: Sat, 24 Dec 2022 20:25:59 +0100 Subject: [PATCH 092/309] fix typos accessing techn property in drawC4Shape function --- cypress/integration/rendering/c4.spec.js | 122 ++++++++++++++++++++ packages/mermaid/src/diagrams/c4/svgDraw.js | 6 +- 2 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 cypress/integration/rendering/c4.spec.js diff --git a/cypress/integration/rendering/c4.spec.js b/cypress/integration/rendering/c4.spec.js new file mode 100644 index 000000000..0cf128ff6 --- /dev/null +++ b/cypress/integration/rendering/c4.spec.js @@ -0,0 +1,122 @@ +import { imgSnapshotTest, renderGraph } from '../../helpers/util.js'; + +describe('C4 diagram', () => { + it('should render a simple C4Context diagram', () => { + imgSnapshotTest( + ` + C4Context + accTitle: C4 context demo + accDescr: Many large C4 diagrams + + title System Context diagram for Internet Banking System + + Enterprise_Boundary(b0, "BankBoundary0") { + Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.") + + System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.") + + Enterprise_Boundary(b1, "BankBoundary") { + System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") + } + } + + BiRel(customerA, SystemAA, "Uses") + Rel(SystemAA, SystemC, "Sends e-mails", "SMTP") + Rel(SystemC, customerA, "Sends e-mails to") + + UpdateElementStyle(customerA, $fontColor="red", $bgColor="grey", $borderColor="red") + UpdateRelStyle(customerA, SystemAA, $textColor="blue", $lineColor="blue", $offsetX="5") + UpdateRelStyle(SystemC, customerA, $textColor="red", $lineColor="red", $offsetX="-50", $offsetY="20") + `, + {} + ); + cy.get('svg'); + }); + it('should render a simple C4Container diagram', () => { + imgSnapshotTest( + ` + C4Container + title Container diagram for Internet Banking System + + System_Ext(email_system, "E-Mail System", "The internal Microsoft Exchange system", $tags="v1.0") + Person(customer, Customer, "A customer of the bank, with personal bank accounts", $tags="v1.0") + + Container_Boundary(c1, "Internet Banking") { + Container(spa, "Single-Page App", "JavaScript, Angular", "Provides all the Internet banking functionality to customers via their web browser") + } + + Rel(customer, spa, "Uses", "HTTPS") + Rel(email_system, customer, "Sends e-mails to") + `, + {} + ); + cy.get('svg'); + }); + it('should render a simple C4Component diagram', () => { + imgSnapshotTest( + ` + C4Component + title Component diagram for Internet Banking System - API Application + + Container(spa, "Single Page Application", "javascript and angular", "Provides all the internet banking functionality to customers via their web browser.") + + Container_Boundary(api, "API Application") { + Component(sign, "Sign In Controller", "MVC Rest Controller", "Allows users to sign in to the internet banking system") + } + + Rel_Back(spa, sign, "Uses", "JSON/HTTPS") + UpdateRelStyle(spa, sign, $offsetY="-40") + `, + {} + ); + cy.get('svg'); + }); + it('should render a simple C4Dynamic diagram', () => { + imgSnapshotTest( + ` + C4Dynamic + title Dynamic diagram for Internet Banking System - API Application + + ContainerDb(c4, "Database", "Relational Database Schema", "Stores user registration information, hashed authentication credentials, access logs, etc.") + Container(c1, "Single-Page Application", "JavaScript and Angular", "Provides all of the Internet banking functionality to customers via their web browser.") + Container_Boundary(b, "API Application") { + Component(c3, "Security Component", "Spring Bean", "Provides functionality Related to signing in, changing passwords, etc.") + Component(c2, "Sign In Controller", "Spring MVC Rest Controller", "Allows users to sign in to the Internet Banking System.") + } + Rel(c1, c2, "Submits credentials to", "JSON/HTTPS") + Rel(c2, c3, "Calls isAuthenticated() on") + Rel(c3, c4, "select * from users where username = ?", "JDBC") + + UpdateRelStyle(c1, c2, $textColor="red", $offsetY="-40") + UpdateRelStyle(c2, c3, $textColor="red", $offsetX="-40", $offsetY="60") + UpdateRelStyle(c3, c4, $textColor="red", $offsetY="-40", $offsetX="10") + `, + {} + ); + cy.get('svg'); + }); + it('should render a simple C4Deployment diagram', () => { + imgSnapshotTest( + ` + C4Deployment + title Deployment Diagram for Internet Banking System - Live + + Deployment_Node(mob, "Customer's mobile device", "Apple IOS or Android"){ + Container(mobile, "Mobile App", "Xamarin", "Provides a limited subset of the Internet Banking functionality to customers via their mobile device.") + } + + Deployment_Node(plc, "Big Bank plc", "Big Bank plc data center"){ + Deployment_Node(dn, "bigbank-api*** x8", "Ubuntu 16.04 LTS"){ + Deployment_Node(apache, "Apache Tomcat", "Apache Tomcat 8.x"){ + Container(api, "API Application", "Java and Spring MVC", "Provides Internet Banking functionality via a JSON/HTTPS API.") + } + } + } + + Rel(mobile, api, "Makes API calls to", "json/HTTPS") + `, + {} + ); + cy.get('svg'); + }); +}); diff --git a/packages/mermaid/src/diagrams/c4/svgDraw.js b/packages/mermaid/src/diagrams/c4/svgDraw.js index d3d66a80d..e34a9d37f 100644 --- a/packages/mermaid/src/diagrams/c4/svgDraw.js +++ b/packages/mermaid/src/diagrams/c4/svgDraw.js @@ -371,12 +371,12 @@ export const drawC4Shape = function (elem, c4Shape, conf) { textFontConf = conf[c4Shape.typeC4Shape.text + 'Font'](); textFontConf.fontColor = fontColor; - if (c4Shape.thchn && c4Shape.thchn.text !== '') { + if (c4Shape.techn && c4Shape.techn?.text !== '') { _drawTextCandidateFunc(conf)( - c4Shape.thchn.text, + c4Shape.techn.text, c4ShapeElem, c4Shape.x, - c4Shape.y + c4Shape.thchn.Y, + c4Shape.y + c4Shape.techn.Y, c4Shape.width, c4Shape.height, { fill: fontColor, 'font-style': 'italic' }, From d8c3f8fc1611c86cdd20c9b7a76f81c83103598b Mon Sep 17 00:00:00 2001 From: steph Date: Mon, 26 Dec 2022 12:04:58 -0800 Subject: [PATCH 093/309] updates to the homepage --- packages/mermaid/src/docs/index.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/mermaid/src/docs/index.md b/packages/mermaid/src/docs/index.md index 6c2763904..28d553dd3 100644 --- a/packages/mermaid/src/docs/index.md +++ b/packages/mermaid/src/docs/index.md @@ -21,13 +21,17 @@ hero: features: - title: ➕ Easy to use! - details: Mermaid allows even non-programmers to easily create detailed and diagrams through the Mermaid Live Editor. + details: Easily create and render detailed diagrams and charts with the Mermaid Live Editor. + link: https://mermaid.live/ - title: 🎥 Video Tutorials! - details: Has video tutorials for beginners and advanced users. - - title: 🏆 Award winner! - details: Mermaid was nominated and won the JS Open Source Awards (2019) in the category "The most exciting use of technology"!!! + details: Curated list of video tutorials and examples created by the community. + link: ../../config/Tutorials.html - title: 🧩 Integrations available! - details: Use Mermaid with your favorite applications, check out the list of Integrations and Usages of Mermaid. + details: Use Mermaid with your favorite applications, check out the integrations list. + link: ../../misc/integrations.md + - title: 🏆 Award winning! + details: 2019 JavaScript Open Source Award winner for "The Most Exciting Use of Technology". + link: https://osawards.com/javascript/2019 --- diff --git a/cypress/platform/ghsa1.html b/cypress/platform/ghsa1.html index 890a8e0dd..59c316eb3 100644 --- a/cypress/platform/ghsa1.html +++ b/cypress/platform/ghsa1.html @@ -21,6 +21,9 @@ const diagram = document.getElementById('diagram'); const svg = mermaid.render('diagram-svg', graph); diagram.innerHTML = svg; + if (window.Cypress) { + window.rendered = true; + } diff --git a/cypress/platform/ghsa2.html b/cypress/platform/ghsa2.html index 6d4dccca3..3ff69158b 100644 --- a/cypress/platform/ghsa2.html +++ b/cypress/platform/ghsa2.html @@ -21,6 +21,9 @@ const diagram = document.getElementById('diagram'); const svg = mermaid.render('diagram-svg', graph); diagram.innerHTML = svg; + if (window.Cypress) { + window.rendered = true; + } diff --git a/cypress/platform/ghsa3.html b/cypress/platform/ghsa3.html index 63dfa0d01..79fa40131 100644 --- a/cypress/platform/ghsa3.html +++ b/cypress/platform/ghsa3.html @@ -94,6 +94,9 @@ // document.querySelector('#diagram').innerHTML = diagram; mermaid.render('diagram', diagram, (res) => { document.querySelector('#res').innerHTML = res; + if (window.Cypress) { + window.rendered = true; + } }); From 01a535b8e02be3796d69504a11feb4c46fc8dffd Mon Sep 17 00:00:00 2001 From: sidharthv96 Date: Mon, 16 Jan 2023 09:52:48 +0000 Subject: [PATCH 133/309] Update docs --- docs/syntax/sequenceDiagram.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/syntax/sequenceDiagram.md b/docs/syntax/sequenceDiagram.md index f4f4486ee..77503b024 100644 --- a/docs/syntax/sequenceDiagram.md +++ b/docs/syntax/sequenceDiagram.md @@ -102,16 +102,16 @@ Messages can be of two displayed either solid or with a dotted line. There are six types of arrows currently supported: -| Type | Description | -| ---- | ------------------------------------------------ | -| -> | Solid line without arrow | -| --> | Dotted line without arrow | -| ->> | Solid line with arrowhead | -| -->> | Dotted line with arrowhead | -| -x | Solid line with a cross at the end | -| --x | Dotted line with a cross at the end. | -| -) | Solid line with an open arrow at the end (async) | -| --) | Dotted line with a open arrow at the end (async) | +| Type | Description | +| ------ | ------------------------------------------------ | +| `->` | Solid line without arrow | +| `-->` | Dotted line without arrow | +| `->>` | Solid line with arrowhead | +| `-->>` | Dotted line with arrowhead | +| `-x` | Solid line with a cross at the end | +| `--x` | Dotted line with a cross at the end. | +| `-)` | Solid line with an open arrow at the end (async) | +| `--)` | Dotted line with a open arrow at the end (async) | ## Activations From 9629c8d8d6a01dfda90fbc8d3eefe4eb8f1a8620 Mon Sep 17 00:00:00 2001 From: Jon Ruskin Date: Tue, 17 Jan 2023 08:31:36 -0700 Subject: [PATCH 134/309] use undefined not null --- packages/mermaid/src/diagrams/sequence/svgDraw.js | 8 ++++++-- packages/mermaid/src/utils.spec.js | 4 ++-- packages/mermaid/src/utils.ts | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/mermaid/src/diagrams/sequence/svgDraw.js b/packages/mermaid/src/diagrams/sequence/svgDraw.js index 495865674..220db2209 100644 --- a/packages/mermaid/src/diagrams/sequence/svgDraw.js +++ b/packages/mermaid/src/diagrams/sequence/svgDraw.js @@ -218,7 +218,11 @@ export const drawText = function (elem, textData) { } } for (let [i, line] of lines.entries()) { - if (textData.textMargin !== undefined && textData.textMargin === 0 && _textFontSize !== null) { + if ( + textData.textMargin !== undefined && + textData.textMargin === 0 && + _textFontSize !== undefined + ) { dy = i * _textFontSize; } @@ -234,7 +238,7 @@ export const drawText = function (elem, textData) { if (textData.fontFamily !== undefined) { textElem.style('font-family', textData.fontFamily); } - if (_textFontSizePx !== null) { + if (_textFontSizePx !== undefined) { textElem.style('font-size', _textFontSizePx); } if (textData.fontWeight !== undefined) { diff --git a/packages/mermaid/src/utils.spec.js b/packages/mermaid/src/utils.spec.js index f8bf613fd..0f0bc1e92 100644 --- a/packages/mermaid/src/utils.spec.js +++ b/packages/mermaid/src/utils.spec.js @@ -421,10 +421,10 @@ describe('when parsing font sizes', function () { }); it('handles undefined input', function () { - expect(utils.parseFontSize(undefined)).toEqual([null, null]); + expect(utils.parseFontSize(undefined)).toEqual([undefined, undefined]); }); it('handles unparseable input', function () { - expect(utils.parseFontSize({ fontSize: 14 })).toEqual([null, null]); + expect(utils.parseFontSize({ fontSize: 14 })).toEqual([undefined, undefined]); }); }); diff --git a/packages/mermaid/src/utils.ts b/packages/mermaid/src/utils.ts index a4ef5f630..876c81543 100644 --- a/packages/mermaid/src/utils.ts +++ b/packages/mermaid/src/utils.ts @@ -962,7 +962,7 @@ export const parseFontSize = (fontSize: string | number | undefined): [number?, const fontSizeNumber = parseInt(fontSize, 10); if (Number.isNaN(fontSizeNumber)) { // if a number value can't be parsed, return null for both values - return [null, null]; + return [undefined, undefined]; } else if (fontSize === String(fontSizeNumber)) { // if a string input doesn't contain any units, assume px units return [fontSizeNumber, fontSize + 'px']; From 96dedc7b5e1cb66a3935789a2eb2bfcea487653a Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 17 Jan 2023 21:37:32 +0530 Subject: [PATCH 135/309] flowchart-elk repro --- cypress/platform/sidv.html | 281 ++++++++++++++++++++++++++++++++++++- 1 file changed, 275 insertions(+), 6 deletions(-) diff --git a/cypress/platform/sidv.html b/cypress/platform/sidv.html index c9bf56b7d..539288464 100644 --- a/cypress/platform/sidv.html +++ b/cypress/platform/sidv.html @@ -1,14 +1,283 @@ + + + + + + + + -
-    none
-    hello world
+    
+%%{init: {"flowchart": {"defaultRenderer": "elk"}} }%%
+graph TB
+      a --> b
+      a --> c
+      b --> d
+      c --> d
     
- - From 549483d19b8f7f38d80944dbdbfd2ad1333f1238 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 17 Jan 2023 22:09:22 +0530 Subject: [PATCH 136/309] Update funding :) --- .github/FUNDING.yml | 4 +++- cSpell.json | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index a3427c2f4..b7e5d38d9 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,6 +1,8 @@ # These are supported funding model platforms -github: [knsv] +github: + - knsv + - sidharthv96 #patreon: # Replace with a single Patreon username #open_collective: # Replace with a single Open Collective username #ko_fi: # Replace with a single Ko-fi username diff --git a/cSpell.json b/cSpell.json index 26550c527..6f93af103 100644 --- a/cSpell.json +++ b/cSpell.json @@ -85,6 +85,7 @@ "setupgraphviewbox", "shiki", "sidharth", + "sidharthv", "sphinxcontrib", "statediagram", "stylis", From afe3f593e1e5bfcc0181b950e1fafee684f53184 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Wed, 18 Jan 2023 00:47:49 +0530 Subject: [PATCH 137/309] fix(#4003): Remove unhandled promises Add eslint rules to check for unhandled promises Fix all existing unhandled promise issues --- .eslintignore | 3 +- .eslintrc.cjs | 150 ++++++++++ .eslintrc.json | 137 --------- cypress/platform/viewer.js | 2 +- package.json | 8 +- packages/mermaid/src/Diagram.ts | 2 +- .../flowchart/elk/flowRenderer-elk.js | 259 ++++++++--------- packages/mermaid/src/docs.mts | 6 +- packages/mermaid/src/mermaid.ts | 19 +- pnpm-lock.yaml | 268 +++++++++++++----- scripts/jison/lint.mts | 6 +- tests/webpack/src/index.js | 6 +- tsconfig.eslint.json | 9 + 13 files changed, 504 insertions(+), 371 deletions(-) create mode 100644 .eslintrc.cjs delete mode 100644 .eslintrc.json create mode 100644 tsconfig.eslint.json diff --git a/.eslintignore b/.eslintignore index e1957aef9..04348c410 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,4 +3,5 @@ dist/** docs/Setup.md cypress.config.js cypress/plugins/index.js -coverage \ No newline at end of file +coverage +*.json \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 000000000..e6f99a8bf --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,150 @@ +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', + ], + rules: { + curly: 'error', + 'no-console': 'error', + 'no-prototype-builtins': 'off', + 'no-unused-vars': 'off', + 'cypress/no-async-tests': 'off', + '@typescript-eslint/no-floating-promises': 'error', + '@typescript-eslint/no-misused-promises': 'error', + '@typescript-eslint/ban-ts-comment': [ + 'error', + { + 'ts-expect-error': 'allow-with-description', + 'ts-ignore': 'allow-with-description', + 'ts-nocheck': 'allow-with-description', + 'ts-check': 'allow-with-description', + minimumDescriptionLength: 10, + }, + ], + 'json/*': ['error', 'allowComments'], + '@cspell/spellchecker': [ + 'error', + { + checkIdentifiers: false, + checkStrings: false, + checkStringTemplates: false, + }, + ], + 'no-empty': [ + 'error', + { + allowEmptyCatch: true, + }, + ], + 'no-only-tests/no-only-tests': 'error', + 'lodash/import-scope': ['error', 'method'], + 'unicorn/better-regex': 'error', + 'unicorn/no-abusive-eslint-disable': 'error', + 'unicorn/no-array-push-push': 'error', + 'unicorn/no-for-loop': 'error', + 'unicorn/no-instanceof-array': 'error', + 'unicorn/no-typeof-undefined': 'error', + 'unicorn/no-unnecessary-await': 'error', + 'unicorn/no-unsafe-regex': 'warn', + 'unicorn/no-useless-promise-resolve-reject': 'error', + 'unicorn/prefer-array-find': 'error', + 'unicorn/prefer-array-flat-map': 'error', + 'unicorn/prefer-array-index-of': 'error', + 'unicorn/prefer-array-some': 'error', + 'unicorn/prefer-default-parameters': 'error', + 'unicorn/prefer-includes': 'error', + 'unicorn/prefer-negative-index': 'error', + 'unicorn/prefer-object-from-entries': 'error', + 'unicorn/prefer-string-starts-ends-with': 'error', + 'unicorn/prefer-string-trim-start-end': 'error', + 'unicorn/string-content': 'error', + 'unicorn/prefer-spread': 'error', + 'unicorn/no-lonely-if': 'error', + }, + overrides: [ + { + files: ['cypress/**', 'demos/**'], + rules: { + 'no-console': 'off', + }, + }, + { + files: ['*.{js,jsx,mjs,cjs}'], + extends: ['plugin:jsdoc/recommended'], + rules: { + 'jsdoc/check-indentation': 'off', + 'jsdoc/check-alignment': 'off', + 'jsdoc/check-line-alignment': 'off', + 'jsdoc/multiline-blocks': 'off', + 'jsdoc/newline-after-description': 'off', + 'jsdoc/tag-lines': 'off', + 'jsdoc/require-param-description': 'off', + 'jsdoc/require-param-type': 'off', + 'jsdoc/require-returns': 'off', + 'jsdoc/require-returns-description': 'off', + }, + }, + { + files: ['*.{ts,tsx}'], + plugins: ['tsdoc'], + rules: { + 'tsdoc/syntax': 'error', + }, + }, + { + files: ['*.spec.{ts,js}', 'cypress/**', 'demos/**', '**/docs/**'], + rules: { + 'jsdoc/require-jsdoc': 'off', + '@typescript-eslint/no-unused-vars': 'off', + }, + }, + { + files: ['*.html', '*.md', '**/*.md/*'], + rules: { + 'no-var': 'error', + 'no-undef': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-floating-promises': 'off', + '@typescript-eslint/no-misused-promises': 'off', + }, + parserOptions: { + project: null, + }, + }, + ], +}; diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 9d7eacecd..000000000 --- a/.eslintrc.json +++ /dev/null @@ -1,137 +0,0 @@ -{ - "env": { - "browser": true, - "es6": true, - "jest/globals": true, - "node": true - }, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaFeatures": { - "experimentalObjectRestSpread": true, - "jsx": true - }, - "sourceType": "module" - }, - "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" - ], - "rules": { - "curly": "error", - "no-console": "error", - "no-prototype-builtins": "off", - "no-unused-vars": "off", - "cypress/no-async-tests": "off", - "@typescript-eslint/ban-ts-comment": [ - "error", - { - "ts-expect-error": "allow-with-description", - "ts-ignore": "allow-with-description", - "ts-nocheck": "allow-with-description", - "ts-check": "allow-with-description", - "minimumDescriptionLength": 10 - } - ], - "json/*": ["error", "allowComments"], - "@cspell/spellchecker": [ - "error", - { - "checkIdentifiers": false, - "checkStrings": false, - "checkStringTemplates": false - } - ], - "no-empty": [ - "error", - { - "allowEmptyCatch": true - } - ], - "no-only-tests/no-only-tests": "error", - "lodash/import-scope": ["error", "method"], - "unicorn/better-regex": "error", - "unicorn/no-abusive-eslint-disable": "error", - "unicorn/no-array-push-push": "error", - "unicorn/no-for-loop": "error", - "unicorn/no-instanceof-array": "error", - "unicorn/no-typeof-undefined": "error", - "unicorn/no-unnecessary-await": "error", - "unicorn/no-unsafe-regex": "warn", - "unicorn/no-useless-promise-resolve-reject": "error", - "unicorn/prefer-array-find": "error", - "unicorn/prefer-array-flat-map": "error", - "unicorn/prefer-array-index-of": "error", - "unicorn/prefer-array-some": "error", - "unicorn/prefer-default-parameters": "error", - "unicorn/prefer-includes": "error", - "unicorn/prefer-negative-index": "error", - "unicorn/prefer-object-from-entries": "error", - "unicorn/prefer-string-starts-ends-with": "error", - "unicorn/prefer-string-trim-start-end": "error", - "unicorn/string-content": "error", - "unicorn/prefer-spread": "error", - "unicorn/no-lonely-if": "error" - }, - "overrides": [ - { - "files": ["cypress/**", "demos/**"], - "rules": { - "no-console": "off" - } - }, - { - "files": ["*.{js,jsx,mjs,cjs}"], - "extends": ["plugin:jsdoc/recommended"], - "rules": { - "jsdoc/check-indentation": "off", - "jsdoc/check-alignment": "off", - "jsdoc/check-line-alignment": "off", - "jsdoc/multiline-blocks": "off", - "jsdoc/newline-after-description": "off", - "jsdoc/tag-lines": "off", - "jsdoc/require-param-description": "off", - "jsdoc/require-param-type": "off", - "jsdoc/require-returns": "off", - "jsdoc/require-returns-description": "off" - } - }, - { - "files": ["*.{ts,tsx}"], - "plugins": ["tsdoc"], - "rules": { - "tsdoc/syntax": "error" - } - }, - { - "files": ["*.spec.{ts,js}", "cypress/**", "demos/**", "**/docs/**"], - "rules": { - "jsdoc/require-jsdoc": "off", - "@typescript-eslint/no-unused-vars": "off" - } - }, - { - "files": ["*.html", "*.md", "**/*.md/*"], - "rules": { - "no-var": "error", - "no-undef": "off", - "@typescript-eslint/no-unused-vars": "off" - } - } - ] -} diff --git a/cypress/platform/viewer.js b/cypress/platform/viewer.js index c10ae73b1..01b49435f 100644 --- a/cypress/platform/viewer.js +++ b/cypress/platform/viewer.js @@ -151,7 +151,7 @@ if (typeof document !== 'undefined') { contentLoadedApi(); } else { this.console.log('Not using api'); - contentLoaded(); + void contentLoaded(); } }, false diff --git a/package.json b/package.json index 620f7dbeb..a9577c52c 100644 --- a/package.json +++ b/package.json @@ -67,8 +67,8 @@ "@types/node": "^18.11.9", "@types/prettier": "^2.7.1", "@types/rollup-plugin-visualizer": "^4.2.1", - "@typescript-eslint/eslint-plugin": "^5.42.1", - "@typescript-eslint/parser": "^5.42.1", + "@typescript-eslint/eslint-plugin": "^5.48.2", + "@typescript-eslint/parser": "^5.48.2", "@vitest/coverage-c8": "^0.27.0", "@vitest/ui": "^0.27.0", "concurrently": "^7.5.0", @@ -76,8 +76,8 @@ "cypress": "^10.11.0", "cypress-image-snapshot": "^4.0.1", "esbuild": "^0.17.0", - "eslint": "^8.27.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^8.32.0", + "eslint-config-prettier": "^8.6.0", "eslint-plugin-cypress": "^2.12.1", "eslint-plugin-html": "^7.1.0", "eslint-plugin-jest": "^27.1.5", diff --git a/packages/mermaid/src/Diagram.ts b/packages/mermaid/src/Diagram.ts index 4072ad14c..ed0762ece 100644 --- a/packages/mermaid/src/Diagram.ts +++ b/packages/mermaid/src/Diagram.ts @@ -6,7 +6,7 @@ import { extractFrontMatter } from './diagram-api/frontmatter'; import { isDetailedError } from './utils'; import type { DetailedError } from './utils'; -export type ParseErrorFunction = (err: string | DetailedError, hash?: any) => void; +export type ParseErrorFunction = (err: string | DetailedError | unknown, hash?: any) => void; export class Diagram { type = 'graph'; diff --git a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js index 36783dbb2..19ca0ccc1 100644 --- a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js +++ b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js @@ -609,7 +609,7 @@ const insertChildren = (nodeArray, parentLookupDb) => { * @param id */ -export const draw = function (text, id, _version, diagObj) { +export const draw = async function (text, id, _version, diagObj) { // Add temporary render element diagObj.db.clear(); nodeDb = {}; @@ -617,149 +617,128 @@ export const draw = function (text, id, _version, diagObj) { // Parse the graph definition diagObj.parser.parse(text); - return new Promise(function (resolve, reject) { - const renderEl = select('body').append('div').attr('style', 'height:400px').attr('id', 'cy'); - // .attr('style', 'display:none') - let graph = { - id: 'root', - layoutOptions: { - 'elk.hierarchyHandling': 'INCLUDE_CHILDREN', - // 'elk.hierarchyHandling': 'SEPARATE_CHILDREN', - 'org.eclipse.elk.padding': '[top=100, left=100, bottom=110, right=110]', - // 'org.eclipse.elk.layered.spacing.nodeNodeBetweenLayers': 120, - // 'elk.layered.spacing.nodeNodeBetweenLayers': '140', - 'elk.layered.spacing.edgeNodeBetweenLayers': '30', - // 'elk.algorithm': 'layered', - 'elk.direction': 'DOWN', - // 'elk.port.side': 'SOUTH', - // 'nodePlacement.strategy': 'SIMPLE', - // 'org.eclipse.elk.spacing.labelLabel': 120, - // 'org.eclipse.elk.graphviz.concentrate': true, - // 'org.eclipse.elk.spacing.nodeNode': 120, - // 'org.eclipse.elk.spacing.edgeEdge': 120, - // 'org.eclipse.elk.spacing.edgeNode': 120, - // 'org.eclipse.elk.spacing.nodeEdge': 120, - // 'org.eclipse.elk.spacing.componentComponent': 120, - }, - children: [], - edges: [], - }; - log.info('Drawing flowchart using v3 renderer'); + const renderEl = select('body').append('div').attr('style', 'height:400px').attr('id', 'cy'); + let graph = { + id: 'root', + layoutOptions: { + 'elk.hierarchyHandling': 'INCLUDE_CHILDREN', + 'org.eclipse.elk.padding': '[top=100, left=100, bottom=110, right=110]', + 'elk.layered.spacing.edgeNodeBetweenLayers': '30', + 'elk.direction': 'DOWN', + }, + children: [], + edges: [], + }; + log.info('Drawing flowchart using v3 renderer'); - // Set the direction, - // Fetch the default direction, use TD if none was found - let dir = diagObj.db.getDirection(); - switch (dir) { - case 'BT': - graph.layoutOptions['elk.direction'] = 'UP'; - break; - case 'TB': - graph.layoutOptions['elk.direction'] = 'DOWN'; - break; - case 'LR': - graph.layoutOptions['elk.direction'] = 'RIGHT'; - break; - case 'RL': - graph.layoutOptions['elk.direction'] = 'LEFT'; - break; + // Set the direction, + // Fetch the default direction, use TD if none was found + let dir = diagObj.db.getDirection(); + switch (dir) { + case 'BT': + graph.layoutOptions['elk.direction'] = 'UP'; + break; + case 'TB': + graph.layoutOptions['elk.direction'] = 'DOWN'; + break; + case 'LR': + graph.layoutOptions['elk.direction'] = 'RIGHT'; + break; + case 'RL': + graph.layoutOptions['elk.direction'] = 'LEFT'; + break; + } + const { securityLevel, flowchart: conf } = getConfig(); + + // Find the root dom node to ne used in rendering + // Handle root and document for when rendering in sandbox mode + let sandboxElement; + if (securityLevel === 'sandbox') { + sandboxElement = select('#i' + id); + } + const root = + securityLevel === 'sandbox' + ? select(sandboxElement.nodes()[0].contentDocument.body) + : select('body'); + const doc = securityLevel === 'sandbox' ? sandboxElement.nodes()[0].contentDocument : document; + + const svg = root.select(`[id="${id}"]`); + + // Define the supported markers for the diagram + const markers = ['point', 'circle', 'cross']; + + // Add the marker definitions to the svg as marker tags + insertMarkers(svg, markers, diagObj.type, diagObj.arrowMarkerAbsolute); + + // Fetch the vertices/nodes and edges/links from the parsed graph definition + const vert = diagObj.db.getVertices(); + + // Setup nodes from the subgraphs with type group, these will be used + // as nodes with children in the subgraph + let subG; + const subGraphs = diagObj.db.getSubGraphs(); + log.info('Subgraphs - ', subGraphs); + for (let i = subGraphs.length - 1; i >= 0; i--) { + subG = subGraphs[i]; + diagObj.db.addVertex(subG.id, subG.title, 'group', undefined, subG.classes, subG.dir); + } + + // Add an element in the svg to be used to hold the subgraphs container + // elements + const subGraphsEl = svg.insert('g').attr('class', 'subgraphs'); + + // Create the lookup db for the subgraphs and their children to used when creating + // the tree structured graph + const parentLookupDb = addSubGraphs(diagObj.db); + + // Add the nodes to the graph, this will entail creating the actual nodes + // in order to get the size of the node. You can't get the size of a node + // that is not in the dom so we need to add it to the dom, get the size + // we will position the nodes when we get the layout from elkjs + graph = addVertices(vert, id, root, doc, diagObj, parentLookupDb, graph); + + // Time for the edges, we start with adding an element in the node to hold the edges + const edgesEl = svg.insert('g').attr('class', 'edges edgePath'); + // Fetch the edges form the parsed graph definition + const edges = diagObj.db.getEdges(); + + // Add the edges to the graph, this will entail creating the actual edges + graph = addEdges(edges, diagObj, graph, svg); + + // Iterate through all nodes and add the top level nodes to the graph + const nodes = Object.keys(nodeDb); + nodes.forEach((nodeId) => { + const node = nodeDb[nodeId]; + if (!node.parent) { + graph.children.push(node); } - const { securityLevel, flowchart: conf } = getConfig(); - - // Find the root dom node to ne used in rendering - // Handle root and document for when rendering in sandbox mode - let sandboxElement; - if (securityLevel === 'sandbox') { - sandboxElement = select('#i' + id); - } - const root = - securityLevel === 'sandbox' - ? select(sandboxElement.nodes()[0].contentDocument.body) - : select('body'); - const doc = securityLevel === 'sandbox' ? sandboxElement.nodes()[0].contentDocument : document; - - const svg = root.select(`[id="${id}"]`); - - // Define the supported markers for the diagram - const markers = ['point', 'circle', 'cross']; - - // Add the marker definitions to the svg as marker tags - insertMarkers(svg, markers, diagObj.type, diagObj.arrowMarkerAbsolute); - - // Fetch the vertices/nodes and edges/links from the parsed graph definition - const vert = diagObj.db.getVertices(); - - // Setup nodes from the subgraphs with type group, these will be used - // as nodes with children in the subgraph - let subG; - const subGraphs = diagObj.db.getSubGraphs(); - log.info('Subgraphs - ', subGraphs); - for (let i = subGraphs.length - 1; i >= 0; i--) { - subG = subGraphs[i]; - diagObj.db.addVertex(subG.id, subG.title, 'group', undefined, subG.classes, subG.dir); - } - - // Add an element in the svg to be used to hold the subgraphs container - // elements - const subGraphsEl = svg.insert('g').attr('class', 'subgraphs'); - - // Create the lookup db for the subgraphs and their children to used when creating - // the tree structured graph - const parentLookupDb = addSubGraphs(diagObj.db); - - // Add the nodes to the graph, this will entail creating the actual nodes - // in order to get the size of the node. You can't get the size of a node - // that is not in the dom so we need to add it to the dom, get the size - // we will position the nodes when we get the layout from elkjs - graph = addVertices(vert, id, root, doc, diagObj, parentLookupDb, graph); - - // Time for the edges, we start with adding an element in the node to hold the edges - const edgesEl = svg.insert('g').attr('class', 'edges edgePath'); - // Fetch the edges form the parsed graph definition - const edges = diagObj.db.getEdges(); - - // Add the edges to the graph, this will entail creating the actual edges - graph = addEdges(edges, diagObj, graph, svg); - - // Iterate through all nodes and add the top level nodes to the graph - const nodes = Object.keys(nodeDb); - nodes.forEach((nodeId) => { - const node = nodeDb[nodeId]; - if (!node.parent) { - graph.children.push(node); - } - // node.nodePadding = [120, 50, 50, 50]; - // node['org.eclipse.elk.spacing.nodeNode'] = 120; - // Subgraph - if (parentLookupDb.childrenById[nodeId] !== undefined) { - node.labels = [ - { - text: node.labelText, - layoutOptions: { - 'nodeLabels.placement': '[H_CENTER, V_TOP, INSIDE]', - }, - width: node.labelData.width, - height: node.labelData.height, + // Subgraph + if (parentLookupDb.childrenById[nodeId] !== undefined) { + node.labels = [ + { + text: node.labelText, + layoutOptions: { + 'nodeLabels.placement': '[H_CENTER, V_TOP, INSIDE]', }, - ]; - delete node.x; - delete node.y; - delete node.width; - delete node.height; - } - }); - insertChildren(graph.children, parentLookupDb); - elk.layout(graph).then(function (g) { - drawNodes(0, 0, g.children, svg, subGraphsEl, diagObj, 0); - - g.edges.map((edge, id) => { - insertEdge(edgesEl, edge, edge.edgeData, diagObj, parentLookupDb); - }); - setupGraphViewbox({}, svg, conf.diagramPadding, conf.useMaxWidth); - resolve(); - }); - // Remove element after layout - renderEl.remove(); + width: node.labelData.width, + height: node.labelData.height, + }, + ]; + delete node.x; + delete node.y; + delete node.width; + delete node.height; + } }); + insertChildren(graph.children, parentLookupDb); + const g = await elk.layout(graph); + drawNodes(0, 0, g.children, svg, subGraphsEl, diagObj, 0); + g.edges?.map((edge) => { + insertEdge(edgesEl, edge, edge.edgeData, diagObj, parentLookupDb); + }); + setupGraphViewbox({}, svg, conf.diagramPadding, conf.useMaxWidth); + // Remove element after layout + renderEl.remove(); }; const drawNodes = (relX, relY, nodeArray, svg, subgraphsEl, diagObj, depth) => { diff --git a/packages/mermaid/src/docs.mts b/packages/mermaid/src/docs.mts index 99da3f381..33649ce6d 100644 --- a/packages/mermaid/src/docs.mts +++ b/packages/mermaid/src/docs.mts @@ -331,7 +331,7 @@ const getFilesFromGlobs = async (globs: string[]): Promise => { }; /** Main method (entry point) */ -(async () => { +const main = async () => { if (verifyOnly) { console.log('Verifying that all files are in sync with the source files'); } @@ -400,4 +400,6 @@ const getFilesFromGlobs = async (globs: string[]): Promise => { } }); } -})(); +}; + +void main(); diff --git a/packages/mermaid/src/mermaid.ts b/packages/mermaid/src/mermaid.ts index 3c09d2c92..b859a6a84 100644 --- a/packages/mermaid/src/mermaid.ts +++ b/packages/mermaid/src/mermaid.ts @@ -17,7 +17,6 @@ import { ExternalDiagramDefinition } from './diagram-api/types'; export type { MermaidConfig, DetailedError, ExternalDiagramDefinition, ParseErrorFunction }; -let externalDiagramsRegistered = false; /** * ## init * @@ -51,12 +50,7 @@ const init = async function ( callback?: Function ) { try { - // Not really sure if we need to check this, or simply call initThrowsErrorsAsync directly. - if (externalDiagramsRegistered) { - await initThrowsErrorsAsync(config, nodes, callback); - } else { - initThrowsErrors(config, nodes, callback); - } + await initThrowsErrorsAsync(config, nodes, callback); } catch (e) { log.warn('Syntax Error rendering'); if (isDetailedError(e)) { @@ -68,8 +62,7 @@ const init = async function ( } }; -// eslint-disable-next-line @typescript-eslint/ban-types -const handleError = (error: unknown, errors: DetailedError[], parseError?: Function) => { +const handleError = (error: unknown, errors: DetailedError[], parseError?: ParseErrorFunction) => { log.warn(error); if (isDetailedError(error)) { // handle case where error string and hash were @@ -225,7 +218,6 @@ const loadExternalDiagrams = async (...diagrams: ExternalDiagramDefinition[]) => */ const initThrowsErrorsAsync = async function ( config?: MermaidConfig, - // eslint-disable-next-line no-undef nodes?: string | HTMLElement | NodeListOf, // eslint-disable-next-line @typescript-eslint/ban-types callback?: Function @@ -336,7 +328,6 @@ const registerExternalDiagrams = async ( } else { await loadExternalDiagrams(...diagrams); } - externalDiagramsRegistered = true; }; /** @@ -348,7 +339,7 @@ const contentLoaded = function () { if (mermaid.startOnLoad) { const { startOnLoad } = mermaidAPI.getConfig(); if (startOnLoad) { - mermaid.init(); + void mermaid.init(); } } }; @@ -427,7 +418,7 @@ const parseAsync = (txt: string): Promise => { ); }); executionQueue.push(performCall); - executeQueue(); + void executeQueue(); }); }; @@ -460,7 +451,7 @@ const renderAsync = ( ); }); executionQueue.push(performCall); - executeQueue(); + void executeQueue(); }); }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dfc788597..53017ba5b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,11 +44,11 @@ importers: specifier: ^4.2.1 version: 4.2.1 '@typescript-eslint/eslint-plugin': - specifier: ^5.42.1 - version: 5.42.1_2udltptbznfmezdozpdoa2aemq + specifier: ^5.48.2 + version: 5.48.2_iljmjqxcygjq3saipl7gerxpvi '@typescript-eslint/parser': - specifier: ^5.42.1 - version: 5.42.1_rmayb2veg2btbq6mbmnyivgasy + specifier: ^5.48.2 + version: 5.48.2_yygwinqv3a2io74xmwofqb7uka '@vitest/coverage-c8': specifier: ^0.27.0 version: 0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce @@ -71,32 +71,32 @@ importers: specifier: ^0.17.0 version: 0.17.0 eslint: - specifier: ^8.27.0 - version: 8.27.0 + specifier: ^8.32.0 + version: 8.32.0 eslint-config-prettier: - specifier: ^8.5.0 - version: 8.5.0_eslint@8.27.0 + specifier: ^8.6.0 + version: 8.6.0_eslint@8.32.0 eslint-plugin-cypress: specifier: ^2.12.1 - version: 2.12.1_eslint@8.27.0 + version: 2.12.1_eslint@8.32.0 eslint-plugin-html: specifier: ^7.1.0 version: 7.1.0 eslint-plugin-jest: specifier: ^27.1.5 - version: 27.1.5_kdswgjmqcx7mthqz7ow2zlfevy + version: 27.1.5_5rcd23qw3h5vuffwo2owxb3hw4 eslint-plugin-jsdoc: specifier: ^39.6.2 - version: 39.6.2_eslint@8.27.0 + version: 39.6.2_eslint@8.32.0 eslint-plugin-json: specifier: ^3.1.0 version: 3.1.0 eslint-plugin-lodash: specifier: ^7.4.0 - version: 7.4.0_eslint@8.27.0 + version: 7.4.0_eslint@8.32.0 eslint-plugin-markdown: specifier: ^3.0.0 - version: 3.0.0_eslint@8.27.0 + version: 3.0.0_eslint@8.32.0 eslint-plugin-no-only-tests: specifier: ^3.1.0 version: 3.1.0 @@ -105,7 +105,7 @@ importers: version: 0.2.17 eslint-plugin-unicorn: specifier: ^45.0.0 - version: 45.0.0_eslint@8.27.0 + version: 45.0.0_eslint@8.32.0 express: specifier: ^4.18.2 version: 4.18.2 @@ -229,10 +229,10 @@ importers: version: 8.3.4 '@typescript-eslint/eslint-plugin': specifier: ^5.42.1 - version: 5.42.1_2udltptbznfmezdozpdoa2aemq + version: 5.42.1_qxgr6oy2qtsmmpo3f6iejuryuq '@typescript-eslint/parser': specifier: ^5.42.1 - version: 5.42.1_rmayb2veg2btbq6mbmnyivgasy + version: 5.42.1_yygwinqv3a2io74xmwofqb7uka chokidar: specifier: ^3.5.3 version: 3.5.3 @@ -336,6 +336,9 @@ importers: specifier: ^2.0.2 version: 2.0.2 devDependencies: + '@types/cytoscape': + specifier: ^3.19.9 + version: 3.19.9 concurrently: specifier: ^7.5.0 version: 7.5.0 @@ -2144,14 +2147,14 @@ packages: dev: true optional: true - /@eslint/eslintrc/1.3.3: - resolution: {integrity: sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==} + /@eslint/eslintrc/1.4.1: + resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 espree: 9.4.0 - globals: 13.17.0 + globals: 13.19.0 ignore: 5.2.0 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -2171,8 +2174,8 @@ packages: '@hapi/hoek': 9.3.0 dev: true - /@humanwhocodes/config-array/0.11.7: - resolution: {integrity: sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==} + /@humanwhocodes/config-array/0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -2656,6 +2659,10 @@ packages: '@types/node': 18.11.9 dev: true + /@types/cytoscape/3.19.9: + resolution: {integrity: sha512-oqCx0ZGiBO0UESbjgq052vjDAy2X53lZpMrWqiweMpvVwKw/2IiYDdzPFK6+f4tMfdv9YKEM9raO5bAZc3UYBg==} + dev: true + /@types/d3-array/3.0.3: resolution: {integrity: sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==} dev: true @@ -3136,7 +3143,7 @@ packages: dev: true optional: true - /@typescript-eslint/eslint-plugin/5.42.1_2udltptbznfmezdozpdoa2aemq: + /@typescript-eslint/eslint-plugin/5.42.1_qxgr6oy2qtsmmpo3f6iejuryuq: resolution: {integrity: sha512-LyR6x784JCiJ1j6sH5Y0K6cdExqCCm8DJUTcwG5ThNXJj/G8o5E56u5EdG4SLy+bZAwZBswC+GYn3eGdttBVCg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3147,12 +3154,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.42.1_rmayb2veg2btbq6mbmnyivgasy + '@typescript-eslint/parser': 5.42.1_yygwinqv3a2io74xmwofqb7uka '@typescript-eslint/scope-manager': 5.42.1 - '@typescript-eslint/type-utils': 5.42.1_rmayb2veg2btbq6mbmnyivgasy - '@typescript-eslint/utils': 5.42.1_rmayb2veg2btbq6mbmnyivgasy + '@typescript-eslint/type-utils': 5.42.1_yygwinqv3a2io74xmwofqb7uka + '@typescript-eslint/utils': 5.42.1_yygwinqv3a2io74xmwofqb7uka debug: 4.3.4 - eslint: 8.27.0 + eslint: 8.32.0 ignore: 5.2.0 natural-compare-lite: 1.4.0 regexpp: 3.2.0 @@ -3163,7 +3170,34 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.42.1_rmayb2veg2btbq6mbmnyivgasy: + /@typescript-eslint/eslint-plugin/5.48.2_iljmjqxcygjq3saipl7gerxpvi: + resolution: {integrity: sha512-sR0Gja9Ky1teIq4qJOl0nC+Tk64/uYdX+mi+5iB//MH8gwyx8e3SOyhEzeLZEFEEfCaLf8KJq+Bd/6je1t+CAg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/parser': 5.48.2_yygwinqv3a2io74xmwofqb7uka + '@typescript-eslint/scope-manager': 5.48.2 + '@typescript-eslint/type-utils': 5.48.2_yygwinqv3a2io74xmwofqb7uka + '@typescript-eslint/utils': 5.48.2_yygwinqv3a2io74xmwofqb7uka + debug: 4.3.4 + eslint: 8.32.0 + ignore: 5.2.0 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.8.4 + typescript: 4.8.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser/5.42.1_yygwinqv3a2io74xmwofqb7uka: resolution: {integrity: sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3177,7 +3211,27 @@ packages: '@typescript-eslint/types': 5.42.1 '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4 debug: 4.3.4 - eslint: 8.27.0 + eslint: 8.32.0 + typescript: 4.8.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser/5.48.2_yygwinqv3a2io74xmwofqb7uka: + resolution: {integrity: sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.48.2 + '@typescript-eslint/types': 5.48.2 + '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.8.4 + debug: 4.3.4 + eslint: 8.32.0 typescript: 4.8.4 transitivePeerDependencies: - supports-color @@ -3191,7 +3245,15 @@ packages: '@typescript-eslint/visitor-keys': 5.42.1 dev: true - /@typescript-eslint/type-utils/5.42.1_rmayb2veg2btbq6mbmnyivgasy: + /@typescript-eslint/scope-manager/5.48.2: + resolution: {integrity: sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.48.2 + '@typescript-eslint/visitor-keys': 5.48.2 + dev: true + + /@typescript-eslint/type-utils/5.42.1_yygwinqv3a2io74xmwofqb7uka: resolution: {integrity: sha512-WWiMChneex5w4xPIX56SSnQQo0tEOy5ZV2dqmj8Z371LJ0E+aymWD25JQ/l4FOuuX+Q49A7pzh/CGIQflxMVXg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3202,9 +3264,29 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4 - '@typescript-eslint/utils': 5.42.1_rmayb2veg2btbq6mbmnyivgasy + '@typescript-eslint/utils': 5.42.1_yygwinqv3a2io74xmwofqb7uka debug: 4.3.4 - eslint: 8.27.0 + eslint: 8.32.0 + tsutils: 3.21.0_typescript@4.8.4 + typescript: 4.8.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/type-utils/5.48.2_yygwinqv3a2io74xmwofqb7uka: + resolution: {integrity: sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.8.4 + '@typescript-eslint/utils': 5.48.2_yygwinqv3a2io74xmwofqb7uka + debug: 4.3.4 + eslint: 8.32.0 tsutils: 3.21.0_typescript@4.8.4 typescript: 4.8.4 transitivePeerDependencies: @@ -3216,6 +3298,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@typescript-eslint/types/5.48.2: + resolution: {integrity: sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@typescript-eslint/typescript-estree/5.42.1_typescript@4.8.4: resolution: {integrity: sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3237,7 +3324,28 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.42.1_rmayb2veg2btbq6mbmnyivgasy: + /@typescript-eslint/typescript-estree/5.48.2_typescript@4.8.4: + resolution: {integrity: sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.48.2 + '@typescript-eslint/visitor-keys': 5.48.2 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.8.4 + typescript: 4.8.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils/5.42.1_yygwinqv3a2io74xmwofqb7uka: resolution: {integrity: sha512-Gxvf12xSp3iYZd/fLqiQRD4uKZjDNR01bQ+j8zvhPjpsZ4HmvEFL/tC4amGNyxN9Rq+iqvpHLhlqx6KTxz9ZyQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3248,9 +3356,29 @@ packages: '@typescript-eslint/scope-manager': 5.42.1 '@typescript-eslint/types': 5.42.1 '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4 - eslint: 8.27.0 + eslint: 8.32.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.27.0 + eslint-utils: 3.0.0_eslint@8.32.0 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils/5.48.2_yygwinqv3a2io74xmwofqb7uka: + resolution: {integrity: sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.11 + '@types/semver': 7.3.12 + '@typescript-eslint/scope-manager': 5.48.2 + '@typescript-eslint/types': 5.48.2 + '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.8.4 + eslint: 8.32.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.32.0 semver: 7.3.8 transitivePeerDependencies: - supports-color @@ -3265,6 +3393,14 @@ packages: eslint-visitor-keys: 3.3.0 dev: true + /@typescript-eslint/visitor-keys/5.48.2: + resolution: {integrity: sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.48.2 + eslint-visitor-keys: 3.3.0 + dev: true + /@vitejs/plugin-vue/4.0.0_vite@4.0.1+vue@3.2.45: resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -3661,12 +3797,12 @@ packages: acorn: 8.8.0 dev: true - /acorn-jsx/5.3.2_acorn@8.8.0: + /acorn-jsx/5.3.2_acorn@8.8.1: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.0 + acorn: 8.8.1 dev: true /acorn-walk/7.2.0: @@ -6168,21 +6304,21 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier/8.5.0_eslint@8.27.0: - resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + /eslint-config-prettier/8.6.0_eslint@8.32.0: + resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.27.0 + eslint: 8.32.0 dev: true - /eslint-plugin-cypress/2.12.1_eslint@8.27.0: + /eslint-plugin-cypress/2.12.1_eslint@8.32.0: resolution: {integrity: sha512-c2W/uPADl5kospNDihgiLc7n87t5XhUbFDoTl6CfVkmG+kDAb5Ux10V9PoLPu9N+r7znpc+iQlcmAqT1A/89HA==} peerDependencies: eslint: '>= 3.2.1' dependencies: - eslint: 8.27.0 + eslint: 8.32.0 globals: 11.12.0 dev: true @@ -6192,7 +6328,7 @@ packages: htmlparser2: 8.0.1 dev: true - /eslint-plugin-jest/27.1.5_kdswgjmqcx7mthqz7ow2zlfevy: + /eslint-plugin-jest/27.1.5_5rcd23qw3h5vuffwo2owxb3hw4: resolution: {integrity: sha512-CK2dekZ5VBdzsOSOH5Fc1rwC+cWXjkcyrmf1RV714nDUDKu+o73TTJiDxpbILG8PtPPpAAl3ywzh5QA7Ft0mjA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -6205,16 +6341,16 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.42.1_2udltptbznfmezdozpdoa2aemq - '@typescript-eslint/utils': 5.42.1_rmayb2veg2btbq6mbmnyivgasy - eslint: 8.27.0 + '@typescript-eslint/eslint-plugin': 5.48.2_iljmjqxcygjq3saipl7gerxpvi + '@typescript-eslint/utils': 5.42.1_yygwinqv3a2io74xmwofqb7uka + eslint: 8.32.0 jest: 29.3.1_odkjkoia5xunhxkdrka32ib6vi transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-jsdoc/39.6.2_eslint@8.27.0: + /eslint-plugin-jsdoc/39.6.2_eslint@8.32.0: resolution: {integrity: sha512-dvgY/W7eUFoAIIiaWHERIMI61ZWqcz9YFjEeyTzdPlrZc3TY/3aZm5aB91NUoTLWYZmO/vFlYSuQi15tF7uE5A==} engines: {node: ^14 || ^16 || ^17 || ^18 || ^19} peerDependencies: @@ -6224,7 +6360,7 @@ packages: comment-parser: 1.3.1 debug: 4.3.4 escape-string-regexp: 4.0.0 - eslint: 8.27.0 + eslint: 8.32.0 esquery: 1.4.0 semver: 7.3.8 spdx-expression-parse: 3.0.1 @@ -6240,23 +6376,23 @@ packages: vscode-json-languageservice: 4.2.1 dev: true - /eslint-plugin-lodash/7.4.0_eslint@8.27.0: + /eslint-plugin-lodash/7.4.0_eslint@8.32.0: resolution: {integrity: sha512-Tl83UwVXqe1OVeBRKUeWcfg6/pCW1GTRObbdnbEJgYwjxp5Q92MEWQaH9+dmzbRt6kvYU1Mp893E79nJiCSM8A==} engines: {node: '>=10'} peerDependencies: eslint: '>=2' dependencies: - eslint: 8.27.0 + eslint: 8.32.0 lodash: 4.17.21 dev: true - /eslint-plugin-markdown/3.0.0_eslint@8.27.0: + /eslint-plugin-markdown/3.0.0_eslint@8.32.0: resolution: {integrity: sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.27.0 + eslint: 8.32.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color @@ -6274,7 +6410,7 @@ packages: '@microsoft/tsdoc-config': 0.16.2 dev: true - /eslint-plugin-unicorn/45.0.0_eslint@8.27.0: + /eslint-plugin-unicorn/45.0.0_eslint@8.32.0: resolution: {integrity: sha512-iP8cMRxXKHonKioOhnCoCcqVhoqhAp6rB+nsoLjXFDxTHz3btWMAp8xwzjHA0B1K6YV/U/Yvqn1bUXZt8sJPuQ==} engines: {node: '>=14.18'} peerDependencies: @@ -6283,8 +6419,8 @@ packages: '@babel/helper-validator-identifier': 7.19.1 ci-info: 3.6.2 clean-regexp: 1.0.0 - eslint: 8.27.0 - eslint-utils: 3.0.0_eslint@8.27.0 + eslint: 8.32.0 + eslint-utils: 3.0.0_eslint@8.32.0 esquery: 1.4.0 indent-string: 4.0.0 is-builtin-module: 3.2.0 @@ -6315,13 +6451,13 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.27.0: + /eslint-utils/3.0.0_eslint@8.32.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.27.0 + eslint: 8.32.0 eslint-visitor-keys: 2.1.0 dev: true @@ -6335,13 +6471,13 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.27.0: - resolution: {integrity: sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==} + /eslint/8.32.0: + resolution: {integrity: sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.3.3 - '@humanwhocodes/config-array': 0.11.7 + '@eslint/eslintrc': 1.4.1 + '@humanwhocodes/config-array': 0.11.8 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 @@ -6351,7 +6487,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.27.0 + eslint-utils: 3.0.0_eslint@8.32.0 eslint-visitor-keys: 3.3.0 espree: 9.4.0 esquery: 1.4.0 @@ -6360,7 +6496,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.17.0 + globals: 13.19.0 grapheme-splitter: 1.0.4 ignore: 5.2.0 import-fresh: 3.3.0 @@ -6387,8 +6523,8 @@ packages: resolution: {integrity: sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.0 - acorn-jsx: 5.3.2_acorn@8.8.0 + acorn: 8.8.1 + acorn-jsx: 5.3.2_acorn@8.8.1 eslint-visitor-keys: 3.3.0 dev: true @@ -7050,8 +7186,8 @@ packages: engines: {node: '>=4'} dev: true - /globals/13.17.0: - resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==} + /globals/13.19.0: + resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 diff --git a/scripts/jison/lint.mts b/scripts/jison/lint.mts index c410d5999..95edd4fb1 100644 --- a/scripts/jison/lint.mts +++ b/scripts/jison/lint.mts @@ -23,7 +23,7 @@ const lint = async (file: string): Promise => { return result.errorCount === 0; }; -(async () => { +const main = async () => { const jisonFiles = await globby(['./packages/**/*.jison', '!./**/node_modules/**'], { dot: true, }); @@ -31,4 +31,6 @@ const lint = async (file: string): Promise => { if (lintResults.includes(false)) { process.exit(1); } -})(); +}; + +void main(); diff --git a/tests/webpack/src/index.js b/tests/webpack/src/index.js index 899f66596..092972694 100644 --- a/tests/webpack/src/index.js +++ b/tests/webpack/src/index.js @@ -13,8 +13,8 @@ const load = async () => { await mermaid.registerExternalDiagrams([mindmap]); await render('info'); - setTimeout(async () => { - await render(`mindmap + setTimeout(() => { + void render(`mindmap root((mindmap)) Origins Long history @@ -35,4 +35,4 @@ const load = async () => { }, 2500); }; -window.addEventListener('load', load, false); +window.addEventListener('load', () => void load(), false); diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json new file mode 100644 index 000000000..5090f49d1 --- /dev/null +++ b/tsconfig.eslint.json @@ -0,0 +1,9 @@ +{ + // extend your base config to share compilerOptions, etc + "extends": "./tsconfig.json", + "compilerOptions": { + // ensure that nobody can accidentally use this config for a build + "noEmit": true + }, + "include": ["packages", "tests", "scripts", "cypress", "__mocks__", "./.eslintrc.cjs", "./*"] +} From 5b9839cbd0cf108060879716559a993cc90b7866 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Wed, 18 Jan 2023 00:53:00 +0530 Subject: [PATCH 138/309] fix package.json add `@types/cytoscape` --- packages/mermaid-mindmap/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/mermaid-mindmap/package.json b/packages/mermaid-mindmap/package.json index 0f1a98303..e79e2df4f 100644 --- a/packages/mermaid-mindmap/package.json +++ b/packages/mermaid-mindmap/package.json @@ -47,6 +47,7 @@ "non-layered-tidy-tree-layout": "^2.0.2" }, "devDependencies": { + "@types/cytoscape": "^3.19.9", "concurrently": "^7.5.0", "mermaid": "workspace:*", "rimraf": "^3.0.2" From 3aeef7b846bdae8f3d65c56a66fdd90780a277ea Mon Sep 17 00:00:00 2001 From: Bastian Ebeling <230051+Barry1@users.noreply.github.com> Date: Thu, 19 Jan 2023 07:15:32 +0100 Subject: [PATCH 139/309] Update integrations.md Corrected `Vs Code` to `VS Code` and inserted `Markdown Preview Enhanced` --- packages/mermaid/src/docs/misc/integrations.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/mermaid/src/docs/misc/integrations.md b/packages/mermaid/src/docs/misc/integrations.md index e16375872..cf4ccc9f8 100644 --- a/packages/mermaid/src/docs/misc/integrations.md +++ b/packages/mermaid/src/docs/misc/integrations.md @@ -89,9 +89,10 @@ They also serve as proof of concept, for the variety of things that can be built ## Editor Plugins -- [Vs Code](https://code.visualstudio.com/) +- [VS Code](https://code.visualstudio.com/) - [Markdown Preview Mermaid Support](https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid) - [Mermaid Preview](https://marketplace.visualstudio.com/items?itemName=vstirbu.vscode-mermaid-preview) + - [Markdown Preview Enhanced](https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced) - [Mermaid Markdown Syntax Highlighting](https://marketplace.visualstudio.com/items?itemName=bpruitt-goddard.mermaid-markdown-syntax-highlighting) - [Mermaid Editor](https://marketplace.visualstudio.com/items?itemName=tomoyukim.vscode-mermaid-editor) - [Mermaid Export](https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.mermaid-export) From 652a42fe1aed7911a781a84716940a973b995639 Mon Sep 17 00:00:00 2001 From: ashishj Date: Thu, 19 Jan 2023 19:03:05 +0100 Subject: [PATCH 140/309] Add directive parsing functionality to timeline diagram --- cypress/platform/ashish2.html | 36 ++++---- packages/mermaid-timeline/src/mermaidUtils.ts | 10 ++- packages/mermaid-timeline/src/timelineDb.js | 13 ++- .../mermaid-timeline/src/timelineRenderer.ts | 3 +- packages/mermaid/src/config.type.ts | 1 + packages/mermaid/src/defaultConfig.ts | 3 + .../mermaid/src/diagram-api/diagramAPI.ts | 8 +- packages/mermaid/src/diagram-api/types.ts | 4 +- packages/mermaid/src/directiveUtils.ts | 84 +++++++++++++++++++ packages/mermaid/src/mermaidAPI.ts | 77 +---------------- 10 files changed, 136 insertions(+), 103 deletions(-) create mode 100644 packages/mermaid/src/directiveUtils.ts diff --git a/cypress/platform/ashish2.html b/cypress/platform/ashish2.html index f1ebaa827..f77f95606 100644 --- a/cypress/platform/ashish2.html +++ b/cypress/platform/ashish2.html @@ -55,7 +55,7 @@
Security check
-
+    
  timeline
         title My day
         section section with no tasks
@@ -71,7 +71,7 @@
           I am a big big big tasks
           I am not so big tasks
     
-
+     
  timeline
         title England's History Timeline
         section Stone Age
@@ -85,21 +85,7 @@
 
     
- timeline
-        title History of Social Media Platform
-        section Rise of Social Media
-          2002 : LinkedIn
-          2004 : Facebook : Google : Pixar
-          2005 : Youtube
-          2006 : Twitter
-          2007 : Tumblr
-          2008s : Instagram
-          2010 : Pinterest
-    
-
----
-timeline:disableMulticolor: true
----
+      %%{init: { 'logLevel': 'debug', 'theme': 'default', 'timeline': {'disableMulticolor':false} } }%%
  timeline
         title History of Social Media Platform
           2002 : LinkedIn
@@ -111,6 +97,22 @@ timeline:disableMulticolor: true
           2010 : Pinterest
     
+      %%{init: { 'logLevel': 'debug', 'theme': 'default', 'themeVariables': {
+              'cScale0': '#ffffff',
+              'cScale1': '#00ff00',
+              'cScale2': '#0000ff',
+              } } }%%
+ timeline
+        title History of Social Media Platform
+          2002 : LinkedIn
+          2004 : Facebook : Google : Pixar
+          2005 : Youtube
+          2006 : Twitter
+          2007 : Tumblr
+          2008s : Instagram
+          2010 : Pinterest
+    
+
  timeline
         title History of Social Media Platform
           2002 : LinkedIn
diff --git a/packages/mermaid-timeline/src/mermaidUtils.ts b/packages/mermaid-timeline/src/mermaidUtils.ts
index 1061f87cf..af3f97571 100644
--- a/packages/mermaid-timeline/src/mermaidUtils.ts
+++ b/packages/mermaid-timeline/src/mermaidUtils.ts
@@ -23,7 +23,10 @@ export const log: Record = {
 export let setLogLevel: (level: keyof typeof LEVELS | number | string) => void;
 export let getConfig: () => object;
 export let sanitizeText: (str: string) => string;
-export const getCommonDb=() => localCommonDb;
+export const getCommonDb = () => localCommonDb;
+export let parseDirective = (p: any, statement: string, context: string, type: string) => {
+  return;
+}
 /**
  * Placeholder for the real function that will be injected by mermaid.
  */
@@ -52,9 +55,11 @@ export const injectUtils = (
   _getConfig: any,
   _sanitizeText: any,
   _setupGraphViewbox: any,
-  _commonDb: any
+  _commonDb: any,
+  _parseDirective: any
 ) => {
   _log.info('Mermaid utils injected into timeline-diagram');
+  _log.info('123 ' , _parseDirective);
   log.trace = _log.trace;
   log.debug = _log.debug;
   log.info = _log.info;
@@ -66,5 +71,6 @@ export const injectUtils = (
   sanitizeText = _sanitizeText;
   setupGraphViewbox = _setupGraphViewbox;
   localCommonDb = _commonDb;
+  parseDirective = _parseDirective;
 
 };
diff --git a/packages/mermaid-timeline/src/timelineDb.js b/packages/mermaid-timeline/src/timelineDb.js
index dda3a97cb..e5de2aee3 100644
--- a/packages/mermaid-timeline/src/timelineDb.js
+++ b/packages/mermaid-timeline/src/timelineDb.js
@@ -1,4 +1,4 @@
-import { getCommonDb as _getCommonDb,log  } from './mermaidUtils';
+import { getCommonDb as _getCommonDb, parseDirective as _parseDirective ,log  } from './mermaidUtils';
 
 let currentSection = '';
 let currentTaskId = 0;
@@ -9,6 +9,10 @@ const rawTasks = [];
 
 export const getCommonDb = _getCommonDb;
 
+export const parseDirective = ( statement, context, type) => {
+  _parseDirective(this, statement, context, type);
+};
+
 export const clear = function () {
   sections.length = 0;
   tasks.length = 0;
@@ -79,14 +83,14 @@ const compileTasks = function () {
   };
 
   let allProcessed = true;
-  for (let i = 0; i < rawTasks.length; i++) {
+  for (const [i, rawTask] of rawTasks.entries()) {
     compileTask(i);
 
-    allProcessed = allProcessed && rawTasks[i].processed;
+    allProcessed = allProcessed && rawTask.processed;
   }
   return allProcessed;
 };
-
+log.info('456 parseDirective',parseDirective);
 export default {
   clear,
   getCommonDb,
@@ -96,5 +100,6 @@ export default {
   addTask,
   addTaskOrg,
   addEvent,
+  parseDirective
 };
 
diff --git a/packages/mermaid-timeline/src/timelineRenderer.ts b/packages/mermaid-timeline/src/timelineRenderer.ts
index 063d070a7..5ed6c554e 100644
--- a/packages/mermaid-timeline/src/timelineRenderer.ts
+++ b/packages/mermaid-timeline/src/timelineRenderer.ts
@@ -17,7 +17,8 @@ export const draw = function (text, id, version, diagObj) {
   //1. Fetch the configuration
   const conf = getConfig();
   const LEFT_MARGIN = conf.leftMargin?conf.leftMargin:50;
-
+  //log conf
+  log.info('conf', conf);
   //2. Clear the diagram db before parsing
   diagObj.db.clear();
 
diff --git a/packages/mermaid/src/config.type.ts b/packages/mermaid/src/config.type.ts
index 63fe078fa..474075824 100644
--- a/packages/mermaid/src/config.type.ts
+++ b/packages/mermaid/src/config.type.ts
@@ -314,6 +314,7 @@ export interface TimelineDiagramConfig extends BaseDiagramConfig {
   actorColours?: string[];
   sectionFills?: string[];
   sectionColours?: string[];
+  disableMulticolor?: boolean;
 }
 
 export interface GanttDiagramConfig extends BaseDiagramConfig {
diff --git a/packages/mermaid/src/defaultConfig.ts b/packages/mermaid/src/defaultConfig.ts
index 5bb4a1bd8..cee89e4aa 100644
--- a/packages/mermaid/src/defaultConfig.ts
+++ b/packages/mermaid/src/defaultConfig.ts
@@ -984,6 +984,8 @@ const config: Partial = {
      */
     useMaxWidth: true,
 
+
+
     /**
      * | Parameter   | Description                       | Type | Required | Values      |
      * | ----------- | --------------------------------- | ---- | -------- | ----------- |
@@ -1009,6 +1011,7 @@ const config: Partial = {
 
     sectionFills: ['#191970', '#8B008B', '#4B0082', '#2F4F4F', '#800000', '#8B4513', '#00008B'],
     sectionColours: ['#fff'],
+    disableMulticolor: false,
   },
   class: {
     /**
diff --git a/packages/mermaid/src/diagram-api/diagramAPI.ts b/packages/mermaid/src/diagram-api/diagramAPI.ts
index ddb22df2c..574e72fbc 100644
--- a/packages/mermaid/src/diagram-api/diagramAPI.ts
+++ b/packages/mermaid/src/diagram-api/diagramAPI.ts
@@ -5,7 +5,8 @@ import { sanitizeText as _sanitizeText } from '../diagrams/common/common';
 import { setupGraphViewbox as _setupGraphViewbox } from '../setupGraphViewbox';
 import { addStylesForDiagram } from '../styles';
 import { DiagramDefinition, DiagramDetector } from './types';
-import  * as  _commonDb  from '../commonDb';
+import * as  _commonDb from '../commonDb';
+import { parseDirective as _parseDirective} from '../directiveUtils';
 
 
 /*
@@ -19,6 +20,7 @@ export const getConfig = _getConfig;
 export const sanitizeText = (text: string) => _sanitizeText(text, getConfig());
 export const setupGraphViewbox = _setupGraphViewbox;
 export const getCommonDb = () => { return _commonDb };
+export const parseDirective =  (p: any, statement: string, context: string, type: string)=>_parseDirective(p, statement, context, type);
 
 const diagrams: Record = {};
 export interface Detectors {
@@ -49,7 +51,9 @@ export const registerDiagram = (
   addStylesForDiagram(id, diagram.styles);
 
   if (diagram.injectUtils) {
-    diagram.injectUtils(log, setLogLevel, getConfig, sanitizeText, setupGraphViewbox,getCommonDb());
+    console.log('parseDirective', parseDirective);
+
+    diagram.injectUtils(log, setLogLevel, getConfig, sanitizeText, setupGraphViewbox,getCommonDb(),parseDirective);
   }
 };
 
diff --git a/packages/mermaid/src/diagram-api/types.ts b/packages/mermaid/src/diagram-api/types.ts
index 22b4c1c8c..883cf3987 100644
--- a/packages/mermaid/src/diagram-api/types.ts
+++ b/packages/mermaid/src/diagram-api/types.ts
@@ -7,6 +7,7 @@ export interface InjectUtils {
   _sanitizeText: any;
   _setupGraphViewbox: any;
   _commonDb: any;
+  _parseDirective: any;
 }
 
 /**
@@ -31,7 +32,8 @@ export interface DiagramDefinition {
     _getConfig: InjectUtils['_getConfig'],
     _sanitizeText: InjectUtils['_sanitizeText'],
     _setupGraphViewbox: InjectUtils['_setupGraphViewbox'],
-    _commonDb: InjectUtils['_commonDb']
+    _commonDb: InjectUtils['_commonDb'],
+    _parseDirective: InjectUtils['_parseDirective'],
   ) => void;
 }
 
diff --git a/packages/mermaid/src/directiveUtils.ts b/packages/mermaid/src/directiveUtils.ts
new file mode 100644
index 000000000..79888daf9
--- /dev/null
+++ b/packages/mermaid/src/directiveUtils.ts
@@ -0,0 +1,84 @@
+
+
+import * as configApi from './config';
+
+import { log } from './logger';
+import { directiveSanitizer } from './utils';
+
+let currentDirective: { type?: string; args?: any } | undefined = {};
+
+export const parseDirective = function (p: any, statement: string, context: string, type: string): void {
+  log.info('parseDirective is being called', statement, context, type);
+  try {
+    if (statement !== undefined) {
+      statement = statement.trim();
+      switch (context) {
+        case 'open_directive':
+          currentDirective = {};
+          break;
+        case 'type_directive':
+          if (!currentDirective) {
+            throw new Error('currentDirective is undefined');
+          }
+          currentDirective.type = statement.toLowerCase();
+          break;
+        case 'arg_directive':
+          if (!currentDirective) {
+            throw new Error('currentDirective is undefined');
+          }
+          currentDirective.args = JSON.parse(statement);
+          break;
+        case 'close_directive':
+          handleDirective(p, currentDirective, type);
+          currentDirective = undefined;
+          break;
+      }
+    }
+  } catch (error) {
+    log.error(
+      `Error while rendering sequenceDiagram directive: ${statement} jison context: ${context}`
+    );
+    // @ts-ignore: TODO Fix ts errors
+    log.error(error.message);
+  }
+};
+
+const handleDirective = function (p: any, directive: any, type: string): void {
+  log.info(`Directive type=${directive.type} with args:`, directive.args);
+  switch (directive.type) {
+    case 'init':
+    case 'initialize': {
+      ['config'].forEach((prop) => {
+        if (directive.args[prop] !== undefined) {
+          if (type === 'flowchart-v2') {
+            type = 'flowchart';
+          }
+          directive.args[type] = directive.args[prop];
+          delete directive.args[prop];
+        }
+      });
+      log.info('sanitize in handleDirective', directive.args);
+      directiveSanitizer(directive.args);
+      log.info('sanitize in handleDirective (done)', directive.args);
+      configApi.addDirective(directive.args);
+      break;
+    }
+    case 'wrap':
+    case 'nowrap':
+      if (p && p['setWrap']) {
+        p.setWrap(directive.type === 'wrap');
+      }
+      break;
+    case 'themeCss':
+      log.warn('themeCss encountered');
+      break;
+    default:
+      log.warn(
+        `Unhandled directive: source: '%%{${directive.type}: ${JSON.stringify(
+          directive.args ? directive.args : {}
+        )}}%%`,
+        directive
+      );
+      break;
+  }
+};
diff --git a/packages/mermaid/src/mermaidAPI.ts b/packages/mermaid/src/mermaidAPI.ts
index 5bf11fad1..ed2f547e9 100644
--- a/packages/mermaid/src/mermaidAPI.ts
+++ b/packages/mermaid/src/mermaidAPI.ts
@@ -31,6 +31,7 @@ import { MermaidConfig } from './config.type';
 import { evaluate } from './diagrams/common/common';
 import isEmpty from 'lodash-es/isEmpty.js';
 import { setA11yDiagramInfo, addSVGa11yTitleDescription } from './accessibility';
+import { parseDirective } from './directiveUtils';
 
 // diagram names that support classDef statements
 const CLASSDEF_DIAGRAMS = ['graph', 'flowchart', 'flowchart-v2', 'stateDiagram', 'stateDiagram-v2'];
@@ -777,82 +778,6 @@ const renderAsync = async function (
   return svgCode;
 };
 
-let currentDirective: { type?: string; args?: any } | undefined = {};
-
-const parseDirective = function (p: any, statement: string, context: string, type: string): void {
-  try {
-    if (statement !== undefined) {
-      statement = statement.trim();
-      switch (context) {
-        case 'open_directive':
-          currentDirective = {};
-          break;
-        case 'type_directive':
-          if (!currentDirective) {
-            throw new Error('currentDirective is undefined');
-          }
-          currentDirective.type = statement.toLowerCase();
-          break;
-        case 'arg_directive':
-          if (!currentDirective) {
-            throw new Error('currentDirective is undefined');
-          }
-          currentDirective.args = JSON.parse(statement);
-          break;
-        case 'close_directive':
-          handleDirective(p, currentDirective, type);
-          currentDirective = undefined;
-          break;
-      }
-    }
-  } catch (error) {
-    log.error(
-      `Error while rendering sequenceDiagram directive: ${statement} jison context: ${context}`
-    );
-    // @ts-ignore: TODO Fix ts errors
-    log.error(error.message);
-  }
-};
-
-const handleDirective = function (p: any, directive: any, type: string): void {
-  log.debug(`Directive type=${directive.type} with args:`, directive.args);
-  switch (directive.type) {
-    case 'init':
-    case 'initialize': {
-      ['config'].forEach((prop) => {
-        if (directive.args[prop] !== undefined) {
-          if (type === 'flowchart-v2') {
-            type = 'flowchart';
-          }
-          directive.args[type] = directive.args[prop];
-          delete directive.args[prop];
-        }
-      });
-      log.debug('sanitize in handleDirective', directive.args);
-      directiveSanitizer(directive.args);
-      log.debug('sanitize in handleDirective (done)', directive.args);
-      configApi.addDirective(directive.args);
-      break;
-    }
-    case 'wrap':
-    case 'nowrap':
-      if (p && p['setWrap']) {
-        p.setWrap(directive.type === 'wrap');
-      }
-      break;
-    case 'themeCss':
-      log.warn('themeCss encountered');
-      break;
-    default:
-      log.warn(
-        `Unhandled directive: source: '%%{${directive.type}: ${JSON.stringify(
-          directive.args ? directive.args : {}
-        )}}%%`,
-        directive
-      );
-      break;
-  }
-};
 
 /**
  * @param  options - Initial Mermaid options

From be818ad57f45cbaa3969ffa4509290e5081b70b4 Mon Sep 17 00:00:00 2001
From: ashishj 
Date: Thu, 19 Jan 2023 20:30:11 +0100
Subject: [PATCH 141/309] Pushing fix for broken themeVariable functionality

---
 cypress/platform/ashish2.html                 | 29 +++++++++++---
 packages/mermaid-timeline/src/mermaidUtils.ts |  3 +-
 packages/mermaid-timeline/src/svgDraw.js      |  2 +-
 packages/mermaid-timeline/src/timelineDb.js   |  2 +-
 .../mermaid-timeline/src/timelineRenderer.ts  | 38 ++++++++-----------
 .../mermaid/src/diagram-api/diagramAPI.ts     |  2 -
 packages/mermaid/src/directiveUtils.ts        |  2 +-
 packages/mermaid/src/docs/syntax/timeline.md  |  4 +-
 packages/mermaid/src/themes/theme-default.js  |  4 +-
 9 files changed, 47 insertions(+), 39 deletions(-)

diff --git a/cypress/platform/ashish2.html b/cypress/platform/ashish2.html
index f77f95606..c6dfdc6b0 100644
--- a/cypress/platform/ashish2.html
+++ b/cypress/platform/ashish2.html
@@ -84,8 +84,8 @@
                   : The first metal objects are made in Britain.Some other nice things happen. it is a good time to be alive.
 
     
-
-      %%{init: { 'logLevel': 'debug', 'theme': 'default', 'timeline': {'disableMulticolor':false} } }%%
+    
+      %%{'init': { 'logLevel': 'debug', 'theme': 'default', 'timeline': {'disableMulticolor':false} } }%%
  timeline
         title History of Social Media Platform
           2002 : LinkedIn
@@ -97,10 +97,10 @@
           2010 : Pinterest
     
-      %%{init: { 'logLevel': 'debug', 'theme': 'default', 'themeVariables': {
-              'cScale0': '#ffffff',
+      %%{init: { 'logLevel': 'debug', 'theme': 'base', 'themeVariables': {
+              'cScale0': '#ff0000',
               'cScale1': '#00ff00',
-              'cScale2': '#0000ff',
+              'cScale2': '#ff0000'
               } } }%%
  timeline
         title History of Social Media Platform
@@ -112,6 +112,25 @@
           2008s : Instagram
           2010 : Pinterest
     
+ +
+          %%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': {
+              'cScale0': '#ff0000',
+              'cScale1': '#00ff00',
+              'cScale2': '#0000ff'
+       } } }%%
+       timeline
+        title History of Social Media Platform
+          2002 : LinkedIn
+          2004 : Facebook : Google
+          2005 : Youtube
+          2006 : Twitter
+          2007 : Tumblr
+          2008 : Instagram
+          2010 : Pinterest
+
+    
+
  timeline
         title History of Social Media Platform
diff --git a/packages/mermaid-timeline/src/mermaidUtils.ts b/packages/mermaid-timeline/src/mermaidUtils.ts
index af3f97571..b733507ed 100644
--- a/packages/mermaid-timeline/src/mermaidUtils.ts
+++ b/packages/mermaid-timeline/src/mermaidUtils.ts
@@ -58,8 +58,7 @@ export const injectUtils = (
   _commonDb: any,
   _parseDirective: any
 ) => {
-  _log.info('Mermaid utils injected into timeline-diagram');
-  _log.info('123 ' , _parseDirective);
+  _log.debug('Mermaid utils injected into timeline-diagram');
   log.trace = _log.trace;
   log.debug = _log.debug;
   log.info = _log.info;
diff --git a/packages/mermaid-timeline/src/svgDraw.js b/packages/mermaid-timeline/src/svgDraw.js
index bed0e2942..88f90401c 100644
--- a/packages/mermaid-timeline/src/svgDraw.js
+++ b/packages/mermaid-timeline/src/svgDraw.js
@@ -519,7 +519,7 @@ export const drawNode = function (elem, node, fullSection, conf) {
     'class',
     (node.class ? node.class + ' ' : '') +
       'timeline-node ' +
-      (section < 0 ? 'section-root' : 'section-' + section)
+      ('section-' + section)
   );
   const bkgElem = nodeElem.append('g');
 
diff --git a/packages/mermaid-timeline/src/timelineDb.js b/packages/mermaid-timeline/src/timelineDb.js
index e5de2aee3..b92715fe9 100644
--- a/packages/mermaid-timeline/src/timelineDb.js
+++ b/packages/mermaid-timeline/src/timelineDb.js
@@ -90,7 +90,7 @@ const compileTasks = function () {
   }
   return allProcessed;
 };
-log.info('456 parseDirective',parseDirective);
+
 export default {
   clear,
   getCommonDb,
diff --git a/packages/mermaid-timeline/src/timelineRenderer.ts b/packages/mermaid-timeline/src/timelineRenderer.ts
index 5ed6c554e..86a83f674 100644
--- a/packages/mermaid-timeline/src/timelineRenderer.ts
+++ b/packages/mermaid-timeline/src/timelineRenderer.ts
@@ -1,8 +1,6 @@
 // @ts-nocheck TODO: fix file
 import { select } from 'd3';
 import svgDraw from './svgDraw';
-import addSVGAccessibilityFields from '../../accessibility';
-
 import { log, getConfig, setupGraphViewbox } from './mermaidUtils';
 
 export const setConf = function (cnf) {
@@ -17,15 +15,14 @@ export const draw = function (text, id, version, diagObj) {
   //1. Fetch the configuration
   const conf = getConfig();
   const LEFT_MARGIN = conf.leftMargin?conf.leftMargin:50;
-  //log conf
-  log.info('conf', conf);
+
   //2. Clear the diagram db before parsing
   diagObj.db.clear();
 
   //3. Parse the diagram text
   diagObj.parser.parse(text + '\n');
 
-  log.info('timeline', diagObj.db);
+  log.debug('timeline', diagObj.db);
 
   const securityLevel = conf.securityLevel;
   // Handle root and Document for when rendering in sandbox mode
@@ -45,17 +42,14 @@ export const draw = function (text, id, version, diagObj) {
   //4. Fetch the diagram data
   const tasks = diagObj.db.getTasks();
   const title = diagObj.db.getCommonDb().getDiagramTitle();
-
-  //log tasks
-  log.info(tasks);
+  log.debug('task',tasks);
 
   //5. Initialize the diagram
   svgDraw.initGraphics(svg);
 
   // fetch Sections
   const sections = diagObj.db.getSections();
-  // log sections
-  log.info(sections);
+  log.debug('sections', sections);
 
   let maxSectionHeight = 0;
   let maxTaskHeight = 0;
@@ -81,14 +75,14 @@ export const draw = function (text, id, version, diagObj) {
       maxHeight: maxSectionHeight,
     };
     const sectionHeight = svgDraw.getVirtualNodeHeight(svg, sectionNode, conf);
-    log.info('sectionHeight before draw', sectionHeight);
+    log.debug('sectionHeight before draw', sectionHeight);
     maxSectionHeight = Math.max(maxSectionHeight, sectionHeight +20);
   });
 
 //tasks length and maxEventCount
   let maxEventCount = 0;
   let maxEventLineLength = 0;
-  log.info('tasks.length', tasks.length);
+  log.debug('tasks.length', tasks.length);
    //calculate max task height
   // for loop till tasks.length
   for (const [i, task] of tasks.entries()) {
@@ -102,7 +96,7 @@ export const draw = function (text, id, version, diagObj) {
       maxHeight: maxTaskHeight,
     };
     const taskHeight = svgDraw.getVirtualNodeHeight(svg, taskNode, conf);
-    log.info('taskHeight before draw', taskHeight);
+    log.debug('taskHeight before draw', taskHeight);
     maxTaskHeight = Math.max(maxTaskHeight, taskHeight + 20);
 
     //calculate maxEventCount
@@ -126,8 +120,8 @@ export const draw = function (text, id, version, diagObj) {
   }
 
 
-  log.info('maxSectionHeight before draw', maxSectionHeight);
-  log.info('maxTaskHeight before draw', maxTaskHeight);
+  log.debug('maxSectionHeight before draw', maxSectionHeight);
+  log.debug('maxTaskHeight before draw', maxTaskHeight);
 
   if (sections && sections.length > 0) {
     sections.forEach((section) => {
@@ -140,11 +134,10 @@ export const draw = function (text, id, version, diagObj) {
         padding: 20,
         maxHeight: maxSectionHeight,
       };
-      //log section node
-      log.info('sectionNode', sectionNode);
+      log.debug('sectionNode', sectionNode);
       const sectionNodeWrapper = svg.append('g');
       const node = svgDraw.drawNode(sectionNodeWrapper, sectionNode, sectionNumber, conf);
-      log.info('sectionNode output', node);
+      log.debug('sectionNode output', node);
 
       sectionNodeWrapper.attr(
         'transform',
@@ -177,7 +170,7 @@ export const draw = function (text, id, version, diagObj) {
 
 // Get BBox of the diagram
   const box = svg.node().getBBox();
-  log.info('bounds', box);
+  log.debug('bounds', box);
 
   if (title) {
     svg
@@ -223,14 +216,13 @@ export const drawTasks = function (diagram, tasks, sectionColor, masterX, master
       maxHeight: maxTaskHeight,
     };
 
-    //log task node
-    log.info('taskNode', taskNode);
+    log.debug('taskNode', taskNode);
     // create task wrapper
     const taskWrapper = diagram.append('g').attr('class', 'taskWrapper');
     const node = svgDraw.drawNode(taskWrapper, taskNode, sectionColor, conf);
     const taskHeight = node.height;
     //log task height
-    log.info('taskHeight after draw', taskHeight);
+    log.debug('taskHeight after draw', taskHeight);
     taskWrapper.attr(
       'transform',
       `translate(${masterX}, ${masterY})`
@@ -294,7 +286,7 @@ export const drawEvents = function (diagram, events, sectionColor, masterX, mast
     };
 
     //log task node
-    log.info('eventNode', eventNode);
+    log.debug('eventNode', eventNode);
     // create event wrapper
     const eventWrapper = diagram.append('g').attr('class', 'eventWrapper');
     const node = svgDraw.drawNode(eventWrapper, eventNode, sectionColor, conf)
diff --git a/packages/mermaid/src/diagram-api/diagramAPI.ts b/packages/mermaid/src/diagram-api/diagramAPI.ts
index 574e72fbc..69c4d8110 100644
--- a/packages/mermaid/src/diagram-api/diagramAPI.ts
+++ b/packages/mermaid/src/diagram-api/diagramAPI.ts
@@ -51,8 +51,6 @@ export const registerDiagram = (
   addStylesForDiagram(id, diagram.styles);
 
   if (diagram.injectUtils) {
-    console.log('parseDirective', parseDirective);
-
     diagram.injectUtils(log, setLogLevel, getConfig, sanitizeText, setupGraphViewbox,getCommonDb(),parseDirective);
   }
 };
diff --git a/packages/mermaid/src/directiveUtils.ts b/packages/mermaid/src/directiveUtils.ts
index 79888daf9..677647d44 100644
--- a/packages/mermaid/src/directiveUtils.ts
+++ b/packages/mermaid/src/directiveUtils.ts
@@ -8,7 +8,7 @@ import { directiveSanitizer } from './utils';
 let currentDirective: { type?: string; args?: any } | undefined = {};
 
 export const parseDirective = function (p: any, statement: string, context: string, type: string): void {
-  log.info('parseDirective is being called', statement, context, type);
+  log.debug('parseDirective is being called', statement, context, type);
   try {
     if (statement !== undefined) {
       statement = statement.trim();
diff --git a/packages/mermaid/src/docs/syntax/timeline.md b/packages/mermaid/src/docs/syntax/timeline.md
index 3438b4542..44b72bd79 100644
--- a/packages/mermaid/src/docs/syntax/timeline.md
+++ b/packages/mermaid/src/docs/syntax/timeline.md
@@ -140,7 +140,7 @@ mermaid.initialize({
 
 let us look at same example, where we have disabled the multiColor option.
 ```mermaid-example
-   %%{init: { 'logLevel': 'debug', 'theme': 'base', 'timeline': {'disableMulticolor': true}}%%
+   %%{init: { 'logLevel': 'debug', 'theme': 'base', 'timeline': {'disableMulticolor': true}}}%%
     timeline
         title History of Social Media Platform
           2002 : LinkedIn
@@ -164,7 +164,7 @@ Now let's override the default values for the `cScale0` to `cScale2` variables:
     %%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': {
               'cScale0': '#ff0000',
               'cScale1': '#00ff00',
-              'cScale2': '#0000ff',
+              'cScale2': '#0000ff'
        } } }%%
        timeline
         title History of Social Media Platform
diff --git a/packages/mermaid/src/themes/theme-default.js b/packages/mermaid/src/themes/theme-default.js
index 969551ee6..4fb898040 100644
--- a/packages/mermaid/src/themes/theme-default.js
+++ b/packages/mermaid/src/themes/theme-default.js
@@ -122,6 +122,7 @@ class Theme {
   updateColors() {
     /* Color Scale */
     /* Each color-set will have a background, a foreground and a border color */
+
     this.cScale0 = this.cScale0 || this.primaryColor;
     this.cScale1 = this.cScale1 || this.secondaryColor;
     this.cScale2 = this.cScale2 || this.tertiaryColor;
@@ -138,10 +139,9 @@ class Theme {
     this['cScalePeer' + 2] = this['cScalePeer' + 2] || darken(this.tertiaryColor, 40);
     for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {
       // Setup the peer color for the set, useful for borders
-      this['cScale' + i] = darken(this['cScale' + i], 10);
+       this['cScale' + i] = darken(this['cScale' + i], 10);
       this['cScalePeer' + i] = this['cScalePeer' + i] || darken(this['cScale' + i], 25);
     }
-
     // Setup the inverted color for the set
     for (let i = 0; i < this.THEME_COLOR_LIMIT; i++) {
       this['cScaleInv' + i] = this['cScaleInv' + i] || adjust(this['cScale' + i], { h: 180 });

From e865368649aa3ad75c75b8e45cc1e31e090735a2 Mon Sep 17 00:00:00 2001
From: ashishj 
Date: Thu, 19 Jan 2023 20:42:33 +0100
Subject: [PATCH 142/309] Updating version and clean up  package.json

---
 packages/mermaid-timeline/package.json | 25 +++++++------------------
 1 file changed, 7 insertions(+), 18 deletions(-)

diff --git a/packages/mermaid-timeline/package.json b/packages/mermaid-timeline/package.json
index 0c2ebf136..8447d1981 100644
--- a/packages/mermaid-timeline/package.json
+++ b/packages/mermaid-timeline/package.json
@@ -1,14 +1,14 @@
 {
   "name": "@mermaid-js/mermaid-timeline",
-  "version": "9.2.0-rc2",
-  "description": "Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.",
-  "main": "dist/mermaid-timeline.core.mjs",
+  "version": "9.4.0",
+  "description": "Timeline diagram module for Mermaid.js.",
   "module": "dist/mermaid-timeline.core.mjs",
+  "types": "dist/detector.d.ts",
   "type": "module",
   "exports": {
     ".": {
-      "require": "./dist/mermaid-timeline.min.js",
-      "import": "./dist/mermaid-timeline.core.mjs"
+      "import": "./dist/mermaid-timeline.core.mjs",
+      "types": "./dist/detector.d.ts"
     },
     "./*": "./*"
   },
@@ -19,24 +19,13 @@
     "mermaid"
   ],
   "scripts": {
-    "clean": "rimraf dist",
-    "build:types": "tsc -p ./tsconfig.json --emitDeclarationOnly",
-    "build:watch": "yarn build:code --watch",
-    "build:esbuild": "concurrently \"yarn build:code\" \"yarn build:types\"",
-    "build": "yarn clean; yarn build:esbuild",
-    "dev": "node .esbuild/serve.cjs",
-    "release": "yarn build",
-    "lint": "eslint --cache --ignore-path .gitignore . && yarn lint:jison && prettier --check .",
-    "lint:fix": "eslint --fix --ignore-path .gitignore . && prettier --write .",
-    "lint:jison": "ts-node-esm src/jison/lint.mts",
-    "todo-prepare": "concurrently \"husky install ../../.husky\" \"yarn build\"",
-    "todo-pre-commit": "lint-staged"
+    "prepublishOnly": "pnpm -w run build"
   },
   "repository": {
     "type": "git",
     "url": "https://github.com/mermaid-js/mermaid"
   },
-  "author": "Knut Sveidqvist",
+  "author": "Ashish Jain",
   "license": "MIT",
   "standard": {
     "ignore": [

From 3cd15cdcf2a2d6e81a296831323c57981fececfc Mon Sep 17 00:00:00 2001
From: Knut Sveidqvist 
Date: Thu, 19 Jan 2023 20:50:36 +0100
Subject: [PATCH 143/309] #4012 Handling rows with only spaces in them

---
 packages/mermaid-mindmap/src/mindmap.spec.js      | 12 ++++++++++++
 packages/mermaid-mindmap/src/parser/mindmap.jison |  5 ++++-
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/packages/mermaid-mindmap/src/mindmap.spec.js b/packages/mermaid-mindmap/src/mindmap.spec.js
index e3f018350..2a2dd13bb 100644
--- a/packages/mermaid-mindmap/src/mindmap.spec.js
+++ b/packages/mermaid-mindmap/src/mindmap.spec.js
@@ -347,4 +347,16 @@ root
     expect(child.children.length).toEqual(2);
     expect(child.children[1].nodeId).toEqual('b');
   });
+  it('MMP-23 Rows with only spaces should not interfere', function () {
+    let str = 'mindmap\nroot\n A\n \n\n B';
+    mindmap.parse(str);
+    const mm = mindmap.yy.getMindmap();
+    expect(mm.nodeId).toEqual('root');
+    expect(mm.children.length).toEqual(2);
+
+    const child = mm.children[0];
+    expect(child.nodeId).toEqual('A');
+    const child2 = mm.children[1];
+    expect(child2.nodeId).toEqual('B');
+  });
 });
diff --git a/packages/mermaid-mindmap/src/parser/mindmap.jison b/packages/mermaid-mindmap/src/parser/mindmap.jison
index a96ee6261..651d9dc09 100644
--- a/packages/mermaid-mindmap/src/parser/mindmap.jison
+++ b/packages/mermaid-mindmap/src/parser/mindmap.jison
@@ -25,6 +25,7 @@
 \n				   { this.popState();}
 // [\s]*"::icon("   { this.begin('ICON'); }
 "::icon("   { yy.getLogger().trace('Begin icon');this.begin('ICON'); }
+[\s]+[\n]     {yy.getLogger().trace('SPACELINE');return 'SPACELINE'                 /* skip all whitespace */    ;}
 [\n]+               return 'NL';
 [^\)]+			 { return 'ICON'; }
 \)				   {yy.getLogger().trace('end icon');this.popState();}
@@ -72,6 +73,7 @@ start
 stop
   : NL {yy.getLogger().trace('Stop NL ');}
   | EOF {yy.getLogger().trace('Stop EOF ');}
+  | SPACELINE
   | stop NL {yy.getLogger().trace('Stop NL2 ');}
   | stop EOF {yy.getLogger().trace('Stop EOF2 ');}
   ;
@@ -81,9 +83,10 @@ document
 	;
 
 statement
-	: SPACELIST node       { yy.getLogger().trace('Node: ',$2.id);yy.addNode($1.length, $2.id, $2.descr, $2.type);  }
+	: SPACELIST node       { yy.getLogger().info('Node: ',$2.id);yy.addNode($1.length, $2.id, $2.descr, $2.type);  }
 	| SPACELIST ICON       { yy.getLogger().trace('Icon: ',$2);yy.decorateNode({icon: $2}); }
 	| SPACELIST CLASS      { yy.decorateNode({class: $2}); }
+  | SPACELINE { yy.getLogger().trace('SPACELIST');}
 	| node					       { yy.getLogger().trace('Node: ',$1.id);yy.addNode(0, $1.id, $1.descr, $1.type);  }
 	| ICON                 { yy.decorateNode({icon: $1}); }
 	| CLASS                { yy.decorateNode({class: $1}); }

From 7ef71cc04db5f855fe5d3a99f04727a3381febe3 Mon Sep 17 00:00:00 2001
From: ashishj 
Date: Thu, 19 Jan 2023 21:05:38 +0100
Subject: [PATCH 144/309] Remove old test cases

---
 .../src/parser/timeline.spec.js               | 150 ------------------
 .../mermaid-timeline/src/timelineDb.spec.js   |  91 -----------
 2 files changed, 241 deletions(-)
 delete mode 100644 packages/mermaid-timeline/src/parser/timeline.spec.js
 delete mode 100644 packages/mermaid-timeline/src/timelineDb.spec.js

diff --git a/packages/mermaid-timeline/src/parser/timeline.spec.js b/packages/mermaid-timeline/src/parser/timeline.spec.js
deleted file mode 100644
index cc54d9f78..000000000
--- a/packages/mermaid-timeline/src/parser/timeline.spec.js
+++ /dev/null
@@ -1,150 +0,0 @@
-import { parser } from './journey';
-import journeyDb from '../journeyDb';
-
-const parserFnConstructor = (str) => {
-  return () => {
-    parser.parse(str);
-  };
-};
-
-describe('when parsing a journey diagram it', function () {
-  beforeEach(function () {
-    parser.yy = journeyDb;
-    parser.yy.clear();
-  });
-
-  it('should handle a title definition', function () {
-    const str = 'journey\ntitle Adding journey diagram functionality to mermaid';
-
-    expect(parserFnConstructor(str)).not.toThrow();
-  });
-
-  it('should handle an accessibility description (accDescr)', function () {
-    const str =
-      'journey\n' +
-      'accDescr: A user journey for family shopping\n' +
-      'title Adding journey diagram functionality to mermaid\n' +
-      'section Order from website';
-
-    expect(parserFnConstructor(str)).not.toThrow();
-  });
-  it('should handle an accessibility multiline description (accDescr)', function () {
-    const str =
-      'journey\n' +
-      `accDescr {
-        A user journey for
-        family shopping
-      }` +
-      'title Adding journey diagram functionality to mermaid\n' +
-      'accTitle: Adding acc journey diagram functionality to mermaid\n' +
-      'section Order from website';
-
-    expect(parserFnConstructor(str)).not.toThrow();
-    expect(journeyDb.getAccDescription()).toBe('A user journey for\nfamily shopping');
-    expect(journeyDb.getDiagramTitle()).toBe('Adding journey diagram functionality to mermaid');
-    expect(journeyDb.getAccTitle()).toBe('Adding acc journey diagram functionality to mermaid');
-  });
-  it('should handle an accessibility title (accDescr)', function () {
-    const str = `journey
-    accTitle: The title
-    section Order from website`;
-
-    expect(parserFnConstructor(str)).not.toThrow();
-    expect(journeyDb.getAccDescription()).toBe('');
-    expect(journeyDb.getAccTitle()).toBe('The title');
-  });
-
-  it('should handle a section definition', function () {
-    const str =
-      'journey\n' +
-      'title Adding journey diagram functionality to mermaid\n' +
-      'section Order from website';
-
-    expect(parserFnConstructor(str)).not.toThrow();
-  });
-  it('should handle multiline section titles with different line breaks', function () {
-    const str =
-      'journey\n' +
-      'title Adding gantt diagram functionality to mermaid\n' +
-      'section Line1
Line2
Line3
Line4Line5'; - - expect(parserFnConstructor(str)).not.toThrow(); - }); - - it('should handle a task definition', function () { - const str = - 'journey\n' + - 'title Adding journey diagram functionality to mermaid\n' + - 'section Documentation\n' + - 'A task: 5: Alice, Bob, Charlie\n' + - 'B task: 3:Bob, Charlie\n' + - 'C task: 5\n' + - 'D task: 5: Charlie, Alice\n' + - 'E task: 5:\n' + - 'section Another section\n' + - 'P task: 5:\n' + - 'Q task: 5:\n' + - 'R task: 5:'; - expect(parserFnConstructor(str)).not.toThrow(); - - const tasks = parser.yy.getTasks(); - expect(tasks.length).toEqual(8); - - expect(tasks[0]).toEqual({ - score: 5, - people: ['Alice', 'Bob', 'Charlie'], - section: 'Documentation', - task: 'A task', - type: 'Documentation', - }); - expect(tasks[1]).toEqual({ - score: 3, - people: ['Bob', 'Charlie'], - section: 'Documentation', - type: 'Documentation', - task: 'B task', - }); - expect(tasks[2]).toEqual({ - score: 5, - people: [], - section: 'Documentation', - type: 'Documentation', - task: 'C task', - }); - expect(tasks[3]).toEqual({ - score: 5, - people: ['Charlie', 'Alice'], - section: 'Documentation', - task: 'D task', - type: 'Documentation', - }); - expect(tasks[4]).toEqual({ - score: 5, - people: [''], - section: 'Documentation', - type: 'Documentation', - task: 'E task', - }); - expect(tasks[5]).toEqual({ - score: 5, - people: [''], - section: 'Another section', - type: 'Another section', - task: 'P task', - }); - expect(tasks[6]).toEqual({ - score: 5, - people: [''], - section: 'Another section', - type: 'Another section', - task: 'Q task', - }); - expect(tasks[7]).toEqual({ - score: 5, - people: [''], - section: 'Another section', - type: 'Another section', - task: 'R task', - }); - }); -}); diff --git a/packages/mermaid-timeline/src/timelineDb.spec.js b/packages/mermaid-timeline/src/timelineDb.spec.js deleted file mode 100644 index 3a17ca202..000000000 --- a/packages/mermaid-timeline/src/timelineDb.spec.js +++ /dev/null @@ -1,91 +0,0 @@ -import journeyDb from './journeyDb'; - -describe('when using the journeyDb', function () { - beforeEach(function () { - journeyDb.clear(); - }); - - describe('when calling the clear function', function () { - beforeEach(function () { - journeyDb.addSection('weekends skip test'); - journeyDb.addTask('test1', '4: id1, id3'); - journeyDb.addTask('test2', '2: id2'); - journeyDb.clear(); - }); - - it.each` - fn | expected - ${'getTasks'} | ${[]} - ${'getAccTitle'} | ${''} - ${'getSections'} | ${[]} - ${'getActors'} | ${[]} - `('should clear $fn', ({ fn, expected }) => { - expect(journeyDb[fn]()).toEqual(expected); - }); - }); - - describe('when calling the clear function', function () { - beforeEach(function () { - journeyDb.addSection('weekends skip test'); - journeyDb.addTask('test1', '3: id1, id3'); - journeyDb.addTask('test2', '1: id2'); - journeyDb.clear(); - }); - it.each` - fn | expected - ${'getTasks'} | ${[]} - ${'getAccTitle'} | ${''} - ${'getAccDescription'} | ${''} - ${'getSections'} | ${[]} - `('should clear $fn', ({ fn, expected }) => { - expect(journeyDb[fn]()).toEqual(expected); - }); - }); - - describe('tasks and actors should be added', function () { - journeyDb.setAccTitle('Shopping'); - journeyDb.setAccDescription('A user journey for family shopping'); - journeyDb.addSection('Journey to the shops'); - journeyDb.addTask('Get car keys', ':5:Dad'); - journeyDb.addTask('Go to car', ':3:Dad, Mum, Child#1, Child#2'); - journeyDb.addTask('Drive to supermarket', ':4:Dad'); - journeyDb.addSection('Do shopping'); - journeyDb.addTask('Go shopping', ':5:Mum'); - - expect(journeyDb.getAccTitle()).toEqual('Shopping'); - expect(journeyDb.getAccDescription()).toEqual('A user journey for family shopping'); - expect(journeyDb.getTasks()).toEqual([ - { - score: 5, - people: ['Dad'], - section: 'Journey to the shops', - task: 'Get car keys', - type: 'Journey to the shops', - }, - { - score: 3, - people: ['Dad', 'Mum', 'Child#1', 'Child#2'], - section: 'Journey to the shops', - task: 'Go to car', - type: 'Journey to the shops', - }, - { - score: 4, - people: ['Dad'], - section: 'Journey to the shops', - task: 'Drive to supermarket', - type: 'Journey to the shops', - }, - { - score: 5, - people: ['Mum'], - section: 'Do shopping', - task: 'Go shopping', - type: 'Do shopping', - }, - ]); - expect(journeyDb.getActors()).toEqual(['Child#1', 'Child#2', 'Dad', 'Mum']); - - expect(journeyDb.getSections()).toEqual(['Journey to the shops', 'Do shopping']); - }); -}); From 96d5bc7695f6e823d79ef2bc3c831ce46bc0941e Mon Sep 17 00:00:00 2001 From: cnjeftia Date: Fri, 20 Jan 2023 11:29:16 +0800 Subject: [PATCH 145/309] docs: minor fix on markdown --- packages/mermaid/README.zh-CN.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/mermaid/README.zh-CN.md b/packages/mermaid/README.zh-CN.md index f34c7a647..9f709a81a 100644 --- a/packages/mermaid/README.zh-CN.md +++ b/packages/mermaid/README.zh-CN.md @@ -325,7 +325,9 @@ _很不幸的是,鱼与熊掌不可兼得,在这个场景下它意味着在 来自 Knut Sveidqvist: -> _特别感谢 [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/knsv/mermaid/graphs/contributors),没有你们,就没有这个项目的今天!_ From 5925d8b731444b67e6ef8f757d8abf2f9ab08fcb Mon Sep 17 00:00:00 2001 From: cnjeftia Date: Fri, 20 Jan 2023 11:45:11 +0800 Subject: [PATCH 146/309] docs: minor fix on markdown in root folder --- README.zh-CN.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 6b3e28b19..8b254dd50 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -325,7 +325,9 @@ _很不幸的是,鱼与熊掌不可兼得,在这个场景下它意味着在 来自 Knut Sveidqvist: -> _特别感谢 [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/knsv/mermaid/graphs/contributors),没有你们,就没有这个项目的今天!_ From 023f2354cdd659fc9827a567342ded4ed6df7579 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Fri, 20 Jan 2023 08:31:01 +0100 Subject: [PATCH 147/309] --- cypress/platform/knsv2.html | 36 ++++++++++++++++--------- packages/mermaid-mindmap/src/svgDraw.js | 6 ++--- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/cypress/platform/knsv2.html b/cypress/platform/knsv2.html index afc12dbe9..e28184627 100644 --- a/cypress/platform/knsv2.html +++ b/cypress/platform/knsv2.html @@ -54,7 +54,7 @@ -
+    
 %%{init: {"flowchart": {"defaultRenderer": "elk"}} }%%
 graph TB
       a --> b
@@ -62,14 +62,14 @@ graph TB
       b --> d
       c --> d
     
-
+    
 flowchart-elk TB
       a --> b
       a --> c
       b --> d
       c --> d
     
-
+    
 %%{init: {"flowchart": {"defaultRenderer": "elk"}} }%%
 flowchart TB
   %% I could not figure out how to use double quotes in labels in Mermaid
@@ -125,7 +125,7 @@ flowchart TB
 

-
+    
 flowchart TB
   %% I could not figure out how to use double quotes in labels in Mermaid
   subgraph ibm[IBM Espresso CPU]
@@ -227,14 +227,24 @@ sequenceDiagram
     Customer->>+Merchant: Receives goods or services
         
-
-      gantt
-        title Style today marker (vertical line should be 5px wide and half-transparent blue)
-        dateFormat YYYY-MM-DD
-        axisFormat %d
-        todayMarker stroke-width:5px,stroke:#00f,opacity:0.5
-        section Section1
-        Today: 1, -1h
+    
+mindmap
+  root((mindmap))
+    Origins
+      Long history
+      ::icon(fa fa-book)
+      Popularisation
+        British popular psychology author Tony Buzan
+    Research
+      On effectiveness
and features + On Automatic creation + Uses + Creative techniques + Strategic planning + Argument mapping + Tools + Pen and paper + Mermaid
@@ -252,7 +262,7 @@ sequenceDiagram // console.error('Mermaid error: ', err); }; mermaid.initialize({ - // theme: 'forest', + theme: 'dark', startOnLoad: true, logLevel: 0, flowchart: { diff --git a/packages/mermaid-mindmap/src/svgDraw.js b/packages/mermaid-mindmap/src/svgDraw.js index d4f57f1f1..e4a52ad98 100644 --- a/packages/mermaid-mindmap/src/svgDraw.js +++ b/packages/mermaid-mindmap/src/svgDraw.js @@ -203,14 +203,12 @@ const roundedRectBkg = function (elem, node) { * @returns {number} The height nodes dom element */ export const drawNode = function (elem, node, fullSection, conf) { - const section = (fullSection % MAX_SECTIONS) - 1; + const section = fullSection % MAX_SECTIONS; const nodeElem = elem.append('g'); node.section = section; nodeElem.attr( 'class', - (node.class ? node.class + ' ' : '') + - 'mindmap-node ' + - (section < 0 ? 'section-root' : 'section-' + section) + (node.class ? node.class + ' ' : '') + 'mindmap-node ' + ('section-' + section) ); const bkgElem = nodeElem.append('g'); From 80903e427ce2031002e2ac15f28bdf8d34cdc381 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Fri, 20 Jan 2023 10:18:26 +0100 Subject: [PATCH 148/309] #4012 Allowing multiple lines before the mindmap statement --- packages/mermaid-mindmap/src/mindmap.spec.js | 12 ++++++++++++ packages/mermaid-mindmap/src/parser/mindmap.jison | 9 ++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/mermaid-mindmap/src/mindmap.spec.js b/packages/mermaid-mindmap/src/mindmap.spec.js index 2a2dd13bb..292d7ebf8 100644 --- a/packages/mermaid-mindmap/src/mindmap.spec.js +++ b/packages/mermaid-mindmap/src/mindmap.spec.js @@ -354,6 +354,18 @@ root expect(mm.nodeId).toEqual('root'); expect(mm.children.length).toEqual(2); + const child = mm.children[0]; + expect(child.nodeId).toEqual('A'); + const child2 = mm.children[1]; + expect(child2.nodeId).toEqual('B'); + }); + it('MMP-24 Handle rows above the mindmap declarations', function () { + let str = '\n \nmindmap\nroot\n A\n \n\n B'; + mindmap.parse(str); + const mm = mindmap.yy.getMindmap(); + expect(mm.nodeId).toEqual('root'); + expect(mm.children.length).toEqual(2); + const child = mm.children[0]; expect(child.nodeId).toEqual('A'); const child2 = mm.children[1]; diff --git a/packages/mermaid-mindmap/src/parser/mindmap.jison b/packages/mermaid-mindmap/src/parser/mindmap.jison index 651d9dc09..b604d3b1e 100644 --- a/packages/mermaid-mindmap/src/parser/mindmap.jison +++ b/packages/mermaid-mindmap/src/parser/mindmap.jison @@ -67,9 +67,16 @@ start // %{ : info document 'EOF' { return yy; } } : MINDMAP document { return yy; } | MINDMAP NL document { return yy; } - | SPACELIST MINDMAP document { return yy; } + | spaceLines MINDMAP document { return yy; } + | spaceLines MINDMAP NL document { return yy; } ; +spaceLines + : SPACELINE + | spaceLines SPACELINE + | spaceLines NL + ; + stop : NL {yy.getLogger().trace('Stop NL ');} | EOF {yy.getLogger().trace('Stop EOF ');} From bc56a7d4f1a9a171d5b70e6f3cf8fccfbf70c9f4 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Fri, 20 Jan 2023 10:21:13 +0100 Subject: [PATCH 149/309] #4012 Neater grammar for the rows before mindmap --- packages/mermaid-mindmap/src/mindmap.spec.js | 12 ++++++++++++ packages/mermaid-mindmap/src/parser/mindmap.jison | 13 ++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/mermaid-mindmap/src/mindmap.spec.js b/packages/mermaid-mindmap/src/mindmap.spec.js index 292d7ebf8..753804a5d 100644 --- a/packages/mermaid-mindmap/src/mindmap.spec.js +++ b/packages/mermaid-mindmap/src/mindmap.spec.js @@ -366,6 +366,18 @@ root expect(mm.nodeId).toEqual('root'); expect(mm.children.length).toEqual(2); + const child = mm.children[0]; + expect(child.nodeId).toEqual('A'); + const child2 = mm.children[1]; + expect(child2.nodeId).toEqual('B'); + }); + it('MMP-25 Handle rows above the mindmap declarations, no space', function () { + let str = '\n\n\nmindmap\nroot\n A\n \n\n B'; + mindmap.parse(str); + const mm = mindmap.yy.getMindmap(); + expect(mm.nodeId).toEqual('root'); + expect(mm.children.length).toEqual(2); + const child = mm.children[0]; expect(child.nodeId).toEqual('A'); const child2 = mm.children[1]; diff --git a/packages/mermaid-mindmap/src/parser/mindmap.jison b/packages/mermaid-mindmap/src/parser/mindmap.jison index b604d3b1e..d2f6bbf1a 100644 --- a/packages/mermaid-mindmap/src/parser/mindmap.jison +++ b/packages/mermaid-mindmap/src/parser/mindmap.jison @@ -65,11 +65,9 @@ start // %{ : info document 'EOF' { return yy; } } - : MINDMAP document { return yy; } - | MINDMAP NL document { return yy; } - | spaceLines MINDMAP document { return yy; } - | spaceLines MINDMAP NL document { return yy; } - ; + : mindMap + | spaceLines mindMap + ; spaceLines : SPACELINE @@ -77,6 +75,11 @@ spaceLines | spaceLines NL ; +mindMap + : MINDMAP document { return yy; } + | MINDMAP NL document { return yy; } + ; + stop : NL {yy.getLogger().trace('Stop NL ');} | EOF {yy.getLogger().trace('Stop EOF ');} From de8928b2d92e1684691682d339e2e17700939275 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Fri, 20 Jan 2023 12:48:06 +0100 Subject: [PATCH 150/309] #4016 Fix for max_sections in mindmap renderer --- packages/mermaid-mindmap/src/svgDraw.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/mermaid-mindmap/src/svgDraw.js b/packages/mermaid-mindmap/src/svgDraw.js index e4a52ad98..79eab6e1d 100644 --- a/packages/mermaid-mindmap/src/svgDraw.js +++ b/packages/mermaid-mindmap/src/svgDraw.js @@ -203,7 +203,7 @@ const roundedRectBkg = function (elem, node) { * @returns {number} The height nodes dom element */ export const drawNode = function (elem, node, fullSection, conf) { - const section = fullSection % MAX_SECTIONS; + const section = fullSection % (MAX_SECTIONS - 1); const nodeElem = elem.append('g'); node.section = section; nodeElem.attr( @@ -303,7 +303,7 @@ export const drawNode = function (elem, node, fullSection, conf) { }; export const drawEdge = function drawEdge(edgesElem, mindmap, parent, depth, fullSection) { - const section = (fullSection % MAX_SECTIONS) - 1; + const section = fullSection % (MAX_SECTIONS - 1); const sx = parent.x + parent.width / 2; const sy = parent.y + parent.height / 2; const ex = mindmap.x + mindmap.width / 2; From b26cdb3e46901ec433701a21123391a3b845c6e2 Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Tue, 3 Jan 2023 05:59:24 +0000 Subject: [PATCH 151/309] build(docs): support YAML frontmatter in markdown Vitepress uses YAML frontmatter to configure Vitepress specific settings, see https://vitepress.vuejs.org/config/frontmatter-configs We just need to use `remark-frontmatter` to add support for it. GitHub also renders the YAML front-matter nicely in a table automatically, but maybe we should instead strip it, if it's only used by Vitepress? --- packages/mermaid/package.json | 1 + packages/mermaid/src/docs.mts | 7 ++++-- pnpm-lock.yaml | 45 +++++++++++++++++++++++++++++++---- 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index c5699ae28..f7eff6731 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -90,6 +90,7 @@ "path-browserify": "^1.0.1", "prettier": "^2.7.1", "remark": "^14.0.2", + "remark-frontmatter": "^4.0.1", "remark-gfm": "^3.0.1", "rimraf": "^3.0.2", "start-server-and-test": "^1.14.0", diff --git a/packages/mermaid/src/docs.mts b/packages/mermaid/src/docs.mts index 99da3f381..7a32e34ee 100644 --- a/packages/mermaid/src/docs.mts +++ b/packages/mermaid/src/docs.mts @@ -38,14 +38,17 @@ import type { Code, Root } from 'mdast'; import { posix, dirname, relative, join } from 'path'; import prettier from 'prettier'; import { remark as remarkBuilder } from 'remark'; +import remarkFrontmatter from 'remark-frontmatter'; import remarkGfm from 'remark-gfm'; import chokidar from 'chokidar'; import mm from 'micromatch'; // @ts-ignore No typescript declaration file import flatmap from 'unist-util-flatmap'; -// support tables and other GitHub Flavored Markdown syntax in markdown -const remark = remarkBuilder().use(remarkGfm); +const remark = remarkBuilder() + // support tables and other GitHub Flavored Markdown syntax in markdown + .use(remarkGfm) + .use(remarkFrontmatter, ['yaml']); // support YAML front-matter in Markdown const MERMAID_MAJOR_VERSION = ( JSON.parse(readFileSync('../mermaid/package.json', 'utf8')).version as string diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dfc788597..7ab8e7340 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -275,6 +275,9 @@ importers: remark: specifier: ^14.0.2 version: 14.0.2 + remark-frontmatter: + specifier: ^4.0.1 + version: 4.0.1 remark-gfm: specifier: ^3.0.1 version: 3.0.1 @@ -3970,7 +3973,7 @@ packages: /axios/0.21.4_debug@4.3.2: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2_debug@4.3.2 + follow-redirects: 1.15.2 transitivePeerDependencies: - debug dev: true @@ -6663,6 +6666,12 @@ packages: reusify: 1.0.4 dev: true + /fault/2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + dependencies: + format: 0.2.2 + dev: true + /faye-websocket/0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} @@ -6762,7 +6771,7 @@ packages: resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} dev: true - /follow-redirects/1.15.2_debug@4.3.2: + /follow-redirects/1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -6770,8 +6779,6 @@ packages: peerDependenciesMeta: debug: optional: true - dependencies: - debug: 4.3.2 dev: true /foreground-child/2.0.0: @@ -6813,6 +6820,11 @@ packages: mime-types: 2.1.35 dev: true + /format/0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + dev: true + /forwarded/0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -7306,7 +7318,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2_debug@4.3.2 + follow-redirects: 1.15.2 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -8747,6 +8759,12 @@ packages: - supports-color dev: true + /mdast-util-frontmatter/1.0.0: + resolution: {integrity: sha512-7itKvp0arEVNpCktOET/eLFAYaZ+0cNjVtFtIPxgQ5tV+3i+D4SDDTjTzPWl44LT59PC+xdx+glNTawBdF98Mw==} + dependencies: + micromark-extension-frontmatter: 1.0.0 + dev: true + /mdast-util-gfm-autolink-literal/1.0.2: resolution: {integrity: sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg==} dependencies: @@ -8917,6 +8935,14 @@ packages: uvu: 0.5.6 dev: true + /micromark-extension-frontmatter/1.0.0: + resolution: {integrity: sha512-EXjmRnupoX6yYuUJSQhrQ9ggK0iQtQlpi6xeJzVD5xscyAI+giqco5fdymayZhJMbIFecjnE2yz85S9NzIgQpg==} + dependencies: + fault: 2.0.1 + micromark-util-character: 1.1.0 + micromark-util-symbol: 1.0.1 + dev: true + /micromark-extension-gfm-autolink-literal/1.0.3: resolution: {integrity: sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==} dependencies: @@ -10148,6 +10174,15 @@ packages: jsesc: 0.5.0 dev: true + /remark-frontmatter/4.0.1: + resolution: {integrity: sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==} + dependencies: + '@types/mdast': 3.0.10 + mdast-util-frontmatter: 1.0.0 + micromark-extension-frontmatter: 1.0.0 + unified: 10.1.2 + dev: true + /remark-gfm/3.0.1: resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} dependencies: From 8f4caa4537417bea52a551d6ac333825e2639519 Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Sat, 14 Jan 2023 01:57:59 +0000 Subject: [PATCH 152/309] refactor(docs): use remark-compatible plugin Change the `transformBlocks` function, which transforms a markdown str, and instead making it into a `transformMarkdownAst` function, which transforms a Markdown AST. This means we can use the remark/unifiedjs plugin infrastructure, see https://unifiedjs.com/learn/guide/create-a-plugin/ --- packages/mermaid/src/docs.mts | 75 +++++++++++++++---------------- packages/mermaid/src/docs.spec.ts | 50 ++++++++------------- 2 files changed, 55 insertions(+), 70 deletions(-) diff --git a/packages/mermaid/src/docs.mts b/packages/mermaid/src/docs.mts index 7a32e34ee..4fe18001b 100644 --- a/packages/mermaid/src/docs.mts +++ b/packages/mermaid/src/docs.mts @@ -37,7 +37,7 @@ import { JSDOM } from 'jsdom'; import type { Code, Root } from 'mdast'; import { posix, dirname, relative, join } from 'path'; import prettier from 'prettier'; -import { remark as remarkBuilder } from 'remark'; +import { remark } from 'remark'; import remarkFrontmatter from 'remark-frontmatter'; import remarkGfm from 'remark-gfm'; import chokidar from 'chokidar'; @@ -45,11 +45,6 @@ import mm from 'micromatch'; // @ts-ignore No typescript declaration file import flatmap from 'unist-util-flatmap'; -const remark = remarkBuilder() - // support tables and other GitHub Flavored Markdown syntax in markdown - .use(remarkGfm) - .use(remarkFrontmatter, ['yaml']); // support YAML front-matter in Markdown - const MERMAID_MAJOR_VERSION = ( JSON.parse(readFileSync('../mermaid/package.json', 'utf8')).version as string ).split('.')[0]; @@ -205,47 +200,45 @@ const transformIncludeStatements = (file: string, text: string): string => { }; /** - * Transform code blocks in a Markdown file. - * Use remark.parse() to turn the given content (a String) into an AST. + * Remark plugin that transforms code blocks in a Markdown file. + * * For any AST node that is a code block: transform it as needed: * - blocks marked as MERMAID_DIAGRAM_ONLY will be set to a 'mermaid' code block so it will be rendered as (only) a diagram * - blocks marked as MERMAID_EXAMPLE_KEYWORDS will be copied and the original node will be a code only block and the copy with be rendered as the diagram * - blocks marked as BLOCK_QUOTE_KEYWORDS will be transformed into block quotes * - * Convert the AST back to a string and return it. - * - * @param content - the contents of a Markdown file - * @returns the contents with transformed code blocks + * @returns plugin function for Remark */ -export const transformBlocks = (content: string): string => { - const ast: Root = remark.parse(content); - const astWithTransformedBlocks = flatmap(ast, (node: Code) => { - if (node.type !== 'code' || !node.lang) { - return [node]; // no transformation if this is not a code block - } +export function transformMarkdownAst() { + return (tree: Root, _file?: any): Root => { + const astWithTransformedBlocks = flatmap(tree, (node: Code) => { + if (node.type !== 'code' || !node.lang) { + return [node]; // no transformation if this is not a code block + } - if (node.lang === MERMAID_DIAGRAM_ONLY) { - // Set the lang to 'mermaid' so it will be rendered as a diagram. - node.lang = MERMAID_KEYWORD; - return [node]; - } else if (MERMAID_EXAMPLE_KEYWORDS.includes(node.lang)) { - // Return 2 nodes: - // 1. the original node with the language now set to 'mermaid-example' (will be rendered as code), and - // 2. a copy of the original node with the language set to 'mermaid' (will be rendered as a diagram) - node.lang = MERMAID_CODE_ONLY_KEYWORD; - return [node, Object.assign({}, node, { lang: MERMAID_KEYWORD })]; - } + if (node.lang === MERMAID_DIAGRAM_ONLY) { + // Set the lang to 'mermaid' so it will be rendered as a diagram. + node.lang = MERMAID_KEYWORD; + return [node]; + } else if (MERMAID_EXAMPLE_KEYWORDS.includes(node.lang)) { + // Return 2 nodes: + // 1. the original node with the language now set to 'mermaid-example' (will be rendered as code), and + // 2. a copy of the original node with the language set to 'mermaid' (will be rendered as a diagram) + node.lang = MERMAID_CODE_ONLY_KEYWORD; + return [node, Object.assign({}, node, { lang: MERMAID_KEYWORD })]; + } - // Transform these blocks into block quotes. - if (BLOCK_QUOTE_KEYWORDS.includes(node.lang)) { - return [remark.parse(transformToBlockQuote(node.value, node.lang, node.meta))]; - } + // Transform these blocks into block quotes. + if (BLOCK_QUOTE_KEYWORDS.includes(node.lang)) { + return [remark.parse(transformToBlockQuote(node.value, node.lang, node.meta))]; + } - return [node]; // default is to do nothing to the node - }); + return [node]; // default is to do nothing to the node + }); - return remark.stringify(astWithTransformedBlocks); -}; + return astWithTransformedBlocks; + }; +} /** * Transform a markdown file and write the transformed file to the directory for published @@ -263,7 +256,13 @@ export const transformBlocks = (content: string): string => { */ const transformMarkdown = (file: string) => { const doc = injectPlaceholders(transformIncludeStatements(file, readSyncedUTF8file(file))); - let transformed = transformBlocks(doc); + + let transformed = remark() + .use(remarkGfm) + .use(remarkFrontmatter, ['yaml']) // support YAML front-matter in Markdown + .use(transformMarkdownAst) // mermaid project specific plugin + .processSync(doc).toString(); + if (!noHeader) { // Add the header to the start of the file transformed = `${generateHeader(file)}\n${transformed}`; diff --git a/packages/mermaid/src/docs.spec.ts b/packages/mermaid/src/docs.spec.ts index ea5f54d69..5b47146d5 100644 --- a/packages/mermaid/src/docs.spec.ts +++ b/packages/mermaid/src/docs.spec.ts @@ -1,40 +1,20 @@ -import { transformBlocks, transformToBlockQuote } from './docs.mjs'; +import { transformMarkdownAst, transformToBlockQuote } from './docs.mjs'; + import { remark as remarkBuilder } from 'remark'; // import it this way so we can mock it import { vi, afterEach, describe, it, expect } from 'vitest'; -const remark = remarkBuilder(); - -vi.mock('remark', async (importOriginal) => { - const { remark: originalRemarkBuilder } = (await importOriginal()) as { - remark: typeof remarkBuilder; - }; - - // make sure that both `docs.mts` and this test file are using the same remark - // object so that we can mock it - const sharedRemark = originalRemarkBuilder(); - return { - remark: () => sharedRemark, - }; -}); - afterEach(() => { vi.restoreAllMocks(); }); describe('docs.mts', () => { - describe('transformBlocks', () => { - it('uses remark.parse to create the AST for the file ', () => { - const remarkParseSpy = vi - .spyOn(remark, 'parse') - .mockReturnValue({ type: 'root', children: [] }); - const contents = 'Markdown file contents'; - transformBlocks(contents); - expect(remarkParseSpy).toHaveBeenCalledWith(contents); - }); + describe('transformMarkdownAst', () => { describe('checks each AST node', () => { it('does no transformation if there are no code blocks', async () => { const contents = 'Markdown file contents\n'; - const result = transformBlocks(contents); + const result = ( + await remarkBuilder().use(transformMarkdownAst).process(contents) + ).toString(); expect(result).toEqual(contents); }); @@ -46,8 +26,10 @@ describe('docs.mts', () => { const lang_keyword = 'mermaid-nocode'; const contents = beforeCodeLine + '```' + lang_keyword + '\n' + diagram_text + '\n```\n'; - it('changes the language to "mermaid"', () => { - const result = transformBlocks(contents); + it('changes the language to "mermaid"', async () => { + const result = ( + await remarkBuilder().use(transformMarkdownAst).process(contents) + ).toString(); expect(result).toEqual( beforeCodeLine + '\n' + '```' + 'mermaid' + '\n' + diagram_text + '\n```\n' ); @@ -61,8 +43,10 @@ describe('docs.mts', () => { const contents = beforeCodeLine + '```' + lang_keyword + '\n' + diagram_text + '\n```\n'; - it('changes the language to "mermaid-example" and adds a copy of the code block with language = "mermaid"', () => { - const result = transformBlocks(contents); + it('changes the language to "mermaid-example" and adds a copy of the code block with language = "mermaid"', async () => { + const result = ( + await remarkBuilder().use(transformMarkdownAst).process(contents) + ).toString(); expect(result).toEqual( beforeCodeLine + '\n' + @@ -77,12 +61,14 @@ describe('docs.mts', () => { }); }); - it('calls transformToBlockQuote with the node information', () => { + it('calls transformToBlockQuote with the node information', async () => { const lang_keyword = 'note'; const contents = beforeCodeLine + '```' + lang_keyword + '\n' + 'This is the text\n' + '```\n'; - const result = transformBlocks(contents); + const result = ( + await remarkBuilder().use(transformMarkdownAst).process(contents) + ).toString(); expect(result).toEqual(beforeCodeLine + '\n> **Note**\n' + '> This is the text\n'); }); }); From 2f1a521db65d7fe77bcf050c24469db43a573b3d Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Thu, 19 Jan 2023 00:06:58 +0000 Subject: [PATCH 153/309] build(docs): add auto-generated header after YAML Add the auto-generated header after any YAML front-matter blocks. YAML front-matter is normally only valid in Markdown when it's at the beginning of the Markdown file. GitHub/Vitepress may otherwise render it incorrectly. --- packages/mermaid/src/docs.mts | 40 ++++++++++++++++++++++++------- packages/mermaid/src/docs.spec.ts | 14 +++++++---- 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/packages/mermaid/src/docs.mts b/packages/mermaid/src/docs.mts index 4fe18001b..07f393df1 100644 --- a/packages/mermaid/src/docs.mts +++ b/packages/mermaid/src/docs.mts @@ -199,17 +199,32 @@ const transformIncludeStatements = (file: string, text: string): string => { }); }; +/** Options for {@link transformMarkdownAst} */ +interface TransformMarkdownAstOptions { + /** + * Used to indicate the original/source file. + */ + originalFilename: string; + /** If `true`, add a warning that the file is autogenerated */ + addAutogeneratedWarning?: boolean; +} + /** - * Remark plugin that transforms code blocks in a Markdown file. + * Remark plugin that transforms mermaid repo markdown to Vitepress/GFM markdown. * * For any AST node that is a code block: transform it as needed: * - blocks marked as MERMAID_DIAGRAM_ONLY will be set to a 'mermaid' code block so it will be rendered as (only) a diagram * - blocks marked as MERMAID_EXAMPLE_KEYWORDS will be copied and the original node will be a code only block and the copy with be rendered as the diagram * - blocks marked as BLOCK_QUOTE_KEYWORDS will be transformed into block quotes * + * If `addAutogeneratedWarning` is `true`, generates a header stating that this file is autogenerated. + * * @returns plugin function for Remark */ -export function transformMarkdownAst() { +export function transformMarkdownAst({ + originalFilename, + addAutogeneratedWarning, +}: TransformMarkdownAstOptions) { return (tree: Root, _file?: any): Root => { const astWithTransformedBlocks = flatmap(tree, (node: Code) => { if (node.type !== 'code' || !node.lang) { @@ -236,6 +251,17 @@ export function transformMarkdownAst() { return [node]; // default is to do nothing to the node }); + if (addAutogeneratedWarning) { + // Add the header to the start of the file + const headerNode = remark.parse(generateHeader(originalFilename)).children[0]; + if (astWithTransformedBlocks.children[0].type === 'yaml') { + // insert header after the YAML frontmatter if it exists + astWithTransformedBlocks.children.splice(1, 0, headerNode); + } else { + astWithTransformedBlocks.children.unshift(headerNode); + } + } + return astWithTransformedBlocks; }; } @@ -260,13 +286,9 @@ const transformMarkdown = (file: string) => { let transformed = remark() .use(remarkGfm) .use(remarkFrontmatter, ['yaml']) // support YAML front-matter in Markdown - .use(transformMarkdownAst) // mermaid project specific plugin - .processSync(doc).toString(); - - if (!noHeader) { - // Add the header to the start of the file - transformed = `${generateHeader(file)}\n${transformed}`; - } + .use(transformMarkdownAst, { originalFilename: file, addAutogeneratedWarning: !noHeader }) // mermaid project specific plugin + .processSync(doc) + .toString(); if (vitepress && file === 'src/docs/index.md') { // Skip transforming index if vitepress is enabled diff --git a/packages/mermaid/src/docs.spec.ts b/packages/mermaid/src/docs.spec.ts index 5b47146d5..1ce708e93 100644 --- a/packages/mermaid/src/docs.spec.ts +++ b/packages/mermaid/src/docs.spec.ts @@ -7,13 +7,15 @@ afterEach(() => { vi.restoreAllMocks(); }); +const originalFilename = 'example-input-filename.md'; + describe('docs.mts', () => { describe('transformMarkdownAst', () => { describe('checks each AST node', () => { it('does no transformation if there are no code blocks', async () => { const contents = 'Markdown file contents\n'; const result = ( - await remarkBuilder().use(transformMarkdownAst).process(contents) + await remarkBuilder().use(transformMarkdownAst, { originalFilename }).process(contents) ).toString(); expect(result).toEqual(contents); }); @@ -28,7 +30,9 @@ describe('docs.mts', () => { it('changes the language to "mermaid"', async () => { const result = ( - await remarkBuilder().use(transformMarkdownAst).process(contents) + await remarkBuilder() + .use(transformMarkdownAst, { originalFilename }) + .process(contents) ).toString(); expect(result).toEqual( beforeCodeLine + '\n' + '```' + 'mermaid' + '\n' + diagram_text + '\n```\n' @@ -45,7 +49,9 @@ describe('docs.mts', () => { it('changes the language to "mermaid-example" and adds a copy of the code block with language = "mermaid"', async () => { const result = ( - await remarkBuilder().use(transformMarkdownAst).process(contents) + await remarkBuilder() + .use(transformMarkdownAst, { originalFilename }) + .process(contents) ).toString(); expect(result).toEqual( beforeCodeLine + @@ -67,7 +73,7 @@ describe('docs.mts', () => { beforeCodeLine + '```' + lang_keyword + '\n' + 'This is the text\n' + '```\n'; const result = ( - await remarkBuilder().use(transformMarkdownAst).process(contents) + await remarkBuilder().use(transformMarkdownAst, { originalFilename }).process(contents) ).toString(); expect(result).toEqual(beforeCodeLine + '\n> **Note**\n' + '> This is the text\n'); }); From 76c3716b2d070762208968fab2313025612197d0 Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Tue, 3 Jan 2023 06:03:27 +0000 Subject: [PATCH 154/309] docs: add vitepress metadata to flowchart docs Changes the title in Vitepress, as well as using `outline: "deep"` for a better outline/table-of-contents for the page. See https://vitepress.vuejs.org/config/theme-configs#outline for docs on what `outline: "deep"` does. --- docs/syntax/flowchart.md | 5 +++++ packages/mermaid/src/docs/syntax/flowchart.md | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/docs/syntax/flowchart.md b/docs/syntax/flowchart.md index 0ef94d24b..b31b27c47 100644 --- a/docs/syntax/flowchart.md +++ b/docs/syntax/flowchart.md @@ -1,3 +1,8 @@ +--- +title: Flowcharts Syntax +outline: 'deep' # shows all h3 headings in outline in Vitepress +--- + > **Warning** > > ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT. diff --git a/packages/mermaid/src/docs/syntax/flowchart.md b/packages/mermaid/src/docs/syntax/flowchart.md index 9a0e7bc24..4ca3c5466 100644 --- a/packages/mermaid/src/docs/syntax/flowchart.md +++ b/packages/mermaid/src/docs/syntax/flowchart.md @@ -1,3 +1,8 @@ +--- +title: Flowcharts Syntax +outline: 'deep' # shows all h3 headings in outline in Vitepress +--- + # Flowcharts - Basic Syntax All Flowcharts are composed of **nodes**, the geometric shapes and **edges**, the arrows or lines. The mermaid code defines the way that these **nodes** and **edges** are made and interact. From 816f2f512e4ff85d9ce9be8b25f0686815640c23 Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Sun, 22 Jan 2023 19:12:13 +0000 Subject: [PATCH 155/309] build(docs): hide YAML when building for GitHub YAML front-matter is currently only used for Vitepress. Because of that, to avoid confusion, we can remove this YAML front-matter when converting the Markdown in packages/mermaid/src/docs to go into the `docs/` folder for GitHub browsing. --- docs/syntax/flowchart.md | 5 ----- packages/mermaid/src/docs.mts | 23 +++++++++++++++++++++-- packages/mermaid/src/docs.spec.ts | 26 +++++++++++++++++++++++++- 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/docs/syntax/flowchart.md b/docs/syntax/flowchart.md index b31b27c47..0ef94d24b 100644 --- a/docs/syntax/flowchart.md +++ b/docs/syntax/flowchart.md @@ -1,8 +1,3 @@ ---- -title: Flowcharts Syntax -outline: 'deep' # shows all h3 headings in outline in Vitepress ---- - > **Warning** > > ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT. diff --git a/packages/mermaid/src/docs.mts b/packages/mermaid/src/docs.mts index 07f393df1..e221984b3 100644 --- a/packages/mermaid/src/docs.mts +++ b/packages/mermaid/src/docs.mts @@ -207,6 +207,11 @@ interface TransformMarkdownAstOptions { originalFilename: string; /** If `true`, add a warning that the file is autogenerated */ addAutogeneratedWarning?: boolean; + /** + * If `true`, remove the YAML metadata from the Markdown input. + * Generally, YAML metadata is only used for Vitepress. + */ + removeYAML?: boolean; } /** @@ -224,6 +229,7 @@ interface TransformMarkdownAstOptions { export function transformMarkdownAst({ originalFilename, addAutogeneratedWarning, + removeYAML, }: TransformMarkdownAstOptions) { return (tree: Root, _file?: any): Root => { const astWithTransformedBlocks = flatmap(tree, (node: Code) => { @@ -249,7 +255,7 @@ export function transformMarkdownAst({ } return [node]; // default is to do nothing to the node - }); + }) as Root; if (addAutogeneratedWarning) { // Add the header to the start of the file @@ -262,6 +268,14 @@ export function transformMarkdownAst({ } } + if (removeYAML) { + const firstNode = astWithTransformedBlocks.children[0]; + if (firstNode.type == 'yaml') { + // YAML is currently only used for Vitepress metadata, so we should remove it for GFM output + astWithTransformedBlocks.children.shift(); + } + } + return astWithTransformedBlocks; }; } @@ -286,7 +300,12 @@ const transformMarkdown = (file: string) => { let transformed = remark() .use(remarkGfm) .use(remarkFrontmatter, ['yaml']) // support YAML front-matter in Markdown - .use(transformMarkdownAst, { originalFilename: file, addAutogeneratedWarning: !noHeader }) // mermaid project specific plugin + .use(transformMarkdownAst, { + // mermaid project specific plugin + originalFilename: file, + addAutogeneratedWarning: !noHeader, + removeYAML: !noHeader, + }) .processSync(doc) .toString(); diff --git a/packages/mermaid/src/docs.spec.ts b/packages/mermaid/src/docs.spec.ts index 1ce708e93..50feaee6a 100644 --- a/packages/mermaid/src/docs.spec.ts +++ b/packages/mermaid/src/docs.spec.ts @@ -1,6 +1,7 @@ import { transformMarkdownAst, transformToBlockQuote } from './docs.mjs'; -import { remark as remarkBuilder } from 'remark'; // import it this way so we can mock it +import { remark } from 'remark'; // import it this way so we can mock it +import remarkFrontmatter from 'remark-frontmatter'; import { vi, afterEach, describe, it, expect } from 'vitest'; afterEach(() => { @@ -8,6 +9,7 @@ afterEach(() => { }); const originalFilename = 'example-input-filename.md'; +const remarkBuilder = remark().use(remarkFrontmatter, ['yaml']); // support YAML front-matter in Markdown describe('docs.mts', () => { describe('transformMarkdownAst', () => { @@ -79,6 +81,28 @@ describe('docs.mts', () => { }); }); }); + + it('should remove YAML if `removeYAML` is true', async () => { + const contents = `--- +title: Flowcharts Syntax +--- + +This Markdown should be kept. +`; + const withYaml = ( + await remarkBuilder().use(transformMarkdownAst, { originalFilename }).process(contents) + ).toString(); + // no change + expect(withYaml).toEqual(contents); + + const withoutYaml = ( + await remarkBuilder() + .use(transformMarkdownAst, { originalFilename, removeYAML: true }) + .process(contents) + ).toString(); + // no change + expect(withoutYaml).toEqual('This Markdown should be kept.\n'); + }); }); describe('transformToBlockQuote', () => { From e4491136c306d668e0fe77f6dbf2c3d909cc5824 Mon Sep 17 00:00:00 2001 From: sidharthv96 Date: Tue, 24 Jan 2023 07:02:14 +0000 Subject: [PATCH 156/309] Update docs --- docs/misc/integrations.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/misc/integrations.md b/docs/misc/integrations.md index 50f3237cd..c14e4febb 100644 --- a/docs/misc/integrations.md +++ b/docs/misc/integrations.md @@ -95,9 +95,10 @@ They also serve as proof of concept, for the variety of things that can be built ## Editor Plugins -- [Vs Code](https://code.visualstudio.com/) +- [VS Code](https://code.visualstudio.com/) - [Markdown Preview Mermaid Support](https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid) - [Mermaid Preview](https://marketplace.visualstudio.com/items?itemName=vstirbu.vscode-mermaid-preview) + - [Markdown Preview Enhanced](https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced) - [Mermaid Markdown Syntax Highlighting](https://marketplace.visualstudio.com/items?itemName=bpruitt-goddard.mermaid-markdown-syntax-highlighting) - [Mermaid Editor](https://marketplace.visualstudio.com/items?itemName=tomoyukim.vscode-mermaid-editor) - [Mermaid Export](https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.mermaid-export) From fb6ba231d05729bf7f6edb0ec311c3ef2618941d Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 24 Jan 2023 15:59:37 +0530 Subject: [PATCH 157/309] chore: Skip 57-elk test --- cypress/integration/rendering/flowchart-elk.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/integration/rendering/flowchart-elk.spec.js b/cypress/integration/rendering/flowchart-elk.spec.js index 0d4ec4211..6ba95474c 100644 --- a/cypress/integration/rendering/flowchart-elk.spec.js +++ b/cypress/integration/rendering/flowchart-elk.spec.js @@ -284,7 +284,7 @@ _one --> b { htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' } ); }); - it('57-elk: handle nested subgraphs with outgoing links 4', () => { + it.skip('57-elk: handle nested subgraphs with outgoing links 4', () => { imgSnapshotTest( `flowchart-elk LR subgraph A From ead40379637352600e48f2a785a9ac68a5ee1f64 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 24 Jan 2023 16:00:59 +0530 Subject: [PATCH 158/309] chore: Enable 57-elk test --- cypress/integration/rendering/flowchart-elk.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/integration/rendering/flowchart-elk.spec.js b/cypress/integration/rendering/flowchart-elk.spec.js index 6ba95474c..0d4ec4211 100644 --- a/cypress/integration/rendering/flowchart-elk.spec.js +++ b/cypress/integration/rendering/flowchart-elk.spec.js @@ -284,7 +284,7 @@ _one --> b { htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' } ); }); - it.skip('57-elk: handle nested subgraphs with outgoing links 4', () => { + it('57-elk: handle nested subgraphs with outgoing links 4', () => { imgSnapshotTest( `flowchart-elk LR subgraph A From b36e5d0d3ba9fc774e830dd21c2f149277d198c1 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 24 Jan 2023 16:08:43 +0530 Subject: [PATCH 159/309] fix: Remove unnecessary void's. Co-authored-by: Alois Klink --- packages/mermaid/src/mermaid.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/mermaid/src/mermaid.ts b/packages/mermaid/src/mermaid.ts index b859a6a84..6af1a2b0f 100644 --- a/packages/mermaid/src/mermaid.ts +++ b/packages/mermaid/src/mermaid.ts @@ -339,7 +339,8 @@ const contentLoaded = function () { if (mermaid.startOnLoad) { const { startOnLoad } = mermaidAPI.getConfig(); if (startOnLoad) { - void mermaid.init(); + // eslint-disable-next-line no-console + mermaid.init().catch((err) => console.error('Mermaid failed to initialize', err)); } } }; @@ -418,7 +419,7 @@ const parseAsync = (txt: string): Promise => { ); }); executionQueue.push(performCall); - void executeQueue(); + executeQueue().catch(reject); }); }; @@ -451,7 +452,7 @@ const renderAsync = ( ); }); executionQueue.push(performCall); - void executeQueue(); + executeQueue().catch(reject); }); }; From 6792bb94b74147906171ee9aa9578325c411b0af Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 24 Jan 2023 16:11:04 +0530 Subject: [PATCH 160/309] chore: Use logger --- packages/mermaid/src/mermaid.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/mermaid/src/mermaid.ts b/packages/mermaid/src/mermaid.ts index 6af1a2b0f..be06c2167 100644 --- a/packages/mermaid/src/mermaid.ts +++ b/packages/mermaid/src/mermaid.ts @@ -339,8 +339,7 @@ const contentLoaded = function () { if (mermaid.startOnLoad) { const { startOnLoad } = mermaidAPI.getConfig(); if (startOnLoad) { - // eslint-disable-next-line no-console - mermaid.init().catch((err) => console.error('Mermaid failed to initialize', err)); + mermaid.init().catch((err) => log.error('Mermaid failed to initialize', err)); } } }; From c9833dcd794fd50065daf6a26c600151dfb9b4c4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 24 Jan 2023 10:43:54 +0000 Subject: [PATCH 161/309] chore(deps): update pnpm to v7.25.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 620f7dbeb..51c9af8e4 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "9.3.0-rc1", "description": "Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.", "type": "module", - "packageManager": "pnpm@7.25.0", + "packageManager": "pnpm@7.25.1", "keywords": [ "diagram", "markdown", From 26e9b1790b46a020e0160d6b1667204e85c78da1 Mon Sep 17 00:00:00 2001 From: Tom PERRILLAT-COLLOMB Date: Tue, 24 Jan 2023 21:20:11 +0100 Subject: [PATCH 162/309] feat(er): allow multiple constraints on attributes little changes in grammar to get a list of constraints (PK, FK or UK), so little changes in renderer to handle this list --- demos/er.html | 14 ++++++++++++++ packages/mermaid/src/diagrams/er/erRenderer.js | 7 +++++-- .../src/diagrams/er/parser/erDiagram.jison | 11 +++++++++-- .../src/diagrams/er/parser/erDiagram.spec.js | 16 ++++++++++++++++ 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/demos/er.html b/demos/er.html index 34e06acf8..347eb5e13 100644 --- a/demos/er.html +++ b/demos/er.html @@ -71,6 +71,20 @@

+
+      erDiagram
+        "HOSPITAL" {
+          int id PK
+          int doctor_id PK,FK
+          string address UK
+          string name
+          string phone_number
+          string fax_number
+        }
+      
+
+ ``` From dc0a46f742cfce4bb8de7fee9fafa63dfe05ad66 Mon Sep 17 00:00:00 2001 From: Tom PERRILLAT-COLLOMB Date: Wed, 25 Jan 2023 19:40:40 +0100 Subject: [PATCH 171/309] test(er): improve tests on multiple key constraints --- demos/er.html | 4 ++-- docs/syntax/entityRelationshipDiagram.md | 10 ++++----- .../src/diagrams/er/parser/erDiagram.spec.js | 22 ++++++++++++------- .../docs/syntax/entityRelationshipDiagram.md | 6 ++--- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/demos/er.html b/demos/er.html index 634a8f9e5..662b8cbed 100644 --- a/demos/er.html +++ b/demos/er.html @@ -75,7 +75,7 @@ erDiagram "HOSPITAL" { int id PK - int doctor_id PK,FK + int doctor_id PK, FK string address UK string name string phone_number @@ -103,7 +103,7 @@ int age } NAMED-DRIVER { - string carRegistrationNumber PK,FK + string carRegistrationNumber PK, FK string driverLicence PK,FK } MANUFACTURER only one to zero or more CAR : makes diff --git a/docs/syntax/entityRelationshipDiagram.md b/docs/syntax/entityRelationshipDiagram.md index f06af0c0b..9fa5fa517 100644 --- a/docs/syntax/entityRelationshipDiagram.md +++ b/docs/syntax/entityRelationshipDiagram.md @@ -200,7 +200,7 @@ The `type` and `name` values must begin with an alphabetic character and may con #### Attribute Keys and Comments -Attributes may also have a `key` or comment defined. Keys can be `PK`, `FK` or `UK`, for Primary Key, Foreign Key or Unique Key. To specify multiple key constraints on a single attribute, separate them with a comma (e.g., `PK,FK`).. A `comment` is defined by double quotes at the end of an attribute. Comments themselves cannot have double-quote characters in them. +Attributes may also have a `key` or comment defined. Keys can be `PK`, `FK` or `UK`, for Primary Key, Foreign Key or Unique Key. To specify multiple key constraints on a single attribute, separate them with a comma (e.g., `PK, FK`).. A `comment` is defined by double quotes at the end of an attribute. Comments themselves cannot have double-quote characters in them. ```mermaid-example erDiagram @@ -220,8 +220,8 @@ erDiagram int age } NAMED-DRIVER { - string carRegistrationNumber PK,FK - string driverLicence PK,FK + string carRegistrationNumber PK, FK + string driverLicence PK, FK } MANUFACTURER only one to zero or more CAR : makes ``` @@ -244,8 +244,8 @@ erDiagram int age } NAMED-DRIVER { - string carRegistrationNumber PK,FK - string driverLicence PK,FK + string carRegistrationNumber PK, FK + string driverLicence PK, FK } MANUFACTURER only one to zero or more CAR : makes ``` diff --git a/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js b/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js index 2a8f1a28b..40ec28ada 100644 --- a/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js +++ b/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js @@ -191,19 +191,25 @@ describe('when parsing ER diagram it...', function () { }); it('should allow an entity with attributes that have many constraints and comments', function () { - const entity = 'BOOK'; - const attribute1 = 'int customer_number PK,FK "comment"'; - const attribute2 = 'datetime customer_status_start_datetime PK,UK'; - const attribute3 = 'string customer_name'; + const entity = 'CUSTOMER'; + const attribute1 = 'int customer_number PK, FK "comment1"'; + const attribute2 = 'datetime customer_status_start_datetime PK,UK, FK'; + const attribute3 = 'datetime customer_status_end_datetime PK , UK "comment3"'; + const attribute4 = 'string customer_firstname'; + const attribute5 = 'string customer_lastname "comment5"'; erDiagram.parser.parse( - `erDiagram\n${entity} {\n${attribute1} \n\n${attribute2}\n${attribute3}\n}` + `erDiagram\n${entity} {\n${attribute1}\n${attribute2}\n${attribute3}\n${attribute4}\n${attribute5}\n}` ); const entities = erDb.getEntities(); expect(entities[entity].attributes[0].attributeKeyTypeList).toEqual(['PK', 'FK']); - expect(entities[entity].attributes[0].attributeComment).toBe('comment'); - expect(entities[entity].attributes[1].attributeKeyTypeList).toEqual(['PK', 'UK']); - expect(entities[entity].attributes[2].attributeKeyTypeList).toBeUndefined(); + expect(entities[entity].attributes[0].attributeComment).toBe('comment1'); + expect(entities[entity].attributes[1].attributeKeyTypeList).toEqual(['PK', 'UK', 'FK']); + expect(entities[entity].attributes[2].attributeKeyTypeList).toEqual(['PK', 'UK']); + expect(entities[entity].attributes[2].attributeComment).toBe('comment3'); + expect(entities[entity].attributes[3].attributeKeyTypeList).toBeUndefined(); + expect(entities[entity].attributes[4].attributeKeyTypeList).toBeUndefined(); + expect(entities[entity].attributes[4].attributeComment).toBe('comment5'); }); it('should allow an entity with attribute that has a generic type', function () { diff --git a/packages/mermaid/src/docs/syntax/entityRelationshipDiagram.md b/packages/mermaid/src/docs/syntax/entityRelationshipDiagram.md index abce89467..7067a65d9 100644 --- a/packages/mermaid/src/docs/syntax/entityRelationshipDiagram.md +++ b/packages/mermaid/src/docs/syntax/entityRelationshipDiagram.md @@ -146,7 +146,7 @@ The `type` and `name` values must begin with an alphabetic character and may con #### Attribute Keys and Comments -Attributes may also have a `key` or comment defined. Keys can be `PK`, `FK` or `UK`, for Primary Key, Foreign Key or Unique Key. To specify multiple key constraints on a single attribute, separate them with a comma (e.g., `PK,FK`).. A `comment` is defined by double quotes at the end of an attribute. Comments themselves cannot have double-quote characters in them. +Attributes may also have a `key` or comment defined. Keys can be `PK`, `FK` or `UK`, for Primary Key, Foreign Key or Unique Key. To specify multiple key constraints on a single attribute, separate them with a comma (e.g., `PK, FK`).. A `comment` is defined by double quotes at the end of an attribute. Comments themselves cannot have double-quote characters in them. ```mermaid-example erDiagram @@ -166,8 +166,8 @@ erDiagram int age } NAMED-DRIVER { - string carRegistrationNumber PK,FK - string driverLicence PK,FK + string carRegistrationNumber PK, FK + string driverLicence PK, FK } MANUFACTURER only one to zero or more CAR : makes ``` From be332cfdef3e08084f5af54eef2009cb57f7336c Mon Sep 17 00:00:00 2001 From: Tristan F Date: Wed, 25 Jan 2023 15:34:24 -0500 Subject: [PATCH 172/309] docs(readme): update broken twitter badge (From https://github.com/badges/shields/issues/8837): The Twitter API has changed in recent days by closing support for 3rd party apps, breaking the Twitter follow count badge. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a500283c..9fed47a69 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # mermaid -[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/twitter/follow/mermaidjs_?style=social)](https://twitter.com/mermaidjs_) +[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/badge/Social-mermaidjs__-blue?style=social&logo=twitter)](https://twitter.com/mermaidjs_) English | [简体中文](./README.zh-CN.md) From 19e3624e89562b4e83e7f8c9e15c46fd8d39a5ae Mon Sep 17 00:00:00 2001 From: Emerson Bottero Date: Thu, 26 Jan 2023 01:23:41 -0300 Subject: [PATCH 173/309] fix: moment-mini default exporter --- packages/mermaid/src/diagrams/gantt/ganttDb.js | 3 ++- packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts | 3 ++- packages/mermaid/src/diagrams/gantt/ganttRenderer.js | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/mermaid/src/diagrams/gantt/ganttDb.js b/packages/mermaid/src/diagrams/gantt/ganttDb.js index a1c74dd62..28e872471 100644 --- a/packages/mermaid/src/diagrams/gantt/ganttDb.js +++ b/packages/mermaid/src/diagrams/gantt/ganttDb.js @@ -1,4 +1,5 @@ -import moment from 'moment-mini'; +import * as _moment from 'moment-mini'; +const moment = _moment; import { sanitizeUrl } from '@braintree/sanitize-url'; import { log } from '../../logger'; import * as configApi from '../../config'; diff --git a/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts b/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts index 09df96f12..a2ad99567 100644 --- a/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts +++ b/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts @@ -1,5 +1,6 @@ // @ts-nocheck TODO: Fix TS -import moment from 'moment-mini'; +import * as _moment from 'moment-mini'; +const moment = _moment; import ganttDb from './ganttDb'; import { convert } from '../../tests/util'; diff --git a/packages/mermaid/src/diagrams/gantt/ganttRenderer.js b/packages/mermaid/src/diagrams/gantt/ganttRenderer.js index faec35a86..79f129f1c 100644 --- a/packages/mermaid/src/diagrams/gantt/ganttRenderer.js +++ b/packages/mermaid/src/diagrams/gantt/ganttRenderer.js @@ -1,4 +1,5 @@ -import moment from 'moment-mini'; +import * as _moment from 'moment-mini'; +const moment = _moment; import { log } from '../../logger'; import { select, From 003997372eea347283a1f9481591d1c8f158a762 Mon Sep 17 00:00:00 2001 From: ashishjain0512 Date: Thu, 26 Jan 2023 11:48:25 +0000 Subject: [PATCH 174/309] Update docs --- docs/syntax/timeline.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/syntax/timeline.md b/docs/syntax/timeline.md index 882efd499..4e917bc10 100644 --- a/docs/syntax/timeline.md +++ b/docs/syntax/timeline.md @@ -16,7 +16,8 @@ timeline title History of Social Media Platform 2002 : LinkedIn - 2004 : Facebook : Google + 2004 : Facebook + : Google 2005 : Youtube 2006 : Twitter ``` @@ -25,7 +26,8 @@ timeline timeline title History of Social Media Platform 2002 : LinkedIn - 2004 : Facebook : Google + 2004 : Facebook + : Google 2005 : Youtube 2006 : Twitter ``` From 8b4426aebf0a2c44df3aacca7a7f37de02164ebe Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Thu, 26 Jan 2023 16:31:40 +0000 Subject: [PATCH 175/309] build(lint): cache prettier on `pnpm run lint` [Prettier 2.7.0](https://prettier.io/blog/2022/06/14/2.7.0.html) added a `--cache` CLI option to greatly speed up subsequent prettier runs. By default, the cache is stored in `./node_modules/.cache/prettier/.prettier-cache` and uses an `md5` checksum of the contents as the cache-key. On my PC, running `pnpm run lint` used to take 13.9 seconds, but now it only takes 6 seconds. Potential issues ---------------- Although updating Node.JS/Prettier will invalidate the cache, updating or changing prettier plugins won't invalidate the cache. Since we do use `prettier-plugin-jsdoc` in Mermaid, this might cause a minor issue, but CI should catch it. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a1f2828df..f6130fa47 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "build": "pnpm run -r clean && concurrently \"pnpm build:vite\" \"pnpm build:types\"", "dev": "concurrently \"pnpm build:vite --watch\" \"ts-node-esm .vite/server.ts\"", "release": "pnpm build", - "lint": "eslint --cache --ignore-path .gitignore . && pnpm lint:jison && prettier --check .", + "lint": "eslint --cache --ignore-path .gitignore . && pnpm lint:jison && prettier --cache --check .", "lint:fix": "eslint --fix --ignore-path .gitignore . && prettier --write . && ts-node-esm scripts/fixCSpell.ts", "lint:jison": "ts-node-esm ./scripts/jison/lint.mts", "cypress": "cypress run", From a89cb9f0d61f1cdefabf8a1b780f844a303c67aa Mon Sep 17 00:00:00 2001 From: Tristan F Date: Thu, 26 Jan 2023 12:07:44 -0500 Subject: [PATCH 176/309] docs(readme-ch): fix twitter link --- README.zh-CN.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index 6b3e28b19..0f0cef7a8 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -1,6 +1,6 @@ # mermaid -[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/twitter/follow/mermaidjs_?style=social)](https://twitter.com/mermaidjs_) +[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/badge/Social-mermaidjs__-blue?style=social&logo=twitter)](https://twitter.com/mermaidjs_) [English](./README.md) | 简体中文 From 7179f1bcbaabba4250fe18f63396d2ff477df3ab Mon Sep 17 00:00:00 2001 From: Emerson Bottero Date: Thu, 26 Jan 2023 20:55:57 -0300 Subject: [PATCH 177/309] chore: remove moment-mini --- packages/mermaid/package.json | 1 - .../mermaid/src/diagrams/gantt/ganttDb.js | 3 +- .../src/diagrams/gantt/ganttDb.spec.ts | 3 +- .../src/diagrams/gantt/ganttRenderer.js | 3 +- packages/mermaid/src/logger.ts | 2 +- pnpm-lock.yaml | 654 +++++++----------- 6 files changed, 261 insertions(+), 405 deletions(-) diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index f7eff6731..8fcff194f 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -59,7 +59,6 @@ "elkjs": "^0.8.2", "khroma": "^2.0.0", "lodash-es": "^4.17.21", - "moment-mini": "^2.24.0", "non-layered-tidy-tree-layout": "^2.0.2", "stylis": "^4.1.2", "ts-dedent": "^2.2.0", diff --git a/packages/mermaid/src/diagrams/gantt/ganttDb.js b/packages/mermaid/src/diagrams/gantt/ganttDb.js index 28e872471..273a02d58 100644 --- a/packages/mermaid/src/diagrams/gantt/ganttDb.js +++ b/packages/mermaid/src/diagrams/gantt/ganttDb.js @@ -1,5 +1,4 @@ -import * as _moment from 'moment-mini'; -const moment = _moment; +import moment from 'moment'; import { sanitizeUrl } from '@braintree/sanitize-url'; import { log } from '../../logger'; import * as configApi from '../../config'; diff --git a/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts b/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts index a2ad99567..2b0e9f435 100644 --- a/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts +++ b/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts @@ -1,6 +1,5 @@ // @ts-nocheck TODO: Fix TS -import * as _moment from 'moment-mini'; -const moment = _moment; +import moment from 'moment'; import ganttDb from './ganttDb'; import { convert } from '../../tests/util'; diff --git a/packages/mermaid/src/diagrams/gantt/ganttRenderer.js b/packages/mermaid/src/diagrams/gantt/ganttRenderer.js index 79f129f1c..360322b68 100644 --- a/packages/mermaid/src/diagrams/gantt/ganttRenderer.js +++ b/packages/mermaid/src/diagrams/gantt/ganttRenderer.js @@ -1,5 +1,4 @@ -import * as _moment from 'moment-mini'; -const moment = _moment; +import moment from 'moment'; import { log } from '../../logger'; import { select, diff --git a/packages/mermaid/src/logger.ts b/packages/mermaid/src/logger.ts index b1c035e22..8bd46d6db 100644 --- a/packages/mermaid/src/logger.ts +++ b/packages/mermaid/src/logger.ts @@ -2,7 +2,7 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/no-empty-function */ /* eslint-disable no-console */ -import moment from 'moment-mini'; +import moment from 'moment'; export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e2c9758eb..10682814d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,375 +1,261 @@ -lockfileVersion: 5.4-inlineSpecifiers +lockfileVersion: 5.4 importers: .: + specifiers: + '@applitools/eyes-cypress': ^3.27.6 + '@commitlint/cli': ^17.2.0 + '@commitlint/config-conventional': ^17.2.0 + '@cspell/eslint-plugin': ^6.14.2 + '@types/eslint': ^8.4.10 + '@types/express': ^4.17.14 + '@types/js-yaml': ^4.0.5 + '@types/jsdom': ^20.0.1 + '@types/lodash': ^4.14.188 + '@types/mdast': ^3.0.10 + '@types/node': ^18.11.9 + '@types/prettier': ^2.7.1 + '@types/rollup-plugin-visualizer': ^4.2.1 + '@typescript-eslint/eslint-plugin': ^5.48.2 + '@typescript-eslint/parser': ^5.48.2 + '@vitest/coverage-c8': ^0.27.0 + '@vitest/ui': ^0.27.0 + concurrently: ^7.5.0 + coveralls: ^3.1.1 + cypress: ^10.11.0 + cypress-image-snapshot: ^4.0.1 + esbuild: ^0.17.0 + eslint: ^8.32.0 + eslint-config-prettier: ^8.6.0 + eslint-plugin-cypress: ^2.12.1 + eslint-plugin-html: ^7.1.0 + eslint-plugin-jest: ^27.1.5 + eslint-plugin-jsdoc: ^39.6.2 + eslint-plugin-json: ^3.1.0 + eslint-plugin-lodash: ^7.4.0 + eslint-plugin-markdown: ^3.0.0 + eslint-plugin-no-only-tests: ^3.1.0 + eslint-plugin-tsdoc: ^0.2.17 + eslint-plugin-unicorn: ^45.0.0 + express: ^4.18.2 + globby: ^13.1.2 + husky: ^8.0.2 + jest: ^29.3.1 + jison: ^0.4.18 + js-yaml: ^4.1.0 + jsdom: ^20.0.2 + lint-staged: ^13.0.3 + path-browserify: ^1.0.1 + pnpm: ^7.15.0 + prettier: ^2.7.1 + prettier-plugin-jsdoc: ^0.4.2 + rimraf: ^3.0.2 + rollup-plugin-visualizer: ^5.8.3 + start-server-and-test: ^1.14.0 + ts-node: ^10.9.1 + typescript: ^4.8.4 + vite: ^3.2.3 + vitest: ^0.27.1 devDependencies: - '@applitools/eyes-cypress': - specifier: ^3.27.6 - version: 3.27.6 - '@commitlint/cli': - specifier: ^17.2.0 - version: 17.2.0 - '@commitlint/config-conventional': - specifier: ^17.2.0 - version: 17.2.0 - '@cspell/eslint-plugin': - specifier: ^6.14.2 - version: 6.14.2 - '@types/eslint': - specifier: ^8.4.10 - version: 8.4.10 - '@types/express': - specifier: ^4.17.14 - version: 4.17.14 - '@types/js-yaml': - specifier: ^4.0.5 - version: 4.0.5 - '@types/jsdom': - specifier: ^20.0.1 - version: 20.0.1 - '@types/lodash': - specifier: ^4.14.188 - version: 4.14.188 - '@types/mdast': - specifier: ^3.0.10 - version: 3.0.10 - '@types/node': - specifier: ^18.11.9 - version: 18.11.9 - '@types/prettier': - specifier: ^2.7.1 - version: 2.7.1 - '@types/rollup-plugin-visualizer': - specifier: ^4.2.1 - version: 4.2.1 - '@typescript-eslint/eslint-plugin': - specifier: ^5.48.2 - version: 5.48.2_iljmjqxcygjq3saipl7gerxpvi - '@typescript-eslint/parser': - specifier: ^5.48.2 - version: 5.48.2_yygwinqv3a2io74xmwofqb7uka - '@vitest/coverage-c8': - specifier: ^0.27.0 - version: 0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce - '@vitest/ui': - specifier: ^0.27.0 - version: 0.27.1 - concurrently: - specifier: ^7.5.0 - version: 7.5.0 - coveralls: - specifier: ^3.1.1 - version: 3.1.1 - cypress: - specifier: ^10.11.0 - version: 10.11.0 - cypress-image-snapshot: - specifier: ^4.0.1 - version: 4.0.1_bg25yee4qeg7mpleuvd346a3tq - esbuild: - specifier: ^0.17.0 - version: 0.17.0 - eslint: - specifier: ^8.32.0 - version: 8.32.0 - eslint-config-prettier: - specifier: ^8.6.0 - version: 8.6.0_eslint@8.32.0 - eslint-plugin-cypress: - specifier: ^2.12.1 - version: 2.12.1_eslint@8.32.0 - eslint-plugin-html: - specifier: ^7.1.0 - version: 7.1.0 - eslint-plugin-jest: - specifier: ^27.1.5 - version: 27.1.5_5rcd23qw3h5vuffwo2owxb3hw4 - eslint-plugin-jsdoc: - specifier: ^39.6.2 - version: 39.6.2_eslint@8.32.0 - eslint-plugin-json: - specifier: ^3.1.0 - version: 3.1.0 - eslint-plugin-lodash: - specifier: ^7.4.0 - version: 7.4.0_eslint@8.32.0 - eslint-plugin-markdown: - specifier: ^3.0.0 - version: 3.0.0_eslint@8.32.0 - eslint-plugin-no-only-tests: - specifier: ^3.1.0 - version: 3.1.0 - eslint-plugin-tsdoc: - specifier: ^0.2.17 - version: 0.2.17 - eslint-plugin-unicorn: - specifier: ^45.0.0 - version: 45.0.0_eslint@8.32.0 - express: - specifier: ^4.18.2 - version: 4.18.2 - globby: - specifier: ^13.1.2 - version: 13.1.2 - husky: - specifier: ^8.0.2 - version: 8.0.2 - jest: - specifier: ^29.3.1 - version: 29.3.1_odkjkoia5xunhxkdrka32ib6vi - jison: - specifier: ^0.4.18 - version: 0.4.18 - js-yaml: - specifier: ^4.1.0 - version: 4.1.0 - jsdom: - specifier: ^20.0.2 - version: 20.0.2 - lint-staged: - specifier: ^13.0.3 - version: 13.0.3 - path-browserify: - specifier: ^1.0.1 - version: 1.0.1 - pnpm: - specifier: ^7.15.0 - version: 7.15.0 - prettier: - specifier: ^2.7.1 - version: 2.7.1 - prettier-plugin-jsdoc: - specifier: ^0.4.2 - version: 0.4.2_prettier@2.7.1 - rimraf: - specifier: ^3.0.2 - version: 3.0.2 - rollup-plugin-visualizer: - specifier: ^5.8.3 - version: 5.8.3 - start-server-and-test: - specifier: ^1.14.0 - version: 1.14.0 - ts-node: - specifier: ^10.9.1 - version: 10.9.1_cbe7ovvae6zqfnmtgctpgpys54 - typescript: - specifier: ^4.8.4 - version: 4.8.4 - vite: - specifier: ^3.2.3 - version: 3.2.3_@types+node@18.11.9 - vitest: - specifier: ^0.27.1 - version: 0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce + '@applitools/eyes-cypress': 3.27.6 + '@commitlint/cli': 17.2.0 + '@commitlint/config-conventional': 17.2.0 + '@cspell/eslint-plugin': 6.14.2 + '@types/eslint': 8.4.10 + '@types/express': 4.17.14 + '@types/js-yaml': 4.0.5 + '@types/jsdom': 20.0.1 + '@types/lodash': 4.14.188 + '@types/mdast': 3.0.10 + '@types/node': 18.11.9 + '@types/prettier': 2.7.1 + '@types/rollup-plugin-visualizer': 4.2.1 + '@typescript-eslint/eslint-plugin': 5.48.2_iljmjqxcygjq3saipl7gerxpvi + '@typescript-eslint/parser': 5.48.2_yygwinqv3a2io74xmwofqb7uka + '@vitest/coverage-c8': 0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce + '@vitest/ui': 0.27.1 + concurrently: 7.5.0 + coveralls: 3.1.1 + cypress: 10.11.0 + cypress-image-snapshot: 4.0.1_bg25yee4qeg7mpleuvd346a3tq + esbuild: 0.17.0 + eslint: 8.32.0 + eslint-config-prettier: 8.6.0_eslint@8.32.0 + eslint-plugin-cypress: 2.12.1_eslint@8.32.0 + eslint-plugin-html: 7.1.0 + eslint-plugin-jest: 27.1.5_5rcd23qw3h5vuffwo2owxb3hw4 + eslint-plugin-jsdoc: 39.6.2_eslint@8.32.0 + eslint-plugin-json: 3.1.0 + eslint-plugin-lodash: 7.4.0_eslint@8.32.0 + eslint-plugin-markdown: 3.0.0_eslint@8.32.0 + eslint-plugin-no-only-tests: 3.1.0 + eslint-plugin-tsdoc: 0.2.17 + eslint-plugin-unicorn: 45.0.0_eslint@8.32.0 + express: 4.18.2 + globby: 13.1.2 + husky: 8.0.2 + jest: 29.3.1_odkjkoia5xunhxkdrka32ib6vi + jison: 0.4.18 + js-yaml: 4.1.0 + jsdom: 20.0.2 + lint-staged: 13.0.3 + path-browserify: 1.0.1 + pnpm: 7.15.0 + prettier: 2.7.1 + prettier-plugin-jsdoc: 0.4.2_prettier@2.7.1 + rimraf: 3.0.2 + rollup-plugin-visualizer: 5.8.3 + start-server-and-test: 1.14.0 + ts-node: 10.9.1_cbe7ovvae6zqfnmtgctpgpys54 + typescript: 4.8.4 + vite: 3.2.3_@types+node@18.11.9 + vitest: 0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce packages/mermaid: + specifiers: + '@braintree/sanitize-url': ^6.0.0 + '@types/d3': ^7.4.0 + '@types/dompurify': ^2.4.0 + '@types/jsdom': ^20.0.1 + '@types/lodash-es': ^4.17.6 + '@types/micromatch': ^4.0.2 + '@types/prettier': ^2.7.1 + '@types/stylis': ^4.0.2 + '@types/uuid': ^8.3.4 + '@typescript-eslint/eslint-plugin': ^5.42.1 + '@typescript-eslint/parser': ^5.42.1 + chokidar: ^3.5.3 + concurrently: ^7.5.0 + coveralls: ^3.1.1 + cpy-cli: ^4.2.0 + cspell: ^6.14.3 + d3: ^7.0.0 + dagre-d3-es: 7.0.6 + dompurify: 2.4.3 + elkjs: ^0.8.2 + globby: ^13.1.2 + jison: ^0.4.18 + js-base64: ^3.7.2 + jsdom: ^20.0.2 + khroma: ^2.0.0 + lodash-es: ^4.17.21 + micromatch: ^4.0.5 + moment: ^2.29.4 + non-layered-tidy-tree-layout: ^2.0.2 + path-browserify: ^1.0.1 + prettier: ^2.7.1 + remark: ^14.0.2 + remark-frontmatter: ^4.0.1 + remark-gfm: ^3.0.1 + rimraf: ^3.0.2 + start-server-and-test: ^1.14.0 + stylis: ^4.1.2 + ts-dedent: ^2.2.0 + typedoc: ^0.23.18 + typedoc-plugin-markdown: ^3.13.6 + typescript: ^4.8.4 + unist-util-flatmap: ^1.0.0 + uuid: ^9.0.0 + vitepress: ^1.0.0-alpha.31 + vitepress-plugin-search: ^1.0.4-alpha.16 dependencies: - '@braintree/sanitize-url': - specifier: ^6.0.0 - version: 6.0.0 - d3: - specifier: ^7.0.0 - version: 7.6.1 - dagre-d3-es: - specifier: 7.0.6 - version: 7.0.6 - dompurify: - specifier: 2.4.3 - version: 2.4.3 - elkjs: - specifier: ^0.8.2 - version: 0.8.2 - khroma: - specifier: ^2.0.0 - version: 2.0.0 - lodash-es: - specifier: ^4.17.21 - version: 4.17.21 - moment-mini: - specifier: ^2.24.0 - version: 2.29.4 - non-layered-tidy-tree-layout: - specifier: ^2.0.2 - version: 2.0.2 - stylis: - specifier: ^4.1.2 - version: 4.1.2 - ts-dedent: - specifier: ^2.2.0 - version: 2.2.0 - uuid: - specifier: ^9.0.0 - version: 9.0.0 + '@braintree/sanitize-url': 6.0.0 + d3: 7.6.1 + dagre-d3-es: 7.0.6 + dompurify: 2.4.3 + elkjs: 0.8.2 + khroma: 2.0.0 + lodash-es: 4.17.21 + non-layered-tidy-tree-layout: 2.0.2 + stylis: 4.1.2 + ts-dedent: 2.2.0 + uuid: 9.0.0 devDependencies: - '@types/d3': - specifier: ^7.4.0 - version: 7.4.0 - '@types/dompurify': - specifier: ^2.4.0 - version: 2.4.0 - '@types/jsdom': - specifier: ^20.0.1 - version: 20.0.1 - '@types/lodash-es': - specifier: ^4.17.6 - version: 4.17.6 - '@types/micromatch': - specifier: ^4.0.2 - version: 4.0.2 - '@types/prettier': - specifier: ^2.7.1 - version: 2.7.1 - '@types/stylis': - specifier: ^4.0.2 - version: 4.0.2 - '@types/uuid': - specifier: ^8.3.4 - version: 8.3.4 - '@typescript-eslint/eslint-plugin': - specifier: ^5.42.1 - version: 5.42.1_qxgr6oy2qtsmmpo3f6iejuryuq - '@typescript-eslint/parser': - specifier: ^5.42.1 - version: 5.42.1_yygwinqv3a2io74xmwofqb7uka - chokidar: - specifier: ^3.5.3 - version: 3.5.3 - concurrently: - specifier: ^7.5.0 - version: 7.5.0 - coveralls: - specifier: ^3.1.1 - version: 3.1.1 - cpy-cli: - specifier: ^4.2.0 - version: 4.2.0 - cspell: - specifier: ^6.14.3 - version: 6.14.3 - globby: - specifier: ^13.1.2 - version: 13.1.2 - jison: - specifier: ^0.4.18 - version: 0.4.18 - js-base64: - specifier: ^3.7.2 - version: 3.7.2 - jsdom: - specifier: ^20.0.2 - version: 20.0.2 - micromatch: - specifier: ^4.0.5 - version: 4.0.5 - moment: - specifier: ^2.29.4 - version: 2.29.4 - path-browserify: - specifier: ^1.0.1 - version: 1.0.1 - prettier: - specifier: ^2.7.1 - version: 2.7.1 - remark: - specifier: ^14.0.2 - version: 14.0.2 - remark-frontmatter: - specifier: ^4.0.1 - version: 4.0.1 - remark-gfm: - specifier: ^3.0.1 - version: 3.0.1 - rimraf: - specifier: ^3.0.2 - version: 3.0.2 - start-server-and-test: - specifier: ^1.14.0 - version: 1.14.0 - typedoc: - specifier: ^0.23.18 - version: 0.23.18_typescript@4.8.4 - typedoc-plugin-markdown: - specifier: ^3.13.6 - version: 3.13.6_typedoc@0.23.18 - typescript: - specifier: ^4.8.4 - version: 4.8.4 - unist-util-flatmap: - specifier: ^1.0.0 - version: 1.0.0 - vitepress: - specifier: ^1.0.0-alpha.31 - version: 1.0.0-alpha.31_tbpndr44ulefs3hehwpi2mkf2y - vitepress-plugin-search: - specifier: ^1.0.4-alpha.16 - version: 1.0.4-alpha.16_ifjhkyx3os4sbm7zdnvthc52am + '@types/d3': 7.4.0 + '@types/dompurify': 2.4.0 + '@types/jsdom': 20.0.1 + '@types/lodash-es': 4.17.6 + '@types/micromatch': 4.0.2 + '@types/prettier': 2.7.1 + '@types/stylis': 4.0.2 + '@types/uuid': 8.3.4 + '@typescript-eslint/eslint-plugin': 5.42.1_qxgr6oy2qtsmmpo3f6iejuryuq + '@typescript-eslint/parser': 5.42.1_yygwinqv3a2io74xmwofqb7uka + chokidar: 3.5.3 + concurrently: 7.5.0 + coveralls: 3.1.1 + cpy-cli: 4.2.0 + cspell: 6.14.3 + globby: 13.1.2 + jison: 0.4.18 + js-base64: 3.7.2 + jsdom: 20.0.2 + micromatch: 4.0.5 + moment: 2.29.4 + path-browserify: 1.0.1 + prettier: 2.7.1 + remark: 14.0.2 + remark-frontmatter: 4.0.1 + remark-gfm: 3.0.1 + rimraf: 3.0.2 + start-server-and-test: 1.14.0 + typedoc: 0.23.18_typescript@4.8.4 + typedoc-plugin-markdown: 3.13.6_typedoc@0.23.18 + typescript: 4.8.4 + unist-util-flatmap: 1.0.0 + vitepress: 1.0.0-alpha.31_tbpndr44ulefs3hehwpi2mkf2y + vitepress-plugin-search: 1.0.4-alpha.16_4vhf5pdiohzt3iya6parl37qd4 packages/mermaid-example-diagram: + specifiers: + concurrently: ^7.5.0 + rimraf: ^3.0.2 devDependencies: - concurrently: - specifier: ^7.5.0 - version: 7.5.0 - rimraf: - specifier: ^3.0.2 - version: 3.0.2 + concurrently: 7.5.0 + rimraf: 3.0.2 packages/mermaid-mindmap: + specifiers: + '@braintree/sanitize-url': ^6.0.0 + '@types/cytoscape': ^3.19.9 + concurrently: ^7.5.0 + cytoscape: ^3.23.0 + cytoscape-cose-bilkent: ^4.1.0 + cytoscape-fcose: ^2.1.0 + d3: ^7.0.0 + khroma: ^2.0.0 + mermaid: workspace:* + non-layered-tidy-tree-layout: ^2.0.2 + rimraf: ^3.0.2 dependencies: - '@braintree/sanitize-url': - specifier: ^6.0.0 - version: 6.0.0 - cytoscape: - specifier: ^3.23.0 - version: 3.23.0 - cytoscape-cose-bilkent: - specifier: ^4.1.0 - version: 4.1.0_cytoscape@3.23.0 - cytoscape-fcose: - specifier: ^2.1.0 - version: 2.1.0_cytoscape@3.23.0 - d3: - specifier: ^7.0.0 - version: 7.6.1 - khroma: - specifier: ^2.0.0 - version: 2.0.0 - non-layered-tidy-tree-layout: - specifier: ^2.0.2 - version: 2.0.2 + '@braintree/sanitize-url': 6.0.0 + cytoscape: 3.23.0 + cytoscape-cose-bilkent: 4.1.0_cytoscape@3.23.0 + cytoscape-fcose: 2.1.0_cytoscape@3.23.0 + d3: 7.6.1 + khroma: 2.0.0 + non-layered-tidy-tree-layout: 2.0.2 devDependencies: - '@types/cytoscape': - specifier: ^3.19.9 - version: 3.19.9 - concurrently: - specifier: ^7.5.0 - version: 7.5.0 - mermaid: - specifier: workspace:* - version: link:../mermaid - rimraf: - specifier: ^3.0.2 - version: 3.0.2 + '@types/cytoscape': 3.19.9 + concurrently: 7.5.0 + mermaid: link:../mermaid + rimraf: 3.0.2 tests/webpack: + specifiers: + '@mermaid-js/mermaid-mindmap': workspace:* + mermaid: workspace:* + webpack: ^5.74.0 + webpack-cli: ^4.10.0 + webpack-dev-server: ^4.11.1 dependencies: - '@mermaid-js/mermaid-mindmap': - specifier: workspace:* - version: link:../../packages/mermaid-mindmap - mermaid: - specifier: workspace:* - version: link:../../packages/mermaid + '@mermaid-js/mermaid-mindmap': link:../../packages/mermaid-mindmap + mermaid: link:../../packages/mermaid devDependencies: - webpack: - specifier: ^5.74.0 - version: 5.75.0_webpack-cli@4.10.0 - webpack-cli: - specifier: ^4.10.0 - version: 4.10.0_uaydpeuxkjjcxdbyfgk36cjdxi - webpack-dev-server: - specifier: ^4.11.1 - version: 4.11.1_pda42hcaj7d62cr262fr632kue + webpack: 5.75.0_webpack-cli@4.10.0 + webpack-cli: 4.10.0_uaydpeuxkjjcxdbyfgk36cjdxi + webpack-dev-server: 4.11.1_pda42hcaj7d62cr262fr632kue packages: @@ -1348,8 +1234,8 @@ packages: '@cspell/dict-docker': 1.1.3 '@cspell/dict-dotnet': 4.0.0 '@cspell/dict-elixir': 4.0.0 - '@cspell/dict-en-gb': 1.1.33 '@cspell/dict-en_us': 4.1.0 + '@cspell/dict-en-gb': 1.1.33 '@cspell/dict-filetypes': 3.0.0 '@cspell/dict-fonts': 3.0.0 '@cspell/dict-fullstack': 3.0.0 @@ -1396,8 +1282,8 @@ packages: '@cspell/dict-docker': 1.1.3 '@cspell/dict-dotnet': 4.0.0 '@cspell/dict-elixir': 4.0.0 - '@cspell/dict-en-gb': 1.1.33 '@cspell/dict-en_us': 4.1.0 + '@cspell/dict-en-gb': 1.1.33 '@cspell/dict-filetypes': 3.0.0 '@cspell/dict-fonts': 3.0.0 '@cspell/dict-fullstack': 3.0.0 @@ -4109,7 +3995,7 @@ packages: /axios/0.21.4_debug@4.3.2: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.2_debug@4.3.2 transitivePeerDependencies: - debug dev: true @@ -4746,7 +4632,7 @@ packages: dev: true /concat-map/0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} dev: true /concurrently/7.5.0: @@ -4816,8 +4702,8 @@ packages: engines: {node: '>=10'} hasBin: true dependencies: - JSONStream: 1.3.5 is-text-path: 1.0.1 + JSONStream: 1.3.5 lodash: 4.17.21 meow: 8.1.2 split2: 3.2.2 @@ -6917,6 +6803,18 @@ packages: optional: true dev: true + /follow-redirects/1.15.2_debug@4.3.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.2 + dev: true + /foreground-child/2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} engines: {node: '>=8.0.0'} @@ -8324,12 +8222,12 @@ packages: engines: {node: '>=0.4'} hasBin: true dependencies: - JSONSelect: 0.4.0 cjson: 0.3.0 ebnf-parser: 0.1.10 escodegen: 1.3.3 esprima: 1.1.1 jison-lex: 0.3.4 + JSONSelect: 0.4.0 lex-parser: 0.1.4 nomnom: 1.5.2 dev: true @@ -9413,10 +9311,6 @@ packages: ufo: 1.0.1 dev: true - /moment-mini/2.29.4: - resolution: {integrity: sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==} - dev: false - /moment/2.29.4: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} dev: true @@ -11782,39 +11676,6 @@ packages: - terser dev: true - /vite/3.2.3: - resolution: {integrity: sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.15.13 - postcss: 8.4.18 - resolve: 1.22.1 - rollup: 2.79.1 - optionalDependencies: - fsevents: 2.3.2 - dev: true - /vite/3.2.3_@types+node@18.11.9: resolution: {integrity: sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -11916,7 +11777,7 @@ packages: fsevents: 2.3.2 dev: true - /vitepress-plugin-search/1.0.4-alpha.16_ifjhkyx3os4sbm7zdnvthc52am: + /vitepress-plugin-search/1.0.4-alpha.16_4vhf5pdiohzt3iya6parl37qd4: resolution: {integrity: sha512-D+rs7bwzH+IO+7T9NlxvqSOqmSKbN1yHxUoqClTy5JH+DomL3CcrH2TgSvXc2s58ztlc1dC07c7THo4cNjlUAg==} engines: {node: ^14.13.1 || ^16.7.0 || >=18} peerDependencies: @@ -11929,7 +11790,6 @@ packages: '@types/markdown-it': 12.2.3 flexsearch: 0.7.31 markdown-it: 13.0.1 - vite: 3.2.3 vitepress: 1.0.0-alpha.31_tbpndr44ulefs3hehwpi2mkf2y vue: 3.2.45 dev: true From cb1a20264d85e6f5c948b64eae62943647e8c124 Mon Sep 17 00:00:00 2001 From: GavinPen Date: Sat, 28 Jan 2023 17:42:30 +0000 Subject: [PATCH 178/309] Update mindmap.md Minor Improvement to wording --- packages/mermaid/src/docs/syntax/mindmap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mermaid/src/docs/syntax/mindmap.md b/packages/mermaid/src/docs/syntax/mindmap.md index 3b737a572..833f26941 100644 --- a/packages/mermaid/src/docs/syntax/mindmap.md +++ b/packages/mermaid/src/docs/syntax/mindmap.md @@ -55,7 +55,7 @@ In this way we can use a text outline to generate a hierarchical mindmap. ## Different shapes -Mermaids mindmaps can show node using different shapes. When specifying a shape for a node the syntax for the is similar to flowchart nodes, with an id followed by the shape definition and with the text within the shape delimiters. Where possible we try/will try to keep the same shapes as for flowcharts even though they are not all supported from the start. +Mermaid mindmaps can show nodes using different shapes. When specifying a shape for a node the syntax is similar to flowchart nodes, with an id followed by the shape definition and with the text within the shape delimiters. Where possible we try/will try to keep the same shapes as for flowcharts, even though they are not all supported from the start. Mindmap can show the following shapes: From b9bed14cda818b4aaaa0a00c7bcd3c981aaec32b Mon Sep 17 00:00:00 2001 From: sidharthv96 Date: Sat, 28 Jan 2023 19:46:10 +0000 Subject: [PATCH 179/309] Update docs --- docs/syntax/mindmap.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/syntax/mindmap.md b/docs/syntax/mindmap.md index 7e1d9c080..d72de6f10 100644 --- a/docs/syntax/mindmap.md +++ b/docs/syntax/mindmap.md @@ -88,7 +88,7 @@ In this way we can use a text outline to generate a hierarchical mindmap. ## Different shapes -Mermaids mindmaps can show node using different shapes. When specifying a shape for a node the syntax for the is similar to flowchart nodes, with an id followed by the shape definition and with the text within the shape delimiters. Where possible we try/will try to keep the same shapes as for flowcharts even though they are not all supported from the start. +Mermaid mindmaps can show nodes using different shapes. When specifying a shape for a node the syntax is similar to flowchart nodes, with an id followed by the shape definition and with the text within the shape delimiters. Where possible we try/will try to keep the same shapes as for flowcharts, even though they are not all supported from the start. Mindmap can show the following shapes: From df10d649896a660e3b81a7584069d633918401c9 Mon Sep 17 00:00:00 2001 From: Emerson Bottero Date: Sun, 29 Jan 2023 11:24:48 -0300 Subject: [PATCH 180/309] chore: add moment to dependencies --- packages/mermaid/package.json | 2 +- pnpm-lock.yaml | 22 +++++----------------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index 8fcff194f..b990a161a 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -59,6 +59,7 @@ "elkjs": "^0.8.2", "khroma": "^2.0.0", "lodash-es": "^4.17.21", + "moment": "^2.29.4", "non-layered-tidy-tree-layout": "^2.0.2", "stylis": "^4.1.2", "ts-dedent": "^2.2.0", @@ -85,7 +86,6 @@ "js-base64": "^3.7.2", "jsdom": "^20.0.2", "micromatch": "^4.0.5", - "moment": "^2.29.4", "path-browserify": "^1.0.1", "prettier": "^2.7.1", "remark": "^14.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10682814d..20f7a0bba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -167,6 +167,7 @@ importers: elkjs: 0.8.2 khroma: 2.0.0 lodash-es: 4.17.21 + moment: 2.29.4 non-layered-tidy-tree-layout: 2.0.2 stylis: 4.1.2 ts-dedent: 2.2.0 @@ -192,7 +193,6 @@ importers: js-base64: 3.7.2 jsdom: 20.0.2 micromatch: 4.0.5 - moment: 2.29.4 path-browserify: 1.0.1 prettier: 2.7.1 remark: 14.0.2 @@ -3747,10 +3747,8 @@ packages: indent-string: 5.0.0 dev: true - /ajv-formats/2.1.1_ajv@8.11.0: + /ajv-formats/2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 peerDependenciesMeta: ajv: optional: true @@ -6793,16 +6791,6 @@ packages: resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} dev: true - /follow-redirects/1.15.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: true - /follow-redirects/1.15.2_debug@4.3.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} @@ -7352,7 +7340,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2 + follow-redirects: 1.15.2_debug@4.3.2 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -9313,7 +9301,7 @@ packages: /moment/2.29.4: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} - dev: true + dev: false /mri/1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} @@ -10500,7 +10488,7 @@ packages: dependencies: '@types/json-schema': 7.0.11 ajv: 8.11.0 - ajv-formats: 2.1.1_ajv@8.11.0 + ajv-formats: 2.1.1 ajv-keywords: 5.1.0_ajv@8.11.0 dev: true From 4900647bf0fe1fb7e1e4e60acc5bdbdc2c2c01df Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Sun, 29 Jan 2023 20:27:31 +0000 Subject: [PATCH 181/309] ci(lint): show nice error on lint failure Prints a nice error on GitHub Actions if `pnpm run lint` fails. --- .github/workflows/lint.yml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 95e4256b1..a21fbc005 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -37,7 +37,20 @@ jobs: CYPRESS_CACHE_FOLDER: .cache/Cypress - name: Run Linting - run: pnpm run lint + shell: bash + run: | + if ! pnpm run lint; then + # print a nice error message on lint failure + ERROR_MESSAGE='Running `pnpm run lint` failed.' + ERROR_MESSAGE+=' Running `pnpm run lint:fix` may fix this issue. ' + ERROR_MESSAGE+=" If this error doesn't occur on your local machine," + ERROR_MESSAGE+=' make sure your packages are up-to-date by running `pnpm install`.' + ERROR_MESSAGE+=' You may also need to delete your prettier cache by running' + ERROR_MESSAGE+=' `rm ./node_modules/.cache/prettier/.prettier-cache`.' + echo "::error title=Lint failure::${ERROR_MESSAGE}" + # make sure to return an error exitcode so that GitHub actions shows a red-cross + exit 1 + fi - name: Verify Docs id: verifyDocs From c2ec63d4fd9faffcf95fc0318f5939eac5c4da7d Mon Sep 17 00:00:00 2001 From: Tom PERRILLAT-COLLOMB Date: Wed, 25 Jan 2023 23:16:06 +0100 Subject: [PATCH 182/309] feat(er): allow leading underscore for attributes name --- .../src/diagrams/er/parser/erDiagram.jison | 4 +-- .../src/diagrams/er/parser/erDiagram.spec.js | 31 +++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/packages/mermaid/src/diagrams/er/parser/erDiagram.jison b/packages/mermaid/src/diagrams/er/parser/erDiagram.jison index 15ca0c72f..1e3972a3b 100644 --- a/packages/mermaid/src/diagrams/er/parser/erDiagram.jison +++ b/packages/mermaid/src/diagrams/er/parser/erDiagram.jison @@ -32,7 +32,7 @@ accDescr\s*"{"\s* { this.begin("acc_descr_multili \s+ /* skip whitespace in block */ \b((?:PK)|(?:FK)|(?:UK))\b return 'ATTRIBUTE_KEY' (.*?)[~](.*?)*[~] return 'ATTRIBUTE_WORD'; -[A-Za-z][A-Za-z0-9\-_\[\]\(\)]* return 'ATTRIBUTE_WORD' +[A-Za-z_][A-Za-z0-9\-_\[\]\(\)]* return 'ATTRIBUTE_WORD' \"[^"]*\" return 'COMMENT'; [\n]+ /* nothing */ "}" { this.popState(); return 'BLOCK_STOP'; } @@ -81,7 +81,7 @@ start document : /* empty */ { $$ = [] } - | document line {$1.push($2);$$ = $1} + | document line {$1.push($2);$$ = $1} ; line diff --git a/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js b/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js index 40ec28ada..ca497a2ac 100644 --- a/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js +++ b/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js @@ -135,6 +135,37 @@ describe('when parsing ER diagram it...', function () { }); }); + describe('attribute name', () => { + it('should allow alphanumeric characters, dashes, underscores and brackets (not leading chars)', function () { + const entity = 'BOOK'; + const attribute1 = 'string myBookTitle'; + const attribute2 = 'string MYBOOKSUBTITLE_1'; + const attribute3 = 'string author-ref[name](1)'; + + erDiagram.parser.parse( + `erDiagram\n${entity} {\n${attribute1}\n${attribute2}\n${attribute3}\n}` + ); + const entities = erDb.getEntities(); + + expect(Object.keys(entities).length).toBe(1); + expect(entities[entity].attributes.length).toBe(3); + expect(entities[entity].attributes[0].attributeName).toBe('myBookTitle'); + expect(entities[entity].attributes[1].attributeName).toBe('MYBOOKSUBTITLE_1'); + expect(entities[entity].attributes[2].attributeName).toBe('author-ref[name](1)'); + }); + + it('should not allow leading numbers, dashes or brackets', function () { + const entity = 'BOOK'; + const nonLeadingChars = '0-[]()'; + [...nonLeadingChars].forEach((nonLeadingChar) => { + expect(() => { + const attribute = `string ${nonLeadingChar}author`; + erDiagram.parser.parse(`erDiagram\n${entity} {\n${attribute}\n}`); + }).toThrow(); + }); + }); + }); + it('should allow an entity with a single attribute to be defined', function () { const entity = 'BOOK'; const attribute = 'string title'; From 8d6d90021adbc1dd7aa2aab8ce94386658bf16ca Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 5 Feb 2023 11:54:56 +0530 Subject: [PATCH 183/309] Update cypress/integration/rendering/sequencediagram.spec.js --- cypress/integration/rendering/sequencediagram.spec.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/cypress/integration/rendering/sequencediagram.spec.js b/cypress/integration/rendering/sequencediagram.spec.js index 4e22bb99c..1f063c13e 100644 --- a/cypress/integration/rendering/sequencediagram.spec.js +++ b/cypress/integration/rendering/sequencediagram.spec.js @@ -34,10 +34,7 @@ context('Sequence diagram', () => { { sequence: { useMaxWidth: false } } ); cy.get('svg').should((svg) => { - // const height = parseFloat(svg.attr('height')); const width = parseFloat(svg.attr('width')); - // expect(height).to.be.within(920, 971); - // use within because the absolute value can be slightly different depending on the environment ±5% expect(width).to.be.within(830 * 0.95, 830 * 1.05); expect(svg).to.not.have.attr('style'); }); From b3e509b7d4548a7f440b0cabbb1459e1ab0c3ff2 Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Sun, 5 Feb 2023 19:25:57 +0000 Subject: [PATCH 184/309] build(lint): cache eslint with strategy content Cache eslint using `--cache-strategy content` instead of the default `--cache-strategy metadata`. By default, `eslint` uses the file metadata (e.g. modification time) to detect when the cache should be invalidated. However, this is not efficient with `git`, since git constantly changes the modification time, e.g. running `git switch main && git switch original-branch` would not change the file contents, but would change the file mtimes and force eslint to re-lint everything. Using the file contents is slower (~3% for me), but more resilient. See https://eslint.org/docs/latest/use/command-line-interface#--cache-strategy --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f6130fa47..e7cb9bdf0 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "build": "pnpm run -r clean && concurrently \"pnpm build:vite\" \"pnpm build:types\"", "dev": "concurrently \"pnpm build:vite --watch\" \"ts-node-esm .vite/server.ts\"", "release": "pnpm build", - "lint": "eslint --cache --ignore-path .gitignore . && pnpm lint:jison && prettier --cache --check .", + "lint": "eslint --cache --cache-strategy content --ignore-path .gitignore . && pnpm lint:jison && prettier --cache --check .", "lint:fix": "eslint --fix --ignore-path .gitignore . && prettier --write . && ts-node-esm scripts/fixCSpell.ts", "lint:jison": "ts-node-esm ./scripts/jison/lint.mts", "cypress": "cypress run", From 98b21483528b528bd011d7a3a116d633239045c8 Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Sun, 5 Feb 2023 19:01:01 +0000 Subject: [PATCH 185/309] build(pre-commit): cache eslint in pre-commit Run eslint with `--cache` to speed up pre-commit scripts. This was added to the `pnpm run lint` script in b7f9495a (build: add eslint --cache file, 2022-08-27) and doesn't seem to be causing any issues. I haven't enabled `--cache` for `prettier` since as of prettier 2.8.0, their cache invalidation doesn't yet work with prettier plugins. --- .lintstagedrc.mjs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.lintstagedrc.mjs b/.lintstagedrc.mjs index ff1d8c107..ac2623093 100644 --- a/.lintstagedrc.mjs +++ b/.lintstagedrc.mjs @@ -1,5 +1,11 @@ export default { - '!(docs/**/*)*.{ts,js,json,html,md,mts}': ['eslint --fix', 'prettier --write'], + '!(docs/**/*)*.{ts,js,json,html,md,mts}': [ + 'eslint --cache --cache-strategy content --fix', + // don't cache prettier yet, since we use `prettier-plugin-jsdoc`, + // and prettier doesn't invalidate cache on plugin updates" + // https://prettier.io/docs/en/cli.html#--cache + 'prettier --write', + ], 'cSpell.json': ['ts-node-esm scripts/fixCSpell.ts'], '**/*.jison': ['pnpm -w run lint:jison'], }; From ac67794fb29b90906dc2a7890d5b49eddc3aedb1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 6 Feb 2023 00:02:46 +0000 Subject: [PATCH 186/309] fix(deps): update dependency dagre-d3-es to v7.0.8 --- packages/mermaid/package.json | 2 +- pnpm-lock.yaml | 655 +++++++++++++++++++++------------- 2 files changed, 401 insertions(+), 256 deletions(-) diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index b990a161a..3dd6c5af0 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -54,7 +54,7 @@ "dependencies": { "@braintree/sanitize-url": "^6.0.0", "d3": "^7.0.0", - "dagre-d3-es": "7.0.6", + "dagre-d3-es": "7.0.8", "dompurify": "2.4.3", "elkjs": "^0.8.2", "khroma": "^2.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 20f7a0bba..8d2c0a4bd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,261 +1,372 @@ -lockfileVersion: 5.4 +lockfileVersion: 5.4-inlineSpecifiers importers: .: - specifiers: - '@applitools/eyes-cypress': ^3.27.6 - '@commitlint/cli': ^17.2.0 - '@commitlint/config-conventional': ^17.2.0 - '@cspell/eslint-plugin': ^6.14.2 - '@types/eslint': ^8.4.10 - '@types/express': ^4.17.14 - '@types/js-yaml': ^4.0.5 - '@types/jsdom': ^20.0.1 - '@types/lodash': ^4.14.188 - '@types/mdast': ^3.0.10 - '@types/node': ^18.11.9 - '@types/prettier': ^2.7.1 - '@types/rollup-plugin-visualizer': ^4.2.1 - '@typescript-eslint/eslint-plugin': ^5.48.2 - '@typescript-eslint/parser': ^5.48.2 - '@vitest/coverage-c8': ^0.27.0 - '@vitest/ui': ^0.27.0 - concurrently: ^7.5.0 - coveralls: ^3.1.1 - cypress: ^10.11.0 - cypress-image-snapshot: ^4.0.1 - esbuild: ^0.17.0 - eslint: ^8.32.0 - eslint-config-prettier: ^8.6.0 - eslint-plugin-cypress: ^2.12.1 - eslint-plugin-html: ^7.1.0 - eslint-plugin-jest: ^27.1.5 - eslint-plugin-jsdoc: ^39.6.2 - eslint-plugin-json: ^3.1.0 - eslint-plugin-lodash: ^7.4.0 - eslint-plugin-markdown: ^3.0.0 - eslint-plugin-no-only-tests: ^3.1.0 - eslint-plugin-tsdoc: ^0.2.17 - eslint-plugin-unicorn: ^45.0.0 - express: ^4.18.2 - globby: ^13.1.2 - husky: ^8.0.2 - jest: ^29.3.1 - jison: ^0.4.18 - js-yaml: ^4.1.0 - jsdom: ^20.0.2 - lint-staged: ^13.0.3 - path-browserify: ^1.0.1 - pnpm: ^7.15.0 - prettier: ^2.7.1 - prettier-plugin-jsdoc: ^0.4.2 - rimraf: ^3.0.2 - rollup-plugin-visualizer: ^5.8.3 - start-server-and-test: ^1.14.0 - ts-node: ^10.9.1 - typescript: ^4.8.4 - vite: ^3.2.3 - vitest: ^0.27.1 devDependencies: - '@applitools/eyes-cypress': 3.27.6 - '@commitlint/cli': 17.2.0 - '@commitlint/config-conventional': 17.2.0 - '@cspell/eslint-plugin': 6.14.2 - '@types/eslint': 8.4.10 - '@types/express': 4.17.14 - '@types/js-yaml': 4.0.5 - '@types/jsdom': 20.0.1 - '@types/lodash': 4.14.188 - '@types/mdast': 3.0.10 - '@types/node': 18.11.9 - '@types/prettier': 2.7.1 - '@types/rollup-plugin-visualizer': 4.2.1 - '@typescript-eslint/eslint-plugin': 5.48.2_iljmjqxcygjq3saipl7gerxpvi - '@typescript-eslint/parser': 5.48.2_yygwinqv3a2io74xmwofqb7uka - '@vitest/coverage-c8': 0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce - '@vitest/ui': 0.27.1 - concurrently: 7.5.0 - coveralls: 3.1.1 - cypress: 10.11.0 - cypress-image-snapshot: 4.0.1_bg25yee4qeg7mpleuvd346a3tq - esbuild: 0.17.0 - eslint: 8.32.0 - eslint-config-prettier: 8.6.0_eslint@8.32.0 - eslint-plugin-cypress: 2.12.1_eslint@8.32.0 - eslint-plugin-html: 7.1.0 - eslint-plugin-jest: 27.1.5_5rcd23qw3h5vuffwo2owxb3hw4 - eslint-plugin-jsdoc: 39.6.2_eslint@8.32.0 - eslint-plugin-json: 3.1.0 - eslint-plugin-lodash: 7.4.0_eslint@8.32.0 - eslint-plugin-markdown: 3.0.0_eslint@8.32.0 - eslint-plugin-no-only-tests: 3.1.0 - eslint-plugin-tsdoc: 0.2.17 - eslint-plugin-unicorn: 45.0.0_eslint@8.32.0 - express: 4.18.2 - globby: 13.1.2 - husky: 8.0.2 - jest: 29.3.1_odkjkoia5xunhxkdrka32ib6vi - jison: 0.4.18 - js-yaml: 4.1.0 - jsdom: 20.0.2 - lint-staged: 13.0.3 - path-browserify: 1.0.1 - pnpm: 7.15.0 - prettier: 2.7.1 - prettier-plugin-jsdoc: 0.4.2_prettier@2.7.1 - rimraf: 3.0.2 - rollup-plugin-visualizer: 5.8.3 - start-server-and-test: 1.14.0 - ts-node: 10.9.1_cbe7ovvae6zqfnmtgctpgpys54 - typescript: 4.8.4 - vite: 3.2.3_@types+node@18.11.9 - vitest: 0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce + '@applitools/eyes-cypress': + specifier: ^3.27.6 + version: 3.27.6 + '@commitlint/cli': + specifier: ^17.2.0 + version: 17.2.0 + '@commitlint/config-conventional': + specifier: ^17.2.0 + version: 17.2.0 + '@cspell/eslint-plugin': + specifier: ^6.14.2 + version: 6.14.2 + '@types/eslint': + specifier: ^8.4.10 + version: 8.4.10 + '@types/express': + specifier: ^4.17.14 + version: 4.17.14 + '@types/js-yaml': + specifier: ^4.0.5 + version: 4.0.5 + '@types/jsdom': + specifier: ^20.0.1 + version: 20.0.1 + '@types/lodash': + specifier: ^4.14.188 + version: 4.14.188 + '@types/mdast': + specifier: ^3.0.10 + version: 3.0.10 + '@types/node': + specifier: ^18.11.9 + version: 18.11.9 + '@types/prettier': + specifier: ^2.7.1 + version: 2.7.1 + '@types/rollup-plugin-visualizer': + specifier: ^4.2.1 + version: 4.2.1 + '@typescript-eslint/eslint-plugin': + specifier: ^5.48.2 + version: 5.48.2_iljmjqxcygjq3saipl7gerxpvi + '@typescript-eslint/parser': + specifier: ^5.48.2 + version: 5.48.2_yygwinqv3a2io74xmwofqb7uka + '@vitest/coverage-c8': + specifier: ^0.27.0 + version: 0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce + '@vitest/ui': + specifier: ^0.27.0 + version: 0.27.1 + concurrently: + specifier: ^7.5.0 + version: 7.5.0 + coveralls: + specifier: ^3.1.1 + version: 3.1.1 + cypress: + specifier: ^10.11.0 + version: 10.11.0 + cypress-image-snapshot: + specifier: ^4.0.1 + version: 4.0.1_bg25yee4qeg7mpleuvd346a3tq + esbuild: + specifier: ^0.17.0 + version: 0.17.0 + eslint: + specifier: ^8.32.0 + version: 8.32.0 + eslint-config-prettier: + specifier: ^8.6.0 + version: 8.6.0_eslint@8.32.0 + eslint-plugin-cypress: + specifier: ^2.12.1 + version: 2.12.1_eslint@8.32.0 + eslint-plugin-html: + specifier: ^7.1.0 + version: 7.1.0 + eslint-plugin-jest: + specifier: ^27.1.5 + version: 27.1.5_5rcd23qw3h5vuffwo2owxb3hw4 + eslint-plugin-jsdoc: + specifier: ^39.6.2 + version: 39.6.2_eslint@8.32.0 + eslint-plugin-json: + specifier: ^3.1.0 + version: 3.1.0 + eslint-plugin-lodash: + specifier: ^7.4.0 + version: 7.4.0_eslint@8.32.0 + eslint-plugin-markdown: + specifier: ^3.0.0 + version: 3.0.0_eslint@8.32.0 + eslint-plugin-no-only-tests: + specifier: ^3.1.0 + version: 3.1.0 + eslint-plugin-tsdoc: + specifier: ^0.2.17 + version: 0.2.17 + eslint-plugin-unicorn: + specifier: ^45.0.0 + version: 45.0.0_eslint@8.32.0 + express: + specifier: ^4.18.2 + version: 4.18.2 + globby: + specifier: ^13.1.2 + version: 13.1.2 + husky: + specifier: ^8.0.2 + version: 8.0.2 + jest: + specifier: ^29.3.1 + version: 29.3.1_odkjkoia5xunhxkdrka32ib6vi + jison: + specifier: ^0.4.18 + version: 0.4.18 + js-yaml: + specifier: ^4.1.0 + version: 4.1.0 + jsdom: + specifier: ^20.0.2 + version: 20.0.2 + lint-staged: + specifier: ^13.0.3 + version: 13.0.3 + path-browserify: + specifier: ^1.0.1 + version: 1.0.1 + pnpm: + specifier: ^7.15.0 + version: 7.15.0 + prettier: + specifier: ^2.7.1 + version: 2.7.1 + prettier-plugin-jsdoc: + specifier: ^0.4.2 + version: 0.4.2_prettier@2.7.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + rollup-plugin-visualizer: + specifier: ^5.8.3 + version: 5.8.3 + start-server-and-test: + specifier: ^1.14.0 + version: 1.14.0 + ts-node: + specifier: ^10.9.1 + version: 10.9.1_cbe7ovvae6zqfnmtgctpgpys54 + typescript: + specifier: ^4.8.4 + version: 4.8.4 + vite: + specifier: ^3.2.3 + version: 3.2.3_@types+node@18.11.9 + vitest: + specifier: ^0.27.1 + version: 0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce packages/mermaid: - specifiers: - '@braintree/sanitize-url': ^6.0.0 - '@types/d3': ^7.4.0 - '@types/dompurify': ^2.4.0 - '@types/jsdom': ^20.0.1 - '@types/lodash-es': ^4.17.6 - '@types/micromatch': ^4.0.2 - '@types/prettier': ^2.7.1 - '@types/stylis': ^4.0.2 - '@types/uuid': ^8.3.4 - '@typescript-eslint/eslint-plugin': ^5.42.1 - '@typescript-eslint/parser': ^5.42.1 - chokidar: ^3.5.3 - concurrently: ^7.5.0 - coveralls: ^3.1.1 - cpy-cli: ^4.2.0 - cspell: ^6.14.3 - d3: ^7.0.0 - dagre-d3-es: 7.0.6 - dompurify: 2.4.3 - elkjs: ^0.8.2 - globby: ^13.1.2 - jison: ^0.4.18 - js-base64: ^3.7.2 - jsdom: ^20.0.2 - khroma: ^2.0.0 - lodash-es: ^4.17.21 - micromatch: ^4.0.5 - moment: ^2.29.4 - non-layered-tidy-tree-layout: ^2.0.2 - path-browserify: ^1.0.1 - prettier: ^2.7.1 - remark: ^14.0.2 - remark-frontmatter: ^4.0.1 - remark-gfm: ^3.0.1 - rimraf: ^3.0.2 - start-server-and-test: ^1.14.0 - stylis: ^4.1.2 - ts-dedent: ^2.2.0 - typedoc: ^0.23.18 - typedoc-plugin-markdown: ^3.13.6 - typescript: ^4.8.4 - unist-util-flatmap: ^1.0.0 - uuid: ^9.0.0 - vitepress: ^1.0.0-alpha.31 - vitepress-plugin-search: ^1.0.4-alpha.16 dependencies: - '@braintree/sanitize-url': 6.0.0 - d3: 7.6.1 - dagre-d3-es: 7.0.6 - dompurify: 2.4.3 - elkjs: 0.8.2 - khroma: 2.0.0 - lodash-es: 4.17.21 - moment: 2.29.4 - non-layered-tidy-tree-layout: 2.0.2 - stylis: 4.1.2 - ts-dedent: 2.2.0 - uuid: 9.0.0 + '@braintree/sanitize-url': + specifier: ^6.0.0 + version: 6.0.0 + d3: + specifier: ^7.0.0 + version: 7.6.1 + dagre-d3-es: + specifier: 7.0.8 + version: 7.0.8 + dompurify: + specifier: 2.4.3 + version: 2.4.3 + elkjs: + specifier: ^0.8.2 + version: 0.8.2 + khroma: + specifier: ^2.0.0 + version: 2.0.0 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + moment: + specifier: ^2.29.4 + version: 2.29.4 + non-layered-tidy-tree-layout: + specifier: ^2.0.2 + version: 2.0.2 + stylis: + specifier: ^4.1.2 + version: 4.1.2 + ts-dedent: + specifier: ^2.2.0 + version: 2.2.0 + uuid: + specifier: ^9.0.0 + version: 9.0.0 devDependencies: - '@types/d3': 7.4.0 - '@types/dompurify': 2.4.0 - '@types/jsdom': 20.0.1 - '@types/lodash-es': 4.17.6 - '@types/micromatch': 4.0.2 - '@types/prettier': 2.7.1 - '@types/stylis': 4.0.2 - '@types/uuid': 8.3.4 - '@typescript-eslint/eslint-plugin': 5.42.1_qxgr6oy2qtsmmpo3f6iejuryuq - '@typescript-eslint/parser': 5.42.1_yygwinqv3a2io74xmwofqb7uka - chokidar: 3.5.3 - concurrently: 7.5.0 - coveralls: 3.1.1 - cpy-cli: 4.2.0 - cspell: 6.14.3 - globby: 13.1.2 - jison: 0.4.18 - js-base64: 3.7.2 - jsdom: 20.0.2 - micromatch: 4.0.5 - path-browserify: 1.0.1 - prettier: 2.7.1 - remark: 14.0.2 - remark-frontmatter: 4.0.1 - remark-gfm: 3.0.1 - rimraf: 3.0.2 - start-server-and-test: 1.14.0 - typedoc: 0.23.18_typescript@4.8.4 - typedoc-plugin-markdown: 3.13.6_typedoc@0.23.18 - typescript: 4.8.4 - unist-util-flatmap: 1.0.0 - vitepress: 1.0.0-alpha.31_tbpndr44ulefs3hehwpi2mkf2y - vitepress-plugin-search: 1.0.4-alpha.16_4vhf5pdiohzt3iya6parl37qd4 + '@types/d3': + specifier: ^7.4.0 + version: 7.4.0 + '@types/dompurify': + specifier: ^2.4.0 + version: 2.4.0 + '@types/jsdom': + specifier: ^20.0.1 + version: 20.0.1 + '@types/lodash-es': + specifier: ^4.17.6 + version: 4.17.6 + '@types/micromatch': + specifier: ^4.0.2 + version: 4.0.2 + '@types/prettier': + specifier: ^2.7.1 + version: 2.7.1 + '@types/stylis': + specifier: ^4.0.2 + version: 4.0.2 + '@types/uuid': + specifier: ^8.3.4 + version: 8.3.4 + '@typescript-eslint/eslint-plugin': + specifier: ^5.42.1 + version: 5.42.1_qxgr6oy2qtsmmpo3f6iejuryuq + '@typescript-eslint/parser': + specifier: ^5.42.1 + version: 5.42.1_yygwinqv3a2io74xmwofqb7uka + chokidar: + specifier: ^3.5.3 + version: 3.5.3 + concurrently: + specifier: ^7.5.0 + version: 7.5.0 + coveralls: + specifier: ^3.1.1 + version: 3.1.1 + cpy-cli: + specifier: ^4.2.0 + version: 4.2.0 + cspell: + specifier: ^6.14.3 + version: 6.14.3 + globby: + specifier: ^13.1.2 + version: 13.1.2 + jison: + specifier: ^0.4.18 + version: 0.4.18 + js-base64: + specifier: ^3.7.2 + version: 3.7.2 + jsdom: + specifier: ^20.0.2 + version: 20.0.2 + micromatch: + specifier: ^4.0.5 + version: 4.0.5 + path-browserify: + specifier: ^1.0.1 + version: 1.0.1 + prettier: + specifier: ^2.7.1 + version: 2.7.1 + remark: + specifier: ^14.0.2 + version: 14.0.2 + remark-frontmatter: + specifier: ^4.0.1 + version: 4.0.1 + remark-gfm: + specifier: ^3.0.1 + version: 3.0.1 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + start-server-and-test: + specifier: ^1.14.0 + version: 1.14.0 + typedoc: + specifier: ^0.23.18 + version: 0.23.18_typescript@4.8.4 + typedoc-plugin-markdown: + specifier: ^3.13.6 + version: 3.13.6_typedoc@0.23.18 + typescript: + specifier: ^4.8.4 + version: 4.8.4 + unist-util-flatmap: + specifier: ^1.0.0 + version: 1.0.0 + vitepress: + specifier: ^1.0.0-alpha.31 + version: 1.0.0-alpha.31_tbpndr44ulefs3hehwpi2mkf2y + vitepress-plugin-search: + specifier: ^1.0.4-alpha.16 + version: 1.0.4-alpha.16_ifjhkyx3os4sbm7zdnvthc52am packages/mermaid-example-diagram: - specifiers: - concurrently: ^7.5.0 - rimraf: ^3.0.2 devDependencies: - concurrently: 7.5.0 - rimraf: 3.0.2 + concurrently: + specifier: ^7.5.0 + version: 7.5.0 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 packages/mermaid-mindmap: - specifiers: - '@braintree/sanitize-url': ^6.0.0 - '@types/cytoscape': ^3.19.9 - concurrently: ^7.5.0 - cytoscape: ^3.23.0 - cytoscape-cose-bilkent: ^4.1.0 - cytoscape-fcose: ^2.1.0 - d3: ^7.0.0 - khroma: ^2.0.0 - mermaid: workspace:* - non-layered-tidy-tree-layout: ^2.0.2 - rimraf: ^3.0.2 dependencies: - '@braintree/sanitize-url': 6.0.0 - cytoscape: 3.23.0 - cytoscape-cose-bilkent: 4.1.0_cytoscape@3.23.0 - cytoscape-fcose: 2.1.0_cytoscape@3.23.0 - d3: 7.6.1 - khroma: 2.0.0 - non-layered-tidy-tree-layout: 2.0.2 + '@braintree/sanitize-url': + specifier: ^6.0.0 + version: 6.0.0 + cytoscape: + specifier: ^3.23.0 + version: 3.23.0 + cytoscape-cose-bilkent: + specifier: ^4.1.0 + version: 4.1.0_cytoscape@3.23.0 + cytoscape-fcose: + specifier: ^2.1.0 + version: 2.1.0_cytoscape@3.23.0 + d3: + specifier: ^7.0.0 + version: 7.6.1 + khroma: + specifier: ^2.0.0 + version: 2.0.0 + non-layered-tidy-tree-layout: + specifier: ^2.0.2 + version: 2.0.2 devDependencies: - '@types/cytoscape': 3.19.9 - concurrently: 7.5.0 - mermaid: link:../mermaid - rimraf: 3.0.2 + '@types/cytoscape': + specifier: ^3.19.9 + version: 3.19.9 + concurrently: + specifier: ^7.5.0 + version: 7.5.0 + mermaid: + specifier: workspace:* + version: link:../mermaid + rimraf: + specifier: ^3.0.2 + version: 3.0.2 tests/webpack: - specifiers: - '@mermaid-js/mermaid-mindmap': workspace:* - mermaid: workspace:* - webpack: ^5.74.0 - webpack-cli: ^4.10.0 - webpack-dev-server: ^4.11.1 dependencies: - '@mermaid-js/mermaid-mindmap': link:../../packages/mermaid-mindmap - mermaid: link:../../packages/mermaid + '@mermaid-js/mermaid-mindmap': + specifier: workspace:* + version: link:../../packages/mermaid-mindmap + mermaid: + specifier: workspace:* + version: link:../../packages/mermaid devDependencies: - webpack: 5.75.0_webpack-cli@4.10.0 - webpack-cli: 4.10.0_uaydpeuxkjjcxdbyfgk36cjdxi - webpack-dev-server: 4.11.1_pda42hcaj7d62cr262fr632kue + webpack: + specifier: ^5.74.0 + version: 5.75.0_webpack-cli@4.10.0 + webpack-cli: + specifier: ^4.10.0 + version: 4.10.0_uaydpeuxkjjcxdbyfgk36cjdxi + webpack-dev-server: + specifier: ^4.11.1 + version: 4.11.1_pda42hcaj7d62cr262fr632kue packages: @@ -1234,8 +1345,8 @@ packages: '@cspell/dict-docker': 1.1.3 '@cspell/dict-dotnet': 4.0.0 '@cspell/dict-elixir': 4.0.0 - '@cspell/dict-en_us': 4.1.0 '@cspell/dict-en-gb': 1.1.33 + '@cspell/dict-en_us': 4.1.0 '@cspell/dict-filetypes': 3.0.0 '@cspell/dict-fonts': 3.0.0 '@cspell/dict-fullstack': 3.0.0 @@ -1282,8 +1393,8 @@ packages: '@cspell/dict-docker': 1.1.3 '@cspell/dict-dotnet': 4.0.0 '@cspell/dict-elixir': 4.0.0 - '@cspell/dict-en_us': 4.1.0 '@cspell/dict-en-gb': 1.1.33 + '@cspell/dict-en_us': 4.1.0 '@cspell/dict-filetypes': 3.0.0 '@cspell/dict-fonts': 3.0.0 '@cspell/dict-fullstack': 3.0.0 @@ -3747,8 +3858,10 @@ packages: indent-string: 5.0.0 dev: true - /ajv-formats/2.1.1: + /ajv-formats/2.1.1_ajv@8.11.0: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 peerDependenciesMeta: ajv: optional: true @@ -3993,7 +4106,7 @@ packages: /axios/0.21.4_debug@4.3.2: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2_debug@4.3.2 + follow-redirects: 1.15.2 transitivePeerDependencies: - debug dev: true @@ -4700,8 +4813,8 @@ packages: engines: {node: '>=10'} hasBin: true dependencies: - is-text-path: 1.0.1 JSONStream: 1.3.5 + is-text-path: 1.0.1 lodash: 4.17.21 meow: 8.1.2 split2: 3.2.2 @@ -5413,8 +5526,8 @@ packages: d3-zoom: 3.0.0 dev: false - /d3/7.7.0: - resolution: {integrity: sha512-VEwHCMgMjD2WBsxeRGUE18RmzxT9Bn7ghDpzvTEvkLSBAKgTMydJjouZTjspgQfRHpPt/PB3EHWBa6SSyFQq4g==} + /d3/7.8.2: + resolution: {integrity: sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==} engines: {node: '>=12'} dependencies: d3-array: 3.2.0 @@ -5449,10 +5562,10 @@ packages: d3-zoom: 3.0.0 dev: false - /dagre-d3-es/7.0.6: - resolution: {integrity: sha512-CaaE/nZh205ix+Up4xsnlGmpog5GGm81Upi2+/SBHxwNwrccBb3K51LzjZ1U6hgvOlAEUsVWf1xSTzCyKpJ6+Q==} + /dagre-d3-es/7.0.8: + resolution: {integrity: sha512-eykdoYQ4FwCJinEYS0gPL2f2w+BPbSLvnQSJ3Ye1vAoPjdkq6xIMKBv+UkICd3qZE26wBKIn3p+6n0QC7R1LyA==} dependencies: - d3: 7.7.0 + d3: 7.8.2 lodash-es: 4.17.21 dev: false @@ -6791,7 +6904,7 @@ packages: resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} dev: true - /follow-redirects/1.15.2_debug@4.3.2: + /follow-redirects/1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -6799,8 +6912,6 @@ packages: peerDependenciesMeta: debug: optional: true - dependencies: - debug: 4.3.2 dev: true /foreground-child/2.0.0: @@ -7340,7 +7451,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2_debug@4.3.2 + follow-redirects: 1.15.2 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -8210,12 +8321,12 @@ packages: engines: {node: '>=0.4'} hasBin: true dependencies: + JSONSelect: 0.4.0 cjson: 0.3.0 ebnf-parser: 0.1.10 escodegen: 1.3.3 esprima: 1.1.1 jison-lex: 0.3.4 - JSONSelect: 0.4.0 lex-parser: 0.1.4 nomnom: 1.5.2 dev: true @@ -10488,7 +10599,7 @@ packages: dependencies: '@types/json-schema': 7.0.11 ajv: 8.11.0 - ajv-formats: 2.1.1 + ajv-formats: 2.1.1_ajv@8.11.0 ajv-keywords: 5.1.0_ajv@8.11.0 dev: true @@ -11664,6 +11775,39 @@ packages: - terser dev: true + /vite/3.2.3: + resolution: {integrity: sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.15.13 + postcss: 8.4.18 + resolve: 1.22.1 + rollup: 2.79.1 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /vite/3.2.3_@types+node@18.11.9: resolution: {integrity: sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -11765,7 +11909,7 @@ packages: fsevents: 2.3.2 dev: true - /vitepress-plugin-search/1.0.4-alpha.16_4vhf5pdiohzt3iya6parl37qd4: + /vitepress-plugin-search/1.0.4-alpha.16_ifjhkyx3os4sbm7zdnvthc52am: resolution: {integrity: sha512-D+rs7bwzH+IO+7T9NlxvqSOqmSKbN1yHxUoqClTy5JH+DomL3CcrH2TgSvXc2s58ztlc1dC07c7THo4cNjlUAg==} engines: {node: ^14.13.1 || ^16.7.0 || >=18} peerDependencies: @@ -11778,6 +11922,7 @@ packages: '@types/markdown-it': 12.2.3 flexsearch: 0.7.31 markdown-it: 13.0.1 + vite: 3.2.3 vitepress: 1.0.0-alpha.31_tbpndr44ulefs3hehwpi2mkf2y vue: 3.2.45 dev: true From 84d563584f7ba841db2acf5e20228b7d34490110 Mon Sep 17 00:00:00 2001 From: Natasha Jarus Date: Fri, 27 Jan 2023 10:34:42 -0800 Subject: [PATCH 187/309] bugfix: add missing d3 curves to flowchart and docs --- docs/syntax/flowchart.md | 4 ++-- .../diagrams/sequence/sequenceDiagram.spec.js | 10 +++++++++- packages/mermaid/src/docs/syntax/flowchart.md | 4 ++-- packages/mermaid/src/utils.ts | 18 ++++++++++++++++++ 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/docs/syntax/flowchart.md b/docs/syntax/flowchart.md index 0ef94d24b..6ef8a1046 100644 --- a/docs/syntax/flowchart.md +++ b/docs/syntax/flowchart.md @@ -842,8 +842,8 @@ In the example below the style defined in the linkStyle statement will belong to ### Styling line curves It is possible to style the type of curve used for lines between items, if the default method does not meet your needs. -Available curve styles include `basis`, `bump`, `linear`, `monotoneX`, `monotoneY`, `natural`, `step`, `stepAfter`, -and `stepBefore`. +Available curve styles include `basis`, `bumpX`, `bumpY`, `cardinal`, `catmullRom`, `linear`, `monotoneX`, `monotoneY`, +`natural`, `step`, `stepAfter`, and `stepBefore`. In this example, a left-to-right graph uses the `stepBefore` curve style: diff --git a/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js b/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js index c509fdae5..8132a2666 100644 --- a/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js +++ b/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js @@ -52,8 +52,16 @@ vi.mock('d3', () => { curveBasis: 'basis', curveBasisClosed: 'basisClosed', curveBasisOpen: 'basisOpen', - curveLinear: 'linear', + curveBumpX: 'bumpX', + curveBumpY: 'bumpY', + curveBundle: 'bundle', + curveCardinalClosed: 'cardinalClosed', + curveCardinalOpen: 'cardinalOpen', curveCardinal: 'cardinal', + curveCatmullRomClosed: 'catmullRomClosed', + curveCatmullRomOpen: 'catmullRomOpen', + curveCatmullRom: 'catmullRom', + curveLinear: 'linear', curveLinearClosed: 'linearClosed', curveMonotoneX: 'monotoneX', curveMonotoneY: 'monotoneY', diff --git a/packages/mermaid/src/docs/syntax/flowchart.md b/packages/mermaid/src/docs/syntax/flowchart.md index 4ca3c5466..587b3b1fc 100644 --- a/packages/mermaid/src/docs/syntax/flowchart.md +++ b/packages/mermaid/src/docs/syntax/flowchart.md @@ -552,8 +552,8 @@ linkStyle 3 stroke:#ff3,stroke-width:4px,color:red; ### Styling line curves It is possible to style the type of curve used for lines between items, if the default method does not meet your needs. -Available curve styles include `basis`, `bump`, `linear`, `monotoneX`, `monotoneY`, `natural`, `step`, `stepAfter`, -and `stepBefore`. +Available curve styles include `basis`, `bumpX`, `bumpY`, `cardinal`, `catmullRom`, `linear`, `monotoneX`, `monotoneY`, +`natural`, `step`, `stepAfter`, and `stepBefore`. In this example, a left-to-right graph uses the `stepBefore` curve style: diff --git a/packages/mermaid/src/utils.ts b/packages/mermaid/src/utils.ts index 876c81543..76fce1999 100644 --- a/packages/mermaid/src/utils.ts +++ b/packages/mermaid/src/utils.ts @@ -4,6 +4,15 @@ import { curveBasis, curveBasisClosed, curveBasisOpen, + curveBumpX, + curveBumpY, + curveBundle, + curveCardinalClosed, + curveCardinalOpen, + curveCardinal, + curveCatmullRomClosed, + curveCatmullRomOpen, + curveCatmullRom, CurveFactory, curveLinear, curveLinearClosed, @@ -28,6 +37,15 @@ const d3CurveTypes = { curveBasis: curveBasis, curveBasisClosed: curveBasisClosed, curveBasisOpen: curveBasisOpen, + curveBumpX: curveBumpX, + curveBumpY: curveBumpY, + curveBundle: curveBundle, + curveCardinalClosed: curveCardinalClosed, + curveCardinalOpen: curveCardinalOpen, + curveCardinal: curveCardinal, + curveCatmullRomClosed: curveCatmullRomClosed, + curveCatmullRomOpen: curveCatmullRomOpen, + curveCatmullRom: curveCatmullRom, curveLinear: curveLinear, curveLinearClosed: curveLinearClosed, curveMonotoneX: curveMonotoneX, From 73ee9e9a92af9e7f1e789ea7db346b500c2c10f4 Mon Sep 17 00:00:00 2001 From: Omer Rosenbaum <52040016+Omerr@users.noreply.github.com> Date: Tue, 7 Feb 2023 19:45:48 +0200 Subject: [PATCH 188/309] Showcase section to the docs - keepings docs up to date (#4055) * Add a Showcase section to the docs with Swimm * Build docs * Move FAQ to Config * Create showcases page * Build docs * Prettier * feat: Redirect old docs URLs --------- Co-authored-by: Sidharth Vinod --- docs/{misc => config}/faq.md | 2 +- docs/{misc => ecosystem}/integrations.md | 2 +- docs/ecosystem/showcases.md | 9 +++++ .../mermaid/src/docs/.vitepress/config.ts | 11 +++--- .../src/docs/.vitepress/theme/index.ts | 3 -- .../docs/.vitepress/theme/redirect.spec.ts | 37 ++++++++++--------- .../src/docs/.vitepress/theme/redirect.ts | 32 ++++++++-------- .../mermaid/src/docs/{misc => config}/faq.md | 0 .../docs/{misc => ecosystem}/integrations.md | 0 .../mermaid/src/docs/ecosystem/showcases.md | 3 ++ 10 files changed, 57 insertions(+), 42 deletions(-) rename docs/{misc => config}/faq.md (94%) rename docs/{misc => ecosystem}/integrations.md (99%) create mode 100644 docs/ecosystem/showcases.md rename packages/mermaid/src/docs/{misc => config}/faq.md (100%) rename packages/mermaid/src/docs/{misc => ecosystem}/integrations.md (100%) create mode 100644 packages/mermaid/src/docs/ecosystem/showcases.md diff --git a/docs/misc/faq.md b/docs/config/faq.md similarity index 94% rename from docs/misc/faq.md rename to docs/config/faq.md index c7155a5b0..76132762a 100644 --- a/docs/misc/faq.md +++ b/docs/config/faq.md @@ -2,7 +2,7 @@ > > ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT. > -> ## Please edit the corresponding file in [/packages/mermaid/src/docs/misc/faq.md](../../packages/mermaid/src/docs/misc/faq.md). +> ## Please edit the corresponding file in [/packages/mermaid/src/docs/config/faq.md](../../packages/mermaid/src/docs/config/faq.md). # Frequently Asked Questions diff --git a/docs/misc/integrations.md b/docs/ecosystem/integrations.md similarity index 99% rename from docs/misc/integrations.md rename to docs/ecosystem/integrations.md index c14e4febb..33b6b966e 100644 --- a/docs/misc/integrations.md +++ b/docs/ecosystem/integrations.md @@ -2,7 +2,7 @@ > > ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT. > -> ## Please edit the corresponding file in [/packages/mermaid/src/docs/misc/integrations.md](../../packages/mermaid/src/docs/misc/integrations.md). +> ## Please edit the corresponding file in [/packages/mermaid/src/docs/ecosystem/integrations.md](../../packages/mermaid/src/docs/ecosystem/integrations.md). # Integrations diff --git a/docs/ecosystem/showcases.md b/docs/ecosystem/showcases.md new file mode 100644 index 000000000..9f18103b9 --- /dev/null +++ b/docs/ecosystem/showcases.md @@ -0,0 +1,9 @@ +> **Warning** +> +> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT. +> +> ## Please edit the corresponding file in [/packages/mermaid/src/docs/ecosystem/showcases.md](../../packages/mermaid/src/docs/ecosystem/showcases.md). + +# Showcases + +- [Swimm - Up-to-date diagrams with Swimm, the knowledge management tool for code](https://docs.swimm.io/Features/diagrams-and-charts). diff --git a/packages/mermaid/src/docs/.vitepress/config.ts b/packages/mermaid/src/docs/.vitepress/config.ts index 9b5f1547e..a6d1579bb 100644 --- a/packages/mermaid/src/docs/.vitepress/config.ts +++ b/packages/mermaid/src/docs/.vitepress/config.ts @@ -77,8 +77,8 @@ function sidebarAll() { ], }, ...sidebarSyntax(), + ...sidebarEcosystem(), ...sidebarConfig(), - ...sidebarMisc(), ...sidebarCommunity(), ]; } @@ -125,19 +125,20 @@ function sidebarConfig() { { text: 'Accessibility', link: '/config/accessibility' }, { text: 'Mermaid CLI', link: '/config/mermaidCLI' }, { text: 'Advanced usage', link: '/config/n00b-advanced' }, + { text: 'FAQ', link: '/config/faq' }, ], }, ]; } -function sidebarMisc() { +function sidebarEcosystem() { return [ { - text: '📚 Misc', + text: '📚 Ecosystem', collapsible: true, items: [ - { text: 'Use-Cases and Integrations', link: '/misc/integrations' }, - { text: 'FAQ', link: '/misc/faq' }, + { text: 'Showcases', link: '/ecosystem/showcases' }, + { text: 'Use-Cases and Integrations', link: '/ecosystem/integrations' }, ], }, ]; diff --git a/packages/mermaid/src/docs/.vitepress/theme/index.ts b/packages/mermaid/src/docs/.vitepress/theme/index.ts index ef929aa5d..273880d91 100644 --- a/packages/mermaid/src/docs/.vitepress/theme/index.ts +++ b/packages/mermaid/src/docs/.vitepress/theme/index.ts @@ -10,9 +10,6 @@ export default { // register global components app.component('Mermaid', Mermaid); router.onBeforeRouteChange = (to) => { - if (router.route.path !== '/') { - return; - } try { const newPath = getRedirect(to); if (newPath) { diff --git a/packages/mermaid/src/docs/.vitepress/theme/redirect.spec.ts b/packages/mermaid/src/docs/.vitepress/theme/redirect.spec.ts index 6070abee4..ec0404264 100644 --- a/packages/mermaid/src/docs/.vitepress/theme/redirect.spec.ts +++ b/packages/mermaid/src/docs/.vitepress/theme/redirect.spec.ts @@ -5,31 +5,34 @@ import { expect, test } from 'vitest'; import { getRedirect } from './redirect'; test.each([ + // Old docs, localhost ['http://localhost:1234/mermaid/#/flowchart.md', 'syntax/flowchart.html'], ['http://localhost/mermaid/#/flowchart.md', 'syntax/flowchart.html'], - ['https://mermaid-js.github.io/mermaid/#/flowchart.md', 'syntax/flowchart.html'], - ['https://mermaid.js.org/#/flowchart.md', 'syntax/flowchart.html'], - ['https://mermaid-js.github.io/mermaid/#/./flowchart', 'syntax/flowchart.html'], - ['https://mermaid-js.github.io/mermaid/#/flowchart', 'syntax/flowchart.html'], - ['https://mermaid-js.github.io/mermaid/#flowchart', 'syntax/flowchart.html'], - ['https://mermaid-js.github.io/mermaid/#/flowchart', 'syntax/flowchart.html'], - ['https://mermaid-js.github.io/mermaid/#/flowchart.md?id=my-id', 'syntax/flowchart.html#my-id'], - ['https://mermaid-js.github.io/mermaid/#/./flowchart.md?id=my-id', 'syntax/flowchart.html#my-id'], + // Old docs, github pages + ['https://mermaid-js.github.io/mermaid/#/flowchart.md', 'syntax/flowchart.html'], // without dot + ['https://mermaid-js.github.io/mermaid/#/./flowchart', 'syntax/flowchart.html'], // with dot + ['https://mermaid-js.github.io/mermaid/#flowchart', 'syntax/flowchart.html'], // without slash + ['https://mermaid-js.github.io/mermaid/#/flowchart', 'syntax/flowchart.html'], // with slash + ['https://mermaid-js.github.io/mermaid/#/flowchart.md?id=my-id', 'syntax/flowchart.html#my-id'], // with id + ['https://mermaid-js.github.io/mermaid/#/./flowchart.md?id=my-id', 'syntax/flowchart.html#my-id'], // with id and dot [ - 'https://mermaid-js.github.io/mermaid/#/flowchart?another=test&id=my-id&one=more', + 'https://mermaid-js.github.io/mermaid/#/flowchart?another=test&id=my-id&one=more', // with multiple params 'syntax/flowchart.html#my-id', ], - ['https://mermaid-js.github.io/mermaid/#/n00b-advanced', 'config/n00b-advanced.html'], - ['https://mermaid-js.github.io/mermaid/#/n00b-advanced.md', 'config/n00b-advanced.html'], + ['https://mermaid-js.github.io/mermaid/#/n00b-advanced', 'config/n00b-advanced.html'], // without .md + ['https://mermaid-js.github.io/mermaid/#/n00b-advanced.md', 'config/n00b-advanced.html'], // with .md [ - 'https://mermaid-js.github.io/mermaid/#/flowchart?id=a-node-in-the-form-of-a-circle', + 'https://mermaid-js.github.io/mermaid/#/flowchart?id=a-node-in-the-form-of-a-circle', // with id, without .md 'syntax/flowchart.html#a-node-in-the-form-of-a-circle', ], + // Old docs, without base path, new domain + ['https://mermaid.js.org/#/flowchart.md', 'syntax/flowchart.html'], + // New docs, without base path, new domain + ['https://mermaid.js.org/misc/faq.html', 'configure/faq.html'], + [ + 'https://mermaid.js.org/misc/faq.html#frequently-asked-questions', + 'configure/faq.html#frequently-asked-questions', + ], // with hash ])('should process url %s to %s', (link: string, path: string) => { expect(getRedirect(link)).toBe(path); }); - -test('should throw for invalid URL', () => { - // Not mermaid domain - expect(() => getRedirect('https://www.google.com')).toThrowError(); -}); diff --git a/packages/mermaid/src/docs/.vitepress/theme/redirect.ts b/packages/mermaid/src/docs/.vitepress/theme/redirect.ts index 58537b0ef..0109aea10 100644 --- a/packages/mermaid/src/docs/.vitepress/theme/redirect.ts +++ b/packages/mermaid/src/docs/.vitepress/theme/redirect.ts @@ -1,4 +1,4 @@ -export interface Redirect { +interface Redirect { path: string; id?: string; } @@ -7,15 +7,7 @@ export interface Redirect { * Extracts the base slug from the old URL. * @param link - The old URL. */ -const getBaseFile = (link: string): Redirect => { - const url = new URL(link); - if ( - url.hostname !== 'mermaid-js.github.io' && - url.hostname !== 'mermaid.js.org' && - url.hostname !== 'localhost' - ) { - throw new Error('Not mermaidjs url'); - } +const getBaseFile = (url: URL): Redirect => { const [path, params, ...rest] = url.hash .toLowerCase() .replace('.md', '') @@ -32,7 +24,7 @@ const getBaseFile = (link: string): Redirect => { return { path, id }; }; -const redirectMap: Record = { +const idRedirectMap: Record = { '8.6.0_docs': '', accessibility: 'config/theming', breakingchanges: '', @@ -76,15 +68,25 @@ const redirectMap: Record = { 'user-journey': 'syntax/userJourney', }; +const urlRedirectMap: Record = { + '/misc/faq.html': 'configure/faq.html', +}; + /** * * @param link - The old documentation URL. * @returns The new documentation path. */ export const getRedirect = (link: string): string | undefined => { - const { path, id } = getBaseFile(link); - if (!(path in redirectMap)) { - return; + const url = new URL(link); + // Redirects for deprecated vitepress URLs + if (url.pathname in urlRedirectMap) { + return `${urlRedirectMap[url.pathname]}${url.hash}`; + } + + // Redirects for old docs URLs + const { path, id } = getBaseFile(url); + if (path in idRedirectMap) { + return `${idRedirectMap[path]}.html${id ? `#${id}` : ''}`; } - return `${redirectMap[path]}.html${id ? `#${id}` : ''}`; }; diff --git a/packages/mermaid/src/docs/misc/faq.md b/packages/mermaid/src/docs/config/faq.md similarity index 100% rename from packages/mermaid/src/docs/misc/faq.md rename to packages/mermaid/src/docs/config/faq.md diff --git a/packages/mermaid/src/docs/misc/integrations.md b/packages/mermaid/src/docs/ecosystem/integrations.md similarity index 100% rename from packages/mermaid/src/docs/misc/integrations.md rename to packages/mermaid/src/docs/ecosystem/integrations.md diff --git a/packages/mermaid/src/docs/ecosystem/showcases.md b/packages/mermaid/src/docs/ecosystem/showcases.md new file mode 100644 index 000000000..0c756759f --- /dev/null +++ b/packages/mermaid/src/docs/ecosystem/showcases.md @@ -0,0 +1,3 @@ +# Showcases + +- [Swimm - Up-to-date diagrams with Swimm, the knowledge management tool for code](https://docs.swimm.io/Features/diagrams-and-charts). From 6a045db83cea7b98acca475fc984141e893dae10 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Wed, 8 Feb 2023 11:24:09 +0100 Subject: [PATCH 189/309] Fix for e2e issue with mindmap tests, not related to timeline --- packages/mermaid-mindmap/src/svgDraw.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/mermaid-mindmap/src/svgDraw.js b/packages/mermaid-mindmap/src/svgDraw.js index 79eab6e1d..2b1aa021e 100644 --- a/packages/mermaid-mindmap/src/svgDraw.js +++ b/packages/mermaid-mindmap/src/svgDraw.js @@ -206,10 +206,11 @@ export const drawNode = function (elem, node, fullSection, conf) { const section = fullSection % (MAX_SECTIONS - 1); const nodeElem = elem.append('g'); node.section = section; - nodeElem.attr( - 'class', - (node.class ? node.class + ' ' : '') + 'mindmap-node ' + ('section-' + section) - ); + let sectionClass = 'section-' + section; + if (section < 0) { + sectionClass += ' section-root'; + } + nodeElem.attr('class', (node.class ? node.class + ' ' : '') + 'mindmap-node ' + sectionClass); const bkgElem = nodeElem.append('g'); // Create the wrapped text element From 7f254e37e96f13d246ed84832f881fedf2996c65 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Wed, 8 Feb 2023 16:01:29 +0530 Subject: [PATCH 190/309] Cleanup --- .vite/build.ts | 30 +- .vite/server.ts | 5 +- Setup.md | 1755 ----------------- .../diagrams/timeline/diagram-definition.ts | 2 - .../src/diagrams/timeline/mermaidUtils.ts | 72 - .../diagrams/timeline/parser/timeline.jison | 2 +- 6 files changed, 3 insertions(+), 1863 deletions(-) delete mode 100644 Setup.md delete mode 100644 packages/mermaid/src/diagrams/timeline/mermaidUtils.ts diff --git a/.vite/build.ts b/.vite/build.ts index 16f8a8c88..019461c49 100644 --- a/.vite/build.ts +++ b/.vite/build.ts @@ -41,26 +41,6 @@ const packageOptions = { packageName: 'mermaid-mindmap', file: 'detector.ts', }, - // 'mermaid-timeline': { - // name: 'mermaid-timeline', - // packageName: 'mermaid-timeline', - // file: 'detector.ts', - // }, - // 'mermaid-timeline-detector': { - // name: 'mermaid-timeline-detector', - // packageName: 'mermaid-timeline', - // file: 'detector.ts', - // }, - // 'mermaid-example-diagram': { - // name: 'mermaid-example-diagram', - // packageName: 'mermaid-example-diagram', - // file: 'diagram-definition.ts', - // }, - // 'mermaid-example-diagram-detector': { - // name: 'mermaid-example-diagram-detector', - // packageName: 'mermaid-example-diagram', - // file: 'detector.ts', - // }, }; interface BuildOptions { @@ -134,12 +114,7 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions) if (watch && config.build) { config.build.watch = { - include: [ - 'packages/mermaid-mindmap/src/**', - 'packages/mermaid/src/**', - // 'packages/mermaid-example-diagram/src/**', - // 'packages/mermaid-timeline/src/**', - ], + include: ['packages/mermaid-mindmap/src/**', 'packages/mermaid/src/**'], }; } @@ -165,9 +140,6 @@ if (watch) { build(getBuildConfig({ minify: false, watch, core: false, entryName: 'mermaid' })); if (!mermaidOnly) { build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-mindmap' })); - // build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-example-diagram' })); - //build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-timeline' })); - //build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-timeline-detector' })); } } else if (visualize) { await build(getBuildConfig({ minify: false, core: true, entryName: 'mermaid' })); diff --git a/.vite/server.ts b/.vite/server.ts index a0baade33..aced396ec 100644 --- a/.vite/server.ts +++ b/.vite/server.ts @@ -1,6 +1,5 @@ import express, { NextFunction, Request, Response } from 'express'; import { createServer as createViteServer } from 'vite'; -// import { getBuildConfig } from './build'; const cors = (req: Request, res: Response, next: NextFunction) => { res.header('Access-Control-Allow-Origin', '*'); @@ -22,9 +21,8 @@ async function createServer() { app.use(cors); app.use(express.static('./packages/mermaid/dist')); - app.use(express.static('./packages/mermaid-example-diagram/dist')); + // app.use(express.static('./packages/mermaid-example-diagram/dist')); app.use(express.static('./packages/mermaid-mindmap/dist')); - //app.use(express.static('./packages/mermaid-timeline/dist')); app.use(vite.middlewares); app.use(express.static('demos')); app.use(express.static('cypress/platform')); @@ -34,5 +32,4 @@ async function createServer() { }); } -// build(getBuildConfig({ minify: false, watch: true })); createServer(); diff --git a/Setup.md b/Setup.md deleted file mode 100644 index 4d09fcfca..000000000 --- a/Setup.md +++ /dev/null @@ -1,1755 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT. Please edit the corresponding file in src/docs. - - - -## mermaidAPI - -This is the API to be used when optionally handling the integration with the web page, instead of -using the default integration provided by mermaid.js. - -The core of this api is the [**render**][1] function which, given a graph -definition as text, renders the graph/diagram and returns an svg element for the graph. - -It is then up to the user of the API to make use of the svg, either insert it somewhere in the -page or do something completely different. - -In addition to the render function, a number of behavioral configuration options are available. - -## Configuration - -**Configuration methods in Mermaid version 8.6.0 have been updated, to learn more\[[click -here][2]].** - -## **What follows are config instructions for older versions** - -These are the default options which can be overridden with the initialization call like so: - -**Example 1:**
 mermaid.initialize({ flowchart:{ htmlLabels: false } }); 
- -**Example 2:**
  
- -A summary of all options and their defaults is found [here][3]. -A description of each option follows below. - -## theme - -Theme , the CSS style sheet - -| Parameter | Description | Type | Required | Values | -| --------- | --------------- | ------ | -------- | ---------------------------------------------- | -| theme | Built in Themes | string | Optional | 'default', 'forest', 'dark', 'neutral', 'null' | - -**Notes:** To disable any pre-defined mermaid theme, use "null".
 "theme": "forest",
-"themeCSS": ".node rect { fill: red; }" 
- -## fontFamily - -| Parameter | Description | Type | Required | Values | -| ---------- | ------------------------------------------------------ | ------ | -------- | --------------------------- | -| fontFamily | specifies the font to be used in the rendered diagrams | string | Required | Any Possible CSS FontFamily | - -**Notes:** Default value: '"trebuchet ms", verdana, arial, sans-serif;'. - -## logLevel - -| Parameter | Description | Type | Required | Values | -| --------- | ----------------------------------------------------- | ------ | -------- | -------- | --------------------------------------------- | -| logLevel | This option decides the amount of logging to be used. | string | number | Required | 'trace','debug','info','warn','error','fatal' | - -**Notes:** - -- Trace: 0 -- Debug: 1 -- Info: 2 -- Warn: 3 -- Error: 4 -- Fatal: 5 (default) - -## securityLevel - -| Parameter | Description | Type | Required | Values | -| ------------- | --------------------------------- | ------ | -------- | ------------------------------------------ | -| securityLevel | Level of trust for parsed diagram | string | Required | 'sandbox', 'strict', 'loose', 'antiscript' | - -**Notes**: - -- **strict**: (**default**) tags in text are encoded, click functionality is disabled -- **loose**: tags in text are allowed, click functionality is enabled -- **antiscript**: html tags in text are allowed, (only script element is removed), click - functionality is enabled -- **sandbox**: With this security level all rendering takes place in a sandboxed iframe. This - prevent any JavaScript from running in the context. This may hinder interactive functionality - of the diagram like scripts, popups in sequence diagram or links to other tabs/targets etc. - -## startOnLoad - -| Parameter | Description | Type | Required | Values | -| ----------- | -------------------------------------------- | ------- | -------- | ----------- | -| startOnLoad | Dictates whether mermaid starts on Page load | boolean | Required | true, false | - -**Notes:** Default value: true - -## arrowMarkerAbsolute - -| Parameter | Description | Type | Required | Values | -| ------------------- | ---------------------------------------------------------------------------- | ------- | -------- | ----------- | -| arrowMarkerAbsolute | Controls whether or arrow markers in html code are absolute paths or anchors | boolean | Required | true, false | - -**Notes**: - -This matters if you are using base tag settings. - -Default value: false - -## secure - -This option controls which currentConfig keys are considered _secure_ and can only be changed -via call to mermaidAPI.initialize. Calls to mermaidAPI.reinitialize cannot make changes to the -`secure` keys in the current currentConfig. This prevents malicious graph directives from -overriding a site's default security. - -**Notes**: - -Default value: \['secure', 'securityLevel', 'startOnLoad', 'maxTextSize'] - -## deterministicIds - -This option controls if the generated ids of nodes in the SVG are generated randomly or based -on a seed. If set to false, the IDs are generated based on the current date and thus are not -deterministic. This is the default behaviour. - -**Notes**: - -This matters if your files are checked into sourcecontrol e.g. git and should not change unless -content is changed. - -Default value: false - -## deterministicIDSeed - -This option is the optional seed for deterministic ids. if set to undefined but -deterministicIds is true, a simple number iterator is used. You can set this attribute to base -the seed on a static string. - -## flowchart - -The object containing configurations specific for flowcharts - -### diagramPadding - -| Parameter | Description | Type | Required | Values | -| -------------- | ----------------------------------------------- | ------- | -------- | ------------------ | -| diagramPadding | Amount of padding around the diagram as a whole | Integer | Required | Any Positive Value | - -**Notes:** - -The amount of padding around the diagram as a whole so that embedded diagrams have margins, -expressed in pixels - -Default value: 8 - -### htmlLabels - -| Parameter | Description | Type | Required | Values | -| ---------- | -------------------------------------------------------------------------------------------- | ------- | -------- | ----------- | -| htmlLabels | Flag for setting whether or not a html tag should be used for rendering labels on the edges. | boolean | Required | true, false | - -**Notes:** Default value: true. - -### nodeSpacing - -| Parameter | Description | Type | Required | Values | -| ----------- | --------------------------------------------------- | ------- | -------- | ------------------- | -| nodeSpacing | Defines the spacing between nodes on the same level | Integer | Required | Any positive Number | - -**Notes:** - -Pertains to horizontal spacing for TB (top to bottom) or BT (bottom to top) graphs, and the -vertical spacing for LR as well as RL graphs.\*\* - -Default value: 50 - -### rankSpacing - -| Parameter | Description | Type | Required | Values | -| ----------- | ----------------------------------------------------- | ------- | -------- | ------------------- | -| rankSpacing | Defines the spacing between nodes on different levels | Integer | Required | Any Positive Number | - -**Notes**: - -Pertains to vertical spacing for TB (top to bottom) or BT (bottom to top), and the horizontal -spacing for LR as well as RL graphs. - -Default value 50 - -### curve - -| Parameter | Description | Type | Required | Values | -| --------- | -------------------------------------------------- | ------ | -------- | ----------------------------- | -| curve | Defines how mermaid renders curves for flowcharts. | string | Required | 'basis', 'linear', 'cardinal' | - -**Notes:** - -Default Value: 'basis' - -### useMaxWidth - -| Parameter | Description | Type | Required | Values | -| ----------- | ----------- | ------- | -------- | ----------- | -| useMaxWidth | See notes | boolean | 4 | true, false | - -**Notes:** - -When this flag is set the height and width is set to 100% and is then scaling with the -available space if not the absolute space required is used. - -Default value: true - -### defaultRenderer - -| Parameter | Description | Type | Required | Values | -| --------------- | ----------- | ------- | -------- | ----------------------- | -| defaultRenderer | See notes | boolean | 4 | dagre-d3, dagre-wrapper | - -**Notes:** - -Decides which rendering engine that is to be used for the rendering. Legal values are: -dagre-d3 dagre-wrapper - wrapper for dagre implemented in mermaid - -Default value: 'dagre-wrapper' - -## sequence - -The object containing configurations specific for sequence diagrams - -### activationWidth - -| Parameter | Description | Type | Required | Values | -| --------------- | ---------------------------- | ------- | -------- | ------------------ | -| activationWidth | Width of the activation rect | Integer | Required | Any Positive Value | - -**Notes:** Default value :10 - -### diagramMarginX - -| Parameter | Description | Type | Required | Values | -| -------------- | ---------------------------------------------------- | ------- | -------- | ------------------ | -| diagramMarginX | Margin to the right and left of the sequence diagram | Integer | Required | Any Positive Value | - -**Notes:** Default value: 50 - -### diagramMarginY - -| Parameter | Description | Type | Required | Values | -| -------------- | ------------------------------------------------- | ------- | -------- | ------------------ | -| diagramMarginY | Margin to the over and under the sequence diagram | Integer | Required | Any Positive Value | - -**Notes:** Default value: 10 - -### actorMargin - -| Parameter | Description | Type | Required | Values | -| ----------- | --------------------- | ------- | -------- | ------------------ | -| actorMargin | Margin between actors | Integer | Required | Any Positive Value | - -**Notes:** Default value: 50 - -### width - -| Parameter | Description | Type | Required | Values | -| --------- | -------------------- | ------- | -------- | ------------------ | -| width | Width of actor boxes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 150 - -### height - -| Parameter | Description | Type | Required | Values | -| --------- | --------------------- | ------- | -------- | ------------------ | -| height | Height of actor boxes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 65 - -### boxMargin - -| Parameter | Description | Type | Required | Values | -| --------- | ------------------------ | ------- | -------- | ------------------ | -| boxMargin | Margin around loop boxes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 10 - -### boxTextMargin - -| Parameter | Description | Type | Required | Values | -| ------------- | -------------------------------------------- | ------- | -------- | ------------------ | -| boxTextMargin | Margin around the text in loop/alt/opt boxes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 5 - -### noteMargin - -| Parameter | Description | Type | Required | Values | -| ---------- | ------------------- | ------- | -------- | ------------------ | -| noteMargin | margin around notes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 10 - -### messageMargin - -| Parameter | Description | Type | Required | Values | -| ------------- | ---------------------- | ------- | -------- | ------------------ | -| messageMargin | Space between messages | Integer | Required | Any Positive Value | - -**Notes:** Default value: 35 - -### messageAlign - -| Parameter | Description | Type | Required | Values | -| ------------ | --------------------------- | ------ | -------- | ------------------------- | -| messageAlign | Multiline message alignment | string | Required | 'left', 'center', 'right' | - -**Notes:** Default value: 'center' - -### mirrorActors - -| Parameter | Description | Type | Required | Values | -| ------------ | --------------------------- | ------- | -------- | ----------- | -| mirrorActors | Mirror actors under diagram | boolean | Required | true, false | - -**Notes:** Default value: true - -### forceMenus - -| Parameter | Description | Type | Required | Values | -| ---------- | ----------------------------------------------------------------------- | ------- | -------- | ----------- | -| forceMenus | forces actor popup menus to always be visible (to support E2E testing). | Boolean | Required | True, False | - -**Notes:** - -Default value: false. - -### bottomMarginAdj - -| Parameter | Description | Type | Required | Values | -| --------------- | ------------------------------------------ | ------- | -------- | ------------------ | -| bottomMarginAdj | Prolongs the edge of the diagram downwards | Integer | Required | Any Positive Value | - -**Notes:** - -Depending on css styling this might need adjustment. - -Default value: 1 - -### useMaxWidth - -| Parameter | Description | Type | Required | Values | -| ----------- | ----------- | ------- | -------- | ----------- | -| useMaxWidth | See Notes | boolean | Required | true, false | - -**Notes:** When this flag is set to true, the height and width is set to 100% and is then -scaling with the available space. If set to false, the absolute space required is used. - -Default value: true - -### rightAngles - -| Parameter | Description | Type | Required | Values | -| ----------- | ------------------------------------ | ------- | -------- | ----------- | -| rightAngles | display curve arrows as right angles | boolean | Required | true, false | - -**Notes:** - -This will display arrows that start and begin at the same node as right angles, rather than a -curve - -Default value: false - -### showSequenceNumbers - -| Parameter | Description | Type | Required | Values | -| ------------------- | ------------------------------- | ------- | -------- | ----------- | -| showSequenceNumbers | This will show the node numbers | boolean | Required | true, false | - -**Notes:** Default value: false - -### actorFontSize - -| Parameter | Description | Type | Required | Values | -| ------------- | -------------------------------------------------- | ------- | -------- | ------------------ | -| actorFontSize | This sets the font size of the actor's description | Integer | Require | Any Positive Value | - -**Notes:** **Default value 14**.. - -### actorFontFamily - -| Parameter | Description | Type | Required | Values | -| --------------- | ---------------------------------------------------- | ------ | -------- | --------------------------- | -| actorFontFamily | This sets the font family of the actor's description | string | Required | Any Possible CSS FontFamily | - -**Notes:** Default value: "'Open Sans", sans-serif' - -### actorFontWeight - -This sets the font weight of the actor's description - -**Notes:** Default value: 400. - -### noteFontSize - -| Parameter | Description | Type | Required | Values | -| ------------ | ----------------------------------------------- | ------- | -------- | ------------------ | -| noteFontSize | This sets the font size of actor-attached notes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 14 - -### noteFontFamily - -| Parameter | Description | Type | Required | Values | -| -------------- | -------------------------------------------------- | ------ | -------- | --------------------------- | -| noteFontFamily | This sets the font family of actor-attached notes. | string | Required | Any Possible CSS FontFamily | - -**Notes:** Default value: ''"trebuchet ms", verdana, arial, sans-serif' - -### noteFontWeight - -This sets the font weight of the note's description - -**Notes:** Default value: 400 - -### noteAlign - -| Parameter | Description | Type | Required | Values | -| --------- | ---------------------------------------------------- | ------ | -------- | ------------------------- | -| noteAlign | This sets the text alignment of actor-attached notes | string | required | 'left', 'center', 'right' | - -**Notes:** Default value: 'center' - -### messageFontSize - -| Parameter | Description | Type | Required | Values | -| --------------- | ----------------------------------------- | ------- | -------- | ------------------- | -| messageFontSize | This sets the font size of actor messages | Integer | Required | Any Positive Number | - -**Notes:** Default value: 16 - -### messageFontFamily - -| Parameter | Description | Type | Required | Values | -| ----------------- | ------------------------------------------- | ------ | -------- | --------------------------- | -| messageFontFamily | This sets the font family of actor messages | string | Required | Any Possible CSS FontFamily | - -**Notes:** Default value: '"trebuchet ms", verdana, arial, sans-serif' - -### messageFontWeight - -This sets the font weight of the message's description - -**Notes:** Default value: 400. - -### wrap - -This sets the auto-wrap state for the diagram - -**Notes:** Default value: false. - -### wrapPadding - -This sets the auto-wrap padding for the diagram (sides only) - -**Notes:** Default value: 0. - -### labelBoxWidth - -This sets the width of the loop-box (loop, alt, opt, par) - -**Notes:** Default value: 50. - -### labelBoxHeight - -This sets the height of the loop-box (loop, alt, opt, par) - -**Notes:** Default value: 20. - -## gantt - -The object containing configurations specific for gantt diagrams - -### titleTopMargin - -### titleTopMargin - -| Parameter | Description | Type | Required | Values | -| -------------- | ---------------------------------------------- | ------- | -------- | ------------------ | -| titleTopMargin | Margin top for the text over the gantt diagram | Integer | Required | Any Positive Value | - -**Notes:** Default value: 25 - -### barHeight - -| Parameter | Description | Type | Required | Values | -| --------- | ----------------------------------- | ------- | -------- | ------------------ | -| barHeight | The height of the bars in the graph | Integer | Required | Any Positive Value | - -**Notes:** Default value: 20 - -### barGap - -| Parameter | Description | Type | Required | Values | -| --------- | ---------------------------------------------------------------- | ------- | -------- | ------------------ | -| barGap | The margin between the different activities in the gantt diagram | Integer | Optional | Any Positive Value | - -**Notes:** Default value: 4 - -### topPadding - -| Parameter | Description | Type | Required | Values | -| ---------- | -------------------------------------------------------------------------- | ------- | -------- | ------------------ | -| topPadding | Margin between title and gantt diagram and between axis and gantt diagram. | Integer | Required | Any Positive Value | - -**Notes:** Default value: 50 - -### rightPadding - -| Parameter | Description | Type | Required | Values | -| ------------ | ----------------------------------------------------------------------- | ------- | -------- | ------------------ | -| rightPadding | The space allocated for the section name to the right of the activities | Integer | Required | Any Positive Value | - -**Notes:** Default value: 75 - -### leftPadding - -| Parameter | Description | Type | Required | Values | -| ----------- | ---------------------------------------------------------------------- | ------- | -------- | ------------------ | -| leftPadding | The space allocated for the section name to the left of the activities | Integer | Required | Any Positive Value | - -**Notes:** Default value: 75 - -### gridLineStartPadding - -| Parameter | Description | Type | Required | Values | -| -------------------- | -------------------------------------------- | ------- | -------- | ------------------ | -| gridLineStartPadding | Vertical starting position of the grid lines | Integer | Required | Any Positive Value | - -**Notes:** Default value: 35 - -### fontSize - -| Parameter | Description | Type | Required | Values | -| --------- | ----------- | ------- | -------- | ------------------ | -| fontSize | Font size | Integer | Required | Any Positive Value | - -**Notes:** Default value: 11 - -### sectionFontSize - -| Parameter | Description | Type | Required | Values | -| --------------- | ---------------------- | ------- | -------- | ------------------ | -| sectionFontSize | Font size for sections | Integer | Required | Any Positive Value | - -**Notes:** Default value: 11 - -### numberSectionStyles - -| Parameter | Description | Type | Required | Values | -| ------------------- | ---------------------------------------- | ------- | -------- | ------------------ | -| numberSectionStyles | The number of alternating section styles | Integer | 4 | Any Positive Value | - -**Notes:** Default value: 4 - -### axisFormat - -| Parameter | Description | Type | Required | Values | -| ---------- | --------------------------- | ---- | -------- | ---------------- | -| axisFormat | Datetime format of the axis | 3 | Required | Date in yy-mm-dd | - -**Notes:** - -This might need adjustment to match your locale and preferences - -Default value: '%Y-%m-%d'. - -### useMaxWidth - -| Parameter | Description | Type | Required | Values | -| ----------- | ----------- | ------- | -------- | ----------- | -| useMaxWidth | See notes | boolean | 4 | true, false | - -**Notes:** - -When this flag is set the height and width is set to 100% and is then scaling with the -available space if not the absolute space required is used. - -Default value: true - -### topAxis - -| Parameter | Description | Type | Required | Values | -| --------- | ----------- | ------- | -------- | ----------- | -| topAxis | See notes | Boolean | 4 | True, False | - -**Notes:** when this flag is set date labels will be added to the top of the chart - -**Default value false**. - -## journey - -The object containing configurations specific for journey diagrams - -### diagramMarginX - -| Parameter | Description | Type | Required | Values | -| -------------- | ---------------------------------------------------- | ------- | -------- | ------------------ | -| diagramMarginX | Margin to the right and left of the sequence diagram | Integer | Required | Any Positive Value | - -**Notes:** Default value: 50 - -### diagramMarginY - -| Parameter | Description | Type | Required | Values | -| -------------- | -------------------------------------------------- | ------- | -------- | ------------------ | -| diagramMarginY | Margin to the over and under the sequence diagram. | Integer | Required | Any Positive Value | - -**Notes:** Default value: 10 - -### leftMargin - -| Parameter | Description | Type | Required | Values | -| ----------- | --------------------- | ------- | -------- | ------------------ | -| actorMargin | Margin between actors | Integer | Required | Any Positive Value | - -**Notes:** Default value: 50 - -### width - -| Parameter | Description | Type | Required | Values | -| --------- | -------------------- | ------- | -------- | ------------------ | -| width | Width of actor boxes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 150 - -### height - -| Parameter | Description | Type | Required | Values | -| --------- | --------------------- | ------- | -------- | ------------------ | -| height | Height of actor boxes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 65 - -### boxMargin - -| Parameter | Description | Type | Required | Values | -| --------- | ------------------------ | ------- | -------- | ------------------ | -| boxMargin | Margin around loop boxes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 10 - -### boxTextMargin - -| Parameter | Description | Type | Required | Values | -| ------------- | -------------------------------------------- | ------- | -------- | ------------------ | -| boxTextMargin | Margin around the text in loop/alt/opt boxes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 5 - -### noteMargin - -| Parameter | Description | Type | Required | Values | -| ---------- | ------------------- | ------- | -------- | ------------------ | -| noteMargin | Margin around notes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 10 - -### messageMargin - -| Parameter | Description | Type | Required | Values | -| ------------- | ----------------------- | ------- | -------- | ------------------ | -| messageMargin | Space between messages. | Integer | Required | Any Positive Value | - -**Notes:** - -Space between messages. - -Default value: 35 - -### messageAlign - -| Parameter | Description | Type | Required | Values | -| ------------ | --------------------------- | ---- | -------- | ------------------------- | -| messageAlign | Multiline message alignment | 3 | 4 | 'left', 'center', 'right' | - -**Notes:** Default value: 'center' - -### bottomMarginAdj - -| Parameter | Description | Type | Required | Values | -| --------------- | ------------------------------------------ | ------- | -------- | ------------------ | -| bottomMarginAdj | Prolongs the edge of the diagram downwards | Integer | 4 | Any Positive Value | - -**Notes:** - -Depending on css styling this might need adjustment. - -Default value: 1 - -### useMaxWidth - -| Parameter | Description | Type | Required | Values | -| ----------- | ----------- | ------- | -------- | ----------- | -| useMaxWidth | See notes | boolean | 4 | true, false | - -**Notes:** - -When this flag is set the height and width is set to 100% and is then scaling with the -available space if not the absolute space required is used. - -Default value: true - -### rightAngles - -| Parameter | Description | Type | Required | Values | -| ----------- | --------------------------------- | ---- | -------- | ----------- | -| rightAngles | Curved Arrows become Right Angles | 3 | 4 | true, false | - -**Notes:** - -This will display arrows that start and begin at the same node as right angles, rather than a -curves - -Default value: false - -## timeline - -The object containing configurations specific for timeline diagrams - -### diagramMarginX - -| Parameter | Description | Type | Required | Values | -| -------------- | ---------------------------------------------------- | ------- | -------- | ------------------ | -| diagramMarginX | Margin to the right and left of the sequence diagram | Integer | Required | Any Positive Value | - -**Notes:** Default value: 50 - -### diagramMarginY - -| Parameter | Description | Type | Required | Values | -| -------------- | -------------------------------------------------- | ------- | -------- | ------------------ | -| diagramMarginY | Margin to the over and under the sequence diagram. | Integer | Required | Any Positive Value | - -**Notes:** Default value: 10 - -### leftMargin - -| Parameter | Description | Type | Required | Values | -| ----------- | --------------------- | ------- | -------- | ------------------ | -| actorMargin | Margin between actors | Integer | Required | Any Positive Value | - -**Notes:** Default value: 50 - -### width - -| Parameter | Description | Type | Required | Values | -| --------- | -------------------- | ------- | -------- | ------------------ | -| width | Width of actor boxes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 150 - -### height - -| Parameter | Description | Type | Required | Values | -| --------- | --------------------- | ------- | -------- | ------------------ | -| height | Height of actor boxes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 65 - -### boxMargin - -| Parameter | Description | Type | Required | Values | -| --------- | ------------------------ | ------- | -------- | ------------------ | -| boxMargin | Margin around loop boxes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 10 - -### boxTextMargin - -| Parameter | Description | Type | Required | Values | -| ------------- | -------------------------------------------- | ------- | -------- | ------------------ | -| boxTextMargin | Margin around the text in loop/alt/opt boxes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 5 - -### noteMargin - -| Parameter | Description | Type | Required | Values | -| ---------- | ------------------- | ------- | -------- | ------------------ | -| noteMargin | Margin around notes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 10 - -### messageMargin - -| Parameter | Description | Type | Required | Values | -| ------------- | ----------------------- | ------- | -------- | ------------------ | -| messageMargin | Space between messages. | Integer | Required | Any Positive Value | - -**Notes:** - -Space between messages. - -Default value: 35 - -### messageAlign - -| Parameter | Description | Type | Required | Values | -| ------------ | --------------------------- | ---- | -------- | ------------------------- | -| messageAlign | Multiline message alignment | 3 | 4 | 'left', 'center', 'right' | - -**Notes:** Default value: 'center' - -### bottomMarginAdj - -| Parameter | Description | Type | Required | Values | -| --------------- | ------------------------------------------ | ------- | -------- | ------------------ | -| bottomMarginAdj | Prolongs the edge of the diagram downwards | Integer | 4 | Any Positive Value | - -**Notes:** - -Depending on css styling this might need adjustment. - -Default value: 1 - -### useMaxWidth - -| Parameter | Description | Type | Required | Values | -| ----------- | ----------- | ------- | -------- | ----------- | -| useMaxWidth | See notes | boolean | 4 | true, false | - -**Notes:** - -When this flag is set the height and width is set to 100% and is then scaling with the -available space if not the absolute space required is used. - -Default value: true - -### rightAngles - -| Parameter | Description | Type | Required | Values | -| ----------- | --------------------------------- | ---- | -------- | ----------- | -| rightAngles | Curved Arrows become Right Angles | 3 | 4 | true, false | - -**Notes:** - -This will display arrows that start and begin at the same node as right angles, rather than a -curves - -Default value: false - -## useMaxWidth - -| Parameter | Description | Type | Required | Values | -| ----------- | ----------- | ------- | -------- | ----------- | -| useMaxWidth | See notes | boolean | 4 | true, false | - -**Notes:** - -When this flag is set the height and width is set to 100% and is then scaling with the -available space if not the absolute space required is used. - -Default value: true - -## defaultRenderer - -| Parameter | Description | Type | Required | Values | -| --------------- | ----------- | ------- | -------- | ----------------------- | -| defaultRenderer | See notes | boolean | 4 | dagre-d3, dagre-wrapper | - -**Notes**: - -Decides which rendering engine that is to be used for the rendering. Legal values are: -dagre-d3 dagre-wrapper - wrapper for dagre implemented in mermaid - -Default value: 'dagre-d3' - -## useMaxWidth - -| Parameter | Description | Type | Required | Values | -| ----------- | ----------- | ------- | -------- | ----------- | -| useMaxWidth | See notes | boolean | 4 | true, false | - -**Notes:** - -When this flag is set the height and width is set to 100% and is then scaling with the -available space if not the absolute space required is used. - -Default value: true - -## defaultRenderer - -| Parameter | Description | Type | Required | Values | -| --------------- | ----------- | ------- | -------- | ----------------------- | -| defaultRenderer | See notes | boolean | 4 | dagre-d3, dagre-wrapper | - -**Notes:** - -Decides which rendering engine that is to be used for the rendering. Legal values are: -dagre-d3 dagre-wrapper - wrapper for dagre implemented in mermaid - -Default value: 'dagre-d3' - -## er - -The object containing configurations specific for entity relationship diagrams - -### diagramPadding - -| Parameter | Description | Type | Required | Values | -| -------------- | ----------------------------------------------- | ------- | -------- | ------------------ | -| diagramPadding | Amount of padding around the diagram as a whole | Integer | Required | Any Positive Value | - -**Notes:** - -The amount of padding around the diagram as a whole so that embedded diagrams have margins, -expressed in pixels - -Default value: 20 - -### layoutDirection - -| Parameter | Description | Type | Required | Values | -| --------------- | ---------------------------------------- | ------ | -------- | ---------------------- | -| layoutDirection | Directional bias for layout of entities. | string | Required | "TB", "BT", "LR", "RL" | - -**Notes:** - -'TB' for Top-Bottom, 'BT'for Bottom-Top, 'LR' for Left-Right, or 'RL' for Right to Left. - -T = top, B = bottom, L = left, and R = right. - -Default value: 'TB' - -### minEntityWidth - -| Parameter | Description | Type | Required | Values | -| -------------- | ---------------------------------- | ------- | -------- | ------------------ | -| minEntityWidth | The minimum width of an entity box | Integer | Required | Any Positive Value | - -**Notes:** Expressed in pixels. Default value: 100 - -### minEntityHeight - -| Parameter | Description | Type | Required | Values | -| --------------- | ----------------------------------- | ------- | -------- | ------------------ | -| minEntityHeight | The minimum height of an entity box | Integer | 4 | Any Positive Value | - -**Notes:** Expressed in pixels Default value: 75 - -### entityPadding - -| Parameter | Description | Type | Required | Values | -| ------------- | ------------------------------------------------------------ | ------- | -------- | ------------------ | -| entityPadding | Minimum internal padding between text in box and box borders | Integer | 4 | Any Positive Value | - -**Notes:** - -The minimum internal padding between text in an entity box and the enclosing box borders, -expressed in pixels. - -Default value: 15 - -### stroke - -| Parameter | Description | Type | Required | Values | -| --------- | ----------------------------------- | ------ | -------- | -------------------- | -| stroke | Stroke color of box edges and lines | string | 4 | Any recognized color | - -**Notes:** Default value: 'gray' - -### fill - -| Parameter | Description | Type | Required | Values | -| --------- | -------------------------- | ------ | -------- | -------------------- | -| fill | Fill color of entity boxes | string | 4 | Any recognized color | - -**Notes:** Default value: 'honeydew' - -### fontSize - -| Parameter | Description | Type | Required | Values | -| --------- | ------------------- | ------- | -------- | ------------------ | -| fontSize | Font Size in pixels | Integer | | Any Positive Value | - -**Notes:** - -Font size (expressed as an integer representing a number of pixels) Default value: 12 - -### useMaxWidth - -| Parameter | Description | Type | Required | Values | -| ----------- | ----------- | ------- | -------- | ----------- | -| useMaxWidth | See Notes | boolean | Required | true, false | - -**Notes:** - -When this flag is set to true, the diagram width is locked to 100% and scaled based on -available space. If set to false, the diagram reserves its absolute width. - -Default value: true - -## pie - -The object containing configurations specific for pie diagrams - -### useMaxWidth - -| Parameter | Description | Type | Required | Values | -| ----------- | ----------- | ------- | -------- | ----------- | -| useMaxWidth | See Notes | boolean | Required | true, false | - -**Notes:** - -When this flag is set to true, the diagram width is locked to 100% and scaled based on -available space. If set to false, the diagram reserves its absolute width. - -Default value: true - -## requirement - -The object containing configurations specific for req diagrams - -### useMaxWidth - -| Parameter | Description | Type | Required | Values | -| ----------- | ----------- | ------- | -------- | ----------- | -| useMaxWidth | See Notes | boolean | Required | true, false | - -**Notes:** - -When this flag is set to true, the diagram width is locked to 100% and scaled based on -available space. If set to false, the diagram reserves its absolute width. - -Default value: true - -## c4 - -The object containing configurations specific for c4 diagrams - -### diagramMarginX - -| Parameter | Description | Type | Required | Values | -| -------------- | ---------------------------------------------- | ------- | -------- | ------------------ | -| diagramMarginX | Margin to the right and left of the c4 diagram | Integer | Required | Any Positive Value | - -**Notes:** Default value: 50 - -### diagramMarginY - -| Parameter | Description | Type | Required | Values | -| -------------- | ------------------------------------------- | ------- | -------- | ------------------ | -| diagramMarginY | Margin to the over and under the c4 diagram | Integer | Required | Any Positive Value | - -**Notes:** Default value: 10 - -### c4ShapeMargin - -| Parameter | Description | Type | Required | Values | -| ------------- | --------------------- | ------- | -------- | ------------------ | -| c4ShapeMargin | Margin between shapes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 50 - -### c4ShapePadding - -| Parameter | Description | Type | Required | Values | -| -------------- | ---------------------- | ------- | -------- | ------------------ | -| c4ShapePadding | Padding between shapes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 20 - -### width - -| Parameter | Description | Type | Required | Values | -| --------- | --------------------- | ------- | -------- | ------------------ | -| width | Width of person boxes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 216 - -### height - -| Parameter | Description | Type | Required | Values | -| --------- | ---------------------- | ------- | -------- | ------------------ | -| height | Height of person boxes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 60 - -### boxMargin - -| Parameter | Description | Type | Required | Values | -| --------- | ------------------- | ------- | -------- | ------------------ | -| boxMargin | Margin around boxes | Integer | Required | Any Positive Value | - -**Notes:** Default value: 10 - -### useMaxWidth - -| Parameter | Description | Type | Required | Values | -| ----------- | ----------- | ------- | -------- | ----------- | -| useMaxWidth | See Notes | boolean | Required | true, false | - -**Notes:** When this flag is set to true, the height and width is set to 100% and is then -scaling with the available space. If set to false, the absolute space required is used. - -Default value: true - -### c4ShapeInRow - -| Parameter | Description | Type | Required | Values | -| ------------ | ----------- | ------- | -------- | ------------------ | -| c4ShapeInRow | See Notes | Integer | Required | Any Positive Value | - -**Notes:** How many shapes to place in each row. - -Default value: 4 - -### c4BoundaryInRow - -| Parameter | Description | Type | Required | Values | -| --------------- | ----------- | ------- | -------- | ------------------ | -| c4BoundaryInRow | See Notes | Integer | Required | Any Positive Value | - -**Notes:** How many boundarys to place in each row. - -Default value: 2 - -### personFontSize - -This sets the font size of Person shape for the diagram - -**Notes:** Default value: 14. - -### personFontFamily - -This sets the font family of Person shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### personFontWeight - -This sets the font weight of Person shape for the diagram - -**Notes:** Default value: normal. - -### external_personFontSize - -This sets the font size of External Person shape for the diagram - -**Notes:** Default value: 14. - -### external_personFontFamily - -This sets the font family of External Person shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### external_personFontWeight - -This sets the font weight of External Person shape for the diagram - -**Notes:** Default value: normal. - -### systemFontSize - -This sets the font size of System shape for the diagram - -**Notes:** Default value: 14. - -### systemFontFamily - -This sets the font family of System shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### systemFontWeight - -This sets the font weight of System shape for the diagram - -**Notes:** Default value: normal. - -### external_systemFontSize - -This sets the font size of External System shape for the diagram - -**Notes:** Default value: 14. - -### external_systemFontFamily - -This sets the font family of External System shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### external_systemFontWeight - -This sets the font weight of External System shape for the diagram - -**Notes:** Default value: normal. - -### system_dbFontSize - -This sets the font size of System DB shape for the diagram - -**Notes:** Default value: 14. - -### system_dbFontFamily - -This sets the font family of System DB shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### system_dbFontWeight - -This sets the font weight of System DB shape for the diagram - -**Notes:** Default value: normal. - -### external_system_dbFontSize - -This sets the font size of External System DB shape for the diagram - -**Notes:** Default value: 14. - -### external_system_dbFontFamily - -This sets the font family of External System DB shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### external_system_dbFontWeight - -This sets the font weight of External System DB shape for the diagram - -**Notes:** Default value: normal. - -### system_queueFontSize - -This sets the font size of System Queue shape for the diagram - -**Notes:** Default value: 14. - -### system_queueFontFamily - -This sets the font family of System Queue shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### system_queueFontWeight - -This sets the font weight of System Queue shape for the diagram - -**Notes:** Default value: normal. - -### external_system_queueFontSize - -This sets the font size of External System Queue shape for the diagram - -**Notes:** Default value: 14. - -### external_system_queueFontFamily - -This sets the font family of External System Queue shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### external_system_queueFontWeight - -This sets the font weight of External System Queue shape for the diagram - -**Notes:** Default value: normal. - -### boundaryFontSize - -This sets the font size of Boundary shape for the diagram - -**Notes:** Default value: 14. - -### boundaryFontFamily - -This sets the font family of Boundary shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### boundaryFontWeight - -This sets the font weight of Boundary shape for the diagram - -**Notes:** Default value: normal. - -### messageFontSize - -This sets the font size of Message shape for the diagram - -**Notes:** Default value: 12. - -### messageFontFamily - -This sets the font family of Message shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### messageFontWeight - -This sets the font weight of Message shape for the diagram - -**Notes:** Default value: normal. - -### containerFontSize - -This sets the font size of Container shape for the diagram - -**Notes:** Default value: 14. - -### containerFontFamily - -This sets the font family of Container shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### containerFontWeight - -This sets the font weight of Container shape for the diagram - -**Notes:** Default value: normal. - -### external_containerFontSize - -This sets the font size of External Container shape for the diagram - -**Notes:** Default value: 14. - -### external_containerFontFamily - -This sets the font family of External Container shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### external_containerFontWeight - -This sets the font weight of External Container shape for the diagram - -**Notes:** Default value: normal. - -### container_dbFontSize - -This sets the font size of Container DB shape for the diagram - -**Notes:** Default value: 14. - -### container_dbFontFamily - -This sets the font family of Container DB shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### container_dbFontWeight - -This sets the font weight of Container DB shape for the diagram - -**Notes:** Default value: normal. - -### external_container_dbFontSize - -This sets the font size of External Container DB shape for the diagram - -**Notes:** Default value: 14. - -### external_container_dbFontFamily - -This sets the font family of External Container DB shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### external_container_dbFontWeight - -This sets the font weight of External Container DB shape for the diagram - -**Notes:** Default value: normal. - -### container_queueFontSize - -This sets the font size of Container Queue shape for the diagram - -**Notes:** Default value: 14. - -### container_queueFontFamily - -This sets the font family of Container Queue shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### container_queueFontWeight - -This sets the font weight of Container Queue shape for the diagram - -**Notes:** Default value: normal. - -### external_container_queueFontSize - -This sets the font size of External Container Queue shape for the diagram - -**Notes:** Default value: 14. - -### external_container_queueFontFamily - -This sets the font family of External Container Queue shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### external_container_queueFontWeight - -This sets the font weight of External Container Queue shape for the diagram - -**Notes:** Default value: normal. - -### componentFontSize - -This sets the font size of Component shape for the diagram - -**Notes:** Default value: 14. - -### componentFontFamily - -This sets the font family of Component shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### componentFontWeight - -This sets the font weight of Component shape for the diagram - -**Notes:** Default value: normal. - -### external_componentFontSize - -This sets the font size of External Component shape for the diagram - -**Notes:** Default value: 14. - -### external_componentFontFamily - -This sets the font family of External Component shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### external_componentFontWeight - -This sets the font weight of External Component shape for the diagram - -**Notes:** Default value: normal. - -### component_dbFontSize - -This sets the font size of Component DB shape for the diagram - -**Notes:** Default value: 14. - -### component_dbFontFamily - -This sets the font family of Component DB shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### component_dbFontWeight - -This sets the font weight of Component DB shape for the diagram - -**Notes:** Default value: normal. - -### external_component_dbFontSize - -This sets the font size of External Component DB shape for the diagram - -**Notes:** Default value: 14. - -### external_component_dbFontFamily - -This sets the font family of External Component DB shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### external_component_dbFontWeight - -This sets the font weight of External Component DB shape for the diagram - -**Notes:** Default value: normal. - -### component_queueFontSize - -This sets the font size of Component Queue shape for the diagram - -**Notes:** Default value: 14. - -### component_queueFontFamily - -This sets the font family of Component Queue shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### component_queueFontWeight - -This sets the font weight of Component Queue shape for the diagram - -**Notes:** Default value: normal. - -### external_component_queueFontSize - -This sets the font size of External Component Queue shape for the diagram - -**Notes:** Default value: 14. - -### external_component_queueFontFamily - -This sets the font family of External Component Queue shape for the diagram - -**Notes:** Default value: "Open Sans", sans-serif. - -### external_component_queueFontWeight - -This sets the font weight of External Component Queue shape for the diagram - -**Notes:** Default value: normal. - -### wrap - -This sets the auto-wrap state for the diagram - -**Notes:** Default value: true. - -### wrapPadding - -This sets the auto-wrap padding for the diagram (sides only) - -**Notes:** Default value: 0. - -## parse - -### Parameters - -- `text` **[string][4]** -- `parseError` **[Function][5]?** - -Returns **[boolean][6]** - -## setSiteConfig - -## setSiteConfig - -| Function | Description | Type | Values | -| ------------- | ------------------------------------- | ----------- | --------------------------------------- | -| setSiteConfig | Sets the siteConfig to desired values | Put Request | Any Values, except ones in secure array | - -**Notes:** Sets the siteConfig. The siteConfig is a protected configuration for repeat use. Calls -to reset() will reset the currentConfig to siteConfig. Calls to reset(configApi.defaultConfig) -will reset siteConfig and currentConfig to the defaultConfig Note: currentConfig is set in this -function _Default value: At default, will mirror Global Config_ - -### Parameters - -- `conf` **MermaidConfig** The base currentConfig to use as siteConfig - -Returns **[object][7]** The siteConfig - -## getSiteConfig - -## getSiteConfig - -| Function | Description | Type | Values | -| ------------- | ------------------------------------------------- | ----------- | -------------------------------- | -| setSiteConfig | Returns the current siteConfig base configuration | Get Request | Returns Any Values in siteConfig | - -**Notes**: Returns **any** values in siteConfig. - -Returns **[object][7]** The siteConfig - -## setConfig - -## setConfig - -| Function | Description | Type | Values | -| ------------- | ------------------------------------- | ----------- | --------------------------------------- | -| setSiteConfig | Sets the siteConfig to desired values | Put Request | Any Values, except ones in secure array | - -**Notes**: Sets the currentConfig. The parameter conf is sanitized based on the siteConfig.secure -keys. Any values found in conf with key found in siteConfig.secure will be replaced with the -corresponding siteConfig value. - -### Parameters - -- `conf` **any** The potential currentConfig - -Returns **any** The currentConfig merged with the sanitized conf - -## render - -Function that renders an svg with a graph from a chart definition. Usage example below. - -```javascript -mermaidAPI.initialize({ - startOnLoad: true, -}); -$(function () { - const graphDefinition = 'graph TB\na-->b'; - const cb = function (svgGraph) { - console.log(svgGraph); - }; - mermaidAPI.render('id1', graphDefinition, cb); -}); -``` - -### Parameters - -- `id` **[string][4]** The id of the element to be rendered -- `text` **[string][4]** The graph definition -- `cb` **function (svgCode: [string][4], bindFunctions: function (element: [Element][8]): void): void** -- `container` **[Element][8]** Selector to element in which a div with the graph temporarily will be - inserted. If one is provided a hidden div will be inserted in the body of the page instead. The - element will be removed when rendering is completed. - -Returns **void** - -## getConfig - -## getConfig - -| Function | Description | Type | Return Values | -| --------- | ------------------------- | ----------- | ------------------------------ | -| getConfig | Obtains the currentConfig | Get Request | Any Values from current Config | - -**Notes**: Returns **any** the currentConfig - -Returns **any** The currentConfig - -## sanitize - -## sanitize - -| Function | Description | Type | Values | -| -------- | -------------------------------------- | ----------- | ------ | -| sanitize | Sets the siteConfig to desired values. | Put Request | None | - -Ensures options parameter does not attempt to override siteConfig secure keys **Notes**: modifies -options in-place - -### Parameters - -- `options` **any** The potential setConfig parameter - -## addDirective - -Pushes in a directive to the configuration - -### Parameters - -- `directive` **[object][7]** The directive to push in - -## reset - -## reset - -| Function | Description | Type | Required | Values | -| -------- | ---------------------------- | ----------- | -------- | ------ | -| reset | Resets currentConfig to conf | Put Request | Required | None | - -## conf - -| Parameter | Description | Type | Required | Values | -| --------- | -------------------------------------------------------------- | ---------- | -------- | -------------------------------------------- | -| conf | base set of values, which currentConfig could be **reset** to. | Dictionary | Required | Any Values, with respect to the secure Array | - -**Notes**: (default: current siteConfig ) (optional, default `getSiteConfig()`) - -### Parameters - -- `config` (optional, default `siteConfig`) - -Returns **void** - -## initialize - -### Parameters - -- `options` **MermaidConfig** - -## - -## mermaidAPI configuration defaults - -```html - -``` - -[1]: Setup.md?id=render -[2]: 8.6.0_docs.md -[3]: #mermaidapi-configuration-defaults -[4]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String -[5]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/function -[6]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean -[7]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object -[8]: https://developer.mozilla.org/docs/Web/API/Element diff --git a/packages/mermaid/src/diagrams/timeline/diagram-definition.ts b/packages/mermaid/src/diagrams/timeline/diagram-definition.ts index 9f18f261d..898af8b78 100644 --- a/packages/mermaid/src/diagrams/timeline/diagram-definition.ts +++ b/packages/mermaid/src/diagrams/timeline/diagram-definition.ts @@ -3,12 +3,10 @@ import parser from './parser/timeline.jison'; import * as db from './timelineDb'; import renderer from './timelineRenderer'; import styles from './styles'; -import { injectUtils } from './mermaidUtils'; export const diagram = { db, renderer, parser, styles, - injectUtils, }; diff --git a/packages/mermaid/src/diagrams/timeline/mermaidUtils.ts b/packages/mermaid/src/diagrams/timeline/mermaidUtils.ts deleted file mode 100644 index 0c6469203..000000000 --- a/packages/mermaid/src/diagrams/timeline/mermaidUtils.ts +++ /dev/null @@ -1,72 +0,0 @@ -const warning = () => null; -let localCommonDb = {}; - -export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal'; - -export const LEVELS: Record = { - trace: 0, - debug: 1, - info: 2, - warn: 3, - error: 4, - fatal: 5, -}; - -export const log: Record = { - trace: warning, - debug: warning, - info: warning, - warn: warning, - error: warning, - fatal: warning, -}; -export let setLogLevel: (level: keyof typeof LEVELS | number | string) => void; -export let getConfig: () => object; -export let sanitizeText: (str: string) => string; -export const getCommonDb = () => localCommonDb; -export let parseDirective = (p: any, statement: string, context: string, type: string) => { - return; -}; -/** - * Placeholder for the real function that will be injected by mermaid. - */ -// eslint-disable @typescript-eslint/no-explicit-any -export let setupGraphViewbox: ( - graph: any, - svgElem: any, - padding: any, - useMaxWidth: boolean -) => void; - -/** - * Function called by mermaid that injects utility functions that help the diagram to be a good citizen. - * @param _log - The log function to use - * @param _setLogLevel - The function to set the log level - * @param _getConfig - The function to get the configuration - * @param _sanitizeText - The function to sanitize text - * @param _setupGraphViewbox - The function to setup the graph view-box - * @param _commonDb - The common database - */ -export const injectUtils = ( - _log: Record, - _setLogLevel: any, - _getConfig: any, - _sanitizeText: any, - _setupGraphViewbox: any, - _commonDb: any, - _parseDirective: any -) => { - _log.debug('Mermaid utils injected into timeline-diagram'); - log.trace = _log.trace; - log.debug = _log.debug; - log.info = _log.info; - log.warn = _log.warn; - log.error = _log.error; - log.fatal = _log.fatal; - setLogLevel = _setLogLevel; - getConfig = _getConfig; - sanitizeText = _sanitizeText; - setupGraphViewbox = _setupGraphViewbox; - localCommonDb = _commonDb; - parseDirective = _parseDirective; -}; diff --git a/packages/mermaid/src/diagrams/timeline/parser/timeline.jison b/packages/mermaid/src/diagrams/timeline/parser/timeline.jison index db22a9bcf..59b96516a 100644 --- a/packages/mermaid/src/diagrams/timeline/parser/timeline.jison +++ b/packages/mermaid/src/diagrams/timeline/parser/timeline.jison @@ -1,6 +1,6 @@ /** mermaid * https://mermaidjs.github.io/ - * (c) 2015 Knut Sveidqvist + * (c) 2023 Knut Sveidqvist * MIT license. */ %lex From ce037a84cafdc6b89da5f842c21e976aa569dbb9 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Wed, 8 Feb 2023 13:16:33 +0100 Subject: [PATCH 191/309] Fixing build after last batch of changes --- package.json | 3 ++ .../src/diagrams/timeline/timelineDb.js | 12 ++---- .../src/diagrams/timeline/timelineRenderer.ts | 4 +- packages/mermaid/src/mermaid.ts | 1 - pnpm-lock.yaml | 37 +++++++++---------- 5 files changed, 27 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index e7cb9bdf0..1b43df2b4 100644 --- a/package.json +++ b/package.json @@ -110,5 +110,8 @@ }, "volta": { "node": "18.13.0" + }, + "dependencies": { + "remark-frontmatter": "^4.0.1" } } diff --git a/packages/mermaid/src/diagrams/timeline/timelineDb.js b/packages/mermaid/src/diagrams/timeline/timelineDb.js index dca0728c8..7bc5c2692 100644 --- a/packages/mermaid/src/diagrams/timeline/timelineDb.js +++ b/packages/mermaid/src/diagrams/timeline/timelineDb.js @@ -1,9 +1,5 @@ -import { - getCommonDb as _getCommonDb, - parseDirective as _parseDirective, - log, -} from './mermaidUtils'; - +import { parseDirective as _parseDirective } from '../../directiveUtils'; +import * as commonDb from '../../commonDb'; let currentSection = ''; let currentTaskId = 0; @@ -11,7 +7,7 @@ const sections = []; const tasks = []; const rawTasks = []; -export const getCommonDb = _getCommonDb; +export const getCommonDb = () => commonDb; export const parseDirective = (statement, context, type) => { _parseDirective(this, statement, context, type); @@ -22,7 +18,7 @@ export const clear = function () { tasks.length = 0; currentSection = ''; rawTasks.length = 0; - _getCommonDb().clear(); + commonDb.clear(); }; export const addSection = function (txt) { diff --git a/packages/mermaid/src/diagrams/timeline/timelineRenderer.ts b/packages/mermaid/src/diagrams/timeline/timelineRenderer.ts index 613e3ff48..02e706bf6 100644 --- a/packages/mermaid/src/diagrams/timeline/timelineRenderer.ts +++ b/packages/mermaid/src/diagrams/timeline/timelineRenderer.ts @@ -1,7 +1,9 @@ // @ts-nocheck TODO: fix file import { select } from 'd3'; import svgDraw from './svgDraw'; -import { log, getConfig, setupGraphViewbox } from './mermaidUtils'; +import { log } from '../../logger'; +import { getConfig } from '../../config'; +import { setupGraphViewbox } from '../../setupGraphViewbox'; export const setConf = function (cnf) { const keys = Object.keys(cnf); diff --git a/packages/mermaid/src/mermaid.ts b/packages/mermaid/src/mermaid.ts index a6eda5778..be06c2167 100644 --- a/packages/mermaid/src/mermaid.ts +++ b/packages/mermaid/src/mermaid.ts @@ -330,7 +330,6 @@ const registerExternalDiagrams = async ( } }; -externalDiagramsRegistered = true; /** * ##contentLoaded Callback function that is called when page is loaded. This functions fetches * configuration for mermaid rendering and calls init for rendering the mermaid diagrams on the diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 961304828..72e53be4e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3,6 +3,10 @@ lockfileVersion: 5.4-inlineSpecifiers importers: .: + dependencies: + remark-frontmatter: + specifier: ^4.0.1 + version: 4.0.1 devDependencies: '@applitools/eyes-cypress': specifier: ^3.27.6 @@ -2996,7 +3000,6 @@ packages: resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} dependencies: '@types/unist': 2.0.6 - dev: true /@types/mdurl/1.0.2: resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} @@ -3125,7 +3128,6 @@ packages: /@types/unist/2.0.6: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} - dev: true /@types/uuid/8.3.4: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} @@ -4122,7 +4124,7 @@ packages: /axios/0.21.4_debug@4.3.2: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.2_debug@4.3.2 transitivePeerDependencies: - debug dev: true @@ -4201,7 +4203,6 @@ packages: /bail/2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: true /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -6756,7 +6757,6 @@ packages: /extend/3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: true /extract-zip/2.0.1_supports-color@8.1.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} @@ -6819,7 +6819,6 @@ packages: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} dependencies: format: 0.2.2 - dev: true /faye-websocket/0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} @@ -6930,6 +6929,18 @@ packages: optional: true dev: true + /follow-redirects/1.15.2_debug@4.3.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.2 + dev: true + /foreground-child/2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} engines: {node: '>=8.0.0'} @@ -6972,7 +6983,6 @@ packages: /format/0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} - dev: true /forwarded/0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -7661,7 +7671,6 @@ packages: /is-buffer/2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} - dev: true /is-builtin-module/3.2.0: resolution: {integrity: sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==} @@ -7760,7 +7769,6 @@ packages: /is-plain-obj/4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - dev: true /is-plain-object/2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} @@ -8912,7 +8920,6 @@ packages: resolution: {integrity: sha512-7itKvp0arEVNpCktOET/eLFAYaZ+0cNjVtFtIPxgQ5tV+3i+D4SDDTjTzPWl44LT59PC+xdx+glNTawBdF98Mw==} dependencies: micromark-extension-frontmatter: 1.0.0 - dev: true /mdast-util-gfm-autolink-literal/1.0.2: resolution: {integrity: sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg==} @@ -9090,7 +9097,6 @@ packages: fault: 2.0.1 micromark-util-character: 1.1.0 micromark-util-symbol: 1.0.1 - dev: true /micromark-extension-gfm-autolink-literal/1.0.3: resolution: {integrity: sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==} @@ -9213,7 +9219,6 @@ packages: dependencies: micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 - dev: true /micromark-util-chunked/1.0.0: resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} @@ -9290,11 +9295,9 @@ packages: /micromark-util-symbol/1.0.1: resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} - dev: true /micromark-util-types/1.0.2: resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} - dev: true /micromark/2.11.4: resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} @@ -10326,7 +10329,6 @@ packages: mdast-util-frontmatter: 1.0.0 micromark-extension-frontmatter: 1.0.0 unified: 10.1.2 - dev: true /remark-gfm/3.0.1: resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} @@ -11370,7 +11372,6 @@ packages: /trough/2.1.0: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - dev: true /ts-dedent/2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} @@ -11589,7 +11590,6 @@ packages: is-plain-obj: 4.1.0 trough: 2.1.0 vfile: 5.3.5 - dev: true /unique-string/2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} @@ -11616,7 +11616,6 @@ packages: resolution: {integrity: sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==} dependencies: '@types/unist': 2.0.6 - dev: true /unist-util-visit-parents/5.1.1: resolution: {integrity: sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==} @@ -11757,7 +11756,6 @@ packages: dependencies: '@types/unist': 2.0.6 unist-util-stringify-position: 3.0.2 - dev: true /vfile/5.3.5: resolution: {integrity: sha512-U1ho2ga33eZ8y8pkbQLH54uKqGhFJ6GYIHnnG5AhRpAh3OWjkrRHKa/KogbmQn8We+c0KVV3rTOgR9V/WowbXQ==} @@ -11766,7 +11764,6 @@ packages: is-buffer: 2.0.5 unist-util-stringify-position: 3.0.2 vfile-message: 3.1.2 - dev: true /vite-node/0.27.1_@types+node@18.11.9: resolution: {integrity: sha512-d6+ue/3NzsfndWaPbYh/bFkHbmAWfDXI4B874zRx+WREnG6CUHUbBC8lKaRYZjeR6gCPN5m1aVNNRXBYICA9XA==} From 580903051f23e19334617604f6cdd2a44de0736f Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Wed, 8 Feb 2023 13:40:41 +0100 Subject: [PATCH 192/309] Fixing broken test --- package.json | 15 +- .../src/diagrams/timeline/timeline.spec.js | 20 +- pnpm-lock.yaml | 254 +++++++++--------- 3 files changed, 138 insertions(+), 151 deletions(-) diff --git a/package.json b/package.json index 1b43df2b4..620f7dbeb 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "9.3.0-rc1", "description": "Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.", "type": "module", - "packageManager": "pnpm@7.25.1", + "packageManager": "pnpm@7.25.0", "keywords": [ "diagram", "markdown", @@ -23,7 +23,7 @@ "build": "pnpm run -r clean && concurrently \"pnpm build:vite\" \"pnpm build:types\"", "dev": "concurrently \"pnpm build:vite --watch\" \"ts-node-esm .vite/server.ts\"", "release": "pnpm build", - "lint": "eslint --cache --cache-strategy content --ignore-path .gitignore . && pnpm lint:jison && prettier --cache --check .", + "lint": "eslint --cache --ignore-path .gitignore . && pnpm lint:jison && prettier --check .", "lint:fix": "eslint --fix --ignore-path .gitignore . && prettier --write . && ts-node-esm scripts/fixCSpell.ts", "lint:jison": "ts-node-esm ./scripts/jison/lint.mts", "cypress": "cypress run", @@ -67,8 +67,8 @@ "@types/node": "^18.11.9", "@types/prettier": "^2.7.1", "@types/rollup-plugin-visualizer": "^4.2.1", - "@typescript-eslint/eslint-plugin": "^5.48.2", - "@typescript-eslint/parser": "^5.48.2", + "@typescript-eslint/eslint-plugin": "^5.42.1", + "@typescript-eslint/parser": "^5.42.1", "@vitest/coverage-c8": "^0.27.0", "@vitest/ui": "^0.27.0", "concurrently": "^7.5.0", @@ -76,8 +76,8 @@ "cypress": "^10.11.0", "cypress-image-snapshot": "^4.0.1", "esbuild": "^0.17.0", - "eslint": "^8.32.0", - "eslint-config-prettier": "^8.6.0", + "eslint": "^8.27.0", + "eslint-config-prettier": "^8.5.0", "eslint-plugin-cypress": "^2.12.1", "eslint-plugin-html": "^7.1.0", "eslint-plugin-jest": "^27.1.5", @@ -110,8 +110,5 @@ }, "volta": { "node": "18.13.0" - }, - "dependencies": { - "remark-frontmatter": "^4.0.1" } } diff --git a/packages/mermaid/src/diagrams/timeline/timeline.spec.js b/packages/mermaid/src/diagrams/timeline/timeline.spec.js index 41047d764..0697b194e 100644 --- a/packages/mermaid/src/diagrams/timeline/timeline.spec.js +++ b/packages/mermaid/src/diagrams/timeline/timeline.spec.js @@ -1,6 +1,6 @@ import { parser as timeline } from './parser/timeline'; import * as timelineDB from './timelineDb'; -import { injectUtils } from './mermaidUtils'; +// import { injectUtils } from './mermaidUtils'; import * as _commonDb from '../../commonDb'; import { parseDirective as _parseDirective } from '../../directiveUtils'; @@ -12,15 +12,15 @@ import { setupGraphViewBox, } from '../../diagram-api/diagramAPI'; -injectUtils( - log, - setLogLevel, - getConfig, - sanitizeText, - setupGraphViewBox, - _commonDb, - _parseDirective -); +// injectUtils( +// log, +// setLogLevel, +// getConfig, +// sanitizeText, +// setupGraphViewBox, +// _commonDb, +// _parseDirective +// ); describe('when parsing a timeline ', function () { beforeEach(function () { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 72e53be4e..5d6ca2bda 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3,10 +3,6 @@ lockfileVersion: 5.4-inlineSpecifiers importers: .: - dependencies: - remark-frontmatter: - specifier: ^4.0.1 - version: 4.0.1 devDependencies: '@applitools/eyes-cypress': specifier: ^3.27.6 @@ -48,11 +44,11 @@ importers: specifier: ^4.2.1 version: 4.2.1 '@typescript-eslint/eslint-plugin': - specifier: ^5.48.2 - version: 5.48.2_iljmjqxcygjq3saipl7gerxpvi + specifier: ^5.42.1 + version: 5.51.0_ea5vny3vf4guc7b4slvddguozq '@typescript-eslint/parser': - specifier: ^5.48.2 - version: 5.48.2_yygwinqv3a2io74xmwofqb7uka + specifier: ^5.42.1 + version: 5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4 '@vitest/coverage-c8': specifier: ^0.27.0 version: 0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce @@ -75,32 +71,32 @@ importers: specifier: ^0.17.0 version: 0.17.0 eslint: - specifier: ^8.32.0 - version: 8.32.0 + specifier: ^8.27.0 + version: 8.33.0 eslint-config-prettier: - specifier: ^8.6.0 - version: 8.6.0_eslint@8.32.0 + specifier: ^8.5.0 + version: 8.6.0_eslint@8.33.0 eslint-plugin-cypress: specifier: ^2.12.1 - version: 2.12.1_eslint@8.32.0 + version: 2.12.1_eslint@8.33.0 eslint-plugin-html: specifier: ^7.1.0 version: 7.1.0 eslint-plugin-jest: specifier: ^27.1.5 - version: 27.1.5_5rcd23qw3h5vuffwo2owxb3hw4 + version: 27.1.5_5egy7e47lxq7vf4ol2lvjduk2u eslint-plugin-jsdoc: specifier: ^39.6.2 - version: 39.6.2_eslint@8.32.0 + version: 39.6.2_eslint@8.33.0 eslint-plugin-json: specifier: ^3.1.0 version: 3.1.0 eslint-plugin-lodash: specifier: ^7.4.0 - version: 7.4.0_eslint@8.32.0 + version: 7.4.0_eslint@8.33.0 eslint-plugin-markdown: specifier: ^3.0.0 - version: 3.0.0_eslint@8.32.0 + version: 3.0.0_eslint@8.33.0 eslint-plugin-no-only-tests: specifier: ^3.1.0 version: 3.1.0 @@ -109,7 +105,7 @@ importers: version: 0.2.17 eslint-plugin-unicorn: specifier: ^45.0.0 - version: 45.0.0_eslint@8.32.0 + version: 45.0.0_eslint@8.33.0 express: specifier: ^4.18.2 version: 4.18.2 @@ -233,10 +229,10 @@ importers: version: 8.3.4 '@typescript-eslint/eslint-plugin': specifier: ^5.42.1 - version: 5.42.1_qxgr6oy2qtsmmpo3f6iejuryuq + version: 5.42.1_2kuwieraxvrmnnxygbwcc7q6te '@typescript-eslint/parser': specifier: ^5.42.1 - version: 5.42.1_yygwinqv3a2io74xmwofqb7uka + version: 5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4 chokidar: specifier: ^3.5.3 version: 3.5.3 @@ -353,22 +349,6 @@ importers: specifier: ^3.0.2 version: 3.0.2 - packages/mermaid-timeline: - dependencies: - d3: - specifier: ^7.0.0 - version: 7.6.1 - khroma: - specifier: ^2.0.0 - version: 2.0.0 - devDependencies: - concurrently: - specifier: ^7.4.0 - version: 7.5.0 - rimraf: - specifier: ^3.0.2 - version: 3.0.2 - tests/webpack: dependencies: '@mermaid-js/mermaid-mindmap': @@ -2174,7 +2154,7 @@ packages: ajv: 6.12.6 debug: 4.3.4 espree: 9.4.0 - globals: 13.19.0 + globals: 13.20.0 ignore: 5.2.0 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -3000,6 +2980,7 @@ packages: resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} dependencies: '@types/unist': 2.0.6 + dev: true /@types/mdurl/1.0.2: resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} @@ -3128,6 +3109,7 @@ packages: /@types/unist/2.0.6: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + dev: true /@types/uuid/8.3.4: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} @@ -3161,7 +3143,7 @@ packages: dev: true optional: true - /@typescript-eslint/eslint-plugin/5.42.1_qxgr6oy2qtsmmpo3f6iejuryuq: + /@typescript-eslint/eslint-plugin/5.42.1_2kuwieraxvrmnnxygbwcc7q6te: resolution: {integrity: sha512-LyR6x784JCiJ1j6sH5Y0K6cdExqCCm8DJUTcwG5ThNXJj/G8o5E56u5EdG4SLy+bZAwZBswC+GYn3eGdttBVCg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3172,12 +3154,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.42.1_yygwinqv3a2io74xmwofqb7uka + '@typescript-eslint/parser': 5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4 '@typescript-eslint/scope-manager': 5.42.1 - '@typescript-eslint/type-utils': 5.42.1_yygwinqv3a2io74xmwofqb7uka - '@typescript-eslint/utils': 5.42.1_yygwinqv3a2io74xmwofqb7uka + '@typescript-eslint/type-utils': 5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4 + '@typescript-eslint/utils': 5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4 debug: 4.3.4 - eslint: 8.32.0 + eslint: 8.33.0 ignore: 5.2.0 natural-compare-lite: 1.4.0 regexpp: 3.2.0 @@ -3188,8 +3170,8 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin/5.48.2_iljmjqxcygjq3saipl7gerxpvi: - resolution: {integrity: sha512-sR0Gja9Ky1teIq4qJOl0nC+Tk64/uYdX+mi+5iB//MH8gwyx8e3SOyhEzeLZEFEEfCaLf8KJq+Bd/6je1t+CAg==} + /@typescript-eslint/eslint-plugin/5.51.0_ea5vny3vf4guc7b4slvddguozq: + resolution: {integrity: sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -3199,12 +3181,13 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.48.2_yygwinqv3a2io74xmwofqb7uka - '@typescript-eslint/scope-manager': 5.48.2 - '@typescript-eslint/type-utils': 5.48.2_yygwinqv3a2io74xmwofqb7uka - '@typescript-eslint/utils': 5.48.2_yygwinqv3a2io74xmwofqb7uka + '@typescript-eslint/parser': 5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4 + '@typescript-eslint/scope-manager': 5.51.0 + '@typescript-eslint/type-utils': 5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4 + '@typescript-eslint/utils': 5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4 debug: 4.3.4 - eslint: 8.32.0 + eslint: 8.33.0 + grapheme-splitter: 1.0.4 ignore: 5.2.0 natural-compare-lite: 1.4.0 regexpp: 3.2.0 @@ -3215,7 +3198,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.42.1_yygwinqv3a2io74xmwofqb7uka: + /@typescript-eslint/parser/5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4: resolution: {integrity: sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3229,14 +3212,14 @@ packages: '@typescript-eslint/types': 5.42.1 '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4 debug: 4.3.4 - eslint: 8.32.0 + eslint: 8.33.0 typescript: 4.8.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.48.2_yygwinqv3a2io74xmwofqb7uka: - resolution: {integrity: sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw==} + /@typescript-eslint/parser/5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4: + resolution: {integrity: sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -3245,11 +3228,11 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.48.2 - '@typescript-eslint/types': 5.48.2 - '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.8.4 + '@typescript-eslint/scope-manager': 5.51.0 + '@typescript-eslint/types': 5.51.0 + '@typescript-eslint/typescript-estree': 5.51.0_typescript@4.8.4 debug: 4.3.4 - eslint: 8.32.0 + eslint: 8.33.0 typescript: 4.8.4 transitivePeerDependencies: - supports-color @@ -3263,15 +3246,15 @@ packages: '@typescript-eslint/visitor-keys': 5.42.1 dev: true - /@typescript-eslint/scope-manager/5.48.2: - resolution: {integrity: sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw==} + /@typescript-eslint/scope-manager/5.51.0: + resolution: {integrity: sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.48.2 - '@typescript-eslint/visitor-keys': 5.48.2 + '@typescript-eslint/types': 5.51.0 + '@typescript-eslint/visitor-keys': 5.51.0 dev: true - /@typescript-eslint/type-utils/5.42.1_yygwinqv3a2io74xmwofqb7uka: + /@typescript-eslint/type-utils/5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4: resolution: {integrity: sha512-WWiMChneex5w4xPIX56SSnQQo0tEOy5ZV2dqmj8Z371LJ0E+aymWD25JQ/l4FOuuX+Q49A7pzh/CGIQflxMVXg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3282,17 +3265,17 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4 - '@typescript-eslint/utils': 5.42.1_yygwinqv3a2io74xmwofqb7uka + '@typescript-eslint/utils': 5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4 debug: 4.3.4 - eslint: 8.32.0 + eslint: 8.33.0 tsutils: 3.21.0_typescript@4.8.4 typescript: 4.8.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils/5.48.2_yygwinqv3a2io74xmwofqb7uka: - resolution: {integrity: sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew==} + /@typescript-eslint/type-utils/5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4: + resolution: {integrity: sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -3301,10 +3284,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.8.4 - '@typescript-eslint/utils': 5.48.2_yygwinqv3a2io74xmwofqb7uka + '@typescript-eslint/typescript-estree': 5.51.0_typescript@4.8.4 + '@typescript-eslint/utils': 5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4 debug: 4.3.4 - eslint: 8.32.0 + eslint: 8.33.0 tsutils: 3.21.0_typescript@4.8.4 typescript: 4.8.4 transitivePeerDependencies: @@ -3316,8 +3299,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types/5.48.2: - resolution: {integrity: sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA==} + /@typescript-eslint/types/5.51.0: + resolution: {integrity: sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -3342,8 +3325,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree/5.48.2_typescript@4.8.4: - resolution: {integrity: sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==} + /@typescript-eslint/typescript-estree/5.51.0_typescript@4.8.4: + resolution: {integrity: sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -3351,8 +3334,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.48.2 - '@typescript-eslint/visitor-keys': 5.48.2 + '@typescript-eslint/types': 5.51.0 + '@typescript-eslint/visitor-keys': 5.51.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -3363,7 +3346,7 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.42.1_yygwinqv3a2io74xmwofqb7uka: + /@typescript-eslint/utils/5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4: resolution: {integrity: sha512-Gxvf12xSp3iYZd/fLqiQRD4uKZjDNR01bQ+j8zvhPjpsZ4HmvEFL/tC4amGNyxN9Rq+iqvpHLhlqx6KTxz9ZyQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3374,29 +3357,29 @@ packages: '@typescript-eslint/scope-manager': 5.42.1 '@typescript-eslint/types': 5.42.1 '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4 - eslint: 8.32.0 + eslint: 8.33.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.32.0 + eslint-utils: 3.0.0_eslint@8.33.0 semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils/5.48.2_yygwinqv3a2io74xmwofqb7uka: - resolution: {integrity: sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow==} + /@typescript-eslint/utils/5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4: + resolution: {integrity: sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@types/json-schema': 7.0.11 '@types/semver': 7.3.12 - '@typescript-eslint/scope-manager': 5.48.2 - '@typescript-eslint/types': 5.48.2 - '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.8.4 - eslint: 8.32.0 + '@typescript-eslint/scope-manager': 5.51.0 + '@typescript-eslint/types': 5.51.0 + '@typescript-eslint/typescript-estree': 5.51.0_typescript@4.8.4 + eslint: 8.33.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.32.0 + eslint-utils: 3.0.0_eslint@8.33.0 semver: 7.3.8 transitivePeerDependencies: - supports-color @@ -3411,11 +3394,11 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@typescript-eslint/visitor-keys/5.48.2: - resolution: {integrity: sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ==} + /@typescript-eslint/visitor-keys/5.51.0: + resolution: {integrity: sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.48.2 + '@typescript-eslint/types': 5.51.0 eslint-visitor-keys: 3.3.0 dev: true @@ -3803,7 +3786,7 @@ packages: /acorn-globals/7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.8.0 + acorn: 8.8.1 acorn-walk: 8.2.0 dev: true @@ -4124,7 +4107,7 @@ packages: /axios/0.21.4_debug@4.3.2: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2_debug@4.3.2 + follow-redirects: 1.15.2 transitivePeerDependencies: - debug dev: true @@ -4203,6 +4186,7 @@ packages: /bail/2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: true /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -4760,7 +4744,7 @@ packages: dev: true /concat-map/0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true /concurrently/7.5.0: @@ -6321,21 +6305,21 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier/8.6.0_eslint@8.32.0: + /eslint-config-prettier/8.6.0_eslint@8.33.0: resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.32.0 + eslint: 8.33.0 dev: true - /eslint-plugin-cypress/2.12.1_eslint@8.32.0: + /eslint-plugin-cypress/2.12.1_eslint@8.33.0: resolution: {integrity: sha512-c2W/uPADl5kospNDihgiLc7n87t5XhUbFDoTl6CfVkmG+kDAb5Ux10V9PoLPu9N+r7znpc+iQlcmAqT1A/89HA==} peerDependencies: eslint: '>= 3.2.1' dependencies: - eslint: 8.32.0 + eslint: 8.33.0 globals: 11.12.0 dev: true @@ -6345,7 +6329,7 @@ packages: htmlparser2: 8.0.1 dev: true - /eslint-plugin-jest/27.1.5_5rcd23qw3h5vuffwo2owxb3hw4: + /eslint-plugin-jest/27.1.5_5egy7e47lxq7vf4ol2lvjduk2u: resolution: {integrity: sha512-CK2dekZ5VBdzsOSOH5Fc1rwC+cWXjkcyrmf1RV714nDUDKu+o73TTJiDxpbILG8PtPPpAAl3ywzh5QA7Ft0mjA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -6358,16 +6342,16 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.48.2_iljmjqxcygjq3saipl7gerxpvi - '@typescript-eslint/utils': 5.42.1_yygwinqv3a2io74xmwofqb7uka - eslint: 8.32.0 + '@typescript-eslint/eslint-plugin': 5.51.0_ea5vny3vf4guc7b4slvddguozq + '@typescript-eslint/utils': 5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4 + eslint: 8.33.0 jest: 29.3.1_odkjkoia5xunhxkdrka32ib6vi transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-jsdoc/39.6.2_eslint@8.32.0: + /eslint-plugin-jsdoc/39.6.2_eslint@8.33.0: resolution: {integrity: sha512-dvgY/W7eUFoAIIiaWHERIMI61ZWqcz9YFjEeyTzdPlrZc3TY/3aZm5aB91NUoTLWYZmO/vFlYSuQi15tF7uE5A==} engines: {node: ^14 || ^16 || ^17 || ^18 || ^19} peerDependencies: @@ -6377,7 +6361,7 @@ packages: comment-parser: 1.3.1 debug: 4.3.4 escape-string-regexp: 4.0.0 - eslint: 8.32.0 + eslint: 8.33.0 esquery: 1.4.0 semver: 7.3.8 spdx-expression-parse: 3.0.1 @@ -6393,23 +6377,23 @@ packages: vscode-json-languageservice: 4.2.1 dev: true - /eslint-plugin-lodash/7.4.0_eslint@8.32.0: + /eslint-plugin-lodash/7.4.0_eslint@8.33.0: resolution: {integrity: sha512-Tl83UwVXqe1OVeBRKUeWcfg6/pCW1GTRObbdnbEJgYwjxp5Q92MEWQaH9+dmzbRt6kvYU1Mp893E79nJiCSM8A==} engines: {node: '>=10'} peerDependencies: eslint: '>=2' dependencies: - eslint: 8.32.0 + eslint: 8.33.0 lodash: 4.17.21 dev: true - /eslint-plugin-markdown/3.0.0_eslint@8.32.0: + /eslint-plugin-markdown/3.0.0_eslint@8.33.0: resolution: {integrity: sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.32.0 + eslint: 8.33.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color @@ -6427,7 +6411,7 @@ packages: '@microsoft/tsdoc-config': 0.16.2 dev: true - /eslint-plugin-unicorn/45.0.0_eslint@8.32.0: + /eslint-plugin-unicorn/45.0.0_eslint@8.33.0: resolution: {integrity: sha512-iP8cMRxXKHonKioOhnCoCcqVhoqhAp6rB+nsoLjXFDxTHz3btWMAp8xwzjHA0B1K6YV/U/Yvqn1bUXZt8sJPuQ==} engines: {node: '>=14.18'} peerDependencies: @@ -6436,8 +6420,8 @@ packages: '@babel/helper-validator-identifier': 7.19.1 ci-info: 3.6.2 clean-regexp: 1.0.0 - eslint: 8.32.0 - eslint-utils: 3.0.0_eslint@8.32.0 + eslint: 8.33.0 + eslint-utils: 3.0.0_eslint@8.33.0 esquery: 1.4.0 indent-string: 4.0.0 is-builtin-module: 3.2.0 @@ -6468,13 +6452,13 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.32.0: + /eslint-utils/3.0.0_eslint@8.33.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.32.0 + eslint: 8.33.0 eslint-visitor-keys: 2.1.0 dev: true @@ -6488,8 +6472,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.32.0: - resolution: {integrity: sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==} + /eslint/8.33.0: + resolution: {integrity: sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: @@ -6504,7 +6488,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.32.0 + eslint-utils: 3.0.0_eslint@8.33.0 eslint-visitor-keys: 3.3.0 espree: 9.4.0 esquery: 1.4.0 @@ -6513,7 +6497,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.19.0 + globals: 13.20.0 grapheme-splitter: 1.0.4 ignore: 5.2.0 import-fresh: 3.3.0 @@ -6757,6 +6741,7 @@ packages: /extend/3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true /extract-zip/2.0.1_supports-color@8.1.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} @@ -6819,6 +6804,7 @@ packages: resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} dependencies: format: 0.2.2 + dev: true /faye-websocket/0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} @@ -6929,18 +6915,6 @@ packages: optional: true dev: true - /follow-redirects/1.15.2_debug@4.3.2: - resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: - debug: 4.3.2 - dev: true - /foreground-child/2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} engines: {node: '>=8.0.0'} @@ -6983,6 +6957,7 @@ packages: /format/0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} + dev: true /forwarded/0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -7221,8 +7196,8 @@ packages: engines: {node: '>=4'} dev: true - /globals/13.19.0: - resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} + /globals/13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -7671,6 +7646,7 @@ packages: /is-buffer/2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} + dev: true /is-builtin-module/3.2.0: resolution: {integrity: sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==} @@ -7769,6 +7745,7 @@ packages: /is-plain-obj/4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + dev: true /is-plain-object/2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} @@ -8916,10 +8893,13 @@ packages: - supports-color dev: true - /mdast-util-frontmatter/1.0.0: - resolution: {integrity: sha512-7itKvp0arEVNpCktOET/eLFAYaZ+0cNjVtFtIPxgQ5tV+3i+D4SDDTjTzPWl44LT59PC+xdx+glNTawBdF98Mw==} + /mdast-util-frontmatter/1.0.1: + resolution: {integrity: sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==} dependencies: + '@types/mdast': 3.0.10 + mdast-util-to-markdown: 1.3.0 micromark-extension-frontmatter: 1.0.0 + dev: true /mdast-util-gfm-autolink-literal/1.0.2: resolution: {integrity: sha512-FzopkOd4xTTBeGXhXSBU0OCDDh5lUj2rd+HQqG92Ld+jL4lpUfgX2AT2OHAVP9aEeDKp7G92fuooSZcYJA3cRg==} @@ -9097,6 +9077,7 @@ packages: fault: 2.0.1 micromark-util-character: 1.1.0 micromark-util-symbol: 1.0.1 + dev: true /micromark-extension-gfm-autolink-literal/1.0.3: resolution: {integrity: sha512-i3dmvU0htawfWED8aHMMAzAVp/F0Z+0bPh3YrbTPPL1v4YAlCZpy5rBO5p0LPYiZo0zFVkoYh7vDU7yQSiCMjg==} @@ -9219,6 +9200,7 @@ packages: dependencies: micromark-util-symbol: 1.0.1 micromark-util-types: 1.0.2 + dev: true /micromark-util-chunked/1.0.0: resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==} @@ -9295,9 +9277,11 @@ packages: /micromark-util-symbol/1.0.1: resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==} + dev: true /micromark-util-types/1.0.2: resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==} + dev: true /micromark/2.11.4: resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} @@ -10326,9 +10310,10 @@ packages: resolution: {integrity: sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==} dependencies: '@types/mdast': 3.0.10 - mdast-util-frontmatter: 1.0.0 + mdast-util-frontmatter: 1.0.1 micromark-extension-frontmatter: 1.0.0 unified: 10.1.2 + dev: true /remark-gfm/3.0.1: resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} @@ -11234,7 +11219,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.2 - acorn: 8.8.0 + acorn: 8.8.1 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -11372,6 +11357,7 @@ packages: /trough/2.1.0: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: true /ts-dedent/2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} @@ -11590,6 +11576,7 @@ packages: is-plain-obj: 4.1.0 trough: 2.1.0 vfile: 5.3.5 + dev: true /unique-string/2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} @@ -11616,6 +11603,7 @@ packages: resolution: {integrity: sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==} dependencies: '@types/unist': 2.0.6 + dev: true /unist-util-visit-parents/5.1.1: resolution: {integrity: sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==} @@ -11756,6 +11744,7 @@ packages: dependencies: '@types/unist': 2.0.6 unist-util-stringify-position: 3.0.2 + dev: true /vfile/5.3.5: resolution: {integrity: sha512-U1ho2ga33eZ8y8pkbQLH54uKqGhFJ6GYIHnnG5AhRpAh3OWjkrRHKa/KogbmQn8We+c0KVV3rTOgR9V/WowbXQ==} @@ -11764,6 +11753,7 @@ packages: is-buffer: 2.0.5 unist-util-stringify-position: 3.0.2 vfile-message: 3.1.2 + dev: true /vite-node/0.27.1_@types+node@18.11.9: resolution: {integrity: sha512-d6+ue/3NzsfndWaPbYh/bFkHbmAWfDXI4B874zRx+WREnG6CUHUbBC8lKaRYZjeR6gCPN5m1aVNNRXBYICA9XA==} From 82f7e1b754539bedec06df459f45e68fc58e9bd7 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Wed, 8 Feb 2023 13:50:58 +0100 Subject: [PATCH 193/309] Version updates --- package.json | 12 +-- pnpm-lock.yaml | 217 ++++++++++++++++++++++++++----------------------- 2 files changed, 121 insertions(+), 108 deletions(-) diff --git a/package.json b/package.json index 620f7dbeb..e7cb9bdf0 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "9.3.0-rc1", "description": "Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.", "type": "module", - "packageManager": "pnpm@7.25.0", + "packageManager": "pnpm@7.25.1", "keywords": [ "diagram", "markdown", @@ -23,7 +23,7 @@ "build": "pnpm run -r clean && concurrently \"pnpm build:vite\" \"pnpm build:types\"", "dev": "concurrently \"pnpm build:vite --watch\" \"ts-node-esm .vite/server.ts\"", "release": "pnpm build", - "lint": "eslint --cache --ignore-path .gitignore . && pnpm lint:jison && prettier --check .", + "lint": "eslint --cache --cache-strategy content --ignore-path .gitignore . && pnpm lint:jison && prettier --cache --check .", "lint:fix": "eslint --fix --ignore-path .gitignore . && prettier --write . && ts-node-esm scripts/fixCSpell.ts", "lint:jison": "ts-node-esm ./scripts/jison/lint.mts", "cypress": "cypress run", @@ -67,8 +67,8 @@ "@types/node": "^18.11.9", "@types/prettier": "^2.7.1", "@types/rollup-plugin-visualizer": "^4.2.1", - "@typescript-eslint/eslint-plugin": "^5.42.1", - "@typescript-eslint/parser": "^5.42.1", + "@typescript-eslint/eslint-plugin": "^5.48.2", + "@typescript-eslint/parser": "^5.48.2", "@vitest/coverage-c8": "^0.27.0", "@vitest/ui": "^0.27.0", "concurrently": "^7.5.0", @@ -76,8 +76,8 @@ "cypress": "^10.11.0", "cypress-image-snapshot": "^4.0.1", "esbuild": "^0.17.0", - "eslint": "^8.27.0", - "eslint-config-prettier": "^8.5.0", + "eslint": "^8.32.0", + "eslint-config-prettier": "^8.6.0", "eslint-plugin-cypress": "^2.12.1", "eslint-plugin-html": "^7.1.0", "eslint-plugin-jest": "^27.1.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5d6ca2bda..961304828 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,11 +44,11 @@ importers: specifier: ^4.2.1 version: 4.2.1 '@typescript-eslint/eslint-plugin': - specifier: ^5.42.1 - version: 5.51.0_ea5vny3vf4guc7b4slvddguozq + specifier: ^5.48.2 + version: 5.48.2_iljmjqxcygjq3saipl7gerxpvi '@typescript-eslint/parser': - specifier: ^5.42.1 - version: 5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4 + specifier: ^5.48.2 + version: 5.48.2_yygwinqv3a2io74xmwofqb7uka '@vitest/coverage-c8': specifier: ^0.27.0 version: 0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce @@ -71,32 +71,32 @@ importers: specifier: ^0.17.0 version: 0.17.0 eslint: - specifier: ^8.27.0 - version: 8.33.0 + specifier: ^8.32.0 + version: 8.32.0 eslint-config-prettier: - specifier: ^8.5.0 - version: 8.6.0_eslint@8.33.0 + specifier: ^8.6.0 + version: 8.6.0_eslint@8.32.0 eslint-plugin-cypress: specifier: ^2.12.1 - version: 2.12.1_eslint@8.33.0 + version: 2.12.1_eslint@8.32.0 eslint-plugin-html: specifier: ^7.1.0 version: 7.1.0 eslint-plugin-jest: specifier: ^27.1.5 - version: 27.1.5_5egy7e47lxq7vf4ol2lvjduk2u + version: 27.1.5_5rcd23qw3h5vuffwo2owxb3hw4 eslint-plugin-jsdoc: specifier: ^39.6.2 - version: 39.6.2_eslint@8.33.0 + version: 39.6.2_eslint@8.32.0 eslint-plugin-json: specifier: ^3.1.0 version: 3.1.0 eslint-plugin-lodash: specifier: ^7.4.0 - version: 7.4.0_eslint@8.33.0 + version: 7.4.0_eslint@8.32.0 eslint-plugin-markdown: specifier: ^3.0.0 - version: 3.0.0_eslint@8.33.0 + version: 3.0.0_eslint@8.32.0 eslint-plugin-no-only-tests: specifier: ^3.1.0 version: 3.1.0 @@ -105,7 +105,7 @@ importers: version: 0.2.17 eslint-plugin-unicorn: specifier: ^45.0.0 - version: 45.0.0_eslint@8.33.0 + version: 45.0.0_eslint@8.32.0 express: specifier: ^4.18.2 version: 4.18.2 @@ -229,10 +229,10 @@ importers: version: 8.3.4 '@typescript-eslint/eslint-plugin': specifier: ^5.42.1 - version: 5.42.1_2kuwieraxvrmnnxygbwcc7q6te + version: 5.42.1_qxgr6oy2qtsmmpo3f6iejuryuq '@typescript-eslint/parser': specifier: ^5.42.1 - version: 5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4 + version: 5.42.1_yygwinqv3a2io74xmwofqb7uka chokidar: specifier: ^3.5.3 version: 3.5.3 @@ -349,6 +349,22 @@ importers: specifier: ^3.0.2 version: 3.0.2 + packages/mermaid-timeline: + dependencies: + d3: + specifier: ^7.0.0 + version: 7.6.1 + khroma: + specifier: ^2.0.0 + version: 2.0.0 + devDependencies: + concurrently: + specifier: ^7.4.0 + version: 7.5.0 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + tests/webpack: dependencies: '@mermaid-js/mermaid-mindmap': @@ -2154,7 +2170,7 @@ packages: ajv: 6.12.6 debug: 4.3.4 espree: 9.4.0 - globals: 13.20.0 + globals: 13.19.0 ignore: 5.2.0 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -3143,7 +3159,7 @@ packages: dev: true optional: true - /@typescript-eslint/eslint-plugin/5.42.1_2kuwieraxvrmnnxygbwcc7q6te: + /@typescript-eslint/eslint-plugin/5.42.1_qxgr6oy2qtsmmpo3f6iejuryuq: resolution: {integrity: sha512-LyR6x784JCiJ1j6sH5Y0K6cdExqCCm8DJUTcwG5ThNXJj/G8o5E56u5EdG4SLy+bZAwZBswC+GYn3eGdttBVCg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3154,12 +3170,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4 + '@typescript-eslint/parser': 5.42.1_yygwinqv3a2io74xmwofqb7uka '@typescript-eslint/scope-manager': 5.42.1 - '@typescript-eslint/type-utils': 5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4 - '@typescript-eslint/utils': 5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4 + '@typescript-eslint/type-utils': 5.42.1_yygwinqv3a2io74xmwofqb7uka + '@typescript-eslint/utils': 5.42.1_yygwinqv3a2io74xmwofqb7uka debug: 4.3.4 - eslint: 8.33.0 + eslint: 8.32.0 ignore: 5.2.0 natural-compare-lite: 1.4.0 regexpp: 3.2.0 @@ -3170,8 +3186,8 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin/5.51.0_ea5vny3vf4guc7b4slvddguozq: - resolution: {integrity: sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==} + /@typescript-eslint/eslint-plugin/5.48.2_iljmjqxcygjq3saipl7gerxpvi: + resolution: {integrity: sha512-sR0Gja9Ky1teIq4qJOl0nC+Tk64/uYdX+mi+5iB//MH8gwyx8e3SOyhEzeLZEFEEfCaLf8KJq+Bd/6je1t+CAg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -3181,13 +3197,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4 - '@typescript-eslint/scope-manager': 5.51.0 - '@typescript-eslint/type-utils': 5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4 - '@typescript-eslint/utils': 5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4 + '@typescript-eslint/parser': 5.48.2_yygwinqv3a2io74xmwofqb7uka + '@typescript-eslint/scope-manager': 5.48.2 + '@typescript-eslint/type-utils': 5.48.2_yygwinqv3a2io74xmwofqb7uka + '@typescript-eslint/utils': 5.48.2_yygwinqv3a2io74xmwofqb7uka debug: 4.3.4 - eslint: 8.33.0 - grapheme-splitter: 1.0.4 + eslint: 8.32.0 ignore: 5.2.0 natural-compare-lite: 1.4.0 regexpp: 3.2.0 @@ -3198,7 +3213,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4: + /@typescript-eslint/parser/5.42.1_yygwinqv3a2io74xmwofqb7uka: resolution: {integrity: sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3212,14 +3227,14 @@ packages: '@typescript-eslint/types': 5.42.1 '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4 debug: 4.3.4 - eslint: 8.33.0 + eslint: 8.32.0 typescript: 4.8.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4: - resolution: {integrity: sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==} + /@typescript-eslint/parser/5.48.2_yygwinqv3a2io74xmwofqb7uka: + resolution: {integrity: sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -3228,11 +3243,11 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.51.0 - '@typescript-eslint/types': 5.51.0 - '@typescript-eslint/typescript-estree': 5.51.0_typescript@4.8.4 + '@typescript-eslint/scope-manager': 5.48.2 + '@typescript-eslint/types': 5.48.2 + '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.8.4 debug: 4.3.4 - eslint: 8.33.0 + eslint: 8.32.0 typescript: 4.8.4 transitivePeerDependencies: - supports-color @@ -3246,15 +3261,15 @@ packages: '@typescript-eslint/visitor-keys': 5.42.1 dev: true - /@typescript-eslint/scope-manager/5.51.0: - resolution: {integrity: sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==} + /@typescript-eslint/scope-manager/5.48.2: + resolution: {integrity: sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.51.0 - '@typescript-eslint/visitor-keys': 5.51.0 + '@typescript-eslint/types': 5.48.2 + '@typescript-eslint/visitor-keys': 5.48.2 dev: true - /@typescript-eslint/type-utils/5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4: + /@typescript-eslint/type-utils/5.42.1_yygwinqv3a2io74xmwofqb7uka: resolution: {integrity: sha512-WWiMChneex5w4xPIX56SSnQQo0tEOy5ZV2dqmj8Z371LJ0E+aymWD25JQ/l4FOuuX+Q49A7pzh/CGIQflxMVXg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3265,17 +3280,17 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4 - '@typescript-eslint/utils': 5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4 + '@typescript-eslint/utils': 5.42.1_yygwinqv3a2io74xmwofqb7uka debug: 4.3.4 - eslint: 8.33.0 + eslint: 8.32.0 tsutils: 3.21.0_typescript@4.8.4 typescript: 4.8.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils/5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4: - resolution: {integrity: sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==} + /@typescript-eslint/type-utils/5.48.2_yygwinqv3a2io74xmwofqb7uka: + resolution: {integrity: sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -3284,10 +3299,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.51.0_typescript@4.8.4 - '@typescript-eslint/utils': 5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4 + '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.8.4 + '@typescript-eslint/utils': 5.48.2_yygwinqv3a2io74xmwofqb7uka debug: 4.3.4 - eslint: 8.33.0 + eslint: 8.32.0 tsutils: 3.21.0_typescript@4.8.4 typescript: 4.8.4 transitivePeerDependencies: @@ -3299,8 +3314,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types/5.51.0: - resolution: {integrity: sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==} + /@typescript-eslint/types/5.48.2: + resolution: {integrity: sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -3325,8 +3340,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree/5.51.0_typescript@4.8.4: - resolution: {integrity: sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==} + /@typescript-eslint/typescript-estree/5.48.2_typescript@4.8.4: + resolution: {integrity: sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -3334,8 +3349,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.51.0 - '@typescript-eslint/visitor-keys': 5.51.0 + '@typescript-eslint/types': 5.48.2 + '@typescript-eslint/visitor-keys': 5.48.2 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -3346,7 +3361,7 @@ packages: - supports-color dev: true - /@typescript-eslint/utils/5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4: + /@typescript-eslint/utils/5.42.1_yygwinqv3a2io74xmwofqb7uka: resolution: {integrity: sha512-Gxvf12xSp3iYZd/fLqiQRD4uKZjDNR01bQ+j8zvhPjpsZ4HmvEFL/tC4amGNyxN9Rq+iqvpHLhlqx6KTxz9ZyQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3357,29 +3372,29 @@ packages: '@typescript-eslint/scope-manager': 5.42.1 '@typescript-eslint/types': 5.42.1 '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4 - eslint: 8.33.0 + eslint: 8.32.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.33.0 + eslint-utils: 3.0.0_eslint@8.32.0 semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils/5.51.0_o2s6jvgtr2hafiobaqfgu6k2l4: - resolution: {integrity: sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==} + /@typescript-eslint/utils/5.48.2_yygwinqv3a2io74xmwofqb7uka: + resolution: {integrity: sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@types/json-schema': 7.0.11 '@types/semver': 7.3.12 - '@typescript-eslint/scope-manager': 5.51.0 - '@typescript-eslint/types': 5.51.0 - '@typescript-eslint/typescript-estree': 5.51.0_typescript@4.8.4 - eslint: 8.33.0 + '@typescript-eslint/scope-manager': 5.48.2 + '@typescript-eslint/types': 5.48.2 + '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.8.4 + eslint: 8.32.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.33.0 + eslint-utils: 3.0.0_eslint@8.32.0 semver: 7.3.8 transitivePeerDependencies: - supports-color @@ -3394,11 +3409,11 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@typescript-eslint/visitor-keys/5.51.0: - resolution: {integrity: sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==} + /@typescript-eslint/visitor-keys/5.48.2: + resolution: {integrity: sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.51.0 + '@typescript-eslint/types': 5.48.2 eslint-visitor-keys: 3.3.0 dev: true @@ -3786,7 +3801,7 @@ packages: /acorn-globals/7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.8.1 + acorn: 8.8.0 acorn-walk: 8.2.0 dev: true @@ -4744,7 +4759,7 @@ packages: dev: true /concat-map/0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} dev: true /concurrently/7.5.0: @@ -6305,21 +6320,21 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-prettier/8.6.0_eslint@8.33.0: + /eslint-config-prettier/8.6.0_eslint@8.32.0: resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.33.0 + eslint: 8.32.0 dev: true - /eslint-plugin-cypress/2.12.1_eslint@8.33.0: + /eslint-plugin-cypress/2.12.1_eslint@8.32.0: resolution: {integrity: sha512-c2W/uPADl5kospNDihgiLc7n87t5XhUbFDoTl6CfVkmG+kDAb5Ux10V9PoLPu9N+r7znpc+iQlcmAqT1A/89HA==} peerDependencies: eslint: '>= 3.2.1' dependencies: - eslint: 8.33.0 + eslint: 8.32.0 globals: 11.12.0 dev: true @@ -6329,7 +6344,7 @@ packages: htmlparser2: 8.0.1 dev: true - /eslint-plugin-jest/27.1.5_5egy7e47lxq7vf4ol2lvjduk2u: + /eslint-plugin-jest/27.1.5_5rcd23qw3h5vuffwo2owxb3hw4: resolution: {integrity: sha512-CK2dekZ5VBdzsOSOH5Fc1rwC+cWXjkcyrmf1RV714nDUDKu+o73TTJiDxpbILG8PtPPpAAl3ywzh5QA7Ft0mjA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -6342,16 +6357,16 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.51.0_ea5vny3vf4guc7b4slvddguozq - '@typescript-eslint/utils': 5.42.1_o2s6jvgtr2hafiobaqfgu6k2l4 - eslint: 8.33.0 + '@typescript-eslint/eslint-plugin': 5.48.2_iljmjqxcygjq3saipl7gerxpvi + '@typescript-eslint/utils': 5.42.1_yygwinqv3a2io74xmwofqb7uka + eslint: 8.32.0 jest: 29.3.1_odkjkoia5xunhxkdrka32ib6vi transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-jsdoc/39.6.2_eslint@8.33.0: + /eslint-plugin-jsdoc/39.6.2_eslint@8.32.0: resolution: {integrity: sha512-dvgY/W7eUFoAIIiaWHERIMI61ZWqcz9YFjEeyTzdPlrZc3TY/3aZm5aB91NUoTLWYZmO/vFlYSuQi15tF7uE5A==} engines: {node: ^14 || ^16 || ^17 || ^18 || ^19} peerDependencies: @@ -6361,7 +6376,7 @@ packages: comment-parser: 1.3.1 debug: 4.3.4 escape-string-regexp: 4.0.0 - eslint: 8.33.0 + eslint: 8.32.0 esquery: 1.4.0 semver: 7.3.8 spdx-expression-parse: 3.0.1 @@ -6377,23 +6392,23 @@ packages: vscode-json-languageservice: 4.2.1 dev: true - /eslint-plugin-lodash/7.4.0_eslint@8.33.0: + /eslint-plugin-lodash/7.4.0_eslint@8.32.0: resolution: {integrity: sha512-Tl83UwVXqe1OVeBRKUeWcfg6/pCW1GTRObbdnbEJgYwjxp5Q92MEWQaH9+dmzbRt6kvYU1Mp893E79nJiCSM8A==} engines: {node: '>=10'} peerDependencies: eslint: '>=2' dependencies: - eslint: 8.33.0 + eslint: 8.32.0 lodash: 4.17.21 dev: true - /eslint-plugin-markdown/3.0.0_eslint@8.33.0: + /eslint-plugin-markdown/3.0.0_eslint@8.32.0: resolution: {integrity: sha512-hRs5RUJGbeHDLfS7ELanT0e29Ocyssf/7kBM+p7KluY5AwngGkDf8Oyu4658/NZSGTTq05FZeWbkxXtbVyHPwg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.33.0 + eslint: 8.32.0 mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color @@ -6411,7 +6426,7 @@ packages: '@microsoft/tsdoc-config': 0.16.2 dev: true - /eslint-plugin-unicorn/45.0.0_eslint@8.33.0: + /eslint-plugin-unicorn/45.0.0_eslint@8.32.0: resolution: {integrity: sha512-iP8cMRxXKHonKioOhnCoCcqVhoqhAp6rB+nsoLjXFDxTHz3btWMAp8xwzjHA0B1K6YV/U/Yvqn1bUXZt8sJPuQ==} engines: {node: '>=14.18'} peerDependencies: @@ -6420,8 +6435,8 @@ packages: '@babel/helper-validator-identifier': 7.19.1 ci-info: 3.6.2 clean-regexp: 1.0.0 - eslint: 8.33.0 - eslint-utils: 3.0.0_eslint@8.33.0 + eslint: 8.32.0 + eslint-utils: 3.0.0_eslint@8.32.0 esquery: 1.4.0 indent-string: 4.0.0 is-builtin-module: 3.2.0 @@ -6452,13 +6467,13 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.33.0: + /eslint-utils/3.0.0_eslint@8.32.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.33.0 + eslint: 8.32.0 eslint-visitor-keys: 2.1.0 dev: true @@ -6472,8 +6487,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.33.0: - resolution: {integrity: sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==} + /eslint/8.32.0: + resolution: {integrity: sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: @@ -6488,7 +6503,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.33.0 + eslint-utils: 3.0.0_eslint@8.32.0 eslint-visitor-keys: 3.3.0 espree: 9.4.0 esquery: 1.4.0 @@ -6497,7 +6512,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.20.0 + globals: 13.19.0 grapheme-splitter: 1.0.4 ignore: 5.2.0 import-fresh: 3.3.0 @@ -7196,8 +7211,8 @@ packages: engines: {node: '>=4'} dev: true - /globals/13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + /globals/13.19.0: + resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -8893,11 +8908,9 @@ packages: - supports-color dev: true - /mdast-util-frontmatter/1.0.1: - resolution: {integrity: sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==} + /mdast-util-frontmatter/1.0.0: + resolution: {integrity: sha512-7itKvp0arEVNpCktOET/eLFAYaZ+0cNjVtFtIPxgQ5tV+3i+D4SDDTjTzPWl44LT59PC+xdx+glNTawBdF98Mw==} dependencies: - '@types/mdast': 3.0.10 - mdast-util-to-markdown: 1.3.0 micromark-extension-frontmatter: 1.0.0 dev: true @@ -10310,7 +10323,7 @@ packages: resolution: {integrity: sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==} dependencies: '@types/mdast': 3.0.10 - mdast-util-frontmatter: 1.0.1 + mdast-util-frontmatter: 1.0.0 micromark-extension-frontmatter: 1.0.0 unified: 10.1.2 dev: true @@ -11219,7 +11232,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.2 - acorn: 8.8.1 + acorn: 8.8.0 commander: 2.20.3 source-map-support: 0.5.21 dev: true From 74df4a7a68364428e17b8332aff09e8e9a0f07dc Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Wed, 8 Feb 2023 17:42:58 +0100 Subject: [PATCH 194/309] Mind map coming in from the cold. A lazy loaded diagram in the same way as timeline. --- .vite/build.ts | 10 +- .vite/server.ts | 2 +- .../other/external-diagrams.spec.js | 4 +- ...=> external-diagrams-example-diagram.html} | 32 +--- cypress/platform/knsv2.html | 12 +- cypress/platform/knsv3.html | 142 +++++++++--------- cypress/platform/viewer.js | 4 +- package.json | 2 +- packages/mermaid-example-diagram/Readme.md | 3 - packages/mermaid-example-diagram/package.json | 39 +++-- .../mermaid-example-diagram/src/detector.ts | 22 +-- .../src/diagram-definition.ts | 2 - .../src/exampleDiagram.spec.js | 14 +- .../src/mermaidUtils.ts | 32 ++-- .../mermaid-example-diagram/tsconfig.json | 1 + packages/mermaid-mindmap/package.json | 65 -------- packages/mermaid-mindmap/src/mermaidUtils.ts | 59 -------- packages/mermaid-mindmap/tsconfig.json | 10 -- packages/mermaid/package.json | 4 + .../mermaid/src/diagram-api/detectType.ts | 5 +- .../src/diagram-api/diagram-orchestration.ts | 5 +- .../src/diagrams/mindmap}/detector.ts | 3 +- .../diagrams/mindmap}/diagram-definition.ts | 2 - .../src/diagrams/mindmap}/mindmap.spec.js | 14 +- .../src/diagrams/mindmap}/mindmapDb.js | 7 +- .../src/diagrams/mindmap}/mindmapRenderer.js | 4 +- .../diagrams/mindmap}/parser/mindmap.jison | 0 .../src/diagrams/mindmap}/styles.js | 0 .../src/diagrams/mindmap}/svgDraw.js | 0 .../src/diagrams/mindmap}/types/index.d.ts | 0 .../src/docs/.vitepress/theme/mermaid.ts | 4 +- packages/mermaid/src/docs/vite.config.ts | 4 +- pnpm-lock.yaml | 41 +++-- tests/webpack/package.json | 2 +- 34 files changed, 206 insertions(+), 344 deletions(-) rename cypress/platform/{external-diagrams-mindmap.html => external-diagrams-example-diagram.html} (60%) delete mode 100644 packages/mermaid-example-diagram/Readme.md delete mode 100644 packages/mermaid-mindmap/package.json delete mode 100644 packages/mermaid-mindmap/src/mermaidUtils.ts delete mode 100644 packages/mermaid-mindmap/tsconfig.json rename packages/{mermaid-mindmap/src => mermaid/src/diagrams/mindmap}/detector.ts (81%) rename packages/{mermaid-mindmap/src => mermaid/src/diagrams/mindmap}/diagram-definition.ts (84%) rename packages/{mermaid-mindmap/src => mermaid/src/diagrams/mindmap}/mindmap.spec.js (98%) rename packages/{mermaid-mindmap/src => mermaid/src/diagrams/mindmap}/mindmapDb.js (93%) rename packages/{mermaid-mindmap/src => mermaid/src/diagrams/mindmap}/mindmapRenderer.js (97%) rename packages/{mermaid-mindmap/src => mermaid/src/diagrams/mindmap}/parser/mindmap.jison (100%) rename packages/{mermaid-mindmap/src => mermaid/src/diagrams/mindmap}/styles.js (100%) rename packages/{mermaid-mindmap/src => mermaid/src/diagrams/mindmap}/svgDraw.js (100%) rename packages/{mermaid-mindmap/src => mermaid/src/diagrams/mindmap}/types/index.d.ts (100%) diff --git a/.vite/build.ts b/.vite/build.ts index 019461c49..c9d44219f 100644 --- a/.vite/build.ts +++ b/.vite/build.ts @@ -36,9 +36,9 @@ const packageOptions = { packageName: 'mermaid', file: 'mermaid.ts', }, - 'mermaid-mindmap': { - name: 'mermaid-mindmap', - packageName: 'mermaid-mindmap', + 'mermaid-example-diagram': { + name: 'mermaid-example-diagram', + packageName: 'mermaid-example-diagram', file: 'detector.ts', }, }; @@ -114,7 +114,7 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions) if (watch && config.build) { config.build.watch = { - include: ['packages/mermaid-mindmap/src/**', 'packages/mermaid/src/**'], + include: ['packages/mermaid-example-diagram/src/**', 'packages/mermaid/src/**'], }; } @@ -139,7 +139,7 @@ const main = async () => { if (watch) { build(getBuildConfig({ minify: false, watch, core: false, entryName: 'mermaid' })); if (!mermaidOnly) { - build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-mindmap' })); + build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-example-diagram' })); } } else if (visualize) { await build(getBuildConfig({ minify: false, core: true, entryName: 'mermaid' })); diff --git a/.vite/server.ts b/.vite/server.ts index aced396ec..0f1fef91d 100644 --- a/.vite/server.ts +++ b/.vite/server.ts @@ -22,7 +22,7 @@ async function createServer() { app.use(cors); app.use(express.static('./packages/mermaid/dist')); // app.use(express.static('./packages/mermaid-example-diagram/dist')); - app.use(express.static('./packages/mermaid-mindmap/dist')); + app.use(express.static('./packages/mermaid-example-diagram/dist')); app.use(vite.middlewares); app.use(express.static('demos')); app.use(express.static('cypress/platform')); diff --git a/cypress/integration/other/external-diagrams.spec.js b/cypress/integration/other/external-diagrams.spec.js index be69dfc98..c94235162 100644 --- a/cypress/integration/other/external-diagrams.spec.js +++ b/cypress/integration/other/external-diagrams.spec.js @@ -2,8 +2,8 @@ import { urlSnapshotTest } from '../../helpers/util'; describe('mermaid', () => { describe('registerDiagram', () => { - it('should work on @mermaid-js/mermaid-mindmap and mermaid-example-diagram', () => { - const url = 'http://localhost:9000/external-diagrams-mindmap.html'; + it('should work on @mermaid-js/mermaid-example-diagram', () => { + const url = 'http://localhost:9000/external-diagrams-example-diagram.html'; urlSnapshotTest(url, {}, false, false); }); }); diff --git a/cypress/platform/external-diagrams-mindmap.html b/cypress/platform/external-diagrams-example-diagram.html similarity index 60% rename from cypress/platform/external-diagrams-mindmap.html rename to cypress/platform/external-diagrams-example-diagram.html index e445a7627..9d2cad778 100644 --- a/cypress/platform/external-diagrams-mindmap.html +++ b/cypress/platform/external-diagrams-example-diagram.html @@ -2,34 +2,8 @@

Should correctly load a third-party diagram using registerDiagram

-mindmap
-  root
-    A
-    B
-    C
-    D
-    E
-    A2
-    B2
-    C2
-    D2
-    E2
-    child1((Circle))
-        grandchild 1
-        grandchild 2
-    child2(Round rectangle)
-        grandchild 3
-        grandchild 4
-    child3[Square]
-        grandchild 5
-        ::icon(mdi mdi-fire)
-        gc6((grand
child 6)) - ::icon(mdi mdi-fire) - gc7((grand
grand
child 8)) +example-diagram
- @@ -37,11 +11,11 @@ mindmap diff --git a/cypress/platform/viewer.js b/cypress/platform/viewer.js index 01b49435f..4d7db84f7 100644 --- a/cypress/platform/viewer.js +++ b/cypress/platform/viewer.js @@ -1,5 +1,5 @@ import mermaid2 from '../../packages/mermaid/src/mermaid'; -import mindmap from '../../packages/mermaid-mindmap/src/detector'; +import externalExample from '../../packages/mermaid-example-diagram/src/detector'; function b64ToUtf8(str) { return decodeURIComponent(escape(window.atob(str))); @@ -44,7 +44,7 @@ const contentLoaded = async function () { document.getElementsByTagName('body')[0].appendChild(div); } - await mermaid2.registerExternalDiagrams([mindmap]); + await mermaid2.registerExternalDiagrams([externalExample]); mermaid2.initialize(graphObj.mermaid); await mermaid2.init(); markRendered(); diff --git a/package.json b/package.json index e7cb9bdf0..c96f2c8d7 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "build:vite": "ts-node-esm --transpileOnly .vite/build.ts", "build:mermaid": "pnpm build:vite --mermaid", "build:viz": "pnpm build:mermaid --visualize", - "build:types": "tsc -p ./packages/mermaid/tsconfig.json --emitDeclarationOnly && tsc -p ./packages/mermaid-mindmap/tsconfig.json --emitDeclarationOnly", + "build:types": "tsc -p ./packages/mermaid/tsconfig.json --emitDeclarationOnly && tsc -p ./packages/mermaid-example-diagran/tsconfig.json --emitDeclarationOnly", "build:watch": "pnpm build:vite --watch", "build": "pnpm run -r clean && concurrently \"pnpm build:vite\" \"pnpm build:types\"", "dev": "concurrently \"pnpm build:vite --watch\" \"ts-node-esm .vite/server.ts\"", diff --git a/packages/mermaid-example-diagram/Readme.md b/packages/mermaid-example-diagram/Readme.md deleted file mode 100644 index 38056e3c7..000000000 --- a/packages/mermaid-example-diagram/Readme.md +++ /dev/null @@ -1,3 +0,0 @@ -### Do not refer this package. It is not ready. - -### Refer mermaid-mindmap instead. diff --git a/packages/mermaid-example-diagram/package.json b/packages/mermaid-example-diagram/package.json index 8e958806a..c4d3a57cc 100644 --- a/packages/mermaid-example-diagram/package.json +++ b/packages/mermaid-example-diagram/package.json @@ -1,36 +1,25 @@ { "name": "@mermaid-js/mermaid-example-diagram", - "version": "9.2.0-rc2", - "description": "Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.", - "main": "dist/mermaid-mindmap.core.mjs", - "module": "dist/mermaid-mindmap.core.mjs", + "version": "9.3.0", + "description": "Example of external diagram module for MermaidJS.", + "module": "dist/mermaid-example-diagram.core.mjs", + "types": "dist/detector.d.ts", "type": "module", "exports": { ".": { - "require": "./dist/mermaid-example-diagram.min.js", - "import": "./dist/mermaid-example-diagram.core.mjs" + "import": "./dist/mermaid-example-diagram.core.mjs", + "types": "./dist/detector.d.ts" }, "./*": "./*" }, "keywords": [ "diagram", "markdown", - "mindmap", + "example", "mermaid" ], "scripts": { - "clean": "rimraf dist", - "build:types": "tsc -p ./tsconfig.json --emitDeclarationOnly", - "build:watch": "yarn build:code --watch", - "build:esbuild": "concurrently \"yarn build:code\" \"yarn build:types\"", - "build": "yarn clean; yarn build:esbuild", - "dev": "node .esbuild/serve.cjs", - "release": "yarn build", - "lint": "eslint --cache --ignore-path .gitignore . && yarn lint:jison && prettier --check .", - "lint:fix": "eslint --fix --ignore-path .gitignore . && prettier --write .", - "lint:jison": "ts-node-esm src/jison/lint.mts", - "todo-prepare": "concurrently \"husky install ../../.husky\" \"yarn build\"", - "todo-pre-commit": "lint-staged" + "prepublishOnly": "pnpm -w run build" }, "repository": { "type": "git", @@ -48,9 +37,19 @@ "page" ] }, - "dependencies": {}, + "dependencies": { + "@braintree/sanitize-url": "^6.0.0", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", + "d3": "^7.0.0", + "khroma": "^2.0.0", + "non-layered-tidy-tree-layout": "^2.0.2" + }, "devDependencies": { + "@types/cytoscape": "^3.19.9", "concurrently": "^7.5.0", + "mermaid": "workspace:*", "rimraf": "^3.0.2" }, "resolutions": { diff --git a/packages/mermaid-example-diagram/src/detector.ts b/packages/mermaid-example-diagram/src/detector.ts index d30b99fba..fdf7345bb 100644 --- a/packages/mermaid-example-diagram/src/detector.ts +++ b/packages/mermaid-example-diagram/src/detector.ts @@ -1,18 +1,20 @@ -// @ts-ignore: TODO Fix ts errors -export const id = 'example-diagram'; +import type { ExternalDiagramDefinition } from 'mermaid'; -/** - * Detector function that will be called by mermaid to determine if the diagram is this type of diagram. - * - * @param txt - The diagram text will be passed to the detector - * @returns True if the diagram text matches a diagram of this type - */ +const id = 'example-diagram'; -export const detector = (txt: string) => { +const detector = (txt: string) => { return txt.match(/^\s*example-diagram/) !== null; }; -export const loadDiagram = async () => { +const loader = async () => { const { diagram } = await import('./diagram-definition'); return { id, diagram }; }; + +const plugin: ExternalDiagramDefinition = { + id, + detector, + loader, +}; + +export default plugin; diff --git a/packages/mermaid-example-diagram/src/diagram-definition.ts b/packages/mermaid-example-diagram/src/diagram-definition.ts index 95f7cc11d..c31b3d6e7 100644 --- a/packages/mermaid-example-diagram/src/diagram-definition.ts +++ b/packages/mermaid-example-diagram/src/diagram-definition.ts @@ -12,5 +12,3 @@ export const diagram = { styles, injectUtils, }; - -export { detector, id } from './detector'; diff --git a/packages/mermaid-example-diagram/src/exampleDiagram.spec.js b/packages/mermaid-example-diagram/src/exampleDiagram.spec.js index db539aac0..96c8cd5b2 100644 --- a/packages/mermaid-example-diagram/src/exampleDiagram.spec.js +++ b/packages/mermaid-example-diagram/src/exampleDiagram.spec.js @@ -1,5 +1,17 @@ import { parser } from './parser/exampleDiagram'; -import db from './exampleDiagramDb'; +import * as db from './exampleDiagramDb'; +import { injectUtils } from './mermaidUtils'; +// Todo fix utils functions for tests +import { + log, + setLogLevel, + getConfig, + sanitizeText, + setupGraphViewBox, +} from '../../mermaid/src/diagram-api/diagramAPI'; + +injectUtils(log, setLogLevel, getConfig, sanitizeText, setupGraphViewBox); + describe('when parsing an info graph it', function () { let ex; beforeEach(function () { diff --git a/packages/mermaid-example-diagram/src/mermaidUtils.ts b/packages/mermaid-example-diagram/src/mermaidUtils.ts index 9ba66be5a..44cc85f73 100644 --- a/packages/mermaid-example-diagram/src/mermaidUtils.ts +++ b/packages/mermaid-example-diagram/src/mermaidUtils.ts @@ -1,4 +1,8 @@ -const warning = () => null; +const warning = (s: string) => { + // Todo remove debug code + // eslint-disable-next-line no-console + console.error('Log function was called before initialization', s); +}; export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal'; @@ -19,13 +23,11 @@ export const log: Record = { error: warning, fatal: warning, }; + export let setLogLevel: (level: keyof typeof LEVELS | number | string) => void; export let getConfig: () => object; export let sanitizeText: (str: string) => string; -export let commonDb: any; -/** - * Placeholder for the real function that will be injected by mermaid. - */ +export let commonDb: () => object; // eslint-disable @typescript-eslint/no-explicit-any export let setupGraphViewbox: ( graph: any, @@ -34,25 +36,15 @@ export let setupGraphViewbox: ( useMaxWidth: boolean ) => void; -/** - * Function called by mermaid that injects utility functions that help the diagram to be a good citizen. - * - * @param _log - log from mermaid/src/diagramAPI.ts - * @param _setLogLevel - setLogLevel from mermaid/src/diagramAPI.ts - * @param _getConfig - getConfig from mermaid/src/diagramAPI.ts - * @param _sanitizeText - sanitizeText from mermaid/src/diagramAPI.ts - * @param _setupGraphViewbox - setupGraphViewbox from mermaid/src/diagramAPI.ts - * @param _commonDb -`commonDb` from mermaid/src/diagramAPI.ts - */ export const injectUtils = ( _log: Record, - _setLogLevel: typeof setLogLevel, - _getConfig: typeof getConfig, - _sanitizeText: typeof sanitizeText, - _setupGraphViewbox: typeof setupGraphViewbox, + _setLogLevel: any, + _getConfig: any, + _sanitizeText: any, + _setupGraphViewbox: any, _commonDb: any ) => { - _log.info('Mermaid utils injected into timeline-diagram'); + _log.info('Mermaid utils injected'); log.trace = _log.trace; log.debug = _log.debug; log.info = _log.info; diff --git a/packages/mermaid-example-diagram/tsconfig.json b/packages/mermaid-example-diagram/tsconfig.json index 45076b7b5..310137cc0 100644 --- a/packages/mermaid-example-diagram/tsconfig.json +++ b/packages/mermaid-example-diagram/tsconfig.json @@ -1,5 +1,6 @@ { "extends": "../../tsconfig.json", + "module": "esnext", "compilerOptions": { "rootDir": "./src", "outDir": "./dist" diff --git a/packages/mermaid-mindmap/package.json b/packages/mermaid-mindmap/package.json deleted file mode 100644 index e79e2df4f..000000000 --- a/packages/mermaid-mindmap/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "@mermaid-js/mermaid-mindmap", - "version": "9.3.0", - "description": "Mindmap diagram module for MermaidJS.", - "module": "dist/mermaid-mindmap.core.mjs", - "types": "dist/detector.d.ts", - "type": "module", - "exports": { - ".": { - "import": "./dist/mermaid-mindmap.core.mjs", - "types": "./dist/detector.d.ts" - }, - "./*": "./*" - }, - "keywords": [ - "diagram", - "markdown", - "mindmap", - "mermaid" - ], - "scripts": { - "prepublishOnly": "pnpm -w run build" - }, - "repository": { - "type": "git", - "url": "https://github.com/mermaid-js/mermaid" - }, - "author": "Knut Sveidqvist", - "license": "MIT", - "standard": { - "ignore": [ - "**/parser/*.js", - "dist/**/*.js", - "cypress/**/*.js" - ], - "globals": [ - "page" - ] - }, - "dependencies": { - "@braintree/sanitize-url": "^6.0.0", - "cytoscape": "^3.23.0", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.1.0", - "d3": "^7.0.0", - "khroma": "^2.0.0", - "non-layered-tidy-tree-layout": "^2.0.2" - }, - "devDependencies": { - "@types/cytoscape": "^3.19.9", - "concurrently": "^7.5.0", - "mermaid": "workspace:*", - "rimraf": "^3.0.2" - }, - "resolutions": { - "d3": "^7.0.0" - }, - "files": [ - "dist" - ], - "sideEffects": [ - "**/*.css", - "**/*.scss" - ] -} diff --git a/packages/mermaid-mindmap/src/mermaidUtils.ts b/packages/mermaid-mindmap/src/mermaidUtils.ts deleted file mode 100644 index 44cc85f73..000000000 --- a/packages/mermaid-mindmap/src/mermaidUtils.ts +++ /dev/null @@ -1,59 +0,0 @@ -const warning = (s: string) => { - // Todo remove debug code - // eslint-disable-next-line no-console - console.error('Log function was called before initialization', s); -}; - -export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal'; - -export const LEVELS: Record = { - trace: 0, - debug: 1, - info: 2, - warn: 3, - error: 4, - fatal: 5, -}; - -export const log: Record = { - trace: warning, - debug: warning, - info: warning, - warn: warning, - error: warning, - fatal: warning, -}; - -export let setLogLevel: (level: keyof typeof LEVELS | number | string) => void; -export let getConfig: () => object; -export let sanitizeText: (str: string) => string; -export let commonDb: () => object; -// eslint-disable @typescript-eslint/no-explicit-any -export let setupGraphViewbox: ( - graph: any, - svgElem: any, - padding: any, - useMaxWidth: boolean -) => void; - -export const injectUtils = ( - _log: Record, - _setLogLevel: any, - _getConfig: any, - _sanitizeText: any, - _setupGraphViewbox: any, - _commonDb: any -) => { - _log.info('Mermaid utils injected'); - log.trace = _log.trace; - log.debug = _log.debug; - log.info = _log.info; - log.warn = _log.warn; - log.error = _log.error; - log.fatal = _log.fatal; - setLogLevel = _setLogLevel; - getConfig = _getConfig; - sanitizeText = _sanitizeText; - setupGraphViewbox = _setupGraphViewbox; - commonDb = _commonDb; -}; diff --git a/packages/mermaid-mindmap/tsconfig.json b/packages/mermaid-mindmap/tsconfig.json deleted file mode 100644 index 310137cc0..000000000 --- a/packages/mermaid-mindmap/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "module": "esnext", - "compilerOptions": { - "rootDir": "./src", - "outDir": "./dist" - }, - "include": ["./src/**/*.ts"], - "typeRoots": ["./src/types"] -} diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index 3dd6c5af0..cae7d43a8 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -53,6 +53,9 @@ }, "dependencies": { "@braintree/sanitize-url": "^6.0.0", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", "d3": "^7.0.0", "dagre-d3-es": "7.0.8", "dompurify": "2.4.3", @@ -66,6 +69,7 @@ "uuid": "^9.0.0" }, "devDependencies": { + "@types/cytoscape": "^3.19.9", "@types/d3": "^7.4.0", "@types/dompurify": "^2.4.0", "@types/jsdom": "^20.0.1", diff --git a/packages/mermaid/src/diagram-api/detectType.ts b/packages/mermaid/src/diagram-api/detectType.ts index 92291e282..b75e914fb 100644 --- a/packages/mermaid/src/diagram-api/detectType.ts +++ b/packages/mermaid/src/diagram-api/detectType.ts @@ -55,9 +55,10 @@ export const registerLazyLoadedDiagrams = (...diagrams: ExternalDiagramDefinitio export const addDetector = (key: string, detector: DiagramDetector, loader?: DiagramLoader) => { if (detectors[key]) { - throw new Error(`Detector with key ${key} already exists`); + log.error(`Detector with key ${key} already exists`); + } else { + detectors[key] = { detector, loader }; } - detectors[key] = { detector, loader }; log.debug(`Detector with key ${key} added${loader ? ' with loader' : ''}`); }; diff --git a/packages/mermaid/src/diagram-api/diagram-orchestration.ts b/packages/mermaid/src/diagram-api/diagram-orchestration.ts index 81ddb6163..a68e99dd0 100644 --- a/packages/mermaid/src/diagram-api/diagram-orchestration.ts +++ b/packages/mermaid/src/diagram-api/diagram-orchestration.ts @@ -96,7 +96,10 @@ import errorStyles from '../diagrams/error/styles'; import flowchartElk from '../diagrams/flowchart/elk/detector'; import { registerLazyLoadedDiagrams } from './detectType'; +// Lazy loaded diagrams import timelineDetector from '../diagrams/timeline/detector'; +import mindmapDetector from '../diagrams/mindmap/detector'; + let hasLoadedDiagrams = false; export const addDiagrams = () => { if (hasLoadedDiagrams) { @@ -105,7 +108,7 @@ export const addDiagrams = () => { // This is added here to avoid race-conditions. // We could optimize the loading logic somehow. hasLoadedDiagrams = true; - registerLazyLoadedDiagrams(flowchartElk, timelineDetector); + registerLazyLoadedDiagrams(flowchartElk, timelineDetector, mindmapDetector); registerDiagram( 'error', diff --git a/packages/mermaid-mindmap/src/detector.ts b/packages/mermaid/src/diagrams/mindmap/detector.ts similarity index 81% rename from packages/mermaid-mindmap/src/detector.ts rename to packages/mermaid/src/diagrams/mindmap/detector.ts index da3caf51e..82664225b 100644 --- a/packages/mermaid-mindmap/src/detector.ts +++ b/packages/mermaid/src/diagrams/mindmap/detector.ts @@ -1,5 +1,4 @@ -import type { ExternalDiagramDefinition } from 'mermaid'; - +import type { ExternalDiagramDefinition } from '../../diagram-api/types'; const id = 'mindmap'; const detector = (txt: string) => { diff --git a/packages/mermaid-mindmap/src/diagram-definition.ts b/packages/mermaid/src/diagrams/mindmap/diagram-definition.ts similarity index 84% rename from packages/mermaid-mindmap/src/diagram-definition.ts rename to packages/mermaid/src/diagrams/mindmap/diagram-definition.ts index e7856289d..61b41d347 100644 --- a/packages/mermaid-mindmap/src/diagram-definition.ts +++ b/packages/mermaid/src/diagrams/mindmap/diagram-definition.ts @@ -3,12 +3,10 @@ import mindmapParser from './parser/mindmap'; import * as mindmapDb from './mindmapDb'; import mindmapRenderer from './mindmapRenderer'; import mindmapStyles from './styles'; -import { injectUtils } from './mermaidUtils'; export const diagram = { db: mindmapDb, renderer: mindmapRenderer, parser: mindmapParser, styles: mindmapStyles, - injectUtils, }; diff --git a/packages/mermaid-mindmap/src/mindmap.spec.js b/packages/mermaid/src/diagrams/mindmap/mindmap.spec.js similarity index 98% rename from packages/mermaid-mindmap/src/mindmap.spec.js rename to packages/mermaid/src/diagrams/mindmap/mindmap.spec.js index 753804a5d..8c90f774f 100644 --- a/packages/mermaid-mindmap/src/mindmap.spec.js +++ b/packages/mermaid/src/diagrams/mindmap/mindmap.spec.js @@ -1,16 +1,16 @@ import { parser as mindmap } from './parser/mindmap'; import * as mindmapDB from './mindmapDb'; -import { injectUtils } from './mermaidUtils'; +// import { injectUtils } from './mermaidUtils'; // Todo fix utils functions for tests import { - log, + // log, setLogLevel, - getConfig, - sanitizeText, - setupGraphViewBox, -} from '../../mermaid/src/diagram-api/diagramAPI'; + // getConfig, + // sanitizeText, + // setupGraphViewBox, +} from '../../diagram-api/diagramAPI'; -injectUtils(log, setLogLevel, getConfig, sanitizeText, setupGraphViewBox); +// injectUtils(log, setLogLevel, getConfig, sanitizeText, setupGraphViewBox); describe('when parsing a mindmap ', function () { beforeEach(function () { diff --git a/packages/mermaid-mindmap/src/mindmapDb.js b/packages/mermaid/src/diagrams/mindmap/mindmapDb.js similarity index 93% rename from packages/mermaid-mindmap/src/mindmapDb.js rename to packages/mermaid/src/diagrams/mindmap/mindmapDb.js index 16861cd23..71aa449d9 100644 --- a/packages/mermaid-mindmap/src/mindmapDb.js +++ b/packages/mermaid/src/diagrams/mindmap/mindmapDb.js @@ -1,5 +1,8 @@ -/** Created by knut on 15-01-14. */ -import { sanitizeText, getConfig, log } from './mermaidUtils'; +import { getConfig } from '../../config'; +import { sanitizeText as _sanitizeText } from '../../diagrams/common/common'; +import { log } from '../../logger'; + +export const sanitizeText = (text) => _sanitizeText(text, getConfig()); let nodes = []; let cnt = 0; diff --git a/packages/mermaid-mindmap/src/mindmapRenderer.js b/packages/mermaid/src/diagrams/mindmap/mindmapRenderer.js similarity index 97% rename from packages/mermaid-mindmap/src/mindmapRenderer.js rename to packages/mermaid/src/diagrams/mindmap/mindmapRenderer.js index 6ffe80f5e..0e68a1015 100644 --- a/packages/mermaid-mindmap/src/mindmapRenderer.js +++ b/packages/mermaid/src/diagrams/mindmap/mindmapRenderer.js @@ -1,6 +1,8 @@ /** Created by knut on 14-12-11. */ import { select } from 'd3'; -import { log, getConfig, setupGraphViewbox } from './mermaidUtils'; +import { log } from '../../logger'; +import { getConfig } from '../../config'; +import { setupGraphViewbox } from '../../setupGraphViewbox'; import svgDraw from './svgDraw'; import cytoscape from 'cytoscape'; import coseBilkent from 'cytoscape-cose-bilkent'; diff --git a/packages/mermaid-mindmap/src/parser/mindmap.jison b/packages/mermaid/src/diagrams/mindmap/parser/mindmap.jison similarity index 100% rename from packages/mermaid-mindmap/src/parser/mindmap.jison rename to packages/mermaid/src/diagrams/mindmap/parser/mindmap.jison diff --git a/packages/mermaid-mindmap/src/styles.js b/packages/mermaid/src/diagrams/mindmap/styles.js similarity index 100% rename from packages/mermaid-mindmap/src/styles.js rename to packages/mermaid/src/diagrams/mindmap/styles.js diff --git a/packages/mermaid-mindmap/src/svgDraw.js b/packages/mermaid/src/diagrams/mindmap/svgDraw.js similarity index 100% rename from packages/mermaid-mindmap/src/svgDraw.js rename to packages/mermaid/src/diagrams/mindmap/svgDraw.js diff --git a/packages/mermaid-mindmap/src/types/index.d.ts b/packages/mermaid/src/diagrams/mindmap/types/index.d.ts similarity index 100% rename from packages/mermaid-mindmap/src/types/index.d.ts rename to packages/mermaid/src/diagrams/mindmap/types/index.d.ts diff --git a/packages/mermaid/src/docs/.vitepress/theme/mermaid.ts b/packages/mermaid/src/docs/.vitepress/theme/mermaid.ts index dd55d6782..52c9e88f2 100644 --- a/packages/mermaid/src/docs/.vitepress/theme/mermaid.ts +++ b/packages/mermaid/src/docs/.vitepress/theme/mermaid.ts @@ -1,10 +1,10 @@ import mermaid, { type MermaidConfig } from 'mermaid'; -import mindmap from '@mermaid-js/mermaid-mindmap'; +// import mindmap from '@mermaid-js/mermaid-mindmap'; // import timeline from '@mermaid-js/mermaid-timeline'; const init = (async () => { try { - await mermaid.registerExternalDiagrams([mindmap, timeline]); + await mermaid.registerExternalDiagrams([]); } catch (e) { console.error(e); } diff --git a/packages/mermaid/src/docs/vite.config.ts b/packages/mermaid/src/docs/vite.config.ts index 356e9398c..3f29b497d 100644 --- a/packages/mermaid/src/docs/vite.config.ts +++ b/packages/mermaid/src/docs/vite.config.ts @@ -32,9 +32,9 @@ export default defineConfig({ alias: { mermaid: path.join(__dirname, '../../dist/mermaid.esm.min.mjs'), // Use this one to build - '@mermaid-js/mermaid-mindmap': path.join( + '@mermaid-js/mermaid-example-diagram': path.join( __dirname, - '../../../mermaid-mindmap/dist/mermaid-mindmap.esm.min.mjs' + '../../../mermaid-example-diagram/dist/mermaid-example-diagram.esm.min.mjs' ), // Use this one to build // '@mermaid-js/mermaid-timeline': path.join( // __dirname, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 961304828..eee2aea41 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -169,6 +169,15 @@ importers: '@braintree/sanitize-url': specifier: ^6.0.0 version: 6.0.0 + cytoscape: + specifier: ^3.23.0 + version: 3.23.0 + cytoscape-cose-bilkent: + specifier: ^4.1.0 + version: 4.1.0_cytoscape@3.23.0 + cytoscape-fcose: + specifier: ^2.1.0 + version: 2.1.0_cytoscape@3.23.0 d3: specifier: ^7.0.0 version: 7.6.1 @@ -203,6 +212,9 @@ importers: specifier: ^9.0.0 version: 9.0.0 devDependencies: + '@types/cytoscape': + specifier: ^3.19.9 + version: 3.19.9 '@types/d3': specifier: ^7.4.0 version: 7.4.0 @@ -304,15 +316,6 @@ importers: version: 1.0.4-alpha.16_ifjhkyx3os4sbm7zdnvthc52am packages/mermaid-example-diagram: - devDependencies: - concurrently: - specifier: ^7.5.0 - version: 7.5.0 - rimraf: - specifier: ^3.0.2 - version: 3.0.2 - - packages/mermaid-mindmap: dependencies: '@braintree/sanitize-url': specifier: ^6.0.0 @@ -328,7 +331,7 @@ importers: version: 2.1.0_cytoscape@3.23.0 d3: specifier: ^7.0.0 - version: 7.6.1 + version: 7.8.2 khroma: specifier: ^2.0.0 version: 2.0.0 @@ -349,27 +352,23 @@ importers: specifier: ^3.0.2 version: 3.0.2 - packages/mermaid-timeline: - dependencies: - d3: - specifier: ^7.0.0 - version: 7.6.1 - khroma: - specifier: ^2.0.0 - version: 2.0.0 + packages/mermaid-example-diagram-new: devDependencies: concurrently: - specifier: ^7.4.0 + specifier: ^7.5.0 version: 7.5.0 + mermaid: + specifier: workspace:* + version: link:../mermaid rimraf: specifier: ^3.0.2 version: 3.0.2 tests/webpack: dependencies: - '@mermaid-js/mermaid-mindmap': + '@mermaid-js/mermaid-example-diagram': specifier: workspace:* - version: link:../../packages/mermaid-mindmap + version: link:../../packages/mermaid-example-diagram-new mermaid: specifier: workspace:* version: link:../../packages/mermaid diff --git a/tests/webpack/package.json b/tests/webpack/package.json index c58f456a6..e51845399 100644 --- a/tests/webpack/package.json +++ b/tests/webpack/package.json @@ -18,6 +18,6 @@ }, "dependencies": { "mermaid": "workspace:*", - "@mermaid-js/mermaid-mindmap": "workspace:*" + "@mermaid-js/mermaid-example-diagram": "workspace:*" } } From c4eb1608b0c0e37cd2f136122ce4fcad4cd5c8fe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 19:30:57 +0000 Subject: [PATCH 195/309] chore(deps): update all non-major dependencies --- package.json | 10 +-- pnpm-lock.yaml | 195 +++++++++++++++++++++++++++---------------------- 2 files changed, 112 insertions(+), 93 deletions(-) diff --git a/package.json b/package.json index e7cb9bdf0..b113afd9e 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "9.3.0-rc1", "description": "Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.", "type": "module", - "packageManager": "pnpm@7.25.1", + "packageManager": "pnpm@7.27.0", "keywords": [ "diagram", "markdown", @@ -69,8 +69,8 @@ "@types/rollup-plugin-visualizer": "^4.2.1", "@typescript-eslint/eslint-plugin": "^5.48.2", "@typescript-eslint/parser": "^5.48.2", - "@vitest/coverage-c8": "^0.27.0", - "@vitest/ui": "^0.27.0", + "@vitest/coverage-c8": "^0.28.0", + "@vitest/ui": "^0.28.0", "concurrently": "^7.5.0", "coveralls": "^3.1.1", "cypress": "^10.11.0", @@ -106,9 +106,9 @@ "ts-node": "^10.9.1", "typescript": "^4.8.4", "vite": "^3.2.3", - "vitest": "^0.27.1" + "vitest": "^0.28.0" }, "volta": { - "node": "18.13.0" + "node": "18.14.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 961304828..2ff618a17 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,11 +50,11 @@ importers: specifier: ^5.48.2 version: 5.48.2_yygwinqv3a2io74xmwofqb7uka '@vitest/coverage-c8': - specifier: ^0.27.0 - version: 0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce + specifier: ^0.28.0 + version: 0.28.4_ppxbkcip27yigfcjmn2ppf4tvu '@vitest/ui': - specifier: ^0.27.0 - version: 0.27.1 + specifier: ^0.28.0 + version: 0.28.4 concurrently: specifier: ^7.5.0 version: 7.5.0 @@ -161,8 +161,8 @@ importers: specifier: ^3.2.3 version: 3.2.3_@types+node@18.11.9 vitest: - specifier: ^0.27.1 - version: 0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce + specifier: ^0.28.0 + version: 0.28.4_ppxbkcip27yigfcjmn2ppf4tvu packages/mermaid: dependencies: @@ -349,22 +349,6 @@ importers: specifier: ^3.0.2 version: 3.0.2 - packages/mermaid-timeline: - dependencies: - d3: - specifier: ^7.0.0 - version: 7.6.1 - khroma: - specifier: ^2.0.0 - version: 2.0.0 - devDependencies: - concurrently: - specifier: ^7.4.0 - version: 7.5.0 - rimraf: - specifier: ^3.0.2 - version: 3.0.2 - tests/webpack: dependencies: '@mermaid-js/mermaid-mindmap': @@ -2651,11 +2635,7 @@ packages: /@types/chai-subset/1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: - '@types/chai': 4.3.3 - dev: true - - /@types/chai/4.3.3: - resolution: {integrity: sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==} + '@types/chai': 4.3.4 dev: true /@types/chai/4.3.4: @@ -3428,11 +3408,13 @@ packages: vue: 3.2.45 dev: true - /@vitest/coverage-c8/0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce: - resolution: {integrity: sha512-/9VTGDIAp4hv8PBawfyijxhkiyucfOxFRRP+7kzy3Dj0wONy1Mc2MBoPmiH4aZVc0LViQqecrQLs8JVGt42keA==} + /@vitest/coverage-c8/0.28.4_ppxbkcip27yigfcjmn2ppf4tvu: + resolution: {integrity: sha512-btelLBxaWhHnywXRQxDlrvPhGdnuIaD3XulsxcZRIcnpLPbFu39dNTT0IYu2QWP2ZZrV0AmNtdLIfD4c77zMAg==} dependencies: c8: 7.12.0 - vitest: 0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce + picocolors: 1.0.0 + std-env: 3.3.2 + vitest: 0.28.4_ppxbkcip27yigfcjmn2ppf4tvu transitivePeerDependencies: - '@edge-runtime/vm' - '@vitest/browser' @@ -3447,14 +3429,48 @@ packages: - terser dev: true - /@vitest/ui/0.27.1: - resolution: {integrity: sha512-o9LmWY/XyWt5Pqb+bLLK+N3Vk+PP2jqrdDDMEAY43dB6vtZ+gYuOt5IutUfB7gXeJ6xeIlzUZ/OabrR3leldCA==} + /@vitest/expect/0.28.4: + resolution: {integrity: sha512-JqK0NZ4brjvOSL8hXAnIsfi+jxDF7rH/ZWCGCt0FAqRnVFc1hXsfwXksQvEnKqD84avRt3gmeXoK4tNbmkoVsQ==} + dependencies: + '@vitest/spy': 0.28.4 + '@vitest/utils': 0.28.4 + chai: 4.3.7 + dev: true + + /@vitest/runner/0.28.4: + resolution: {integrity: sha512-Q8UV6GjDvBSTfUoq0QXVCNpNOUrWu4P2qvRq7ssJWzn0+S0ojbVOxEjMt+8a32X6SdkhF8ak+2nkppsqV0JyNQ==} + dependencies: + '@vitest/utils': 0.28.4 + p-limit: 4.0.0 + pathe: 1.1.0 + dev: true + + /@vitest/spy/0.28.4: + resolution: {integrity: sha512-8WuhfXLlvCXpNXEGJW6Gc+IKWI32435fQJLh43u70HnZ1otJOa2Cmg2Wy2Aym47ZnNCP4NolF+8cUPwd0MigKQ==} + dependencies: + tinyspy: 1.0.2 + dev: true + + /@vitest/ui/0.28.4: + resolution: {integrity: sha512-LQfCCFc17n49mwtraV9/NAWl2DUqJS/9ZEa3fqJjoYO+HowdseQ5jvWflpzliCyfrIAh6cXVo1bNzHnDXe0cbw==} dependencies: fast-glob: 3.2.12 flatted: 3.2.7 + pathe: 1.1.0 + picocolors: 1.0.0 sirv: 2.0.2 dev: true + /@vitest/utils/0.28.4: + resolution: {integrity: sha512-l2QztOLdc2LkR+w/lP52RGh8hW+Ul4KESmCAgVE8q737I7e7bQoAfkARKpkPJ4JQtGpwW4deqlj1732VZD7TFw==} + dependencies: + cli-truncate: 3.1.0 + diff: 5.1.0 + loupe: 2.3.6 + picocolors: 1.0.0 + pretty-format: 27.5.1 + dev: true + /@vue/compiler-core/3.2.45: resolution: {integrity: sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==} dependencies: @@ -3801,7 +3817,7 @@ packages: /acorn-globals/7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.8.0 + acorn: 8.8.1 acorn-walk: 8.2.0 dev: true @@ -8789,6 +8805,12 @@ packages: get-func-name: 2.0.0 dev: true + /loupe/2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + /lowercase-keys/2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} @@ -9421,7 +9443,7 @@ packages: resolution: {integrity: sha512-cwzBrBfwGC1gYJyfcy8TcZU1f+dbH/T+TuOhtYP2wLv/Fb51/uV7HJQfBPtEupZ2ORLRU1EKFS/QfS3eo9+kBQ==} dependencies: acorn: 8.8.1 - pathe: 1.0.0 + pathe: 1.1.0 pkg-types: 1.0.1 ufo: 1.0.1 dev: true @@ -9711,6 +9733,13 @@ packages: yocto-queue: 0.1.0 dev: true + /p-limit/4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate/3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -9893,12 +9922,8 @@ packages: engines: {node: '>=8'} dev: true - /pathe/0.2.0: - resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} - dev: true - - /pathe/1.0.0: - resolution: {integrity: sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==} + /pathe/1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} dev: true /pathval/1.1.1: @@ -9970,7 +9995,7 @@ packages: dependencies: jsonc-parser: 3.2.0 mlly: 1.1.0 - pathe: 1.0.0 + pathe: 1.1.0 dev: true /plist/3.0.6: @@ -10067,6 +10092,15 @@ packages: engines: {node: '>=6'} dev: true + /pretty-format/27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + /pretty-format/29.3.1: resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10200,6 +10234,10 @@ packages: unpipe: 1.0.0 dev: true + /react-is/17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + /react-is/18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true @@ -11031,6 +11069,10 @@ packages: engines: {node: '>= 0.8'} dev: true + /std-env/3.3.2: + resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} + dev: true + /stream-combiner/0.0.4: resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} dependencies: @@ -11232,7 +11274,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.2 - acorn: 8.8.0 + acorn: 8.8.1 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -11281,8 +11323,8 @@ packages: resolution: {integrity: sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==} dev: true - /tinypool/0.3.0: - resolution: {integrity: sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==} + /tinypool/0.3.1: + resolution: {integrity: sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==} engines: {node: '>=14.0.0'} dev: true @@ -11768,19 +11810,19 @@ packages: vfile-message: 3.1.2 dev: true - /vite-node/0.27.1_@types+node@18.11.9: - resolution: {integrity: sha512-d6+ue/3NzsfndWaPbYh/bFkHbmAWfDXI4B874zRx+WREnG6CUHUbBC8lKaRYZjeR6gCPN5m1aVNNRXBYICA9XA==} + /vite-node/0.28.4_@types+node@18.11.9: + resolution: {integrity: sha512-KM0Q0uSG/xHHKOJvVHc5xDBabgt0l70y7/lWTR7Q0pR5/MrYxadT+y32cJOE65FfjGmJgxpVEEY+69btJgcXOQ==} engines: {node: '>=v14.16.0'} hasBin: true dependencies: cac: 6.7.14 debug: 4.3.4 mlly: 1.1.0 - pathe: 0.2.0 + pathe: 1.1.0 picocolors: 1.0.0 source-map: 0.6.1 source-map-support: 0.5.21 - vite: 4.0.1_@types+node@18.11.9 + vite: 3.2.3_@types+node@18.11.9 transitivePeerDependencies: - '@types/node' - less @@ -11891,40 +11933,6 @@ packages: fsevents: 2.3.2 dev: true - /vite/4.0.1_@types+node@18.11.9: - resolution: {integrity: sha512-kZQPzbDau35iWOhy3CpkrRC7It+HIHtulAzBhMqzGHKRf/4+vmh8rPDDdv98SWQrFWo6//3ozwsRmwQIPZsK9g==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.11.9 - esbuild: 0.16.7 - postcss: 8.4.20 - resolve: 1.22.1 - rollup: 3.7.4 - optionalDependencies: - fsevents: 2.3.2 - dev: true - /vitepress-plugin-search/1.0.4-alpha.16_ifjhkyx3os4sbm7zdnvthc52am: resolution: {integrity: sha512-D+rs7bwzH+IO+7T9NlxvqSOqmSKbN1yHxUoqClTy5JH+DomL3CcrH2TgSvXc2s58ztlc1dC07c7THo4cNjlUAg==} engines: {node: ^14.13.1 || ^16.7.0 || >=18} @@ -11970,8 +11978,8 @@ packages: - terser dev: true - /vitest/0.27.1_6vhkb7zox2ro6wmx3rlvm5i5ce: - resolution: {integrity: sha512-1sIpQ1DVFTEn7c1ici1XHcVfdU4nKiBmPtPAtGKJJJLuJjojTv/OHGgcf69P57alM4ty8V4NMv+7Yoi5Cxqx9g==} + /vitest/0.28.4_ppxbkcip27yigfcjmn2ppf4tvu: + resolution: {integrity: sha512-sfWIy0AdlbyGRhunm+TLQEJrFH9XuRPdApfubsyLcDbCRrUX717BRQKInTgzEfyl2Ipi1HWoHB84Nqtcwxogcg==} engines: {node: '>=v14.16.0'} hasBin: true peerDependencies: @@ -11995,7 +12003,11 @@ packages: '@types/chai': 4.3.4 '@types/chai-subset': 1.3.3 '@types/node': 18.11.9 - '@vitest/ui': 0.27.1 + '@vitest/expect': 0.28.4 + '@vitest/runner': 0.28.4 + '@vitest/spy': 0.28.4 + '@vitest/ui': 0.28.4 + '@vitest/utils': 0.28.4 acorn: 8.8.1 acorn-walk: 8.2.0 cac: 6.7.14 @@ -12003,14 +12015,16 @@ packages: debug: 4.3.4 jsdom: 20.0.2 local-pkg: 0.4.2 + pathe: 1.1.0 picocolors: 1.0.0 source-map: 0.6.1 + std-env: 3.3.2 strip-literal: 1.0.0 tinybench: 2.3.1 - tinypool: 0.3.0 + tinypool: 0.3.1 tinyspy: 1.0.2 - vite: 4.0.1_@types+node@18.11.9 - vite-node: 0.27.1_@types+node@18.11.9 + vite: 3.2.3_@types+node@18.11.9 + vite-node: 0.28.4_@types+node@18.11.9 why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -12590,6 +12604,11 @@ packages: engines: {node: '>=10'} dev: true + /yocto-queue/1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + /zwitch/2.0.2: resolution: {integrity: sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==} dev: true From f83f09d8b0a7a8ecad021b132bc28f42a2c99083 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 9 Feb 2023 01:29:41 +0530 Subject: [PATCH 196/309] Fix vitest type --- package.json | 7 +-- packages/mermaid/src/tests/MockedD3.ts | 2 + pnpm-lock.yaml | 63 ++++++++++++++++++++------ 3 files changed, 54 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index b113afd9e..67b1dd8e3 100644 --- a/package.json +++ b/package.json @@ -69,8 +69,9 @@ "@types/rollup-plugin-visualizer": "^4.2.1", "@typescript-eslint/eslint-plugin": "^5.48.2", "@typescript-eslint/parser": "^5.48.2", - "@vitest/coverage-c8": "^0.28.0", - "@vitest/ui": "^0.28.0", + "@vitest/coverage-c8": "^0.28.4", + "@vitest/spy": "^0.28.4", + "@vitest/ui": "^0.28.4", "concurrently": "^7.5.0", "coveralls": "^3.1.1", "cypress": "^10.11.0", @@ -106,7 +107,7 @@ "ts-node": "^10.9.1", "typescript": "^4.8.4", "vite": "^3.2.3", - "vitest": "^0.28.0" + "vitest": "^0.28.4" }, "volta": { "node": "18.14.0" diff --git a/packages/mermaid/src/tests/MockedD3.ts b/packages/mermaid/src/tests/MockedD3.ts index 284b21b08..4600e2667 100644 --- a/packages/mermaid/src/tests/MockedD3.ts +++ b/packages/mermaid/src/tests/MockedD3.ts @@ -1,3 +1,5 @@ +import type {} from '@vitest/spy'; + /** * This is a mocked/stubbed version of the d3 Selection type. Each of the main functions are all * mocked (via vi.fn()) so you can track if they have been called, etc. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ff618a17..dc1844d36 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,10 +50,13 @@ importers: specifier: ^5.48.2 version: 5.48.2_yygwinqv3a2io74xmwofqb7uka '@vitest/coverage-c8': - specifier: ^0.28.0 + specifier: ^0.28.4 version: 0.28.4_ppxbkcip27yigfcjmn2ppf4tvu + '@vitest/spy': + specifier: ^0.28.4 + version: 0.28.4 '@vitest/ui': - specifier: ^0.28.0 + specifier: ^0.28.4 version: 0.28.4 concurrently: specifier: ^7.5.0 @@ -161,7 +164,7 @@ importers: specifier: ^3.2.3 version: 3.2.3_@types+node@18.11.9 vitest: - specifier: ^0.28.0 + specifier: ^0.28.4 version: 0.28.4_ppxbkcip27yigfcjmn2ppf4tvu packages/mermaid: @@ -4138,7 +4141,7 @@ packages: /axios/0.21.4_debug@4.3.2: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.2_debug@4.3.2 transitivePeerDependencies: - debug dev: true @@ -4466,7 +4469,7 @@ packages: check-error: 1.0.2 deep-eql: 4.1.3 get-func-name: 2.0.0 - loupe: 2.3.4 + loupe: 2.3.6 pathval: 1.1.1 type-detect: 4.0.8 dev: true @@ -6936,7 +6939,7 @@ packages: resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} dev: true - /follow-redirects/1.15.2: + /follow-redirects/1.15.2_debug@4.3.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -6944,6 +6947,8 @@ packages: peerDependenciesMeta: debug: optional: true + dependencies: + debug: 4.3.2 dev: true /foreground-child/2.0.0: @@ -7483,7 +7488,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2 + follow-redirects: 1.15.2_debug@4.3.2 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -8799,12 +8804,6 @@ packages: resolution: {integrity: sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==} dev: true - /loupe/2.3.4: - resolution: {integrity: sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==} - dependencies: - get-func-name: 2.0.0 - dev: true - /loupe/2.3.6: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} dependencies: @@ -11822,7 +11821,7 @@ packages: picocolors: 1.0.0 source-map: 0.6.1 source-map-support: 0.5.21 - vite: 3.2.3_@types+node@18.11.9 + vite: 4.0.1_@types+node@18.11.9 transitivePeerDependencies: - '@types/node' - less @@ -11933,6 +11932,40 @@ packages: fsevents: 2.3.2 dev: true + /vite/4.0.1_@types+node@18.11.9: + resolution: {integrity: sha512-kZQPzbDau35iWOhy3CpkrRC7It+HIHtulAzBhMqzGHKRf/4+vmh8rPDDdv98SWQrFWo6//3ozwsRmwQIPZsK9g==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.11.9 + esbuild: 0.16.7 + postcss: 8.4.20 + resolve: 1.22.1 + rollup: 3.7.4 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /vitepress-plugin-search/1.0.4-alpha.16_ifjhkyx3os4sbm7zdnvthc52am: resolution: {integrity: sha512-D+rs7bwzH+IO+7T9NlxvqSOqmSKbN1yHxUoqClTy5JH+DomL3CcrH2TgSvXc2s58ztlc1dC07c7THo4cNjlUAg==} engines: {node: ^14.13.1 || ^16.7.0 || >=18} @@ -12023,7 +12056,7 @@ packages: tinybench: 2.3.1 tinypool: 0.3.1 tinyspy: 1.0.2 - vite: 3.2.3_@types+node@18.11.9 + vite: 4.0.1_@types+node@18.11.9 vite-node: 0.28.4_@types+node@18.11.9 why-is-node-running: 2.2.2 transitivePeerDependencies: From 4d12fb046440b4d1756ee6ccfc68d8140694adab Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Wed, 8 Feb 2023 23:58:12 +0000 Subject: [PATCH 197/309] build(lint:fix): cache eslint in pnpm run lint:fix Cache eslint in `pnpm run lint:fix`. This was added to the `pnpm run lint` script in b7f9495 (build: add eslint --cache file, 2022-08-27), but we didn't add it to `pnpm run lint:fix` due to worries about cache invalidation. However, we switched to using `--cache-strategy content` in b3e509b7 (build(lint): cache eslint with strategy content, 2023-02-05), which should avoid any caching issues. Co-authored-by: Sidharth Vinod --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 67b1dd8e3..54443fda7 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "dev": "concurrently \"pnpm build:vite --watch\" \"ts-node-esm .vite/server.ts\"", "release": "pnpm build", "lint": "eslint --cache --cache-strategy content --ignore-path .gitignore . && pnpm lint:jison && prettier --cache --check .", - "lint:fix": "eslint --fix --ignore-path .gitignore . && prettier --write . && ts-node-esm scripts/fixCSpell.ts", + "lint:fix": "eslint --cache --cache-strategy content --fix --ignore-path .gitignore . && prettier --write . && ts-node-esm scripts/fixCSpell.ts", "lint:jison": "ts-node-esm ./scripts/jison/lint.mts", "cypress": "cypress run", "cypress:open": "cypress open", From d45eda1c60152dd45c4316a8b703bf984069d7e0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 8 Feb 2023 20:17:21 +0000 Subject: [PATCH 198/309] chore(deps): update dependency @types/uuid to v9 --- packages/mermaid/package.json | 2 +- pnpm-lock.yaml | 16 +++++++--------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index 3dd6c5af0..0d514102b 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -73,7 +73,7 @@ "@types/micromatch": "^4.0.2", "@types/prettier": "^2.7.1", "@types/stylis": "^4.0.2", - "@types/uuid": "^8.3.4", + "@types/uuid": "^9.0.0", "@typescript-eslint/eslint-plugin": "^5.42.1", "@typescript-eslint/parser": "^5.42.1", "chokidar": "^3.5.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc1844d36..7ba014f29 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -228,8 +228,8 @@ importers: specifier: ^4.0.2 version: 4.0.2 '@types/uuid': - specifier: ^8.3.4 - version: 8.3.4 + specifier: ^9.0.0 + version: 9.0.0 '@typescript-eslint/eslint-plugin': specifier: ^5.42.1 version: 5.42.1_qxgr6oy2qtsmmpo3f6iejuryuq @@ -3110,8 +3110,8 @@ packages: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} dev: true - /@types/uuid/8.3.4: - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + /@types/uuid/9.0.0: + resolution: {integrity: sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==} dev: true /@types/web-bluetooth/0.0.16: @@ -4141,7 +4141,7 @@ packages: /axios/0.21.4_debug@4.3.2: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2_debug@4.3.2 + follow-redirects: 1.15.2 transitivePeerDependencies: - debug dev: true @@ -6939,7 +6939,7 @@ packages: resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} dev: true - /follow-redirects/1.15.2_debug@4.3.2: + /follow-redirects/1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -6947,8 +6947,6 @@ packages: peerDependenciesMeta: debug: optional: true - dependencies: - debug: 4.3.2 dev: true /foreground-child/2.0.0: @@ -7488,7 +7486,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2_debug@4.3.2 + follow-redirects: 1.15.2 requires-port: 1.0.0 transitivePeerDependencies: - debug From bb3a48c91a4412aeb08ceab0c4b4952e6341f373 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 00:42:44 +0000 Subject: [PATCH 199/309] chore(deps): update actions/configure-pages action to v3 --- .github/workflows/publish-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 85bc79f6e..2153e11be 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -40,7 +40,7 @@ jobs: run: pnpm install --frozen-lockfile - name: Setup Pages - uses: actions/configure-pages@v2 + uses: actions/configure-pages@v3 - name: Run Build run: pnpm --filter mermaid run docs:build:vitepress From 3a89cc7993b7e32a70fcbeb25846f5c3c1105b90 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 00:47:08 +0000 Subject: [PATCH 200/309] chore(deps): update dependency jsdom to v21 --- package.json | 4 +-- packages/mermaid/package.json | 4 +-- pnpm-lock.yaml | 68 +++++++++++++++++++++++------------ 3 files changed, 50 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index 67b1dd8e3..83d905b00 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "@types/eslint": "^8.4.10", "@types/express": "^4.17.14", "@types/js-yaml": "^4.0.5", - "@types/jsdom": "^20.0.1", + "@types/jsdom": "^21.0.0", "@types/lodash": "^4.14.188", "@types/mdast": "^3.0.10", "@types/node": "^18.11.9", @@ -95,7 +95,7 @@ "jest": "^29.3.1", "jison": "^0.4.18", "js-yaml": "^4.1.0", - "jsdom": "^20.0.2", + "jsdom": "^21.0.0", "lint-staged": "^13.0.3", "path-browserify": "^1.0.1", "pnpm": "^7.15.0", diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index 0d514102b..9eb4e8b1e 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -68,7 +68,7 @@ "devDependencies": { "@types/d3": "^7.4.0", "@types/dompurify": "^2.4.0", - "@types/jsdom": "^20.0.1", + "@types/jsdom": "^21.0.0", "@types/lodash-es": "^4.17.6", "@types/micromatch": "^4.0.2", "@types/prettier": "^2.7.1", @@ -84,7 +84,7 @@ "globby": "^13.1.2", "jison": "^0.4.18", "js-base64": "^3.7.2", - "jsdom": "^20.0.2", + "jsdom": "^21.0.0", "micromatch": "^4.0.5", "path-browserify": "^1.0.1", "prettier": "^2.7.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ba014f29..456727fcd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,8 +26,8 @@ importers: specifier: ^4.0.5 version: 4.0.5 '@types/jsdom': - specifier: ^20.0.1 - version: 20.0.1 + specifier: ^21.0.0 + version: 21.1.0 '@types/lodash': specifier: ^4.14.188 version: 4.14.188 @@ -51,7 +51,7 @@ importers: version: 5.48.2_yygwinqv3a2io74xmwofqb7uka '@vitest/coverage-c8': specifier: ^0.28.4 - version: 0.28.4_ppxbkcip27yigfcjmn2ppf4tvu + version: 0.28.4_vun5xzxu3tkrssf3erdbijyyki '@vitest/spy': specifier: ^0.28.4 version: 0.28.4 @@ -128,8 +128,8 @@ importers: specifier: ^4.1.0 version: 4.1.0 jsdom: - specifier: ^20.0.2 - version: 20.0.2 + specifier: ^21.0.0 + version: 21.1.0 lint-staged: specifier: ^13.0.3 version: 13.0.3 @@ -165,7 +165,7 @@ importers: version: 3.2.3_@types+node@18.11.9 vitest: specifier: ^0.28.4 - version: 0.28.4_ppxbkcip27yigfcjmn2ppf4tvu + version: 0.28.4_vun5xzxu3tkrssf3erdbijyyki packages/mermaid: dependencies: @@ -213,8 +213,8 @@ importers: specifier: ^2.4.0 version: 2.4.0 '@types/jsdom': - specifier: ^20.0.1 - version: 20.0.1 + specifier: ^21.0.0 + version: 21.1.0 '@types/lodash-es': specifier: ^4.17.6 version: 4.17.6 @@ -261,8 +261,8 @@ importers: specifier: ^3.7.2 version: 3.7.2 jsdom: - specifier: ^20.0.2 - version: 20.0.2 + specifier: ^21.0.0 + version: 21.1.0 micromatch: specifier: ^4.0.5 version: 4.0.5 @@ -2936,8 +2936,8 @@ packages: resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==} dev: true - /@types/jsdom/20.0.1: - resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} + /@types/jsdom/21.1.0: + resolution: {integrity: sha512-leWreJOdnuIxq9Y70tBVm/bvTuh31DSlF/r4l7Cfi4uhVQqLHD0Q4v301GMisEMwwbMgF7ZKxuZ+Jbd4NcdmRw==} dependencies: '@types/node': 18.11.9 '@types/tough-cookie': 4.0.2 @@ -3411,13 +3411,13 @@ packages: vue: 3.2.45 dev: true - /@vitest/coverage-c8/0.28.4_ppxbkcip27yigfcjmn2ppf4tvu: + /@vitest/coverage-c8/0.28.4_vun5xzxu3tkrssf3erdbijyyki: resolution: {integrity: sha512-btelLBxaWhHnywXRQxDlrvPhGdnuIaD3XulsxcZRIcnpLPbFu39dNTT0IYu2QWP2ZZrV0AmNtdLIfD4c77zMAg==} dependencies: c8: 7.12.0 picocolors: 1.0.0 std-env: 3.3.2 - vitest: 0.28.4_ppxbkcip27yigfcjmn2ppf4tvu + vitest: 0.28.4_vun5xzxu3tkrssf3erdbijyyki transitivePeerDependencies: - '@edge-runtime/vm' - '@vitest/browser' @@ -5721,6 +5721,10 @@ packages: resolution: {integrity: sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw==} dev: true + /decimal.js/10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true + /decode-named-character-reference/1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} dependencies: @@ -8420,8 +8424,8 @@ packages: engines: {node: '>=12.0.0'} dev: true - /jsdom/20.0.2: - resolution: {integrity: sha512-AHWa+QO/cgRg4N+DsmHg1Y7xnz+8KU3EflM0LVDTdmrYOc1WWTSkOjtpUveQH+1Bqd5rtcVnb/DuxV/UjDO4rA==} + /jsdom/21.1.0: + resolution: {integrity: sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg==} engines: {node: '>=14'} peerDependencies: canvas: ^2.5.0 @@ -8430,12 +8434,12 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.8.0 + acorn: 8.8.1 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 data-urls: 3.0.2 - decimal.js: 10.4.1 + decimal.js: 10.4.3 domexception: 4.0.0 escodegen: 2.0.0 form-data: 4.0.0 @@ -8448,12 +8452,12 @@ packages: saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 4.1.2 - w3c-xmlserializer: 3.0.0 + w3c-xmlserializer: 4.0.0 webidl-conversions: 7.0.0 whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.9.0 + ws: 8.12.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -12009,7 +12013,7 @@ packages: - terser dev: true - /vitest/0.28.4_ppxbkcip27yigfcjmn2ppf4tvu: + /vitest/0.28.4_vun5xzxu3tkrssf3erdbijyyki: resolution: {integrity: sha512-sfWIy0AdlbyGRhunm+TLQEJrFH9XuRPdApfubsyLcDbCRrUX717BRQKInTgzEfyl2Ipi1HWoHB84Nqtcwxogcg==} engines: {node: '>=v14.16.0'} hasBin: true @@ -12044,7 +12048,7 @@ packages: cac: 6.7.14 chai: 4.3.7 debug: 4.3.4 - jsdom: 20.0.2 + jsdom: 21.1.0 local-pkg: 0.4.2 pathe: 1.1.0 picocolors: 1.0.0 @@ -12148,6 +12152,13 @@ packages: xml-name-validator: 4.0.0 dev: true + /w3c-xmlserializer/4.0.0: + resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} + engines: {node: '>=14'} + dependencies: + xml-name-validator: 4.0.0 + dev: true + /wait-on/6.0.0_debug@4.3.2: resolution: {integrity: sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw==} engines: {node: '>=10.0.0'} @@ -12497,6 +12508,19 @@ packages: optional: true dev: true + /ws/8.12.0: + resolution: {integrity: sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /ws/8.5.0: resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} engines: {node: '>=10.0.0'} From 72e8b7fb38973208097b53a7b7fe5071d80fc404 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 00:49:20 +0000 Subject: [PATCH 201/309] chore(deps): update dependency rimraf to v4 --- package.json | 2 +- packages/mermaid-example-diagram/package.json | 2 +- packages/mermaid-mindmap/package.json | 2 +- packages/mermaid/package.json | 2 +- pnpm-lock.yaml | 22 ++++++++++++------- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 67b1dd8e3..3bc79e20c 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,7 @@ "pnpm": "^7.15.0", "prettier": "^2.7.1", "prettier-plugin-jsdoc": "^0.4.2", - "rimraf": "^3.0.2", + "rimraf": "^4.0.0", "rollup-plugin-visualizer": "^5.8.3", "start-server-and-test": "^1.14.0", "ts-node": "^10.9.1", diff --git a/packages/mermaid-example-diagram/package.json b/packages/mermaid-example-diagram/package.json index 8e958806a..13ab587cc 100644 --- a/packages/mermaid-example-diagram/package.json +++ b/packages/mermaid-example-diagram/package.json @@ -51,7 +51,7 @@ "dependencies": {}, "devDependencies": { "concurrently": "^7.5.0", - "rimraf": "^3.0.2" + "rimraf": "^4.0.0" }, "resolutions": { "d3": "^7.0.0" diff --git a/packages/mermaid-mindmap/package.json b/packages/mermaid-mindmap/package.json index e79e2df4f..8c861097b 100644 --- a/packages/mermaid-mindmap/package.json +++ b/packages/mermaid-mindmap/package.json @@ -50,7 +50,7 @@ "@types/cytoscape": "^3.19.9", "concurrently": "^7.5.0", "mermaid": "workspace:*", - "rimraf": "^3.0.2" + "rimraf": "^4.0.0" }, "resolutions": { "d3": "^7.0.0" diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index 0d514102b..cf44d7afb 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -91,7 +91,7 @@ "remark": "^14.0.2", "remark-frontmatter": "^4.0.1", "remark-gfm": "^3.0.1", - "rimraf": "^3.0.2", + "rimraf": "^4.0.0", "start-server-and-test": "^1.14.0", "typedoc": "^0.23.18", "typedoc-plugin-markdown": "^3.13.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ba014f29..fe9715b1e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -146,8 +146,8 @@ importers: specifier: ^0.4.2 version: 0.4.2_prettier@2.7.1 rimraf: - specifier: ^3.0.2 - version: 3.0.2 + specifier: ^4.0.0 + version: 4.1.2 rollup-plugin-visualizer: specifier: ^5.8.3 version: 5.8.3 @@ -282,8 +282,8 @@ importers: specifier: ^3.0.1 version: 3.0.1 rimraf: - specifier: ^3.0.2 - version: 3.0.2 + specifier: ^4.0.0 + version: 4.1.2 start-server-and-test: specifier: ^1.14.0 version: 1.14.0 @@ -312,8 +312,8 @@ importers: specifier: ^7.5.0 version: 7.5.0 rimraf: - specifier: ^3.0.2 - version: 3.0.2 + specifier: ^4.0.0 + version: 4.1.2 packages/mermaid-mindmap: dependencies: @@ -349,8 +349,8 @@ importers: specifier: workspace:* version: link:../mermaid rimraf: - specifier: ^3.0.2 - version: 3.0.2 + specifier: ^4.0.0 + version: 4.1.2 tests/webpack: dependencies: @@ -10546,6 +10546,12 @@ packages: glob: 7.2.3 dev: true + /rimraf/4.1.2: + resolution: {integrity: sha512-BlIbgFryTbw3Dz6hyoWFhKk+unCcHMSkZGrTFVAx2WmttdBSonsdtRlwiuTbDqTKr+UlXIUqJVS4QT5tUzGENQ==} + engines: {node: '>=14'} + hasBin: true + dev: true + /robust-predicates/3.0.1: resolution: {integrity: sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==} dev: false From 886d1c15c4fa147fb43af3cdaea3fa310f446d3f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 00:51:38 +0000 Subject: [PATCH 202/309] chore(deps): update timonvs/pr-labeler-action action to v4 --- .github/workflows/pr-labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-labeler.yml b/.github/workflows/pr-labeler.yml index 107743c6a..0a53c6e42 100644 --- a/.github/workflows/pr-labeler.yml +++ b/.github/workflows/pr-labeler.yml @@ -8,6 +8,6 @@ jobs: runs-on: ubuntu-latest steps: - name: Label PR - uses: TimonVS/pr-labeler-action@v3 + uses: TimonVS/pr-labeler-action@v4 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From f791cd2b24616804b7950e09585e4f4ad5ba429c Mon Sep 17 00:00:00 2001 From: Frederic Lavigne Date: Wed, 8 Feb 2023 22:02:19 -0600 Subject: [PATCH 203/309] =?UTF-8?q?=F0=9F=92=84=20section=20width=20now=20?= =?UTF-8?q?covers=20all=20tasks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/diagrams/user-journey/journeyRenderer.ts | 12 ++++++++++++ .../mermaid/src/diagrams/user-journey/svgDraw.js | 5 ++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/mermaid/src/diagrams/user-journey/journeyRenderer.ts b/packages/mermaid/src/diagrams/user-journey/journeyRenderer.ts index df46fc9c6..c34f8f5b2 100644 --- a/packages/mermaid/src/diagrams/user-journey/journeyRenderer.ts +++ b/packages/mermaid/src/diagrams/user-journey/journeyRenderer.ts @@ -224,6 +224,17 @@ export const drawTasks = function (diagram, tasks, verticalPos) { num = sectionNumber % fills.length; colour = textColours[sectionNumber % textColours.length]; + // count how many consecutive tasks have the same section + let taskInSectionCount = 0; + const currentSection = task.section; + for (let taskIndex = i; taskIndex < tasks.length; taskIndex++) { + if (tasks[taskIndex].section == currentSection) { + taskInSectionCount = taskInSectionCount + 1; + } else { + break; + } + } + const section = { x: i * conf.taskMargin + i * conf.width + LEFT_MARGIN, y: 50, @@ -231,6 +242,7 @@ export const drawTasks = function (diagram, tasks, verticalPos) { fill, num, colour, + taskCount: taskInSectionCount, }; svgDraw.drawSection(diagram, section, conf); diff --git a/packages/mermaid/src/diagrams/user-journey/svgDraw.js b/packages/mermaid/src/diagrams/user-journey/svgDraw.js index 74d5d2a02..f6dbe71e1 100644 --- a/packages/mermaid/src/diagrams/user-journey/svgDraw.js +++ b/packages/mermaid/src/diagrams/user-journey/svgDraw.js @@ -196,7 +196,10 @@ export const drawSection = function (elem, section, conf) { rect.x = section.x; rect.y = section.y; rect.fill = section.fill; - rect.width = conf.width; + // section width covers all nested tasks + rect.width = + conf.width * section.taskCount + // width of the tasks + conf.diagramMarginX * (section.taskCount - 1); // width of space between tasks rect.height = conf.height; rect.class = 'journey-section section-type-' + section.num; rect.rx = 3; From 34c98717d5fe6e548d3cf8fa3244cbf23ece7f21 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 05:44:09 +0000 Subject: [PATCH 204/309] chore(deps): update actions/dependency-review-action action to v3 --- .github/workflows/dependency-review.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 845c763e8..34b14c395 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -17,4 +17,4 @@ jobs: - name: 'Checkout Repository' uses: actions/checkout@v3 - name: 'Dependency Review' - uses: actions/dependency-review-action@v2 + uses: actions/dependency-review-action@v3 From 08ac41113f55d8af357e750b953757e010efec8a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Feb 2023 05:54:04 +0000 Subject: [PATCH 205/309] chore(deps): update dependency vite to v4 --- package.json | 2 +- pnpm-lock.yaml | 40 +++------------------------------------- 2 files changed, 4 insertions(+), 38 deletions(-) diff --git a/package.json b/package.json index 91d9316b3..36bc5bae8 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "start-server-and-test": "^1.14.0", "ts-node": "^10.9.1", "typescript": "^4.8.4", - "vite": "^3.2.3", + "vite": "^4.0.0", "vitest": "^0.28.4" }, "volta": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5fbd25bbe..d59edac9f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -161,8 +161,8 @@ importers: specifier: ^4.8.4 version: 4.8.4 vite: - specifier: ^3.2.3 - version: 3.2.3_@types+node@18.11.9 + specifier: ^4.0.0 + version: 4.0.1_@types+node@18.11.9 vitest: specifier: ^0.28.4 version: 0.28.4_vun5xzxu3tkrssf3erdbijyyki @@ -11866,41 +11866,7 @@ packages: optional: true dependencies: esbuild: 0.15.13 - postcss: 8.4.18 - resolve: 1.22.1 - rollup: 2.79.1 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /vite/3.2.3_@types+node@18.11.9: - resolution: {integrity: sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.11.9 - esbuild: 0.15.13 - postcss: 8.4.18 + postcss: 8.4.20 resolve: 1.22.1 rollup: 2.79.1 optionalDependencies: From 004432fae9bc8592a5820560bde4d619d11c8e92 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 9 Feb 2023 11:28:27 +0530 Subject: [PATCH 206/309] Fix types --- .vite/build.ts | 15 ++++++++------- packages/mermaid/src/docs/vite.config.ts | 5 ++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.vite/build.ts b/.vite/build.ts index 019461c49..71f94bc69 100644 --- a/.vite/build.ts +++ b/.vite/build.ts @@ -20,13 +20,14 @@ const visualizerOptions = (packageName: string, core = false): PluginOption[] => if (packageName !== 'mermaid' || !visualize) { return []; } - return ['network', 'treemap', 'sunburst'].map((chartType) => - visualizer({ - filename: `./stats/${chartType}${core ? '.core' : ''}.html`, - template: chartType as TemplateType, - gzipSize: true, - brotliSize: true, - }) + return ['network', 'treemap', 'sunburst'].map( + (chartType) => + visualizer({ + filename: `./stats/${chartType}${core ? '.core' : ''}.html`, + template: chartType as TemplateType, + gzipSize: true, + brotliSize: true, + }) as PluginOption ); }; diff --git a/packages/mermaid/src/docs/vite.config.ts b/packages/mermaid/src/docs/vite.config.ts index 356e9398c..5a7682553 100644 --- a/packages/mermaid/src/docs/vite.config.ts +++ b/packages/mermaid/src/docs/vite.config.ts @@ -1,6 +1,5 @@ -import { defineConfig, searchForWorkspaceRoot } from 'vite'; +import { defineConfig, type PluginOption, searchForWorkspaceRoot } from 'vite'; import path from 'path'; -// @ts-ignore: still in alpha import { SearchPlugin } from 'vitepress-plugin-search'; const virtualModuleId = 'virtual:mermaid-config'; @@ -8,7 +7,7 @@ const resolvedVirtualModuleId = '\0' + virtualModuleId; export default defineConfig({ plugins: [ - SearchPlugin(), + SearchPlugin() as PluginOption, { // TODO: will be fixed in the next vitepress release. name: 'fix-virtual', From f6d9868e35489e00875650c61864af063159f917 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 9 Feb 2023 11:34:20 +0530 Subject: [PATCH 207/309] chore: Lint fix --- README.zh-CN.md | 4 +--- packages/mermaid/README.zh-CN.md | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index b7ffc5bc8..2b96a2933 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -325,9 +325,7 @@ _很不幸的是,鱼与熊掌不可兼得,在这个场景下它意味着在 来自 Knut Sveidqvist: -> _特别感谢 [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/knsv/mermaid/graphs/contributors),没有你们,就没有这个项目的今天!_ diff --git a/packages/mermaid/README.zh-CN.md b/packages/mermaid/README.zh-CN.md index 9f709a81a..1537e9af5 100644 --- a/packages/mermaid/README.zh-CN.md +++ b/packages/mermaid/README.zh-CN.md @@ -325,9 +325,7 @@ _很不幸的是,鱼与熊掌不可兼得,在这个场景下它意味着在 来自 Knut Sveidqvist: -> _特别感谢 [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/knsv/mermaid/graphs/contributors),没有你们,就没有这个项目的今天!_ From ad6a43cf813e211ece95dd99b7b935c88f9fb2a5 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 9 Feb 2023 12:46:05 +0530 Subject: [PATCH 208/309] Add logo to readme --- README.md | 28 +++++++++++++++++-- README.zh-CN.md | 28 +++++++++++++++++-- packages/mermaid/README.md | 42 ++++++++++++++++++++++------ packages/mermaid/README.zh-CN.md | 48 +++++++++++++++++++++++--------- 4 files changed, 119 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 9fed47a69..2b621807e 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,31 @@ -# mermaid +

+ +

+

+Mermaid +

+

+Generate diagrams from markdown-like text. +

+

+ +

+ +

+Live Editor! +

+

+ Documentation | Getting Started | Join Us +

+

+简体中文 +

+ +
+
[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/badge/Social-mermaidjs__-blue?style=social&logo=twitter)](https://twitter.com/mermaidjs_) -English | [简体中文](./README.zh-CN.md) - :trophy: **Mermaid was nominated and won the [JS Open Source Awards (2019)](https://osawards.com/javascript/2019) in the category "The most exciting use of technology"!!!** diff --git a/README.zh-CN.md b/README.zh-CN.md index 2b96a2933..5c137a5e0 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -1,9 +1,31 @@ -# mermaid +

+ +

+

+Mermaid +

+

+通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。 +

+

+ +

+ +

+Live Editor! +

+

+ 文档 | 入门 | 加入我们 +

+

+English +

+ +
+
[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/badge/Social-mermaidjs__-blue?style=social&logo=twitter)](https://twitter.com/mermaidjs_) -[English](./README.md) | 简体中文 - :trophy: **Mermaid 被提名并获得了 [JS Open Source Awards (2019)](https://osawards.com/javascript/2019) 的 "The most exciting use of technology" 奖项!!!** diff --git a/packages/mermaid/README.md b/packages/mermaid/README.md index e6c7db608..2b621807e 100644 --- a/packages/mermaid/README.md +++ b/packages/mermaid/README.md @@ -1,8 +1,30 @@ -# mermaid +

+ +

+

+Mermaid +

+

+Generate diagrams from markdown-like text. +

+

+ +

-[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/twitter/follow/mermaidjs_?style=social)](https://twitter.com/mermaidjs_) +

+Live Editor! +

+

+ Documentation | Getting Started | Join Us +

+

+简体中文 +

-English | [简体中文](./README.zh-CN.md) +
+
+ +[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/badge/Social-mermaidjs__-blue?style=social&logo=twitter)](https://twitter.com/mermaidjs_) @@ -26,12 +48,12 @@ Mermaid addresses this problem by enabling users to create easily modifiable dia
Mermaid allows even non-programmers to easily create detailed diagrams through the [Mermaid Live Editor](https://mermaid.live/).
-[Tutorials](./docs/Tutorials.md) has video tutorials. -Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](./docs/integrations.md). +[Tutorials](./docs/config/Tutorials.md) has video tutorials. +Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](./docs/misc/integrations.md). -You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](./docs/integrations.md). +You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](./docs/misc/integrations.md). -For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](./docs/n00b-overview.md), [Usage](./docs/usage.md) and [Tutorials](./docs/Tutorials.md). +For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](./docs/community/n00b-overview.md), [Usage](./docs/config/usage.md) and [Tutorials](./docs/config/Tutorials.md). 🌐 [CDN](https://unpkg.com/mermaid/) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md) | 📜 [Changelog](./docs/CHANGELOG.md) @@ -337,7 +359,11 @@ To report a vulnerability, please e-mail security@mermaid.live with a descriptio A quick note from Knut Sveidqvist: -> _Many thanks to the [d3](https://d3js.org/) and [dagre-d3](https://github.com/cpettitt/dagre-d3) projects for providing the graphical layout and drawing libraries!_ >_Thanks also to the [js-sequence-diagram](https://bramp.github.io/js-sequence-diagrams) project for usage of the grammar for the sequence diagrams. Thanks to Jessica Peter for inspiration and starting point for gantt rendering._ >_Thank you to [Tyler Long](https://github.com/tylerlong) who has been a collaborator since April 2017._ +> _Many thanks to the [d3](https://d3js.org/) and [dagre-d3](https://github.com/cpettitt/dagre-d3) projects for providing the graphical layout and drawing libraries!_ +> +> _Thanks also to the [js-sequence-diagram](https://bramp.github.io/js-sequence-diagrams) project for usage of the grammar for the sequence diagrams. Thanks to Jessica Peter for inspiration and starting point for gantt rendering._ +> +> _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/knsv/mermaid/graphs/contributors) that brought the project this far!_ diff --git a/packages/mermaid/README.zh-CN.md b/packages/mermaid/README.zh-CN.md index 1537e9af5..5c137a5e0 100644 --- a/packages/mermaid/README.zh-CN.md +++ b/packages/mermaid/README.zh-CN.md @@ -1,8 +1,30 @@ -# mermaid +

+ +

+

+Mermaid +

+

+通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。 +

+

+ +

-[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/twitter/follow/mermaidjs_?style=social)](https://twitter.com/mermaidjs_) +

+Live Editor! +

+

+ 文档 | 入门 | 加入我们 +

+

+English +

-[English](./README.md) | 简体中文 +
+
+ +[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/badge/Social-mermaidjs__-blue?style=social&logo=twitter)](https://twitter.com/mermaidjs_) @@ -24,9 +46,9 @@ Mermaid 是一个基于 Javascript 的图表绘制工具,通过解析类 Markd Mermaid 通过允许用户创建便于修改的图表来解决这一难题,它也可以作为生产脚本(或其他代码)的一部分。

Mermaid 甚至能让非程序员也能通过 [Mermaid Live Editor](https://mermaid.live/) 轻松创建详细的图表。
-你可以访问 [教程](./docs/Tutorials.md) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](./docs/integrations.md) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。 +你可以访问 [教程](./docs/config/Tutorials.md) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](./docs/misc/integrations.md) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。 -如果想要查看关于 Mermaid 更详细的介绍及基础使用方式,可以查看 [入门指引](./docs/n00b-overview.md), [用法](./docs/usage.md) 和 [教程](./docs/Tutorials.md). +如果想要查看关于 Mermaid 更详细的介绍及基础使用方式,可以查看 [入门指引](./docs/community/n00b-overview.md), [用法](./docs/config/usage.md) 和 [教程](./docs/config/Tutorials.md). 🌐 [CDN](https://unpkg.com/mermaid/) | 📖 [文档](https://mermaidjs.github.io) | 🙌 [贡献](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md) | 📜 [更新日志](./docs/CHANGELOG.md) @@ -39,7 +61,7 @@ Mermaid 甚至能让非程序员也能通过 [Mermaid Live Editor](https://merma -### 流程图 [文档 - live editor] +### 流程图 [文档 - live editor] ``` flowchart LR @@ -57,7 +79,7 @@ C -->|One| D[Result 1] C -->|Two| E[Result 2] ``` -### 时序图 [文档 - live editor] +### 时序图 [文档 - live editor] ``` sequenceDiagram @@ -83,7 +105,7 @@ John->>Bob: How about you? Bob-->>John: Jolly good! ``` -### 甘特图 [文档 - live editor] +### 甘特图 [文档 - live editor] ``` gantt @@ -107,7 +129,7 @@ gantt Parallel 4 : des6, after des4, 1d ``` -### 类图 [文档 - live editor] +### 类图 [文档 - live editor] ``` classDiagram @@ -147,7 +169,7 @@ class Class10 { } ``` -### 状态图 [[docs - live editor] +### 状态图 [[docs - live editor] ``` stateDiagram-v2 @@ -169,7 +191,7 @@ Moving --> Crash Crash --> [*] ``` -### 饼图 [文档 - live editor] +### 饼图 [文档 - live editor] ``` pie @@ -185,9 +207,9 @@ pie "Rats" : 15 ``` -### Git 图 [实验特性 - live editor] +### Git 图 [实验特性 - live editor] -### 用户体验旅程图 [文档 - live editor] +### 用户体验旅程图 [文档 - live editor] ``` journey From fd8fb96ec2e20ee76358337f409c23ce92f2f83d Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 10 Feb 2023 12:14:58 +0530 Subject: [PATCH 209/309] chore: Copy readme before publishing --- packages/mermaid/.gitignore | 3 +- packages/mermaid/README.md | 372 ------------------------------- packages/mermaid/README.zh-CN.md | 356 ----------------------------- packages/mermaid/package.json | 2 +- 4 files changed, 3 insertions(+), 730 deletions(-) delete mode 100644 packages/mermaid/README.md delete mode 100644 packages/mermaid/README.zh-CN.md diff --git a/packages/mermaid/.gitignore b/packages/mermaid/.gitignore index 1a961ffe0..6ed32bcf7 100644 --- a/packages/mermaid/.gitignore +++ b/packages/mermaid/.gitignore @@ -1,2 +1,3 @@ src/vitepress -src/docs/config/setup \ No newline at end of file +src/docs/config/setup +README.* \ No newline at end of file diff --git a/packages/mermaid/README.md b/packages/mermaid/README.md deleted file mode 100644 index 2b621807e..000000000 --- a/packages/mermaid/README.md +++ /dev/null @@ -1,372 +0,0 @@ -

- -

-

-Mermaid -

-

-Generate diagrams from markdown-like text. -

-

- -

- -

-Live Editor! -

-

- Documentation | Getting Started | Join Us -

-

-简体中文 -

- -
-
- -[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/badge/Social-mermaidjs__-blue?style=social&logo=twitter)](https://twitter.com/mermaidjs_) - - - -:trophy: **Mermaid was nominated and won the [JS Open Source Awards (2019)](https://osawards.com/javascript/2019) in the category "The most exciting use of technology"!!!** - -**Thanks to all involved, people committing pull requests, people answering questions! 🙏** - -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! - -## About - - - -Mermaid is a JavaScript-based diagramming and charting tool that uses Markdown-inspired text definitions and a renderer to create and modify complex diagrams. The main purpose of Mermaid is to help documentation catch up with development. - -> Doc-Rot is a Catch-22 that Mermaid helps to solve. - -Diagramming and documentation costs precious developer time and gets outdated quickly. -But not having diagrams or docs ruins productivity and hurts organizational learning.
-Mermaid addresses this problem by enabling users to create easily modifiable diagrams. It can also be made part of production scripts (and other pieces of code).
-
- -Mermaid allows even non-programmers to easily create detailed diagrams through the [Mermaid Live Editor](https://mermaid.live/).
-[Tutorials](./docs/config/Tutorials.md) has video tutorials. -Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](./docs/misc/integrations.md). - -You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](./docs/misc/integrations.md). - -For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](./docs/community/n00b-overview.md), [Usage](./docs/config/usage.md) and [Tutorials](./docs/config/Tutorials.md). - -🌐 [CDN](https://unpkg.com/mermaid/) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md) | 📜 [Changelog](./docs/CHANGELOG.md) - -In our release process we rely heavily on visual regression tests using [applitools](https://applitools.com/). Applitools is a great service which has been easy to use and integrate with our tests. - - - - - - - -## Examples - -**The following are some examples of the diagrams, charts and graphs that can be made using Mermaid. Click here to jump into the [text syntax](https://mermaid-js.github.io/mermaid/#/n00b-syntaxReference).** - - - -### Flowchart [docs - live editor] - -``` -flowchart LR - -A[Hard] -->|Text| B(Round) -B --> C{Decision} -C -->|One| D[Result 1] -C -->|Two| E[Result 2] -``` - -```mermaid -flowchart LR - -A[Hard] -->|Text| B(Round) -B --> C{Decision} -C -->|One| D[Result 1] -C -->|Two| E[Result 2] -``` - -### Sequence diagram [docs - live editor] - -``` -sequenceDiagram -Alice->>John: Hello John, how are you? -loop Healthcheck - John->>John: Fight against hypochondria -end -Note right of John: Rational thoughts! -John-->>Alice: Great! -John->>Bob: How about you? -Bob-->>John: Jolly good! -``` - -```mermaid -sequenceDiagram -Alice->>John: Hello John, how are you? -loop Healthcheck - John->>John: Fight against hypochondria -end -Note right of John: Rational thoughts! -John-->>Alice: Great! -John->>Bob: How about you? -Bob-->>John: Jolly good! -``` - -### Gantt chart [docs - live editor] - -``` -gantt - section Section - Completed :done, des1, 2014-01-06,2014-01-08 - Active :active, des2, 2014-01-07, 3d - Parallel 1 : des3, after des1, 1d - Parallel 2 : des4, after des1, 1d - Parallel 3 : des5, after des3, 1d - Parallel 4 : des6, after des4, 1d -``` - -```mermaid -gantt - section Section - Completed :done, des1, 2014-01-06,2014-01-08 - Active :active, des2, 2014-01-07, 3d - Parallel 1 : des3, after des1, 1d - Parallel 2 : des4, after des1, 1d - Parallel 3 : des5, after des3, 1d - Parallel 4 : des6, after des4, 1d -``` - -### Class diagram [docs - live editor] - -``` -classDiagram -Class01 <|-- AveryLongClass : Cool -<> Class01 -Class09 --> C2 : Where am I? -Class09 --* C3 -Class09 --|> Class07 -Class07 : equals() -Class07 : Object[] elementData -Class01 : size() -Class01 : int chimp -Class01 : int gorilla -class Class10 { - <> - int id - size() -} -``` - -```mermaid -classDiagram -Class01 <|-- AveryLongClass : Cool -<> Class01 -Class09 --> C2 : Where am I? -Class09 --* C3 -Class09 --|> Class07 -Class07 : equals() -Class07 : Object[] elementData -Class01 : size() -Class01 : int chimp -Class01 : int gorilla -class Class10 { - <> - int id - size() -} -``` - -### State diagram [docs - live editor] - -``` -stateDiagram-v2 -[*] --> Still -Still --> [*] -Still --> Moving -Moving --> Still -Moving --> Crash -Crash --> [*] -``` - -```mermaid -stateDiagram-v2 -[*] --> Still -Still --> [*] -Still --> Moving -Moving --> Still -Moving --> Crash -Crash --> [*] -``` - -### Pie chart [docs - live editor] - -``` -pie -"Dogs" : 386 -"Cats" : 85.9 -"Rats" : 15 -``` - -```mermaid -pie -"Dogs" : 386 -"Cats" : 85.9 -"Rats" : 15 -``` - -### Git graph [experimental - live editor] - -### User Journey diagram [docs - live editor] - -``` - journey - title My working day - section Go to work - Make tea: 5: Me - Go upstairs: 3: Me - Do work: 1: Me, Cat - section Go home - Go downstairs: 5: Me - Sit down: 3: Me -``` - -```mermaid - journey - title My working day - section Go to work - Make tea: 5: Me - Go upstairs: 3: Me - Do work: 1: Me, Cat - section Go home - Go downstairs: 5: Me - Sit down: 3: Me -``` - -### C4 diagram [docs] - -``` -C4Context -title System Context diagram for Internet Banking System - -Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.") -Person(customerB, "Banking Customer B") -Person_Ext(customerC, "Banking Customer C") -System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.") - -Person(customerD, "Banking Customer D", "A customer of the bank,
with personal bank accounts.") - -Enterprise_Boundary(b1, "BankBoundary") { - - SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") - - System_Boundary(b2, "BankBoundary2") { - System(SystemA, "Banking System A") - System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.") - } - - System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") - SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.") - - Boundary(b3, "BankBoundary3", "boundary") { - SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.") - SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.") - } -} - -BiRel(customerA, SystemAA, "Uses") -BiRel(SystemAA, SystemE, "Uses") -Rel(SystemAA, SystemC, "Sends e-mails", "SMTP") -Rel(SystemC, customerA, "Sends e-mails to") -``` - -```mermaid -C4Context -title System Context diagram for Internet Banking System - -Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.") -Person(customerB, "Banking Customer B") -Person_Ext(customerC, "Banking Customer C") -System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.") - -Person(customerD, "Banking Customer D", "A customer of the bank,
with personal bank accounts.") - -Enterprise_Boundary(b1, "BankBoundary") { - - SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") - - System_Boundary(b2, "BankBoundary2") { - System(SystemA, "Banking System A") - System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.") - } - - System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") - SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.") - - Boundary(b3, "BankBoundary3", "boundary") { - SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.") - SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.") - } -} - -BiRel(customerA, SystemAA, "Uses") -BiRel(SystemAA, SystemE, "Uses") -Rel(SystemAA, SystemC, "Sends e-mails", "SMTP") -Rel(SystemC, customerA, "Sends e-mails to") -``` - -## Release - -For those who have the permission to do so: - -Update version number in `package.json`. - -```sh -npm publish -``` - -The above command generates files into the `dist` folder and publishes them to npmjs.org. - -## Related projects - -- [Command Line Interface](https://github.com/mermaid-js/mermaid-cli) -- [Live Editor](https://github.com/mermaid-js/mermaid-live-editor) -- [HTTP Server](https://github.com/TomWright/mermaid-server) - -## Contributors [![Good first issue](https://img.shields.io/github/labels/mermaid-js/mermaid/Good%20first%20issue%21)](https://github.com/mermaid-js/mermaid/issues?q=is%3Aissue+is%3Aopen+label%3A%22Good+first+issue%21%22) [![Contributors](https://img.shields.io/github/contributors/mermaid-js/mermaid)](https://github.com/mermaid-js/mermaid/graphs/contributors) [![Commits](https://img.shields.io/github/commit-activity/m/mermaid-js/mermaid)](https://github.com/mermaid-js/mermaid/graphs/contributors) - -Mermaid is a growing community and is always accepting new contributors. There's a lot of different ways to help out and we're always looking for extra hands! Look at [this issue](https://github.com/mermaid-js/mermaid/issues/866) if you want to know where to start helping out. - -Detailed information about how to contribute can be found in the [contribution guide](CONTRIBUTING.md) - -## Security and safe diagrams - -For public sites, it can be precarious to retrieve text from users on the internet, storing that content for presentation in a browser at a later stage. The reason is that the user content can contain embedded malicious scripts that will run when the data is presented. For Mermaid this is a risk, specially as mermaid diagrams contain many characters that are used in html which makes the standard sanitation unusable as it also breaks the diagrams. We still make an effort to sanitise the incoming code and keep refining the process but it is hard to guarantee that there are no loop holes. - -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 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 - -To report a vulnerability, please e-mail security@mermaid.live with a description of the issue, the steps you took to create the issue, affected versions, and if known, mitigations for the issue. - -## Appreciation - -A quick note from Knut Sveidqvist: - -> _Many thanks to the [d3](https://d3js.org/) and [dagre-d3](https://github.com/cpettitt/dagre-d3) projects for providing the graphical layout and drawing libraries!_ -> -> _Thanks also to the [js-sequence-diagram](https://bramp.github.io/js-sequence-diagrams) project for usage of the grammar for the sequence diagrams. Thanks to Jessica Peter for inspiration and starting point for gantt rendering._ -> -> _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/knsv/mermaid/graphs/contributors) that brought the project this far!_ - ---- - -_Mermaid was created by Knut Sveidqvist for easier documentation._ diff --git a/packages/mermaid/README.zh-CN.md b/packages/mermaid/README.zh-CN.md deleted file mode 100644 index 5c137a5e0..000000000 --- a/packages/mermaid/README.zh-CN.md +++ /dev/null @@ -1,356 +0,0 @@ -

- -

-

-Mermaid -

-

-通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。 -

-

- -

- -

-Live Editor! -

-

- 文档 | 入门 | 加入我们 -

-

-English -

- -
-
- -[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/badge/Social-mermaidjs__-blue?style=social&logo=twitter)](https://twitter.com/mermaidjs_) - - - -:trophy: **Mermaid 被提名并获得了 [JS Open Source Awards (2019)](https://osawards.com/javascript/2019) 的 "The most exciting use of technology" 奖项!!!** - -**感谢所有参与进来提交 PR,解答疑问的人们! 🙏** - -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! - -## 关于 Mermaid - - - -Mermaid 是一个基于 Javascript 的图表绘制工具,通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。Mermaid 诞生的主要目的是让文档的更新能够及时跟上开发进度。 - -> Doc-Rot 是 Mermaid 致力于解决的一个难题。 - -绘图和编写文档花费了开发者宝贵的开发时间,而且随着业务的变更,它很快就会过期。 但是如果缺少了图表或文档,对于生产力和团队新人的业务学习都会产生巨大的阻碍。
-Mermaid 通过允许用户创建便于修改的图表来解决这一难题,它也可以作为生产脚本(或其他代码)的一部分。
-
-Mermaid 甚至能让非程序员也能通过 [Mermaid Live Editor](https://mermaid.live/) 轻松创建详细的图表。
-你可以访问 [教程](./docs/config/Tutorials.md) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](./docs/misc/integrations.md) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。 - -如果想要查看关于 Mermaid 更详细的介绍及基础使用方式,可以查看 [入门指引](./docs/community/n00b-overview.md), [用法](./docs/config/usage.md) 和 [教程](./docs/config/Tutorials.md). - -🌐 [CDN](https://unpkg.com/mermaid/) | 📖 [文档](https://mermaidjs.github.io) | 🙌 [贡献](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md) | 📜 [更新日志](./docs/CHANGELOG.md) - - - -## 示例 - -**下面是一些可以使用 Mermaid 创建的图表示例。点击 [语法](https://mermaid-js.github.io/mermaid/#/n00b-syntaxReference) 查看详情。** - -
- - -### 流程图 [文档 - live editor] - -``` -flowchart LR -A[Hard] -->|Text| B(Round) -B --> C{Decision} -C -->|One| D[Result 1] -C -->|Two| E[Result 2] -``` - -```mermaid -flowchart LR -A[Hard] -->|Text| B(Round) -B --> C{Decision} -C -->|One| D[Result 1] -C -->|Two| E[Result 2] -``` - -### 时序图 [文档 - live editor] - -``` -sequenceDiagram -Alice->>John: Hello John, how are you? -loop Healthcheck - John->>John: Fight against hypochondria -end -Note right of John: Rational thoughts! -John-->>Alice: Great! -John->>Bob: How about you? -Bob-->>John: Jolly good! -``` - -```mermaid -sequenceDiagram -Alice->>John: Hello John, how are you? -loop Healthcheck - John->>John: Fight against hypochondria -end -Note right of John: Rational thoughts! -John-->>Alice: Great! -John->>Bob: How about you? -Bob-->>John: Jolly good! -``` - -### 甘特图 [文档 - live editor] - -``` -gantt - section Section - Completed :done, des1, 2014-01-06,2014-01-08 - Active :active, des2, 2014-01-07, 3d - Parallel 1 : des3, after des1, 1d - Parallel 2 : des4, after des1, 1d - Parallel 3 : des5, after des3, 1d - Parallel 4 : des6, after des4, 1d -``` - -```mermaid -gantt - section Section - Completed :done, des1, 2014-01-06,2014-01-08 - Active :active, des2, 2014-01-07, 3d - Parallel 1 : des3, after des1, 1d - Parallel 2 : des4, after des1, 1d - Parallel 3 : des5, after des3, 1d - Parallel 4 : des6, after des4, 1d -``` - -### 类图 [文档 - live editor] - -``` -classDiagram -Class01 <|-- AveryLongClass : Cool -<> Class01 -Class09 --> C2 : Where am I? -Class09 --* C3 -Class09 --|> Class07 -Class07 : equals() -Class07 : Object[] elementData -Class01 : size() -Class01 : int chimp -Class01 : int gorilla -class Class10 { - <> - int id - size() -} -``` - -```mermaid -classDiagram -Class01 <|-- AveryLongClass : Cool -<> Class01 -Class09 --> C2 : Where am I? -Class09 --* C3 -Class09 --|> Class07 -Class07 : equals() -Class07 : Object[] elementData -Class01 : size() -Class01 : int chimp -Class01 : int gorilla -class Class10 { - <> - int id - size() -} -``` - -### 状态图 [[docs - live editor] - -``` -stateDiagram-v2 -[*] --> Still -Still --> [*] -Still --> Moving -Moving --> Still -Moving --> Crash -Crash --> [*] -``` - -```mermaid -stateDiagram-v2 -[*] --> Still -Still --> [*] -Still --> Moving -Moving --> Still -Moving --> Crash -Crash --> [*] -``` - -### 饼图 [文档 - live editor] - -``` -pie -"Dogs" : 386 -"Cats" : 85 -"Rats" : 15 -``` - -```mermaid -pie -"Dogs" : 386 -"Cats" : 85 -"Rats" : 15 -``` - -### Git 图 [实验特性 - live editor] - -### 用户体验旅程图 [文档 - live editor] - -``` - journey - title My working day - section Go to work - Make tea: 5: Me - Go upstairs: 3: Me - Do work: 1: Me, Cat - section Go home - Go downstairs: 5: Me - Sit down: 3: Me -``` - -```mermaid - journey - title My working day - section Go to work - Make tea: 5: Me - Go upstairs: 3: Me - Do work: 1: Me, Cat - section Go home - Go downstairs: 5: Me - Sit down: 3: Me -``` - -### C4 图 [文档] - -``` -C4Context -title System Context diagram for Internet Banking System - -Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.") -Person(customerB, "Banking Customer B") -Person_Ext(customerC, "Banking Customer C") -System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.") - -Person(customerD, "Banking Customer D", "A customer of the bank,
with personal bank accounts.") - -Enterprise_Boundary(b1, "BankBoundary") { - - SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") - - System_Boundary(b2, "BankBoundary2") { - System(SystemA, "Banking System A") - System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.") - } - - System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") - SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.") - - Boundary(b3, "BankBoundary3", "boundary") { - SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.") - SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.") - } -} - -BiRel(customerA, SystemAA, "Uses") -BiRel(SystemAA, SystemE, "Uses") -Rel(SystemAA, SystemC, "Sends e-mails", "SMTP") -Rel(SystemC, customerA, "Sends e-mails to") -``` - -```mermaid -C4Context -title System Context diagram for Internet Banking System - -Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.") -Person(customerB, "Banking Customer B") -Person_Ext(customerC, "Banking Customer C") -System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.") - -Person(customerD, "Banking Customer D", "A customer of the bank,
with personal bank accounts.") - -Enterprise_Boundary(b1, "BankBoundary") { - - SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") - - System_Boundary(b2, "BankBoundary2") { - System(SystemA, "Banking System A") - System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.") - } - - System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") - SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.") - - Boundary(b3, "BankBoundary3", "boundary") { - SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.") - SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.") - } -} - -BiRel(customerA, SystemAA, "Uses") -BiRel(SystemAA, SystemE, "Uses") -Rel(SystemAA, SystemC, "Sends e-mails", "SMTP") -Rel(SystemC, customerA, "Sends e-mails to") -``` - -## 发布 - -对于有权限的同学来说,你可以通过以下步骤来完成发布操作: - -更新 `package.json` 中的版本号,然后执行如下命令: - -```sh -npm publish -``` - -以上的命令会将文件打包到 `dist` 目录并发布至 npmjs.org. - -## 相关项目 - -- [Command Line Interface](https://github.com/mermaid-js/mermaid-cli) -- [Live Editor](https://github.com/mermaid-js/mermaid-live-editor) -- [HTTP Server](https://github.com/TomWright/mermaid-server) - -## 贡献者 [![Good first issue](https://img.shields.io/github/labels/mermaid-js/mermaid/Good%20first%20issue%21)](https://github.com/mermaid-js/mermaid/issues?q=is%3Aissue+is%3Aopen+label%3A%22Good+first+issue%21%22) [![Contributors](https://img.shields.io/github/contributors/mermaid-js/mermaid)](https://github.com/mermaid-js/mermaid/graphs/contributors) [![Commits](https://img.shields.io/github/commit-activity/m/mermaid-js/mermaid)](https://github.com/mermaid-js/mermaid/graphs/contributors) - -Mermaid 是一个不断发展中的社区,并且还在接收新的贡献者。有很多不同的方式可以参与进来,而且我们还在寻找额外的帮助。如果你想知道如何开始贡献,请查看 [这个 issue](https://github.com/mermaid-js/mermaid/issues/866)。 - -关于如何贡献的详细信息可以在 [贡献指南](CONTRIBUTING.md) 中找到。 - -## 安全 - -对于公开网站来说,从互联网上的用户处检索文本、存储供后续在浏览器中展示的内容可能是不安全的,理由是用户的内容可能嵌入一些数据加载完成之后就会运行的恶意脚本,这些对于 Mermaid 来说毫无疑问是一个风险,尤其是 mermaid 图表还包含了许多在 html 中使用的字符,这意味着我们难以使用常规的手段来过滤不安全代码,因为这些常规手段会造成图表损坏。我们仍然在努力对获取到的代码进行安全过滤并不断完善我们的程序,但很难保证没有漏洞。 - -作为拥有外部用户的网站的额外安全级别,我们很高兴推出一个新的安全级别,其中的图表在沙盒 iframe 中渲染,防止代码中的 javascript 被执行,这是在安全性方面迈出的一大步。 - -_很不幸的是,鱼与熊掌不可兼得,在这个场景下它意味着在可能的恶意代码被阻止时,也会损失部分交互能力_。 - -## 报告漏洞 - -如果想要报告漏洞,请发送邮件到 security@mermaid.live, 并附上问题的描述、复现问题的步骤、受影响的版本,以及解决问题的方案(如果有的话)。 - -## 鸣谢 - -来自 Knut Sveidqvist: - -> _特别感谢 [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/knsv/mermaid/graphs/contributors),没有你们,就没有这个项目的今天!_ - ---- - -_Mermaid 是由 Knut Sveidqvist 创建,它为了更简单的文档编写而生。_ diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index 7cb8c96a8..436e8ebd4 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -33,7 +33,7 @@ "docs:serve": "pnpm docs:build:vitepress && vitepress serve src/vitepress", "docs:spellcheck": "cspell --config ../../cSpell.json \"src/docs/**/*.md\"", "release": "pnpm build", - "prepublishOnly": "pnpm -w run build" + "prepublishOnly": "cpy '../../README.*' ./ --cwd=. && pnpm -w run build" }, "repository": { "type": "git", From 3e9978a58c5189ed83fc3486bff098f15a4e3662 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 10 Feb 2023 12:31:14 +0530 Subject: [PATCH 210/309] docs: Add CDN to top links, remove changelog Co-authored-by: Alois Klink --- README.md | 13 +++++++++---- README.zh-CN.md | 13 +++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 2b621807e..c4872905c 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Generate diagrams from markdown-like text. Live Editor!

- Documentation | Getting Started | Join Us + 📖 Documentation | 🚀 Getting Started | 🌐 CDN | 🙌 Join Us

简体中文 @@ -24,7 +24,14 @@ Generate diagrams from markdown-like text.

-[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/badge/Social-mermaidjs__-blue?style=social&logo=twitter)](https://twitter.com/mermaidjs_) +[![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) +[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) +[![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) +[![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) +[![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) +[![NPM Downloads](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) +[![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) +[![Twitter Follow](https://img.shields.io/badge/Social-mermaidjs__-blue?style=social&logo=twitter)](https://twitter.com/mermaidjs_) @@ -55,8 +62,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](./docs/community/n00b-overview.md), [Usage](./docs/config/usage.md) and [Tutorials](./docs/config/Tutorials.md). -🌐 [CDN](https://unpkg.com/mermaid/) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md) | 📜 [Changelog](./docs/CHANGELOG.md) - In our release process we rely heavily on visual regression tests using [applitools](https://applitools.com/). Applitools is a great service which has been easy to use and integrate with our tests. diff --git a/README.zh-CN.md b/README.zh-CN.md index 5c137a5e0..356d416f1 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -15,7 +15,7 @@ Mermaid Live Editor!

- 文档 | 入门 | 加入我们 + 📖 文档 | 🚀 入门 | 🌐 CDN | 🙌 加入我们

English @@ -24,7 +24,14 @@ Mermaid

-[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/badge/Social-mermaidjs__-blue?style=social&logo=twitter)](https://twitter.com/mermaidjs_) +[![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) +[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) +[![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) +[![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) +[![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) +[![NPM Downloads](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) +[![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) +[![Twitter Follow](https://img.shields.io/badge/Social-mermaidjs__-blue?style=social&logo=twitter)](https://twitter.com/mermaidjs_) @@ -50,8 +57,6 @@ Mermaid 甚至能让非程序员也能通过 [Mermaid Live Editor](https://merma 如果想要查看关于 Mermaid 更详细的介绍及基础使用方式,可以查看 [入门指引](./docs/community/n00b-overview.md), [用法](./docs/config/usage.md) 和 [教程](./docs/config/Tutorials.md). -🌐 [CDN](https://unpkg.com/mermaid/) | 📖 [文档](https://mermaidjs.github.io) | 🙌 [贡献](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md) | 📜 [更新日志](./docs/CHANGELOG.md) - ## 示例 From e0286be8d27ba070e8e60cc235311bdba4c9c513 Mon Sep 17 00:00:00 2001 From: Per Brolin Date: Fri, 10 Feb 2023 08:58:58 +0100 Subject: [PATCH 211/309] Corrected typo --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c96f2c8d7..d3438794a 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "build:vite": "ts-node-esm --transpileOnly .vite/build.ts", "build:mermaid": "pnpm build:vite --mermaid", "build:viz": "pnpm build:mermaid --visualize", - "build:types": "tsc -p ./packages/mermaid/tsconfig.json --emitDeclarationOnly && tsc -p ./packages/mermaid-example-diagran/tsconfig.json --emitDeclarationOnly", + "build:types": "tsc -p ./packages/mermaid/tsconfig.json --emitDeclarationOnly && tsc -p ./packages/mermaid-example-diagram/tsconfig.json --emitDeclarationOnly", "build:watch": "pnpm build:vite --watch", "build": "pnpm run -r clean && concurrently \"pnpm build:vite\" \"pnpm build:types\"", "dev": "concurrently \"pnpm build:vite --watch\" \"ts-node-esm .vite/server.ts\"", From a956be7bbf337987e5c89b041afcfbe621e549fc Mon Sep 17 00:00:00 2001 From: Per Brolin Date: Fri, 10 Feb 2023 11:03:25 +0100 Subject: [PATCH 212/309] Release candidate --- package.json | 2 +- packages/mermaid/package.json | 2 +- pnpm-lock.yaml | 14 +------------- 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index d3438794a..ca421afd5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mermaid-monorepo", "private": true, - "version": "9.3.0-rc1", + "version": "9.4.0", "description": "Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.", "type": "module", "packageManager": "pnpm@7.25.1", diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index cae7d43a8..e723dcd6f 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -1,6 +1,6 @@ { "name": "mermaid", - "version": "9.3.0", + "version": "9.4.0-rc.2", "description": "Markdown-ish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.", "main": "./dist/mermaid.min.js", "module": "./dist/mermaid.core.mjs", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eee2aea41..d2048997a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -352,23 +352,11 @@ importers: specifier: ^3.0.2 version: 3.0.2 - packages/mermaid-example-diagram-new: - devDependencies: - concurrently: - specifier: ^7.5.0 - version: 7.5.0 - mermaid: - specifier: workspace:* - version: link:../mermaid - rimraf: - specifier: ^3.0.2 - version: 3.0.2 - tests/webpack: dependencies: '@mermaid-js/mermaid-example-diagram': specifier: workspace:* - version: link:../../packages/mermaid-example-diagram-new + version: link:../../packages/mermaid-example-diagram mermaid: specifier: workspace:* version: link:../../packages/mermaid From 9d756654609f525e1d58b0e0ea858f58be72c829 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Mon, 13 Feb 2023 10:55:24 +0530 Subject: [PATCH 213/309] Fix links to integrations.md --- README.md | 4 ++-- README.zh-CN.md | 2 +- docs/intro/index.md | 6 +++--- docs/intro/n00b-gettingStarted.md | 4 ++-- packages/mermaid/src/docs/index.md | 2 +- packages/mermaid/src/docs/intro/index.md | 6 +++--- packages/mermaid/src/docs/intro/n00b-gettingStarted.md | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index c4872905c..f4cf8e105 100644 --- a/README.md +++ b/README.md @@ -56,9 +56,9 @@ Mermaid addresses this problem by enabling users to create easily modifiable dia Mermaid allows even non-programmers to easily create detailed diagrams through the [Mermaid Live Editor](https://mermaid.live/).
[Tutorials](./docs/config/Tutorials.md) has video tutorials. -Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](./docs/misc/integrations.md). +Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](./docs/ecosystem/integrations.md). -You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](./docs/misc/integrations.md). +You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](./docs/ecosystem/integrations.md). For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](./docs/community/n00b-overview.md), [Usage](./docs/config/usage.md) and [Tutorials](./docs/config/Tutorials.md). diff --git a/README.zh-CN.md b/README.zh-CN.md index 356d416f1..65cf38645 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -53,7 +53,7 @@ Mermaid 是一个基于 Javascript 的图表绘制工具,通过解析类 Markd Mermaid 通过允许用户创建便于修改的图表来解决这一难题,它也可以作为生产脚本(或其他代码)的一部分。

Mermaid 甚至能让非程序员也能通过 [Mermaid Live Editor](https://mermaid.live/) 轻松创建详细的图表。
-你可以访问 [教程](./docs/config/Tutorials.md) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](./docs/misc/integrations.md) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。 +你可以访问 [教程](./docs/config/Tutorials.md) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](./docs/ecosystem/integrations.md) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。 如果想要查看关于 Mermaid 更详细的介绍及基础使用方式,可以查看 [入门指引](./docs/community/n00b-overview.md), [用法](./docs/config/usage.md) 和 [教程](./docs/config/Tutorials.md). diff --git a/docs/intro/index.md b/docs/intro/index.md index e7db076e0..9fbfd3baa 100644 --- a/docs/intro/index.md +++ b/docs/intro/index.md @@ -31,11 +31,11 @@ But not having diagrams or docs ruins productivity and hurts organizational lear Mermaid addresses this problem by enabling users to create easily modifiable diagrams, it can also be made part of production scripts (and other pieces of code).

Mermaid allows even non-programmers to easily create detailed and diagrams through the [Mermaid Live Editor](https://mermaid.live/).
[Tutorials](../config/Tutorials.md) has video tutorials. -Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](../misc/integrations.md). +Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](../ecosystem/integrations.md). For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](../community/n00b-overview.md) and [Usage](../config/usage.md). -🌐 [CDN](https://unpkg.com/mermaid/) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](../community/development.md) | 🔌 [Plug-Ins](../misc/integrations.md) +🌐 [CDN](https://unpkg.com/mermaid/) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](../community/development.md) | 🔌 [Plug-Ins](../ecosystem/integrations.md) > 🖖 Keep a steady pulse: mermaid needs more Collaborators, [Read More](https://github.com/knsv/mermaid/issues/866). @@ -243,7 +243,7 @@ journey ### CDN - https://unpkg.com/mermaid@/dist/ + https://cdn.jsdelivr.net/npm/mermaid@/dist/ To select a version: diff --git a/docs/intro/n00b-gettingStarted.md b/docs/intro/n00b-gettingStarted.md index 94ccb8982..0826c32c0 100644 --- a/docs/intro/n00b-gettingStarted.md +++ b/docs/intro/n00b-gettingStarted.md @@ -17,7 +17,7 @@ This section talks about the different ways to deploy Mermaid. Learning the [Syn ## Four ways of using mermaid: 1. Using the Mermaid Live Editor at [mermaid.live](https://mermaid.live). -2. Using [mermaid plugins](../misc/integrations.md) with programs you are familiar with. +2. Using [mermaid plugins](../ecosystem/integrations.md) with programs you are familiar with. 3. Calling the Mermaid JavaScript API. 4. Deploying Mermaid as a dependency. @@ -85,7 +85,7 @@ and to View, Mermaid allows even non-programmers to easily create detailed and diagrams through the [Mermaid Live Editor](https://mermaid.live/).
[Tutorials](../config/Tutorials.md) has video tutorials. -Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](../misc/integrations.md). +Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](../ecosystem/integrations.md). For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](../community/n00b-overview.md) and [Usage](../config/usage.md). -🌐 [CDN](https://unpkg.com/mermaid/) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](../community/development.md) | 🔌 [Plug-Ins](../misc/integrations.md) +🌐 [CDN](https://unpkg.com/mermaid/) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](../community/development.md) | 🔌 [Plug-Ins](../ecosystem/integrations.md) > 🖖 Keep a steady pulse: mermaid needs more Collaborators, [Read More](https://github.com/knsv/mermaid/issues/866). @@ -55,7 +55,7 @@ In our release process we rely heavily on visual regression tests using [applito ### CDN ``` -https://unpkg.com/mermaid@/dist/ +/mermaid@/dist/ ``` To select a version: diff --git a/packages/mermaid/src/docs/intro/n00b-gettingStarted.md b/packages/mermaid/src/docs/intro/n00b-gettingStarted.md index a4dd7662f..c347f2ef3 100644 --- a/packages/mermaid/src/docs/intro/n00b-gettingStarted.md +++ b/packages/mermaid/src/docs/intro/n00b-gettingStarted.md @@ -11,7 +11,7 @@ This section talks about the different ways to deploy Mermaid. Learning the [Syn ## Four ways of using mermaid: 1. Using the Mermaid Live Editor at [mermaid.live](https://mermaid.live). -2. Using [mermaid plugins](../misc/integrations.md) with programs you are familiar with. +2. Using [mermaid plugins](../ecosystem/integrations.md) with programs you are familiar with. 3. Calling the Mermaid JavaScript API. 4. Deploying Mermaid as a dependency. @@ -68,7 +68,7 @@ and to View, https://mermaid.live/view?gist=https://gist.github.com/sidharthv96/ ## 2. Using Mermaid Plugins: -You can generate mermaid diagrams from within popular applications using plug-ins. It can be done in the same way, you would use the Live Editor. Here's a list of [Mermaid Plugins](../misc/integrations.md). +You can generate mermaid diagrams from within popular applications using plug-ins. It can be done in the same way, you would use the Live Editor. Here's a list of [Mermaid Plugins](../ecosystem/integrations.md). **This is covered in greater detail in the [Usage section](../config/usage.md)** From 027296df680f67feef5373c9581c09734846b275 Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Wed, 15 Feb 2023 13:54:33 +0100 Subject: [PATCH 214/309] Working version before applying direction logic --- cypress/platform/knsv2.html | 20 ++- packages/mermaid/src/dagre-wrapper/nodes.js | 1 + .../flowchart/elk/flowRenderer-elk.js | 160 +++++++++++++++++- 3 files changed, 170 insertions(+), 11 deletions(-) diff --git a/cypress/platform/knsv2.html b/cypress/platform/knsv2.html index ec9baed8f..05c79d82d 100644 --- a/cypress/platform/knsv2.html +++ b/cypress/platform/knsv2.html @@ -54,13 +54,17 @@ -

+    
 %%{init: {"flowchart": {"defaultRenderer": "elk"}} }%%
-graph TB
-      a --> b
-      a --> c
-      b --> d
-      c --> d
+graph RL
+a{The cat in the hat} -- 1o --> b
+a -- 2o --> c
+a -- 3o --> d
+g --2i--> a
+d --1i--> a
+h --3i -->a
+b --> d(The dog in the hog)
+c --> d
     
 flowchart-elk TB
@@ -227,7 +231,7 @@ sequenceDiagram
     Customer->>+Merchant: Receives goods or services
         
-
+    
 mindmap
   root((mindmap))
     Origins
@@ -247,7 +251,7 @@ mindmap
       Mermaid
     

-
+    
   example-diagram
     
diff --git a/packages/mermaid/src/dagre-wrapper/nodes.js b/packages/mermaid/src/dagre-wrapper/nodes.js index 694ba074d..5bd18d077 100644 --- a/packages/mermaid/src/dagre-wrapper/nodes.js +++ b/packages/mermaid/src/dagre-wrapper/nodes.js @@ -1007,6 +1007,7 @@ const class_box = (parent, node) => { }; const shapes = { + rhombus: question, question, rect, labelRect, diff --git a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js index 19ca0ccc1..d2960129b 100644 --- a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js +++ b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js @@ -13,6 +13,8 @@ import { interpolateToCurve, getStylesFromArray } from '../../../utils'; import ELK from 'elkjs/lib/elk.bundled.js'; const elk = new ELK(); +const portPos = {}; + const conf = {}; export const setConf = function (cnf) { const keys = Object.keys(cnf); @@ -95,8 +97,36 @@ export const addVertices = function (vert, svgId, root, doc, diagObj, parentLook labelData.labelNode = vertexNode; } + const ports = [ + { + id: vertex.id + '-west', + layoutOptions: { + 'port.side': 'WEST', + }, + }, + { + id: vertex.id + '-east', + layoutOptions: { + 'port.side': 'EAST', + }, + }, + { + id: vertex.id + '-south', + layoutOptions: { + 'port.side': 'SOUTH', + }, + }, + { + id: vertex.id + '-north', + layoutOptions: { + 'port.side': 'NORTH', + }, + }, + ]; + let radious = 0; let _shape = ''; + let layoutOptions = {}; // Set the shape based parameters switch (vertex.type) { case 'round': @@ -108,6 +138,9 @@ export const addVertices = function (vert, svgId, root, doc, diagObj, parentLook break; case 'diamond': _shape = 'question'; + layoutOptions = { + portConstraints: 'FIXED_SIDE', + }; break; case 'hexagon': _shape = 'hexagon'; @@ -184,8 +217,10 @@ export const addVertices = function (vert, svgId, root, doc, diagObj, parentLook const data = { id: vertex.id, + ports: vertex.type === 'diamond' ? ports : [], // labelStyle: styles.labelStyle, // shape: _shape, + layoutOptions, labelText: vertexText, labelData, // labels: [{ text: vertexText }], @@ -235,6 +270,83 @@ export const addVertices = function (vert, svgId, root, doc, diagObj, parentLook return graph; }; +const getNextPosition = (position, direction) => { + if (direction === 'in') { + // switch (position) { + // case 'north': + // return 'east'; + // case 'east': + // return 'west'; + // case 'west': + // return 'south'; + // case 'south': + // return 'north'; + // default: + // return 'north'; + // } + return 'north'; + } else { + switch (position) { + case 'south': + return 'west'; + case 'west': + return 'east'; + case 'east': + return 'south'; + // case 'north': + // return 'south'; + default: + return 'south'; + } + } +}; + +const getNextPort = (node, direction) => { + if (!portPos[node]) { + portPos[node] = { + inPosition: 'north', + outPosition: 'south', + }; + } + const result = direction === 'in' ? portPos[node].inPosition : portPos[node].outPosition; + + if (direction === 'in') { + portPos[node].inPosition = getNextPosition(portPos[node].inPosition, direction); + } else { + portPos[node].outPosition = getNextPosition(portPos[node].outPosition, direction); + } + return result; +}; + +const getEdgeStartEndPoint = (edge) => { + let source = edge.start; + let target = edge.end; + + const startNode = nodeDb[source]; + const endNode = nodeDb[target]; + console.log('getEdgeStartEndPoint abc77', { source, target, startNode, endNode }); + + if (!startNode || !endNode) { + return { source, target }; + } + + if (startNode.type === 'diamond') { + source = `${source}-${getNextPort(source, 'out')}`; + } + + if (endNode.type === 'diamond') { + target = `${target}-${getNextPort(target, 'in')}`; + } + + // Add the edge to the graph + // graph.edges.push({ + // id: 'e' + edge.start + edge.end, + // sources: [edge.start], + // targets: [edge.end], + console.log('getEdgeStartEndPoint abc78', { source, target }); + return { source, target }; +}; + /** * Add edges to graph based on parsed graph definition * @@ -375,11 +487,15 @@ export const addEdges = function (edges, diagObj, graph, svg) { const labelEl = insertEdgeLabel(labelsEl, edgeData); // console.log('labelEl', labelEl, edgeData.width); + + // calculate start and end points of the edge + const { source, target } = getEdgeStartEndPoint(edge); + log.info('abc78 source and target', source, target); // Add the edge to the graph graph.edges.push({ id: 'e' + edge.start + edge.end, - sources: [edge.start], - targets: [edge.end], + sources: [source], + targets: [target], labelEl: labelEl, labels: [ { @@ -624,12 +740,15 @@ export const draw = async function (text, id, _version, diagObj) { 'elk.hierarchyHandling': 'INCLUDE_CHILDREN', 'org.eclipse.elk.padding': '[top=100, left=100, bottom=110, right=110]', 'elk.layered.spacing.edgeNodeBetweenLayers': '30', + // 'elk.layered.mergeEdges': 'true', 'elk.direction': 'DOWN', + // 'elk.ports.sameLayerEdges': true, + // 'nodePlacement.strategy': 'SIMPLE', }, children: [], edges: [], }; - log.info('Drawing flowchart using v3 renderer'); + log.info('Drawing flowchart using v3 renderer', elk); // Set the direction, // Fetch the default direction, use TD if none was found @@ -731,8 +850,43 @@ export const draw = async function (text, id, _version, diagObj) { } }); insertChildren(graph.children, parentLookupDb); + // graph.children[0].shape = 'rhombus'; + // graph.children[0].ports = [ + // { + // id: 'a-p1', + // layoutOptions: { + // 'port.side': 'WEST', + // }, + // }, + // { + // id: 'a-p2', + // layoutOptions: { + // 'port.side': 'EAST', + // }, + // }, + // { + // id: 'a-p3', + // layoutOptions: { + // 'port.side': 'SOUTH', + // }, + // }, + // { + // id: 'a-p4', + // layoutOptions: { + // 'port.side': 'NORTH', + // }, + // }, + // ]; + // graph.children[0].layoutOptions = { + // portConstraints: 'FIXED_SIDE', + // }; + // graph.edges[0].sources[0] = 'a-south'; + // graph.edges[1].sources[0] = 'a-west'; + // graph.edges[2].targets[0] = 'a-east'; + log.info('after layout', JSON.stringify(graph, null, 2)); const g = await elk.layout(graph); drawNodes(0, 0, g.children, svg, subGraphsEl, diagObj, 0); + log.info('after layout', g); g.edges?.map((edge) => { insertEdge(edgesEl, edge, edge.edgeData, diagObj, parentLookupDb); }); From eed427b4acc447502bd9a1b94923fa6704683dff Mon Sep 17 00:00:00 2001 From: Knut Sveidqvist Date: Wed, 15 Feb 2023 14:10:38 +0100 Subject: [PATCH 215/309] Adding simple direction logic --- cypress/platform/knsv2.html | 4 +- .../flowchart/elk/flowRenderer-elk.js | 181 +++++++++--------- 2 files changed, 95 insertions(+), 90 deletions(-) diff --git a/cypress/platform/knsv2.html b/cypress/platform/knsv2.html index 05c79d82d..fccd65004 100644 --- a/cypress/platform/knsv2.html +++ b/cypress/platform/knsv2.html @@ -56,7 +56,7 @@
 %%{init: {"flowchart": {"defaultRenderer": "elk"}} }%%
-graph RL
+graph BT
 a{The cat in the hat} -- 1o --> b
 a -- 2o --> c
 a -- 3o --> d
@@ -272,7 +272,7 @@ mindmap
       mermaid.initialize({
         theme: 'forest',
         startOnLoad: true,
-        logLevel: 0,
+        logLevel: 5,
         flowchart: {
           // defaultRenderer: 'elk',
           useMaxWidth: false,
diff --git a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js
index d2960129b..3dba2f22b 100644
--- a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js
+++ b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js
@@ -270,80 +270,122 @@ export const addVertices = function (vert, svgId, root, doc, diagObj, parentLook
   return graph;
 };
 
-const getNextPosition = (position, direction) => {
-  if (direction === 'in') {
-    // switch (position) {
-    //   case 'north':
-    //     return 'east';
-    //   case 'east':
-    //     return 'west';
-    //   case 'west':
-    //     return 'south';
-    //   case 'south':
-    //     return 'north';
-    //   default:
-    //     return 'north';
-    // }
-    return 'north';
-  } else {
-    switch (position) {
-      case 'south':
-        return 'west';
-      case 'west':
-        return 'east';
-      case 'east':
-        return 'south';
-      // case 'north':
-      //   return 'south';
-      default:
-        return 'south';
-    }
-  }
+const getNextPosition = (position, edgeDirection, graphDirection) => {
+  const portPos = {
+    TB: {
+      in: {
+        north: 'north',
+      },
+      out: {
+        south: 'west',
+        west: 'east',
+        east: 'south',
+      },
+    },
+    LR: {
+      in: {
+        west: 'west',
+      },
+      out: {
+        east: 'south',
+        south: 'north',
+        north: 'east',
+      },
+    },
+    RL: {
+      in: {
+        east: 'east',
+      },
+      out: {
+        west: 'north',
+        north: 'south',
+        south: 'west',
+      },
+    },
+    BT: {
+      in: {
+        south: 'south',
+      },
+      out: {
+        north: 'east',
+        east: 'west',
+        west: 'north',
+      },
+    },
+  };
+  log.info('abc88', graphDirection, edgeDirection, position);
+  return portPos[graphDirection][edgeDirection][position];
+  // return 'south';
 };
 
-const getNextPort = (node, direction) => {
+const getNextPort = (node, edgeDirection, graphDirection) => {
+  log.info('getNextPort abc88', { node, edgeDirection, graphDirection });
   if (!portPos[node]) {
-    portPos[node] = {
-      inPosition: 'north',
-      outPosition: 'south',
-    };
+    switch (graphDirection) {
+      case 'TB':
+        portPos[node] = {
+          inPosition: 'north',
+          outPosition: 'south',
+        };
+        break;
+      case 'BT':
+        portPos[node] = {
+          inPosition: 'south',
+          outPosition: 'north',
+        };
+        break;
+      case 'RL':
+        portPos[node] = {
+          inPosition: 'east',
+          outPosition: 'west',
+        };
+        break;
+      case 'LR':
+        portPos[node] = {
+          inPosition: 'west',
+          outPosition: 'east',
+        };
+        break;
+    }
   }
-  const result = direction === 'in' ? portPos[node].inPosition : portPos[node].outPosition;
+  const result = edgeDirection === 'in' ? portPos[node].inPosition : portPos[node].outPosition;
 
-  if (direction === 'in') {
-    portPos[node].inPosition = getNextPosition(portPos[node].inPosition, direction);
+  if (edgeDirection === 'in') {
+    portPos[node].inPosition = getNextPosition(
+      portPos[node].inPosition,
+      edgeDirection,
+      graphDirection
+    );
   } else {
-    portPos[node].outPosition = getNextPosition(portPos[node].outPosition, direction);
+    portPos[node].outPosition = getNextPosition(
+      portPos[node].outPosition,
+      edgeDirection,
+      graphDirection
+    );
   }
   return result;
 };
 
-const getEdgeStartEndPoint = (edge) => {
+const getEdgeStartEndPoint = (edge, dir) => {
   let source = edge.start;
   let target = edge.end;
 
   const startNode = nodeDb[source];
   const endNode = nodeDb[target];
-  console.log('getEdgeStartEndPoint abc77', { source, target, startNode, endNode });
 
   if (!startNode || !endNode) {
     return { source, target };
   }
 
   if (startNode.type === 'diamond') {
-    source = `${source}-${getNextPort(source, 'out')}`;
+    source = `${source}-${getNextPort(source, 'out', dir)}`;
   }
 
   if (endNode.type === 'diamond') {
-    target = `${target}-${getNextPort(target, 'in')}`;
+    target = `${target}-${getNextPort(target, 'in', dir)}`;
   }
 
   // Add the edge to the graph
-  // graph.edges.push({
-  //   id: 'e' + edge.start + edge.end,
-  //   sources: [edge.start],
-  //   targets: [edge.end],
-  console.log('getEdgeStartEndPoint abc78', { source, target });
   return { source, target };
 };
 
@@ -358,10 +400,10 @@ const getEdgeStartEndPoint = (edge) => {
  * @param svg
  */
 export const addEdges = function (edges, diagObj, graph, svg) {
-  // log.info('abc78 edges = ', edges);
+  log.info('abc78 edges = ', edges);
   const labelsEl = svg.insert('g').attr('class', 'edgeLabels');
   let linkIdCnt = {};
-
+  let dir = diagObj.db.getDirection();
   let defaultStyle;
   let defaultLabelStyle;
 
@@ -486,11 +528,10 @@ export const addEdges = function (edges, diagObj, graph, svg) {
     edgeData.classes = 'flowchart-link ' + linkNameStart + ' ' + linkNameEnd;
 
     const labelEl = insertEdgeLabel(labelsEl, edgeData);
-    // console.log('labelEl', labelEl, edgeData.width);
 
     // calculate start and end points of the edge
-    const { source, target } = getEdgeStartEndPoint(edge);
-    log.info('abc78 source and target', source, target);
+    const { source, target } = getEdgeStartEndPoint(edge, dir);
+    log.debug('abc78 source and target', source, target);
     // Add the edge to the graph
     graph.edges.push({
       id: 'e' + edge.start + edge.end,
@@ -500,7 +541,6 @@ export const addEdges = function (edges, diagObj, graph, svg) {
       labels: [
         {
           width: edgeData.width,
-          // width: 80,
           height: edgeData.height,
           orgWidth: edgeData.width,
           orgHeight: edgeData.height,
@@ -512,8 +552,6 @@ export const addEdges = function (edges, diagObj, graph, svg) {
         },
       ],
       edgeData,
-      // targetPort: 'PortSide.NORTH',
-      // id: cnt,
     });
   });
   return graph;
@@ -850,39 +888,6 @@ export const draw = async function (text, id, _version, diagObj) {
     }
   });
   insertChildren(graph.children, parentLookupDb);
-  // graph.children[0].shape = 'rhombus';
-  // graph.children[0].ports = [
-  //   {
-  //     id: 'a-p1',
-  //     layoutOptions: {
-  //       'port.side': 'WEST',
-  //     },
-  //   },
-  //   {
-  //     id: 'a-p2',
-  //     layoutOptions: {
-  //       'port.side': 'EAST',
-  //     },
-  //   },
-  //   {
-  //     id: 'a-p3',
-  //     layoutOptions: {
-  //       'port.side': 'SOUTH',
-  //     },
-  //   },
-  //   {
-  //     id: 'a-p4',
-  //     layoutOptions: {
-  //       'port.side': 'NORTH',
-  //     },
-  //   },
-  // ];
-  // graph.children[0].layoutOptions = {
-  //   portConstraints: 'FIXED_SIDE',
-  // };
-  // graph.edges[0].sources[0] = 'a-south';
-  // graph.edges[1].sources[0] = 'a-west';
-  // graph.edges[2].targets[0] = 'a-east';
   log.info('after layout', JSON.stringify(graph, null, 2));
   const g = await elk.layout(graph);
   drawNodes(0, 0, g.children, svg, subGraphsEl, diagObj, 0);

From 0c38f2028177e0e48679f4d0b8774b3a36beba13 Mon Sep 17 00:00:00 2001
From: Per Brolin 
Date: Wed, 15 Feb 2023 14:17:46 +0100
Subject: [PATCH 216/309] Clearing sequence diagram before rendering

---
 packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts b/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts
index ce850c9f1..9ab84ab60 100644
--- a/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts
+++ b/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts
@@ -631,6 +631,9 @@ function adjustLoopHeightForWrap(loopWidths, msg, preMargin, postMargin, addLoop
 export const draw = function (_text: string, id: string, _version: string, diagObj: Diagram) {
   const { securityLevel, sequence } = configApi.getConfig();
   conf = sequence;
+  diagObj.db.clear();
+  // Parse the graph definition
+  diagObj.parser.parse(text);
   // Handle root and Document for when rendering in sandbox mode
   let sandboxElement;
   if (securityLevel === 'sandbox') {

From aef989fe0357c88f66055809b440bd70e3981619 Mon Sep 17 00:00:00 2001
From: Per Brolin 
Date: Wed, 15 Feb 2023 15:11:23 +0100
Subject: [PATCH 217/309] Corrected sequenceRenderer

---
 packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts b/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts
index 9ab84ab60..e4ce05350 100644
--- a/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts
+++ b/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts
@@ -633,7 +633,7 @@ export const draw = function (_text: string, id: string, _version: string, diagO
   conf = sequence;
   diagObj.db.clear();
   // Parse the graph definition
-  diagObj.parser.parse(text);
+  diagObj.parser.parse(_text);
   // Handle root and Document for when rendering in sandbox mode
   let sandboxElement;
   if (securityLevel === 'sandbox') {

From 343e48302eb0871f66847d73f559b6e729548c2d Mon Sep 17 00:00:00 2001
From: Knut Sveidqvist 
Date: Wed, 15 Feb 2023 15:12:52 +0100
Subject: [PATCH 218/309] Fix for direction issue with elk rendering

---
 .../mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js     | 2 ++
 packages/mermaid/src/diagrams/flowchart/flowDb.js              | 3 +++
 2 files changed, 5 insertions(+)

diff --git a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js
index 3dba2f22b..73b37e9f7 100644
--- a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js
+++ b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js
@@ -313,6 +313,7 @@ const getNextPosition = (position, edgeDirection, graphDirection) => {
       },
     },
   };
+  portPos.TD = portPos.TB;
   log.info('abc88', graphDirection, edgeDirection, position);
   return portPos[graphDirection][edgeDirection][position];
   // return 'south';
@@ -323,6 +324,7 @@ const getNextPort = (node, edgeDirection, graphDirection) => {
   if (!portPos[node]) {
     switch (graphDirection) {
       case 'TB':
+      case 'TD':
         portPos[node] = {
           inPosition: 'north',
           outPosition: 'south',
diff --git a/packages/mermaid/src/diagrams/flowchart/flowDb.js b/packages/mermaid/src/diagrams/flowchart/flowDb.js
index 147ad5b6a..2e6b840b5 100644
--- a/packages/mermaid/src/diagrams/flowchart/flowDb.js
+++ b/packages/mermaid/src/diagrams/flowchart/flowDb.js
@@ -238,6 +238,9 @@ export const setDirection = function (dir) {
   if (direction.match(/.*v/)) {
     direction = 'TB';
   }
+  if (direction === 'TD') {
+    direction = 'TB';
+  }
 };
 
 /**

From 97614b8af56a122022a71267996c0646b4a1e312 Mon Sep 17 00:00:00 2001
From: Per Brolin 
Date: Wed, 15 Feb 2023 15:54:02 +0100
Subject: [PATCH 219/309] Updated to 9.4.0

---
 packages/mermaid/package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json
index e723dcd6f..f8864fb17 100644
--- a/packages/mermaid/package.json
+++ b/packages/mermaid/package.json
@@ -1,6 +1,6 @@
 {
   "name": "mermaid",
-  "version": "9.4.0-rc.2",
+  "version": "9.4.0",
   "description": "Markdown-ish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.",
   "main": "./dist/mermaid.min.js",
   "module": "./dist/mermaid.core.mjs",

From 31afd7499b8b041779bd8e7bd3a689fdc8fafa70 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Thu, 16 Feb 2023 12:05:41 +0530
Subject: [PATCH 220/309] chore: Linear build

---
 package.json                                          |  2 +-
 packages/mermaid/src/diagrams/mindmap/mindmap.spec.js | 11 +----------
 .../mermaid/src/diagrams/mindmap/types/index.d.ts     |  7 -------
 packages/mermaid/src/docs/.vitepress/theme/mermaid.ts | 11 -----------
 4 files changed, 2 insertions(+), 29 deletions(-)
 delete mode 100644 packages/mermaid/src/diagrams/mindmap/types/index.d.ts

diff --git a/package.json b/package.json
index 24a7d2901..3a4847609 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,7 @@
     "build:viz": "pnpm build:mermaid --visualize",
     "build:types": "tsc -p ./packages/mermaid/tsconfig.json --emitDeclarationOnly && tsc -p ./packages/mermaid-example-diagram/tsconfig.json --emitDeclarationOnly",
     "build:watch": "pnpm build:vite --watch",
-    "build": "pnpm run -r clean && concurrently \"pnpm build:vite\" \"pnpm build:types\"",
+    "build": "pnpm run -r clean && pnpm build:types && pnpm build:vite",
     "dev": "concurrently \"pnpm build:vite --watch\" \"ts-node-esm .vite/server.ts\"",
     "release": "pnpm build",
     "lint": "eslint --cache --cache-strategy content --ignore-path .gitignore . && pnpm lint:jison && prettier --cache --check .",
diff --git a/packages/mermaid/src/diagrams/mindmap/mindmap.spec.js b/packages/mermaid/src/diagrams/mindmap/mindmap.spec.js
index 8c90f774f..e8793e86a 100644
--- a/packages/mermaid/src/diagrams/mindmap/mindmap.spec.js
+++ b/packages/mermaid/src/diagrams/mindmap/mindmap.spec.js
@@ -1,16 +1,7 @@
 import { parser as mindmap } from './parser/mindmap';
 import * as mindmapDB from './mindmapDb';
-// import { injectUtils } from './mermaidUtils';
 // Todo fix utils functions for tests
-import {
-  // log,
-  setLogLevel,
-  // getConfig,
-  // sanitizeText,
-  // setupGraphViewBox,
-} from '../../diagram-api/diagramAPI';
-
-// injectUtils(log, setLogLevel, getConfig, sanitizeText, setupGraphViewBox);
+import { setLogLevel } from '../../diagram-api/diagramAPI';
 
 describe('when parsing a mindmap ', function () {
   beforeEach(function () {
diff --git a/packages/mermaid/src/diagrams/mindmap/types/index.d.ts b/packages/mermaid/src/diagrams/mindmap/types/index.d.ts
deleted file mode 100644
index 999ff2f49..000000000
--- a/packages/mermaid/src/diagrams/mindmap/types/index.d.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-export {};
-
-declare global {
-  interface Window {
-    mermaid: any; // 👈️ turn off type checking
-  }
-}
diff --git a/packages/mermaid/src/docs/.vitepress/theme/mermaid.ts b/packages/mermaid/src/docs/.vitepress/theme/mermaid.ts
index 52c9e88f2..2234ef498 100644
--- a/packages/mermaid/src/docs/.vitepress/theme/mermaid.ts
+++ b/packages/mermaid/src/docs/.vitepress/theme/mermaid.ts
@@ -1,17 +1,6 @@
 import mermaid, { type MermaidConfig } from 'mermaid';
-// import mindmap from '@mermaid-js/mermaid-mindmap';
-// import timeline from '@mermaid-js/mermaid-timeline';
-
-const init = (async () => {
-  try {
-    await mermaid.registerExternalDiagrams([]);
-  } catch (e) {
-    console.error(e);
-  }
-})();
 
 export const render = async (id: string, code: string, config: MermaidConfig): Promise => {
-  await init;
   mermaid.initialize(config);
   const svg = await mermaid.renderAsync(id, code);
   return svg;

From 2b3019fb949e100e7044096c5b78acfb2ced4e05 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Thu, 16 Feb 2023 12:16:00 +0530
Subject: [PATCH 221/309] Set node heap size

---
 .github/workflows/build.yml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 2a70b5901..36d627391 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -17,6 +17,8 @@ jobs:
     strategy:
       matrix:
         node-version: [18.x]
+    env:
+      NODE_OPTIONS: '--max_old_space_size=4096'
     steps:
       - uses: actions/checkout@v3
 

From 8df965bd606d4acd173e316f6992328ac2383516 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Thu, 16 Feb 2023 12:21:24 +0530
Subject: [PATCH 222/309] chore: Set node heap size

---
 .github/workflows/e2e.yml          | 2 ++
 .github/workflows/lint.yml         | 2 ++
 .github/workflows/publish-docs.yml | 2 ++
 .github/workflows/test.yml         | 2 ++
 package.json                       | 2 +-
 5 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml
index aff5852db..de55f6534 100644
--- a/.github/workflows/e2e.yml
+++ b/.github/workflows/e2e.yml
@@ -8,6 +8,8 @@ permissions:
 jobs:
   build:
     runs-on: ubuntu-latest
+    env:
+      NODE_OPTIONS: '--max_old_space_size=4096'
     strategy:
       fail-fast: false
       matrix:
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index a21fbc005..f5b13c751 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -18,6 +18,8 @@ jobs:
     strategy:
       matrix:
         node-version: [18.x]
+    env:
+      NODE_OPTIONS: '--max_old_space_size=4096'
     steps:
       - uses: actions/checkout@v3
 
diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml
index 2153e11be..1ac646de1 100644
--- a/.github/workflows/publish-docs.yml
+++ b/.github/workflows/publish-docs.yml
@@ -24,6 +24,8 @@ jobs:
   # Build job
   build:
     runs-on: ubuntu-latest
+    env:
+      NODE_OPTIONS: '--max_old_space_size=4096'
     steps:
       - name: Checkout
         uses: actions/checkout@v3
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 6397e5305..63c52ce8f 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -11,6 +11,8 @@ jobs:
     strategy:
       matrix:
         node-version: [18.x]
+    env:
+      NODE_OPTIONS: '--max_old_space_size=4096'
     steps:
       - uses: actions/checkout@v3
 
diff --git a/package.json b/package.json
index 3a4847609..24a7d2901 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,7 @@
     "build:viz": "pnpm build:mermaid --visualize",
     "build:types": "tsc -p ./packages/mermaid/tsconfig.json --emitDeclarationOnly && tsc -p ./packages/mermaid-example-diagram/tsconfig.json --emitDeclarationOnly",
     "build:watch": "pnpm build:vite --watch",
-    "build": "pnpm run -r clean && pnpm build:types && pnpm build:vite",
+    "build": "pnpm run -r clean && concurrently \"pnpm build:vite\" \"pnpm build:types\"",
     "dev": "concurrently \"pnpm build:vite --watch\" \"ts-node-esm .vite/server.ts\"",
     "release": "pnpm build",
     "lint": "eslint --cache --cache-strategy content --ignore-path .gitignore . && pnpm lint:jison && prettier --cache --check .",

From e9cc9f4005e3b14048794789529ea032f0939afe Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Thu, 16 Feb 2023 12:26:27 +0530
Subject: [PATCH 223/309] chore: Set node heap size

---
 .github/workflows/publish-docs.yml | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml
index 85bc79f6e..1ac646de1 100644
--- a/.github/workflows/publish-docs.yml
+++ b/.github/workflows/publish-docs.yml
@@ -24,6 +24,8 @@ jobs:
   # Build job
   build:
     runs-on: ubuntu-latest
+    env:
+      NODE_OPTIONS: '--max_old_space_size=4096'
     steps:
       - name: Checkout
         uses: actions/checkout@v3
@@ -40,7 +42,7 @@ jobs:
         run: pnpm install --frozen-lockfile
 
       - name: Setup Pages
-        uses: actions/configure-pages@v2
+        uses: actions/configure-pages@v3
 
       - name: Run Build
         run: pnpm --filter mermaid run docs:build:vitepress

From b89b90dbb99c9dae87956009882ebd5fd670ba92 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Mon, 13 Feb 2023 10:55:24 +0530
Subject: [PATCH 224/309] Fix links to integrations.md

---
 README.md                                              | 4 ++--
 README.zh-CN.md                                        | 2 +-
 docs/intro/index.md                                    | 6 +++---
 docs/intro/n00b-gettingStarted.md                      | 4 ++--
 packages/mermaid/src/docs/index.md                     | 2 +-
 packages/mermaid/src/docs/intro/index.md               | 6 +++---
 packages/mermaid/src/docs/intro/n00b-gettingStarted.md | 4 ++--
 7 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/README.md b/README.md
index 970a5b54f..a47831282 100644
--- a/README.md
+++ b/README.md
@@ -27,9 +27,9 @@ Mermaid addresses this problem by enabling users to create easily modifiable dia
 
 Mermaid allows even non-programmers to easily create detailed diagrams through the [Mermaid Live Editor](https://mermaid.live/).
[Tutorials](./docs/config/Tutorials.md) has video tutorials. -Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](./docs/misc/integrations.md). +Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](./docs/ecosystem/integrations.md). -You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](./docs/misc/integrations.md). +You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](./docs/ecosystem/integrations.md). For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](./docs/community/n00b-overview.md), [Usage](./docs/config/usage.md) and [Tutorials](./docs/config/Tutorials.md). diff --git a/README.zh-CN.md b/README.zh-CN.md index 3c77d0255..df2769e74 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -24,7 +24,7 @@ Mermaid 是一个基于 Javascript 的图表绘制工具,通过解析类 Markd Mermaid 通过允许用户创建便于修改的图表来解决这一难题,它也可以作为生产脚本(或其他代码)的一部分。

Mermaid 甚至能让非程序员也能通过 [Mermaid Live Editor](https://mermaid.live/) 轻松创建详细的图表。
-你可以访问 [教程](./docs/config/Tutorials.md) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](./docs/misc/integrations.md) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。 +你可以访问 [教程](./docs/config/Tutorials.md) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](./docs/ecosystem/integrations.md) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。 如果想要查看关于 Mermaid 更详细的介绍及基础使用方式,可以查看 [入门指引](./docs/community/n00b-overview.md), [用法](./docs/config/usage.md) 和 [教程](./docs/config/Tutorials.md). diff --git a/docs/intro/index.md b/docs/intro/index.md index e7227aeee..e846e0a35 100644 --- a/docs/intro/index.md +++ b/docs/intro/index.md @@ -31,11 +31,11 @@ But not having diagrams or docs ruins productivity and hurts organizational lear Mermaid addresses this problem by enabling users to create easily modifiable diagrams, it can also be made part of production scripts (and other pieces of code).

Mermaid allows even non-programmers to easily create detailed and diagrams through the [Mermaid Live Editor](https://mermaid.live/).
[Tutorials](../config/Tutorials.md) has video tutorials. -Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](../misc/integrations.md). +Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](../ecosystem/integrations.md). For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](../community/n00b-overview.md) and [Usage](../config/usage.md). -🌐 [CDN](https://www.jsdelivr.com/package/npm/mermaid) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](../community/development.md) | 🔌 [Plug-Ins](../misc/integrations.md) +🌐 [CDN](https://www.jsdelivr.com/package/npm/mermaid) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](../community/development.md) | 🔌 [Plug-Ins](../ecosystem/integrations.md) > 🖖 Keep a steady pulse: mermaid needs more Collaborators, [Read More](https://github.com/knsv/mermaid/issues/866). @@ -243,7 +243,7 @@ journey ### CDN - https://cdn.jsdelivr.net/npm@/dist/ + https://cdn.jsdelivr.net/npm/mermaid@/dist/ To select a version: diff --git a/docs/intro/n00b-gettingStarted.md b/docs/intro/n00b-gettingStarted.md index 94ccb8982..0826c32c0 100644 --- a/docs/intro/n00b-gettingStarted.md +++ b/docs/intro/n00b-gettingStarted.md @@ -17,7 +17,7 @@ This section talks about the different ways to deploy Mermaid. Learning the [Syn ## Four ways of using mermaid: 1. Using the Mermaid Live Editor at [mermaid.live](https://mermaid.live). -2. Using [mermaid plugins](../misc/integrations.md) with programs you are familiar with. +2. Using [mermaid plugins](../ecosystem/integrations.md) with programs you are familiar with. 3. Calling the Mermaid JavaScript API. 4. Deploying Mermaid as a dependency. @@ -85,7 +85,7 @@ and to View, Mermaid allows even non-programmers to easily create detailed and diagrams through the [Mermaid Live Editor](https://mermaid.live/).
[Tutorials](../config/Tutorials.md) has video tutorials. -Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](../misc/integrations.md). +Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](../ecosystem/integrations.md). For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](../community/n00b-overview.md) and [Usage](../config/usage.md). -🌐 [CDN](https://www.jsdelivr.com/package/npm/mermaid) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](../community/development.md) | 🔌 [Plug-Ins](../misc/integrations.md) +🌐 [CDN](https://www.jsdelivr.com/package/npm/mermaid) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](../community/development.md) | 🔌 [Plug-Ins](../ecosystem/integrations.md) > 🖖 Keep a steady pulse: mermaid needs more Collaborators, [Read More](https://github.com/knsv/mermaid/issues/866). @@ -55,7 +55,7 @@ In our release process we rely heavily on visual regression tests using [applito ### CDN ``` -@/dist/ +/mermaid@/dist/ ``` To select a version: diff --git a/packages/mermaid/src/docs/intro/n00b-gettingStarted.md b/packages/mermaid/src/docs/intro/n00b-gettingStarted.md index a4dd7662f..c347f2ef3 100644 --- a/packages/mermaid/src/docs/intro/n00b-gettingStarted.md +++ b/packages/mermaid/src/docs/intro/n00b-gettingStarted.md @@ -11,7 +11,7 @@ This section talks about the different ways to deploy Mermaid. Learning the [Syn ## Four ways of using mermaid: 1. Using the Mermaid Live Editor at [mermaid.live](https://mermaid.live). -2. Using [mermaid plugins](../misc/integrations.md) with programs you are familiar with. +2. Using [mermaid plugins](../ecosystem/integrations.md) with programs you are familiar with. 3. Calling the Mermaid JavaScript API. 4. Deploying Mermaid as a dependency. @@ -68,7 +68,7 @@ and to View, https://mermaid.live/view?gist=https://gist.github.com/sidharthv96/ ## 2. Using Mermaid Plugins: -You can generate mermaid diagrams from within popular applications using plug-ins. It can be done in the same way, you would use the Live Editor. Here's a list of [Mermaid Plugins](../misc/integrations.md). +You can generate mermaid diagrams from within popular applications using plug-ins. It can be done in the same way, you would use the Live Editor. Here's a list of [Mermaid Plugins](../ecosystem/integrations.md). **This is covered in greater detail in the [Usage section](../config/usage.md)** From 62f7fb082e2da605858cc093a87825d01e983c8f Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 16 Feb 2023 12:47:00 +0530 Subject: [PATCH 225/309] Update vitepress --- packages/mermaid/package.json | 4 +- pnpm-lock.yaml | 469 +++++++++++++++++++++++++--------- 2 files changed, 353 insertions(+), 120 deletions(-) diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index f8864fb17..cb105abf4 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -101,8 +101,8 @@ "typedoc-plugin-markdown": "^3.13.6", "typescript": "^4.8.4", "unist-util-flatmap": "^1.0.0", - "vitepress": "^1.0.0-alpha.31", - "vitepress-plugin-search": "^1.0.4-alpha.16" + "vitepress": "^1.0.0-alpha.46", + "vitepress-plugin-search": "^1.0.4-alpha.19" }, "files": [ "dist", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d2048997a..810df73a4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -309,11 +309,11 @@ importers: specifier: ^1.0.0 version: 1.0.0 vitepress: - specifier: ^1.0.0-alpha.31 - version: 1.0.0-alpha.31_tbpndr44ulefs3hehwpi2mkf2y + specifier: ^1.0.0-alpha.46 + version: 1.0.0-alpha.46_tbpndr44ulefs3hehwpi2mkf2y vitepress-plugin-search: - specifier: ^1.0.4-alpha.16 - version: 1.0.4-alpha.16_ifjhkyx3os4sbm7zdnvthc52am + specifier: ^1.0.4-alpha.19 + version: 1.0.4-alpha.19_g67lr3vgasogkevpbew55lljzq packages/mermaid-example-diagram: dependencies: @@ -373,25 +373,25 @@ importers: packages: - /@algolia/autocomplete-core/1.7.2: - resolution: {integrity: sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw==} + /@algolia/autocomplete-core/1.7.4: + resolution: {integrity: sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==} dependencies: - '@algolia/autocomplete-shared': 1.7.2 + '@algolia/autocomplete-shared': 1.7.4 dev: true - /@algolia/autocomplete-preset-algolia/1.7.2_qs6lk5nhygj2o3hj4sf6xnr724: - resolution: {integrity: sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==} + /@algolia/autocomplete-preset-algolia/1.7.4_qs6lk5nhygj2o3hj4sf6xnr724: + resolution: {integrity: sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/autocomplete-shared': 1.7.2 + '@algolia/autocomplete-shared': 1.7.4 '@algolia/client-search': 4.14.2 algoliasearch: 4.14.2 dev: true - /@algolia/autocomplete-shared/1.7.2: - resolution: {integrity: sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==} + /@algolia/autocomplete-shared/1.7.4: + resolution: {integrity: sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==} dev: true /@algolia/cache-browser-local-storage/4.14.2: @@ -1689,14 +1689,14 @@ packages: engines: {node: '>=10.0.0'} dev: true - /@docsearch/css/3.3.0: - resolution: {integrity: sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg==} + /@docsearch/css/3.3.3: + resolution: {integrity: sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==} dev: true - /@docsearch/js/3.3.0_tbpndr44ulefs3hehwpi2mkf2y: - resolution: {integrity: sha512-oFXWRPNvPxAzBhnFJ9UCFIYZiQNc3Yrv6912nZHw/UIGxsyzKpNRZgHq8HDk1niYmOSoLKtVFcxkccpQmYGFyg==} + /@docsearch/js/3.3.3_tbpndr44ulefs3hehwpi2mkf2y: + resolution: {integrity: sha512-2xAv2GFuHzzmG0SSZgf8wHX0qZX8n9Y1ZirKUk5Wrdc+vH9CL837x2hZIUdwcPZI9caBA+/CzxsS68O4waYjUQ==} dependencies: - '@docsearch/react': 3.3.0_tbpndr44ulefs3hehwpi2mkf2y + '@docsearch/react': 3.3.3_tbpndr44ulefs3hehwpi2mkf2y preact: 10.11.0 transitivePeerDependencies: - '@algolia/client-search' @@ -1705,8 +1705,8 @@ packages: - react-dom dev: true - /@docsearch/react/3.3.0_tbpndr44ulefs3hehwpi2mkf2y: - resolution: {integrity: sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A==} + /@docsearch/react/3.3.3_tbpndr44ulefs3hehwpi2mkf2y: + resolution: {integrity: sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' react: '>= 16.8.0 < 19.0.0' @@ -1719,9 +1719,9 @@ packages: react-dom: optional: true dependencies: - '@algolia/autocomplete-core': 1.7.2 - '@algolia/autocomplete-preset-algolia': 1.7.2_qs6lk5nhygj2o3hj4sf6xnr724 - '@docsearch/css': 3.3.0 + '@algolia/autocomplete-core': 1.7.4 + '@algolia/autocomplete-preset-algolia': 1.7.4_qs6lk5nhygj2o3hj4sf6xnr724 + '@docsearch/css': 3.3.3 algoliasearch: 4.14.2 transitivePeerDependencies: - '@algolia/client-search' @@ -1745,6 +1745,15 @@ packages: dev: true optional: true + /@esbuild/android-arm/0.16.17: + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm/0.16.7: resolution: {integrity: sha512-yhzDbiVcmq6T1/XEvdcJIVcXHdLjDJ5cQ0Dp9R9p9ERMBTeO1dR5tc8YYv8zwDeBw1xZm+Eo3MRo8cwclhBS0g==} engines: {node: '>=12'} @@ -1763,6 +1772,15 @@ packages: dev: true optional: true + /@esbuild/android-arm64/0.16.17: + resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm64/0.16.7: resolution: {integrity: sha512-tYFw0lBJSEvLoGzzYh1kXuzoX1iPkbOk3O29VqzQb0HbOy7t/yw1hGkvwoJhXHwzQUPsShyYcTgRf6bDBcfnTw==} engines: {node: '>=12'} @@ -1781,6 +1799,15 @@ packages: dev: true optional: true + /@esbuild/android-x64/0.16.17: + resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64/0.16.7: resolution: {integrity: sha512-3P2OuTxwAtM3k/yEWTNUJRjMPG1ce8rXs51GTtvEC5z1j8fC1plHeVVczdeHECU7aM2/Buc0MwZ6ciM/zysnWg==} engines: {node: '>=12'} @@ -1799,6 +1826,15 @@ packages: dev: true optional: true + /@esbuild/darwin-arm64/0.16.17: + resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-arm64/0.16.7: resolution: {integrity: sha512-VUb9GK23z8jkosHU9yJNUgQpsfJn+7ZyBm6adi2Ec5/U241eR1tAn82QicnUzaFDaffeixiHwikjmnec/YXEZg==} engines: {node: '>=12'} @@ -1817,6 +1853,15 @@ packages: dev: true optional: true + /@esbuild/darwin-x64/0.16.17: + resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-x64/0.16.7: resolution: {integrity: sha512-duterlv3tit3HI9vhzMWnSVaB1B6YsXpFq1Ntd6Fou82BB1l4tucYy3FI9dHv3tvtDuS0NiGf/k6XsdBqPZ01w==} engines: {node: '>=12'} @@ -1835,6 +1880,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-arm64/0.16.17: + resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-arm64/0.16.7: resolution: {integrity: sha512-9kkycpBFes/vhi7B7o0cf+q2WdJi+EpVzpVTqtWFNiutARWDFFLcB93J8PR1cG228sucsl3B+7Ts27izE6qiaQ==} engines: {node: '>=12'} @@ -1853,6 +1907,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-x64/0.16.17: + resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-x64/0.16.7: resolution: {integrity: sha512-5Ahf6jzWXJ4J2uh9dpy5DKOO+PeRUE/9DMys6VuYfwgQzd6n5+pVFm58L2Z2gRe611RX6SdydnNaiIKM3svY7g==} engines: {node: '>=12'} @@ -1871,6 +1934,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm/0.16.17: + resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm/0.16.7: resolution: {integrity: sha512-QqJnyCfu5OF78Olt7JJSZ7OSv/B4Hf+ZJWp4kkq9xwMsgu7yWq3crIic8gGOpDYTqVKKMDAVDgRXy5Wd/nWZyQ==} engines: {node: '>=12'} @@ -1889,6 +1961,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm64/0.16.17: + resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64/0.16.7: resolution: {integrity: sha512-2wv0xYDskk2+MzIm/AEprDip39a23Chptc4mL7hsHg26P0gD8RUhzmDu0KCH2vMThUI1sChXXoK9uH0KYQKaDg==} engines: {node: '>=12'} @@ -1907,6 +1988,15 @@ packages: dev: true optional: true + /@esbuild/linux-ia32/0.16.17: + resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32/0.16.7: resolution: {integrity: sha512-APVYbEilKbD5ptmKdnIcXej2/+GdV65TfTjxR2Uk8t1EsOk49t6HapZW6DS/Bwlvh5hDwtLapdSumIVNGxgqLg==} engines: {node: '>=12'} @@ -1934,6 +2024,15 @@ packages: dev: true optional: true + /@esbuild/linux-loong64/0.16.17: + resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-loong64/0.16.7: resolution: {integrity: sha512-5wPUAGclplQrAW7EFr3F84Y/d++7G0KykohaF4p54+iNWhUnMVU8Bh2sxiEOXUy4zKIdpHByMgJ5/Ko6QhtTUw==} engines: {node: '>=12'} @@ -1952,6 +2051,15 @@ packages: dev: true optional: true + /@esbuild/linux-mips64el/0.16.17: + resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-mips64el/0.16.7: resolution: {integrity: sha512-hxzlXtWF6yWfkE/SMTscNiVqLOAn7fOuIF3q/kiZaXxftz1DhZW/HpnTmTTWrzrS7zJWQxHHT4QSxyAj33COmA==} engines: {node: '>=12'} @@ -1970,6 +2078,15 @@ packages: dev: true optional: true + /@esbuild/linux-ppc64/0.16.17: + resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ppc64/0.16.7: resolution: {integrity: sha512-WM83Dac0LdXty5xPhlOuCD5Egfk1xLND/oRLYeB7Jb/tY4kzFSDgLlq91wYbHua/s03tQGA9iXvyjgymMw62Vw==} engines: {node: '>=12'} @@ -1988,6 +2105,15 @@ packages: dev: true optional: true + /@esbuild/linux-riscv64/0.16.17: + resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-riscv64/0.16.7: resolution: {integrity: sha512-3nkNnNg4Ax6MS/l8O8Ynq2lGEVJYyJ2EoY3PHjNJ4PuZ80EYLMrFTFZ4L/Hc16AxgtXKwmNP9TM0YKNiBzBiJQ==} engines: {node: '>=12'} @@ -2006,6 +2132,15 @@ packages: dev: true optional: true + /@esbuild/linux-s390x/0.16.17: + resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-s390x/0.16.7: resolution: {integrity: sha512-3SA/2VJuv0o1uD7zuqxEP+RrAyRxnkGddq0bwHQ98v1KNlzXD/JvxwTO3T6GM5RH6JUd29RTVQTOJfyzMkkppA==} engines: {node: '>=12'} @@ -2024,6 +2159,15 @@ packages: dev: true optional: true + /@esbuild/linux-x64/0.16.17: + resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-x64/0.16.7: resolution: {integrity: sha512-xi/tbqCqvPIzU+zJVyrpz12xqciTAPMi2fXEWGnapZymoGhuL2GIWIRXg4O2v5BXaYA5TSaiKYE14L0QhUTuQg==} engines: {node: '>=12'} @@ -2042,6 +2186,15 @@ packages: dev: true optional: true + /@esbuild/netbsd-x64/0.16.17: + resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/netbsd-x64/0.16.7: resolution: {integrity: sha512-NUsYbq3B+JdNKn8SXkItFvdes9qTwEoS3aLALtiWciW/ystiCKM20Fgv9XQBOXfhUHyh5CLEeZDXzLOrwBXuCQ==} engines: {node: '>=12'} @@ -2060,6 +2213,15 @@ packages: dev: true optional: true + /@esbuild/openbsd-x64/0.16.17: + resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/openbsd-x64/0.16.7: resolution: {integrity: sha512-qjwzsgeve9I8Tbsko2FEkdSk2iiezuNGFgipQxY/736NePXDaDZRodIejYGWOlbYXugdxb0nif5yvypH6lKBmA==} engines: {node: '>=12'} @@ -2078,6 +2240,15 @@ packages: dev: true optional: true + /@esbuild/sunos-x64/0.16.17: + resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /@esbuild/sunos-x64/0.16.7: resolution: {integrity: sha512-mFWDz4RoBTzPphTCkM7Kc7Qpa0o/Z01acajR+Ai7LdfKgcP/C6jYOaKwv7nKzD0+MjOT20j7You9g4ozYy1dKQ==} engines: {node: '>=12'} @@ -2096,6 +2267,15 @@ packages: dev: true optional: true + /@esbuild/win32-arm64/0.16.17: + resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-arm64/0.16.7: resolution: {integrity: sha512-m39UmX19RvEIuC8sYZ0M+eQtdXw4IePDSZ78ZQmYyFaXY9krq4YzQCK2XWIJomNLtg4q+W5aXr8bW3AbqWNoVg==} engines: {node: '>=12'} @@ -2114,6 +2294,15 @@ packages: dev: true optional: true + /@esbuild/win32-ia32/0.16.17: + resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-ia32/0.16.7: resolution: {integrity: sha512-1cbzSEZA1fANwmT6rjJ4G1qQXHxCxGIcNYFYR9ctI82/prT38lnwSRZ0i5p/MVXksw9eMlHlet6pGu2/qkXFCg==} engines: {node: '>=12'} @@ -2132,6 +2321,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64/0.16.17: + resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-x64/0.16.7: resolution: {integrity: sha512-QaQ8IH0JLacfGf5cf0HCCPnQuCTd/dAI257vXBgb/cccKGbH/6pVtI1gwhdAQ0Y48QSpTIFrh9etVyNdZY+zzw==} engines: {node: '>=12'} @@ -3404,14 +3602,14 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@vitejs/plugin-vue/4.0.0_vite@4.0.1+vue@3.2.45: + /@vitejs/plugin-vue/4.0.0_vite@4.1.1+vue@3.2.45: resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.0.0 vue: ^3.2.25 dependencies: - vite: 4.0.1 + vite: 4.1.1 vue: 3.2.45 dev: true @@ -3469,7 +3667,7 @@ packages: '@vue/shared': 3.2.45 estree-walker: 2.0.2 magic-string: 0.25.9 - postcss: 8.4.18 + postcss: 8.4.20 source-map: 0.6.1 dev: true @@ -3480,8 +3678,8 @@ packages: '@vue/shared': 3.2.45 dev: true - /@vue/devtools-api/6.4.5: - resolution: {integrity: sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==} + /@vue/devtools-api/6.5.0: + resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} dev: true /@vue/reactivity-transform/3.2.45: @@ -3529,24 +3727,24 @@ packages: resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==} dev: true - /@vueuse/core/9.6.0_vue@3.2.45: - resolution: {integrity: sha512-qGUcjKQXHgN+jqXEgpeZGoxdCbIDCdVPz3QiF1uyecVGbMuM63o96I1GjYx5zskKgRI0FKSNsVWM7rwrRMTf6A==} + /@vueuse/core/9.12.0_vue@3.2.45: + resolution: {integrity: sha512-h/Di8Bvf6xRcvS/PvUVheiMYYz3U0tH3X25YxONSaAUBa841ayMwxkuzx/DGUMCW/wHWzD8tRy2zYmOC36r4sg==} dependencies: '@types/web-bluetooth': 0.0.16 - '@vueuse/metadata': 9.6.0 - '@vueuse/shared': 9.6.0_vue@3.2.45 + '@vueuse/metadata': 9.12.0 + '@vueuse/shared': 9.12.0_vue@3.2.45 vue-demi: 0.13.11_vue@3.2.45 transitivePeerDependencies: - '@vue/composition-api' - vue dev: true - /@vueuse/metadata/9.6.0: - resolution: {integrity: sha512-sIC8R+kWkIdpi5X2z2Gk8TRYzmczDwHRhEFfCu2P+XW2JdPoXrziqsGpDDsN7ykBx4ilwieS7JUIweVGhvZ93w==} + /@vueuse/metadata/9.12.0: + resolution: {integrity: sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ==} dev: true - /@vueuse/shared/9.6.0_vue@3.2.45: - resolution: {integrity: sha512-/eDchxYYhkHnFyrb00t90UfjCx94kRHxc7J1GtBCqCG4HyPMX+krV9XJgVtWIsAMaxKVU4fC8NSUviG1JkwhUQ==} + /@vueuse/shared/9.12.0_vue@3.2.45: + resolution: {integrity: sha512-TWuJLACQ0BVithVTRbex4Wf1a1VaRuSpVeyEd4vMUWl54PzlE0ciFUshKCXnlLuD0lxIaLK4Ypj3NXYzZh4+SQ==} dependencies: vue-demi: 0.13.11_vue@3.2.45 transitivePeerDependencies: @@ -3965,6 +4163,10 @@ packages: engines: {node: '>=12'} dev: true + /ansi-sequence-parser/1.1.0: + resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==} + dev: true + /ansi-styles/2.2.1: resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} engines: {node: '>=0.10.0'} @@ -4109,7 +4311,7 @@ packages: /axios/0.21.4_debug@4.3.2: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.15.2 + follow-redirects: 1.15.2_debug@4.3.2 transitivePeerDependencies: - debug dev: true @@ -6180,6 +6382,36 @@ packages: esbuild-windows-arm64: 0.15.13 dev: true + /esbuild/0.16.17: + resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.16.17 + '@esbuild/android-arm64': 0.16.17 + '@esbuild/android-x64': 0.16.17 + '@esbuild/darwin-arm64': 0.16.17 + '@esbuild/darwin-x64': 0.16.17 + '@esbuild/freebsd-arm64': 0.16.17 + '@esbuild/freebsd-x64': 0.16.17 + '@esbuild/linux-arm': 0.16.17 + '@esbuild/linux-arm64': 0.16.17 + '@esbuild/linux-ia32': 0.16.17 + '@esbuild/linux-loong64': 0.16.17 + '@esbuild/linux-mips64el': 0.16.17 + '@esbuild/linux-ppc64': 0.16.17 + '@esbuild/linux-riscv64': 0.16.17 + '@esbuild/linux-s390x': 0.16.17 + '@esbuild/linux-x64': 0.16.17 + '@esbuild/netbsd-x64': 0.16.17 + '@esbuild/openbsd-x64': 0.16.17 + '@esbuild/sunos-x64': 0.16.17 + '@esbuild/win32-arm64': 0.16.17 + '@esbuild/win32-ia32': 0.16.17 + '@esbuild/win32-x64': 0.16.17 + dev: true + /esbuild/0.16.7: resolution: {integrity: sha512-P6OBFYFSQOGzfApqCeYKqfKRRbCIRsdppTXFo4aAvtiW3o8TTyiIplBvHJI171saPAiy3WlawJHCveJVIOIx1A==} engines: {node: '>=12'} @@ -6907,7 +7139,7 @@ packages: resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==} dev: true - /follow-redirects/1.15.2: + /follow-redirects/1.15.2_debug@4.3.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -6915,6 +7147,8 @@ packages: peerDependenciesMeta: debug: optional: true + dependencies: + debug: 4.3.2 dev: true /foreground-child/2.0.0: @@ -7454,7 +7688,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.2 + follow-redirects: 1.15.2_debug@4.3.2 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -10015,6 +10249,15 @@ packages: source-map-js: 1.0.2 dev: true + /postcss/8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.4 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + /preact/10.11.0: resolution: {integrity: sha512-Fk6+vB2kb6mSJfDgODq0YDhMfl0HNtK5+Uc9QqECO4nlyPAQwCI+BKyWO//idA7ikV7o+0Fm6LQmNuQi1wXI1w==} dev: true @@ -10525,6 +10768,14 @@ packages: fsevents: 2.3.2 dev: true + /rollup/3.15.0: + resolution: {integrity: sha512-F9hrCAhnp5/zx/7HYmftvsNBkMfLfk/dXUh73hPSM2E3CRgap65orDNJbLetoiUFwSAk6iHPLvBrZ5iHYvzqsg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + /rollup/3.7.4: resolution: {integrity: sha512-jN9rx3k5pfg9H9al0r0y1EYKSeiRANZRYX32SuNXAnKzh6cVyf4LZVto1KAuDnbHT03E1CpsgqDKaqQ8FZtgxw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -10748,6 +10999,15 @@ packages: vscode-textmate: 6.0.0 dev: true + /shiki/0.14.1: + resolution: {integrity: sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==} + dependencies: + ansi-sequence-parser: 1.1.0 + jsonc-parser: 3.2.0 + vscode-oniguruma: 1.7.0 + vscode-textmate: 8.0.0 + dev: true + /side-channel/1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -11778,39 +12038,6 @@ packages: - terser dev: true - /vite/3.2.3: - resolution: {integrity: sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.15.13 - postcss: 8.4.18 - resolve: 1.22.1 - rollup: 2.79.1 - optionalDependencies: - fsevents: 2.3.2 - dev: true - /vite/3.2.3_@types+node@18.11.9: resolution: {integrity: sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -11845,39 +12072,6 @@ packages: fsevents: 2.3.2 dev: true - /vite/4.0.1: - resolution: {integrity: sha512-kZQPzbDau35iWOhy3CpkrRC7It+HIHtulAzBhMqzGHKRf/4+vmh8rPDDdv98SWQrFWo6//3ozwsRmwQIPZsK9g==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.16.7 - postcss: 8.4.20 - resolve: 1.22.1 - rollup: 3.7.4 - optionalDependencies: - fsevents: 2.3.2 - dev: true - /vite/4.0.1_@types+node@18.11.9: resolution: {integrity: sha512-kZQPzbDau35iWOhy3CpkrRC7It+HIHtulAzBhMqzGHKRf/4+vmh8rPDDdv98SWQrFWo6//3ozwsRmwQIPZsK9g==} engines: {node: ^14.18.0 || >=16.0.0} @@ -11912,12 +12106,44 @@ packages: fsevents: 2.3.2 dev: true - /vitepress-plugin-search/1.0.4-alpha.16_ifjhkyx3os4sbm7zdnvthc52am: - resolution: {integrity: sha512-D+rs7bwzH+IO+7T9NlxvqSOqmSKbN1yHxUoqClTy5JH+DomL3CcrH2TgSvXc2s58ztlc1dC07c7THo4cNjlUAg==} + /vite/4.1.1: + resolution: {integrity: sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.16.17 + postcss: 8.4.21 + resolve: 1.22.1 + rollup: 3.15.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitepress-plugin-search/1.0.4-alpha.19_g67lr3vgasogkevpbew55lljzq: + resolution: {integrity: sha512-WFOPn5dStyMINd+rVjNxbEmGa7U+qGHLxLnda56EG+ATil1i0yOauGhJEh5LPMvuCUVIA9tInJnFXklOBb39dA==} engines: {node: ^14.13.1 || ^16.7.0 || >=18} peerDependencies: flexsearch: ^0.7.31 - vite: 2 || 3 vitepress: ^1.0.0-alpha.13 vue: '3' dependencies: @@ -11925,23 +12151,22 @@ packages: '@types/markdown-it': 12.2.3 flexsearch: 0.7.31 markdown-it: 13.0.1 - vite: 3.2.3 - vitepress: 1.0.0-alpha.31_tbpndr44ulefs3hehwpi2mkf2y + vitepress: 1.0.0-alpha.46_tbpndr44ulefs3hehwpi2mkf2y vue: 3.2.45 dev: true - /vitepress/1.0.0-alpha.31_tbpndr44ulefs3hehwpi2mkf2y: - resolution: {integrity: sha512-FWFXLs7WLbFbemxjBWo2S2+qUZCIoeLLyAKfVUpIu3LUB8oQ8cyIANRGO6f6zsM51u2bvJU9Sm+V6Z0WjOWS2Q==} + /vitepress/1.0.0-alpha.46_tbpndr44ulefs3hehwpi2mkf2y: + resolution: {integrity: sha512-HiKiHzC0iTPsRsKs8XcsMeMzCpcCt5LWcX9mpDr288Ju+nQf1G8A2+Wm44ZkBsVv4EHxFK4ChmWyZrL1OJUXpg==} hasBin: true dependencies: - '@docsearch/css': 3.3.0 - '@docsearch/js': 3.3.0_tbpndr44ulefs3hehwpi2mkf2y - '@vitejs/plugin-vue': 4.0.0_vite@4.0.1+vue@3.2.45 - '@vue/devtools-api': 6.4.5 - '@vueuse/core': 9.6.0_vue@3.2.45 + '@docsearch/css': 3.3.3 + '@docsearch/js': 3.3.3_tbpndr44ulefs3hehwpi2mkf2y + '@vitejs/plugin-vue': 4.0.0_vite@4.1.1+vue@3.2.45 + '@vue/devtools-api': 6.5.0 + '@vueuse/core': 9.12.0_vue@3.2.45 body-scroll-lock: 4.0.0-beta.0 - shiki: 0.11.1 - vite: 4.0.1 + shiki: 0.14.1 + vite: 4.1.1 vue: 3.2.45 transitivePeerDependencies: - '@algolia/client-search' @@ -12043,10 +12268,18 @@ packages: resolution: {integrity: sha512-KH8+KKov5eS/9WhofZR8M8dMHWN2gTxjMsG4jd04YhpbPR91fUj7rYQ2/XjeHCJWbg7X++ApRIU9NUwM2vTvLA==} dev: true + /vscode-oniguruma/1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + dev: true + /vscode-textmate/6.0.0: resolution: {integrity: sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ==} dev: true + /vscode-textmate/8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + dev: true + /vscode-uri/3.0.6: resolution: {integrity: sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ==} dev: true From 037504785c26dd18ee797cfdf93a5e9f5f551f6a Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 16 Feb 2023 12:47:28 +0530 Subject: [PATCH 226/309] chore: Defer elk loading --- .../mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js index 73b37e9f7..5a786eee9 100644 --- a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js +++ b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js @@ -9,9 +9,9 @@ import { log } from '../../../logger'; import { setupGraphViewbox } from '../../../setupGraphViewbox'; import common, { evaluate } from '../../common/common'; import { interpolateToCurve, getStylesFromArray } from '../../../utils'; +import ELK from 'elkjs'; -import ELK from 'elkjs/lib/elk.bundled.js'; -const elk = new ELK(); +let elk; const portPos = {}; @@ -766,6 +766,9 @@ const insertChildren = (nodeArray, parentLookupDb) => { */ export const draw = async function (text, id, _version, diagObj) { + if (!elk) { + elk = new ELK(); + } // Add temporary render element diagObj.db.clear(); nodeDb = {}; From 533bd7da3c1932f87d9970588b9fa93d57ddb6c7 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 16 Feb 2023 12:56:32 +0530 Subject: [PATCH 227/309] chore: Add file extension for dynamic import --- .github/workflows/publish-docs.yml | 1 + packages/mermaid-example-diagram/src/detector.ts | 2 +- packages/mermaid/src/diagrams/flowchart/elk/detector.ts | 2 +- packages/mermaid/src/diagrams/mindmap/detector.ts | 2 +- packages/mermaid/src/diagrams/timeline/detector.ts | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 1ac646de1..c05edc601 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -54,6 +54,7 @@ jobs: # Deployment job deploy: + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }} environment: name: github-pages runs-on: ubuntu-latest diff --git a/packages/mermaid-example-diagram/src/detector.ts b/packages/mermaid-example-diagram/src/detector.ts index fdf7345bb..93fd42762 100644 --- a/packages/mermaid-example-diagram/src/detector.ts +++ b/packages/mermaid-example-diagram/src/detector.ts @@ -7,7 +7,7 @@ const detector = (txt: string) => { }; const loader = async () => { - const { diagram } = await import('./diagram-definition'); + const { diagram } = await import('./diagram-definition.js'); return { id, diagram }; }; diff --git a/packages/mermaid/src/diagrams/flowchart/elk/detector.ts b/packages/mermaid/src/diagrams/flowchart/elk/detector.ts index 1d825e35c..41760ff4d 100644 --- a/packages/mermaid/src/diagrams/flowchart/elk/detector.ts +++ b/packages/mermaid/src/diagrams/flowchart/elk/detector.ts @@ -16,7 +16,7 @@ const detector: DiagramDetector = (txt: string, config?: MermaidConfig): boolean }; const loader = async () => { - const { diagram } = await import('./diagram-definition'); + const { diagram } = await import('./diagram-definition.js'); return { id, diagram }; }; diff --git a/packages/mermaid/src/diagrams/mindmap/detector.ts b/packages/mermaid/src/diagrams/mindmap/detector.ts index 82664225b..c96b19097 100644 --- a/packages/mermaid/src/diagrams/mindmap/detector.ts +++ b/packages/mermaid/src/diagrams/mindmap/detector.ts @@ -6,7 +6,7 @@ const detector = (txt: string) => { }; const loader = async () => { - const { diagram } = await import('./diagram-definition'); + const { diagram } = await import('./diagram-definition.js'); return { id, diagram }; }; diff --git a/packages/mermaid/src/diagrams/timeline/detector.ts b/packages/mermaid/src/diagrams/timeline/detector.ts index 9d06d6438..faa86a72c 100644 --- a/packages/mermaid/src/diagrams/timeline/detector.ts +++ b/packages/mermaid/src/diagrams/timeline/detector.ts @@ -7,7 +7,7 @@ const detector = (txt: string) => { }; const loader = async () => { - const { diagram } = await import('./diagram-definition'); + const { diagram } = await import('./diagram-definition.js'); return { id, diagram }; }; From 0db2657b7b44fa0bd7ad7d9ac1a3af99cb1ecbf0 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 16 Feb 2023 13:05:53 +0530 Subject: [PATCH 228/309] Test publish docs --- .github/workflows/publish-docs.yml | 1 + .github/workflows/release-preview-publish.yml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index c05edc601..fea3696f8 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -5,6 +5,7 @@ on: push: branches: - master + pull_request: # Allows you to run this workflow manually from the Actions tab workflow_dispatch: diff --git a/.github/workflows/release-preview-publish.yml b/.github/workflows/release-preview-publish.yml index 5f4936ab6..b18b87417 100644 --- a/.github/workflows/release-preview-publish.yml +++ b/.github/workflows/release-preview-publish.yml @@ -7,6 +7,8 @@ on: jobs: publish: + env: + NODE_OPTIONS: '--max_old_space_size=4096' runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 From 83797eef386f061c75308ea1b5fa7f904e554619 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 16 Feb 2023 14:21:33 +0530 Subject: [PATCH 229/309] elk web-worker --- packages/mermaid/package.json | 3 ++- .../mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js | 2 +- pnpm-lock.yaml | 7 +++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index d16e23794..e4480286f 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -66,7 +66,8 @@ "non-layered-tidy-tree-layout": "^2.0.2", "stylis": "^4.1.2", "ts-dedent": "^2.2.0", - "uuid": "^9.0.0" + "uuid": "^9.0.0", + "web-worker": "^1.2.0" }, "devDependencies": { "@types/cytoscape": "^3.19.9", diff --git a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js index 5a786eee9..15624fc57 100644 --- a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js +++ b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js @@ -9,7 +9,7 @@ import { log } from '../../../logger'; import { setupGraphViewbox } from '../../../setupGraphViewbox'; import common, { evaluate } from '../../common/common'; import { interpolateToCurve, getStylesFromArray } from '../../../utils'; -import ELK from 'elkjs'; +import ELK from 'elkjs/lib/elk.bundled.js'; let elk; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c121e365f..f20f95167 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -214,6 +214,9 @@ importers: uuid: specifier: ^9.0.0 version: 9.0.0 + web-worker: + specifier: ^1.2.0 + version: 1.2.0 devDependencies: '@types/cytoscape': specifier: ^3.19.9 @@ -12435,6 +12438,10 @@ packages: minimalistic-assert: 1.0.1 dev: true + /web-worker/1.2.0: + resolution: {integrity: sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==} + dev: false + /webdriver/7.16.11: resolution: {integrity: sha512-6nBOXae4xuBH4Nqvi/zvtwjnxSLTONBpxOiRJtQ68CYTYv5+w3m8CsaWy3HbK/0XXa++NYl62bDNn70OGEKb+Q==} engines: {node: '>=12.0.0'} From 76fdc00b06463a6c57f52f5459ee60ca0fa2ec5b Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 16 Feb 2023 14:41:22 +0530 Subject: [PATCH 230/309] Remove heap option --- .github/workflows/build.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 36d627391..2a70b5901 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,8 +17,6 @@ jobs: strategy: matrix: node-version: [18.x] - env: - NODE_OPTIONS: '--max_old_space_size=4096' steps: - uses: actions/checkout@v3 From b8315cec6c851253954e3bba336ae8d9dfc667db Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 16 Feb 2023 14:42:47 +0530 Subject: [PATCH 231/309] Dynamic elk import --- packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js index 15624fc57..d8239742c 100644 --- a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js +++ b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js @@ -9,7 +9,6 @@ import { log } from '../../../logger'; import { setupGraphViewbox } from '../../../setupGraphViewbox'; import common, { evaluate } from '../../common/common'; import { interpolateToCurve, getStylesFromArray } from '../../../utils'; -import ELK from 'elkjs/lib/elk.bundled.js'; let elk; @@ -767,6 +766,7 @@ const insertChildren = (nodeArray, parentLookupDb) => { export const draw = async function (text, id, _version, diagObj) { if (!elk) { + const ELK = await import('elkjs/lib/elk.bundled.js'); elk = new ELK(); } // Add temporary render element From c815c84e1c7d226f0d06e1da97f8e5f34e26f8a3 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 16 Feb 2023 15:00:35 +0530 Subject: [PATCH 232/309] Fix elk import --- cypress/platform/sidv.html | 5 +---- .../mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/cypress/platform/sidv.html b/cypress/platform/sidv.html index 539288464..fce3c0082 100644 --- a/cypress/platform/sidv.html +++ b/cypress/platform/sidv.html @@ -65,7 +65,7 @@ graph TB
 flowchart-elk LR
   subgraph A
-  a -->b
+  a --> b
   end
   subgraph B
   b
@@ -246,10 +246,7 @@ sequenceDiagram
     
 
     
 ```
 
+From version 9.4.0 you can simplify this code to:
+
+    
+
+or is you prefere not using an esm package:
+
+```html
+
+```
+
+Note that more complex integrations that use the **render** function directly need to use the **renderAsync** method instead in order to render mind maps.
+
 You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/fcf53c98c25604c90a218104268c339be53035a6/src/lib/util/mermaid.ts) to see how the async loading is done.
diff --git a/docs/syntax/timeline.md b/docs/syntax/timeline.md
index 4e917bc10..dbbb3521e 100644
--- a/docs/syntax/timeline.md
+++ b/docs/syntax/timeline.md
@@ -459,4 +459,16 @@ Let's put them to use, and see how our sample diagram looks in different themes:
           2010 : Pinterest
 ```
 
+## Integrating with your library/website.
+
+Timeline uses experimental lazy loading & async rendering features which could change in the future.The lazy loading is important in order to be able to add additional diagrams going forward.
+
+You can use this method to add mermaid including the timeline diagram to a web page:
+
+```html
+
+```
+
+Note that more complex integrations that the **render** function directly need to use the **renderAsync** method instead in order to render mind maps.
+
 You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/fcf53c98c25604c90a218104268c339be53035a6/src/lib/util/mermaid.ts) to see how the async loading is done.
diff --git a/packages/mermaid/src/docs/syntax/mindmap.md b/packages/mermaid/src/docs/syntax/mindmap.md
index 833f26941..9bb8e9d78 100644
--- a/packages/mermaid/src/docs/syntax/mindmap.md
+++ b/packages/mermaid/src/docs/syntax/mindmap.md
@@ -164,14 +164,32 @@ Root
 
 ## Integrating with your library/website.
 
-Mindmap uses the experimental lazy loading & async rendering features which could change in the future.
+Mindmap uses the experimental lazy loading & async rendering features which could change in the future. From version 9.4.0 this diagram is included in mermaid but use lazy loading in order to keep the size of mermaid down. This is important in order to be able to add additional diagrams going forward.
+
+You can still use the pre 9.4.0 method to add mermaid with mindmaps to a web page:
 
 ```html
 
 ```
 
+From version 9.4.0 you can simplify this code to:
+
+```
+
+```
+
+or is you prefere not using an esm package:
+
+```html
+
+```
+
+Note that more complex integrations that use the **render** function directly need to use the **renderAsync** method instead in order to render mind maps.
+
 You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/fcf53c98c25604c90a218104268c339be53035a6/src/lib/util/mermaid.ts) to see how the async loading is done.
diff --git a/packages/mermaid/src/docs/syntax/timeline.md b/packages/mermaid/src/docs/syntax/timeline.md
index 76fdb5e60..784156036 100644
--- a/packages/mermaid/src/docs/syntax/timeline.md
+++ b/packages/mermaid/src/docs/syntax/timeline.md
@@ -291,4 +291,16 @@ Let's put them to use, and see how our sample diagram looks in different themes:
           2010 : Pinterest
 ```
 
+## Integrating with your library/website.
+
+Timeline uses experimental lazy loading & async rendering features which could change in the future.The lazy loading is important in order to be able to add additional diagrams going forward.
+
+You can use this method to add mermaid including the timeline diagram to a web page:
+
+```html
+
+```
+
+Note that more complex integrations that the **render** function directly need to use the **renderAsync** method instead in order to render mind maps.
+
 You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/fcf53c98c25604c90a218104268c339be53035a6/src/lib/util/mermaid.ts) to see how the async loading is done.

From b22978dfb2daf6bf8fde5fc50d2f1d45f3a0281c Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Thu, 16 Feb 2023 16:52:15 +0530
Subject: [PATCH 240/309] Fix timeline and mindmap

---
 docs/syntax/mindmap.md                       | 12 +++++++-----
 docs/syntax/timeline.md                      |  4 ++--
 packages/mermaid/src/docs/syntax/mindmap.md  |  6 +++---
 packages/mermaid/src/docs/syntax/timeline.md |  4 ++--
 4 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/docs/syntax/mindmap.md b/docs/syntax/mindmap.md
index f97ecc99f..81649351a 100644
--- a/docs/syntax/mindmap.md
+++ b/docs/syntax/mindmap.md
@@ -270,11 +270,13 @@ You can still use the pre 9.4.0 method to add mermaid with mindmaps to a web pag
 
 From version 9.4.0 you can simplify this code to:
 
-    
+```html
+
+```
 
-or is you prefere not using an esm package:
+or if you prefer not using the ESM package:
 
 ```html
 
@@ -282,4 +284,4 @@ or is you prefere not using an esm package:
 
 Note that more complex integrations that use the **render** function directly need to use the **renderAsync** method instead in order to render mind maps.
 
-You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/fcf53c98c25604c90a218104268c339be53035a6/src/lib/util/mermaid.ts) to see how the async loading is done.
+You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done.
diff --git a/docs/syntax/timeline.md b/docs/syntax/timeline.md
index dbbb3521e..943f247a0 100644
--- a/docs/syntax/timeline.md
+++ b/docs/syntax/timeline.md
@@ -469,6 +469,6 @@ You can use this method to add mermaid including the timeline diagram to a web p
 
 ```
 
-Note that more complex integrations that the **render** function directly need to use the **renderAsync** method instead in order to render mind maps.
+Note that more complex integrations that the **render** function directly need to use the **renderAsync** method instead in order to render timeline.
 
-You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/fcf53c98c25604c90a218104268c339be53035a6/src/lib/util/mermaid.ts) to see how the async loading is done.
+You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done.
diff --git a/packages/mermaid/src/docs/syntax/mindmap.md b/packages/mermaid/src/docs/syntax/mindmap.md
index 9bb8e9d78..cce7d2e3d 100644
--- a/packages/mermaid/src/docs/syntax/mindmap.md
+++ b/packages/mermaid/src/docs/syntax/mindmap.md
@@ -178,13 +178,13 @@ You can still use the pre 9.4.0 method to add mermaid with mindmaps to a web pag
 
 From version 9.4.0 you can simplify this code to:
 
-```
+```html
 
 ```
 
-or is you prefere not using an esm package:
+or if you prefer not using the ESM package:
 
 ```html
 
@@ -192,4 +192,4 @@ or is you prefere not using an esm package:
 
 Note that more complex integrations that use the **render** function directly need to use the **renderAsync** method instead in order to render mind maps.
 
-You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/fcf53c98c25604c90a218104268c339be53035a6/src/lib/util/mermaid.ts) to see how the async loading is done.
+You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done.
diff --git a/packages/mermaid/src/docs/syntax/timeline.md b/packages/mermaid/src/docs/syntax/timeline.md
index 784156036..94a485d22 100644
--- a/packages/mermaid/src/docs/syntax/timeline.md
+++ b/packages/mermaid/src/docs/syntax/timeline.md
@@ -301,6 +301,6 @@ You can use this method to add mermaid including the timeline diagram to a web p
 
 ```
 
-Note that more complex integrations that the **render** function directly need to use the **renderAsync** method instead in order to render mind maps.
+Note that more complex integrations that the **render** function directly need to use the **renderAsync** method instead in order to render timeline.
 
-You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/fcf53c98c25604c90a218104268c339be53035a6/src/lib/util/mermaid.ts) to see how the async loading is done.
+You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done.

From b10d243995b9b832e9fe716355936461fcf415bf Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Thu, 16 Feb 2023 17:07:03 +0530
Subject: [PATCH 241/309] Fix release-publish

---
 .github/workflows/release-publish.yml | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/.github/workflows/release-publish.yml b/.github/workflows/release-publish.yml
index 6f0806de1..3cc454f4f 100644
--- a/.github/workflows/release-publish.yml
+++ b/.github/workflows/release-publish.yml
@@ -11,18 +11,21 @@ jobs:
       - uses: actions/checkout@v3
       - uses: fregante/setup-git-user@v1
 
-      - name: Setup Node.js
+      - uses: pnpm/action-setup@v2
+        # uses version from "packageManager" field in package.json
+
+      - name: Setup Node.js v18
         uses: actions/setup-node@v3
         with:
+          cache: pnpm
           node-version: 18.x
-      - name: Install Yarn
-        run: npm i yarn --global
-
-      - name: Install Json
-        run: npm i json --global
 
       - name: Install Packages
-        run: yarn install --frozen-lockfile
+        run: |
+          pnpm install --frozen-lockfile
+          npm i json --global
+        env:
+          CYPRESS_CACHE_FOLDER: .cache/Cypress
 
       - name: Prepare release
         run: |

From 86cfb1bb60fa64f4b2b6700b55976ccd863e69f0 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Thu, 16 Feb 2023 17:09:02 +0530
Subject: [PATCH 242/309] Skip precommit hooks on CI

---
 .github/workflows/release-publish.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/release-publish.yml b/.github/workflows/release-publish.yml
index 3cc454f4f..28094453e 100644
--- a/.github/workflows/release-publish.yml
+++ b/.github/workflows/release-publish.yml
@@ -34,7 +34,7 @@ jobs:
           git checkout -t origin/release/$VERSION
           npm version --no-git-tag-version --allow-same-version $VERSION
           git add package.json
-          git commit -m "Bump version $VERSION"
+          git commit -nm "Bump version $VERSION"
           git checkout -t origin/master
           git merge -m "Release $VERSION" --no-ff release/$VERSION
           git push --no-verify

From d543bc0411baf64ad9754bdb7572101287d2635e Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Thu, 16 Feb 2023 17:27:51 +0530
Subject: [PATCH 243/309] docs: fix links

---
 packages/mermaid/src/docs/.vitepress/config.ts         | 2 +-
 packages/mermaid/src/docs/.vitepress/theme/redirect.ts | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/packages/mermaid/src/docs/.vitepress/config.ts b/packages/mermaid/src/docs/.vitepress/config.ts
index 396029a96..9b01fdbde 100644
--- a/packages/mermaid/src/docs/.vitepress/config.ts
+++ b/packages/mermaid/src/docs/.vitepress/config.ts
@@ -41,7 +41,7 @@ function nav() {
       link: '/config/Tutorials',
       activeMatch: '/config/',
     },
-    { text: 'Integrations', link: '/misc/integrations', activeMatch: '/misc/' },
+    { text: 'Integrations', link: '/ecosystem/integrations', activeMatch: '/ecosystem/' },
     {
       text: version,
       items: [
diff --git a/packages/mermaid/src/docs/.vitepress/theme/redirect.ts b/packages/mermaid/src/docs/.vitepress/theme/redirect.ts
index 0109aea10..936d6f7e2 100644
--- a/packages/mermaid/src/docs/.vitepress/theme/redirect.ts
+++ b/packages/mermaid/src/docs/.vitepress/theme/redirect.ts
@@ -31,7 +31,7 @@ const idRedirectMap: Record = {
   c4c: 'syntax/c4c',
   classdiagram: 'syntax/classDiagram',
   configuration: 'config/configuration',
-  demos: 'misc/integrations',
+  demos: 'ecosystem/integrations',
   development: 'community/development',
   directives: 'config/directives',
   entityrelationshipdiagram: 'syntax/entityRelationshipDiagram',
@@ -40,7 +40,7 @@ const idRedirectMap: Record = {
   flowchart: 'syntax/flowchart',
   gantt: 'syntax/gantt',
   gitgraph: 'syntax/gitgraph',
-  integrations: 'misc/integrations',
+  integrations: 'ecosystem/integrations',
   'language-highlight': '',
   markdown: '',
   mermaidapi: 'config/usage',

From ccaa99937fbd2a71068d7151ee723214c1861e66 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Thu, 16 Feb 2023 12:27:04 +0000
Subject: [PATCH 244/309] chore(deps): update dependency cypress to v12

---
 package.json   |   2 +-
 pnpm-lock.yaml | 295 ++-----------------------------------------------
 2 files changed, 12 insertions(+), 285 deletions(-)

diff --git a/package.json b/package.json
index 901e7908f..e05563f39 100644
--- a/package.json
+++ b/package.json
@@ -74,7 +74,7 @@
     "@vitest/ui": "^0.28.4",
     "concurrently": "^7.5.0",
     "coveralls": "^3.1.1",
-    "cypress": "^10.11.0",
+    "cypress": "^12.0.0",
     "cypress-image-snapshot": "^4.0.1",
     "esbuild": "^0.17.0",
     "eslint": "^8.32.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 04d2d2b5a..a388cf654 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -65,11 +65,11 @@ importers:
         specifier: ^3.1.1
         version: 3.1.1
       cypress:
-        specifier: ^10.11.0
-        version: 10.11.0
+        specifier: ^12.0.0
+        version: 12.5.1
       cypress-image-snapshot:
         specifier: ^4.0.1
-        version: 4.0.1_bg25yee4qeg7mpleuvd346a3tq
+        version: 4.0.1_cypress@12.5.1+jest@29.3.1
       esbuild:
         specifier: ^0.17.0
         version: 0.17.0
@@ -1742,15 +1742,6 @@ packages:
       jsdoc-type-pratt-parser: 3.1.0
     dev: true
 
-  /@esbuild/android-arm/0.15.13:
-    resolution: {integrity: sha512-RY2fVI8O0iFUNvZirXaQ1vMvK0xhCcl0gqRj74Z6yEiO1zAUa7hbsdwZM1kzqbxHK7LFyMizipfXT3JME+12Hw==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/android-arm/0.16.17:
     resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==}
     engines: {node: '>=12'}
@@ -2021,15 +2012,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-loong64/0.15.13:
-    resolution: {integrity: sha512-+BoyIm4I8uJmH/QDIH0fu7MG0AEx9OXEDXnqptXCwKOlOqZiS4iraH1Nr7/ObLMokW3sOCeBNyD68ATcV9b9Ag==}
-    engines: {node: '>=12'}
-    cpu: [loong64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-loong64/0.16.17:
     resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==}
     engines: {node: '>=12'}
@@ -4349,7 +4331,7 @@ packages:
   /axios/0.21.4_debug@4.3.2:
     resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==}
     dependencies:
-      follow-redirects: 1.15.2_debug@4.3.2
+      follow-redirects: 1.15.2
     transitivePeerDependencies:
       - debug
     dev: true
@@ -5428,14 +5410,14 @@ packages:
     resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==}
     dev: true
 
-  /cypress-image-snapshot/4.0.1_bg25yee4qeg7mpleuvd346a3tq:
+  /cypress-image-snapshot/4.0.1_cypress@12.5.1+jest@29.3.1:
     resolution: {integrity: sha512-PBpnhX/XItlx3/DAk5ozsXQHUi72exybBNH5Mpqj1DVmjq+S5Jd9WE5CRa4q5q0zuMZb2V2VpXHth6MjFpgj9Q==}
     engines: {node: '>=8'}
     peerDependencies:
       cypress: ^4.5.0
     dependencies:
       chalk: 2.4.2
-      cypress: 10.11.0
+      cypress: 12.5.1
       fs-extra: 7.0.1
       glob: 7.2.3
       jest-image-snapshot: 4.2.0_jest@29.3.1
@@ -5445,9 +5427,9 @@ packages:
       - jest
     dev: true
 
-  /cypress/10.11.0:
-    resolution: {integrity: sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA==}
-    engines: {node: '>=12.0.0'}
+  /cypress/12.5.1:
+    resolution: {integrity: sha512-ZmCmJ3lsyeOpBfh410m5+AO2CO1AxAzFBt7k6/uVbNcrNZje1vdiwYTpj2ksPKg9mjr9lR6V8tmlDNMvr4H/YQ==}
+    engines: {node: ^14.0.0 || ^16.0.0 || >=18.0.0}
     hasBin: true
     requiresBuild: true
     dependencies:
@@ -6214,216 +6196,6 @@ packages:
     resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==}
     dev: true
 
-  /esbuild-android-64/0.15.13:
-    resolution: {integrity: sha512-yRorukXBlokwTip+Sy4MYskLhJsO0Kn0/Fj43s1krVblfwP+hMD37a4Wmg139GEsMLl+vh8WXp2mq/cTA9J97g==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-android-arm64/0.15.13:
-    resolution: {integrity: sha512-TKzyymLD6PiVeyYa4c5wdPw87BeAiTXNtK6amWUcXZxkV51gOk5u5qzmDaYSwiWeecSNHamFsaFjLoi32QR5/w==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-darwin-64/0.15.13:
-    resolution: {integrity: sha512-WAx7c2DaOS6CrRcoYCgXgkXDliLnFv3pQLV6GeW1YcGEZq2Gnl8s9Pg7ahValZkpOa0iE/ojRVQ87sbUhF1Cbg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-darwin-arm64/0.15.13:
-    resolution: {integrity: sha512-U6jFsPfSSxC3V1CLiQqwvDuj3GGrtQNB3P3nNC3+q99EKf94UGpsG9l4CQ83zBs1NHrk1rtCSYT0+KfK5LsD8A==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-freebsd-64/0.15.13:
-    resolution: {integrity: sha512-whItJgDiOXaDG/idy75qqevIpZjnReZkMGCgQaBWZuKHoElDJC1rh7MpoUgupMcdfOd+PgdEwNQW9DAE6i8wyA==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-freebsd-arm64/0.15.13:
-    resolution: {integrity: sha512-6pCSWt8mLUbPtygv7cufV0sZLeylaMwS5Fznj6Rsx9G2AJJsAjQ9ifA+0rQEIg7DwJmi9it+WjzNTEAzzdoM3Q==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-32/0.15.13:
-    resolution: {integrity: sha512-VbZdWOEdrJiYApm2kkxoTOgsoCO1krBZ3quHdYk3g3ivWaMwNIVPIfEE0f0XQQ0u5pJtBsnk2/7OPiCFIPOe/w==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-64/0.15.13:
-    resolution: {integrity: sha512-rXmnArVNio6yANSqDQlIO4WiP+Cv7+9EuAHNnag7rByAqFVuRusLbGi2697A5dFPNXoO//IiogVwi3AdcfPC6A==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-arm/0.15.13:
-    resolution: {integrity: sha512-Ac6LpfmJO8WhCMQmO253xX2IU2B3wPDbl4IvR0hnqcPrdfCaUa2j/lLMGTjmQ4W5JsJIdHEdW12dG8lFS0MbxQ==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-arm64/0.15.13:
-    resolution: {integrity: sha512-alEMGU4Z+d17U7KQQw2IV8tQycO6T+rOrgW8OS22Ua25x6kHxoG6Ngry6Aq6uranC+pNWNMB6aHFPh7aTQdORQ==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-mips64le/0.15.13:
-    resolution: {integrity: sha512-47PgmyYEu+yN5rD/MbwS6DxP2FSGPo4Uxg5LwIdxTiyGC2XKwHhHyW7YYEDlSuXLQXEdTO7mYe8zQ74czP7W8A==}
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-ppc64le/0.15.13:
-    resolution: {integrity: sha512-z6n28h2+PC1Ayle9DjKoBRcx/4cxHoOa2e689e2aDJSaKug3jXcQw7mM+GLg+9ydYoNzj8QxNL8ihOv/OnezhA==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-riscv64/0.15.13:
-    resolution: {integrity: sha512-+Lu4zuuXuQhgLUGyZloWCqTslcCAjMZH1k3Xc9MSEJEpEFdpsSU0sRDXAnk18FKOfEjhu4YMGaykx9xjtpA6ow==}
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-s390x/0.15.13:
-    resolution: {integrity: sha512-BMeXRljruf7J0TMxD5CIXS65y7puiZkAh+s4XFV9qy16SxOuMhxhVIXYLnbdfLrsYGFzx7U9mcdpFWkkvy/Uag==}
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-netbsd-64/0.15.13:
-    resolution: {integrity: sha512-EHj9QZOTel581JPj7UO3xYbltFTYnHy+SIqJVq6yd3KkCrsHRbapiPb0Lx3EOOtybBEE9EyqbmfW1NlSDsSzvQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-openbsd-64/0.15.13:
-    resolution: {integrity: sha512-nkuDlIjF/sfUhfx8SKq0+U+Fgx5K9JcPq1mUodnxI0x4kBdCv46rOGWbuJ6eof2n3wdoCLccOoJAbg9ba/bT2w==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-sunos-64/0.15.13:
-    resolution: {integrity: sha512-jVeu2GfxZQ++6lRdY43CS0Tm/r4WuQQ0Pdsrxbw+aOrHQPHV0+LNOLnvbN28M7BSUGnJnHkHm2HozGgNGyeIRw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-windows-32/0.15.13:
-    resolution: {integrity: sha512-XoF2iBf0wnqo16SDq+aDGi/+QbaLFpkiRarPVssMh9KYbFNCqPLlGAWwDvxEVz+ywX6Si37J2AKm+AXq1kC0JA==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-windows-64/0.15.13:
-    resolution: {integrity: sha512-Et6htEfGycjDrtqb2ng6nT+baesZPYQIW+HUEHK4D1ncggNrDNk3yoboYQ5KtiVrw/JaDMNttz8rrPubV/fvPQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-windows-arm64/0.15.13:
-    resolution: {integrity: sha512-3bv7tqntThQC9SWLRouMDmZnlOukBhOCTlkzNqzGCmrkCJI7io5LLjwJBOVY6kOUlIvdxbooNZwjtBvj+7uuVg==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild/0.15.13:
-    resolution: {integrity: sha512-Cu3SC84oyzzhrK/YyN4iEVy2jZu5t2fz66HEOShHURcjSkOSAVL8C/gfUT+lDJxkVHpg8GZ10DD0rMHRPqMFaQ==}
-    engines: {node: '>=12'}
-    hasBin: true
-    requiresBuild: true
-    optionalDependencies:
-      '@esbuild/android-arm': 0.15.13
-      '@esbuild/linux-loong64': 0.15.13
-      esbuild-android-64: 0.15.13
-      esbuild-android-arm64: 0.15.13
-      esbuild-darwin-64: 0.15.13
-      esbuild-darwin-arm64: 0.15.13
-      esbuild-freebsd-64: 0.15.13
-      esbuild-freebsd-arm64: 0.15.13
-      esbuild-linux-32: 0.15.13
-      esbuild-linux-64: 0.15.13
-      esbuild-linux-arm: 0.15.13
-      esbuild-linux-arm64: 0.15.13
-      esbuild-linux-mips64le: 0.15.13
-      esbuild-linux-ppc64le: 0.15.13
-      esbuild-linux-riscv64: 0.15.13
-      esbuild-linux-s390x: 0.15.13
-      esbuild-netbsd-64: 0.15.13
-      esbuild-openbsd-64: 0.15.13
-      esbuild-sunos-64: 0.15.13
-      esbuild-windows-32: 0.15.13
-      esbuild-windows-64: 0.15.13
-      esbuild-windows-arm64: 0.15.13
-    dev: true
-
   /esbuild/0.16.17:
     resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==}
     engines: {node: '>=12'}
@@ -7181,7 +6953,7 @@ packages:
     resolution: {integrity: sha512-XGozTsMPYkm+6b5QL3Z9wQcJjNYxp0CYn3U1gO7dwD6PAqU1SVWZxI9CCg3z+ml3YfqdPnrBehaBrnH2AGKbNA==}
     dev: true
 
-  /follow-redirects/1.15.2_debug@4.3.2:
+  /follow-redirects/1.15.2:
     resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
     engines: {node: '>=4.0'}
     peerDependencies:
@@ -7189,8 +6961,6 @@ packages:
     peerDependenciesMeta:
       debug:
         optional: true
-    dependencies:
-      debug: 4.3.2
     dev: true
 
   /foreground-child/2.0.0:
@@ -7730,7 +7500,7 @@ packages:
     engines: {node: '>=8.0.0'}
     dependencies:
       eventemitter3: 4.0.7
-      follow-redirects: 1.15.2_debug@4.3.2
+      follow-redirects: 1.15.2
       requires-port: 1.0.0
     transitivePeerDependencies:
       - debug
@@ -10276,15 +10046,6 @@ packages:
     resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
     dev: true
 
-  /postcss/8.4.18:
-    resolution: {integrity: sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==}
-    engines: {node: ^10 || ^12 || >=14}
-    dependencies:
-      nanoid: 3.3.4
-      picocolors: 1.0.0
-      source-map-js: 1.0.2
-    dev: true
-
   /postcss/8.4.20:
     resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==}
     engines: {node: ^10 || ^12 || >=14}
@@ -12106,40 +11867,6 @@ packages:
       - terser
     dev: true
 
-  /vite/3.2.3_@types+node@18.11.9:
-    resolution: {integrity: sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==}
-    engines: {node: ^14.18.0 || >=16.0.0}
-    hasBin: true
-    peerDependencies:
-      '@types/node': '>= 14'
-      less: '*'
-      sass: '*'
-      stylus: '*'
-      sugarss: '*'
-      terser: ^5.4.0
-    peerDependenciesMeta:
-      '@types/node':
-        optional: true
-      less:
-        optional: true
-      sass:
-        optional: true
-      stylus:
-        optional: true
-      sugarss:
-        optional: true
-      terser:
-        optional: true
-    dependencies:
-      '@types/node': 18.11.9
-      esbuild: 0.15.13
-      postcss: 8.4.18
-      resolve: 1.22.1
-      rollup: 2.79.1
-    optionalDependencies:
-      fsevents: 2.3.2
-    dev: true
-
   /vite/4.0.1_@types+node@18.11.9:
     resolution: {integrity: sha512-kZQPzbDau35iWOhy3CpkrRC7It+HIHtulAzBhMqzGHKRf/4+vmh8rPDDdv98SWQrFWo6//3ozwsRmwQIPZsK9g==}
     engines: {node: ^14.18.0 || >=16.0.0}

From 4ed6ec1a4dd4d406f1bb28551fcca19f84bb19c4 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Thu, 16 Feb 2023 18:00:41 +0530
Subject: [PATCH 245/309] Add highlight tag info in contributing.md

---
 CONTRIBUTING.md                               | 22 +++++++++++++++++++
 docs/syntax/flowchart.md                      |  3 ++-
 packages/mermaid/src/docs/syntax/flowchart.md |  4 +++-
 3 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index cf199c39b..b0320b36e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -63,6 +63,28 @@ flowchart LR
 
 ```
 
+You can use `note`, `tip`, `warning` and `danger` in triple backticks to add a note, tip, warning or danger box.
+Do not use vitepress specific markdown syntax `::: warning` as it will not be processed correctly.
+
+````
+```note
+Note content
+```
+
+```tip
+Tip content
+```
+
+```warning
+Warning content
+```
+
+```danger
+Danger content
+```
+
+````
+
 **_DO NOT CHANGE FILES IN `/docs`_**
 
 ### The official documentation site
diff --git a/docs/syntax/flowchart.md b/docs/syntax/flowchart.md
index 6ef8a1046..fd0408c45 100644
--- a/docs/syntax/flowchart.md
+++ b/docs/syntax/flowchart.md
@@ -30,7 +30,8 @@ flowchart LR
     id
 ```
 
-> **Note** The id is what is displayed in the box.
+> **Note**
+> The id is what is displayed in the box.
 
 ### A node with text
 
diff --git a/packages/mermaid/src/docs/syntax/flowchart.md b/packages/mermaid/src/docs/syntax/flowchart.md
index 587b3b1fc..5896e0518 100644
--- a/packages/mermaid/src/docs/syntax/flowchart.md
+++ b/packages/mermaid/src/docs/syntax/flowchart.md
@@ -21,7 +21,9 @@ flowchart LR
     id
 ```
 
-> **Note** The id is what is displayed in the box.
+```note
+The id is what is displayed in the box.
+```
 
 ### A node with text
 

From e31924eadc02e88ab1c06da748078db573ae3d52 Mon Sep 17 00:00:00 2001
From: Aiello 
Date: Sat, 18 Feb 2023 23:21:20 +0800
Subject: [PATCH 246/309] fix(api): tree shaking package.json import

Manually tree shaking import statement of package.json
---
 packages/mermaid/src/mermaidAPI.ts | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/packages/mermaid/src/mermaidAPI.ts b/packages/mermaid/src/mermaidAPI.ts
index 68db59b34..fe9c00384 100644
--- a/packages/mermaid/src/mermaidAPI.ts
+++ b/packages/mermaid/src/mermaidAPI.ts
@@ -13,7 +13,7 @@
 import { select } from 'd3';
 import { compile, serialize, stringify } from 'stylis';
 // @ts-ignore: TODO Fix ts errors
-import pkg from '../package.json';
+import { version } from '../package.json';
 import * as configApi from './config';
 import { addDiagrams } from './diagram-api/diagram-orchestration';
 import classDb from './diagrams/class/classDb';
@@ -506,9 +506,9 @@ const render = function (
   // -------------------------------------------------------------------------------
   // Draw the diagram with the renderer
   try {
-    diag.renderer.draw(text, id, pkg.version, diag);
+    diag.renderer.draw(text, id, version, diag);
   } catch (e) {
-    errorRenderer.draw(text, id, pkg.version);
+    errorRenderer.draw(text, id, version);
     throw e;
   }
 
@@ -708,9 +708,9 @@ const renderAsync = async function (
   // -------------------------------------------------------------------------------
   // Draw the diagram with the renderer
   try {
-    await diag.renderer.draw(text, id, pkg.version, diag);
+    await diag.renderer.draw(text, id, version, diag);
   } catch (e) {
-    errorRenderer.draw(text, id, pkg.version);
+    errorRenderer.draw(text, id, version);
     throw e;
   }
 

From 3c4a6a19bb243002dcebccf31b186abb8c215ab8 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Sat, 18 Feb 2023 22:35:14 +0530
Subject: [PATCH 247/309] fix: Vite, D3, Vitest Types

---
 docs/config/setup/modules/mermaidAPI.md       |  22 +-
 package.json                                  |   8 +-
 packages/mermaid/package.json                 |   2 +-
 .../src/diagrams/error/errorRenderer.ts       |   1 +
 packages/mermaid/src/docs/vite.config.ts      |  13 +-
 packages/mermaid/src/mermaidAPI.ts            |   1 +
 packages/mermaid/src/tests/MockedD3.ts        |   2 +-
 pnpm-lock.yaml                                | 699 ++++++++----------
 tsconfig.json                                 |   2 +-
 9 files changed, 339 insertions(+), 411 deletions(-)

diff --git a/docs/config/setup/modules/mermaidAPI.md b/docs/config/setup/modules/mermaidAPI.md
index 02d0fcf49..bd9833c5b 100644
--- a/docs/config/setup/modules/mermaidAPI.md
+++ b/docs/config/setup/modules/mermaidAPI.md
@@ -20,7 +20,7 @@ Renames and re-exports [mermaidAPI](mermaidAPI.md#mermaidapi)
 
 #### Defined in
 
-[mermaidAPI.ts:74](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L74)
+[mermaidAPI.ts:75](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L75)
 
 ## Variables
 
@@ -90,7 +90,7 @@ mermaid.initialize(config);
 
 #### Defined in
 
-[mermaidAPI.ts:886](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L886)
+[mermaidAPI.ts:887](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L887)
 
 ## Functions
 
@@ -121,7 +121,7 @@ Return the last node appended
 
 #### Defined in
 
-[mermaidAPI.ts:287](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L287)
+[mermaidAPI.ts:288](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L288)
 
 ---
 
@@ -147,7 +147,7 @@ the cleaned up svgCode
 
 #### Defined in
 
-[mermaidAPI.ts:238](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L238)
+[mermaidAPI.ts:239](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L239)
 
 ---
 
@@ -173,7 +173,7 @@ the string with all the user styles
 
 #### Defined in
 
-[mermaidAPI.ts:167](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L167)
+[mermaidAPI.ts:168](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L168)
 
 ---
 
@@ -196,7 +196,7 @@ the string with all the user styles
 
 #### Defined in
 
-[mermaidAPI.ts:215](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L215)
+[mermaidAPI.ts:216](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L216)
 
 ---
 
@@ -223,7 +223,7 @@ with an enclosing block that has each of the cssClasses followed by !important;
 
 #### Defined in
 
-[mermaidAPI.ts:151](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L151)
+[mermaidAPI.ts:152](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L152)
 
 ---
 
@@ -243,7 +243,7 @@ with an enclosing block that has each of the cssClasses followed by !important;
 
 #### Defined in
 
-[mermaidAPI.ts:131](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L131)
+[mermaidAPI.ts:132](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L132)
 
 ---
 
@@ -263,7 +263,7 @@ with an enclosing block that has each of the cssClasses followed by !important;
 
 #### Defined in
 
-[mermaidAPI.ts:102](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L102)
+[mermaidAPI.ts:103](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L103)
 
 ---
 
@@ -289,7 +289,7 @@ Put the svgCode into an iFrame. Return the iFrame code
 
 #### Defined in
 
-[mermaidAPI.ts:266](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L266)
+[mermaidAPI.ts:267](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L267)
 
 ---
 
@@ -314,4 +314,4 @@ Remove any existing elements from the given document
 
 #### Defined in
 
-[mermaidAPI.ts:337](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L337)
+[mermaidAPI.ts:338](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L338)
diff --git a/package.json b/package.json
index 3a4847609..e78ac8892 100644
--- a/package.json
+++ b/package.json
@@ -34,7 +34,7 @@
     "test:watch": "vitest --watch",
     "test:coverage": "vitest --coverage",
     "prepublishOnly": "pnpm build && pnpm test",
-    "prepare": "concurrently \"husky install\" \"pnpm build\"",
+    "prepare": "husky install && pnpm build",
     "pre-commit": "lint-staged"
   },
   "repository": {
@@ -103,11 +103,11 @@
     "prettier-plugin-jsdoc": "^0.4.2",
     "rimraf": "^4.0.0",
     "rollup-plugin-visualizer": "^5.8.3",
-    "start-server-and-test": "^1.14.0",
+    "start-server-and-test": "^1.15.4",
     "ts-node": "^10.9.1",
     "typescript": "^4.8.4",
-    "vite": "^3.2.3",
-    "vitest": "^0.28.4"
+    "vite": "^4.1.1",
+    "vitest": "^0.28.5"
   },
   "volta": {
     "node": "18.14.0"
diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json
index e4480286f..977c16f18 100644
--- a/packages/mermaid/package.json
+++ b/packages/mermaid/package.json
@@ -56,7 +56,7 @@
     "cytoscape": "^3.23.0",
     "cytoscape-cose-bilkent": "^4.1.0",
     "cytoscape-fcose": "^2.1.0",
-    "d3": "^7.0.0",
+    "d3": "^7.4.0",
     "dagre-d3-es": "7.0.8",
     "dompurify": "2.4.3",
     "elkjs": "^0.8.2",
diff --git a/packages/mermaid/src/diagrams/error/errorRenderer.ts b/packages/mermaid/src/diagrams/error/errorRenderer.ts
index b4e267684..60877cb8d 100644
--- a/packages/mermaid/src/diagrams/error/errorRenderer.ts
+++ b/packages/mermaid/src/diagrams/error/errorRenderer.ts
@@ -1,4 +1,5 @@
 /** Created by knut on 14-12-11. */
+// @ts-ignore TODO: Investigate D3 issue
 import { select } from 'd3';
 import { log } from '../../logger';
 import { getErrorMessage } from '../../utils';
diff --git a/packages/mermaid/src/docs/vite.config.ts b/packages/mermaid/src/docs/vite.config.ts
index 3f29b497d..dc5661de0 100644
--- a/packages/mermaid/src/docs/vite.config.ts
+++ b/packages/mermaid/src/docs/vite.config.ts
@@ -1,4 +1,4 @@
-import { defineConfig, searchForWorkspaceRoot } from 'vite';
+import { defineConfig, searchForWorkspaceRoot, PluginOption } from 'vite';
 import path from 'path';
 // @ts-ignore: still in alpha
 import { SearchPlugin } from 'vitepress-plugin-search';
@@ -13,12 +13,12 @@ export default defineConfig({
       // TODO: will be fixed in the next vitepress release.
       name: 'fix-virtual',
 
-      async resolveId(id) {
+      async resolveId(id: string) {
         if (id === virtualModuleId) {
           return resolvedVirtualModuleId;
         }
       },
-      async load(this, id) {
+      async load(this, id: string) {
         if (id === resolvedVirtualModuleId) {
           return `export default ${JSON.stringify({
             securityLevel: 'loose',
@@ -26,20 +26,15 @@ export default defineConfig({
           })};`;
         }
       },
-    },
+    } as PluginOption,
   ],
   resolve: {
     alias: {
       mermaid: path.join(__dirname, '../../dist/mermaid.esm.min.mjs'), // Use this one to build
-
       '@mermaid-js/mermaid-example-diagram': path.join(
         __dirname,
         '../../../mermaid-example-diagram/dist/mermaid-example-diagram.esm.min.mjs'
       ), // Use this one to build
-      // '@mermaid-js/mermaid-timeline': path.join(
-      //   __dirname,
-      //   '../../../mermaid-timeline/dist/mermaid-timeline.esm.min.mjs'
-      // ),
     },
   },
   server: {
diff --git a/packages/mermaid/src/mermaidAPI.ts b/packages/mermaid/src/mermaidAPI.ts
index 68db59b34..aea67548e 100644
--- a/packages/mermaid/src/mermaidAPI.ts
+++ b/packages/mermaid/src/mermaidAPI.ts
@@ -10,6 +10,7 @@
  *
  * In addition to the render function, a number of behavioral configuration options are available.
  */
+// @ts-ignore TODO: Investigate D3 issue
 import { select } from 'd3';
 import { compile, serialize, stringify } from 'stylis';
 // @ts-ignore: TODO Fix ts errors
diff --git a/packages/mermaid/src/tests/MockedD3.ts b/packages/mermaid/src/tests/MockedD3.ts
index 4600e2667..ccf21a269 100644
--- a/packages/mermaid/src/tests/MockedD3.ts
+++ b/packages/mermaid/src/tests/MockedD3.ts
@@ -1,4 +1,4 @@
-import type {} from '@vitest/spy';
+import type {} from '@vitest/spy/dist/index';
 
 /**
  * This is a mocked/stubbed version of the d3 Selection type. Each of the main functions are all
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f20f95167..dc4250983 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -45,10 +45,10 @@ importers:
         version: 4.2.1
       '@typescript-eslint/eslint-plugin':
         specifier: ^5.48.2
-        version: 5.48.2_iljmjqxcygjq3saipl7gerxpvi
+        version: 5.48.2_azmbqzqvrlvblbdtiwxwvyvjjy
       '@typescript-eslint/parser':
         specifier: ^5.48.2
-        version: 5.48.2_yygwinqv3a2io74xmwofqb7uka
+        version: 5.48.2_et5x32uxl7z5ldub3ye5rhlyqm
       '@vitest/coverage-c8':
         specifier: ^0.28.4
         version: 0.28.4_vun5xzxu3tkrssf3erdbijyyki
@@ -87,7 +87,7 @@ importers:
         version: 7.1.0
       eslint-plugin-jest:
         specifier: ^27.1.5
-        version: 27.1.5_5rcd23qw3h5vuffwo2owxb3hw4
+        version: 27.1.5_i5clxtuiaceouxhg5syqkw5wwi
       eslint-plugin-jsdoc:
         specifier: ^39.6.2
         version: 39.6.2_eslint@8.32.0
@@ -152,20 +152,20 @@ importers:
         specifier: ^5.8.3
         version: 5.8.3
       start-server-and-test:
-        specifier: ^1.14.0
-        version: 1.14.0
+        specifier: ^1.15.4
+        version: 1.15.4
       ts-node:
         specifier: ^10.9.1
-        version: 10.9.1_cbe7ovvae6zqfnmtgctpgpys54
+        version: 10.9.1_w6ufic3jqylcjznzspnj4wjqfe
       typescript:
         specifier: ^4.8.4
-        version: 4.8.4
+        version: 4.9.5
       vite:
-        specifier: ^3.2.3
-        version: 3.2.3_@types+node@18.11.9
+        specifier: ^4.1.1
+        version: 4.1.1_@types+node@18.11.9
       vitest:
-        specifier: ^0.28.4
-        version: 0.28.4_vun5xzxu3tkrssf3erdbijyyki
+        specifier: ^0.28.5
+        version: 0.28.5_vun5xzxu3tkrssf3erdbijyyki
 
   packages/mermaid:
     dependencies:
@@ -182,8 +182,8 @@ importers:
         specifier: ^2.1.0
         version: 2.1.0_cytoscape@3.23.0
       d3:
-        specifier: ^7.0.0
-        version: 7.6.1
+        specifier: ^7.4.0
+        version: 7.8.2
       dagre-d3-es:
         specifier: 7.0.8
         version: 7.0.8
@@ -1260,11 +1260,11 @@ packages:
       '@types/node': 14.18.29
       chalk: 4.1.2
       cosmiconfig: 7.0.1
-      cosmiconfig-typescript-loader: 4.1.0_nxlrwu45zhpwmwjzs33dzt3ak4
+      cosmiconfig-typescript-loader: 4.1.0_2uclxasecupgvdn72amnhmyg7y
       lodash: 4.17.21
       resolve-from: 5.0.0
-      ts-node: 10.9.1_sqjhzn5m3vxyw66a2xhtc43hby
-      typescript: 4.8.4
+      ts-node: 10.9.1_yxpazyh7n5pql7jdaglasgwqki
+      typescript: 4.9.5
     transitivePeerDependencies:
       - '@swc/core'
       - '@swc/wasm'
@@ -1760,15 +1760,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/android-arm/0.16.7:
-    resolution: {integrity: sha512-yhzDbiVcmq6T1/XEvdcJIVcXHdLjDJ5cQ0Dp9R9p9ERMBTeO1dR5tc8YYv8zwDeBw1xZm+Eo3MRo8cwclhBS0g==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/android-arm/0.17.0:
     resolution: {integrity: sha512-hlbX5ym1V5kIKvnwFhm6rhar7MNqfJrZyYTNfk6+WS1uQfQmszFgXeyPH2beP3lSCumZyqX0zMBfOqftOpZ7GA==}
     engines: {node: '>=12'}
@@ -1787,15 +1778,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/android-arm64/0.16.7:
-    resolution: {integrity: sha512-tYFw0lBJSEvLoGzzYh1kXuzoX1iPkbOk3O29VqzQb0HbOy7t/yw1hGkvwoJhXHwzQUPsShyYcTgRf6bDBcfnTw==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/android-arm64/0.17.0:
     resolution: {integrity: sha512-77GVyD7ToESy/7+9eI8z62GGBdS/hsqsrpM+JA4kascky86wHbN29EEFpkVvxajPL7k6mbLJ5VBQABdj7n9FhQ==}
     engines: {node: '>=12'}
@@ -1814,15 +1796,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/android-x64/0.16.7:
-    resolution: {integrity: sha512-3P2OuTxwAtM3k/yEWTNUJRjMPG1ce8rXs51GTtvEC5z1j8fC1plHeVVczdeHECU7aM2/Buc0MwZ6ciM/zysnWg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/android-x64/0.17.0:
     resolution: {integrity: sha512-TroxZdZhtAz0JyD0yahtjcbKuIXrBEAoAazaYSeR2e2tUtp9uXrcbpwFJF6oxxOiOOne6y7l4hx4YVnMW/tdFw==}
     engines: {node: '>=12'}
@@ -1841,15 +1814,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/darwin-arm64/0.16.7:
-    resolution: {integrity: sha512-VUb9GK23z8jkosHU9yJNUgQpsfJn+7ZyBm6adi2Ec5/U241eR1tAn82QicnUzaFDaffeixiHwikjmnec/YXEZg==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/darwin-arm64/0.17.0:
     resolution: {integrity: sha512-wP/v4cgdWt1m8TS/WmbaBc3NZON10eCbm6XepdVc3zJuqruHCzCKcC9dTSTEk50zX04REcRcbIbdhTMciQoFIg==}
     engines: {node: '>=12'}
@@ -1868,15 +1832,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/darwin-x64/0.16.7:
-    resolution: {integrity: sha512-duterlv3tit3HI9vhzMWnSVaB1B6YsXpFq1Ntd6Fou82BB1l4tucYy3FI9dHv3tvtDuS0NiGf/k6XsdBqPZ01w==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/darwin-x64/0.17.0:
     resolution: {integrity: sha512-R4WB6D6V9KGO/3LVTT8UlwRJO26IBFatOdo/bRXksfJR0vyOi2/lgmAAMBSpgcnnwvts9QsWiyM++mTTlwRseA==}
     engines: {node: '>=12'}
@@ -1895,15 +1850,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/freebsd-arm64/0.16.7:
-    resolution: {integrity: sha512-9kkycpBFes/vhi7B7o0cf+q2WdJi+EpVzpVTqtWFNiutARWDFFLcB93J8PR1cG228sucsl3B+7Ts27izE6qiaQ==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/freebsd-arm64/0.17.0:
     resolution: {integrity: sha512-FO7+UEZv79gen2df8StFYFHZPI9ADozpFepLZCxY+O8sYLDa1rirvenmLwJiOHmeQRJ5orYedFeLk1PFlZ6t8Q==}
     engines: {node: '>=12'}
@@ -1922,15 +1868,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/freebsd-x64/0.16.7:
-    resolution: {integrity: sha512-5Ahf6jzWXJ4J2uh9dpy5DKOO+PeRUE/9DMys6VuYfwgQzd6n5+pVFm58L2Z2gRe611RX6SdydnNaiIKM3svY7g==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/freebsd-x64/0.17.0:
     resolution: {integrity: sha512-qCsNRsVTaC3ekwZcb2sa7l1gwCtJK3EqCWyDgpoQocYf3lRpbAzaCvqZSF2+NOO64cV+JbedXPsFiXU1aaVcIg==}
     engines: {node: '>=12'}
@@ -1949,15 +1886,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-arm/0.16.7:
-    resolution: {integrity: sha512-QqJnyCfu5OF78Olt7JJSZ7OSv/B4Hf+ZJWp4kkq9xwMsgu7yWq3crIic8gGOpDYTqVKKMDAVDgRXy5Wd/nWZyQ==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-arm/0.17.0:
     resolution: {integrity: sha512-Y2G2NU6155gcfNKvrakVmZV5xUAEhXjsN/uKtbKKRnvee0mHUuaT3OdQJDJKjHVGr6B0898pc3slRpI1PqspoQ==}
     engines: {node: '>=12'}
@@ -1976,15 +1904,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-arm64/0.16.7:
-    resolution: {integrity: sha512-2wv0xYDskk2+MzIm/AEprDip39a23Chptc4mL7hsHg26P0gD8RUhzmDu0KCH2vMThUI1sChXXoK9uH0KYQKaDg==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-arm64/0.17.0:
     resolution: {integrity: sha512-js4Vlch5XJQYISbDVJd2hsI/MsfVUz6d/FrclCE73WkQmniH37vFpuQI42ntWAeBghDIfaPZ6f9GilhwGzVFUg==}
     engines: {node: '>=12'}
@@ -2003,15 +1922,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-ia32/0.16.7:
-    resolution: {integrity: sha512-APVYbEilKbD5ptmKdnIcXej2/+GdV65TfTjxR2Uk8t1EsOk49t6HapZW6DS/Bwlvh5hDwtLapdSumIVNGxgqLg==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-ia32/0.17.0:
     resolution: {integrity: sha512-7tl/jSPkF59R3zeFDB2/09zLGhcM7DM+tCoOqjJbQjuL6qbMWomGT2RglCqRFpCSdzBx0hukmPPgUAMlmdj0sQ==}
     engines: {node: '>=12'}
@@ -2039,15 +1949,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-loong64/0.16.7:
-    resolution: {integrity: sha512-5wPUAGclplQrAW7EFr3F84Y/d++7G0KykohaF4p54+iNWhUnMVU8Bh2sxiEOXUy4zKIdpHByMgJ5/Ko6QhtTUw==}
-    engines: {node: '>=12'}
-    cpu: [loong64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-loong64/0.17.0:
     resolution: {integrity: sha512-OG356F7dIVVF+EXJx5UfzFr1I5l6ES53GlMNSr3U1MhlaVyrP9um5PnrSJ+7TSDAzUC7YGjxb2GQWqHLd5XFoA==}
     engines: {node: '>=12'}
@@ -2066,15 +1967,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-mips64el/0.16.7:
-    resolution: {integrity: sha512-hxzlXtWF6yWfkE/SMTscNiVqLOAn7fOuIF3q/kiZaXxftz1DhZW/HpnTmTTWrzrS7zJWQxHHT4QSxyAj33COmA==}
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-mips64el/0.17.0:
     resolution: {integrity: sha512-LWQJgGpxrjh2x08UYf6G5R+Km7zhkpCvKXtFQ6SX0fimDvy1C8kslgFHGxLS0wjGV8C4BNnENW/HNy57+RB7iA==}
     engines: {node: '>=12'}
@@ -2093,15 +1985,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-ppc64/0.16.7:
-    resolution: {integrity: sha512-WM83Dac0LdXty5xPhlOuCD5Egfk1xLND/oRLYeB7Jb/tY4kzFSDgLlq91wYbHua/s03tQGA9iXvyjgymMw62Vw==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-ppc64/0.17.0:
     resolution: {integrity: sha512-f40N8fKiTQslUcUuhof2/syOQ+DC9Mqdnm9d063pew+Ptv9r6dBNLQCz4300MOfCLAbb0SdnrcMSzHbMehXWLw==}
     engines: {node: '>=12'}
@@ -2120,15 +2003,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-riscv64/0.16.7:
-    resolution: {integrity: sha512-3nkNnNg4Ax6MS/l8O8Ynq2lGEVJYyJ2EoY3PHjNJ4PuZ80EYLMrFTFZ4L/Hc16AxgtXKwmNP9TM0YKNiBzBiJQ==}
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-riscv64/0.17.0:
     resolution: {integrity: sha512-sc/pvLexRvxgEbmeq7LfLGnzUBFi/E2MGbnQj3CG8tnQ90tWPTi+9CbZEgIADhj6CAlCCmqxpUclIV1CRVUOTw==}
     engines: {node: '>=12'}
@@ -2147,15 +2021,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-s390x/0.16.7:
-    resolution: {integrity: sha512-3SA/2VJuv0o1uD7zuqxEP+RrAyRxnkGddq0bwHQ98v1KNlzXD/JvxwTO3T6GM5RH6JUd29RTVQTOJfyzMkkppA==}
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-s390x/0.17.0:
     resolution: {integrity: sha512-7xq9/kY0vunCL2vjHKdHGI+660pCdeEC6K6TWBVvbTGXvT8s/qacfxMgr8PCeQRbNUZLOA13G6/G1+c0lYXO1A==}
     engines: {node: '>=12'}
@@ -2174,15 +2039,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-x64/0.16.7:
-    resolution: {integrity: sha512-xi/tbqCqvPIzU+zJVyrpz12xqciTAPMi2fXEWGnapZymoGhuL2GIWIRXg4O2v5BXaYA5TSaiKYE14L0QhUTuQg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-x64/0.17.0:
     resolution: {integrity: sha512-o7FhBLONk1mLT2ytlj/j/WuJcPdhWcVpysSJn1s9+zRdLwLKveipbPi5SIasJIqMq0T4CkQW76pxJYMqz9HrQA==}
     engines: {node: '>=12'}
@@ -2201,15 +2057,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/netbsd-x64/0.16.7:
-    resolution: {integrity: sha512-NUsYbq3B+JdNKn8SXkItFvdes9qTwEoS3aLALtiWciW/ystiCKM20Fgv9XQBOXfhUHyh5CLEeZDXzLOrwBXuCQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/netbsd-x64/0.17.0:
     resolution: {integrity: sha512-V6xXsv71b8vwFCW/ky82Rs//SbyA+ORty6A7Mzkg33/4NbYZ/1Vcbk7qAN5oi0i/gS4Q0+7dYT7NqaiVZ7+Xjw==}
     engines: {node: '>=12'}
@@ -2228,15 +2075,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/openbsd-x64/0.16.7:
-    resolution: {integrity: sha512-qjwzsgeve9I8Tbsko2FEkdSk2iiezuNGFgipQxY/736NePXDaDZRodIejYGWOlbYXugdxb0nif5yvypH6lKBmA==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/openbsd-x64/0.17.0:
     resolution: {integrity: sha512-StlQor6A0Y9SSDxraytr46Qbz25zsSDmsG3MCaNkBnABKHP3QsngOCfdBikqHVVrXeK0KOTmtX92/ncTGULYgQ==}
     engines: {node: '>=12'}
@@ -2255,15 +2093,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/sunos-x64/0.16.7:
-    resolution: {integrity: sha512-mFWDz4RoBTzPphTCkM7Kc7Qpa0o/Z01acajR+Ai7LdfKgcP/C6jYOaKwv7nKzD0+MjOT20j7You9g4ozYy1dKQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/sunos-x64/0.17.0:
     resolution: {integrity: sha512-K64Wqw57j8KrwjR3QjsuzN/qDGK6Cno6QYtIlWAmGab5iYPBZCWz7HFtF2a86/130LmUsdXqOID7J0SmjjRFIQ==}
     engines: {node: '>=12'}
@@ -2282,15 +2111,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/win32-arm64/0.16.7:
-    resolution: {integrity: sha512-m39UmX19RvEIuC8sYZ0M+eQtdXw4IePDSZ78ZQmYyFaXY9krq4YzQCK2XWIJomNLtg4q+W5aXr8bW3AbqWNoVg==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/win32-arm64/0.17.0:
     resolution: {integrity: sha512-hly6iSWAf0hf3aHD18/qW7iFQbg9KAQ0RFGG9plcxkhL4uGw43O+lETGcSO/PylNleFowP/UztpF6U4oCYgpPw==}
     engines: {node: '>=12'}
@@ -2309,15 +2129,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/win32-ia32/0.16.7:
-    resolution: {integrity: sha512-1cbzSEZA1fANwmT6rjJ4G1qQXHxCxGIcNYFYR9ctI82/prT38lnwSRZ0i5p/MVXksw9eMlHlet6pGu2/qkXFCg==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/win32-ia32/0.17.0:
     resolution: {integrity: sha512-aL4EWPh0nyC5uYRfn+CHkTgawd4DjtmwquthNDmGf6Ht6+mUc+bQXyZNH1QIw8x20hSqFc4Tf36aLLWP/TPR3g==}
     engines: {node: '>=12'}
@@ -2336,15 +2147,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/win32-x64/0.16.7:
-    resolution: {integrity: sha512-QaQ8IH0JLacfGf5cf0HCCPnQuCTd/dAI257vXBgb/cccKGbH/6pVtI1gwhdAQ0Y48QSpTIFrh9etVyNdZY+zzw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/win32-x64/0.17.0:
     resolution: {integrity: sha512-W6IIQ9Rt43I/GqfXeBFLk0TvowKBoirs9sw2LPfhHax6ayMlW5PhFzSJ76I1ac9Pk/aRcSMrHWvVyZs8ZPK2wA==}
     engines: {node: '>=12'}
@@ -2726,6 +2528,10 @@ packages:
     resolution: {integrity: sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==}
     dev: true
 
+  /@sideway/formula/3.0.1:
+    resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==}
+    dev: true
+
   /@sideway/pinpoint/2.0.0:
     resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==}
     dev: true
@@ -3373,7 +3179,7 @@ packages:
       - supports-color
     dev: true
 
-  /@typescript-eslint/eslint-plugin/5.48.2_iljmjqxcygjq3saipl7gerxpvi:
+  /@typescript-eslint/eslint-plugin/5.48.2_azmbqzqvrlvblbdtiwxwvyvjjy:
     resolution: {integrity: sha512-sR0Gja9Ky1teIq4qJOl0nC+Tk64/uYdX+mi+5iB//MH8gwyx8e3SOyhEzeLZEFEEfCaLf8KJq+Bd/6je1t+CAg==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -3384,18 +3190,18 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/parser': 5.48.2_yygwinqv3a2io74xmwofqb7uka
+      '@typescript-eslint/parser': 5.48.2_et5x32uxl7z5ldub3ye5rhlyqm
       '@typescript-eslint/scope-manager': 5.48.2
-      '@typescript-eslint/type-utils': 5.48.2_yygwinqv3a2io74xmwofqb7uka
-      '@typescript-eslint/utils': 5.48.2_yygwinqv3a2io74xmwofqb7uka
+      '@typescript-eslint/type-utils': 5.48.2_et5x32uxl7z5ldub3ye5rhlyqm
+      '@typescript-eslint/utils': 5.48.2_et5x32uxl7z5ldub3ye5rhlyqm
       debug: 4.3.4
       eslint: 8.32.0
       ignore: 5.2.0
       natural-compare-lite: 1.4.0
       regexpp: 3.2.0
       semver: 7.3.8
-      tsutils: 3.21.0_typescript@4.8.4
-      typescript: 4.8.4
+      tsutils: 3.21.0_typescript@4.9.5
+      typescript: 4.9.5
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -3420,7 +3226,7 @@ packages:
       - supports-color
     dev: true
 
-  /@typescript-eslint/parser/5.48.2_yygwinqv3a2io74xmwofqb7uka:
+  /@typescript-eslint/parser/5.48.2_et5x32uxl7z5ldub3ye5rhlyqm:
     resolution: {integrity: sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -3432,10 +3238,10 @@ packages:
     dependencies:
       '@typescript-eslint/scope-manager': 5.48.2
       '@typescript-eslint/types': 5.48.2
-      '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.8.4
+      '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.9.5
       debug: 4.3.4
       eslint: 8.32.0
-      typescript: 4.8.4
+      typescript: 4.9.5
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -3476,7 +3282,7 @@ packages:
       - supports-color
     dev: true
 
-  /@typescript-eslint/type-utils/5.48.2_yygwinqv3a2io74xmwofqb7uka:
+  /@typescript-eslint/type-utils/5.48.2_et5x32uxl7z5ldub3ye5rhlyqm:
     resolution: {integrity: sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -3486,12 +3292,12 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.8.4
-      '@typescript-eslint/utils': 5.48.2_yygwinqv3a2io74xmwofqb7uka
+      '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.9.5
+      '@typescript-eslint/utils': 5.48.2_et5x32uxl7z5ldub3ye5rhlyqm
       debug: 4.3.4
       eslint: 8.32.0
-      tsutils: 3.21.0_typescript@4.8.4
-      typescript: 4.8.4
+      tsutils: 3.21.0_typescript@4.9.5
+      typescript: 4.9.5
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -3527,7 +3333,28 @@ packages:
       - supports-color
     dev: true
 
-  /@typescript-eslint/typescript-estree/5.48.2_typescript@4.8.4:
+  /@typescript-eslint/typescript-estree/5.42.1_typescript@4.9.5:
+    resolution: {integrity: sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/types': 5.42.1
+      '@typescript-eslint/visitor-keys': 5.42.1
+      debug: 4.3.4
+      globby: 11.1.0
+      is-glob: 4.0.3
+      semver: 7.3.8
+      tsutils: 3.21.0_typescript@4.9.5
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/typescript-estree/5.48.2_typescript@4.9.5:
     resolution: {integrity: sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -3542,12 +3369,32 @@ packages:
       globby: 11.1.0
       is-glob: 4.0.3
       semver: 7.3.8
-      tsutils: 3.21.0_typescript@4.8.4
-      typescript: 4.8.4
+      tsutils: 3.21.0_typescript@4.9.5
+      typescript: 4.9.5
     transitivePeerDependencies:
       - supports-color
     dev: true
 
+  /@typescript-eslint/utils/5.42.1_et5x32uxl7z5ldub3ye5rhlyqm:
+    resolution: {integrity: sha512-Gxvf12xSp3iYZd/fLqiQRD4uKZjDNR01bQ+j8zvhPjpsZ4HmvEFL/tC4amGNyxN9Rq+iqvpHLhlqx6KTxz9ZyQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+    dependencies:
+      '@types/json-schema': 7.0.11
+      '@types/semver': 7.3.12
+      '@typescript-eslint/scope-manager': 5.42.1
+      '@typescript-eslint/types': 5.42.1
+      '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.9.5
+      eslint: 8.32.0
+      eslint-scope: 5.1.1
+      eslint-utils: 3.0.0_eslint@8.32.0
+      semver: 7.3.8
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+    dev: true
+
   /@typescript-eslint/utils/5.42.1_yygwinqv3a2io74xmwofqb7uka:
     resolution: {integrity: sha512-Gxvf12xSp3iYZd/fLqiQRD4uKZjDNR01bQ+j8zvhPjpsZ4HmvEFL/tC4amGNyxN9Rq+iqvpHLhlqx6KTxz9ZyQ==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -3568,7 +3415,7 @@ packages:
       - typescript
     dev: true
 
-  /@typescript-eslint/utils/5.48.2_yygwinqv3a2io74xmwofqb7uka:
+  /@typescript-eslint/utils/5.48.2_et5x32uxl7z5ldub3ye5rhlyqm:
     resolution: {integrity: sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     peerDependencies:
@@ -3578,7 +3425,7 @@ packages:
       '@types/semver': 7.3.12
       '@typescript-eslint/scope-manager': 5.48.2
       '@typescript-eslint/types': 5.48.2
-      '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.8.4
+      '@typescript-eslint/typescript-estree': 5.48.2_typescript@4.9.5
       eslint: 8.32.0
       eslint-scope: 5.1.1
       eslint-utils: 3.0.0_eslint@8.32.0
@@ -3644,6 +3491,14 @@ packages:
       chai: 4.3.7
     dev: true
 
+  /@vitest/expect/0.28.5:
+    resolution: {integrity: sha512-gqTZwoUTwepwGIatnw4UKpQfnoyV0Z9Czn9+Lo2/jLIt4/AXLTn+oVZxlQ7Ng8bzcNkR+3DqLJ08kNr8jRmdNQ==}
+    dependencies:
+      '@vitest/spy': 0.28.5
+      '@vitest/utils': 0.28.5
+      chai: 4.3.7
+    dev: true
+
   /@vitest/runner/0.28.4:
     resolution: {integrity: sha512-Q8UV6GjDvBSTfUoq0QXVCNpNOUrWu4P2qvRq7ssJWzn0+S0ojbVOxEjMt+8a32X6SdkhF8ak+2nkppsqV0JyNQ==}
     dependencies:
@@ -3652,12 +3507,26 @@ packages:
       pathe: 1.1.0
     dev: true
 
+  /@vitest/runner/0.28.5:
+    resolution: {integrity: sha512-NKkHtLB+FGjpp5KmneQjTcPLWPTDfB7ie+MmF1PnUBf/tGe2OjGxWyB62ySYZ25EYp9krR5Bw0YPLS/VWh1QiA==}
+    dependencies:
+      '@vitest/utils': 0.28.5
+      p-limit: 4.0.0
+      pathe: 1.1.0
+    dev: true
+
   /@vitest/spy/0.28.4:
     resolution: {integrity: sha512-8WuhfXLlvCXpNXEGJW6Gc+IKWI32435fQJLh43u70HnZ1otJOa2Cmg2Wy2Aym47ZnNCP4NolF+8cUPwd0MigKQ==}
     dependencies:
       tinyspy: 1.0.2
     dev: true
 
+  /@vitest/spy/0.28.5:
+    resolution: {integrity: sha512-7if6rsHQr9zbmvxN7h+gGh2L9eIIErgf8nSKYDlg07HHimCxp4H6I/X/DPXktVPPLQfiZ1Cw2cbDIx9fSqDjGw==}
+    dependencies:
+      tinyspy: 1.0.2
+    dev: true
+
   /@vitest/ui/0.28.4:
     resolution: {integrity: sha512-LQfCCFc17n49mwtraV9/NAWl2DUqJS/9ZEa3fqJjoYO+HowdseQ5jvWflpzliCyfrIAh6cXVo1bNzHnDXe0cbw==}
     dependencies:
@@ -3678,6 +3547,16 @@ packages:
       pretty-format: 27.5.1
     dev: true
 
+  /@vitest/utils/0.28.5:
+    resolution: {integrity: sha512-UyZdYwdULlOa4LTUSwZ+Paz7nBHGTT72jKwdFSV4IjHF1xsokp+CabMdhjvVhYwkLfO88ylJT46YMilnkSARZA==}
+    dependencies:
+      cli-truncate: 3.1.0
+      diff: 5.1.0
+      loupe: 2.3.6
+      picocolors: 1.0.0
+      pretty-format: 27.5.1
+    dev: true
+
   /@vue/compiler-core/3.2.45:
     resolution: {integrity: sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==}
     dependencies:
@@ -4257,6 +4136,10 @@ packages:
     resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
     dev: true
 
+  /arg/5.0.2:
+    resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+    dev: true
+
   /argparse/1.0.10:
     resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
     dependencies:
@@ -4354,6 +4237,15 @@ packages:
       - debug
     dev: true
 
+  /axios/0.27.2_debug@4.3.4:
+    resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==}
+    dependencies:
+      follow-redirects: 1.15.2_debug@4.3.2
+      form-data: 4.0.0
+    transitivePeerDependencies:
+      - debug
+    dev: true
+
   /babel-jest/29.3.1_@babel+core@7.12.3:
     resolution: {integrity: sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -5103,7 +4995,7 @@ packages:
       layout-base: 2.0.1
     dev: false
 
-  /cosmiconfig-typescript-loader/4.1.0_nxlrwu45zhpwmwjzs33dzt3ak4:
+  /cosmiconfig-typescript-loader/4.1.0_2uclxasecupgvdn72amnhmyg7y:
     resolution: {integrity: sha512-HbWIuR5O+XO5Oj9SZ5bzgrD4nN+rfhrm2PMb0FVx+t+XIvC45n8F0oTNnztXtspWGw0i2IzHaUWFD5LzV1JB4A==}
     engines: {node: '>=12', npm: '>=6'}
     peerDependencies:
@@ -5114,8 +5006,8 @@ packages:
     dependencies:
       '@types/node': 14.18.29
       cosmiconfig: 7.0.1
-      ts-node: 10.9.1_sqjhzn5m3vxyw66a2xhtc43hby
-      typescript: 4.8.4
+      ts-node: 10.9.1_yxpazyh7n5pql7jdaglasgwqki
+      typescript: 4.9.5
     dev: true
 
   /cosmiconfig/7.0.1:
@@ -5733,42 +5625,6 @@ packages:
       d3-transition: 3.0.1_d3-selection@3.0.0
     dev: false
 
-  /d3/7.6.1:
-    resolution: {integrity: sha512-txMTdIHFbcpLx+8a0IFhZsbp+PfBBPt8yfbmukZTQFroKuFqIwqswF0qE5JXWefylaAVpSXFoKm3yP+jpNLFLw==}
-    engines: {node: '>=12'}
-    dependencies:
-      d3-array: 3.2.0
-      d3-axis: 3.0.0
-      d3-brush: 3.0.0
-      d3-chord: 3.0.1
-      d3-color: 3.1.0
-      d3-contour: 4.0.0
-      d3-delaunay: 6.0.2
-      d3-dispatch: 3.0.1
-      d3-drag: 3.0.0
-      d3-dsv: 3.0.1
-      d3-ease: 3.0.1
-      d3-fetch: 3.0.1
-      d3-force: 3.0.0
-      d3-format: 3.1.0
-      d3-geo: 3.0.1
-      d3-hierarchy: 3.1.2
-      d3-interpolate: 3.0.1
-      d3-path: 3.0.1
-      d3-polygon: 3.0.1
-      d3-quadtree: 3.0.1
-      d3-random: 3.0.1
-      d3-scale: 4.0.2
-      d3-scale-chromatic: 3.0.0
-      d3-selection: 3.0.0
-      d3-shape: 3.1.0
-      d3-time: 3.0.0
-      d3-time-format: 4.1.0
-      d3-timer: 3.0.1
-      d3-transition: 3.0.1_d3-selection@3.0.0
-      d3-zoom: 3.0.0
-    dev: false
-
   /d3/7.8.2:
     resolution: {integrity: sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==}
     engines: {node: '>=12'}
@@ -6454,36 +6310,6 @@ packages:
       '@esbuild/win32-x64': 0.16.17
     dev: true
 
-  /esbuild/0.16.7:
-    resolution: {integrity: sha512-P6OBFYFSQOGzfApqCeYKqfKRRbCIRsdppTXFo4aAvtiW3o8TTyiIplBvHJI171saPAiy3WlawJHCveJVIOIx1A==}
-    engines: {node: '>=12'}
-    hasBin: true
-    requiresBuild: true
-    optionalDependencies:
-      '@esbuild/android-arm': 0.16.7
-      '@esbuild/android-arm64': 0.16.7
-      '@esbuild/android-x64': 0.16.7
-      '@esbuild/darwin-arm64': 0.16.7
-      '@esbuild/darwin-x64': 0.16.7
-      '@esbuild/freebsd-arm64': 0.16.7
-      '@esbuild/freebsd-x64': 0.16.7
-      '@esbuild/linux-arm': 0.16.7
-      '@esbuild/linux-arm64': 0.16.7
-      '@esbuild/linux-ia32': 0.16.7
-      '@esbuild/linux-loong64': 0.16.7
-      '@esbuild/linux-mips64el': 0.16.7
-      '@esbuild/linux-ppc64': 0.16.7
-      '@esbuild/linux-riscv64': 0.16.7
-      '@esbuild/linux-s390x': 0.16.7
-      '@esbuild/linux-x64': 0.16.7
-      '@esbuild/netbsd-x64': 0.16.7
-      '@esbuild/openbsd-x64': 0.16.7
-      '@esbuild/sunos-x64': 0.16.7
-      '@esbuild/win32-arm64': 0.16.7
-      '@esbuild/win32-ia32': 0.16.7
-      '@esbuild/win32-x64': 0.16.7
-    dev: true
-
   /esbuild/0.17.0:
     resolution: {integrity: sha512-4yGk3rD95iS/wGzrx0Ji5czZcx1j2wvfF1iAJaX2FIYLB6sU6wYkDeplpZHzfwQw2yXGXsAoxmO6LnMQkl04Kg==}
     engines: {node: '>=12'}
@@ -6605,7 +6431,7 @@ packages:
       htmlparser2: 8.0.1
     dev: true
 
-  /eslint-plugin-jest/27.1.5_5rcd23qw3h5vuffwo2owxb3hw4:
+  /eslint-plugin-jest/27.1.5_i5clxtuiaceouxhg5syqkw5wwi:
     resolution: {integrity: sha512-CK2dekZ5VBdzsOSOH5Fc1rwC+cWXjkcyrmf1RV714nDUDKu+o73TTJiDxpbILG8PtPPpAAl3ywzh5QA7Ft0mjA==}
     engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
     peerDependencies:
@@ -6618,8 +6444,8 @@ packages:
       jest:
         optional: true
     dependencies:
-      '@typescript-eslint/eslint-plugin': 5.48.2_iljmjqxcygjq3saipl7gerxpvi
-      '@typescript-eslint/utils': 5.42.1_yygwinqv3a2io74xmwofqb7uka
+      '@typescript-eslint/eslint-plugin': 5.48.2_azmbqzqvrlvblbdtiwxwvyvjjy
+      '@typescript-eslint/utils': 5.42.1_et5x32uxl7z5ldub3ye5rhlyqm
       eslint: 8.32.0
       jest: 29.3.1_odkjkoia5xunhxkdrka32ib6vi
     transitivePeerDependencies:
@@ -8247,7 +8073,7 @@ packages:
       pretty-format: 29.3.1
       slash: 3.0.0
       strip-json-comments: 3.1.1
-      ts-node: 10.9.1_cbe7ovvae6zqfnmtgctpgpys54
+      ts-node: 10.9.1_w6ufic3jqylcjznzspnj4wjqfe
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -8624,6 +8450,16 @@ packages:
       '@sideway/pinpoint': 2.0.0
     dev: true
 
+  /joi/17.7.1:
+    resolution: {integrity: sha512-teoLhIvWE298R6AeJywcjR4sX2hHjB3/xJX4qPjg+gTg+c0mzUDsziYlqPmLomq9gVsfaMcgPaGc7VxtD/9StA==}
+    dependencies:
+      '@hapi/hoek': 9.3.0
+      '@hapi/topo': 5.1.0
+      '@sideway/address': 4.1.4
+      '@sideway/formula': 3.0.1
+      '@sideway/pinpoint': 2.0.0
+    dev: true
+
   /jpeg-js/0.4.4:
     resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==}
     dev: true
@@ -9673,6 +9509,10 @@ packages:
     resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
     dev: true
 
+  /minimist/1.2.8:
+    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+    dev: true
+
   /mkdirp/0.5.6:
     resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
     hasBin: true
@@ -10840,14 +10680,6 @@ packages:
       fsevents: 2.3.2
     dev: true
 
-  /rollup/3.7.4:
-    resolution: {integrity: sha512-jN9rx3k5pfg9H9al0r0y1EYKSeiRANZRYX32SuNXAnKzh6cVyf4LZVto1KAuDnbHT03E1CpsgqDKaqQ8FZtgxw==}
-    engines: {node: '>=14.18.0', npm: '>=8.0.0'}
-    hasBin: true
-    optionalDependencies:
-      fsevents: 2.3.2
-    dev: true
-
   /run-parallel/1.2.0:
     resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
     dependencies:
@@ -10864,6 +10696,12 @@ packages:
       tslib: 2.4.0
     dev: true
 
+  /rxjs/7.8.0:
+    resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==}
+    dependencies:
+      tslib: 2.4.0
+    dev: true
+
   /sade/1.8.1:
     resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
     engines: {node: '>=6'}
@@ -11332,6 +11170,23 @@ packages:
       - supports-color
     dev: true
 
+  /start-server-and-test/1.15.4:
+    resolution: {integrity: sha512-ucQtp5+UCr0m4aHlY+aEV2JSYNTiMZKdSKK/bsIr6AlmwAWDYDnV7uGlWWEtWa7T4XvRI5cPYcPcQgeLqpz+Tg==}
+    engines: {node: '>=6'}
+    hasBin: true
+    dependencies:
+      arg: 5.0.2
+      bluebird: 3.7.2
+      check-more-types: 2.24.0
+      debug: 4.3.4
+      execa: 5.1.1
+      lazy-ass: 1.6.0
+      ps-tree: 1.2.0
+      wait-on: 7.0.1_debug@4.3.4
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
   /statuses/1.5.0:
     resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
     engines: {node: '>= 0.6'}
@@ -11692,7 +11547,7 @@ packages:
     engines: {node: '>=6.10'}
     dev: false
 
-  /ts-node/10.9.1_cbe7ovvae6zqfnmtgctpgpys54:
+  /ts-node/10.9.1_w6ufic3jqylcjznzspnj4wjqfe:
     resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
     hasBin: true
     peerDependencies:
@@ -11718,12 +11573,12 @@ packages:
       create-require: 1.1.1
       diff: 4.0.2
       make-error: 1.3.6
-      typescript: 4.8.4
+      typescript: 4.9.5
       v8-compile-cache-lib: 3.0.1
       yn: 3.1.1
     dev: true
 
-  /ts-node/10.9.1_sqjhzn5m3vxyw66a2xhtc43hby:
+  /ts-node/10.9.1_yxpazyh7n5pql7jdaglasgwqki:
     resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
     hasBin: true
     peerDependencies:
@@ -11749,7 +11604,7 @@ packages:
       create-require: 1.1.1
       diff: 4.0.2
       make-error: 1.3.6
-      typescript: 4.8.4
+      typescript: 4.9.5
       v8-compile-cache-lib: 3.0.1
       yn: 3.1.1
     dev: true
@@ -11772,6 +11627,16 @@ packages:
       typescript: 4.8.4
     dev: true
 
+  /tsutils/3.21.0_typescript@4.9.5:
+    resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+    engines: {node: '>= 6'}
+    peerDependencies:
+      typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+    dependencies:
+      tslib: 1.14.1
+      typescript: 4.9.5
+    dev: true
+
   /tunnel-agent/0.6.0:
     resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
     dependencies:
@@ -11874,6 +11739,12 @@ packages:
     hasBin: true
     dev: true
 
+  /typescript/4.9.5:
+    resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
+    engines: {node: '>=4.2.0'}
+    hasBin: true
+    dev: true
+
   /uc.micro/1.0.6:
     resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==}
     dev: true
@@ -12095,7 +11966,7 @@ packages:
       picocolors: 1.0.0
       source-map: 0.6.1
       source-map-support: 0.5.21
-      vite: 4.0.1_@types+node@18.11.9
+      vite: 4.1.1_@types+node@18.11.9
     transitivePeerDependencies:
       - '@types/node'
       - less
@@ -12106,72 +11977,27 @@ packages:
       - terser
     dev: true
 
-  /vite/3.2.3_@types+node@18.11.9:
-    resolution: {integrity: sha512-h8jl1TZ76eGs3o2dIBSsvXDLb1m/Ec1iej8ZMdz+PsaFUsftZeWe2CZOI3qogEsMNaywc17gu0q6cQDzh/weCQ==}
-    engines: {node: ^14.18.0 || >=16.0.0}
+  /vite-node/0.28.5_@types+node@18.11.9:
+    resolution: {integrity: sha512-LmXb9saMGlrMZbXTvOveJKwMTBTNUH66c8rJnQ0ZPNX+myPEol64+szRzXtV5ORb0Hb/91yq+/D3oERoyAt6LA==}
+    engines: {node: '>=v14.16.0'}
     hasBin: true
-    peerDependencies:
-      '@types/node': '>= 14'
-      less: '*'
-      sass: '*'
-      stylus: '*'
-      sugarss: '*'
-      terser: ^5.4.0
-    peerDependenciesMeta:
-      '@types/node':
-        optional: true
-      less:
-        optional: true
-      sass:
-        optional: true
-      stylus:
-        optional: true
-      sugarss:
-        optional: true
-      terser:
-        optional: true
     dependencies:
-      '@types/node': 18.11.9
-      esbuild: 0.15.13
-      postcss: 8.4.18
-      resolve: 1.22.1
-      rollup: 2.79.1
-    optionalDependencies:
-      fsevents: 2.3.2
-    dev: true
-
-  /vite/4.0.1_@types+node@18.11.9:
-    resolution: {integrity: sha512-kZQPzbDau35iWOhy3CpkrRC7It+HIHtulAzBhMqzGHKRf/4+vmh8rPDDdv98SWQrFWo6//3ozwsRmwQIPZsK9g==}
-    engines: {node: ^14.18.0 || >=16.0.0}
-    hasBin: true
-    peerDependencies:
-      '@types/node': '>= 14'
-      less: '*'
-      sass: '*'
-      stylus: '*'
-      sugarss: '*'
-      terser: ^5.4.0
-    peerDependenciesMeta:
-      '@types/node':
-        optional: true
-      less:
-        optional: true
-      sass:
-        optional: true
-      stylus:
-        optional: true
-      sugarss:
-        optional: true
-      terser:
-        optional: true
-    dependencies:
-      '@types/node': 18.11.9
-      esbuild: 0.16.7
-      postcss: 8.4.20
-      resolve: 1.22.1
-      rollup: 3.7.4
-    optionalDependencies:
-      fsevents: 2.3.2
+      cac: 6.7.14
+      debug: 4.3.4
+      mlly: 1.1.0
+      pathe: 1.1.0
+      picocolors: 1.0.0
+      source-map: 0.6.1
+      source-map-support: 0.5.21
+      vite: 4.1.1_@types+node@18.11.9
+    transitivePeerDependencies:
+      - '@types/node'
+      - less
+      - sass
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
     dev: true
 
   /vite/4.1.1:
@@ -12207,6 +12033,40 @@ packages:
       fsevents: 2.3.2
     dev: true
 
+  /vite/4.1.1_@types+node@18.11.9:
+    resolution: {integrity: sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    hasBin: true
+    peerDependencies:
+      '@types/node': '>= 14'
+      less: '*'
+      sass: '*'
+      stylus: '*'
+      sugarss: '*'
+      terser: ^5.4.0
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      less:
+        optional: true
+      sass:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
+    dependencies:
+      '@types/node': 18.11.9
+      esbuild: 0.16.17
+      postcss: 8.4.21
+      resolve: 1.22.1
+      rollup: 3.15.0
+    optionalDependencies:
+      fsevents: 2.3.2
+    dev: true
+
   /vitepress-plugin-search/1.0.4-alpha.19_g67lr3vgasogkevpbew55lljzq:
     resolution: {integrity: sha512-WFOPn5dStyMINd+rVjNxbEmGa7U+qGHLxLnda56EG+ATil1i0yOauGhJEh5LPMvuCUVIA9tInJnFXklOBb39dA==}
     engines: {node: ^14.13.1 || ^16.7.0 || >=18}
@@ -12295,7 +12155,7 @@ packages:
       tinybench: 2.3.1
       tinypool: 0.3.1
       tinyspy: 1.0.2
-      vite: 4.0.1_@types+node@18.11.9
+      vite: 4.1.1_@types+node@18.11.9
       vite-node: 0.28.4_@types+node@18.11.9
       why-is-node-running: 2.2.2
     transitivePeerDependencies:
@@ -12307,6 +12167,63 @@ packages:
       - terser
     dev: true
 
+  /vitest/0.28.5_vun5xzxu3tkrssf3erdbijyyki:
+    resolution: {integrity: sha512-pyCQ+wcAOX7mKMcBNkzDwEHRGqQvHUl0XnoHR+3Pb1hytAHISgSxv9h0gUiSiYtISXUU3rMrKiKzFYDrI6ZIHA==}
+    engines: {node: '>=v14.16.0'}
+    hasBin: true
+    peerDependencies:
+      '@edge-runtime/vm': '*'
+      '@vitest/browser': '*'
+      '@vitest/ui': '*'
+      happy-dom: '*'
+      jsdom: '*'
+    peerDependenciesMeta:
+      '@edge-runtime/vm':
+        optional: true
+      '@vitest/browser':
+        optional: true
+      '@vitest/ui':
+        optional: true
+      happy-dom:
+        optional: true
+      jsdom:
+        optional: true
+    dependencies:
+      '@types/chai': 4.3.4
+      '@types/chai-subset': 1.3.3
+      '@types/node': 18.11.9
+      '@vitest/expect': 0.28.5
+      '@vitest/runner': 0.28.5
+      '@vitest/spy': 0.28.5
+      '@vitest/ui': 0.28.4
+      '@vitest/utils': 0.28.5
+      acorn: 8.8.1
+      acorn-walk: 8.2.0
+      cac: 6.7.14
+      chai: 4.3.7
+      debug: 4.3.4
+      jsdom: 21.1.0
+      local-pkg: 0.4.2
+      pathe: 1.1.0
+      picocolors: 1.0.0
+      source-map: 0.6.1
+      std-env: 3.3.2
+      strip-literal: 1.0.0
+      tinybench: 2.3.1
+      tinypool: 0.3.1
+      tinyspy: 1.0.2
+      vite: 4.1.1_@types+node@18.11.9
+      vite-node: 0.28.5_@types+node@18.11.9
+      why-is-node-running: 2.2.2
+    transitivePeerDependencies:
+      - less
+      - sass
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+    dev: true
+
   /vm2/3.9.11:
     resolution: {integrity: sha512-PFG8iJRSjvvBdisowQ7iVF580DXb1uCIiGaXgm7tynMR1uTBlv7UJlB1zdv5KJ+Tmq1f0Upnj3fayoEOPpCBKg==}
     engines: {node: '>=6.0'}
@@ -12418,6 +12335,20 @@ packages:
       - debug
     dev: true
 
+  /wait-on/7.0.1_debug@4.3.4:
+    resolution: {integrity: sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==}
+    engines: {node: '>=12.0.0'}
+    hasBin: true
+    dependencies:
+      axios: 0.27.2_debug@4.3.4
+      joi: 17.7.1
+      lodash: 4.17.21
+      minimist: 1.2.8
+      rxjs: 7.8.0
+    transitivePeerDependencies:
+      - debug
+    dev: true
+
   /walker/1.0.8:
     resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
     dependencies:
diff --git a/tsconfig.json b/tsconfig.json
index fe107f205..c66d62784 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -76,7 +76,7 @@
     // "isolatedModules": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */
     // "allowSyntheticDefaultImports": true,             /* Allow 'import x from y' when a module doesn't have a default export. */
     "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */,
-    // "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
+    "preserveSymlinks": true /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */,
     "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
 
     /* Type Checking */

From 0f36bbf3e1fed1b7cbec9bffb5c189f654fc5153 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Sat, 18 Feb 2023 23:45:45 +0530
Subject: [PATCH 248/309] Revert #4034

---
 packages/mermaid/package.json                 |   2 +-
 .../mermaid/src/diagrams/gantt/ganttDb.js     |   2 +-
 .../src/diagrams/gantt/ganttDb.spec.ts        |   2 +-
 .../src/diagrams/gantt/ganttRenderer.js       |   2 +-
 pnpm-lock.yaml                                | 243 +-----------------
 5 files changed, 7 insertions(+), 244 deletions(-)

diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json
index 977c16f18..18ea3e428 100644
--- a/packages/mermaid/package.json
+++ b/packages/mermaid/package.json
@@ -62,7 +62,7 @@
     "elkjs": "^0.8.2",
     "khroma": "^2.0.0",
     "lodash-es": "^4.17.21",
-    "moment": "^2.29.4",
+    "moment-mini": "^2.29.4",
     "non-layered-tidy-tree-layout": "^2.0.2",
     "stylis": "^4.1.2",
     "ts-dedent": "^2.2.0",
diff --git a/packages/mermaid/src/diagrams/gantt/ganttDb.js b/packages/mermaid/src/diagrams/gantt/ganttDb.js
index 273a02d58..a1c74dd62 100644
--- a/packages/mermaid/src/diagrams/gantt/ganttDb.js
+++ b/packages/mermaid/src/diagrams/gantt/ganttDb.js
@@ -1,4 +1,4 @@
-import moment from 'moment';
+import moment from 'moment-mini';
 import { sanitizeUrl } from '@braintree/sanitize-url';
 import { log } from '../../logger';
 import * as configApi from '../../config';
diff --git a/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts b/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts
index 2b0e9f435..09df96f12 100644
--- a/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts
+++ b/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts
@@ -1,5 +1,5 @@
 // @ts-nocheck TODO: Fix TS
-import moment from 'moment';
+import moment from 'moment-mini';
 import ganttDb from './ganttDb';
 import { convert } from '../../tests/util';
 
diff --git a/packages/mermaid/src/diagrams/gantt/ganttRenderer.js b/packages/mermaid/src/diagrams/gantt/ganttRenderer.js
index 360322b68..faec35a86 100644
--- a/packages/mermaid/src/diagrams/gantt/ganttRenderer.js
+++ b/packages/mermaid/src/diagrams/gantt/ganttRenderer.js
@@ -1,4 +1,4 @@
-import moment from 'moment';
+import moment from 'moment-mini';
 import { log } from '../../logger';
 import {
   select,
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index dc4250983..68b78bd14 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -199,7 +199,7 @@ importers:
       lodash-es:
         specifier: ^4.17.21
         version: 4.17.21
-      moment:
+      moment-mini:
         specifier: ^2.29.4
         version: 2.29.4
       non-layered-tidy-tree-layout:
@@ -1742,15 +1742,6 @@ packages:
       jsdoc-type-pratt-parser: 3.1.0
     dev: true
 
-  /@esbuild/android-arm/0.15.13:
-    resolution: {integrity: sha512-RY2fVI8O0iFUNvZirXaQ1vMvK0xhCcl0gqRj74Z6yEiO1zAUa7hbsdwZM1kzqbxHK7LFyMizipfXT3JME+12Hw==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/android-arm/0.16.17:
     resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==}
     engines: {node: '>=12'}
@@ -1931,15 +1922,6 @@ packages:
     dev: true
     optional: true
 
-  /@esbuild/linux-loong64/0.15.13:
-    resolution: {integrity: sha512-+BoyIm4I8uJmH/QDIH0fu7MG0AEx9OXEDXnqptXCwKOlOqZiS4iraH1Nr7/ObLMokW3sOCeBNyD68ATcV9b9Ag==}
-    engines: {node: '>=12'}
-    cpu: [loong64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@esbuild/linux-loong64/0.16.17:
     resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==}
     engines: {node: '>=12'}
@@ -6070,216 +6052,6 @@ packages:
     resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==}
     dev: true
 
-  /esbuild-android-64/0.15.13:
-    resolution: {integrity: sha512-yRorukXBlokwTip+Sy4MYskLhJsO0Kn0/Fj43s1krVblfwP+hMD37a4Wmg139GEsMLl+vh8WXp2mq/cTA9J97g==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-android-arm64/0.15.13:
-    resolution: {integrity: sha512-TKzyymLD6PiVeyYa4c5wdPw87BeAiTXNtK6amWUcXZxkV51gOk5u5qzmDaYSwiWeecSNHamFsaFjLoi32QR5/w==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-darwin-64/0.15.13:
-    resolution: {integrity: sha512-WAx7c2DaOS6CrRcoYCgXgkXDliLnFv3pQLV6GeW1YcGEZq2Gnl8s9Pg7ahValZkpOa0iE/ojRVQ87sbUhF1Cbg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-darwin-arm64/0.15.13:
-    resolution: {integrity: sha512-U6jFsPfSSxC3V1CLiQqwvDuj3GGrtQNB3P3nNC3+q99EKf94UGpsG9l4CQ83zBs1NHrk1rtCSYT0+KfK5LsD8A==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-freebsd-64/0.15.13:
-    resolution: {integrity: sha512-whItJgDiOXaDG/idy75qqevIpZjnReZkMGCgQaBWZuKHoElDJC1rh7MpoUgupMcdfOd+PgdEwNQW9DAE6i8wyA==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-freebsd-arm64/0.15.13:
-    resolution: {integrity: sha512-6pCSWt8mLUbPtygv7cufV0sZLeylaMwS5Fznj6Rsx9G2AJJsAjQ9ifA+0rQEIg7DwJmi9it+WjzNTEAzzdoM3Q==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-32/0.15.13:
-    resolution: {integrity: sha512-VbZdWOEdrJiYApm2kkxoTOgsoCO1krBZ3quHdYk3g3ivWaMwNIVPIfEE0f0XQQ0u5pJtBsnk2/7OPiCFIPOe/w==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-64/0.15.13:
-    resolution: {integrity: sha512-rXmnArVNio6yANSqDQlIO4WiP+Cv7+9EuAHNnag7rByAqFVuRusLbGi2697A5dFPNXoO//IiogVwi3AdcfPC6A==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-arm/0.15.13:
-    resolution: {integrity: sha512-Ac6LpfmJO8WhCMQmO253xX2IU2B3wPDbl4IvR0hnqcPrdfCaUa2j/lLMGTjmQ4W5JsJIdHEdW12dG8lFS0MbxQ==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-arm64/0.15.13:
-    resolution: {integrity: sha512-alEMGU4Z+d17U7KQQw2IV8tQycO6T+rOrgW8OS22Ua25x6kHxoG6Ngry6Aq6uranC+pNWNMB6aHFPh7aTQdORQ==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-mips64le/0.15.13:
-    resolution: {integrity: sha512-47PgmyYEu+yN5rD/MbwS6DxP2FSGPo4Uxg5LwIdxTiyGC2XKwHhHyW7YYEDlSuXLQXEdTO7mYe8zQ74czP7W8A==}
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-ppc64le/0.15.13:
-    resolution: {integrity: sha512-z6n28h2+PC1Ayle9DjKoBRcx/4cxHoOa2e689e2aDJSaKug3jXcQw7mM+GLg+9ydYoNzj8QxNL8ihOv/OnezhA==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-riscv64/0.15.13:
-    resolution: {integrity: sha512-+Lu4zuuXuQhgLUGyZloWCqTslcCAjMZH1k3Xc9MSEJEpEFdpsSU0sRDXAnk18FKOfEjhu4YMGaykx9xjtpA6ow==}
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-s390x/0.15.13:
-    resolution: {integrity: sha512-BMeXRljruf7J0TMxD5CIXS65y7puiZkAh+s4XFV9qy16SxOuMhxhVIXYLnbdfLrsYGFzx7U9mcdpFWkkvy/Uag==}
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-netbsd-64/0.15.13:
-    resolution: {integrity: sha512-EHj9QZOTel581JPj7UO3xYbltFTYnHy+SIqJVq6yd3KkCrsHRbapiPb0Lx3EOOtybBEE9EyqbmfW1NlSDsSzvQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-openbsd-64/0.15.13:
-    resolution: {integrity: sha512-nkuDlIjF/sfUhfx8SKq0+U+Fgx5K9JcPq1mUodnxI0x4kBdCv46rOGWbuJ6eof2n3wdoCLccOoJAbg9ba/bT2w==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-sunos-64/0.15.13:
-    resolution: {integrity: sha512-jVeu2GfxZQ++6lRdY43CS0Tm/r4WuQQ0Pdsrxbw+aOrHQPHV0+LNOLnvbN28M7BSUGnJnHkHm2HozGgNGyeIRw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-windows-32/0.15.13:
-    resolution: {integrity: sha512-XoF2iBf0wnqo16SDq+aDGi/+QbaLFpkiRarPVssMh9KYbFNCqPLlGAWwDvxEVz+ywX6Si37J2AKm+AXq1kC0JA==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-windows-64/0.15.13:
-    resolution: {integrity: sha512-Et6htEfGycjDrtqb2ng6nT+baesZPYQIW+HUEHK4D1ncggNrDNk3yoboYQ5KtiVrw/JaDMNttz8rrPubV/fvPQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-windows-arm64/0.15.13:
-    resolution: {integrity: sha512-3bv7tqntThQC9SWLRouMDmZnlOukBhOCTlkzNqzGCmrkCJI7io5LLjwJBOVY6kOUlIvdxbooNZwjtBvj+7uuVg==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild/0.15.13:
-    resolution: {integrity: sha512-Cu3SC84oyzzhrK/YyN4iEVy2jZu5t2fz66HEOShHURcjSkOSAVL8C/gfUT+lDJxkVHpg8GZ10DD0rMHRPqMFaQ==}
-    engines: {node: '>=12'}
-    hasBin: true
-    requiresBuild: true
-    optionalDependencies:
-      '@esbuild/android-arm': 0.15.13
-      '@esbuild/linux-loong64': 0.15.13
-      esbuild-android-64: 0.15.13
-      esbuild-android-arm64: 0.15.13
-      esbuild-darwin-64: 0.15.13
-      esbuild-darwin-arm64: 0.15.13
-      esbuild-freebsd-64: 0.15.13
-      esbuild-freebsd-arm64: 0.15.13
-      esbuild-linux-32: 0.15.13
-      esbuild-linux-64: 0.15.13
-      esbuild-linux-arm: 0.15.13
-      esbuild-linux-arm64: 0.15.13
-      esbuild-linux-mips64le: 0.15.13
-      esbuild-linux-ppc64le: 0.15.13
-      esbuild-linux-riscv64: 0.15.13
-      esbuild-linux-s390x: 0.15.13
-      esbuild-netbsd-64: 0.15.13
-      esbuild-openbsd-64: 0.15.13
-      esbuild-sunos-64: 0.15.13
-      esbuild-windows-32: 0.15.13
-      esbuild-windows-64: 0.15.13
-      esbuild-windows-arm64: 0.15.13
-    dev: true
-
   /esbuild/0.16.17:
     resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==}
     engines: {node: '>=12'}
@@ -9529,8 +9301,8 @@ packages:
       ufo: 1.0.1
     dev: true
 
-  /moment/2.29.4:
-    resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==}
+  /moment-mini/2.29.4:
+    resolution: {integrity: sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==}
     dev: false
 
   /mri/1.2.0:
@@ -10116,15 +9888,6 @@ packages:
     resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
     dev: true
 
-  /postcss/8.4.18:
-    resolution: {integrity: sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==}
-    engines: {node: ^10 || ^12 || >=14}
-    dependencies:
-      nanoid: 3.3.4
-      picocolors: 1.0.0
-      source-map-js: 1.0.2
-    dev: true
-
   /postcss/8.4.20:
     resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==}
     engines: {node: ^10 || ^12 || >=14}

From bd98f1477f5c5fe1333c5e2dac2e2143a624b418 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Sat, 18 Feb 2023 23:46:11 +0530
Subject: [PATCH 249/309] Revert #4034

---
 packages/mermaid/src/logger.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/mermaid/src/logger.ts b/packages/mermaid/src/logger.ts
index 8bd46d6db..b1c035e22 100644
--- a/packages/mermaid/src/logger.ts
+++ b/packages/mermaid/src/logger.ts
@@ -2,7 +2,7 @@
 /* eslint-disable @typescript-eslint/no-unused-vars */
 /* eslint-disable @typescript-eslint/no-empty-function */
 /* eslint-disable no-console */
-import moment from 'moment';
+import moment from 'moment-mini';
 
 export type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal';
 

From ea8128e881e2e1beaba5af094c59be5e79a639d0 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Sat, 18 Feb 2023 23:48:09 +0530
Subject: [PATCH 250/309] RC version

---
 packages/mermaid/package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json
index 18ea3e428..08b6a57ac 100644
--- a/packages/mermaid/package.json
+++ b/packages/mermaid/package.json
@@ -1,6 +1,6 @@
 {
   "name": "mermaid",
-  "version": "9.4.0",
+  "version": "9.4.2-rc.1",
   "description": "Markdown-ish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.",
   "main": "./dist/mermaid.min.js",
   "module": "./dist/mermaid.core.mjs",

From 631ff8fb9e286285f9b510e7301b785d53087dcd Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Sun, 19 Feb 2023 00:37:11 +0530
Subject: [PATCH 251/309] chore: Remove cjs from build

---
 .vite/build.ts                | 6 ------
 packages/mermaid/package.json | 5 ++---
 2 files changed, 2 insertions(+), 9 deletions(-)

diff --git a/.vite/build.ts b/.vite/build.ts
index e3c947173..268db3270 100644
--- a/.vite/build.ts
+++ b/.vite/build.ts
@@ -62,12 +62,6 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions)
       sourcemap: true,
       entryFileNames: `${name}.esm${minify ? '.min' : ''}.mjs`,
     },
-    {
-      name,
-      format: 'umd',
-      sourcemap: true,
-      entryFileNames: `${name}${minify ? '.min' : ''}.js`,
-    },
   ];
 
   if (core) {
diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json
index e4480286f..580b297da 100644
--- a/packages/mermaid/package.json
+++ b/packages/mermaid/package.json
@@ -1,13 +1,12 @@
 {
   "name": "mermaid",
-  "version": "9.4.0",
+  "version": "10.0.0-rc.1",
   "description": "Markdown-ish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.",
-  "main": "./dist/mermaid.min.js",
   "module": "./dist/mermaid.core.mjs",
+  "type": "module",
   "types": "./dist/mermaid.d.ts",
   "exports": {
     ".": {
-      "require": "./dist/mermaid.min.js",
       "import": "./dist/mermaid.core.mjs",
       "types": "./dist/mermaid.d.ts"
     },

From 0c18c0309bfdf40eab4e0cbfef9cbaacf8466a61 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Sun, 19 Feb 2023 00:37:41 +0530
Subject: [PATCH 252/309] Enable blank issues

---
 .github/ISSUE_TEMPLATE/config.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index 8710d49aa..44b16532c 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -1,4 +1,4 @@
-blank_issues_enabled: false
+blank_issues_enabled: true
 contact_links:
   - name: GitHub Discussions
     url: https://github.com/mermaid-js/mermaid/discussions

From 45adc5fb6b64b1337b9212caa0b9f2c371df6b34 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Sun, 19 Feb 2023 00:58:36 +0530
Subject: [PATCH 253/309] Remove CJS builds from docs

---
 docs/intro/n00b-gettingStarted.md                      | 2 +-
 docs/syntax/mindmap.md                                 | 8 +-------
 docs/syntax/timeline.md                                | 4 +++-
 packages/mermaid/src/docs/intro/n00b-gettingStarted.md | 2 +-
 packages/mermaid/src/docs/syntax/mindmap.md            | 8 +-------
 packages/mermaid/src/docs/syntax/timeline.md           | 4 +++-
 6 files changed, 10 insertions(+), 18 deletions(-)

diff --git a/docs/intro/n00b-gettingStarted.md b/docs/intro/n00b-gettingStarted.md
index 40d98cb43..87592ba27 100644
--- a/docs/intro/n00b-gettingStarted.md
+++ b/docs/intro/n00b-gettingStarted.md
@@ -135,7 +135,7 @@ b. The importing of mermaid library through the `mermaid.esm.js` or `mermaid.esm
 ```
 
 **Notes**:
-Rendering in Mermaid is initialized by `mermaid.initialize()` call. You can place `mermaid.initialize()` inside `mermaid.min.js` for brevity. However, doing the opposite lets you control when it starts looking for `
`tags inside the web page with `mermaid.initialize()`. This is useful when you think that not all `
` tags may have loaded on the execution of `mermaid.min.js` file. +Rendering in Mermaid is initialized by `mermaid.initialize()` call. You can place `mermaid.initialize()` inside `mermaid.esm.min.mjs` for brevity. However, doing the opposite lets you control when it starts looking for `
`tags inside the web page with `mermaid.initialize()`. This is useful when you think that not all `
` tags may have loaded on the execution of `mermaid.esm.min.mjs` file. `startOnLoad` is one of the parameters that can be defined by `mermaid.initialize()` diff --git a/docs/syntax/mindmap.md b/docs/syntax/mindmap.md index 4fa953daf..362fd85c7 100644 --- a/docs/syntax/mindmap.md +++ b/docs/syntax/mindmap.md @@ -262,7 +262,7 @@ You can still use the pre 9.4.0 method to add mermaid with mindmaps to a web pag ```html @@ -276,12 +276,6 @@ From version 9.4.0 you can simplify this code to: ``` -or if you prefer not using the ESM package: - -```html - -``` - Note that more complex integrations that use the **render** function directly need to use the **renderAsync** method instead in order to render mind maps. You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done. diff --git a/docs/syntax/timeline.md b/docs/syntax/timeline.md index 6e3be305f..1c7e6e002 100644 --- a/docs/syntax/timeline.md +++ b/docs/syntax/timeline.md @@ -466,7 +466,9 @@ Timeline uses experimental lazy loading & async rendering features which could c You can use this method to add mermaid including the timeline diagram to a web page: ```html - + ``` Note that more complex integrations that the **render** function directly need to use the **renderAsync** method instead in order to render timeline. diff --git a/packages/mermaid/src/docs/intro/n00b-gettingStarted.md b/packages/mermaid/src/docs/intro/n00b-gettingStarted.md index c347f2ef3..cfc16e707 100644 --- a/packages/mermaid/src/docs/intro/n00b-gettingStarted.md +++ b/packages/mermaid/src/docs/intro/n00b-gettingStarted.md @@ -118,7 +118,7 @@ b. The importing of mermaid library through the `mermaid.esm.js` or `mermaid.esm ``` **Notes**: -Rendering in Mermaid is initialized by `mermaid.initialize()` call. You can place `mermaid.initialize()` inside `mermaid.min.js` for brevity. However, doing the opposite lets you control when it starts looking for `
`tags inside the web page with `mermaid.initialize()`. This is useful when you think that not all `
` tags may have loaded on the execution of `mermaid.min.js` file. +Rendering in Mermaid is initialized by `mermaid.initialize()` call. You can place `mermaid.initialize()` inside `mermaid.esm.min.mjs` for brevity. However, doing the opposite lets you control when it starts looking for `
`tags inside the web page with `mermaid.initialize()`. This is useful when you think that not all `
` tags may have loaded on the execution of `mermaid.esm.min.mjs` file. `startOnLoad` is one of the parameters that can be defined by `mermaid.initialize()` diff --git a/packages/mermaid/src/docs/syntax/mindmap.md b/packages/mermaid/src/docs/syntax/mindmap.md index cce7d2e3d..968277334 100644 --- a/packages/mermaid/src/docs/syntax/mindmap.md +++ b/packages/mermaid/src/docs/syntax/mindmap.md @@ -170,7 +170,7 @@ You can still use the pre 9.4.0 method to add mermaid with mindmaps to a web pag ```html @@ -184,12 +184,6 @@ From version 9.4.0 you can simplify this code to: ``` -or if you prefer not using the ESM package: - -```html - -``` - Note that more complex integrations that use the **render** function directly need to use the **renderAsync** method instead in order to render mind maps. You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done. diff --git a/packages/mermaid/src/docs/syntax/timeline.md b/packages/mermaid/src/docs/syntax/timeline.md index 94a485d22..bed8d8ef5 100644 --- a/packages/mermaid/src/docs/syntax/timeline.md +++ b/packages/mermaid/src/docs/syntax/timeline.md @@ -298,7 +298,9 @@ Timeline uses experimental lazy loading & async rendering features which could c You can use this method to add mermaid including the timeline diagram to a web page: ```html - + ``` Note that more complex integrations that the **render** function directly need to use the **renderAsync** method instead in order to render timeline. From d22e8d92c6e33ac659e198f0818cfc8112179fa0 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 19 Feb 2023 01:10:15 +0530 Subject: [PATCH 254/309] chore: Remove all non async render/parse/init --- .../external-diagrams-example-diagram.html | 2 +- docs/config/setup/modules/mermaidAPI.md | 22 +- docs/syntax/mindmap.md | 2 - docs/syntax/timeline.md | 2 - packages/mermaid/src/__mocks__/mermaidAPI.ts | 1 - .../src/docs/.vitepress/theme/mermaid.ts | 2 +- packages/mermaid/src/docs/syntax/mindmap.md | 2 - packages/mermaid/src/docs/syntax/timeline.md | 2 - packages/mermaid/src/mermaid.spec.ts | 6 +- packages/mermaid/src/mermaid.ts | 126 +--------- packages/mermaid/src/mermaidAPI.spec.ts | 8 +- packages/mermaid/src/mermaidAPI.ts | 222 +----------------- tests/webpack/src/index.js | 2 +- 13 files changed, 32 insertions(+), 367 deletions(-) diff --git a/cypress/platform/external-diagrams-example-diagram.html b/cypress/platform/external-diagrams-example-diagram.html index 9d2cad778..a1339d4e6 100644 --- a/cypress/platform/external-diagrams-example-diagram.html +++ b/cypress/platform/external-diagrams-example-diagram.html @@ -17,7 +17,7 @@ example-diagram await mermaid.registerExternalDiagrams([exampleDiagram]); await mermaid.initialize({ logLevel: 0 }); - await mermaid.initThrowsErrorsAsync(); + await mermaid.initThrowsErrors(); if (window.Cypress) { window.rendered = true; } diff --git a/docs/config/setup/modules/mermaidAPI.md b/docs/config/setup/modules/mermaidAPI.md index bd9833c5b..2cdeb597a 100644 --- a/docs/config/setup/modules/mermaidAPI.md +++ b/docs/config/setup/modules/mermaidAPI.md @@ -26,7 +26,7 @@ Renames and re-exports [mermaidAPI](mermaidAPI.md#mermaidapi) ### mermaidAPI -• `Const` **mermaidAPI**: `Readonly`<{ `defaultConfig`: `MermaidConfig` = configApi.defaultConfig; `getConfig`: () => `MermaidConfig` = configApi.getConfig; `getSiteConfig`: () => `MermaidConfig` = configApi.getSiteConfig; `globalReset`: () => `void` ; `initialize`: (`options`: `MermaidConfig`) => `void` ; `parse`: (`text`: `string`, `parseError?`: `ParseErrorFunction`) => `boolean` ; `parseAsync`: (`text`: `string`, `parseError?`: `ParseErrorFunction`) => `Promise`<`boolean`> ; `parseDirective`: (`p`: `any`, `statement`: `string`, `context`: `string`, `type`: `string`) => `void` ; `render`: (`id`: `string`, `text`: `string`, `cb?`: (`svgCode`: `string`, `bindFunctions?`: (`element`: `Element`) => `void`) => `void`, `svgContainingElement?`: `Element`) => `string` ; `renderAsync`: (`id`: `string`, `text`: `string`, `cb?`: (`svgCode`: `string`, `bindFunctions?`: (`element`: `Element`) => `void`) => `void`, `svgContainingElement?`: `Element`) => `Promise`<`string`> ; `reset`: () => `void` ; `setConfig`: (`conf`: `MermaidConfig`) => `MermaidConfig` = configApi.setConfig; `updateSiteConfig`: (`conf`: `MermaidConfig`) => `MermaidConfig` = configApi.updateSiteConfig }> +• `Const` **mermaidAPI**: `Readonly`<{ `defaultConfig`: `MermaidConfig` = configApi.defaultConfig; `getConfig`: () => `MermaidConfig` = configApi.getConfig; `getSiteConfig`: () => `MermaidConfig` = configApi.getSiteConfig; `globalReset`: () => `void` ; `initialize`: (`options`: `MermaidConfig`) => `void` ; `parse`: (`text`: `string`, `parseError?`: `ParseErrorFunction`) => `Promise`<`boolean`> ; `parseDirective`: (`p`: `any`, `statement`: `string`, `context`: `string`, `type`: `string`) => `void` ; `render`: (`id`: `string`, `text`: `string`, `cb?`: (`svgCode`: `string`, `bindFunctions?`: (`element`: `Element`) => `void`) => `void`, `svgContainingElement?`: `Element`) => `Promise`<`string`> ; `reset`: () => `void` ; `setConfig`: (`conf`: `MermaidConfig`) => `MermaidConfig` = configApi.setConfig; `updateSiteConfig`: (`conf`: `MermaidConfig`) => `MermaidConfig` = configApi.updateSiteConfig }> ## mermaidAPI configuration defaults @@ -90,7 +90,7 @@ mermaid.initialize(config); #### Defined in -[mermaidAPI.ts:887](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L887) +[mermaidAPI.ts:671](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L671) ## Functions @@ -121,7 +121,7 @@ Return the last node appended #### Defined in -[mermaidAPI.ts:288](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L288) +[mermaidAPI.ts:278](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L278) --- @@ -147,7 +147,7 @@ the cleaned up svgCode #### Defined in -[mermaidAPI.ts:239](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L239) +[mermaidAPI.ts:229](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L229) --- @@ -173,7 +173,7 @@ the string with all the user styles #### Defined in -[mermaidAPI.ts:168](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L168) +[mermaidAPI.ts:158](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L158) --- @@ -196,7 +196,7 @@ the string with all the user styles #### Defined in -[mermaidAPI.ts:216](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L216) +[mermaidAPI.ts:206](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L206) --- @@ -223,7 +223,7 @@ with an enclosing block that has each of the cssClasses followed by !important; #### Defined in -[mermaidAPI.ts:152](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L152) +[mermaidAPI.ts:142](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L142) --- @@ -243,7 +243,7 @@ with an enclosing block that has each of the cssClasses followed by !important; #### Defined in -[mermaidAPI.ts:132](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L132) +[mermaidAPI.ts:122](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L122) --- @@ -263,7 +263,7 @@ with an enclosing block that has each of the cssClasses followed by !important; #### Defined in -[mermaidAPI.ts:103](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L103) +[mermaidAPI.ts:93](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L93) --- @@ -289,7 +289,7 @@ Put the svgCode into an iFrame. Return the iFrame code #### Defined in -[mermaidAPI.ts:267](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L267) +[mermaidAPI.ts:257](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L257) --- @@ -314,4 +314,4 @@ Remove any existing elements from the given document #### Defined in -[mermaidAPI.ts:338](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L338) +[mermaidAPI.ts:328](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L328) diff --git a/docs/syntax/mindmap.md b/docs/syntax/mindmap.md index 362fd85c7..ad8aab77f 100644 --- a/docs/syntax/mindmap.md +++ b/docs/syntax/mindmap.md @@ -276,6 +276,4 @@ From version 9.4.0 you can simplify this code to: ``` -Note that more complex integrations that use the **render** function directly need to use the **renderAsync** method instead in order to render mind maps. - You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done. diff --git a/docs/syntax/timeline.md b/docs/syntax/timeline.md index 1c7e6e002..58b12313d 100644 --- a/docs/syntax/timeline.md +++ b/docs/syntax/timeline.md @@ -471,6 +471,4 @@ You can use this method to add mermaid including the timeline diagram to a web p ``` -Note that more complex integrations that the **render** function directly need to use the **renderAsync** method instead in order to render timeline. - You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done. diff --git a/packages/mermaid/src/__mocks__/mermaidAPI.ts b/packages/mermaid/src/__mocks__/mermaidAPI.ts index 12c1652bc..50018bcad 100644 --- a/packages/mermaid/src/__mocks__/mermaidAPI.ts +++ b/packages/mermaid/src/__mocks__/mermaidAPI.ts @@ -21,7 +21,6 @@ function parse(text: string, parseError?: ParseErrorFunction): boolean { // original version cannot be modified since it was frozen with `Object.freeze()` export const mermaidAPI = { render: vi.fn(), - renderAsync: vi.fn(), parse, parseDirective: vi.fn(), initialize: vi.fn(), diff --git a/packages/mermaid/src/docs/.vitepress/theme/mermaid.ts b/packages/mermaid/src/docs/.vitepress/theme/mermaid.ts index 2234ef498..c5b57f886 100644 --- a/packages/mermaid/src/docs/.vitepress/theme/mermaid.ts +++ b/packages/mermaid/src/docs/.vitepress/theme/mermaid.ts @@ -2,6 +2,6 @@ import mermaid, { type MermaidConfig } from 'mermaid'; export const render = async (id: string, code: string, config: MermaidConfig): Promise => { mermaid.initialize(config); - const svg = await mermaid.renderAsync(id, code); + const svg = await mermaid.render(id, code); return svg; }; diff --git a/packages/mermaid/src/docs/syntax/mindmap.md b/packages/mermaid/src/docs/syntax/mindmap.md index 968277334..c8a252691 100644 --- a/packages/mermaid/src/docs/syntax/mindmap.md +++ b/packages/mermaid/src/docs/syntax/mindmap.md @@ -184,6 +184,4 @@ From version 9.4.0 you can simplify this code to: ``` -Note that more complex integrations that use the **render** function directly need to use the **renderAsync** method instead in order to render mind maps. - You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done. diff --git a/packages/mermaid/src/docs/syntax/timeline.md b/packages/mermaid/src/docs/syntax/timeline.md index bed8d8ef5..ef48d2b61 100644 --- a/packages/mermaid/src/docs/syntax/timeline.md +++ b/packages/mermaid/src/docs/syntax/timeline.md @@ -303,6 +303,4 @@ You can use this method to add mermaid including the timeline diagram to a web p ``` -Note that more complex integrations that the **render** function directly need to use the **renderAsync** method instead in order to render timeline. - You can also refer the implementation in the live editor [here](https://github.com/mermaid-js/mermaid-live-editor/blob/develop/src/lib/util/mermaid.ts) to see how the async loading is done. diff --git a/packages/mermaid/src/mermaid.spec.ts b/packages/mermaid/src/mermaid.spec.ts index aa797af0e..f9709510e 100644 --- a/packages/mermaid/src/mermaid.spec.ts +++ b/packages/mermaid/src/mermaid.spec.ts @@ -48,7 +48,7 @@ describe('when using mermaid and ', function () { const node = document.createElement('div'); node.appendChild(document.createTextNode('graph TD;\na;')); - mermaid.initThrowsErrors(undefined, node); + await mermaid.initThrowsErrors(undefined, node); // mermaidAPI.render function has been mocked, since it doesn't yet work // in Node.JS (only works in browser) expect(mermaidAPI.render).toHaveBeenCalled(); @@ -72,9 +72,9 @@ describe('when using mermaid and ', function () { ) ).rejects.toThrow('Failed to load 1 external diagrams'); - expect(() => mermaid.initThrowsErrorsAsync(undefined, node)).not.toThrow(); + expect(() => mermaid.initThrowsErrors(undefined, node)).not.toThrow(); // should still render, even if lazyLoadedDiagrams fails - expect(mermaidAPI.renderAsync).toHaveBeenCalled(); + expect(mermaidAPI.render).toHaveBeenCalled(); }); it('should defer diagram load based on parameter', async () => { diff --git a/packages/mermaid/src/mermaid.ts b/packages/mermaid/src/mermaid.ts index be06c2167..540e0368e 100644 --- a/packages/mermaid/src/mermaid.ts +++ b/packages/mermaid/src/mermaid.ts @@ -50,7 +50,7 @@ const init = async function ( callback?: Function ) { try { - await initThrowsErrorsAsync(config, nodes, callback); + await initThrowsErrors(config, nodes, callback); } catch (e) { log.warn('Syntax Error rendering'); if (isDetailedError(e)) { @@ -87,96 +87,6 @@ const handleError = (error: unknown, errors: DetailedError[], parseError?: Parse } }; -const initThrowsErrors = function ( - config?: MermaidConfig, - // eslint-disable-next-line no-undef - nodes?: string | HTMLElement | NodeListOf, - // eslint-disable-next-line @typescript-eslint/ban-types - callback?: Function -) { - const conf = mermaidAPI.getConfig(); - if (config) { - // This is a legacy way of setting config. It is not documented and should be removed in the future. - // @ts-ignore: TODO Fix ts errors - mermaid.sequenceConfig = config; - } - - // if last argument is a function this is the callback function - log.debug(`${!callback ? 'No ' : ''}Callback function found`); - let nodesToProcess: ArrayLike; - if (nodes === undefined) { - nodesToProcess = document.querySelectorAll('.mermaid'); - } else if (typeof nodes === 'string') { - nodesToProcess = document.querySelectorAll(nodes); - } else if (nodes instanceof HTMLElement) { - nodesToProcess = [nodes]; - } else if (nodes instanceof NodeList) { - nodesToProcess = nodes; - } else { - throw new Error('Invalid argument nodes for mermaid.init'); - } - - log.debug(`Found ${nodesToProcess.length} diagrams`); - if (config?.startOnLoad !== undefined) { - log.debug('Start On Load: ' + config?.startOnLoad); - mermaidAPI.updateSiteConfig({ startOnLoad: config?.startOnLoad }); - } - - // generate the id of the diagram - const idGenerator = new utils.initIdGenerator(conf.deterministicIds, conf.deterministicIDSeed); - - let txt: string; - const errors: DetailedError[] = []; - - // element is the current div with mermaid class - // eslint-disable-next-line unicorn/prefer-spread - for (const element of Array.from(nodesToProcess)) { - log.info('Rendering diagram: ' + element.id); - /*! Check if previously processed */ - if (element.getAttribute('data-processed')) { - continue; - } - element.setAttribute('data-processed', 'true'); - - const id = `mermaid-${idGenerator.next()}`; - - // Fetch the graph definition including tags - txt = element.innerHTML; - - // transforms the html to pure text - txt = dedent(utils.entityDecode(txt)) // removes indentation, required for YAML parsing - .trim() - .replace(//gi, '
'); - - const init = utils.detectInit(txt); - if (init) { - log.debug('Detected early reinit: ', init); - } - try { - mermaidAPI.render( - id, - txt, - (svgCode: string, bindFunctions?: (el: Element) => void) => { - element.innerHTML = svgCode; - if (callback !== undefined) { - callback(id); - } - if (bindFunctions) { - bindFunctions(element); - } - }, - element - ); - } catch (error) { - handleError(error, errors, mermaid.parseError); - } - } - if (errors.length > 0) { - // TODO: We should be throwing an error object. - throw errors[0]; - } -}; - /** * This is an internal function and should not be made public, as it will likely change. * @internal @@ -204,10 +114,6 @@ const loadExternalDiagrams = async (...diagrams: ExternalDiagramDefinition[]) => /** * Equivalent to {@link init}, except an error will be thrown on error. * - * @alpha - * @deprecated This is an internal function and will very likely be modified in v10, or earlier. - * We recommend staying with {@link initThrowsErrors} if you don't need `lazyLoadedDiagrams`. - * * @param config - **Deprecated** Mermaid sequenceConfig. * @param nodes - One of: * - A DOM Node @@ -216,7 +122,7 @@ const loadExternalDiagrams = async (...diagrams: ExternalDiagramDefinition[]) => * @param callback - Function that is called with the id of each generated mermaid diagram. * @returns Resolves on success, otherwise the {@link Promise} will be rejected. */ -const initThrowsErrorsAsync = async function ( +const initThrowsErrors = async function ( config?: MermaidConfig, nodes?: string | HTMLElement | NodeListOf, // eslint-disable-next-line @typescript-eslint/ban-types @@ -282,7 +188,7 @@ const initThrowsErrorsAsync = async function ( log.debug('Detected early reinit: ', init); } try { - await mermaidAPI.renderAsync( + await mermaidAPI.render( id, txt, (svgCode: string, bindFunctions?: (el: Element) => void) => { @@ -369,10 +275,6 @@ const setParseErrorHandler = function (newParseErrorHandler: (err: any, hash: an mermaid.parseError = newParseErrorHandler; }; -const parse = (txt: string) => { - return mermaidAPI.parse(txt, mermaid.parseError); -}; - const executionQueue: (() => Promise)[] = []; let executionQueueRunning = false; const executeQueue = async () => { @@ -395,15 +297,14 @@ const executeQueue = async () => { /** * @param txt - The mermaid code to be parsed. - * @deprecated This is an internal function and should not be used. Will be removed in v10. */ -const parseAsync = (txt: string): Promise => { +const parse = (txt: string): Promise => { return new Promise((resolve, reject) => { // This promise will resolve when the mermaidAPI.render call is done. // It will be queued first and will be executed when it is first in line const performCall = () => new Promise((res, rej) => { - mermaidAPI.parseAsync(txt, mermaid.parseError).then( + mermaidAPI.parse(txt, mermaid.parseError).then( (r) => { // This resolves for the promise for the queue handling res(r); @@ -422,10 +323,7 @@ const parseAsync = (txt: string): Promise => { }); }; -/** - * @deprecated This is an internal function and should not be used. Will be removed in v10. - */ -const renderAsync = ( +const render = ( id: string, text: string, cb?: (svgCode: string, bindFunctions?: (element: Element) => void) => void, @@ -436,7 +334,7 @@ const renderAsync = ( // It will be queued first and will be executed when it is first in line const performCall = () => new Promise((res, rej) => { - mermaidAPI.renderAsync(id, text, cb, container).then( + mermaidAPI.render(id, text, cb, container).then( (r) => { // This resolves for the promise for the queue handling res(r); @@ -461,12 +359,9 @@ const mermaid: { parseError?: ParseErrorFunction; mermaidAPI: typeof mermaidAPI; parse: typeof parse; - parseAsync: typeof parseAsync; - render: typeof mermaidAPI.render; - renderAsync: typeof renderAsync; + render: typeof render; init: typeof init; initThrowsErrors: typeof initThrowsErrors; - initThrowsErrorsAsync: typeof initThrowsErrorsAsync; registerExternalDiagrams: typeof registerExternalDiagrams; initialize: typeof initialize; contentLoaded: typeof contentLoaded; @@ -476,12 +371,9 @@ const mermaid: { diagrams: {}, mermaidAPI, parse, - parseAsync, - render: mermaidAPI.render, - renderAsync, + render, init, initThrowsErrors, - initThrowsErrorsAsync, registerExternalDiagrams, initialize, parseError: undefined, diff --git a/packages/mermaid/src/mermaidAPI.spec.ts b/packages/mermaid/src/mermaidAPI.spec.ts index 67138435e..e86b9b15f 100644 --- a/packages/mermaid/src/mermaidAPI.spec.ts +++ b/packages/mermaid/src/mermaidAPI.spec.ts @@ -720,10 +720,10 @@ describe('mermaidAPI', function () { const diagramText = `${diagramType}\n accTitle: ${a11yTitle}\n accDescr: ${a11yDescr}\n`; const expectedDiagramType = testedDiagram.expectedType; - it('aria-roledscription is set to the diagram type, addSVGa11yTitleDescription is called', () => { + it('aria-roledscription is set to the diagram type, addSVGa11yTitleDescription is called', async () => { const a11yDiagramInfo_spy = vi.spyOn(accessibility, 'setA11yDiagramInfo'); const a11yTitleDesc_spy = vi.spyOn(accessibility, 'addSVGa11yTitleDescription'); - mermaidAPI.render(id, diagramText); + await mermaidAPI.render(id, diagramText); expect(a11yDiagramInfo_spy).toHaveBeenCalledWith( expect.anything(), expectedDiagramType @@ -735,7 +735,7 @@ describe('mermaidAPI', function () { }); }); - describe('renderAsync', () => { + describe('render', () => { // Be sure to add async before each test (anonymous) method // These are more like integration tests right now because nothing is mocked. @@ -775,7 +775,7 @@ describe('mermaidAPI', function () { it('aria-roledscription is set to the diagram type, addSVGa11yTitleDescription is called', async () => { const a11yDiagramInfo_spy = vi.spyOn(accessibility, 'setA11yDiagramInfo'); const a11yTitleDesc_spy = vi.spyOn(accessibility, 'addSVGa11yTitleDescription'); - await mermaidAPI.renderAsync(id, diagramText); + await mermaidAPI.render(id, diagramText); expect(a11yDiagramInfo_spy).toHaveBeenCalledWith( expect.anything(), expectedDiagramType diff --git a/packages/mermaid/src/mermaidAPI.ts b/packages/mermaid/src/mermaidAPI.ts index 55a3055eb..275ec656b 100644 --- a/packages/mermaid/src/mermaidAPI.ts +++ b/packages/mermaid/src/mermaidAPI.ts @@ -80,17 +80,7 @@ export type D3Element = any; * @param text - The mermaid diagram definition. * @param parseError - If set, handles errors. */ -function parse(text: string, parseError?: ParseErrorFunction): boolean { - addDiagrams(); - const diagram = new Diagram(text, parseError); - return diagram.parse(text, parseError); -} - -/** - * @param text - The mermaid diagram definition. - * @param parseError - If set, handles errors. - */ -async function parseAsync(text: string, parseError?: ParseErrorFunction): Promise { +async function parse(text: string, parseError?: ParseErrorFunction): Promise { addDiagrams(); const diagram = await getDiagramFromText(text, parseError); return diagram.parse(text, parseError); @@ -375,214 +365,8 @@ export const removeExistingElements = ( * element will be removed when rendering is completed. * @returns Returns the rendered element as a string containing the SVG definition. */ -const render = function ( - id: string, - text: string, - cb?: (svgCode: string, bindFunctions?: (element: Element) => void) => void, - svgContainingElement?: Element -): string { - addDiagrams(); - configApi.reset(); - - // Add Directives. Must do this before getting the config and before creating the diagram. - const graphInit = utils.detectInit(text); - if (graphInit) { - directiveSanitizer(graphInit); - configApi.addDirective(graphInit); - } - - const config = configApi.getConfig(); - log.debug(config); - - // Check the maximum allowed text size - // TODO: Remove magic number - if (text.length > (config?.maxTextSize ?? 50000)) { - text = MAX_TEXTLENGTH_EXCEEDED_MSG; - } - - // clean up text CRLFs - text = text.replace(/\r\n?/g, '\n'); // parser problems on CRLF ignore all CR and leave LF;; - - const idSelector = '#' + id; - const iFrameID = 'i' + id; - const iFrameID_selector = '#' + iFrameID; - const enclosingDivID = 'd' + id; - const enclosingDivID_selector = '#' + enclosingDivID; - - let root: any = select('body'); - - const isSandboxed = config.securityLevel === SECURITY_LVL_SANDBOX; - const isLooseSecurityLevel = config.securityLevel === SECURITY_LVL_LOOSE; - - const fontFamily = config.fontFamily; - - // ------------------------------------------------------------------------------- - // Define the root d3 node - // In regular execution the svgContainingElement will be the element with a mermaid class - - if (svgContainingElement !== undefined) { - if (svgContainingElement) { - svgContainingElement.innerHTML = ''; - } - - if (isSandboxed) { - // If we are in sandboxed mode, we do everything mermaid related in a (sandboxed )iFrame - const iframe = sandboxedIframe(select(svgContainingElement), iFrameID); - root = select(iframe.nodes()[0]!.contentDocument!.body); - root.node().style.margin = 0; - } else { - root = select(svgContainingElement); - } - appendDivSvgG(root, id, enclosingDivID, `font-family: ${fontFamily}`, XMLNS_XLINK_STD); - } else { - // No svgContainingElement was provided - - // If there is an existing element with the id, we remove it. This likely a previously rendered diagram - removeExistingElements(document, id, enclosingDivID, iFrameID); - - // Add the temporary div used for rendering with the enclosingDivID. - // This temporary div will contain a svg with the id == id - - if (isSandboxed) { - // If we are in sandboxed mode, we do everything mermaid related in a (sandboxed) iFrame - const iframe = sandboxedIframe(select('body'), iFrameID); - root = select(iframe.nodes()[0]!.contentDocument!.body); - root.node().style.margin = 0; - } else { - root = select('body'); - } - - appendDivSvgG(root, id, enclosingDivID); - } - - text = encodeEntities(text); - - // ------------------------------------------------------------------------------- - // Create the diagram - - // Important that we do not create the diagram until after the directives have been included - let diag; - let parseEncounteredException; - - try { - // diag = new Diagram(text); - diag = getDiagramFromText(text); - if ('then' in diag) { - throw new Error('Diagram is a promise. Use renderAsync.'); - } - } catch (error) { - diag = new Diagram('error'); - parseEncounteredException = error; - } - - // Get the temporary div element containing the svg (the parent HTML Element) - const element = root.select(enclosingDivID_selector).node(); - const graphType = diag.type; - - // ------------------------------------------------------------------------------- - // Create and insert the styles (user styles, theme styles, config styles) - // These are dealing with HTML Elements, not d3 nodes. - - // Insert an element into svg. This is where we put the styles - const svg = element.firstChild; - const firstChild = svg.firstChild; - const diagramClassDefs = CLASSDEF_DIAGRAMS.includes(graphType) - ? diag.renderer.getClasses(text, diag) - : {}; - - const rules = createUserStyles( - config, - graphType, - // @ts-ignore convert renderer to TS. - diagramClassDefs, - idSelector - ); - - // svg is a HTML element (not a d3 node) - const style1 = document.createElement('style'); - style1.innerHTML = rules; - svg.insertBefore(style1, firstChild); - - // ------------------------------------------------------------------------------- - // Draw the diagram with the renderer - try { - diag.renderer.draw(text, id, version, diag); - } catch (e) { - errorRenderer.draw(text, id, version); - throw e; - } - - // This is the d3 node for the svg element - const svgNode = root.select(`${enclosingDivID_selector} svg`); - const a11yTitle = diag.db.getAccTitle?.(); - const a11yDescr = diag.db.getAccDescription?.(); - addA11yInfo(graphType, svgNode, a11yTitle, a11yDescr); - - // ------------------------------------------------------------------------------- - // Clean up SVG code - root.select(`[id="${id}"]`).selectAll('foreignobject > *').attr('xmlns', XMLNS_XHTML_STD); - - // Fix for when the base tag is used - let svgCode = root.select(enclosingDivID_selector).node().innerHTML; - - log.debug('config.arrowMarkerAbsolute', config.arrowMarkerAbsolute); - svgCode = cleanUpSvgCode(svgCode, isSandboxed, evaluate(config.arrowMarkerAbsolute)); - - if (isSandboxed) { - const svgEl = root.select(enclosingDivID_selector + ' svg').node(); - svgCode = putIntoIFrame(svgCode, svgEl); - } else if (!isLooseSecurityLevel) { - // Sanitize the svgCode using DOMPurify - svgCode = DOMPurify.sanitize(svgCode, { - ADD_TAGS: DOMPURIFY_TAGS, - ADD_ATTR: DOMPURIFY_ATTR, - }); - } - - // ------------------------------------------------------------------------------- - // Do any callbacks (cb = callback) - if (cb !== undefined) { - switch (graphType) { - case 'flowchart': - case 'flowchart-v2': - cb(svgCode, flowDb.bindFunctions); - break; - case 'gantt': - cb(svgCode, ganttDb.bindFunctions); - break; - case 'class': - case 'classDiagram': - cb(svgCode, classDb.bindFunctions); - break; - default: - cb(svgCode); - } - } else { - log.debug('CB = undefined!'); - } - attachFunctions(); - - // ------------------------------------------------------------------------------- - // Remove the temporary element if appropriate - const tmpElementSelector = isSandboxed ? iFrameID_selector : enclosingDivID_selector; - const node = select(tmpElementSelector).node(); - if (node && 'remove' in node) { - node.remove(); - } - - if (parseEncounteredException) { - throw parseEncounteredException; - } - - return svgCode; -}; - -/** - * @deprecated This is an internal function and should not be used. Will be removed in v10. - */ - -const renderAsync = async function ( +const render = async function ( id: string, text: string, cb?: (svgCode: string, bindFunctions?: (element: Element) => void) => void, @@ -886,9 +670,7 @@ function addA11yInfo( export const mermaidAPI = Object.freeze({ render, - renderAsync, parse, - parseAsync, parseDirective, initialize, getConfig: configApi.getConfig, diff --git a/tests/webpack/src/index.js b/tests/webpack/src/index.js index 092972694..51738aa62 100644 --- a/tests/webpack/src/index.js +++ b/tests/webpack/src/index.js @@ -4,7 +4,7 @@ const mermaid = require('mermaid'); import mindmap from '@mermaid-js/mermaid-mindmap'; const render = async (graph) => { - const svg = await mermaid.renderAsync('dummy', graph); + const svg = await mermaid.render('dummy', graph); console.log(svg); document.getElementById('graphDiv').innerHTML = svg; }; From ae36586b5816af259a78a8b1c69b07daf48031e1 Mon Sep 17 00:00:00 2001 From: Oliver THEBAULT Date: Sat, 18 Feb 2023 22:29:35 +0100 Subject: [PATCH 255/309] docs(flowchart): duplicated hexagon node example --- docs/syntax/flowchart.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/docs/syntax/flowchart.md b/docs/syntax/flowchart.md index fd0408c45..bee5d3120 100644 --- a/docs/syntax/flowchart.md +++ b/docs/syntax/flowchart.md @@ -183,20 +183,6 @@ flowchart LR ### A hexagon node -Code: - -```mermaid-example -flowchart LR - id1{{This is the text in the box}} -``` - -```mermaid -flowchart LR - id1{{This is the text in the box}} -``` - -Render: - ```mermaid-example flowchart LR id1{{This is the text in the box}} From 941b959da3e45192f719a76d8e260615ec121595 Mon Sep 17 00:00:00 2001 From: Rodja Trappe Date: Sun, 19 Feb 2023 05:40:45 +0100 Subject: [PATCH 256/309] add links to NiceGUI integration --- packages/mermaid/src/docs/ecosystem/integrations.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/mermaid/src/docs/ecosystem/integrations.md b/packages/mermaid/src/docs/ecosystem/integrations.md index cf4ccc9f8..87593d649 100644 --- a/packages/mermaid/src/docs/ecosystem/integrations.md +++ b/packages/mermaid/src/docs/ecosystem/integrations.md @@ -182,3 +182,6 @@ They also serve as proof of concept, for the variety of things that can be built - [mermaid-server: Generate diagrams using a HTTP request](https://github.com/TomWright/mermaid-server) - [ExDoc](https://github.com/elixir-lang/ex_doc) - [Rendering Mermaid graphs](https://github.com/elixir-lang/ex_doc#rendering-mermaid-graphs) +- [NiceGUI: Let any browser be the frontend of your Python code](https://nicegui.io) + - [ui.mermaid(...)](https://nicegui.io/reference#mermaid_diagrams) + - [ui.markdown(..., extras=['mermaid'])](https://nicegui.io/reference#markdown_element) From eaa84d2d910f1817e9744c019ef18a0ee7b97526 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 19 Feb 2023 13:08:13 +0530 Subject: [PATCH 257/309] feat: Break render and parse types Both render and parse are async now. Return type of render contains svg and bindFunctions. Parse will not throw error if parseOptions.silent is passed. --- V10-BreakingChanges.md | 22 ++++- .../interfaces/mermaidAPI.RenderResult.md | 78 ++++++++++++++++++ docs/config/setup/modules/mermaidAPI.md | 28 ++++--- packages/mermaid/src/Diagram.ts | 81 +++++-------------- .../mermaid/src/diagram-api/detectType.ts | 3 +- packages/mermaid/src/diagram-api/types.ts | 1 + .../src/diagrams/class/classRenderer-v2.js | 22 ----- .../src/diagrams/sequence/sequenceRenderer.ts | 5 +- packages/mermaid/src/errors.ts | 6 ++ packages/mermaid/src/mermaid.ts | 59 +++++++------- packages/mermaid/src/mermaidAPI.ts | 80 +++++++++--------- 11 files changed, 213 insertions(+), 172 deletions(-) create mode 100644 docs/config/setup/interfaces/mermaidAPI.RenderResult.md create mode 100644 packages/mermaid/src/errors.ts diff --git a/V10-BreakingChanges.md b/V10-BreakingChanges.md index bd9110d1a..e3322a3a1 100644 --- a/V10-BreakingChanges.md +++ b/V10-BreakingChanges.md @@ -1,5 +1,25 @@ -# A collection of updates that change the behaviour +# A collection of updates that change the behavior + +## Async + +`init`, `parse`, `render` are now async. ## Lazy loading and asynchronisity - Invalid dates are rendered as syntax error instead of returning best guess or the current date + +## ParseError is removed + +```js +//< v10.0.0 +mermaid.parse(text, parseError); + +//>= v10.0.0 +await mermaid.parse(text).catch(parseError); +// or +try { + await mermaid.parse(text); +} catch (err) { + parseError(err); +} +``` diff --git a/docs/config/setup/interfaces/mermaidAPI.RenderResult.md b/docs/config/setup/interfaces/mermaidAPI.RenderResult.md new file mode 100644 index 000000000..b95b0acff --- /dev/null +++ b/docs/config/setup/interfaces/mermaidAPI.RenderResult.md @@ -0,0 +1,78 @@ +> **Warning** +> +> ## THIS IS AN AUTOGENERATED FILE. DO NOT EDIT. +> +> ## Please edit the corresponding file in [/packages/mermaid/src/docs/config/setup/interfaces/mermaidAPI.RenderResult.md](../../../../packages/mermaid/src/docs/config/setup/interfaces/mermaidAPI.RenderResult.md). + +# Interface: RenderResult + +[mermaidAPI](../modules/mermaidAPI.md).RenderResult + +Function that renders an svg with a graph from a chart definition. Usage example below. + +```javascript +mermaidAPI.initialize({ + startOnLoad: true, +}); +$(function () { + const graphDefinition = 'graph TB\na-->b'; + const cb = function (svgGraph) { + console.log(svgGraph); + }; + mermaidAPI.render('id1', graphDefinition, cb); +}); +``` + +**`Param`** + +The id for the SVG element (the element to be rendered) + +**`Param`** + +The text for the graph definition + +**`Param`** + +Callback which is called after rendering is finished with the svg code as in param. + +**`Param`** + +HTML element where the svg will be inserted. (Is usually element with the .mermaid class) +If no svgContainingElement is provided then the SVG element will be appended to the body. +Selector to element in which a div with the graph temporarily will be +inserted. If one is provided a hidden div will be inserted in the body of the page instead. The +element will be removed when rendering is completed. + +## Properties + +### bindFunctions + +• `Optional` **bindFunctions**: (`element`: `Element`) => `void` + +#### Type declaration + +▸ (`element`): `void` + +##### Parameters + +| Name | Type | +| :-------- | :-------- | +| `element` | `Element` | + +##### Returns + +`void` + +#### Defined in + +[mermaidAPI.ts:382](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L382) + +--- + +### svg + +• **svg**: `string` + +#### Defined in + +[mermaidAPI.ts:381](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L381) diff --git a/docs/config/setup/modules/mermaidAPI.md b/docs/config/setup/modules/mermaidAPI.md index 2cdeb597a..f75dd85c7 100644 --- a/docs/config/setup/modules/mermaidAPI.md +++ b/docs/config/setup/modules/mermaidAPI.md @@ -6,6 +6,10 @@ # Module: mermaidAPI +## Interfaces + +- [RenderResult](../interfaces/mermaidAPI.RenderResult.md) + ## References ### default @@ -20,13 +24,13 @@ Renames and re-exports [mermaidAPI](mermaidAPI.md#mermaidapi) #### Defined in -[mermaidAPI.ts:75](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L75) +[mermaidAPI.ts:71](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L71) ## Variables ### mermaidAPI -• `Const` **mermaidAPI**: `Readonly`<{ `defaultConfig`: `MermaidConfig` = configApi.defaultConfig; `getConfig`: () => `MermaidConfig` = configApi.getConfig; `getSiteConfig`: () => `MermaidConfig` = configApi.getSiteConfig; `globalReset`: () => `void` ; `initialize`: (`options`: `MermaidConfig`) => `void` ; `parse`: (`text`: `string`, `parseError?`: `ParseErrorFunction`) => `Promise`<`boolean`> ; `parseDirective`: (`p`: `any`, `statement`: `string`, `context`: `string`, `type`: `string`) => `void` ; `render`: (`id`: `string`, `text`: `string`, `cb?`: (`svgCode`: `string`, `bindFunctions?`: (`element`: `Element`) => `void`) => `void`, `svgContainingElement?`: `Element`) => `Promise`<`string`> ; `reset`: () => `void` ; `setConfig`: (`conf`: `MermaidConfig`) => `MermaidConfig` = configApi.setConfig; `updateSiteConfig`: (`conf`: `MermaidConfig`) => `MermaidConfig` = configApi.updateSiteConfig }> +• `Const` **mermaidAPI**: `Readonly`<{ `defaultConfig`: `MermaidConfig` = configApi.defaultConfig; `getConfig`: () => `MermaidConfig` = configApi.getConfig; `getSiteConfig`: () => `MermaidConfig` = configApi.getSiteConfig; `globalReset`: () => `void` ; `initialize`: (`options`: `MermaidConfig`) => `void` ; `parse`: (`text`: `string`, `parseOptions?`: { `silent?`: `boolean` }) => `Promise`<`boolean` | `void`> ; `parseDirective`: (`p`: `any`, `statement`: `string`, `context`: `string`, `type`: `string`) => `void` ; `render`: (`id`: `string`, `text`: `string`, `svgContainingElement?`: `Element`) => `Promise`<[`RenderResult`](../interfaces/mermaidAPI.RenderResult.md)> ; `reset`: () => `void` ; `setConfig`: (`conf`: `MermaidConfig`) => `MermaidConfig` = configApi.setConfig; `updateSiteConfig`: (`conf`: `MermaidConfig`) => `MermaidConfig` = configApi.updateSiteConfig }> ## mermaidAPI configuration defaults @@ -90,7 +94,7 @@ mermaid.initialize(config); #### Defined in -[mermaidAPI.ts:671](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L671) +[mermaidAPI.ts:666](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L666) ## Functions @@ -121,7 +125,7 @@ Return the last node appended #### Defined in -[mermaidAPI.ts:278](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L278) +[mermaidAPI.ts:289](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L289) --- @@ -147,7 +151,7 @@ the cleaned up svgCode #### Defined in -[mermaidAPI.ts:229](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L229) +[mermaidAPI.ts:240](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L240) --- @@ -173,7 +177,7 @@ the string with all the user styles #### Defined in -[mermaidAPI.ts:158](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L158) +[mermaidAPI.ts:169](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L169) --- @@ -196,7 +200,7 @@ the string with all the user styles #### Defined in -[mermaidAPI.ts:206](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L206) +[mermaidAPI.ts:217](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L217) --- @@ -223,7 +227,7 @@ with an enclosing block that has each of the cssClasses followed by !important; #### Defined in -[mermaidAPI.ts:142](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L142) +[mermaidAPI.ts:153](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L153) --- @@ -243,7 +247,7 @@ with an enclosing block that has each of the cssClasses followed by !important; #### Defined in -[mermaidAPI.ts:122](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L122) +[mermaidAPI.ts:133](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L133) --- @@ -263,7 +267,7 @@ with an enclosing block that has each of the cssClasses followed by !important; #### Defined in -[mermaidAPI.ts:93](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L93) +[mermaidAPI.ts:104](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L104) --- @@ -289,7 +293,7 @@ Put the svgCode into an iFrame. Return the iFrame code #### Defined in -[mermaidAPI.ts:257](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L257) +[mermaidAPI.ts:268](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L268) --- @@ -314,4 +318,4 @@ Remove any existing elements from the given document #### Defined in -[mermaidAPI.ts:328](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L328) +[mermaidAPI.ts:339](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L339) diff --git a/packages/mermaid/src/Diagram.ts b/packages/mermaid/src/Diagram.ts index 1f68e52ba..3a0818854 100644 --- a/packages/mermaid/src/Diagram.ts +++ b/packages/mermaid/src/Diagram.ts @@ -3,26 +3,24 @@ import { log } from './logger'; import { getDiagram, registerDiagram } from './diagram-api/diagramAPI'; import { detectType, getDiagramLoader } from './diagram-api/detectType'; import { extractFrontMatter } from './diagram-api/frontmatter'; -import { isDetailedError } from './utils'; -import type { DetailedError } from './utils'; +import { UnknownDiagramError } from './errors'; +import { DetailedError } from './utils'; export type ParseErrorFunction = (err: string | DetailedError | unknown, hash?: any) => void; - export class Diagram { type = 'graph'; parser; renderer; db; - private detectTypeFailed = false; - constructor(public txt: string, parseError?: ParseErrorFunction) { + private detectError?: UnknownDiagramError; + constructor(public text: string) { + this.text += '\n'; const cnf = configApi.getConfig(); - this.txt = txt; try { - this.type = detectType(txt, cnf); + this.type = detectType(text, cnf); } catch (e) { - this.handleError(e, parseError); this.type = 'error'; - this.detectTypeFailed = true; + this.detectError = e as UnknownDiagramError; } const diagram = getDiagram(this.type); log.debug('Type ' + this.type); @@ -46,44 +44,19 @@ export class Diagram { diagram.init(cnf); log.info('Initialized diagram ' + this.type, cnf); } - this.txt += '\n'; - - this.parse(this.txt, parseError); + this.parse(); } - parse(text: string, parseError?: ParseErrorFunction): boolean { - if (this.detectTypeFailed) { - return false; + parse() { + if (this.detectError) { + throw this.detectError; } - try { - text = text + '\n'; - this.db.clear?.(); - this.parser.parse(text); - return true; - } catch (error) { - this.handleError(error, parseError); - } - return false; + this.db.clear?.(); + this.parser.parse(this.text); } - handleError(error: unknown, parseError?: ParseErrorFunction) { - // Is this the correct way to access mermaid's parseError() - // method ? (or global.mermaid.parseError()) ? - - if (parseError === undefined) { - // No mermaid.parseError() handler defined, so re-throw it - throw error; - } - - if (isDetailedError(error)) { - // Handle case where error string and hash were - // wrapped in object like`const error = { str, hash };` - parseError(error.str, error.hash); - return; - } - - // Otherwise, assume it is just an error string and pass it on - parseError(error as string); + async render(id: string, version: string) { + await this.renderer.draw(this.text, id, version, this); } getParser() { @@ -95,10 +68,7 @@ export class Diagram { } } -export const getDiagramFromText = ( - txt: string, - parseError?: ParseErrorFunction -): Diagram | Promise => { +export const getDiagramFromText = async (txt: string): Promise => { const type = detectType(txt, configApi.getConfig()); try { // Trying to find the diagram @@ -106,19 +76,12 @@ export const getDiagramFromText = ( } catch (error) { const loader = getDiagramLoader(type); if (!loader) { - throw new Error(`Diagram ${type} not found.`); + throw new UnknownDiagramError(`Diagram ${type} not found.`); } - // TODO: Uncomment for v10 - // // Diagram not available, loading it - // const { diagram } = await loader(); - // registerDiagram(type, diagram, undefined, diagram.injectUtils); - // // new diagram will try getDiagram again and if fails then it is a valid throw - return loader().then(({ diagram }) => { - registerDiagram(type, diagram, undefined); - return new Diagram(txt, parseError); - }); + // Diagram not available, loading it + // new diagram will try getDiagram again and if fails then it is a valid throw + const { id, diagram } = await loader(); + registerDiagram(id, diagram); } - return new Diagram(txt, parseError); + return new Diagram(txt); }; - -export default Diagram; diff --git a/packages/mermaid/src/diagram-api/detectType.ts b/packages/mermaid/src/diagram-api/detectType.ts index b75e914fb..3c9237e5b 100644 --- a/packages/mermaid/src/diagram-api/detectType.ts +++ b/packages/mermaid/src/diagram-api/detectType.ts @@ -7,6 +7,7 @@ import type { ExternalDiagramDefinition, } from './types'; import { frontMatterRegex } from './frontmatter'; +import { UnknownDiagramError } from '../errors'; const directive = /%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi; const anyComment = /\s*%%.*\n/gm; @@ -44,7 +45,7 @@ export const detectType = function (text: string, config?: MermaidConfig): strin } } - throw new Error(`No diagram type detected for text: ${text}`); + throw new UnknownDiagramError(`No diagram type detected for text: ${text}`); }; export const registerLazyLoadedDiagrams = (...diagrams: ExternalDiagramDefinition[]) => { diff --git a/packages/mermaid/src/diagram-api/types.ts b/packages/mermaid/src/diagram-api/types.ts index d60019577..081136563 100644 --- a/packages/mermaid/src/diagram-api/types.ts +++ b/packages/mermaid/src/diagram-api/types.ts @@ -18,6 +18,7 @@ export interface DiagramDb { setDiagramTitle?: (title: string) => void; getAccTitle?: () => string; getAccDescription?: () => string; + bindFunctions?: (element: Element) => void; } export interface DiagramDefinition { diff --git a/packages/mermaid/src/diagrams/class/classRenderer-v2.js b/packages/mermaid/src/diagrams/class/classRenderer-v2.js index d95c29fd5..b7e538583 100644 --- a/packages/mermaid/src/diagrams/class/classRenderer-v2.js +++ b/packages/mermaid/src/diagrams/class/classRenderer-v2.js @@ -348,19 +348,6 @@ export const setConf = function (cnf) { */ export const draw = function (text, id, _version, diagObj) { log.info('Drawing class - ', id); - // diagObj.db.clear(); - // const parser = diagObj.db.parser; - // parser.yy = classDb; - - // Parse the graph definition - // try { - // parser.parse(text); - // } catch (err) { - // log.debug('Parsing failed'); - // } - - // Fetch the default direction, use TD if none was found - //let dir = 'TD'; const conf = getConfig().flowchart; const securityLevel = getConfig().securityLevel; @@ -384,15 +371,6 @@ export const draw = function (text, id, _version, diagObj) { return {}; }); - // let subG; - // const subGraphs = flowDb.getSubGraphs(); - // log.info('Subgraphs - ', subGraphs); - // for (let i = subGraphs.length - 1; i >= 0; i--) { - // subG = subGraphs[i]; - // log.info('Subgraph - ', subG); - // flowDb.addVertex(subG.id, subG.title, 'group', undefined, subG.classes); - // } - // Fetch the vertices/nodes and edges/links from the parsed graph definition const classes = diagObj.db.getClasses(); const relations = diagObj.db.getRelations(); diff --git a/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts b/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts index e4ce05350..acee7bbe5 100644 --- a/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts +++ b/packages/mermaid/src/diagrams/sequence/sequenceRenderer.ts @@ -2,15 +2,12 @@ import { select, selectAll } from 'd3'; import svgDraw, { drawText, fixLifeLineHeights } from './svgDraw'; import { log } from '../../logger'; -// import { parser } from './parser/sequenceDiagram'; import common from '../common/common'; -// import sequenceDb from './sequenceDb'; import * as configApi from '../../config'; import assignWithDepth from '../../assignWithDepth'; import utils from '../../utils'; import { configureSvgSize } from '../../setupGraphViewbox'; -import Diagram from '../../Diagram'; -import { convert } from '../../tests/util'; +import { Diagram } from '../../Diagram'; let conf = {}; diff --git a/packages/mermaid/src/errors.ts b/packages/mermaid/src/errors.ts new file mode 100644 index 000000000..e3650c5a9 --- /dev/null +++ b/packages/mermaid/src/errors.ts @@ -0,0 +1,6 @@ +export class UnknownDiagramError extends Error { + constructor(message: string) { + super(message); + this.name = 'UnknownDiagramError'; + } +} diff --git a/packages/mermaid/src/mermaid.ts b/packages/mermaid/src/mermaid.ts index 540e0368e..c4499bbc3 100644 --- a/packages/mermaid/src/mermaid.ts +++ b/packages/mermaid/src/mermaid.ts @@ -7,7 +7,7 @@ import dedent from 'ts-dedent'; import { MermaidConfig } from './config.type'; import { log } from './logger'; import utils from './utils'; -import { mermaidAPI } from './mermaidAPI'; +import { mermaidAPI, RenderResult } from './mermaidAPI'; import { registerLazyLoadedDiagrams } from './diagram-api/detectType'; import type { ParseErrorFunction } from './Diagram'; import { isDetailedError } from './utils'; @@ -44,10 +44,8 @@ export type { MermaidConfig, DetailedError, ExternalDiagramDefinition, ParseErro */ const init = async function ( config?: MermaidConfig, - // eslint-disable-next-line no-undef nodes?: string | HTMLElement | NodeListOf, - // eslint-disable-next-line @typescript-eslint/ban-types - callback?: Function + callback?: (id: string) => unknown ) { try { await initThrowsErrors(config, nodes, callback); @@ -125,8 +123,7 @@ const loadExternalDiagrams = async (...diagrams: ExternalDiagramDefinition[]) => const initThrowsErrors = async function ( config?: MermaidConfig, nodes?: string | HTMLElement | NodeListOf, - // eslint-disable-next-line @typescript-eslint/ban-types - callback?: Function + callback?: (id: string) => unknown ) { const conf = mermaidAPI.getConfig(); @@ -188,20 +185,14 @@ const initThrowsErrors = async function ( log.debug('Detected early reinit: ', init); } try { - await mermaidAPI.render( - id, - txt, - (svgCode: string, bindFunctions?: (el: Element) => void) => { - element.innerHTML = svgCode; - if (callback !== undefined) { - callback(id); - } - if (bindFunctions) { - bindFunctions(element); - } - }, - element - ); + const { svg, bindFunctions } = await mermaidAPI.render(id, txt, element); + element.innerHTML = svg; + if (callback) { + callback(id); + } + if (bindFunctions) { + bindFunctions(element); + } } catch (error) { handleError(error, errors, mermaid.parseError); } @@ -296,15 +287,24 @@ const executeQueue = async () => { }; /** - * @param txt - The mermaid code to be parsed. + * Parse the text and validate the syntax. + * @param text - The mermaid diagram definition. + * @param parseOptions - Options for parsing. + * @returns true if the diagram is valid, false otherwise if parseOptions.silent is true. + * @throws Error if the diagram is invalid and parseOptions.silent is false. */ -const parse = (txt: string): Promise => { +const parse = async ( + text: string, + parseOptions?: { + silent?: boolean; + } +): Promise => { return new Promise((resolve, reject) => { // This promise will resolve when the mermaidAPI.render call is done. // It will be queued first and will be executed when it is first in line const performCall = () => new Promise((res, rej) => { - mermaidAPI.parse(txt, mermaid.parseError).then( + mermaidAPI.parse(text, parseOptions).then( (r) => { // This resolves for the promise for the queue handling res(r); @@ -313,6 +313,7 @@ const parse = (txt: string): Promise => { }, (e) => { log.error('Error parsing', e); + mermaid.parseError?.(e); rej(e); reject(e); } @@ -323,18 +324,13 @@ const parse = (txt: string): Promise => { }); }; -const render = ( - id: string, - text: string, - cb?: (svgCode: string, bindFunctions?: (element: Element) => void) => void, - container?: Element -): Promise => { +const render = (id: string, text: string, container?: Element): Promise => { return new Promise((resolve, reject) => { // This promise will resolve when the mermaidAPI.render call is done. // It will be queued first and will be executed when it is first in line const performCall = () => new Promise((res, rej) => { - mermaidAPI.render(id, text, cb, container).then( + mermaidAPI.render(id, text, container).then( (r) => { // This resolves for the promise for the queue handling res(r); @@ -343,6 +339,7 @@ const render = ( }, (e) => { log.error('Error parsing', e); + mermaid.parseError?.(e); rej(e); reject(e); } @@ -355,7 +352,6 @@ const render = ( const mermaid: { startOnLoad: boolean; - diagrams: any; parseError?: ParseErrorFunction; mermaidAPI: typeof mermaidAPI; parse: typeof parse; @@ -368,7 +364,6 @@ const mermaid: { setParseErrorHandler: typeof setParseErrorHandler; } = { startOnLoad: true, - diagrams: {}, mermaidAPI, parse, render, diff --git a/packages/mermaid/src/mermaidAPI.ts b/packages/mermaid/src/mermaidAPI.ts index 275ec656b..5a71bb08e 100644 --- a/packages/mermaid/src/mermaidAPI.ts +++ b/packages/mermaid/src/mermaidAPI.ts @@ -17,11 +17,7 @@ import { compile, serialize, stringify } from 'stylis'; import { version } from '../package.json'; import * as configApi from './config'; import { addDiagrams } from './diagram-api/diagram-orchestration'; -import classDb from './diagrams/class/classDb'; -import flowDb from './diagrams/flowchart/flowDb'; -import ganttDb from './diagrams/gantt/ganttDb'; -import Diagram, { getDiagramFromText } from './Diagram'; -import type { ParseErrorFunction } from './Diagram'; +import { Diagram, getDiagramFromText } from './Diagram'; import errorRenderer from './diagrams/error/errorRenderer'; import { attachFunctions } from './interactionDb'; import { log, setLogLevel } from './logger'; @@ -37,7 +33,7 @@ import { parseDirective } from './directiveUtils'; // diagram names that support classDef statements const CLASSDEF_DIAGRAMS = ['graph', 'flowchart', 'flowchart-v2', 'stateDiagram', 'stateDiagram-v2']; - +const MAX_TEXTLENGTH = 50_000; const MAX_TEXTLENGTH_EXCEEDED_MSG = 'graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa'; @@ -74,16 +70,34 @@ interface DiagramStyleClassDef { // @ts-ignore Could replicate the type definition in d3. This also makes it possible to use the untyped info from the js diagram files. export type D3Element = any; -// ---------------------------------------------------------------------------- - /** + * Parse the text and validate the syntax. * @param text - The mermaid diagram definition. - * @param parseError - If set, handles errors. + * @param parseOptions - Options for parsing. + * @returns true if the diagram is valid, false otherwise if parseOptions.silent is true. + * @throws Error if the diagram is invalid and parseOptions.silent is false. */ -async function parse(text: string, parseError?: ParseErrorFunction): Promise { + +async function parse( + text: string, + parseOptions?: { + silent?: boolean; + } +): Promise { addDiagrams(); - const diagram = await getDiagramFromText(text, parseError); - return diagram.parse(text, parseError); + let error; + try { + const diagram = await getDiagramFromText(text); + diagram.parse(); + } catch (err) { + error = err; + } + if (parseOptions?.silent) { + return error === undefined; + } + if (error) { + throw error; + } } /** @@ -366,12 +380,16 @@ export const removeExistingElements = ( * @returns Returns the rendered element as a string containing the SVG definition. */ +export interface RenderResult { + svg: string; + bindFunctions?: (element: Element) => void; +} + const render = async function ( id: string, text: string, - cb?: (svgCode: string, bindFunctions?: (element: Element) => void) => void, svgContainingElement?: Element -): Promise { +): Promise { addDiagrams(); configApi.reset(); @@ -387,8 +405,7 @@ const render = async function ( log.debug(config); // Check the maximum allowed text size - // TODO: Remove magic number - if (text.length > (config?.maxTextSize ?? 50000)) { + if (text.length > (config?.maxTextSize ?? MAX_TEXTLENGTH)) { text = MAX_TEXTLENGTH_EXCEEDED_MSG; } @@ -453,11 +470,10 @@ const render = async function ( // Create the diagram // Important that we do not create the diagram until after the directives have been included - let diag; + let diag: Diagram; let parseEncounteredException; try { - // diag = new Diagram(text); diag = await getDiagramFromText(text); } catch (error) { diag = new Diagram('error'); @@ -510,7 +526,7 @@ const render = async function ( root.select(`[id="${id}"]`).selectAll('foreignobject > *').attr('xmlns', XMLNS_XHTML_STD); // Fix for when the base tag is used - let svgCode = root.select(enclosingDivID_selector).node().innerHTML; + let svgCode: string = root.select(enclosingDivID_selector).node().innerHTML; log.debug('config.arrowMarkerAbsolute', config.arrowMarkerAbsolute); svgCode = cleanUpSvgCode(svgCode, isSandboxed, evaluate(config.arrowMarkerAbsolute)); @@ -526,27 +542,6 @@ const render = async function ( }); } - // ------------------------------------------------------------------------------- - // Do any callbacks (cb = callback) - if (cb !== undefined) { - switch (graphType) { - case 'flowchart': - case 'flowchart-v2': - cb(svgCode, flowDb.bindFunctions); - break; - case 'gantt': - cb(svgCode, ganttDb.bindFunctions); - break; - case 'class': - case 'classDiagram': - cb(svgCode, classDb.bindFunctions); - break; - default: - cb(svgCode); - } - } else { - log.debug('CB = undefined!'); - } attachFunctions(); // ------------------------------------------------------------------------------- @@ -561,7 +556,10 @@ const render = async function ( throw parseEncounteredException; } - return svgCode; + return { + svg: svgCode, + bindFunctions: diag.db.bindFunctions, + }; }; /** From d2927435ab18ee172a544ad648fc49812ad84289 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 19 Feb 2023 13:09:31 +0530 Subject: [PATCH 258/309] Fix tests --- packages/mermaid/src/__mocks__/mermaidAPI.ts | 19 +- packages/mermaid/src/diagram.spec.ts | 31 +- .../flowchart/flowRenderer.addEdges.spec.js | 2 +- .../diagrams/sequence/sequenceDiagram.spec.js | 350 +++++++++--------- packages/mermaid/src/mermaid.spec.ts | 47 +-- packages/mermaid/src/mermaidAPI.spec.ts | 77 ++-- 6 files changed, 267 insertions(+), 259 deletions(-) diff --git a/packages/mermaid/src/__mocks__/mermaidAPI.ts b/packages/mermaid/src/__mocks__/mermaidAPI.ts index 50018bcad..95b87d990 100644 --- a/packages/mermaid/src/__mocks__/mermaidAPI.ts +++ b/packages/mermaid/src/__mocks__/mermaidAPI.ts @@ -5,23 +5,14 @@ */ import * as configApi from '../config'; import { vi } from 'vitest'; -import { addDiagrams } from '../diagram-api/diagram-orchestration'; -import Diagram, { type ParseErrorFunction } from '../Diagram'; - -// Normally, we could just do the following to get the original `parse()` -// implementation, however, requireActual returns a promise and it's not documented how to use withing mock file. - -/** {@inheritDoc mermaidAPI.parse} */ -function parse(text: string, parseError?: ParseErrorFunction): boolean { - addDiagrams(); - const diagram = new Diagram(text, parseError); - return diagram.parse(text, parseError); -} +import { mermaidAPI as mAPI } from '../mermaidAPI'; // original version cannot be modified since it was frozen with `Object.freeze()` export const mermaidAPI = { - render: vi.fn(), - parse, + render: vi.fn().mockResolvedValue({ + svg: '', + }), + parse: mAPI.parse, parseDirective: vi.fn(), initialize: vi.fn(), getConfig: configApi.getConfig, diff --git a/packages/mermaid/src/diagram.spec.ts b/packages/mermaid/src/diagram.spec.ts index ebe088a86..a862c7936 100644 --- a/packages/mermaid/src/diagram.spec.ts +++ b/packages/mermaid/src/diagram.spec.ts @@ -1,18 +1,18 @@ import { describe, test, expect } from 'vitest'; -import Diagram, { getDiagramFromText } from './Diagram'; +import { Diagram, getDiagramFromText } from './Diagram'; import { addDetector } from './diagram-api/detectType'; import { addDiagrams } from './diagram-api/diagram-orchestration'; addDiagrams(); describe('diagram detection', () => { - test('should detect inbuilt diagrams', () => { - const graph = getDiagramFromText('graph TD; A-->B') as Diagram; + test('should detect inbuilt diagrams', async () => { + const graph = (await getDiagramFromText('graph TD; A-->B')) as Diagram; expect(graph).toBeInstanceOf(Diagram); expect(graph.type).toBe('flowchart-v2'); - const sequence = getDiagramFromText( + const sequence = (await getDiagramFromText( 'sequenceDiagram; Alice->>+John: Hello John, how are you?' - ) as Diagram; + )) as Diagram; expect(sequence).toBeInstanceOf(Diagram); expect(sequence.type).toBe('sequence'); }); @@ -44,14 +44,15 @@ describe('diagram detection', () => { expect(diagram.type).toBe('loki'); }); - test('should throw the right error for incorrect diagram', () => { - expect(() => getDiagramFromText('graph TD; A-->')).toThrowErrorMatchingInlineSnapshot(` -"Parse error on line 3: -graph TD; A--> ---------------^ -Expecting 'AMP', 'ALPHA', 'COLON', 'PIPE', 'TESTSTR', 'DOWN', 'DEFAULT', 'NUM', 'COMMA', 'MINUS', 'BRKT', 'DOT', 'PUNCTUATION', 'UNICODE_TEXT', 'PLUS', 'EQUALS', 'MULT', 'UNDERSCORE', got 'EOF'" - `); - expect(() => getDiagramFromText('sequenceDiagram; A-->B')).toThrowErrorMatchingInlineSnapshot(` + test('should throw the right error for incorrect diagram', async () => { + await expect(getDiagramFromText('graph TD; A-->')).rejects.toThrowErrorMatchingInlineSnapshot(` + "Parse error on line 2: + graph TD; A--> + --------------^ + Expecting 'AMP', 'ALPHA', 'COLON', 'PIPE', 'TESTSTR', 'DOWN', 'DEFAULT', 'NUM', 'COMMA', 'MINUS', 'BRKT', 'DOT', 'PUNCTUATION', 'UNICODE_TEXT', 'PLUS', 'EQUALS', 'MULT', 'UNDERSCORE', got 'EOF'" + `); + await expect(getDiagramFromText('sequenceDiagram; A-->B')).rejects + .toThrowErrorMatchingInlineSnapshot(` "Parse error on line 1: ...quenceDiagram; A-->B -----------------------^ @@ -59,8 +60,8 @@ Expecting 'TXT', got 'NEWLINE'" `); }); - test('should throw the right error for unregistered diagrams', () => { - expect(() => getDiagramFromText('thor TD; A-->B')).toThrowError( + test('should throw the right error for unregistered diagrams', async () => { + await expect(getDiagramFromText('thor TD; A-->B')).rejects.toThrowError( 'No diagram type detected for text: thor TD; A-->B' ); }); diff --git a/packages/mermaid/src/diagrams/flowchart/flowRenderer.addEdges.spec.js b/packages/mermaid/src/diagrams/flowchart/flowRenderer.addEdges.spec.js index 41868e203..01b6163cb 100644 --- a/packages/mermaid/src/diagrams/flowchart/flowRenderer.addEdges.spec.js +++ b/packages/mermaid/src/diagrams/flowchart/flowRenderer.addEdges.spec.js @@ -1,7 +1,7 @@ import flowDb from './flowDb'; import flowParser from './parser/flow'; import flowRenderer from './flowRenderer'; -import Diagram from '../../Diagram'; +import { Diagram } from '../../Diagram'; import { addDiagrams } from '../../diagram-api/diagram-orchestration'; addDiagrams(); diff --git a/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js b/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js index 80850c2f2..72daca932 100644 --- a/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js +++ b/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js @@ -2,7 +2,7 @@ import { vi } from 'vitest'; import * as configApi from '../../config'; import mermaidAPI from '../../mermaidAPI'; -import Diagram from '../../Diagram'; +import { Diagram } from '../../Diagram'; import { addDiagrams } from '../../diagram-api/diagram-orchestration'; /** @@ -176,14 +176,14 @@ Note right of Bob: Bob thinks Bob-->Alice: I am good thanks!`); diagram.db.clear(); }); - it('should handle a sequenceDiagram definition', function () { + it('should handle a sequenceDiagram definition', async function () { const str = ` sequenceDiagram Alice->Bob:Hello Bob, how are you? Note right of Bob: Bob thinks Bob-->Alice: I am good thanks!`; - mermaidAPI.parse(str, diagram); + await mermaidAPI.parse(str, diagram); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); actors.Bob.description = 'Bob'; @@ -194,18 +194,18 @@ Bob-->Alice: I am good thanks!`; expect(messages[0].from).toBe('Alice'); expect(messages[2].from).toBe('Bob'); }); - it('should not show sequence numbers per default', function () { + it('should not show sequence numbers per default', async () => { const str = ` sequenceDiagram Alice->Bob:Hello Bob, how are you? Note right of Bob: Bob thinks Bob-->Alice: I am good thanks!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); // needs to be rendered for the correct value of visibility auto numbers expect(diagram.db.showSequenceNumbers()).toBe(false); }); - it('should show sequence numbers when autonumber is enabled', function () { + it('should show sequence numbers when autonumber is enabled', async () => { const str = ` sequenceDiagram autonumber @@ -213,11 +213,11 @@ Alice->Bob:Hello Bob, how are you? Note right of Bob: Bob thinks Bob-->Alice: I am good thanks!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); // needs to be rendered for the correct value of visibility auto numbers expect(diagram.db.showSequenceNumbers()).toBe(true); }); - it('should handle a sequenceDiagram definition with a title:', function () { + it('should handle a sequenceDiagram definition with a title:', async () => { const str = ` sequenceDiagram title: Diagram Title @@ -225,7 +225,7 @@ Alice->Bob:Hello Bob, how are you? Note right of Bob: Bob thinks Bob-->Alice: I am good thanks!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); actors.Bob.description = 'Bob'; @@ -240,7 +240,7 @@ Bob-->Alice: I am good thanks!`; expect(title).toBe('Diagram Title'); }); - it('should handle a sequenceDiagram definition with a title without a :', function () { + it('should handle a sequenceDiagram definition with a title without a :', async () => { const str = ` sequenceDiagram title Diagram Title @@ -248,7 +248,7 @@ Alice->Bob:Hello Bob, how are you? Note right of Bob: Bob thinks Bob-->Alice: I am good thanks!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); actors.Bob.description = 'Bob'; @@ -263,7 +263,7 @@ Bob-->Alice: I am good thanks!`; expect(title).toBe('Diagram Title'); }); - it('should handle a sequenceDiagram definition with a accessibility title and description (accDescr)', function () { + it('should handle a sequenceDiagram definition with a accessibility title and description (accDescr)', async () => { const str = ` sequenceDiagram title: Diagram Title @@ -272,13 +272,13 @@ accDescr: Accessibility Description Alice->Bob:Hello Bob, how are you? `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); expect(diagram.db.getDiagramTitle()).toBe('Diagram Title'); expect(diagram.db.getAccTitle()).toBe('This is the title'); expect(diagram.db.getAccDescription()).toBe('Accessibility Description'); const messages = diagram.db.getMessages(); }); - it('should handle a sequenceDiagram definition with a accessibility title and multiline description (accDescr)', function () { + it('should handle a sequenceDiagram definition with a accessibility title and multiline description (accDescr)', async () => { const str = ` sequenceDiagram accTitle: This is the title @@ -289,19 +289,19 @@ Description Alice->Bob:Hello Bob, how are you? `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); expect(diagram.db.getAccTitle()).toBe('This is the title'); expect(diagram.db.getAccDescription()).toBe('Accessibility\nDescription'); const messages = diagram.db.getMessages(); }); - it('should space in actor names', function () { + it('should space in actor names', async () => { const str = ` sequenceDiagram Alice->Bob:Hello Bob, how are - you? Bob-->Alice: I am good thanks!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); actors.Bob.description = 'Bob'; @@ -312,13 +312,13 @@ Bob-->Alice: I am good thanks!`; expect(messages[0].from).toBe('Alice'); expect(messages[1].from).toBe('Bob'); }); - it('should handle dashes in actor names', function () { + it('should handle dashes in actor names', async () => { const str = ` sequenceDiagram Alice-in-Wonderland->Bob:Hello Bob, how are - you? Bob-->Alice-in-Wonderland:I am good thanks!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors['Alice-in-Wonderland'].description).toBe('Alice-in-Wonderland'); expect(actors.Bob.description).toBe('Bob'); @@ -330,7 +330,7 @@ Bob-->Alice-in-Wonderland:I am good thanks!`; expect(messages[1].from).toBe('Bob'); }); - it('should handle dashes in participant names', function () { + it('should handle dashes in participant names', async () => { const str = ` sequenceDiagram participant Alice-in-Wonderland @@ -338,7 +338,7 @@ participant Bob Alice-in-Wonderland->Bob:Hello Bob, how are - you? Bob-->Alice-in-Wonderland:I am good thanks!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(Object.keys(actors)).toEqual(['Alice-in-Wonderland', 'Bob']); expect(actors['Alice-in-Wonderland'].description).toBe('Alice-in-Wonderland'); @@ -351,7 +351,7 @@ Bob-->Alice-in-Wonderland:I am good thanks!`; expect(messages[1].from).toBe('Bob'); }); - it('should alias participants', function () { + it('should alias participants', async () => { const str = ` sequenceDiagram participant A as Alice @@ -359,7 +359,7 @@ participant B as Bob A->B:Hello Bob, how are you? B-->A: I am good thanks!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); @@ -372,7 +372,7 @@ B-->A: I am good thanks!`; expect(messages[0].from).toBe('A'); expect(messages[1].from).toBe('B'); }); - it('should alias a mix of actors and participants apa12', function () { + it('should alias a mix of actors and participants apa12', async () => { const str = ` sequenceDiagram actor Alice as Alice2 @@ -385,7 +385,7 @@ sequenceDiagram John->>Mandy: Hi Mandy Mandy ->>Joan: Hi Joan`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(Object.keys(actors)).toEqual(['Alice', 'Bob', 'John', 'Mandy', 'Joan']); @@ -400,7 +400,7 @@ sequenceDiagram expect(messages[0].from).toBe('Alice'); expect(messages[4].to).toBe('Joan'); }); - it('should alias actors apa13', function () { + it('should alias actors apa13', async () => { const str = ` sequenceDiagram actor A as Alice @@ -408,7 +408,7 @@ actor B as Bob A->B:Hello Bob, how are you? B-->A: I am good thanks!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(Object.keys(actors)).toEqual(['A', 'B']); @@ -420,12 +420,12 @@ B-->A: I am good thanks!`; expect(messages[0].from).toBe('A'); expect(messages[1].from).toBe('B'); }); - it('should handle in async messages', function () { + it('should handle in async messages', async () => { const str = ` sequenceDiagram Alice-xBob:Hello Bob, how are you?`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); expect(actors.Bob.description).toBe('Bob'); @@ -435,12 +435,12 @@ Alice-xBob:Hello Bob, how are you?`; expect(messages.length).toBe(1); expect(messages[0].type).toBe(diagram.db.LINETYPE.SOLID_CROSS); }); - it('should handle in async dotted messages', function () { + it('should handle in async dotted messages', async () => { const str = ` sequenceDiagram Alice--xBob:Hello Bob, how are you?`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); expect(actors.Bob.description).toBe('Bob'); @@ -450,12 +450,12 @@ Alice--xBob:Hello Bob, how are you?`; expect(messages.length).toBe(1); expect(messages[0].type).toBe(diagram.db.LINETYPE.DOTTED_CROSS); }); - it('should handle in sync messages', function () { + it('should handle in sync messages', async () => { const str = ` sequenceDiagram Alice-)Bob:Hello Bob, how are you?`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); expect(actors.Bob.description).toBe('Bob'); @@ -465,12 +465,12 @@ Alice-)Bob:Hello Bob, how are you?`; expect(messages.length).toBe(1); expect(messages[0].type).toBe(diagram.db.LINETYPE.SOLID_POINT); }); - it('should handle in sync dotted messages', function () { + it('should handle in sync dotted messages', async () => { const str = ` sequenceDiagram Alice--)Bob:Hello Bob, how are you?`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); expect(actors.Bob.description).toBe('Bob'); @@ -480,12 +480,12 @@ Alice--)Bob:Hello Bob, how are you?`; expect(messages.length).toBe(1); expect(messages[0].type).toBe(diagram.db.LINETYPE.DOTTED_POINT); }); - it('should handle in arrow messages', function () { + it('should handle in arrow messages', async () => { const str = ` sequenceDiagram Alice->>Bob:Hello Bob, how are you?`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); expect(actors.Bob.description).toBe('Bob'); @@ -495,10 +495,10 @@ Alice->>Bob:Hello Bob, how are you?`; expect(messages.length).toBe(1); expect(messages[0].type).toBe(diagram.db.LINETYPE.SOLID); }); - it('should handle in arrow messages', function () { + it('should handle in arrow messages', async () => { const str = 'sequenceDiagram\n' + 'Alice-->>Bob:Hello Bob, how are you?'; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); expect(actors.Bob.description).toBe('Bob'); @@ -508,7 +508,7 @@ Alice->>Bob:Hello Bob, how are you?`; expect(messages.length).toBe(1); expect(messages[0].type).toBe(diagram.db.LINETYPE.DOTTED); }); - it('should handle actor activation', function () { + it('should handle actor activation', async () => { const str = ` sequenceDiagram Alice-->>Bob:Hello Bob, how are you? @@ -516,7 +516,7 @@ activate Bob Bob-->>Alice:Hello Alice, I'm fine and you? deactivate Bob`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); expect(actors.Bob.description).toBe('Bob'); @@ -531,13 +531,13 @@ deactivate Bob`; expect(messages[3].type).toBe(diagram.db.LINETYPE.ACTIVE_END); expect(messages[3].from.actor).toBe('Bob'); }); - it('should handle actor one line notation activation', function () { + it('should handle actor one line notation activation', async () => { const str = ` sequenceDiagram Alice-->>+Bob:Hello Bob, how are you? Bob-->>- Alice:Hello Alice, I'm fine and you?`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); expect(actors.Bob.description).toBe('Bob'); @@ -552,7 +552,7 @@ deactivate Bob`; expect(messages[3].type).toBe(diagram.db.LINETYPE.ACTIVE_END); expect(messages[3].from.actor).toBe('Bob'); }); - it('should handle stacked activations', function () { + it('should handle stacked activations', async () => { const str = ` sequenceDiagram Alice-->>+Bob:Hello Bob, how are you? @@ -560,7 +560,7 @@ deactivate Bob`; Bob-->>- Alice:Hello Alice, please meet Carol? Carol->>- Bob:Oh Bob, I'm so happy to be here!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); expect(actors.Bob.description).toBe('Bob'); @@ -579,7 +579,7 @@ deactivate Bob`; expect(messages[7].type).toBe(diagram.db.LINETYPE.ACTIVE_END); expect(messages[7].from.actor).toBe('Carol'); }); - it('should handle fail parsing when activating an inactive participant', function () { + it('should handle fail parsing when activating an inactive participant', async () => { const str = ` sequenceDiagram participant user as End User @@ -598,14 +598,14 @@ deactivate Bob`; let error = false; try { - mermaidAPI.parse(str); + await mermaidAPI.parse(str); } catch (e) { error = true; } expect(error).toBe(true); }); - it('should handle comments in a sequenceDiagram', function () { + it('should handle comments in a sequenceDiagram', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -613,7 +613,7 @@ deactivate Bob`; Note right of Bob: Bob thinks Bob-->Alice: I am good thanks!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); actors.Bob.description = 'Bob'; @@ -624,7 +624,7 @@ deactivate Bob`; expect(messages[0].from).toBe('Alice'); expect(messages[2].from).toBe('Bob'); }); - it('should handle new lines in a sequenceDiagram', function () { + it('should handle new lines in a sequenceDiagram', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -634,7 +634,7 @@ deactivate Bob`; Bob-->Alice: I am good thanks! `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); actors.Bob.description = 'Bob'; @@ -645,11 +645,11 @@ deactivate Bob`; expect(messages[0].from).toBe('Alice'); expect(messages[2].from).toBe('Bob'); }); - it('should handle semicolons', function () { + it('should handle semicolons', async () => { const str = ` sequenceDiagram;Alice->Bob: Hello Bob, how are you?;Note right of Bob: Bob thinks;Bob-->Alice: I am good thanks!;`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); actors.Bob.description = 'Bob'; @@ -660,7 +660,7 @@ sequenceDiagram;Alice->Bob: Hello Bob, how are you?;Note right of Bob: Bob think expect(messages[0].from).toBe('Alice'); expect(messages[2].from).toBe('Bob'); }); - it('should handle one leading space in lines in a sequenceDiagram', function () { + it('should handle one leading space in lines in a sequenceDiagram', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -669,7 +669,7 @@ sequenceDiagram Note right of Bob: Bob thinks Bob-->Alice: I am good thanks!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); actors.Bob.description = 'Bob'; @@ -680,7 +680,7 @@ Bob-->Alice: I am good thanks!`; expect(messages[0].from).toBe('Alice'); expect(messages[2].from).toBe('Bob'); }); - it('should handle several leading spaces in lines in a sequenceDiagram', function () { + it('should handle several leading spaces in lines in a sequenceDiagram', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -689,7 +689,7 @@ sequenceDiagram Note right of Bob: Bob thinks Bob-->Alice: I am good thanks!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); actors.Bob.description = 'Bob'; @@ -700,7 +700,7 @@ Bob-->Alice: I am good thanks!`; expect(messages[0].from).toBe('Alice'); expect(messages[2].from).toBe('Bob'); }); - it('should handle several leading spaces in lines in a sequenceDiagram', function () { + it('should handle several leading spaces in lines in a sequenceDiagram', async () => { const str = ` sequenceDiagram participant Alice @@ -714,7 +714,7 @@ Note right of John: Rational thoughts
prevail... John->Bob: How about you? Bob-->John: Jolly good!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); actors.Bob.description = 'Bob'; @@ -725,7 +725,7 @@ Bob-->John: Jolly good!`; expect(messages[0].from).toBe('Alice'); expect(messages[2].from).toBe('John'); }); - it('should handle different line breaks', function () { + it('should handle different line breaks', async () => { const str = ` sequenceDiagram participant 1 as multiline
text @@ -742,7 +742,7 @@ note right of 4: multiline
text note right of 1: multiline
text `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors['1'].description).toBe('multiline
text'); @@ -760,7 +760,7 @@ note right of 1: multiline
text expect(messages[6].message).toBe('multiline
text'); expect(messages[7].message).toBe('multiline
text'); }); - it('should handle notes and messages without wrap specified', function () { + it('should handle notes and messages without wrap specified', async () => { const str = ` sequenceDiagram participant 1 @@ -777,7 +777,7 @@ note right of 4: multiline
text note right of 1:nowrap: multiline
text `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages[0].message).toBe('single-line text'); @@ -799,7 +799,7 @@ note right of 1:nowrap: multiline
text expect(messages[6].wrap).toBe(false); expect(messages[7].wrap).toBe(false); }); - it('should handle notes and messages with wrap specified', function () { + it('should handle notes and messages with wrap specified', async () => { const str = ` sequenceDiagram participant 1 @@ -812,7 +812,7 @@ note right of 2:wrap: single-line text note right of 3:wrap: multiline
text `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages[0].message).toBe('single-line text'); @@ -824,7 +824,7 @@ note right of 3:wrap: multiline
text expect(messages[2].wrap).toBe(true); expect(messages[3].wrap).toBe(true); }); - it('should handle notes and messages with nowrap or line breaks', function () { + it('should handle notes and messages with nowrap or line breaks', async () => { const str = ` sequenceDiagram participant 1 @@ -833,7 +833,7 @@ participant 2 note right of 2: single-line text `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages[0].message).toBe('single-line text'); @@ -841,20 +841,20 @@ note right of 2: single-line text expect(messages[0].wrap).toBe(false); expect(messages[1].wrap).toBe(false); }); - it('should handle notes over a single actor', function () { + it('should handle notes over a single actor', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? Note over Bob: Bob thinks `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages[1].from).toBe('Bob'); expect(messages[1].to).toBe('Bob'); }); - it('should handle notes over multiple actors', function () { + it('should handle notes over multiple actors', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -862,7 +862,7 @@ Note over Alice,Bob: confusion Note over Bob,Alice: resolution `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages[1].from).toBe('Alice'); @@ -870,7 +870,7 @@ Note over Bob,Alice: resolution expect(messages[2].from).toBe('Bob'); expect(messages[2].to).toBe('Alice'); }); - it('should handle loop statements', function () { + it('should handle loop statements', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -882,7 +882,7 @@ loop Multiple happy responses Bob-->Alice: I am good thanks! end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); actors.Bob.description = 'Bob'; @@ -893,7 +893,7 @@ end`; expect(messages[0].from).toBe('Alice'); expect(messages[1].from).toBe('Bob'); }); - it('should add a rect around sequence', function () { + it('should add a rect around sequence', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -904,7 +904,7 @@ end`; end `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); actors.Bob.description = 'Bob'; @@ -917,7 +917,7 @@ end`; expect(messages[4].type).toEqual(diagram.db.LINETYPE.RECT_END); }); - it('should allow for nested rects', function () { + it('should allow for nested rects', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -929,7 +929,7 @@ end`; Bob-->Alice: I am good thanks end `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); actors.Bob.description = 'Bob'; @@ -944,7 +944,7 @@ end`; expect(messages[5].type).toEqual(diagram.db.LINETYPE.DOTTED_OPEN); expect(messages[6].type).toEqual(diagram.db.LINETYPE.RECT_END); }); - it('should handle opt statements', function () { + it('should handle opt statements', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -956,7 +956,7 @@ opt Perhaps a happy response Bob-->Alice: I am good thanks! end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); actors.Bob.description = 'Bob'; @@ -967,7 +967,7 @@ end`; expect(messages[0].from).toBe('Alice'); expect(messages[1].from).toBe('Bob'); }); - it('should handle alt statements', function () { + it('should handle alt statements', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -981,7 +981,7 @@ else isSick Bob-->Alice: Feel sick... end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); @@ -993,7 +993,7 @@ end`; expect(messages[0].from).toBe('Alice'); expect(messages[1].from).toBe('Bob'); }); - it('should handle alt statements with multiple elses', function () { + it('should handle alt statements with multiple elses', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -1008,7 +1008,7 @@ Bob-->Alice: Feel sick... else default Bob-->Alice: :-) end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages.length).toBe(9); expect(messages[1].from).toBe('Bob'); @@ -1020,14 +1020,14 @@ end`; expect(messages[7].from).toBe('Bob'); expect(messages[8].type).toBe(diagram.db.LINETYPE.ALT_END); }); - it('should handle critical statements without options', function () { + it('should handle critical statements without options', async () => { const str = ` sequenceDiagram critical Establish a connection to the DB Service-->DB: connect end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Service.description).toBe('Service'); @@ -1040,7 +1040,7 @@ sequenceDiagram expect(messages[1].from).toBe('Service'); expect(messages[2].type).toBe(diagram.db.LINETYPE.CRITICAL_END); }); - it('should handle critical statements with options', function () { + it('should handle critical statements with options', async () => { const str = ` sequenceDiagram critical Establish a connection to the DB @@ -1051,7 +1051,7 @@ sequenceDiagram Service-->Service: Log different error end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Service.description).toBe('Service'); @@ -1068,7 +1068,7 @@ sequenceDiagram expect(messages[5].from).toBe('Service'); expect(messages[6].type).toBe(diagram.db.LINETYPE.CRITICAL_END); }); - it('should handle break statements', function () { + it('should handle break statements', async () => { const str = ` sequenceDiagram Consumer-->API: Book something @@ -1078,7 +1078,7 @@ sequenceDiagram end API-->BillingService: Start billing process`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Consumer.description).toBe('Consumer'); @@ -1094,7 +1094,7 @@ sequenceDiagram expect(messages[4].type).toBe(diagram.db.LINETYPE.BREAK_END); expect(messages[5].from).toBe('API'); }); - it('should handle par statements a sequenceDiagram', function () { + it('should handle par statements a sequenceDiagram', async () => { const str = ` sequenceDiagram par Parallel one @@ -1108,7 +1108,7 @@ Alice->>Bob: What do you think about it? Bob-->>Alice: It's good! end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.Alice.description).toBe('Alice'); @@ -1121,26 +1121,26 @@ end`; expect(messages[1].from).toBe('Alice'); expect(messages[2].from).toBe('Bob'); }); - it('should handle special characters in signals', function () { + it('should handle special characters in signals', async () => { const str = 'sequenceDiagram\n' + 'Alice->Bob: -:<>,;# comment'; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages[0].message).toBe('-:<>,'); }); - it('should handle special characters in notes', function () { + it('should handle special characters in notes', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? Note right of Bob: -:<>,;# comment`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages[1].message).toBe('-:<>,'); }); - it('should handle special characters in loop', function () { + it('should handle special characters in loop', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -1148,12 +1148,12 @@ loop -:<>,;# comment Bob-->Alice: I am good thanks! end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages[1].message).toBe('-:<>,'); }); - it('should handle special characters in opt', function () { + it('should handle special characters in opt', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -1161,12 +1161,12 @@ opt -:<>,;# comment Bob-->Alice: I am good thanks! end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages[1].message).toBe('-:<>,'); }); - it('should handle special characters in alt', function () { + it('should handle special characters in alt', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -1176,13 +1176,13 @@ else ,<>:-#; comment Bob-->Alice: I am good thanks! end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages[1].message).toBe('-:<>,'); expect(messages[3].message).toBe(',<>:-'); }); - it('should handle special characters in par', function () { + it('should handle special characters in par', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -1192,13 +1192,13 @@ and ,<>:-#; comment Bob-->Alice: I am good thanks! end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages[1].message).toBe('-:<>,'); expect(messages[3].message).toBe(',<>:-'); }); - it('should handle no-label loop', function () { + it('should handle no-label loop', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -1206,13 +1206,13 @@ loop Bob-->Alice: I am good thanks! end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages[1].message).toBe(''); expect(messages[2].message).toBe('I am good thanks!'); }); - it('should handle no-label opt', function () { + it('should handle no-label opt', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -1220,13 +1220,13 @@ opt # comment Bob-->Alice: I am good thanks! end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages[1].message).toBe(''); expect(messages[2].message).toBe('I am good thanks!'); }); - it('should handle no-label alt', function () { + it('should handle no-label alt', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -1235,7 +1235,7 @@ else # comment Bob-->Alice: I am good thanks! end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages[1].message).toBe(''); @@ -1243,7 +1243,7 @@ end`; expect(messages[3].message).toBe(''); expect(messages[4].message).toBe('I am good thanks!'); }); - it('should handle no-label par', function () { + it('should handle no-label par', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -1252,7 +1252,7 @@ and # comment Bob-->Alice: I am good thanks! end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const messages = diagram.db.getMessages(); expect(messages[1].message).toBe(''); @@ -1261,7 +1261,7 @@ end`; expect(messages[4].message).toBe('I am good thanks!'); }); - it('should handle links', function () { + it('should handle links', async () => { const str = ` sequenceDiagram participant a as Alice @@ -1275,7 +1275,7 @@ link a: Swagger @ https://swagger.contoso.com link a: Tests @ https://tests.contoso.com/?svc=alice@contoso.com `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.a.links['Repo']).toBe('https://repo.contoso.com/'); expect(actors.b.links['Repo']).toBe(undefined); @@ -1288,7 +1288,7 @@ link a: Tests @ https://tests.contoso.com/?svc=alice@contoso.com expect(actors.a.links['Tests']).toBe('https://tests.contoso.com/?svc=alice@contoso.com'); }); - it('should handle properties EXPERIMENTAL: USE WITH CAUTION', function () { + it('should handle properties EXPERIMENTAL: USE WITH CAUTION', async () => { //Be aware that the syntax for "properties" is likely to be changed. const str = ` sequenceDiagram @@ -1299,7 +1299,7 @@ properties a: {"class": "internal-service-actor", "icon": "@clock"} properties b: {"class": "external-service-actor", "icon": "@computer"} `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(actors.a.properties['class']).toBe('internal-service-actor'); expect(actors.b.properties['class']).toBe('external-service-actor'); @@ -1308,7 +1308,7 @@ properties b: {"class": "external-service-actor", "icon": "@computer"} expect(actors.c.properties['class']).toBe(undefined); }); - it('should handle box', function () { + it('should handle box', async () => { const str = ` sequenceDiagram box green Group 1 @@ -1324,14 +1324,14 @@ link a: Swagger @ https://swagger.contoso.com link a: Tests @ https://tests.contoso.com/?svc=alice@contoso.com `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const boxes = diagram.db.getBoxes(); expect(boxes[0].name).toEqual('Group 1'); expect(boxes[0].actorKeys).toEqual(['a', 'b']); expect(boxes[0].fill).toEqual('green'); }); - it('should handle box without color', function () { + it('should handle box without color', async () => { const str = ` sequenceDiagram box Group 1 @@ -1347,14 +1347,14 @@ link a: Tests @ https://tests.contoso.com/?svc=alice@contoso.com link a: Tests @ https://tests.contoso.com/?svc=alice@contoso.com `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const boxes = diagram.db.getBoxes(); expect(boxes[0].name).toEqual('Group 1'); expect(boxes[0].actorKeys).toEqual(['a', 'b']); expect(boxes[0].fill).toEqual('transparent'); }); - it('should handle box without description', function () { + it('should handle box without description', async () => { const str = ` sequenceDiagram box Aqua @@ -1370,7 +1370,7 @@ link a: Tests @ https://tests.contoso.com/?svc=alice@contoso.com link a: Tests @ https://tests.contoso.com/?svc=alice@contoso.com `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const boxes = diagram.db.getBoxes(); expect(boxes[0].name).toBeFalsy(); expect(boxes[0].actorKeys).toEqual(['a', 'b']); @@ -1403,7 +1403,7 @@ describe('when checking the bounds in a sequenceDiagram', function () { diagram.renderer.bounds.init(); conf = diagram.db.getConfig(); }); - it('should handle a simple bound call', function () { + it('should handle a simple bound call', async () => { diagram.renderer.bounds.insert(100, 100, 200, 200); const { bounds } = diagram.renderer.bounds.getBounds(); @@ -1412,7 +1412,7 @@ describe('when checking the bounds in a sequenceDiagram', function () { expect(bounds.stopx).toBe(200); expect(bounds.stopy).toBe(200); }); - it('should handle an expanding bound', function () { + it('should handle an expanding bound', async () => { diagram.renderer.bounds.insert(100, 100, 200, 200); diagram.renderer.bounds.insert(25, 50, 300, 400); @@ -1422,7 +1422,7 @@ describe('when checking the bounds in a sequenceDiagram', function () { expect(bounds.stopx).toBe(300); expect(bounds.stopy).toBe(400); }); - it('should handle inserts within the bound without changing the outer bounds', function () { + it('should handle inserts within the bound without changing the outer bounds', async () => { diagram.renderer.bounds.insert(100, 100, 200, 200); diagram.renderer.bounds.insert(25, 50, 300, 400); diagram.renderer.bounds.insert(125, 150, 150, 200); @@ -1433,7 +1433,7 @@ describe('when checking the bounds in a sequenceDiagram', function () { expect(bounds.stopx).toBe(300); expect(bounds.stopy).toBe(400); }); - it('should handle a loop without expanding the area', function () { + it('should handle a loop without expanding the area', async () => { diagram.renderer.bounds.insert(25, 50, 300, 400); diagram.renderer.bounds.verticalPos = 150; diagram.renderer.bounds.newLoop(); @@ -1454,7 +1454,7 @@ describe('when checking the bounds in a sequenceDiagram', function () { expect(bounds.stopx).toBe(300); expect(bounds.stopy).toBe(400); }); - it('should handle multiple loops withtout expanding the bounds', function () { + it('should handle multiple loops withtout expanding the bounds', async () => { diagram.renderer.bounds.insert(100, 100, 1000, 1000); diagram.renderer.bounds.verticalPos = 200; diagram.renderer.bounds.newLoop(); @@ -1485,7 +1485,7 @@ describe('when checking the bounds in a sequenceDiagram', function () { expect(bounds.stopx).toBe(1000); expect(bounds.stopy).toBe(1000); }); - it('should handle a loop that expands the area', function () { + it('should handle a loop that expands the area', async () => { diagram.renderer.bounds.insert(100, 100, 200, 200); diagram.renderer.bounds.verticalPos = 200; diagram.renderer.bounds.newLoop(); @@ -1555,13 +1555,13 @@ Bob-->Alice: I am good thanks!`); }); ['tspan', 'fo', 'old', undefined].forEach(function (textPlacement) { it(` -it should handle one actor, when textPlacement is ${textPlacement}`, function () { +it should handle one actor, when textPlacement is ${textPlacement}`, async () => { const str = ` sequenceDiagram participant Alice`; // mermaidAPI.reinitialize({ sequence: { textPlacement: textPlacement } }); - mermaidAPI.parse(str); + await mermaidAPI.parse(str); // diagram.renderer.setConf(mermaidAPI.getConfig().sequence); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); @@ -1572,7 +1572,7 @@ participant Alice`; expect(bounds.stopy).toBe(conf.height); }); }); - it('should handle same actor with different whitespace properly', function () { + it('should handle same actor with different whitespace properly', async () => { const str = ` sequenceDiagram participant Alice @@ -1580,12 +1580,12 @@ participant Alice participant Alice `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); const actors = diagram.db.getActors(); expect(Object.keys(actors)).toEqual(['Alice']); }); - it('should handle one actor and a centered note', function () { + it('should handle one actor and a centered note', async () => { const str = ` sequenceDiagram participant Alice @@ -1593,7 +1593,7 @@ Note over Alice: Alice thinks `; expect(mermaidAPI.getConfig().sequence.mirrorActors).toBeFalsy(); - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1603,13 +1603,13 @@ Note over Alice: Alice thinks // 10 comes from mock of text height expect(bounds.stopy).toBe(models.lastNote().stopy); }); - it('should handle one actor and a note to the left', function () { + it('should handle one actor and a note to the left', async () => { const str = ` sequenceDiagram participant Alice Note left of Alice: Alice thinks`; - mermaidAPI.parse(str, diagram); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1619,13 +1619,13 @@ Note left of Alice: Alice thinks`; // 10 comes from mock of text height expect(bounds.stopy).toBe(models.lastNote().stopy); }); - it('should handle one actor and a note to the right', function () { + it('should handle one actor and a note to the right', async () => { const str = ` sequenceDiagram participant Alice Note right of Alice: Alice thinks`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1635,12 +1635,12 @@ Note right of Alice: Alice thinks`; // 10 comes from mock of text height expect(bounds.stopy).toBe(models.lastNote().stopy); }); - it('should handle two actors', function () { + it('should handle two actors', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you?`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1649,7 +1649,7 @@ Alice->Bob: Hello Bob, how are you?`; expect(bounds.stopx).toBe(conf.width * 2 + conf.actorMargin); expect(bounds.stopy).toBe(models.lastMessage().stopy + 10); }); - it('should handle two actors in a box', function () { + it('should handle two actors in a box', async () => { const str = ` sequenceDiagram box rgb(34, 56, 0) Group1 @@ -1658,7 +1658,7 @@ participant Bob end Alice->Bob: Hello Bob, how are you?`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1667,13 +1667,13 @@ Alice->Bob: Hello Bob, how are you?`; expect(bounds.stopx).toBe(conf.width * 2 + conf.actorMargin + conf.boxTextMargin * 2); expect(bounds.stopy).toBe(models.lastMessage().stopy + 20); }); - it('should handle two actors with init directive', function () { + it('should handle two actors with init directive', async () => { const str = ` %%{init: {'logLevel': 0}}%% sequenceDiagram Alice->Bob: Hello Bob, how are you?`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1684,7 +1684,7 @@ Alice->Bob: Hello Bob, how are you?`; expect(bounds.stopx).toBe(conf.width * 2 + conf.actorMargin); expect(bounds.stopy).toBe(models.lastMessage().stopy + 10); }); - it('should handle two actors with init directive with multiline directive', function () { + it('should handle two actors with init directive with multiline directive', async () => { const str = ` %%{init: { 'logLevel': 0}}%% sequenceDiagram @@ -1693,7 +1693,7 @@ wrap }%% Alice->Bob: Hello Bob, how are you?`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const msgs = diagram.db.getMessages(); @@ -1706,7 +1706,7 @@ Alice->Bob: Hello Bob, how are you?`; expect(bounds.stopy).toBe(models.lastMessage().stopy + 10); expect(msgs.every((v) => v.wrap)).toBe(true); }); - it('should handle two actors and two centered shared notes', function () { + it('should handle two actors and two centered shared notes', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? @@ -1714,7 +1714,7 @@ Note over Alice,Bob: Looks Note over Bob,Alice: Looks back `; // mermaidAPI.initialize({logLevel:0}) - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1723,13 +1723,13 @@ Note over Bob,Alice: Looks back expect(bounds.stopx).toBe(conf.width * 2 + conf.actorMargin); expect(bounds.stopy).toBe(models.lastNote().stopy); }); - it('should draw two actors and two messages', function () { + it('should draw two actors and two messages', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? Bob->Alice: Fine!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1738,14 +1738,14 @@ Bob->Alice: Fine!`; expect(bounds.stopx).toBe(conf.width * 2 + conf.actorMargin); expect(bounds.stopy).toBe(models.lastMessage().stopy + 10); }); - it('should draw two actors notes to the right', function () { + it('should draw two actors notes to the right', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? Note right of Bob: Bob thinks Bob->Alice: Fine!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1757,14 +1757,14 @@ Bob->Alice: Fine!`; expect(bounds.stopx).toBe(expStopX); expect(bounds.stopy).toBe(models.lastMessage().stopy + 10); }); - it('should draw two actors notes to the left', function () { + it('should draw two actors notes to the left', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? Note left of Alice: Bob thinks Bob->Alice: Fine!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1774,14 +1774,14 @@ Bob->Alice: Fine!`; expect(bounds.stopx).toBe(conf.width * 2 + conf.actorMargin); expect(bounds.stopy).toBe(models.lastMessage().stopy + 10); }); - it('should draw two actors notes to the left with text wrapped (inline)', function () { + it('should draw two actors notes to the left with text wrapped (inline)', async () => { const str = ` sequenceDiagram Alice->>Bob:wrap: Hello Bob, how are you? If you are not available right now, I can leave you a message. Please get back to me as soon as you can! Note left of Alice: Bob thinks Bob->>Alice: Fine!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1793,7 +1793,7 @@ Bob->>Alice: Fine!`; expect(bounds.stopx).toBe(conf.width * 2 + conf.actorMargin); expect(bounds.stopy).toBe(models.lastMessage().stopy + 10); }); - it('should draw two actors notes to the left with text wrapped (directive)', function () { + it('should draw two actors notes to the left with text wrapped (directive)', async () => { const str = ` %%{init: { 'theme': 'dark' } }%% sequenceDiagram @@ -1802,7 +1802,7 @@ Alice->>Bob: Hello Bob, how are you? If you are not available right now, I can l Note left of Alice: Bob thinks Bob->>Alice: Fine!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1816,7 +1816,7 @@ Bob->>Alice: Fine!`; expect(bounds.stopx).toBe(conf.width * 2 + conf.actorMargin); expect(bounds.stopy).toBe(models.lastMessage().stopy + 10); }); - it('should draw two actors notes to the left with text wrapped and the init directive sets the theme to dark', function () { + it('should draw two actors notes to the left with text wrapped and the init directive sets the theme to dark', async () => { const str = ` %%{init:{'theme':'dark'}}%% sequenceDiagram @@ -1825,7 +1825,7 @@ Alice->>Bob: Hello Bob, how are you? If you are not available right now, I can l Note left of Alice: Bob thinks Bob->>Alice: Fine!`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1839,7 +1839,7 @@ Bob->>Alice: Fine!`; expect(bounds.stopx).toBe(conf.width * 2 + conf.actorMargin); expect(bounds.stopy).toBe(models.lastMessage().stopy + 10); }); - it('should draw two actors, notes to the left with text wrapped and the init directive sets the theme to dark and fontFamily to Menlo, fontSize to 18, and fontWeight to 800', function () { + it('should draw two actors, notes to the left with text wrapped and the init directive sets the theme to dark and fontFamily to Menlo, fontSize to 18, and fontWeight to 800', async () => { const str = ` %%{init: { "theme": "dark", 'config': { "fontFamily": "Menlo", "fontSize": 18, "messageFontWeight": 400, "wrap": true }}}%% sequenceDiagram @@ -1847,7 +1847,7 @@ Alice->>Bob: Hello Bob, how are you? If you are not available right now, I can l Note left of Alice: Bob thinks Bob->>Alice: Fine!`; // mermaidAPI.initialize({ logLevel: 0 }); - mermaidAPI.parse(str, diagram); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1864,14 +1864,14 @@ Bob->>Alice: Fine!`; expect(bounds.stopx).toBe(conf.width * 2 + conf.actorMargin); expect(bounds.stopy).toBe(models.lastMessage().stopy + 10); }); - it('should draw two loops', function () { + it('should draw two loops', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, how are you? loop Cheers Bob->Alice: Fine! end`; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1881,7 +1881,7 @@ end`; expect(bounds.stopx).toBe(conf.width * 2 + conf.actorMargin); expect(bounds.stopy).toBe(models.lastLoop().stopy); }); - it('should draw background rect', function () { + it('should draw background rect', async () => { const str = ` sequenceDiagram Alice->Bob: Hello Bob, are you alright? @@ -1889,7 +1889,7 @@ end`; Bob->Alice: I feel surrounded by darkness end `; - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); expect(bounds.startx).toBe(0); @@ -1900,7 +1900,7 @@ end`; }); }); -describe('when rendering a sequenceDiagram with actor mirror activated', function () { +describe('when rendering a sequenceDiagram with actor mirror activated', () => { beforeAll(() => { let conf = { diagramMarginX: 50, @@ -1931,14 +1931,14 @@ describe('when rendering a sequenceDiagram with actor mirror activated', functio diagram.renderer.bounds.init(); }); ['tspan', 'fo', 'old', undefined].forEach(function (textPlacement) { - it('should handle one actor, when textPlacement is' + textPlacement, function () { + it('should handle one actor, when textPlacement is' + textPlacement, async () => { mermaidAPI.initialize(addConf(conf, 'textPlacement', textPlacement)); diagram.renderer.bounds.init(); const str = ` sequenceDiagram participant Alice`; diagram.renderer.bounds.init(); - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); const { bounds, models } = diagram.renderer.bounds.getBounds(); @@ -1950,7 +1950,7 @@ participant Alice`; }); }); -describe('when rendering a sequenceDiagram with directives', function () { +describe('when rendering a sequenceDiagram with directives', () => { beforeAll(function () { let conf = { diagramMarginX: 50, @@ -1975,7 +1975,7 @@ describe('when rendering a sequenceDiagram with directives', function () { diagram.renderer.bounds.init(); }); - it('should handle one actor, when theme is dark and logLevel is 1 DX1 (dfg1)', function () { + it('should handle one actor, when theme is dark and logLevel is 1 DX1 (dfg1)', async () => { const str = ` %%{init: { "theme": "dark", "logLevel": 1 } }%% sequenceDiagram @@ -1985,7 +1985,7 @@ participant Alice diagram = new Diagram(str); diagram.renderer.bounds.init(); - mermaidAPI.parse(str); + await mermaidAPI.parse(str); diagram.renderer.draw(str, 'tst', '1.2.3', diagram); @@ -2000,7 +2000,7 @@ participant Alice models.lastActor().y + models.lastActor().height + mermaid.sequence.boxMargin ); }); - it('should handle one actor, when logLevel is 3 (dfg0)', function () { + it('should handle one actor, when logLevel is 3 (dfg0)', async () => { const str = ` %%{initialize: { "logLevel": 3 }}%% sequenceDiagram @@ -2020,7 +2020,7 @@ participant Alice models.lastActor().y + models.lastActor().height + mermaid.sequence.boxMargin ); }); - it('should hide sequence numbers when autonumber is removed when autonumber is enabled', function () { + it('should hide sequence numbers when autonumber is removed when autonumber is enabled', async () => { const str1 = ` sequenceDiagram autonumber @@ -2028,7 +2028,7 @@ Alice->Bob:Hello Bob, how are you? Note right of Bob: Bob thinks Bob-->Alice: I am good thanks!`; - mermaidAPI.parse(str1, diagram); + await mermaidAPI.parse(str1); diagram.renderer.draw(str1, 'tst', '1.2.3', diagram); // needs to be rendered for the correct value of visibility auto numbers expect(diagram.db.showSequenceNumbers()).toBe(true); @@ -2038,7 +2038,7 @@ Alice->Bob:Hello Bob, how are you? Note right of Bob: Bob thinks Bob-->Alice: I am good thanks!`; - mermaidAPI.parse(str2, diagram); + await mermaidAPI.parse(str2); diagram.renderer.draw(str2, 'tst', '1.2.3', diagram); expect(diagram.db.showSequenceNumbers()).toBe(false); }); diff --git a/packages/mermaid/src/mermaid.spec.ts b/packages/mermaid/src/mermaid.spec.ts index f9709510e..f50661dcf 100644 --- a/packages/mermaid/src/mermaid.spec.ts +++ b/packages/mermaid/src/mermaid.spec.ts @@ -6,12 +6,12 @@ const spyOn = vi.spyOn; vi.mock('./mermaidAPI'); afterEach(() => { - vi.restoreAllMocks(); + vi.clearAllMocks(); }); -describe('when using mermaid and ', function () { - describe('when detecting chart type ', function () { - it('should not start rendering with mermaid.startOnLoad set to false', function () { +describe('when using mermaid and ', () => { + describe('when detecting chart type ', () => { + it('should not start rendering with mermaid.startOnLoad set to false', async () => { mermaid.startOnLoad = false; document.body.innerHTML = '
graph TD;\na;
'; spyOn(mermaid, 'init'); @@ -19,7 +19,7 @@ describe('when using mermaid and ', function () { expect(mermaid.init).not.toHaveBeenCalled(); }); - it('should start rendering with both startOnLoad set', function () { + it('should start rendering with both startOnLoad set', async () => { mermaid.startOnLoad = true; document.body.innerHTML = '
graph TD;\na;
'; spyOn(mermaid, 'init'); @@ -27,7 +27,7 @@ describe('when using mermaid and ', function () { expect(mermaid.init).toHaveBeenCalled(); }); - it('should start rendering with mermaid.startOnLoad', function () { + it('should start rendering with mermaid.startOnLoad', async () => { mermaid.startOnLoad = true; document.body.innerHTML = '
graph TD;\na;
'; spyOn(mermaid, 'init'); @@ -35,7 +35,7 @@ describe('when using mermaid and ', function () { expect(mermaid.init).toHaveBeenCalled(); }); - it('should start rendering as a default with no changes performed', function () { + it('should start rendering as a default with no changes performed', async () => { document.body.innerHTML = '
graph TD;\na;
'; spyOn(mermaid, 'init'); mermaid.contentLoaded(); @@ -43,7 +43,7 @@ describe('when using mermaid and ', function () { }); }); - describe('when using #initThrowsErrors', function () { + describe('when using #initThrowsErrors', () => { it('should accept single node', async () => { const node = document.createElement('div'); node.appendChild(document.createTextNode('graph TD;\na;')); @@ -54,7 +54,8 @@ describe('when using mermaid and ', function () { expect(mermaidAPI.render).toHaveBeenCalled(); }); }); - describe('when using #registerExternalDiagrams', function () { + + describe('when using #registerExternalDiagrams', () => { it('should throw error (but still render) if registerExternalDiagrams fails', async () => { const node = document.createElement('div'); node.appendChild(document.createTextNode('graph TD;\na;')); @@ -137,19 +138,21 @@ describe('when using mermaid and ', function () { }); }); - describe('checking validity of input ', function () { - it('should throw for an invalid definition', function () { - expect(() => mermaid.parse('this is not a mermaid diagram definition')).toThrow(); + describe('checking validity of input ', () => { + it('should throw for an invalid definition', async () => { + await expect(mermaid.parse('this is not a mermaid diagram definition')).rejects.toThrow(); }); - it('should not throw for a valid flow definition', function () { - expect(() => mermaid.parse('graph TD;A--x|text including URL space|B;')).not.toThrow(); + it('should not throw for a valid flow definition', async () => { + await expect( + mermaid.parse('graph TD;A--x|text including URL space|B;') + ).resolves.not.toThrow(); }); - it('should throw for an invalid flow definition', function () { - expect(() => mermaid.parse('graph TQ;A--x|text including URL space|B;')).toThrow(); + it('should throw for an invalid flow definition', async () => { + await expect(mermaid.parse('graph TQ;A--x|text including URL space|B;')).rejects.toThrow(); }); - it('should not throw for a valid sequenceDiagram definition (mmds1)', function () { + it('should not throw for a valid sequenceDiagram definition (mmds1)', async () => { const text = 'sequenceDiagram\n' + 'Alice->Bob: Hello Bob, how are you?\n\n' + @@ -160,10 +163,10 @@ describe('when using mermaid and ', function () { 'else isSick\n' + 'Bob-->Alice: Feel sick...\n' + 'end'; - expect(() => mermaid.parse(text)).not.toThrow(); + await expect(mermaid.parse(text)).resolves.not.toThrow(); }); - it('should throw for an invalid sequenceDiagram definition', function () { + it('should throw for an invalid sequenceDiagram definition', async () => { const text = 'sequenceDiagram\n' + 'Alice:->Bob: Hello Bob, how are you?\n\n' + @@ -174,15 +177,15 @@ describe('when using mermaid and ', function () { 'else isSick\n' + 'Bob-->Alice: Feel sick...\n' + 'end'; - expect(() => mermaid.parse(text)).toThrow(); + await expect(mermaid.parse(text)).rejects.toThrow(); }); - it('should return false for invalid definition WITH a parseError() callback defined', function () { + it('should return false for invalid definition WITH a parseError() callback defined', async () => { let parseErrorWasCalled = false; mermaid.setParseErrorHandler(() => { parseErrorWasCalled = true; }); - expect(mermaid.parse('this is not a mermaid diagram definition')).toEqual(false); + await expect(mermaid.parse('this is not a mermaid diagram definition')).rejects.toThrow(); expect(parseErrorWasCalled).toEqual(true); }); }); diff --git a/packages/mermaid/src/mermaidAPI.spec.ts b/packages/mermaid/src/mermaidAPI.spec.ts index e86b9b15f..b16237866 100644 --- a/packages/mermaid/src/mermaidAPI.spec.ts +++ b/packages/mermaid/src/mermaidAPI.spec.ts @@ -76,7 +76,7 @@ import { compile, serialize } from 'stylis'; // ------------------------------------------------------------------------------------- -describe('mermaidAPI', function () { +describe('mermaidAPI', () => { describe('encodeEntities', () => { it('removes the ending ; from style [text1]:[optional word]#[text2]; with ', () => { const text = 'style this; is ; everything :something#not-nothing; and this too;'; @@ -515,13 +515,13 @@ describe('mermaidAPI', function () { }); }); - describe('initialize', function () { - beforeEach(function () { + describe('initialize', () => { + beforeEach(() => { document.body.innerHTML = ''; mermaidAPI.globalReset(); }); - it('copies a literal into the configuration', function () { + it('copies a literal into the configuration', () => { const orgConfig: any = mermaidAPI.getConfig(); expect(orgConfig.testLiteral).toBe(undefined); @@ -533,7 +533,7 @@ describe('mermaidAPI', function () { expect(config.testLiteral).toBe(true); }); - it('copies an object into the configuration', function () { + it('copies an object into the configuration', () => { const orgConfig: any = mermaidAPI.getConfig(); expect(orgConfig.testObject).toBe(undefined); @@ -559,7 +559,7 @@ describe('mermaidAPI', function () { expect(config.testObject.test3).toBe(true); }); - it('resets mermaid config to global defaults', function () { + it('resets mermaid config to global defaults', () => { const config = { logLevel: 0, securityLevel: 'loose', @@ -576,7 +576,7 @@ describe('mermaidAPI', function () { expect(mermaidAPI.getConfig().securityLevel).toBe('strict'); }); - it('prevents changes to site defaults (sneaky)', function () { + it('prevents changes to site defaults (sneaky)', () => { const config: any = { logLevel: 0, }; @@ -584,7 +584,7 @@ describe('mermaidAPI', function () { const siteConfig = mermaidAPI.getSiteConfig(); expect(mermaidAPI.getConfig().logLevel).toBe(0); config.secure = { - toString: function () { + toString: () => { mermaidAPI.initialize({ securityLevel: 'loose' }); }, }; @@ -595,7 +595,7 @@ describe('mermaidAPI', function () { expect(mermaidAPI.getSiteConfig()).toEqual(siteConfig); expect(mermaidAPI.getConfig()).toEqual(siteConfig); }); - it('prevents clobbering global defaults (direct)', function () { + it('prevents clobbering global defaults (direct)', () => { const config = assignWithDepth({}, mermaidAPI.defaultConfig); assignWithDepth(config, { logLevel: 0 }); @@ -611,7 +611,7 @@ describe('mermaidAPI', function () { ); expect(mermaidAPI.defaultConfig['logLevel']).toBe(5); }); - it('prevents changes to global defaults (direct)', function () { + it('prevents changes to global defaults (direct)', () => { let error: any = { message: '' }; try { mermaidAPI.defaultConfig['logLevel'] = 0; @@ -623,7 +623,7 @@ describe('mermaidAPI', function () { ); expect(mermaidAPI.defaultConfig['logLevel']).toBe(5); }); - it('prevents sneaky changes to global defaults (assignWithDepth)', function () { + it('prevents sneaky changes to global defaults (assignWithDepth)', () => { const config = { logLevel: 0, }; @@ -640,48 +640,61 @@ describe('mermaidAPI', function () { }); }); - describe('dompurify config', function () { - it('allows dompurify config to be set', function () { + describe('dompurify config', () => { + it('allows dompurify config to be set', () => { mermaidAPI.initialize({ dompurifyConfig: { ADD_ATTR: ['onclick'] } }); expect(mermaidAPI!.getConfig()!.dompurifyConfig!.ADD_ATTR).toEqual(['onclick']); }); }); - describe('parse', function () { + describe('parse', () => { mermaid.parseError = undefined; // ensure it parseError undefined - it('throws for an invalid definition (with no mermaid.parseError() defined)', function () { + it('throws for an invalid definition (with no mermaid.parseError() defined)', async () => { expect(mermaid.parseError).toEqual(undefined); - expect(() => mermaidAPI.parse('this is not a mermaid diagram definition')).toThrow(); + await expect( + mermaidAPI.parse('this is not a mermaid diagram definition') + ).rejects.toThrowError(); }); - it('throws for a nicer error for a invalid definition starting with `---`', function () { + it('throws for a nicer error for a invalid definition starting with `---`', async () => { expect(mermaid.parseError).toEqual(undefined); - expect(() => + await expect( mermaidAPI.parse(` --- title: a malformed YAML front-matter `) - ).toThrow( + ).rejects.toThrow( 'Diagrams beginning with --- are not valid. ' + 'If you were trying to use a YAML front-matter, please ensure that ' + "you've correctly opened and closed the YAML front-matter with unindented `---` blocks" ); }); - it('does not throw for a valid definition', function () { - expect(() => mermaidAPI.parse('graph TD;A--x|text including URL space|B;')).not.toThrow(); + it('does not throw for a valid definition', async () => { + await expect( + mermaidAPI.parse('graph TD;A--x|text including URL space|B;') + ).resolves.not.toThrow(); }); - it('returns false for invalid definition WITH a parseError() callback defined', function () { - let parseErrorWasCalled = false; - // also test setParseErrorHandler() call working to set mermaid.parseError - expect( - mermaidAPI.parse('this is not a mermaid diagram definition', () => { - parseErrorWasCalled = true; - }) - ).toEqual(false); - expect(parseErrorWasCalled).toEqual(true); + it('throws for invalid definition', async () => { + await expect( + mermaidAPI.parse('this is not a mermaid diagram definition') + ).rejects.toThrowErrorMatchingInlineSnapshot( + '"No diagram type detected for text: this is not a mermaid diagram definition"' + ); }); - it('returns true for valid definition', function () { - expect(mermaidAPI.parse('graph TD;A--x|text including URL space|B;')).toEqual(true); + it('returns false for invalid definition with silent option', async () => { + await expect( + mermaidAPI.parse('this is not a mermaid diagram definition', { silent: true }) + ).resolves.toBe(false); + }); + it('resolves for valid definition', async () => { + await expect( + mermaidAPI.parse('graph TD;A--x|text including URL space|B;') + ).resolves.not.toThrow(); + }); + it('returns true for valid definition with silent option', async () => { + await expect( + mermaidAPI.parse('graph TD;A--x|text including URL space|B;', { silent: true }) + ).resolves.toBe(true); }); }); From 735aceb37a3a5907c97e9de0ca243fa6ae1b31a4 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 19 Feb 2023 14:03:11 +0530 Subject: [PATCH 259/309] Fix E2E Tests --- .vite/server.ts | 10 +--- cypress/platform/bundle-test.js | 16 ++---- cypress/platform/class.html | 4 +- cypress/platform/click_security_loose.html | 4 +- cypress/platform/click_security_other.html | 4 +- cypress/platform/click_security_sandbox.html | 4 +- cypress/platform/click_security_strict.html | 4 +- cypress/platform/css1.html | 4 +- cypress/platform/current2.html | 4 +- cypress/platform/e2e.html | 38 +------------ cypress/platform/flow.html | 4 +- cypress/platform/ghsa1.html | 14 ++--- cypress/platform/ghsa2.html | 6 +- cypress/platform/ghsa3.html | 16 +++--- cypress/platform/git-graph.html | 4 +- cypress/platform/gitgraph.html | 4 +- cypress/platform/gitgraph2.html | 4 +- cypress/platform/huge.html | 4 +- cypress/platform/info.html | 4 +- cypress/platform/interaction.html | 4 +- cypress/platform/per.html | 2 +- cypress/platform/regression/issue-1874.html | 18 +++--- cypress/platform/render-after-error.html | 15 +++-- cypress/platform/rerender.html | 16 +++--- cypress/platform/showcase_base.html | 4 +- cypress/platform/showcase_base_dark.html | 4 +- cypress/platform/showcase_dark.html | 4 +- cypress/platform/showcase_default.html | 4 +- cypress/platform/showcase_forest.html | 4 +- cypress/platform/showcase_neutral.html | 4 +- cypress/platform/sidv.html | 6 -- cypress/platform/subgraph.html | 4 +- cypress/platform/theme-directives.html | 4 +- cypress/platform/user-journey.html | 4 +- cypress/platform/vertices.html | 4 +- cypress/platform/viewer.js | 29 +++------- cypress/platform/xss.html | 4 +- cypress/platform/xss10.html | 11 ++-- cypress/platform/xss11.html | 11 ++-- cypress/platform/xss12.html | 11 ++-- cypress/platform/xss13.html | 11 ++-- cypress/platform/xss14.html | 11 ++-- cypress/platform/xss15.html | 11 ++-- cypress/platform/xss16.html | 11 ++-- cypress/platform/xss17.html | 11 ++-- cypress/platform/xss18.html | 11 ++-- cypress/platform/xss19.html | 11 ++-- cypress/platform/xss2.html | 6 +- cypress/platform/xss20.html | 10 ++-- cypress/platform/xss21.html | 12 ++-- cypress/platform/xss22.html | 4 +- cypress/platform/xss3.html | 4 +- cypress/platform/xss4.html | 9 ++- cypress/platform/xss5.html | 11 ++-- cypress/platform/xss6.html | 11 ++-- cypress/platform/xss7.html | 11 ++-- cypress/platform/xss8.html | 11 ++-- cypress/platform/xss9.html | 11 ++-- demos/c4context.html | 22 +++---- demos/classchart.html | 4 +- demos/dataflowchart.html | 4 +- demos/er.html | 2 +- demos/flowchart.html | 4 +- demos/gantt.html | 4 +- demos/git.html | 4 +- demos/journey.html | 4 +- demos/requirements.html | 4 +- demos/sequence.html | 4 +- demos/state.html | 4 +- demos/timeline.html | 4 +- docs/config/usage.md | 4 +- package.json | 4 +- packages/mermaid/src/docs/config/usage.md | 4 +- pnpm-lock.yaml | 60 +++++++++++++++++++- 74 files changed, 298 insertions(+), 334 deletions(-) diff --git a/.vite/server.ts b/.vite/server.ts index 0f1fef91d..6f8959348 100644 --- a/.vite/server.ts +++ b/.vite/server.ts @@ -1,13 +1,7 @@ -import express, { NextFunction, Request, Response } from 'express'; +import express from 'express'; +import cors from 'cors'; import { createServer as createViteServer } from 'vite'; -const cors = (req: Request, res: Response, next: NextFunction) => { - res.header('Access-Control-Allow-Origin', '*'); - res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); - res.header('Access-Control-Allow-Headers', 'Content-Type'); - - next(); -}; async function createServer() { const app = express(); diff --git a/cypress/platform/bundle-test.js b/cypress/platform/bundle-test.js index a991918c4..edd3dfbc4 100644 --- a/cypress/platform/bundle-test.js +++ b/cypress/platform/bundle-test.js @@ -49,13 +49,9 @@ mermaid.initialize({ ], }, }); -mermaid.render( - 'the-id-of-the-svg', - code, - (svg) => { - console.log(svg); - const elem = document.querySelector('#graph-to-be'); - elem.innerHTML = svg; - } - // ,document.querySelector('#tmp') -); +void (async () => { + const { svg } = await mermaid.render('the-id-of-the-svg', code); + console.log(svg); + const elem = document.querySelector('#graph-to-be'); + elem.innerHTML = svg; +})(); diff --git a/cypress/platform/class.html b/cypress/platform/class.html index 1d72c34a5..052dd18b9 100644 --- a/cypress/platform/class.html +++ b/cypress/platform/class.html @@ -113,8 +113,8 @@ classE o-- classF : aggregation callback Shape "callbackFunction" "This is a tooltip for a callback"
- - + diff --git a/cypress/platform/click_security_other.html b/cypress/platform/click_security_other.html index 5338cac06..7dc75ea88 100644 --- a/cypress/platform/click_security_other.html +++ b/cypress/platform/click_security_other.html @@ -59,8 +59,8 @@ Add another diagram to demo page : 48h
- - - - - - - - - - - + diff --git a/cypress/platform/flow.html b/cypress/platform/flow.html index ed70f80d0..0060ac3cb 100644 --- a/cypress/platform/flow.html +++ b/cypress/platform/flow.html @@ -29,8 +29,8 @@ click a_a "http://www.aftonbladet.se" "apa"
- - - - - diff --git a/cypress/platform/git-graph.html b/cypress/platform/git-graph.html index da6025f4b..4cb2656f1 100644 --- a/cypress/platform/git-graph.html +++ b/cypress/platform/git-graph.html @@ -43,8 +43,8 @@ cssClass "BankAccount" customCss
- - - - - - - - + - -

Example

@@ -26,4 +16,12 @@ sequenceDiagram
     Note left of Ernie: Cookies are good
     
+ diff --git a/cypress/platform/render-after-error.html b/cypress/platform/render-after-error.html index f5165e0ee..72ccac34c 100644 --- a/cypress/platform/render-after-error.html +++ b/cypress/platform/render-after-error.html @@ -9,19 +9,18 @@
- - diff --git a/cypress/platform/rerender.html b/cypress/platform/rerender.html index ab1b8e009..44ffd8fa8 100644 --- a/cypress/platform/rerender.html +++ b/cypress/platform/rerender.html @@ -9,20 +9,20 @@
- - diff --git a/cypress/platform/showcase_base.html b/cypress/platform/showcase_base.html index 227d79cf7..32a2ae72a 100644 --- a/cypress/platform/showcase_base.html +++ b/cypress/platform/showcase_base.html @@ -313,8 +313,8 @@ requirementDiagram merge release
- - - - - - - - - - - - - - diff --git a/cypress/platform/xss11.html b/cypress/platform/xss11.html index ca97aeaab..302f39ee9 100644 --- a/cypress/platform/xss11.html +++ b/cypress/platform/xss11.html @@ -49,8 +49,8 @@
- - diff --git a/cypress/platform/xss12.html b/cypress/platform/xss12.html index eb1bce327..b1e2c1d0a 100644 --- a/cypress/platform/xss12.html +++ b/cypress/platform/xss12.html @@ -49,8 +49,8 @@
- - diff --git a/cypress/platform/xss13.html b/cypress/platform/xss13.html index f2d90cddb..9f505ea7b 100644 --- a/cypress/platform/xss13.html +++ b/cypress/platform/xss13.html @@ -49,8 +49,8 @@
- - diff --git a/cypress/platform/xss14.html b/cypress/platform/xss14.html index f429b355a..e68b87b78 100644 --- a/cypress/platform/xss14.html +++ b/cypress/platform/xss14.html @@ -49,8 +49,8 @@
- - diff --git a/cypress/platform/xss15.html b/cypress/platform/xss15.html index 70ebe9f86..3fa6b7151 100644 --- a/cypress/platform/xss15.html +++ b/cypress/platform/xss15.html @@ -49,8 +49,8 @@
- - diff --git a/cypress/platform/xss16.html b/cypress/platform/xss16.html index 9325a70aa..6f8a734eb 100644 --- a/cypress/platform/xss16.html +++ b/cypress/platform/xss16.html @@ -49,8 +49,8 @@
- - diff --git a/cypress/platform/xss17.html b/cypress/platform/xss17.html index c498f3f3e..bd7e1c57e 100644 --- a/cypress/platform/xss17.html +++ b/cypress/platform/xss17.html @@ -49,8 +49,8 @@
- - diff --git a/cypress/platform/xss18.html b/cypress/platform/xss18.html index 3e9cfd35c..ccacfadbb 100644 --- a/cypress/platform/xss18.html +++ b/cypress/platform/xss18.html @@ -49,8 +49,8 @@
- - diff --git a/cypress/platform/xss19.html b/cypress/platform/xss19.html index ca747b39e..7966abb8c 100644 --- a/cypress/platform/xss19.html +++ b/cypress/platform/xss19.html @@ -49,8 +49,8 @@
- - diff --git a/cypress/platform/xss2.html b/cypress/platform/xss2.html index 18b4be6fc..da95e3797 100644 --- a/cypress/platform/xss2.html +++ b/cypress/platform/xss2.html @@ -48,8 +48,8 @@ Alice->>Bob: Hi Bob Bob->>Alice: Hi Alice - - - diff --git a/cypress/platform/xss21.html b/cypress/platform/xss21.html index b2f67cd93..7cfa17c9e 100644 --- a/cypress/platform/xss21.html +++ b/cypress/platform/xss21.html @@ -49,8 +49,8 @@
- - diff --git a/cypress/platform/xss22.html b/cypress/platform/xss22.html index d7e47cd02..50ff3b732 100644 --- a/cypress/platform/xss22.html +++ b/cypress/platform/xss22.html @@ -8,8 +8,8 @@ graph TD A --> B["<a href='javascript#9;t#colon;alert(document.location)'>AAA</a>"] - - diff --git a/cypress/platform/xss3.html b/cypress/platform/xss3.html index 78fabc4aa..f01aab37e 100644 --- a/cypress/platform/xss3.html +++ b/cypress/platform/xss3.html @@ -36,8 +36,8 @@ graph LR A --> B - - - diff --git a/cypress/platform/xss5.html b/cypress/platform/xss5.html index f87e65505..f7abf7a45 100644 --- a/cypress/platform/xss5.html +++ b/cypress/platform/xss5.html @@ -49,8 +49,8 @@
- - diff --git a/cypress/platform/xss6.html b/cypress/platform/xss6.html index bc0f78561..7d7ae18d1 100644 --- a/cypress/platform/xss6.html +++ b/cypress/platform/xss6.html @@ -49,8 +49,8 @@
- - diff --git a/cypress/platform/xss7.html b/cypress/platform/xss7.html index d8b2a7620..177b4342c 100644 --- a/cypress/platform/xss7.html +++ b/cypress/platform/xss7.html @@ -49,8 +49,8 @@
- - diff --git a/cypress/platform/xss8.html b/cypress/platform/xss8.html index cf2969f39..5852c2693 100644 --- a/cypress/platform/xss8.html +++ b/cypress/platform/xss8.html @@ -49,8 +49,8 @@
- - diff --git a/cypress/platform/xss9.html b/cypress/platform/xss9.html index 916f1506d..cf2ad1359 100644 --- a/cypress/platform/xss9.html +++ b/cypress/platform/xss9.html @@ -49,8 +49,8 @@
- - diff --git a/demos/c4context.html b/demos/c4context.html index e085e611c..cf358b550 100644 --- a/demos/c4context.html +++ b/demos/c4context.html @@ -217,8 +217,8 @@
- - - - diff --git a/demos/classchart.html b/demos/classchart.html index e8e48e482..b20dda2a3 100644 --- a/demos/classchart.html +++ b/demos/classchart.html @@ -154,8 +154,8 @@
- - - - - - - - - - - - - diff --git a/package.json b/package.json index ddbb61381..8e4c50118 100644 --- a/package.json +++ b/package.json @@ -58,8 +58,9 @@ "@commitlint/cli": "^17.2.0", "@commitlint/config-conventional": "^17.2.0", "@cspell/eslint-plugin": "^6.14.2", + "@types/cors": "^2.8.13", "@types/eslint": "^8.4.10", - "@types/express": "^4.17.14", + "@types/express": "^4.17.17", "@types/js-yaml": "^4.0.5", "@types/jsdom": "^21.0.0", "@types/lodash": "^4.14.188", @@ -73,6 +74,7 @@ "@vitest/spy": "^0.28.4", "@vitest/ui": "^0.28.4", "concurrently": "^7.5.0", + "cors": "^2.8.5", "coveralls": "^3.1.1", "cypress": "^12.0.0", "cypress-image-snapshot": "^4.0.1", diff --git a/packages/mermaid/src/docs/config/usage.md b/packages/mermaid/src/docs/config/usage.md index c805c623a..dd989069f 100644 --- a/packages/mermaid/src/docs/config/usage.md +++ b/packages/mermaid/src/docs/config/usage.md @@ -327,8 +327,8 @@ The future proof way of setting the configuration is by using the initialization on what kind of integration you use. ```html - - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cf6d9c342..c99933c35 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,12 +16,15 @@ importers: '@cspell/eslint-plugin': specifier: ^6.14.2 version: 6.14.2 + '@types/cors': + specifier: ^2.8.13 + version: 2.8.13 '@types/eslint': specifier: ^8.4.10 version: 8.4.10 '@types/express': - specifier: ^4.17.14 - version: 4.17.14 + specifier: ^4.17.17 + version: 4.17.17 '@types/js-yaml': specifier: ^4.0.5 version: 4.0.5 @@ -61,6 +64,9 @@ importers: concurrently: specifier: ^7.5.0 version: 7.5.0 + cors: + specifier: ^2.8.5 + version: 2.8.5 coveralls: specifier: ^3.1.1 version: 3.1.1 @@ -2650,6 +2656,12 @@ packages: '@types/node': 18.11.9 dev: true + /@types/cors/2.8.13: + resolution: {integrity: sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==} + dependencies: + '@types/node': 18.11.9 + dev: true + /@types/cytoscape/3.19.9: resolution: {integrity: sha512-oqCx0ZGiBO0UESbjgq052vjDAy2X53lZpMrWqiweMpvVwKw/2IiYDdzPFK6+f4tMfdv9YKEM9raO5bAZc3UYBg==} dev: true @@ -2875,6 +2887,14 @@ packages: '@types/range-parser': 1.2.4 dev: true + /@types/express-serve-static-core/4.17.33: + resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} + dependencies: + '@types/node': 18.11.9 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 + dev: true + /@types/express/4.17.14: resolution: {integrity: sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==} dependencies: @@ -2884,6 +2904,15 @@ packages: '@types/serve-static': 1.15.0 dev: true + /@types/express/4.17.17: + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + dependencies: + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.33 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.0 + dev: true + /@types/flexsearch/0.7.3: resolution: {integrity: sha512-HXwADeHEP4exXkCIwy2n1+i0f1ilP1ETQOH5KDOugjkTFZPntWo0Gr8stZOaebkxsdx+k0X/K6obU/+it07ocg==} dev: true @@ -4222,7 +4251,7 @@ packages: /axios/0.27.2_debug@4.3.4: resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} dependencies: - follow-redirects: 1.15.2_debug@4.3.2 + follow-redirects: 1.15.2_debug@4.3.4 form-data: 4.0.0 transitivePeerDependencies: - debug @@ -4965,6 +4994,14 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true + /cors/2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: true + /cose-base/1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} dependencies: @@ -6791,6 +6828,18 @@ packages: debug: 4.3.2 dev: true + /follow-redirects/1.15.2_debug@4.3.4: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.4 + dev: true + /foreground-child/2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} engines: {node: '>=8.0.0'} @@ -9466,6 +9515,11 @@ packages: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} dev: true + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + /object-inspect/1.12.2: resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} dev: true From 6aa3ea43ae4975b6bb03015e4e72aa97d7f9b8fe Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 19 Feb 2023 14:13:30 +0530 Subject: [PATCH 260/309] Remove Readme --- packages/mermaid/README.md | 346 ------------------------------- packages/mermaid/README.zh-CN.md | 334 ----------------------------- 2 files changed, 680 deletions(-) delete mode 100644 packages/mermaid/README.md delete mode 100644 packages/mermaid/README.zh-CN.md diff --git a/packages/mermaid/README.md b/packages/mermaid/README.md deleted file mode 100644 index d453d2ec0..000000000 --- a/packages/mermaid/README.md +++ /dev/null @@ -1,346 +0,0 @@ -# mermaid - -[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/twitter/follow/mermaidjs_?style=social)](https://twitter.com/mermaidjs_) - -English | [简体中文](./README.zh-CN.md) - - - -:trophy: **Mermaid was nominated and won the [JS Open Source Awards (2019)](https://osawards.com/javascript/2019) in the category "The most exciting use of technology"!!!** - -**Thanks to all involved, people committing pull requests, people answering questions! 🙏** - -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! - -## About - - - -Mermaid is a JavaScript-based diagramming and charting tool that uses Markdown-inspired text definitions and a renderer to create and modify complex diagrams. The main purpose of Mermaid is to help documentation catch up with development. - -> Doc-Rot is a Catch-22 that Mermaid helps to solve. - -Diagramming and documentation costs precious developer time and gets outdated quickly. -But not having diagrams or docs ruins productivity and hurts organizational learning.
-Mermaid addresses this problem by enabling users to create easily modifiable diagrams. It can also be made part of production scripts (and other pieces of code).
-
- -Mermaid allows even non-programmers to easily create detailed diagrams through the [Mermaid Live Editor](https://mermaid.live/).
-[Tutorials](./docs/Tutorials.md) has video tutorials. -Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](./docs/integrations.md). - -You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](./docs/integrations.md). - -For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](./docs/n00b-overview.md), [Usage](./docs/usage.md) and [Tutorials](./docs/Tutorials.md). - -🌐 [CDN](https://www.jsdelivr.com/package/npm/mermaid) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md) | 📜 [Changelog](./docs/CHANGELOG.md) - -In our release process we rely heavily on visual regression tests using [applitools](https://applitools.com/). Applitools is a great service which has been easy to use and integrate with our tests. - - - - - - - -## Examples - -**The following are some examples of the diagrams, charts and graphs that can be made using Mermaid. Click here to jump into the [text syntax](https://mermaid-js.github.io/mermaid/#/n00b-syntaxReference).** - - - -### Flowchart [docs - live editor] - -``` -flowchart LR - -A[Hard] -->|Text| B(Round) -B --> C{Decision} -C -->|One| D[Result 1] -C -->|Two| E[Result 2] -``` - -```mermaid -flowchart LR - -A[Hard] -->|Text| B(Round) -B --> C{Decision} -C -->|One| D[Result 1] -C -->|Two| E[Result 2] -``` - -### Sequence diagram [docs - live editor] - -``` -sequenceDiagram -Alice->>John: Hello John, how are you? -loop Healthcheck - John->>John: Fight against hypochondria -end -Note right of John: Rational thoughts! -John-->>Alice: Great! -John->>Bob: How about you? -Bob-->>John: Jolly good! -``` - -```mermaid -sequenceDiagram -Alice->>John: Hello John, how are you? -loop Healthcheck - John->>John: Fight against hypochondria -end -Note right of John: Rational thoughts! -John-->>Alice: Great! -John->>Bob: How about you? -Bob-->>John: Jolly good! -``` - -### Gantt chart [docs - live editor] - -``` -gantt - section Section - Completed :done, des1, 2014-01-06,2014-01-08 - Active :active, des2, 2014-01-07, 3d - Parallel 1 : des3, after des1, 1d - Parallel 2 : des4, after des1, 1d - Parallel 3 : des5, after des3, 1d - Parallel 4 : des6, after des4, 1d -``` - -```mermaid -gantt - section Section - Completed :done, des1, 2014-01-06,2014-01-08 - Active :active, des2, 2014-01-07, 3d - Parallel 1 : des3, after des1, 1d - Parallel 2 : des4, after des1, 1d - Parallel 3 : des5, after des3, 1d - Parallel 4 : des6, after des4, 1d -``` - -### Class diagram [docs - live editor] - -``` -classDiagram -Class01 <|-- AveryLongClass : Cool -<> Class01 -Class09 --> C2 : Where am I? -Class09 --* C3 -Class09 --|> Class07 -Class07 : equals() -Class07 : Object[] elementData -Class01 : size() -Class01 : int chimp -Class01 : int gorilla -class Class10 { - <> - int id - size() -} -``` - -```mermaid -classDiagram -Class01 <|-- AveryLongClass : Cool -<> Class01 -Class09 --> C2 : Where am I? -Class09 --* C3 -Class09 --|> Class07 -Class07 : equals() -Class07 : Object[] elementData -Class01 : size() -Class01 : int chimp -Class01 : int gorilla -class Class10 { - <> - int id - size() -} -``` - -### State diagram [docs - live editor] - -``` -stateDiagram-v2 -[*] --> Still -Still --> [*] -Still --> Moving -Moving --> Still -Moving --> Crash -Crash --> [*] -``` - -```mermaid -stateDiagram-v2 -[*] --> Still -Still --> [*] -Still --> Moving -Moving --> Still -Moving --> Crash -Crash --> [*] -``` - -### Pie chart [docs - live editor] - -``` -pie -"Dogs" : 386 -"Cats" : 85.9 -"Rats" : 15 -``` - -```mermaid -pie -"Dogs" : 386 -"Cats" : 85.9 -"Rats" : 15 -``` - -### Git graph [experimental - live editor] - -### User Journey diagram [docs - live editor] - -``` - journey - title My working day - section Go to work - Make tea: 5: Me - Go upstairs: 3: Me - Do work: 1: Me, Cat - section Go home - Go downstairs: 5: Me - Sit down: 3: Me -``` - -```mermaid - journey - title My working day - section Go to work - Make tea: 5: Me - Go upstairs: 3: Me - Do work: 1: Me, Cat - section Go home - Go downstairs: 5: Me - Sit down: 3: Me -``` - -### C4 diagram [docs] - -``` -C4Context -title System Context diagram for Internet Banking System - -Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.") -Person(customerB, "Banking Customer B") -Person_Ext(customerC, "Banking Customer C") -System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.") - -Person(customerD, "Banking Customer D", "A customer of the bank,
with personal bank accounts.") - -Enterprise_Boundary(b1, "BankBoundary") { - - SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") - - System_Boundary(b2, "BankBoundary2") { - System(SystemA, "Banking System A") - System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.") - } - - System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") - SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.") - - Boundary(b3, "BankBoundary3", "boundary") { - SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.") - SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.") - } -} - -BiRel(customerA, SystemAA, "Uses") -BiRel(SystemAA, SystemE, "Uses") -Rel(SystemAA, SystemC, "Sends e-mails", "SMTP") -Rel(SystemC, customerA, "Sends e-mails to") -``` - -```mermaid -C4Context -title System Context diagram for Internet Banking System - -Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.") -Person(customerB, "Banking Customer B") -Person_Ext(customerC, "Banking Customer C") -System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.") - -Person(customerD, "Banking Customer D", "A customer of the bank,
with personal bank accounts.") - -Enterprise_Boundary(b1, "BankBoundary") { - - SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") - - System_Boundary(b2, "BankBoundary2") { - System(SystemA, "Banking System A") - System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.") - } - - System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") - SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.") - - Boundary(b3, "BankBoundary3", "boundary") { - SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.") - SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.") - } -} - -BiRel(customerA, SystemAA, "Uses") -BiRel(SystemAA, SystemE, "Uses") -Rel(SystemAA, SystemC, "Sends e-mails", "SMTP") -Rel(SystemC, customerA, "Sends e-mails to") -``` - -## Release - -For those who have the permission to do so: - -Update version number in `package.json`. - -```sh -npm publish -``` - -The above command generates files into the `dist` folder and publishes them to npmjs.org. - -## Related projects - -- [Command Line Interface](https://github.com/mermaid-js/mermaid-cli) -- [Live Editor](https://github.com/mermaid-js/mermaid-live-editor) -- [HTTP Server](https://github.com/TomWright/mermaid-server) - -## Contributors [![Good first issue](https://img.shields.io/github/labels/mermaid-js/mermaid/Good%20first%20issue%21)](https://github.com/mermaid-js/mermaid/issues?q=is%3Aissue+is%3Aopen+label%3A%22Good+first+issue%21%22) [![Contributors](https://img.shields.io/github/contributors/mermaid-js/mermaid)](https://github.com/mermaid-js/mermaid/graphs/contributors) [![Commits](https://img.shields.io/github/commit-activity/m/mermaid-js/mermaid)](https://github.com/mermaid-js/mermaid/graphs/contributors) - -Mermaid is a growing community and is always accepting new contributors. There's a lot of different ways to help out and we're always looking for extra hands! Look at [this issue](https://github.com/mermaid-js/mermaid/issues/866) if you want to know where to start helping out. - -Detailed information about how to contribute can be found in the [contribution guide](CONTRIBUTING.md) - -## Security and safe diagrams - -For public sites, it can be precarious to retrieve text from users on the internet, storing that content for presentation in a browser at a later stage. The reason is that the user content can contain embedded malicious scripts that will run when the data is presented. For Mermaid this is a risk, specially as mermaid diagrams contain many characters that are used in html which makes the standard sanitation unusable as it also breaks the diagrams. We still make an effort to sanitise the incoming code and keep refining the process but it is hard to guarantee that there are no loop holes. - -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 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 - -To report a vulnerability, please e-mail security@mermaid.live with a description of the issue, the steps you took to create the issue, affected versions, and if known, mitigations for the issue. - -## Appreciation - -A quick note from Knut Sveidqvist: - -> _Many thanks to the [d3](https://d3js.org/) and [dagre-d3](https://github.com/cpettitt/dagre-d3) projects for providing the graphical layout and drawing libraries!_ >_Thanks also to the [js-sequence-diagram](https://bramp.github.io/js-sequence-diagrams) project for usage of the grammar for the sequence diagrams. Thanks to Jessica Peter for inspiration and starting point for gantt rendering._ >_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/knsv/mermaid/graphs/contributors) that brought the project this far!_ - ---- - -_Mermaid was created by Knut Sveidqvist for easier documentation._ diff --git a/packages/mermaid/README.zh-CN.md b/packages/mermaid/README.zh-CN.md deleted file mode 100644 index 3612ba0a9..000000000 --- a/packages/mermaid/README.zh-CN.md +++ /dev/null @@ -1,334 +0,0 @@ -# mermaid - -[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/twitter/follow/mermaidjs_?style=social)](https://twitter.com/mermaidjs_) - -[English](./README.md) | 简体中文 - - - -:trophy: **Mermaid 被提名并获得了 [JS Open Source Awards (2019)](https://osawards.com/javascript/2019) 的 "The most exciting use of technology" 奖项!!!** - -**感谢所有参与进来提交 PR,解答疑问的人们! 🙏** - -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! - -## 关于 Mermaid - - - -Mermaid 是一个基于 Javascript 的图表绘制工具,通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。Mermaid 诞生的主要目的是让文档的更新能够及时跟上开发进度。 - -> Doc-Rot 是 Mermaid 致力于解决的一个难题。 - -绘图和编写文档花费了开发者宝贵的开发时间,而且随着业务的变更,它很快就会过期。 但是如果缺少了图表或文档,对于生产力和团队新人的业务学习都会产生巨大的阻碍。
-Mermaid 通过允许用户创建便于修改的图表来解决这一难题,它也可以作为生产脚本(或其他代码)的一部分。
-
-Mermaid 甚至能让非程序员也能通过 [Mermaid Live Editor](https://mermaid.live/) 轻松创建详细的图表。
-你可以访问 [教程](./docs/Tutorials.md) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](./docs/integrations.md) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。 - -如果想要查看关于 Mermaid 更详细的介绍及基础使用方式,可以查看 [入门指引](./docs/n00b-overview.md), [用法](./docs/usage.md) 和 [教程](./docs/Tutorials.md). - -🌐 [CDN](https://www.jsdelivr.com/package/npm/mermaid) | 📖 [文档](https://mermaidjs.github.io) | 🙌 [贡献](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md) | 📜 [更新日志](./docs/CHANGELOG.md) - - - -## 示例 - -**下面是一些可以使用 Mermaid 创建的图表示例。点击 [语法](https://mermaid-js.github.io/mermaid/#/n00b-syntaxReference) 查看详情。** - -
- - -### 流程图 [文档 - live editor] - -``` -flowchart LR -A[Hard] -->|Text| B(Round) -B --> C{Decision} -C -->|One| D[Result 1] -C -->|Two| E[Result 2] -``` - -```mermaid -flowchart LR -A[Hard] -->|Text| B(Round) -B --> C{Decision} -C -->|One| D[Result 1] -C -->|Two| E[Result 2] -``` - -### 时序图 [文档 - live editor] - -``` -sequenceDiagram -Alice->>John: Hello John, how are you? -loop Healthcheck - John->>John: Fight against hypochondria -end -Note right of John: Rational thoughts! -John-->>Alice: Great! -John->>Bob: How about you? -Bob-->>John: Jolly good! -``` - -```mermaid -sequenceDiagram -Alice->>John: Hello John, how are you? -loop Healthcheck - John->>John: Fight against hypochondria -end -Note right of John: Rational thoughts! -John-->>Alice: Great! -John->>Bob: How about you? -Bob-->>John: Jolly good! -``` - -### 甘特图 [文档 - live editor] - -``` -gantt - section Section - Completed :done, des1, 2014-01-06,2014-01-08 - Active :active, des2, 2014-01-07, 3d - Parallel 1 : des3, after des1, 1d - Parallel 2 : des4, after des1, 1d - Parallel 3 : des5, after des3, 1d - Parallel 4 : des6, after des4, 1d -``` - -```mermaid -gantt - section Section - Completed :done, des1, 2014-01-06,2014-01-08 - Active :active, des2, 2014-01-07, 3d - Parallel 1 : des3, after des1, 1d - Parallel 2 : des4, after des1, 1d - Parallel 3 : des5, after des3, 1d - Parallel 4 : des6, after des4, 1d -``` - -### 类图 [文档 - live editor] - -``` -classDiagram -Class01 <|-- AveryLongClass : Cool -<> Class01 -Class09 --> C2 : Where am I? -Class09 --* C3 -Class09 --|> Class07 -Class07 : equals() -Class07 : Object[] elementData -Class01 : size() -Class01 : int chimp -Class01 : int gorilla -class Class10 { - <> - int id - size() -} -``` - -```mermaid -classDiagram -Class01 <|-- AveryLongClass : Cool -<> Class01 -Class09 --> C2 : Where am I? -Class09 --* C3 -Class09 --|> Class07 -Class07 : equals() -Class07 : Object[] elementData -Class01 : size() -Class01 : int chimp -Class01 : int gorilla -class Class10 { - <> - int id - size() -} -``` - -### 状态图 [[docs - live editor] - -``` -stateDiagram-v2 -[*] --> Still -Still --> [*] -Still --> Moving -Moving --> Still -Moving --> Crash -Crash --> [*] -``` - -```mermaid -stateDiagram-v2 -[*] --> Still -Still --> [*] -Still --> Moving -Moving --> Still -Moving --> Crash -Crash --> [*] -``` - -### 饼图 [文档 - live editor] - -``` -pie -"Dogs" : 386 -"Cats" : 85 -"Rats" : 15 -``` - -```mermaid -pie -"Dogs" : 386 -"Cats" : 85 -"Rats" : 15 -``` - -### Git 图 [实验特性 - live editor] - -### 用户体验旅程图 [文档 - live editor] - -``` - journey - title My working day - section Go to work - Make tea: 5: Me - Go upstairs: 3: Me - Do work: 1: Me, Cat - section Go home - Go downstairs: 5: Me - Sit down: 3: Me -``` - -```mermaid - journey - title My working day - section Go to work - Make tea: 5: Me - Go upstairs: 3: Me - Do work: 1: Me, Cat - section Go home - Go downstairs: 5: Me - Sit down: 3: Me -``` - -### C4 图 [文档] - -``` -C4Context -title System Context diagram for Internet Banking System - -Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.") -Person(customerB, "Banking Customer B") -Person_Ext(customerC, "Banking Customer C") -System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.") - -Person(customerD, "Banking Customer D", "A customer of the bank,
with personal bank accounts.") - -Enterprise_Boundary(b1, "BankBoundary") { - - SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") - - System_Boundary(b2, "BankBoundary2") { - System(SystemA, "Banking System A") - System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.") - } - - System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") - SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.") - - Boundary(b3, "BankBoundary3", "boundary") { - SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.") - SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.") - } -} - -BiRel(customerA, SystemAA, "Uses") -BiRel(SystemAA, SystemE, "Uses") -Rel(SystemAA, SystemC, "Sends e-mails", "SMTP") -Rel(SystemC, customerA, "Sends e-mails to") -``` - -```mermaid -C4Context -title System Context diagram for Internet Banking System - -Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.") -Person(customerB, "Banking Customer B") -Person_Ext(customerC, "Banking Customer C") -System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.") - -Person(customerD, "Banking Customer D", "A customer of the bank,
with personal bank accounts.") - -Enterprise_Boundary(b1, "BankBoundary") { - - SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") - - System_Boundary(b2, "BankBoundary2") { - System(SystemA, "Banking System A") - System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.") - } - - System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") - SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.") - - Boundary(b3, "BankBoundary3", "boundary") { - SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.") - SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.") - } -} - -BiRel(customerA, SystemAA, "Uses") -BiRel(SystemAA, SystemE, "Uses") -Rel(SystemAA, SystemC, "Sends e-mails", "SMTP") -Rel(SystemC, customerA, "Sends e-mails to") -``` - -## 发布 - -对于有权限的同学来说,你可以通过以下步骤来完成发布操作: - -更新 `package.json` 中的版本号,然后执行如下命令: - -```sh -npm publish -``` - -以上的命令会将文件打包到 `dist` 目录并发布至 npmjs.org. - -## 相关项目 - -- [Command Line Interface](https://github.com/mermaid-js/mermaid-cli) -- [Live Editor](https://github.com/mermaid-js/mermaid-live-editor) -- [HTTP Server](https://github.com/TomWright/mermaid-server) - -## 贡献者 [![Good first issue](https://img.shields.io/github/labels/mermaid-js/mermaid/Good%20first%20issue%21)](https://github.com/mermaid-js/mermaid/issues?q=is%3Aissue+is%3Aopen+label%3A%22Good+first+issue%21%22) [![Contributors](https://img.shields.io/github/contributors/mermaid-js/mermaid)](https://github.com/mermaid-js/mermaid/graphs/contributors) [![Commits](https://img.shields.io/github/commit-activity/m/mermaid-js/mermaid)](https://github.com/mermaid-js/mermaid/graphs/contributors) - -Mermaid 是一个不断发展中的社区,并且还在接收新的贡献者。有很多不同的方式可以参与进来,而且我们还在寻找额外的帮助。如果你想知道如何开始贡献,请查看 [这个 issue](https://github.com/mermaid-js/mermaid/issues/866)。 - -关于如何贡献的详细信息可以在 [贡献指南](CONTRIBUTING.md) 中找到。 - -## 安全 - -对于公开网站来说,从互联网上的用户处检索文本、存储供后续在浏览器中展示的内容可能是不安全的,理由是用户的内容可能嵌入一些数据加载完成之后就会运行的恶意脚本,这些对于 Mermaid 来说毫无疑问是一个风险,尤其是 mermaid 图表还包含了许多在 html 中使用的字符,这意味着我们难以使用常规的手段来过滤不安全代码,因为这些常规手段会造成图表损坏。我们仍然在努力对获取到的代码进行安全过滤并不断完善我们的程序,但很难保证没有漏洞。 - -作为拥有外部用户的网站的额外安全级别,我们很高兴推出一个新的安全级别,其中的图表在沙盒 iframe 中渲染,防止代码中的 javascript 被执行,这是在安全性方面迈出的一大步。 - -_很不幸的是,鱼与熊掌不可兼得,在这个场景下它意味着在可能的恶意代码被阻止时,也会损失部分交互能力_。 - -## 报告漏洞 - -如果想要报告漏洞,请发送邮件到 security@mermaid.live, 并附上问题的描述、复现问题的步骤、受影响的版本,以及解决问题的方案(如果有的话)。 - -## 鸣谢 - -来自 Knut Sveidqvist: - -> _特别感谢 [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/knsv/mermaid/graphs/contributors),没有你们,就没有这个项目的今天!_ - ---- - -_Mermaid 是由 Knut Sveidqvist 创建,它为了更简单的文档编写而生。_ From e6b4e2c08403651b557db2a78118c73791346a59 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 19 Feb 2023 14:13:57 +0530 Subject: [PATCH 261/309] Remove Readme --- packages/mermaid/README.md | 346 ------------------------------- packages/mermaid/README.zh-CN.md | 334 ----------------------------- 2 files changed, 680 deletions(-) delete mode 100644 packages/mermaid/README.md delete mode 100644 packages/mermaid/README.zh-CN.md diff --git a/packages/mermaid/README.md b/packages/mermaid/README.md deleted file mode 100644 index d453d2ec0..000000000 --- a/packages/mermaid/README.md +++ /dev/null @@ -1,346 +0,0 @@ -# mermaid - -[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/twitter/follow/mermaidjs_?style=social)](https://twitter.com/mermaidjs_) - -English | [简体中文](./README.zh-CN.md) - - - -:trophy: **Mermaid was nominated and won the [JS Open Source Awards (2019)](https://osawards.com/javascript/2019) in the category "The most exciting use of technology"!!!** - -**Thanks to all involved, people committing pull requests, people answering questions! 🙏** - -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! - -## About - - - -Mermaid is a JavaScript-based diagramming and charting tool that uses Markdown-inspired text definitions and a renderer to create and modify complex diagrams. The main purpose of Mermaid is to help documentation catch up with development. - -> Doc-Rot is a Catch-22 that Mermaid helps to solve. - -Diagramming and documentation costs precious developer time and gets outdated quickly. -But not having diagrams or docs ruins productivity and hurts organizational learning.
-Mermaid addresses this problem by enabling users to create easily modifiable diagrams. It can also be made part of production scripts (and other pieces of code).
-
- -Mermaid allows even non-programmers to easily create detailed diagrams through the [Mermaid Live Editor](https://mermaid.live/).
-[Tutorials](./docs/Tutorials.md) has video tutorials. -Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](./docs/integrations.md). - -You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](./docs/integrations.md). - -For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](./docs/n00b-overview.md), [Usage](./docs/usage.md) and [Tutorials](./docs/Tutorials.md). - -🌐 [CDN](https://www.jsdelivr.com/package/npm/mermaid) | 📖 [Documentation](https://mermaidjs.github.io) | 🙌 [Contribution](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md) | 📜 [Changelog](./docs/CHANGELOG.md) - -In our release process we rely heavily on visual regression tests using [applitools](https://applitools.com/). Applitools is a great service which has been easy to use and integrate with our tests. - - - - - - - -## Examples - -**The following are some examples of the diagrams, charts and graphs that can be made using Mermaid. Click here to jump into the [text syntax](https://mermaid-js.github.io/mermaid/#/n00b-syntaxReference).** - - - -### Flowchart [docs - live editor] - -``` -flowchart LR - -A[Hard] -->|Text| B(Round) -B --> C{Decision} -C -->|One| D[Result 1] -C -->|Two| E[Result 2] -``` - -```mermaid -flowchart LR - -A[Hard] -->|Text| B(Round) -B --> C{Decision} -C -->|One| D[Result 1] -C -->|Two| E[Result 2] -``` - -### Sequence diagram [docs - live editor] - -``` -sequenceDiagram -Alice->>John: Hello John, how are you? -loop Healthcheck - John->>John: Fight against hypochondria -end -Note right of John: Rational thoughts! -John-->>Alice: Great! -John->>Bob: How about you? -Bob-->>John: Jolly good! -``` - -```mermaid -sequenceDiagram -Alice->>John: Hello John, how are you? -loop Healthcheck - John->>John: Fight against hypochondria -end -Note right of John: Rational thoughts! -John-->>Alice: Great! -John->>Bob: How about you? -Bob-->>John: Jolly good! -``` - -### Gantt chart [docs - live editor] - -``` -gantt - section Section - Completed :done, des1, 2014-01-06,2014-01-08 - Active :active, des2, 2014-01-07, 3d - Parallel 1 : des3, after des1, 1d - Parallel 2 : des4, after des1, 1d - Parallel 3 : des5, after des3, 1d - Parallel 4 : des6, after des4, 1d -``` - -```mermaid -gantt - section Section - Completed :done, des1, 2014-01-06,2014-01-08 - Active :active, des2, 2014-01-07, 3d - Parallel 1 : des3, after des1, 1d - Parallel 2 : des4, after des1, 1d - Parallel 3 : des5, after des3, 1d - Parallel 4 : des6, after des4, 1d -``` - -### Class diagram [docs - live editor] - -``` -classDiagram -Class01 <|-- AveryLongClass : Cool -<> Class01 -Class09 --> C2 : Where am I? -Class09 --* C3 -Class09 --|> Class07 -Class07 : equals() -Class07 : Object[] elementData -Class01 : size() -Class01 : int chimp -Class01 : int gorilla -class Class10 { - <> - int id - size() -} -``` - -```mermaid -classDiagram -Class01 <|-- AveryLongClass : Cool -<> Class01 -Class09 --> C2 : Where am I? -Class09 --* C3 -Class09 --|> Class07 -Class07 : equals() -Class07 : Object[] elementData -Class01 : size() -Class01 : int chimp -Class01 : int gorilla -class Class10 { - <> - int id - size() -} -``` - -### State diagram [docs - live editor] - -``` -stateDiagram-v2 -[*] --> Still -Still --> [*] -Still --> Moving -Moving --> Still -Moving --> Crash -Crash --> [*] -``` - -```mermaid -stateDiagram-v2 -[*] --> Still -Still --> [*] -Still --> Moving -Moving --> Still -Moving --> Crash -Crash --> [*] -``` - -### Pie chart [docs - live editor] - -``` -pie -"Dogs" : 386 -"Cats" : 85.9 -"Rats" : 15 -``` - -```mermaid -pie -"Dogs" : 386 -"Cats" : 85.9 -"Rats" : 15 -``` - -### Git graph [experimental - live editor] - -### User Journey diagram [docs - live editor] - -``` - journey - title My working day - section Go to work - Make tea: 5: Me - Go upstairs: 3: Me - Do work: 1: Me, Cat - section Go home - Go downstairs: 5: Me - Sit down: 3: Me -``` - -```mermaid - journey - title My working day - section Go to work - Make tea: 5: Me - Go upstairs: 3: Me - Do work: 1: Me, Cat - section Go home - Go downstairs: 5: Me - Sit down: 3: Me -``` - -### C4 diagram [docs] - -``` -C4Context -title System Context diagram for Internet Banking System - -Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.") -Person(customerB, "Banking Customer B") -Person_Ext(customerC, "Banking Customer C") -System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.") - -Person(customerD, "Banking Customer D", "A customer of the bank,
with personal bank accounts.") - -Enterprise_Boundary(b1, "BankBoundary") { - - SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") - - System_Boundary(b2, "BankBoundary2") { - System(SystemA, "Banking System A") - System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.") - } - - System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") - SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.") - - Boundary(b3, "BankBoundary3", "boundary") { - SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.") - SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.") - } -} - -BiRel(customerA, SystemAA, "Uses") -BiRel(SystemAA, SystemE, "Uses") -Rel(SystemAA, SystemC, "Sends e-mails", "SMTP") -Rel(SystemC, customerA, "Sends e-mails to") -``` - -```mermaid -C4Context -title System Context diagram for Internet Banking System - -Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.") -Person(customerB, "Banking Customer B") -Person_Ext(customerC, "Banking Customer C") -System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.") - -Person(customerD, "Banking Customer D", "A customer of the bank,
with personal bank accounts.") - -Enterprise_Boundary(b1, "BankBoundary") { - - SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") - - System_Boundary(b2, "BankBoundary2") { - System(SystemA, "Banking System A") - System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.") - } - - System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") - SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.") - - Boundary(b3, "BankBoundary3", "boundary") { - SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.") - SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.") - } -} - -BiRel(customerA, SystemAA, "Uses") -BiRel(SystemAA, SystemE, "Uses") -Rel(SystemAA, SystemC, "Sends e-mails", "SMTP") -Rel(SystemC, customerA, "Sends e-mails to") -``` - -## Release - -For those who have the permission to do so: - -Update version number in `package.json`. - -```sh -npm publish -``` - -The above command generates files into the `dist` folder and publishes them to npmjs.org. - -## Related projects - -- [Command Line Interface](https://github.com/mermaid-js/mermaid-cli) -- [Live Editor](https://github.com/mermaid-js/mermaid-live-editor) -- [HTTP Server](https://github.com/TomWright/mermaid-server) - -## Contributors [![Good first issue](https://img.shields.io/github/labels/mermaid-js/mermaid/Good%20first%20issue%21)](https://github.com/mermaid-js/mermaid/issues?q=is%3Aissue+is%3Aopen+label%3A%22Good+first+issue%21%22) [![Contributors](https://img.shields.io/github/contributors/mermaid-js/mermaid)](https://github.com/mermaid-js/mermaid/graphs/contributors) [![Commits](https://img.shields.io/github/commit-activity/m/mermaid-js/mermaid)](https://github.com/mermaid-js/mermaid/graphs/contributors) - -Mermaid is a growing community and is always accepting new contributors. There's a lot of different ways to help out and we're always looking for extra hands! Look at [this issue](https://github.com/mermaid-js/mermaid/issues/866) if you want to know where to start helping out. - -Detailed information about how to contribute can be found in the [contribution guide](CONTRIBUTING.md) - -## Security and safe diagrams - -For public sites, it can be precarious to retrieve text from users on the internet, storing that content for presentation in a browser at a later stage. The reason is that the user content can contain embedded malicious scripts that will run when the data is presented. For Mermaid this is a risk, specially as mermaid diagrams contain many characters that are used in html which makes the standard sanitation unusable as it also breaks the diagrams. We still make an effort to sanitise the incoming code and keep refining the process but it is hard to guarantee that there are no loop holes. - -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 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 - -To report a vulnerability, please e-mail security@mermaid.live with a description of the issue, the steps you took to create the issue, affected versions, and if known, mitigations for the issue. - -## Appreciation - -A quick note from Knut Sveidqvist: - -> _Many thanks to the [d3](https://d3js.org/) and [dagre-d3](https://github.com/cpettitt/dagre-d3) projects for providing the graphical layout and drawing libraries!_ >_Thanks also to the [js-sequence-diagram](https://bramp.github.io/js-sequence-diagrams) project for usage of the grammar for the sequence diagrams. Thanks to Jessica Peter for inspiration and starting point for gantt rendering._ >_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/knsv/mermaid/graphs/contributors) that brought the project this far!_ - ---- - -_Mermaid was created by Knut Sveidqvist for easier documentation._ diff --git a/packages/mermaid/README.zh-CN.md b/packages/mermaid/README.zh-CN.md deleted file mode 100644 index 3612ba0a9..000000000 --- a/packages/mermaid/README.zh-CN.md +++ /dev/null @@ -1,334 +0,0 @@ -# mermaid - -[![Build CI Status](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml/badge.svg)](https://github.com/mermaid-js/mermaid/actions/workflows/build.yml) [![NPM](https://img.shields.io/npm/v/mermaid)](https://www.npmjs.com/package/mermaid) [![npm minified gzipped bundle size](https://img.shields.io/bundlephobia/minzip/mermaid)](https://bundlephobia.com/package/mermaid) [![Coverage Status](https://coveralls.io/repos/github/mermaid-js/mermaid/badge.svg?branch=master)](https://coveralls.io/github/mermaid-js/mermaid?branch=master) [![CDN Status](https://img.shields.io/jsdelivr/npm/hm/mermaid)](https://www.jsdelivr.com/package/npm/mermaid) [![NPM](https://img.shields.io/npm/dm/mermaid)](https://www.npmjs.com/package/mermaid) [![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE) [![Twitter Follow](https://img.shields.io/twitter/follow/mermaidjs_?style=social)](https://twitter.com/mermaidjs_) - -[English](./README.md) | 简体中文 - - - -:trophy: **Mermaid 被提名并获得了 [JS Open Source Awards (2019)](https://osawards.com/javascript/2019) 的 "The most exciting use of technology" 奖项!!!** - -**感谢所有参与进来提交 PR,解答疑问的人们! 🙏** - -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! - -## 关于 Mermaid - - - -Mermaid 是一个基于 Javascript 的图表绘制工具,通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。Mermaid 诞生的主要目的是让文档的更新能够及时跟上开发进度。 - -> Doc-Rot 是 Mermaid 致力于解决的一个难题。 - -绘图和编写文档花费了开发者宝贵的开发时间,而且随着业务的变更,它很快就会过期。 但是如果缺少了图表或文档,对于生产力和团队新人的业务学习都会产生巨大的阻碍。
-Mermaid 通过允许用户创建便于修改的图表来解决这一难题,它也可以作为生产脚本(或其他代码)的一部分。
-
-Mermaid 甚至能让非程序员也能通过 [Mermaid Live Editor](https://mermaid.live/) 轻松创建详细的图表。
-你可以访问 [教程](./docs/Tutorials.md) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](./docs/integrations.md) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。 - -如果想要查看关于 Mermaid 更详细的介绍及基础使用方式,可以查看 [入门指引](./docs/n00b-overview.md), [用法](./docs/usage.md) 和 [教程](./docs/Tutorials.md). - -🌐 [CDN](https://www.jsdelivr.com/package/npm/mermaid) | 📖 [文档](https://mermaidjs.github.io) | 🙌 [贡献](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md) | 📜 [更新日志](./docs/CHANGELOG.md) - - - -## 示例 - -**下面是一些可以使用 Mermaid 创建的图表示例。点击 [语法](https://mermaid-js.github.io/mermaid/#/n00b-syntaxReference) 查看详情。** - -
- - -### 流程图 [文档 - live editor] - -``` -flowchart LR -A[Hard] -->|Text| B(Round) -B --> C{Decision} -C -->|One| D[Result 1] -C -->|Two| E[Result 2] -``` - -```mermaid -flowchart LR -A[Hard] -->|Text| B(Round) -B --> C{Decision} -C -->|One| D[Result 1] -C -->|Two| E[Result 2] -``` - -### 时序图 [文档 - live editor] - -``` -sequenceDiagram -Alice->>John: Hello John, how are you? -loop Healthcheck - John->>John: Fight against hypochondria -end -Note right of John: Rational thoughts! -John-->>Alice: Great! -John->>Bob: How about you? -Bob-->>John: Jolly good! -``` - -```mermaid -sequenceDiagram -Alice->>John: Hello John, how are you? -loop Healthcheck - John->>John: Fight against hypochondria -end -Note right of John: Rational thoughts! -John-->>Alice: Great! -John->>Bob: How about you? -Bob-->>John: Jolly good! -``` - -### 甘特图 [文档 - live editor] - -``` -gantt - section Section - Completed :done, des1, 2014-01-06,2014-01-08 - Active :active, des2, 2014-01-07, 3d - Parallel 1 : des3, after des1, 1d - Parallel 2 : des4, after des1, 1d - Parallel 3 : des5, after des3, 1d - Parallel 4 : des6, after des4, 1d -``` - -```mermaid -gantt - section Section - Completed :done, des1, 2014-01-06,2014-01-08 - Active :active, des2, 2014-01-07, 3d - Parallel 1 : des3, after des1, 1d - Parallel 2 : des4, after des1, 1d - Parallel 3 : des5, after des3, 1d - Parallel 4 : des6, after des4, 1d -``` - -### 类图 [文档 - live editor] - -``` -classDiagram -Class01 <|-- AveryLongClass : Cool -<> Class01 -Class09 --> C2 : Where am I? -Class09 --* C3 -Class09 --|> Class07 -Class07 : equals() -Class07 : Object[] elementData -Class01 : size() -Class01 : int chimp -Class01 : int gorilla -class Class10 { - <> - int id - size() -} -``` - -```mermaid -classDiagram -Class01 <|-- AveryLongClass : Cool -<> Class01 -Class09 --> C2 : Where am I? -Class09 --* C3 -Class09 --|> Class07 -Class07 : equals() -Class07 : Object[] elementData -Class01 : size() -Class01 : int chimp -Class01 : int gorilla -class Class10 { - <> - int id - size() -} -``` - -### 状态图 [[docs - live editor] - -``` -stateDiagram-v2 -[*] --> Still -Still --> [*] -Still --> Moving -Moving --> Still -Moving --> Crash -Crash --> [*] -``` - -```mermaid -stateDiagram-v2 -[*] --> Still -Still --> [*] -Still --> Moving -Moving --> Still -Moving --> Crash -Crash --> [*] -``` - -### 饼图 [文档 - live editor] - -``` -pie -"Dogs" : 386 -"Cats" : 85 -"Rats" : 15 -``` - -```mermaid -pie -"Dogs" : 386 -"Cats" : 85 -"Rats" : 15 -``` - -### Git 图 [实验特性 - live editor] - -### 用户体验旅程图 [文档 - live editor] - -``` - journey - title My working day - section Go to work - Make tea: 5: Me - Go upstairs: 3: Me - Do work: 1: Me, Cat - section Go home - Go downstairs: 5: Me - Sit down: 3: Me -``` - -```mermaid - journey - title My working day - section Go to work - Make tea: 5: Me - Go upstairs: 3: Me - Do work: 1: Me, Cat - section Go home - Go downstairs: 5: Me - Sit down: 3: Me -``` - -### C4 图 [文档] - -``` -C4Context -title System Context diagram for Internet Banking System - -Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.") -Person(customerB, "Banking Customer B") -Person_Ext(customerC, "Banking Customer C") -System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.") - -Person(customerD, "Banking Customer D", "A customer of the bank,
with personal bank accounts.") - -Enterprise_Boundary(b1, "BankBoundary") { - - SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") - - System_Boundary(b2, "BankBoundary2") { - System(SystemA, "Banking System A") - System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.") - } - - System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") - SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.") - - Boundary(b3, "BankBoundary3", "boundary") { - SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.") - SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.") - } -} - -BiRel(customerA, SystemAA, "Uses") -BiRel(SystemAA, SystemE, "Uses") -Rel(SystemAA, SystemC, "Sends e-mails", "SMTP") -Rel(SystemC, customerA, "Sends e-mails to") -``` - -```mermaid -C4Context -title System Context diagram for Internet Banking System - -Person(customerA, "Banking Customer A", "A customer of the bank, with personal bank accounts.") -Person(customerB, "Banking Customer B") -Person_Ext(customerC, "Banking Customer C") -System(SystemAA, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.") - -Person(customerD, "Banking Customer D", "A customer of the bank,
with personal bank accounts.") - -Enterprise_Boundary(b1, "BankBoundary") { - - SystemDb_Ext(SystemE, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.") - - System_Boundary(b2, "BankBoundary2") { - System(SystemA, "Banking System A") - System(SystemB, "Banking System B", "A system of the bank, with personal bank accounts.") - } - - System_Ext(SystemC, "E-mail system", "The internal Microsoft Exchange e-mail system.") - SystemDb(SystemD, "Banking System D Database", "A system of the bank, with personal bank accounts.") - - Boundary(b3, "BankBoundary3", "boundary") { - SystemQueue(SystemF, "Banking System F Queue", "A system of the bank, with personal bank accounts.") - SystemQueue_Ext(SystemG, "Banking System G Queue", "A system of the bank, with personal bank accounts.") - } -} - -BiRel(customerA, SystemAA, "Uses") -BiRel(SystemAA, SystemE, "Uses") -Rel(SystemAA, SystemC, "Sends e-mails", "SMTP") -Rel(SystemC, customerA, "Sends e-mails to") -``` - -## 发布 - -对于有权限的同学来说,你可以通过以下步骤来完成发布操作: - -更新 `package.json` 中的版本号,然后执行如下命令: - -```sh -npm publish -``` - -以上的命令会将文件打包到 `dist` 目录并发布至 npmjs.org. - -## 相关项目 - -- [Command Line Interface](https://github.com/mermaid-js/mermaid-cli) -- [Live Editor](https://github.com/mermaid-js/mermaid-live-editor) -- [HTTP Server](https://github.com/TomWright/mermaid-server) - -## 贡献者 [![Good first issue](https://img.shields.io/github/labels/mermaid-js/mermaid/Good%20first%20issue%21)](https://github.com/mermaid-js/mermaid/issues?q=is%3Aissue+is%3Aopen+label%3A%22Good+first+issue%21%22) [![Contributors](https://img.shields.io/github/contributors/mermaid-js/mermaid)](https://github.com/mermaid-js/mermaid/graphs/contributors) [![Commits](https://img.shields.io/github/commit-activity/m/mermaid-js/mermaid)](https://github.com/mermaid-js/mermaid/graphs/contributors) - -Mermaid 是一个不断发展中的社区,并且还在接收新的贡献者。有很多不同的方式可以参与进来,而且我们还在寻找额外的帮助。如果你想知道如何开始贡献,请查看 [这个 issue](https://github.com/mermaid-js/mermaid/issues/866)。 - -关于如何贡献的详细信息可以在 [贡献指南](CONTRIBUTING.md) 中找到。 - -## 安全 - -对于公开网站来说,从互联网上的用户处检索文本、存储供后续在浏览器中展示的内容可能是不安全的,理由是用户的内容可能嵌入一些数据加载完成之后就会运行的恶意脚本,这些对于 Mermaid 来说毫无疑问是一个风险,尤其是 mermaid 图表还包含了许多在 html 中使用的字符,这意味着我们难以使用常规的手段来过滤不安全代码,因为这些常规手段会造成图表损坏。我们仍然在努力对获取到的代码进行安全过滤并不断完善我们的程序,但很难保证没有漏洞。 - -作为拥有外部用户的网站的额外安全级别,我们很高兴推出一个新的安全级别,其中的图表在沙盒 iframe 中渲染,防止代码中的 javascript 被执行,这是在安全性方面迈出的一大步。 - -_很不幸的是,鱼与熊掌不可兼得,在这个场景下它意味着在可能的恶意代码被阻止时,也会损失部分交互能力_。 - -## 报告漏洞 - -如果想要报告漏洞,请发送邮件到 security@mermaid.live, 并附上问题的描述、复现问题的步骤、受影响的版本,以及解决问题的方案(如果有的话)。 - -## 鸣谢 - -来自 Knut Sveidqvist: - -> _特别感谢 [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/knsv/mermaid/graphs/contributors),没有你们,就没有这个项目的今天!_ - ---- - -_Mermaid 是由 Knut Sveidqvist 创建,它为了更简单的文档编写而生。_ From 1684faf6325c55a0999e309b130a729363598340 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 19 Feb 2023 14:15:50 +0530 Subject: [PATCH 262/309] Fix lint --- .vite/server.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/.vite/server.ts b/.vite/server.ts index 6f8959348..35bc56cd1 100644 --- a/.vite/server.ts +++ b/.vite/server.ts @@ -2,7 +2,6 @@ import express from 'express'; import cors from 'cors'; import { createServer as createViteServer } from 'vite'; - async function createServer() { const app = express(); From 6e3d96e16dcf675c3049c8180094858d6af1382b Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 19 Feb 2023 14:18:09 +0530 Subject: [PATCH 263/309] fix Server --- .vite/server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vite/server.ts b/.vite/server.ts index 35bc56cd1..650cd103d 100644 --- a/.vite/server.ts +++ b/.vite/server.ts @@ -12,7 +12,7 @@ async function createServer() { appType: 'custom', // don't include Vite's default HTML handling middlewares }); - app.use(cors); + app.use(cors()); app.use(express.static('./packages/mermaid/dist')); // app.use(express.static('./packages/mermaid-example-diagram/dist')); app.use(express.static('./packages/mermaid-example-diagram/dist')); From 8c64a907211be0f9823658b0ee8254e696c041d9 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 19 Feb 2023 14:21:15 +0530 Subject: [PATCH 264/309] Fix docs --- .vite/server.ts | 1 - .../interfaces/mermaidAPI.RenderResult.md | 4 ++-- docs/config/setup/modules/mermaidAPI.md | 20 +++++++++---------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/.vite/server.ts b/.vite/server.ts index 650cd103d..7a65cba00 100644 --- a/.vite/server.ts +++ b/.vite/server.ts @@ -14,7 +14,6 @@ async function createServer() { app.use(cors()); app.use(express.static('./packages/mermaid/dist')); - // app.use(express.static('./packages/mermaid-example-diagram/dist')); app.use(express.static('./packages/mermaid-example-diagram/dist')); app.use(vite.middlewares); app.use(express.static('demos')); diff --git a/docs/config/setup/interfaces/mermaidAPI.RenderResult.md b/docs/config/setup/interfaces/mermaidAPI.RenderResult.md index b95b0acff..89a8d70b2 100644 --- a/docs/config/setup/interfaces/mermaidAPI.RenderResult.md +++ b/docs/config/setup/interfaces/mermaidAPI.RenderResult.md @@ -65,7 +65,7 @@ element will be removed when rendering is completed. #### Defined in -[mermaidAPI.ts:382](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L382) +[mermaidAPI.ts:385](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L385) --- @@ -75,4 +75,4 @@ element will be removed when rendering is completed. #### Defined in -[mermaidAPI.ts:381](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L381) +[mermaidAPI.ts:384](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L384) diff --git a/docs/config/setup/modules/mermaidAPI.md b/docs/config/setup/modules/mermaidAPI.md index f75dd85c7..7d45a5a13 100644 --- a/docs/config/setup/modules/mermaidAPI.md +++ b/docs/config/setup/modules/mermaidAPI.md @@ -94,7 +94,7 @@ mermaid.initialize(config); #### Defined in -[mermaidAPI.ts:666](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L666) +[mermaidAPI.ts:669](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L669) ## Functions @@ -125,7 +125,7 @@ Return the last node appended #### Defined in -[mermaidAPI.ts:289](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L289) +[mermaidAPI.ts:292](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L292) --- @@ -151,7 +151,7 @@ the cleaned up svgCode #### Defined in -[mermaidAPI.ts:240](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L240) +[mermaidAPI.ts:243](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L243) --- @@ -177,7 +177,7 @@ the string with all the user styles #### Defined in -[mermaidAPI.ts:169](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L169) +[mermaidAPI.ts:172](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L172) --- @@ -200,7 +200,7 @@ the string with all the user styles #### Defined in -[mermaidAPI.ts:217](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L217) +[mermaidAPI.ts:220](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L220) --- @@ -227,7 +227,7 @@ with an enclosing block that has each of the cssClasses followed by !important; #### Defined in -[mermaidAPI.ts:153](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L153) +[mermaidAPI.ts:156](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L156) --- @@ -247,7 +247,7 @@ with an enclosing block that has each of the cssClasses followed by !important; #### Defined in -[mermaidAPI.ts:133](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L133) +[mermaidAPI.ts:136](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L136) --- @@ -267,7 +267,7 @@ with an enclosing block that has each of the cssClasses followed by !important; #### Defined in -[mermaidAPI.ts:104](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L104) +[mermaidAPI.ts:107](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L107) --- @@ -293,7 +293,7 @@ Put the svgCode into an iFrame. Return the iFrame code #### Defined in -[mermaidAPI.ts:268](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L268) +[mermaidAPI.ts:271](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L271) --- @@ -318,4 +318,4 @@ Remove any existing elements from the given document #### Defined in -[mermaidAPI.ts:339](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L339) +[mermaidAPI.ts:342](https://github.com/mermaid-js/mermaid/blob/master/packages/mermaid/src/mermaidAPI.ts#L342) From 8363552c3aab91dd367c7d1761538219fc71005f Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 19 Feb 2023 14:52:08 +0530 Subject: [PATCH 265/309] Skip flowchart-elk failing test --- cypress/integration/rendering/flowchart-elk.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/integration/rendering/flowchart-elk.spec.js b/cypress/integration/rendering/flowchart-elk.spec.js index 0d4ec4211..ee803b0d8 100644 --- a/cypress/integration/rendering/flowchart-elk.spec.js +++ b/cypress/integration/rendering/flowchart-elk.spec.js @@ -133,7 +133,7 @@ describe('Flowchart ELK', () => { }); }); - it('V2 elk - 16: Render Stadium shape', () => { + it.skip('V2 elk - 16: Render Stadium shape', () => { imgSnapshotTest( ` flowchart-elk TD A([stadium shape test]) From 57fd3e586a7342731ff4eee9aedc10555de0c553 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 19 Feb 2023 14:58:55 +0530 Subject: [PATCH 266/309] chore: Rename lazy loaded diagram definitions --- packages/mermaid/src/diagrams/flowchart/elk/detector.ts | 2 +- .../elk/{diagram-definition.ts => flowchart-elk-definition.ts} | 0 packages/mermaid/src/diagrams/mindmap/detector.ts | 2 +- .../mindmap/{diagram-definition.ts => mindmap-definition.ts} | 0 packages/mermaid/src/diagrams/timeline/detector.ts | 2 +- .../timeline/{diagram-definition.ts => timeline-definition.ts} | 0 6 files changed, 3 insertions(+), 3 deletions(-) rename packages/mermaid/src/diagrams/flowchart/elk/{diagram-definition.ts => flowchart-elk-definition.ts} (100%) rename packages/mermaid/src/diagrams/mindmap/{diagram-definition.ts => mindmap-definition.ts} (100%) rename packages/mermaid/src/diagrams/timeline/{diagram-definition.ts => timeline-definition.ts} (100%) diff --git a/packages/mermaid/src/diagrams/flowchart/elk/detector.ts b/packages/mermaid/src/diagrams/flowchart/elk/detector.ts index 41760ff4d..c6fa77957 100644 --- a/packages/mermaid/src/diagrams/flowchart/elk/detector.ts +++ b/packages/mermaid/src/diagrams/flowchart/elk/detector.ts @@ -16,7 +16,7 @@ const detector: DiagramDetector = (txt: string, config?: MermaidConfig): boolean }; const loader = async () => { - const { diagram } = await import('./diagram-definition.js'); + const { diagram } = await import('./flowchart-elk-definition.js'); return { id, diagram }; }; diff --git a/packages/mermaid/src/diagrams/flowchart/elk/diagram-definition.ts b/packages/mermaid/src/diagrams/flowchart/elk/flowchart-elk-definition.ts similarity index 100% rename from packages/mermaid/src/diagrams/flowchart/elk/diagram-definition.ts rename to packages/mermaid/src/diagrams/flowchart/elk/flowchart-elk-definition.ts diff --git a/packages/mermaid/src/diagrams/mindmap/detector.ts b/packages/mermaid/src/diagrams/mindmap/detector.ts index c96b19097..2e2b1c7d6 100644 --- a/packages/mermaid/src/diagrams/mindmap/detector.ts +++ b/packages/mermaid/src/diagrams/mindmap/detector.ts @@ -6,7 +6,7 @@ const detector = (txt: string) => { }; const loader = async () => { - const { diagram } = await import('./diagram-definition.js'); + const { diagram } = await import('./mindmap-definition.js'); return { id, diagram }; }; diff --git a/packages/mermaid/src/diagrams/mindmap/diagram-definition.ts b/packages/mermaid/src/diagrams/mindmap/mindmap-definition.ts similarity index 100% rename from packages/mermaid/src/diagrams/mindmap/diagram-definition.ts rename to packages/mermaid/src/diagrams/mindmap/mindmap-definition.ts diff --git a/packages/mermaid/src/diagrams/timeline/detector.ts b/packages/mermaid/src/diagrams/timeline/detector.ts index faa86a72c..9bd2b5ece 100644 --- a/packages/mermaid/src/diagrams/timeline/detector.ts +++ b/packages/mermaid/src/diagrams/timeline/detector.ts @@ -7,7 +7,7 @@ const detector = (txt: string) => { }; const loader = async () => { - const { diagram } = await import('./diagram-definition.js'); + const { diagram } = await import('./timeline-definition.js'); return { id, diagram }; }; diff --git a/packages/mermaid/src/diagrams/timeline/diagram-definition.ts b/packages/mermaid/src/diagrams/timeline/timeline-definition.ts similarity index 100% rename from packages/mermaid/src/diagrams/timeline/diagram-definition.ts rename to packages/mermaid/src/diagrams/timeline/timeline-definition.ts From 4ea7294eeb2aa71a48c984562750958dd92900de Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Sun, 19 Feb 2023 16:10:08 +0530 Subject: [PATCH 267/309] fix(#3406, #3394): Remove init & initThrowsErrors New run function added as replacement. --- V10-BreakingChanges.md | 35 ++- .../external-diagrams-example-diagram.html | 2 +- cypress/platform/render-after-error.html | 3 +- cypress/platform/rerender.html | 2 +- .../interfaces/mermaidAPI.ParseOptions.md | 19 ++ .../interfaces/mermaidAPI.RenderResult.md | 4 +- docs/config/setup/modules/mermaidAPI.md | 25 +-- packages/mermaid/src/mermaid.spec.ts | 28 ++- packages/mermaid/src/mermaid.ts | 202 ++++++++++-------- packages/mermaid/src/mermaidAPI.spec.ts | 4 +- packages/mermaid/src/mermaidAPI.ts | 17 +- 11 files changed, 215 insertions(+), 126 deletions(-) create mode 100644 docs/config/setup/interfaces/mermaidAPI.ParseOptions.md diff --git a/V10-BreakingChanges.md b/V10-BreakingChanges.md index e3322a3a1..121fdd596 100644 --- a/V10-BreakingChanges.md +++ b/V10-BreakingChanges.md @@ -2,7 +2,7 @@ ## Async -`init`, `parse`, `render` are now async. +`parse`, `render` are now async. ## Lazy loading and asynchronisity @@ -23,3 +23,36 @@ try { parseError(err); } ``` + +## Init deprecated and InitThrowsErrors removed + +The config passed to `init` was not being used eariler. +It will now be used. +The `init` function is deprecated and will be removed in the next major release. +init currently works as a wrapper to `initialize` and `run`. + +```js +//< v10.0.0 +mermaid.init(config, selector, cb); + +//>= v10.0.0 +mermaid.initialize(config); +mermaid.run({ + querySelector: selector, + postRenderCallback: cb, + suppressErrors: true, +}); +``` + +```js +//< v10.0.0 +mermaid.initThrowsErrors(config, selector, cb); + +//>= v10.0.0 +mermaid.initialize(config); +mermaid.run({ + querySelector: selector, + postRenderCallback: cb, + suppressErrors: false, +}); +``` diff --git a/cypress/platform/external-diagrams-example-diagram.html b/cypress/platform/external-diagrams-example-diagram.html index a1339d4e6..b5b716ff8 100644 --- a/cypress/platform/external-diagrams-example-diagram.html +++ b/cypress/platform/external-diagrams-example-diagram.html @@ -17,7 +17,7 @@ example-diagram await mermaid.registerExternalDiagrams([exampleDiagram]); await mermaid.initialize({ logLevel: 0 }); - await mermaid.initThrowsErrors(); + await mermaid.run(); if (window.Cypress) { window.rendered = true; } diff --git a/cypress/platform/render-after-error.html b/cypress/platform/render-after-error.html index 72ccac34c..2334158c2 100644 --- a/cypress/platform/render-after-error.html +++ b/cypress/platform/render-after-error.html @@ -11,7 +11,8 @@ ``` @@ -71,9 +75,6 @@ Example: ```html - - -
   graph LR
@@ -83,7 +84,6 @@ Example:
     
@@ -95,11 +95,12 @@ An id attribute is also added to mermaid tags without one. Mermaid can load multiple diagrams, in the same page. -> Try it out, save this code as HTML and load it using any browser.(Except Internet Explorer, please don't use Internet Explorer.) +> Try it out, save this code as HTML and load it using any browser. +> (Except Internet Explorer, please don't use Internet Explorer.) ## Enabling Click Event and Tags in Nodes -A `securityLevel` configuration has to first be cleared, `securityLevel` sets the level of trust for the parsed diagrams and limits click functionality. This was introduce in version 8.2 as a security improvement, aimed at preventing malicious use. +A `securityLevel` configuration has to first be cleared. `securityLevel` sets the level of trust for the parsed diagrams and limits click functionality. This was introduce in version 8.2 as a security improvement, aimed at preventing malicious use. **It is the site owner's responsibility to discriminate between trustworthy and untrustworthy user-bases and we encourage the use of discretion.** @@ -107,7 +108,7 @@ A `securityLevel` configuration has to first be cleared, `securityLevel` sets th | Parameter | Description | Type | Required | Values | | ------------- | --------------------------------- | ------ | -------- | ------------------------------------------ | -| securityLevel | Level of trust for parsed diagram | String | Required | 'sandbox', 'strict', 'loose', 'antiscript' | +| securityLevel | Level of trust for parsed diagram | String | Optional | 'sandbox', 'strict', 'loose', 'antiscript' | Values: @@ -122,26 +123,17 @@ Values: **If you are taking responsibility for the diagram source security you can set the `securityLevel` to a value of your choosing . This allows clicks and tags are allowed.** -**To change `securityLevel`, you have to call `mermaidAPI.initialize`:** +**To change `securityLevel`, you have to call `mermaid.initialize`:** ```javascript -mermaidAPI.initialize({ +mermaid.initialize({ securityLevel: 'loose', }); ``` ### Labels out of bounds -If you use dynamically loaded fonts that are loaded through CSS, such as Google fonts, mermaid should wait for the -whole page to load (dom + assets, particularly the fonts file). - -```javascript -$(document).load(function () { - mermaid.initialize(); -}); -``` - -or +If you use dynamically loaded fonts that are loaded through CSS, such as fonts, mermaid should wait for the whole page to load (dom + assets, particularly the fonts file). ```javascript $(document).ready(function () { @@ -154,12 +146,54 @@ Not doing so will most likely result in mermaid rendering graphs that have label If your page has other fonts in its body those might be used instead of the mermaid font. Specifying the font in your styling is a workaround for this. ```css -div.mermaid { +pre.mermaid { font-family: 'trebuchet ms', verdana, arial; } ``` -### Calling `mermaid.init` +### Using `mermaid.run` + +mermaid.run was added in v10 and is the preferred way of handling more complex integration. +By default, `mermaid.run` will be called when the document is ready, rendering all elements with `class="mermaid"`. + +You can customize that behavior by calling `await mermaid.run()`. + +`mermaid.initialize({startOnLoad: false})` will prevent `mermaid.run` from being called automatically after load. + +Render all elements with querySelector ".someOtherClass" + +```js +mermaid.initialize({ startOnLoad: false }); +await mermaid.run({ + querySelector: '.someOtherClass', +}); +``` + +Render all elements passed as an array + +```js +mermaid.initialize({ startOnLoad: false }); +await mermaid.run({ + nodes: [document.getElementById('someId'), document.getElementById('anotherId')], +}); +await mermaid.run({ + nodes: document.querySelectorAll('.yetAnotherClass'), +}); +``` + +Render all `.mermaid` elements while suppressing any error + +```js +mermaid.initialize({ startOnLoad: false }); +await mermaid.run({ + suppressErrors: true, +}); +``` + +### Calling `mermaid.init` - Deprecated + +> **Warning** +> mermaid.init is deprecated in v10 and will be removed in v11. Please use mermaid.run instead. By default, `mermaid.init` will be called when the document is ready, finding all elements with `class="mermaid"`. If you are adding content after mermaid is loaded, or otherwise need @@ -192,25 +226,24 @@ mermaid fully supports webpack. Here is a [working demo](https://github.com/merm ## API usage -The main idea of the API is to be able to call a render function with the graph definition as a string. The render function -will render the graph and call a callback with the resulting SVG code. With this approach it is up to the site creator to -fetch the graph definition from the site (perhaps from a textarea), render it and place the graph somewhere in the site. +The main idea of the API is to be able to call a render function with the graph definition as a string. The render function will render the graph and call a callback with the resulting SVG code. With this approach it is up to the site creator to fetch the graph definition from the site (perhaps from a textarea), render it and place the graph somewhere in the site. The example below show an outline of how this could be used. The example just logs the resulting SVG to the JavaScript console. ```html ``` @@ -223,17 +256,17 @@ The example code below is an extract of what mermaid does when using the API. Th bind events to an SVG when using the API for rendering. ```javascript -const insertSvg = function (svgCode, bindFunctions) { - element.innerHTML = svgCode; - if (typeof callback !== 'undefined') { - callback(id); +// Example of using the bindFunctions +const drawDiagram = async function () { + element = document.querySelector('#graphDiv'); + const graphDefinition = 'graph TB\na-->b'; + const { svg, bindFunctions } = await mermaid.render('graphDiv', graphDefinition); + element.innerHTML = svg; + // This can also be written as `bindFunctions?.(element);` using the `?` shorthand. + if (bindFunctions) { + bindFunctions(element); } - bindFunctions(element); }; - -const id = 'theGraph'; - -mermaidAPI.render(id, txt, insertSvg, element); ``` 1. The graph is generated using the render call. diff --git a/docs/intro/n00b-gettingStarted.md b/docs/intro/n00b-gettingStarted.md index 87592ba27..f4fb69b90 100644 --- a/docs/intro/n00b-gettingStarted.md +++ b/docs/intro/n00b-gettingStarted.md @@ -103,7 +103,7 @@ When writing the .html file, we give two instructions inside the html code to th a. The mermaid code for the diagram we want to create. -b. The importing of mermaid library through the `mermaid.esm.js` or `mermaid.esm.min.mjs` and the `mermaid.initialize()` call, which dictates the appearance of diagrams and also starts the rendering process . +b. The importing of mermaid library through the `mermaid.esm.mjs` or `mermaid.esm.min.mjs` and the `mermaid.initialize()` call, which dictates the appearance of diagrams and also starts the rendering process . **a. The embedded mermaid diagram definition inside a `
`:**
 
@@ -135,7 +135,7 @@ b. The importing of mermaid library through the `mermaid.esm.js` or `mermaid.esm
 ```
 
 **Notes**:
-Rendering in Mermaid is initialized by `mermaid.initialize()` call. You can place `mermaid.initialize()` inside `mermaid.esm.min.mjs` for brevity. However, doing the opposite lets you control when it starts looking for `
`tags inside the web page with `mermaid.initialize()`. This is useful when you think that not all `
` tags may have loaded on the execution of `mermaid.esm.min.mjs` file. +Rendering in Mermaid is initialized by `mermaid.initialize()` call. However, doing the opposite lets you control when it starts looking for `
` tags inside the web page with `mermaid.initialize()`. This is useful when you think that not all `
` tags may have loaded on the execution of `mermaid.esm.min.mjs` file.
 
 `startOnLoad` is one of the parameters that can be defined by `mermaid.initialize()`
 
@@ -143,10 +143,6 @@ Rendering in Mermaid is initialized by `mermaid.initialize()` call. You can plac
 | ----------- | --------------------------------- | ------- | ----------- |
 | startOnLoad | Toggle for Rendering upon loading | Boolean | true, false |
 
-### Adding external diagrams to mermaid
-
-Please refer to the [Mindmap](../syntax/mindmap.md?id=integrating-with-your-librarywebsite) section for more information.
-
 ### Working Examples
 
 **Here is a full working example of the mermaidAPI being called through the CDN:**
diff --git a/packages/mermaid/src/docs/config/usage.md b/packages/mermaid/src/docs/config/usage.md
index dd989069f..c74023952 100644
--- a/packages/mermaid/src/docs/config/usage.md
+++ b/packages/mermaid/src/docs/config/usage.md
@@ -14,21 +14,24 @@ Please note that you can switch versions through the dropdown box at the top rig
 
 For the majority of users, Using the [Live Editor](https://mermaid.live/) would be sufficient, however you may also opt to deploy mermaid as a dependency or using the [Mermaid API](./setup/README.md).
 
-We have compiled some Video [Tutorials](./Tutorials.md) on how to use the mermaid Live Editor.
+We have compiled some Video [Tutorials](./Tutorials.md) on how to use the Mermaid Live Editor.
 
 ### Installing and Hosting Mermaid on a Webpage
 
 **Using the npm package:**
 
-1. You will need to install `node v16`, which would have npm.
+Requirements:
 
-2. Download `yarn` using npm.
+- Node >= 16
 
-3. Enter the following command: `yarn add mermaid`.
-
-4. At this point, you can add mermaid as a dev dependency using this command: `yarn add --dev mermaid`.
-
-5. Alternatively, you can also deploy mermaid using the script tag in an HTML file with mermaid diagram descriptions as is shown in the example below.
+```bash
+# NPM
+npm install mermaid
+# Yarn
+yarn add mermaid
+# PNPM
+pnpm add mermaid
+```
 
 **Hosting mermaid on a web page:**
 
@@ -36,7 +39,9 @@ We have compiled some Video [Tutorials](./Tutorials.md) on how to use the mermai
 
 The easiest way to integrate mermaid on a web page requires two elements:
 
-- A graph definition, inside `
` tags labeled `class=mermaid`. Example:
+- A graph definition, inside `
` tags labeled `class=mermaid`.
+
+Example:
 
 ```html
 
@@ -47,14 +52,13 @@ The easiest way to integrate mermaid on a web page requires two elements:
 
``` -- Inclusion of the mermaid address in the html page body using a `script` tag as an ESM import, and the `mermaidAPI` call. +- The mermaid js script. Added using a `script` tag as an ESM import. Example: ```html ``` @@ -65,9 +69,6 @@ Example: ```html - - -
   graph LR
@@ -77,7 +78,6 @@ Example:
     
@@ -89,11 +89,12 @@ An id attribute is also added to mermaid tags without one. Mermaid can load multiple diagrams, in the same page. -> Try it out, save this code as HTML and load it using any browser.(Except Internet Explorer, please don't use Internet Explorer.) +> Try it out, save this code as HTML and load it using any browser. +> (Except Internet Explorer, please don't use Internet Explorer.) ## Enabling Click Event and Tags in Nodes -A `securityLevel` configuration has to first be cleared, `securityLevel` sets the level of trust for the parsed diagrams and limits click functionality. This was introduce in version 8.2 as a security improvement, aimed at preventing malicious use. +A `securityLevel` configuration has to first be cleared. `securityLevel` sets the level of trust for the parsed diagrams and limits click functionality. This was introduce in version 8.2 as a security improvement, aimed at preventing malicious use. **It is the site owner's responsibility to discriminate between trustworthy and untrustworthy user-bases and we encourage the use of discretion.** @@ -101,7 +102,7 @@ A `securityLevel` configuration has to first be cleared, `securityLevel` sets th | Parameter | Description | Type | Required | Values | | ------------- | --------------------------------- | ------ | -------- | ------------------------------------------ | -| securityLevel | Level of trust for parsed diagram | String | Required | 'sandbox', 'strict', 'loose', 'antiscript' | +| securityLevel | Level of trust for parsed diagram | String | Optional | 'sandbox', 'strict', 'loose', 'antiscript' | Values: @@ -117,26 +118,17 @@ This changes the default behaviour of mermaid so that after upgrade to 8.2, unle **If you are taking responsibility for the diagram source security you can set the `securityLevel` to a value of your choosing . This allows clicks and tags are allowed.** -**To change `securityLevel`, you have to call `mermaidAPI.initialize`:** +**To change `securityLevel`, you have to call `mermaid.initialize`:** ```javascript -mermaidAPI.initialize({ +mermaid.initialize({ securityLevel: 'loose', }); ``` ### Labels out of bounds -If you use dynamically loaded fonts that are loaded through CSS, such as Google fonts, mermaid should wait for the -whole page to load (dom + assets, particularly the fonts file). - -```javascript -$(document).load(function () { - mermaid.initialize(); -}); -``` - -or +If you use dynamically loaded fonts that are loaded through CSS, such as fonts, mermaid should wait for the whole page to load (dom + assets, particularly the fonts file). ```javascript $(document).ready(function () { @@ -149,12 +141,55 @@ Not doing so will most likely result in mermaid rendering graphs that have label If your page has other fonts in its body those might be used instead of the mermaid font. Specifying the font in your styling is a workaround for this. ```css -div.mermaid { +pre.mermaid { font-family: 'trebuchet ms', verdana, arial; } ``` -### Calling `mermaid.init` +### Using `mermaid.run` + +mermaid.run was added in v10 and is the preferred way of handling more complex integration. +By default, `mermaid.run` will be called when the document is ready, rendering all elements with `class="mermaid"`. + +You can customize that behavior by calling `await mermaid.run()`. + +`mermaid.initialize({startOnLoad: false})` will prevent `mermaid.run` from being called automatically after load. + +Render all elements with querySelector ".someOtherClass" + +```js +mermaid.initialize({ startOnLoad: false }); +await mermaid.run({ + querySelector: '.someOtherClass', +}); +``` + +Render all elements passed as an array + +```js +mermaid.initialize({ startOnLoad: false }); +await mermaid.run({ + nodes: [document.getElementById('someId'), document.getElementById('anotherId')], +}); +await mermaid.run({ + nodes: document.querySelectorAll('.yetAnotherClass'), +}); +``` + +Render all `.mermaid` elements while suppressing any error + +```js +mermaid.initialize({ startOnLoad: false }); +await mermaid.run({ + suppressErrors: true, +}); +``` + +### Calling `mermaid.init` - Deprecated + +```warning +mermaid.init is deprecated in v10 and will be removed in v11. Please use mermaid.run instead. +``` By default, `mermaid.init` will be called when the document is ready, finding all elements with `class="mermaid"`. If you are adding content after mermaid is loaded, or otherwise need @@ -188,25 +223,24 @@ mermaid fully supports webpack. Here is a [working demo](https://github.com/merm ## API usage -The main idea of the API is to be able to call a render function with the graph definition as a string. The render function -will render the graph and call a callback with the resulting SVG code. With this approach it is up to the site creator to -fetch the graph definition from the site (perhaps from a textarea), render it and place the graph somewhere in the site. +The main idea of the API is to be able to call a render function with the graph definition as a string. The render function will render the graph and call a callback with the resulting SVG code. With this approach it is up to the site creator to fetch the graph definition from the site (perhaps from a textarea), render it and place the graph somewhere in the site. The example below show an outline of how this could be used. The example just logs the resulting SVG to the JavaScript console. ```html ``` @@ -219,17 +253,17 @@ The example code below is an extract of what mermaid does when using the API. Th bind events to an SVG when using the API for rendering. ```javascript -const insertSvg = function (svgCode, bindFunctions) { - element.innerHTML = svgCode; - if (typeof callback !== 'undefined') { - callback(id); +// Example of using the bindFunctions +const drawDiagram = async function () { + element = document.querySelector('#graphDiv'); + const graphDefinition = 'graph TB\na-->b'; + const { svg, bindFunctions } = await mermaid.render('graphDiv', graphDefinition); + element.innerHTML = svg; + // This can also be written as `bindFunctions?.(element);` using the `?` shorthand. + if (bindFunctions) { + bindFunctions(element); } - bindFunctions(element); }; - -const id = 'theGraph'; - -mermaidAPI.render(id, txt, insertSvg, element); ``` 1. The graph is generated using the render call. diff --git a/packages/mermaid/src/docs/intro/n00b-gettingStarted.md b/packages/mermaid/src/docs/intro/n00b-gettingStarted.md index cfc16e707..fcb3f31ee 100644 --- a/packages/mermaid/src/docs/intro/n00b-gettingStarted.md +++ b/packages/mermaid/src/docs/intro/n00b-gettingStarted.md @@ -86,7 +86,7 @@ When writing the .html file, we give two instructions inside the html code to th a. The mermaid code for the diagram we want to create. -b. The importing of mermaid library through the `mermaid.esm.js` or `mermaid.esm.min.mjs` and the `mermaid.initialize()` call, which dictates the appearance of diagrams and also starts the rendering process . +b. The importing of mermaid library through the `mermaid.esm.mjs` or `mermaid.esm.min.mjs` and the `mermaid.initialize()` call, which dictates the appearance of diagrams and also starts the rendering process . **a. The embedded mermaid diagram definition inside a `
`:**
 
@@ -118,7 +118,7 @@ b. The importing of mermaid library through the `mermaid.esm.js` or `mermaid.esm
 ```
 
 **Notes**:
-Rendering in Mermaid is initialized by `mermaid.initialize()` call. You can place `mermaid.initialize()` inside `mermaid.esm.min.mjs` for brevity. However, doing the opposite lets you control when it starts looking for `
`tags inside the web page with `mermaid.initialize()`. This is useful when you think that not all `
` tags may have loaded on the execution of `mermaid.esm.min.mjs` file. +Rendering in Mermaid is initialized by `mermaid.initialize()` call. However, doing the opposite lets you control when it starts looking for `
` tags inside the web page with `mermaid.initialize()`. This is useful when you think that not all `
` tags may have loaded on the execution of `mermaid.esm.min.mjs` file.
 
 `startOnLoad` is one of the parameters that can be defined by `mermaid.initialize()`
 
@@ -126,10 +126,6 @@ Rendering in Mermaid is initialized by `mermaid.initialize()` call. You can plac
 | ----------- | --------------------------------- | ------- | ----------- |
 | startOnLoad | Toggle for Rendering upon loading | Boolean | true, false |
 
-### Adding external diagrams to mermaid
-
-Please refer to the [Mindmap](../syntax/mindmap.md?id=integrating-with-your-librarywebsite) section for more information.
-
 ### Working Examples
 
 **Here is a full working example of the mermaidAPI being called through the CDN:**

From bdf26673893bd2e5b4bdc75eb3694a5d02202aa0 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Tue, 21 Feb 2023 21:40:06 +0530
Subject: [PATCH 299/309] docs: Fix changelog

---
 CHANGELOG.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index ee6ce1a2f..67672f2d0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -26,7 +26,7 @@ element.innerHTML = svg;
 bindFunctions?.(element);
 
 // >= v10 with promise.then
-mermaid.render('graph TD;A-->B').then(({ svg, bindFunctions }) => {
+mermaid.render('id', 'graph TD;A-->B').then(({ svg, bindFunctions }) => {
   element.innerHTML = svg;
   bindFunctions?.(element);
 });

From fd6ce89933429ff26d0190dd868f9bc2db0621f6 Mon Sep 17 00:00:00 2001
From: Billiam 
Date: Tue, 21 Feb 2023 20:56:26 -0600
Subject: [PATCH 300/309] Add Deepdwn to native integrations list

---
 packages/mermaid/src/docs/ecosystem/integrations.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/packages/mermaid/src/docs/ecosystem/integrations.md b/packages/mermaid/src/docs/ecosystem/integrations.md
index 87593d649..727580664 100644
--- a/packages/mermaid/src/docs/ecosystem/integrations.md
+++ b/packages/mermaid/src/docs/ecosystem/integrations.md
@@ -14,6 +14,7 @@ They also serve as proof of concept, for the variety of things that can be built
 - [Gitea](https://gitea.io) (**Native support**)
 - [Azure Devops](https://docs.microsoft.com/en-us/azure/devops/project/wiki/wiki-markdown-guidance?view=azure-devops#add-mermaid-diagrams-to-a-wiki-page) (**Native support**)
 - [Tuleap](https://docs.tuleap.org/user-guide/writing-in-tuleap.html#graphs) (**Native support**)
+- [Deepdwn](https://billiam.itch.io/deepdwn) (**Native support**)
 - [Joplin](https://joplinapp.org) (**Native support**)
 - [Swimm](https://swimm.io) (**Native support**)
 - [Notion](https://notion.so) (**Native support**)

From 7d4692f7b2b160f3bf64749e918f21bcf9414411 Mon Sep 17 00:00:00 2001
From: Billiam 
Date: Tue, 21 Feb 2023 21:24:39 -0600
Subject: [PATCH 301/309] Add deepdwn to cspell

---
 cSpell.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/cSpell.json b/cSpell.json
index 6f93af103..1d3eec1b2 100644
--- a/cSpell.json
+++ b/cSpell.json
@@ -27,6 +27,7 @@
     "cuzon",
     "cytoscape",
     "dagre",
+    "deepdwn",
     "descr",
     "docsify",
     "docsy",

From 15231924cd6da1d2210dbff51df8e37fb069becb Mon Sep 17 00:00:00 2001
From: Billiam 
Date: Tue, 21 Feb 2023 21:50:02 -0600
Subject: [PATCH 302/309] Regenerate mermaid docs

---
 docs/ecosystem/integrations.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/docs/ecosystem/integrations.md b/docs/ecosystem/integrations.md
index 7ed989f7a..3db4a17bc 100644
--- a/docs/ecosystem/integrations.md
+++ b/docs/ecosystem/integrations.md
@@ -20,6 +20,7 @@ They also serve as proof of concept, for the variety of things that can be built
 - [Gitea](https://gitea.io) (**Native support**)
 - [Azure Devops](https://docs.microsoft.com/en-us/azure/devops/project/wiki/wiki-markdown-guidance?view=azure-devops#add-mermaid-diagrams-to-a-wiki-page) (**Native support**)
 - [Tuleap](https://docs.tuleap.org/user-guide/writing-in-tuleap.html#graphs) (**Native support**)
+- [Deepdwn](https://billiam.itch.io/deepdwn) (**Native support**)
 - [Joplin](https://joplinapp.org) (**Native support**)
 - [Swimm](https://swimm.io) (**Native support**)
 - [Notion](https://notion.so) (**Native support**)

From 8f830a1698d4380514ab2c8289b796f630ba10c1 Mon Sep 17 00:00:00 2001
From: Sidharth Vinod 
Date: Wed, 22 Feb 2023 12:33:50 +0530
Subject: [PATCH 303/309] Fix readme link

---
 README.md       | 2 +-
 README.zh-CN.md | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index f4cf8e105..d42e2f7e1 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@ Mermaid
 Generate diagrams from markdown-like text.
 

- +

diff --git a/README.zh-CN.md b/README.zh-CN.md index 65cf38645..2653ac72b 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -8,7 +8,7 @@ Mermaid 通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。

- +

From ef20e0b77ab83f2c4a3c1eb60d613bb83d7c1a26 Mon Sep 17 00:00:00 2001 From: Yoshi404 <43542068+Julez404@users.noreply.github.com> Date: Wed, 22 Feb 2023 22:34:30 +0100 Subject: [PATCH 304/309] Doc (typo): remove duplicate "be" --- packages/mermaid/src/docs/syntax/sequenceDiagram.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mermaid/src/docs/syntax/sequenceDiagram.md b/packages/mermaid/src/docs/syntax/sequenceDiagram.md index 3f3818589..2b68e5de5 100644 --- a/packages/mermaid/src/docs/syntax/sequenceDiagram.md +++ b/packages/mermaid/src/docs/syntax/sequenceDiagram.md @@ -418,7 +418,7 @@ It is possible to get a sequence number attached to each arrow in a sequence dia ``` -It can also be be turned on via the diagram code as in the diagram: +It can also be turned on via the diagram code as in the diagram: ```mermaid-example sequenceDiagram From f8abc9c6d52ada97482048b1cf5863e604fd08a8 Mon Sep 17 00:00:00 2001 From: "Mr.Hope" Date: Thu, 23 Feb 2023 15:20:17 +0800 Subject: [PATCH 305/309] fix: fix exports "types" import should always be first --- packages/mermaid/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index 3fd41cb88..9fdef30b4 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -7,8 +7,8 @@ "types": "./dist/mermaid.d.ts", "exports": { ".": { - "import": "./dist/mermaid.core.mjs", - "types": "./dist/mermaid.d.ts" + "types": "./dist/mermaid.d.ts", + "import": "./dist/mermaid.core.mjs" }, "./*": "./*" }, From ca97210d67873c95763e116ec74db9136da2d8ab Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 23 Feb 2023 13:13:36 +0530 Subject: [PATCH 306/309] Update CHANGELOG.md --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67672f2d0..6292d9680 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,17 @@ ## [10.0.0](https://github.com/mermaid-js/mermaid/releases/tag/v10.0.0) +### Mermaid is ESM only! + +We've dropped the CJS support. So you will have to update your import scripts as follows. + +```html + +``` + ### mermaid.render is async and doesn't accept callbacks ```js From 8910ecb463dd2361541d99706ea00d127ed38a39 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Thu, 23 Feb 2023 13:18:49 +0530 Subject: [PATCH 307/309] Update CHANGELOG.md --- CHANGELOG.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6292d9680..ecd70d732 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,10 @@ ## [10.0.0](https://github.com/mermaid-js/mermaid/releases/tag/v10.0.0) + ### Mermaid is ESM only! -We've dropped the CJS support. So you will have to update your import scripts as follows. +We've dropped CJS support. So, you will have to update your import scripts as follows. ```html ``` +You can keep using v9 by adding the `@9` in the CDN URL. +```diff +- ++ +``` + ### mermaid.render is async and doesn't accept callbacks ```js From 7372d7d6c53a40562c7e050de392472e9094100b Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Fri, 24 Feb 2023 12:31:29 +0530 Subject: [PATCH 308/309] fix Lint --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ecd70d732..7552efa3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,6 @@ ## [10.0.0](https://github.com/mermaid-js/mermaid/releases/tag/v10.0.0) - ### Mermaid is ESM only! We've dropped CJS support. So, you will have to update your import scripts as follows. @@ -15,6 +14,7 @@ We've dropped CJS support. So, you will have to update your import scripts as fo ``` You can keep using v9 by adding the `@9` in the CDN URL. + ```diff - + From 0409c5ac27d47d52dd519945957ca66876addcdb Mon Sep 17 00:00:00 2001 From: sidharthv96 Date: Fri, 24 Feb 2023 08:34:38 +0000 Subject: [PATCH 309/309] Update docs --- docs/syntax/sequenceDiagram.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/syntax/sequenceDiagram.md b/docs/syntax/sequenceDiagram.md index 5ca9a55f8..26f81452d 100644 --- a/docs/syntax/sequenceDiagram.md +++ b/docs/syntax/sequenceDiagram.md @@ -595,7 +595,7 @@ It is possible to get a sequence number attached to each arrow in a sequence dia ``` -It can also be be turned on via the diagram code as in the diagram: +It can also be turned on via the diagram code as in the diagram: ```mermaid-example sequenceDiagram