@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,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
|
+
```
|