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.
Files changed (204) hide show
  1. package/dist/api/client-config.js +10 -0
  2. package/dist/api/generated/client/client.gen.js +235 -0
  3. package/dist/api/generated/client/index.js +6 -0
  4. package/dist/api/generated/client/types.gen.js +2 -0
  5. package/dist/api/generated/client/utils.gen.js +228 -0
  6. package/dist/api/generated/client.gen.js +4 -0
  7. package/dist/api/generated/core/auth.gen.js +14 -0
  8. package/dist/api/generated/core/bodySerializer.gen.js +57 -0
  9. package/dist/api/generated/core/params.gen.js +100 -0
  10. package/dist/api/generated/core/pathSerializer.gen.js +106 -0
  11. package/dist/api/generated/core/queryKeySerializer.gen.js +92 -0
  12. package/dist/api/generated/core/serverSentEvents.gen.js +133 -0
  13. package/dist/api/generated/core/types.gen.js +2 -0
  14. package/dist/api/generated/core/utils.gen.js +87 -0
  15. package/dist/api/generated/index.js +2 -0
  16. package/dist/api/generated/sdk.gen.js +4222 -0
  17. package/dist/api/generated/types.gen.js +2 -0
  18. package/dist/api/generated/zod.gen.js +7217 -0
  19. package/dist/commands/add.js +315 -0
  20. package/dist/commands/auth.js +14 -0
  21. package/dist/commands/create.js +192 -0
  22. package/dist/commands/design.js +108 -0
  23. package/dist/commands/guide.js +15 -0
  24. package/dist/commands/init.js +21 -0
  25. package/dist/commands/list-schemas.js +177 -0
  26. package/dist/commands/list.js +39 -0
  27. package/dist/commands/loop.js +101 -0
  28. package/dist/commands/map.js +40 -0
  29. package/dist/commands/mark.js +27 -0
  30. package/dist/commands/move.js +35 -0
  31. package/dist/commands/remove.js +170 -0
  32. package/dist/commands/rename.js +53 -0
  33. package/dist/commands/resize.js +30 -0
  34. package/dist/commands/search.js +14 -0
  35. package/dist/commands/set.js +199 -0
  36. package/dist/commands/show-schemas.js +259 -0
  37. package/dist/commands/show.js +56 -0
  38. package/dist/commands/summary.js +13 -0
  39. package/dist/commands/update.js +240 -0
  40. package/dist/index.js +46 -2379
  41. package/dist/lib/auth.js +1 -1
  42. package/dist/lib/config.js +0 -15
  43. package/dist/lib/excalidraw-schema.js +66 -0
  44. package/dist/lib/globals.js +8 -0
  45. package/dist/lib/model.js +11 -0
  46. package/dist/lib/project-config.js +20 -0
  47. package/dist/lib/resolve.js +59 -0
  48. package/dist/lib/scenario.js +15 -0
  49. package/dist/slices/add-scenario/index.js +2 -206
  50. package/dist/slices/guide/guides/codegen.js +1 -1
  51. package/dist/slices/guide/guides/connect-slices.js +38 -38
  52. package/dist/slices/guide/guides/create-slices.js +110 -140
  53. package/dist/slices/guide/guides/explore.js +37 -50
  54. package/dist/slices/guide/guides/information-flow.js +70 -84
  55. package/dist/slices/guide/guides/scenarios.js +82 -137
  56. package/dist/slices/guide/index.js +6 -6
  57. package/dist/slices/help/index.js +96 -0
  58. package/dist/slices/help/topics/build-codegen.js +109 -0
  59. package/dist/slices/help/topics/build-slice.js +147 -0
  60. package/dist/slices/help/topics/check-completeness.js +57 -0
  61. package/dist/slices/help/topics/connect-slices.js +99 -0
  62. package/dist/slices/help/topics/explore-model.js +112 -0
  63. package/dist/slices/help/topics/json-reference.js +188 -0
  64. package/dist/slices/help/topics/linked-copies.js +89 -0
  65. package/dist/slices/help/topics/manipulate-canvas.js +150 -0
  66. package/dist/slices/help/topics/write-scenarios.js +162 -0
  67. package/dist/slices/init/index.js +10 -4
  68. package/dist/slices/init/loop.js +60 -0
  69. package/dist/slices/login/index.js +2 -2
  70. package/dist/slices/logout/index.js +2 -2
  71. package/dist/slices/whoami/index.js +11 -36
  72. package/package.json +8 -3
  73. package/dist/api/index.d.ts +0 -285
  74. package/dist/api/index.js +0 -323
  75. package/dist/cloud/slices/index.d.ts +0 -276
  76. package/dist/cloud/slices/index.js +0 -406
  77. package/dist/eventmodeler.js +0 -5646
  78. package/dist/formatters.d.ts +0 -17
  79. package/dist/formatters.js +0 -482
  80. package/dist/index.d.ts +0 -2
  81. package/dist/lib/auth.d.ts +0 -24
  82. package/dist/lib/backend.d.ts +0 -43
  83. package/dist/lib/backend.js +0 -73
  84. package/dist/lib/chapter-utils.d.ts +0 -13
  85. package/dist/lib/chapter-utils.js +0 -71
  86. package/dist/lib/cloud-client.d.ts +0 -69
  87. package/dist/lib/cloud-client.js +0 -364
  88. package/dist/lib/config.d.ts +0 -30
  89. package/dist/lib/diff/merge-rules.d.ts +0 -45
  90. package/dist/lib/diff/merge-rules.js +0 -210
  91. package/dist/lib/diff/model-differ.d.ts +0 -8
  92. package/dist/lib/diff/model-differ.js +0 -568
  93. package/dist/lib/diff/three-way-merge.d.ts +0 -7
  94. package/dist/lib/diff/three-way-merge.js +0 -390
  95. package/dist/lib/diff/types.d.ts +0 -75
  96. package/dist/lib/diff/types.js +0 -1
  97. package/dist/lib/element-lookup.d.ts +0 -58
  98. package/dist/lib/element-lookup.js +0 -126
  99. package/dist/lib/file-loader.d.ts +0 -8
  100. package/dist/lib/file-loader.js +0 -108
  101. package/dist/lib/flow-utils.d.ts +0 -53
  102. package/dist/lib/flow-utils.js +0 -348
  103. package/dist/lib/format.d.ts +0 -10
  104. package/dist/lib/format.js +0 -23
  105. package/dist/lib/project-config.d.ts +0 -27
  106. package/dist/lib/slice-utils.d.ts +0 -59
  107. package/dist/lib/slice-utils.js +0 -140
  108. package/dist/local/slices/index.d.ts +0 -11
  109. package/dist/local/slices/index.js +0 -13
  110. package/dist/projection.d.ts +0 -3
  111. package/dist/projection.js +0 -828
  112. package/dist/slices/add-field/index.d.ts +0 -8
  113. package/dist/slices/add-field/index.js +0 -211
  114. package/dist/slices/add-scenario/index.d.ts +0 -27
  115. package/dist/slices/codegen-chapter-events/index.d.ts +0 -2
  116. package/dist/slices/codegen-chapter-events/index.js +0 -145
  117. package/dist/slices/codegen-slice/index.d.ts +0 -2
  118. package/dist/slices/codegen-slice/index.js +0 -448
  119. package/dist/slices/create-automation-slice/index.d.ts +0 -2
  120. package/dist/slices/create-automation-slice/index.js +0 -304
  121. package/dist/slices/create-flow/index.d.ts +0 -2
  122. package/dist/slices/create-flow/index.js +0 -183
  123. package/dist/slices/create-state-change-slice/index.d.ts +0 -2
  124. package/dist/slices/create-state-change-slice/index.js +0 -263
  125. package/dist/slices/create-state-view-slice/index.d.ts +0 -2
  126. package/dist/slices/create-state-view-slice/index.js +0 -128
  127. package/dist/slices/diff/index.d.ts +0 -11
  128. package/dist/slices/diff/index.js +0 -293
  129. package/dist/slices/export-eventmodel-to-json/index.d.ts +0 -2
  130. package/dist/slices/export-eventmodel-to-json/index.js +0 -355
  131. package/dist/slices/git/index.d.ts +0 -2
  132. package/dist/slices/git/index.js +0 -125
  133. package/dist/slices/guide/guides/codegen.d.ts +0 -5
  134. package/dist/slices/guide/guides/connect-slices.d.ts +0 -5
  135. package/dist/slices/guide/guides/create-slices.d.ts +0 -5
  136. package/dist/slices/guide/guides/explore.d.ts +0 -5
  137. package/dist/slices/guide/guides/information-flow.d.ts +0 -5
  138. package/dist/slices/guide/guides/scenarios.d.ts +0 -5
  139. package/dist/slices/guide/index.d.ts +0 -1
  140. package/dist/slices/import/index.d.ts +0 -8
  141. package/dist/slices/import/index.js +0 -63
  142. package/dist/slices/init/index.d.ts +0 -5
  143. package/dist/slices/list-chapters/index.d.ts +0 -3
  144. package/dist/slices/list-chapters/index.js +0 -21
  145. package/dist/slices/list-commands/index.d.ts +0 -3
  146. package/dist/slices/list-commands/index.js +0 -20
  147. package/dist/slices/list-events/index.d.ts +0 -3
  148. package/dist/slices/list-events/index.js +0 -98
  149. package/dist/slices/list-processors/index.d.ts +0 -3
  150. package/dist/slices/list-processors/index.js +0 -20
  151. package/dist/slices/list-readmodels/index.d.ts +0 -3
  152. package/dist/slices/list-readmodels/index.js +0 -21
  153. package/dist/slices/list-scenarios/index.d.ts +0 -3
  154. package/dist/slices/list-scenarios/index.js +0 -35
  155. package/dist/slices/list-screens/index.d.ts +0 -3
  156. package/dist/slices/list-screens/index.js +0 -47
  157. package/dist/slices/list-slices/index.d.ts +0 -3
  158. package/dist/slices/list-slices/index.js +0 -35
  159. package/dist/slices/login/index.d.ts +0 -1
  160. package/dist/slices/logout/index.d.ts +0 -1
  161. package/dist/slices/map-fields/index.d.ts +0 -2
  162. package/dist/slices/map-fields/index.js +0 -269
  163. package/dist/slices/mark-slice-status/index.d.ts +0 -2
  164. package/dist/slices/mark-slice-status/index.js +0 -31
  165. package/dist/slices/merge/index.d.ts +0 -19
  166. package/dist/slices/merge/index.js +0 -147
  167. package/dist/slices/open-app/index.d.ts +0 -1
  168. package/dist/slices/remove-field/index.d.ts +0 -8
  169. package/dist/slices/remove-field/index.js +0 -167
  170. package/dist/slices/remove-scenario/index.d.ts +0 -2
  171. package/dist/slices/remove-scenario/index.js +0 -77
  172. package/dist/slices/search/index.d.ts +0 -3
  173. package/dist/slices/search/index.js +0 -302
  174. package/dist/slices/show-actor/index.d.ts +0 -4
  175. package/dist/slices/show-actor/index.js +0 -115
  176. package/dist/slices/show-aggregate/index.d.ts +0 -3
  177. package/dist/slices/show-aggregate/index.js +0 -108
  178. package/dist/slices/show-aggregate-completeness/index.d.ts +0 -4
  179. package/dist/slices/show-aggregate-completeness/index.js +0 -181
  180. package/dist/slices/show-chapter/index.d.ts +0 -3
  181. package/dist/slices/show-chapter/index.js +0 -195
  182. package/dist/slices/show-command/index.d.ts +0 -3
  183. package/dist/slices/show-command/index.js +0 -133
  184. package/dist/slices/show-completeness/index.d.ts +0 -4
  185. package/dist/slices/show-completeness/index.js +0 -731
  186. package/dist/slices/show-event/index.d.ts +0 -3
  187. package/dist/slices/show-event/index.js +0 -118
  188. package/dist/slices/show-model-summary/index.d.ts +0 -3
  189. package/dist/slices/show-model-summary/index.js +0 -31
  190. package/dist/slices/show-processor/index.d.ts +0 -3
  191. package/dist/slices/show-processor/index.js +0 -111
  192. package/dist/slices/show-readmodel/index.d.ts +0 -3
  193. package/dist/slices/show-readmodel/index.js +0 -158
  194. package/dist/slices/show-scenario/index.d.ts +0 -3
  195. package/dist/slices/show-scenario/index.js +0 -196
  196. package/dist/slices/show-screen/index.d.ts +0 -3
  197. package/dist/slices/show-screen/index.js +0 -139
  198. package/dist/slices/show-slice/index.d.ts +0 -3
  199. package/dist/slices/show-slice/index.js +0 -696
  200. package/dist/slices/update-field/index.d.ts +0 -15
  201. package/dist/slices/update-field/index.js +0 -208
  202. package/dist/slices/whoami/index.d.ts +0 -2
  203. package/dist/types.d.ts +0 -195
  204. 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,2 +0,0 @@
1
- import type { EventModel } from '../../types.js';
2
- export declare function createStateViewSlice(model: EventModel, filePath: string, xmlInput: string): void;
@@ -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 {};