diff --git a/.changeset/sweet-games-build.md b/.changeset/sweet-games-build.md new file mode 100644 index 000000000..a71e3de25 --- /dev/null +++ b/.changeset/sweet-games-build.md @@ -0,0 +1,5 @@ +--- +'mermaid': patch +--- + +fix(er-diagram): prevent syntax error when using 'u', numbers, and decimals in node names diff --git a/cypress/integration/rendering/erDiagram.spec.js b/cypress/integration/rendering/erDiagram.spec.js index 8f6193f96..b9c8bbbf4 100644 --- a/cypress/integration/rendering/erDiagram.spec.js +++ b/cypress/integration/rendering/erDiagram.spec.js @@ -369,4 +369,92 @@ ORDER ||--|{ LINE-ITEM : contains ); }); }); + + describe('Special characters and numbers syntax', () => { + it('should render ER diagram with numeric entity names', () => { + imgSnapshotTest( + ` + erDiagram + 1 ||--|| ORDER : places + ORDER ||--|{ 2 : contains + 2 ||--o{ 3.5 : references + `, + { logLevel: 1 } + ); + }); + + it('should render ER diagram with "u" character in entity names and cardinality', () => { + imgSnapshotTest( + ` + erDiagram + CUSTOMER ||--|| u : has + u ||--|| ORDER : places + PROJECT u--o{ TEAM_MEMBER : "parent" + `, + { logLevel: 1 } + ); + }); + + it('should render ER diagram with decimal numbers in relationships', () => { + imgSnapshotTest( + ` + erDiagram + 2.5 ||--|| 1.5 : has + CUSTOMER ||--o{ 3.14 : references + 1.0 ||--|{ ORDER : contains + `, + { logLevel: 1 } + ); + }); + + it('should render ER diagram with numeric entity names and attributes', () => { + imgSnapshotTest( + ` + erDiagram + 1 { + string name + int value + } + 1 ||--|| ORDER : places + ORDER { + float price + string description + } + `, + { logLevel: 1 } + ); + }); + + it('should render complex ER diagram with mixed special entity names', () => { + imgSnapshotTest( + ` + erDiagram + CUSTOMER ||--o{ 1 : places + 1 ||--|{ u : contains + 1.5 + u ||--|| 2.5 : processes + 2.5 { + string id + float value + } + u { + varchar(50) name + int count + } + `, + { logLevel: 1 } + ); + }); + it('should render ER diagram with numeric entity names and attributes', () => { + imgSnapshotTest( + `erDiagram + PRODUCT ||--o{ ORDER-ITEM : has + 1.5 + u + 1 + `, + { logLevel: 1 } + ); + }); + }); }); diff --git a/packages/mermaid/src/diagrams/er/parser/erDiagram.jison b/packages/mermaid/src/diagrams/er/parser/erDiagram.jison index 2b59309fb..f581c6777 100644 --- a/packages/mermaid/src/diagrams/er/parser/erDiagram.jison +++ b/packages/mermaid/src/diagrams/er/parser/erDiagram.jison @@ -66,12 +66,15 @@ accDescr\s*"{"\s* { this.begin("acc_descr_multili \}\| return 'ONE_OR_MORE'; "one" return 'ONLY_ONE'; "only one" return 'ONLY_ONE'; -"1" return 'ONLY_ONE'; +[0-9]+\.[0-9]+ return 'DECIMAL_NUM'; +"1"(?=\s+[A-Za-z_"']) return 'ONLY_ONE'; +"1" return 'ENTITY_ONE'; +[0-9]+ return 'NUM'; \|\| return 'ONLY_ONE'; o\| return 'ZERO_OR_ONE'; o\{ return 'ZERO_OR_MORE'; \|\{ return 'ONE_OR_MORE'; -\s*u return 'MD_PARENT'; +u(?=[\.\-\|]) return 'MD_PARENT'; \.\. return 'NON_IDENTIFYING'; \-\- return 'IDENTIFYING'; "to" return 'IDENTIFYING'; @@ -80,13 +83,15 @@ o\{ return 'ZERO_OR_MORE'; \-\. return 'NON_IDENTIFYING';