@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.
Files changed (88) hide show
  1. package/README.md +71 -0
  2. package/SPEC.md +1939 -0
  3. package/dist/ast-utils.d.ts +96 -0
  4. package/dist/ast-utils.d.ts.map +1 -0
  5. package/dist/ast-utils.js +241 -0
  6. package/dist/ast-utils.js.map +1 -0
  7. package/dist/compiler.d.ts +7 -0
  8. package/dist/compiler.d.ts.map +1 -0
  9. package/dist/compiler.js +654 -0
  10. package/dist/compiler.js.map +1 -0
  11. package/dist/ec-completion-provider.d.ts +15 -0
  12. package/dist/ec-completion-provider.d.ts.map +1 -0
  13. package/dist/ec-completion-provider.js +202 -0
  14. package/dist/ec-completion-provider.js.map +1 -0
  15. package/dist/ec-module.d.ts +18 -0
  16. package/dist/ec-module.d.ts.map +1 -0
  17. package/dist/ec-module.js +27 -0
  18. package/dist/ec-module.js.map +1 -0
  19. package/dist/ec-scope-provider.d.ts +2 -0
  20. package/dist/ec-scope-provider.d.ts.map +1 -0
  21. package/dist/ec-scope-provider.js +2 -0
  22. package/dist/ec-scope-provider.js.map +1 -0
  23. package/dist/ec-scope.d.ts +10 -0
  24. package/dist/ec-scope.d.ts.map +1 -0
  25. package/dist/ec-scope.js +18 -0
  26. package/dist/ec-scope.js.map +1 -0
  27. package/dist/ec-validator.d.ts +9 -0
  28. package/dist/ec-validator.d.ts.map +1 -0
  29. package/dist/ec-validator.js +238 -0
  30. package/dist/ec-validator.js.map +1 -0
  31. package/dist/formatter.d.ts +6 -0
  32. package/dist/formatter.d.ts.map +1 -0
  33. package/dist/formatter.js +88 -0
  34. package/dist/formatter.js.map +1 -0
  35. package/dist/generated/ast.d.ts +970 -0
  36. package/dist/generated/ast.d.ts.map +1 -0
  37. package/dist/generated/ast.js +1537 -0
  38. package/dist/generated/ast.js.map +1 -0
  39. package/dist/generated/grammar.d.ts +7 -0
  40. package/dist/generated/grammar.d.ts.map +1 -0
  41. package/dist/generated/grammar.js +6062 -0
  42. package/dist/generated/grammar.js.map +1 -0
  43. package/dist/generated/module.d.ts +14 -0
  44. package/dist/generated/module.d.ts.map +1 -0
  45. package/dist/generated/module.js +21 -0
  46. package/dist/generated/module.js.map +1 -0
  47. package/dist/graph-types.d.ts +32 -0
  48. package/dist/graph-types.d.ts.map +1 -0
  49. package/dist/graph-types.js +2 -0
  50. package/dist/graph-types.js.map +1 -0
  51. package/dist/graph.d.ts +4 -0
  52. package/dist/graph.d.ts.map +1 -0
  53. package/dist/graph.js +931 -0
  54. package/dist/graph.js.map +1 -0
  55. package/dist/index.d.ts +12 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +10 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/main-browser.d.ts +2 -0
  60. package/dist/main-browser.d.ts.map +1 -0
  61. package/dist/main-browser.js +16 -0
  62. package/dist/main-browser.js.map +1 -0
  63. package/dist/main.d.ts +2 -0
  64. package/dist/main.d.ts.map +1 -0
  65. package/dist/main.js +15 -0
  66. package/dist/main.js.map +1 -0
  67. package/package.json +55 -0
  68. package/specification/00-overview.md +99 -0
  69. package/specification/01-domain.md +80 -0
  70. package/specification/02-service.md +50 -0
  71. package/specification/03-event.md +28 -0
  72. package/specification/04-command.md +25 -0
  73. package/specification/05-query.md +25 -0
  74. package/specification/06-channel.md +131 -0
  75. package/specification/08-container.md +54 -0
  76. package/specification/09-data-product.md +39 -0
  77. package/specification/10-flow.md +163 -0
  78. package/specification/11-diagram.md +3 -0
  79. package/specification/12-user.md +54 -0
  80. package/specification/13-team.md +62 -0
  81. package/specification/14-relationships.md +89 -0
  82. package/specification/15-versioning.md +41 -0
  83. package/specification/16-annotations.md +100 -0
  84. package/specification/17-examples.md +373 -0
  85. package/specification/18-grammar.md +242 -0
  86. package/specification/19-visualizer.md +197 -0
  87. package/specification/build-spec.sh +49 -0
  88. package/syntaxes/ec.tmLanguage.json +61 -0
