Merge branch 'develop' into sidv/stateDB-ts

This commit is contained in:
Sidharth Vinod
2025-02-20 16:31:59 +05:30
committed by GitHub
7 changed files with 818 additions and 869 deletions

View File

@@ -0,0 +1,5 @@
---
'mermaid': patch
---
fix: `mermaidAPI.getDiagramFromText()` now returns a new different db for each sequence diagram. Added unique IDs for messages.

File diff suppressed because it is too large Load Diff

View File

@@ -1,16 +1,26 @@
import type { DiagramDefinition } from '../../diagram-api/types.js'; import type { DiagramDefinition } from '../../diagram-api/types.js';
// @ts-ignore: JISON doesn't support types // @ts-ignore: JISON doesn't support types
import parser from './parser/sequenceDiagram.jison'; import parser from './parser/sequenceDiagram.jison';
import db from './sequenceDb.js'; import { SequenceDB } from './sequenceDb.js';
import styles from './styles.js'; import styles from './styles.js';
import { setConfig } from '../../diagram-api/diagramAPI.js';
import renderer from './sequenceRenderer.js'; import renderer from './sequenceRenderer.js';
import type { MermaidConfig } from '../../config.type.js';
export const diagram: DiagramDefinition = { export const diagram: DiagramDefinition = {
parser, parser,
db, get db() {
return new SequenceDB();
},
renderer, renderer,
styles, styles,
init: ({ wrap }) => { init: (cnf: MermaidConfig) => {
db.setWrap(wrap); if (!cnf.sequence) {
cnf.sequence = {};
}
if (cnf.wrap) {
cnf.sequence.wrap = cnf.wrap;
setConfig({ sequence: { wrap: cnf.wrap } });
}
}, },
}; };

View File

@@ -1538,7 +1538,6 @@ const calculateLoopBounds = async function (messages, actors, _maxWidthPerActor,
let current, noteModel, msgModel; let current, noteModel, msgModel;
for (const msg of messages) { for (const msg of messages) {
msg.id = utils.random({ length: 10 });
switch (msg.type) { switch (msg.type) {
case diagObj.db.LINETYPE.LOOP_START: case diagObj.db.LINETYPE.LOOP_START:
case diagObj.db.LINETYPE.ALT_START: case diagObj.db.LINETYPE.ALT_START:

View File

@@ -20,6 +20,7 @@ export interface Actor {
} }
export interface Message { export interface Message {
id: string;
from?: string; from?: string;
to?: string; to?: string;
message: message:

View File

@@ -67,10 +67,11 @@ vi.mock('stylis', () => {
import { compile, serialize } from 'stylis'; import { compile, serialize } from 'stylis';
import { Diagram } from './Diagram.js'; import { Diagram } from './Diagram.js';
import { decodeEntities, encodeEntities } from './utils.js';
import { toBase64 } from './utils/base64.js';
import { ClassDB } from './diagrams/class/classDb.js'; import { ClassDB } from './diagrams/class/classDb.js';
import { FlowDB } from './diagrams/flowchart/flowDb.js'; import { FlowDB } from './diagrams/flowchart/flowDb.js';
import { SequenceDB } from './diagrams/sequence/sequenceDb.js';
import { decodeEntities, encodeEntities } from './utils.js';
import { toBase64 } from './utils/base64.js';
import { StateDB } from './diagrams/state/stateDb.js'; import { StateDB } from './diagrams/state/stateDb.js';
/** /**
@@ -925,28 +926,18 @@ graph TD;A--x|text including URL space|B;`)
); );
const sequenceDiagram2 = await mermaidAPI.getDiagramFromText( const sequenceDiagram2 = await mermaidAPI.getDiagramFromText(
`sequenceDiagram `sequenceDiagram
actor A1
Alice->>+John: Hello John, how are you? Alice->>+John: Hello John, how are you?
Alice->>+John: John, can you hear me? Alice->>+John: John, can you hear me?
John-->>-Alice: Hi Alice, I can hear you! John-->>-Alice: Hi Alice, I can hear you!
John-->>-Alice: I feel great!` John-->>-Alice: I feel great!`
); );
// Since sequenceDiagram will return same Db object each time, we can compare the db to be same.
expect(sequenceDiagram1.db).toBe(sequenceDiagram2.db); // Since sequenceDiagram will return new Db object each time, we can compare the db to be different.
expect(sequenceDiagram1.db).not.toBe(sequenceDiagram2.db);
assert(sequenceDiagram1.db instanceof SequenceDB);
assert(sequenceDiagram2.db instanceof SequenceDB);
expect(sequenceDiagram1.db.getActors()).not.toEqual(sequenceDiagram2.db.getActors());
}); });
}); });
// Sequence Diagram currently uses a singleton DB, so this test will fail
it.fails('should not modify db when rendering different sequence diagrams', async () => {
const sequenceDiagram1 = await mermaidAPI.getDiagramFromText(
`sequenceDiagram
Alice->>Bob: Hello Bob, how are you?
Bob-->>John: How about you John?`
);
const sequenceDiagram2 = await mermaidAPI.getDiagramFromText(
`sequenceDiagram
Alice->>Bob: Hello Bob, how are you?
Bob-->>John: How about you John?`
);
expect(sequenceDiagram1.db).not.toBe(sequenceDiagram2.db);
});
}); });