testaro 78.0.8 → 78.4.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/.gitattributes +94 -0
- package/.github/workflows/ci.yml +58 -0
- package/.github/workflows/publish.yml +49 -0
- package/.github/workflows/typescript.yml +35 -0
- package/AGENTS.md +2 -2
- package/CLAUDE.md +24 -18
- package/CONTAINERS.md +9 -6
- package/CONTRIBUTING.md +29 -3
- package/Dockerfile +1 -1
- package/README.md +73 -19
- package/UPGRADES.md +4 -0
- package/actSpecs-doc.md +13 -1
- package/actSpecs.js +29 -5
- package/call.js +6 -5
- package/docker-compose.yml +8 -2
- package/docs/checkpoint-scanning.md +199 -0
- package/docs/standard-result-outcome.md +165 -0
- package/env.example +44 -10
- package/eslint.config.mjs +101 -0
- package/netWatch.js +372 -222
- package/package.json +46 -31
- package/pour/README.md +47 -0
- package/pour/pour.min.js +8 -0
- package/procs/actDo.js +808 -0
- package/procs/catalog.d.ts +17 -0
- package/procs/catalog.js +312 -221
- package/procs/catalog.ts +398 -0
- package/procs/checkpoint.js +110 -0
- package/procs/config.d.ts +35 -0
- package/procs/config.js +62 -0
- package/procs/dateTime.js +2 -1
- package/procs/doActs.js +442 -849
- package/procs/doTestAct.js +27 -121
- package/procs/flow.js +221 -0
- package/procs/generateRuleRegistry.js +94 -0
- package/procs/getSource.d.ts +26 -0
- package/procs/job.js +115 -1
- package/procs/launch.d.ts +40 -0
- package/procs/launch.js +239 -108
- package/procs/nu.d.ts +48 -0
- package/procs/scope.js +196 -0
- package/procs/shoot.d.ts +33 -0
- package/procs/standard.d.ts +18 -0
- package/procs/standard.js +83 -0
- package/procs/standard.ts +126 -0
- package/procs/testAct.js +145 -0
- package/procs/testaro.d.ts +20 -0
- package/procs/testaro.js +236 -189
- package/procs/testaro.ts +321 -0
- package/procs/userPath.js +126 -0
- package/procs/xPath.d.ts +4 -0
- package/procs/xPath.js +81 -69
- package/procs/xPath.ts +106 -0
- package/procs/xPathScript.d.ts +6 -0
- package/procs/xPathScript.js +70 -0
- package/run.js +3 -2
- package/surea11y/README.md +44 -0
- package/surea11y/surea11y.browser.js +14 -0
- package/testaro/adbID.d.ts +3 -0
- package/testaro/adbID.js +38 -41
- package/testaro/adbID.ts +66 -0
- package/testaro/allCapStyle.d.ts +3 -0
- package/testaro/allCapStyle.js +31 -34
- package/testaro/allCapStyle.ts +55 -0
- package/testaro/allCaps.d.ts +16 -0
- package/testaro/allCaps.js +179 -151
- package/testaro/allCaps.ts +228 -0
- package/testaro/allHidden.d.ts +13 -0
- package/testaro/allHidden.js +29 -30
- package/testaro/allHidden.ts +50 -0
- package/testaro/allSlanted.d.ts +3 -0
- package/testaro/allSlanted.js +30 -33
- package/testaro/allSlanted.ts +54 -0
- package/testaro/altScheme.d.ts +3 -0
- package/testaro/altScheme.js +27 -30
- package/testaro/altScheme.ts +50 -0
- package/testaro/attVal.d.ts +3 -0
- package/testaro/attVal.js +20 -21
- package/testaro/attVal.ts +52 -0
- package/testaro/autocomplete.d.ts +3 -0
- package/testaro/autocomplete.js +59 -75
- package/testaro/autocomplete.ts +101 -0
- package/testaro/bulk.d.ts +13 -0
- package/testaro/bulk.js +32 -33
- package/testaro/bulk.ts +55 -0
- package/testaro/buttonMenu.d.ts +9 -0
- package/testaro/buttonMenu.js +317 -319
- package/testaro/buttonMenu.ts +391 -0
- package/testaro/captionLoc.d.ts +3 -0
- package/testaro/captionLoc.js +17 -20
- package/testaro/captionLoc.ts +40 -0
- package/testaro/datalistRef.d.ts +3 -0
- package/testaro/datalistRef.js +33 -36
- package/testaro/datalistRef.ts +55 -0
- package/testaro/distortion.d.ts +3 -0
- package/testaro/distortion.js +57 -26
- package/testaro/distortion.ts +81 -0
- package/testaro/docType.d.ts +15 -0
- package/testaro/docType.js +25 -25
- package/testaro/docType.ts +45 -0
- package/testaro/dupAtt.d.ts +16 -0
- package/testaro/dupAtt.js +113 -104
- package/testaro/dupAtt.ts +144 -0
- package/testaro/elements.d.ts +6 -0
- package/testaro/elements.js +153 -153
- package/testaro/elements.ts +215 -0
- package/testaro/embAc.d.ts +3 -0
- package/testaro/embAc.js +19 -20
- package/testaro/embAc.ts +40 -0
- package/testaro/focAll.d.ts +13 -0
- package/testaro/focAll.js +185 -191
- package/testaro/focAll.ts +217 -0
- package/testaro/focAndOp.d.ts +3 -0
- package/testaro/focAndOp.js +100 -104
- package/testaro/focAndOp.ts +128 -0
- package/testaro/focInd.d.ts +3 -0
- package/testaro/focInd.js +64 -66
- package/testaro/focInd.ts +96 -0
- package/testaro/focVis.d.ts +3 -0
- package/testaro/focVis.js +28 -30
- package/testaro/focVis.ts +52 -0
- package/testaro/headEl.d.ts +10 -0
- package/testaro/headEl.js +61 -62
- package/testaro/headEl.ts +82 -0
- package/testaro/headingAmb.d.ts +3 -0
- package/testaro/headingAmb.js +54 -63
- package/testaro/headingAmb.ts +72 -0
- package/testaro/hovInd.d.ts +12 -0
- package/testaro/hovInd.js +163 -130
- package/testaro/hovInd.ts +199 -0
- package/testaro/hover.d.ts +3 -0
- package/testaro/hover.js +155 -126
- package/testaro/hover.ts +154 -0
- package/testaro/hr.d.ts +3 -0
- package/testaro/hr.js +14 -17
- package/testaro/hr.ts +36 -0
- package/testaro/imageLink.d.ts +3 -0
- package/testaro/imageLink.js +17 -20
- package/testaro/imageLink.ts +42 -0
- package/testaro/labClash.d.ts +3 -0
- package/testaro/labClash.js +31 -33
- package/testaro/labClash.ts +54 -0
- package/testaro/legendLoc.d.ts +3 -0
- package/testaro/legendLoc.js +17 -20
- package/testaro/legendLoc.ts +42 -0
- package/testaro/lineHeight.d.ts +3 -0
- package/testaro/lineHeight.js +43 -48
- package/testaro/lineHeight.ts +70 -0
- package/testaro/linkAmb.d.ts +7 -0
- package/testaro/linkAmb.js +79 -80
- package/testaro/linkAmb.ts +105 -0
- package/testaro/linkExt.d.ts +3 -0
- package/testaro/linkExt.js +13 -16
- package/testaro/linkExt.ts +35 -0
- package/testaro/linkOldAtt.d.ts +3 -0
- package/testaro/linkOldAtt.js +25 -28
- package/testaro/linkOldAtt.ts +48 -0
- package/testaro/linkTo.d.ts +3 -0
- package/testaro/linkTo.js +22 -22
- package/testaro/linkTo.ts +43 -0
- package/testaro/linkUl.d.ts +3 -0
- package/testaro/linkUl.js +30 -34
- package/testaro/linkUl.ts +54 -0
- package/testaro/miniText.d.ts +3 -0
- package/testaro/miniText.js +41 -44
- package/testaro/miniText.ts +68 -0
- package/testaro/motion.d.ts +10 -0
- package/testaro/motion.js +92 -96
- package/testaro/motion.ts +125 -0
- package/testaro/nonTable.d.ts +3 -0
- package/testaro/nonTable.js +39 -45
- package/testaro/nonTable.ts +66 -0
- package/testaro/optRoleSel.d.ts +3 -0
- package/testaro/optRoleSel.js +16 -19
- package/testaro/optRoleSel.ts +41 -0
- package/testaro/phOnly.d.ts +3 -0
- package/testaro/phOnly.js +18 -21
- package/testaro/phOnly.ts +43 -0
- package/testaro/pseudoP.d.ts +3 -0
- package/testaro/pseudoP.js +36 -38
- package/testaro/pseudoP.ts +59 -0
- package/testaro/radioSet.d.ts +3 -0
- package/testaro/radioSet.js +57 -59
- package/testaro/radioSet.ts +79 -0
- package/testaro/registry.d.ts +63 -0
- package/testaro/registry.js +67 -0
- package/testaro/registry.ts +141 -0
- package/testaro/role.d.ts +3 -0
- package/testaro/role.js +27 -29
- package/testaro/role.ts +53 -0
- package/testaro/secHeading.d.ts +3 -0
- package/testaro/secHeading.js +30 -33
- package/testaro/secHeading.ts +53 -0
- package/testaro/styleDiff.d.ts +25 -0
- package/testaro/styleDiff.js +248 -252
- package/testaro/styleDiff.ts +303 -0
- package/testaro/tabNav.d.ts +33 -0
- package/testaro/tabNav.js +272 -342
- package/testaro/tabNav.ts +454 -0
- package/testaro/targetsNear.d.ts +9 -0
- package/testaro/targetsNear.js +130 -132
- package/testaro/targetsNear.ts +160 -0
- package/testaro/textNodes.d.ts +6 -0
- package/testaro/textNodes.js +139 -135
- package/testaro/textNodes.ts +185 -0
- package/testaro/textSem.d.ts +3 -0
- package/testaro/textSem.js +25 -28
- package/testaro/textSem.ts +47 -0
- package/testaro/title.d.ts +9 -0
- package/testaro/title.js +16 -13
- package/testaro/title.ts +31 -0
- package/testaro/titledEl.d.ts +3 -0
- package/testaro/titledEl.js +15 -18
- package/testaro/titledEl.ts +38 -0
- package/testaro/zIndex.d.ts +3 -0
- package/testaro/zIndex.js +19 -22
- package/testaro/zIndex.ts +42 -0
- package/tests/alfa.d.ts +45 -0
- package/tests/alfa.js +138 -141
- package/tests/alfa.ts +214 -0
- package/tests/aslint.d.ts +33 -0
- package/tests/aslint.js +272 -249
- package/tests/aslint.ts +301 -0
- package/tests/axe.d.ts +27 -0
- package/tests/axe.js +199 -200
- package/tests/axe.ts +277 -0
- package/tests/ed11y.d.ts +28 -0
- package/tests/ed11y.js +141 -99
- package/tests/ed11y.ts +178 -0
- package/tests/htmlcs.d.ts +21 -0
- package/tests/htmlcs.js +174 -140
- package/tests/htmlcs.ts +181 -0
- package/tests/ibm.d.ts +52 -0
- package/tests/ibm.js +164 -166
- package/tests/ibm.ts +251 -0
- package/tests/nuVal.d.ts +13 -0
- package/tests/nuVal.js +107 -112
- package/tests/nuVal.ts +145 -0
- package/tests/nuVnu.d.ts +15 -0
- package/tests/nuVnu.js +141 -111
- package/tests/nuVnu.ts +144 -0
- package/tests/pour.d.ts +31 -0
- package/tests/pour.js +242 -0
- package/tests/pour.ts +273 -0
- package/tests/qualWeb.d.ts +39 -0
- package/tests/qualWeb.js +302 -272
- package/tests/qualWeb.ts +415 -0
- package/tests/surea11y.d.ts +33 -0
- package/tests/surea11y.js +288 -0
- package/tests/surea11y.ts +334 -0
- package/tests/testaro.d.ts +25 -0
- package/tests/testaro.js +745 -652
- package/tests/testaro.ts +862 -0
- package/tests/wave.d.ts +46 -0
- package/tests/wave.js +166 -177
- package/tests/wave.ts +252 -0
- package/tsconfig.json +17 -0
- package/types.d.ts +243 -0
- package/types.js +10 -0
- package/types.ts +376 -0
- package/validation/act/README.md +46 -0
- package/validation/act/capture.js +424 -0
- package/validation/act/chromium-issue-draft.md +66 -0
- package/validation/act/fp-triage-2026-08-22.md +86 -0
- package/validation/act/isolation-notes.md +159 -0
- package/validation/act/playwright-issue-draft.md +73 -0
- package/validation/act/propose-mappings.js +0 -0
- package/validation/act/repro-cdp-raw.js +105 -0
- package/validation/act/repro-metarefresh.js +65 -0
- package/validation/act/score.js +184 -0
- package/validation/act/stage3a-stress-report.md +69 -0
- package/validation/act/stage3b-mapping-proposals.md +94 -0
- package/validation/act/stage3b-triage-draft.md +138 -0
- package/validation/act/surea11y-track-a-2026-09-01.md +50 -0
- package/validation/executors/netWatch.js +180 -90
- package/validation/executors/test.js +17 -2
- package/validation/executors/tests.js +118 -10
- package/validation/jobs/reports/raw/260901T1000-surea11y-validation.json +964 -0
- package/validation/jobs/todo/240101T1200-simple-example.json +14 -6
- package/validation/jobs/todo/240101T1300-shoot-example.json +2 -1
- package/validation/jobs/todo/260821T1900-pour-validation.json +45 -0
- package/validation/jobs/todo/260901T1000-surea11y-validation.json +45 -0
- package/validation/knownFailures.json +1 -0
- package/validation/tests/jobProperties/adbID.json +27 -2
- package/validation/tests/jobProperties/{focOp.json → allCapStyle.json} +56 -53
- package/validation/tests/jobProperties/allCaps.json +25 -0
- package/validation/tests/jobProperties/allHidden.json +133 -13
- package/validation/tests/jobProperties/allSlanted.json +3 -3
- package/validation/tests/jobProperties/altScheme.json +23 -8
- package/validation/tests/jobProperties/attVal.json +57 -57
- package/validation/tests/jobProperties/autocomplete.json +11 -1
- package/validation/tests/jobProperties/bulk.json +6 -1
- package/validation/tests/jobProperties/buttonMenu.json +63 -42
- package/validation/tests/jobProperties/captionLoc.json +1 -6
- package/validation/tests/jobProperties/checkpoint-browser.json +401 -0
- package/validation/tests/jobProperties/checkpoint-page.json +397 -0
- package/validation/tests/jobProperties/checkpoint.json +395 -0
- package/validation/tests/jobProperties/datalistRef.json +20 -5
- package/validation/tests/jobProperties/distortion.json +28 -3
- package/validation/tests/jobProperties/docType.json +2 -2
- package/validation/tests/jobProperties/dupAtt.json +48 -33
- package/validation/tests/jobProperties/elements.json +28 -28
- package/validation/tests/jobProperties/embAc.json +36 -31
- package/validation/tests/jobProperties/focAndOp.json +284 -0
- package/validation/tests/jobProperties/focInd.json +34 -34
- package/validation/tests/jobProperties/focVis.json +1 -1
- package/validation/tests/jobProperties/hover.json +39 -37
- package/validation/tests/jobProperties/hr.json +13 -3
- package/validation/tests/jobProperties/imageLink.json +0 -5
- package/validation/tests/jobProperties/labClash.json +68 -33
- package/validation/tests/jobProperties/legendLoc.json +1 -6
- package/validation/tests/jobProperties/lineHeight.json +2 -2
- package/validation/tests/jobProperties/linkAmb.json +13 -18
- package/validation/tests/jobProperties/linkExt.json +1 -1
- package/validation/tests/jobProperties/linkOldAtt.json +12 -2
- package/validation/tests/jobProperties/linkTo.json +1 -1
- package/validation/tests/jobProperties/linkUl.json +65 -65
- package/validation/tests/jobProperties/miniText.json +7 -2
- package/validation/tests/jobProperties/motion.json +4 -50
- package/validation/tests/jobProperties/nonTable.json +48 -3
- package/validation/tests/jobProperties/optRoleSel.json +12 -2
- package/validation/tests/jobProperties/phOnly.json +6 -16
- package/validation/tests/jobProperties/pseudoP.json +17 -2
- package/validation/tests/jobProperties/radioSet.json +30 -30
- package/validation/tests/jobProperties/role.json +25 -5
- package/validation/tests/jobProperties/secHeading.json +26 -21
- package/validation/tests/jobProperties/styleDiff.json +35 -5
- package/validation/tests/jobProperties/tabNav.json +3 -1
- package/validation/tests/jobProperties/targetsNear.json +237 -0
- package/validation/tests/jobProperties/textNodes.json +29 -29
- package/validation/tests/jobProperties/textSem.json +26 -1
- package/validation/tests/jobProperties/title.json +12 -2
- package/validation/tests/jobProperties/titledEl.json +39 -9
- package/validation/tests/jobProperties/userPath.json +317 -0
- package/validation/tests/jobProperties/zIndex.json +40 -35
- package/validation/tests/targets/allCapStyle/index.html +26 -0
- package/validation/tests/targets/checkpoint/index.html +38 -0
- package/validation/tests/targets/datalistRef/index.html +1 -1
- package/validation/tests/targets/focAndOp/bad.html +29 -0
- package/validation/tests/targets/{focOp → focAndOp}/good.html +3 -1
- package/validation/tests/targets/focInd/bad.html +2 -1
- package/validation/tests/targets/headEl/index.html +10 -1
- package/validation/tests/targets/{targetSmall → targetsNear}/index.html +15 -1
- package/validation/tests/targets/userPath/index.html +42 -0
- package/validation/validateTest.js +61 -9
- package/.claude/settings.local.json +0 -11
- package/.eslintrc.json +0 -41
- package/htmlcs/.eslintrc.json +0 -67
- package/validation/tests/jobProperties/linkTitle.json +0 -127
- package/validation/tests/jobProperties/opFoc.json +0 -164
- package/validation/tests/jobProperties/targetSmall.json +0 -152
- package/validation/tests/jobProperties/targetTiny.json +0 -142
- package/validation/tests/targets/focOp/bad.html +0 -25
- package/validation/tests/targets/linkTitle/index.html +0 -24
- package/validation/tests/targets/opFoc/bad.html +0 -26
- package/validation/tests/targets/opFoc/good.html +0 -23
package/tests/alfa.ts
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/*
|
|
2
|
+
© 2021–2024 CVS Health and/or one of its affiliates. All rights reserved.
|
|
3
|
+
© 2026 Jeff Witt.
|
|
4
|
+
© 2025–2026 Jonathan Robert Pool.
|
|
5
|
+
|
|
6
|
+
Licensed under the MIT License. See LICENSE file at the project root or
|
|
7
|
+
https://opensource.org/license/mit/ for details.
|
|
8
|
+
|
|
9
|
+
SPDX-License-Identifier: MIT
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
// IMPORTS
|
|
13
|
+
|
|
14
|
+
import type {Page} from 'playwright';
|
|
15
|
+
import {getNormalizedXPath, getXPathCatalogIndex} from '../procs/xPath';
|
|
16
|
+
import {getStandardResult, addInstance} from '../procs/standard';
|
|
17
|
+
import {applyMultiplier} from '../procs/config';
|
|
18
|
+
import type {Act, Report, StandardInstance, StandardResult} from '../types';
|
|
19
|
+
/*
|
|
20
|
+
The alfa packages are pure ESM that Node loads via require(esm); their own
|
|
21
|
+
types do not resolve under this project's node10 module resolution, so the
|
|
22
|
+
imports stay requires and are untyped.
|
|
23
|
+
*/
|
|
24
|
+
let alfaRules = require('@siteimprove/alfa-rules').default;
|
|
25
|
+
const {Audit} = require('@siteimprove/alfa-act');
|
|
26
|
+
const {Playwright} = require('@siteimprove/alfa-playwright');
|
|
27
|
+
|
|
28
|
+
// TYPES
|
|
29
|
+
|
|
30
|
+
// The alfa-act properties this reporter consumes.
|
|
31
|
+
interface AlfaAct extends Act {
|
|
32
|
+
rules?: string[];
|
|
33
|
+
}
|
|
34
|
+
// One evaluation of the audit, before JSON conversion.
|
|
35
|
+
interface AlfaEvaluation {
|
|
36
|
+
target?: {
|
|
37
|
+
_members?: unknown;
|
|
38
|
+
toString: () => string;
|
|
39
|
+
path: () => string;
|
|
40
|
+
};
|
|
41
|
+
toJSON: () => AlfaEvalItem;
|
|
42
|
+
}
|
|
43
|
+
// One element-specific item converted from an evaluation.
|
|
44
|
+
interface AlfaEvalItem {
|
|
45
|
+
diagnostic?: {
|
|
46
|
+
errors?: {
|
|
47
|
+
element?: unknown;
|
|
48
|
+
positionedDescendants?: unknown;
|
|
49
|
+
}[];
|
|
50
|
+
};
|
|
51
|
+
expectations?: {
|
|
52
|
+
error?: {
|
|
53
|
+
message?: string;
|
|
54
|
+
};
|
|
55
|
+
}[][];
|
|
56
|
+
outcome: string;
|
|
57
|
+
rule: {
|
|
58
|
+
requirements?: {title?: string}[];
|
|
59
|
+
uri: string;
|
|
60
|
+
};
|
|
61
|
+
target?: {children?: unknown};
|
|
62
|
+
code?: string;
|
|
63
|
+
path?: string;
|
|
64
|
+
}
|
|
65
|
+
// The native result: violation totals and element-specific items.
|
|
66
|
+
interface AlfaNativeResult {
|
|
67
|
+
totals: {
|
|
68
|
+
failed: number;
|
|
69
|
+
cantTell: number;
|
|
70
|
+
};
|
|
71
|
+
items: AlfaEvalItem[];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/*
|
|
75
|
+
alfa
|
|
76
|
+
Implements the alfa ruleset for accessibility.
|
|
77
|
+
Compiled to alfa.js by tsc (issue #73); edit this file, not the emitted one.
|
|
78
|
+
*/
|
|
79
|
+
|
|
80
|
+
// FUNCTIONS
|
|
81
|
+
|
|
82
|
+
// Conducts and reports the alfa tests.
|
|
83
|
+
export const reporter = async (page: Page, report: Report, actIndex: number) => {
|
|
84
|
+
const act = report.acts[actIndex] as AlfaAct;
|
|
85
|
+
const {rules} = act;
|
|
86
|
+
// If only some rules are to be employed:
|
|
87
|
+
if (rules && rules.length) {
|
|
88
|
+
// Remove the other rules.
|
|
89
|
+
alfaRules = alfaRules.filter(
|
|
90
|
+
(rule: {uri: string}) => rules.includes(rule.uri.replace(/^.+-/, ''))
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
// Initialize the act report.
|
|
94
|
+
const data: {prevented?: boolean; error?: string} = {};
|
|
95
|
+
const result: {nativeResult: AlfaNativeResult; standardResult: StandardResult} = {
|
|
96
|
+
nativeResult: {
|
|
97
|
+
totals: {
|
|
98
|
+
failed: 0,
|
|
99
|
+
cantTell: 0
|
|
100
|
+
},
|
|
101
|
+
items: []
|
|
102
|
+
},
|
|
103
|
+
standardResult: {}
|
|
104
|
+
};
|
|
105
|
+
const standard = report.standard !== 'no';
|
|
106
|
+
// If standard results are to be reported:
|
|
107
|
+
if (standard) {
|
|
108
|
+
// Initialize the standard result.
|
|
109
|
+
result.standardResult = getStandardResult();
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
try {
|
|
113
|
+
// Wait for a stable page to make the page and its alfa version consistent.
|
|
114
|
+
await page.waitForLoadState('networkidle', {timeout: applyMultiplier(9000)});
|
|
115
|
+
}
|
|
116
|
+
// If that fails:
|
|
117
|
+
catch (error) {
|
|
118
|
+
// Wait for the page to be loaded.
|
|
119
|
+
await page.waitForLoadState('domcontentloaded', {timeout: applyMultiplier(6000)});
|
|
120
|
+
}
|
|
121
|
+
const doc = await page.evaluateHandle('document');
|
|
122
|
+
const alfaPage = await Playwright.toPage(doc);
|
|
123
|
+
// Test the page content with the specified rules.
|
|
124
|
+
const audit = Audit.of(alfaPage, alfaRules);
|
|
125
|
+
// Get the evaluations.
|
|
126
|
+
const evaluations: AlfaEvaluation[] = Array.from(await audit.evaluate());
|
|
127
|
+
const {nativeResult, standardResult} = result;
|
|
128
|
+
// For each of them:
|
|
129
|
+
for (const index in evaluations) {
|
|
130
|
+
const evaluation = evaluations[index as unknown as number];
|
|
131
|
+
const targetClass = evaluation.target;
|
|
132
|
+
// If it has a non-collection violator:
|
|
133
|
+
if (targetClass && ! targetClass._members) {
|
|
134
|
+
// Convert the evaluation to an element-specific item.
|
|
135
|
+
const item = evaluation.toJSON();
|
|
136
|
+
const {diagnostic, expectations, outcome, rule, target} = item;
|
|
137
|
+
// If the outcome of the item is a failure or warning:
|
|
138
|
+
if (['failed', 'cantTell'].includes(outcome)) {
|
|
139
|
+
// Delete typically massive properties unlikely to be useful.
|
|
140
|
+
delete target!.children;
|
|
141
|
+
if (diagnostic?.errors) {
|
|
142
|
+
diagnostic.errors.forEach(error => {
|
|
143
|
+
delete error.element;
|
|
144
|
+
delete error.positionedDescendants;
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
// Increment the applicable total.
|
|
148
|
+
nativeResult.totals[outcome as 'failed' | 'cantTell']++;
|
|
149
|
+
const codeLines = targetClass.toString().split('\n');
|
|
150
|
+
if (codeLines[0] === '#document') {
|
|
151
|
+
codeLines.splice(2, codeLines.length - 3, ' … ');
|
|
152
|
+
}
|
|
153
|
+
else if (codeLines[0].startsWith('<html')) {
|
|
154
|
+
codeLines.splice(1, codeLines.length - 2, ' … ');
|
|
155
|
+
}
|
|
156
|
+
let code = codeLines.join('/n');
|
|
157
|
+
if (code.length > 400) {
|
|
158
|
+
code = `${code.slice(0, 300)} … ${code.slice(-100)}`;
|
|
159
|
+
}
|
|
160
|
+
// Add properties of the evaluation to the item.
|
|
161
|
+
item.code = code;
|
|
162
|
+
item.path = targetClass.path();
|
|
163
|
+
// Add the item to the items of the native result.
|
|
164
|
+
nativeResult.items.push(item);
|
|
165
|
+
// If standard results are to be reported:
|
|
166
|
+
if (standard) {
|
|
167
|
+
const {requirements, uri} = rule;
|
|
168
|
+
// Get the rule ID of the item.
|
|
169
|
+
const ruleID = uri.replace(/^.+-/, '');
|
|
170
|
+
// Get the rule description of the item.
|
|
171
|
+
let what = (expectations?.[0]?.[1]?.error?.message || '').trim().replace(/\s+/g, ' ');
|
|
172
|
+
if (! what) {
|
|
173
|
+
if (requirements && requirements.length && requirements[0].title) {
|
|
174
|
+
what = requirements[0].title;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// An untestable item keeps its rule ID; its outcome records the uncertainty. The
|
|
178
|
+
// contrast rules (r66, r69) cannot tell when a background needs human judgement.
|
|
179
|
+
const isCantTell = outcome === 'cantTell';
|
|
180
|
+
const xPath = getNormalizedXPath(item.path?.replace(/\/text\(\).*$/, '') || '/html');
|
|
181
|
+
// Add an instance to the standard instances.
|
|
182
|
+
addInstance(standardResult, {
|
|
183
|
+
ruleID,
|
|
184
|
+
what,
|
|
185
|
+
ordinalSeverity: isCantTell ? 0 : 2,
|
|
186
|
+
outcome: isCantTell ? 'cantTell' : 'failed',
|
|
187
|
+
uncertainty: isCantTell && ['r66', 'r69'].includes(ruleID)
|
|
188
|
+
? 'judgement-required'
|
|
189
|
+
: undefined,
|
|
190
|
+
catalogIndex: getXPathCatalogIndex(report, xPath)
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
catch(error) {
|
|
198
|
+
data.prevented = true;
|
|
199
|
+
const {message} = error as Error;
|
|
200
|
+
if (message) {
|
|
201
|
+
if (message.includes('Unsupported node of type: 4')) {
|
|
202
|
+
data.error = 'Alfa cannot test page because it contains CDATA';
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
data.error = message;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
console.log(`ERROR: ${data.error}`);
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
data,
|
|
212
|
+
result
|
|
213
|
+
};
|
|
214
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Page } from 'playwright';
|
|
2
|
+
import type { Report, StandardResult } from '../types';
|
|
3
|
+
interface AslintResultItem {
|
|
4
|
+
message?: {
|
|
5
|
+
actual?: {
|
|
6
|
+
description?: string;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
element?: {
|
|
10
|
+
xpath?: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
interface AslintRuleData {
|
|
14
|
+
issueType: string;
|
|
15
|
+
status: {
|
|
16
|
+
type: string;
|
|
17
|
+
};
|
|
18
|
+
results: AslintResultItem[];
|
|
19
|
+
}
|
|
20
|
+
interface AslintNativeResult {
|
|
21
|
+
rules?: Record<string, AslintRuleData>;
|
|
22
|
+
}
|
|
23
|
+
export declare const reporter: (page: Page, report: Report, actIndex: number) => Promise<{
|
|
24
|
+
data: {
|
|
25
|
+
prevented?: boolean;
|
|
26
|
+
error?: string;
|
|
27
|
+
};
|
|
28
|
+
result: {
|
|
29
|
+
nativeResult: AslintNativeResult;
|
|
30
|
+
standardResult: StandardResult;
|
|
31
|
+
};
|
|
32
|
+
}>;
|
|
33
|
+
export {};
|