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/aslint.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/*
|
|
2
3
|
© 2023–2024 CVS Health and/or one of its affiliates. All rights reserved.
|
|
3
4
|
© 2026 Jeff Witt.
|
|
@@ -8,21 +9,48 @@
|
|
|
8
9
|
|
|
9
10
|
SPDX-License-Identifier: MIT
|
|
10
11
|
*/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.reporter = void 0;
|
|
17
47
|
// IMPORTS
|
|
18
|
-
|
|
19
|
-
const fs = require('fs/promises');
|
|
48
|
+
const fs = __importStar(require("fs/promises"));
|
|
20
49
|
// Shared configuration for timeout multiplier.
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
|
|
50
|
+
const config_1 = require("../procs/config");
|
|
51
|
+
const xPath_1 = require("../procs/xPath");
|
|
52
|
+
const standard_1 = require("../procs/standard");
|
|
24
53
|
// CONSTANTS
|
|
25
|
-
|
|
26
54
|
/*
|
|
27
55
|
Differentiates some rule IDs of aslint.
|
|
28
56
|
If the purported rule ID is a key and the what property contains all of the strings except the
|
|
@@ -30,252 +58,247 @@ const {getNormalizedXPath, getXPathCatalogIndex} = require('../procs/xPath');
|
|
|
30
58
|
array item.
|
|
31
59
|
*/
|
|
32
60
|
const aslintData = {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
61
|
+
'misused_required_attribute': [
|
|
62
|
+
['not needed', 'misused_required_attributeR']
|
|
63
|
+
],
|
|
64
|
+
'accessible_svg': [
|
|
65
|
+
['associated', 'accessible_svgI'],
|
|
66
|
+
['tabindex', 'accessible_svgT']
|
|
67
|
+
],
|
|
68
|
+
'audio_alternative': [
|
|
69
|
+
['track', 'audio_alternativeT'],
|
|
70
|
+
['alternative', 'audio_alternativeA'],
|
|
71
|
+
['bgsound', 'audio_alternativeB']
|
|
72
|
+
],
|
|
73
|
+
'table_missing_description': [
|
|
74
|
+
['describedby', 'associated', 'table_missing_descriptionDM'],
|
|
75
|
+
['labeledby', 'associated', 'table_missing_descriptionLM'],
|
|
76
|
+
['caption', 'not been defined', 'table_missing_descriptionC'],
|
|
77
|
+
['summary', 'empty', 'table_missing_descriptionS'],
|
|
78
|
+
['describedby', 'empty', 'table_missing_descriptionDE'],
|
|
79
|
+
['labeledby', 'empty', 'table_missing_descriptionLE'],
|
|
80
|
+
['caption', 'no content', 'table_missing_descriptionE']
|
|
81
|
+
],
|
|
82
|
+
'label_implicitly_associated': [
|
|
83
|
+
['only whice spaces', 'label_implicitly_associatedW'],
|
|
84
|
+
['more than one', 'label_implicitly_associatedM']
|
|
85
|
+
],
|
|
86
|
+
'label_inappropriate_association': [
|
|
87
|
+
['Missing', 'label_inappropriate_associationM'],
|
|
88
|
+
['non-form', 'label_inappropriate_associationN']
|
|
89
|
+
],
|
|
90
|
+
'table_row_and_column_headers': [
|
|
91
|
+
['headers', 'table_row_and_column_headersRC'],
|
|
92
|
+
['Content', 'table_row_and_column_headersB'],
|
|
93
|
+
['head of the columns', 'table_row_and_column_headersH']
|
|
94
|
+
],
|
|
95
|
+
'color_contrast_state_pseudo_classes_abstract': [
|
|
96
|
+
['position: fixed', 'color_contrast_state_pseudo_classes_abstractF'],
|
|
97
|
+
['transparent', 'color_contrast_state_pseudo_classes_abstractB'],
|
|
98
|
+
['least 3:1', 'color_contrast_state_pseudo_classes_abstract3'],
|
|
99
|
+
['least 4.5:1', 'color_contrast_state_pseudo_classes_abstract4']
|
|
100
|
+
],
|
|
101
|
+
'color_contrast_state_pseudo_classes_active': [
|
|
102
|
+
['position: fixed', 'color_contrast_state_pseudo_classes_abstractF'],
|
|
103
|
+
['transparent', 'color_contrast_state_pseudo_classes_abstractB'],
|
|
104
|
+
['least 3:1', 'color_contrast_state_pseudo_classes_abstract3'],
|
|
105
|
+
['least 4.5:1', 'color_contrast_state_pseudo_classes_abstract4']
|
|
106
|
+
],
|
|
107
|
+
'color_contrast_state_pseudo_classes_focus': [
|
|
108
|
+
['position: fixed', 'color_contrast_state_pseudo_classes_abstractF'],
|
|
109
|
+
['transparent', 'color_contrast_state_pseudo_classes_abstractB'],
|
|
110
|
+
['least 3:1', 'color_contrast_state_pseudo_classes_abstract3'],
|
|
111
|
+
['least 4.5:1', 'color_contrast_state_pseudo_classes_abstract4']
|
|
112
|
+
],
|
|
113
|
+
'color_contrast_state_pseudo_classes_hover': [
|
|
114
|
+
['position: fixed', 'color_contrast_state_pseudo_classes_abstractF'],
|
|
115
|
+
['transparent', 'color_contrast_state_pseudo_classes_abstractB'],
|
|
116
|
+
['least 3:1', 'color_contrast_state_pseudo_classes_abstract3'],
|
|
117
|
+
['least 4.5:1', 'color_contrast_state_pseudo_classes_abstract4']
|
|
118
|
+
],
|
|
119
|
+
'color_contrast_aaa': [
|
|
120
|
+
['transparent', 'color_contrast_aaaB'],
|
|
121
|
+
['least 4.5:1', 'color_contrast_aaa4'],
|
|
122
|
+
['least 7:1', 'color_contrast_aaa7']
|
|
123
|
+
],
|
|
124
|
+
'animation': [
|
|
125
|
+
['duration', 'animationD'],
|
|
126
|
+
['iteration', 'animationI'],
|
|
127
|
+
['mechanism', 'animationM']
|
|
128
|
+
],
|
|
129
|
+
'page_title': [
|
|
130
|
+
['empty', 'page_titleN'],
|
|
131
|
+
['not identify', 'page_titleU']
|
|
132
|
+
],
|
|
133
|
+
'aria_labelledby_association': [
|
|
134
|
+
['exist', 'aria_labelledby_associationN'],
|
|
135
|
+
['empty', 'aria_labelledby_associationE']
|
|
136
|
+
],
|
|
137
|
+
'html_lang_attr': [
|
|
138
|
+
['parameters', 'html_lang_attrP'],
|
|
139
|
+
['nothing', 'html_lang_attrN'],
|
|
140
|
+
['empty', 'html_lang_attrE']
|
|
141
|
+
],
|
|
142
|
+
'missing_label': [
|
|
143
|
+
['associated', 'missing_labelI'],
|
|
144
|
+
['defined', 'missing_labelN'],
|
|
145
|
+
['multiple labels', 'missing_labelM']
|
|
146
|
+
],
|
|
147
|
+
'orientation': [
|
|
148
|
+
['loaded', 'orientationT']
|
|
149
|
+
]
|
|
122
150
|
};
|
|
123
|
-
|
|
151
|
+
/*
|
|
152
|
+
aslint
|
|
153
|
+
Implements the ASLint ruleset for accessibility.
|
|
154
|
+
Compiled to aslint.js by tsc (issue #73); edit this file, not the emitted one.
|
|
155
|
+
*/
|
|
124
156
|
// FUNCTIONS
|
|
125
|
-
|
|
126
157
|
// Conducts and reports the ASLint tests.
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
};
|
|
134
|
-
const standard = report.standard !== 'no';
|
|
135
|
-
// If standard results are to be reported:
|
|
136
|
-
if (standard) {
|
|
137
|
-
// Initialize the standard result.
|
|
138
|
-
result.standardResult = {
|
|
139
|
-
prevented: false,
|
|
140
|
-
totals: [0, 0, 0, 0],
|
|
141
|
-
instances: []
|
|
158
|
+
const reporter = async (page, report, actIndex) => {
|
|
159
|
+
// Initialize the act report.
|
|
160
|
+
let data = {};
|
|
161
|
+
const result = {
|
|
162
|
+
nativeResult: {},
|
|
163
|
+
standardResult: {}
|
|
142
164
|
};
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
// Get the ASLint runner and bundle scripts.
|
|
146
|
-
const aslintRunner = await fs.readFile(`${__dirname}/../procs/aslint.js`, 'utf8');
|
|
147
|
-
const aslintBundlePath = require.resolve('aslint-testaro/aslint.bundle.js');
|
|
148
|
-
const aslintBundle = await fs.readFile(aslintBundlePath, 'utf8');
|
|
149
|
-
// Get the nonce, if any.
|
|
150
|
-
const act = report.acts[actIndex];
|
|
151
|
-
const {jobData} = report;
|
|
152
|
-
const scriptNonce = jobData && jobData.lastScriptNonce;
|
|
153
|
-
// Inject the ASLint bundle and runner into the head of the page.
|
|
154
|
-
await page.evaluate(args => {
|
|
155
|
-
const {scriptNonce, aslintBundle, aslintRunner} = args;
|
|
156
|
-
// Bundle.
|
|
157
|
-
const bundleEl = document.createElement('script');
|
|
158
|
-
bundleEl.id = 'aslintBundle';
|
|
159
|
-
if (scriptNonce) {
|
|
160
|
-
bundleEl.nonce = scriptNonce;
|
|
161
|
-
console.log(`Added nonce ${scriptNonce} to bundle`);
|
|
162
|
-
}
|
|
163
|
-
bundleEl.textContent = aslintBundle;
|
|
164
|
-
document.head.insertAdjacentElement('beforeend', bundleEl);
|
|
165
|
-
// Runner.
|
|
166
|
-
const runnerEl = document.createElement('script');
|
|
167
|
-
if (scriptNonce) {
|
|
168
|
-
runnerEl.nonce = scriptNonce;
|
|
169
|
-
console.log(`Added nonce ${scriptNonce} to runner`);
|
|
170
|
-
}
|
|
171
|
-
runnerEl.textContent = aslintRunner;
|
|
172
|
-
document.body.insertAdjacentElement('beforeend', runnerEl);
|
|
173
|
-
}, {scriptNonce, aslintBundle, aslintRunner})
|
|
174
|
-
.catch(error => {
|
|
175
|
-
const message = `ERROR: ASLint injection failed (${error.message.slice(0, 400)})`;
|
|
176
|
-
console.log(message);
|
|
177
|
-
data.prevented = true;
|
|
178
|
-
data.error = message;
|
|
165
|
+
const standard = report.standard !== 'no';
|
|
166
|
+
// If standard results are to be reported:
|
|
179
167
|
if (standard) {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
});
|
|
183
|
-
const reportLoc = page.locator('#aslintResult');
|
|
184
|
-
// If the injection succeeded:
|
|
185
|
-
if (! data.prevented) {
|
|
186
|
-
try {
|
|
187
|
-
// Wait for the test results to be attached to the page.
|
|
188
|
-
const waitOptions = {
|
|
189
|
-
state: 'attached',
|
|
190
|
-
timeout: applyMultiplier(20000)
|
|
191
|
-
};
|
|
192
|
-
await reportLoc.waitFor(waitOptions);
|
|
168
|
+
// Initialize the standard result.
|
|
169
|
+
result.standardResult = (0, standard_1.getStandardResult)();
|
|
193
170
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
//
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|| ! ['error', 'warning'].includes(issueType)
|
|
221
|
-
) {
|
|
222
|
-
// Delete the rule report.
|
|
223
|
-
delete rules[ruleID];
|
|
224
|
-
}
|
|
171
|
+
const { standardResult } = result;
|
|
172
|
+
// Get the ASLint runner and bundle scripts.
|
|
173
|
+
const aslintRunner = await fs.readFile(`${__dirname}/../procs/aslint.js`, 'utf8');
|
|
174
|
+
const aslintBundlePath = require.resolve('aslint-testaro/aslint.bundle.js');
|
|
175
|
+
const aslintBundle = await fs.readFile(aslintBundlePath, 'utf8');
|
|
176
|
+
// Get the nonce, if any.
|
|
177
|
+
const act = report.acts[actIndex];
|
|
178
|
+
const { jobData } = report;
|
|
179
|
+
const scriptNonce = (jobData && jobData.lastScriptNonce);
|
|
180
|
+
// Inject the ASLint bundle and runner into the head of the page.
|
|
181
|
+
await page.evaluate(args => {
|
|
182
|
+
const { scriptNonce, aslintBundle, aslintRunner } = args;
|
|
183
|
+
// Bundle.
|
|
184
|
+
const bundleEl = document.createElement('script');
|
|
185
|
+
bundleEl.id = 'aslintBundle';
|
|
186
|
+
if (scriptNonce) {
|
|
187
|
+
bundleEl.nonce = scriptNonce;
|
|
188
|
+
console.log(`Added nonce ${scriptNonce} to bundle`);
|
|
189
|
+
}
|
|
190
|
+
bundleEl.textContent = aslintBundle;
|
|
191
|
+
document.head.insertAdjacentElement('beforeend', bundleEl);
|
|
192
|
+
// Runner.
|
|
193
|
+
const runnerEl = document.createElement('script');
|
|
194
|
+
if (scriptNonce) {
|
|
195
|
+
runnerEl.nonce = scriptNonce;
|
|
196
|
+
console.log(`Added nonce ${scriptNonce} to runner`);
|
|
225
197
|
}
|
|
226
|
-
|
|
198
|
+
runnerEl.textContent = aslintRunner;
|
|
199
|
+
document.body.insertAdjacentElement('beforeend', runnerEl);
|
|
200
|
+
}, { scriptNonce, aslintBundle, aslintRunner })
|
|
201
|
+
.catch(error => {
|
|
202
|
+
const message = `ERROR: ASLint injection failed (${error.message.slice(0, 400)})`;
|
|
203
|
+
console.log(message);
|
|
204
|
+
data.prevented = true;
|
|
205
|
+
data.error = message;
|
|
227
206
|
if (standard) {
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
// If the rule ID is differentiatable:
|
|
242
|
-
if (changer) {
|
|
243
|
-
// Differentiate it.
|
|
244
|
-
ruleID = changer[changer.length - 1];
|
|
245
|
-
}
|
|
246
|
-
// Get the ordinal severity of the violation.
|
|
247
|
-
const ordinalSeverity = issueType === 'warning' ? 1 : 2;
|
|
248
|
-
// Get the pathID of the element.
|
|
249
|
-
const {xpath} = element;
|
|
250
|
-
const pathID = getNormalizedXPath(xpath);
|
|
251
|
-
// Use it to get the index of the element in the catalog.
|
|
252
|
-
const catalogIndex = getXPathCatalogIndex(report, pathID);
|
|
253
|
-
// Add an instance to the standard result.
|
|
254
|
-
standardResult.instances.push({
|
|
255
|
-
ruleID,
|
|
256
|
-
what,
|
|
257
|
-
ordinalSeverity,
|
|
258
|
-
count: 1,
|
|
259
|
-
catalogIndex
|
|
260
|
-
});
|
|
261
|
-
// Increment the standard total.
|
|
262
|
-
standardResult.totals[ordinalSeverity]++;
|
|
263
|
-
}
|
|
264
|
-
}
|
|
207
|
+
standardResult.prevented = true;
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
const reportLoc = page.locator('#aslintResult');
|
|
211
|
+
// If the injection succeeded:
|
|
212
|
+
if (!data.prevented) {
|
|
213
|
+
try {
|
|
214
|
+
// Wait for the test results to be attached to the page.
|
|
215
|
+
const waitOptions = {
|
|
216
|
+
state: 'attached',
|
|
217
|
+
timeout: (0, config_1.applyMultiplier)(20000)
|
|
218
|
+
};
|
|
219
|
+
await reportLoc.waitFor(waitOptions);
|
|
265
220
|
}
|
|
266
|
-
|
|
221
|
+
catch (error) {
|
|
222
|
+
const message = 'Attachment of test results to page failed';
|
|
223
|
+
console.log(message);
|
|
224
|
+
data.prevented = true;
|
|
225
|
+
data.error = `${message} (${error.message})`;
|
|
226
|
+
}
|
|
227
|
+
;
|
|
267
228
|
}
|
|
268
|
-
// If the
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
229
|
+
// If the injection and the result attachment both succeeded:
|
|
230
|
+
if (!data.prevented) {
|
|
231
|
+
// Get their text.
|
|
232
|
+
const actReport = await reportLoc.textContent();
|
|
233
|
+
try {
|
|
234
|
+
const nativeResult = result.nativeResult = JSON.parse(actReport);
|
|
235
|
+
// If any rules were reported violated:
|
|
236
|
+
if (nativeResult.rules) {
|
|
237
|
+
const { rules } = nativeResult;
|
|
238
|
+
// For each such rule:
|
|
239
|
+
for (const ruleID of Object.keys(rules)) {
|
|
240
|
+
const ruleData = rules[ruleID];
|
|
241
|
+
const { issueType, status } = ruleData;
|
|
242
|
+
const excluded = act.rules && !act.rules.includes(ruleID);
|
|
243
|
+
const { type } = status;
|
|
244
|
+
// If rule is not an error or warning or is not to be tested:
|
|
245
|
+
if (excluded
|
|
246
|
+
|| ['passed', 'skipped'].includes(type)
|
|
247
|
+
|| !['error', 'warning'].includes(issueType)) {
|
|
248
|
+
// Delete the rule report.
|
|
249
|
+
delete rules[ruleID];
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// If standard results are to be reported:
|
|
253
|
+
if (standard) {
|
|
254
|
+
const ruleIDs = Object.keys(rules);
|
|
255
|
+
// For each violated rule:
|
|
256
|
+
for (let ruleID of ruleIDs) {
|
|
257
|
+
const ruleData = rules[ruleID];
|
|
258
|
+
const { issueType, results } = ruleData;
|
|
259
|
+
// For each violation:
|
|
260
|
+
for (const result of results) {
|
|
261
|
+
const { message, element } = result;
|
|
262
|
+
// Get a description of the violated rule.
|
|
263
|
+
const what = message?.actual?.description ?? '';
|
|
264
|
+
const changer = aslintData[ruleID]?.find(specs => specs.slice(0, -1).every(matcher => what.includes(matcher)));
|
|
265
|
+
// If the rule ID is differentiatable:
|
|
266
|
+
if (changer) {
|
|
267
|
+
// Differentiate it.
|
|
268
|
+
ruleID = changer[changer.length - 1];
|
|
269
|
+
}
|
|
270
|
+
// Get the ordinal severity of the violation.
|
|
271
|
+
const ordinalSeverity = issueType === 'warning' ? 1 : 2;
|
|
272
|
+
// Get the pathID of the element.
|
|
273
|
+
const { xpath } = element;
|
|
274
|
+
const pathID = (0, xPath_1.getNormalizedXPath)(xpath);
|
|
275
|
+
// Use it to get the index of the element in the catalog.
|
|
276
|
+
const catalogIndex = (0, xPath_1.getXPathCatalogIndex)(report, pathID);
|
|
277
|
+
// Add an instance to the standard result.
|
|
278
|
+
(0, standard_1.addInstance)(standardResult, {
|
|
279
|
+
ruleID,
|
|
280
|
+
what,
|
|
281
|
+
ordinalSeverity,
|
|
282
|
+
outcome: issueType === 'warning' ? 'cantTell' : 'failed',
|
|
283
|
+
catalogIndex
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// If the results are not JSON:
|
|
291
|
+
catch (error) {
|
|
292
|
+
const message = `Result processing failed (${error.message})`;
|
|
293
|
+
console.log(`ERROR: ${message}`);
|
|
294
|
+
// Report this.
|
|
295
|
+
data.prevented = true;
|
|
296
|
+
data.error = message;
|
|
297
|
+
}
|
|
275
298
|
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
};
|
|
299
|
+
return {
|
|
300
|
+
data,
|
|
301
|
+
result
|
|
302
|
+
};
|
|
281
303
|
};
|
|
304
|
+
exports.reporter = reporter;
|