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.
Files changed (356) hide show
  1. package/.gitattributes +94 -0
  2. package/.github/workflows/ci.yml +58 -0
  3. package/.github/workflows/publish.yml +49 -0
  4. package/.github/workflows/typescript.yml +35 -0
  5. package/AGENTS.md +2 -2
  6. package/CLAUDE.md +24 -18
  7. package/CONTAINERS.md +9 -6
  8. package/CONTRIBUTING.md +29 -3
  9. package/Dockerfile +1 -1
  10. package/README.md +73 -19
  11. package/UPGRADES.md +4 -0
  12. package/actSpecs-doc.md +13 -1
  13. package/actSpecs.js +29 -5
  14. package/call.js +6 -5
  15. package/docker-compose.yml +8 -2
  16. package/docs/checkpoint-scanning.md +199 -0
  17. package/docs/standard-result-outcome.md +165 -0
  18. package/env.example +44 -10
  19. package/eslint.config.mjs +101 -0
  20. package/netWatch.js +372 -222
  21. package/package.json +46 -31
  22. package/pour/README.md +47 -0
  23. package/pour/pour.min.js +8 -0
  24. package/procs/actDo.js +808 -0
  25. package/procs/catalog.d.ts +17 -0
  26. package/procs/catalog.js +312 -221
  27. package/procs/catalog.ts +398 -0
  28. package/procs/checkpoint.js +110 -0
  29. package/procs/config.d.ts +35 -0
  30. package/procs/config.js +62 -0
  31. package/procs/dateTime.js +2 -1
  32. package/procs/doActs.js +442 -849
  33. package/procs/doTestAct.js +27 -121
  34. package/procs/flow.js +221 -0
  35. package/procs/generateRuleRegistry.js +94 -0
  36. package/procs/getSource.d.ts +26 -0
  37. package/procs/job.js +115 -1
  38. package/procs/launch.d.ts +40 -0
  39. package/procs/launch.js +239 -108
  40. package/procs/nu.d.ts +48 -0
  41. package/procs/scope.js +196 -0
  42. package/procs/shoot.d.ts +33 -0
  43. package/procs/standard.d.ts +18 -0
  44. package/procs/standard.js +83 -0
  45. package/procs/standard.ts +126 -0
  46. package/procs/testAct.js +145 -0
  47. package/procs/testaro.d.ts +20 -0
  48. package/procs/testaro.js +236 -189
  49. package/procs/testaro.ts +321 -0
  50. package/procs/userPath.js +126 -0
  51. package/procs/xPath.d.ts +4 -0
  52. package/procs/xPath.js +81 -69
  53. package/procs/xPath.ts +106 -0
  54. package/procs/xPathScript.d.ts +6 -0
  55. package/procs/xPathScript.js +70 -0
  56. package/run.js +3 -2
  57. package/surea11y/README.md +44 -0
  58. package/surea11y/surea11y.browser.js +14 -0
  59. package/testaro/adbID.d.ts +3 -0
  60. package/testaro/adbID.js +38 -41
  61. package/testaro/adbID.ts +66 -0
  62. package/testaro/allCapStyle.d.ts +3 -0
  63. package/testaro/allCapStyle.js +31 -34
  64. package/testaro/allCapStyle.ts +55 -0
  65. package/testaro/allCaps.d.ts +16 -0
  66. package/testaro/allCaps.js +179 -151
  67. package/testaro/allCaps.ts +228 -0
  68. package/testaro/allHidden.d.ts +13 -0
  69. package/testaro/allHidden.js +29 -30
  70. package/testaro/allHidden.ts +50 -0
  71. package/testaro/allSlanted.d.ts +3 -0
  72. package/testaro/allSlanted.js +30 -33
  73. package/testaro/allSlanted.ts +54 -0
  74. package/testaro/altScheme.d.ts +3 -0
  75. package/testaro/altScheme.js +27 -30
  76. package/testaro/altScheme.ts +50 -0
  77. package/testaro/attVal.d.ts +3 -0
  78. package/testaro/attVal.js +20 -21
  79. package/testaro/attVal.ts +52 -0
  80. package/testaro/autocomplete.d.ts +3 -0
  81. package/testaro/autocomplete.js +59 -75
  82. package/testaro/autocomplete.ts +101 -0
  83. package/testaro/bulk.d.ts +13 -0
  84. package/testaro/bulk.js +32 -33
  85. package/testaro/bulk.ts +55 -0
  86. package/testaro/buttonMenu.d.ts +9 -0
  87. package/testaro/buttonMenu.js +317 -319
  88. package/testaro/buttonMenu.ts +391 -0
  89. package/testaro/captionLoc.d.ts +3 -0
  90. package/testaro/captionLoc.js +17 -20
  91. package/testaro/captionLoc.ts +40 -0
  92. package/testaro/datalistRef.d.ts +3 -0
  93. package/testaro/datalistRef.js +33 -36
  94. package/testaro/datalistRef.ts +55 -0
  95. package/testaro/distortion.d.ts +3 -0
  96. package/testaro/distortion.js +57 -26
  97. package/testaro/distortion.ts +81 -0
  98. package/testaro/docType.d.ts +15 -0
  99. package/testaro/docType.js +25 -25
  100. package/testaro/docType.ts +45 -0
  101. package/testaro/dupAtt.d.ts +16 -0
  102. package/testaro/dupAtt.js +113 -104
  103. package/testaro/dupAtt.ts +144 -0
  104. package/testaro/elements.d.ts +6 -0
  105. package/testaro/elements.js +153 -153
  106. package/testaro/elements.ts +215 -0
  107. package/testaro/embAc.d.ts +3 -0
  108. package/testaro/embAc.js +19 -20
  109. package/testaro/embAc.ts +40 -0
  110. package/testaro/focAll.d.ts +13 -0
  111. package/testaro/focAll.js +185 -191
  112. package/testaro/focAll.ts +217 -0
  113. package/testaro/focAndOp.d.ts +3 -0
  114. package/testaro/focAndOp.js +100 -104
  115. package/testaro/focAndOp.ts +128 -0
  116. package/testaro/focInd.d.ts +3 -0
  117. package/testaro/focInd.js +64 -66
  118. package/testaro/focInd.ts +96 -0
  119. package/testaro/focVis.d.ts +3 -0
  120. package/testaro/focVis.js +28 -30
  121. package/testaro/focVis.ts +52 -0
  122. package/testaro/headEl.d.ts +10 -0
  123. package/testaro/headEl.js +61 -62
  124. package/testaro/headEl.ts +82 -0
  125. package/testaro/headingAmb.d.ts +3 -0
  126. package/testaro/headingAmb.js +54 -63
  127. package/testaro/headingAmb.ts +72 -0
  128. package/testaro/hovInd.d.ts +12 -0
  129. package/testaro/hovInd.js +163 -130
  130. package/testaro/hovInd.ts +199 -0
  131. package/testaro/hover.d.ts +3 -0
  132. package/testaro/hover.js +155 -126
  133. package/testaro/hover.ts +154 -0
  134. package/testaro/hr.d.ts +3 -0
  135. package/testaro/hr.js +14 -17
  136. package/testaro/hr.ts +36 -0
  137. package/testaro/imageLink.d.ts +3 -0
  138. package/testaro/imageLink.js +17 -20
  139. package/testaro/imageLink.ts +42 -0
  140. package/testaro/labClash.d.ts +3 -0
  141. package/testaro/labClash.js +31 -33
  142. package/testaro/labClash.ts +54 -0
  143. package/testaro/legendLoc.d.ts +3 -0
  144. package/testaro/legendLoc.js +17 -20
  145. package/testaro/legendLoc.ts +42 -0
  146. package/testaro/lineHeight.d.ts +3 -0
  147. package/testaro/lineHeight.js +43 -48
  148. package/testaro/lineHeight.ts +70 -0
  149. package/testaro/linkAmb.d.ts +7 -0
  150. package/testaro/linkAmb.js +79 -80
  151. package/testaro/linkAmb.ts +105 -0
  152. package/testaro/linkExt.d.ts +3 -0
  153. package/testaro/linkExt.js +13 -16
  154. package/testaro/linkExt.ts +35 -0
  155. package/testaro/linkOldAtt.d.ts +3 -0
  156. package/testaro/linkOldAtt.js +25 -28
  157. package/testaro/linkOldAtt.ts +48 -0
  158. package/testaro/linkTo.d.ts +3 -0
  159. package/testaro/linkTo.js +22 -22
  160. package/testaro/linkTo.ts +43 -0
  161. package/testaro/linkUl.d.ts +3 -0
  162. package/testaro/linkUl.js +30 -34
  163. package/testaro/linkUl.ts +54 -0
  164. package/testaro/miniText.d.ts +3 -0
  165. package/testaro/miniText.js +41 -44
  166. package/testaro/miniText.ts +68 -0
  167. package/testaro/motion.d.ts +10 -0
  168. package/testaro/motion.js +92 -96
  169. package/testaro/motion.ts +125 -0
  170. package/testaro/nonTable.d.ts +3 -0
  171. package/testaro/nonTable.js +39 -45
  172. package/testaro/nonTable.ts +66 -0
  173. package/testaro/optRoleSel.d.ts +3 -0
  174. package/testaro/optRoleSel.js +16 -19
  175. package/testaro/optRoleSel.ts +41 -0
  176. package/testaro/phOnly.d.ts +3 -0
  177. package/testaro/phOnly.js +18 -21
  178. package/testaro/phOnly.ts +43 -0
  179. package/testaro/pseudoP.d.ts +3 -0
  180. package/testaro/pseudoP.js +36 -38
  181. package/testaro/pseudoP.ts +59 -0
  182. package/testaro/radioSet.d.ts +3 -0
  183. package/testaro/radioSet.js +57 -59
  184. package/testaro/radioSet.ts +79 -0
  185. package/testaro/registry.d.ts +63 -0
  186. package/testaro/registry.js +67 -0
  187. package/testaro/registry.ts +141 -0
  188. package/testaro/role.d.ts +3 -0
  189. package/testaro/role.js +27 -29
  190. package/testaro/role.ts +53 -0
  191. package/testaro/secHeading.d.ts +3 -0
  192. package/testaro/secHeading.js +30 -33
  193. package/testaro/secHeading.ts +53 -0
  194. package/testaro/styleDiff.d.ts +25 -0
  195. package/testaro/styleDiff.js +248 -252
  196. package/testaro/styleDiff.ts +303 -0
  197. package/testaro/tabNav.d.ts +33 -0
  198. package/testaro/tabNav.js +272 -342
  199. package/testaro/tabNav.ts +454 -0
  200. package/testaro/targetsNear.d.ts +9 -0
  201. package/testaro/targetsNear.js +130 -132
  202. package/testaro/targetsNear.ts +160 -0
  203. package/testaro/textNodes.d.ts +6 -0
  204. package/testaro/textNodes.js +139 -135
  205. package/testaro/textNodes.ts +185 -0
  206. package/testaro/textSem.d.ts +3 -0
  207. package/testaro/textSem.js +25 -28
  208. package/testaro/textSem.ts +47 -0
  209. package/testaro/title.d.ts +9 -0
  210. package/testaro/title.js +16 -13
  211. package/testaro/title.ts +31 -0
  212. package/testaro/titledEl.d.ts +3 -0
  213. package/testaro/titledEl.js +15 -18
  214. package/testaro/titledEl.ts +38 -0
  215. package/testaro/zIndex.d.ts +3 -0
  216. package/testaro/zIndex.js +19 -22
  217. package/testaro/zIndex.ts +42 -0
  218. package/tests/alfa.d.ts +45 -0
  219. package/tests/alfa.js +138 -141
  220. package/tests/alfa.ts +214 -0
  221. package/tests/aslint.d.ts +33 -0
  222. package/tests/aslint.js +272 -249
  223. package/tests/aslint.ts +301 -0
  224. package/tests/axe.d.ts +27 -0
  225. package/tests/axe.js +199 -200
  226. package/tests/axe.ts +277 -0
  227. package/tests/ed11y.d.ts +28 -0
  228. package/tests/ed11y.js +141 -99
  229. package/tests/ed11y.ts +178 -0
  230. package/tests/htmlcs.d.ts +21 -0
  231. package/tests/htmlcs.js +174 -140
  232. package/tests/htmlcs.ts +181 -0
  233. package/tests/ibm.d.ts +52 -0
  234. package/tests/ibm.js +164 -166
  235. package/tests/ibm.ts +251 -0
  236. package/tests/nuVal.d.ts +13 -0
  237. package/tests/nuVal.js +107 -112
  238. package/tests/nuVal.ts +145 -0
  239. package/tests/nuVnu.d.ts +15 -0
  240. package/tests/nuVnu.js +141 -111
  241. package/tests/nuVnu.ts +144 -0
  242. package/tests/pour.d.ts +31 -0
  243. package/tests/pour.js +242 -0
  244. package/tests/pour.ts +273 -0
  245. package/tests/qualWeb.d.ts +39 -0
  246. package/tests/qualWeb.js +302 -272
  247. package/tests/qualWeb.ts +415 -0
  248. package/tests/surea11y.d.ts +33 -0
  249. package/tests/surea11y.js +288 -0
  250. package/tests/surea11y.ts +334 -0
  251. package/tests/testaro.d.ts +25 -0
  252. package/tests/testaro.js +745 -652
  253. package/tests/testaro.ts +862 -0
  254. package/tests/wave.d.ts +46 -0
  255. package/tests/wave.js +166 -177
  256. package/tests/wave.ts +252 -0
  257. package/tsconfig.json +17 -0
  258. package/types.d.ts +243 -0
  259. package/types.js +10 -0
  260. package/types.ts +376 -0
  261. package/validation/act/README.md +46 -0
  262. package/validation/act/capture.js +424 -0
  263. package/validation/act/chromium-issue-draft.md +66 -0
  264. package/validation/act/fp-triage-2026-08-22.md +86 -0
  265. package/validation/act/isolation-notes.md +159 -0
  266. package/validation/act/playwright-issue-draft.md +73 -0
  267. package/validation/act/propose-mappings.js +0 -0
  268. package/validation/act/repro-cdp-raw.js +105 -0
  269. package/validation/act/repro-metarefresh.js +65 -0
  270. package/validation/act/score.js +184 -0
  271. package/validation/act/stage3a-stress-report.md +69 -0
  272. package/validation/act/stage3b-mapping-proposals.md +94 -0
  273. package/validation/act/stage3b-triage-draft.md +138 -0
  274. package/validation/act/surea11y-track-a-2026-09-01.md +50 -0
  275. package/validation/executors/netWatch.js +180 -90
  276. package/validation/executors/test.js +17 -2
  277. package/validation/executors/tests.js +118 -10
  278. package/validation/jobs/reports/raw/260901T1000-surea11y-validation.json +964 -0
  279. package/validation/jobs/todo/240101T1200-simple-example.json +14 -6
  280. package/validation/jobs/todo/240101T1300-shoot-example.json +2 -1
  281. package/validation/jobs/todo/260821T1900-pour-validation.json +45 -0
  282. package/validation/jobs/todo/260901T1000-surea11y-validation.json +45 -0
  283. package/validation/knownFailures.json +1 -0
  284. package/validation/tests/jobProperties/adbID.json +27 -2
  285. package/validation/tests/jobProperties/{focOp.json → allCapStyle.json} +56 -53
  286. package/validation/tests/jobProperties/allCaps.json +25 -0
  287. package/validation/tests/jobProperties/allHidden.json +133 -13
  288. package/validation/tests/jobProperties/allSlanted.json +3 -3
  289. package/validation/tests/jobProperties/altScheme.json +23 -8
  290. package/validation/tests/jobProperties/attVal.json +57 -57
  291. package/validation/tests/jobProperties/autocomplete.json +11 -1
  292. package/validation/tests/jobProperties/bulk.json +6 -1
  293. package/validation/tests/jobProperties/buttonMenu.json +63 -42
  294. package/validation/tests/jobProperties/captionLoc.json +1 -6
  295. package/validation/tests/jobProperties/checkpoint-browser.json +401 -0
  296. package/validation/tests/jobProperties/checkpoint-page.json +397 -0
  297. package/validation/tests/jobProperties/checkpoint.json +395 -0
  298. package/validation/tests/jobProperties/datalistRef.json +20 -5
  299. package/validation/tests/jobProperties/distortion.json +28 -3
  300. package/validation/tests/jobProperties/docType.json +2 -2
  301. package/validation/tests/jobProperties/dupAtt.json +48 -33
  302. package/validation/tests/jobProperties/elements.json +28 -28
  303. package/validation/tests/jobProperties/embAc.json +36 -31
  304. package/validation/tests/jobProperties/focAndOp.json +284 -0
  305. package/validation/tests/jobProperties/focInd.json +34 -34
  306. package/validation/tests/jobProperties/focVis.json +1 -1
  307. package/validation/tests/jobProperties/hover.json +39 -37
  308. package/validation/tests/jobProperties/hr.json +13 -3
  309. package/validation/tests/jobProperties/imageLink.json +0 -5
  310. package/validation/tests/jobProperties/labClash.json +68 -33
  311. package/validation/tests/jobProperties/legendLoc.json +1 -6
  312. package/validation/tests/jobProperties/lineHeight.json +2 -2
  313. package/validation/tests/jobProperties/linkAmb.json +13 -18
  314. package/validation/tests/jobProperties/linkExt.json +1 -1
  315. package/validation/tests/jobProperties/linkOldAtt.json +12 -2
  316. package/validation/tests/jobProperties/linkTo.json +1 -1
  317. package/validation/tests/jobProperties/linkUl.json +65 -65
  318. package/validation/tests/jobProperties/miniText.json +7 -2
  319. package/validation/tests/jobProperties/motion.json +4 -50
  320. package/validation/tests/jobProperties/nonTable.json +48 -3
  321. package/validation/tests/jobProperties/optRoleSel.json +12 -2
  322. package/validation/tests/jobProperties/phOnly.json +6 -16
  323. package/validation/tests/jobProperties/pseudoP.json +17 -2
  324. package/validation/tests/jobProperties/radioSet.json +30 -30
  325. package/validation/tests/jobProperties/role.json +25 -5
  326. package/validation/tests/jobProperties/secHeading.json +26 -21
  327. package/validation/tests/jobProperties/styleDiff.json +35 -5
  328. package/validation/tests/jobProperties/tabNav.json +3 -1
  329. package/validation/tests/jobProperties/targetsNear.json +237 -0
  330. package/validation/tests/jobProperties/textNodes.json +29 -29
  331. package/validation/tests/jobProperties/textSem.json +26 -1
  332. package/validation/tests/jobProperties/title.json +12 -2
  333. package/validation/tests/jobProperties/titledEl.json +39 -9
  334. package/validation/tests/jobProperties/userPath.json +317 -0
  335. package/validation/tests/jobProperties/zIndex.json +40 -35
  336. package/validation/tests/targets/allCapStyle/index.html +26 -0
  337. package/validation/tests/targets/checkpoint/index.html +38 -0
  338. package/validation/tests/targets/datalistRef/index.html +1 -1
  339. package/validation/tests/targets/focAndOp/bad.html +29 -0
  340. package/validation/tests/targets/{focOp → focAndOp}/good.html +3 -1
  341. package/validation/tests/targets/focInd/bad.html +2 -1
  342. package/validation/tests/targets/headEl/index.html +10 -1
  343. package/validation/tests/targets/{targetSmall → targetsNear}/index.html +15 -1
  344. package/validation/tests/targets/userPath/index.html +42 -0
  345. package/validation/validateTest.js +61 -9
  346. package/.claude/settings.local.json +0 -11
  347. package/.eslintrc.json +0 -41
  348. package/htmlcs/.eslintrc.json +0 -67
  349. package/validation/tests/jobProperties/linkTitle.json +0 -127
  350. package/validation/tests/jobProperties/opFoc.json +0 -164
  351. package/validation/tests/jobProperties/targetSmall.json +0 -152
  352. package/validation/tests/jobProperties/targetTiny.json +0 -142
  353. package/validation/tests/targets/focOp/bad.html +0 -25
  354. package/validation/tests/targets/linkTitle/index.html +0 -24
  355. package/validation/tests/targets/opFoc/bad.html +0 -26
  356. package/validation/tests/targets/opFoc/good.html +0 -23
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  /*
2
3
  © 2023 CVS Health and/or one of its affiliates. All rights reserved.
3
4
  © 2026 Jeff Witt.
@@ -8,90 +9,73 @@
8
9
 
9
10
  SPDX-License-Identifier: MIT
10
11
  */
