Diagram Maker›Language Reference
📐

Language Reference

Full syntax — every block, field, and diagnostic code

Referencia de idioma

Referencia de sintaxis completa para Datro DSL (archivos .dtro. Cada tipo de bloque, cada campo, cada código de diagnóstico, todo en un solo lugar.

23 tipos de nodos21 tipos de bordes6 verbos de restricciónWCAG 2.1 AA/AAA

Cabecera mágica

Cada archivo .dtro debe comenzar con el encabezado mágico en la línea 1. El analizador devuelve E100 si falta o tiene un formato incorrecto.

DATRO
#!DATRO 1.0
Primera línea obligatoria: `1.0` es la versión de especificación actual

metabloque

Metadatos opcionales a nivel de documento. Produce I003 sugerencia de información si se omite. Todos los campos son cadenas/matrices opcionales excepto kind.

DATRO
#!DATRO 1.0

meta {
  title:       "Payment Service"
  version:     "2.1.0"
  description: "Handles card and crypto charges"
  author:      "jane@example.com"
  owner:       "payments-team"
  tags:        ["payments", "critical"]
  sla:         "99.95%"
  criticality: "P0"
  kind:        architecture
}
FieldTypeRequiredDescription
titlestringNoTítulo del diagrama legible por humanos
versionstringNoVersión semántica del diagrama.
descriptionstringNoDescripción en texto libre
authorstringNoNombre del autor o correo electrónico
ownerstringNoEquipo o persona responsable
tagsstring[]NoEtiquetas de clasificación arbitrarias
slastringNoObjetivo de nivel de servicio, p.e. "99.9%"
criticalitystringNoNivel de criticidad: "P0" | "high" | "medium" | "low"
kindDiagramKind
"architecture""mindmap""state""sequence""algorithm"
NoVariante del diagrama

bloque de nodos

Declara una entidad en el diagrama. Cada nodo tiene una identificación única, un type semántico que controla su forma representada y su color predeterminado, y un bloque attrs opcional para metadatos.

DATRO
# Minimal
node api_gw { type: gateway label: "API Gateway" }

# With attrs block
node payment_svc {
  type:  service
  label: "Payment Service"
  attrs {
    tech:       "nestjs"
    owner:      "payments-team"
    deprecated: false
    sla:        "99.95%"
  }
}

# Inline attrs (alternative syntax)
node db { type: database label: "Payments DB"  attrs { tech: "postgres" } }
FieldTypeRequiredDescription
ididentifierYesIdentificador de nodo único: alfanumérico + guión bajo
typeNodeType
"service""database""queue""cache""gateway""user""actor""system""external""process""storage""function""broker""scheduler""load_balancer""cdn""dns""firewall""client""mobile""web""iot""unknown"
NoCategoría de nodo semántico
labelstringNoMostrar texto que se muestra en el diagrama.
groupidentifierNoID de grupo al que pertenece este nodo (alternativa a group.members)
attrsAttrMapNoMetadatos de valores-clave arbitrarios: cadenas, números, valores booleanos o matrices
ℹ️

23 tipos de nodos

Los 23 valores: service database queue cache gateway user actor system external process storage function broker scheduler load_balancer cdn dns firewall client mobile web iot unknown.

bloque de borde

Declara una relación entre dos nodos. La dirección del borde se escribe directamente en la declaración: -> (dirigida), <-> (bidireccional) o -- (no dirigida).

DATRO
# Minimal
edge api_gw -> payment_svc { kind: http }

# Full metadata
edge payment_svc -> stripe {
  kind:   http
  label:  "charge API"
  weight: 2.0
  async:  false
  attrs { sla: "200ms" }
}

# Bidirectional edge
edge cache <-> service { kind: read }

# Undirected edge
edge svc_a -- svc_b { kind: depends }
FieldTypeRequiredDescription
fromidentifierYesID del nodo de origen
directionEdgeDir
"->""<->""--"
YesTipo de flecha escrito en línea
toidentifierYesID del nodo de destino
kindEdgeKind
"http""grpc""graphql""websocket""tcp""udp""query""event""publish""subscribe""stream""call""read""write""deploys""monitors""depends""extends""implements""triggers""unknown"
NoTipo de relación semántica: impulsa el color y el estilo
labelstringNoTexto breve mostrado en la línea del borde.
weightnumberNoPeso relativo del tráfico: los bordes más pesados se vuelven más gruesos
asyncbooleanNoCuando true, el borde se muestra como discontinuo (dispara y olvida)
attrsAttrMapNoMetadatos arbitrarios: pasados a JSON IR e información sobre herramientas
ℹ️

21 tipos de bordes

Los 21 valores: http grpc graphql websocket tcp udp query event publish subscribe stream call read write deploys monitors depends extends implements triggers unknown.

bloque de grupo

Agrupa nodos relacionados en un cuadro de subgrafo etiquetado. Un nodo puede pertenecer como máximo a un grupo: E403 activa los conflictos. Los grupos se pueden anidar: una identificación de miembro puede hacer referencia a otra identificación de grupo.

DATRO
group data_tier {
  label:   "Data Layer"
  members: [payments_db, fraud_cache, audit_log]
  attrs { compliance: "PCI-DSS" }
}

# Alternative: assign group on the node
node payments_db {
  type:  database
  label: "Payments DB"
  group: data_tier
}
FieldTypeRequiredDescription
ididentifierYesIdentificador de grupo único
labelstringNoMostrar etiqueta para el cuadro de subgrafo
membersidentifier[]NoID de nodo o grupo a incluir: tiene prioridad sobre node { group: X }
attrsAttrMapNoMetadatos arbitrarios

bloque de restricción

Declara una regla arquitectónica que el validador evalúa con respecto al IR. Las violaciones producen E501 (o W501 cuando severity: warn). El campo rule utiliza una gramática concisa de tres tokens.

DATRO
# Prohibition: databases may not call external services
constraint {
  id:       "no-db-external"
  rule:     "database !-> external"
  message:  "Databases must not connect directly to external APIs"
  severity: error
}

# Requirement: every gateway must connect to a service
constraint {
  rule:     "gateway -> service"
  message:  "Each gateway must route to at least one service"
  severity: warn
}

# Membership: all databases must be in the data_tier group
constraint {
  rule:     "database in data_tier"
  message:  "All database nodes must belong to the data_tier group"
  severity: error
}
FieldTypeRequiredDescription
idstringNoIdentificador de regla legible por humanos opcional
rulestringYesSUBJECT VERB OBJECT — ver la tabla de verbos a continuación
messagestringNoMensaje personalizado que se muestra en el diagnóstico cuando se infringe la regla
severityConstraintSeverity
"error""warn"
NoGravedad diagnóstica cuando se viola.

Verbos de restricción

  • `!->` — ningún nodo SUBJECT puede tener un borde dirigido a cualquier nodo OBJECT.
  • `->`: cada nodo SUBJECT debe tener al menos un borde dirigido a un nodo OBJECT.
  • `!<->`: no puede existir ningún borde bidireccional entre los nodos SUBJECT y OBJECT.
  • `<->`: cada nodo SUBJECT debe tener un borde bidireccional hacia algún nodo OBJECT.
  • `in`: cada nodo SUBJECT debe ser miembro del grupo OBJECT.
  • `!in` — ningún nodo SUBJECT puede ser miembro del grupo OBJECT.
💡

Fichas de sujeto y objeto

Cada token puede ser un tipo de nodo (database, external, …), un ID de grupo (por ejemplo, data_tier) o * (comodín que coincide con cada nodo).

bloque de importación

Divide diagramas grandes en múltiples archivos .dtro. El solucionador fusiona el IR importado con el principal antes de la validación. Utilice as para el espacio de nombres y expose para incluir en la lista blanca identificadores específicos.

DATRO
# Import everything from another .dtro file
import "auth.dtro"

# Import with a namespace alias — IDs become auth.user_service, etc.
import "auth.dtro" as auth

# Import only specific IDs (whitelist)
import "infra.dtro" as infra expose [load_balancer, cdn]
FieldTypeRequiredDescription
pathstringYesRuta relativa o absoluta al archivo .dtro
asidentifierNoAlias de espacio de nombres: todos los identificadores importados tienen el prefijo alias.id
exposeidentifier[]NoLista blanca: solo estos identificadores se fusionan en el IR principal

bloque de diseño

Consejos para el renderizador sobre cómo organizar el gráfico. Todos los campos son opcionales: el renderizador utiliza valores predeterminados sensatos cuando se omite el bloque.

DATRO
layout {
  direction:       LR          # LR | RL | TB | BT
  algo:            dagre        # dagre | dot | elk | force | none
  node_sep:        60           # px between nodes in the same rank
  rank_sep:        120          # px between ranks
  margin:          20           # graph margin in px
  cluster_padding: 16           # padding inside group boxes
}
FieldTypeRequiredDescription
directionLayoutDirection
"LR""RL""TB""BT"
NoDirección del flujo del gráfico
algoLayoutAlgo
"dagre""dot""elk""force""none"
NoAlgoritmo de diseño
node_sepnumberNoPíxeles mínimos entre nodos adyacentes en el mismo rango
rank_sepnumberNoPíxeles mínimos entre rangos
marginnumberNoMargen del gráfico en píxeles
cluster_paddingnumberNoRelleno adicional dentro de los cuadros delimitadores del grupo

bloque temático

Controla la apariencia visual del diagrama renderizado. El palette asigna tipos de nodos a colores hexadecimales. El subbloque accessibility permite la comprobación automática del contraste WCAG 2.1.

DATRO
theme {
  name: "Corporate"

  palette {
    service:    "#D0E8FF"
    database:   "#FFE8C0"
    gateway:    "#FFD0D0"
    queue:      "#E8D0FF"
    cache:      "#C0FFE8"
    external:   "#F0F0F0"
    background: "#FFFFFF"
  }

  typography {
    font_family:      "Inter, sans-serif"
    node_font_size:   11
    edge_font_size:   9
    label_font_weight: "600"
  }

  accessibility {
    min_contrast:    AA          # AA | AAA | none
    max_label_length: 60
  }
}
💡

Color de fuente automático

El exportador DOT selecciona automáticamente texto blanco o negro para cada relleno de nodo utilizando la fórmula de luminancia relativa WCAG 2.1. Nunca necesitarás establecer un color de texto separado.

bloque de estilo

Anulaciones detalladas por elemento aplicadas después del tema. Cascada de reglas: by_id anula by_type. Cada subbloque asigna una clave a un mapa de propiedades.

DATRO
style {
  # Override by node type
  by_type {
    database { fill: "#FFF3CD"  stroke: "#E6A817"  shape: cylinder }
    external { fill: "#F8F9FA"  stroke: "#6C757D"  dash: true }
  }

  # Override individual node by id
  by_id {
    stripe { fill: "#635BFF"  stroke: "#4B44CC" }
  }

  # Style edge kinds
  by_edge_kind {
    query   { color: "#E6A817"  width: 2 }
    publish { color: "#198754"  dash: true }
  }

  # Style edges that carry a boolean attr set to true
  by_edge_attr {
    async { dash: true  color: "#ADB5BD" }
  }
}
FieldTypeRequiredDescription
by_typeRecord<NodeType, StyleProps>NoEstilos aplicados a todos los nodos de un tipo determinado.
by_idRecord<id, StyleProps>NoEstilos aplicados a una identificación de nodo específica: máxima prioridad
by_edge_kindRecord<EdgeKind, StyleProps>NoEstilos aplicados a todos los bordes de un tipo determinado.
by_edge_attrRecord<attrName, StyleProps>NoEstilos aplicados a bordes donde el atributo booleano nombrado es true

Códigos de diagnóstico

Todos los diagnósticos incluyen una ubicación code, severity, message y una ubicación opcional line:col. La siguiente tabla enumera todos los códigos que la cadena de herramientas puede emitir.

Errores (E×××)

  • `E100` — Falta el encabezado mágico #!DATRO 1.0 o está mal formado
  • `E201` — ID de nodo duplicado
  • `E202` — El nodo hace referencia a una identificación de grupo desconocida
  • `E301` — Nodo de borde from no encontrado
  • `E302` — Nodo de borde to no encontrado
  • `E303` — El borde weight es negativo
  • `E401` — ID de grupo duplicado
  • `E402` — El grupo members hace referencia a una identificación desconocida
  • `E403` — El nodo está asignado a más de un grupo
  • `E404` — Se detectó anidamiento de grupo circular
  • `E500` — La regla de restricción tiene un error de sintaxis
  • `E501` — Se infringe la regla de restricción (la gravedad refleja la propia severity de la restricción)

Advertencias (W×××)

  • `W301` — Borde duplicado (mismo desde/hasta/tipo/etiqueta)
  • `W501` — La regla de restricción utiliza un verbo desconocido
  • `W601` — La etiqueta del nodo excede max_label_length (80 caracteres predeterminados)
  • `W602` — El color de la paleta del tema cae por debajo del contraste WCAG AA (4.5:1)
  • `W603` — El color de la paleta del tema cae por debajo del contraste WCAG AAA (7.0:1)

Consejos informativos (I×××)

  • `I001` — Nodo aislado — no hay bordes conectados a él
  • `I002` — Grupo vacío — no hay miembros declarados
  • `I003` — Sin bloque meta — recomendado para documentación
  • `I601` — No hay paleta de temas definida — se omitieron las comprobaciones de contraste

Próximos pasos

Creador de diagramas abiertos

Pruebe el idioma completo en vivo: pegue cualquier fragmento de arriba y valídelo al instante.

Schema v1 · Updated October 2026