@a11yst/reporters 1.0.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.
- package/LICENSE +373 -0
- package/README.md +78 -0
- package/dist/assets.d.ts +3 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +271 -0
- package/dist/assets.js.map +1 -0
- package/dist/baseline-report.d.ts +25 -0
- package/dist/baseline-report.d.ts.map +1 -0
- package/dist/baseline-report.js +426 -0
- package/dist/baseline-report.js.map +1 -0
- package/dist/finding-groups.d.ts +14 -0
- package/dist/finding-groups.d.ts.map +1 -0
- package/dist/finding-groups.js +77 -0
- package/dist/finding-groups.js.map +1 -0
- package/dist/finding-source-report.d.ts +21 -0
- package/dist/finding-source-report.d.ts.map +1 -0
- package/dist/finding-source-report.js +134 -0
- package/dist/finding-source-report.js.map +1 -0
- package/dist/github/escape.d.ts +13 -0
- package/dist/github/escape.d.ts.map +1 -0
- package/dist/github/escape.js +37 -0
- package/dist/github/escape.js.map +1 -0
- package/dist/github/generate.d.ts +3 -0
- package/dist/github/generate.d.ts.map +1 -0
- package/dist/github/generate.js +140 -0
- package/dist/github/generate.js.map +1 -0
- package/dist/github/source-location.d.ts +4 -0
- package/dist/github/source-location.d.ts.map +1 -0
- package/dist/github/source-location.js +69 -0
- package/dist/github/source-location.js.map +1 -0
- package/dist/github/types.d.ts +42 -0
- package/dist/github/types.d.ts.map +1 -0
- package/dist/github/types.js +18 -0
- package/dist/github/types.js.map +1 -0
- package/dist/html.d.ts +8 -0
- package/dist/html.d.ts.map +1 -0
- package/dist/html.js +562 -0
- package/dist/html.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown/escape.d.ts +5 -0
- package/dist/markdown/escape.d.ts.map +1 -0
- package/dist/markdown/escape.js +27 -0
- package/dist/markdown/escape.js.map +1 -0
- package/dist/markdown/generate.d.ts +3 -0
- package/dist/markdown/generate.d.ts.map +1 -0
- package/dist/markdown/generate.js +498 -0
- package/dist/markdown/generate.js.map +1 -0
- package/dist/markdown/links.d.ts +4 -0
- package/dist/markdown/links.d.ts.map +1 -0
- package/dist/markdown/links.js +30 -0
- package/dist/markdown/links.js.map +1 -0
- package/dist/markdown/types.d.ts +71 -0
- package/dist/markdown/types.d.ts.map +1 -0
- package/dist/markdown/types.js +2 -0
- package/dist/markdown/types.js.map +1 -0
- package/dist/profile-evidence.d.ts +21 -0
- package/dist/profile-evidence.d.ts.map +1 -0
- package/dist/profile-evidence.js +211 -0
- package/dist/profile-evidence.js.map +1 -0
- package/dist/validation.d.ts +10 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +96 -0
- package/dist/validation.js.map +1 -0
- package/package.json +43 -0
package/dist/html.js
ADDED
|
@@ -0,0 +1,562 @@
|
|
|
1
|
+
import { formatSeverityLabel, severityRank } from "@a11yst/types";
|
|
2
|
+
import { formatReportSourceLocation, resolveFindingReportSource, } from "./finding-source-report.js";
|
|
3
|
+
import { buildBaselineReportContext, renderBaselineFilters, renderBaselineFindingDataAttributes, renderBaselineLifecycleSections, renderBaselineMetadata, renderBaselineNavLinks, renderBaselineSummarySection, } from "./baseline-report.js";
|
|
4
|
+
import { renderProfileEvidenceSection, } from "./profile-evidence.js";
|
|
5
|
+
function escapeHtml(value) {
|
|
6
|
+
return String(value)
|
|
7
|
+
.replaceAll("&", "&")
|
|
8
|
+
.replaceAll("<", "<")
|
|
9
|
+
.replaceAll(">", ">")
|
|
10
|
+
.replaceAll('"', """)
|
|
11
|
+
.replaceAll("'", "'");
|
|
12
|
+
}
|
|
13
|
+
function compareText(left, right) {
|
|
14
|
+
const a = left ?? "";
|
|
15
|
+
const b = right ?? "";
|
|
16
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
17
|
+
}
|
|
18
|
+
function targetText(finding) {
|
|
19
|
+
return finding.target.join(" ");
|
|
20
|
+
}
|
|
21
|
+
function sortFindings(findings) {
|
|
22
|
+
return [...findings].sort((a, b) => severityRank(b.severity) - severityRank(a.severity) ||
|
|
23
|
+
compareText(a.projectName, b.projectName) ||
|
|
24
|
+
compareText(a.route ?? a.routeName ?? a.routeId, b.route ?? b.routeName ?? b.routeId) ||
|
|
25
|
+
compareText(a.viewport, b.viewport) ||
|
|
26
|
+
compareText(a.ruleId, b.ruleId) ||
|
|
27
|
+
compareText(targetText(a), targetText(b)));
|
|
28
|
+
}
|
|
29
|
+
function evidencePath(value) {
|
|
30
|
+
const normalized = value.replaceAll("\\", "/").replace(/^(\.\/|\/)+/, "");
|
|
31
|
+
const path = normalized
|
|
32
|
+
.split("/")
|
|
33
|
+
.filter((segment) => segment !== "" && segment !== "." && segment !== "..")
|
|
34
|
+
.map((segment) => encodeURIComponent(segment))
|
|
35
|
+
.join("/");
|
|
36
|
+
return `../${path || "evidence"}`;
|
|
37
|
+
}
|
|
38
|
+
function formatDuration(milliseconds) {
|
|
39
|
+
if (milliseconds < 1000)
|
|
40
|
+
return `${milliseconds} ms`;
|
|
41
|
+
return `${(milliseconds / 1000).toFixed(1)} s`;
|
|
42
|
+
}
|
|
43
|
+
function unique(values) {
|
|
44
|
+
return [...new Set(values.filter((value) => Boolean(value)))].sort(compareText);
|
|
45
|
+
}
|
|
46
|
+
function optionList(values) {
|
|
47
|
+
return values
|
|
48
|
+
.map((value) => `<option value="${escapeHtml(value)}">${escapeHtml(value)}</option>`)
|
|
49
|
+
.join("");
|
|
50
|
+
}
|
|
51
|
+
function filter(label, name, values, allLabel) {
|
|
52
|
+
return `<div class="filter-field">
|
|
53
|
+
<label for="filter-${name}">${escapeHtml(label)}</label>
|
|
54
|
+
<select id="filter-${name}" name="${escapeHtml(name)}">
|
|
55
|
+
<option value="">${escapeHtml(allLabel)}</option>
|
|
56
|
+
${optionList(values)}
|
|
57
|
+
</select>
|
|
58
|
+
</div>`;
|
|
59
|
+
}
|
|
60
|
+
function detail(label, value) {
|
|
61
|
+
return `<div><dt>${escapeHtml(label)}</dt><dd>${escapeHtml(value || "Not available")}</dd></div>`;
|
|
62
|
+
}
|
|
63
|
+
function findingStatus(finding, runs) {
|
|
64
|
+
return (runs.find((run) => run.findings.some((candidate) => candidate.id === finding.id &&
|
|
65
|
+
candidate.fingerprint === finding.fingerprint))?.status ?? "completed");
|
|
66
|
+
}
|
|
67
|
+
function findingScreenshot(finding, runs) {
|
|
68
|
+
if (finding.evidence?.screenshot)
|
|
69
|
+
return finding.evidence.screenshot;
|
|
70
|
+
if (finding.evidence?.pageScreenshot)
|
|
71
|
+
return finding.evidence.pageScreenshot;
|
|
72
|
+
return runs.find((run) => run.findings.some((candidate) => candidate.id === finding.id &&
|
|
73
|
+
candidate.fingerprint === finding.fingerprint))?.evidence?.screenshot;
|
|
74
|
+
}
|
|
75
|
+
function renderSourceSection(finding) {
|
|
76
|
+
const source = resolveFindingReportSource(finding);
|
|
77
|
+
if (source.status === "mapped" && source.location) {
|
|
78
|
+
const label = source.confidence === "exact" ? "Probable source" : "Probable source";
|
|
79
|
+
const provenance = source.provenance?.replace(/-/g, " ") ?? "source mapping";
|
|
80
|
+
return `<section class="finding-source" aria-labelledby="finding-source-${finding.id}">
|
|
81
|
+
<h4>Source</h4>
|
|
82
|
+
<p>${escapeHtml(label)}: <code>${escapeHtml(formatReportSourceLocation(source.location))}</code></p>
|
|
83
|
+
<p>Confidence: ${escapeHtml(source.confidence ?? "unknown")}</p>
|
|
84
|
+
<p>Matched through ${escapeHtml(provenance)}</p>
|
|
85
|
+
</section>`;
|
|
86
|
+
}
|
|
87
|
+
if (source.status === "ambiguous") {
|
|
88
|
+
const alternatives = source.alternatives ?? [];
|
|
89
|
+
const items = alternatives
|
|
90
|
+
.map((location) => `<li><code>${escapeHtml(formatReportSourceLocation(location))}</code></li>`)
|
|
91
|
+
.join("");
|
|
92
|
+
return `<section class="finding-source" aria-labelledby="finding-source-${finding.id}">
|
|
93
|
+
<h4>Source</h4>
|
|
94
|
+
<p>Source location is ambiguous.</p>
|
|
95
|
+
${items ? `<ul>${items}</ul>` : ""}
|
|
96
|
+
<p class="muted">Review the listed candidate locations before editing code.</p>
|
|
97
|
+
</section>`;
|
|
98
|
+
}
|
|
99
|
+
if (source.status === "invalid") {
|
|
100
|
+
return `<section class="finding-source"><h4>Source</h4><p class="muted">Source mapping is invalid for this finding.</p></section>`;
|
|
101
|
+
}
|
|
102
|
+
const route = finding.route ?? finding.flowId ?? "Not available";
|
|
103
|
+
return `<section class="finding-source"><h4>Source</h4><p>No source file was selected.</p><p>Context: ${escapeHtml(String(route))}</p></section>`;
|
|
104
|
+
}
|
|
105
|
+
function renderRecommendationsSection(finding) {
|
|
106
|
+
const recommendations = finding.recommendations;
|
|
107
|
+
if (!recommendations || recommendations.recommendations.length === 0) {
|
|
108
|
+
return "";
|
|
109
|
+
}
|
|
110
|
+
const primary = recommendations.recommendations[0];
|
|
111
|
+
const actions = primary.actions
|
|
112
|
+
.map((action) => `<li>${escapeHtml(action.title)}: ${escapeHtml(action.description)}</li>`)
|
|
113
|
+
.join("");
|
|
114
|
+
const verification = primary.verification
|
|
115
|
+
.map((step) => `<li>${escapeHtml(step.title)}: ${escapeHtml(step.description)}</li>`)
|
|
116
|
+
.join("");
|
|
117
|
+
const caveats = primary.caveats.map((caveat) => `<li>${escapeHtml(caveat)}</li>`).join("");
|
|
118
|
+
const examples = primary.examples
|
|
119
|
+
.map((example) => `<h5>${escapeHtml(example.title)}</h5><pre><code>${escapeHtml(example.code)}</code></pre>`)
|
|
120
|
+
.join("");
|
|
121
|
+
return `<section class="finding-recommendations" aria-labelledby="finding-recommendations-${finding.id}">
|
|
122
|
+
<h4>Recommendations</h4>
|
|
123
|
+
<p>Status: ${escapeHtml(recommendations.status)}</p>
|
|
124
|
+
<p>Applicability: ${escapeHtml(primary.applicability)}</p>
|
|
125
|
+
<p>${escapeHtml(primary.summary)}</p>
|
|
126
|
+
${actions ? `<h5>Actions</h5><ol>${actions}</ol>` : ""}
|
|
127
|
+
${verification ? `<h5>Verification</h5><ol>${verification}</ol>` : ""}
|
|
128
|
+
${caveats ? `<h5>Caveats</h5><ul>${caveats}</ul>` : ""}
|
|
129
|
+
${examples}
|
|
130
|
+
<p class="muted">Automated recommendations do not establish WCAG conformance or guarantee a correct fix.</p>
|
|
131
|
+
</section>`;
|
|
132
|
+
}
|
|
133
|
+
function renderFinding(finding, index, runs) {
|
|
134
|
+
const route = finding.route ?? finding.routeName ?? finding.routeId ?? "Not available";
|
|
135
|
+
const viewport = finding.viewport ?? "Not available";
|
|
136
|
+
const status = findingStatus(finding, runs);
|
|
137
|
+
const screenshot = findingScreenshot(finding, runs);
|
|
138
|
+
const description = finding.description ?? finding.message ?? "No description provided.";
|
|
139
|
+
const screenshotMarkup = screenshot
|
|
140
|
+
? `<img class="evidence" src="${escapeHtml(evidencePath(screenshot))}" alt="${escapeHtml(`Screenshot evidence for ${finding.title} in ${finding.projectName} at ${route}`)}">`
|
|
141
|
+
: `<p class="muted">No screenshot evidence is available for this finding.</p>`;
|
|
142
|
+
return `<article class="finding finding--${finding.severity}" ${renderBaselineFindingDataAttributes(finding)}
|
|
143
|
+
data-status="${escapeHtml(status)}"
|
|
144
|
+
data-automation="${escapeHtml(finding.automation ?? "automated")}"
|
|
145
|
+
data-confidence="${escapeHtml(finding.confidence ?? "high")}"
|
|
146
|
+
aria-labelledby="finding-${index}-title">
|
|
147
|
+
<h3 id="finding-${index}-title">${escapeHtml(finding.title)}</h3>
|
|
148
|
+
<p class="severity">Severity: ${escapeHtml(formatSeverityLabel(finding.severity))}</p>
|
|
149
|
+
<p>${escapeHtml(description)}</p>
|
|
150
|
+
<dl class="metadata">
|
|
151
|
+
${detail("Rule ID", finding.ruleId)}
|
|
152
|
+
${detail("Project", finding.projectName)}
|
|
153
|
+
${detail("Route", route)}
|
|
154
|
+
${detail("Flow", finding.flowId)}
|
|
155
|
+
${detail("Checkpoint", finding.checkpointId)}
|
|
156
|
+
${detail("URL", finding.url)}
|
|
157
|
+
${detail("Viewport", viewport)}
|
|
158
|
+
${detail("Profile", finding.profile)}
|
|
159
|
+
${detail("Target", finding.target.join(", "))}
|
|
160
|
+
${detail("Failure summary", finding.failureSummary)}
|
|
161
|
+
${detail("Standards", finding.standards.join(", "))}
|
|
162
|
+
${detail("Fingerprint", finding.fingerprint)}
|
|
163
|
+
${detail("Automation", finding.automation ?? "automated")}
|
|
164
|
+
${detail("Confidence", finding.confidence ?? "high")}
|
|
165
|
+
</dl>
|
|
166
|
+
${renderBaselineMetadata(finding)}
|
|
167
|
+
${renderSourceSection(finding)}
|
|
168
|
+
${renderRecommendationsSection(finding)}
|
|
169
|
+
<h4>HTML snippet</h4>
|
|
170
|
+
${finding.html
|
|
171
|
+
? `<pre><code>${escapeHtml(finding.html)}</code></pre>`
|
|
172
|
+
: `<p class="muted">No HTML snippet is available.</p>`}
|
|
173
|
+
${screenshotMarkup}
|
|
174
|
+
</article>`;
|
|
175
|
+
}
|
|
176
|
+
function renderDiagnostics(run) {
|
|
177
|
+
if (run.diagnostics.length === 0) {
|
|
178
|
+
return `<p class="muted">No diagnostics.</p>`;
|
|
179
|
+
}
|
|
180
|
+
return `<ul class="diagnostics">${run.diagnostics
|
|
181
|
+
.map((diagnostic) => `<li><strong>${escapeHtml(diagnostic.severity)}: ${escapeHtml(diagnostic.code)}</strong> — ${escapeHtml(diagnostic.message)}${diagnostic.hint ? ` ${escapeHtml(diagnostic.hint)}` : ""}</li>`)
|
|
182
|
+
.join("")}</ul>`;
|
|
183
|
+
}
|
|
184
|
+
function isWebProject(project) {
|
|
185
|
+
return project.platform === "web";
|
|
186
|
+
}
|
|
187
|
+
const FIRST_CLASS_ADAPTER_IDS = new Set([
|
|
188
|
+
"html",
|
|
189
|
+
"react",
|
|
190
|
+
"next",
|
|
191
|
+
"angular",
|
|
192
|
+
"vue",
|
|
193
|
+
"nuxt",
|
|
194
|
+
]);
|
|
195
|
+
function supportLevelLabel(project) {
|
|
196
|
+
if (FIRST_CLASS_ADAPTER_IDS.has(project.adapterId)) {
|
|
197
|
+
return "first-class";
|
|
198
|
+
}
|
|
199
|
+
if (project.framework === "unknown") {
|
|
200
|
+
return "unknown";
|
|
201
|
+
}
|
|
202
|
+
return "preview";
|
|
203
|
+
}
|
|
204
|
+
function collectProjectRoutes(projects) {
|
|
205
|
+
const rows = [];
|
|
206
|
+
for (const project of projects) {
|
|
207
|
+
for (const route of project.routes) {
|
|
208
|
+
rows.push({
|
|
209
|
+
projectName: project.name,
|
|
210
|
+
path: route.path,
|
|
211
|
+
origin: route.origin ?? "explicit",
|
|
212
|
+
...(route.sourceFile !== undefined ? { sourceFile: route.sourceFile } : {}),
|
|
213
|
+
...(route.pattern !== undefined ? { pattern: route.pattern } : {}),
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return rows.sort((left, right) => compareText(left.projectName, right.projectName) ||
|
|
218
|
+
compareText(left.path, right.path) ||
|
|
219
|
+
compareText(left.origin, right.origin));
|
|
220
|
+
}
|
|
221
|
+
function collectSkippedPatterns(auditResult) {
|
|
222
|
+
const patterns = new Map();
|
|
223
|
+
for (const diagnostic of [...auditResult.plan.diagnostics, ...auditResult.diagnostics]) {
|
|
224
|
+
const match = /Dynamic pattern "([^"]+)"/.exec(diagnostic.message);
|
|
225
|
+
if (match?.[1]) {
|
|
226
|
+
patterns.set(match[1], {
|
|
227
|
+
pattern: match[1],
|
|
228
|
+
reason: diagnostic.message,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return [...patterns.values()].sort((left, right) => compareText(left.pattern, right.pattern));
|
|
233
|
+
}
|
|
234
|
+
function collectAdapterDiagnostics(auditResult) {
|
|
235
|
+
return [...auditResult.plan.diagnostics, ...auditResult.diagnostics].filter((diagnostic) => diagnostic.code.startsWith("NEXT_") ||
|
|
236
|
+
diagnostic.code.startsWith("NUXT_") ||
|
|
237
|
+
diagnostic.code.startsWith("ANGULAR_") ||
|
|
238
|
+
diagnostic.code.startsWith("HTML_") ||
|
|
239
|
+
diagnostic.code.startsWith("REACT_") ||
|
|
240
|
+
diagnostic.code.startsWith("VUE_") ||
|
|
241
|
+
diagnostic.code.startsWith("GENERIC_") ||
|
|
242
|
+
diagnostic.code.includes("ROUTE") ||
|
|
243
|
+
diagnostic.code.includes("ADAPTER"));
|
|
244
|
+
}
|
|
245
|
+
function readinessStrategyLabel(run) {
|
|
246
|
+
if (run.adapter?.readinessStrategy) {
|
|
247
|
+
return run.adapter.readinessStrategy;
|
|
248
|
+
}
|
|
249
|
+
const selectors = {
|
|
250
|
+
next: "#__next, body",
|
|
251
|
+
nuxt: "#__nuxt, body",
|
|
252
|
+
react: "#root, [data-reactroot], body",
|
|
253
|
+
vue: "#app, [data-v-app], body",
|
|
254
|
+
angular: "app-root, body",
|
|
255
|
+
html: "body (load)",
|
|
256
|
+
};
|
|
257
|
+
return selectors[run.framework] ?? "domcontentloaded + body";
|
|
258
|
+
}
|
|
259
|
+
function renderFrameworkIntegration(projects) {
|
|
260
|
+
if (projects.length === 0) {
|
|
261
|
+
return `<p class="muted">No web project metadata is available for this audit.</p>`;
|
|
262
|
+
}
|
|
263
|
+
const rows = projects
|
|
264
|
+
.map((project) => `<tr>
|
|
265
|
+
<td>${escapeHtml(project.name)}</td>
|
|
266
|
+
<td>${escapeHtml(project.framework)}</td>
|
|
267
|
+
<td>${escapeHtml(project.adapterId)}</td>
|
|
268
|
+
<td>${escapeHtml(supportLevelLabel(project))}</td>
|
|
269
|
+
</tr>`)
|
|
270
|
+
.join("");
|
|
271
|
+
return `<div class="table-wrap" tabindex="0">
|
|
272
|
+
<table>
|
|
273
|
+
<caption class="visually-hidden">Framework integration per configured web project</caption>
|
|
274
|
+
<thead>
|
|
275
|
+
<tr>
|
|
276
|
+
<th scope="col">Project</th>
|
|
277
|
+
<th scope="col">Framework</th>
|
|
278
|
+
<th scope="col">Adapter</th>
|
|
279
|
+
<th scope="col">Support level</th>
|
|
280
|
+
</tr>
|
|
281
|
+
</thead>
|
|
282
|
+
<tbody>${rows}</tbody>
|
|
283
|
+
</table>
|
|
284
|
+
</div>`;
|
|
285
|
+
}
|
|
286
|
+
function renderRouteTable(routes) {
|
|
287
|
+
if (routes.length === 0) {
|
|
288
|
+
return `<p class="muted">No resolved routes were recorded for this audit.</p>`;
|
|
289
|
+
}
|
|
290
|
+
const rows = routes
|
|
291
|
+
.map((route) => `<tr>
|
|
292
|
+
<td>${escapeHtml(route.projectName)}</td>
|
|
293
|
+
<td>${escapeHtml(route.path)}</td>
|
|
294
|
+
<td>${escapeHtml(route.origin)}</td>
|
|
295
|
+
<td>${escapeHtml(route.sourceFile ?? "Not available")}</td>
|
|
296
|
+
<td>${escapeHtml(route.pattern ?? "Not available")}</td>
|
|
297
|
+
</tr>`)
|
|
298
|
+
.join("");
|
|
299
|
+
return `<div class="table-wrap" tabindex="0">
|
|
300
|
+
<table>
|
|
301
|
+
<caption class="visually-hidden">Resolved routes included in the audit plan</caption>
|
|
302
|
+
<thead>
|
|
303
|
+
<tr>
|
|
304
|
+
<th scope="col">Project</th>
|
|
305
|
+
<th scope="col">Path</th>
|
|
306
|
+
<th scope="col">Origin</th>
|
|
307
|
+
<th scope="col">Source file</th>
|
|
308
|
+
<th scope="col">Pattern</th>
|
|
309
|
+
</tr>
|
|
310
|
+
</thead>
|
|
311
|
+
<tbody>${rows}</tbody>
|
|
312
|
+
</table>
|
|
313
|
+
</div>`;
|
|
314
|
+
}
|
|
315
|
+
function renderSkippedPatterns(patterns) {
|
|
316
|
+
if (patterns.length === 0) {
|
|
317
|
+
return `<p class="muted">No dynamic route patterns were skipped.</p>`;
|
|
318
|
+
}
|
|
319
|
+
return `<ul class="diagnostics">${patterns
|
|
320
|
+
.map((pattern) => `<li><strong>${escapeHtml(pattern.pattern)}</strong> — ${escapeHtml(pattern.reason)}${pattern.sourceFile ? ` (${escapeHtml(pattern.sourceFile)})` : ""}</li>`)
|
|
321
|
+
.join("")}</ul>`;
|
|
322
|
+
}
|
|
323
|
+
function renderRun(run, index, loadedEvidence) {
|
|
324
|
+
const route = run.kind === "flow-checkpoint"
|
|
325
|
+
? `${run.flowName ?? run.flowId ?? "Flow"} — ${run.checkpointName ?? run.checkpointId ?? "checkpoint"}`
|
|
326
|
+
: run.route ?? run.routeName ?? run.routeId ?? "Not available";
|
|
327
|
+
const screenshot = run.evidence?.screenshot;
|
|
328
|
+
const hasStructuredEvidence = loadedEvidence?.has(run.runId) ?? false;
|
|
329
|
+
const evidenceAnchor = hasStructuredEvidence
|
|
330
|
+
? `<p><a href="#profile-evidence">View structured profile evidence</a> for this run.</p>`
|
|
331
|
+
: "";
|
|
332
|
+
const flowDetails = run.kind === "flow-checkpoint"
|
|
333
|
+
? `${detail("Flow", run.flowName ?? run.flowId)}
|
|
334
|
+
${detail("Checkpoint", run.checkpointName ?? run.checkpointId)}
|
|
335
|
+
${detail("Flow start", run.route)}
|
|
336
|
+
${detail("Flow trace", run.flowTracePath)}`
|
|
337
|
+
: "";
|
|
338
|
+
return `<article class="run" aria-labelledby="run-${index}-title">
|
|
339
|
+
<h3 id="run-${index}-title">${escapeHtml(run.projectName)} — ${escapeHtml(route)}</h3>
|
|
340
|
+
<p class="status">Status: ${escapeHtml(run.status)}</p>
|
|
341
|
+
<dl class="metadata">
|
|
342
|
+
${detail("Run ID", run.runId)}
|
|
343
|
+
${detail("Kind", run.kind ?? "route")}
|
|
344
|
+
${detail("Profile", run.profile)}
|
|
345
|
+
${detail("Viewport", run.viewport?.name)}
|
|
346
|
+
${detail("URL", run.url ?? run.evidence?.finalUrl)}
|
|
347
|
+
${detail("Duration", formatDuration(run.durationMs))}
|
|
348
|
+
${detail("Findings", String(run.findings.length))}
|
|
349
|
+
${flowDetails}
|
|
350
|
+
${detail("Readiness strategy", readinessStrategyLabel(run))}
|
|
351
|
+
${detail("Skip reason", run.skipReason)}
|
|
352
|
+
</dl>
|
|
353
|
+
${run.findings.length === 0
|
|
354
|
+
? `<p class="muted">No findings were recorded for this run.</p>`
|
|
355
|
+
: ""}
|
|
356
|
+
${screenshot
|
|
357
|
+
? `<img class="evidence" src="${escapeHtml(evidencePath(screenshot))}" alt="${escapeHtml(`Page screenshot for ${run.projectName} at ${route}`)}">`
|
|
358
|
+
: `<p class="muted">No run screenshot is available.</p>`}
|
|
359
|
+
${evidenceAnchor}
|
|
360
|
+
<h4>Diagnostics</h4>
|
|
361
|
+
${renderDiagnostics(run)}
|
|
362
|
+
</article>`;
|
|
363
|
+
}
|
|
364
|
+
function renderProfileCoverage(auditResult) {
|
|
365
|
+
const summary = auditResult.profileSummary;
|
|
366
|
+
if (!summary) {
|
|
367
|
+
return `<p class="muted">Profile coverage summary is not available for this audit.</p>`;
|
|
368
|
+
}
|
|
369
|
+
const cards = summary.coverage
|
|
370
|
+
.filter((entry, index, all) => all.findIndex((candidate) => candidate.profile === entry.profile) === index)
|
|
371
|
+
.map((entry) => {
|
|
372
|
+
const lists = [
|
|
373
|
+
entry.automatedChecks.length > 0
|
|
374
|
+
? `<div><h4>Automated</h4><ul>${entry.automatedChecks
|
|
375
|
+
.map((item) => `<li>${escapeHtml(item)}</li>`)
|
|
376
|
+
.join("")}</ul></div>`
|
|
377
|
+
: "",
|
|
378
|
+
entry.heuristicChecks.length > 0
|
|
379
|
+
? `<div><h4>Heuristic</h4><ul>${entry.heuristicChecks
|
|
380
|
+
.map((item) => `<li>${escapeHtml(item)}</li>`)
|
|
381
|
+
.join("")}</ul></div>`
|
|
382
|
+
: "",
|
|
383
|
+
entry.manualChecks.length > 0
|
|
384
|
+
? `<div><h4>Manual review still required</h4><ul>${entry.manualChecks
|
|
385
|
+
.map((item) => `<li>${escapeHtml(item)}</li>`)
|
|
386
|
+
.join("")}</ul></div>`
|
|
387
|
+
: "",
|
|
388
|
+
entry.limitations.length > 0
|
|
389
|
+
? `<div><h4>Limitations</h4><ul>${entry.limitations
|
|
390
|
+
.map((item) => `<li>${escapeHtml(item)}</li>`)
|
|
391
|
+
.join("")}</ul></div>`
|
|
392
|
+
: "",
|
|
393
|
+
].join("");
|
|
394
|
+
return `<article class="coverage-card coverage-card--profile">
|
|
395
|
+
<h3>${escapeHtml(entry.profile.toUpperCase())}</h3>
|
|
396
|
+
<p class="status">Status: ${escapeHtml(entry.status)}</p>
|
|
397
|
+
${lists || `<p class="muted">No coverage metadata recorded.</p>`}
|
|
398
|
+
</article>`;
|
|
399
|
+
})
|
|
400
|
+
.join("");
|
|
401
|
+
const totalFindings = summary.findingsByAutomation.automated +
|
|
402
|
+
summary.findingsByAutomation.heuristic +
|
|
403
|
+
summary.findingsByAutomation["manual-review"];
|
|
404
|
+
return `<div class="coverage-grid coverage-grid--profiles">${cards}</div>
|
|
405
|
+
<dl class="metadata metadata--inline coverage-stats">
|
|
406
|
+
<div><dt>Findings</dt><dd>${totalFindings}</dd></div>
|
|
407
|
+
<div><dt>Automated</dt><dd>${summary.findingsByAutomation.automated}</dd></div>
|
|
408
|
+
<div><dt>Heuristic</dt><dd>${summary.findingsByAutomation.heuristic}</dd></div>
|
|
409
|
+
<div><dt>Generated manual checks</dt><dd>${summary.findingsByAutomation["manual-review"]}</dd></div>
|
|
410
|
+
<div><dt>Manual review pending</dt><dd>${summary.manualReviewPending}</dd></div>
|
|
411
|
+
</dl>`;
|
|
412
|
+
}
|
|
413
|
+
export function renderHtmlReport(auditResult, options = {}) {
|
|
414
|
+
const findings = sortFindings(auditResult.findings);
|
|
415
|
+
const baselineContext = buildBaselineReportContext(auditResult);
|
|
416
|
+
const reportId = options.auditId ?? auditResult.auditId;
|
|
417
|
+
const loadedEvidence = options.loadedProfileEvidence;
|
|
418
|
+
const title = reportId
|
|
419
|
+
? `a11yst accessibility report — ${reportId}`
|
|
420
|
+
: "a11yst accessibility report";
|
|
421
|
+
const webProjects = auditResult.plan.projects.filter(isWebProject);
|
|
422
|
+
const routeRows = collectProjectRoutes(webProjects);
|
|
423
|
+
const skippedPatterns = collectSkippedPatterns(auditResult);
|
|
424
|
+
const adapterDiagnostics = collectAdapterDiagnostics(auditResult);
|
|
425
|
+
const routes = findings.map((finding) => finding.route ?? finding.routeName ?? finding.routeId ?? "Not available");
|
|
426
|
+
const flows = unique(findings.map((finding) => finding.flowId));
|
|
427
|
+
const checkpoints = unique(findings.map((finding) => finding.checkpointId));
|
|
428
|
+
const viewports = findings.map((finding) => finding.viewport ?? "Not available");
|
|
429
|
+
const statuses = findings.map((finding) => findingStatus(finding, auditResult.runs));
|
|
430
|
+
return `<!doctype html>
|
|
431
|
+
<html lang="en">
|
|
432
|
+
<head>
|
|
433
|
+
<meta charset="utf-8">
|
|
434
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
435
|
+
<title>${escapeHtml(title)}</title>
|
|
436
|
+
<link rel="stylesheet" href="styles.css">
|
|
437
|
+
<script src="report.js" defer></script>
|
|
438
|
+
</head>
|
|
439
|
+
<body>
|
|
440
|
+
<a class="skip-link" href="#main-content">Skip to main content</a>
|
|
441
|
+
<header class="site-header">
|
|
442
|
+
<div class="site-header__inner">
|
|
443
|
+
<h1>${escapeHtml(title)}</h1>
|
|
444
|
+
<p>Static accessibility audit results</p>
|
|
445
|
+
<nav aria-label="Report sections">
|
|
446
|
+
<ul>
|
|
447
|
+
<li><a href="#summary">Summary</a></li>
|
|
448
|
+
${renderBaselineNavLinks(baselineContext)}
|
|
449
|
+
<li><a href="#framework-integration">Framework integration</a></li>
|
|
450
|
+
<li><a href="#findings">Findings</a></li>
|
|
451
|
+
<li><a href="#runs">Runs</a></li>
|
|
452
|
+
<li><a href="#profile-evidence">Profile evidence</a></li>
|
|
453
|
+
<li><a href="#coverage">Coverage</a></li>
|
|
454
|
+
</ul>
|
|
455
|
+
</nav>
|
|
456
|
+
</div>
|
|
457
|
+
</header>
|
|
458
|
+
<main id="main-content">
|
|
459
|
+
<section id="summary" aria-labelledby="summary-title">
|
|
460
|
+
<h2 id="summary-title">Summary</h2>
|
|
461
|
+
<div class="summary-grid">
|
|
462
|
+
<div class="summary-card"><span>Total findings</span><strong>${auditResult.summary.findingCount}</strong></div>
|
|
463
|
+
<div class="summary-card summary-card--critical"><span>Critical severity</span><strong>${auditResult.summary.findingsBySeverity.critical}</strong></div>
|
|
464
|
+
<div class="summary-card summary-card--high"><span>High severity</span><strong>${auditResult.summary.findingsBySeverity.high}</strong></div>
|
|
465
|
+
<div class="summary-card summary-card--medium"><span>Medium severity</span><strong>${auditResult.summary.findingsBySeverity.medium}</strong></div>
|
|
466
|
+
<div class="summary-card summary-card--minor"><span>Minor severity</span><strong>${auditResult.summary.findingsBySeverity.minor}</strong></div>
|
|
467
|
+
<div class="summary-card"><span>Completed runs</span><strong>${auditResult.summary.completedRuns}</strong></div>
|
|
468
|
+
<div class="summary-card"><span>Skipped runs</span><strong>${auditResult.summary.skippedRuns}</strong></div>
|
|
469
|
+
<div class="summary-card"><span>Failed runs</span><strong>${auditResult.summary.failedRuns}</strong></div>
|
|
470
|
+
${auditResult.flowSummary
|
|
471
|
+
? `<div class="summary-card"><span>Configured flows</span><strong>${auditResult.flowSummary.configuredFlows}</strong></div>
|
|
472
|
+
<div class="summary-card"><span>Completed checkpoints</span><strong>${auditResult.flowSummary.completedCheckpoints}</strong></div>
|
|
473
|
+
<div class="summary-card"><span>Skipped checkpoints</span><strong>${auditResult.flowSummary.skippedCheckpoints}</strong></div>`
|
|
474
|
+
: ""}
|
|
475
|
+
</div>
|
|
476
|
+
<p>Audit duration: ${escapeHtml(formatDuration(auditResult.summary.durationMs))}</p>
|
|
477
|
+
</section>
|
|
478
|
+
|
|
479
|
+
${renderBaselineSummarySection(baselineContext)}
|
|
480
|
+
|
|
481
|
+
${renderBaselineLifecycleSections(baselineContext, findings, (finding, index) => renderFinding(finding, index, auditResult.runs))}
|
|
482
|
+
|
|
483
|
+
<section id="framework-integration" aria-labelledby="framework-integration-title">
|
|
484
|
+
<h2 id="framework-integration-title">Framework integration</h2>
|
|
485
|
+
${renderFrameworkIntegration(webProjects)}
|
|
486
|
+
|
|
487
|
+
<h3 id="route-table-title">Resolved routes</h3>
|
|
488
|
+
${renderRouteTable(routeRows)}
|
|
489
|
+
|
|
490
|
+
<h3 id="skipped-patterns-title">Skipped dynamic patterns</h3>
|
|
491
|
+
${renderSkippedPatterns(skippedPatterns)}
|
|
492
|
+
|
|
493
|
+
<h3 id="adapter-diagnostics-title">Adapter diagnostics</h3>
|
|
494
|
+
${adapterDiagnostics.length === 0
|
|
495
|
+
? `<p class="muted">No adapter diagnostics were recorded.</p>`
|
|
496
|
+
: `<ul class="diagnostics">${adapterDiagnostics
|
|
497
|
+
.map((diagnostic) => `<li><strong>${escapeHtml(diagnostic.severity)}: ${escapeHtml(diagnostic.code)}</strong> — ${escapeHtml(diagnostic.message)}${diagnostic.hint ? ` ${escapeHtml(diagnostic.hint)}` : ""}</li>`)
|
|
498
|
+
.join("")}</ul>`}
|
|
499
|
+
</section>
|
|
500
|
+
|
|
501
|
+
<section id="findings" aria-labelledby="findings-title">
|
|
502
|
+
<h2 id="findings-title">Findings</h2>
|
|
503
|
+
<form class="filters" data-report-filters>
|
|
504
|
+
<div class="filter-grid">
|
|
505
|
+
${renderBaselineFilters(findings, baselineContext)}
|
|
506
|
+
${filter("Severity", "severity", ["critical", "high", "medium", "minor"], "All severities")}
|
|
507
|
+
${filter("Project", "project", unique(findings.map((finding) => finding.projectName)), "All projects")}
|
|
508
|
+
${filter("Route", "route", unique(routes), "All routes")}
|
|
509
|
+
${flows.length > 0 ? filter("Flow", "flow", flows, "All flows") : ""}
|
|
510
|
+
${checkpoints.length > 0 ? filter("Checkpoint", "checkpoint", checkpoints, "All checkpoints") : ""}
|
|
511
|
+
${filter("Viewport", "viewport", unique(viewports), "All viewports")}
|
|
512
|
+
${filter("Profile", "profile", unique(findings.map((finding) => finding.profile)), "All profiles")}
|
|
513
|
+
${filter("Source", "source", unique(findings.map((finding) => finding.source)), "All sources")}
|
|
514
|
+
${filter("Automation", "automation", unique(findings.map((finding) => finding.automation ?? "automated")), "All automation types")}
|
|
515
|
+
${filter("Confidence", "confidence", unique(findings.map((finding) => finding.confidence ?? "high")), "All confidence levels")}
|
|
516
|
+
${filter("Rule", "rule", unique(findings.map((finding) => finding.ruleId)), "All rules")}
|
|
517
|
+
${filter("Run status", "status", unique(statuses), "All statuses")}
|
|
518
|
+
</div>
|
|
519
|
+
<button type="reset">Clear filters</button>
|
|
520
|
+
</form>
|
|
521
|
+
<p class="result-count" data-result-count aria-live="polite">${findings.length} ${findings.length === 1 ? "finding" : "findings"} shown</p>
|
|
522
|
+
${findings.length === 0
|
|
523
|
+
? `<div class="empty-state"><h3>No findings</h3><p>No accessibility findings were recorded in this audit.</p></div>`
|
|
524
|
+
: `<div class="findings-list">${findings
|
|
525
|
+
.map((finding, index) => renderFinding(finding, index, auditResult.runs))
|
|
526
|
+
.join("")}</div>`}
|
|
527
|
+
</section>
|
|
528
|
+
|
|
529
|
+
<section id="runs" aria-labelledby="runs-title">
|
|
530
|
+
<h2 id="runs-title">Runs</h2>
|
|
531
|
+
${auditResult.runs.length === 0
|
|
532
|
+
? `<div class="empty-state"><h3>No runs</h3><p>No audit runs were recorded.</p></div>`
|
|
533
|
+
: `<div class="run-grid">${auditResult.runs
|
|
534
|
+
.map((run, index) => renderRun(run, index, loadedEvidence))
|
|
535
|
+
.join("")}</div>`}
|
|
536
|
+
</section>
|
|
537
|
+
|
|
538
|
+
<section id="profile-evidence" aria-labelledby="profile-evidence-title">
|
|
539
|
+
<h2 id="profile-evidence-title">Profile evidence</h2>
|
|
540
|
+
<p class="muted">Structured keyboard focus sequences and large-text before/after comparisons captured during profile runs.</p>
|
|
541
|
+
${renderProfileEvidenceSection(auditResult.runs, loadedEvidence ?? new Map())}
|
|
542
|
+
</section>
|
|
543
|
+
|
|
544
|
+
<section id="coverage" aria-labelledby="coverage-title">
|
|
545
|
+
<h2 id="coverage-title">Coverage and limitations</h2>
|
|
546
|
+
<h3 id="profile-coverage-title">Profile coverage</h3>
|
|
547
|
+
${renderProfileCoverage(auditResult)}
|
|
548
|
+
<div class="disclaimers">
|
|
549
|
+
<p>a11yst does not certify WCAG conformance.</p>
|
|
550
|
+
<p>Automated checks cover only part of accessibility.</p>
|
|
551
|
+
<p>Manual review and testing with disabled users remain necessary.</p>
|
|
552
|
+
</div>
|
|
553
|
+
</section>
|
|
554
|
+
</main>
|
|
555
|
+
<footer>
|
|
556
|
+
<p>Generated by a11yst${reportId ? ` for audit ${escapeHtml(reportId)}` : ""}.</p>
|
|
557
|
+
</footer>
|
|
558
|
+
</body>
|
|
559
|
+
</html>
|
|
560
|
+
`;
|
|
561
|
+
}
|
|
562
|
+
//# sourceMappingURL=html.js.map
|
package/dist/html.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AuditExecutionResult } from "@a11yst/types";
|
|
2
|
+
export { renderReportScript, renderReportStyles } from "./assets.js";
|
|
3
|
+
export { renderHtmlReport, type RenderHtmlReportOptions, } from "./html.js";
|
|
4
|
+
export { loadProfileEvidenceForReport, renderFocusSequenceBlock, renderLargeTextComparisonBlock, renderProfileEvidenceSection, type FocusSequenceEvidence, type LayoutComparisonEvidence, type LoadedProfileEvidence, } from "./profile-evidence.js";
|
|
5
|
+
export { readAuditResult, validateAuditResultDocument, } from "./validation.js";
|
|
6
|
+
export { generateMarkdownReport } from "./markdown/generate.js";
|
|
7
|
+
export type { MarkdownReportInput, MarkdownReportOptions, MarkdownReportResult, MarkdownReportDiagnostic, MarkdownReportDiagnosticCode, ReportReference, } from "./markdown/types.js";
|
|
8
|
+
export { generateGitHubAnnotations } from "./github/generate.js";
|
|
9
|
+
export type { GitHubAnnotation, GitHubAnnotationInput, GitHubAnnotationOptions, GitHubAnnotationGenerationResult, GitHubAnnotationDiagnostic, GitHubAnnotationLevel, } from "./github/types.js";
|
|
10
|
+
export { escapeMarkdownText, escapeMarkdownTableCell, escapeMarkdownLinkLabel, encodeMarkdownLinkTarget, } from "./markdown/escape.js";
|
|
11
|
+
export { escapeGitHubCommandProperty, escapeGitHubCommandMessage, serializeGitHubAnnotationCommand, } from "./github/escape.js";
|
|
12
|
+
export { buildFindingGroupKey, countUniqueIssues, groupFindings, type FindingGroup, } from "./finding-groups.js";
|
|
13
|
+
export { formatReportSourceLocation, formatSafeReportSourceLocation, sanitizeSourceUriForReport, resolveFindingRecommendationSummary, resolveFindingReportSource, } from "./finding-source-report.js";
|
|
14
|
+
export interface GenerateHtmlReportOptions {
|
|
15
|
+
auditResult: AuditExecutionResult;
|
|
16
|
+
outputDirectory: string;
|
|
17
|
+
auditId?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface GeneratedHtmlReport {
|
|
20
|
+
indexPath: string;
|
|
21
|
+
assets: string[];
|
|
22
|
+
}
|
|
23
|
+
export declare function generateHtmlReport({ auditResult, outputDirectory, auditId, }: GenerateHtmlReportOptions): Promise<GeneratedHtmlReport>;
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAK1D,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,GAC7B,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,EACxB,8BAA8B,EAC9B,4BAA4B,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,eAAe,EACf,2BAA2B,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,YAAY,EACV,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,4BAA4B,EAC5B,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,YAAY,EACV,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,gCAAgC,EAChC,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,2BAA2B,EAC3B,0BAA0B,EAC1B,gCAAgC,GACjC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,KAAK,YAAY,GAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,0BAA0B,EAC1B,mCAAmC,EACnC,0BAA0B,GAC3B,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,oBAAoB,CAAC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,wBAAsB,kBAAkB,CAAC,EACvC,WAAW,EACX,eAAe,EACf,OAAO,GACR,EAAE,yBAAyB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAyB1D"}
|