@eventcatalog/language-server 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -0
- package/SPEC.md +1939 -0
- package/dist/ast-utils.d.ts +96 -0
- package/dist/ast-utils.d.ts.map +1 -0
- package/dist/ast-utils.js +241 -0
- package/dist/ast-utils.js.map +1 -0
- package/dist/compiler.d.ts +7 -0
- package/dist/compiler.d.ts.map +1 -0
- package/dist/compiler.js +654 -0
- package/dist/compiler.js.map +1 -0
- package/dist/ec-completion-provider.d.ts +15 -0
- package/dist/ec-completion-provider.d.ts.map +1 -0
- package/dist/ec-completion-provider.js +202 -0
- package/dist/ec-completion-provider.js.map +1 -0
- package/dist/ec-module.d.ts +18 -0
- package/dist/ec-module.d.ts.map +1 -0
- package/dist/ec-module.js +27 -0
- package/dist/ec-module.js.map +1 -0
- package/dist/ec-scope-provider.d.ts +2 -0
- package/dist/ec-scope-provider.d.ts.map +1 -0
- package/dist/ec-scope-provider.js +2 -0
- package/dist/ec-scope-provider.js.map +1 -0
- package/dist/ec-scope.d.ts +10 -0
- package/dist/ec-scope.d.ts.map +1 -0
- package/dist/ec-scope.js +18 -0
- package/dist/ec-scope.js.map +1 -0
- package/dist/ec-validator.d.ts +9 -0
- package/dist/ec-validator.d.ts.map +1 -0
- package/dist/ec-validator.js +238 -0
- package/dist/ec-validator.js.map +1 -0
- package/dist/formatter.d.ts +6 -0
- package/dist/formatter.d.ts.map +1 -0
- package/dist/formatter.js +88 -0
- package/dist/formatter.js.map +1 -0
- package/dist/generated/ast.d.ts +970 -0
- package/dist/generated/ast.d.ts.map +1 -0
- package/dist/generated/ast.js +1537 -0
- package/dist/generated/ast.js.map +1 -0
- package/dist/generated/grammar.d.ts +7 -0
- package/dist/generated/grammar.d.ts.map +1 -0
- package/dist/generated/grammar.js +6062 -0
- package/dist/generated/grammar.js.map +1 -0
- package/dist/generated/module.d.ts +14 -0
- package/dist/generated/module.d.ts.map +1 -0
- package/dist/generated/module.js +21 -0
- package/dist/generated/module.js.map +1 -0
- package/dist/graph-types.d.ts +32 -0
- package/dist/graph-types.d.ts.map +1 -0
- package/dist/graph-types.js +2 -0
- package/dist/graph-types.js.map +1 -0
- package/dist/graph.d.ts +4 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +931 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/main-browser.d.ts +2 -0
- package/dist/main-browser.d.ts.map +1 -0
- package/dist/main-browser.js +16 -0
- package/dist/main-browser.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +15 -0
- package/dist/main.js.map +1 -0
- package/package.json +55 -0
- package/specification/00-overview.md +99 -0
- package/specification/01-domain.md +80 -0
- package/specification/02-service.md +50 -0
- package/specification/03-event.md +28 -0
- package/specification/04-command.md +25 -0
- package/specification/05-query.md +25 -0
- package/specification/06-channel.md +131 -0
- package/specification/08-container.md +54 -0
- package/specification/09-data-product.md +39 -0
- package/specification/10-flow.md +163 -0
- package/specification/11-diagram.md +3 -0
- package/specification/12-user.md +54 -0
- package/specification/13-team.md +62 -0
- package/specification/14-relationships.md +89 -0
- package/specification/15-versioning.md +41 -0
- package/specification/16-annotations.md +100 -0
- package/specification/17-examples.md +373 -0
- package/specification/18-grammar.md +242 -0
- package/specification/19-visualizer.md +197 -0
- package/specification/build-spec.sh +49 -0
- package/syntaxes/ec.tmLanguage.json +61 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# Full Grammar (EBNF)
|
|
2
|
+
|
|
3
|
+
```ebnf
|
|
4
|
+
(* Top-level *)
|
|
5
|
+
program = { top_level_decl } ;
|
|
6
|
+
top_level_decl = domain_decl | service_decl | event_decl | command_decl
|
|
7
|
+
| query_decl | channel_decl | container_decl
|
|
8
|
+
| data_product_decl | flow_decl
|
|
9
|
+
| user_decl | team_decl | visualizer_decl
|
|
10
|
+
| actor_decl | external_system_decl ;
|
|
11
|
+
|
|
12
|
+
(* Identifiers and literals *)
|
|
13
|
+
identifier = letter { letter | digit | "-" | "." | "_" } ;
|
|
14
|
+
int = digit { digit } ;
|
|
15
|
+
version_lit = int "." int "." int [ "-" prerelease ] ;
|
|
16
|
+
string_lit = '"' { any_char } '"' ;
|
|
17
|
+
bool_lit = "true" | "false" ;
|
|
18
|
+
number_lit = digit { digit } ;
|
|
19
|
+
|
|
20
|
+
(* Common properties *)
|
|
21
|
+
common_props = { version_prop | name_prop | summary_prop | owner_prop
|
|
22
|
+
| deprecated_prop | draft_prop | annotation } ;
|
|
23
|
+
message_props = { version_prop | name_prop | summary_prop | owner_prop
|
|
24
|
+
| schema_prop | deprecated_prop | draft_prop | annotation } ;
|
|
25
|
+
version_prop = "version" version_lit ;
|
|
26
|
+
name_prop = "name" string_lit ;
|
|
27
|
+
summary_prop = "summary" string_lit ;
|
|
28
|
+
owner_prop = "owner" identifier ;
|
|
29
|
+
schema_prop = "schema" string_lit ;
|
|
30
|
+
deprecated_prop = "deprecated" bool_lit ;
|
|
31
|
+
draft_prop = "draft" bool_lit ;
|
|
32
|
+
|
|
33
|
+
(* Annotations *)
|
|
34
|
+
annotation = "@" ann_name [ "(" ann_args ")" ] [ ann_block ] ;
|
|
35
|
+
ann_name = identifier ;
|
|
36
|
+
ann_args = ann_arg { "," ann_arg } ;
|
|
37
|
+
ann_arg = [ identifier ":" ] ( string_lit | bool_lit | number_lit | identifier ) ;
|
|
38
|
+
ann_block = "{" { ann_body_item } "}" ;
|
|
39
|
+
|
|
40
|
+
(* Resource references *)
|
|
41
|
+
resource_ref = identifier [ "@" version_lit ] ;
|
|
42
|
+
message_type = "event" | "command" | "query" ;
|
|
43
|
+
|
|
44
|
+
(* Domain *)
|
|
45
|
+
domain_decl = "domain" identifier "{" common_props
|
|
46
|
+
{ domain_body_item } "}" ;
|
|
47
|
+
domain_body_item = service_decl | subdomain_decl
|
|
48
|
+
| data_product_ref_stmt | flow_ref_stmt
|
|
49
|
+
| sends_stmt | receives_stmt
|
|
50
|
+
| annotation ;
|
|
51
|
+
subdomain_decl = "subdomain" identifier "{" common_props
|
|
52
|
+
{ domain_body_item } "}" ;
|
|
53
|
+
|
|
54
|
+
(* Service *)
|
|
55
|
+
service_decl = "service" identifier "{" common_props
|
|
56
|
+
{ service_body_item } "}" ;
|
|
57
|
+
service_body_item= sends_stmt | receives_stmt
|
|
58
|
+
| writes_to_stmt | reads_from_stmt
|
|
59
|
+
| flow_ref_stmt
|
|
60
|
+
| annotation ;
|
|
61
|
+
|
|
62
|
+
(* Sends / Receives *)
|
|
63
|
+
sends_stmt = "sends" message_type resource_ref [ channel_clause ]
|
|
64
|
+
| "sends" message_type identifier inline_block ;
|
|
65
|
+
receives_stmt = "receives" message_type resource_ref [ channel_clause ]
|
|
66
|
+
| "receives" message_type identifier inline_block ;
|
|
67
|
+
|
|
68
|
+
channel_clause = to_clause | from_clause ;
|
|
69
|
+
to_clause = "to" channel_ref_list ;
|
|
70
|
+
from_clause = "from" channel_ref_list ;
|
|
71
|
+
channel_ref_list = channel_ref { "," channel_ref } ;
|
|
72
|
+
channel_ref = identifier [ "@" version_lit ] ;
|
|
73
|
+
|
|
74
|
+
(* Data relationships *)
|
|
75
|
+
writes_to_stmt = "writes-to" "container" resource_ref ;
|
|
76
|
+
reads_from_stmt = "reads-from" "container" resource_ref ;
|
|
77
|
+
flow_ref_stmt = "flow" resource_ref ;
|
|
78
|
+
data_product_ref_stmt = "data-product" resource_ref ;
|
|
79
|
+
|
|
80
|
+
(* Inline message block *)
|
|
81
|
+
inline_block = "{" message_props "}" ;
|
|
82
|
+
|
|
83
|
+
(* Messages: Event, Command, Query *)
|
|
84
|
+
event_decl = "event" identifier "{" message_props "}" ;
|
|
85
|
+
command_decl = "command" identifier "{" message_props "}" ;
|
|
86
|
+
query_decl = "query" identifier "{" message_props "}" ;
|
|
87
|
+
|
|
88
|
+
(* Channel *)
|
|
89
|
+
channel_decl = "channel" identifier "{" common_props
|
|
90
|
+
{ channel_body_item } "}" ;
|
|
91
|
+
channel_body_item= address_prop | protocol_prop | parameter_decl
|
|
92
|
+
| route_stmt | annotation ;
|
|
93
|
+
address_prop = "address" string_lit ;
|
|
94
|
+
protocol_prop = "protocol" string_lit ;
|
|
95
|
+
parameter_decl = "parameter" identifier "{" { param_prop } "}" ;
|
|
96
|
+
param_prop = "description" string_lit
|
|
97
|
+
| "default" string_lit
|
|
98
|
+
| "enum" "[" string_lit { "," string_lit } "]"
|
|
99
|
+
| "examples" "[" string_lit { "," string_lit } "]" ;
|
|
100
|
+
route_stmt = "route" resource_ref ;
|
|
101
|
+
|
|
102
|
+
(* Container *)
|
|
103
|
+
container_decl = "container" identifier "{" common_props
|
|
104
|
+
{ container_body_item } "}" ;
|
|
105
|
+
container_body_item = container_type_prop | technology_prop
|
|
106
|
+
| authoritative_prop | access_mode_prop
|
|
107
|
+
| classification_prop | residency_prop
|
|
108
|
+
| retention_prop
|
|
109
|
+
| service_ref_stmt | annotation ;
|
|
110
|
+
container_type_prop = "container-type" container_type_enum ;
|
|
111
|
+
container_type_enum = "database" | "cache" | "objectStore" | "searchIndex"
|
|
112
|
+
| "dataWarehouse" | "dataLake" | "externalSaaS" | "other" ;
|
|
113
|
+
technology_prop = "technology" string_lit ;
|
|
114
|
+
authoritative_prop = "authoritative" bool_lit ;
|
|
115
|
+
access_mode_prop = "access-mode" ( "read" | "write" | "readWrite" | "appendOnly" ) ;
|
|
116
|
+
classification_prop = "classification" ( "public" | "internal" | "confidential" | "regulated" ) ;
|
|
117
|
+
residency_prop = "residency" string_lit ;
|
|
118
|
+
retention_prop = "retention" string_lit ;
|
|
119
|
+
|
|
120
|
+
(* Data Product *)
|
|
121
|
+
data_product_decl = "data-product" identifier "{" common_props
|
|
122
|
+
{ dp_body_item } "}" ;
|
|
123
|
+
dp_body_item = input_stmt | output_stmt | annotation ;
|
|
124
|
+
input_stmt = "input" message_type resource_ref ;
|
|
125
|
+
output_stmt = "output" message_type resource_ref [ "{" contract_block "}" ] ;
|
|
126
|
+
contract_block = "contract" "{" "path" string_lit "name" string_lit
|
|
127
|
+
[ "type" string_lit ] "}" ;
|
|
128
|
+
|
|
129
|
+
(* Flow *)
|
|
130
|
+
flow_decl = "flow" identifier "{" common_props
|
|
131
|
+
{ flow_entry_chain | flow_when_block } "}" ;
|
|
132
|
+
flow_entry_chain = flow_ref { "," flow_ref } ( "->" flow_ref )+ ;
|
|
133
|
+
flow_when_block = "when" flow_ref { "and" flow_ref } flow_action+ ;
|
|
134
|
+
flow_action = flow_ref { flow_output } ;
|
|
135
|
+
flow_output = "->" [ string_lit ":" ] flow_ref ;
|
|
136
|
+
flow_ref = identifier [ string_lit ] ;
|
|
137
|
+
|
|
138
|
+
(* Actor *)
|
|
139
|
+
actor_decl = "actor" identifier [ "{" { actor_body_item } "}" ] ;
|
|
140
|
+
actor_body_item = name_prop | summary_prop | annotation ;
|
|
141
|
+
|
|
142
|
+
(* External System *)
|
|
143
|
+
external_system_decl = "external-system" identifier [ "{" { ext_sys_body_item } "}" ] ;
|
|
144
|
+
ext_sys_body_item = name_prop | summary_prop | annotation ;
|
|
145
|
+
|
|
146
|
+
(* Visualizer *)
|
|
147
|
+
visualizer_decl = "visualizer" identifier "{" { visualizer_body } "}" ;
|
|
148
|
+
visualizer_body = name_prop | summary_prop | annotation
|
|
149
|
+
| legend_prop | search_prop | toolbar_prop
|
|
150
|
+
| focus_mode_prop | animated_prop | style_prop
|
|
151
|
+
| domain_decl | service_decl | event_decl | command_decl
|
|
152
|
+
| query_decl | channel_decl | container_decl
|
|
153
|
+
| data_product_decl | flow_decl
|
|
154
|
+
| actor_decl | external_system_decl
|
|
155
|
+
| service_ref_stmt | domain_ref_stmt
|
|
156
|
+
| event_ref_stmt | command_ref_stmt | query_ref_stmt
|
|
157
|
+
| channel_ref_stmt | data_product_ref_stmt | flow_ref_stmt
|
|
158
|
+
| container_ref_stmt ;
|
|
159
|
+
legend_prop = "legend" bool_lit ;
|
|
160
|
+
search_prop = "search" bool_lit ;
|
|
161
|
+
toolbar_prop = "toolbar" bool_lit ;
|
|
162
|
+
focus_mode_prop = "focus-mode" bool_lit ;
|
|
163
|
+
animated_prop = "animated" bool_lit ;
|
|
164
|
+
style_prop = "style" ( "default" | "post-it" ) ;
|
|
165
|
+
|
|
166
|
+
(* User *)
|
|
167
|
+
user_decl = "user" identifier "{" user_props "}" ;
|
|
168
|
+
user_props = "name" string_lit
|
|
169
|
+
| "avatar" string_lit
|
|
170
|
+
| "role" string_lit
|
|
171
|
+
| "email" string_lit
|
|
172
|
+
| "slack" string_lit
|
|
173
|
+
| "ms-teams" string_lit
|
|
174
|
+
| owns_stmt
|
|
175
|
+
| "team" identifier ;
|
|
176
|
+
owns_stmt = "owns" resource_type_kw identifier ;
|
|
177
|
+
resource_type_kw = "domain" | "service" | "event" | "command" | "query" ;
|
|
178
|
+
|
|
179
|
+
(* Team *)
|
|
180
|
+
team_decl = "team" identifier "{" team_props "}" ;
|
|
181
|
+
team_props = "name" string_lit
|
|
182
|
+
| "summary" string_lit
|
|
183
|
+
| "email" string_lit
|
|
184
|
+
| "slack" string_lit
|
|
185
|
+
| "ms-teams" string_lit
|
|
186
|
+
| "member" identifier
|
|
187
|
+
| owns_stmt ;
|
|
188
|
+
|
|
189
|
+
(* Resource references *)
|
|
190
|
+
service_ref_stmt = "service" resource_ref ;
|
|
191
|
+
domain_ref_stmt = "domain" resource_ref ;
|
|
192
|
+
event_ref_stmt = "event" resource_ref ;
|
|
193
|
+
command_ref_stmt = "command" resource_ref ;
|
|
194
|
+
query_ref_stmt = "query" resource_ref ;
|
|
195
|
+
channel_ref_stmt = "channel" resource_ref ;
|
|
196
|
+
container_ref_stmt = "container" resource_ref ;
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Reserved Keywords
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
domain service event command query
|
|
203
|
+
channel container data-product flow
|
|
204
|
+
user team sends receives
|
|
205
|
+
writes-to reads-from owns to from
|
|
206
|
+
version name summary owner schema
|
|
207
|
+
deprecated draft true false
|
|
208
|
+
type actor external-system
|
|
209
|
+
parameter route member
|
|
210
|
+
input output contract
|
|
211
|
+
subdomain visualizer legend search toolbar focus-mode
|
|
212
|
+
animated style when and
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## File Extension
|
|
216
|
+
|
|
217
|
+
EventCatalog DSL files use the `.ec` extension:
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
catalog.ec
|
|
221
|
+
orders-domain.ec
|
|
222
|
+
payment-service.ec
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Multiple `.ec` files can be used and are merged during compilation. Resources can reference each other across files.
|
|
226
|
+
|
|
227
|
+
## Compilation
|
|
228
|
+
|
|
229
|
+
The DSL compiles to EventCatalog's directory structure:
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
catalog.ec --> domains/Orders/index.mdx
|
|
233
|
+
domains/Orders/services/OrderService/index.mdx
|
|
234
|
+
events/OrderCreated/index.mdx
|
|
235
|
+
commands/ProcessPayment/index.mdx
|
|
236
|
+
channels/orders-topic/index.mdx
|
|
237
|
+
users/dboyne.mdx
|
|
238
|
+
teams/orders-team.mdx
|
|
239
|
+
...
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Each resource becomes a markdown file with YAML frontmatter matching EventCatalog's content collection schemas.
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# Visualizer
|
|
2
|
+
|
|
3
|
+
The `visualizer` block separates **resource definition** from **visualization**. Resources defined outside a visualizer block exist in the catalog but are not rendered visually. Only resources placed inside a `visualizer` block (or referenced from one) appear in the visual graph.
|
|
4
|
+
|
|
5
|
+
This separation lets teams maintain a single source of truth for all resources while controlling exactly what gets visualized and how.
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
visualizer <id> {
|
|
9
|
+
name "<display name>"
|
|
10
|
+
summary "<text>"
|
|
11
|
+
|
|
12
|
+
// Display options
|
|
13
|
+
legend true|false
|
|
14
|
+
search true|false
|
|
15
|
+
toolbar true|false
|
|
16
|
+
focus-mode true|false
|
|
17
|
+
animated true|false
|
|
18
|
+
style default|post-it
|
|
19
|
+
|
|
20
|
+
// Resources to visualize (inline or reference)
|
|
21
|
+
<resource definitions or references>
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Why Visualizer Exists
|
|
26
|
+
|
|
27
|
+
A `.ec` file can define dozens of resources — domains, services, events, channels, and more. Without a visualizer block, there is no way to control which resources appear in the visual graph or how they are presented.
|
|
28
|
+
|
|
29
|
+
The visualizer block makes visualization **explicit**:
|
|
30
|
+
|
|
31
|
+
- Define resources anywhere (top-level, imported files)
|
|
32
|
+
- Choose what to visualize by placing resources inside a `visualizer` block
|
|
33
|
+
- Configure display options per visualization
|
|
34
|
+
|
|
35
|
+
## Multiple Visualizer Blocks
|
|
36
|
+
|
|
37
|
+
A file can contain multiple `visualizer` blocks, each presenting a different view over the same resources. Tools (e.g. the playground) allow switching between them.
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
// Shared resources
|
|
41
|
+
event OrderCreated {
|
|
42
|
+
version 1.0.0
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
event PaymentProcessed {
|
|
46
|
+
version 1.0.0
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
service OrderService {
|
|
50
|
+
version 1.0.0
|
|
51
|
+
sends event OrderCreated
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
service PaymentService {
|
|
55
|
+
version 1.0.0
|
|
56
|
+
receives event OrderCreated
|
|
57
|
+
sends event PaymentProcessed
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// View 1: Order flow only
|
|
61
|
+
visualizer orders {
|
|
62
|
+
name "Order Flow"
|
|
63
|
+
|
|
64
|
+
service OrderService
|
|
65
|
+
event OrderCreated
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// View 2: Full payment pipeline
|
|
69
|
+
visualizer payments {
|
|
70
|
+
name "Payment Pipeline"
|
|
71
|
+
|
|
72
|
+
service OrderService
|
|
73
|
+
service PaymentService
|
|
74
|
+
event OrderCreated
|
|
75
|
+
event PaymentProcessed
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Resources Without a Visualizer
|
|
80
|
+
|
|
81
|
+
Resources defined outside any `visualizer` block are valid. They can be:
|
|
82
|
+
|
|
83
|
+
- Imported by other `.ec` files
|
|
84
|
+
- Referenced from within a `visualizer` block
|
|
85
|
+
- Used for compilation to EventCatalog's markdown format
|
|
86
|
+
|
|
87
|
+
If a file contains no `visualizer` block, no visual graph is produced.
|
|
88
|
+
|
|
89
|
+
## Inline vs. Reference
|
|
90
|
+
|
|
91
|
+
Resources inside a visualizer can be defined inline (full definition) or referenced by name:
|
|
92
|
+
|
|
93
|
+
**Inline** — defines and visualizes the resource:
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
visualizer main {
|
|
97
|
+
name "My Architecture"
|
|
98
|
+
|
|
99
|
+
service OrderService {
|
|
100
|
+
version 1.0.0
|
|
101
|
+
sends event OrderCreated
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
**Reference** — visualizes a resource defined elsewhere:
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
service OrderService {
|
|
110
|
+
version 1.0.0
|
|
111
|
+
sends event OrderCreated
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
visualizer main {
|
|
115
|
+
name "My Architecture"
|
|
116
|
+
service OrderService
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
When a resource is referenced, the visualizer enriches the node with metadata from the matching top-level definition.
|
|
121
|
+
|
|
122
|
+
## Display Options
|
|
123
|
+
|
|
124
|
+
| Property | Type | Default | Description |
|
|
125
|
+
| ------------ | ------- | --------- | -------------------------------------- |
|
|
126
|
+
| `name` | string | — | Display title for the visualization |
|
|
127
|
+
| `summary` | string | — | Description of the visualization |
|
|
128
|
+
| `legend` | boolean | `true` | Show the node type legend |
|
|
129
|
+
| `search` | boolean | `true` | Show the search bar |
|
|
130
|
+
| `toolbar` | boolean | `true` | Show the toolbar (export, zoom, etc.) |
|
|
131
|
+
| `focus-mode` | boolean | `true` | Enable focus mode for individual nodes |
|
|
132
|
+
| `animated` | boolean | `true` | Animate edges |
|
|
133
|
+
| `style` | enum | `default` | Visual style: `default` or `post-it` |
|
|
134
|
+
|
|
135
|
+
## Example
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
// Teams
|
|
139
|
+
team orders-team {
|
|
140
|
+
name "Orders Team"
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Resources
|
|
144
|
+
channel orders-topic {
|
|
145
|
+
version 1.0.0
|
|
146
|
+
protocol "Kafka"
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Visualizer with display options
|
|
150
|
+
visualizer order-architecture {
|
|
151
|
+
name "Order Architecture"
|
|
152
|
+
summary "Core order processing services"
|
|
153
|
+
legend true
|
|
154
|
+
search true
|
|
155
|
+
animated false
|
|
156
|
+
style post-it
|
|
157
|
+
|
|
158
|
+
domain Orders {
|
|
159
|
+
version 1.0.0
|
|
160
|
+
owner orders-team
|
|
161
|
+
|
|
162
|
+
service OrderService {
|
|
163
|
+
version 1.0.0
|
|
164
|
+
sends event OrderCreated to orders-topic
|
|
165
|
+
receives command CreateOrder
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
service NotificationService {
|
|
169
|
+
version 1.0.0
|
|
170
|
+
receives event OrderCreated
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## EBNF
|
|
177
|
+
|
|
178
|
+
```ebnf
|
|
179
|
+
visualizer_decl = "visualizer" identifier "{" { visualizer_body } "}" ;
|
|
180
|
+
visualizer_body = name_prop | summary_prop | annotation
|
|
181
|
+
| legend_prop | search_prop | toolbar_prop
|
|
182
|
+
| focus_mode_prop | animated_prop | style_prop
|
|
183
|
+
| domain_decl | service_decl | event_decl | command_decl
|
|
184
|
+
| query_decl | channel_decl | container_decl
|
|
185
|
+
| data_product_decl | flow_decl
|
|
186
|
+
| actor_decl | external_system_decl
|
|
187
|
+
| service_ref_stmt | domain_ref_stmt
|
|
188
|
+
| event_ref_stmt | command_ref_stmt | query_ref_stmt
|
|
189
|
+
| channel_ref_stmt | data_product_ref_stmt | flow_ref_stmt
|
|
190
|
+
| container_ref_stmt ;
|
|
191
|
+
legend_prop = "legend" bool_lit ;
|
|
192
|
+
search_prop = "search" bool_lit ;
|
|
193
|
+
toolbar_prop = "toolbar" bool_lit ;
|
|
194
|
+
focus_mode_prop = "focus-mode" bool_lit ;
|
|
195
|
+
animated_prop = "animated" bool_lit ;
|
|
196
|
+
style_prop = "style" ( "default" | "post-it" ) ;
|
|
197
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# Assembles the individual specification files into a single SPEC.md
|
|
4
|
+
# Usage: ./specification/build-spec.sh
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
set -euo pipefail
|
|
8
|
+
|
|
9
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
10
|
+
OUTPUT="$SCRIPT_DIR/../SPEC.md"
|
|
11
|
+
|
|
12
|
+
cat > "$OUTPUT" << 'HEADER'
|
|
13
|
+
# EventCatalog DSL — Language Specification
|
|
14
|
+
|
|
15
|
+
> Version: 1.0.0-draft
|
|
16
|
+
> Status: Draft
|
|
17
|
+
> Date: 2026-02-08
|
|
18
|
+
|
|
19
|
+
## Table of Contents
|
|
20
|
+
|
|
21
|
+
1. [Overview](#overview)
|
|
22
|
+
2. [Domain](#domain)
|
|
23
|
+
3. [Service](#service)
|
|
24
|
+
4. [Event](#event)
|
|
25
|
+
5. [Command](#command)
|
|
26
|
+
6. [Query](#query)
|
|
27
|
+
7. [Channel](#channel)
|
|
28
|
+
8. [Container](#container)
|
|
29
|
+
9. [Data Product](#data-product)
|
|
30
|
+
10. [Flow](#flow)
|
|
31
|
+
11. [User](#user)
|
|
32
|
+
12. [Team](#team)
|
|
33
|
+
13. [Relationships & Pointers](#relationships--pointers)
|
|
34
|
+
14. [Versioning](#versioning)
|
|
35
|
+
15. [Metadata & Annotations](#metadata--annotations)
|
|
36
|
+
16. [Complete Examples](#complete-examples)
|
|
37
|
+
17. [Full Grammar (EBNF)](#full-grammar-ebnf)
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
HEADER
|
|
42
|
+
|
|
43
|
+
# Append each spec file in order, separated by ---
|
|
44
|
+
for file in "$SCRIPT_DIR"/[0-9][0-9]-*.md; do
|
|
45
|
+
cat "$file" >> "$OUTPUT"
|
|
46
|
+
printf '\n---\n\n' >> "$OUTPUT"
|
|
47
|
+
done
|
|
48
|
+
|
|
49
|
+
echo "Built $OUTPUT from $(ls "$SCRIPT_DIR"/[0-9][0-9]-*.md | wc -l | tr -d ' ') specification files."
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ec",
|
|
3
|
+
"scopeName": "source.ec",
|
|
4
|
+
"fileTypes": [
|
|
5
|
+
".ec"
|
|
6
|
+
],
|
|
7
|
+
"patterns": [
|
|
8
|
+
{
|
|
9
|
+
"include": "#comments"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"name": "keyword.control.ec",
|
|
13
|
+
"match": "\\b(access-mode|actor|address|and|animated|appendOnly|authoritative|avatar|cache|channel|classification|color|command|confidential|container|container-type|contract|data-product|dataLake|dataWarehouse|database|default|delivery|deprecated|description|diagram|domain|draft|email|enum|event|examples|external-system|externalSaaS|false|flow|focus-mode|from|hidden|icon|import|input|internal|label|legend|member|message|ms-teams|name|objectStore|other|output|owner|owns|parameter|path|post-it|protocol|public|pull|push|push-pull|query|read|readWrite|reads-from|receives|regulated|residency|retention|role|route|schema|search|searchIndex|sends|service|slack|style|subdomain|summary|team|technology|title|to|toolbar|true|type|url|user|version|visible|visualizer|when|write|writes-to)\\b"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"name": "string.quoted.double.ec",
|
|
17
|
+
"begin": "\"",
|
|
18
|
+
"end": "\"",
|
|
19
|
+
"patterns": [
|
|
20
|
+
{
|
|
21
|
+
"include": "#string-character-escape"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"repository": {
|
|
27
|
+
"comments": {
|
|
28
|
+
"patterns": [
|
|
29
|
+
{
|
|
30
|
+
"begin": "//",
|
|
31
|
+
"beginCaptures": {
|
|
32
|
+
"1": {
|
|
33
|
+
"name": "punctuation.whitespace.comment.leading.ec"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"end": "(?=$)",
|
|
37
|
+
"name": "comment.line.ec"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "comment.block.ec",
|
|
41
|
+
"begin": "/\\*",
|
|
42
|
+
"beginCaptures": {
|
|
43
|
+
"0": {
|
|
44
|
+
"name": "punctuation.definition.comment.ec"
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"end": "\\*/",
|
|
48
|
+
"endCaptures": {
|
|
49
|
+
"0": {
|
|
50
|
+
"name": "punctuation.definition.comment.ec"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
"string-character-escape": {
|
|
57
|
+
"name": "constant.character.escape.ec",
|
|
58
|
+
"match": "\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|u\\{[0-9A-Fa-f]+\\}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|