eventmodeler 0.4.7 → 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 +12 -37
- package/dist/slices/guide/guides/create-slices.js +110 -140
- package/dist/slices/guide/guides/explore.js +37 -26
- package/dist/slices/guide/guides/information-flow.js +70 -82
- 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,42 +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
|
-
###
|
|
120
|
+
### Source/Target Formats
|
|
121
121
|
|
|
122
|
-
The \`--
|
|
122
|
+
The \`--from\` and \`--to\` arguments accept:
|
|
123
123
|
|
|
124
|
-
1. **
|
|
125
|
-
2. **Element ID prefix** (for duplicates): \`"id:abc12345
|
|
126
|
-
3. **Flow ID directly**: The UUID of the flow itself
|
|
127
|
-
|
|
128
|
-
### JSON Alternative
|
|
129
|
-
|
|
130
|
-
\`\`\`bash
|
|
131
|
-
eventmodeler map fields --flow "OrderPlaced→OrderSummary" --json '[
|
|
132
|
-
{"from": "orderId", "to": "orderId"},
|
|
133
|
-
{"from": "customerId", "to": "customerId"}
|
|
134
|
-
]'
|
|
135
|
-
\`\`\`
|
|
124
|
+
1. **Element name** (most common): \`"OrderPlaced"\`
|
|
125
|
+
2. **Element ID prefix** (for duplicates): \`"id:abc12345"\`
|
|
136
126
|
|
|
137
127
|
### Workflow
|
|
138
128
|
|
|
139
129
|
1. **Find flows needing mappings**: \`eventmodeler show model-completeness\`
|
|
140
130
|
2. **See source fields**: \`eventmodeler show event "OrderPlaced"\`
|
|
141
131
|
3. **See target fields**: \`eventmodeler show completeness "OrderSummary"\`
|
|
142
|
-
4. **Create mappings**: \`eventmodeler map fields --
|
|
132
|
+
4. **Create mappings**: \`eventmodeler map fields --from "OrderPlaced" --to "OrderSummary" '[...]'\`
|
|
143
133
|
5. **Verify**: \`eventmodeler show completeness "OrderSummary"\`
|
|
144
134
|
|
|
145
135
|
### Mapping Nested Fields
|
|
@@ -147,11 +137,11 @@ eventmodeler map fields --flow "OrderPlaced→OrderSummary" --json '[
|
|
|
147
137
|
For Custom (nested) field types, use dot notation:
|
|
148
138
|
|
|
149
139
|
\`\`\`bash
|
|
150
|
-
eventmodeler map fields --
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
'
|
|
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
|
+
]'
|
|
155
145
|
\`\`\`
|
|
156
146
|
|
|
157
147
|
### Multiple Flows to Same Target
|
|
@@ -160,17 +150,17 @@ A read model often receives data from multiple events. Map each flow separately:
|
|
|
160
150
|
|
|
161
151
|
\`\`\`bash
|
|
162
152
|
# Initial data from OrderPlaced
|
|
163
|
-
eventmodeler map fields --
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
'
|
|
153
|
+
eventmodeler map fields --from "OrderPlaced" --to "OrderSummary" '[
|
|
154
|
+
{"from": "orderId", "to": "orderId"},
|
|
155
|
+
{"from": "customerId", "to": "customerId"},
|
|
156
|
+
{"from": "totalAmount", "to": "total"}
|
|
157
|
+
]'
|
|
168
158
|
|
|
169
159
|
# Status updates from OrderShipped
|
|
170
|
-
eventmodeler map fields --
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
'
|
|
160
|
+
eventmodeler map fields --from "OrderShipped" --to "OrderSummary" '[
|
|
161
|
+
{"from": "shippedAt", "to": "shippedDate"},
|
|
162
|
+
{"from": "trackingNumber", "to": "trackingNumber"}
|
|
163
|
+
]'
|
|
174
164
|
\`\`\`
|
|
175
165
|
|
|
176
166
|
### Updating Existing Mappings
|
|
@@ -183,10 +173,10 @@ Running \`map fields\` again **merges** with existing mappings:
|
|
|
183
173
|
|
|
184
174
|
| Pattern | Example |
|
|
185
175
|
|---------|---------|
|
|
186
|
-
| Identity |
|
|
187
|
-
| Rename |
|
|
188
|
-
| Nested to flat |
|
|
189
|
-
| 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"}\` |
|
|
190
180
|
|
|
191
181
|
---
|
|
192
182
|
|
|
@@ -197,11 +187,9 @@ Use \`update field\` to modify field attributes without changing the field's nam
|
|
|
197
187
|
### Command Syntax
|
|
198
188
|
|
|
199
189
|
\`\`\`bash
|
|
200
|
-
eventmodeler update field
|
|
190
|
+
eventmodeler update field <element-name> --field "<field-name>" [options]
|
|
201
191
|
\`\`\`
|
|
202
192
|
|
|
203
|
-
Element types: \`--command\`, \`--event\`, \`--read-model\`, \`--screen\`, \`--processor\`
|
|
204
|
-
|
|
205
193
|
### Available Options
|
|
206
194
|
|
|
207
195
|
| Option | Values | Description |
|
|
@@ -215,19 +203,19 @@ Element types: \`--command\`, \`--event\`, \`--read-model\`, \`--screen\`, \`--p
|
|
|
215
203
|
|
|
216
204
|
\`\`\`bash
|
|
217
205
|
# Mark a field as optional
|
|
218
|
-
eventmodeler update field
|
|
206
|
+
eventmodeler update field "OrderPlaced" --field "promoCode" --optional true
|
|
219
207
|
|
|
220
208
|
# Mark a field as system-generated
|
|
221
|
-
eventmodeler update field
|
|
209
|
+
eventmodeler update field "OrderPlaced" --field "orderId" --generated true
|
|
222
210
|
|
|
223
211
|
# Mark screen fields as user input
|
|
224
|
-
eventmodeler update field
|
|
212
|
+
eventmodeler update field "Checkout" --field "email" --user-input true
|
|
225
213
|
|
|
226
214
|
# Change a field's type
|
|
227
|
-
eventmodeler update field
|
|
215
|
+
eventmodeler update field "OrderSummary" --field "total" --type Decimal
|
|
228
216
|
|
|
229
217
|
# Combine multiple updates
|
|
230
|
-
eventmodeler update field
|
|
218
|
+
eventmodeler update field "UserRegistered" --field "createdAt" --generated true --optional false
|
|
231
219
|
\`\`\`
|
|
232
220
|
|
|
233
221
|
### Updating Nested Fields
|
|
@@ -235,7 +223,7 @@ eventmodeler update field --event "UserRegistered" --field "createdAt" --generat
|
|
|
235
223
|
Use dot notation for fields inside Custom types:
|
|
236
224
|
|
|
237
225
|
\`\`\`bash
|
|
238
|
-
eventmodeler update field
|
|
226
|
+
eventmodeler update field "OrderPlaced" --field "shippingAddress.postalCode" --optional true
|
|
239
227
|
\`\`\`
|
|
240
228
|
|
|
241
229
|
### Field Property Meanings
|
|
@@ -252,13 +240,13 @@ eventmodeler update field --event "OrderPlaced" --field "shippingAddress.postalC
|
|
|
252
240
|
|
|
253
241
|
\`\`\`bash
|
|
254
242
|
# Remove a field from an event
|
|
255
|
-
eventmodeler remove field
|
|
243
|
+
eventmodeler remove field "OrderPlaced" --field "legacyId"
|
|
256
244
|
|
|
257
245
|
# Remove a field from a read model
|
|
258
|
-
eventmodeler remove field
|
|
246
|
+
eventmodeler remove field "OrderSummary" --field "deprecatedStatus"
|
|
259
247
|
|
|
260
248
|
# Remove a nested field using dot notation
|
|
261
|
-
eventmodeler remove field
|
|
249
|
+
eventmodeler remove field "OrderPlaced" --field "metadata.debugInfo"
|
|
262
250
|
\`\`\`
|
|
263
251
|
|
|
264
252
|
**Caution**: Removing a field may break existing field mappings. Check completeness first:
|
|
@@ -292,16 +280,16 @@ eventmodeler show aggregate-completeness "<aggregate-name>"
|
|
|
292
280
|
## Common Mistakes
|
|
293
281
|
|
|
294
282
|
- **Creating empty Custom fields**: Custom fields MUST have subfields.
|
|
295
|
-
- Wrong:
|
|
296
|
-
- Right:
|
|
283
|
+
- Wrong: \`{"name": "address", "type": "Custom"}\`
|
|
284
|
+
- Right: \`{"name": "address", "type": "Custom", "subfields": [{"name": "street", "type": "String"}, ...]}\`
|
|
297
285
|
|
|
298
|
-
- **Using "List" as a field type**: Use \`isList
|
|
299
|
-
- Wrong:
|
|
300
|
-
- 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}\`
|
|
301
289
|
|
|
302
290
|
- **Using wrong attribute names**: Always use camelCase attributes.
|
|
303
|
-
- Wrong: \`optional
|
|
304
|
-
- Right: \`isOptional
|
|
291
|
+
- Wrong: \`"optional": true\`, \`"generated": true\`, \`"list": true\`
|
|
292
|
+
- Right: \`"isOptional": true\`, \`"isGenerated": true\`, \`"isList": true\`
|
|
305
293
|
|
|
306
294
|
## Best Practices
|
|
307
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 },
|