Diagram Maker›Language Reference
📐

Language Reference

Full syntax — every block, field, and diagnostic code

Referensi Bahasa

Referensi sintaksis lengkap untuk file Datro DSL (.dtro). Setiap jenis blok, setiap bidang, setiap kode diagnostik — semuanya di satu tempat.

23 jenis simpul21 jenis tepi6 kata kerja kendalaWCAG 2.1 AA/AAA

Tajuk ajaib

Setiap file .dtro harus dimulai dengan header ajaib pada baris 1. Parser akan mengembalikan E100 jika hilang atau formatnya salah.

DATRO
#!DATRO 1.0
Baris pertama yang diperlukan — `1.0` adalah versi spesifikasi saat ini

blok meta

Metadata tingkat dokumen opsional. Menghasilkan petunjuk info I003 jika dihilangkan. Semua bidang adalah string/array opsional kecuali 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
titlestringNoJudul diagram yang dapat dibaca manusia
versionstringNoVersi semantik dari diagram
descriptionstringNoDeskripsi teks bebas
authorstringNoNama penulis atau email
ownerstringNoTim atau orang yang bertanggung jawab
tagsstring[]NoTag klasifikasi sewenang-wenang
slastringNoTujuan tingkat layanan, mis. "99.9%"
criticalitystringNoTingkat kekritisan: "P0" | "high" | "medium" | "low"
kindDiagramKind
"architecture""mindmap""state""sequence""algorithm"
NoVarian diagram

blok simpul

Mendeklarasikan entitas dalam diagram. Setiap node memiliki id unik, type semantik yang mengontrol bentuk yang dirender dan warna default, dan blok attrs opsional untuk metadata.

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
ididentifierYesPengidentifikasi simpul unik — alfanumerik + garis bawah
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"
NoKategori simpul semantik
labelstringNoTampilkan teks yang ditunjukkan pada diagram
groupidentifierNoID grup milik node ini (alternatif dari group.members)
attrsAttrMapNoMetadata nilai kunci sewenang-wenang — string, angka, boolean, atau array
ℹ️

23 jenis simpul

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

blok tepi

Mendeklarasikan hubungan antara dua node. Arah tepi ditulis langsung dalam deklarasi: -> (terarah), <-> (dua arah), atau -- (tidak terarah).

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 simpul sumber
directionEdgeDir
"->""<->""--"
YesJenis panah ditulis sebaris
toidentifierYesId simpul target
kindEdgeKind
"http""grpc""graphql""websocket""tcp""udp""query""event""publish""subscribe""stream""call""read""write""deploys""monitors""depends""extends""implements""triggers""unknown"
NoTipe hubungan semantik — mendorong warna dan gaya
labelstringNoTeks pendek ditampilkan di garis tepi
weightnumberNoBobot lalu lintas relatif — tepi yang lebih berat membuat lebih tebal
asyncbooleanNoKetika true, tepi ditampilkan sebagai garis putus-putus (api-dan-lupakan)
attrsAttrMapNoMetadata sewenang-wenang — diteruskan ke JSON IR dan keterangan alat
ℹ️

21 jenis tepi

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

blok grup

Mengelompokkan node terkait ke dalam kotak subgraf berlabel. Sebuah node dapat tergabung dalam paling banyak satu grup — E403 memicu konflik. Grup dapat disarangkan: id anggota dapat mereferensikan id grup lain.

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
ididentifierYesPengidentifikasi grup unik
labelstringNoTampilkan label untuk kotak subgraf
membersidentifier[]NoID node atau grup yang akan disertakan — diutamakan daripada node { group: X }
attrsAttrMapNoMetadata sewenang-wenang

blok kendala

Mendeklarasikan aturan arsitektur yang dievaluasi validator terhadap IR. Pelanggaran menghasilkan E501 (atau W501 bila severity: warn). Bidang rule menggunakan tata bahasa tiga token yang ringkas.

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
idstringNoPengidentifikasi aturan opsional yang dapat dibaca manusia
rulestringYesSUBJECT VERB OBJECT — lihat tabel kata kerja di bawah
messagestringNoPesan khusus ditampilkan dalam diagnostik ketika aturan dilanggar
severityConstraintSeverity
"error""warn"
NoTingkat keparahan diagnostik jika dilanggar

Kata kerja pembatas

  • `!->` — tidak ada node SUBJECT yang memiliki tepi terarah ke node OBJECT mana pun.
  • `->` — setiap node SUBJECT harus memiliki setidaknya satu tepi yang diarahkan ke node OBJECT.
  • `!<->` — tidak ada tepi dua arah antara node SUBJECT dan OBJECT.
  • `<->` — setiap node SUBJECT harus memiliki tepi dua arah ke beberapa node OBJECT.
  • `in` — setiap node SUBJECT harus menjadi anggota grup OBJECT.
  • `!in` — tidak ada node SUBJECT yang boleh menjadi anggota grup OBJECT.