11
-
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.reporter = void 0;
14
+ const testaro_1 = require("../procs/testaro");
12
15
  /*
13
16
  autocomplete
14
17
  This test reports failures to equip name and email inputs with correct autocomplete attributes.
18
+ Compiled to autocomplete.js by tsc (issue #73); edit this file, not the emitted one.
15
19
  */
16
-
17
- // IMPORTS
18
-
19
- const {doTest} = require('../procs/testaro');
20
-
21
20
  // FUNCTIONS
22
-
23
21
  // Runs the test and returns the result.
24
- exports.reporter = async (
25
- page,
26
- report,
27
- _0,
28
- withItems,
29
- labels = {
22
+ const reporter = async (page, report, _0, withItems, labels = {
30
23
  name: ['your name', 'full name', 'first and last name'],
31
24
  email: ['email'],
32
25
  given: ['first name', 'forename', 'given name'],
33
26
  family: ['last name', 'surname', 'family name']
34
- }
35
- ) => {
36
- const getBadWhat = element => {
37
- // Get the lower-cased accessible name of the element.
38
- const accessibleName = window.getAccessibleName(element).toLowerCase();
39
- const {type} = element;
40
- let requiredAuto = '';
41
- const labels = {
42
- name: ['__nameLabels__'],
43
- email: ['__emailLabels__'],
44
- given: ['__givenLabels__'],
45
- family: ['__familyLabels__']
27
+ }) => {
28
+ // The candidate selector guarantees input elements, so the parameter is typed as one.
29
+ const getBadWhat = (element) => {
30
+ // Get the lower-cased accessible name of the element.
31
+ const accessibleName = window.getAccessibleName(element).toLowerCase();
32
+ const { type } = element;
33
+ let requiredAuto = '';
34
+ const labels = {
35
+ name: ['__nameLabels__'],
36
+ email: ['__emailLabels__'],
37
+ given: ['__givenLabels__'],
38
+ family: ['__familyLabels__']
39
+ };
40
+ // Get its required autocomplete value.
41
+ if (type === 'email'
42
+ || accessibleName && labels.email.some(label => accessibleName.includes(label))) {
43
+ requiredAuto = 'email';
44
+ }
45
+ else if (accessibleName && type === 'text' && labels.name.some(label => accessibleName.includes(label))) {
46
+ requiredAuto = 'name';
47
+ }
48
+ else if (accessibleName
49
+ && type === 'text'
50
+ && labels.given.some(label => accessibleName.includes(label))) {
51
+ requiredAuto = 'given-name';
52
+ }
53
+ else if (accessibleName
54
+ && type === 'text'
55
+ && labels.family.some(label => accessibleName.includes(label))) {
56
+ requiredAuto = 'family-name';
57
+ }
58
+ // Get its actual autocomplete value.
59
+ const actualAuto = element.getAttribute('autocomplete');
60
+ // If an autocomplete value is required but not present:
61
+ if (requiredAuto && !(actualAuto && actualAuto.includes(requiredAuto))) {
62
+ // Return a violation description.
63
+ return `input has no autocomplete="${requiredAuto}" attribute`;
64
+ }
46
65
  };
47
- // Get its required autocomplete value.
48
- if (
49
- type === 'email'
50
- || accessibleName && labels.email.some(label => accessibleName.includes(label))
51
- ) {
52
- requiredAuto = 'email';
53
- }
54
- else if (
55
- accessibleName && type === 'text' && labels.name.some(label => accessibleName.includes(label))
56
- ) {
57
- requiredAuto = 'name';
58
- }
59
- else if (
60
- accessibleName
61
- && type === 'text'
62
- && labels.given.some(label => accessibleName.includes(label))
63
- ) {
64
- requiredAuto = 'given-name';
65
- }
66
- else if (
67
- accessibleName
68
- && type === 'text'
69
- && labels.family.some(label => accessibleName.includes(label))
70
- ) {
71
- requiredAuto = 'family-name';
72
- }
73
- // Get its actual autocomplete value.
74
- const actualAuto = element.getAttribute('autocomplete');
75
- // If an autocomplete value is required but not present:
76
- if (requiredAuto && ! (actualAuto && actualAuto.includes(requiredAuto))) {
77
- // Return a violation description.
78
- return `input has no autocomplete="${requiredAuto}" attribute`;
79
- }
80
- };
81
- const selector = 'body input[type=text], body input[type=email], body input:not([type])';
82
- const whats = 'Inputs are missing required autocomplete attributes';
83
- // Each placeholder sits inside single quotes in getBadWhat (e.g. name: ['__nameLabels__']).
84
- // Replace the quoted placeholder with the bracket-stripped JSON so the result is a proper
85
- // element list (name: ["your name", ...]) rather than a one-element array holding the JSON
86
- // text of the array (name: ['["your name", ...]']), which never matches an accessible name.
87
- const placeHolders = Object.keys(labels).map(key => `'__${key}Labels__'`);
88
- const replacers = Object.values(labels).map(value => JSON.stringify(value).slice(1, -1));
89
- // Create a stringified getBadWhat, with placeholders replaced with the specified label arrays.
90
- let getBadWhatString = getBadWhat.toString();
91
- [0, 1, 2, 3].forEach(index => {
92
- getBadWhatString = getBadWhatString.replace(placeHolders[index], replacers[index]);
93
- });
94
- return doTest(
95
- page, report, withItems, 'autocomplete', selector, whats, 2, getBadWhatString
96
- );
66
+ const selector = 'body input[type=text], body input[type=email], body input:not([type])';
67
+ const whats = 'Inputs are missing required autocomplete attributes';
68
+ // Each placeholder sits inside single quotes in getBadWhat (e.g. name: ['__nameLabels__']).
69
+ // Replace the quoted placeholder with the bracket-stripped JSON so the result is a proper
70
+ // element list (name: ["your name", ...]) rather than a one-element array holding the JSON
71
+ // text of the array (name: ['["your name", ...]']), which never matches an accessible name.
72
+ const placeHolders = Object.keys(labels).map(key => `'__${key}Labels__'`);
73
+ const replacers = Object.values(labels).map(value => JSON.stringify(value).slice(1, -1));
74
+ // Create a stringified getBadWhat, with placeholders replaced with the specified label arrays.
75
+ let getBadWhatString = getBadWhat.toString();
76
+ [0, 1, 2, 3].forEach(index => {
77
+ getBadWhatString = getBadWhatString.replace(placeHolders[index], replacers[index]);
78
+ });
79
+ return (0, testaro_1.doTest)(page, report, withItems, 'autocomplete', selector, whats, 2, getBadWhatString);
97
80
  };
81
+ exports.reporter = reporter;
@@ -0,0 +1,101 @@
1
+ /*
2
+ © 2023 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 {doTest} from '../procs/testaro';
16
+ import type {BadWhat, Report} from '../types';
17
+
18
+ /*
19
+ autocomplete
20
+ This test reports failures to equip name and email inputs with correct autocomplete attributes.
21
+ Compiled to autocomplete.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 (
28
+ page: Page,
29
+ report: Report,
30
+ _0: unknown,
31
+ withItems: boolean,
32
+ labels: Record<'name' | 'email' | 'given' | 'family', string[]> = {
33
+ name: ['your name', 'full name', 'first and last name'],
34
+ email: ['email'],
35
+ given: ['first name', 'forename', 'given name'],
36
+ family: ['last name', 'surname', 'family name']
37
+ }
38
+ ) => {
39
+ // The candidate selector guarantees input elements, so the parameter is typed as one.
40
+ const getBadWhat = (element: HTMLInputElement): BadWhat => {
41
+ // Get the lower-cased accessible name of the element.
42
+ const accessibleName = window.getAccessibleName(element).toLowerCase();
43
+ const {type} = element;
44
+ let requiredAuto = '';
45
+ const labels = {
46
+ name: ['__nameLabels__'],
47
+ email: ['__emailLabels__'],
48
+ given: ['__givenLabels__'],
49
+ family: ['__familyLabels__']
50
+ };
51
+ // Get its required autocomplete value.
52
+ if (
53
+ type === 'email'
54
+ || accessibleName && labels.email.some(label => accessibleName.includes(label))
55
+ ) {
56
+ requiredAuto = 'email';
57
+ }
58
+ else if (
59
+ accessibleName && type === 'text' && labels.name.some(label => accessibleName.includes(label))
60
+ ) {
61
+ requiredAuto = 'name';
62
+ }
63
+ else if (
64
+ accessibleName
65
+ && type === 'text'
66
+ && labels.given.some(label => accessibleName.includes(label))
67
+ ) {
68
+ requiredAuto = 'given-name';
69
+ }
70
+ else if (
71
+ accessibleName
72
+ && type === 'text'
73
+ && labels.family.some(label => accessibleName.includes(label))
74
+ ) {
75
+ requiredAuto = 'family-name';
76
+ }
77
+ // Get its actual autocomplete value.
78
+ const actualAuto = element.getAttribute('autocomplete');
79
+ // If an autocomplete value is required but not present:
80
+ if (requiredAuto && ! (actualAuto && actualAuto.includes(requiredAuto))) {
81
+ // Return a violation description.
82
+ return `input has no autocomplete="${requiredAuto}" attribute`;
83
+ }
84
+ };
85
+ const selector = 'body input[type=text], body input[type=email], body input:not([type])';
86
+ const whats = 'Inputs are missing required autocomplete attributes';
87
+ // Each placeholder sits inside single quotes in getBadWhat (e.g. name: ['__nameLabels__']).
88
+ // Replace the quoted placeholder with the bracket-stripped JSON so the result is a proper
89
+ // element list (name: ["your name", ...]) rather than a one-element array holding the JSON
90
+ // text of the array (name: ['["your name", ...]']), which never matches an accessible name.
91
+ const placeHolders = Object.keys(labels).map(key => `'__${key}Labels__'`);
92
+ const replacers = Object.values(labels).map(value => JSON.stringify(value).slice(1, -1));
93
+ // Create a stringified getBadWhat, with placeholders replaced with the specified label arrays.
94
+ let getBadWhatString = getBadWhat.toString();
95
+ [0, 1, 2, 3].forEach(index => {
96
+ getBadWhatString = getBadWhatString.replace(placeHolders[index], replacers[index]);
97
+ });
98
+ return doTest(
99
+ page, report, withItems, 'autocomplete', selector, whats, 2, getBadWhatString
100
+ );
101
+ };
@@ -0,0 +1,13 @@
1
+ import type { Page } from 'playwright';
2
+ import type { Report } from '../types';
3
+ export declare const reporter: (page: Page, report: Report) => Promise<{
4
+ data: {};
5
+ totals: number[];
6
+ standardInstances: {
7
+ ruleID: string;
8
+ what: string;
9
+ ordinalSeverity: number;
10
+ count: number;
11
+ catalogIndex: string;
12
+ }[];
13
+ }>;
package/testaro/bulk.js CHANGED
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  /*
2
3
  © 2021–2023 CVS Health and/or one of its affiliates. All rights reserved.
3
4
  © 2026 Jeff Witt.
@@ -8,45 +9,43 @@
8
9
 
9
10
  SPDX-License-Identifier: MIT
10
11
  */
11
-
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.reporter = void 0;
14
+ const xPath_1 = require("../procs/xPath");
12
15
  /*
13
16
  bulk
14
17
  This test reports the count of visible elements. The test assumes that simplicity and compactness, with one page having one purpose, is an accessibility virtue. Users with visual, motor, and cognitive disabilities often have trouble finding what they want or understanding the purpose of a page if the page is cluttered with content.
18
+ Compiled to bulk.js by tsc (issue #73); edit this file, not the emitted one.
15
19
  */
16
-
17
- // IMPORTS
18
-
19
- const {getXPathCatalogIndex} = require('../procs/xPath');
20
-
21
20
  // FUNCTIONS
22
-
23
21
  // Runs the test and returns the result.
24
- exports.reporter = async (page, report) => {
25
- // Get a count of elements deemed visible by Playwright.
26
- const visibleElementCount = await page.locator('body :visible').count();
27
- // Convert the count to a severity level, treating up to 400 as non-reportable.
28
- const severity = Math.min(4, Math.round(visibleElementCount / 400)) - 1;
29
- const totals = [0, 0, 0, 0];
30
- // If the severity is reportable:
31
- if (severity > -1) {
32
- totals[severity] = 1;
33
- // Return data, totals, and a summary standard instance.
22
+ const reporter = async (page, report) => {
23
+ // Get a count of elements deemed visible by Playwright.
24
+ const visibleElementCount = await page.locator('body :visible').count();
25
+ // Convert the count to a severity level, treating up to 400 as non-reportable.
26
+ const severity = Math.min(4, Math.round(visibleElementCount / 400)) - 1;
27
+ const totals = [0, 0, 0, 0];
28
+ // If the severity is reportable:
29
+ if (severity > -1) {
30
+ totals[severity] = 1;
31
+ // Return data, totals, and a summary standard instance.
32
+ return {
33
+ data: {},
34
+ totals,
35
+ standardInstances: [{
36
+ ruleID: 'bulk',
37
+ what: `Page contains ${visibleElementCount} visible elements`,
38
+ ordinalSeverity: severity,
39
+ count: 1,
40
+ catalogIndex: (0, xPath_1.getXPathCatalogIndex)(report, '/html')
41
+ }]
42
+ };
43
+ }
44
+ // Otherwise, return data, totals, and an empty array of standard instances.
34
45
  return {
35
- data: {},
36
- totals,
37
- standardInstances: [{
38
- ruleID: 'bulk',
39
- what: `Page contains ${visibleElementCount} visible elements`,
40
- ordinalSeverity: severity,
41
- count: 1,
42
- catalogIndex: getXPathCatalogIndex(report, '/html')
43
- }]
46
+ data: {},
47
+ totals,
48
+ standardInstances: []
44
49
  };
45
- }
46
- // Otherwise, return data, totals, and an empty array of standard instances.
47
- return {
48
- data: {},
49
- totals,
50
- standardInstances: []
51
- };
52
50
  };
51
+ exports.reporter = reporter;
@@ -0,0 +1,55 @@
1
+ /*
2
+ © 2021–2023 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 {getXPathCatalogIndex} from '../procs/xPath';
16
+ import type {Report} from '../types';
17
+
18
+ /*
19
+ bulk
20
+ This test reports the count of visible elements. The test assumes that simplicity and compactness, with one page having one purpose, is an accessibility virtue. Users with visual, motor, and cognitive disabilities often have trouble finding what they want or understanding the purpose of a page if the page is cluttered with content.
21
+ Compiled to bulk.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) => {
28
+ // Get a count of elements deemed visible by Playwright.
29
+ const visibleElementCount = await page.locator('body :visible').count();
30
+ // Convert the count to a severity level, treating up to 400 as non-reportable.
31
+ const severity = Math.min(4, Math.round(visibleElementCount / 400)) - 1;
32
+ const totals = [0, 0, 0, 0];
33
+ // If the severity is reportable:
34
+ if (severity > -1) {
35
+ totals[severity] = 1;
36
+ // Return data, totals, and a summary standard instance.
37
+ return {
38
+ data: {},
39
+ totals,
40
+ standardInstances: [{
41
+ ruleID: 'bulk',
42
+ what: `Page contains ${visibleElementCount} visible elements`,
43
+ ordinalSeverity: severity,
44
+ count: 1,
45
+ catalogIndex: getXPathCatalogIndex(report, '/html')
46
+ }]
47
+ };
48
+ }
49
+ // Otherwise, return data, totals, and an empty array of standard instances.
50
+ return {
51
+ data: {},
52
+ totals,
53
+ standardInstances: []
54
+ };
55
+ };
@@ -0,0 +1,9 @@
1
+ import type { Page } from 'playwright';
2
+ import type { Report, StandardInstance } from '../types';
3
+ export declare const reporter: (page: Page, report: Report, _0: unknown, withItems: boolean, trialKeySpecs?: string[]) => Promise<{
4
+ data: {
5
+ trialKeys?: string[];
6
+ };
7
+ totals: number[];
8
+ standardInstances: StandardInstance[];
9
+ }>;