function visit()

in packages/cdk-graph-plugin-diagram/src/internal/graphviz/diagram.ts [143:221]


  function visit(
    gNode: Graph.Node,
    parent: Diagram.Subgraph | Diagram.Diagram
  ) {
    if (gNode.isDestroyed) return;

    let entity: Diagram.Container | Diagram.Node;

    switch (gNode.nodeType) {
      case NodeTypeEnum.RESOURCE: {
        entity = new Diagram.ResourceNode(gNode as Graph.ResourceNode);
        break;
      }
      case NodeTypeEnum.CFN_RESOURCE: {
        entity = new Diagram.CfnResourceNode(gNode as Graph.CfnResourceNode);
        break;
      }
      case NodeTypeEnum.NESTED_STACK: {
        entity = new Diagram.NestedStackCluster(gNode as Graph.NestedStackNode);
        break;
      }
      case NodeTypeEnum.STACK: {
        if (
          GraphTheme.instance.rendering.stack &&
          new RegExp(GraphTheme.instance.rendering.stack).test(gNode.id) ===
            false
        ) {
          // Ignore non-matching root stacks
          return;
        }
        entity = new Diagram.StackCluster(gNode as Graph.StackNode);
        break;
      }
      default: {
        if (gNode.isLeaf) {
          if (gNode.hasFlag(FlagEnum.CUSTOM_RESOURCE)) {
            entity = new Diagram.CustomResourceNode(gNode);
          } else {
            entity = new Diagram.Node(gNode);
          }
        } else {
          entity = new Diagram.Cluster(gNode);
          gNode.addFlag(FlagEnum.CLUSTER);
        }
        break;
      }
    }

    if (nodePositions && entity instanceof Diagram.Node) {
      if (entity.graphNode.id in nodePositions) {
        entity.position = nodePositions[entity.graphNode.id]!;
      }
    }

    if (entity instanceof ImageNode && entity.image) {
      diagram.trackImage(entity.image);
    }

    if (parent instanceof Diagram.Container && parent.linkChildren) {
      edgeResolve.trackEdge(new ChildLink(parent, entity));
    }

    if (gNode.isLeaf) {
      entities.set(gNode.uuid, entity);
      parent.addNode(entity as Diagram.Node);
    } else {
      if (entity instanceof Diagram.Node) {
        entity = asContainer(entity);
      }

      parent.addSubgraph(entity as Diagram.Container);

      entities.set(gNode.uuid, entity);

      gNode.children.forEach((child) =>
        visit(child, entity as Diagram.Container)
      );
    }
  }