summaryrefslogtreecommitdiff
path: root/themes/blowfish/assets/lib/mermaid/index-70db0a05.js.map
blob: cc3b801883275319393ad55bb212d4c5d57d174c (plain)
1
{"version":3,"file":"index-70db0a05.js","sources":["../../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/clone.js","../../../node_modules/.pnpm/dagre-d3-es@7.0.9/node_modules/dagre-d3-es/src/graphlib/json.js","../src/dagre-wrapper/mermaid-graphlib.js","../src/dagre-wrapper/clusters.js","../src/dagre-wrapper/index.js"],"sourcesContent":["import baseClone from './_baseClone.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\nfunction clone(value) {\n  return baseClone(value, CLONE_SYMBOLS_FLAG);\n}\n\nexport default clone;\n","import * as _ from 'lodash-es';\nimport { Graph } from './graph.js';\n\nexport { write, read };\n\nfunction write(g) {\n  var json = {\n    options: {\n      directed: g.isDirected(),\n      multigraph: g.isMultigraph(),\n      compound: g.isCompound(),\n    },\n    nodes: writeNodes(g),\n    edges: writeEdges(g),\n  };\n  if (!_.isUndefined(g.graph())) {\n    json.value = _.clone(g.graph());\n  }\n  return json;\n}\n\nfunction writeNodes(g) {\n  return _.map(g.nodes(), function (v) {\n    var nodeValue = g.node(v);\n    var parent = g.parent(v);\n    var node = { v: v };\n    if (!_.isUndefined(nodeValue)) {\n      node.value = nodeValue;\n    }\n    if (!_.isUndefined(parent)) {\n      node.parent = parent;\n    }\n    return node;\n  });\n}\n\nfunction writeEdges(g) {\n  return _.map(g.edges(), function (e) {\n    var edgeValue = g.edge(e);\n    var edge = { v: e.v, w: e.w };\n    if (!_.isUndefined(e.name)) {\n      edge.name = e.name;\n    }\n    if (!_.isUndefined(edgeValue)) {\n      edge.value = edgeValue;\n    }\n    return edge;\n  });\n}\n\nfunction read(json) {\n  var g = new Graph(json.options).setGraph(json.value);\n  _.each(json.nodes, function (entry) {\n    g.setNode(entry.v, entry.value);\n    if (entry.parent) {\n      g.setParent(entry.v, entry.parent);\n    }\n  });\n  _.each(json.edges, function (entry) {\n    g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\n  });\n  return g;\n}\n","/** Decorates with functions required by mermaids dagre-wrapper. */\nimport { log } from '../logger';\nimport * as graphlibJson from 'dagre-d3-es/src/graphlib/json.js';\nimport * as graphlib from 'dagre-d3-es/src/graphlib/index.js';\n\nexport let clusterDb = {};\nlet descendants = {};\nlet parents = {};\n\nexport const clear = () => {\n  descendants = {};\n  parents = {};\n  clusterDb = {};\n};\n\nconst isDescendant = (id, ancenstorId) => {\n  // if (id === ancenstorId) return true;\n\n  log.trace('In isDecendant', ancenstorId, ' ', id, ' = ', descendants[ancenstorId].includes(id));\n  if (descendants[ancenstorId].includes(id)) {\n    return true;\n  }\n\n  return false;\n};\n\nconst edgeInCluster = (edge, clusterId) => {\n  log.info('Decendants of ', clusterId, ' is ', descendants[clusterId]);\n  log.info('Edge is ', edge);\n  // Edges to/from the cluster is not in the cluster, they are in the parent\n  if (edge.v === clusterId) {\n    return false;\n  }\n  if (edge.w === clusterId) {\n    return false;\n  }\n\n  if (!descendants[clusterId]) {\n    log.debug('Tilt, ', clusterId, ',not in decendants');\n    return false;\n  }\n  return (\n    descendants[clusterId].includes(edge.v) ||\n    isDescendant(edge.v, clusterId) ||\n    isDescendant(edge.w, clusterId) ||\n    descendants[clusterId].includes(edge.w)\n  );\n};\n\nconst copy = (clusterId, graph, newGraph, rootId) => {\n  log.warn(\n    'Copying children of ',\n    clusterId,\n    'root',\n    rootId,\n    'data',\n    graph.node(clusterId),\n    rootId\n  );\n  const nodes = graph.children(clusterId) || [];\n\n  // Include cluster node if it is not the root\n  if (clusterId !== rootId) {\n    nodes.push(clusterId);\n  }\n\n  log.warn('Copying (nodes) clusterId', clusterId, 'nodes', nodes);\n\n  nodes.forEach((node) => {\n    if (graph.children(node).length > 0) {\n      copy(node, graph, newGraph, rootId);\n    } else {\n      const data = graph.node(node);\n      log.info('cp ', node, ' to ', rootId, ' with parent ', clusterId); //,node, data, ' parent is ', clusterId);\n      newGraph.setNode(node, data);\n      if (rootId !== graph.parent(node)) {\n        log.warn('Setting parent', node, graph.parent(node));\n        newGraph.setParent(node, graph.parent(node));\n      }\n\n      if (clusterId !== rootId && node !== clusterId) {\n        log.debug('Setting parent', node, clusterId);\n        newGraph.setParent(node, clusterId);\n      } else {\n        log.info('In copy ', clusterId, 'root', rootId, 'data', graph.node(clusterId), rootId);\n        log.debug(\n          'Not Setting parent for node=',\n          node,\n          'cluster!==rootId',\n          clusterId !== rootId,\n          'node!==clusterId',\n          node !== clusterId\n        );\n      }\n      const edges = graph.edges(node);\n      log.debug('Copying Edges', edges);\n      edges.forEach((edge) => {\n        log.info('Edge', edge);\n        const data = graph.edge(edge.v, edge.w, edge.name);\n        log.info('Edge data', data, rootId);\n        try {\n          // Do not copy edges in and out of the root cluster, they belong to the parent graph\n          if (edgeInCluster(edge, rootId)) {\n            log.info('Copying as ', edge.v, edge.w, data, edge.name);\n            newGraph.setEdge(edge.v, edge.w, data, edge.name);\n            log.info('newGraph edges ', newGraph.edges(), newGraph.edge(newGraph.edges()[0]));\n          } else {\n            log.info(\n              'Skipping copy of edge ',\n              edge.v,\n              '-->',\n              edge.w,\n              ' rootId: ',\n              rootId,\n              ' clusterId:',\n              clusterId\n            );\n          }\n        } catch (e) {\n          log.error(e);\n        }\n      });\n    }\n    log.debug('Removing node', node);\n    graph.removeNode(node);\n  });\n};\nexport const extractDescendants = (id, graph) => {\n  // log.debug('Extracting ', id);\n  const children = graph.children(id);\n  let res = [...children];\n\n  for (const child of children) {\n    parents[child] = id;\n    res = [...res, ...extractDescendants(child, graph)];\n  }\n\n  return res;\n};\n\n/**\n * Validates the graph, checking that all parent child relation points to existing nodes and that\n * edges between nodes also ia correct. When not correct the function logs the discrepancies.\n *\n * @param graph\n */\nexport const validate = (graph) => {\n  const edges = graph.edges();\n  log.trace('Edges: ', edges);\n  for (const edge of edges) {\n    if (graph.children(edge.v).length > 0) {\n      log.trace('The node ', edge.v, ' is part of and edge even though it has children');\n      return false;\n    }\n    if (graph.children(edge.w).length > 0) {\n      log.trace('The node ', edge.w, ' is part of and edge even though it has children');\n      return false;\n    }\n  }\n  return true;\n};\n\n/**\n * Finds a child that is not a cluster. When faking an edge between a node and a cluster.\n *\n * @param id\n * @param {any} graph\n */\nexport const findNonClusterChild = (id, graph) => {\n  // const node = graph.node(id);\n  log.trace('Searching', id);\n  // const children = graph.children(id).reverse();\n  const children = graph.children(id); //.reverse();\n  log.trace('Searching children of id ', id, children);\n  if (children.length < 1) {\n    log.trace('This is a valid node', id);\n    return id;\n  }\n  for (const child of children) {\n    const _id = findNonClusterChild(child, graph);\n    if (_id) {\n      log.trace('Found replacement for', id, ' => ', _id);\n      return _id;\n    }\n  }\n};\n\nconst getAnchorId = (id) => {\n  if (!clusterDb[id]) {\n    return id;\n  }\n  // If the cluster has no external connections\n  if (!clusterDb[id].externalConnections) {\n    return id;\n  }\n\n  // Return the replacement node\n  if (clusterDb[id]) {\n    return clusterDb[id].id;\n  }\n  return id;\n};\n\nexport const adjustClustersAndEdges = (graph, depth) => {\n  if (!graph || depth > 10) {\n    log.debug('Opting out, no graph ');\n    return;\n  } else {\n    log.debug('Opting in, graph ');\n  }\n  // Go through the nodes and for each cluster found, save a replacement node, this can be used when\n  // faking a link to a cluster\n  graph.nodes().forEach(function (id) {\n    const children = graph.children(id);\n    if (children.length > 0) {\n      log.warn(\n        'Cluster identified',\n        id,\n        ' Replacement id in edges: ',\n        findNonClusterChild(id, graph)\n      );\n      descendants[id] = extractDescendants(id, graph);\n      clusterDb[id] = { id: findNonClusterChild(id, graph), clusterData: graph.node(id) };\n    }\n  });\n\n  // Check incoming and outgoing edges for each cluster\n  graph.nodes().forEach(function (id) {\n    const children = graph.children(id);\n    const edges = graph.edges();\n    if (children.length > 0) {\n      log.debug('Cluster identified', id, descendants);\n      edges.forEach((edge) => {\n        // log.debug('Edge, decendants: ', edge, decendants[id]);\n\n        // Check if any edge leaves the cluster (not the actual cluster, that's a link from the box)\n        if (edge.v !== id && edge.w !== id) {\n          // Any edge where either the one of the nodes is descending to the cluster but not the other\n          // if (decendants[id].indexOf(edge.v) < 0 && decendants[id].indexOf(edge.w) < 0) {\n\n          const d1 = isDescendant(edge.v, id);\n          const d2 = isDescendant(edge.w, id);\n\n          // d1 xor d2 - if either d1 is true and d2 is false or the other way around\n          if (d1 ^ d2) {\n            log.warn('Edge: ', edge, ' leaves cluster ', id);\n            log.warn('Decendants of XXX ', id, ': ', descendants[id]);\n            clusterDb[id].externalConnections = true;\n          }\n        }\n      });\n    } else {\n      log.debug('Not a cluster ', id, descendants);\n    }\n  });\n\n  // For clusters with incoming and/or outgoing edges translate those edges to a real node\n  // in the cluster in order to fake the edge\n  graph.edges().forEach(function (e) {\n    const edge = graph.edge(e);\n    log.warn('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));\n    log.warn('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(graph.edge(e)));\n\n    let v = e.v;\n    let w = e.w;\n    // Check if link is either from or to a cluster\n    log.warn(\n      'Fix XXX',\n      clusterDb,\n      'ids:',\n      e.v,\n      e.w,\n      'Translating: ',\n      clusterDb[e.v],\n      ' --- ',\n      clusterDb[e.w]\n    );\n    if (clusterDb[e.v] && clusterDb[e.w] && clusterDb[e.v] === clusterDb[e.w]) {\n      log.warn('Fixing and trixing link to self - removing XXX', e.v, e.w, e.name);\n      log.warn('Fixing and trixing - removing XXX', e.v, e.w, e.name);\n      v = getAnchorId(e.v);\n      w = getAnchorId(e.w);\n      graph.removeEdge(e.v, e.w, e.name);\n      const specialId = e.w + '---' + e.v;\n      graph.setNode(specialId, {\n        domId: specialId,\n        id: specialId,\n        labelStyle: '',\n        labelText: edge.label,\n        padding: 0,\n        shape: 'labelRect',\n        style: '',\n      });\n      const edge1 = JSON.parse(JSON.stringify(edge));\n      const edge2 = JSON.parse(JSON.stringify(edge));\n      edge1.label = '';\n      edge1.arrowTypeEnd = 'none';\n      edge2.label = '';\n      edge1.fromCluster = e.v;\n      edge2.toCluster = e.v;\n\n      graph.setEdge(v, specialId, edge1, e.name + '-cyclic-special');\n      graph.setEdge(specialId, w, edge2, e.name + '-cyclic-special');\n    } else if (clusterDb[e.v] || clusterDb[e.w]) {\n      log.warn('Fixing and trixing - removing XXX', e.v, e.w, e.name);\n      v = getAnchorId(e.v);\n      w = getAnchorId(e.w);\n      graph.removeEdge(e.v, e.w, e.name);\n      if (v !== e.v) {\n        edge.fromCluster = e.v;\n      }\n      if (w !== e.w) {\n        edge.toCluster = e.w;\n      }\n      log.warn('Fix Replacing with XXX', v, w, e.name);\n      graph.setEdge(v, w, edge, e.name);\n    }\n  });\n  log.warn('Adjusted Graph', graphlibJson.write(graph));\n  extractor(graph, 0);\n\n  log.trace(clusterDb);\n\n  // Remove references to extracted cluster\n  // graph.edges().forEach(edge => {\n  //   if (isDecendant(edge.v, clusterId) || isDecendant(edge.w, clusterId)) {\n  //     graph.removeEdge(edge);\n  //   }\n  // });\n};\n\nexport const extractor = (graph, depth) => {\n  log.warn('extractor - ', depth, graphlibJson.write(graph), graph.children('D'));\n  if (depth > 10) {\n    log.error('Bailing out');\n    return;\n  }\n  // For clusters without incoming and/or outgoing edges, create a new cluster-node\n  // containing the nodes and edges in the custer in a new graph\n  // for (let i = 0;)\n  let nodes = graph.nodes();\n  let hasChildren = false;\n  for (const node of nodes) {\n    const children = graph.children(node);\n    hasChildren = hasChildren || children.length > 0;\n  }\n\n  if (!hasChildren) {\n    log.debug('Done, no node has children', graph.nodes());\n    return;\n  }\n  // const clusters = Object.keys(clusterDb);\n  // clusters.forEach(clusterId => {\n  log.debug('Nodes = ', nodes, depth);\n  for (const node of nodes) {\n    log.debug(\n      'Extracting node',\n      node,\n      clusterDb,\n      clusterDb[node] && !clusterDb[node].externalConnections,\n      !graph.parent(node),\n      graph.node(node),\n      graph.children('D'),\n      ' Depth ',\n      depth\n    );\n    // Note that the node might have been removed after the Object.keys call so better check\n    // that it still is in the game\n    if (!clusterDb[node]) {\n      // Skip if the node is not a cluster\n      log.debug('Not a cluster', node, depth);\n      // break;\n    } else if (\n      !clusterDb[node].externalConnections &&\n      // !graph.parent(node) &&\n      graph.children(node) &&\n      graph.children(node).length > 0\n    ) {\n      log.warn(\n        'Cluster without external connections, without a parent and with children',\n        node,\n        depth\n      );\n\n      const graphSettings = graph.graph();\n      let dir = graphSettings.rankdir === 'TB' ? 'LR' : 'TB';\n      if (clusterDb[node] && clusterDb[node].clusterData && clusterDb[node].clusterData.dir) {\n        dir = clusterDb[node].clusterData.dir;\n        log.warn('Fixing dir', clusterDb[node].clusterData.dir, dir);\n      }\n\n      const clusterGraph = new graphlib.Graph({\n        multigraph: true,\n        compound: true,\n      })\n        .setGraph({\n          rankdir: dir, // Todo: set proper spacing\n          nodesep: 50,\n          ranksep: 50,\n          marginx: 8,\n          marginy: 8,\n        })\n        .setDefaultEdgeLabel(function () {\n          return {};\n        });\n\n      log.warn('Old graph before copy', graphlibJson.write(graph));\n      copy(node, graph, clusterGraph, node);\n      graph.setNode(node, {\n        clusterNode: true,\n        id: node,\n        clusterData: clusterDb[node].clusterData,\n        labelText: clusterDb[node].labelText,\n        graph: clusterGraph,\n      });\n      log.warn('New graph after copy node: (', node, ')', graphlibJson.write(clusterGraph));\n      log.debug('Old graph after copy', graphlibJson.write(graph));\n    } else {\n      log.warn(\n        'Cluster ** ',\n        node,\n        ' **not meeting the criteria !externalConnections:',\n        !clusterDb[node].externalConnections,\n        ' no parent: ',\n        !graph.parent(node),\n        ' children ',\n        graph.children(node) && graph.children(node).length > 0,\n        graph.children('D'),\n        depth\n      );\n      log.debug(clusterDb);\n    }\n  }\n\n  nodes = graph.nodes();\n  log.warn('New list of nodes', nodes);\n  for (const node of nodes) {\n    const data = graph.node(node);\n    log.warn(' Now next level', node, data);\n    if (data.clusterNode) {\n      extractor(data.graph, depth + 1);\n    }\n  }\n};\n\nconst sorter = (graph, nodes) => {\n  if (nodes.length === 0) {\n    return [];\n  }\n  let result = Object.assign(nodes);\n  nodes.forEach((node) => {\n    const children = graph.children(node);\n    const sorted = sorter(graph, children);\n    result = [...result, ...sorted];\n  });\n\n  return result;\n};\n\nexport const sortNodesByHierarchy = (graph) => sorter(graph, graph.children());\n","import intersectRect from './intersect/intersect-rect';\nimport { log } from '../logger';\nimport createLabel from './createLabel';\nimport { select } from 'd3';\nimport { getConfig } from '../config';\nimport { evaluate } from '../diagrams/common/common';\n\nconst rect = (parent, node) => {\n  log.trace('Creating subgraph rect for ', node.id, node);\n\n  // Add outer g element\n  const shapeSvg = parent\n    .insert('g')\n    .attr('class', 'cluster' + (node.class ? ' ' + node.class : ''))\n    .attr('id', node.id);\n\n  // add the rect\n  const rect = shapeSvg.insert('rect', ':first-child');\n\n  // Create the label and insert it after the rect\n  const label = shapeSvg.insert('g').attr('class', 'cluster-label');\n\n  const text = label\n    .node()\n    .appendChild(createLabel(node.labelText, node.labelStyle, undefined, true));\n\n  // Get the size of the label\n  let bbox = text.getBBox();\n\n  if (evaluate(getConfig().flowchart.htmlLabels)) {\n    const div = text.children[0];\n    const dv = select(text);\n    bbox = div.getBoundingClientRect();\n    dv.attr('width', bbox.width);\n    dv.attr('height', bbox.height);\n  }\n\n  const padding = 0 * node.padding;\n  const halfPadding = padding / 2;\n\n  const width = node.width <= bbox.width + padding ? bbox.width + padding : node.width;\n  if (node.width <= bbox.width + padding) {\n    node.diff = (bbox.width - node.width) / 2 - node.padding / 2;\n  } else {\n    node.diff = -node.padding / 2;\n  }\n\n  log.trace('Data ', node, JSON.stringify(node));\n  // center the rect around its coordinate\n  rect\n    .attr('style', node.style)\n    .attr('rx', node.rx)\n    .attr('ry', node.ry)\n    .attr('x', node.x - width / 2)\n    .attr('y', node.y - node.height / 2 - halfPadding)\n    .attr('width', width)\n    .attr('height', node.height + padding);\n\n  // Center the label\n  label.attr(\n    'transform',\n    // This puts the labal on top of the box instead of inside it\n    // 'translate(' + (node.x - bbox.width / 2) + ', ' + (node.y - node.height / 2 - bbox.height) + ')'\n    'translate(' + (node.x - bbox.width / 2) + ', ' + (node.y - node.height / 2) + ')'\n  );\n\n  const rectBox = rect.node().getBBox();\n  node.width = rectBox.width;\n  node.height = rectBox.height;\n\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return shapeSvg;\n};\n\n/**\n * Non visible cluster where the note is group with its\n *\n * @param {any} parent\n * @param {any} node\n * @returns {any} ShapeSvg\n */\nconst noteGroup = (parent, node) => {\n  // Add outer g element\n  const shapeSvg = parent.insert('g').attr('class', 'note-cluster').attr('id', node.id);\n\n  // add the rect\n  const rect = shapeSvg.insert('rect', ':first-child');\n\n  const padding = 0 * node.padding;\n  const halfPadding = padding / 2;\n\n  // center the rect around its coordinate\n  rect\n    .attr('rx', node.rx)\n    .attr('ry', node.ry)\n    .attr('x', node.x - node.width / 2 - halfPadding)\n    .attr('y', node.y - node.height / 2 - halfPadding)\n    .attr('width', node.width + padding)\n    .attr('height', node.height + padding)\n    .attr('fill', 'none');\n\n  const rectBox = rect.node().getBBox();\n  node.width = rectBox.width;\n  node.height = rectBox.height;\n\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return shapeSvg;\n};\nconst roundedWithTitle = (parent, node) => {\n  // Add outer g element\n  const shapeSvg = parent.insert('g').attr('class', node.classes).attr('id', node.id);\n\n  // add the rect\n  const rect = shapeSvg.insert('rect', ':first-child');\n\n  // Create the label and insert it after the rect\n  const label = shapeSvg.insert('g').attr('class', 'cluster-label');\n  const innerRect = shapeSvg.append('rect');\n\n  const text = label\n    .node()\n    .appendChild(createLabel(node.labelText, node.labelStyle, undefined, true));\n\n  // Get the size of the label\n  let bbox = text.getBBox();\n  if (evaluate(getConfig().flowchart.htmlLabels)) {\n    const div = text.children[0];\n    const dv = select(text);\n    bbox = div.getBoundingClientRect();\n    dv.attr('width', bbox.width);\n    dv.attr('height', bbox.height);\n  }\n  bbox = text.getBBox();\n  const padding = 0 * node.padding;\n  const halfPadding = padding / 2;\n\n  const width = node.width <= bbox.width + node.padding ? bbox.width + node.padding : node.width;\n  if (node.width <= bbox.width + node.padding) {\n    node.diff = (bbox.width + node.padding * 0 - node.width) / 2;\n  } else {\n    node.diff = -node.padding / 2;\n  }\n\n  // center the rect around its coordinate\n  rect\n    .attr('class', 'outer')\n    .attr('x', node.x - width / 2 - halfPadding)\n    .attr('y', node.y - node.height / 2 - halfPadding)\n    .attr('width', width + padding)\n    .attr('height', node.height + padding);\n  innerRect\n    .attr('class', 'inner')\n    .attr('x', node.x - width / 2 - halfPadding)\n    .attr('y', node.y - node.height / 2 - halfPadding + bbox.height - 1)\n    .attr('width', width + padding)\n    .attr('height', node.height + padding - bbox.height - 3);\n\n  // Center the label\n  label.attr(\n    'transform',\n    'translate(' +\n      (node.x - bbox.width / 2) +\n      ', ' +\n      (node.y -\n        node.height / 2 -\n        node.padding / 3 +\n        (evaluate(getConfig().flowchart.htmlLabels) ? 5 : 3)) +\n      ')'\n  );\n\n  const rectBox = rect.node().getBBox();\n  node.height = rectBox.height;\n\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return shapeSvg;\n};\n\nconst divider = (parent, node) => {\n  // Add outer g element\n  const shapeSvg = parent.insert('g').attr('class', node.classes).attr('id', node.id);\n\n  // add the rect\n  const rect = shapeSvg.insert('rect', ':first-child');\n\n  const padding = 0 * node.padding;\n  const halfPadding = padding / 2;\n\n  // center the rect around its coordinate\n  rect\n    .attr('class', 'divider')\n    .attr('x', node.x - node.width / 2 - halfPadding)\n    .attr('y', node.y - node.height / 2)\n    .attr('width', node.width + padding)\n    .attr('height', node.height + padding);\n\n  const rectBox = rect.node().getBBox();\n  node.width = rectBox.width;\n  node.height = rectBox.height;\n  node.diff = -node.padding / 2;\n  node.intersect = function (point) {\n    return intersectRect(node, point);\n  };\n\n  return shapeSvg;\n};\n\nconst shapes = { rect, roundedWithTitle, noteGroup, divider };\n\nlet clusterElems = {};\n\nexport const insertCluster = (elem, node) => {\n  log.trace('Inserting cluster');\n  const shape = node.shape || 'rect';\n  clusterElems[node.id] = shapes[shape](elem, node);\n};\nexport const getClusterTitleWidth = (elem, node) => {\n  const label = createLabel(node.labelText, node.labelStyle, undefined, true);\n  elem.node().appendChild(label);\n  const width = label.getBBox().width;\n  elem.node().removeChild(label);\n  return width;\n};\n\nexport const clear = () => {\n  clusterElems = {};\n};\n\nexport const positionCluster = (node) => {\n  log.info('Position cluster (' + node.id + ', ' + node.x + ', ' + node.y + ')');\n  const el = clusterElems[node.id];\n\n  el.attr('transform', 'translate(' + node.x + ', ' + node.y + ')');\n};\n","import { layout as dagreLayout } from 'dagre-d3-es/src/dagre/index.js';\nimport * as graphlibJson from 'dagre-d3-es/src/graphlib/json.js';\nimport insertMarkers from './markers';\nimport { updateNodeBounds } from './shapes/util';\nimport {\n  clear as clearGraphlib,\n  clusterDb,\n  adjustClustersAndEdges,\n  findNonClusterChild,\n  sortNodesByHierarchy,\n} from './mermaid-graphlib';\nimport { insertNode, positionNode, clear as clearNodes, setNodeElem } from './nodes';\nimport { insertCluster, clear as clearClusters } from './clusters';\nimport { insertEdgeLabel, positionEdgeLabel, insertEdge, clear as clearEdges } from './edges';\nimport { log } from '../logger';\n\nconst recursiveRender = (_elem, graph, diagramtype, parentCluster) => {\n  log.info('Graph in recursive render: XXX', graphlibJson.write(graph), parentCluster);\n  const dir = graph.graph().rankdir;\n  log.trace('Dir in recursive render - dir:', dir);\n\n  const elem = _elem.insert('g').attr('class', 'root');\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.trace('Recursive edges', graph.edge(graph.edges()[0]));\n  }\n  const clusters = elem.insert('g').attr('class', 'clusters');\n  const edgePaths = elem.insert('g').attr('class', 'edgePaths');\n  const edgeLabels = elem.insert('g').attr('class', 'edgeLabels');\n  const nodes = elem.insert('g').attr('class', 'nodes');\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  graph.nodes().forEach(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.info('Setting data for cluster XXX (', v, ') ', data, parentCluster);\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 && node.clusterNode) {\n      // const children = graph.children(v);\n      log.info('Cluster identified', v, node.width, graph.node(v));\n      const o = recursiveRender(nodes, node.graph, diagramtype, graph.node(v));\n      const newEl = o.elem;\n      updateNodeBounds(node, newEl);\n      node.diff = o.diff || 0;\n      log.info('Node bounds (abc123)', v, node, node.width, node.x, node.y);\n      setNodeElem(newEl, node);\n\n      log.warn('Recursive render complete ', 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.info('Cluster - the non recursive path XXX', v, node.id, node, graph);\n        log.info(findNonClusterChild(node.id, graph));\n        clusterDb[node.id] = { id: findNonClusterChild(node.id, graph), node };\n        // insertCluster(clusters, graph.node(v));\n      } else {\n        log.info('Node - the non recursive path', v, node.id, node);\n        insertNode(nodes, graph.node(v), dir);\n      }\n    }\n  });\n\n  // Insert labels, this will insert them into the dom so that the width can be calculated\n  // Also figure out which edges point to/from clusters and adjust them accordingly\n  // Edges from/to clusters really points to the first child in the cluster.\n  // TODO: pick optimal child in the cluster to us as link anchor\n  graph.edges().forEach(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('Fix', clusterDb, 'ids:', e.v, e.w, 'Translateing: ', clusterDb[e.v], clusterDb[e.w]);\n    insertEdgeLabel(edgeLabels, edge);\n  });\n\n  graph.edges().forEach(function (e) {\n    log.info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(e));\n  });\n  log.info('#############################################');\n  log.info('###                Layout                 ###');\n  log.info('#############################################');\n  log.info(graph);\n  dagreLayout(graph);\n  log.info('Graph after layout:', graphlibJson.write(graph));\n  // Move the nodes to the correct place\n  let diff = 0;\n  sortNodesByHierarchy(graph).forEach(function (v) {\n    const node = graph.node(v);\n    log.info('Position ' + v + ': ' + JSON.stringify(graph.node(v)));\n    log.info(\n      'Position ' + v + ': (' + node.x,\n      ',' + node.y,\n      ') width: ',\n      node.width,\n      ' height: ',\n      node.height\n    );\n    if (node && node.clusterNode) {\n      // clusterDb[node.id].node = node;\n\n      positionNode(node);\n    } else {\n      // Non cluster node\n      if (graph.children(v).length > 0) {\n        // A cluster in the non-recursive way\n        // positionCluster(node);\n        insertCluster(clusters, node);\n        clusterDb[node.id].node = node;\n      } else {\n        positionNode(node);\n      }\n    }\n  });\n\n  // Move the edge labels to the correct place after layout\n  graph.edges().forEach(function (e) {\n    const edge = graph.edge(e);\n    log.info('Edge ' + e.v + ' -> ' + e.w + ': ' + JSON.stringify(edge), edge);\n\n    const paths = insertEdge(edgePaths, e, edge, clusterDb, diagramtype, graph);\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.type === 'group') {\n      diff = n.diff;\n    }\n  });\n  return { elem, diff };\n};\n\nexport const render = (elem, graph, markers, diagramtype, id) => {\n  insertMarkers(elem, markers, diagramtype, id);\n  clearNodes();\n  clearEdges();\n  clearClusters();\n  clearGraphlib();\n\n  log.warn('Graph at first:', graphlibJson.write(graph));\n  adjustClustersAndEdges(graph);\n  log.warn('Graph after:', graphlibJson.write(graph));\n  // log.warn('Graph ever  after:', graphlibJson.write(graph.node('A').graph));\n  recursiveRender(elem, graph, diagramtype);\n};\n\n// const shapeDefinitions = {};\n// export const addShape = ({ shapeType: fun }) => {\n//   shapeDefinitions[shapeType] = fun;\n// };\n\n// const arrowDefinitions = {};\n// export const addArrow = ({ arrowType: fun }) => {\n//   arrowDefinitions[arrowType] = fun;\n// };\n"],"names":["_.isUndefined","_.clone","_.map","clear","data","graphlibJson.write","graphlib.Graph","rect","dagreLayout","clearNodes","clearEdges","clearClusters","clearGraphlib"],"mappings":"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"}