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
|
@@ -1,263 +0,0 @@
|
|
|
1
|
-
import { appendEvent } from '../../lib/file-loader.js';
|
|
2
|
-
import { STATE_CHANGE_SLICE, SLICE_GAP, calculateSlicePosition, validateSliceNameUnique, inferFieldMappings, parseFieldsFromXml, getSlicesToShift, fieldInputToField, } from '../../lib/slice-utils.js';
|
|
3
|
-
function getAttr(attrs, name) {
|
|
4
|
-
const match = attrs.match(new RegExp(`${name}="([^"]*)"`));
|
|
5
|
-
return match ? match[1] : undefined;
|
|
6
|
-
}
|
|
7
|
-
function parseXmlInput(xml) {
|
|
8
|
-
// Parse <state-change-slice name="..." after="..." before="...">
|
|
9
|
-
const sliceMatch = xml.match(/<state-change-slice([^>]*)>/);
|
|
10
|
-
if (!sliceMatch) {
|
|
11
|
-
throw new Error('Invalid XML: missing <state-change-slice> tag');
|
|
12
|
-
}
|
|
13
|
-
const sliceName = getAttr(sliceMatch[1], 'name');
|
|
14
|
-
if (!sliceName) {
|
|
15
|
-
throw new Error('Invalid XML: state-change-slice must have a name attribute');
|
|
16
|
-
}
|
|
17
|
-
const after = getAttr(sliceMatch[1], 'after');
|
|
18
|
-
const before = getAttr(sliceMatch[1], 'before');
|
|
19
|
-
// Parse screen
|
|
20
|
-
const screenMatch = xml.match(/<screen([^>]*)>([\s\S]*?)<\/screen>/);
|
|
21
|
-
if (!screenMatch) {
|
|
22
|
-
throw new Error('Invalid XML: missing <screen> element');
|
|
23
|
-
}
|
|
24
|
-
const screenName = getAttr(screenMatch[1], 'name');
|
|
25
|
-
if (!screenName) {
|
|
26
|
-
throw new Error('Invalid XML: screen must have a name attribute');
|
|
27
|
-
}
|
|
28
|
-
const screenFields = parseFieldsFromXml(screenMatch[2]);
|
|
29
|
-
// Parse command
|
|
30
|
-
const commandMatch = xml.match(/<command([^>]*)>([\s\S]*?)<\/command>/);
|
|
31
|
-
if (!commandMatch) {
|
|
32
|
-
throw new Error('Invalid XML: missing <command> element');
|
|
33
|
-
}
|
|
34
|
-
const commandName = getAttr(commandMatch[1], 'name');
|
|
35
|
-
if (!commandName) {
|
|
36
|
-
throw new Error('Invalid XML: command must have a name attribute');
|
|
37
|
-
}
|
|
38
|
-
const commandFields = parseFieldsFromXml(commandMatch[2]);
|
|
39
|
-
// Parse event
|
|
40
|
-
const eventMatch = xml.match(/<event([^>]*)>([\s\S]*?)<\/event>/);
|
|
41
|
-
if (!eventMatch) {
|
|
42
|
-
throw new Error('Invalid XML: missing <event> element');
|
|
43
|
-
}
|
|
44
|
-
const eventName = getAttr(eventMatch[1], 'name');
|
|
45
|
-
if (!eventName) {
|
|
46
|
-
throw new Error('Invalid XML: event must have a name attribute');
|
|
47
|
-
}
|
|
48
|
-
const eventFields = parseFieldsFromXml(eventMatch[2]);
|
|
49
|
-
return {
|
|
50
|
-
sliceName,
|
|
51
|
-
after,
|
|
52
|
-
before,
|
|
53
|
-
screen: { name: screenName, fields: screenFields },
|
|
54
|
-
command: { name: commandName, fields: commandFields },
|
|
55
|
-
event: { name: eventName, fields: eventFields },
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
export function createStateChangeSlice(model, filePath, xmlInput) {
|
|
59
|
-
// Parse input
|
|
60
|
-
let input;
|
|
61
|
-
try {
|
|
62
|
-
input = parseXmlInput(xmlInput);
|
|
63
|
-
}
|
|
64
|
-
catch (err) {
|
|
65
|
-
console.error(`Error: ${err.message}`);
|
|
66
|
-
process.exit(1);
|
|
67
|
-
}
|
|
68
|
-
// Validate slice name is unique
|
|
69
|
-
try {
|
|
70
|
-
validateSliceNameUnique(model, input.sliceName);
|
|
71
|
-
}
|
|
72
|
-
catch (err) {
|
|
73
|
-
console.error(`Error: ${err.message}`);
|
|
74
|
-
process.exit(1);
|
|
75
|
-
}
|
|
76
|
-
// Calculate position
|
|
77
|
-
let slicePosition;
|
|
78
|
-
try {
|
|
79
|
-
slicePosition = calculateSlicePosition(model, STATE_CHANGE_SLICE.width, {
|
|
80
|
-
after: input.after,
|
|
81
|
-
before: input.before,
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
catch (err) {
|
|
85
|
-
console.error(`Error: ${err.message}`);
|
|
86
|
-
process.exit(1);
|
|
87
|
-
}
|
|
88
|
-
// Handle "before" positioning - shift existing slices
|
|
89
|
-
if (input.before) {
|
|
90
|
-
const shiftAmount = STATE_CHANGE_SLICE.width + SLICE_GAP;
|
|
91
|
-
const toShift = getSlicesToShift(model, slicePosition.x, shiftAmount);
|
|
92
|
-
for (const { sliceId, newX, currentY } of toShift) {
|
|
93
|
-
appendEvent(filePath, {
|
|
94
|
-
type: 'SliceMoved',
|
|
95
|
-
data: {
|
|
96
|
-
sliceId,
|
|
97
|
-
position: { x: newX, y: currentY },
|
|
98
|
-
timestamp: Date.now(),
|
|
99
|
-
},
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
// Generate IDs
|
|
104
|
-
const sliceId = crypto.randomUUID();
|
|
105
|
-
const screenId = crypto.randomUUID();
|
|
106
|
-
const commandId = crypto.randomUUID();
|
|
107
|
-
const eventId = crypto.randomUUID();
|
|
108
|
-
const screenToCommandFlowId = crypto.randomUUID();
|
|
109
|
-
const commandToEventFlowId = crypto.randomUUID();
|
|
110
|
-
// Convert field inputs to fields with IDs
|
|
111
|
-
const screenFields = input.screen.fields.map(fieldInputToField);
|
|
112
|
-
const commandFields = input.command.fields.map(fieldInputToField);
|
|
113
|
-
const eventFields = input.event.fields.map(fieldInputToField);
|
|
114
|
-
// Infer field mappings
|
|
115
|
-
const screenToCommandMappings = inferFieldMappings(screenFields, commandFields);
|
|
116
|
-
const commandToEventMappings = inferFieldMappings(commandFields, eventFields);
|
|
117
|
-
// Calculate absolute positions for components within the slice
|
|
118
|
-
const screenPosition = {
|
|
119
|
-
x: slicePosition.x + STATE_CHANGE_SLICE.screen.offsetX,
|
|
120
|
-
y: slicePosition.y + STATE_CHANGE_SLICE.screen.offsetY,
|
|
121
|
-
};
|
|
122
|
-
const commandPosition = {
|
|
123
|
-
x: slicePosition.x + STATE_CHANGE_SLICE.command.offsetX,
|
|
124
|
-
y: slicePosition.y + STATE_CHANGE_SLICE.command.offsetY,
|
|
125
|
-
};
|
|
126
|
-
const eventPosition = {
|
|
127
|
-
x: slicePosition.x + STATE_CHANGE_SLICE.event.offsetX,
|
|
128
|
-
y: slicePosition.y + STATE_CHANGE_SLICE.event.offsetY,
|
|
129
|
-
};
|
|
130
|
-
// Emit atomic events in sequence
|
|
131
|
-
// 1. Create the slice
|
|
132
|
-
appendEvent(filePath, {
|
|
133
|
-
type: 'SlicePlaced',
|
|
134
|
-
data: {
|
|
135
|
-
sliceId,
|
|
136
|
-
name: input.sliceName,
|
|
137
|
-
position: slicePosition,
|
|
138
|
-
size: { width: STATE_CHANGE_SLICE.width, height: STATE_CHANGE_SLICE.height },
|
|
139
|
-
timestamp: Date.now(),
|
|
140
|
-
},
|
|
141
|
-
});
|
|
142
|
-
// 2. Create the screen
|
|
143
|
-
appendEvent(filePath, {
|
|
144
|
-
type: 'ScreenPlaced',
|
|
145
|
-
data: {
|
|
146
|
-
screenId,
|
|
147
|
-
name: input.screen.name,
|
|
148
|
-
position: screenPosition,
|
|
149
|
-
width: STATE_CHANGE_SLICE.screen.width,
|
|
150
|
-
height: STATE_CHANGE_SLICE.screen.height,
|
|
151
|
-
timestamp: Date.now(),
|
|
152
|
-
},
|
|
153
|
-
});
|
|
154
|
-
// 3. Add screen fields
|
|
155
|
-
for (const field of screenFields) {
|
|
156
|
-
appendEvent(filePath, {
|
|
157
|
-
type: 'ScreenFieldAdded',
|
|
158
|
-
data: {
|
|
159
|
-
screenId,
|
|
160
|
-
field,
|
|
161
|
-
timestamp: Date.now(),
|
|
162
|
-
},
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
// 4. Create the command
|
|
166
|
-
appendEvent(filePath, {
|
|
167
|
-
type: 'CommandStickyPlaced',
|
|
168
|
-
data: {
|
|
169
|
-
commandStickyId: commandId,
|
|
170
|
-
name: input.command.name,
|
|
171
|
-
position: commandPosition,
|
|
172
|
-
width: STATE_CHANGE_SLICE.command.width,
|
|
173
|
-
height: STATE_CHANGE_SLICE.command.height,
|
|
174
|
-
timestamp: Date.now(),
|
|
175
|
-
},
|
|
176
|
-
});
|
|
177
|
-
// 5. Add command fields
|
|
178
|
-
for (const field of commandFields) {
|
|
179
|
-
appendEvent(filePath, {
|
|
180
|
-
type: 'CommandFieldAdded',
|
|
181
|
-
data: {
|
|
182
|
-
commandStickyId: commandId,
|
|
183
|
-
field,
|
|
184
|
-
timestamp: Date.now(),
|
|
185
|
-
},
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
// 6. Create the event
|
|
189
|
-
appendEvent(filePath, {
|
|
190
|
-
type: 'EventStickyPlaced',
|
|
191
|
-
data: {
|
|
192
|
-
eventStickyId: eventId,
|
|
193
|
-
name: input.event.name,
|
|
194
|
-
position: eventPosition,
|
|
195
|
-
width: STATE_CHANGE_SLICE.event.width,
|
|
196
|
-
height: STATE_CHANGE_SLICE.event.height,
|
|
197
|
-
timestamp: Date.now(),
|
|
198
|
-
},
|
|
199
|
-
});
|
|
200
|
-
// 7. Add event fields
|
|
201
|
-
for (const field of eventFields) {
|
|
202
|
-
appendEvent(filePath, {
|
|
203
|
-
type: 'EventFieldAdded',
|
|
204
|
-
data: {
|
|
205
|
-
eventStickyId: eventId,
|
|
206
|
-
field,
|
|
207
|
-
timestamp: Date.now(),
|
|
208
|
-
},
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
// 8. Create screen -> command flow
|
|
212
|
-
appendEvent(filePath, {
|
|
213
|
-
type: 'ScreenToCommandFlowSpecified',
|
|
214
|
-
data: {
|
|
215
|
-
flowId: screenToCommandFlowId,
|
|
216
|
-
screenId,
|
|
217
|
-
commandStickyId: commandId,
|
|
218
|
-
sourceHandle: 'bottom-source',
|
|
219
|
-
targetHandle: 'top-target',
|
|
220
|
-
timestamp: Date.now(),
|
|
221
|
-
},
|
|
222
|
-
});
|
|
223
|
-
// 9. Add screen -> command field mappings
|
|
224
|
-
if (screenToCommandMappings.length > 0) {
|
|
225
|
-
appendEvent(filePath, {
|
|
226
|
-
type: 'FieldMappingSpecified',
|
|
227
|
-
data: {
|
|
228
|
-
flowId: screenToCommandFlowId,
|
|
229
|
-
mappings: screenToCommandMappings,
|
|
230
|
-
timestamp: Date.now(),
|
|
231
|
-
},
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
// 10. Create command -> event flow
|
|
235
|
-
appendEvent(filePath, {
|
|
236
|
-
type: 'CommandToEventFlowSpecified',
|
|
237
|
-
data: {
|
|
238
|
-
flowId: commandToEventFlowId,
|
|
239
|
-
commandStickyId: commandId,
|
|
240
|
-
eventStickyId: eventId,
|
|
241
|
-
sourceHandle: 'bottom-source',
|
|
242
|
-
targetHandle: 'top-target',
|
|
243
|
-
timestamp: Date.now(),
|
|
244
|
-
},
|
|
245
|
-
});
|
|
246
|
-
// 11. Add command -> event field mappings
|
|
247
|
-
if (commandToEventMappings.length > 0) {
|
|
248
|
-
appendEvent(filePath, {
|
|
249
|
-
type: 'FieldMappingSpecified',
|
|
250
|
-
data: {
|
|
251
|
-
flowId: commandToEventFlowId,
|
|
252
|
-
mappings: commandToEventMappings,
|
|
253
|
-
timestamp: Date.now(),
|
|
254
|
-
},
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
console.log(`Created state-change slice "${input.sliceName}"`);
|
|
258
|
-
console.log(` Screen: ${input.screen.name} (${screenFields.length} fields)`);
|
|
259
|
-
console.log(` Command: ${input.command.name} (${commandFields.length} fields)`);
|
|
260
|
-
console.log(` Event: ${input.event.name} (${eventFields.length} fields)`);
|
|
261
|
-
console.log(` Screen -> Command mappings: ${screenToCommandMappings.length}`);
|
|
262
|
-
console.log(` Command -> Event mappings: ${commandToEventMappings.length}`);
|
|
263
|
-
}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { appendEvent } from '../../lib/file-loader.js';
|
|
2
|
-
import { STATE_VIEW_SLICE, SLICE_GAP, calculateSlicePosition, validateSliceNameUnique, parseFieldsFromXml, getSlicesToShift, fieldInputToField, } from '../../lib/slice-utils.js';
|
|
3
|
-
function getAttr(attrs, name) {
|
|
4
|
-
const match = attrs.match(new RegExp(`${name}="([^"]*)"`));
|
|
5
|
-
return match ? match[1] : undefined;
|
|
6
|
-
}
|
|
7
|
-
function parseXmlInput(xml) {
|
|
8
|
-
// Parse <state-view-slice name="..." after="..." before="...">
|
|
9
|
-
const sliceMatch = xml.match(/<state-view-slice([^>]*)>/);
|
|
10
|
-
if (!sliceMatch) {
|
|
11
|
-
throw new Error('Invalid XML: missing <state-view-slice> tag');
|
|
12
|
-
}
|
|
13
|
-
const sliceName = getAttr(sliceMatch[1], 'name');
|
|
14
|
-
if (!sliceName) {
|
|
15
|
-
throw new Error('Invalid XML: state-view-slice must have a name attribute');
|
|
16
|
-
}
|
|
17
|
-
const after = getAttr(sliceMatch[1], 'after');
|
|
18
|
-
const before = getAttr(sliceMatch[1], 'before');
|
|
19
|
-
// Parse read-model
|
|
20
|
-
const readModelMatch = xml.match(/<read-model([^>]*)>([\s\S]*?)<\/read-model>/);
|
|
21
|
-
if (!readModelMatch) {
|
|
22
|
-
throw new Error('Invalid XML: missing <read-model> element');
|
|
23
|
-
}
|
|
24
|
-
const readModelName = getAttr(readModelMatch[1], 'name');
|
|
25
|
-
if (!readModelName) {
|
|
26
|
-
throw new Error('Invalid XML: read-model must have a name attribute');
|
|
27
|
-
}
|
|
28
|
-
const readModelFields = parseFieldsFromXml(readModelMatch[2]);
|
|
29
|
-
return {
|
|
30
|
-
sliceName,
|
|
31
|
-
after,
|
|
32
|
-
before,
|
|
33
|
-
readModel: { name: readModelName, fields: readModelFields },
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
export function createStateViewSlice(model, filePath, xmlInput) {
|
|
37
|
-
// Parse input
|
|
38
|
-
let input;
|
|
39
|
-
try {
|
|
40
|
-
input = parseXmlInput(xmlInput);
|
|
41
|
-
}
|
|
42
|
-
catch (err) {
|
|
43
|
-
console.error(`Error: ${err.message}`);
|
|
44
|
-
process.exit(1);
|
|
45
|
-
}
|
|
46
|
-
// Validate slice name is unique
|
|
47
|
-
try {
|
|
48
|
-
validateSliceNameUnique(model, input.sliceName);
|
|
49
|
-
}
|
|
50
|
-
catch (err) {
|
|
51
|
-
console.error(`Error: ${err.message}`);
|
|
52
|
-
process.exit(1);
|
|
53
|
-
}
|
|
54
|
-
// Calculate position
|
|
55
|
-
let slicePosition;
|
|
56
|
-
try {
|
|
57
|
-
slicePosition = calculateSlicePosition(model, STATE_VIEW_SLICE.width, {
|
|
58
|
-
after: input.after,
|
|
59
|
-
before: input.before,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
catch (err) {
|
|
63
|
-
console.error(`Error: ${err.message}`);
|
|
64
|
-
process.exit(1);
|
|
65
|
-
}
|
|
66
|
-
// Handle "before" positioning - shift existing slices
|
|
67
|
-
if (input.before) {
|
|
68
|
-
const shiftAmount = STATE_VIEW_SLICE.width + SLICE_GAP;
|
|
69
|
-
const toShift = getSlicesToShift(model, slicePosition.x, shiftAmount);
|
|
70
|
-
for (const { sliceId, newX, currentY } of toShift) {
|
|
71
|
-
appendEvent(filePath, {
|
|
72
|
-
type: 'SliceMoved',
|
|
73
|
-
data: {
|
|
74
|
-
sliceId,
|
|
75
|
-
position: { x: newX, y: currentY },
|
|
76
|
-
timestamp: Date.now(),
|
|
77
|
-
},
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
// Generate IDs
|
|
82
|
-
const sliceId = crypto.randomUUID();
|
|
83
|
-
const readModelId = crypto.randomUUID();
|
|
84
|
-
// Convert field inputs to fields with IDs
|
|
85
|
-
const readModelFields = input.readModel.fields.map(fieldInputToField);
|
|
86
|
-
// Calculate absolute position for read model within the slice
|
|
87
|
-
const readModelPosition = {
|
|
88
|
-
x: slicePosition.x + STATE_VIEW_SLICE.readModel.offsetX,
|
|
89
|
-
y: slicePosition.y + STATE_VIEW_SLICE.readModel.offsetY,
|
|
90
|
-
};
|
|
91
|
-
// Emit atomic events in sequence
|
|
92
|
-
// 1. Create the slice
|
|
93
|
-
appendEvent(filePath, {
|
|
94
|
-
type: 'SlicePlaced',
|
|
95
|
-
data: {
|
|
96
|
-
sliceId,
|
|
97
|
-
name: input.sliceName,
|
|
98
|
-
position: slicePosition,
|
|
99
|
-
size: { width: STATE_VIEW_SLICE.width, height: STATE_VIEW_SLICE.height },
|
|
100
|
-
timestamp: Date.now(),
|
|
101
|
-
},
|
|
102
|
-
});
|
|
103
|
-
// 2. Create the read model
|
|
104
|
-
appendEvent(filePath, {
|
|
105
|
-
type: 'ReadModelStickyPlaced',
|
|
106
|
-
data: {
|
|
107
|
-
readModelStickyId: readModelId,
|
|
108
|
-
name: input.readModel.name,
|
|
109
|
-
position: readModelPosition,
|
|
110
|
-
width: STATE_VIEW_SLICE.readModel.width,
|
|
111
|
-
height: STATE_VIEW_SLICE.readModel.height,
|
|
112
|
-
timestamp: Date.now(),
|
|
113
|
-
},
|
|
114
|
-
});
|
|
115
|
-
// 3. Add read model fields
|
|
116
|
-
for (const field of readModelFields) {
|
|
117
|
-
appendEvent(filePath, {
|
|
118
|
-
type: 'ReadModelFieldAdded',
|
|
119
|
-
data: {
|
|
120
|
-
readModelStickyId: readModelId,
|
|
121
|
-
field,
|
|
122
|
-
timestamp: Date.now(),
|
|
123
|
-
},
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
console.log(`Created state-view slice "${input.sliceName}"`);
|
|
127
|
-
console.log(` ReadModel: ${input.readModel.name} (${readModelFields.length} fields)`);
|
|
128
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { OutputFormat } from '../../lib/format.js';
|
|
2
|
-
type DiffOutputFormat = OutputFormat | 'text';
|
|
3
|
-
/**
|
|
4
|
-
* Diff two eventmodel files or compare a file against a git ref.
|
|
5
|
-
*
|
|
6
|
-
* Usage:
|
|
7
|
-
* diff(file1, file2, format) - Compare two files
|
|
8
|
-
* diff(file1, undefined, format, ref) - Compare file against git ref (default: HEAD)
|
|
9
|
-
*/
|
|
10
|
-
export declare function diff(basePath: string, comparePath: string | undefined, format: DiffOutputFormat, gitRef?: string): void;
|
|
11
|
-
export {};
|