@scenetest/scenes 0.1.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 (90) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/devices.test.d.ts +2 -0
  3. package/dist/__tests__/devices.test.d.ts.map +1 -0
  4. package/dist/__tests__/devices.test.js +117 -0
  5. package/dist/__tests__/devices.test.js.map +1 -0
  6. package/dist/__tests__/dsl.test.d.ts +2 -0
  7. package/dist/__tests__/dsl.test.d.ts.map +1 -0
  8. package/dist/__tests__/dsl.test.js +385 -0
  9. package/dist/__tests__/dsl.test.js.map +1 -0
  10. package/dist/__tests__/markdown-scene.test.d.ts +2 -0
  11. package/dist/__tests__/markdown-scene.test.d.ts.map +1 -0
  12. package/dist/__tests__/markdown-scene.test.js +508 -0
  13. package/dist/__tests__/markdown-scene.test.js.map +1 -0
  14. package/dist/__tests__/reactive.test.d.ts +2 -0
  15. package/dist/__tests__/reactive.test.d.ts.map +1 -0
  16. package/dist/__tests__/reactive.test.js +383 -0
  17. package/dist/__tests__/reactive.test.js.map +1 -0
  18. package/dist/__tests__/swarm.test.d.ts +2 -0
  19. package/dist/__tests__/swarm.test.d.ts.map +1 -0
  20. package/dist/__tests__/swarm.test.js +214 -0
  21. package/dist/__tests__/swarm.test.js.map +1 -0
  22. package/dist/actor.d.ts +104 -0
  23. package/dist/actor.d.ts.map +1 -0
  24. package/dist/actor.js +527 -0
  25. package/dist/actor.js.map +1 -0
  26. package/dist/cli.d.ts +3 -0
  27. package/dist/cli.d.ts.map +1 -0
  28. package/dist/cli.js +273 -0
  29. package/dist/cli.js.map +1 -0
  30. package/dist/config.d.ts +21 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +120 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/devices.d.ts +55 -0
  35. package/dist/devices.d.ts.map +1 -0
  36. package/dist/devices.js +167 -0
  37. package/dist/devices.js.map +1 -0
  38. package/dist/dsl.d.ts +99 -0
  39. package/dist/dsl.d.ts.map +1 -0
  40. package/dist/dsl.js +247 -0
  41. package/dist/dsl.js.map +1 -0
  42. package/dist/index.d.ts +13 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +16 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/init.d.ts +9 -0
  47. package/dist/init.d.ts.map +1 -0
  48. package/dist/init.js +27 -0
  49. package/dist/init.js.map +1 -0
  50. package/dist/loader.d.ts +2 -0
  51. package/dist/loader.d.ts.map +1 -0
  52. package/dist/loader.js +10 -0
  53. package/dist/loader.js.map +1 -0
  54. package/dist/markdown-scene.d.ts +120 -0
  55. package/dist/markdown-scene.d.ts.map +1 -0
  56. package/dist/markdown-scene.js +452 -0
  57. package/dist/markdown-scene.js.map +1 -0
  58. package/dist/message-bus.d.ts +31 -0
  59. package/dist/message-bus.d.ts.map +1 -0
  60. package/dist/message-bus.js +74 -0
  61. package/dist/message-bus.js.map +1 -0
  62. package/dist/reactive.d.ts +267 -0
  63. package/dist/reactive.d.ts.map +1 -0
  64. package/dist/reactive.js +779 -0
  65. package/dist/reactive.js.map +1 -0
  66. package/dist/runner.d.ts +51 -0
  67. package/dist/runner.d.ts.map +1 -0
  68. package/dist/runner.js +306 -0
  69. package/dist/runner.js.map +1 -0
  70. package/dist/scene.d.ts +40 -0
  71. package/dist/scene.d.ts.map +1 -0
  72. package/dist/scene.js +110 -0
  73. package/dist/scene.js.map +1 -0
  74. package/dist/selectors.d.ts +57 -0
  75. package/dist/selectors.d.ts.map +1 -0
  76. package/dist/selectors.js +193 -0
  77. package/dist/selectors.js.map +1 -0
  78. package/dist/swarm.d.ts +64 -0
  79. package/dist/swarm.d.ts.map +1 -0
  80. package/dist/swarm.js +306 -0
  81. package/dist/swarm.js.map +1 -0
  82. package/dist/team-manager.d.ts +120 -0
  83. package/dist/team-manager.d.ts.map +1 -0
  84. package/dist/team-manager.js +267 -0
  85. package/dist/team-manager.js.map +1 -0
  86. package/dist/types.d.ts +653 -0
  87. package/dist/types.d.ts.map +1 -0
  88. package/dist/types.js +2 -0
  89. package/dist/types.js.map +1 -0
  90. package/package.json +61 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Michael Snook
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=devices.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/devices.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,117 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { DeviceRotation, builtinDevices } from '../devices.js';
3
+ describe('builtinDevices', () => {
4
+ it('contains mobile, tablet, and desktop devices', () => {
5
+ const categories = new Set(builtinDevices.map((d) => d.category));
6
+ expect(categories).toContain('mobile');
7
+ expect(categories).toContain('tablet');
8
+ expect(categories).toContain('desktop');
9
+ });
10
+ it('has at least 2 devices per category', () => {
11
+ const mobile = builtinDevices.filter((d) => d.category === 'mobile');
12
+ const tablet = builtinDevices.filter((d) => d.category === 'tablet');
13
+ const desktop = builtinDevices.filter((d) => d.category === 'desktop');
14
+ expect(mobile.length).toBeGreaterThanOrEqual(2);
15
+ expect(tablet.length).toBeGreaterThanOrEqual(2);
16
+ expect(desktop.length).toBeGreaterThanOrEqual(2);
17
+ });
18
+ it('every device has valid contextOptions with viewport', () => {
19
+ for (const device of builtinDevices) {
20
+ expect(device.name).toBeTruthy();
21
+ expect(device.contextOptions).toBeDefined();
22
+ expect(device.contextOptions.viewport).toBeDefined();
23
+ expect(device.contextOptions.viewport.width).toBeGreaterThan(0);
24
+ expect(device.contextOptions.viewport.height).toBeGreaterThan(0);
25
+ }
26
+ });
27
+ it('mobile devices have isMobile=true and hasTouch=true', () => {
28
+ const mobiles = builtinDevices.filter((d) => d.category === 'mobile');
29
+ for (const device of mobiles) {
30
+ expect(device.contextOptions.isMobile).toBe(true);
31
+ expect(device.contextOptions.hasTouch).toBe(true);
32
+ }
33
+ });
34
+ it('desktop devices have isMobile=false', () => {
35
+ const desktops = builtinDevices.filter((d) => d.category === 'desktop');
36
+ for (const device of desktops) {
37
+ expect(device.contextOptions.isMobile).toBe(false);
38
+ }
39
+ });
40
+ });
41
+ describe('DeviceRotation', () => {
42
+ it('rotates through devices in order', () => {
43
+ const pool = [
44
+ { name: 'A', category: 'mobile', contextOptions: { viewport: { width: 100, height: 200 } } },
45
+ { name: 'B', category: 'tablet', contextOptions: { viewport: { width: 300, height: 400 } } },
46
+ { name: 'C', category: 'desktop', contextOptions: { viewport: { width: 500, height: 600 } } },
47
+ ];
48
+ const rotation = new DeviceRotation(pool);
49
+ expect(rotation.next().name).toBe('A');
50
+ expect(rotation.next().name).toBe('B');
51
+ expect(rotation.next().name).toBe('C');
52
+ });
53
+ it('wraps around when pool is exhausted', () => {
54
+ const pool = [
55
+ { name: 'A', category: 'mobile', contextOptions: { viewport: { width: 100, height: 200 } } },
56
+ { name: 'B', category: 'tablet', contextOptions: { viewport: { width: 300, height: 400 } } },
57
+ ];
58
+ const rotation = new DeviceRotation(pool);
59
+ expect(rotation.next().name).toBe('A');
60
+ expect(rotation.next().name).toBe('B');
61
+ expect(rotation.next().name).toBe('A'); // wraps
62
+ expect(rotation.next().name).toBe('B');
63
+ });
64
+ it('uses builtin devices when no custom pool provided', () => {
65
+ const rotation = new DeviceRotation();
66
+ const first = rotation.next();
67
+ expect(builtinDevices.some((d) => d.name === first.name)).toBe(true);
68
+ });
69
+ it('uses builtin devices when empty array provided', () => {
70
+ const rotation = new DeviceRotation([]);
71
+ const first = rotation.next();
72
+ expect(builtinDevices.some((d) => d.name === first.name)).toBe(true);
73
+ });
74
+ it('peek returns next without advancing', () => {
75
+ const pool = [
76
+ { name: 'A', category: 'mobile', contextOptions: { viewport: { width: 100, height: 200 } } },
77
+ { name: 'B', category: 'tablet', contextOptions: { viewport: { width: 300, height: 400 } } },
78
+ ];
79
+ const rotation = new DeviceRotation(pool);
80
+ expect(rotation.peek().name).toBe('A');
81
+ expect(rotation.peek().name).toBe('A'); // still A
82
+ expect(rotation.next().name).toBe('A'); // now advances
83
+ expect(rotation.peek().name).toBe('B');
84
+ });
85
+ it('reset returns to the beginning', () => {
86
+ const pool = [
87
+ { name: 'A', category: 'mobile', contextOptions: { viewport: { width: 100, height: 200 } } },
88
+ { name: 'B', category: 'tablet', contextOptions: { viewport: { width: 300, height: 400 } } },
89
+ ];
90
+ const rotation = new DeviceRotation(pool);
91
+ rotation.next();
92
+ rotation.next();
93
+ expect(rotation.currentIndex).toBe(2);
94
+ rotation.reset();
95
+ expect(rotation.currentIndex).toBe(0);
96
+ expect(rotation.next().name).toBe('A');
97
+ });
98
+ it('exposes the device pool as readonly', () => {
99
+ const pool = [
100
+ { name: 'A', category: 'mobile', contextOptions: { viewport: { width: 100, height: 200 } } },
101
+ ];
102
+ const rotation = new DeviceRotation(pool);
103
+ expect(rotation.devices).toHaveLength(1);
104
+ expect(rotation.devices[0].name).toBe('A');
105
+ });
106
+ it('different actors in the same run get different devices', () => {
107
+ const rotation = new DeviceRotation();
108
+ const assigned = new Set();
109
+ // Simulate 5 actors getting devices
110
+ for (let i = 0; i < 5; i++) {
111
+ assigned.add(rotation.next().name);
112
+ }
113
+ // With 10 builtin devices and 5 actors, all should be unique
114
+ expect(assigned.size).toBe(5);
115
+ });
116
+ });
117
+ //# sourceMappingURL=devices.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices.test.js","sourceRoot":"","sources":["../../src/__tests__/devices.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAG9D,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;QACjE,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACtC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACtC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAA;QACpE,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAA;QACpE,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAA;QAEtE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;QAC/C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAA;YAChC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAA;YAC3C,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;YACpD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,QAAS,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YAChE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,QAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACnE,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAA;QACrE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACjD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAA;QACvE,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpD,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAoB;YAC5B,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;YAC5F,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;YAC5F,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;SAC9F,CAAA;QAED,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAA;QAEzC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACtC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACtC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAoB;YAC5B,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;YAC5F,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;SAC7F,CAAA;QAED,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAA;QAEzC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACtC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACtC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,QAAQ;QAC/C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAA;QACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,EAAE,CAAC,CAAA;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAA;QAC7B,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAoB;YAC5B,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;YAC5F,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;SAC7F,CAAA;QAED,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAA;QAEzC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACtC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,UAAU;QACjD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,eAAe;QACtD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAoB;YAC5B,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;YAC5F,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;SAC7F,CAAA;QAED,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAA;QACzC,QAAQ,CAAC,IAAI,EAAE,CAAA;QACf,QAAQ,CAAC,IAAI,EAAE,CAAA;QACf,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAErC,QAAQ,CAAC,KAAK,EAAE,CAAA;QAChB,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACrC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAoB;YAC5B,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE;SAC7F,CAAA;QAED,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACxC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAA;QACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;QAElC,oCAAoC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAA;QACpC,CAAC;QAED,6DAA6D;QAC7D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dsl.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsl.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dsl.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,385 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { parseAction, parseDslLines, applyDslAction, } from '../dsl.js';
3
+ import { ConcurrentActorHandleImpl } from '../reactive.js';
4
+ import { MessageBus } from '../message-bus.js';
5
+ // ---------------------------------------------------------------------------
6
+ // Helpers
7
+ // ---------------------------------------------------------------------------
8
+ function mockLocator(visible = true) {
9
+ return {
10
+ waitFor: vi.fn().mockResolvedValue(undefined),
11
+ isVisible: vi.fn().mockResolvedValue(visible),
12
+ click: vi.fn().mockResolvedValue(undefined),
13
+ fill: vi.fn().mockResolvedValue(undefined),
14
+ check: vi.fn().mockResolvedValue(undefined),
15
+ selectOption: vi.fn().mockResolvedValue(undefined),
16
+ evaluate: vi.fn().mockResolvedValue(undefined),
17
+ };
18
+ }
19
+ function mockPage() {
20
+ const locator = mockLocator();
21
+ return {
22
+ goto: vi.fn().mockResolvedValue(undefined),
23
+ getByText: vi.fn().mockReturnValue({ first: () => locator }),
24
+ locator: vi.fn().mockReturnValue(locator),
25
+ evaluate: vi.fn().mockResolvedValue(undefined),
26
+ _locator: locator,
27
+ };
28
+ }
29
+ function createTestActor(role = 'user') {
30
+ const bus = new MessageBus();
31
+ const timeline = [];
32
+ const warnings = [];
33
+ const page = mockPage();
34
+ const actor = new ConcurrentActorHandleImpl(role, { id: `${role}-1`, username: role, email: `${role}@test.com`, password: 'pass' }, page, bus, timeline, warnings, 5000, 60000);
35
+ return { actor, bus, timeline, warnings, page };
36
+ }
37
+ /** Build a minimal DslTarget spy that records calls */
38
+ function createSpyTarget() {
39
+ const calls = [];
40
+ return {
41
+ calls,
42
+ openTo(url) { calls.push(`openTo:${url}`); return this; },
43
+ see(s) { calls.push(`see:${s}`); return this; },
44
+ seeInView(s) { calls.push(`seeInView:${s}`); return this; },
45
+ notSee(s) { calls.push(`notSee:${s}`); return this; },
46
+ seeText(t) { calls.push(`seeText:${t}`); return this; },
47
+ seeToast(s) { calls.push(`seeToast:${s}`); return this; },
48
+ click(s) { calls.push(`click:${s ?? '(scope)'}`); return this; },
49
+ typeInto(s, v) { calls.push(`typeInto:${s}=${v}`); return this; },
50
+ check(s) { calls.push(`check:${s}`); return this; },
51
+ select(s, v) { calls.push(`select:${s}=${v}`); return this; },
52
+ wait(ms) { calls.push(`wait:${ms}`); return this; },
53
+ emit(m) { calls.push(`emit:${m}`); return this; },
54
+ waitFor(m) { calls.push(`waitFor:${m}`); return this; },
55
+ warnIf(s, m) { calls.push(`warnIf:${s}=${m}`); },
56
+ up(s) { calls.push(`up:${s ?? '(root)'}`); return this; },
57
+ prev() { calls.push('prev'); return this; },
58
+ scrollToBottom() { calls.push('scrollToBottom'); return this; },
59
+ };
60
+ }
61
+ // ---------------------------------------------------------------------------
62
+ // Parser tests
63
+ // ---------------------------------------------------------------------------
64
+ describe('parseAction', () => {
65
+ it('parses value-only actions (openTo, seeText, wait, emit)', () => {
66
+ expect(parseAction('openTo /dashboard')).toEqual({ action: 'openTo', value: '/dashboard' });
67
+ expect(parseAction('seeText Hello World')).toEqual({ action: 'seeText', value: 'Hello World' });
68
+ expect(parseAction('wait 500')).toEqual({ action: 'wait', value: '500' });
69
+ expect(parseAction('emit user-ready')).toEqual({ action: 'emit', value: 'user-ready' });
70
+ });
71
+ it('parses selector-only actions (see, seeInView, notSee, click, check, seeToast, up)', () => {
72
+ expect(parseAction('see main-content')).toEqual({ action: 'see', selector: 'main-content' });
73
+ expect(parseAction('seeInView hero-section')).toEqual({ action: 'seeInView', selector: 'hero-section' });
74
+ expect(parseAction('notSee spinner')).toEqual({ action: 'notSee', selector: 'spinner' });
75
+ expect(parseAction('click submit-btn')).toEqual({ action: 'click', selector: 'submit-btn' });
76
+ expect(parseAction('check remember-me')).toEqual({ action: 'check', selector: 'remember-me' });
77
+ expect(parseAction('seeToast success')).toEqual({ action: 'seeToast', selector: 'success' });
78
+ expect(parseAction('up modal')).toEqual({ action: 'up', selector: 'modal' });
79
+ });
80
+ it('parses selector+value actions (typeInto, select, warnIf)', () => {
81
+ // Simple case: single-word selector, single-word value
82
+ expect(parseAction('typeInto email alice@test.com')).toEqual({
83
+ action: 'typeInto', selector: 'email', value: 'alice@test.com',
84
+ });
85
+ expect(parseAction('select role admin')).toEqual({
86
+ action: 'select', selector: 'role', value: 'admin',
87
+ });
88
+ // warnIf with quoted multi-word message
89
+ expect(parseAction("warnIf modal 'should not see this'")).toEqual({
90
+ action: 'warnIf', selector: 'modal', value: 'should not see this',
91
+ });
92
+ });
93
+ it('parses nested selectors with typeInto/select (last token is value)', () => {
94
+ // Multi-word selector, single-word value
95
+ expect(parseAction('typeInto modal search-input hello')).toEqual({
96
+ action: 'typeInto', selector: 'modal search-input', value: 'hello',
97
+ });
98
+ expect(parseAction('select form dropdown option1')).toEqual({
99
+ action: 'select', selector: 'form dropdown', value: 'option1',
100
+ });
101
+ });
102
+ it('parses quoted values (single and double quotes)', () => {
103
+ // Single quotes
104
+ expect(parseAction("typeInto search-input 'hello world'")).toEqual({
105
+ action: 'typeInto', selector: 'search-input', value: 'hello world',
106
+ });
107
+ // Double quotes
108
+ expect(parseAction('typeInto search-input "hello world"')).toEqual({
109
+ action: 'typeInto', selector: 'search-input', value: 'hello world',
110
+ });
111
+ // Nested selector with quoted value
112
+ expect(parseAction("typeInto modal search-input 'hello world'")).toEqual({
113
+ action: 'typeInto', selector: 'modal search-input', value: 'hello world',
114
+ });
115
+ });
116
+ it('handles selector-only for typeInto/select (no value)', () => {
117
+ // Only selector, no value
118
+ expect(parseAction('typeInto email-input')).toEqual({
119
+ action: 'typeInto', selector: 'email-input',
120
+ });
121
+ });
122
+ it('parses no-argument actions', () => {
123
+ expect(parseAction('prev')).toEqual({ action: 'prev' });
124
+ expect(parseAction('scrollToBottom')).toEqual({ action: 'scrollToBottom' });
125
+ expect(parseAction('click')).toEqual({ action: 'click' });
126
+ expect(parseAction('up')).toEqual({ action: 'up' });
127
+ });
128
+ it('parses waitFor as value-only action', () => {
129
+ expect(parseAction('waitFor data-ready')).toEqual({ action: 'waitFor', value: 'data-ready' });
130
+ });
131
+ it('throws on empty input', () => {
132
+ expect(() => parseAction('')).toThrow('Empty action line');
133
+ expect(() => parseAction(' ')).toThrow('Empty action line');
134
+ });
135
+ });
136
+ describe('parseDslLines', () => {
137
+ it('splits multiline text into action lines', () => {
138
+ const lines = parseDslLines(`
139
+ openTo /login
140
+ see login-form
141
+ typeInto email alice@test.com
142
+ click submit
143
+ `);
144
+ expect(lines).toEqual([
145
+ 'openTo /login',
146
+ 'see login-form',
147
+ 'typeInto email alice@test.com',
148
+ 'click submit',
149
+ ]);
150
+ });
151
+ it('skips empty lines and comments', () => {
152
+ const lines = parseDslLines(`
153
+ openTo /login
154
+ # This is a comment
155
+ see form
156
+ // Another comment
157
+
158
+ click submit
159
+ `);
160
+ expect(lines).toEqual(['openTo /login', 'see form', 'click submit']);
161
+ });
162
+ it('returns empty array for empty/whitespace input', () => {
163
+ expect(parseDslLines('')).toEqual([]);
164
+ expect(parseDslLines(' \n \n ')).toEqual([]);
165
+ });
166
+ });
167
+ // ---------------------------------------------------------------------------
168
+ // applyDslAction tests
169
+ // ---------------------------------------------------------------------------
170
+ describe('applyDslAction', () => {
171
+ it('dispatches to correct methods on a DslTarget', () => {
172
+ const target = createSpyTarget();
173
+ applyDslAction(target, { action: 'openTo', value: '/login' });
174
+ applyDslAction(target, { action: 'see', selector: 'form' });
175
+ applyDslAction(target, { action: 'typeInto', selector: 'email', value: 'a@b.com' });
176
+ applyDslAction(target, { action: 'click', selector: 'submit' });
177
+ applyDslAction(target, { action: 'scrollToBottom' });
178
+ applyDslAction(target, { action: 'prev' });
179
+ expect(target.calls).toEqual([
180
+ 'openTo:/login',
181
+ 'see:form',
182
+ 'typeInto:email=a@b.com',
183
+ 'click:submit',
184
+ 'scrollToBottom',
185
+ 'prev',
186
+ ]);
187
+ });
188
+ it('dispatches bare click (no selector)', () => {
189
+ const target = createSpyTarget();
190
+ applyDslAction(target, { action: 'click' });
191
+ expect(target.calls).toEqual(['click:(scope)']);
192
+ });
193
+ it('dispatches seeInView', () => {
194
+ const target = createSpyTarget();
195
+ applyDslAction(target, { action: 'seeInView', selector: 'hero' });
196
+ expect(target.calls).toEqual(['seeInView:hero']);
197
+ });
198
+ it('dispatches bare up (no selector) for page root reset', () => {
199
+ const target = createSpyTarget();
200
+ applyDslAction(target, { action: 'up' });
201
+ expect(target.calls).toEqual(['up:(root)']);
202
+ });
203
+ it('dispatches up with selector', () => {
204
+ const target = createSpyTarget();
205
+ applyDslAction(target, { action: 'up', selector: '~container' });
206
+ expect(target.calls).toEqual(['up:~container']);
207
+ });
208
+ it('dispatches waitFor on targets that support it', () => {
209
+ const target = createSpyTarget();
210
+ target.waitFor = (m) => { target.calls.push(`waitFor:${m}`); };
211
+ applyDslAction(target, { action: 'waitFor', value: 'setup-done' });
212
+ expect(target.calls).toEqual(['waitFor:setup-done']);
213
+ });
214
+ it('throws on unknown action', () => {
215
+ const target = createSpyTarget();
216
+ expect(() => applyDslAction(target, { action: 'flyTo' })).toThrow('Unknown DSL action: flyTo');
217
+ });
218
+ it('throws when required arguments are missing', () => {
219
+ const target = createSpyTarget();
220
+ expect(() => applyDslAction(target, { action: 'openTo' })).toThrow('openTo requires a URL');
221
+ expect(() => applyDslAction(target, { action: 'see' })).toThrow('see requires a selector');
222
+ expect(() => applyDslAction(target, { action: 'typeInto', selector: 'x' })).toThrow('typeInto requires a value');
223
+ });
224
+ });
225
+ // ---------------------------------------------------------------------------
226
+ // actor.dsl() method on ConcurrentActorHandleImpl
227
+ // ---------------------------------------------------------------------------
228
+ describe('ConcurrentActorHandleImpl.dsl()', () => {
229
+ it('queues actions from a multiline text DSL string', () => {
230
+ const { actor } = createTestActor();
231
+ actor.dsl(`
232
+ openTo /login
233
+ see login-form
234
+ typeInto email alice@test.com
235
+ click submit
236
+ `);
237
+ expect(actor.pending).toBe(4);
238
+ });
239
+ it('returns the actor for chaining', () => {
240
+ const { actor } = createTestActor();
241
+ const result = actor.dsl(`
242
+ openTo /login
243
+ `);
244
+ expect(result).toBe(actor);
245
+ });
246
+ it('can be chained with other DSL methods', () => {
247
+ const { actor } = createTestActor();
248
+ actor
249
+ .dsl(`
250
+ openTo /login
251
+ see login-form
252
+ `)
253
+ .click('submit')
254
+ .see('dashboard');
255
+ expect(actor.pending).toBe(4);
256
+ });
257
+ it('skips comments and empty lines', () => {
258
+ const { actor } = createTestActor();
259
+ actor.dsl(`
260
+ # Navigate
261
+ openTo /
262
+
263
+ // Verify
264
+ see welcome-box
265
+ `);
266
+ expect(actor.pending).toBe(2);
267
+ });
268
+ it('works with dsl() before manual method calls and drains correctly', async () => {
269
+ const { actor } = createTestActor();
270
+ const order = [];
271
+ actor.dsl(`
272
+ openTo /
273
+ `);
274
+ actor.do(async () => { order.push('after-dsl'); });
275
+ await actor.drain();
276
+ // openTo and do both executed
277
+ expect(order).toEqual(['after-dsl']);
278
+ });
279
+ it('queues actions in correct order when mixed with method calls', () => {
280
+ const { actor } = createTestActor();
281
+ actor.openTo('/');
282
+ actor.dsl(`
283
+ see header
284
+ click menu
285
+ `);
286
+ actor.see('page-content');
287
+ // 1 openTo + 2 dsl + 1 see = 4
288
+ expect(actor.pending).toBe(4);
289
+ });
290
+ // -------------------------------------------------------------------------
291
+ // Interpolation tests
292
+ // -------------------------------------------------------------------------
293
+ it('interpolates [self.field] with actor own fields', () => {
294
+ const { actor, page } = createTestActor('alice');
295
+ actor.dsl(`
296
+ typeInto email [self.email]
297
+ typeInto username [self.username]
298
+ `);
299
+ expect(actor.pending).toBe(2);
300
+ // We can verify the interpolated values by draining and checking fill calls
301
+ });
302
+ it('interpolates [role.field] with other actor fields', () => {
303
+ const bus = new MessageBus();
304
+ const timeline = [];
305
+ const warnings = [];
306
+ // Create alice
307
+ const alicePage = mockPage();
308
+ const alice = new ConcurrentActorHandleImpl('alice', { id: 'alice-1', username: 'alice_user', email: 'alice@test.com', password: 'pass' }, alicePage, bus, timeline, warnings, 5000, 60000);
309
+ // Create bob
310
+ const bobPage = mockPage();
311
+ const bob = new ConcurrentActorHandleImpl('bob', { id: 'bob-1', username: 'bob_user', email: 'bob@test.com', password: 'pass' }, bobPage, bus, timeline, warnings, 5000, 60000);
312
+ // Set up actor registry
313
+ const registry = new Map();
314
+ registry.set('alice', alice);
315
+ registry.set('bob', bob);
316
+ alice._setActorRegistry(registry);
317
+ bob._setActorRegistry(registry);
318
+ // Alice references bob's username
319
+ alice.dsl(`
320
+ typeInto search-input [bob.username]
321
+ see user-card-[bob.id]
322
+ `);
323
+ expect(alice.pending).toBe(2);
324
+ });
325
+ it('escapes interpolated values to prevent selector injection', () => {
326
+ const bus = new MessageBus();
327
+ const timeline = [];
328
+ const warnings = [];
329
+ const page = mockPage();
330
+ // Create actor with potentially dangerous field values
331
+ const actor = new ConcurrentActorHandleImpl('hacker', {
332
+ id: 'user-1',
333
+ username: "test[inject]'value",
334
+ email: 'test@test.com',
335
+ password: 'pass',
336
+ }, page, bus, timeline, warnings, 5000, 60000);
337
+ // Self-reference with dangerous characters should be escaped
338
+ actor.dsl(`
339
+ see user-card-[self.username]
340
+ `);
341
+ expect(actor.pending).toBe(1);
342
+ // The brackets and quotes in username should be escaped
343
+ });
344
+ it('throws on unknown [self.field] reference', () => {
345
+ const { actor } = createTestActor();
346
+ expect(() => {
347
+ actor.dsl('typeInto input [self.nonexistent]');
348
+ }).toThrow('[self.nonexistent]');
349
+ });
350
+ it('throws on unknown [role.field] when actor not in registry', () => {
351
+ const { actor } = createTestActor();
352
+ // No registry set - should throw
353
+ expect(() => {
354
+ actor.dsl('typeInto input [bob.username]');
355
+ }).toThrow('cannot reference other actors outside a scene context');
356
+ });
357
+ it('throws on unknown actor in [role.field] reference', () => {
358
+ const bus = new MessageBus();
359
+ const timeline = [];
360
+ const warnings = [];
361
+ const page = mockPage();
362
+ const actor = new ConcurrentActorHandleImpl('alice', { id: 'alice-1', username: 'alice', email: 'alice@test.com', password: 'pass' }, page, bus, timeline, warnings, 5000, 60000);
363
+ // Set up registry with only alice
364
+ const registry = new Map();
365
+ registry.set('alice', actor);
366
+ actor._setActorRegistry(registry);
367
+ expect(() => {
368
+ actor.dsl('typeInto input [bob.username]');
369
+ }).toThrow('unknown actor "bob"');
370
+ });
371
+ it('supports compound selectors with interpolation', () => {
372
+ const bus = new MessageBus();
373
+ const timeline = [];
374
+ const warnings = [];
375
+ const page = mockPage();
376
+ const actor = new ConcurrentActorHandleImpl('alice', { id: '12345', username: 'alice', email: 'alice@test.com', password: 'pass' }, page, bus, timeline, warnings, 5000, 60000);
377
+ // Use self reference in compound selector
378
+ actor.dsl(`
379
+ see user-result-[self.id]
380
+ click delete-btn-[self.id]
381
+ `);
382
+ expect(actor.pending).toBe(2);
383
+ });
384
+ });
385
+ //# sourceMappingURL=dsl.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsl.test.js","sourceRoot":"","sources":["../../src/__tests__/dsl.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=markdown-scene.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-scene.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/markdown-scene.test.ts"],"names":[],"mappings":""}