eventmodeler 0.5.0 → 0.6.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/dist/api/client-config.js +10 -0
- package/dist/api/generated/client/client.gen.js +235 -0
- package/dist/api/generated/client/index.js +6 -0
- package/dist/api/generated/client/types.gen.js +2 -0
- package/dist/api/generated/client/utils.gen.js +228 -0
- package/dist/api/generated/client.gen.js +4 -0
- package/dist/api/generated/core/auth.gen.js +14 -0
- package/dist/api/generated/core/bodySerializer.gen.js +57 -0
- package/dist/api/generated/core/params.gen.js +100 -0
- package/dist/api/generated/core/pathSerializer.gen.js +106 -0
- package/dist/api/generated/core/queryKeySerializer.gen.js +92 -0
- package/dist/api/generated/core/serverSentEvents.gen.js +133 -0
- package/dist/api/generated/core/types.gen.js +2 -0
- package/dist/api/generated/core/utils.gen.js +87 -0
- package/dist/api/generated/index.js +2 -0
- package/dist/api/generated/sdk.gen.js +4222 -0
- package/dist/api/generated/types.gen.js +2 -0
- package/dist/api/generated/zod.gen.js +7217 -0
- package/dist/commands/add.js +315 -0
- package/dist/commands/auth.js +14 -0
- package/dist/commands/create.js +192 -0
- package/dist/commands/design.js +108 -0
- package/dist/commands/guide.js +15 -0
- package/dist/commands/init.js +21 -0
- package/dist/commands/list-schemas.js +177 -0
- package/dist/commands/list.js +39 -0
- package/dist/commands/loop.js +101 -0
- package/dist/commands/map.js +40 -0
- package/dist/commands/mark.js +27 -0
- package/dist/commands/move.js +35 -0
- package/dist/commands/remove.js +170 -0
- package/dist/commands/rename.js +53 -0
- package/dist/commands/resize.js +30 -0
- package/dist/commands/search.js +14 -0
- package/dist/commands/set.js +199 -0
- package/dist/commands/show-schemas.js +259 -0
- package/dist/commands/show.js +56 -0
- package/dist/commands/summary.js +13 -0
- package/dist/commands/update.js +240 -0
- package/dist/index.js +46 -2379
- package/dist/lib/auth.js +1 -1
- package/dist/lib/config.js +0 -15
- package/dist/lib/excalidraw-schema.js +66 -0
- package/dist/lib/globals.js +8 -0
- package/dist/lib/model.js +11 -0
- package/dist/lib/project-config.js +20 -0
- package/dist/lib/resolve.js +59 -0
- package/dist/lib/scenario.js +15 -0
- package/dist/slices/add-scenario/index.js +2 -206
- package/dist/slices/guide/guides/codegen.js +1 -1
- package/dist/slices/guide/guides/connect-slices.js +38 -38
- package/dist/slices/guide/guides/create-slices.js +110 -140
- package/dist/slices/guide/guides/explore.js +37 -50
- package/dist/slices/guide/guides/information-flow.js +70 -84
- package/dist/slices/guide/guides/scenarios.js +82 -137
- package/dist/slices/guide/index.js +6 -6
- package/dist/slices/help/index.js +96 -0
- package/dist/slices/help/topics/build-codegen.js +109 -0
- package/dist/slices/help/topics/build-slice.js +147 -0
- package/dist/slices/help/topics/check-completeness.js +57 -0
- package/dist/slices/help/topics/connect-slices.js +99 -0
- package/dist/slices/help/topics/explore-model.js +112 -0
- package/dist/slices/help/topics/json-reference.js +188 -0
- package/dist/slices/help/topics/linked-copies.js +89 -0
- package/dist/slices/help/topics/manipulate-canvas.js +150 -0
- package/dist/slices/help/topics/write-scenarios.js +162 -0
- package/dist/slices/init/index.js +10 -4
- package/dist/slices/init/loop.js +60 -0
- package/dist/slices/login/index.js +2 -2
- package/dist/slices/logout/index.js +2 -2
- package/dist/slices/whoami/index.js +11 -36
- package/package.json +8 -3
- package/dist/api/index.d.ts +0 -285
- package/dist/api/index.js +0 -323
- package/dist/cloud/slices/index.d.ts +0 -276
- package/dist/cloud/slices/index.js +0 -406
- package/dist/eventmodeler.js +0 -5646
- package/dist/formatters.d.ts +0 -17
- package/dist/formatters.js +0 -482
- package/dist/index.d.ts +0 -2
- package/dist/lib/auth.d.ts +0 -24
- package/dist/lib/backend.d.ts +0 -43
- package/dist/lib/backend.js +0 -73
- package/dist/lib/chapter-utils.d.ts +0 -13
- package/dist/lib/chapter-utils.js +0 -71
- package/dist/lib/cloud-client.d.ts +0 -69
- package/dist/lib/cloud-client.js +0 -364
- package/dist/lib/config.d.ts +0 -30
- package/dist/lib/diff/merge-rules.d.ts +0 -45
- package/dist/lib/diff/merge-rules.js +0 -210
- package/dist/lib/diff/model-differ.d.ts +0 -8
- package/dist/lib/diff/model-differ.js +0 -568
- package/dist/lib/diff/three-way-merge.d.ts +0 -7
- package/dist/lib/diff/three-way-merge.js +0 -390
- package/dist/lib/diff/types.d.ts +0 -75
- package/dist/lib/diff/types.js +0 -1
- package/dist/lib/element-lookup.d.ts +0 -58
- package/dist/lib/element-lookup.js +0 -126
- package/dist/lib/file-loader.d.ts +0 -8
- package/dist/lib/file-loader.js +0 -108
- package/dist/lib/flow-utils.d.ts +0 -53
- package/dist/lib/flow-utils.js +0 -348
- package/dist/lib/format.d.ts +0 -10
- package/dist/lib/format.js +0 -23
- package/dist/lib/project-config.d.ts +0 -27
- package/dist/lib/slice-utils.d.ts +0 -59
- package/dist/lib/slice-utils.js +0 -140
- package/dist/local/slices/index.d.ts +0 -11
- package/dist/local/slices/index.js +0 -13
- package/dist/projection.d.ts +0 -3
- package/dist/projection.js +0 -828
- package/dist/slices/add-field/index.d.ts +0 -8
- package/dist/slices/add-field/index.js +0 -211
- package/dist/slices/add-scenario/index.d.ts +0 -27
- package/dist/slices/codegen-chapter-events/index.d.ts +0 -2
- package/dist/slices/codegen-chapter-events/index.js +0 -145
- package/dist/slices/codegen-slice/index.d.ts +0 -2
- package/dist/slices/codegen-slice/index.js +0 -448
- package/dist/slices/create-automation-slice/index.d.ts +0 -2
- package/dist/slices/create-automation-slice/index.js +0 -304
- package/dist/slices/create-flow/index.d.ts +0 -2
- package/dist/slices/create-flow/index.js +0 -183
- package/dist/slices/create-state-change-slice/index.d.ts +0 -2
- package/dist/slices/create-state-change-slice/index.js +0 -263
- package/dist/slices/create-state-view-slice/index.d.ts +0 -2
- package/dist/slices/create-state-view-slice/index.js +0 -128
- package/dist/slices/diff/index.d.ts +0 -11
- package/dist/slices/diff/index.js +0 -293
- package/dist/slices/export-eventmodel-to-json/index.d.ts +0 -2
- package/dist/slices/export-eventmodel-to-json/index.js +0 -355
- package/dist/slices/git/index.d.ts +0 -2
- package/dist/slices/git/index.js +0 -125
- package/dist/slices/guide/guides/codegen.d.ts +0 -5
- package/dist/slices/guide/guides/connect-slices.d.ts +0 -5
- package/dist/slices/guide/guides/create-slices.d.ts +0 -5
- package/dist/slices/guide/guides/explore.d.ts +0 -5
- package/dist/slices/guide/guides/information-flow.d.ts +0 -5
- package/dist/slices/guide/guides/scenarios.d.ts +0 -5
- package/dist/slices/guide/index.d.ts +0 -1
- package/dist/slices/import/index.d.ts +0 -8
- package/dist/slices/import/index.js +0 -63
- package/dist/slices/init/index.d.ts +0 -5
- package/dist/slices/list-chapters/index.d.ts +0 -3
- package/dist/slices/list-chapters/index.js +0 -21
- package/dist/slices/list-commands/index.d.ts +0 -3
- package/dist/slices/list-commands/index.js +0 -20
- package/dist/slices/list-events/index.d.ts +0 -3
- package/dist/slices/list-events/index.js +0 -98
- package/dist/slices/list-processors/index.d.ts +0 -3
- package/dist/slices/list-processors/index.js +0 -20
- package/dist/slices/list-readmodels/index.d.ts +0 -3
- package/dist/slices/list-readmodels/index.js +0 -21
- package/dist/slices/list-scenarios/index.d.ts +0 -3
- package/dist/slices/list-scenarios/index.js +0 -35
- package/dist/slices/list-screens/index.d.ts +0 -3
- package/dist/slices/list-screens/index.js +0 -47
- package/dist/slices/list-slices/index.d.ts +0 -3
- package/dist/slices/list-slices/index.js +0 -35
- package/dist/slices/login/index.d.ts +0 -1
- package/dist/slices/logout/index.d.ts +0 -1
- package/dist/slices/map-fields/index.d.ts +0 -2
- package/dist/slices/map-fields/index.js +0 -269
- package/dist/slices/mark-slice-status/index.d.ts +0 -2
- package/dist/slices/mark-slice-status/index.js +0 -31
- package/dist/slices/merge/index.d.ts +0 -19
- package/dist/slices/merge/index.js +0 -147
- package/dist/slices/open-app/index.d.ts +0 -1
- package/dist/slices/remove-field/index.d.ts +0 -8
- package/dist/slices/remove-field/index.js +0 -167
- package/dist/slices/remove-scenario/index.d.ts +0 -2
- package/dist/slices/remove-scenario/index.js +0 -77
- package/dist/slices/search/index.d.ts +0 -3
- package/dist/slices/search/index.js +0 -302
- package/dist/slices/show-actor/index.d.ts +0 -4
- package/dist/slices/show-actor/index.js +0 -115
- package/dist/slices/show-aggregate/index.d.ts +0 -3
- package/dist/slices/show-aggregate/index.js +0 -108
- package/dist/slices/show-aggregate-completeness/index.d.ts +0 -4
- package/dist/slices/show-aggregate-completeness/index.js +0 -181
- package/dist/slices/show-chapter/index.d.ts +0 -3
- package/dist/slices/show-chapter/index.js +0 -195
- package/dist/slices/show-command/index.d.ts +0 -3
- package/dist/slices/show-command/index.js +0 -133
- package/dist/slices/show-completeness/index.d.ts +0 -4
- package/dist/slices/show-completeness/index.js +0 -731
- package/dist/slices/show-event/index.d.ts +0 -3
- package/dist/slices/show-event/index.js +0 -118
- package/dist/slices/show-model-summary/index.d.ts +0 -3
- package/dist/slices/show-model-summary/index.js +0 -31
- package/dist/slices/show-processor/index.d.ts +0 -3
- package/dist/slices/show-processor/index.js +0 -111
- package/dist/slices/show-readmodel/index.d.ts +0 -3
- package/dist/slices/show-readmodel/index.js +0 -158
- package/dist/slices/show-scenario/index.d.ts +0 -3
- package/dist/slices/show-scenario/index.js +0 -196
- package/dist/slices/show-screen/index.d.ts +0 -3
- package/dist/slices/show-screen/index.js +0 -139
- package/dist/slices/show-slice/index.d.ts +0 -3
- package/dist/slices/show-slice/index.js +0 -696
- package/dist/slices/update-field/index.d.ts +0 -15
- package/dist/slices/update-field/index.js +0 -208
- package/dist/slices/whoami/index.d.ts +0 -2
- package/dist/types.d.ts +0 -195
- package/dist/types.js +0 -1
|
@@ -52,47 +52,47 @@ Field types: \`UUID\`, \`String\`, \`Int\`, \`Long\`, \`Double\`, \`Decimal\`, \
|
|
|
52
52
|
|
|
53
53
|
\`\`\`bash
|
|
54
54
|
# Add a simple field
|
|
55
|
-
eventmodeler add field
|
|
55
|
+
eventmodeler add field "OrderSummary" '{"name": "orderId", "type": "UUID"}'
|
|
56
56
|
|
|
57
57
|
# Add an optional field
|
|
58
|
-
eventmodeler add field
|
|
58
|
+
eventmodeler add field "OrderSummary" '{"name": "cancelledAt", "type": "DateTime", "isOptional": true}'
|
|
59
59
|
|
|
60
60
|
# Add a list field
|
|
61
|
-
eventmodeler add field
|
|
61
|
+
eventmodeler add field "OrderSummary" '{"name": "itemIds", "type": "UUID", "isList": true}'
|
|
62
62
|
|
|
63
63
|
# Add a complex/nested field
|
|
64
|
-
eventmodeler add field
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
64
|
+
eventmodeler add field "OrderSummary" '{"name": "shippingAddress", "type": "Custom", "subfields": [
|
|
65
|
+
{"name": "street", "type": "String"},
|
|
66
|
+
{"name": "city", "type": "String"},
|
|
67
|
+
{"name": "postalCode", "type": "String"}
|
|
68
|
+
]}'
|
|
69
69
|
\`\`\`
|
|
70
70
|
|
|
71
71
|
**CRITICAL: Custom fields MUST contain subfields.** A Custom field without subfields is invalid.
|
|
72
72
|
|
|
73
73
|
### Lists and Custom Types
|
|
74
74
|
|
|
75
|
-
**List of custom objects** - combine \`type
|
|
75
|
+
**List of custom objects** - combine \`"type": "Custom"\` with \`"isList": true\`:
|
|
76
76
|
\`\`\`bash
|
|
77
|
-
eventmodeler add field
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
77
|
+
eventmodeler add field "OrderSummary" '{"name": "lineItems", "type": "Custom", "isList": true, "subfields": [
|
|
78
|
+
{"name": "productId", "type": "UUID"},
|
|
79
|
+
{"name": "productName", "type": "String"},
|
|
80
|
+
{"name": "quantity", "type": "Int"},
|
|
81
|
+
{"name": "unitPrice", "type": "Decimal"}
|
|
82
|
+
]}'
|
|
83
83
|
\`\`\`
|
|
84
84
|
|
|
85
85
|
**Nested custom types** - subfields can themselves be Custom:
|
|
86
86
|
\`\`\`bash
|
|
87
|
-
eventmodeler add field
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
87
|
+
eventmodeler add field "OrderSummary" '{"name": "customer", "type": "Custom", "subfields": [
|
|
88
|
+
{"name": "customerId", "type": "UUID"},
|
|
89
|
+
{"name": "name", "type": "String"},
|
|
90
|
+
{"name": "billingAddress", "type": "Custom", "subfields": [
|
|
91
|
+
{"name": "street", "type": "String"},
|
|
92
|
+
{"name": "city", "type": "String"},
|
|
93
|
+
{"name": "country", "type": "String"}
|
|
94
|
+
]}
|
|
95
|
+
]}'
|
|
96
96
|
\`\`\`
|
|
97
97
|
|
|
98
98
|
---
|
|
@@ -104,44 +104,32 @@ Field mappings define how data flows from source elements to target elements. Wh
|
|
|
104
104
|
### Command Syntax
|
|
105
105
|
|
|
106
106
|
\`\`\`bash
|
|
107
|
-
eventmodeler map fields --
|
|
107
|
+
eventmodeler map fields --from "<source>" --to "<target>" '[{"from": "sourceField", "to": "targetField"}]'
|
|
108
108
|
\`\`\`
|
|
109
109
|
|
|
110
110
|
Or with multiple mappings:
|
|
111
111
|
|
|
112
112
|
\`\`\`bash
|
|
113
|
-
eventmodeler map fields --
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
'
|
|
113
|
+
eventmodeler map fields --from "OrderPlaced" --to "OrderSummary" '[
|
|
114
|
+
{"from": "orderId", "to": "orderId"},
|
|
115
|
+
{"from": "customerId", "to": "customerId"},
|
|
116
|
+
{"from": "totalAmount", "to": "total"}
|
|
117
|
+
]'
|
|
118
118
|
\`\`\`
|
|
119
119
|
|
|
120
|
-
###
|
|
121
|
-
|
|
122
|
-
The \`--flow\` argument accepts:
|
|
123
|
-
|
|
124
|
-
1. **Name arrow format** (most common): \`"SourceName→TargetName"\` or \`"SourceName->TargetName"\`
|
|
125
|
-
2. **Element ID prefix** (for duplicates): \`"id:abc12345→TargetName"\`
|
|
126
|
-
3. **Flow ID directly**: The UUID of the flow itself
|
|
120
|
+
### Source/Target Formats
|
|
127
121
|
|
|
128
|
-
|
|
122
|
+
The \`--from\` and \`--to\` arguments accept:
|
|
129
123
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
\`\`\`bash
|
|
133
|
-
eventmodeler map fields --flow "OrderPlaced→OrderSummary" --json '[
|
|
134
|
-
{"from": "orderId", "to": "orderId"},
|
|
135
|
-
{"from": "customerId", "to": "customerId"}
|
|
136
|
-
]'
|
|
137
|
-
\`\`\`
|
|
124
|
+
1. **Element name** (most common): \`"OrderPlaced"\`
|
|
125
|
+
2. **Element ID prefix** (for duplicates): \`"id:abc12345"\`
|
|
138
126
|
|
|
139
127
|
### Workflow
|
|
140
128
|
|
|
141
129
|
1. **Find flows needing mappings**: \`eventmodeler show model-completeness\`
|
|
142
130
|
2. **See source fields**: \`eventmodeler show event "OrderPlaced"\`
|
|
143
131
|
3. **See target fields**: \`eventmodeler show completeness "OrderSummary"\`
|
|
144
|
-
4. **Create mappings**: \`eventmodeler map fields --
|
|
132
|
+
4. **Create mappings**: \`eventmodeler map fields --from "OrderPlaced" --to "OrderSummary" '[...]'\`
|
|
145
133
|
5. **Verify**: \`eventmodeler show completeness "OrderSummary"\`
|
|
146
134
|
|
|
147
135
|
### Mapping Nested Fields
|
|
@@ -149,11 +137,11 @@ eventmodeler map fields --flow "OrderPlaced→OrderSummary" --json '[
|
|
|
149
137
|
For Custom (nested) field types, use dot notation:
|
|
150
138
|
|
|
151
139
|
\`\`\`bash
|
|
152
|
-
eventmodeler map fields --
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
'
|
|
140
|
+
eventmodeler map fields --from "OrderPlaced" --to "OrderSummary" '[
|
|
141
|
+
{"from": "shippingAddress.street", "to": "deliveryAddress.street"},
|
|
142
|
+
{"from": "shippingAddress.city", "to": "deliveryAddress.city"},
|
|
143
|
+
{"from": "shippingAddress.postalCode", "to": "deliveryAddress.zip"}
|
|
144
|
+
]'
|
|
157
145
|
\`\`\`
|
|
158
146
|
|
|
159
147
|
### Multiple Flows to Same Target
|
|
@@ -162,17 +150,17 @@ A read model often receives data from multiple events. Map each flow separately:
|
|
|
162
150
|
|
|
163
151
|
\`\`\`bash
|
|
164
152
|
# Initial data from OrderPlaced
|
|
165
|
-
eventmodeler map fields --
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
'
|
|
153
|
+
eventmodeler map fields --from "OrderPlaced" --to "OrderSummary" '[
|
|
154
|
+
{"from": "orderId", "to": "orderId"},
|
|
155
|
+
{"from": "customerId", "to": "customerId"},
|
|
156
|
+
{"from": "totalAmount", "to": "total"}
|
|
157
|
+
]'
|
|
170
158
|
|
|
171
159
|
# Status updates from OrderShipped
|
|
172
|
-
eventmodeler map fields --
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
'
|
|
160
|
+
eventmodeler map fields --from "OrderShipped" --to "OrderSummary" '[
|
|
161
|
+
{"from": "shippedAt", "to": "shippedDate"},
|
|
162
|
+
{"from": "trackingNumber", "to": "trackingNumber"}
|
|
163
|
+
]'
|
|
176
164
|
\`\`\`
|
|
177
165
|
|
|
178
166
|
### Updating Existing Mappings
|
|
@@ -185,10 +173,10 @@ Running \`map fields\` again **merges** with existing mappings:
|
|
|
185
173
|
|
|
186
174
|
| Pattern | Example |
|
|
187
175
|
|---------|---------|
|
|
188
|
-
| Identity |
|
|
189
|
-
| Rename |
|
|
190
|
-
| Nested to flat |
|
|
191
|
-
| Flat to nested |
|
|
176
|
+
| Identity | \`{"from": "orderId", "to": "orderId"}\` |
|
|
177
|
+
| Rename | \`{"from": "totalAmount", "to": "total"}\` |
|
|
178
|
+
| Nested to flat | \`{"from": "customer.id", "to": "customerId"}\` |
|
|
179
|
+
| Flat to nested | \`{"from": "street", "to": "address.street"}\` |
|
|
192
180
|
|
|
193
181
|
---
|
|
194
182
|
|
|
@@ -199,11 +187,9 @@ Use \`update field\` to modify field attributes without changing the field's nam
|
|
|
199
187
|
### Command Syntax
|
|
200
188
|
|
|
201
189
|
\`\`\`bash
|
|
202
|
-
eventmodeler update field
|
|
190
|
+
eventmodeler update field <element-name> --field "<field-name>" [options]
|
|
203
191
|
\`\`\`
|
|
204
192
|
|
|
205
|
-
Element types: \`--command\`, \`--event\`, \`--read-model\`, \`--screen\`, \`--processor\`
|
|
206
|
-
|
|
207
193
|
### Available Options
|
|
208
194
|
|
|
209
195
|
| Option | Values | Description |
|
|
@@ -217,19 +203,19 @@ Element types: \`--command\`, \`--event\`, \`--read-model\`, \`--screen\`, \`--p
|
|
|
217
203
|
|
|
218
204
|
\`\`\`bash
|
|
219
205
|
# Mark a field as optional
|
|
220
|
-
eventmodeler update field
|
|
206
|
+
eventmodeler update field "OrderPlaced" --field "promoCode" --optional true
|
|
221
207
|
|
|
222
208
|
# Mark a field as system-generated
|
|
223
|
-
eventmodeler update field
|
|
209
|
+
eventmodeler update field "OrderPlaced" --field "orderId" --generated true
|
|
224
210
|
|
|
225
211
|
# Mark screen fields as user input
|
|
226
|
-
eventmodeler update field
|
|
212
|
+
eventmodeler update field "Checkout" --field "email" --user-input true
|
|
227
213
|
|
|
228
214
|
# Change a field's type
|
|
229
|
-
eventmodeler update field
|
|
215
|
+
eventmodeler update field "OrderSummary" --field "total" --type Decimal
|
|
230
216
|
|
|
231
217
|
# Combine multiple updates
|
|
232
|
-
eventmodeler update field
|
|
218
|
+
eventmodeler update field "UserRegistered" --field "createdAt" --generated true --optional false
|
|
233
219
|
\`\`\`
|
|
234
220
|
|
|
235
221
|
### Updating Nested Fields
|
|
@@ -237,7 +223,7 @@ eventmodeler update field --event "UserRegistered" --field "createdAt" --generat
|
|
|
237
223
|
Use dot notation for fields inside Custom types:
|
|
238
224
|
|
|
239
225
|
\`\`\`bash
|
|
240
|
-
eventmodeler update field
|
|
226
|
+
eventmodeler update field "OrderPlaced" --field "shippingAddress.postalCode" --optional true
|
|
241
227
|
\`\`\`
|
|
242
228
|
|
|
243
229
|
### Field Property Meanings
|
|
@@ -254,13 +240,13 @@ eventmodeler update field --event "OrderPlaced" --field "shippingAddress.postalC
|
|
|
254
240
|
|
|
255
241
|
\`\`\`bash
|
|
256
242
|
# Remove a field from an event
|
|
257
|
-
eventmodeler remove field
|
|
243
|
+
eventmodeler remove field "OrderPlaced" --field "legacyId"
|
|
258
244
|
|
|
259
245
|
# Remove a field from a read model
|
|
260
|
-
eventmodeler remove field
|
|
246
|
+
eventmodeler remove field "OrderSummary" --field "deprecatedStatus"
|
|
261
247
|
|
|
262
248
|
# Remove a nested field using dot notation
|
|
263
|
-
eventmodeler remove field
|
|
249
|
+
eventmodeler remove field "OrderPlaced" --field "metadata.debugInfo"
|
|
264
250
|
\`\`\`
|
|
265
251
|
|
|
266
252
|
**Caution**: Removing a field may break existing field mappings. Check completeness first:
|
|
@@ -294,16 +280,16 @@ eventmodeler show aggregate-completeness "<aggregate-name>"
|
|
|
294
280
|
## Common Mistakes
|
|
295
281
|
|
|
296
282
|
- **Creating empty Custom fields**: Custom fields MUST have subfields.
|
|
297
|
-
- Wrong:
|
|
298
|
-
- Right:
|
|
283
|
+
- Wrong: \`{"name": "address", "type": "Custom"}\`
|
|
284
|
+
- Right: \`{"name": "address", "type": "Custom", "subfields": [{"name": "street", "type": "String"}, ...]}\`
|
|
299
285
|
|
|
300
|
-
- **Using "List" as a field type**: Use \`isList
|
|
301
|
-
- Wrong:
|
|
302
|
-
- Right:
|
|
286
|
+
- **Using "List" as a field type**: Use \`"isList": true\` with a valid type instead.
|
|
287
|
+
- Wrong: \`{"name": "items", "type": "List"}\`
|
|
288
|
+
- Right: \`{"name": "items", "type": "String", "isList": true}\`
|
|
303
289
|
|
|
304
290
|
- **Using wrong attribute names**: Always use camelCase attributes.
|
|
305
|
-
- Wrong: \`optional
|
|
306
|
-
- Right: \`isOptional
|
|
291
|
+
- Wrong: \`"optional": true\`, \`"generated": true\`, \`"list": true\`
|
|
292
|
+
- Right: \`"isOptional": true\`, \`"isGenerated": true\`, \`"isList": true\`
|
|
307
293
|
|
|
308
294
|
## Best Practices
|
|
309
295
|
|
|
@@ -67,59 +67,61 @@ For slices where a user action triggers a command:
|
|
|
67
67
|
|
|
68
68
|
\`\`\`bash
|
|
69
69
|
# Happy path - command succeeds
|
|
70
|
-
eventmodeler add scenario --slice "<slice-name>"
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
</then>
|
|
88
|
-
</scenario>'
|
|
70
|
+
eventmodeler add scenario --slice "<slice-name>" '{
|
|
71
|
+
"name": "Successfully place order",
|
|
72
|
+
"description": "A registered customer can place an order with valid items",
|
|
73
|
+
"given": [
|
|
74
|
+
{"event": "CustomerRegistered", "fieldValues": {"customerId": "cust-123"}}
|
|
75
|
+
],
|
|
76
|
+
"when": {
|
|
77
|
+
"command": "PlaceOrder",
|
|
78
|
+
"commandFieldValues": {"customerId": "cust-123", "items": [{"productId": "prod-1", "quantity": 2}]}
|
|
79
|
+
},
|
|
80
|
+
"then": {
|
|
81
|
+
"type": "events",
|
|
82
|
+
"events": [
|
|
83
|
+
{"event": "OrderPlaced", "fieldValues": {"orderId": "order-456", "customerId": "cust-123"}}
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
}'
|
|
89
87
|
\`\`\`
|
|
90
88
|
|
|
91
89
|
\`\`\`bash
|
|
92
90
|
# Validation error
|
|
93
|
-
eventmodeler add scenario --slice "<slice-name>"
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
91
|
+
eventmodeler add scenario --slice "<slice-name>" '{
|
|
92
|
+
"name": "Cannot place empty order",
|
|
93
|
+
"description": "Orders must contain at least one item - empty item lists are rejected",
|
|
94
|
+
"when": {
|
|
95
|
+
"command": "PlaceOrder",
|
|
96
|
+
"commandFieldValues": {"customerId": "cust-123", "items": []}
|
|
97
|
+
},
|
|
98
|
+
"then": {
|
|
99
|
+
"type": "error",
|
|
100
|
+
"errorType": "ValidationError",
|
|
101
|
+
"errorMessage": "Order must contain at least one item"
|
|
102
|
+
}
|
|
103
|
+
}'
|
|
102
104
|
\`\`\`
|
|
103
105
|
|
|
104
106
|
\`\`\`bash
|
|
105
107
|
# Business rule violation
|
|
106
|
-
eventmodeler add scenario --slice "Cancel Order"
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
108
|
+
eventmodeler add scenario --slice "Cancel Order" '{
|
|
109
|
+
"name": "Cannot cancel shipped order",
|
|
110
|
+
"description": "Once an order has been shipped, it can no longer be cancelled",
|
|
111
|
+
"given": [
|
|
112
|
+
{"event": "OrderPlaced", "fieldValues": {"orderId": "order-123"}},
|
|
113
|
+
{"event": "OrderShipped", "fieldValues": {"orderId": "order-123", "shippedAt": "2024-01-15T10:00:00Z"}}
|
|
114
|
+
],
|
|
115
|
+
"when": {
|
|
116
|
+
"command": "CancelOrder",
|
|
117
|
+
"commandFieldValues": {"orderId": "order-123"}
|
|
118
|
+
},
|
|
119
|
+
"then": {
|
|
120
|
+
"type": "error",
|
|
121
|
+
"errorType": "BusinessRuleViolation",
|
|
122
|
+
"errorMessage": "Cannot cancel an order that has already shipped"
|
|
123
|
+
}
|
|
124
|
+
}'
|
|
123
125
|
\`\`\`
|
|
124
126
|
|
|
125
127
|
---
|
|
@@ -140,38 +142,33 @@ For slices where events trigger a processor to issue a command. Use the simpler
|
|
|
140
142
|
|
|
141
143
|
\`\`\`bash
|
|
142
144
|
# Payment received triggers shipment initiation
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
<command name="InitiateShipment">
|
|
157
|
-
<field name="orderId">order-123</field>
|
|
158
|
-
<field name="warehouseId">wh-001</field>
|
|
159
|
-
</command>
|
|
160
|
-
</then>
|
|
161
|
-
</scenario>'
|
|
145
|
+
eventmodeler add scenario --slice "Auto Ship Order" '{
|
|
146
|
+
"name": "Payment triggers shipment",
|
|
147
|
+
"description": "Given an order has been placed and payment received, the system automatically initiates shipment",
|
|
148
|
+
"given": [
|
|
149
|
+
{"event": "OrderPlaced", "fieldValues": {"orderId": "order-123", "customerId": "cust-456"}},
|
|
150
|
+
{"event": "PaymentReceived", "fieldValues": {"orderId": "order-123", "amount": 99.99}}
|
|
151
|
+
],
|
|
152
|
+
"then": {
|
|
153
|
+
"type": "command",
|
|
154
|
+
"command": "InitiateShipment",
|
|
155
|
+
"commandFieldValues": {"orderId": "order-123", "warehouseId": "wh-001"}
|
|
156
|
+
}
|
|
157
|
+
}'
|
|
162
158
|
\`\`\`
|
|
163
159
|
|
|
164
160
|
\`\`\`bash
|
|
165
161
|
# Negative case - conditions not met, no command dispatched
|
|
166
|
-
eventmodeler add scenario --slice "Auto Ship Order"
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
162
|
+
eventmodeler add scenario --slice "Auto Ship Order" '{
|
|
163
|
+
"name": "No shipment without payment",
|
|
164
|
+
"description": "Given only an order placed (no payment), the system should not initiate shipment",
|
|
165
|
+
"given": [
|
|
166
|
+
{"event": "OrderPlaced", "fieldValues": {"orderId": "order-123", "customerId": "cust-456"}}
|
|
167
|
+
],
|
|
168
|
+
"then": {
|
|
169
|
+
"type": "noCommand"
|
|
170
|
+
}
|
|
171
|
+
}'
|
|
175
172
|
\`\`\`
|
|
176
173
|
|
|
177
174
|
---
|
|
@@ -181,14 +178,18 @@ eventmodeler add scenario --slice "Auto Ship Order" --xml '<scenario name="No sh
|
|
|
181
178
|
For state-view slices, test that events project correctly to read models:
|
|
182
179
|
|
|
183
180
|
\`\`\`bash
|
|
184
|
-
eventmodeler add scenario --slice "<slice-name>"
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
181
|
+
eventmodeler add scenario --slice "<slice-name>" '{
|
|
182
|
+
"name": "Order appears in summary",
|
|
183
|
+
"description": "After placing an order, it should be visible in the order summary with pending status",
|
|
184
|
+
"given": [
|
|
185
|
+
{"event": "OrderPlaced", "fieldValues": {"orderId": "order-456", "customerId": "cust-123", "status": "pending"}}
|
|
186
|
+
],
|
|
187
|
+
"then": {
|
|
188
|
+
"type": "readModelAssertion",
|
|
189
|
+
"readModel": "OrderSummary",
|
|
190
|
+
"expected": {"orderId": "order-456", "status": "pending"}
|
|
191
|
+
}
|
|
192
|
+
}'
|
|
192
193
|
\`\`\`
|
|
193
194
|
|
|
194
195
|
---
|
|
@@ -201,62 +202,6 @@ eventmodeler add scenario --slice "<slice-name>" --xml '<scenario name="Order ap
|
|
|
201
202
|
| Automation | Given (Events) → Then | Command or noCommand |
|
|
202
203
|
| State-View | Given → Then | Read Model Assertion |
|
|
203
204
|
|
|
204
|
-
## JSON Format Alternative
|
|
205
|
-
|
|
206
|
-
You can also use JSON format:
|
|
207
|
-
|
|
208
|
-
**State-Change Scenario:**
|
|
209
|
-
\`\`\`bash
|
|
210
|
-
eventmodeler add scenario --slice "<slice-name>" --json '{
|
|
211
|
-
"name": "Successfully place order",
|
|
212
|
-
"description": "A registered customer can place an order",
|
|
213
|
-
"given": [
|
|
214
|
-
{ "event": "CustomerRegistered", "fieldValues": { "customerId": "cust-123" } }
|
|
215
|
-
],
|
|
216
|
-
"when": {
|
|
217
|
-
"command": "PlaceOrder",
|
|
218
|
-
"commandFieldValues": { "customerId": "cust-123", "items": [] }
|
|
219
|
-
},
|
|
220
|
-
"then": {
|
|
221
|
-
"type": "events",
|
|
222
|
-
"events": [
|
|
223
|
-
{ "event": "OrderPlaced", "fieldValues": { "orderId": "order-456" } }
|
|
224
|
-
]
|
|
225
|
-
}
|
|
226
|
-
}'
|
|
227
|
-
\`\`\`
|
|
228
|
-
|
|
229
|
-
**Automation Scenario (Given-Then format):**
|
|
230
|
-
\`\`\`bash
|
|
231
|
-
eventmodeler add scenario --slice "<slice-name>" --json '{
|
|
232
|
-
"name": "Payment triggers shipment",
|
|
233
|
-
"description": "Given order placed and payment received, shipment is initiated",
|
|
234
|
-
"given": [
|
|
235
|
-
{ "event": "OrderPlaced", "fieldValues": { "orderId": "order-123" } },
|
|
236
|
-
{ "event": "PaymentReceived", "fieldValues": { "orderId": "order-123", "amount": 99.99 } }
|
|
237
|
-
],
|
|
238
|
-
"then": {
|
|
239
|
-
"type": "command",
|
|
240
|
-
"command": "InitiateShipment",
|
|
241
|
-
"commandFieldValues": { "orderId": "order-123" }
|
|
242
|
-
}
|
|
243
|
-
}'
|
|
244
|
-
\`\`\`
|
|
245
|
-
|
|
246
|
-
**Automation Scenario (negative case):**
|
|
247
|
-
\`\`\`bash
|
|
248
|
-
eventmodeler add scenario --slice "<slice-name>" --json '{
|
|
249
|
-
"name": "No shipment without payment",
|
|
250
|
-
"description": "Given only order placed (no payment), no command dispatched",
|
|
251
|
-
"given": [
|
|
252
|
-
{ "event": "OrderPlaced", "fieldValues": { "orderId": "order-123" } }
|
|
253
|
-
],
|
|
254
|
-
"then": {
|
|
255
|
-
"type": "noCommand"
|
|
256
|
-
}
|
|
257
|
-
}'
|
|
258
|
-
\`\`\`
|
|
259
|
-
|
|
260
205
|
## Best Practices
|
|
261
206
|
|
|
262
207
|
1. **Write clear descriptions** - Explain why this scenario matters and what business rule it captures
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { meta as exploreMeta, content as exploreContent } from './guides/explore
|
|
2
|
-
import { meta as scenariosMeta, content as scenariosContent } from './guides/scenarios
|
|
3
|
-
import { meta as informationFlowMeta, content as informationFlowContent } from './guides/information-flow
|
|
4
|
-
import { meta as createSlicesMeta, content as createSlicesContent } from './guides/create-slices
|
|
5
|
-
import { meta as connectSlicesMeta, content as connectSlicesContent } from './guides/connect-slices
|
|
6
|
-
import { meta as codegenMeta, content as codegenContent } from './guides/codegen
|
|
1
|
+
import { meta as exploreMeta, content as exploreContent } from './guides/explore';
|
|
2
|
+
import { meta as scenariosMeta, content as scenariosContent } from './guides/scenarios';
|
|
3
|
+
import { meta as informationFlowMeta, content as informationFlowContent } from './guides/information-flow';
|
|
4
|
+
import { meta as createSlicesMeta, content as createSlicesContent } from './guides/create-slices';
|
|
5
|
+
import { meta as connectSlicesMeta, content as connectSlicesContent } from './guides/connect-slices';
|
|
6
|
+
import { meta as codegenMeta, content as codegenContent } from './guides/codegen';
|
|
7
7
|
const GUIDES = [
|
|
8
8
|
{ meta: exploreMeta, content: exploreContent },
|
|
9
9
|
{ meta: createSlicesMeta, content: createSlicesContent },
|