@@ -0,0 +1,100 @@
1
+ # Metadata & Annotations
2
+
3
+ Annotations use the `@` prefix and provide additional metadata. They can appear inside any resource block. All annotations are repeatable by default — multiple instances of the same annotation may appear on a single resource.
4
+
5
+ ## @badge
6
+
7
+ ```
8
+ @badge("Production", bg: "#22c55e", text: "#fff")
9
+ @badge("Beta", bg: "#f59e0b", text: "#000", icon: "flask")
10
+ ```
11
+
12
+ ## @repository
13
+
14
+ ```
15
+ @repository(url: "https://github.com/org/repo", language: "TypeScript")
16
+ ```
17
+
18
+ ## @editUrl
19
+
20
+ ```
21
+ @editUrl("https://github.com/org/repo/edit/main/docs/orders.md")
22
+ ```
23
+
24
+ ## @note
25
+
26
+ Adds free-form developer notes or reminders to any resource. Notes are repeatable — multiple `@note` annotations can appear on a single resource. Supported on services, events, commands, queries, channels, and inline message definitions.
27
+
28
+ ```
29
+ // Simple note
30
+ @note("Come back later — needs review")
31
+
32
+ // With optional parameters
33
+ @note("Align schema with PaymentService team", author: "dboyne", priority: "high")
34
+
35
+ // Multiple notes on a service
36
+ service OrderService {
37
+ version 1.0.0
38
+ @note("TODO: add retry logic")
39
+ @note("Waiting on team alignment", priority: "medium")
40
+ }
41
+
42
+ // Notes on events, commands, and queries
43
+ event OrderCreated {
44
+ version 1.0.0
45
+ @note("Schema v2 adds shippingAddress field", author: "alice")
46
+ }
47
+
48
+ command CreateOrder {
49
+ version 1.0.0
50
+ @note("Validate idempotency key", author: "bob", priority: "high")
51
+ }
52
+
53
+ // Notes on channels
54
+ channel OrderEvents {
55
+ version 1.0.0
56
+ address "orders.events"
57
+ protocol "kafka"
58
+ @note("Partition key is orderId", author: "infra-team")
59
+ }
60
+
61
+ // Notes on inline messages (inside sends/receives)
62
+ service PaymentService {
63
+ version 1.0.0
64
+ sends event PaymentProcessed to PaymentEvents {
65
+ version 1.0.0
66
+ @note("Includes refund reference when applicable", author: "dave")
67
+ }
68
+ }
69
+ ```
70
+
71
+ ## @detailsPanel
72
+
73
+ Controls visibility of detail panel sections:
74
+
75
+ ```
76
+ @detailsPanel {
77
+ owners visible
78
+ versions visible
79
+ changelog hidden
80
+ producers visible
81
+ consumers hidden
82
+ channels visible
83
+ repository hidden
84
+ specifications hidden
85
+ messages hidden
86
+ domains hidden
87
+ services hidden
88
+ containers hidden
89
+ }
90
+ ```
91
+
92
+ ## EBNF
93
+
94
+ ```ebnf
95
+ annotation = "@" ann_name [ "(" ann_args ")" ] [ ann_block ] ;
96
+ ann_name = identifier ;
97
+ ann_args = ann_arg { "," ann_arg } ;
98
+ ann_arg = [ identifier ":" ] ( string_lit | bool_lit | number_lit | identifier ) ;
99
+ ann_block = "{" { ann_body_item } "}" ;
100
+ ```
@@ -0,0 +1,373 @@
1
+ # Complete Examples
2
+
3
+ ## Example 1: E-Commerce Platform
4
+
5
+ ```
6
+ // ============================================================
7
+ // Teams & Users
8
+ // ============================================================
9
+
10
+ user dboyne {
11
+ name "David Boyne"
12
+ avatar "https://avatars.githubusercontent.com/u/3268013"
13
+ role "Principal Engineer"
14
+ email "david@company.com"
15
+ }
16
+
17
+ user jane-doe {
18
+ name "Jane Doe"
19
+ avatar "https://avatars.githubusercontent.com/u/12345"
20
+ role "Staff Engineer"
21
+ }
22
+
23
+ team orders-team {
24
+ name "Orders Team"
25
+ summary "Responsible for order lifecycle"
26
+ email "orders@company.com"
27
+ slack "https://company.slack.com/channels/orders"
28
+
29
+ member dboyne
30
+ member jane-doe
31
+ }
32
+
33
+ team payment-team {
34
+ name "Payment Team"
35
+ summary "Handles payment processing and fraud detection"
36
+ email "payments@company.com"
37
+
38
+ member jane-doe
39
+ }
40
+
41
+ // ============================================================
42
+ // Channels
43
+ // ============================================================
44
+
45
+ channel orders-topic {
46
+ version 1.0.0
47
+ name "Orders Topic"
48
+ summary "Kafka topic for all order-related events"
49
+ address "kafka://production/orders"
50
+ protocol "Kafka"
51
+
52
+ parameter environment {
53
+ description "Deployment environment"
54
+ default "production"
55
+ enum ["production", "staging", "development"]
56
+ }
57
+
58
+ }
59
+
60
+ channel payment-queue {
61
+ version 1.0.0
62
+ name "Payment Queue"
63
+ summary "SQS queue for payment commands"
64
+ address "sqs://us-east-1/payment-processing"
65
+ protocol "SQS"
66
+ }
67
+
68
+ // ============================================================
69
+ // Containers
70
+ // ============================================================
71
+
72
+ container orders-db {
73
+ version 1.0.0
74
+ name "Orders Database"
75
+ summary "Primary datastore for order data"
76
+ owner orders-team
77
+
78
+ container-type database
79
+ technology "postgres@15"
80
+ authoritative true
81
+ access-mode readWrite
82
+ classification confidential
83
+ residency "us-east-1"
84
+ retention "7y"
85
+
86
+ @repository(url: "https://github.com/company/orders-db")
87
+ }
88
+
89
+ container orders-cache {
90
+ version 1.0.0
91
+ name "Orders Cache"
92
+ summary "Redis cache for hot order lookups"
93
+
94
+ container-type cache
95
+ technology "redis@7"
96
+ access-mode readWrite
97
+ retention "24h"
98
+ }
99
+
100
+ // ============================================================
101
+ // Domain
102
+ // ============================================================
103
+
104
+ domain Orders {
105
+ version 1.0.0
106
+ name "Orders Domain"
107
+ summary "Everything related to order management"
108
+ owner orders-team
109
+
110
+ @badge("Core", bg: "#3b82f6", text: "#fff")
111
+ @repository(url: "https://github.com/company/orders-domain")
112
+
113
+ service OrderService {
114
+ version 1.0.0
115
+ name "Order Service"
116
+ summary "Manages the order lifecycle"
117
+ owner orders-team
118
+
119
+ @repository(url: "https://github.com/company/order-service", language: "TypeScript")
120
+ @badge("Production", bg: "#22c55e", text: "#fff")
121
+
122
+ sends event OrderCreated {
123
+ version 1.0.0
124
+ summary "Emitted when a new order is placed"
125
+ schema "./schemas/order-created.avro"
126
+ }
127
+
128
+ sends event OrderUpdated {
129
+ version 1.0.0
130
+ summary "Emitted when order details change"
131
+ }
132
+
133
+ sends command ProcessPayment to payment-queue {
134
+ version 1.0.0
135
+ summary "Triggers payment processing for an order"
136
+ }
137
+
138
+ receives event PaymentProcessed from payment-queue
139
+ receives event InventoryReserved
140
+
141
+ writes-to container orders-db
142
+ reads-from container orders-db
143
+ writes-to container orders-cache
144
+ reads-from container orders-cache
145
+
146
+ flow OrderFulfillment@1.0.0
147
+ }
148
+
149
+ service NotificationService {
150
+ version 1.0.0
151
+ name "Notification Service"
152
+ summary "Sends email and push notifications for order updates"
153
+
154
+ receives event OrderCreated
155
+ receives event OrderUpdated
156
+
157
+ sends command SendEmail {
158
+ version 1.0.0
159
+ summary "Dispatches an email notification"
160
+ }
161
+ }
162
+ }
163
+
164
+ domain Payment {
165
+ version 1.0.0
166
+ name "Payment Domain"
167
+ summary "Payment processing and fraud detection"
168
+ owner payment-team
169
+
170
+ service PaymentService {
171
+ version 1.0.0
172
+ name "Payment Service"
173
+ summary "Processes payments via Stripe"
174
+ owner payment-team
175
+
176
+ @repository(url: "https://github.com/company/payment-service", language: "Go")
177
+
178
+ receives command ProcessPayment from payment-queue
179
+
180
+ sends event PaymentProcessed {
181
+ version 1.0.0
182
+ summary "Payment completed successfully"
183
+ }
184
+
185
+ sends event PaymentFailed {
186
+ version 1.0.0
187
+ summary "Payment was declined or errored"
188
+ }
189
+ }
190
+ }
191
+
192
+ // ============================================================
193
+ // Standalone events (defined outside services)
194
+ // ============================================================
195
+
196
+ event InventoryReserved {
197
+ version 1.0.0
198
+ name "Inventory Reserved"
199
+ summary "Stock has been reserved for an order"
200
+ owner orders-team
201
+
202
+ @badge("Critical", bg: "#ef4444", text: "#fff")
203
+ }
204
+
205
+ // ============================================================
206
+ // Data Product
207
+ // ============================================================
208
+
209
+ data-product OrderAnalytics {
210
+ version 1.0.0
211
+ name "Order Analytics"
212
+ summary "Real-time and batch analytics for order metrics"
213
+ owner orders-team
214
+
215
+ input event OrderCreated@1.0.0
216
+ input event PaymentProcessed@1.0.0
217
+ input event InventoryReserved@1.0.0
218
+
219
+ output event OrderMetrics {
220
+ contract {
221
+ path "./contracts/order-metrics.json"
222
+ name "Order Metrics Schema"
223
+ type "json-schema"
224
+ }
225
+ }
226
+ }
227
+
228
+ // ============================================================
229
+ // Actors & External Systems
230
+ // ============================================================
231
+
232
+ actor Customer {
233
+ name "Customer"
234
+ summary "End user on the storefront"
235
+ }
236
+
237
+ external-system WarehouseWMS {
238
+ name "Warehouse WMS"
239
+ summary "Legacy warehouse management system via SOAP API"
240
+ }
241
+
242
+ // ============================================================
243
+ // Flow
244
+ // ============================================================
245
+
246
+ flow OrderFulfillment {
247
+ version 1.0.0
248
+ name "Order Fulfillment"
249
+ summary "End-to-end order processing from placement to delivery"
250
+ owner orders-team
251
+
252
+ Customer "End user on the storefront"
253
+ -> PlaceOrder
254
+ -> OrderService
255
+ -> OrderCreated
256
+
257
+ when OrderCreated
258
+ PaymentService "processes the payment"
259
+ -> "success": PaymentProcessed
260
+ -> "failure": PaymentFailed
261
+ InventoryService "reserves inventory"
262
+ -> InventoryReserved
263
+
264
+ when InventoryReserved
265
+ WarehouseWMS "Legacy WMS via SOAP API"
266
+ }
267
+
268
+ ```
269
+
270
+ ## Example 2: Minimal Service Definition
271
+
272
+ The DSL supports minimal definitions where defaults are sufficient:
273
+
274
+ ```
275
+ service OrderService {
276
+ version 1.0.0
277
+ sends event OrderCreated
278
+ receives command ProcessPayment
279
+ receives event PaymentProcessed
280
+ }
281
+ ```
282
+
283
+ ## Example 3: Multi-Channel Routing
284
+
285
+ ```
286
+ service EventRouter {
287
+ version 1.0.0
288
+ summary "Routes events across multiple channels"
289
+
290
+ // Send to multiple channels (comma-separated)
291
+ sends event OrderCreated to orders-topic, orders-archive-topic
292
+
293
+ // Receive from multiple channels
294
+ receives event PaymentProcessed from payment-events, payment-retry-queue
295
+ }
296
+ ```
297
+
298
+ ## Example 4: Channel Routing (IoT Pipeline)
299
+
300
+ ```
301
+ channel SensorIngestion {
302
+ version 1.0.0
303
+ address "sensors.raw"
304
+ protocol "Kafka"
305
+ summary "Raw sensor data ingestion"
306
+ route SensorFiltered
307
+ }
308
+
309
+ channel SensorFiltered {
310
+ version 1.0.0
311
+ address "sensors.filtered"
312
+ protocol "Kafka"
313
+ summary "Validated sensor data"
314
+ route DeviceCommands
315
+ }
316
+
317
+ channel DeviceCommands {
318
+ version 1.0.0
319
+ address "devices/+/commands"
320
+ protocol "MQTT"
321
+ summary "MQTT topic for device commands"
322
+ }
323
+
324
+ service SensorGateway {
325
+ version 1.0.0
326
+ summary "Ingests raw sensor readings"
327
+ sends event SensorReading to SensorIngestion
328
+ }
329
+
330
+ service FilterService {
331
+ version 1.0.0
332
+ summary "Validates and filters sensor data"
333
+ receives event SensorReading from SensorIngestion
334
+ sends event DeviceAlert to SensorFiltered
335
+ }
336
+
337
+ service DeviceBridge {
338
+ version 1.0.0
339
+ summary "Bridges Kafka to MQTT"
340
+ receives event DeviceAlert from SensorFiltered
341
+ sends command RecalibrateDevice to DeviceCommands
342
+ }
343
+ ```
344
+
345
+ ## Example 5: Subdomains
346
+
347
+ ```
348
+ domain Logistics {
349
+ version 1.0.0
350
+
351
+ subdomain Shipping {
352
+ version 1.0.0
353
+ summary "Package shipping and tracking"
354
+
355
+ service ShippingService {
356
+ version 1.0.0
357
+ receives event OrderCreated
358
+ sends event ShipmentCreated
359
+ }
360
+ }
361
+
362
+ subdomain Returns {
363
+ version 1.0.0
364
+ summary "Return merchandise authorization"
365
+
366
+ service ReturnsService {
367
+ version 1.0.0
368
+ receives command InitiateReturn
369
+ sends event ReturnApproved
370
+ }
371
+ }
372
+ }
373
+ ```