mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-08-15 06:19:24 +02:00
fix: Handle langium data loss warning
It's not an issue to actually lose the data, as we're just taking the last value anyways. But having the warnings clog up the console means we might miss actual warnings.
This commit is contained in:
@@ -2,13 +2,13 @@ import type { DiagramAST } from '@mermaid-js/parser';
|
||||
import type { DiagramDB } from '../../diagram-api/types.js';
|
||||
|
||||
export function populateCommonDb(ast: DiagramAST, db: DiagramDB) {
|
||||
if (ast.accDescr) {
|
||||
db.setAccDescription?.(ast.accDescr);
|
||||
if (ast.accDescr?.length > 0) {
|
||||
db.setAccDescription?.(ast.accDescr.pop() ?? '');
|
||||
}
|
||||
if (ast.accTitle) {
|
||||
db.setAccTitle?.(ast.accTitle);
|
||||
if (ast.accTitle?.length > 0) {
|
||||
db.setAccTitle?.(ast.accTitle.pop() ?? '');
|
||||
}
|
||||
if (ast.title) {
|
||||
db.setDiagramTitle?.(ast.title);
|
||||
if (ast.title?.length > 0) {
|
||||
db.setDiagramTitle?.(ast.title.pop() ?? '');
|
||||
}
|
||||
}
|
||||
|
@@ -8,7 +8,7 @@ fragment EOL returns string:
|
||||
;
|
||||
|
||||
fragment TitleAndAccessibilities:
|
||||
((accDescr=ACC_DESCR | accTitle=ACC_TITLE | title=TITLE) EOL)+
|
||||
((accDescr+=ACC_DESCR | accTitle+=ACC_TITLE | title+=TITLE) EOL)+
|
||||
;
|
||||
|
||||
terminal BOOLEAN returns boolean: 'true' | 'false';
|
||||
|
@@ -1,6 +1,5 @@
|
||||
import type { GrammarAST, Stream, TokenBuilderOptions } from 'langium';
|
||||
import type { TokenType } from 'chevrotain';
|
||||
|
||||
import { DefaultTokenBuilder } from 'langium';
|
||||
|
||||
export abstract class AbstractMermaidTokenBuilder extends DefaultTokenBuilder {
|
||||
|
@@ -1,6 +1,5 @@
|
||||
import type { CstNode, GrammarAST, ValueType } from 'langium';
|
||||
import { DefaultValueConverter } from 'langium';
|
||||
|
||||
import { accessibilityDescrRegex, accessibilityTitleRegex, titleRegex } from './matcher.js';
|
||||
|
||||
const rulesRegexes: Record<string, RegExp> = {
|
||||
@@ -31,14 +30,12 @@ export abstract class AbstractMermaidValueConverter extends DefaultValueConverte
|
||||
): ValueType {
|
||||
let value: ValueType | undefined = this.runCommonConverter(rule, input, cstNode);
|
||||
|
||||
if (value === undefined) {
|
||||
value = this.runCustomConverter(rule, input, cstNode);
|
||||
}
|
||||
if (value === undefined) {
|
||||
return super.runConverter(rule, input, cstNode);
|
||||
value ??= this.runCustomConverter(rule, input, cstNode);
|
||||
if (value !== undefined) {
|
||||
return value;
|
||||
}
|
||||
|
||||
return value;
|
||||
return super.runConverter(rule, input, cstNode);
|
||||
}
|
||||
|
||||
private runCommonConverter(
|
||||
|
@@ -1,5 +1,4 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import { Architecture } from '../src/language/index.js';
|
||||
import { expectNoErrorsOrAlternatives, architectureParse as parse } from './test-util.js';
|
||||
|
||||
@@ -33,7 +32,7 @@ describe('architecture', () => {
|
||||
expect(result.value.$type).toBe(Architecture);
|
||||
|
||||
const { title } = result.value;
|
||||
expect(title).toBe('sample title');
|
||||
expect(title).toEqual(['sample title']);
|
||||
});
|
||||
|
||||
it.each([
|
||||
@@ -48,7 +47,7 @@ describe('architecture', () => {
|
||||
expect(result.value.$type).toBe(Architecture);
|
||||
|
||||
const { title } = result.value;
|
||||
expect(title).toBe('sample title');
|
||||
expect(title).toEqual(['sample title']);
|
||||
});
|
||||
|
||||
it('should handle regular architecture + title + accTitle + accDescr', () => {
|
||||
@@ -62,9 +61,9 @@ describe('architecture', () => {
|
||||
expect(result.value.$type).toBe(Architecture);
|
||||
|
||||
const { title, accTitle, accDescr } = result.value;
|
||||
expect(title).toBe('sample title');
|
||||
expect(accTitle).toBe('sample accTitle');
|
||||
expect(accDescr).toBe('sample accDescr');
|
||||
expect(title).toEqual(['sample title']);
|
||||
expect(accTitle).toEqual(['sample accTitle']);
|
||||
expect(accDescr).toEqual(['sample accDescr']);
|
||||
});
|
||||
|
||||
it('should handle regular architecture + title + accTitle + multi-line accDescr', () => {
|
||||
@@ -80,9 +79,9 @@ describe('architecture', () => {
|
||||
expect(result.value.$type).toBe(Architecture);
|
||||
|
||||
const { title, accTitle, accDescr } = result.value;
|
||||
expect(title).toBe('sample title');
|
||||
expect(accTitle).toBe('sample accTitle');
|
||||
expect(accDescr).toBe('sample accDescr');
|
||||
expect(title).toEqual(['sample title']);
|
||||
expect(accTitle).toEqual(['sample accTitle']);
|
||||
expect(accDescr).toEqual(['sample accDescr']);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@@ -166,14 +166,14 @@ describe('Parsing CherryPicking Statements', () => {
|
||||
describe('Parsing with Accessibility Titles and Descriptions', () => {
|
||||
it('should parse accessibility titles', () => {
|
||||
const result = parse(`gitGraph\n accTitle: Accessible Graph\n commit\n`);
|
||||
expect(result.value.accTitle).toBe('Accessible Graph');
|
||||
expect(result.value.accTitle).toEqual(['Accessible Graph']);
|
||||
});
|
||||
|
||||
it('should parse multiline accessibility descriptions', () => {
|
||||
const result = parse(
|
||||
`gitGraph\n accDescr {\n Detailed description\n across multiple lines\n }\n commit\n`
|
||||
);
|
||||
expect(result.value.accDescr).toBe('Detailed description\nacross multiple lines');
|
||||
expect(result.value.accDescr).toEqual(['Detailed description\nacross multiple lines']);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -189,7 +189,7 @@ describe('Parsing CherryPicking Statements', () => {
|
||||
merge feature tag:"v1.0"
|
||||
cherry-pick id:"feat1" tag:"critical fix"
|
||||
`);
|
||||
expect(result.value.accTitle).toBe('Complex Example');
|
||||
expect(result.value.accTitle).toEqual(['Complex Example']);
|
||||
expect(result.value.statements[0].$type).toBe('Commit');
|
||||
expect(result.value.statements[1].$type).toBe('Branch');
|
||||
expect(result.value.statements[2].$type).toBe('Commit');
|
||||
|
@@ -49,7 +49,7 @@ describe('pie', () => {
|
||||
expect(result.value.$type).toBe(Pie);
|
||||
|
||||
const { title } = result.value;
|
||||
expect(title).toBe('sample title');
|
||||
expect(title).toEqual(['sample title']);
|
||||
});
|
||||
|
||||
it.each([
|
||||
@@ -69,7 +69,7 @@ describe('pie', () => {
|
||||
expect(result.value.$type).toBe(Pie);
|
||||
|
||||
const { title } = result.value;
|
||||
expect(title).toBe('sample title');
|
||||
expect(title).toEqual(['sample title']);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -85,7 +85,7 @@ describe('pie', () => {
|
||||
|
||||
const { showData, title } = result.value;
|
||||
expect(showData).toBeTruthy();
|
||||
expect(title).toBe('sample title');
|
||||
expect(title).toEqual(['sample title']);
|
||||
});
|
||||
|
||||
it.each([
|
||||
@@ -106,7 +106,7 @@ describe('pie', () => {
|
||||
|
||||
const { showData, title } = result.value;
|
||||
expect(showData).toBeTruthy();
|
||||
expect(title).toBe('sample title');
|
||||
expect(title).toEqual(['sample title']);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -166,7 +166,7 @@ describe('pie', () => {
|
||||
expect(result.value.$type).toBe(Pie);
|
||||
|
||||
const { title, sections } = result.value;
|
||||
expect(title).toBe('sample wow');
|
||||
expect(title).toEqual(['sample wow']);
|
||||
|
||||
expect(sections[0].label).toBe('GitHub');
|
||||
expect(sections[0].value).toBe(100);
|
||||
@@ -200,7 +200,7 @@ describe('pie', () => {
|
||||
expect(result.value.$type).toBe(Pie);
|
||||
|
||||
const { accTitle, sections } = result.value;
|
||||
expect(accTitle).toBe('sample wow');
|
||||
expect(accTitle).toEqual(['sample wow']);
|
||||
|
||||
expect(sections[0].label).toBe('GitHub');
|
||||
expect(sections[0].value).toBe(100);
|
||||
@@ -218,7 +218,7 @@ describe('pie', () => {
|
||||
expect(result.value.$type).toBe(Pie);
|
||||
|
||||
const { accDescr, sections } = result.value;
|
||||
expect(accDescr).toBe('sample wow');
|
||||
expect(accDescr).toEqual(['sample wow']);
|
||||
|
||||
expect(sections[0].label).toBe('GitHub');
|
||||
expect(sections[0].value).toBe(100);
|
||||
@@ -238,7 +238,7 @@ describe('pie', () => {
|
||||
expect(result.value.$type).toBe(Pie);
|
||||
|
||||
const { accDescr, sections } = result.value;
|
||||
expect(accDescr).toBe('sample wow');
|
||||
expect(accDescr).toEqual(['sample wow']);
|
||||
|
||||
expect(sections[0].label).toBe('GitHub');
|
||||
expect(sections[0].value).toBe(100);
|
||||
|
@@ -35,7 +35,7 @@ describe('radar', () => {
|
||||
expect(result.value.$type).toBe(Radar);
|
||||
|
||||
const { title } = result.value;
|
||||
expect(title).toBe('My Title');
|
||||
expect(title).toEqual(['My Title']);
|
||||
});
|
||||
|
||||
it.each([
|
||||
@@ -47,7 +47,7 @@ describe('radar', () => {
|
||||
expect(result.value.$type).toBe(Radar);
|
||||
|
||||
const { accDescr } = result.value;
|
||||
expect(accDescr).toBe('My Accessible Description');
|
||||
expect(accDescr).toEqual(['My Accessible Description']);
|
||||
});
|
||||
|
||||
it.each([
|
||||
@@ -59,7 +59,7 @@ describe('radar', () => {
|
||||
expect(result.value.$type).toBe(Radar);
|
||||
|
||||
const { accTitle } = result.value;
|
||||
expect(accTitle).toBe('My Accessible Title');
|
||||
expect(accTitle).toEqual(['My Accessible Title']);
|
||||
});
|
||||
|
||||
it.each([
|
||||
@@ -75,9 +75,9 @@ describe('radar', () => {
|
||||
expect(result.value.$type).toBe(Radar);
|
||||
|
||||
const { title, accDescr, accTitle } = result.value;
|
||||
expect(title).toBe('My Title');
|
||||
expect(accDescr).toBe('My Accessible Description');
|
||||
expect(accTitle).toBe('My Accessible Title');
|
||||
expect(title).toEqual(['My Title']);
|
||||
expect(accDescr).toEqual(['My Accessible Description']);
|
||||
expect(accTitle).toEqual(['My Accessible Title']);
|
||||
});
|
||||
});
|
||||
|
||||
|
Reference in New Issue
Block a user