From 60db22886ab331d5cd175bd119efab77d63ebf9f Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Mon, 24 Apr 2023 00:15:07 +0530 Subject: [PATCH 1/5] fix Class diagram grammar --- packages/mermaid/src/diagrams/class/parser/classDiagram.jison | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/mermaid/src/diagrams/class/parser/classDiagram.jison b/packages/mermaid/src/diagrams/class/parser/classDiagram.jison index 6a7834eca..0e8bc8163 100644 --- a/packages/mermaid/src/diagrams/class/parser/classDiagram.jison +++ b/packages/mermaid/src/diagrams/class/parser/classDiagram.jison @@ -200,9 +200,9 @@ Function arguments are optional: 'call ()' simply executes 'callb start : mermaidDoc - | statements | direction | directive start + | statements ; direction @@ -272,8 +272,6 @@ statement | clickStatement | cssClassStatement | noteStatement - | directive - | direction | acc_title acc_title_value { $$=$2.trim();yy.setAccTitle($$); } | acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); } | acc_descr_multiline_value { $$=$1.trim();yy.setAccDescription($$); } From d09151e87006e4d9c36981d704f5d68e8232ce00 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Mon, 24 Apr 2023 00:15:30 +0530 Subject: [PATCH 2/5] Update class grammar test --- .../diagrams/class/classDiagramGrammar.spec.js | 13 ------------- .../diagrams/class/classDiagramGrammar.spec.ts | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 13 deletions(-) delete mode 100644 packages/mermaid/src/diagrams/class/classDiagramGrammar.spec.js create mode 100644 packages/mermaid/src/diagrams/class/classDiagramGrammar.spec.ts diff --git a/packages/mermaid/src/diagrams/class/classDiagramGrammar.spec.js b/packages/mermaid/src/diagrams/class/classDiagramGrammar.spec.js deleted file mode 100644 index 4e9e99c70..000000000 --- a/packages/mermaid/src/diagrams/class/classDiagramGrammar.spec.js +++ /dev/null @@ -1,13 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-var-requires -const fs = require('fs'); - -import { LALRGenerator } from 'jison'; - -describe('class diagram grammar', function () { - it('should introduce no new conflicts', function () { - const file = require.resolve('./parser/classDiagram.jison'); - const grammarSource = fs.readFileSync(file, 'utf8'); - const grammarParser = new LALRGenerator(grammarSource, {}); - expect(grammarParser.conflicts < 16).toBe(true); - }); -}); diff --git a/packages/mermaid/src/diagrams/class/classDiagramGrammar.spec.ts b/packages/mermaid/src/diagrams/class/classDiagramGrammar.spec.ts new file mode 100644 index 000000000..eb0c37969 --- /dev/null +++ b/packages/mermaid/src/diagrams/class/classDiagramGrammar.spec.ts @@ -0,0 +1,16 @@ +import { readFile } from 'node:fs/promises'; +// @ts-ignore - no types +import { LALRGenerator } from 'jison'; +import path from 'path'; + +const getAbsolutePath = (relativePath: string) => { + return new URL(path.join(path.dirname(import.meta.url), relativePath)).pathname; +}; + +describe('class diagram grammar', function () { + it('should have no conflicts', async function () { + const grammarSource = await readFile(getAbsolutePath('./parser/classDiagram.jison'), 'utf8'); + const grammarParser = new LALRGenerator(grammarSource, {}); + expect(grammarParser.conflicts).toBe(0); + }); +}); From d125d22488ad0170272dbfd0fc767314d2e96678 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Mon, 24 Apr 2023 00:15:51 +0530 Subject: [PATCH 3/5] Check for conflict when linting jison --- scripts/jison/lint.mts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/jison/lint.mts b/scripts/jison/lint.mts index 95edd4fb1..596ce308b 100644 --- a/scripts/jison/lint.mts +++ b/scripts/jison/lint.mts @@ -14,12 +14,17 @@ const lint = async (file: string): Promise => { console.log(`Linting ${file}`); const jisonCode = await readFile(file, 'utf8'); // @ts-ignore no typings - const jsCode = new jison.Generator(jisonCode, { moduleType: 'amd' }).generate(); + const generator = new jison.Generator(jisonCode, { moduleType: 'amd' }); + const jsCode = generator.generate(); const [result] = await linter.lintText(jsCode); if (result.errorCount > 0) { console.error(`Linting failed for ${file}`); console.error(result.messages); } + if (generator.conflicts > 0) { + console.error(`Linting failed for ${file}. Conflicts found in grammar`); + return false; + } return result.errorCount === 0; }; From 24f5a15f202263dd9acca283dab47ffb45cb6112 Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Mon, 24 Apr 2023 00:34:41 +0530 Subject: [PATCH 4/5] Fix classParser --- packages/mermaid/package.json | 2 +- .../src/diagrams/class/classParser.spec.ts | 78 +++++++++++++++++++ .../diagrams/class/parser/classDiagram.jison | 2 +- 3 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 packages/mermaid/src/diagrams/class/classParser.spec.ts diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index 4f56d9112..7ebcb53ca 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -1,6 +1,6 @@ { "name": "mermaid", - "version": "10.2.0", + "version": "10.2.0-rc.1", "description": "Markdown-ish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.", "type": "module", "module": "./dist/mermaid.core.mjs", diff --git a/packages/mermaid/src/diagrams/class/classParser.spec.ts b/packages/mermaid/src/diagrams/class/classParser.spec.ts new file mode 100644 index 000000000..c479b8272 --- /dev/null +++ b/packages/mermaid/src/diagrams/class/classParser.spec.ts @@ -0,0 +1,78 @@ +import { setConfig } from '../../config.js'; +import classDB from './classDb.js'; +// @ts-ignore - no types in jison +import classDiagram from './parser/classDiagram.jison'; + +setConfig({ + securityLevel: 'strict', +}); + +describe('when parsing class diagram', function () { + beforeEach(function () { + classDiagram.parser.yy = classDB; + classDiagram.parser.yy.clear(); + }); + + it('should parse diagram with direction', () => { + classDiagram.parser.parse(`classDiagram + direction TB + class Student { + -idCard : IdCard + } + class IdCard{ + -id : int + -name : string + } + class Bike{ + -id : int + -name : string + } + Student "1" --o "1" IdCard : carries + Student "1" --o "1" Bike : rides`); + + expect(Object.keys(classDB.getClasses()).length).toBe(3); + expect(classDB.getClasses().Student).toMatchInlineSnapshot(` + { + "annotations": [], + "cssClasses": [], + "domId": "classId-Student-0", + "id": "Student", + "label": "Student", + "members": [ + "-idCard : IdCard", + ], + "methods": [], + "type": "", + } + `); + expect(classDB.getRelations().length).toBe(2); + expect(classDB.getRelations()).toMatchInlineSnapshot(` + [ + { + "id1": "Student", + "id2": "IdCard", + "relation": { + "lineType": 0, + "type1": "none", + "type2": 0, + }, + "relationTitle1": "1", + "relationTitle2": "1", + "title": "carries", + }, + { + "id1": "Student", + "id2": "Bike", + "relation": { + "lineType": 0, + "type1": "none", + "type2": 0, + }, + "relationTitle1": "1", + "relationTitle2": "1", + "title": "rides", + }, + ] + `); + }); +}); diff --git a/packages/mermaid/src/diagrams/class/parser/classDiagram.jison b/packages/mermaid/src/diagrams/class/parser/classDiagram.jison index 0e8bc8163..7afba66bc 100644 --- a/packages/mermaid/src/diagrams/class/parser/classDiagram.jison +++ b/packages/mermaid/src/diagrams/class/parser/classDiagram.jison @@ -200,7 +200,6 @@ Function arguments are optional: 'call ()' simply executes 'callb start : mermaidDoc - | direction | directive start | statements ; @@ -272,6 +271,7 @@ statement | clickStatement | cssClassStatement | noteStatement + | direction | acc_title acc_title_value { $$=$2.trim();yy.setAccTitle($$); } | acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); } | acc_descr_multiline_value { $$=$1.trim();yy.setAccDescription($$); } From 597a1622493a642b5585b1bc11e5a79df4073a7f Mon Sep 17 00:00:00 2001 From: Sidharth Vinod Date: Mon, 24 Apr 2023 00:35:50 +0530 Subject: [PATCH 5/5] Update version --- packages/mermaid/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index 7ebcb53ca..244ebe453 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -1,6 +1,6 @@ { "name": "mermaid", - "version": "10.2.0-rc.1", + "version": "10.2.0-rc.2", "description": "Markdown-ish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.", "type": "module", "module": "./dist/mermaid.core.mjs",