{
  "version": 3,
  "sources": ["../../../src/rendering-util/layout-algorithms/dagre/index.js"],
  "sourcesContent": ["/* global injected */ // build-time constant injected via esbuild `define` (see .esbuild/util.ts)\nimport { layout as dagreLayout } from 'dagre-d3-es/src/dagre/index.js';\nimport * as graphlib from 'dagre-d3-es/src/graphlib/index.js';\nimport { createLayoutElementGroups, insertMeasuredNode } from '../../createGraph.js';\nimport { createCommonLayoutRenderer } from '../common/index.js';\nimport { profiler } from '../../../profiler.js';\nimport { updateNodeBounds } from '../../rendering-elements/shapes/util.js';\nimport {\n  clusterDb,\n  adjustClustersAndEdges,\n  findNonClusterChild,\n  sortNodesByHierarchy,\n} from './mermaid-graphlib.js';\nimport { positionNode, setNodeElem } from '../../rendering-elements/nodes.js';\nimport { insertCluster } from '../../rendering-elements/clusters.js';\nimport { insertEdgeLabel, positionEdgeLabel, insertEdge } from '../../rendering-elements/edges.js';\nimport { log } from '../../../logger.js';\nimport { getSubGraphTitleMargins } from '../../../utils/subGraphTitleMargins.js';\nimport { getConfig } from '../../../diagram-api/diagramAPI.js';\n\nconst clamp = (value, min, max) => Math.max(min, Math.min(max, value));\n\nconst getDefaultSelfLoopSide = (rankdir = 'TB') => {\n  switch (rankdir) {\n    case 'BT':\n      return 'bottom';\n    case 'LR':\n      return 'right';\n    case 'RL':\n      return 'left';\n    case 'TB':\n    default:\n      return 'top';\n  }\n};\n\nconst shouldMergeSelfLoopSegments = (diagramType) =>\n  diagramType === 'flowchart' ||\n  diagramType === 'flowchart-v2' ||\n  diagramType === 'stateDiagram' ||\n  diagramType === 'er' ||\n  diagramType === 'classDiagram';\n\n// Keep this a fixed literal allowlist \u2014 never derive keys from graph data, since node ids and\n// other graph keys are user-controlled and copying them wholesale onto LayoutData would open a\n// property-injection surface. `intersect`/`calcIntersect` are function references installed by\n// the shape handlers; the painter needs them alongside the geometry.\nconst DAGRE_NODE_LAYOUT_PROPERTIES = [\n  'x',\n  'y',\n  'width',\n  'height',\n  'labelBBox',\n  'intersect',\n  'calcIntersect',\n  'diff',\n  'clusterNode',\n];\n\n// Use dagre's dummy self-loop placement as a hint, so loops are not always forced above the node.\nconst getSelfLoopSide = (graph, node, segments, originalNodeId, rankdir) => {\n  const layoutHints = [];\n  const dummyNodeIds = new Set();\n\n  segments.forEach(({ start, end }) => {\n    if (start !== originalNodeId) {\n      dummyNodeIds.add(start);\n    }\n    if (end !== originalNodeId) {\n      dummyNodeIds.add(end);\n    }\n  });\n\n  dummyNodeIds.forEach((id) => {\n    const dummyNode = graph.node(id);\n    if (typeof dummyNode?.x === 'number' && typeof dummyNode?.y === 'number') {\n      layoutHints.push(dummyNode);\n    }\n  });\n\n  if (layoutHints.length === 0) {\n    segments.forEach(({ edge }) => {\n      (edge.points ?? []).forEach((point) => {\n        if (typeof point?.x === 'number' && typeof point?.y === 'number') {\n          layoutHints.push(point);\n        }\n      });\n    });\n  }\n\n  if (layoutHints.length === 0) {\n    return getDefaultSelfLoopSide(rankdir);\n  }\n\n  const center = layoutHints.reduce(\n    (acc, point) => ({\n      x: acc.x + point.x / layoutHints.length,\n      y: acc.y + point.y / layoutHints.length,\n    }),\n    { x: 0, y: 0 }\n  );\n  const dx = center.x - node.x;\n  const dy = center.y - node.y;\n\n  if (Math.abs(dx) > Math.abs(dy)) {\n    return dx > 0 ? 'right' : 'left';\n  }\n  if (Math.abs(dy) > 0) {\n    return dy > 0 ? 'bottom' : 'top';\n  }\n  return getDefaultSelfLoopSide(rankdir);\n};\n\n// Build a compact loop around the node instead of rendering dagre's long dummy-edge route.\nconst getSelfLoopPoints = (node, side = 'top', yOffset = 0, labelWidth = 0) => {\n  const x = node.x;\n  const y = node.y - yOffset;\n  const halfWidth = node.width / 2;\n  const halfHeight = node.height / 2;\n  const maxSpan = Math.max(36, Math.min(100, node.width * 0.8));\n  const span = clamp(Math.max(labelWidth, node.width * 0.35), 36, maxSpan);\n  const depth = clamp(Math.min(node.width, node.height) * 0.45, 24, 48);\n\n  switch (side) {\n    case 'bottom': {\n      const bottom = y + halfHeight;\n      return [\n        { x: x - span / 2, y: bottom },\n        { x: x - span / 2, y: bottom + depth },\n        { x: x + span / 2, y: bottom + depth },\n        { x: x + span / 2, y: bottom },\n      ];\n    }\n    case 'right': {\n      const right = x + halfWidth;\n      return [\n        { x: right, y: y - span / 2 },\n        { x: right + depth, y: y - span / 2 },\n        { x: right + depth, y: y + span / 2 },\n        { x: right, y: y + span / 2 },\n      ];\n    }\n    case 'left': {\n      const left = x - halfWidth;\n      return [\n        { x: left, y: y - span / 2 },\n        { x: left - depth, y: y - span / 2 },\n        { x: left - depth, y: y + span / 2 },\n        { x: left, y: y + span / 2 },\n      ];\n    }\n    case 'top':\n    default: {\n      const top = y - halfHeight;\n      return [\n        { x: x - span / 2, y: top },\n        { x: x - span / 2, y: top - depth },\n        { x: x + span / 2, y: top - depth },\n        { x: x + span / 2, y: top },\n      ];\n    }\n  }\n};\n\nconst getSelfLoopLabelPosition = (node, points, side = 'top', yOffset = 0, label = {}) => {\n  const gap = 4;\n  const x = node.x;\n  const y = node.y - yOffset;\n  const labelWidth = label.width ?? 0;\n  const labelHeight = label.height ?? 0;\n\n  switch (side) {\n    case 'bottom':\n      return { x, y: Math.max(...points.map((point) => point.y)) + labelHeight / 2 + gap };\n    case 'right':\n      return { x: Math.max(...points.map((point) => point.x)) + labelWidth / 2 + gap, y };\n    case 'left':\n      return { x: Math.min(...points.map((point) => point.x)) - labelWidth / 2 - gap, y };\n    case 'top':\n    default:\n      return { x, y: Math.min(...points.map((point) => point.y)) - labelHeight / 2 - gap };\n  }\n};\n\n// Convert internal dagre layout edges into the public SVG edges we actually render.\nexport const getEdgesToRender = (graph, yOffset = 0, { mergeSelfLoops = true } = {}) => {\n  const selfLoopEdgeGroups = new Map();\n  const edgesToRender = [];\n  const rankdir = graph.graph()?.rankdir;\n\n  graph.edges().forEach((e) => {\n    const edge = graph.edge(e);\n    if (mergeSelfLoops && edge.selfLoop) {\n      const key = edge.selfLoop.id;\n      if (!selfLoopEdgeGroups.has(key)) {\n        selfLoopEdgeGroups.set(key, []);\n      }\n      selfLoopEdgeGroups.get(key).push({ edge, start: e.v, end: e.w });\n    } else {\n      edgesToRender.push({ edge, start: e.v, end: e.w });\n    }\n  });\n\n  selfLoopEdgeGroups.forEach((segments) => {\n    if (segments.length !== 3) {\n      // Unexpected self-loop state: preserve the old rendering behavior rather than dropping edges.\n      segments.forEach((segment) => edgesToRender.push(segment));\n      return;\n    }\n\n    segments.sort((a, b) => a.edge.selfLoop.order - b.edge.selfLoop.order);\n    const [firstSegment, middleSegment, lastSegment] = segments;\n    const originalEdge =\n      firstSegment.edge.originalEdge ??\n      middleSegment.edge.originalEdge ??\n      lastSegment.edge.originalEdge ??\n      middleSegment.edge;\n    const node = graph.node(originalEdge.start);\n    if (!node) {\n      segments.forEach((segment) => edgesToRender.push(segment));\n      return;\n    }\n    const label = {\n      width: middleSegment.edge.width,\n      height: middleSegment.edge.height,\n    };\n    // Dagre uses the dummy route for layout; the SVG output should still be one logical edge.\n    const side = getSelfLoopSide(graph, node, segments, originalEdge.start, rankdir);\n    const points = getSelfLoopPoints(node, side, yOffset, label.width ?? 0);\n    const labelPosition = getSelfLoopLabelPosition(node, points, side, yOffset, label);\n    const mergedEdge = {\n      ...middleSegment.edge,\n      ...originalEdge,\n      id: originalEdge.id,\n      points,\n      start: originalEdge.start,\n      end: originalEdge.end,\n      x: labelPosition.x,\n      y: labelPosition.y,\n      width: label.width,\n      height: label.height,\n      labelStyle: middleSegment.edge.labelStyle,\n      fromCluster:\n        firstSegment.edge.fromCluster ??\n        middleSegment.edge.fromCluster ??\n        lastSegment.edge.fromCluster,\n      toCluster:\n        firstSegment.edge.toCluster ?? middleSegment.edge.toCluster ?? lastSegment.edge.toCluster,\n    };\n    delete mergedEdge.selfLoop;\n    delete mergedEdge.originalEdge;\n\n    edgesToRender.push({ edge: mergedEdge, start: mergedEdge.start, end: mergedEdge.end });\n  });\n\n  return edgesToRender;\n};\n\nconst measureDagreGraph = async ({\n  element: _elem,\n  graph,\n  diagramType,\n  id,\n  parentCluster,\n  siteConfig,\n}) => {\n  // perf: skip eager graphlibJson.write() serialization (the arg runs every render even when the log is a no-op)\n  // log.warn('Graph in recursive render:XAX', graphlibJson.write(graph), parentCluster);\n  const dir = graph.graph().rankdir;\n  log.trace('Dir in recursive render - dir:', dir);\n\n  const {\n    clusters,\n    edgePaths,\n    edgeLabels,\n    nodes,\n    rootGroups: elem,\n  } = createLayoutElementGroups(_elem, {\n    edgePathsClass: 'edgePaths',\n  });\n  if (!graph.nodes()) {\n    log.info('No nodes found for', graph);\n  } else {\n    log.info('Recursive render XXX', graph.nodes());\n  }\n  if (graph.edges().length > 0) {\n    log.info('Recursive edges', graph.edge(graph.edges()[0]));\n  }\n  const mergeSelfLoops = shouldMergeSelfLoopSegments(diagramType);\n\n  // Insert nodes, this will insert them into the dom and each node will get a size. The size is updated\n  // to the abstract node and is later used by dagre for the layout\n  await Promise.all(\n    graph.nodes().map(async function (v) {\n      const node = graph.node(v);\n      if (parentCluster !== undefined) {\n        const data = JSON.parse(JSON.stringify(parentCluster.clusterData));\n        // data.clusterPositioning = true;\n        log.trace(\n          'Setting data for parent cluster XXX\\n Node.id = ',\n          v,\n          '\\n data=',\n          data.height,\n          '\\nParent cluster',\n          parentCluster.height\n        );\n        graph.setNode(parentCluster.id, data);\n        if (!graph.parent(v)) {\n          log.trace('Setting parent', v, parentCluster.id);\n          graph.setParent(v, parentCluster.id, data);\n        }\n      }\n      log.info('(Insert) Node XXX' + v + ': ' + JSON.stringify(graph.node(v)));\n      if (node?.clusterNode) {\n        // const children = graph.children(v);\n        log.info('Cluster identified XBX', v, node.width, graph.node(v));\n\n        // `node.graph.setGraph` applies the graph configurations such as nodeSpacing to subgraphs as without this the default values would be used\n        // We override only the `ranksep` and `nodesep` configurations to allow for setting subgraph spacing while avoiding overriding other properties\n        const { ranksep, nodesep } = graph.graph();\n        node.graph.setGraph({\n          ...node.graph.graph(),\n          ranksep: ranksep + 25,\n          nodesep,\n        });\n\n        // \"o\" will contain the full cluster not just the children\n        const o = await renderDagreSubgraph({\n          element: nodes,\n          graph: node.graph,\n          diagramType,\n          id,\n          parentCluster: graph.node(v),\n          siteConfig,\n        });\n        const newEl = o.elem;\n        updateNodeBounds(node, newEl);\n        // node.height = o.diff;\n        node.diff = o.diff || 0;\n        log.info(\n          'New compound node after recursive render XAX',\n          v,\n          'width',\n          // node,\n          node.width,\n          'height',\n          node.height\n          // node.x,\n          // node.y\n        );\n        setNodeElem(newEl, node);\n      } else {\n        if (graph.children(v).length > 0) {\n          // This is a cluster but not to be rendered recursively\n          // Render as before\n          log.trace(\n            'Cluster - the non recursive path XBX',\n            v,\n            node.id,\n            node,\n            node.width,\n            'Graph:',\n            graph\n          );\n          log.trace(findNonClusterChild(node.id, graph));\n          clusterDb.set(node.id, { id: findNonClusterChild(node.id, graph), node });\n          // insertCluster(clusters, graph.node(v));\n        } else {\n          log.trace('Node - the non recursive path XAX', v, nodes, graph.node(v), dir);\n          await insertMeasuredNode(nodes, graph.node(v), { config: siteConfig, dir });\n        }\n      }\n    })\n  );\n\n  const processEdges = async () => {\n    const edgePromises = graph.edges().map(async function (e) {\n      const edge = graph.edge(e.v, e.w, e.name);\n      log.info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));\n      log.info('Edge ' + e.v + ' -> ' + e.w + ': ', e, ' ', JSON.stringify(graph.edge(e)));\n\n      // Check if link is either from or to a cluster\n      log.info(\n        'Fix',\n        clusterDb,\n        'ids:',\n        e.v,\n        e.w,\n        'Translating: ',\n        clusterDb.get(e.v),\n        clusterDb.get(e.w)\n      );\n      if (mergeSelfLoops && edge.selfLoop) {\n        // Only the middle layout segment owns the label, using the original edge id for lookup.\n        if (edge.selfLoop.order !== 1) {\n          return;\n        }\n        const labelEdge = {\n          ...edge.originalEdge,\n          ...edge,\n          id: edge.selfLoop.id,\n          startLabelLeft: edge.originalEdge?.startLabelLeft ?? edge.startLabelLeft,\n          startLabelRight: edge.originalEdge?.startLabelRight ?? edge.startLabelRight,\n          endLabelLeft: edge.originalEdge?.endLabelLeft ?? edge.endLabelLeft,\n          endLabelRight: edge.originalEdge?.endLabelRight ?? edge.endLabelRight,\n        };\n        await insertEdgeLabel(edgeLabels, labelEdge);\n        edge.width = labelEdge.width;\n        edge.height = labelEdge.height;\n        edge.labelStyle = labelEdge.labelStyle;\n        return;\n      }\n      await insertEdgeLabel(edgeLabels, edge);\n    });\n\n    await Promise.all(edgePromises);\n  };\n\n  await processEdges();\n\n  const { subGraphTitleTotalMargin } = getSubGraphTitleMargins(siteConfig);\n  return {\n    elem,\n    graph,\n    groups: { clusters, edgePaths, edgeLabels, nodes, rootGroups: elem },\n    diagramType,\n    id,\n    mergeSelfLoops,\n    subGraphTitleTotalMargin,\n  };\n};\n\nconst runDagreGraphLayout = (graph) => {\n  // perf: skip eager graphlibJson.write() serialization (the arg runs every render even when the log is a no-op)\n  // log.info('Graph before layout:', JSON.stringify(graphlibJson.write(graph)));\n\n  log.info('############################################# XXX');\n  log.info('###                Layout                 ### XXX');\n  log.info('############################################# XXX');\n\n  // Time the actual external dagre call on its own (\"layoutCore\"); the rest of\n  // this function is our wrapper (DOM, graph (de)serialization, \u2026).\n  if (injected.profiling) {\n    profiler.begin('layoutCore');\n  }\n  dagreLayout(graph);\n  if (injected.profiling) {\n    profiler.end(); // layoutCore\n  }\n\n  // perf: skip eager graphlibJson.write() serialization (the arg runs every render even when the log is a no-op)\n  // log.info('Graph after layout:', JSON.stringify(graphlibJson.write(graph)));\n};\n\nconst normalizeDagreNode = (graph, nodeId, subGraphTitleTotalMargin) => {\n  const node = graph.node(nodeId);\n  if (!node) {\n    return undefined;\n  }\n\n  const normalizedNode = { ...node };\n  if (node?.clusterNode) {\n    normalizedNode.y = (node.y ?? 0) + subGraphTitleTotalMargin;\n  } else if (graph.children(nodeId).length > 0) {\n    normalizedNode.height = (node.height ?? 0) + subGraphTitleTotalMargin;\n  } else {\n    normalizedNode.y = (node.y ?? 0) + subGraphTitleTotalMargin / 2;\n  }\n  return normalizedNode;\n};\n\nconst applyDagreNodeLayout = (targetNode, dagreNode) => {\n  DAGRE_NODE_LAYOUT_PROPERTIES.forEach((property) => {\n    if (dagreNode[property] !== undefined) {\n      targetNode[property] = dagreNode[property];\n    }\n  });\n};\n\nconst normalizeDagreEdge = (edge, start, end, edgeOffsetY) => ({\n  ...edge,\n  start: edge.start ?? start,\n  end: edge.end ?? end,\n  points: (edge.points ?? []).map((point) => ({\n    ...point,\n    y: typeof point.y === 'number' ? point.y + edgeOffsetY : point.y,\n  })),\n});\n\n/**\n * Copy the Dagre layout results back onto LayoutData.\n *\n * Known limitations \u2014 the normalization only covers the top-level graph:\n * - Recursive clusters: `adjustClustersAndEdges` moves cluster children and intra-cluster edges\n *   into the nested `node.graph`, where they are laid out and painted during the recursive\n *   measure pass in their own coordinate space. Those nodes keep their pre-layout LayoutData\n *   values, and intra-cluster edges are absent from the normalized `data4Layout.edges`.\n * - Self-loops on diagram types where segments are not merged: the three `*-cyclic-special-*`\n *   layout segments replace the original self-edge in `data4Layout.edges`, since they are what\n *   is actually rendered.\n * Consumers of the normalized LayoutData must not assume it is a complete description of the\n * rendered output for cluster diagrams \u2014 the recursive paint path owns the nested content.\n */\nexport const applyDagreLayoutResult = (data4Layout, measuredLayout) => {\n  const { graph, mergeSelfLoops, subGraphTitleTotalMargin = 0 } = measuredLayout;\n  const nodeById = new Map(data4Layout.nodes.map((node) => [node.id, node]));\n\n  sortNodesByHierarchy(graph).forEach((nodeId) => {\n    const dagreNode = normalizeDagreNode(graph, nodeId, subGraphTitleTotalMargin);\n    if (!dagreNode) {\n      return;\n    }\n\n    applyDagreNodeLayout(graph.node(nodeId), dagreNode);\n\n    const targetNode = nodeById.get(nodeId);\n    if (targetNode) {\n      applyDagreNodeLayout(targetNode, dagreNode);\n    }\n  });\n\n  const edgeOffsetY = subGraphTitleTotalMargin / 2;\n  data4Layout.edges = getEdgesToRender(graph, edgeOffsetY, { mergeSelfLoops }).map(\n    ({ edge, start, end }) => normalizeDagreEdge(edge, start, end, edgeOffsetY)\n  );\n\n  return data4Layout;\n};\n\nconst paintDagreLayoutCore = async ({\n  elem,\n  graph,\n  groups: { clusters, edgePaths },\n  diagramType,\n  id,\n  mergeSelfLoops,\n  subGraphTitleTotalMargin,\n}) => {\n  // Move the nodes to the correct place\n  let diff = 0;\n  await Promise.all(\n    sortNodesByHierarchy(graph).map(async function (v) {\n      const node = graph.node(v);\n      log.info(\n        'Position XBX => ' + v + ': (' + node.x,\n        ',' + node.y,\n        ') width: ',\n        node.width,\n        ' height: ',\n        node.height\n      );\n      if (node?.clusterNode) {\n        // Adjust for padding when on root level\n        node.y += subGraphTitleTotalMargin;\n\n        log.info(\n          'A tainted cluster node XBX1',\n          v,\n          node.id,\n          node.width,\n          node.height,\n          node.x,\n          node.y,\n          graph.parent(v)\n        );\n        clusterDb.get(node.id).node = node;\n        positionNode(node);\n      } else {\n        // A tainted cluster node\n        if (graph.children(v).length > 0) {\n          log.info(\n            'A pure cluster node XBX1',\n            v,\n            node.id,\n            node.x,\n            node.y,\n            node.width,\n            node.height,\n            graph.parent(v)\n          );\n          node.height += subGraphTitleTotalMargin;\n          graph.node(node.parentId);\n          const halfPadding = node?.padding / 2 || 0;\n          const labelHeight = node?.labelBBox?.height || 0;\n          const offsetY = labelHeight - halfPadding || 0;\n          log.debug('OffsetY', offsetY, 'labelHeight', labelHeight, 'halfPadding', halfPadding);\n          await insertCluster(clusters, node);\n\n          // A cluster in the non-recursive way\n          clusterDb.get(node.id).node = node;\n        } else {\n          // Regular node\n          const parent = graph.node(node.parentId);\n          node.y += subGraphTitleTotalMargin / 2;\n          log.info(\n            'A regular node XBX1 - using the padding',\n            node.id,\n            'parent',\n            node.parentId,\n            node.width,\n            node.height,\n            node.x,\n            node.y,\n            'offsetY',\n            node.offsetY,\n            'parent',\n            parent,\n            parent?.offsetY,\n            node\n          );\n\n          positionNode(node);\n        }\n      }\n    })\n  );\n\n  // Move the edge labels to the correct place after layout\n  const edgeOffsetY = subGraphTitleTotalMargin / 2;\n  const edgesToRender = getEdgesToRender(graph, edgeOffsetY, { mergeSelfLoops });\n\n  edgesToRender.forEach(function ({ edge, start, end }) {\n    log.info('Edge ' + start + ' -> ' + end + ': ' + JSON.stringify(edge), edge);\n\n    edge.points.forEach((point) => (point.y += edgeOffsetY));\n    const startNode = graph.node(start);\n    const endNode = graph.node(end);\n    const paths = insertEdge(edgePaths, edge, clusterDb, diagramType, startNode, endNode, id);\n    positionEdgeLabel(edge, paths);\n  });\n\n  graph.nodes().forEach(function (v) {\n    const n = graph.node(v);\n    log.info(v, n.type, n.diff);\n    if (n.isGroup) {\n      diff = n.diff;\n    }\n  });\n  log.warn('Returning from recursive render XAX', elem, diff);\n  return { elem, diff };\n};\n\nconst renderDagreSubgraph = async (options) => {\n  const measuredLayout = await measureDagreGraph(options);\n  runDagreGraphLayout(measuredLayout.graph);\n  return await paintDagreLayoutCore(measuredLayout);\n};\n\nexport const prepareLayoutForDagre = (data4Layout) => {\n  const graph = new graphlib.Graph({\n    multigraph: true,\n    compound: true,\n  })\n    .setGraph({\n      rankdir: data4Layout.direction,\n      // Precedence: an explicit top-level config override (only present when a\n      // user sets it - it has no schema default) > the value the diagram's own\n      // renderer put on data4Layout (usually derived from that diagram's config)\n      // > the flowchart config as a generic fallback. The flowchart keys have\n      // schema defaults and therefore always exist, so they must come last or\n      // they silently shadow every diagram's own spacing (see #7932).\n      nodesep:\n        data4Layout.config?.nodeSpacing ||\n        data4Layout.nodeSpacing ||\n        data4Layout.config?.flowchart?.nodeSpacing,\n      ranksep:\n        data4Layout.config?.rankSpacing ||\n        data4Layout.rankSpacing ||\n        data4Layout.config?.flowchart?.rankSpacing,\n      marginx: 8,\n      marginy: 8,\n    })\n    .setDefaultEdgeLabel(function () {\n      return {};\n    });\n\n  data4Layout.nodes.forEach((node) => {\n    graph.setNode(node.id, { ...node });\n    if (node.parentId) {\n      graph.setParent(node.id, node.parentId);\n    }\n  });\n\n  log.debug('Edges:', data4Layout.edges);\n  data4Layout.edges.forEach((edge) => {\n    if (edge.start === edge.end) {\n      // Keep the dagre dummy-node workaround for layout, then merge these segments before rendering.\n      const nodeId = edge.start;\n      const specialId1 = nodeId + '---' + nodeId + '---1';\n      const specialId2 = nodeId + '---' + nodeId + '---2';\n      const node = graph.node(nodeId);\n      graph.setNode(specialId1, {\n        domId: specialId1,\n        id: specialId1,\n        parentId: node.parentId,\n        labelStyle: '',\n        label: '',\n        padding: 0,\n        shape: 'labelRect',\n        // shape: 'rect',\n        style: '',\n        width: 10,\n        height: 10,\n      });\n      graph.setParent(specialId1, node.parentId);\n      graph.setNode(specialId2, {\n        domId: specialId2,\n        id: specialId2,\n        parentId: node.parentId,\n        labelStyle: '',\n        padding: 0,\n        // shape: 'rect',\n        shape: 'labelRect',\n        label: '',\n        style: '',\n        width: 10,\n        height: 10,\n      });\n      graph.setParent(specialId2, node.parentId);\n\n      const originalEdge = structuredClone(edge);\n      const edge1 = structuredClone(edge);\n      const edgeMid = structuredClone(edge);\n      const edge2 = structuredClone(edge);\n      // Preserve the original edge so the final SVG path uses the logical self-loop id and data.\n      edge1.originalEdge = originalEdge;\n      edge1.selfLoop = { id: originalEdge.id, order: 0 };\n      edgeMid.originalEdge = originalEdge;\n      edgeMid.selfLoop = { id: originalEdge.id, order: 1 };\n      edge2.originalEdge = originalEdge;\n      edge2.selfLoop = { id: originalEdge.id, order: 2 };\n      edge1.label = '';\n      edge1.arrowTypeEnd = 'none';\n      edge1.endLabelLeft = '';\n      edge1.endLabelRight = ''; // defensive\n      edge1.startLabelLeft = ''; // defensive\n      edge1.id = nodeId + '-cyclic-special-1';\n      edgeMid.startLabelRight = '';\n      edgeMid.startLabelLeft = ''; // defensive\n      edgeMid.endLabelLeft = '';\n      edgeMid.endLabelRight = ''; // defensive\n      edgeMid.arrowTypeStart = 'none';\n      edgeMid.arrowTypeEnd = 'none';\n      edgeMid.id = nodeId + '-cyclic-special-mid';\n      edge2.label = '';\n      edge2.startLabelRight = '';\n      edge2.startLabelLeft = ''; // defensive\n      edge2.arrowTypeStart = 'none';\n      if (node.isGroup) {\n        edge1.fromCluster = nodeId;\n        edge2.toCluster = nodeId;\n      }\n      edge2.id = nodeId + '-cyclic-special-2';\n      edge2.arrowTypeStart = 'none';\n      graph.setEdge(nodeId, specialId1, edge1, nodeId + '-cyclic-special-0');\n      graph.setEdge(specialId1, specialId2, edgeMid, nodeId + '-cyclic-special-1');\n      graph.setEdge(specialId2, nodeId, edge2, nodeId + '-cyclic-special-2');\n    } else {\n      graph.setEdge(edge.start, edge.end, { ...edge }, edge.id);\n    }\n  });\n\n  // perf: skip eager graphlibJson.write() serialization (the arg runs every render even when the log is a no-op)\n  // log.debug('Graph at first:', JSON.stringify(graphlibJson.write(graph)));\n  adjustClustersAndEdges(graph);\n  // perf: skip eager graphlibJson.write() serialization (the arg runs every render even when the log is a no-op)\n  // log.warn('Graph after XAX:', JSON.stringify(graphlibJson.write(graph)));\n\n  return { graph };\n};\n\nexport const measureDagreLayout = async (data4Layout, { element, preparedLayout }) => {\n  const prepared = preparedLayout ?? prepareLayoutForDagre(data4Layout);\n  const siteConfig = getConfig();\n  const measuredLayout = await measureDagreGraph({\n    element,\n    graph: prepared.graph,\n    diagramType: data4Layout.type,\n    id: data4Layout.diagramId,\n    parentCluster: undefined,\n    siteConfig,\n  });\n  prepared.measuredLayout = measuredLayout;\n  return measuredLayout;\n};\n\nexport const runDagreLayoutCore = (data4Layout, context) => {\n  const measuredLayout = context.preparedLayout?.measuredLayout;\n\n  if (!measuredLayout) {\n    throw new Error('runDagreLayoutCore requires measureDagreLayout to run first');\n  }\n\n  runDagreGraphLayout(measuredLayout.graph);\n  applyDagreLayoutResult(data4Layout, measuredLayout);\n  return measuredLayout;\n};\n\nconst getDagrePaintNodes = (_data4Layout, { measure }) =>\n  sortNodesByHierarchy(measure.graph)\n    .map((nodeId) => measure.graph.node(nodeId))\n    .filter(Boolean);\n\nconst getDagreEdgeNode = (nodeId, _edge, { measure }) =>\n  nodeId ? measure.graph.node(nodeId) : undefined;\n\nexport const render = createCommonLayoutRenderer({\n  prepareLayout: prepareLayoutForDagre,\n  measureLayout: measureDagreLayout,\n  runLayoutCore: runDagreLayoutCore,\n  paintOptions: {\n    clusterDb,\n    getNodes: getDagrePaintNodes,\n    getEdgeNode: getDagreEdgeNode,\n    skipNode: (node, { measure }) => !measure.graph.hasNode(node.id),\n    isCluster: (node, { measure }) =>\n      measure.graph.hasNode(node.id) && (measure.graph.children(node.id) ?? []).length > 0,\n  },\n});\n"],
  "mappings": "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",
  "names": []
}
