mirror of
				https://github.com/mermaid-js/mermaid.git
				synced 2025-11-04 04:44:08 +01:00 
			
		
		
		
	Compare commits
	
		
			20 Commits
		
	
	
		
			@mermaid-j
			...
			sidv/clean
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					6462f73bdb | ||
| 
						 | 
					cfe1723c6c | ||
| 
						 | 
					6d8b936319 | ||
| 
						 | 
					f992d95082 | ||
| 
						 | 
					f2276f93cd | ||
| 
						 | 
					b52f5058c9 | ||
| 
						 | 
					5e20087252 | ||
| 
						 | 
					b49036068f | ||
| 
						 | 
					5f3d4cb913 | ||
| 
						 | 
					b11eb93ab2 | ||
| 
						 | 
					e4f19480cd | ||
| 
						 | 
					a331a958c0 | ||
| 
						 | 
					134fca3f1d | ||
| 
						 | 
					ef7c0a1936 | ||
| 
						 | 
					2c5403c0f9 | ||
| 
						 | 
					3b0cb1271e | ||
| 
						 | 
					96c06a681d | ||
| 
						 | 
					ff9d26bc70 | ||
| 
						 | 
					2ddc3403de | ||
| 
						 | 
					4535911a3a | 
@@ -22,7 +22,7 @@ const batchId: string =
 | 
			
		||||
  'mermaid-batch-' +
 | 
			
		||||
  (Cypress.env('useAppli')
 | 
			
		||||
    ? Date.now().toString()
 | 
			
		||||
    : Cypress.env('CYPRESS_COMMIT') || Date.now().toString());
 | 
			
		||||
    : (Cypress.env('CYPRESS_COMMIT') ?? Date.now().toString()));
 | 
			
		||||
 | 
			
		||||
