diff --git a/.changeset/fix-sequence-hang-missing-space-after-as.md b/.changeset/fix-sequence-hang-missing-space-after-as.md new file mode 100644 index 00000000000..505cc9a0fed --- /dev/null +++ b/.changeset/fix-sequence-hang-missing-space-after-as.md @@ -0,0 +1,5 @@ +--- +'mermaid': patch +--- + +fix: prevent sequence diagram hang when "as" is used without a trailing space in participant declarations diff --git a/packages/mermaid/src/diagrams/sequence/parser/sequenceDiagram.jison b/packages/mermaid/src/diagrams/sequence/parser/sequenceDiagram.jison index 49b8daba61b..a5cdd49f383 100644 --- a/packages/mermaid/src/diagrams/sequence/parser/sequenceDiagram.jison +++ b/packages/mermaid/src/diagrams/sequence/parser/sequenceDiagram.jison @@ -36,6 +36,7 @@ [^<>:\n,;@\s]+(?=\s+as\s) { yytext = yytext.trim(); this.begin('ALIAS'); return 'ACTOR'; } [^<>:\n,;@]+(?=\s*[\n;#]|$) { yytext = yytext.trim(); this.popState(); return 'ACTOR'; } [^<>:\n,;@]*\<[^\n]* { this.popState(); return 'INVALID'; } +[^\n]+ { yytext = yytext.trim(); this.popState(); return 'INVALID'; } "box" { this.begin('LINE'); return 'box'; } "participant" { this.begin('ID'); return 'participant'; } "actor" { this.begin('ID'); return 'participant_actor'; } diff --git a/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js b/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js index 7b75f1d4357..e6c664dc8bd 100644 --- a/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js +++ b/packages/mermaid/src/diagrams/sequence/sequenceDiagram.spec.js @@ -2622,6 +2622,20 @@ Bob->>Alice:Got it! expect(error).toBe(true); }); + it('should not hang when "as" is used without a space before the alias text', async () => { + let errorMessage = ''; + try { + await Diagram.fromText(` + sequenceDiagram + participant X_AutoPublishable asAAAAAAAAAAAAA:AAAAAAAAAAAAA + `); + } catch (e) { + errorMessage = e instanceof Error ? e.message : String(e); + } + expect(errorMessage).not.toBe(''); + expect(errorMessage).not.toContain('Lexical error'); + }, 5000); + it('should parse participant with stereotype and alias', async () => { const diagram = await Diagram.fromText(` sequenceDiagram