@reportforge/playwright-pdf 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/CHANGELOG.md +285 -0
  2. package/LICENSE +21 -0
  3. package/README.md +524 -0
  4. package/ci-templates/azure-devops/azure-pipelines.yml +58 -0
  5. package/ci-templates/bitbucket/bitbucket-pipelines.yml +42 -0
  6. package/ci-templates/github-actions/basic-workflow.yml +44 -0
  7. package/ci-templates/github-actions/matrix-workflow.yml +69 -0
  8. package/ci-templates/gitlab-ci/.gitlab-ci.yml +42 -0
  9. package/ci-templates/jenkins/Jenkinsfile +54 -0
  10. package/dist/index.d.mts +272 -0
  11. package/dist/index.d.ts +272 -0
  12. package/dist/index.js +12566 -0
  13. package/dist/index.mjs +12567 -0
  14. package/dist/templates/layouts/detailed.hbs +38 -0
  15. package/dist/templates/layouts/executive.hbs +35 -0
  16. package/dist/templates/layouts/minimal.hbs +29 -0
  17. package/dist/templates/partials/charts.hbs +306 -0
  18. package/dist/templates/partials/ci-environment.hbs +56 -0
  19. package/dist/templates/partials/cover-page.hbs +46 -0
  20. package/dist/templates/partials/defect-log.hbs +27 -0
  21. package/dist/templates/partials/executive-summary.hbs +60 -0
  22. package/dist/templates/partials/failure-deep-dive.hbs +61 -0
  23. package/dist/templates/partials/head.hbs +17 -0
  24. package/dist/templates/partials/release-gate.hbs +63 -0
  25. package/dist/templates/partials/requirements-matrix.hbs +35 -0
  26. package/dist/templates/partials/slow-tests.hbs +27 -0
  27. package/dist/templates/partials/suite-breakdown.hbs +58 -0
  28. package/dist/templates/partials/watermark.hbs +3 -0
  29. package/dist/templates/styles/base.css +234 -0
  30. package/dist/templates/styles/detailed.css +311 -0
  31. package/dist/templates/styles/executive.css +334 -0
  32. package/dist/templates/styles/minimal.css +208 -0
  33. package/package.json +99 -0
