@ciach/playwright-private-reporter 0.1.1 → 0.1.2

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 (64) hide show
  1. package/README.md +49 -1
  2. package/dist/cjs/cli/generateReport.d.ts.map +1 -1
  3. package/dist/cjs/cli/generateReport.js +41 -2
  4. package/dist/cjs/cli/generateReport.js.map +1 -1
  5. package/dist/cjs/index.d.ts +2 -1
  6. package/dist/cjs/index.d.ts.map +1 -1
  7. package/dist/cjs/index.js +5 -1
  8. package/dist/cjs/index.js.map +1 -1
  9. package/dist/cjs/reporter/summary.d.ts.map +1 -1
  10. package/dist/cjs/reporter/summary.js +5 -0
  11. package/dist/cjs/reporter/summary.js.map +1 -1
  12. package/dist/cjs/templates/shared.d.ts +4 -0
  13. package/dist/cjs/templates/shared.d.ts.map +1 -0
  14. package/dist/cjs/templates/shared.js +20 -0
  15. package/dist/cjs/templates/shared.js.map +1 -0
  16. package/dist/cjs/templates/summary.classic.d.ts +3 -0
  17. package/dist/cjs/templates/summary.classic.d.ts.map +1 -0
  18. package/dist/cjs/templates/summary.classic.js +60 -0
  19. package/dist/cjs/templates/summary.classic.js.map +1 -0
  20. package/dist/cjs/templates/summary.html.d.ts +5 -2
  21. package/dist/cjs/templates/summary.html.d.ts.map +1 -1
  22. package/dist/cjs/templates/summary.html.js +32 -58
  23. package/dist/cjs/templates/summary.html.js.map +1 -1
  24. package/dist/cjs/templates/summary.modern.d.ts +3 -0
  25. package/dist/cjs/templates/summary.modern.d.ts.map +1 -0
  26. package/dist/cjs/templates/summary.modern.js +543 -0
  27. package/dist/cjs/templates/summary.modern.js.map +1 -0
  28. package/dist/cjs/types/schema.d.ts +22 -0
  29. package/dist/cjs/types/schema.d.ts.map +1 -1
  30. package/dist/esm/cli/generateReport.d.ts.map +1 -1
  31. package/dist/esm/cli/generateReport.js +41 -3
  32. package/dist/esm/cli/generateReport.js.map +1 -1
  33. package/dist/esm/index.d.ts +2 -1
  34. package/dist/esm/index.d.ts.map +1 -1
  35. package/dist/esm/index.js +1 -0
  36. package/dist/esm/index.js.map +1 -1
  37. package/dist/esm/reporter/summary.d.ts.map +1 -1
  38. package/dist/esm/reporter/summary.js +5 -0
  39. package/dist/esm/reporter/summary.js.map +1 -1
  40. package/dist/esm/templates/shared.d.ts +4 -0
  41. package/dist/esm/templates/shared.d.ts.map +1 -0
  42. package/dist/esm/templates/shared.js +15 -0
  43. package/dist/esm/templates/shared.js.map +1 -0
  44. package/dist/esm/templates/summary.classic.d.ts +3 -0
  45. package/dist/esm/templates/summary.classic.d.ts.map +1 -0
  46. package/dist/esm/templates/summary.classic.js +57 -0
  47. package/dist/esm/templates/summary.classic.js.map +1 -0
  48. package/dist/esm/templates/summary.html.d.ts +5 -2
  49. package/dist/esm/templates/summary.html.d.ts.map +1 -1
  50. package/dist/esm/templates/summary.html.js +30 -58
  51. package/dist/esm/templates/summary.html.js.map +1 -1
  52. package/dist/esm/templates/summary.modern.d.ts +3 -0
  53. package/dist/esm/templates/summary.modern.d.ts.map +1 -0
  54. package/dist/esm/templates/summary.modern.js +540 -0
  55. package/dist/esm/templates/summary.modern.js.map +1 -0
  56. package/dist/esm/types/schema.d.ts +22 -0
  57. package/dist/esm/types/schema.d.ts.map +1 -1
  58. package/examples/playwright.config.ts +1 -0
  59. package/examples/summary-template-minimal.cjs +84 -0
  60. package/examples/summary-template-ops.cjs +131 -0
  61. package/examples/summary-template.cjs +63 -0
  62. package/examples/summary-templates.md +111 -0
  63. package/package.json +1 -1
  64. package/schemas/run.schema.json +191 -42
