UNPKG

diagrams-js

Version:

A TypeScript port of the diagrams Python library for drawing cloud system architecture diagrams as code

181 lines (125 loc) 4.47 kB
--- name: diagrams-js/clusters-grouping description: > Grouping nodes with diagram.cluster() and nested clusters via cluster.cluster(). Adding nodes to clusters with cluster.add(). Visual organization with themed backgrounds. Connecting nodes across clusters. type: core library: diagrams-js library_version: "0.5.0" requires: - diagrams-js/getting-started - diagrams-js/provider-nodes sources: - "hatemhosny/diagrams-js:docs/docs/guides/clusters.mdx" - "hatemhosny/diagrams-js:src/Cluster.ts" --- This skill builds on diagrams-js/getting-started and diagrams-js/provider-nodes. Read them first for foundational concepts. # diagrams-js — Clusters & Grouping Organize diagrams visually by grouping related nodes into clusters. Support for nested clusters with automatic themed backgrounds. ## Setup ```typescript import { Diagram } from "diagrams-js"; import { ECS } from "diagrams-js/aws/compute"; import { RDS } from "diagrams-js/aws/database"; const diagram = Diagram("Clustered Services"); const webCluster = diagram.cluster("Web Tier"); const web = webCluster.add(ECS("Web Server")); const dbCluster = diagram.cluster("Database Tier"); const db = dbCluster.add(RDS("Database")); web.to(db); const svg = await diagram.render(); ``` ## Core Patterns ### Basic Cluster ```typescript import { Diagram } from "diagrams-js"; import { ECS } from "diagrams-js/aws/compute"; const diagram = Diagram("Services"); const cluster = diagram.cluster("Web Services"); const web1 = cluster.add(ECS("web1")); const web2 = cluster.add(ECS("web2")); ``` ### Nested Clusters ```typescript const diagram = Diagram("Production"); const prod = diagram.cluster("Production"); const webTier = prod.cluster("Web Tier"); const web1 = webTier.add(ECS("web1")); const web2 = webTier.add(ECS("web2")); const dbTier = prod.cluster("Database Tier"); const primary = dbTier.add(RDS("Primary")); const replica = dbTier.add(RDS("Replica")); ``` ### Cluster Options Clusters accept an optional `ClusterOptions` object with `className`, `dataAttrs`, and `graphAttr`: ```typescript const cluster = diagram.cluster("VPC", { className: "production", dataAttrs: { region: "us-east-1" }, }); ``` These are injected into the rendered SVG as attributes on the cluster `<g>` element, enabling DOM manipulation after rendering. Nested clusters also support options: ```typescript const prod = diagram.cluster("Production", { className: "prod-env" }); const webTier = prod.cluster("Web Tier", { className: "web-tier" }); ``` ### Connecting Across Clusters ```typescript const diagram = Diagram("Full Stack"); const frontend = diagram.cluster("Frontend"); const web = frontend.add(EC2("Web")); const backend = diagram.cluster("Backend"); const api = backend.add(EC2("API")); const data = diagram.cluster("Data"); const db = data.add(RDS("DB")); web.to(api).to(db); ``` ### Cluster with Multiple Node Types ```typescript const diagram = Diagram("AWS Architecture"); const lb = diagram.add(ALB("Load Balancer")); const webCluster = diagram.cluster("Web Tier"); const web1 = webCluster.add(ECS("web1")); const web2 = webCluster.add(ECS("web2")); const dbCluster = diagram.cluster("Database Tier"); const primary = dbCluster.add(RDS("Primary")); const replica = dbCluster.add(RDS("Replica")); lb.to([web1, web2]); web1.to(primary); web2.to(primary); primary.with(replica); ``` ## Common Mistakes ### HIGH Calling diagram.add() instead of cluster.add() Wrong: ```typescript const vpc = diagram.cluster("VPC"); const server = diagram.add(EC2("Server")); // Server added to diagram, NOT to the VPC cluster! ``` Correct: ```typescript const vpc = diagram.cluster("VPC"); const server = vpc.add(EC2("Server")); // Server is inside the VPC cluster with themed background ``` Must use cluster.add() to place nodes inside cluster. diagram.add() adds to diagram root. Source: docs/guides/clusters.mdx ### CRITICAL Using Python Cluster context manager syntax Wrong: ```python with Cluster("VPC"): server = EC2("Server") ``` Correct: ```typescript const vpc = diagram.cluster("VPC"); const server = vpc.add(EC2("Server")); ``` TypeScript uses method calls, not Python context managers. Create cluster with diagram.cluster(), add nodes with cluster.add(). Source: migration guide ## See also - diagrams-js/node-connections — Connecting nodes within and across clusters - diagrams-js/diagram-configuration — Theme colors for cluster backgrounds