@@ -0,0 +1,208 @@
1
+ /* ── Minimal Template · Claude Design Language ──────────────────────────── */
2
+
3
+ /* ── Header ─────────────────────────────────────────────────────────────── */
4
+ .report-header {
5
+ display: flex; align-items: center; gap: 16px;
6
+ padding: 20px 22px;
7
+ background: var(--surface);
8
+ border: 1px solid var(--border-2);
9
+ border-left: 3px solid var(--primary, #CC785C);
10
+ border-radius: 6px;
11
+ margin-bottom: 22px;
12
+ }
13
+ .report-header__logo { height: 36px; width: auto; }
14
+ .report-header__title {
15
+ font-family: 'Source Serif Pro', Georgia, serif;
16
+ font-size: 20px; font-weight: 700;
17
+ color: var(--text-1);
18
+ letter-spacing: -0.2px;
19
+ }
20
+ .report-header__meta {
21
+ font-size: 9.5px; color: var(--text-3); margin-top: 4px;
22
+ letter-spacing: 0.2px;
23
+ font-family: 'JetBrains Mono', monospace;
24
+ }
25
+
26
+ /* ── Verdict ─────────────────────────────────────────────────────────────── */
27
+ .verdict {
28
+ display: inline-flex; align-items: center; gap: 8px;
29
+ padding: 5px 14px; border-radius: 4px;
30
+ font-family: 'Inter', system-ui, sans-serif; font-weight: 600; font-size: 10px;
31
+ letter-spacing: 1px; text-transform: uppercase;
32
+ margin-bottom: 16px;
33
+ -webkit-print-color-adjust: exact;
34
+ print-color-adjust: exact;
35
+ }
36
+ .verdict::before {
37
+ content: ''; width: 6px; height: 6px; border-radius: 50%;
38
+ display: inline-block;
39
+ }
40
+ .verdict--passed {
41
+ background: var(--pass-dim); color: var(--pass);
42
+ border: 1px solid #C5DBC9;
43
+ }
44
+ .verdict--passed::before { background: var(--pass); }
45
+ .verdict--failed {
46
+ background: var(--fail-dim); color: var(--fail);
47
+ border: 1px solid #E5C9BD;
48
+ }
49
+ .verdict--failed::before { background: var(--fail); }
50
+ .verdict--timedout {
51
+ background: var(--timeout-dim); color: var(--timeout);
52
+ border: 1px solid #E5D2A8;
53
+ }
54
+ .verdict--timedout::before { background: var(--timeout); }
55
+ .verdict--interrupted {
56
+ background: var(--surface-2); color: var(--text-2);
57
+ border: 1px solid var(--border-2);
58
+ }
59
+ .verdict--interrupted::before { background: var(--text-3); }
60
+
61
+ /* ── KPI strip ───────────────────────────────────────────────────────────── */
62
+ .kpi-strip {
63
+ display: grid;
64
+ grid-template-columns: repeat(5, 1fr);
65
+ gap: 10px; margin-bottom: 22px;
66
+ }
67
+ .kpi-card {
68
+ background: var(--surface);
69
+ border: 1px solid var(--border-2);
70
+ border-radius: 6px;
71
+ padding: 16px 12px 12px; text-align: center;
72
+ position: relative; overflow: hidden;
73
+ }
74
+ .kpi-card::before {
75
+ content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px;
76
+ -webkit-print-color-adjust: exact;
77
+ print-color-adjust: exact;
78
+ }
79
+ .kpi-card--total::before { background: var(--accent); }
80
+ .kpi-card--pass::before { background: var(--pass); }
81
+ .kpi-card--fail::before { background: var(--fail); }
82
+ .kpi-card--skip::before { background: var(--skip); }
83
+ .kpi-card--flaky::before { background: var(--flaky); }
84
+
85
+ .kpi-card__value {
86
+ font-family: 'Source Serif Pro', Georgia, serif;
87
+ font-size: 28px; font-weight: 700; line-height: 1;
88
+ margin-top: 4px;
89
+ letter-spacing: -0.5px;
90
+ color: var(--text-1);
91
+ }
92
+ .kpi-card--total .kpi-card__value { color: var(--info); }
93
+ .kpi-card--pass .kpi-card__value { color: var(--pass); }
94
+ .kpi-card--fail .kpi-card__value { color: var(--fail); }
95
+ .kpi-card--skip .kpi-card__value { color: var(--skip); }
96
+ .kpi-card--flaky .kpi-card__value { color: var(--flaky); }
97
+
98
+ .kpi-card__label {
99
+ font-family: 'Inter', system-ui, sans-serif;
100
+ font-size: 8px; font-weight: 600; letter-spacing: 1.1px;
101
+ text-transform: uppercase; color: var(--text-3);
102
+ margin-top: 8px;
103
+ }
104
+ .kpi-card__rate {
105
+ font-size: 10px; font-weight: 600;
106
+ color: var(--pass); margin-top: 4px;
107
+ font-family: 'Inter', system-ui, sans-serif;
108
+ }
109
+
110
+ /* ── Summary row ─────────────────────────────────────────────────────────── */
111
+ .summary-row {
112
+ display: flex; gap: 0;
113
+ background: var(--surface);
114
+ border: 1px solid var(--border-2);
115
+ border-radius: 6px; margin-bottom: 22px;
116
+ font-size: 10.5px; overflow: hidden;
117
+ }
118
+ .summary-row__item {
119
+ display: flex; flex-direction: column;
120
+ padding: 12px 16px;
121
+ border-right: 1px solid var(--border);
122
+ flex: 1;
123
+ }
124
+ .summary-row__item:last-child { border-right: none; }
125
+ .summary-row__label {
126
+ font-size: 8px; letter-spacing: 1.1px; text-transform: uppercase;
127
+ color: var(--text-3); font-weight: 600;
128
+ font-family: 'Inter', system-ui, sans-serif;
129
+ }
130
+ .summary-row__value {
131
+ font-weight: 500; color: var(--text-1); margin-top: 4px;
132
+ font-family: 'JetBrains Mono', monospace;
133
+ font-size: 11px;
134
+ }
135
+
136
+ /* ── Suite breakdown ────────────────────────────────────────────────────── */
137
+ .suite-group {
138
+ background: var(--surface);
139
+ border: 1px solid var(--border-2);
140
+ border-radius: 6px; margin-bottom: 12px; overflow: hidden;
141
+ }
142
+ .suite-group__header {
143
+ padding: 10px 14px;
144
+ background: var(--surface-2);
145
+ border-bottom: 1px solid var(--border);
146
+ border-left: 3px solid var(--primary, #CC785C);
147
+ display: flex; justify-content: space-between; align-items: center;
148
+ }
149
+ .suite-title {
150
+ font-family: 'Inter', system-ui, sans-serif;
151
+ font-size: 11px; font-weight: 600;
152
+ color: var(--text-1);
153
+ letter-spacing: 0.1px;
154
+ }
155
+ .suite-stats { display: flex; gap: 6px; }
156
+ .test-path {
157
+ font-family: 'JetBrains Mono', monospace;
158
+ font-size: 8.5px; color: var(--text-3); margin-top: 2px;
159
+ }
160
+
161
+ /* ── Failure item ────────────────────────────────────────────────────────── */
162
+ .failure-item {
163
+ background: var(--surface);
164
+ border: 1px solid var(--border-2);
165
+ border-left: 3px solid var(--fail);
166
+ border-radius: 6px;
167
+ padding: 14px 16px; margin-bottom: 10px;
168
+ page-break-inside: avoid;
169
+ }
170
+ .failure-item__header {
171
+ display: flex; justify-content: space-between;
172
+ align-items: flex-start; margin-bottom: 8px;
173
+ }
174
+ .failure-item__title {
175
+ font-family: 'Inter', system-ui, sans-serif;
176
+ font-weight: 600; font-size: 12px;
177
+ color: var(--text-1); margin-bottom: 4px;
178
+ }
179
+ .failure-item__path {
180
+ font-family: 'JetBrains Mono', monospace;
181
+ font-size: 8.5px; color: var(--text-3); margin-bottom: 10px;
182
+ }
183
+ .failure-item__message {
184
+ background: var(--fail-dim);
185
+ border: 1px solid #E5C9BD;
186
+ border-left: 2px solid var(--fail);
187
+ border-radius: 4px;
188
+ padding: 9px 12px; margin-bottom: 10px;
189
+ font-family: 'JetBrains Mono', monospace;
190
+ font-size: 9.5px; color: #8A2E1E;
191
+ word-break: break-word; line-height: 1.6;
192
+ }
193
+ .retry-history {
194
+ font-size: 9px; color: var(--text-3); margin-top: 10px;
195
+ padding-top: 8px; border-top: 1px solid var(--border);
196
+ }
197
+ .retry-attempt {
198
+ display: inline-block; padding: 2px 7px;
199
+ border-radius: 3px; margin-right: 4px; font-size: 8.5px;
200
+ font-family: 'Inter', system-ui, sans-serif; font-weight: 600;
201
+ letter-spacing: 0.4px; text-transform: uppercase;
202
+ -webkit-print-color-adjust: exact;
203
+ print-color-adjust: exact;
204
+ }
205
+ .retry-attempt--failed { background: var(--fail-dim); color: var(--fail); border: 1px solid #E5C9BD; }
206
+ .retry-attempt--passed { background: var(--pass-dim); color: var(--pass); border: 1px solid #C5DBC9; }
207
+ </content>
208
+ </invoke>
package/package.json ADDED
@@ -0,0 +1,99 @@
1
+ {
2
+ "name": "@reportforge/playwright-pdf",
3
+ "version": "0.0.1",
4
+ "description": "Enterprise-ready PDF reports for Playwright Test — minimal, detailed, and executive templates with CI/CD integrations",
5
+ "license": "MIT",
6
+ "author": "ReportForge",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/muralidharan92/reportforge"
10
+ },
11
+ "keywords": [
12
+ "playwright",
13
+ "playwright-reporter",
14
+ "playwright-pdf",
15
+ "playwright-report",
16
+ "pdf",
17
+ "reporter",
18
+ "test-report",
19
+ "test-results",
20
+ "pdf-report",
21
+ "pdf-generator",
22
+ "ci",
23
+ "puppeteer",
24
+ "html-to-pdf"
25
+ ],
26
+ "main": "./dist/index.js",
27
+ "module": "./dist/index.mjs",
28
+ "types": "./dist/index.d.ts",
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "import": "./dist/index.mjs",
33
+ "require": "./dist/index.js"
34
+ }
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "files": [
40
+ "dist",
41
+ "ci-templates",
42
+ "README.md",
43
+ "CHANGELOG.md",
44
+ "LICENSE"
45
+ ],
46
+ "scripts": {
47
+ "prebuild": "npm run bundle-chartjs && npm run bundle-fonts && npm run bundle-pubkey && npm run precompile-templates",
48
+ "build": "tsup && npm run copy-templates",
49
+ "copy-templates": "node -e \"const fs=require('fs');const path=require('path');fs.cpSync('src/templates',path.join('dist','templates'),{recursive:true,filter:p=>!p.endsWith('.ts')});\"",
50
+ "bundle-chartjs": "tsx scripts/build/bundle-chartjs.ts",
51
+ "bundle-fonts": "tsx scripts/build/bundle-fonts.ts",
52
+ "bundle-pubkey": "tsx scripts/build/bundle-license-pubkey.ts",
53
+ "precompile-templates": "tsx scripts/build/precompile-templates.ts",
54
+ "dev": "tsup --watch",
55
+ "test": "vitest run",
56
+ "test:watch": "vitest",
57
+ "test:coverage": "vitest run --coverage",
58
+ "test:integration": "vitest run --config vitest.integration.config.ts",
59
+ "lint": "eslint src tests --ext .ts",
60
+ "typecheck": "tsc --noEmit",
61
+ "prepublishOnly": "npm run typecheck && npm run test && npm run build",
62
+ "generate-license": "tsx scripts/generate-license.ts",
63
+ "snapshot-png": "tsx scripts/snapshot-png.ts"
64
+ },
65
+ "peerDependencies": {
66
+ "@playwright/test": ">=1.40.0",
67
+ "puppeteer-core": ">=21.0.0 <25.0.0"
68
+ },
69
+ "dependencies": {
70
+ "chrome-finder": "^1.0.7",
71
+ "framer-motion": "^12.40.0",
72
+ "glob": "^13.0.6",
73
+ "handlebars": "^4.7.8",
74
+ "sharp": "^0.34.5",
75
+ "zod": "^3.23.8"
76
+ },
77
+ "devDependencies": {
78
+ "@fontsource/inter": "^5.2.8",
79
+ "@fontsource/jetbrains-mono": "^5.2.8",
80
+ "@fontsource/source-serif-pro": "^5.2.5",
81
+ "@playwright/test": "^1.49.0",
82
+ "@types/handlebars": "^4.1.0",
83
+ "@types/node": "^22.0.0",
84
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
85
+ "@typescript-eslint/parser": "^8.0.0",
86
+ "@vitest/coverage-v8": "^2.1.0",
87
+ "chart.js": "^4.4.0",
88
+ "eslint": "^9.0.0",
89
+ "prettier": "^3.3.0",
90
+ "puppeteer-core": "^23.0.0",
91
+ "tsup": "^8.3.0",
92
+ "tsx": "^4.19.0",
93
+ "typescript": "^5.6.0",
94
+ "vitest": "^2.1.0"
95
+ },
96
+ "engines": {
97
+ "node": ">=18.0.0"
98
+ }
99
+ }