💡

Token subjek dan objek

Setiap token dapat berupa tipe node (database, external, …), ID grup (misalnya data_tier), atau * (karakter pengganti yang cocok dengan setiap node).

blok impor

Membagi diagram besar menjadi beberapa file .dtro. Resolver menggabungkan IR yang diimpor ke induk sebelum validasi. Gunakan as untuk penspasian nama dan expose untuk memasukkan id tertentu ke daftar putih.

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
pathstringYesJalur relatif atau absolut ke file .dtro
asidentifierNoAlias namespace — semua id yang diimpor diberi awalan alias.id
exposeidentifier[]NoDaftar Putih — hanya id ini yang digabungkan ke dalam IR induk

blok tata letak

Petunjuk kepada penyaji tentang cara menyusun grafik. Semua bidang bersifat opsional — penyaji menggunakan default yang masuk akal ketika blok dihilangkan.

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"
NoArah aliran grafik
algoLayoutAlgo
"dagre""dot""elk""force""none"
NoAlgoritma tata letak
node_sepnumberNoPiksel minimum antara node yang berdekatan dalam peringkat yang sama
rank_sepnumberNoPiksel minimum antar peringkat
marginnumberNoMargin grafik dalam piksel
cluster_paddingnumberNoBantalan ekstra di dalam kotak pembatas grup

blok tema

Mengontrol tampilan visual diagram yang dirender. palette memetakan tipe node ke warna hex. Sub-blok accessibility mengaktifkan pemeriksaan kontras WCAG 2.1 otomatis.

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
  }
}
💡

Warna font otomatis

Eksportir DOT secara otomatis memilih teks hitam atau putih untuk setiap pengisian node menggunakan rumus pencahayaan relatif WCAG 2.1. Anda tidak perlu mengatur warna teks terpisah.

blok gaya

Penggantian per elemen secara mendetail diterapkan setelah tema. Aturan berjenjang: by_id mengesampingkan by_type. Setiap sub-blok memetakan kunci ke peta properti.

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>NoGaya diterapkan ke semua node dari tipe tertentu
by_idRecord<id, StyleProps>NoGaya diterapkan ke id simpul tertentu — prioritas tertinggi
by_edge_kindRecord<EdgeKind, StyleProps>NoGaya diterapkan ke semua sisi dari jenis tertentu
by_edge_attrRecord<attrName, StyleProps>NoGaya diterapkan ke tepi yang nama boolean attrnya adalah true

Kode diagnostik

Semua diagnostik mencakup lokasi code, severity, message, dan line:col opsional. Tabel di bawah mencantumkan setiap kode yang dapat dikeluarkan oleh rantai alat.

Kesalahan (E×××)

  • `E100` — Header ajaib #!DATRO 1.0 hilang atau formatnya salah
  • `E201` — ID simpul duplikat
  • `E202` — Node mereferensikan id grup yang tidak diketahui
  • `E301` — Node tepi from tidak ditemukan
  • `E302` — Node tepi to tidak ditemukan
  • `E303` — Tepi weight negatif
  • `E401` — ID grup duplikat
  • `E402` — Grup members mereferensikan id yang tidak diketahui
  • `E403` — Node ditugaskan ke lebih dari satu grup
  • `E404` — Kumpulan kelompok melingkar terdeteksi
  • `E500` — Aturan batasan mengalami kesalahan sintaksis
  • `E501` — Aturan batasan dilanggar (keparahan mencerminkan severity batasan itu sendiri)

Peringatan (L×××)

  • `W301` — Tepi duplikat (sama dari/ke/jenis/label)
  • `W501` — Aturan batasan menggunakan kata kerja yang tidak diketahui
  • `W601` — Label simpul melebihi max_label_length (default 80 karakter)
  • `W602` — Warna palet tema berada di bawah kontras WCAG AA (4,5:1)
  • `W603` — Warna palet tema berada di bawah kontras WCAG AAA (7,0:1)

Petunjuk info (I×××)

  • `I001` — Node terisolasi — tidak ada edge yang terhubung dengannya
  • `I002` — Grup kosong — tidak ada anggota yang diumumkan
  • `I003` — Tidak ada blok meta — direkomendasikan untuk dokumentasi
  • `I601` — Tidak ada palet tema yang ditentukan — pemeriksaan kontras dilewati

Langkah selanjutnya

  • Gunakan CLI Reference untuk memvalidasi, memformat, dan mengekspor dari baris perintah.
  • Sematkan diagram di Markdown dengan Markdown plugin.
  • Kembali ke Quick Start untuk panduan langkah demi langkah.
Buka Pembuat Diagram

Coba bahasa lengkapnya secara langsung — tempelkan cuplikan apa pun di atas dan validasi secara instan.

Schema v1 · Updated October 2026