wyreframe 0.1.0 → 0.1.5

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 (58) hide show
  1. package/LICENSE +692 -0
  2. package/README.md +65 -5
  3. package/package.json +8 -7
  4. package/src/index.ts +425 -0
  5. package/src/renderer/Renderer.gen.tsx +49 -0
  6. package/src/renderer/Renderer.mjs +41 -1
  7. package/src/renderer/Renderer.res +78 -0
  8. package/src/parser/Core/__tests__/Bounds_test.mjs +0 -326
  9. package/src/parser/Core/__tests__/Bounds_test.res +0 -412
  10. package/src/parser/Core/__tests__/Grid_test.mjs +0 -322
  11. package/src/parser/Core/__tests__/Grid_test.res +0 -319
  12. package/src/parser/Core/__tests__/Types_test.mjs +0 -614
  13. package/src/parser/Core/__tests__/Types_test.res +0 -650
  14. package/src/parser/Detector/__tests__/BoxTracer_test.mjs +0 -70
  15. package/src/parser/Detector/__tests__/BoxTracer_test.res +0 -92
  16. package/src/parser/Detector/__tests__/HierarchyBuilder_test.mjs +0 -489
  17. package/src/parser/Detector/__tests__/HierarchyBuilder_test.res +0 -849
  18. package/src/parser/Detector/__tests__/ShapeDetector_test.mjs +0 -377
  19. package/src/parser/Detector/__tests__/ShapeDetector_test.res +0 -563
  20. package/src/parser/Interactions/__tests__/InteractionMerger_test.mjs +0 -576
  21. package/src/parser/Interactions/__tests__/InteractionMerger_test.res +0 -646
  22. package/src/parser/Scanner/__tests__/Grid_manual.mjs +0 -214
  23. package/src/parser/Scanner/__tests__/Grid_manual.res +0 -141
  24. package/src/parser/Semantic/Elements/__tests__/ButtonParser_test.mjs +0 -189
  25. package/src/parser/Semantic/Elements/__tests__/ButtonParser_test.res +0 -257
  26. package/src/parser/Semantic/Elements/__tests__/CheckboxParser_test.mjs +0 -202
  27. package/src/parser/Semantic/Elements/__tests__/CheckboxParser_test.res +0 -250
  28. package/src/parser/Semantic/Elements/__tests__/CodeTextParser_manual.mjs +0 -293
  29. package/src/parser/Semantic/Elements/__tests__/CodeTextParser_manual.res +0 -134
  30. package/src/parser/Semantic/Elements/__tests__/InputParser_test.mjs +0 -253
  31. package/src/parser/Semantic/Elements/__tests__/InputParser_test.res +0 -304
  32. package/src/parser/Semantic/Elements/__tests__/LinkParser_test.mjs +0 -289
  33. package/src/parser/Semantic/Elements/__tests__/LinkParser_test.res +0 -402
  34. package/src/parser/Semantic/Elements/__tests__/TextParser_test.mjs +0 -149
  35. package/src/parser/Semantic/Elements/__tests__/TextParser_test.res +0 -167
  36. package/src/parser/Semantic/__tests__/ASTBuilder_test.mjs +0 -187
  37. package/src/parser/Semantic/__tests__/ASTBuilder_test.res +0 -192
  38. package/src/parser/Semantic/__tests__/ParserRegistry_test.mjs +0 -154
  39. package/src/parser/Semantic/__tests__/ParserRegistry_test.res +0 -191
  40. package/src/parser/Semantic/__tests__/SemanticParser_integration_test.mjs +0 -768
  41. package/src/parser/Semantic/__tests__/SemanticParser_integration_test.res +0 -1069
  42. package/src/parser/Semantic/__tests__/SemanticParser_manual.mjs +0 -1329
  43. package/src/parser/Semantic/__tests__/SemanticParser_manual.res +0 -544
  44. package/src/parser/__tests__/GridScanner_integration.test.mjs +0 -632
  45. package/src/parser/__tests__/GridScanner_integration.test.res +0 -816
  46. package/src/parser/__tests__/Performance.test.mjs +0 -244
  47. package/src/parser/__tests__/Performance.test.res +0 -371
  48. package/src/parser/__tests__/PerformanceFixtures.mjs +0 -200
  49. package/src/parser/__tests__/PerformanceFixtures.res +0 -284
  50. package/src/parser/__tests__/WyreframeParser_integration.test.mjs +0 -770
  51. package/src/parser/__tests__/WyreframeParser_integration.test.res +0 -1008
  52. package/src/parser/__tests__/fixtures/alignment-test.txt +0 -9
  53. package/src/parser/__tests__/fixtures/all-elements.txt +0 -16
  54. package/src/parser/__tests__/fixtures/login-scene.txt +0 -17
  55. package/src/parser/__tests__/fixtures/multi-scene.txt +0 -25
  56. package/src/parser/__tests__/fixtures/nested-boxes.txt +0 -15
  57. package/src/parser/__tests__/fixtures/simple-box.txt +0 -5
  58. package/src/parser/__tests__/fixtures/with-dividers.txt +0 -14
