From 72eda9ce5221e318f1e081b8992ecb6e71dbc26d Mon Sep 17 00:00:00 2001 From: omkarht Date: Mon, 17 Feb 2025 20:53:31 +0530 Subject: [PATCH 1/5] Fix: state diagram default direction update --- packages/mermaid/src/diagrams/state/stateDb.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/mermaid/src/diagrams/state/stateDb.js b/packages/mermaid/src/diagrams/state/stateDb.js index cc44659eb..37cea295f 100644 --- a/packages/mermaid/src/diagrams/state/stateDb.js +++ b/packages/mermaid/src/diagrams/state/stateDb.js @@ -643,10 +643,17 @@ export class StateDB { } getDirection() { + const doc = this.rootDoc.find((doc) => doc.stmt === 'dir'); + this.direction = doc ? doc.value : 'TB'; return this.direction; } setDirection(dir) { - this.direction = dir; + let doc = this.rootDoc.find((doc) => doc.stmt === 'dir'); + if (doc) { + doc.value = dir; + } else { + this.rootDoc.unshift({ stmt: 'dir', value: dir }); + } } trimColon(str) { From b78c061a8f5e736cee0f5daebb6fa3017b7a35b2 Mon Sep 17 00:00:00 2001 From: omkarht Date: Tue, 18 Feb 2025 15:40:45 +0530 Subject: [PATCH 2/5] refatored code --- .../mermaid/src/diagrams/state/stateCommon.ts | 5 ++++- packages/mermaid/src/diagrams/state/stateDb.js | 16 ++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/packages/mermaid/src/diagrams/state/stateCommon.ts b/packages/mermaid/src/diagrams/state/stateCommon.ts index 17a1bd24a..2902ce6b0 100644 --- a/packages/mermaid/src/diagrams/state/stateCommon.ts +++ b/packages/mermaid/src/diagrams/state/stateCommon.ts @@ -3,11 +3,14 @@ */ // default diagram direction -export const DEFAULT_DIAGRAM_DIRECTION = 'LR'; +export const DEFAULT_DIAGRAM_DIRECTION = 'TB'; // default direction for any nested documents (composites) export const DEFAULT_NESTED_DOC_DIR = 'TB'; +// parsed statement type for a direction +export const STMT_DIRECTION = 'dir'; + // parsed statement type for a state export const STMT_STATE = 'state'; // parsed statement type for a relation diff --git a/packages/mermaid/src/diagrams/state/stateDb.js b/packages/mermaid/src/diagrams/state/stateDb.js index 37cea295f..b6b5d11ff 100644 --- a/packages/mermaid/src/diagrams/state/stateDb.js +++ b/packages/mermaid/src/diagrams/state/stateDb.js @@ -20,6 +20,7 @@ import { DIVIDER_TYPE, STMT_APPLYCLASS, STMT_CLASSDEF, + STMT_DIRECTION, STMT_RELATION, STMT_STATE, STMT_STYLEDEF, @@ -79,11 +80,6 @@ export class StateDB { */ edges = []; - /** - * @private - * @type {string} - */ - direction = DEFAULT_DIAGRAM_DIRECTION; /** * @private * @type {Array} @@ -643,16 +639,16 @@ export class StateDB { } getDirection() { - const doc = this.rootDoc.find((doc) => doc.stmt === 'dir'); - this.direction = doc ? doc.value : 'TB'; - return this.direction; + const doc = this.rootDoc.find((doc) => doc.stmt === STMT_DIRECTION); + const direction = doc ? doc.value : DEFAULT_DIAGRAM_DIRECTION; + return direction; } setDirection(dir) { - let doc = this.rootDoc.find((doc) => doc.stmt === 'dir'); + const doc = this.rootDoc.find((doc) => doc.stmt === STMT_DIRECTION); if (doc) { doc.value = dir; } else { - this.rootDoc.unshift({ stmt: 'dir', value: dir }); + this.rootDoc.unshift({ stmt: STMT_DIRECTION, value: dir }); } } From 167fef5cff51bf8d8439ec8fc2662123b0dc6cac Mon Sep 17 00:00:00 2001 From: omkarht Date: Tue, 18 Feb 2025 17:23:48 +0530 Subject: [PATCH 3/5] added test cases to check state diagram direction --- .../diagrams/state/stateDiagram-v2.spec.js | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/packages/mermaid/src/diagrams/state/stateDiagram-v2.spec.js b/packages/mermaid/src/diagrams/state/stateDiagram-v2.spec.js index ce20879c3..6458136ba 100644 --- a/packages/mermaid/src/diagrams/state/stateDiagram-v2.spec.js +++ b/packages/mermaid/src/diagrams/state/stateDiagram-v2.spec.js @@ -1,4 +1,5 @@ import stateDiagram, { parser } from './parser/stateDiagram.jison'; +import { DEFAULT_DIAGRAM_DIRECTION } from './stateCommon.js'; import { StateDB } from './stateDb.js'; describe('state diagram V2, ', function () { @@ -412,5 +413,34 @@ describe('state diagram V2, ', function () { const rel_Active_Active = rels.find((rel) => rel.id1 === 'Active' && rel.id2 === 'Active'); expect(rel_Active_Active.relationTitle).toEqual('LOG'); }); + + it('should check default diagram direction', () => { + const diagram = ` + stateDiagram + [*] --> Still + Still --> [*] + `; + + parser.parse(diagram); + + // checking default direction if no direction is specified + const defaultDir = stateDb.getDirection(); + expect(defaultDir).toEqual(DEFAULT_DIAGRAM_DIRECTION); + }); + + it('retrieve the diagram direction correctly', () => { + const diagram = ` + stateDiagram + direction LR + [*] --> Still + Still --> [*] + `; + + parser.parse(diagram); + + //retrieve the diagram direction + const currentDirection = stateDb.getDirection(); + expect(currentDirection).toEqual('LR'); + }); }); }); From da6361f6527918b4b6a9c07cc9558cf2e2c709d2 Mon Sep 17 00:00:00 2001 From: omkarht Date: Tue, 18 Feb 2025 18:36:52 +0530 Subject: [PATCH 4/5] added changeset --- .changeset/weak-trees-perform.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/weak-trees-perform.md diff --git a/.changeset/weak-trees-perform.md b/.changeset/weak-trees-perform.md new file mode 100644 index 000000000..1750103fb --- /dev/null +++ b/.changeset/weak-trees-perform.md @@ -0,0 +1,5 @@ +--- +'mermaid': patch +--- + +In State Diagram refactored getDirection to retrieve the direction from rootDoc, defaulting to DEFAULT_DIAGRAM_DIRECTION and Updated setDirection to modify the existing direction if found or prepend a new entry if not. From d846a8c65a93e0140f4b1e31358cc56eda801e82 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Tue, 18 Feb 2025 23:48:19 +0530 Subject: [PATCH 5/5] chore: Minor refactor --- .changeset/weak-trees-perform.md | 2 +- packages/mermaid/src/diagrams/state/stateDb.js | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.changeset/weak-trees-perform.md b/.changeset/weak-trees-perform.md index 1750103fb..17175301d 100644 --- a/.changeset/weak-trees-perform.md +++ b/.changeset/weak-trees-perform.md @@ -2,4 +2,4 @@ 'mermaid': patch --- -In State Diagram refactored getDirection to retrieve the direction from rootDoc, defaulting to DEFAULT_DIAGRAM_DIRECTION and Updated setDirection to modify the existing direction if found or prepend a new entry if not. +fix: `getDirection` and `setDirection` in `stateDb` refactored to return and set actual direction diff --git a/packages/mermaid/src/diagrams/state/stateDb.js b/packages/mermaid/src/diagrams/state/stateDb.js index 1080451c2..029db9c6f 100644 --- a/packages/mermaid/src/diagrams/state/stateDb.js +++ b/packages/mermaid/src/diagrams/state/stateDb.js @@ -657,13 +657,21 @@ export class StateDB { } } - getDirection() { - const doc = this.rootDoc.find((doc) => doc.stmt === STMT_DIRECTION); - const direction = doc ? doc.value : DEFAULT_DIAGRAM_DIRECTION; - return direction; + /** + * Finds the direction statement in the root document. + * @private + * @returns {{ value: string } | undefined} - the direction statement if present + */ + getDirectionStatement() { + return this.rootDoc.find((doc) => doc.stmt === STMT_DIRECTION); } + + getDirection() { + return this.getDirectionStatement()?.value ?? DEFAULT_DIAGRAM_DIRECTION; + } + setDirection(dir) { - const doc = this.rootDoc.find((doc) => doc.stmt === STMT_DIRECTION); + const doc = this.getDirectionStatement(); if (doc) { doc.value = dir; } else {