export const mermaidUrl = (
 | 
			
		||||
  graphStr: string | string[],
 | 
			
		||||
@@ -61,9 +61,7 @@ export const imgSnapshotTest = (
 | 
			
		||||
    sequence: {
 | 
			
		||||
      ...(_options.sequence ?? {}),
 | 
			
		||||
      actorFontFamily: 'courier',
 | 
			
		||||
      noteFontFamily: _options.sequence?.noteFontFamily
 | 
			
		||||
        ? _options.sequence.noteFontFamily
 | 
			
		||||
        : 'courier',
 | 
			
		||||
      noteFontFamily: _options.sequence?.noteFontFamily ?? 'courier',
 | 
			
		||||
      messageFontFamily: 'courier',
 | 
			
		||||
    },
 | 
			
		||||
  };
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ looks.forEach((look) => {
 | 
			
		||||
  directions.forEach((direction) => {
 | 
			
		||||
    forms.forEach((form) => {
 | 
			
		||||
      labelPos.forEach((pos) => {
 | 
			
		||||
        describe(`Test iconShape in ${form ? `${form} form,` : ''} ${look} look and dir ${direction} with label position ${pos ? pos : 'not defined'}`, () => {
 | 
			
		||||
        describe(`Test iconShape in ${form ? `${form} form,` : ''} ${look} look and dir ${direction} with label position ${pos ?? 'not defined'}`, () => {
 | 
			
		||||
          it(`without label`, () => {
 | 
			
		||||
            let flowchartCode = `flowchart ${direction}\n`;
 | 
			
		||||
            flowchartCode += `  nA --> nAA@{ icon: 'fa:bell'`;
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ const labelPos = [undefined, 't', 'b'] as const;
 | 
			
		||||
looks.forEach((look) => {
 | 
			
		||||
  directions.forEach((direction) => {
 | 
			
		||||
    labelPos.forEach((pos) => {
 | 
			
		||||
      describe(`Test imageShape in ${look} look and dir ${direction} with label position ${pos ? pos : 'not defined'}`, () => {
 | 
			
		||||
      describe(`Test imageShape in ${look} look and dir ${direction} with label position ${pos ?? 'not defined'}`, () => {
 | 
			
		||||
        it(`without label`, () => {
 | 
			
		||||
          let flowchartCode = `flowchart ${direction}\n`;
 | 
			
		||||
          flowchartCode += `  nA --> A@{ img: 'https://cdn.pixabay.com/photo/2020/02/22/18/49/paper-4871356_1280.jpg', w: '100', h: '100' }\n`;
 | 
			
		||||
 
 | 
			
		||||
@@ -214,7 +214,7 @@ section Checkout from website
 | 
			
		||||
          $lines.each((index, el) => {
 | 
			
		||||
            const bbox = el.getBBox();
 | 
			
		||||
            expect(bbox.width).to.be.lte(320);
 | 
			
		||||
            maxLineWidth = Math.max(maxLineWidth || 0, bbox.width);
 | 
			
		||||
            maxLineWidth = Math.max(maxLineWidth ?? 0, bbox.width);
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          /** The expected margin between the diagram and the legend is 150px, as defined by
 | 
			
		||||
 
 | 
			
		||||
@@ -190,9 +190,7 @@ export const render = async (
 | 
			
		||||
      const children = nodeArr.filter((node: { parentId: any }) => node.parentId === subgraph.id);
 | 
			
		||||
      children.forEach((node: any) => {
 | 
			
		||||
        parentLookupDb.parentById[node.id] = subgraph.id;
 | 
			
		||||
        if (parentLookupDb.childrenById[subgraph.id] === undefined) {
 | 
			
		||||
          parentLookupDb.childrenById[subgraph.id] = [];
 | 
			
		||||
        }
 | 
			
		||||
        parentLookupDb.childrenById[subgraph.id] ??= [];
 | 
			
		||||
        parentLookupDb.childrenById[subgraph.id].push(node);
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
@@ -381,10 +379,10 @@ export const render = async (
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        edgeData.labelType = edge.labelType;
 | 
			
		||||
        edgeData.label = (edge?.text || '').replace(common.lineBreakRegex, '\n');
 | 
			
		||||
        edgeData.label = (edge?.text ?? '').replace(common.lineBreakRegex, '\n');
 | 
			
		||||
 | 
			
		||||
        if (edge.style === undefined) {
 | 
			
		||||
          edgeData.style = edgeData.style || 'stroke: #333; stroke-width: 1.5px;fill:none;';
 | 
			
		||||
          edgeData.style = edgeData.style ?? 'stroke: #333; stroke-width: 1.5px;fill:none;';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        edgeData.labelStyle = edgeData.labelStyle.replace('color:', 'fill:');
 | 
			
		||||
@@ -725,9 +723,7 @@ export const render = async (
 | 
			
		||||
            inter = inter2;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if (!inter) {
 | 
			
		||||
          inter = intersection(bounds, lastPointOutside, point);
 | 
			
		||||
        }
 | 
			
		||||
        inter ??= intersection(bounds, lastPointOutside, point);
 | 
			
		||||
 | 
			
		||||
        // Check case where the intersection is the same as the last point
 | 
			
		||||
        let pointPresent = false;
 | 
			
		||||
@@ -840,8 +836,8 @@ export const render = async (
 | 
			
		||||
      node.labels = [
 | 
			
		||||
        {
 | 
			
		||||
          text: node.label,
 | 
			
		||||
          width: node?.labelData?.width || 50,
 | 
			
		||||
          height: node?.labelData?.height || 50,
 | 
			
		||||
          width: node?.labelData?.width ?? 50,
 | 
			
		||||
          height: node?.labelData?.height ?? 50,
 | 
			
		||||
        },
 | 
			
		||||
        (node.width = node.width + 2 * node.padding),
 | 
			
		||||
        log.debug('UIO node label', node?.labelData?.width, node.padding),
 | 
			
		||||
@@ -917,7 +913,7 @@ export const render = async (
 | 
			
		||||
      if (edge.sections) {
 | 
			
		||||
        const src = edge.sections[0].startPoint;
 | 
			
		||||
        const dest = edge.sections[0].endPoint;
 | 
			
		||||
        const segments = edge.sections[0].bendPoints ? edge.sections[0].bendPoints : [];
 | 
			
		||||
        const segments = edge.sections[0].bendPoints ?? [];
 | 
			
		||||
 | 
			
		||||
        const segPoints = segments.map((segment: { x: any; y: any }) => {
 | 
			
		||||
          return { x: segment.x + offset.x, y: segment.y + offset.y };
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@ export const updateCurrentConfig = (siteCfg: MermaidConfig, _directives: Mermaid
 | 
			
		||||
  if (sumOfDirectives.theme && sumOfDirectives.theme in theme) {
 | 
			
		||||
    const tmpConfigFromInitialize = assignWithDepth({}, configFromInitialize);
 | 
			
		||||
    const themeVariables = assignWithDepth(
 | 
			
		||||
      tmpConfigFromInitialize.themeVariables || {},
 | 
			
		||||
      tmpConfigFromInitialize.themeVariables ?? {},
 | 
			
		||||
      sumOfDirectives.themeVariables
 | 
			
		||||
    );
 | 
			
		||||
    if (cfg.theme && cfg.theme in theme) {
 | 
			
		||||
 
 | 
			
		||||
@@ -238,7 +238,7 @@ let clusterElems = {};
 | 
			
		||||
 | 
			
		||||
export const insertCluster = (elem, node) => {
 | 
			
		||||
  log.trace('Inserting cluster');
 | 
			
		||||
  const shape = node.shape || 'rect';
 | 
			
		||||
  const shape = node.shape ?? 'rect';
 | 
			
		||||
  clusterElems[node.id] = shapes[shape](elem, node);
 | 
			
		||||
};
 | 
			
		||||
export const getClusterTitleWidth = (elem, node) => {
 | 
			
		||||
 
 | 
			
		||||
@@ -45,7 +45,7 @@ function addHtmlLabel(node) {
 | 
			
		||||
 * @deprecated svg-util/createText instead
 | 
			
		||||
 */
 | 
			
		||||
const createLabel = (_vertexText, style, isTitle, isNode) => {
 | 
			
		||||
  let vertexText = _vertexText || '';
 | 
			
		||||
  let vertexText = _vertexText ?? '';
 | 
			
		||||
  if (typeof vertexText === 'object') {
 | 
			
		||||
    vertexText = vertexText[0];
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -69,9 +69,7 @@ export const insertEdgeLabel = (elem, edge) => {
 | 
			
		||||
    fo = inner.node().appendChild(startLabelElement);
 | 
			
		||||
    const slBox = startLabelElement.getBBox();
 | 
			
		||||
    inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');
 | 
			
		||||
    if (!terminalLabels[edge.id]) {
 | 
			
		||||
      terminalLabels[edge.id] = {};
 | 
			
		||||
    }
 | 
			
		||||
    terminalLabels[edge.id] ??= {};
 | 
			
		||||
    terminalLabels[edge.id].startLeft = startEdgeLabelLeft;
 | 
			
		||||
    setTerminalWidth(fo, edge.startLabelLeft);
 | 
			
		||||
  }
 | 
			
		||||
@@ -85,9 +83,7 @@ export const insertEdgeLabel = (elem, edge) => {
 | 
			
		||||
    const slBox = startLabelElement.getBBox();
 | 
			
		||||
    inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');
 | 
			
		||||
 | 
			
		||||
    if (!terminalLabels[edge.id]) {
 | 
			
		||||
      terminalLabels[edge.id] = {};
 | 
			
		||||
    }
 | 
			
		||||
    terminalLabels[edge.id] ??= {};
 | 
			
		||||
    terminalLabels[edge.id].startRight = startEdgeLabelRight;
 | 
			
		||||
    setTerminalWidth(fo, edge.startLabelRight);
 | 
			
		||||
  }
 | 
			
		||||
@@ -102,9 +98,7 @@ export const insertEdgeLabel = (elem, edge) => {
 | 
			
		||||
 | 
			
		||||
    endEdgeLabelLeft.node().appendChild(endLabelElement);
 | 
			
		||||
 | 
			
		||||
    if (!terminalLabels[edge.id]) {
 | 
			
		||||
      terminalLabels[edge.id] = {};
 | 
			
		||||
    }
 | 
			
		||||
    terminalLabels[edge.id] ??= {};
 | 
			
		||||
    terminalLabels[edge.id].endLeft = endEdgeLabelLeft;
 | 
			
		||||
    setTerminalWidth(fo, edge.endLabelLeft);
 | 
			
		||||
  }
 | 
			
		||||
@@ -119,9 +113,7 @@ export const insertEdgeLabel = (elem, edge) => {
 | 
			
		||||
    inner.attr('transform', 'translate(' + -slBox.width / 2 + ', ' + -slBox.height / 2 + ')');
 | 
			
		||||
 | 
			
		||||
    endEdgeLabelRight.node().appendChild(endLabelElement);
 | 
			
		||||
    if (!terminalLabels[edge.id]) {
 | 
			
		||||
      terminalLabels[edge.id] = {};
 | 
			
		||||
    }
 | 
			
		||||
    terminalLabels[edge.id] ??= {};
 | 
			
		||||
    terminalLabels[edge.id].endRight = endEdgeLabelRight;
 | 
			
		||||
    setTerminalWidth(fo, edge.endLabelRight);
 | 
			
		||||
  }
 | 
			
		||||
@@ -141,7 +133,7 @@ function setTerminalWidth(fo, value) {
 | 
			
		||||
 | 
			
		||||
export const positionEdgeLabel = (edge, paths) => {
 | 
			
		||||
  log.debug('Moving label abc88 ', edge.id, edge.label, edgeLabels[edge.id], paths);
 | 
			
		||||
  let path = paths.updatedPath ? paths.updatedPath : paths.originalPath;
 | 
			
		||||
  let path = paths.updatedPath ?? paths.originalPath;
 | 
			
		||||
  const siteConfig = getConfig();
 | 
			
		||||
  const { subGraphTitleTotalMargin } = getSubGraphTitleMargins(siteConfig);
 | 
			
		||||
  if (edge.label) {
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,9 @@ import * as graphlibJson from 'dagre-d3-es/src/graphlib/json.js';
 | 
			
		||||
import * as graphlib from 'dagre-d3-es/src/graphlib/index.js';
 | 
			
		||||
 | 
			
		||||
export let clusterDb = {};
 | 
			
		||||
/** @type {Record<string, string[]>} */
 | 
			
		||||
let descendants = {};
 | 
			
		||||
/** @type {Record<string, string>} */
 | 
			
		||||
let parents = {};
 | 
			
		||||
 | 
			
		||||
export const clear = () => {
 | 
			
		||||
 
 | 
			
		||||
@@ -15,9 +15,7 @@ const formatClass = (str) => {
 | 
			
		||||
  return '';
 | 
			
		||||
};
 | 
			
		||||
const getClassesFromNode = (node, otherClasses) => {
 | 
			
		||||
  return `${otherClasses ? otherClasses : 'node default'}${formatClass(node.classes)} ${formatClass(
 | 
			
		||||
    node.class
 | 
			
		||||
  )}`;
 | 
			
		||||
  return `${otherClasses ?? 'node default'}${formatClass(node.classes)} ${formatClass(node.class)}`;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const question = async (parent, node) => {
 | 
			
		||||
@@ -57,7 +55,7 @@ const choice = (parent, node) => {
 | 
			
		||||
  const shapeSvg = parent
 | 
			
		||||
    .insert('g')
 | 
			
		||||
    .attr('class', 'node default')
 | 
			
		||||
    .attr('id', node.domId || node.id);
 | 
			
		||||
    .attr('id', node.domId ?? node.id);
 | 
			
		||||
 | 
			
		||||
  const s = 28;
 | 
			
		||||
  const points = [
 | 
			
		||||
@@ -566,7 +564,7 @@ const rectWithTitle = (parent, node) => {
 | 
			
		||||
  const shapeSvg = parent
 | 
			
		||||
    .insert('g')
 | 
			
		||||
    .attr('class', classes)
 | 
			
		||||
    .attr('id', node.domId || node.id);
 | 
			
		||||
    .attr('id', node.domId ?? node.id);
 | 
			
		||||
 | 
			
		||||
  // Create the title label and insert it after the rect
 | 
			
		||||
  const rect = shapeSvg.insert('rect', ':first-child');
 | 
			
		||||
@@ -808,7 +806,7 @@ const start = (parent, node) => {
 | 
			
		||||
  const shapeSvg = parent
 | 
			
		||||
    .insert('g')
 | 
			
		||||
    .attr('class', 'node default')
 | 
			
		||||
    .attr('id', node.domId || node.id);
 | 
			
		||||
    .attr('id', node.domId ?? node.id);
 | 
			
		||||
  const circle = shapeSvg.insert('circle', ':first-child');
 | 
			
		||||
 | 
			
		||||
  // center the circle around its coordinate
 | 
			
		||||
@@ -827,7 +825,7 @@ const forkJoin = (parent, node, dir) => {
 | 
			
		||||
  const shapeSvg = parent
 | 
			
		||||
    .insert('g')
 | 
			
		||||
    .attr('class', 'node default')
 | 
			
		||||
    .attr('id', node.domId || node.id);
 | 
			
		||||
    .attr('id', node.domId ?? node.id);
 | 
			
		||||
 | 
			
		||||
  let width = 70;
 | 
			
		||||
  let height = 10;
 | 
			
		||||
@@ -859,7 +857,7 @@ const end = (parent, node) => {
 | 
			
		||||
  const shapeSvg = parent
 | 
			
		||||
    .insert('g')
 | 
			
		||||
    .attr('class', 'node default')
 | 
			
		||||
    .attr('id', node.domId || node.id);
 | 
			
		||||
    .attr('id', node.domId ?? node.id);
 | 
			
		||||
  const innerCircle = shapeSvg.insert('circle', ':first-child');
 | 
			
		||||
  const circle = shapeSvg.insert('circle', ':first-child');
 | 
			
		||||
 | 
			
		||||
@@ -891,7 +889,7 @@ const class_box = (parent, node) => {
 | 
			
		||||
  const shapeSvg = parent
 | 
			
		||||
    .insert('g')
 | 
			
		||||
    .attr('class', classes)
 | 
			
		||||
    .attr('id', node.domId || node.id);
 | 
			
		||||
    .attr('id', node.domId ?? node.id);
 | 
			
		||||
 | 
			
		||||
  // Create the title label and insert it after the rect
 | 
			
		||||
  const rect = shapeSvg.insert('rect', ':first-child');
 | 
			
		||||
 
 | 
			
		||||
@@ -88,7 +88,7 @@ function positionNodes(db: ArchitectureDB, cy: cytoscape.Core) {
 | 
			
		||||
    data.y = node.position().y;
 | 
			
		||||
 | 
			
		||||
    const nodeElem = db.getElementById(data.id);
 | 
			
		||||
    nodeElem.attr('transform', 'translate(' + (data.x || 0) + ',' + (data.y || 0) + ')');
 | 
			
		||||
    nodeElem.attr('transform', 'translate(' + (data.x ?? 0) + ',' + (data.y ?? 0) + ')');
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -82,9 +82,7 @@ export const setCssClass = function (itemIds: string, cssClassName: string) {
 | 
			
		||||
      foundBlock = { id: trimmedId, type: 'na', children: [] } as Block;
 | 
			
		||||
      blockDatabase.set(trimmedId, foundBlock);
 | 
			
		||||
    }
 | 
			
		||||
    if (!foundBlock.classes) {
 | 
			
		||||
      foundBlock.classes = [];
 | 
			
		||||
    }
 | 
			
		||||
    foundBlock.classes ??= [];
 | 
			
		||||
    foundBlock.classes.push(cssClassName);
 | 
			
		||||
  });
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ function getNodeFromBlock(block: Block, db: BlockDB, positioned = false) {
 | 
			
		||||
  const vertex = block;
 | 
			
		||||
 | 
			
		||||
  let classStr = 'default';
 | 
			
		||||
  if ((vertex?.classes?.length || 0) > 0) {
 | 
			
		||||
  if ((vertex?.classes?.length ?? 0) > 0) {
 | 
			
		||||
    classStr = (vertex?.classes ?? []).join(' ');
 | 
			
		||||
  }
 | 
			
		||||
  classStr = classStr + ' flowchart-label';
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ export class ClassDB implements DiagramDB {
 | 
			
		||||
  private namespaces = new Map<string, NamespaceNode>();
 | 
			
		||||
  private namespaceCounter = 0;
 | 
			
		||||
 | 
			
		||||
  private functions: any[] = [];
 | 
			
		||||
  private functions: ((element: Element) => void)[] = [];
 | 
			
		||||
 | 
			
		||||
  constructor() {
 | 
			
		||||
    this.functions.push(this.setupToolTips.bind(this));
 | 
			
		||||
@@ -477,7 +477,7 @@ export class ClassDB implements DiagramDB {
 | 
			
		||||
    let tooltipElem: Selection<HTMLDivElement, unknown, HTMLElement, unknown> =
 | 
			
		||||
      select('.mermaidTooltip');
 | 
			
		||||
    // @ts-expect-error - Incorrect types
 | 
			
		||||
    if ((tooltipElem._groups || tooltipElem)[0][0] === null) {
 | 
			
		||||
    if ((tooltipElem._groups ?? tooltipElem)[0][0] === null) {
 | 
			
		||||
      tooltipElem = select('body')
 | 
			
		||||
        .append('div')
 | 
			
		||||
        .attr('class', 'mermaidTooltip')
 | 
			
		||||
 
 | 
			
		||||
@@ -13,9 +13,7 @@ export const diagram: DiagramDefinition = {
 | 
			
		||||
  renderer,
 | 
			
		||||
  styles,
 | 
			
		||||
  init: (cnf) => {
 | 
			
		||||
    if (!cnf.class) {
 | 
			
		||||
      cnf.class = {};
 | 
			
		||||
    }
 | 
			
		||||
    cnf.class ??= {};
 | 
			
		||||
    cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -13,9 +13,7 @@ export const diagram: DiagramDefinition = {
 | 
			
		||||
  renderer,
 | 
			
		||||
  styles,
 | 
			
		||||
  init: (cnf) => {
 | 
			
		||||
    if (!cnf.class) {
 | 
			
		||||
      cnf.class = {};
 | 
			
		||||
    }
 | 
			
		||||
    cnf.class ??= {};
 | 
			
		||||
    cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -117,7 +117,7 @@ export const addClasses = function (
 | 
			
		||||
        style: styles.style,
 | 
			
		||||
        id: vertex.id,
 | 
			
		||||
        domId: vertex.domId,
 | 
			
		||||
        tooltip: diagObj.db.getTooltip(vertex.id, parent) || '',
 | 
			
		||||
        tooltip: diagObj.db.getTooltip(vertex.id, parent) ?? '',
 | 
			
		||||
        haveCallback: vertex.haveCallback,
 | 
			
		||||
        link: vertex.link,
 | 
			
		||||
        width: vertex.type === 'group' ? 500 : undefined,
 | 
			
		||||
 
 | 
			
		||||
@@ -50,9 +50,7 @@ const getNextFittingBlock = (
 | 
			
		||||
  row: number,
 | 
			
		||||
  bitsPerRow: number
 | 
			
		||||
): [Required<PacketBlock>, PacketBlock | undefined] => {
 | 
			
		||||
  if (block.end === undefined) {
 | 
			
		||||
    block.end = block.start;
 | 
			
		||||
  }
 | 
			
		||||
  block.end ??= block.start;
 | 
			
		||||
 | 
			
		||||
  if (block.start > block.end) {
 | 
			
		||||
    throw new Error(`Block start ${block.start} is greater than block end ${block.end}.`);
 | 
			
		||||
 
 | 
			
		||||
@@ -31,9 +31,8 @@ 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);
 | 
			
		||||
    }
 | 
			
		||||
    value ??= this.runCustomConverter(rule, input, cstNode);
 | 
			
		||||
 | 
			
		||||
    if (value === undefined) {
 | 
			
		||||
      return super.runConverter(rule, input, cstNode);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user