@@ -1,576 +0,0 @@
1
- // Generated by ReScript, PLEASE EDIT WITH CARE
2
-
3
- import * as Types from "../../Core/Types.mjs";
4
- import * as Vitest from "rescript-vitest/src/Vitest.mjs";
5
- import * as Js_dict from "@rescript/runtime/lib/es6/Js_dict.js";
6
- import * as Core__Option from "@rescript/core/src/Core__Option.mjs";
7
- import * as Core__Result from "@rescript/core/src/Core__Result.mjs";
8
- import * as Belt_MapString from "@rescript/runtime/lib/es6/Belt_MapString.js";
9
- import * as Belt_SetString from "@rescript/runtime/lib/es6/Belt_SetString.js";
10
- import * as InteractionMerger from "../InteractionMerger.mjs";
11
-
12
- Vitest.describe("InteractionMerger", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
13
- let makeBounds = (top, left, bottom, right) => Types.Bounds.make(top, left, bottom, right);
14
- let simpleScene_elements = [
15
- {
16
- TAG: "Button",
17
- id: "submit-btn",
18
- text: "Submit",
19
- position: Types.Position.make(5, 10),
20
- align: "Center",
21
- actions: []
22
- },
23
- {
24
- TAG: "Input",
25
- id: "email",
26
- placeholder: "Email",
27
- position: Types.Position.make(3, 10)
28
- }
29
- ];
30
- let simpleScene = {
31
- id: "login",
32
- title: "Login",
33
- transition: "fade",
34
- device: "Desktop",
35
- elements: simpleScene_elements
36
- };
37
- let nestedScene_elements = [{
38
- TAG: "Box",
39
- name: "Container",
40
- bounds: makeBounds(0, 0, 10, 20),
41
- children: [
42
- {
43
- TAG: "Button",
44
- id: "action-btn",
45
- text: "Action",
46
- position: Types.Position.make(2, 5),
47
- align: "Left",
48
- actions: []
49
- },
50
- {
51
- TAG: "Section",
52
- name: "settings",
53
- children: [{
54
- TAG: "Link",
55
- id: "settings-link",
56
- text: "Settings",
57
- position: Types.Position.make(4, 5),
58
- align: "Left",
59
- actions: []
60
- }]
61
- }
62
- ]
63
- }];
64
- let nestedScene = {
65
- id: "dashboard",
66
- title: "Dashboard",
67
- transition: "slide",
68
- device: "Desktop",
69
- elements: nestedScene_elements
70
- };
71
- let validInteractions = [{
72
- sceneId: "login",
73
- interactions: [
74
- {
75
- elementId: "submit-btn",
76
- properties: Js_dict.fromArray([[
77
- "variant",
78
- "primary"
79
- ]]),
80
- actions: [{
81
- TAG: "Goto",
82
- target: "dashboard",
83
- transition: "slide",
84
- condition: undefined
85
- }]
86
- },
87
- {
88
- elementId: "email",
89
- properties: Object.fromEntries([[
90
- "required",
91
- true
92
- ]]),
93
- actions: []
94
- }
95
- ]
96
- }];
97
- Vitest.describe("collectElementIds", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
98
- Vitest.test("collects ID from Button element", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
99
- let button_2 = Types.Position.make(0, 0);
100
- let button_4 = [];
101
- let button = {
102
- TAG: "Button",
103
- id: "test-btn",
104
- text: "Test",
105
- position: button_2,
106
- align: "Left",
107
- actions: button_4
108
- };
109
- let ids = InteractionMerger.collectElementIds(button);
110
- t.expect(Belt_SetString.has(ids, "test-btn")).toBe(true);
111
- });
112
- Vitest.test("collects ID from Input element", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
113
- let input_2 = Types.Position.make(0, 0);
114
- let input = {
115
- TAG: "Input",
116
- id: "test-input",
117
- placeholder: undefined,
118
- position: input_2
119
- };
120
- let ids = InteractionMerger.collectElementIds(input);
121
- t.expect(Belt_SetString.has(ids, "test-input")).toBe(true);
122
- });
123
- Vitest.test("collects ID from Link element", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
124
- let link_2 = Types.Position.make(0, 0);
125
- let link_4 = [];
126
- let link = {
127
- TAG: "Link",
128
- id: "test-link",
129
- text: "Test Link",
130
- position: link_2,
131
- align: "Left",
132
- actions: link_4
133
- };
134
- let ids = InteractionMerger.collectElementIds(link);
135
- t.expect(Belt_SetString.has(ids, "test-link")).toBe(true);
136
- });
137
- Vitest.test("collects name from Section element", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
138
- let section_1 = [];
139
- let section = {
140
- TAG: "Section",
141
- name: "test-section",
142
- children: section_1
143
- };
144
- let ids = InteractionMerger.collectElementIds(section);
145
- t.expect(Belt_SetString.has(ids, "test-section")).toBe(true);
146
- });
147
- Vitest.test("returns empty set for elements without IDs", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
148
- let checkbox_2 = Types.Position.make(0, 0);
149
- let checkbox = {
150
- TAG: "Checkbox",
151
- checked: true,
152
- label: "Test",
153
- position: checkbox_2
154
- };
155
- let ids = InteractionMerger.collectElementIds(checkbox);
156
- t.expect(Belt_SetString.size(ids)).toBe(0);
157
- });
158
- Vitest.test("recursively collects IDs from Box children", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
159
- let box_0 = "Container";
160
- let box_1 = makeBounds(0, 0, 10, 10);
161
- let box_2 = [
162
- {
163
- TAG: "Button",
164
- id: "btn1",
165
- text: "Button 1",
166
- position: Types.Position.make(2, 2),
167
- align: "Left",
168
- actions: []
169
- },
170
- {
171
- TAG: "Button",
172
- id: "btn2",
173
- text: "Button 2",
174
- position: Types.Position.make(4, 2),
175
- align: "Left",
176
- actions: []
177
- }
178
- ];
179
- let box = {
180
- TAG: "Box",
181
- name: box_0,
182
- bounds: box_1,
183
- children: box_2
184
- };
185
- let ids = InteractionMerger.collectElementIds(box);
186
- t.expect(Belt_SetString.has(ids, "btn1")).toBe(true);
187
- t.expect(Belt_SetString.has(ids, "btn2")).toBe(true);
188
- t.expect(Belt_SetString.size(ids)).toBe(2);
189
- });
190
- Vitest.test("recursively collects IDs from nested Boxes", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
191
- let box_0 = "Outer";
192
- let box_1 = makeBounds(0, 0, 20, 20);
193
- let box_2 = [{
194
- TAG: "Box",
195
- name: "Inner",
196
- bounds: makeBounds(2, 2, 18, 18),
197
- children: [{
198
- TAG: "Input",
199
- id: "nested-input",
200
- placeholder: undefined,
201
- position: Types.Position.make(5, 5)
202
- }]
203
- }];
204
- let box = {
205
- TAG: "Box",
206
- name: box_0,
207
- bounds: box_1,
208
- children: box_2
209
- };
210
- let ids = InteractionMerger.collectElementIds(box);
211
- t.expect(Belt_SetString.has(ids, "nested-input")).toBe(true);
212
- });
213
- Vitest.test("collects IDs from Row children", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
214
- let row_0 = [
215
- {
216
- TAG: "Button",
217
- id: "row-btn1",
218
- text: "Button 1",
219
- position: Types.Position.make(0, 0),
220
- align: "Left",
221
- actions: []
222
- },
223
- {
224
- TAG: "Button",
225
- id: "row-btn2",
226
- text: "Button 2",
227
- position: Types.Position.make(0, 10),
228
- align: "Left",
229
- actions: []
230
- }
231
- ];
232
- let row = {
233
- TAG: "Row",
234
- children: row_0,
235
- align: "Center"
236
- };
237
- let ids = InteractionMerger.collectElementIds(row);
238
- t.expect(Belt_SetString.has(ids, "row-btn1")).toBe(true);
239
- t.expect(Belt_SetString.has(ids, "row-btn2")).toBe(true);
240
- });
241
- Vitest.test("collects IDs from Section and its children", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
242
- let section_1 = [{
243
- TAG: "Link",
244
- id: "section-link",
245
- text: "Link",
246
- position: Types.Position.make(0, 0),
247
- align: "Left",
248
- actions: []
249
- }];
250
- let section = {
251
- TAG: "Section",
252
- name: "my-section",
253
- children: section_1
254
- };
255
- let ids = InteractionMerger.collectElementIds(section);
256
- t.expect(Belt_SetString.has(ids, "my-section")).toBe(true);
257
- t.expect(Belt_SetString.has(ids, "section-link")).toBe(true);
258
- });
259
- });
260
- Vitest.describe("collectSceneElementIds", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
261
- Vitest.test("collects all element IDs from scene", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
262
- let ids = InteractionMerger.collectSceneElementIds(simpleScene);
263
- t.expect(Belt_SetString.has(ids, "submit-btn")).toBe(true);
264
- t.expect(Belt_SetString.has(ids, "email")).toBe(true);
265
- t.expect(Belt_SetString.size(ids)).toBe(2);
266
- });
267
- Vitest.test("collects IDs from nested elements in scene", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
268
- let ids = InteractionMerger.collectSceneElementIds(nestedScene);
269
- t.expect(Belt_SetString.has(ids, "action-btn")).toBe(true);
270
- t.expect(Belt_SetString.has(ids, "settings")).toBe(true);
271
- t.expect(Belt_SetString.has(ids, "settings-link")).toBe(true);
272
- t.expect(Belt_SetString.size(ids)).toBe(3);
273
- });
274
- });
275
- Vitest.describe("buildSceneElementMap", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => Vitest.test("builds map of scene IDs to element IDs", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
276
- let ast = {
277
- scenes: [
278
- simpleScene,
279
- nestedScene
280
- ]
281
- };
282
- let sceneMap = InteractionMerger.buildSceneElementMap(ast);
283
- t.expect(Belt_MapString.size(sceneMap)).toBe(2);
284
- let loginIds = Belt_MapString.get(sceneMap, "login");
285
- t.expect(Core__Option.isSome(loginIds)).toBe(true);
286
- Core__Option.forEach(loginIds, ids => {
287
- t.expect(Belt_SetString.has(ids, "submit-btn")).toBe(true);
288
- t.expect(Belt_SetString.has(ids, "email")).toBe(true);
289
- });
290
- let dashboardIds = Belt_MapString.get(sceneMap, "dashboard");
291
- t.expect(Core__Option.isSome(dashboardIds)).toBe(true);
292
- Core__Option.forEach(dashboardIds, ids => {
293
- t.expect(Belt_SetString.has(ids, "action-btn")).toBe(true);
294
- t.expect(Belt_SetString.has(ids, "settings-link")).toBe(true);
295
- });
296
- }));
297
- Vitest.describe("validateInteractions", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
298
- Vitest.test("returns no errors for valid interactions", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
299
- let ast = {
300
- scenes: [simpleScene]
301
- };
302
- let sceneMap = InteractionMerger.buildSceneElementMap(ast);
303
- let errors = InteractionMerger.validateInteractions(validInteractions, sceneMap);
304
- t.expect(errors.length).toBe(0);
305
- });
306
- Vitest.test("detects missing element", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
307
- let ast = {
308
- scenes: [simpleScene]
309
- };
310
- let sceneMap = InteractionMerger.buildSceneElementMap(ast);
311
- let invalidInteractions = [{
312
- sceneId: "login",
313
- interactions: [{
314
- elementId: "nonexistent-btn",
315
- properties: {},
316
- actions: []
317
- }]
318
- }];
319
- let errors = InteractionMerger.validateInteractions(invalidInteractions, sceneMap);
320
- t.expect(errors.length).toBe(1);
321
- let match = errors[0];
322
- if (match !== undefined) {
323
- switch (match.TAG) {
324
- case "ElementNotFound" :
325
- return t.expect(match.elementId).toBe("nonexistent-btn");
326
- case "DuplicateInteraction" :
327
- case "SceneNotFound" :
328
- break;
329
- }
330
- }
331
- t.expect(true).toBe(false);
332
- });
333
- Vitest.test("detects missing scene", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
334
- let ast = {
335
- scenes: [simpleScene]
336
- };
337
- let sceneMap = InteractionMerger.buildSceneElementMap(ast);
338
- let invalidInteractions = [{
339
- sceneId: "nonexistent-scene",
340
- interactions: [{
341
- elementId: "some-btn",
342
- properties: {},
343
- actions: []
344
- }]
345
- }];
346
- let errors = InteractionMerger.validateInteractions(invalidInteractions, sceneMap);
347
- t.expect(errors.length).toBe(1);
348
- let match = errors[0];
349
- if (match !== undefined) {
350
- switch (match.TAG) {
351
- case "ElementNotFound" :
352
- case "DuplicateInteraction" :
353
- break;
354
- case "SceneNotFound" :
355
- return t.expect(match.sceneId).toBe("nonexistent-scene");
356
- }
357
- }
358
- t.expect(true).toBe(false);
359
- });
360
- Vitest.test("detects duplicate interaction for same element", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
361
- let ast = {
362
- scenes: [simpleScene]
363
- };
364
- let sceneMap = InteractionMerger.buildSceneElementMap(ast);
365
- let duplicateInteractions = [{
366
- sceneId: "login",
367
- interactions: [
368
- {
369
- elementId: "submit-btn",
370
- properties: {},
371
- actions: []
372
- },
373
- {
374
- elementId: "submit-btn",
375
- properties: {},
376
- actions: []
377
- }
378
- ]
379
- }];
380
- let errors = InteractionMerger.validateInteractions(duplicateInteractions, sceneMap);
381
- t.expect(errors.length).toBe(1);
382
- let match = errors[0];
383
- if (match !== undefined) {
384
- switch (match.TAG) {
385
- case "DuplicateInteraction" :
386
- return t.expect(match.elementId).toBe("submit-btn");
387
- case "ElementNotFound" :
388
- case "SceneNotFound" :
389
- break;
390
- }
391
- }
392
- t.expect(true).toBe(false);
393
- });
394
- Vitest.test("reports multiple errors", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
395
- let ast = {
396
- scenes: [simpleScene]
397
- };
398
- let sceneMap = InteractionMerger.buildSceneElementMap(ast);
399
- let multiErrorInteractions = [{
400
- sceneId: "login",
401
- interactions: [
402
- {
403
- elementId: "nonexistent1",
404
- properties: {},
405
- actions: []
406
- },
407
- {
408
- elementId: "nonexistent2",
409
- properties: {},
410
- actions: []
411
- }
412
- ]
413
- }];
414
- let errors = InteractionMerger.validateInteractions(multiErrorInteractions, sceneMap);
415
- t.expect(errors.length).toBe(2);
416
- });
417
- });
418
- Vitest.describe("mergeInteractions", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
419
- Vitest.test("successfully merges valid interactions", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
420
- let ast = {
421
- scenes: [simpleScene]
422
- };
423
- let result = InteractionMerger.mergeInteractions(ast, validInteractions);
424
- t.expect(Core__Result.isOk(result)).toBe(true);
425
- Core__Result.forEach(result, mergedAst => t.expect(mergedAst.scenes.length).toBe(1));
426
- });
427
- Vitest.test("returns error for invalid interactions (hard errors)", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
428
- let ast = {
429
- scenes: [simpleScene]
430
- };
431
- let invalidInteractions = [{
432
- sceneId: "nonexistent-scene",
433
- interactions: [{
434
- elementId: "some-btn",
435
- properties: {},
436
- actions: []
437
- }]
438
- }];
439
- let result = InteractionMerger.mergeInteractions(ast, invalidInteractions);
440
- t.expect(Core__Result.isError(result)).toBe(true);
441
- if (result.TAG === "Ok") {
442
- return t.expect(true).toBe(false);
443
- } else {
444
- return t.expect(result._0.length).toBeGreaterThan(0);
445
- }
446
- });
447
- Vitest.test("preserves scene structure after merge", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
448
- let ast = {
449
- scenes: [simpleScene]
450
- };
451
- let result = InteractionMerger.mergeInteractions(ast, validInteractions);
452
- Core__Result.forEach(result, mergedAst => {
453
- t.expect(Core__Option.map(mergedAst.scenes[0], s => s.id)).toEqual("login");
454
- t.expect(Core__Option.map(mergedAst.scenes[0], s => s.title)).toEqual("Login");
455
- t.expect(Core__Option.map(mergedAst.scenes[0], s => s.elements.length)).toEqual(2);
456
- });
457
- });
458
- Vitest.test("handles multiple scenes with interactions", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
459
- let ast = {
460
- scenes: [
461
- simpleScene,
462
- nestedScene
463
- ]
464
- };
465
- let multiSceneInteractions = [
466
- {
467
- sceneId: "login",
468
- interactions: [{
469
- elementId: "submit-btn",
470
- properties: {},
471
- actions: []
472
- }]
473
- },
474
- {
475
- sceneId: "dashboard",
476
- interactions: [{
477
- elementId: "action-btn",
478
- properties: {},
479
- actions: []
480
- }]
481
- }
482
- ];
483
- let result = InteractionMerger.mergeInteractions(ast, multiSceneInteractions);
484
- t.expect(Core__Result.isOk(result)).toBe(true);
485
- Core__Result.forEach(result, mergedAst => t.expect(mergedAst.scenes.length).toBe(2));
486
- });
487
- Vitest.test("merges empty interactions successfully", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
488
- let ast = {
489
- scenes: [simpleScene]
490
- };
491
- let result = InteractionMerger.mergeInteractions(ast, []);
492
- t.expect(Core__Result.isOk(result)).toBe(true);
493
- });
494
- });
495
- Vitest.describe("formatError", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
496
- Vitest.test("formats ElementNotFound error", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
497
- let message = InteractionMerger.formatError({
498
- TAG: "ElementNotFound",
499
- sceneId: "login",
500
- elementId: "missing-btn",
501
- position: undefined
502
- });
503
- t.expect(message).toContain("missing-btn");
504
- t.expect(message).toContain("login");
505
- });
506
- Vitest.test("formats DuplicateInteraction error", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
507
- let message = InteractionMerger.formatError({
508
- TAG: "DuplicateInteraction",
509
- sceneId: "login",
510
- elementId: "duplicate-btn"
511
- });
512
- t.expect(message).toContain("duplicate-btn");
513
- t.expect(message).toContain("Duplicate");
514
- });
515
- Vitest.test("formats SceneNotFound error", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
516
- let message = InteractionMerger.formatError({
517
- TAG: "SceneNotFound",
518
- sceneId: "missing-scene"
519
- });
520
- t.expect(message).toContain("missing-scene");
521
- t.expect(message).toContain("not found");
522
- });
523
- });
524
- Vitest.describe("formatErrors", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => Vitest.test("formats multiple errors with newlines", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
525
- let errors = [
526
- {
527
- TAG: "ElementNotFound",
528
- sceneId: "login",
529
- elementId: "btn1",
530
- position: undefined
531
- },
532
- {
533
- TAG: "ElementNotFound",
534
- sceneId: "login",
535
- elementId: "btn2",
536
- position: undefined
537
- }
538
- ];
539
- let message = InteractionMerger.formatErrors(errors);
540
- t.expect(message).toContain("btn1");
541
- t.expect(message).toContain("btn2");
542
- t.expect(message).toContain("\n");
543
- }));
544
- Vitest.describe("findInteractionForElement", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
545
- Vitest.test("finds interaction for element", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
546
- let sceneInteractions = {
547
- sceneId: "login",
548
- interactions: [{
549
- elementId: "test-btn",
550
- properties: {},
551
- actions: []
552
- }]
553
- };
554
- let result = InteractionMerger.findInteractionForElement("test-btn", sceneInteractions);
555
- t.expect(Core__Option.isSome(result)).toBe(true);
556
- });
557
- Vitest.test("returns None when element not found", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
558
- let sceneInteractions = {
559
- sceneId: "login",
560
- interactions: [{
561
- elementId: "test-btn",
562
- properties: {},
563
- actions: []
564
- }]
565
- };
566
- let result = InteractionMerger.findInteractionForElement("other-btn", sceneInteractions);
567
- t.expect(Core__Option.isNone(result)).toBe(true);
568
- });
569
- Vitest.test("returns None when no scene interactions", undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, t => {
570
- let result = InteractionMerger.findInteractionForElement("test-btn", undefined);
571
- t.expect(Core__Option.isNone(result)).toBe(true);
572
- });
573
- });
574
- });
575
-
576
- /* Not a pure module */