mirror of
				https://github.com/mermaid-js/mermaid.git
				synced 2025-11-04 12:54:08 +01:00 
			
		
		
		
	Merge pull request #4258 from mermaid-js/sidv/fix/4256
fix(#4256): Keep error diagram on screen
This commit is contained in:
		@@ -10,7 +10,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render an ER diagram with a recursive relationship', () => {
 | 
			
		||||
@@ -23,7 +22,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render an ER diagram with multiple relationships between the same two entities', () => {
 | 
			
		||||
@@ -35,7 +33,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render a cyclical ER diagram', () => {
 | 
			
		||||
@@ -48,7 +45,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render a not-so-simple ER diagram', () => {
 | 
			
		||||
@@ -66,7 +62,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render multiple ER diagrams', () => {
 | 
			
		||||
@@ -85,7 +80,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      ],
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render an ER diagram with blank or empty labels', () => {
 | 
			
		||||
@@ -98,7 +92,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render an ER diagrams when useMaxWidth is true (default)', () => {
 | 
			
		||||
@@ -151,7 +144,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      `,
 | 
			
		||||
      { er: { useMaxWidth: false } }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render entities with and without attributes', () => {
 | 
			
		||||
@@ -164,7 +156,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render entities with generic and array attributes', () => {
 | 
			
		||||
@@ -179,7 +170,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render entities with length in attributes type', () => {
 | 
			
		||||
@@ -193,7 +183,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render entities and attributes with big and small entity names', () => {
 | 
			
		||||
@@ -209,7 +198,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render entities with keys', () => {
 | 
			
		||||
@@ -228,7 +216,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render entities with comments', () => {
 | 
			
		||||
@@ -247,7 +234,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render entities with keys and comments', () => {
 | 
			
		||||
@@ -267,7 +253,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render entities with aliases', () => {
 | 
			
		||||
@@ -285,7 +270,6 @@ describe('Entity Relationship Diagram', () => {
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
    cy.get('svg');
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('1433: should render a simple ER diagram with a title', () => {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										45
									
								
								cypress/integration/rendering/errorDiagram.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								cypress/integration/rendering/errorDiagram.spec.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
import { imgSnapshotTest } from '../../helpers/util';
 | 
			
		||||
 | 
			
		||||
describe('Error Diagrams', () => {
 | 
			
		||||
  beforeEach(() => {
 | 
			
		||||
    cy.on('uncaught:exception', (err) => {
 | 
			
		||||
      expect(err.message).to.include('Parse error');
 | 
			
		||||
      // return false to prevent the error from
 | 
			
		||||
      // failing this test
 | 
			
		||||
      return false;
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render a simple ER diagram', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
      error
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render error diagram for actual errors', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
    flowchart TD
 | 
			
		||||
      A[Christmas] --|Get money| B(Go shopping)
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should render error for wrong ER diagram', () => {
 | 
			
		||||
    imgSnapshotTest(
 | 
			
		||||
      `
 | 
			
		||||
    erDiagram
 | 
			
		||||
        ATLAS-ORGANIZATION ||--|{ ATLAS-PROJECTS : "has many"
 | 
			
		||||
        ATLAS-PROJECTS ||--|{ MONGODB-CLUSTERS : "has many"
 | 
			
		||||
        ATLAS-PROJECTS ||--|{ ATLAS-TEAMS : "has many"
 | 
			
		||||
        MONGODB-CLUSTERS ||..|{
 | 
			
		||||
        ATLAS-TEAMS ||..|{
 | 
			
		||||
      `,
 | 
			
		||||
      { logLevel: 1 }
 | 
			
		||||
    );
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
@@ -47,7 +47,6 @@ const contentLoaded = async function () {
 | 
			
		||||
    await mermaid2.registerExternalDiagrams([externalExample]);
 | 
			
		||||
    mermaid2.initialize(graphObj.mermaid);
 | 
			
		||||
    await mermaid2.run();
 | 
			
		||||
    markRendered();
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -123,7 +122,6 @@ const contentLoadedApi = async function () {
 | 
			
		||||
      bindFunctions(div);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  markRendered();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
if (typeof document !== 'undefined') {
 | 
			
		||||
@@ -135,10 +133,10 @@ if (typeof document !== 'undefined') {
 | 
			
		||||
    function () {
 | 
			
		||||
      if (this.location.href.match('xss.html')) {
 | 
			
		||||
        this.console.log('Using api');
 | 
			
		||||
        void contentLoadedApi();
 | 
			
		||||
        void contentLoadedApi().finally(markRendered);
 | 
			
		||||
      } else {
 | 
			
		||||
        this.console.log('Not using api');
 | 
			
		||||
        void contentLoaded();
 | 
			
		||||
        void contentLoaded().finally(markRendered);
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    false
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										38
									
								
								demos/error.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								demos/error.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,38 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
 | 
			
		||||
    <title>Error | Mermaid Quick Test Page</title>
 | 
			
		||||
    <link rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgo=" />
 | 
			
		||||
  </head>
 | 
			
		||||
 | 
			
		||||
  <body>
 | 
			
		||||
    <pre class="mermaid">
 | 
			
		||||
      erDiagram
 | 
			
		||||
        ATLAS-ORGANIZATION ||--|{ ATLAS-PROJECTS : "has many"
 | 
			
		||||
        ATLAS-PROJECTS ||--|{ MONGODB-CLUSTERS : "has many"
 | 
			
		||||
        ATLAS-PROJECTS ||--|{ ATLAS-TEAMS : "has many"
 | 
			
		||||
    </pre>
 | 
			
		||||
    <pre class="mermaid">
 | 
			
		||||
      erDiagram
 | 
			
		||||
        ATLAS-ORGANIZATION ||--|{ ATLAS-PROJECTS : "has many"
 | 
			
		||||
        ATLAS-PROJECTS ||--|{ MONGODB-CLUSTERS : "has many"
 | 
			
		||||
        ATLAS-PROJECTS ||--|{ ATLAS-TEAMS : "has many"
 | 
			
		||||
        MONGODB-CLUSTERS ||..|{
 | 
			
		||||
        ATLAS-TEAMS ||..|{
 | 
			
		||||
    </pre>
 | 
			
		||||
    <hr />
 | 
			
		||||
    <pre class="mermaid">
 | 
			
		||||
    flowchart TD
 | 
			
		||||
      A[Christmas] -->|Get money| B(Go shopping)
 | 
			
		||||
    </pre>
 | 
			
		||||
    <pre class="mermaid">
 | 
			
		||||
    flowchart TD
 | 
			
		||||
      A[Christmas] --|Get money| B(Go shopping)
 | 
			
		||||
    </pre>
 | 
			
		||||
    <script type="module">
 | 
			
		||||
      import mermaid from './mermaid.esm.mjs';
 | 
			
		||||
    </script>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -13,7 +13,7 @@ import classDiagramV2 from '../diagrams/class/classDetector-V2';
 | 
			
		||||
import state from '../diagrams/state/stateDetector';
 | 
			
		||||
import stateV2 from '../diagrams/state/stateDetector-V2';
 | 
			
		||||
import journey from '../diagrams/user-journey/journeyDetector';
 | 
			
		||||
import error from '../diagrams/error/errorDetector';
 | 
			
		||||
import errorDiagram from '../diagrams/error/errorDiagram';
 | 
			
		||||
import flowchartElk from '../diagrams/flowchart/elk/detector';
 | 
			
		||||
import timeline from '../diagrams/timeline/detector';
 | 
			
		||||
import mindmap from '../diagrams/mindmap/detector';
 | 
			
		||||
@@ -28,6 +28,9 @@ export const addDiagrams = () => {
 | 
			
		||||
  // This is added here to avoid race-conditions.
 | 
			
		||||
  // We could optimize the loading logic somehow.
 | 
			
		||||
  hasLoadedDiagrams = true;
 | 
			
		||||
  registerDiagram('error', errorDiagram, (text) => {
 | 
			
		||||
    return text.toLowerCase().trim() === 'error';
 | 
			
		||||
  });
 | 
			
		||||
  registerDiagram(
 | 
			
		||||
    '---',
 | 
			
		||||
    // --- diagram type may appear if YAML front-matter is not parsed correctly
 | 
			
		||||
@@ -57,7 +60,6 @@ export const addDiagrams = () => {
 | 
			
		||||
  );
 | 
			
		||||
  // Ordering of detectors is important. The first one to return true will be used.
 | 
			
		||||
  registerLazyLoadedDiagrams(
 | 
			
		||||
    error,
 | 
			
		||||
    c4,
 | 
			
		||||
    classDiagramV2,
 | 
			
		||||
    classDiagram,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +0,0 @@
 | 
			
		||||
import type { DiagramDetector, ExternalDiagramDefinition } from '../../diagram-api/types';
 | 
			
		||||
 | 
			
		||||
const id = 'error';
 | 
			
		||||
 | 
			
		||||
const detector: DiagramDetector = (text) => {
 | 
			
		||||
  return text.toLowerCase().trim() === 'error';
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const loader = async () => {
 | 
			
		||||
  const { diagram } = await import('./errorDiagram');
 | 
			
		||||
  return { id, diagram };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const plugin: ExternalDiagramDefinition = {
 | 
			
		||||
  id,
 | 
			
		||||
  detector,
 | 
			
		||||
  loader,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default plugin;
 | 
			
		||||
@@ -19,3 +19,5 @@ export const diagram: DiagramDefinition = {
 | 
			
		||||
    // no op
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export default diagram;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,15 +4,13 @@ import { select } from 'd3';
 | 
			
		||||
import { log } from '../../logger';
 | 
			
		||||
import { getErrorMessage } from '../../utils';
 | 
			
		||||
 | 
			
		||||
let conf = {};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Merges the value of `conf` with the passed `cnf`
 | 
			
		||||
 *
 | 
			
		||||
 * @param cnf - Config to merge
 | 
			
		||||
 */
 | 
			
		||||
export const setConf = function (cnf: any) {
 | 
			
		||||
  conf = { ...conf, ...cnf };
 | 
			
		||||
export const setConf = function () {
 | 
			
		||||
  // no-op
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -78,7 +76,7 @@ export const draw = (_text: string, id: string, mermaidVersion: string) => {
 | 
			
		||||
      .attr('y', 250)
 | 
			
		||||
      .attr('font-size', '150px')
 | 
			
		||||
      .style('text-anchor', 'middle')
 | 
			
		||||
      .text('Syntax error in graph');
 | 
			
		||||
      .text('Syntax error in text');
 | 
			
		||||
    g.append('text') // text label for the x axis
 | 
			
		||||
      .attr('class', 'error-text')
 | 
			
		||||
      .attr('x', 1250)
 | 
			
		||||
 
 | 
			
		||||
@@ -531,6 +531,10 @@ const render = async function (
 | 
			
		||||
 | 
			
		||||
  attachFunctions();
 | 
			
		||||
 | 
			
		||||
  if (parseEncounteredException) {
 | 
			
		||||
    throw parseEncounteredException;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // -------------------------------------------------------------------------------
 | 
			
		||||
  // Remove the temporary HTML element if appropriate
 | 
			
		||||
  const tmpElementSelector = isSandboxed ? iFrameID_selector : enclosingDivID_selector;
 | 
			
		||||
@@ -539,10 +543,6 @@ const render = async function (
 | 
			
		||||
    node.remove();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (parseEncounteredException) {
 | 
			
		||||
    throw parseEncounteredException;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return {
 | 
			
		||||
    svg: svgCode,
 | 
			
		||||
    bindFunctions: diag.db.bindFunctions,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user