wyreframe 0.1.0 → 0.1.1

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 (59) 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/test/Expect.mjs +9 -0
  9. package/src/parser/Core/__tests__/Bounds_test.mjs +0 -326
  10. package/src/parser/Core/__tests__/Bounds_test.res +0 -412
  11. package/src/parser/Core/__tests__/Grid_test.mjs +0 -322
  12. package/src/parser/Core/__tests__/Grid_test.res +0 -319
  13. package/src/parser/Core/__tests__/Types_test.mjs +0 -614
  14. package/src/parser/Core/__tests__/Types_test.res +0 -650
  15. package/src/parser/Detector/__tests__/BoxTracer_test.mjs +0 -70
  16. package/src/parser/Detector/__tests__/BoxTracer_test.res +0 -92
  17. package/src/parser/Detector/__tests__/HierarchyBuilder_test.mjs +0 -489
  18. package/src/parser/Detector/__tests__/HierarchyBuilder_test.res +0 -849
  19. package/src/parser/Detector/__tests__/ShapeDetector_test.mjs +0 -377
  20. package/src/parser/Detector/__tests__/ShapeDetector_test.res +0 -563
  21. package/src/parser/Interactions/__tests__/InteractionMerger_test.mjs +0 -576
  22. package/src/parser/Interactions/__tests__/InteractionMerger_test.res +0 -646
  23. package/src/parser/Scanner/__tests__/Grid_manual.mjs +0 -214
  24. package/src/parser/Scanner/__tests__/Grid_manual.res +0 -141
  25. package/src/parser/Semantic/Elements/__tests__/ButtonParser_test.mjs +0 -189
  26. package/src/parser/Semantic/Elements/__tests__/ButtonParser_test.res +0 -257
  27. package/src/parser/Semantic/Elements/__tests__/CheckboxParser_test.mjs +0 -202
  28. package/src/parser/Semantic/Elements/__tests__/CheckboxParser_test.res +0 -250
  29. package/src/parser/Semantic/Elements/__tests__/CodeTextParser_manual.mjs +0 -293
  30. package/src/parser/Semantic/Elements/__tests__/CodeTextParser_manual.res +0 -134
  31. package/src/parser/Semantic/Elements/__tests__/InputParser_test.mjs +0 -253
  32. package/src/parser/Semantic/Elements/__tests__/InputParser_test.res +0 -304
  33. package/src/parser/Semantic/Elements/__tests__/LinkParser_test.mjs +0 -289
  34. package/src/parser/Semantic/Elements/__tests__/LinkParser_test.res +0 -402
  35. package/src/parser/Semantic/Elements/__tests__/TextParser_test.mjs +0 -149
  36. package/src/parser/Semantic/Elements/__tests__/TextParser_test.res +0 -167
  37. package/src/parser/Semantic/__tests__/ASTBuilder_test.mjs +0 -187
  38. package/src/parser/Semantic/__tests__/ASTBuilder_test.res +0 -192
  39. package/src/parser/Semantic/__tests__/ParserRegistry_test.mjs +0 -154
  40. package/src/parser/Semantic/__tests__/ParserRegistry_test.res +0 -191
  41. package/src/parser/Semantic/__tests__/SemanticParser_integration_test.mjs +0 -768
  42. package/src/parser/Semantic/__tests__/SemanticParser_integration_test.res +0 -1069
  43. package/src/parser/Semantic/__tests__/SemanticParser_manual.mjs +0 -1329
  44. package/src/parser/Semantic/__tests__/SemanticParser_manual.res +0 -544
  45. package/src/parser/__tests__/GridScanner_integration.test.mjs +0 -632
  46. package/src/parser/__tests__/GridScanner_integration.test.res +0 -816
  47. package/src/parser/__tests__/Performance.test.mjs +0 -244
  48. package/src/parser/__tests__/Performance.test.res +0 -371
  49. package/src/parser/__tests__/PerformanceFixtures.mjs +0 -200
  50. package/src/parser/__tests__/PerformanceFixtures.res +0 -284
  51. package/src/parser/__tests__/WyreframeParser_integration.test.mjs +0 -770
  52. package/src/parser/__tests__/WyreframeParser_integration.test.res +0 -1008
  53. package/src/parser/__tests__/fixtures/alignment-test.txt +0 -9
  54. package/src/parser/__tests__/fixtures/all-elements.txt +0 -16
  55. package/src/parser/__tests__/fixtures/login-scene.txt +0 -17
  56. package/src/parser/__tests__/fixtures/multi-scene.txt +0 -25
  57. package/src/parser/__tests__/fixtures/nested-boxes.txt +0 -15
  58. package/src/parser/__tests__/fixtures/simple-box.txt +0 -5
  59. 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 */