testaro 78.0.6 → 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 +25 -19
- package/CONTAINERS.md +10 -6
- package/CONTRIBUTING.md +29 -3
- package/Dockerfile +1 -1
- package/README.md +75 -20
- 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 +373 -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 +313 -221
- package/procs/catalog.ts +398 -0
- package/procs/checkpoint.js +110 -0
- package/procs/config.d.ts +35 -0
- package/procs/config.js +63 -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/getSource.js +1 -0
- package/procs/job.js +116 -1
- package/procs/launch.d.ts +40 -0
- package/procs/launch.js +239 -108
- package/procs/nu.d.ts +48 -0
- package/procs/nu.js +1 -0
- package/procs/scope.js +196 -0
- package/procs/shoot.d.ts +33 -0
- package/procs/shoot.js +3 -1
- 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 +237 -189
- package/procs/testaro.ts +321 -0
- package/procs/userPath.js +126 -0
- package/procs/xPath.d.ts +4 -0
- package/procs/xPath.js +82 -64
- 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 +39 -41
- package/testaro/adbID.ts +66 -0
- package/testaro/allCapStyle.d.ts +3 -0
- package/testaro/allCapStyle.js +32 -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 +30 -30
- package/testaro/allHidden.ts +50 -0
- package/testaro/allSlanted.d.ts +3 -0
- package/testaro/allSlanted.js +31 -33
- package/testaro/allSlanted.ts +54 -0
- package/testaro/altScheme.d.ts +3 -0
- package/testaro/altScheme.js +28 -30
- package/testaro/altScheme.ts +50 -0
- package/testaro/attVal.d.ts +3 -0
- package/testaro/attVal.js +21 -21
- package/testaro/attVal.ts +52 -0
- package/testaro/autocomplete.d.ts +3 -0
- package/testaro/autocomplete.js +60 -75
- package/testaro/autocomplete.ts +101 -0
- package/testaro/bulk.d.ts +13 -0
- package/testaro/bulk.js +33 -33
- package/testaro/bulk.ts +55 -0
- package/testaro/buttonMenu.d.ts +9 -0
- package/testaro/buttonMenu.js +318 -319
- package/testaro/buttonMenu.ts +391 -0
- package/testaro/captionLoc.d.ts +3 -0
- package/testaro/captionLoc.js +18 -20
- package/testaro/captionLoc.ts +40 -0
- package/testaro/datalistRef.d.ts +3 -0
- package/testaro/datalistRef.js +34 -36
- package/testaro/datalistRef.ts +55 -0
- package/testaro/distortion.d.ts +3 -0
- package/testaro/distortion.js +58 -26
- package/testaro/distortion.ts +81 -0
- package/testaro/docType.d.ts +15 -0
- package/testaro/docType.js +26 -25
- package/testaro/docType.ts +45 -0
- package/testaro/dupAtt.d.ts +16 -0
- package/testaro/dupAtt.js +114 -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 +20 -20
- package/testaro/embAc.ts +40 -0
- package/testaro/focAll.d.ts +13 -0
- package/testaro/focAll.js +186 -191
- package/testaro/focAll.ts +217 -0
- package/testaro/focAndOp.d.ts +3 -0
- package/testaro/focAndOp.js +101 -104
- package/testaro/focAndOp.ts +128 -0
- package/testaro/focInd.d.ts +3 -0
- package/testaro/focInd.js +65 -66
- package/testaro/focInd.ts +96 -0
- package/testaro/focVis.d.ts +3 -0
- package/testaro/focVis.js +29 -30
- package/testaro/focVis.ts +52 -0
- package/testaro/headEl.d.ts +10 -0
- package/testaro/headEl.js +62 -62
- package/testaro/headEl.ts +82 -0
- package/testaro/headingAmb.d.ts +3 -0
- package/testaro/headingAmb.js +55 -63
- package/testaro/headingAmb.ts +72 -0
- package/testaro/hovInd.d.ts +12 -0
- package/testaro/hovInd.js +164 -130
- package/testaro/hovInd.ts +199 -0
- package/testaro/hover.d.ts +3 -0
- package/testaro/hover.js +156 -126
- package/testaro/hover.ts +154 -0
- package/testaro/hr.d.ts +3 -0
- package/testaro/hr.js +15 -17
- package/testaro/hr.ts +36 -0
- package/testaro/imageLink.d.ts +3 -0
- package/testaro/imageLink.js +18 -20
- package/testaro/imageLink.ts +42 -0
- package/testaro/labClash.d.ts +3 -0
- package/testaro/labClash.js +32 -33
- package/testaro/labClash.ts +54 -0
- package/testaro/legendLoc.d.ts +3 -0
- package/testaro/legendLoc.js +18 -20
- package/testaro/legendLoc.ts +42 -0
- package/testaro/lineHeight.d.ts +3 -0
- package/testaro/lineHeight.js +44 -48
- package/testaro/lineHeight.ts +70 -0
- package/testaro/linkAmb.d.ts +7 -0
- package/testaro/linkAmb.js +80 -80
- package/testaro/linkAmb.ts +105 -0
- package/testaro/linkExt.d.ts +3 -0
- package/testaro/linkExt.js +14 -16
- package/testaro/linkExt.ts +35 -0
- package/testaro/linkOldAtt.d.ts +3 -0
- package/testaro/linkOldAtt.js +26 -28
- package/testaro/linkOldAtt.ts +48 -0
- package/testaro/linkTo.d.ts +3 -0
- package/testaro/linkTo.js +23 -22
- package/testaro/linkTo.ts +43 -0
- package/testaro/linkUl.d.ts +3 -0
- package/testaro/linkUl.js +31 -34
- package/testaro/linkUl.ts +54 -0
- package/testaro/miniText.d.ts +3 -0
- package/testaro/miniText.js +42 -44
- package/testaro/miniText.ts +68 -0
- package/testaro/motion.d.ts +10 -0
- package/testaro/motion.js +93 -96
- package/testaro/motion.ts +125 -0
- package/testaro/nonTable.d.ts +3 -0
- package/testaro/nonTable.js +40 -45
- package/testaro/nonTable.ts +66 -0
- package/testaro/optRoleSel.d.ts +3 -0
- package/testaro/optRoleSel.js +17 -19
- package/testaro/optRoleSel.ts +41 -0
- package/testaro/phOnly.d.ts +3 -0
- package/testaro/phOnly.js +19 -21
- package/testaro/phOnly.ts +43 -0
- package/testaro/pseudoP.d.ts +3 -0
- package/testaro/pseudoP.js +37 -38
- package/testaro/pseudoP.ts +59 -0
- package/testaro/radioSet.d.ts +3 -0
- package/testaro/radioSet.js +58 -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 +28 -29
- package/testaro/role.ts +53 -0
- package/testaro/secHeading.d.ts +3 -0
- package/testaro/secHeading.js +31 -33
- package/testaro/secHeading.ts +53 -0
- package/testaro/styleDiff.d.ts +25 -0
- package/testaro/styleDiff.js +249 -252
- package/testaro/styleDiff.ts +303 -0
- package/testaro/tabNav.d.ts +33 -0
- package/testaro/tabNav.js +273 -342
- package/testaro/tabNav.ts +454 -0
- package/testaro/targetsNear.d.ts +9 -0
- package/testaro/targetsNear.js +131 -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 +26 -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 +16 -18
- package/testaro/titledEl.ts +38 -0
- package/testaro/zIndex.d.ts +3 -0
- package/testaro/zIndex.js +20 -22
- package/testaro/zIndex.ts +42 -0
- package/tests/alfa.d.ts +45 -0
- package/tests/alfa.js +139 -141
- package/tests/alfa.ts +214 -0
- package/tests/aslint.d.ts +33 -0
- package/tests/aslint.js +273 -249
- package/tests/aslint.ts +301 -0
- package/tests/axe.d.ts +27 -0
- package/tests/axe.js +200 -200
- package/tests/axe.ts +277 -0
- package/tests/ed11y.d.ts +28 -0
- package/tests/ed11y.js +142 -99
- package/tests/ed11y.ts +178 -0
- package/tests/htmlcs.d.ts +21 -0
- package/tests/htmlcs.js +175 -140
- package/tests/htmlcs.ts +181 -0
- package/tests/ibm.d.ts +52 -0
- package/tests/ibm.js +165 -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 +142 -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 +303 -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 +746 -652
- package/tests/testaro.ts +862 -0
- package/tests/wave.d.ts +46 -0
- package/tests/wave.js +167 -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 +62 -10
- package/.claude/settings.local.json +0 -11
- package/.eslintrc.json +0 -41
- package/htmlcs/.eslintrc.json +0 -67
- package/memory/MEMORY.md +0 -3
- package/memory/project_validation_pause.md +0 -10
- 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
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export interface RuleReport {
|
|
2
|
+
data: unknown;
|
|
3
|
+
totals: number[];
|
|
4
|
+
standardInstances: unknown[];
|
|
5
|
+
}
|
|
6
|
+
export interface RuleModule {
|
|
7
|
+
reporter: (...args: any[]) => Promise<RuleReport>;
|
|
8
|
+
}
|
|
9
|
+
export type RuleID = 'adbID' | 'allCapStyle' | 'allCaps' | 'allHidden' | 'allSlanted' | 'altScheme' | 'attVal' | 'autocomplete' | 'bulk' | 'buttonMenu' | 'captionLoc' | 'datalistRef' | 'distortion' | 'docType' | 'dupAtt' | 'elements' | 'embAc' | 'focAll' | 'focAndOp' | 'focInd' | 'focVis' | 'headEl' | 'headingAmb' | 'hovInd' | 'hover' | 'hr' | 'imageLink' | 'labClash' | 'legendLoc' | 'lineHeight' | 'linkAmb' | 'linkExt' | 'linkOldAtt' | 'linkTo' | 'linkUl' | 'miniText' | 'motion' | 'nonTable' | 'optRoleSel' | 'phOnly' | 'pseudoP' | 'radioSet' | 'role' | 'secHeading' | 'styleDiff' | 'tabNav' | 'targetsNear' | 'textNodes' | 'textSem' | 'title' | 'titledEl' | 'zIndex';
|
|
10
|
+
export declare const ruleModules: {
|
|
11
|
+
adbID: () => typeof import("./adbID");
|
|
12
|
+
allCapStyle: () => typeof import("./allCapStyle");
|
|
13
|
+
allCaps: () => typeof import("./allCaps");
|
|
14
|
+
allHidden: () => typeof import("./allHidden");
|
|
15
|
+
allSlanted: () => typeof import("./allSlanted");
|
|
16
|
+
altScheme: () => typeof import("./altScheme");
|
|
17
|
+
attVal: () => typeof import("./attVal");
|
|
18
|
+
autocomplete: () => typeof import("./autocomplete");
|
|
19
|
+
bulk: () => typeof import("./bulk");
|
|
20
|
+
buttonMenu: () => typeof import("./buttonMenu");
|
|
21
|
+
captionLoc: () => typeof import("./captionLoc");
|
|
22
|
+
datalistRef: () => typeof import("./datalistRef");
|
|
23
|
+
distortion: () => typeof import("./distortion");
|
|
24
|
+
docType: () => typeof import("./docType");
|
|
25
|
+
dupAtt: () => typeof import("./dupAtt");
|
|
26
|
+
elements: () => typeof import("./elements");
|
|
27
|
+
embAc: () => typeof import("./embAc");
|
|
28
|
+
focAll: () => typeof import("./focAll");
|
|
29
|
+
focAndOp: () => typeof import("./focAndOp");
|
|
30
|
+
focInd: () => typeof import("./focInd");
|
|
31
|
+
focVis: () => typeof import("./focVis");
|
|
32
|
+
headEl: () => typeof import("./headEl");
|
|
33
|
+
headingAmb: () => typeof import("./headingAmb");
|
|
34
|
+
hovInd: () => typeof import("./hovInd");
|
|
35
|
+
hover: () => typeof import("./hover");
|
|
36
|
+
hr: () => typeof import("./hr");
|
|
37
|
+
imageLink: () => typeof import("./imageLink");
|
|
38
|
+
labClash: () => typeof import("./labClash");
|
|
39
|
+
legendLoc: () => typeof import("./legendLoc");
|
|
40
|
+
lineHeight: () => typeof import("./lineHeight");
|
|
41
|
+
linkAmb: () => typeof import("./linkAmb");
|
|
42
|
+
linkExt: () => typeof import("./linkExt");
|
|
43
|
+
linkOldAtt: () => typeof import("./linkOldAtt");
|
|
44
|
+
linkTo: () => typeof import("./linkTo");
|
|
45
|
+
linkUl: () => typeof import("./linkUl");
|
|
46
|
+
miniText: () => typeof import("./miniText");
|
|
47
|
+
motion: () => typeof import("./motion");
|
|
48
|
+
nonTable: () => typeof import("./nonTable");
|
|
49
|
+
optRoleSel: () => typeof import("./optRoleSel");
|
|
50
|
+
phOnly: () => typeof import("./phOnly");
|
|
51
|
+
pseudoP: () => typeof import("./pseudoP");
|
|
52
|
+
radioSet: () => typeof import("./radioSet");
|
|
53
|
+
role: () => typeof import("./role");
|
|
54
|
+
secHeading: () => typeof import("./secHeading");
|
|
55
|
+
styleDiff: () => typeof import("./styleDiff");
|
|
56
|
+
tabNav: () => typeof import("./tabNav");
|
|
57
|
+
targetsNear: () => typeof import("./targetsNear");
|
|
58
|
+
textNodes: () => typeof import("./textNodes");
|
|
59
|
+
textSem: () => typeof import("./textSem");
|
|
60
|
+
title: () => typeof import("./title");
|
|
61
|
+
titledEl: () => typeof import("./titledEl");
|
|
62
|
+
zIndex: () => typeof import("./zIndex");
|
|
63
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
© 2026 Jeff Witt.
|
|
4
|
+
|
|
5
|
+
Licensed under the MIT License. See LICENSE file at the project root or
|
|
6
|
+
https://opensource.org/license/mit/ for details.
|
|
7
|
+
|
|
8
|
+
SPDX-License-Identifier: MIT
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.ruleModules = void 0;
|
|
12
|
+
// CONSTANTS
|
|
13
|
+
// Lazy loaders of the rule modules, keyed by rule ID.
|
|
14
|
+
exports.ruleModules = {
|
|
15
|
+
adbID: () => require('./adbID'),
|
|
16
|
+
allCapStyle: () => require('./allCapStyle'),
|
|
17
|
+
allCaps: () => require('./allCaps'),
|
|
18
|
+
allHidden: () => require('./allHidden'),
|
|
19
|
+
allSlanted: () => require('./allSlanted'),
|
|
20
|
+
altScheme: () => require('./altScheme'),
|
|
21
|
+
attVal: () => require('./attVal'),
|
|
22
|
+
autocomplete: () => require('./autocomplete'),
|
|
23
|
+
bulk: () => require('./bulk'),
|
|
24
|
+
buttonMenu: () => require('./buttonMenu'),
|
|
25
|
+
captionLoc: () => require('./captionLoc'),
|
|
26
|
+
datalistRef: () => require('./datalistRef'),
|
|
27
|
+
distortion: () => require('./distortion'),
|
|
28
|
+
docType: () => require('./docType'),
|
|
29
|
+
dupAtt: () => require('./dupAtt'),
|
|
30
|
+
elements: () => require('./elements'),
|
|
31
|
+
embAc: () => require('./embAc'),
|
|
32
|
+
focAll: () => require('./focAll'),
|
|
33
|
+
focAndOp: () => require('./focAndOp'),
|
|
34
|
+
focInd: () => require('./focInd'),
|
|
35
|
+
focVis: () => require('./focVis'),
|
|
36
|
+
headEl: () => require('./headEl'),
|
|
37
|
+
headingAmb: () => require('./headingAmb'),
|
|
38
|
+
hovInd: () => require('./hovInd'),
|
|
39
|
+
hover: () => require('./hover'),
|
|
40
|
+
hr: () => require('./hr'),
|
|
41
|
+
imageLink: () => require('./imageLink'),
|
|
42
|
+
labClash: () => require('./labClash'),
|
|
43
|
+
legendLoc: () => require('./legendLoc'),
|
|
44
|
+
lineHeight: () => require('./lineHeight'),
|
|
45
|
+
linkAmb: () => require('./linkAmb'),
|
|
46
|
+
linkExt: () => require('./linkExt'),
|
|
47
|
+
linkOldAtt: () => require('./linkOldAtt'),
|
|
48
|
+
linkTo: () => require('./linkTo'),
|
|
49
|
+
linkUl: () => require('./linkUl'),
|
|
50
|
+
miniText: () => require('./miniText'),
|
|
51
|
+
motion: () => require('./motion'),
|
|
52
|
+
nonTable: () => require('./nonTable'),
|
|
53
|
+
optRoleSel: () => require('./optRoleSel'),
|
|
54
|
+
phOnly: () => require('./phOnly'),
|
|
55
|
+
pseudoP: () => require('./pseudoP'),
|
|
56
|
+
radioSet: () => require('./radioSet'),
|
|
57
|
+
role: () => require('./role'),
|
|
58
|
+
secHeading: () => require('./secHeading'),
|
|
59
|
+
styleDiff: () => require('./styleDiff'),
|
|
60
|
+
tabNav: () => require('./tabNav'),
|
|
61
|
+
targetsNear: () => require('./targetsNear'),
|
|
62
|
+
textNodes: () => require('./textNodes'),
|
|
63
|
+
textSem: () => require('./textSem'),
|
|
64
|
+
title: () => require('./title'),
|
|
65
|
+
titledEl: () => require('./titledEl'),
|
|
66
|
+
zIndex: () => require('./zIndex'),
|
|
67
|
+
};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/*
|
|
2
|
+
© 2026 Jeff Witt.
|
|
3
|
+
|
|
4
|
+
Licensed under the MIT License. See LICENSE file at the project root or
|
|
5
|
+
https://opensource.org/license/mit/ for details.
|
|
6
|
+
|
|
7
|
+
SPDX-License-Identifier: MIT
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
registry
|
|
12
|
+
GENERATED by procs/generateRuleRegistry.js (npm run build:registry); do not edit.
|
|
13
|
+
Maps each rule ID to a lazy loader of its module, preserving on-demand loading
|
|
14
|
+
while giving consumers a checked RuleID union and a typed reporter (issue #73).
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
// TYPES
|
|
18
|
+
|
|
19
|
+
// The report every rule reporter resolves with.
|
|
20
|
+
export interface RuleReport {
|
|
21
|
+
data: unknown;
|
|
22
|
+
totals: number[];
|
|
23
|
+
standardInstances: unknown[];
|
|
24
|
+
}
|
|
25
|
+
// The module shape of a rule.
|
|
26
|
+
export interface RuleModule {
|
|
27
|
+
reporter: (...args: any[]) => Promise<RuleReport>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// The IDs of all rule modules.
|
|
31
|
+
export type RuleID =
|
|
32
|
+
| 'adbID'
|
|
33
|
+
| 'allCapStyle'
|
|
34
|
+
| 'allCaps'
|
|
35
|
+
| 'allHidden'
|
|
36
|
+
| 'allSlanted'
|
|
37
|
+
| 'altScheme'
|
|
38
|
+
| 'attVal'
|
|
39
|
+
| 'autocomplete'
|
|
40
|
+
| 'bulk'
|
|
41
|
+
| 'buttonMenu'
|
|
42
|
+
| 'captionLoc'
|
|
43
|
+
| 'datalistRef'
|
|
44
|
+
| 'distortion'
|
|
45
|
+
| 'docType'
|
|
46
|
+
| 'dupAtt'
|
|
47
|
+
| 'elements'
|
|
48
|
+
| 'embAc'
|
|
49
|
+
| 'focAll'
|
|
50
|
+
| 'focAndOp'
|
|
51
|
+
| 'focInd'
|
|
52
|
+
| 'focVis'
|
|
53
|
+
| 'headEl'
|
|
54
|
+
| 'headingAmb'
|
|
55
|
+
| 'hovInd'
|
|
56
|
+
| 'hover'
|
|
57
|
+
| 'hr'
|
|
58
|
+
| 'imageLink'
|
|
59
|
+
| 'labClash'
|
|
60
|
+
| 'legendLoc'
|
|
61
|
+
| 'lineHeight'
|
|
62
|
+
| 'linkAmb'
|
|
63
|
+
| 'linkExt'
|
|
64
|
+
| 'linkOldAtt'
|
|
65
|
+
| 'linkTo'
|
|
66
|
+
| 'linkUl'
|
|
67
|
+
| 'miniText'
|
|
68
|
+
| 'motion'
|
|
69
|
+
| 'nonTable'
|
|
70
|
+
| 'optRoleSel'
|
|
71
|
+
| 'phOnly'
|
|
72
|
+
| 'pseudoP'
|
|
73
|
+
| 'radioSet'
|
|
74
|
+
| 'role'
|
|
75
|
+
| 'secHeading'
|
|
76
|
+
| 'styleDiff'
|
|
77
|
+
| 'tabNav'
|
|
78
|
+
| 'targetsNear'
|
|
79
|
+
| 'textNodes'
|
|
80
|
+
| 'textSem'
|
|
81
|
+
| 'title'
|
|
82
|
+
| 'titledEl'
|
|
83
|
+
| 'zIndex';
|
|
84
|
+
|
|
85
|
+
// CONSTANTS
|
|
86
|
+
|
|
87
|
+
// Lazy loaders of the rule modules, keyed by rule ID.
|
|
88
|
+
export const ruleModules = {
|
|
89
|
+
adbID: () => require('./adbID') as typeof import('./adbID'),
|
|
90
|
+
allCapStyle: () => require('./allCapStyle') as typeof import('./allCapStyle'),
|
|
91
|
+
allCaps: () => require('./allCaps') as typeof import('./allCaps'),
|
|
92
|
+
allHidden: () => require('./allHidden') as typeof import('./allHidden'),
|
|
93
|
+
allSlanted: () => require('./allSlanted') as typeof import('./allSlanted'),
|
|
94
|
+
altScheme: () => require('./altScheme') as typeof import('./altScheme'),
|
|
95
|
+
attVal: () => require('./attVal') as typeof import('./attVal'),
|
|
96
|
+
autocomplete: () => require('./autocomplete') as typeof import('./autocomplete'),
|
|
97
|
+
bulk: () => require('./bulk') as typeof import('./bulk'),
|
|
98
|
+
buttonMenu: () => require('./buttonMenu') as typeof import('./buttonMenu'),
|
|
99
|
+
captionLoc: () => require('./captionLoc') as typeof import('./captionLoc'),
|
|
100
|
+
datalistRef: () => require('./datalistRef') as typeof import('./datalistRef'),
|
|
101
|
+
distortion: () => require('./distortion') as typeof import('./distortion'),
|
|
102
|
+
docType: () => require('./docType') as typeof import('./docType'),
|
|
103
|
+
dupAtt: () => require('./dupAtt') as typeof import('./dupAtt'),
|
|
104
|
+
elements: () => require('./elements') as typeof import('./elements'),
|
|
105
|
+
embAc: () => require('./embAc') as typeof import('./embAc'),
|
|
106
|
+
focAll: () => require('./focAll') as typeof import('./focAll'),
|
|
107
|
+
focAndOp: () => require('./focAndOp') as typeof import('./focAndOp'),
|
|
108
|
+
focInd: () => require('./focInd') as typeof import('./focInd'),
|
|
109
|
+
focVis: () => require('./focVis') as typeof import('./focVis'),
|
|
110
|
+
headEl: () => require('./headEl') as typeof import('./headEl'),
|
|
111
|
+
headingAmb: () => require('./headingAmb') as typeof import('./headingAmb'),
|
|
112
|
+
hovInd: () => require('./hovInd') as typeof import('./hovInd'),
|
|
113
|
+
hover: () => require('./hover') as typeof import('./hover'),
|
|
114
|
+
hr: () => require('./hr') as typeof import('./hr'),
|
|
115
|
+
imageLink: () => require('./imageLink') as typeof import('./imageLink'),
|
|
116
|
+
labClash: () => require('./labClash') as typeof import('./labClash'),
|
|
117
|
+
legendLoc: () => require('./legendLoc') as typeof import('./legendLoc'),
|
|
118
|
+
lineHeight: () => require('./lineHeight') as typeof import('./lineHeight'),
|
|
119
|
+
linkAmb: () => require('./linkAmb') as typeof import('./linkAmb'),
|
|
120
|
+
linkExt: () => require('./linkExt') as typeof import('./linkExt'),
|
|
121
|
+
linkOldAtt: () => require('./linkOldAtt') as typeof import('./linkOldAtt'),
|
|
122
|
+
linkTo: () => require('./linkTo') as typeof import('./linkTo'),
|
|
123
|
+
linkUl: () => require('./linkUl') as typeof import('./linkUl'),
|
|
124
|
+
miniText: () => require('./miniText') as typeof import('./miniText'),
|
|
125
|
+
motion: () => require('./motion') as typeof import('./motion'),
|
|
126
|
+
nonTable: () => require('./nonTable') as typeof import('./nonTable'),
|
|
127
|
+
optRoleSel: () => require('./optRoleSel') as typeof import('./optRoleSel'),
|
|
128
|
+
phOnly: () => require('./phOnly') as typeof import('./phOnly'),
|
|
129
|
+
pseudoP: () => require('./pseudoP') as typeof import('./pseudoP'),
|
|
130
|
+
radioSet: () => require('./radioSet') as typeof import('./radioSet'),
|
|
131
|
+
role: () => require('./role') as typeof import('./role'),
|
|
132
|
+
secHeading: () => require('./secHeading') as typeof import('./secHeading'),
|
|
133
|
+
styleDiff: () => require('./styleDiff') as typeof import('./styleDiff'),
|
|
134
|
+
tabNav: () => require('./tabNav') as typeof import('./tabNav'),
|
|
135
|
+
targetsNear: () => require('./targetsNear') as typeof import('./targetsNear'),
|
|
136
|
+
textNodes: () => require('./textNodes') as typeof import('./textNodes'),
|
|
137
|
+
textSem: () => require('./textSem') as typeof import('./textSem'),
|
|
138
|
+
title: () => require('./title') as typeof import('./title'),
|
|
139
|
+
titledEl: () => require('./titledEl') as typeof import('./titledEl'),
|
|
140
|
+
zIndex: () => require('./zIndex') as typeof import('./zIndex'),
|
|
141
|
+
} satisfies Record<RuleID, () => RuleModule>;
|
package/testaro/role.js
CHANGED
|
@@ -1,48 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/*
|
|
2
3
|
© 2021–2025 CVS Health and/or one of its affiliates. All rights reserved.
|
|
4
|
+
© 2026 Jeff Witt.
|
|
3
5
|
© 2025–2026 Jonathan Robert Pool.
|
|
4
6
|
|
|
5
7
|
Licensed under the MIT License. See LICENSE file at the project root or https://opensource.org/license/mit/ for details.
|
|
6
8
|
|
|
7
9
|
SPDX-License-Identifier: MIT
|
|
8
10
|
*/
|
|
9
|
-
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.reporter = void 0;
|
|
13
|
+
const testaro_1 = require("../procs/testaro");
|
|
14
|
+
// aria-query ships no type declarations, so its import stays a require and is untyped.
|
|
15
|
+
const { elementRoles } = require('aria-query');
|
|
10
16
|
/*
|
|
11
17
|
role
|
|
12
18
|
This test reports elements with native-replacing explicit role attributes. This test uses the getBasicResult function in order to have access to the aria-query dependency.
|
|
19
|
+
Compiled to role.js by tsc (issue #73); edit this file, not the emitted one.
|
|
13
20
|
*/
|
|
14
|
-
|
|
15
|
-
// IMPORTS
|
|
16
|
-
|
|
17
|
-
const {elementRoles} = require('aria-query');
|
|
18
|
-
const {getBasicResult} = require('../procs/testaro');
|
|
19
|
-
|
|
20
21
|
// CONSTANTS
|
|
21
|
-
|
|
22
22
|
// Implicit roles
|
|
23
23
|
const implicitRoles = new Set(Array.from(elementRoles.values()).flat());
|
|
24
|
-
|
|
25
24
|
// FUNCTIONS
|
|
26
|
-
|
|
27
25
|
// Runs the test and returns the result.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
26
|
+
const reporter = async (page, report, _, withItems) => {
|
|
27
|
+
// Get locators for the elements with explicit roles.
|
|
28
|
+
const loc = page.locator('[role]');
|
|
29
|
+
const locs = await loc.all();
|
|
30
|
+
const violations = [];
|
|
31
|
+
// Get data on those with roles that are also implicit.
|
|
32
|
+
for (const loc of locs) {
|
|
33
|
+
const roleSpec = await loc.getAttribute('role');
|
|
34
|
+
const roles = roleSpec.split(/\s+/);
|
|
35
|
+
const badRole = roles.find(role => implicitRoles.has(role));
|
|
36
|
+
if (badRole) {
|
|
37
|
+
violations.push({
|
|
38
|
+
loc,
|
|
39
|
+
what: `Explicit ${badRole} role of the element is also an implicit HTML element role`
|
|
40
|
+
});
|
|
41
|
+
}
|
|
43
42
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return await getBasicResult(report, withItems, 'role', 0, whats, {}, violations);
|
|
43
|
+
// Get and return a result.
|
|
44
|
+
const whats = 'Elements have roles assigned that are also implicit HTML element roles';
|
|
45
|
+
return await (0, testaro_1.getBasicResult)(report, withItems, 'role', 0, whats, {}, violations);
|
|
48
46
|
};
|
|
47
|
+
exports.reporter = reporter;
|
package/testaro/role.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/*
|
|
2
|
+
© 2021–2025 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 https://opensource.org/license/mit/ for details.
|
|
7
|
+
|
|
8
|
+
SPDX-License-Identifier: MIT
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// IMPORTS
|
|
12
|
+
|
|
13
|
+
import type {Locator, Page} from 'playwright';
|
|
14
|
+
import {getBasicResult} from '../procs/testaro';
|
|
15
|
+
import type {Report} from '../types';
|
|
16
|
+
// aria-query ships no type declarations, so its import stays a require and is untyped.
|
|
17
|
+
const {elementRoles} = require('aria-query');
|
|
18
|
+
|
|
19
|
+
/*
|
|
20
|
+
role
|
|
21
|
+
This test reports elements with native-replacing explicit role attributes. This test uses the getBasicResult function in order to have access to the aria-query dependency.
|
|
22
|
+
Compiled to role.js by tsc (issue #73); edit this file, not the emitted one.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
// CONSTANTS
|
|
26
|
+
|
|
27
|
+
// Implicit roles
|
|
28
|
+
const implicitRoles = new Set<string>(Array.from(elementRoles.values() as string[][]).flat());
|
|
29
|
+
|
|
30
|
+
// FUNCTIONS
|
|
31
|
+
|
|
32
|
+
// Runs the test and returns the result.
|
|
33
|
+
export const reporter = async (page: Page, report: Report, _: unknown, withItems: boolean) => {
|
|
34
|
+
// Get locators for the elements with explicit roles.
|
|
35
|
+
const loc = page.locator('[role]');
|
|
36
|
+
const locs = await loc.all();
|
|
37
|
+
const violations: {loc: Locator; what: string}[] = [];
|
|
38
|
+
// Get data on those with roles that are also implicit.
|
|
39
|
+
for (const loc of locs) {
|
|
40
|
+
const roleSpec = await loc.getAttribute('role');
|
|
41
|
+
const roles = roleSpec!.split(/\s+/);
|
|
42
|
+
const badRole = roles.find(role => implicitRoles.has(role));
|
|
43
|
+
if (badRole) {
|
|
44
|
+
violations.push({
|
|
45
|
+
loc,
|
|
46
|
+
what: `Explicit ${badRole} role of the element is also an implicit HTML element role`
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Get and return a result.
|
|
51
|
+
const whats = 'Elements have roles assigned that are also implicit HTML element roles';
|
|
52
|
+
return await getBasicResult(report, withItems, 'role', 0, whats, {}, violations);
|
|
53
|
+
};
|
package/testaro/secHeading.js
CHANGED
|
@@ -1,49 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/*
|
|
2
3
|
© 2025 CVS Health and/or one of its affiliates. All rights reserved.
|
|
3
4
|
© 2025 Juan S. Casado.
|
|
5
|
+
© 2026 Jeff Witt.
|
|
4
6
|
© 2025–2026 Jonathan Robert Pool.
|
|
5
7
|
|
|
6
8
|
Licensed under the MIT License. See LICENSE file at the project root or https://opensource.org/license/mit/ for details.
|
|
7
9
|
|
|
8
10
|
SPDX-License-Identifier: MIT
|
|
9
11
|
*/
|
|
10
|
-
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.reporter = void 0;
|
|
14
|
+
const testaro_1 = require("../procs/testaro");
|
|
11
15
|
/*
|
|
12
16
|
secHeading
|
|
13
17
|
This test reports sectioning containers that have child headings of which the first has a depth (i.e. level) lower than at least one of the others. An example is a section element whose first heading child is an h3 element and whose subsequent heading children include an h2 element. The first child heading is presumed the principal heading of the container, so this pattern merits scrutiny.
|
|
18
|
+
Compiled to secHeading.js by tsc (issue #73); edit this file, not the emitted one.
|
|
14
19
|
*/
|
|
15
|
-
|
|
16
|
-
// IMPORTS
|
|
17
|
-
|
|
18
|
-
const {doTest} = require('../procs/testaro');
|
|
19
|
-
|
|
20
20
|
// FUNCTIONS
|
|
21
|
-
|
|
22
21
|
// Runs the test and returns the result.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
page, report, withItems, 'secHeading', selector, whats, 0, getBadWhat.toString()
|
|
48
|
-
);
|
|
22
|
+
const reporter = async (page, report, _, withItems) => {
|
|
23
|
+
const getBadWhat = element => {
|
|
24
|
+
// Get the children of the element.
|
|
25
|
+
const children = Array.from(element.children);
|
|
26
|
+
// Get the headings among them.
|
|
27
|
+
const headingChildren = children.filter(child => /^H[1-6]$/.test(child.tagName));
|
|
28
|
+
// Get their depths.
|
|
29
|
+
const headingChildDepths = headingChildren.map(child => Number(child.tagName.slice(1)));
|
|
30
|
+
// If there are 2 or more heading children:
|
|
31
|
+
if (headingChildren.length > 1) {
|
|
32
|
+
// Get the depth of the first of them.
|
|
33
|
+
const firstHeadingDepth = headingChildDepths[0];
|
|
34
|
+
// Get the minimum of their depths.
|
|
35
|
+
const minHeadingDepth = Math.min(...headingChildDepths);
|
|
36
|
+
// If any heading is less deep than the first:
|
|
37
|
+
if (minHeadingDepth < firstHeadingDepth) {
|
|
38
|
+
// Return a violation description.
|
|
39
|
+
return `First child heading is H${firstHeadingDepth}, but another is H${minHeadingDepth}`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const selector = 'body section, body article, body nav, body aside, body main';
|
|
44
|
+
const whats = 'First child headings of sectioning containers are deeper than others';
|
|
45
|
+
return await (0, testaro_1.doTest)(page, report, withItems, 'secHeading', selector, whats, 0, getBadWhat.toString());
|
|
49
46
|
};
|
|
47
|
+
exports.reporter = reporter;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/*
|
|
2
|
+
© 2025 CVS Health and/or one of its affiliates. All rights reserved.
|
|
3
|
+
© 2025 Juan S. Casado.
|
|
4
|
+
© 2026 Jeff Witt.
|
|
5
|
+
© 2025–2026 Jonathan Robert Pool.
|
|
6
|
+
|
|
7
|
+
Licensed under the MIT License. See LICENSE file at the project root or 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 {doTest} from '../procs/testaro';
|
|
16
|
+
import type {GetBadWhat, Report} from '../types';
|
|
17
|
+
|
|
18
|
+
/*
|
|
19
|
+
secHeading
|
|
20
|
+
This test reports sectioning containers that have child headings of which the first has a depth (i.e. level) lower than at least one of the others. An example is a section element whose first heading child is an h3 element and whose subsequent heading children include an h2 element. The first child heading is presumed the principal heading of the container, so this pattern merits scrutiny.
|
|
21
|
+
Compiled to secHeading.js by tsc (issue #73); edit this file, not the emitted one.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
// FUNCTIONS
|
|
25
|
+
|
|
26
|
+
// Runs the test and returns the result.
|
|
27
|
+
export const reporter = async (page: Page, report: Report, _: unknown, withItems: boolean) => {
|
|
28
|
+
const getBadWhat: GetBadWhat = element => {
|
|
29
|
+
// Get the children of the element.
|
|
30
|
+
const children = Array.from(element.children);
|
|
31
|
+
// Get the headings among them.
|
|
32
|
+
const headingChildren = children.filter(child => /^H[1-6]$/.test(child.tagName));
|
|
33
|
+
// Get their depths.
|
|
34
|
+
const headingChildDepths = headingChildren.map(child => Number(child.tagName.slice(1)));
|
|
35
|
+
// If there are 2 or more heading children:
|
|
36
|
+
if (headingChildren.length > 1) {
|
|
37
|
+
// Get the depth of the first of them.
|
|
38
|
+
const firstHeadingDepth = headingChildDepths[0];
|
|
39
|
+
// Get the minimum of their depths.
|
|
40
|
+
const minHeadingDepth = Math.min(...headingChildDepths);
|
|
41
|
+
// If any heading is less deep than the first:
|
|
42
|
+
if (minHeadingDepth < firstHeadingDepth) {
|
|
43
|
+
// Return a violation description.
|
|
44
|
+
return `First child heading is H${firstHeadingDepth}, but another is H${minHeadingDepth}`;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const selector = 'body section, body article, body nav, body aside, body main';
|
|
49
|
+
const whats = 'First child headings of sectioning containers are deeper than others';
|
|
50
|
+
return await doTest(
|
|
51
|
+
page, report, withItems, 'secHeading', selector, whats, 0, getBadWhat.toString()
|
|
52
|
+
);
|
|
53
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Page } from 'playwright';
|
|
2
|
+
import type { Report } from '../types';
|
|
3
|
+
interface StyleDiffTotals {
|
|
4
|
+
total: number;
|
|
5
|
+
subtotals?: number[];
|
|
6
|
+
}
|
|
7
|
+
export declare const reporter: (page: Page, report: Report, _: unknown, withItems: boolean) => Promise<{
|
|
8
|
+
data: {
|
|
9
|
+
mainStyles: string[];
|
|
10
|
+
buttonStyles: string[];
|
|
11
|
+
headingStyles: string[];
|
|
12
|
+
listLinkStyles: string[];
|
|
13
|
+
totals: Record<string, StyleDiffTotals>;
|
|
14
|
+
items?: Record<string, Record<string, Record<string, string[]>>>;
|
|
15
|
+
};
|
|
16
|
+
totals: number[];
|
|
17
|
+
standardInstances: {
|
|
18
|
+
ruleID: string;
|
|
19
|
+
what: string;
|
|
20
|
+
ordinalSeverity: number;
|
|
21
|
+
count: number;
|
|
22
|
+
catalogIndex: string;
|
|
23
|
+
}[];
|
|
24
|
+
}>;
|
|
25
|
+
export {};
|