@scenetest/vite-plugin 0.5.0 → 0.7.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.
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Self-contained HTML dashboard page with swim-lane timeline.
3
+ * Connects to /__scenetest/events via SSE for real-time updates.
4
+ */
5
+ export declare function generateDashboardHtml(): string;
6
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CA+5B9C"}
@@ -0,0 +1,933 @@
1
+ /**
2
+ * Self-contained HTML dashboard page with swim-lane timeline.
3
+ * Connects to /__scenetest/events via SSE for real-time updates.
4
+ */
5
+ export function generateDashboardHtml() {
6
+ return `<!DOCTYPE html>
7
+ <html lang="en">
8
+ <head>
9
+ <meta charset="UTF-8">
10
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
11
+ <title>Scenetest Dashboard</title>
12
+ <style>
13
+ :root {
14
+ --bg: #0f1117;
15
+ --bg2: #1a1d27;
16
+ --bg3: #252833;
17
+ --border: #2e3140;
18
+ --text: #e1e4ed;
19
+ --text2: #8b8fa3;
20
+ --green: #22c55e;
21
+ --red: #ef4444;
22
+ --amber: #f59e0b;
23
+ --blue: #3b82f6;
24
+ --purple: #8b5cf6;
25
+ --cyan: #06b6d4;
26
+ }
27
+
28
+ * { margin: 0; padding: 0; box-sizing: border-box; }
29
+
30
+ body {
31
+ font-family: 'SF Mono', 'Cascadia Code', 'Fira Code', monospace;
32
+ background: var(--bg);
33
+ color: var(--text);
34
+ min-height: 100vh;
35
+ }
36
+
37
+ header {
38
+ position: sticky;
39
+ top: 0;
40
+ padding: 16px 24px;
41
+ border-bottom: 1px solid var(--border);
42
+ display: flex;
43
+ align-items: center;
44
+ gap: 16px;
45
+ background: var(--bg2);
46
+ z-index: 100;
47
+ }
48
+
49
+ header h1 {
50
+ font-size: 16px;
51
+ font-weight: 600;
52
+ display: flex;
53
+ align-items: center;
54
+ gap: 8px;
55
+ }
56
+
57
+ .logo {
58
+ display: inline-flex;
59
+ align-items: center;
60
+ justify-content: center;
61
+ width: 28px;
62
+ height: 28px;
63
+ border-radius: 6px;
64
+ background: rgba(80, 70, 229, 0.15);
65
+ box-shadow: inset 0 1px 4px rgba(80, 70, 229, 0.3);
66
+ font-size: 14px;
67
+ }
68
+
69
+ .status-bar {
70
+ display: flex;
71
+ gap: 16px;
72
+ margin-left: auto;
73
+ font-size: 13px;
74
+ }
75
+
76
+ .stat {
77
+ display: flex;
78
+ align-items: center;
79
+ gap: 4px;
80
+ }
81
+
82
+ .stat .label { color: var(--text2); }
83
+ .stat .value { font-weight: 600; }
84
+ .stat.pass .value { color: var(--green); }
85
+ .stat.fail .value { color: var(--red); }
86
+
87
+ .connection {
88
+ width: 8px;
89
+ height: 8px;
90
+ border-radius: 50%;
91
+ background: var(--amber);
92
+ transition: background 0.3s;
93
+ }
94
+ .connection.connected { background: var(--green); }
95
+ .connection.disconnected { background: var(--red); }
96
+
97
+ /* ─── Replay buttons ─────────────────────────────── */
98
+ .replay-btn {
99
+ display: inline-flex;
100
+ align-items: center;
101
+ gap: 5px;
102
+ padding: 4px 12px;
103
+ border: 1px solid var(--border);
104
+ border-radius: 4px;
105
+ background: transparent;
106
+ color: var(--text2);
107
+ font-family: inherit;
108
+ font-size: 12px;
109
+ cursor: pointer;
110
+ transition: all 0.15s;
111
+ }
112
+
113
+ .replay-btn:hover {
114
+ background: rgba(59, 130, 246, 0.15);
115
+ border-color: var(--blue);
116
+ color: var(--blue);
117
+ }
118
+
119
+ .replay-btn:disabled {
120
+ opacity: 0.4;
121
+ cursor: not-allowed;
122
+ }
123
+
124
+ .replay-btn:disabled:hover {
125
+ background: transparent;
126
+ border-color: var(--border);
127
+ color: var(--text2);
128
+ }
129
+
130
+ .replay-btn .play-icon {
131
+ font-size: 10px;
132
+ }
133
+
134
+ .replay-all-btn {
135
+ margin-left: 12px;
136
+ }
137
+
138
+ .scene-replay-btn {
139
+ margin-left: auto;
140
+ }
141
+
142
+ .stop-btn, .pause-btn {
143
+ display: none;
144
+ align-items: center;
145
+ gap: 5px;
146
+ padding: 4px 12px;
147
+ border: 1px solid var(--border);
148
+ border-radius: 4px;
149
+ background: transparent;
150
+ color: var(--text2);
151
+ font-family: inherit;
152
+ font-size: 12px;
153
+ cursor: pointer;
154
+ transition: all 0.15s;
155
+ }
156
+
157
+ .stop-btn:hover {
158
+ background: rgba(239, 68, 68, 0.15);
159
+ border-color: var(--red);
160
+ color: var(--red);
161
+ }
162
+
163
+ .pause-btn:hover {
164
+ background: rgba(245, 158, 11, 0.15);
165
+ border-color: var(--amber);
166
+ color: var(--amber);
167
+ }
168
+
169
+ .stop-btn .btn-icon, .pause-btn .btn-icon {
170
+ font-size: 10px;
171
+ }
172
+
173
+ .running .stop-btn, .running .pause-btn {
174
+ display: inline-flex;
175
+ }
176
+
177
+ /* ─── Progress bar ───────────────────────────────── */
178
+ .progress-bar {
179
+ position: absolute;
180
+ bottom: 0;
181
+ left: 0;
182
+ right: 0;
183
+ height: 3px;
184
+ background: var(--border);
185
+ display: none;
186
+ }
187
+
188
+ .progress-bar.visible {
189
+ display: block;
190
+ }
191
+
192
+ .progress-bar .progress-fill {
193
+ height: 100%;
194
+ background: var(--blue);
195
+ transition: width 0.3s ease;
196
+ width: 0%;
197
+ }
198
+
199
+ .progress-bar.done .progress-fill {
200
+ background: var(--green);
201
+ }
202
+
203
+ .progress-bar.has-failures .progress-fill {
204
+ background: var(--red);
205
+ }
206
+
207
+ main {
208
+ padding: 24px;
209
+ }
210
+
211
+ .waiting {
212
+ text-align: center;
213
+ padding: 80px 24px;
214
+ color: var(--text2);
215
+ }
216
+
217
+ .waiting h2 {
218
+ font-size: 18px;
219
+ font-weight: 500;
220
+ margin-bottom: 8px;
221
+ }
222
+
223
+ .waiting p {
224
+ font-size: 13px;
225
+ }
226
+
227
+ /* ─── Scene sections ──────────────────────────────── */
228
+ .scene-section {
229
+ margin-bottom: 32px;
230
+ }
231
+
232
+ .scene-header {
233
+ display: flex;
234
+ align-items: center;
235
+ gap: 10px;
236
+ padding: 10px 14px;
237
+ background: var(--bg2);
238
+ border: 1px solid var(--border);
239
+ border-radius: 8px 8px 0 0;
240
+ font-size: 13px;
241
+ }
242
+
243
+ .scene-header .icon {
244
+ font-size: 14px;
245
+ }
246
+
247
+ .scene-header .name {
248
+ font-weight: 600;
249
+ }
250
+
251
+ .scene-header .file {
252
+ color: var(--text2);
253
+ margin-left: auto;
254
+ font-size: 12px;
255
+ }
256
+
257
+ .scene-header .duration {
258
+ color: var(--text2);
259
+ font-size: 12px;
260
+ }
261
+
262
+ /* ─── Scene errors ────────────────────────────────── */
263
+ .scene-errors {
264
+ border: 1px solid var(--border);
265
+ border-top: none;
266
+ background: rgba(239, 68, 68, 0.05);
267
+ padding: 8px 14px;
268
+ display: flex;
269
+ flex-direction: column;
270
+ gap: 4px;
271
+ }
272
+
273
+ .scene-error-line {
274
+ font-size: 12px;
275
+ color: var(--red);
276
+ display: flex;
277
+ align-items: baseline;
278
+ gap: 8px;
279
+ line-height: 1.4;
280
+ }
281
+
282
+ .scene-error-line .error-icon {
283
+ flex-shrink: 0;
284
+ font-size: 10px;
285
+ }
286
+
287
+ .scene-error-line .error-action {
288
+ color: var(--text2);
289
+ flex-shrink: 0;
290
+ }
291
+
292
+ .scene-error-line .error-msg {
293
+ word-break: break-word;
294
+ }
295
+
296
+ /* ─── Swim lanes ──────────────────────────────────── */
297
+ .swim-lanes {
298
+ border: 1px solid var(--border);
299
+ border-top: none;
300
+ }
301
+
302
+ .lane {
303
+ display: flex;
304
+ align-items: stretch;
305
+ border-bottom: 1px solid var(--border);
306
+ min-height: 48px;
307
+ }
308
+
309
+ .lane:last-child {
310
+ border-bottom: none;
311
+ }
312
+
313
+ .lane-label {
314
+ width: 120px;
315
+ min-width: 120px;
316
+ padding: 8px 14px;
317
+ background: var(--bg2);
318
+ border-right: 1px solid var(--border);
319
+ display: flex;
320
+ align-items: center;
321
+ font-size: 12px;
322
+ font-weight: 600;
323
+ color: var(--cyan);
324
+ }
325
+
326
+ .lane-track {
327
+ flex: 1;
328
+ position: relative;
329
+ padding: 6px 8px;
330
+ min-height: 48px;
331
+ }
332
+
333
+ .action-bar {
334
+ display: inline-flex;
335
+ align-items: center;
336
+ height: 28px;
337
+ margin: 3px 2px;
338
+ padding: 0 8px;
339
+ border-radius: 4px;
340
+ font-size: 11px;
341
+ white-space: nowrap;
342
+ position: relative;
343
+ transition: opacity 0.2s;
344
+ cursor: default;
345
+ }
346
+
347
+ .action-bar.success {
348
+ background: rgba(34, 197, 94, 0.15);
349
+ border: 1px solid rgba(34, 197, 94, 0.3);
350
+ color: var(--green);
351
+ }
352
+
353
+ .action-bar.error {
354
+ background: rgba(239, 68, 68, 0.15);
355
+ border: 1px solid rgba(239, 68, 68, 0.3);
356
+ color: var(--red);
357
+ }
358
+
359
+ .action-bar.running {
360
+ background: rgba(59, 130, 246, 0.15);
361
+ border: 1px solid rgba(59, 130, 246, 0.3);
362
+ color: var(--blue);
363
+ animation: pulse 1.5s ease-in-out infinite;
364
+ }
365
+
366
+ .action-bar.slow {
367
+ background: rgba(245, 158, 11, 0.15);
368
+ border: 1px solid rgba(245, 158, 11, 0.3);
369
+ color: var(--amber);
370
+ }
371
+
372
+ .action-bar .duration {
373
+ margin-left: 6px;
374
+ opacity: 0.7;
375
+ font-size: 10px;
376
+ }
377
+
378
+ .action-bar:hover::after {
379
+ content: attr(data-tooltip);
380
+ position: absolute;
381
+ bottom: calc(100% + 4px);
382
+ left: 0;
383
+ background: var(--bg3);
384
+ border: 1px solid var(--border);
385
+ border-radius: 4px;
386
+ padding: 4px 8px;
387
+ font-size: 11px;
388
+ white-space: nowrap;
389
+ z-index: 50;
390
+ color: var(--text);
391
+ pointer-events: none;
392
+ }
393
+
394
+ /* ─── Assertion markers ───────────────────────────── */
395
+ .assertion-marker {
396
+ display: inline-flex;
397
+ align-items: center;
398
+ justify-content: center;
399
+ width: 20px;
400
+ height: 20px;
401
+ margin: 7px 1px;
402
+ border-radius: 3px;
403
+ font-size: 10px;
404
+ cursor: default;
405
+ }
406
+
407
+ .assertion-marker.pass {
408
+ background: rgba(34, 197, 94, 0.2);
409
+ color: var(--green);
410
+ }
411
+
412
+ .assertion-marker.fail {
413
+ background: rgba(239, 68, 68, 0.2);
414
+ color: var(--red);
415
+ }
416
+
417
+ /* ─── Time ruler ──────────────────────────────────── */
418
+ .time-ruler {
419
+ display: flex;
420
+ align-items: stretch;
421
+ border-bottom: 1px solid var(--border);
422
+ height: 24px;
423
+ background: var(--bg2);
424
+ }
425
+
426
+ .time-ruler .lane-label {
427
+ height: 24px;
428
+ min-height: 24px;
429
+ }
430
+
431
+ .time-ruler .ruler-track {
432
+ flex: 1;
433
+ position: relative;
434
+ overflow: hidden;
435
+ }
436
+
437
+ .tick {
438
+ position: absolute;
439
+ top: 0;
440
+ height: 100%;
441
+ border-left: 1px solid var(--border);
442
+ font-size: 9px;
443
+ color: var(--text2);
444
+ padding-left: 4px;
445
+ line-height: 24px;
446
+ }
447
+
448
+ /* ─── Event log ───────────────────────────────────── */
449
+ .event-log {
450
+ margin-top: 24px;
451
+ }
452
+
453
+ .event-log h3 {
454
+ font-size: 13px;
455
+ font-weight: 600;
456
+ margin-bottom: 8px;
457
+ color: var(--text2);
458
+ }
459
+
460
+ .log-entry {
461
+ font-size: 12px;
462
+ padding: 3px 0;
463
+ color: var(--text2);
464
+ display: flex;
465
+ gap: 8px;
466
+ }
467
+
468
+ .log-entry .ts {
469
+ color: var(--text2);
470
+ opacity: 0.6;
471
+ min-width: 70px;
472
+ }
473
+
474
+ .log-entry .actor {
475
+ color: var(--cyan);
476
+ min-width: 80px;
477
+ }
478
+
479
+ .log-entry .msg { color: var(--text); }
480
+ .log-entry.error .msg { color: var(--red); }
481
+ .log-entry.pass .msg { color: var(--green); }
482
+
483
+ @keyframes pulse {
484
+ 0%, 100% { opacity: 1; }
485
+ 50% { opacity: 0.6; }
486
+ }
487
+ </style>
488
+ </head>
489
+ <body>
490
+ <header>
491
+ <h1><span class="logo">S</span> Scenetest Dashboard</h1>
492
+ <button class="replay-btn replay-all-btn" id="replay-all" onclick="replayAll()">
493
+ <span class="play-icon">&#9654;</span> Replay All
494
+ </button>
495
+ <button class="pause-btn" id="pause-btn" onclick="togglePause()">
496
+ <span class="btn-icon" id="pause-icon">&#9646;&#9646;</span> <span id="pause-label">Pause</span>
497
+ </button>
498
+ <button class="stop-btn" id="stop-btn" onclick="stopRun()">
499
+ <span class="btn-icon">&#9632;</span> Stop
500
+ </button>
501
+ <div class="status-bar">
502
+ <div class="stat scenes">
503
+ <span class="label">Scenes:</span>
504
+ <span class="value" id="scene-count">0</span>
505
+ </div>
506
+ <div class="stat pass">
507
+ <span class="label">Pass:</span>
508
+ <span class="value" id="pass-count">0</span>
509
+ </div>
510
+ <div class="stat fail">
511
+ <span class="label">Fail:</span>
512
+ <span class="value" id="fail-count">0</span>
513
+ </div>
514
+ <div class="stat">
515
+ <span class="label">Time:</span>
516
+ <span class="value" id="elapsed">-</span>
517
+ </div>
518
+ <div class="connection" id="connection" title="SSE connection"></div>
519
+ </div>
520
+ <div class="progress-bar" id="progress-bar"><div class="progress-fill" id="progress-fill"></div></div>
521
+ </header>
522
+
523
+ <main id="main">
524
+ <div class="waiting" id="waiting">
525
+ <h2>Waiting for scene run...</h2>
526
+ <p>Run <code>scenetest</code> to see the live timeline here.</p>
527
+ </div>
528
+ <div id="scenes"></div>
529
+ </main>
530
+
531
+ <script>
532
+ // ─── State ────────────────────────────────────────
533
+ const state = {
534
+ scenes: [], // { name, file, actors, actions: Map<actor, []>, assertions: [], startTime, endTime, status }
535
+ currentScene: null,
536
+ runStartTime: null,
537
+ passCount: 0,
538
+ failCount: 0,
539
+ sceneCount: 0,
540
+ }
541
+
542
+ // ─── SSE Connection ───────────────────────────────
543
+ const evtSource = new EventSource('/__scenetest/events')
544
+ const connEl = document.getElementById('connection')
545
+
546
+ evtSource.onopen = () => {
547
+ connEl.classList.add('connected')
548
+ connEl.classList.remove('disconnected')
549
+ connEl.title = 'Connected'
550
+ }
551
+
552
+ evtSource.onerror = () => {
553
+ connEl.classList.add('disconnected')
554
+ connEl.classList.remove('connected')
555
+ connEl.title = 'Disconnected — retrying...'
556
+ }
557
+
558
+ evtSource.onmessage = (e) => {
559
+ try {
560
+ const event = JSON.parse(e.data)
561
+ handleEvent(event)
562
+ } catch {}
563
+ }
564
+
565
+ // ─── Event handling ───────────────────────────────
566
+ function handleEvent(event) {
567
+ switch (event.type) {
568
+ case 'run:start':
569
+ // Clear previous run
570
+ state.scenes = []
571
+ state.currentScene = null
572
+ state.runStartTime = event.timestamp
573
+ state.passCount = 0
574
+ state.failCount = 0
575
+ state.sceneCount = event.sceneCount
576
+ document.getElementById('waiting').style.display = 'none'
577
+ document.getElementById('scenes').innerHTML = ''
578
+ setRunning(true)
579
+ updateStats()
580
+ break
581
+
582
+ case 'scene:start': {
583
+ const scene = {
584
+ name: event.name,
585
+ file: event.file,
586
+ actors: event.actors || [],
587
+ actions: new Map(),
588
+ assertions: [],
589
+ startTime: event.timestamp,
590
+ endTime: null,
591
+ status: 'running',
592
+ }
593
+ // Initialize lanes for declared actors
594
+ for (const actor of scene.actors) {
595
+ scene.actions.set(actor, [])
596
+ }
597
+ state.scenes.push(scene)
598
+ state.currentScene = scene
599
+ renderScene(scene)
600
+ // Auto-scroll to keep the running scene visible
601
+ var sceneEl = document.getElementById('scene-' + (state.scenes.length - 1))
602
+ if (sceneEl) sceneEl.scrollIntoView({ behavior: 'smooth', block: 'start' })
603
+ break
604
+ }
605
+
606
+ case 'action:start': {
607
+ const scene = state.currentScene
608
+ if (!scene) break
609
+ // Ensure lane exists for this actor
610
+ if (!scene.actions.has(event.actor)) {
611
+ scene.actions.set(event.actor, [])
612
+ scene.actors.push(event.actor)
613
+ }
614
+ const actions = scene.actions.get(event.actor)
615
+ actions.push({
616
+ action: event.action,
617
+ target: event.target,
618
+ startTime: event.timestamp,
619
+ endTime: null,
620
+ duration: null,
621
+ error: null,
622
+ status: 'running',
623
+ })
624
+ renderScene(scene)
625
+ break
626
+ }
627
+
628
+ case 'action:end': {
629
+ const scene = state.currentScene
630
+ if (!scene) break
631
+ const actions = scene.actions.get(event.actor)
632
+ if (!actions) break
633
+ // Find the running action (last one that matches)
634
+ for (let i = actions.length - 1; i >= 0; i--) {
635
+ if (actions[i].status === 'running' && actions[i].action === event.action) {
636
+ actions[i].endTime = event.timestamp
637
+ actions[i].duration = event.duration
638
+ actions[i].error = event.error || null
639
+ actions[i].status = event.error ? 'error' : (event.duration > 500 ? 'slow' : 'success')
640
+ break
641
+ }
642
+ }
643
+ renderScene(scene)
644
+ break
645
+ }
646
+
647
+ case 'assertion': {
648
+ const scene = state.currentScene
649
+ if (!scene) break
650
+ scene.assertions.push({
651
+ actor: event.actor,
652
+ description: event.description,
653
+ result: event.result,
654
+ timestamp: event.timestamp,
655
+ })
656
+ if (event.result) state.passCount++
657
+ else state.failCount++
658
+ updateStats()
659
+ renderScene(scene)
660
+ break
661
+ }
662
+
663
+ case 'scene:end': {
664
+ const scene = state.currentScene
665
+ if (!scene) break
666
+ scene.endTime = event.timestamp
667
+ scene.status = event.status
668
+ scene.duration = event.duration
669
+ scene.error = event.error
670
+ state.currentScene = null
671
+ renderScene(scene)
672
+ updateStats()
673
+ break
674
+ }
675
+
676
+ case 'run:end':
677
+ state.sceneCount = event.summary?.scenes || state.sceneCount
678
+ state.passCount = event.summary?.assertions?.passed || state.passCount
679
+ state.failCount = event.summary?.assertions?.failed || state.failCount
680
+ document.getElementById('elapsed').textContent = event.duration + 'ms'
681
+ setRunning(false)
682
+ updateStats()
683
+ break
684
+ }
685
+ }
686
+
687
+ // ─── Stats ────────────────────────────────────────
688
+ function updateStats() {
689
+ const completed = state.scenes.filter(s => s.status !== 'running').length
690
+ document.getElementById('scene-count').textContent =
691
+ completed + '/' + state.sceneCount
692
+ document.getElementById('pass-count').textContent = state.passCount
693
+ document.getElementById('fail-count').textContent = state.failCount
694
+
695
+ if (state.runStartTime && state.scenes.some(s => s.status === 'running')) {
696
+ document.getElementById('elapsed').textContent =
697
+ (Date.now() - state.runStartTime) + 'ms'
698
+ }
699
+
700
+ // Progress bar
701
+ var bar = document.getElementById('progress-bar')
702
+ var fill = document.getElementById('progress-fill')
703
+ if (state.sceneCount > 0) {
704
+ bar.classList.add('visible')
705
+ var pct = Math.round((completed / state.sceneCount) * 100)
706
+ fill.style.width = pct + '%'
707
+ bar.classList.toggle('done', completed === state.sceneCount && state.failCount === 0)
708
+ bar.classList.toggle('has-failures', state.failCount > 0)
709
+ }
710
+ }
711
+
712
+ // Update elapsed timer
713
+ setInterval(() => {
714
+ if (state.runStartTime && state.scenes.some(s => s.status === 'running')) {
715
+ document.getElementById('elapsed').textContent =
716
+ (Date.now() - state.runStartTime) + 'ms'
717
+ }
718
+ }, 200)
719
+
720
+ // ─── Rendering ────────────────────────────────────
721
+ function renderScene(scene) {
722
+ const idx = state.scenes.indexOf(scene)
723
+ let el = document.getElementById('scene-' + idx)
724
+ if (!el) {
725
+ el = document.createElement('div')
726
+ el.id = 'scene-' + idx
727
+ el.className = 'scene-section'
728
+ document.getElementById('scenes').appendChild(el)
729
+ }
730
+
731
+ const statusIcon = scene.status === 'completed' ? '\\u2713'
732
+ : scene.status === 'failed' ? '\\u2717'
733
+ : scene.status === 'timeout' ? '\\u23F1'
734
+ : '\\u25B6'
735
+
736
+ const statusColor = scene.status === 'completed' ? 'var(--green)'
737
+ : scene.status === 'failed' || scene.status === 'timeout' ? 'var(--red)'
738
+ : 'var(--blue)'
739
+
740
+ const durationStr = scene.duration ? scene.duration + 'ms' : 'running...'
741
+
742
+ // Build swim lanes
743
+ let lanesHtml = ''
744
+ const actors = Array.from(scene.actions.keys())
745
+
746
+ // Calculate time range for positioning
747
+ let minTime = scene.startTime
748
+ let maxTime = scene.endTime || Date.now()
749
+ for (const actions of scene.actions.values()) {
750
+ for (const a of actions) {
751
+ if (a.endTime && a.endTime > maxTime) maxTime = a.endTime
752
+ }
753
+ }
754
+ const timeSpan = Math.max(maxTime - minTime, 1)
755
+
756
+ // Time ruler
757
+ const tickCount = 5
758
+ let rulerHtml = ''
759
+ for (let i = 0; i <= tickCount; i++) {
760
+ const pct = (i / tickCount) * 100
761
+ const ms = Math.round((i / tickCount) * timeSpan)
762
+ rulerHtml += '<div class="tick" style="left: ' + pct + '%">' + formatMs(ms) + '</div>'
763
+ }
764
+
765
+ for (const actor of actors) {
766
+ const actions = scene.actions.get(actor) || []
767
+ let barsHtml = ''
768
+
769
+ for (const a of actions) {
770
+ const offsetPct = ((a.startTime - minTime) / timeSpan) * 100
771
+ const durMs = a.duration || (Date.now() - a.startTime)
772
+ const widthPct = Math.max((durMs / timeSpan) * 100, 2)
773
+
774
+ const cls = a.status
775
+ const label = a.action + (a.target ? '(' + escapeHtml(a.target) + ')' : '')
776
+ const durLabel = a.duration ? formatMs(a.duration) : '...'
777
+ const tooltip = label + ' — ' + durLabel + (a.error ? ' — ' + escapeHtml(a.error) : '')
778
+
779
+ barsHtml += '<div class="action-bar ' + cls + '" ' +
780
+ 'style="position:absolute; left:' + offsetPct + '%; width:' + widthPct + '%;" ' +
781
+ 'data-tooltip="' + escapeHtml(tooltip) + '">' +
782
+ '<span class="name">' + escapeHtml(a.action) + '</span>' +
783
+ (a.duration ? '<span class="duration">' + formatMs(a.duration) + '</span>' : '') +
784
+ '</div>'
785
+ }
786
+
787
+ // Assertion markers for this actor
788
+ const actorAssertions = scene.assertions.filter(a => a.actor === actor)
789
+ for (const a of actorAssertions) {
790
+ const offsetPct = ((a.timestamp - minTime) / timeSpan) * 100
791
+ const cls = a.result ? 'pass' : 'fail'
792
+ const icon = a.result ? '\\u2713' : '\\u2717'
793
+ barsHtml += '<div class="assertion-marker ' + cls + '" ' +
794
+ 'style="position:absolute; left:' + offsetPct + '%; top:50%; transform:translateY(-50%);" ' +
795
+ 'title="' + escapeHtml(a.description) + '">' + icon + '</div>'
796
+ }
797
+
798
+ lanesHtml += '<div class="lane">' +
799
+ '<div class="lane-label">' + escapeHtml(actor) + '</div>' +
800
+ '<div class="lane-track" style="position:relative;">' + barsHtml + '</div>' +
801
+ '</div>'
802
+ }
803
+
804
+ const replayDisabled = state.scenes.some(s => s.status === 'running') ? ' disabled' : ''
805
+ const replayFileAttr = scene.file ? ' data-file="' + escapeHtml(scene.file) + '"' : ''
806
+
807
+ // Collect errors from failed actions and scene-level error
808
+ var errors = []
809
+ for (var _a of scene.actions.values()) {
810
+ for (var _act of _a) {
811
+ if (_act.error) {
812
+ errors.push({ action: _act.action, target: _act.target, msg: _act.error })
813
+ }
814
+ }
815
+ }
816
+ if (scene.error && !errors.some(function(e) { return e.msg === scene.error })) {
817
+ errors.push({ action: null, target: null, msg: scene.error })
818
+ }
819
+
820
+ var errorsHtml = ''
821
+ if (errors.length > 0) {
822
+ var lines = ''
823
+ for (var _e of errors) {
824
+ var actionLabel = _e.action
825
+ ? '<span class="error-action">' + escapeHtml(_e.action + (_e.target ? '(' + _e.target + ')' : '')) + '</span> '
826
+ : ''
827
+ lines += '<div class="scene-error-line">' +
828
+ '<span class="error-icon">\\u2717</span> ' +
829
+ actionLabel +
830
+ '<span class="error-msg">' + escapeHtml(_e.msg) + '</span>' +
831
+ '</div>'
832
+ }
833
+ errorsHtml = '<div class="scene-errors" style="border-radius: 0 0 8px 8px;">' + lines + '</div>'
834
+ }
835
+
836
+ var lanesRadius = errors.length > 0 ? '' : ' style="border-radius: 0 0 8px 8px;"'
837
+
838
+ el.innerHTML =
839
+ '<div class="scene-header">' +
840
+ '<span class="icon" style="color:' + statusColor + '">' + statusIcon + '</span>' +
841
+ '<span class="name">' + escapeHtml(scene.name) + '</span>' +
842
+ '<span class="file">' + escapeHtml(scene.file || '') + '</span>' +
843
+ '<span class="duration">' + durationStr + '</span>' +
844
+ '<button class="replay-btn scene-replay-btn"' + replayFileAttr + replayDisabled +
845
+ ' onclick="replayScene(this)">' +
846
+ '<span class="play-icon">&#9654;</span> Replay' +
847
+ '</button>' +
848
+ '</div>' +
849
+ '<div class="swim-lanes"' + lanesRadius + '>' +
850
+ '<div class="time-ruler">' +
851
+ '<div class="lane-label" style="font-size:10px;color:var(--text2)">time</div>' +
852
+ '<div class="ruler-track">' + rulerHtml + '</div>' +
853
+ '</div>' +
854
+ lanesHtml +
855
+ '</div>' +
856
+ errorsHtml
857
+ }
858
+
859
+ function formatMs(ms) {
860
+ if (ms < 1000) return ms + 'ms'
861
+ return (ms / 1000).toFixed(1) + 's'
862
+ }
863
+
864
+ function escapeHtml(str) {
865
+ if (!str) return ''
866
+ return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;')
867
+ }
868
+
869
+ // ─── Run controls ─────────────────────────────────
870
+ var isPaused = false
871
+
872
+ function setRunning(running) {
873
+ document.querySelectorAll('.replay-btn').forEach(function(btn) {
874
+ btn.disabled = running
875
+ })
876
+ if (running) {
877
+ document.querySelector('header').classList.add('running')
878
+ } else {
879
+ document.querySelector('header').classList.remove('running')
880
+ isPaused = false
881
+ updatePauseButton()
882
+ }
883
+ }
884
+
885
+ function updatePauseButton() {
886
+ document.getElementById('pause-icon').innerHTML = isPaused ? '&#9654;' : '&#9646;&#9646;'
887
+ document.getElementById('pause-label').textContent = isPaused ? 'Resume' : 'Pause'
888
+ }
889
+
890
+ function replayAll() {
891
+ setRunning(true)
892
+ fetch('/__scenetest/replay', {
893
+ method: 'POST',
894
+ headers: { 'Content-Type': 'application/json' },
895
+ body: '{}',
896
+ }).catch(function() {
897
+ setRunning(false)
898
+ })
899
+ }
900
+
901
+ function replayScene(btn) {
902
+ var file = btn.getAttribute('data-file')
903
+ if (!file) return
904
+ setRunning(true)
905
+ fetch('/__scenetest/replay', {
906
+ method: 'POST',
907
+ headers: { 'Content-Type': 'application/json' },
908
+ body: JSON.stringify({ file: file }),
909
+ }).catch(function() {
910
+ setRunning(false)
911
+ })
912
+ }
913
+
914
+ function stopRun() {
915
+ fetch('/__scenetest/stop', { method: 'POST' })
916
+ .then(function() { setRunning(false) })
917
+ .catch(function() { setRunning(false) })
918
+ }
919
+
920
+ function togglePause() {
921
+ fetch('/__scenetest/pause', { method: 'POST' })
922
+ .then(function(r) { return r.json() })
923
+ .then(function(data) {
924
+ isPaused = data.paused
925
+ updatePauseButton()
926
+ })
927
+ .catch(function() {})
928
+ }
929
+ </script>
930
+ </body>
931
+ </html>`;
932
+ }
933
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../src/dashboard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA65BD,CAAA;AACR,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { ServerResponse } from 'http';
2
+ /**
3
+ * Simple SSE fan-out hub for dashboard events.
4
+ *
5
+ * - POST handler pushes events to all connected SSE clients
6
+ * - GET handler registers an SSE connection
7
+ * - Keeps a ring buffer of recent events so late-joining clients catch up
8
+ */
9
+ interface DashboardEvent {
10
+ type: string;
11
+ timestamp: number;
12
+ [key: string]: unknown;
13
+ }
14
+ export declare class EventHub {
15
+ private clients;
16
+ private buffer;
17
+ /** Register an SSE client connection. */
18
+ addClient(res: ServerResponse): void;
19
+ /** Broadcast an event to all connected clients and buffer it. */
20
+ push(event: DashboardEvent): void;
21
+ /** Clear the buffer (e.g., on new run). */
22
+ clear(): void;
23
+ get clientCount(): number;
24
+ }
25
+ export {};
26
+ //# sourceMappingURL=event-hub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-hub.d.ts","sourceRoot":"","sources":["../src/event-hub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAE1C;;;;;;GAMG;AAEH,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAID,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,MAAM,CAAuB;IAErC,yCAAyC;IACzC,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI;IAsBpC,iEAAiE;IACjE,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAcjC,2CAA2C;IAC3C,KAAK,IAAI,IAAI;IAIb,IAAI,WAAW,IAAI,MAAM,CAExB;CACF"}
@@ -0,0 +1,45 @@
1
+ const MAX_BUFFER_SIZE = 2000;
2
+ export class EventHub {
3
+ clients = new Set();
4
+ buffer = [];
5
+ /** Register an SSE client connection. */
6
+ addClient(res) {
7
+ // Set up SSE headers
8
+ res.writeHead(200, {
9
+ 'Content-Type': 'text/event-stream',
10
+ 'Cache-Control': 'no-cache',
11
+ Connection: 'keep-alive',
12
+ 'Access-Control-Allow-Origin': '*',
13
+ });
14
+ // Send buffered events so late joiners catch up
15
+ for (const event of this.buffer) {
16
+ res.write(`data: ${JSON.stringify(event)}\n\n`);
17
+ }
18
+ this.clients.add(res);
19
+ // Clean up on disconnect
20
+ res.on('close', () => {
21
+ this.clients.delete(res);
22
+ });
23
+ }
24
+ /** Broadcast an event to all connected clients and buffer it. */
25
+ push(event) {
26
+ // Buffer for late joiners
27
+ this.buffer.push(event);
28
+ if (this.buffer.length > MAX_BUFFER_SIZE) {
29
+ this.buffer = this.buffer.slice(-MAX_BUFFER_SIZE);
30
+ }
31
+ // Fan out to all connected SSE clients
32
+ const data = `data: ${JSON.stringify(event)}\n\n`;
33
+ for (const client of this.clients) {
34
+ client.write(data);
35
+ }
36
+ }
37
+ /** Clear the buffer (e.g., on new run). */
38
+ clear() {
39
+ this.buffer = [];
40
+ }
41
+ get clientCount() {
42
+ return this.clients.size;
43
+ }
44
+ }
45
+ //# sourceMappingURL=event-hub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-hub.js","sourceRoot":"","sources":["../src/event-hub.ts"],"names":[],"mappings":"AAgBA,MAAM,eAAe,GAAG,IAAI,CAAA;AAE5B,MAAM,OAAO,QAAQ;IACX,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAA;IACnC,MAAM,GAAqB,EAAE,CAAA;IAErC,yCAAyC;IACzC,SAAS,CAAC,GAAmB;QAC3B,qBAAqB;QACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,cAAc,EAAE,mBAAmB;YACnC,eAAe,EAAE,UAAU;YAC3B,UAAU,EAAE,YAAY;YACxB,6BAA6B,EAAE,GAAG;SACnC,CAAC,CAAA;QAEF,gDAAgD;QAChD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACjD,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAErB,yBAAyB;QACzB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,iEAAiE;IACjE,IAAI,CAAC,KAAqB;QACxB,0BAA0B;QAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACvB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAA;QACnD,CAAC;QAED,uCAAuC;QACvC,MAAM,IAAI,GAAG,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAA;QACjD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAA;IAClB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;IAC1B,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAA;AA6FjD,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;;;OAMG;IACH,GAAG,CAAC,EACA,OAAO,GACP;QACE;;;WAGG;QACH,OAAO,CAAC,EAAE,OAAO,CAAA;QAEjB;;;;WAIG;QACH,UAAU,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;KACpC,CAAA;CACN;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,sBAA2B,GAAG,MAAM,CA2NtE;AAGD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAG3C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAEhD,eAAe,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAA;AA6FjD,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IAEf;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAA;IAEd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;;;;;OAMG;IACH,GAAG,CAAC,EACA,OAAO,GACP;QACE;;;WAGG;QACH,OAAO,CAAC,EAAE,OAAO,CAAA;QAEjB;;;;WAIG;QACH,UAAU,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAA;KACpC,CAAA;CACN;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,sBAA2B,GAAG,MAAM,CA4NtE;AAGD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAG3C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAEhD,eAAe,SAAS,CAAA"}
package/dist/index.js CHANGED
@@ -256,6 +256,7 @@ import '${OBSERVER_MODULE}';`,
256
256
  console.log(`[vite-plugin-scenetest] ${mode} mode - scenetest assertions active`);
257
257
  if (showDevPanel) {
258
258
  console.log('[vite-plugin-scenetest] Dev panel enabled - open your app to see assertions');
259
+ console.log('[vite-plugin-scenetest] Live dashboard available at /__scenetest/dashboard');
259
260
  }
260
261
  if (showRecorder) {
261
262
  console.log('[vite-plugin-scenetest] Scene recorder enabled - record interactions as DSL');
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAA;AAWlD;;GAEG;AACH,wBAAgB,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWvG;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWnF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CA2FzG"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAA;AAelD;;GAEG;AACH,wBAAgB,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWvG;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWnF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAgNzG"}
@@ -1,6 +1,10 @@
1
1
  import { AsyncLocalStorage } from 'async_hooks';
2
+ import { spawn } from 'child_process';
3
+ import path from 'path';
2
4
  import { RESOLVED_VIRTUAL_MODULE_ID } from './virtual-module.js';
3
5
  import { loadConfig } from './config.js';
6
+ import { EventHub } from './event-hub.js';
7
+ import { generateDashboardHtml } from './dashboard.js';
4
8
  /**
5
9
  * AsyncLocalStorage for collecting assertion results within a serverFn execution
6
10
  */
@@ -48,8 +52,113 @@ export function failed(description, context) {
48
52
  * or networks. See README.md "Security Considerations" for details.
49
53
  */
50
54
  export function createScenetestMiddleware(server, root) {
55
+ const eventHub = new EventHub();
56
+ let activeReplay = null;
57
+ let paused = false;
51
58
  return async (req, res, next) => {
52
- // Only handle POST /__scenetest/run
59
+ // ── Dashboard page ──────────────────────────────────────
60
+ if (req.method === 'GET' && req.url === '/__scenetest/dashboard') {
61
+ res.statusCode = 200;
62
+ res.setHeader('Content-Type', 'text/html; charset=utf-8');
63
+ res.end(generateDashboardHtml());
64
+ return;
65
+ }
66
+ // ── SSE event stream ────────────────────────────────────
67
+ if (req.method === 'GET' && req.url === '/__scenetest/events') {
68
+ eventHub.addClient(res);
69
+ return;
70
+ }
71
+ // ── Receive events from CLI runner ──────────────────────
72
+ if (req.method === 'POST' && req.url === '/__scenetest/events') {
73
+ let body = '';
74
+ for await (const chunk of req) {
75
+ body += chunk;
76
+ }
77
+ try {
78
+ const event = JSON.parse(body);
79
+ // Clear buffer on new run so the dashboard starts fresh
80
+ if (event.type === 'run:start') {
81
+ eventHub.clear();
82
+ }
83
+ eventHub.push(event);
84
+ }
85
+ catch {
86
+ // Ignore malformed events
87
+ }
88
+ res.statusCode = 200;
89
+ res.setHeader('Content-Type', 'application/json');
90
+ res.end('{"ok":true}');
91
+ return;
92
+ }
93
+ // ── Replay endpoint ──────────────────────────────────────
94
+ if (req.method === 'POST' && req.url === '/__scenetest/replay') {
95
+ let body = '';
96
+ for await (const chunk of req) {
97
+ body += chunk;
98
+ }
99
+ let file;
100
+ try {
101
+ const parsed = JSON.parse(body);
102
+ file = parsed.file;
103
+ }
104
+ catch {
105
+ // No body or invalid JSON — replay all
106
+ }
107
+ // If a replay is already running, kill it first
108
+ if (activeReplay && activeReplay.exitCode === null) {
109
+ activeReplay.kill();
110
+ }
111
+ // Build the CLI args
112
+ const args = [];
113
+ if (file) {
114
+ // file is relative to scenetest/scenes/, resolve to full path
115
+ args.push(path.resolve(root, 'scenetest', 'scenes', file));
116
+ }
117
+ // Spawn the scenetest CLI as a child process
118
+ activeReplay = spawn('npx', ['scenetest', ...args], {
119
+ cwd: root,
120
+ stdio: 'ignore',
121
+ shell: true,
122
+ });
123
+ activeReplay.on('error', () => {
124
+ // Silently ignore spawn errors
125
+ });
126
+ paused = false;
127
+ res.statusCode = 200;
128
+ res.setHeader('Content-Type', 'application/json');
129
+ res.end(JSON.stringify({ ok: true }));
130
+ return;
131
+ }
132
+ // ── Stop running tests ──────────────────────────────────
133
+ if (req.method === 'POST' && req.url === '/__scenetest/stop') {
134
+ if (activeReplay && activeReplay.exitCode === null) {
135
+ activeReplay.kill();
136
+ activeReplay = null;
137
+ }
138
+ paused = false;
139
+ res.statusCode = 200;
140
+ res.setHeader('Content-Type', 'application/json');
141
+ res.end(JSON.stringify({ ok: true }));
142
+ return;
143
+ }
144
+ // ── Pause / resume running tests ────────────────────────
145
+ if (req.method === 'POST' && req.url === '/__scenetest/pause') {
146
+ if (activeReplay && activeReplay.exitCode === null && activeReplay.pid) {
147
+ if (paused) {
148
+ process.kill(activeReplay.pid, 'SIGCONT');
149
+ paused = false;
150
+ }
151
+ else {
152
+ process.kill(activeReplay.pid, 'SIGSTOP');
153
+ paused = true;
154
+ }
155
+ }
156
+ res.statusCode = 200;
157
+ res.setHeader('Content-Type', 'application/json');
158
+ res.end(JSON.stringify({ ok: true, paused }));
159
+ return;
160
+ }
161
+ // ── Assertion RPC (existing) ────────────────────────────
53
162
  if (req.method !== 'POST' || req.url !== '/__scenetest/run') {
54
163
  return next();
55
164
  }
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scenetest/vite-plugin",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "Vite plugin for scenetest - strips assertions in production, injects dev panel",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -40,9 +40,9 @@
40
40
  "@babel/traverse": "^7.24.0",
41
41
  "@babel/types": "^7.24.0",
42
42
  "magic-string": "^0.30.10",
43
- "@scenetest/checks": "0.5.0",
44
- "@scenetest/scenes-panel": "0.5.0",
45
- "@scenetest/checks-panel": "0.5.0"
43
+ "@scenetest/checks": "0.7.0",
44
+ "@scenetest/scenes-panel": "0.7.0",
45
+ "@scenetest/checks-panel": "0.7.0"
46
46
  },
47
47
  "peerDependencies": {
48
48
  "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"