From cbe9490dc094f257fa854945c485a1edc9473f22 Mon Sep 17 00:00:00 2001 From: Reda Al Sulais Date: Sun, 20 Aug 2023 17:23:33 +0300 Subject: [PATCH] feat!: integrate `info` parser into `mermaid` package BREAKING CHANGE: remove `showInfo` from `infoDb`. --- packages/mermaid/package.json | 1 + packages/mermaid/src/diagram-api/types.ts | 7 ++- .../src/diagrams/common/populateCommonDb.ts | 9 ++++ .../mermaid/src/diagrams/info/info.spec.ts | 35 ++++++++------ packages/mermaid/src/diagrams/info/infoDb.ts | 21 ++------ .../mermaid/src/diagrams/info/infoDiagram.ts | 3 +- .../mermaid/src/diagrams/info/infoParser.ts | 12 +++++ .../mermaid/src/diagrams/info/infoTypes.ts | 6 +-- .../src/diagrams/info/parser/info.jison | 48 ------------------- pnpm-lock.yaml | 3 ++ 10 files changed, 59 insertions(+), 86 deletions(-) create mode 100644 packages/mermaid/src/diagrams/common/populateCommonDb.ts create mode 100644 packages/mermaid/src/diagrams/info/infoParser.ts delete mode 100644 packages/mermaid/src/diagrams/info/parser/info.jison diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json index 81d89173d..39737f230 100644 --- a/packages/mermaid/package.json +++ b/packages/mermaid/package.json @@ -71,6 +71,7 @@ "khroma": "^2.0.0", "lodash-es": "^4.17.21", "mdast-util-from-markdown": "^1.3.0", + "mermaid-parser": "workspace:*", "stylis": "^4.1.3", "ts-dedent": "^2.2.0", "uuid": "^9.0.0" diff --git a/packages/mermaid/src/diagram-api/types.ts b/packages/mermaid/src/diagram-api/types.ts index 6da97147a..c92af4d2c 100644 --- a/packages/mermaid/src/diagram-api/types.ts +++ b/packages/mermaid/src/diagram-api/types.ts @@ -16,11 +16,16 @@ export interface InjectUtils { * Generic Diagram DB that may apply to any diagram type. */ export interface DiagramDB { + // db clear?: () => void; setDiagramTitle?: (title: string) => void; - setDisplayMode?: (title: string) => void; + getDiagramTitle?: () => string; + setAccTitle?: (title: string) => void; getAccTitle?: () => string; + setAccDescription?: (describetion: string) => void; getAccDescription?: () => string; + + setDisplayMode?: (title: string) => void; bindFunctions?: (element: Element) => void; } diff --git a/packages/mermaid/src/diagrams/common/populateCommonDb.ts b/packages/mermaid/src/diagrams/common/populateCommonDb.ts new file mode 100644 index 000000000..f0e4dcdb3 --- /dev/null +++ b/packages/mermaid/src/diagrams/common/populateCommonDb.ts @@ -0,0 +1,9 @@ +import type { DiagramAST } from 'mermaid-parser'; + +import type { DiagramDB } from '../../diagram-api/types.js'; + +export function populateCommonDb(ast: DiagramAST, db: DiagramDB) { + ast.accDescr && db.setAccDescription?.(ast.accDescr); + ast.accTitle && db.setAccTitle?.(ast.accTitle); + ast.title && db.setDiagramTitle?.(ast.title); +} diff --git a/packages/mermaid/src/diagrams/info/info.spec.ts b/packages/mermaid/src/diagrams/info/info.spec.ts index 076f04f69..b7adf9f2e 100644 --- a/packages/mermaid/src/diagrams/info/info.spec.ts +++ b/packages/mermaid/src/diagrams/info/info.spec.ts @@ -1,24 +1,31 @@ -// @ts-ignore - jison doesn't export types -import { parser } from './parser/info.jison'; -import { db } from './infoDb.js'; - -describe('info diagram', () => { - beforeEach(() => { - parser.yy = db; - parser.yy.clear(); - }); +import { parser } from './infoParser.js'; +describe('info', () => { it('should handle an info definition', () => { const str = `info`; - parser.parse(str); - - expect(db.getInfo()).toBeFalsy(); + expect(() => { + parser.parse(str); + }).not.toThrow(); }); it('should handle an info definition with showInfo', () => { const str = `info showInfo`; - parser.parse(str); + expect(() => { + parser.parse(str); + }).not.toThrow(); + }); - expect(db.getInfo()).toBeTruthy(); + it('should throw because of unsupported info grammar', () => { + const str = `info unsupported`; + expect(() => { + parser.parse(str); + }).toThrow('Parsing failed: unexpected character: ->u<- at offset: 5, skipped 11 characters.'); + }); + + it('should throw because of unsupported info grammar', () => { + const str = `info unsupported`; + expect(() => { + parser.parse(str); + }).toThrow('Parsing failed: unexpected character: ->u<- at offset: 5, skipped 11 characters.'); }); }); diff --git a/packages/mermaid/src/diagrams/info/infoDb.ts b/packages/mermaid/src/diagrams/info/infoDb.ts index ff4bfcae0..f05908522 100644 --- a/packages/mermaid/src/diagrams/info/infoDb.ts +++ b/packages/mermaid/src/diagrams/info/infoDb.ts @@ -1,23 +1,10 @@ import type { InfoFields, InfoDB } from './infoTypes.js'; +import { version } from '../../../package.json'; -export const DEFAULT_INFO_DB: InfoFields = { - info: false, -} as const; +export const DEFAULT_INFO_DB: InfoFields = { version } as const; -let info: boolean = DEFAULT_INFO_DB.info; - -export const setInfo = (toggle: boolean): void => { - info = toggle; -}; - -export const getInfo = (): boolean => info; - -const clear = (): void => { - info = DEFAULT_INFO_DB.info; -}; +export const getVersion = (): string => DEFAULT_INFO_DB.version; export const db: InfoDB = { - clear, - setInfo, - getInfo, + getVersion, }; diff --git a/packages/mermaid/src/diagrams/info/infoDiagram.ts b/packages/mermaid/src/diagrams/info/infoDiagram.ts index b21827b5f..442616490 100644 --- a/packages/mermaid/src/diagrams/info/infoDiagram.ts +++ b/packages/mermaid/src/diagrams/info/infoDiagram.ts @@ -1,6 +1,5 @@ import type { DiagramDefinition } from '../../diagram-api/types.js'; -// @ts-ignore - jison doesn't export types -import parser from './parser/info.jison'; +import { parser } from './infoParser.js'; import { db } from './infoDb.js'; import { renderer } from './infoRenderer.js'; diff --git a/packages/mermaid/src/diagrams/info/infoParser.ts b/packages/mermaid/src/diagrams/info/infoParser.ts new file mode 100644 index 000000000..7f94fb6fa --- /dev/null +++ b/packages/mermaid/src/diagrams/info/infoParser.ts @@ -0,0 +1,12 @@ +import type { Info } from 'mermaid-parser'; +import { parse } from 'mermaid-parser'; + +import { log } from '../../logger.js'; +import type { ParserDefinition } from '../../diagram-api/types.js'; + +export const parser: ParserDefinition = { + parse: (input: string): void => { + const ast: Info = parse('info', input); + log.debug(ast); + }, +}; diff --git a/packages/mermaid/src/diagrams/info/infoTypes.ts b/packages/mermaid/src/diagrams/info/infoTypes.ts index 239f8fdda..82c25e2da 100644 --- a/packages/mermaid/src/diagrams/info/infoTypes.ts +++ b/packages/mermaid/src/diagrams/info/infoTypes.ts @@ -1,11 +1,9 @@ import type { DiagramDB } from '../../diagram-api/types.js'; export interface InfoFields { - info: boolean; + version: string; } export interface InfoDB extends DiagramDB { - clear: () => void; - setInfo: (info: boolean) => void; - getInfo: () => boolean; + getVersion: () => string; } diff --git a/packages/mermaid/src/diagrams/info/parser/info.jison b/packages/mermaid/src/diagrams/info/parser/info.jison deleted file mode 100644 index 473b63fcf..000000000 --- a/packages/mermaid/src/diagrams/info/parser/info.jison +++ /dev/null @@ -1,48 +0,0 @@ -/** mermaid - * https://knsv.github.io/mermaid - * (c) 2015 Knut Sveidqvist - * MIT license. - */ -%lex - -%options case-insensitive - -%{ - // Pre-lexer code can go here -%} - -%% - -"info" return 'info' ; -[\s\n\r]+ return 'NL' ; -[\s]+ return 'space'; -"showInfo" return 'showInfo'; -<> return 'EOF' ; -. return 'TXT' ; - -/lex - -%start start - -%% /* language grammar */ - -start -// %{ : info document 'EOF' { return yy; } } - : info document 'EOF' { return yy; } - ; - -document - : /* empty */ - | document line - ; - -line - : statement { } - | 'NL' - ; - -statement - : showInfo { yy.setInfo(true); } - ; - -%% diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9a3f4eeb0..34f1c5b23 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -233,6 +233,9 @@ importers: mdast-util-from-markdown: specifier: ^1.3.0 version: 1.3.0 + mermaid-parser: + specifier: workspace:* + version: link:../parser stylis: specifier: ^4.1.3 version: 4.1.3