From 299226f8c22101fe59d08e05b4e47abf336859ae Mon Sep 17 00:00:00 2001 From: darshanr0107 Date: Wed, 20 Aug 2025 18:36:45 +0530 Subject: [PATCH] fix: relationship label to be optional in ER diagram syntax on-behalf-of: @Mermaid-Chart --- .../integration/rendering/erDiagram.spec.js | 12 +++++++ .../src/diagrams/er/parser/erDiagram.jison | 34 ++++++++++++++----- .../src/diagrams/er/parser/erDiagram.spec.js | 6 ++++ 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/cypress/integration/rendering/erDiagram.spec.js b/cypress/integration/rendering/erDiagram.spec.js index 8f6193f96..7d59a5793 100644 --- a/cypress/integration/rendering/erDiagram.spec.js +++ b/cypress/integration/rendering/erDiagram.spec.js @@ -322,6 +322,18 @@ ORDER ||--|{ LINE-ITEM : contains ); }); + it('should render an ER diagram without labels also', () => { + imgSnapshotTest( + ` + erDiagram + BOOK }|..|{ AUTHOR + BOOK }|..|{ GENRE + AUTHOR }|..|{ GENRE + `, + { logLevel: 1 } + ); + }); + it('should render relationship labels with line breaks', () => { imgSnapshotTest( ` diff --git a/packages/mermaid/src/diagrams/er/parser/erDiagram.jison b/packages/mermaid/src/diagrams/er/parser/erDiagram.jison index 2b59309fb..d3f5c0683 100644 --- a/packages/mermaid/src/diagrams/er/parser/erDiagram.jison +++ b/packages/mermaid/src/diagrams/er/parser/erDiagram.jison @@ -94,6 +94,22 @@ start : 'ER_DIAGRAM' document 'EOF' { /*console.log('finished parsing');*/ } ; +relationship + : ENTITY relationType ENTITY maybeRole + { + yy.addRelationship($1, $4, $3, $2); + }; + +maybeRole + : COLON role + { + $$ = $2; + } + | /* empty */ + { + $$ = ''; + }; + document : /* empty */ { $$ = [] } | document line {$1.push($2);$$ = $1} @@ -108,32 +124,34 @@ line statement - : entityName relSpec entityName COLON role + : entityName relSpec entityName maybeRole { yy.addEntity($1); yy.addEntity($3); - yy.addRelationship($1, $5, $3, $2); + yy.addRelationship($1, $4, $3, $2); } - | entityName STYLE_SEPARATOR idList relSpec entityName STYLE_SEPARATOR idList COLON role + | entityName STYLE_SEPARATOR idList relSpec entityName STYLE_SEPARATOR idList maybeRole + { yy.addEntity($1); yy.addEntity($5); - yy.addRelationship($1, $9, $5, $4); + yy.addRelationship($1, $8, $5, $4); yy.setClass([$1], $3); yy.setClass([$5], $7); } - | entityName STYLE_SEPARATOR idList relSpec entityName COLON role + | entityName STYLE_SEPARATOR idList relSpec entityName maybeRole + { yy.addEntity($1); yy.addEntity($5); - yy.addRelationship($1, $7, $5, $4); + yy.addRelationship($1, $6, $5, $4); yy.setClass([$1], $3); } - | entityName relSpec entityName STYLE_SEPARATOR idList COLON role + | entityName relSpec entityName STYLE_SEPARATOR idList maybeRole { yy.addEntity($1); yy.addEntity($3); - yy.addRelationship($1, $7, $3, $2); + yy.addRelationship($1, $6, $3, $2); yy.setClass([$3], $5); } | entityName BLOCK_START attributes BLOCK_STOP diff --git a/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js b/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js index fd1d2a9e5..aabedfd17 100644 --- a/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js +++ b/packages/mermaid/src/diagrams/er/parser/erDiagram.spec.js @@ -981,6 +981,12 @@ describe('when parsing ER diagram it...', function () { expect(rels[0].roleA).toBe('places'); }); + it('should allow label as optional', function () { + erDiagram.parser.parse('erDiagram\nCUSTOMER ||--|{ ORDER'); + const rels = erDb.getRelationships(); + expect(rels[0].roleA).toBe(''); + }); + it('should represent parent-child relationship correctly', function () { erDiagram.parser.parse('erDiagram\nPROJECT u--o{ TEAM_MEMBER : "parent"'); const rels = erDb.getRelationships();