fix: relationship label to be optional in ER diagram syntax

on-behalf-of: @Mermaid-Chart <hello@mermaidchart.com>
This commit is contained in:
darshanr0107
2025-08-20 18:36:45 +05:30
parent 7171237b96
commit 299226f8c2
3 changed files with 44 additions and 8 deletions

View File

@@ -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', () => { it('should render relationship labels with line breaks', () => {
imgSnapshotTest( imgSnapshotTest(
` `

View File

@@ -94,6 +94,22 @@ start
: 'ER_DIAGRAM' document 'EOF' { /*console.log('finished parsing');*/ } : '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 document
: /* empty */ { $$ = [] } : /* empty */ { $$ = [] }
| document line {$1.push($2);$$ = $1} | document line {$1.push($2);$$ = $1}
@@ -108,32 +124,34 @@ line
statement statement
: entityName relSpec entityName COLON role : entityName relSpec entityName maybeRole
{ {
yy.addEntity($1); yy.addEntity($1);
yy.addEntity($3); 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($1);
yy.addEntity($5); yy.addEntity($5);
yy.addRelationship($1, $9, $5, $4); yy.addRelationship($1, $8, $5, $4);
yy.setClass([$1], $3); yy.setClass([$1], $3);
yy.setClass([$5], $7); yy.setClass([$5], $7);
} }
| entityName STYLE_SEPARATOR idList relSpec entityName COLON role | entityName STYLE_SEPARATOR idList relSpec entityName maybeRole
{ {
yy.addEntity($1); yy.addEntity($1);
yy.addEntity($5); yy.addEntity($5);
yy.addRelationship($1, $7, $5, $4); yy.addRelationship($1, $6, $5, $4);
yy.setClass([$1], $3); yy.setClass([$1], $3);
} }
| entityName relSpec entityName STYLE_SEPARATOR idList COLON role | entityName relSpec entityName STYLE_SEPARATOR idList maybeRole
{ {
yy.addEntity($1); yy.addEntity($1);
yy.addEntity($3); yy.addEntity($3);
yy.addRelationship($1, $7, $3, $2); yy.addRelationship($1, $6, $3, $2);
yy.setClass([$3], $5); yy.setClass([$3], $5);
} }
| entityName BLOCK_START attributes BLOCK_STOP | entityName BLOCK_START attributes BLOCK_STOP

View File

@@ -981,6 +981,12 @@ describe('when parsing ER diagram it...', function () {
expect(rels[0].roleA).toBe('places'); 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 () { it('should represent parent-child relationship correctly', function () {
erDiagram.parser.parse('erDiagram\nPROJECT u--o{ TEAM_MEMBER : "parent"'); erDiagram.parser.parse('erDiagram\nPROJECT u--o{ TEAM_MEMBER : "parent"');
const rels = erDb.getRelationships(); const rels = erDb.getRelationships();