@@ -0,0 +1,543 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderModernSummaryHtml = renderModernSummaryHtml;
4
+ const shared_js_1 = require("./shared.js");
5
+ function renderHistoryState(group) {
6
+ if (!group.history) {
7
+ return '';
8
+ }
9
+ return `
10
+ <div class="meta-row">
11
+ <span class="meta-label">History</span>
12
+ <span class="history-chip history-${(0, shared_js_1.escapeHtml)(group.history.state)}">${(0, shared_js_1.escapeHtml)(group.history.state)}</span>
13
+ </div>`;
14
+ }
15
+ function renderAttachments(group) {
16
+ if (group.exampleAttachments.length === 0) {
17
+ return '';
18
+ }
19
+ return `
20
+ <section class="subsection">
21
+ <h4>Example attachments</h4>
22
+ <ul class="attachment-list">
23
+ ${group.exampleAttachments
24
+ .map((attachment) => `
25
+ <li>
26
+ <strong>${(0, shared_js_1.escapeHtml)(attachment.name)}</strong>
27
+ ${attachment.contentType ? `<span>${(0, shared_js_1.escapeHtml)(attachment.contentType)}</span>` : ''}
28
+ ${attachment.path ? `<code>${(0, shared_js_1.escapeHtml)(attachment.path)}</code>` : ''}
29
+ </li>`)
30
+ .join('')}
31
+ </ul>
32
+ </section>`;
33
+ }
34
+ function renderTests(group) {
35
+ if (group.tests.length === 0) {
36
+ return '';
37
+ }
38
+ return `
39
+ <details class="nested-details">
40
+ <summary>Affected tests (${group.tests.length})</summary>
41
+ <ul class="test-list">
42
+ ${group.tests
43
+ .map((test) => `
44
+ <li>
45
+ <div class="test-title">${(0, shared_js_1.joinTitlePath)(test.titlePath)}</div>
46
+ <div class="test-meta">
47
+ <span>Status: ${(0, shared_js_1.escapeHtml)(test.status)}</span>
48
+ <span>Retry: ${test.retry}</span>
49
+ ${test.location ? `<code>${(0, shared_js_1.escapeHtml)(test.location)}</code>` : ''}
50
+ </div>
51
+ </li>`)
52
+ .join('')}
53
+ </ul>
54
+ </details>`;
55
+ }
56
+ function renderFailureGroup(group, index) {
57
+ return `
58
+ <details class="failure-card" ${index == 0 ? 'open' : ''}>
59
+ <summary>
60
+ <div class="failure-heading">
61
+ <div>
62
+ <div class="eyebrow">${(0, shared_js_1.escapeHtml)(group.projectName ?? 'project')} / ${(0, shared_js_1.escapeHtml)(group.status)}</div>
63
+ <h3>${(0, shared_js_1.escapeHtml)(group.title)}</h3>
64
+ </div>
65
+ <div class="failure-badges">
66
+ <span class="count-badge">${(0, shared_js_1.pluralize)(group.countInRun, 'occurrence')}</span>
67
+ ${group.history ? `<span class="history-chip history-${(0, shared_js_1.escapeHtml)(group.history.state)}">${(0, shared_js_1.escapeHtml)(group.history.state)}</span>` : ''}
68
+ </div>
69
+ </div>
70
+ <div class="failure-summary-meta">
71
+ <code>${(0, shared_js_1.escapeHtml)(group.fingerprint)}</code>
72
+ <span>${(0, shared_js_1.escapeHtml)(group.testFile)}</span>
73
+ </div>
74
+ </summary>
75
+ <div class="failure-body">
76
+ <section class="subsection">
77
+ <h4>Normalized failure</h4>
78
+ <pre>${(0, shared_js_1.escapeHtml)(group.normalizedMessage)}</pre>
79
+ </section>
80
+ ${group.firstMeaningfulStack ? `<section class="subsection"><h4>First meaningful stack frame</h4><pre>${(0, shared_js_1.escapeHtml)(group.firstMeaningfulStack)}</pre></section>` : ''}
81
+ ${renderHistoryState(group)}
82
+ ${renderAttachments(group)}
83
+ ${renderTests(group)}
84
+ </div>
85
+ </details>`;
86
+ }
87
+ function renderModernSummaryHtml(context) {
88
+ const { title, runSummary, failuresSummary, diff, artifactLinks } = context;
89
+ const failureCards = failuresSummary.groups
90
+ .slice(0, 25)
91
+ .map((group, index) => renderFailureGroup(group, index))
92
+ .join('');
93
+ return `<!DOCTYPE html>
94
+ <html lang="en">
95
+ <head>
96
+ <meta charset="utf-8" />
97
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
98
+ <title>${(0, shared_js_1.escapeHtml)(title)}</title>
99
+ <style>
100
+ :root {
101
+ --bg: #f4efe8;
102
+ --panel: rgba(255, 255, 255, 0.86);
103
+ --panel-strong: #ffffff;
104
+ --ink: #1f2937;
105
+ --muted: #5b6575;
106
+ --line: rgba(31, 41, 55, 0.12);
107
+ --accent: #0f766e;
108
+ --accent-strong: #115e59;
109
+ --danger: #b42318;
110
+ --danger-soft: #fef3f2;
111
+ --success: #166534;
112
+ --success-soft: #ecfdf3;
113
+ --warning: #b54708;
114
+ --warning-soft: #fffaeb;
115
+ --shadow: 0 20px 40px rgba(15, 23, 42, 0.08);
116
+ }
117
+
118
+ * { box-sizing: border-box; }
119
+ html { color-scheme: light; }
120
+ body {
121
+ margin: 0;
122
+ min-height: 100vh;
123
+ font-family: "Segoe UI Variable", "Avenir Next", "Helvetica Neue", Arial, sans-serif;
124
+ color: var(--ink);
125
+ background:
126
+ radial-gradient(circle at top left, rgba(15, 118, 110, 0.16), transparent 28rem),
127
+ radial-gradient(circle at top right, rgba(180, 35, 24, 0.09), transparent 24rem),
128
+ linear-gradient(180deg, #fbf7f2 0%, var(--bg) 100%);
129
+ }
130
+
131
+ main {
132
+ width: min(1120px, calc(100% - 2rem));
133
+ margin: 0 auto;
134
+ padding: 2rem 0 3rem;
135
+ }
136
+
137
+ .hero,
138
+ .section,
139
+ .stat-card,
140
+ .artifact-card,
141
+ .failure-card {
142
+ backdrop-filter: blur(12px);
143
+ background: var(--panel);
144
+ border: 1px solid var(--line);
145
+ box-shadow: var(--shadow);
146
+ }
147
+
148
+ .hero {
149
+ border-radius: 28px;
150
+ padding: 2rem;
151
+ display: grid;
152
+ grid-template-columns: minmax(0, 2fr) minmax(280px, 1fr);
153
+ gap: 1.5rem;
154
+ }
155
+
156
+ .eyebrow {
157
+ text-transform: uppercase;
158
+ letter-spacing: 0.14em;
159
+ font-size: 0.75rem;
160
+ color: var(--muted);
161
+ }
162
+
163
+ h1, h2, h3, h4, p { margin: 0; }
164
+ h1 { font-size: clamp(2rem, 5vw, 3.3rem); line-height: 0.95; margin-top: 0.45rem; }
165
+ h2 { font-size: 1.35rem; }
166
+ h3 { font-size: 1.05rem; line-height: 1.2; }
167
+ h4 { font-size: 0.95rem; margin-bottom: 0.5rem; }
168
+
169
+ .hero-copy p {
170
+ margin-top: 0.9rem;
171
+ max-width: 60ch;
172
+ color: var(--muted);
173
+ font-size: 1rem;
174
+ line-height: 1.6;
175
+ }
176
+
177
+ .status-pill {
178
+ display: inline-flex;
179
+ align-items: center;
180
+ gap: 0.5rem;
181
+ border-radius: 999px;
182
+ padding: 0.45rem 0.85rem;
183
+ font-weight: 700;
184
+ font-size: 0.92rem;
185
+ }
186
+
187
+ .status-passed { background: var(--success-soft); color: var(--success); }
188
+ .status-failed, .status-partial { background: var(--danger-soft); color: var(--danger); }
189
+
190
+ .hero-meta {
191
+ display: grid;
192
+ gap: 0.8rem;
193
+ align-content: start;
194
+ }
195
+
196
+ .meta-card {
197
+ border-radius: 18px;
198
+ padding: 1rem 1.1rem;
199
+ background: var(--panel-strong);
200
+ border: 1px solid var(--line);
201
+ }
202
+
203
+ .meta-label {
204
+ font-size: 0.8rem;
205
+ text-transform: uppercase;
206
+ letter-spacing: 0.08em;
207
+ color: var(--muted);
208
+ }
209
+
210
+ .meta-value,
211
+ .meta-card a {
212
+ display: block;
213
+ margin-top: 0.35rem;
214
+ color: var(--ink);
215
+ text-decoration: none;
216
+ word-break: break-word;
217
+ }
218
+
219
+ .section {
220
+ margin-top: 1.25rem;
221
+ border-radius: 24px;
222
+ padding: 1.35rem;
223
+ }
224
+
225
+ .section-header {
226
+ display: flex;
227
+ justify-content: space-between;
228
+ gap: 1rem;
229
+ align-items: baseline;
230
+ margin-bottom: 1rem;
231
+ }
232
+
233
+ .section-header p { color: var(--muted); line-height: 1.5; }
234
+
235
+ .stats-grid,
236
+ .artifacts-grid {
237
+ display: grid;
238
+ grid-template-columns: repeat(4, minmax(0, 1fr));
239
+ gap: 1rem;
240
+ }
241
+
242
+ .stat-card,
243
+ .artifact-card {
244
+ border-radius: 18px;
245
+ padding: 1.15rem;
246
+ }
247
+
248
+ .stat-card strong {
249
+ display: block;
250
+ margin-top: 0.75rem;
251
+ font-size: 2rem;
252
+ line-height: 1;
253
+ }
254
+
255
+ .stat-card span { color: var(--muted); }
256
+
257
+ .stat-card[data-tone="danger"] strong { color: var(--danger); }
258
+ .stat-card[data-tone="success"] strong { color: var(--success); }
259
+ .stat-card[data-tone="warning"] strong { color: var(--warning); }
260
+ .stat-card[data-tone="accent"] strong { color: var(--accent-strong); }
261
+
262
+ .history-grid {
263
+ display: grid;
264
+ grid-template-columns: repeat(3, minmax(0, 1fr));
265
+ gap: 1rem;
266
+ }
267
+
268
+ .artifact-card a {
269
+ color: var(--accent-strong);
270
+ font-weight: 700;
271
+ text-decoration: none;
272
+ }
273
+
274
+ .artifact-card p,
275
+ .empty-state p {
276
+ margin-top: 0.55rem;
277
+ color: var(--muted);
278
+ line-height: 1.55;
279
+ }
280
+
281
+ .failures-stack {
282
+ display: grid;
283
+ gap: 0.9rem;
284
+ }
285
+
286
+ .failure-card {
287
+ border-radius: 20px;
288
+ overflow: hidden;
289
+ }
290
+
291
+ .failure-card > summary {
292
+ list-style: none;
293
+ cursor: pointer;
294
+ padding: 1rem 1.15rem;
295
+ }
296
+
297
+ .failure-card > summary::-webkit-details-marker,
298
+ .nested-details > summary::-webkit-details-marker {
299
+ display: none;
300
+ }
301
+
302
+ .failure-heading,
303
+ .failure-summary-meta,
304
+ .test-meta,
305
+ .meta-row {
306
+ display: flex;
307
+ justify-content: space-between;
308
+ gap: 0.8rem;
309
+ align-items: start;
310
+ }
311
+
312
+ .failure-summary-meta,
313
+ .test-meta,
314
+ .meta-row {
315
+ margin-top: 0.8rem;
316
+ color: var(--muted);
317
+ font-size: 0.92rem;
318
+ flex-wrap: wrap;
319
+ }
320
+
321
+ .failure-badges {
322
+ display: flex;
323
+ gap: 0.6rem;
324
+ flex-wrap: wrap;
325
+ justify-content: end;
326
+ }
327
+
328
+ .count-badge,
329
+ .history-chip {
330
+ border-radius: 999px;
331
+ padding: 0.35rem 0.7rem;
332
+ font-size: 0.82rem;
333
+ font-weight: 700;
334
+ }
335
+
336
+ .count-badge { background: rgba(15, 118, 110, 0.1); color: var(--accent-strong); }
337
+ .history-new { background: var(--danger-soft); color: var(--danger); }
338
+ .history-still-failing { background: var(--warning-soft); color: var(--warning); }
339
+ .history-fixed { background: var(--success-soft); color: var(--success); }
340
+ .history-unknown { background: rgba(91, 101, 117, 0.12); color: var(--muted); }
341
+
342
+ .failure-body {
343
+ border-top: 1px solid var(--line);
344
+ padding: 1rem 1.15rem 1.15rem;
345
+ background: rgba(255, 255, 255, 0.52);
346
+ }
347
+
348
+ .subsection + .subsection,
349
+ .nested-details,
350
+ .meta-row {
351
+ margin-top: 1rem;
352
+ }
353
+
354
+ pre,
355
+ code {
356
+ font-family: "SFMono-Regular", "Cascadia Code", "JetBrains Mono", monospace;
357
+ }
358
+
359
+ pre,
360
+ code {
361
+ word-break: break-word;
362
+ }
363
+
364
+ pre {
365
+ margin: 0;
366
+ white-space: pre-wrap;
367
+ border-radius: 16px;
368
+ padding: 0.9rem 1rem;
369
+ background: #17202c;
370
+ color: #f8fafc;
371
+ line-height: 1.55;
372
+ }
373
+
374
+ code {
375
+ display: inline-block;
376
+ border-radius: 8px;
377
+ background: rgba(15, 23, 42, 0.06);
378
+ padding: 0.2rem 0.45rem;
379
+ }
380
+
381
+ .attachment-list,
382
+ .test-list {
383
+ margin: 0;
384
+ padding-left: 1.2rem;
385
+ }
386
+
387
+ .attachment-list li,
388
+ .test-list li {
389
+ margin-top: 0.55rem;
390
+ }
391
+
392
+ .test-title {
393
+ font-weight: 700;
394
+ color: var(--ink);
395
+ }
396
+
397
+ .nested-details {
398
+ border-top: 1px dashed var(--line);
399
+ padding-top: 1rem;
400
+ }
401
+
402
+ .nested-details > summary {
403
+ list-style: none;
404
+ cursor: pointer;
405
+ font-weight: 700;
406
+ }
407
+
408
+ .empty-state {
409
+ border-radius: 18px;
410
+ padding: 1.25rem;
411
+ background: var(--panel-strong);
412
+ border: 1px dashed var(--line);
413
+ }
414
+
415
+ @media (max-width: 960px) {
416
+ .hero,
417
+ .stats-grid,
418
+ .artifacts-grid,
419
+ .history-grid {
420
+ grid-template-columns: repeat(2, minmax(0, 1fr));
421
+ }
422
+ }
423
+
424
+ @media (max-width: 720px) {
425
+ main { width: min(100% - 1rem, 1120px); padding-top: 1rem; }
426
+ .hero,
427
+ .stats-grid,
428
+ .artifacts-grid,
429
+ .history-grid {
430
+ grid-template-columns: 1fr;
431
+ }
432
+ .hero { padding: 1.25rem; border-radius: 22px; }
433
+ .section { padding: 1rem; border-radius: 18px; }
434
+ .failure-heading,
435
+ .failure-summary-meta,
436
+ .test-meta,
437
+ .meta-row,
438
+ .section-header {
439
+ display: block;
440
+ }
441
+ .failure-badges { margin-top: 0.75rem; justify-content: start; }
442
+ }
443
+ </style>
444
+ </head>
445
+ <body>
446
+ <main>
447
+ <section class="hero">
448
+ <div class="hero-copy">
449
+ <div class="eyebrow">Playwright private reporter</div>
450
+ <h1>${(0, shared_js_1.escapeHtml)(title)}</h1>
451
+ <p>Static CI-friendly summary with grouped failures, artifact shortcuts, and collapsible drill-down for the highest-signal debugging details.</p>
452
+ <p>
453
+ <span class="status-pill status-${(0, shared_js_1.escapeHtml)(runSummary.run.status)}">${(0, shared_js_1.escapeHtml)(runSummary.run.status)}</span>
454
+ </p>
455
+ </div>
456
+ <div class="hero-meta">
457
+ <div class="meta-card">
458
+ <span class="meta-label">Build</span>
459
+ <span class="meta-value">${(0, shared_js_1.escapeHtml)(runSummary.run.buildId ?? 'n/a')}</span>
460
+ </div>
461
+ <div class="meta-card">
462
+ <span class="meta-label">Branch</span>
463
+ <span class="meta-value">${(0, shared_js_1.escapeHtml)(runSummary.run.branch ?? 'n/a')}</span>
464
+ </div>
465
+ <div class="meta-card">
466
+ <span class="meta-label">Commit</span>
467
+ <span class="meta-value">${(0, shared_js_1.escapeHtml)(runSummary.run.commit ?? 'n/a')}</span>
468
+ </div>
469
+ <div class="meta-card">
470
+ <span class="meta-label">Build URL</span>
471
+ ${runSummary.run.buildUrl ? `<a href="${(0, shared_js_1.escapeHtml)(runSummary.run.buildUrl)}">${(0, shared_js_1.escapeHtml)(runSummary.run.buildUrl)}</a>` : '<span class="meta-value">n/a</span>'}
472
+ </div>
473
+ </div>
474
+ </section>
475
+
476
+ <section class="section">
477
+ <div class="section-header">
478
+ <div>
479
+ <h2>Run overview</h2>
480
+ <p>Top-line results for the current run, including outcome buckets that matter during triage.</p>
481
+ </div>
482
+ </div>
483
+ <div class="stats-grid">
484
+ <article class="stat-card" data-tone="success"><span>Passed</span><strong>${runSummary.counts.passed}</strong></article>
485
+ <article class="stat-card" data-tone="danger"><span>Failed</span><strong>${runSummary.counts.failed}</strong></article>
486
+ <article class="stat-card" data-tone="warning"><span>Timed out</span><strong>${runSummary.counts.timedOut}</strong></article>
487
+ <article class="stat-card" data-tone="accent"><span>Failure groups</span><strong>${failuresSummary.groups.length}</strong></article>
488
+ </div>
489
+ </section>
490
+
491
+ <section class="section">
492
+ <div class="section-header">
493
+ <div>
494
+ <h2>History signals</h2>
495
+ <p>${diff ? 'Comparison against the previous failure snapshot.' : 'No previous failure snapshot was provided for diffing.'}</p>
496
+ </div>
497
+ </div>
498
+ <div class="history-grid">
499
+ <article class="stat-card" data-tone="danger"><span>New failures</span><strong>${runSummary.history.newFailures}</strong></article>
500
+ <article class="stat-card" data-tone="warning"><span>Still failing</span><strong>${runSummary.history.stillFailing}</strong></article>
501
+ <article class="stat-card" data-tone="success"><span>Fixed failures</span><strong>${runSummary.history.fixedFailures}</strong></article>
502
+ </div>
503
+ </section>
504
+
505
+ <section class="section">
506
+ <div class="section-header">
507
+ <div>
508
+ <h2>Artifacts</h2>
509
+ <p>Jump straight to the full HTML report, raw JUnit, or retained test attachments.</p>
510
+ </div>
511
+ </div>
512
+ <div class="artifacts-grid">
513
+ <article class="artifact-card">
514
+ <a href="${(0, shared_js_1.escapeHtml)(artifactLinks.playwrightReport)}">Merged Playwright report</a>
515
+ <p>Rich timeline, trace, and suite navigation for full debugging context.</p>
516
+ </article>
517
+ <article class="artifact-card">
518
+ <a href="${(0, shared_js_1.escapeHtml)(artifactLinks.junit)}">JUnit XML</a>
519
+ <p>Machine-readable test results for CI parsers and external dashboards.</p>
520
+ </article>
521
+ <article class="artifact-card">
522
+ <a href="${(0, shared_js_1.escapeHtml)(artifactLinks.testResults)}">Test results attachments</a>
523
+ <p>Screenshots, videos, traces, and other retained failure evidence.</p>
524
+ </article>
525
+ </div>
526
+ </section>
527
+
528
+ <section class="section">
529
+ <div class="section-header">
530
+ <div>
531
+ <h2>Failure groups</h2>
532
+ <p>Grouped by fingerprint with collapsible drill-down, stack context, attachments, and affected tests.</p>
533
+ </div>
534
+ </div>
535
+ ${failureCards
536
+ ? `<div class="failures-stack">${failureCards}</div>`
537
+ : `<div class="empty-state"><h3>No failing groups</h3><p>This run produced no grouped failures.</p></div>`}
538
+ </section>
539
+ </main>
540
+ </body>
541
+ </html>`;
542
+ }
543
+ //# sourceMappingURL=summary.modern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.modern.js","sourceRoot":"","sources":["../../../src/templates/summary.modern.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,10 @@
1
+ export type BuiltInSummaryTheme = 'classic' | 'modern';
1
2
  export type PrivateReporterOptions = {
2
3
  projectName: string;
3
4
  outputDir?: string;
4
5
  summaryTitle?: string;
6
+ summaryTheme?: BuiltInSummaryTheme;
7
+ summaryTemplatePath?: string;
5
8
  enableHistoryDiff?: boolean;
6
9
  ci?: boolean;
7
10
  buildUrlEnv?: string;
@@ -51,6 +54,11 @@ export type RunSummary = {
51
54
  schemaVersion: '1.0';
52
55
  projectName: string;
53
56
  generatedAt: string;
57
+ presentation?: {
58
+ summaryTitle?: string;
59
+ summaryTheme?: BuiltInSummaryTheme;
60
+ summaryTemplatePath?: string;
61
+ };
54
62
  run: {
55
63
  status: 'passed' | 'failed' | 'partial';
56
64
  buildId?: string;
@@ -93,4 +101,18 @@ export type HistoryDiff = {
93
101
  fixedFailures: FailureGroup[];
94
102
  stillFailing: FailureGroup[];
95
103
  };
104
+ export type SummaryArtifactLinks = {
105
+ playwrightReport: string;
106
+ junit: string;
107
+ testResults: string;
108
+ };
109
+ export type SummaryRenderContext = {
110
+ title: string;
111
+ theme: BuiltInSummaryTheme;
112
+ runSummary: RunSummary;
113
+ failuresSummary: FailuresSummary;
114
+ diff?: HistoryDiff;
115
+ artifactLinks: SummaryArtifactLinks;
116
+ };
117
+ export type SummaryRenderer = (context: SummaryRenderContext) => string | Promise<string>;
96
118
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/types/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/types/schema.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"generateReport.d.ts","sourceRoot":"","sources":["../../../src/cli/generateReport.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAmB,sBAAsB,EAAc,MAAM,oBAAoB,CAAC;AAE9F,MAAM,MAAM,wBAAwB,GAAG;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAsB,cAAc,CAClC,eAAe,EAAE,sBAAsB,EACvC,UAAU,GAAE,wBAA6B,GACxC,OAAO,CAAC,IAAI,CAAC,CAwCf;AAED,iBAAe,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CASzC;AAGD,OAAO,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"generateReport.d.ts","sourceRoot":"","sources":["../../../src/cli/generateReport.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,sBAAsB,EAIvB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,wBAAwB,GAAG;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAgCF,wBAAsB,cAAc,CAClC,eAAe,EAAE,sBAAsB,EACvC,UAAU,GAAE,wBAA6B,GACxC,OAAO,CAAC,IAAI,CAAC,CAoDf;AAED,iBAAe,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBzC;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -3,6 +3,28 @@ import { resolve } from 'node:path';
3
3
  import { loadPreviousFailuresSummary } from '../history/loadPrevious.js';
4
4
  import { diffFailureGroups } from '../history/diffRuns.js';
5
5
  import { renderSummaryHtml } from '../templates/summary.html.js';
6
+ function normalizeArtifactPath(value) {
7
+ return value.replaceAll('\\', '/').replace(/^\.\//, '').replace(/\/+$/, '');
8
+ }
9
+ function createArtifactLinks(runSummary) {
10
+ const playwrightHtmlDir = normalizeArtifactPath(runSummary.artifacts.playwrightHtmlDir);
11
+ const junitPath = normalizeArtifactPath(runSummary.artifacts.junitPath);
12
+ const testResultsDir = normalizeArtifactPath(runSummary.artifacts.testResultsDir);
13
+ return {
14
+ playwrightReport: `../${playwrightHtmlDir}/index.html`,
15
+ junit: `../${junitPath}`,
16
+ testResults: `../${testResultsDir}/`,
17
+ };
18
+ }
19
+ function resolvePresentationOptions(reporterOptions, runSummary) {
20
+ return {
21
+ ...reporterOptions,
22
+ projectName: reporterOptions.projectName || runSummary.projectName,
23
+ summaryTitle: reporterOptions.summaryTitle ?? runSummary.presentation?.summaryTitle,
24
+ summaryTheme: reporterOptions.summaryTheme ?? runSummary.presentation?.summaryTheme,
25
+ summaryTemplatePath: reporterOptions.summaryTemplatePath ?? runSummary.presentation?.summaryTemplatePath,
26
+ };
27
+ }
6
28
  export async function generateReport(reporterOptions, cliOptions = {}) {
7
29
  const currentRunPath = resolve(cliOptions.currentRunPath ?? 'artifacts/internal-report/run.json');
8
30
  const currentFailuresPath = resolve(cliOptions.currentFailuresPath ?? 'artifacts/internal-report/failures.json');
@@ -21,8 +43,19 @@ export async function generateReport(reporterOptions, cliOptions = {}) {
21
43
  runSummary.history.fixedFailures = diff.fixedFailures.length;
22
44
  runSummary.history.stillFailing = diff.stillFailing.length;
23
45
  }
46
+ const resolvedReporterOptions = resolvePresentationOptions(reporterOptions, runSummary);
47
+ const title = resolvedReporterOptions.summaryTitle ?? `${runSummary.projectName} summary`;
48
+ const summaryContext = {
49
+ title,
50
+ theme: resolvedReporterOptions.summaryTheme === 'classic' ? 'classic' : 'modern',
51
+ runSummary,
52
+ failuresSummary,
53
+ diff,
54
+ artifactLinks: createArtifactLinks(runSummary),
55
+ };
56
+ const html = await renderSummaryHtml(summaryContext, resolvedReporterOptions);
24
57
  const markdown = [
25
- `# ${reporterOptions.summaryTitle ?? reporterOptions.projectName} summary`,
58
+ `# ${title}`,
26
59
  '',
27
60
  `- Status: ${runSummary.run.status}`,
28
61
  `- Passed: ${runSummary.counts.passed}`,
@@ -37,7 +70,7 @@ export async function generateReport(reporterOptions, cliOptions = {}) {
37
70
  await Promise.all([
38
71
  writeFile(resolve(outputDir, 'run.json'), JSON.stringify(runSummary, null, 2), 'utf8'),
39
72
  writeFile(resolve(outputDir, 'summary.md'), markdown, 'utf8'),
40
- writeFile(resolve(outputDir, 'summary.html'), renderSummaryHtml(runSummary, failuresSummary), 'utf8'),
73
+ writeFile(resolve(outputDir, 'summary.html'), html, 'utf8'),
41
74
  ]);
42
75
  }
43
76
  async function runFromCli() {
@@ -46,9 +79,14 @@ async function runFromCli() {
46
79
  projectName,
47
80
  outputDir: process.env.PRIVATE_REPORT_OUTPUT_DIR ?? 'artifacts',
48
81
  summaryTitle: process.env.PRIVATE_REPORT_SUMMARY_TITLE,
82
+ summaryTheme: process.env.PRIVATE_REPORT_SUMMARY_THEME === 'classic'
83
+ ? 'classic'
84
+ : process.env.PRIVATE_REPORT_SUMMARY_THEME === 'modern'
85
+ ? 'modern'
86
+ : undefined,
87
+ summaryTemplatePath: process.env.PRIVATE_REPORT_SUMMARY_TEMPLATE_PATH,
49
88
  enableHistoryDiff: process.env.PRIVATE_REPORT_ENABLE_HISTORY_DIFF === 'true',
50
89
  });
51
90
  }
52
- // Export for CLI usage
53
91
  export { runFromCli };
54
92
  //# sourceMappingURL=generateReport.js.map