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.
Files changed (361) 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 +25 -19
  7. package/CONTAINERS.md +10 -6
  8. package/CONTRIBUTING.md +29 -3
  9. package/Dockerfile +1 -1
  10. package/README.md +75 -20
  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 +373 -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 +313 -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 +63 -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/getSource.js +1 -0
  38. package/procs/job.js +116 -1
  39. package/procs/launch.d.ts +40 -0
  40. package/procs/launch.js +239 -108
  41. package/procs/nu.d.ts +48 -0
  42. package/procs/nu.js +1 -0
  43. package/procs/scope.js +196 -0
  44. package/procs/shoot.d.ts +33 -0
  45. package/procs/shoot.js +3 -1
  46. package/procs/standard.d.ts +18 -0
  47. package/procs/standard.js +83 -0
  48. package/procs/standard.ts +126 -0
  49. package/procs/testAct.js +145 -0
  50. package/procs/testaro.d.ts +20 -0
  51. package/procs/testaro.js +237 -189
  52. package/procs/testaro.ts +321 -0
  53. package/procs/userPath.js +126 -0
  54. package/procs/xPath.d.ts +4 -0
  55. package/procs/xPath.js +82 -64
  56. package/procs/xPath.ts +106 -0
  57. package/procs/xPathScript.d.ts +6 -0
  58. package/procs/xPathScript.js +70 -0
  59. package/run.js +3 -2
  60. package/surea11y/README.md +44 -0
  61. package/surea11y/surea11y.browser.js +14 -0
  62. package/testaro/adbID.d.ts +3 -0
  63. package/testaro/adbID.js +39 -41
  64. package/testaro/adbID.ts +66 -0
  65. package/testaro/allCapStyle.d.ts +3 -0
  66. package/testaro/allCapStyle.js +32 -34
  67. package/testaro/allCapStyle.ts +55 -0
  68. package/testaro/allCaps.d.ts +16 -0
  69. package/testaro/allCaps.js +179 -151
  70. package/testaro/allCaps.ts +228 -0
  71. package/testaro/allHidden.d.ts +13 -0
  72. package/testaro/allHidden.js +30 -30
  73. package/testaro/allHidden.ts +50 -0
  74. package/testaro/allSlanted.d.ts +3 -0
  75. package/testaro/allSlanted.js +31 -33
  76. package/testaro/allSlanted.ts +54 -0
  77. package/testaro/altScheme.d.ts +3 -0
  78. package/testaro/altScheme.js +28 -30
  79. package/testaro/altScheme.ts +50 -0
  80. package/testaro/attVal.d.ts +3 -0
  81. package/testaro/attVal.js +21 -21
  82. package/testaro/attVal.ts +52 -0
  83. package/testaro/autocomplete.d.ts +3 -0
  84. package/testaro/autocomplete.js +60 -75
  85. package/testaro/autocomplete.ts +101 -0
  86. package/testaro/bulk.d.ts +13 -0
  87. package/testaro/bulk.js +33 -33
  88. package/testaro/bulk.ts +55 -0
  89. package/testaro/buttonMenu.d.ts +9 -0
  90. package/testaro/buttonMenu.js +318 -319
  91. package/testaro/buttonMenu.ts +391 -0
  92. package/testaro/captionLoc.d.ts +3 -0
  93. package/testaro/captionLoc.js +18 -20
  94. package/testaro/captionLoc.ts +40 -0
  95. package/testaro/datalistRef.d.ts +3 -0
  96. package/testaro/datalistRef.js +34 -36
  97. package/testaro/datalistRef.ts +55 -0
  98. package/testaro/distortion.d.ts +3 -0
  99. package/testaro/distortion.js +58 -26
  100. package/testaro/distortion.ts +81 -0
  101. package/testaro/docType.d.ts +15 -0
  102. package/testaro/docType.js +26 -25
  103. package/testaro/docType.ts +45 -0
  104. package/testaro/dupAtt.d.ts +16 -0
  105. package/testaro/dupAtt.js +114 -104
  106. package/testaro/dupAtt.ts +144 -0
  107. package/testaro/elements.d.ts +6 -0
  108. package/testaro/elements.js +153 -153
  109. package/testaro/elements.ts +215 -0
  110. package/testaro/embAc.d.ts +3 -0
  111. package/testaro/embAc.js +20 -20
  112. package/testaro/embAc.ts +40 -0
  113. package/testaro/focAll.d.ts +13 -0
  114. package/testaro/focAll.js +186 -191
  115. package/testaro/focAll.ts +217 -0
  116. package/testaro/focAndOp.d.ts +3 -0
  117. package/testaro/focAndOp.js +101 -104
  118. package/testaro/focAndOp.ts +128 -0
  119. package/testaro/focInd.d.ts +3 -0
  120. package/testaro/focInd.js +65 -66
  121. package/testaro/focInd.ts +96 -0
  122. package/testaro/focVis.d.ts +3 -0
  123. package/testaro/focVis.js +29 -30
  124. package/testaro/focVis.ts +52 -0
  125. package/testaro/headEl.d.ts +10 -0
  126. package/testaro/headEl.js +62 -62
  127. package/testaro/headEl.ts +82 -0
  128. package/testaro/headingAmb.d.ts +3 -0
  129. package/testaro/headingAmb.js +55 -63
  130. package/testaro/headingAmb.ts +72 -0
  131. package/testaro/hovInd.d.ts +12 -0
  132. package/testaro/hovInd.js +164 -130
  133. package/testaro/hovInd.ts +199 -0
  134. package/testaro/hover.d.ts +3 -0
  135. package/testaro/hover.js +156 -126
  136. package/testaro/hover.ts +154 -0
  137. package/testaro/hr.d.ts +3 -0
  138. package/testaro/hr.js +15 -17
  139. package/testaro/hr.ts +36 -0
  140. package/testaro/imageLink.d.ts +3 -0
  141. package/testaro/imageLink.js +18 -20
  142. package/testaro/imageLink.ts +42 -0
  143. package/testaro/labClash.d.ts +3 -0
  144. package/testaro/labClash.js +32 -33
  145. package/testaro/labClash.ts +54 -0
  146. package/testaro/legendLoc.d.ts +3 -0
  147. package/testaro/legendLoc.js +18 -20
  148. package/testaro/legendLoc.ts +42 -0
  149. package/testaro/lineHeight.d.ts +3 -0
  150. package/testaro/lineHeight.js +44 -48
  151. package/testaro/lineHeight.ts +70 -0
  152. package/testaro/linkAmb.d.ts +7 -0
  153. package/testaro/linkAmb.js +80 -80
  154. package/testaro/linkAmb.ts +105 -0
  155. package/testaro/linkExt.d.ts +3 -0
  156. package/testaro/linkExt.js +14 -16
  157. package/testaro/linkExt.ts +35 -0
  158. package/testaro/linkOldAtt.d.ts +3 -0
  159. package/testaro/linkOldAtt.js +26 -28
  160. package/testaro/linkOldAtt.ts +48 -0
  161. package/testaro/linkTo.d.ts +3 -0
  162. package/testaro/linkTo.js +23 -22
  163. package/testaro/linkTo.ts +43 -0
  164. package/testaro/linkUl.d.ts +3 -0
  165. package/testaro/linkUl.js +31 -34
  166. package/testaro/linkUl.ts +54 -0
  167. package/testaro/miniText.d.ts +3 -0
  168. package/testaro/miniText.js +42 -44
  169. package/testaro/miniText.ts +68 -0
  170. package/testaro/motion.d.ts +10 -0
  171. package/testaro/motion.js +93 -96
  172. package/testaro/motion.ts +125 -0
  173. package/testaro/nonTable.d.ts +3 -0
  174. package/testaro/nonTable.js +40 -45
  175. package/testaro/nonTable.ts +66 -0
  176. package/testaro/optRoleSel.d.ts +3 -0
  177. package/testaro/optRoleSel.js +17 -19
  178. package/testaro/optRoleSel.ts +41 -0
  179. package/testaro/phOnly.d.ts +3 -0
  180. package/testaro/phOnly.js +19 -21
  181. package/testaro/phOnly.ts +43 -0
  182. package/testaro/pseudoP.d.ts +3 -0
  183. package/testaro/pseudoP.js +37 -38
  184. package/testaro/pseudoP.ts +59 -0
  185. package/testaro/radioSet.d.ts +3 -0
  186. package/testaro/radioSet.js +58 -59
  187. package/testaro/radioSet.ts +79 -0
  188. package/testaro/registry.d.ts +63 -0
  189. package/testaro/registry.js +67 -0
  190. package/testaro/registry.ts +141 -0
  191. package/testaro/role.d.ts +3 -0
  192. package/testaro/role.js +28 -29
  193. package/testaro/role.ts +53 -0
  194. package/testaro/secHeading.d.ts +3 -0
  195. package/testaro/secHeading.js +31 -33
  196. package/testaro/secHeading.ts +53 -0
  197. package/testaro/styleDiff.d.ts +25 -0
  198. package/testaro/styleDiff.js +249 -252
  199. package/testaro/styleDiff.ts +303 -0
  200. package/testaro/tabNav.d.ts +33 -0
  201. package/testaro/tabNav.js +273 -342
  202. package/testaro/tabNav.ts +454 -0
  203. package/testaro/targetsNear.d.ts +9 -0
  204. package/testaro/targetsNear.js +131 -132
  205. package/testaro/targetsNear.ts +160 -0
  206. package/testaro/textNodes.d.ts +6 -0
  207. package/testaro/textNodes.js +139 -135
  208. package/testaro/textNodes.ts +185 -0
  209. package/testaro/textSem.d.ts +3 -0
  210. package/testaro/textSem.js +26 -28
  211. package/testaro/textSem.ts +47 -0
  212. package/testaro/title.d.ts +9 -0
  213. package/testaro/title.js +16 -13
  214. package/testaro/title.ts +31 -0
  215. package/testaro/titledEl.d.ts +3 -0
  216. package/testaro/titledEl.js +16 -18
  217. package/testaro/titledEl.ts +38 -0
  218. package/testaro/zIndex.d.ts +3 -0
  219. package/testaro/zIndex.js +20 -22
  220. package/testaro/zIndex.ts +42 -0
  221. package/tests/alfa.d.ts +45 -0
  222. package/tests/alfa.js +139 -141
  223. package/tests/alfa.ts +214 -0
  224. package/tests/aslint.d.ts +33 -0
  225. package/tests/aslint.js +273 -249
  226. package/tests/aslint.ts +301 -0
  227. package/tests/axe.d.ts +27 -0
  228. package/tests/axe.js +200 -200
  229. package/tests/axe.ts +277 -0
  230. package/tests/ed11y.d.ts +28 -0
  231. package/tests/ed11y.js +142 -99
  232. package/tests/ed11y.ts +178 -0
  233. package/tests/htmlcs.d.ts +21 -0
  234. package/tests/htmlcs.js +175 -140
  235. package/tests/htmlcs.ts +181 -0
  236. package/tests/ibm.d.ts +52 -0
  237. package/tests/ibm.js +165 -166
  238. package/tests/ibm.ts +251 -0
  239. package/tests/nuVal.d.ts +13 -0
  240. package/tests/nuVal.js +107 -112
  241. package/tests/nuVal.ts +145 -0
  242. package/tests/nuVnu.d.ts +15 -0
  243. package/tests/nuVnu.js +142 -111
  244. package/tests/nuVnu.ts +144 -0
  245. package/tests/pour.d.ts +31 -0
  246. package/tests/pour.js +242 -0
  247. package/tests/pour.ts +273 -0
  248. package/tests/qualWeb.d.ts +39 -0
  249. package/tests/qualWeb.js +303 -272
  250. package/tests/qualWeb.ts +415 -0
  251. package/tests/surea11y.d.ts +33 -0
  252. package/tests/surea11y.js +288 -0
  253. package/tests/surea11y.ts +334 -0
  254. package/tests/testaro.d.ts +25 -0
  255. package/tests/testaro.js +746 -652
  256. package/tests/testaro.ts +862 -0
  257. package/tests/wave.d.ts +46 -0
  258. package/tests/wave.js +167 -177
  259. package/tests/wave.ts +252 -0
  260. package/tsconfig.json +17 -0
  261. package/types.d.ts +243 -0
  262. package/types.js +10 -0
  263. package/types.ts +376 -0
  264. package/validation/act/README.md +46 -0
  265. package/validation/act/capture.js +424 -0
  266. package/validation/act/chromium-issue-draft.md +66 -0
  267. package/validation/act/fp-triage-2026-08-22.md +86 -0
  268. package/validation/act/isolation-notes.md +159 -0
  269. package/validation/act/playwright-issue-draft.md +73 -0
  270. package/validation/act/propose-mappings.js +0 -0
  271. package/validation/act/repro-cdp-raw.js +105 -0
  272. package/validation/act/repro-metarefresh.js +65 -0
  273. package/validation/act/score.js +184 -0
  274. package/validation/act/stage3a-stress-report.md +69 -0
  275. package/validation/act/stage3b-mapping-proposals.md +94 -0
  276. package/validation/act/stage3b-triage-draft.md +138 -0
  277. package/validation/act/surea11y-track-a-2026-09-01.md +50 -0
  278. package/validation/executors/netWatch.js +180 -90
  279. package/validation/executors/test.js +17 -2
  280. package/validation/executors/tests.js +118 -10
  281. package/validation/jobs/reports/raw/260901T1000-surea11y-validation.json +964 -0
  282. package/validation/jobs/todo/240101T1200-simple-example.json +14 -6
  283. package/validation/jobs/todo/240101T1300-shoot-example.json +2 -1
  284. package/validation/jobs/todo/260821T1900-pour-validation.json +45 -0
  285. package/validation/jobs/todo/260901T1000-surea11y-validation.json +45 -0
  286. package/validation/knownFailures.json +1 -0
  287. package/validation/tests/jobProperties/adbID.json +27 -2
  288. package/validation/tests/jobProperties/{focOp.json → allCapStyle.json} +56 -53
  289. package/validation/tests/jobProperties/allCaps.json +25 -0
  290. package/validation/tests/jobProperties/allHidden.json +133 -13
  291. package/validation/tests/jobProperties/allSlanted.json +3 -3
  292. package/validation/tests/jobProperties/altScheme.json +23 -8
  293. package/validation/tests/jobProperties/attVal.json +57 -57
  294. package/validation/tests/jobProperties/autocomplete.json +11 -1
  295. package/validation/tests/jobProperties/bulk.json +6 -1
  296. package/validation/tests/jobProperties/buttonMenu.json +63 -42
  297. package/validation/tests/jobProperties/captionLoc.json +1 -6
  298. package/validation/tests/jobProperties/checkpoint-browser.json +401 -0
  299. package/validation/tests/jobProperties/checkpoint-page.json +397 -0
  300. package/validation/tests/jobProperties/checkpoint.json +395 -0
  301. package/validation/tests/jobProperties/datalistRef.json +20 -5
  302. package/validation/tests/jobProperties/distortion.json +28 -3
  303. package/validation/tests/jobProperties/docType.json +2 -2
  304. package/validation/tests/jobProperties/dupAtt.json +48 -33
  305. package/validation/tests/jobProperties/elements.json +28 -28
  306. package/validation/tests/jobProperties/embAc.json +36 -31
  307. package/validation/tests/jobProperties/focAndOp.json +284 -0
  308. package/validation/tests/jobProperties/focInd.json +34 -34
  309. package/validation/tests/jobProperties/focVis.json +1 -1
  310. package/validation/tests/jobProperties/hover.json +39 -37
  311. package/validation/tests/jobProperties/hr.json +13 -3
  312. package/validation/tests/jobProperties/imageLink.json +0 -5
  313. package/validation/tests/jobProperties/labClash.json +68 -33
  314. package/validation/tests/jobProperties/legendLoc.json +1 -6
  315. package/validation/tests/jobProperties/lineHeight.json +2 -2
  316. package/validation/tests/jobProperties/linkAmb.json +13 -18
  317. package/validation/tests/jobProperties/linkExt.json +1 -1
  318. package/validation/tests/jobProperties/linkOldAtt.json +12 -2
  319. package/validation/tests/jobProperties/linkTo.json +1 -1
  320. package/validation/tests/jobProperties/linkUl.json +65 -65
  321. package/validation/tests/jobProperties/miniText.json +7 -2
  322. package/validation/tests/jobProperties/motion.json +4 -50
  323. package/validation/tests/jobProperties/nonTable.json +48 -3
  324. package/validation/tests/jobProperties/optRoleSel.json +12 -2
  325. package/validation/tests/jobProperties/phOnly.json +6 -16
  326. package/validation/tests/jobProperties/pseudoP.json +17 -2
  327. package/validation/tests/jobProperties/radioSet.json +30 -30
  328. package/validation/tests/jobProperties/role.json +25 -5
  329. package/validation/tests/jobProperties/secHeading.json +26 -21
  330. package/validation/tests/jobProperties/styleDiff.json +35 -5
  331. package/validation/tests/jobProperties/tabNav.json +3 -1
  332. package/validation/tests/jobProperties/targetsNear.json +237 -0
  333. package/validation/tests/jobProperties/textNodes.json +29 -29
  334. package/validation/tests/jobProperties/textSem.json +26 -1
  335. package/validation/tests/jobProperties/title.json +12 -2
  336. package/validation/tests/jobProperties/titledEl.json +39 -9
  337. package/validation/tests/jobProperties/userPath.json +317 -0
  338. package/validation/tests/jobProperties/zIndex.json +40 -35
  339. package/validation/tests/targets/allCapStyle/index.html +26 -0
  340. package/validation/tests/targets/checkpoint/index.html +38 -0
  341. package/validation/tests/targets/datalistRef/index.html +1 -1
  342. package/validation/tests/targets/focAndOp/bad.html +29 -0
  343. package/validation/tests/targets/{focOp → focAndOp}/good.html +3 -1
  344. package/validation/tests/targets/focInd/bad.html +2 -1
  345. package/validation/tests/targets/headEl/index.html +10 -1
  346. package/validation/tests/targets/{targetSmall → targetsNear}/index.html +15 -1
  347. package/validation/tests/targets/userPath/index.html +42 -0
  348. package/validation/validateTest.js +62 -10
  349. package/.claude/settings.local.json +0 -11
  350. package/.eslintrc.json +0 -41
  351. package/htmlcs/.eslintrc.json +0 -67
  352. package/memory/MEMORY.md +0 -3
  353. package/memory/project_validation_pause.md +0 -10
  354. package/validation/tests/jobProperties/linkTitle.json +0 -127
  355. package/validation/tests/jobProperties/opFoc.json +0 -164
  356. package/validation/tests/jobProperties/targetSmall.json +0 -152
  357. package/validation/tests/jobProperties/targetTiny.json +0 -142
  358. package/validation/tests/targets/focOp/bad.html +0 -25
  359. package/validation/tests/targets/linkTitle/index.html +0 -24
  360. package/validation/tests/targets/opFoc/bad.html +0 -26
  361. package/validation/tests/targets/opFoc/good.html +0 -23
package/.gitattributes ADDED
@@ -0,0 +1,94 @@
1
+ # Generated by tsc from the sibling .ts sources (npm run build:ts); do not edit.
2
+ types.js linguist-generated=true
3
+ types.d.ts linguist-generated=true
4
+ procs/xPath.js linguist-generated=true
5
+ procs/xPath.d.ts linguist-generated=true
6
+ procs/catalog.js linguist-generated=true
7
+ procs/catalog.d.ts linguist-generated=true
8
+ procs/testaro.js linguist-generated=true
9
+ procs/testaro.d.ts linguist-generated=true
10
+ testaro/altScheme.js linguist-generated=true
11
+ testaro/altScheme.d.ts linguist-generated=true
12
+ testaro/autocomplete.js linguist-generated=true
13
+ testaro/autocomplete.d.ts linguist-generated=true
14
+ testaro/datalistRef.js linguist-generated=true
15
+ testaro/datalistRef.d.ts linguist-generated=true
16
+ testaro/hr.js linguist-generated=true
17
+ testaro/hr.d.ts linguist-generated=true
18
+ testaro/lineHeight.js linguist-generated=true
19
+ testaro/lineHeight.d.ts linguist-generated=true
20
+ testaro/radioSet.js linguist-generated=true
21
+ testaro/radioSet.d.ts linguist-generated=true
22
+ testaro/allSlanted.js linguist-generated=true
23
+ testaro/allSlanted.d.ts linguist-generated=true
24
+ testaro/distortion.js linguist-generated=true
25
+ testaro/distortion.d.ts linguist-generated=true
26
+ testaro/miniText.js linguist-generated=true
27
+ testaro/miniText.d.ts linguist-generated=true
28
+ testaro/phOnly.js linguist-generated=true
29
+ testaro/phOnly.d.ts linguist-generated=true
30
+ testaro/legendLoc.js linguist-generated=true
31
+ testaro/legendLoc.d.ts linguist-generated=true
32
+ testaro/linkExt.js linguist-generated=true
33
+ testaro/linkExt.d.ts linguist-generated=true
34
+ testaro/linkOldAtt.js linguist-generated=true
35
+ testaro/linkOldAtt.d.ts linguist-generated=true
36
+ testaro/linkTo.js linguist-generated=true
37
+ testaro/linkTo.d.ts linguist-generated=true
38
+ testaro/linkUl.js linguist-generated=true
39
+ testaro/linkUl.d.ts linguist-generated=true
40
+ testaro/nonTable.js linguist-generated=true
41
+ testaro/nonTable.d.ts linguist-generated=true
42
+ testaro/optRoleSel.js linguist-generated=true
43
+ testaro/optRoleSel.d.ts linguist-generated=true
44
+ testaro/pseudoP.js linguist-generated=true
45
+ testaro/pseudoP.d.ts linguist-generated=true
46
+ testaro/secHeading.js linguist-generated=true
47
+ testaro/secHeading.d.ts linguist-generated=true
48
+ testaro/textSem.js linguist-generated=true
49
+ testaro/textSem.d.ts linguist-generated=true
50
+ testaro/titledEl.js linguist-generated=true
51
+ testaro/titledEl.d.ts linguist-generated=true
52
+ testaro/zIndex.js linguist-generated=true
53
+ testaro/zIndex.d.ts linguist-generated=true
54
+ testaro/title.js linguist-generated=true
55
+ testaro/title.d.ts linguist-generated=true
56
+ testaro/docType.js linguist-generated=true
57
+ testaro/docType.d.ts linguist-generated=true
58
+ testaro/allHidden.js linguist-generated=true
59
+ testaro/allHidden.d.ts linguist-generated=true
60
+ testaro/role.js linguist-generated=true
61
+ testaro/role.d.ts linguist-generated=true
62
+ testaro/bulk.js linguist-generated=true
63
+ testaro/bulk.d.ts linguist-generated=true
64
+ testaro/headEl.js linguist-generated=true
65
+ testaro/headEl.d.ts linguist-generated=true
66
+ testaro/linkAmb.js linguist-generated=true
67
+ testaro/linkAmb.d.ts linguist-generated=true
68
+ testaro/dupAtt.js linguist-generated=true
69
+ testaro/dupAtt.d.ts linguist-generated=true
70
+ testaro/hover.js linguist-generated=true
71
+ testaro/hover.d.ts linguist-generated=true
72
+ testaro/motion.js linguist-generated=true
73
+ testaro/motion.d.ts linguist-generated=true
74
+ testaro/targetsNear.js linguist-generated=true
75
+ testaro/targetsNear.d.ts linguist-generated=true
76
+ testaro/textNodes.js linguist-generated=true
77
+ testaro/textNodes.d.ts linguist-generated=true
78
+ testaro/elements.js linguist-generated=true
79
+ testaro/elements.d.ts linguist-generated=true
80
+ testaro/allCaps.js linguist-generated=true
81
+ testaro/allCaps.d.ts linguist-generated=true
82
+ testaro/focAll.js linguist-generated=true
83
+ testaro/focAll.d.ts linguist-generated=true
84
+ testaro/styleDiff.js linguist-generated=true
85
+ testaro/styleDiff.d.ts linguist-generated=true
86
+ testaro/buttonMenu.js linguist-generated=true
87
+ testaro/buttonMenu.d.ts linguist-generated=true
88
+ testaro/tabNav.js linguist-generated=true
89
+ testaro/tabNav.d.ts linguist-generated=true
90
+ testaro/registry.js linguist-generated=true
91
+ testaro/registry.d.ts linguist-generated=true
92
+ testaro/registry.ts linguist-generated=true
93
+ tests/testaro.js linguist-generated=true
94
+ tests/testaro.d.ts linguist-generated=true
@@ -0,0 +1,58 @@
1
+ # © 2026 Jeff Witt.
2
+ #
3
+ # Licensed under the MIT License. See LICENSE file at the project root or
4
+ # https://opensource.org/license/mit/ for details.
5
+ #
6
+ # SPDX-License-Identifier: MIT
7
+
8
+ # CI: lints the code and validates the Testaro rules on every push and pull request.
9
+
10
+ name: CI
11
+
12
+ on:
13
+ push:
14
+ branches: [main]
15
+ pull_request:
16
+
17
+ concurrency:
18
+ group: ci-${{ github.ref }}
19
+ cancel-in-progress: true
20
+
21
+ jobs:
22
+ lint:
23
+ name: Lint
24
+ runs-on: ubuntu-latest
25
+ steps:
26
+ - uses: actions/checkout@v5
27
+ - uses: actions/setup-node@v5
28
+ with:
29
+ node-version: 24
30
+ cache: npm
31
+ # Postinstall scripts only download browsers and a JRE, which linting does not need.
32
+ - run: npm ci --ignore-scripts
33
+ - run: npm run lint
34
+
35
+ validate:
36
+ name: Validate Testaro rules
37
+ runs-on: ubuntu-latest
38
+ # The image tag must match the playwright version in package-lock.json (see CONTAINERS.md).
39
+ # The next step enforces that; when Playwright is updated, update the tag here, too.
40
+ container:
41
+ image: mcr.microsoft.com/playwright:v1.62.1-noble
42
+ timeout-minutes: 45
43
+ env:
44
+ # The default Docker seccomp profile blocks the namespace cloning of the Chromium sandbox.
45
+ TESTARO_CHROMIUM_NO_SANDBOX: 'true'
46
+ steps:
47
+ - uses: actions/checkout@v5
48
+ - name: Require the container image to match the pinned Playwright version
49
+ run: |
50
+ lockVersion=$(node -p "require('./package-lock.json').packages['node_modules/playwright'].version")
51
+ imageVersion='1.62.1'
52
+ if [ "$lockVersion" != "$imageVersion" ]; then
53
+ echo "package-lock.json pins playwright $lockVersion, but this workflow uses the v$imageVersion image."
54
+ echo "Update the container image tag and imageVersion in .github/workflows/ci.yml (see CONTAINERS.md)."
55
+ exit 1
56
+ fi
57
+ - run: npm ci
58
+ - run: npm run tests
@@ -0,0 +1,49 @@
1
+ # © 2026 Jeff Witt.
2
+ #
3
+ # Licensed under the MIT License. See LICENSE file at the project root or
4
+ # https://opensource.org/license/mit/ for details.
5
+ #
6
+ # SPDX-License-Identifier: MIT
7
+
8
+ # Publishes the package to npm when a GitHub release is published (the release tag must equal
9
+ # v<package.json version>), or on manual dispatch. Authenticates with the NPM_TOKEN repository
10
+ # secret, a granular access token with publish permission for the testaro package.
11
+ # prepublishOnly regenerates the rule registry and the emitted TypeScript, and the version
12
+ # check refuses a release tag that does not match.
13
+
14
+ name: Publish
15
+
16
+ on:
17
+ release:
18
+ types: [published]
19
+ workflow_dispatch:
20
+
21
+ permissions:
22
+ contents: read
23
+ id-token: write
24
+
25
+ jobs:
26
+ publish:
27
+ name: Publish to npm
28
+ runs-on: ubuntu-latest
29
+ steps:
30
+ - uses: actions/checkout@v5
31
+ - uses: actions/setup-node@v5
32
+ with:
33
+ node-version: 24
34
+ cache: npm
35
+ registry-url: https://registry.npmjs.org
36
+ - name: Check that the release tag matches the package version
37
+ if: github.event_name == 'release'
38
+ run: |
39
+ version=$(node -p "require('./package.json').version")
40
+ if [ "${{ github.event.release.tag_name }}" != "v$version" ]; then
41
+ echo "Release tag ${{ github.event.release.tag_name }} does not match package version v$version" >&2
42
+ exit 1
43
+ fi
44
+ - run: npm ci
45
+ - run: npm run lint
46
+ - run: npm run typecheck
47
+ - run: npm publish --provenance --access public
48
+ env:
49
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -0,0 +1,35 @@
1
+ name: TypeScript
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ jobs:
9
+ typecheck:
10
+ name: Type check and syntax check
11
+ runs-on: ubuntu-latest
12
+ timeout-minutes: 15
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: actions/setup-node@v4
16
+ with:
17
+ node-version: 24
18
+ cache: npm
19
+ - name: Install dependencies
20
+ run: npm ci --ignore-scripts --no-audit --no-fund
21
+ - name: Generate rule registry
22
+ run: npm run build:registry
23
+ - name: Compile TypeScript
24
+ run: npm run build:ts
25
+ - name: Committed emit matches sources
26
+ run: git diff --exit-code
27
+ - name: Syntax-check all JavaScript
28
+ run: |
29
+ set -e
30
+ find . -name '*.js' \
31
+ -not -path './node_modules/*' \
32
+ -not -path './.git/*' \
33
+ -not -path './dist/*' \
34
+ -not -path './ed11y/*' \
35
+ -print0 | xargs -0 -n1 node --check
package/AGENTS.md CHANGED
@@ -7,7 +7,7 @@
7
7
  - **Run job**: `npm run run [jobID]`
8
8
  - **Directory watch**: `npm run dirWatch`
9
9
  - **Network watch**: `npm run netWatch`
10
- - **Lint**: `npx eslint <file>` (follows `.eslintrc.json`)
10
+ - **Lint**: `npm run lint` (follows `eslint.config.mjs`)
11
11
 
12
12
  ## Architecture
13
13
 
@@ -15,7 +15,7 @@
15
15
  - **Key files**: `run.js` (main executor), `actSpecs.js` (act specifications), `call.js` (CLI entry), `tests/testaro.js` (Testaro tool rules)
16
16
  - **Tools**: Integrates these accessibility tools: Axe, Alfa, IBM Checker, QualWeb, ASLint, WAVE, Ed11y, HTML CodeSniffer, Nu Html Checker API, Nu Html Checker, Testaro
17
17
  - **Data flow**: Jobs (JSON) → run.js → tool tests → reports (with standardized results)
18
- - **Env vars**: Required for WAVE (`WAVE_KEY`); optional `DEBUG`, `WAITS`, `JOBDIR`, `REPORTDIR`, `AGENT`
18
+ - **Env vars**: Required for WAVE (`WAVE_KEY`); optional `DEBUG`, `WAITS`, `JOBDIR`, `REPORTDIR`; for server polling `NETWATCH_URL_JOB`, `NETWATCH_URL_REPORT`, `NETWATCH_AUTH_TYPE`, `NETWATCH_WORKER_ID`, `NETWATCH_WORKER_SECRET`
19
19
 
20
20
  ## Code Style
21
21
 
package/CLAUDE.md CHANGED
@@ -12,7 +12,7 @@ npm run deps
12
12
  npm run build
13
13
 
14
14
  # Lint (ESLint)
15
- npx eslint .
15
+ npm run lint
16
16
 
17
17
  # Validate a single Testaro rule (replace <ruleID> with the rule name, e.g. allSlanted)
18
18
  npm test <ruleID>
@@ -32,25 +32,25 @@ node call netWatch <true|false> <intervalSeconds> [<true|false>]
32
32
 
33
33
  ## Architecture
34
34
 
35
- Testaro is an ensemble accessibility test runner. It integrates 10 external tools plus ~50 of its own rules (the "testaro" tool) and produces standardized reports from a job document.
35
+ Testaro is an ensemble accessibility test runner. It integrates 12 external tools plus ~50 of its own rules (the "testaro" tool) and produces standardized reports from a job document.
36
36
 
37
37
  ### Job → Report lifecycle
38
38
 
39
39
  1. A caller provides a **job** — a plain JS/JSON object with a `target` URL, `browserID`, optional `device`, and an `acts` array.
40
- 2. `run.js` exports `doJob(job)`, which validates the job (`procs/job.js`), builds a DOM **catalog** (`procs/catalog.js`), then delegates to `procs/doActs.js`.
41
- 3. `doActs.js` iterates the acts array. For `test` acts it forks a child process running `procs/doTestAct.js` (one per tool invocation) and enforces per-tool time limits. Non-test acts (browser interactions) execute in the parent.
42
- 4. Each tool's test module lives in `tests/<toolID>.js`. It calls the tool's library and converts the native result to the **standard result** shape (`prevented`, `totals[4]`, `instances[]`).
40
+ 2. `run.js` exports `doJob(job)`, which validates the job (`procs/job.js`), builds a DOM **catalog** (`procs/catalog.ts`) as checkpoint 0, then delegates to `procs/doActs.js`.
41
+ 3. `doActs.js` iterates the acts array. For `test` acts it forks a child process running `procs/doTestAct.js` (one per tool invocation) and enforces per-tool time limits. Non-test acts (browser interactions) execute in the parent through `procs/actDo.js`. A `checkpoint` act snapshots the live page (`procs/checkpoint.js`) as a page state that later test acts observe: the child's launcher replays the recorded interaction acts before the tool runs (`docs/checkpoint-scanning.md`).
42
+ 4. Each tool's test module lives in `tests/<toolID>.ts` (compiled to a committed `tests/<toolID>.js`). It calls the tool's library and converts the native result to the **standard result** shape (`prevented`, `totals[4]`, `outcomeTotals`, `instances[]`) using the helpers in `procs/standard.ts`. Every instance carries an `outcome` (`failed` or `cantTell`) that is the authoritative certainty signal; `ordinalSeverity` still encodes certainty per tool until it is redefined as impact only (see `docs/standard-result-outcome.md`).
43
43
  5. `doJob` returns the job object with `jobData` and `catalog` added at the top level and `result` added inside each `test` act. The job's `standard` property controls what `result` contains: `'no'` → `nativeResult` only; `'only'` → `standardResult` only; `'also'` → both.
44
44
 
45
- The 18 act types are defined and documented in `actSpecs.js` (`etc` property). The main interactive types are `button`, `checkbox`, `focus`, `link`, `press`, `presses`, `radio`, `reveal`, `search`, `select`, `text`, `url`, `wait`. The `test` type runs a tool. `launch`, `next`, `page`, `state` control flow.
45
+ The 19 act types are defined and documented in `actSpecs.js` (`etc` property). The main interactive types are `button`, `checkbox`, `focus`, `link`, `press`, `presses`, `radio`, `reveal`, `search`, `select`, `text`, `url`, `wait`. The `test` type runs a tool. `launch`, `next`, `page`, `state` control flow. `checkpoint` snapshots a page state. A `test` act's optional `scope` (`page` or `changed`) restricts element-local rules to the subtrees changed since the previous checkpoint (`procs/scope.js`); reports with two or more checkpoints gain `flow`, the issue deltas between checkpoints (`procs/flow.js`). Move acts accept a Playwright `selector`; `procs/userPath.js` converts a recorded user path (yra-monitor's action shape) into acts. See `docs/checkpoint-scanning.md`.
46
46
 
47
47
  ### Testaro rules (`testaro/` directory)
48
48
 
49
- Each file exports a `reporter(page, catalog, withItems)` async function. Rules are registered in `tests/testaro.js` in the `allRules` array, which controls default execution order, contamination flags, time limits, and `defaultOn`.
49
+ Each file exports a `reporter(page, catalog, withItems)` async function. Rules are registered in `tests/testaro.ts` in the `allRules` array, which controls default execution order, contamination flags, time limits, `defaultOn`, and an optional default `outcome`. The generated `testaro/registry.ts` maps rule IDs to modules.
50
50
 
51
51
  The default order in `allRules` reflects a two-phase execution strategy: non-contaminating rules (`contaminates: false`) come first and all share a single page load; contaminating rules (`contaminates: true`) follow, each tested on a freshly loaded copy of the page.
52
52
 
53
- Two rules, `shoot0` and `shoot1`, are atypical: they report no violations. Instead they take screenshots at different points during a job so that the `motion` rule can compare them to detect and measure visible page change, avoiding the latency that would be required if `motion` took its own screenshots and waited between them.
53
+ The `motion` rule is atypical: it takes its own screenshot and compares it with the page image of the checkpoint being tested (`report.images`, made when the catalog was built), so that visible page change is detected without waiting between two screenshots of its own.
54
54
 
55
55
  Two implementation patterns exist:
56
56
 
@@ -59,9 +59,9 @@ Two implementation patterns exist:
59
59
 
60
60
  ### Validation
61
61
 
62
- Validation is currently broken. A reconsideration of its architecture is anticipated, but in the meantime the next paragraph describes its current inoperative design.
62
+ A revision of the validation architecture is currently being planned. In the meantime the next paragraph describes its current design, not guaranteed to work without error.
63
63
 
64
- Validation tests live in `validation/tests/jobs/` (jobs with `expect` arrays) and `validation/tests/targets/` (static HTML pages served locally as test targets). Running `npm test <ruleID>` executes `validation/executors/test.js` → `validation/validateTest.js`, which runs the job and compares `result` fields against `expect` clauses.
64
+ Validation tests live in `validation/tests/jobProperties/` (jobs with `expect` arrays) and `validation/tests/targets/` (static HTML pages served locally as test targets). Running `npm test <ruleID>` executes `validation/executors/test.js` → `validation/validateTest.js`, which runs the job and compares `result` fields against `expect` clauses.
65
65
 
66
66
  ### Tool XPath strategy
67
67
 
@@ -81,21 +81,23 @@ Key variables:
81
81
  - `WAITS` — ms delay inserted between Playwright operations (useful for debugging)
82
82
  - `WAVE_KEY` — API key for the WAVE subscription API
83
83
  - `JOBDIR` / `REPORTDIR` — root directories for job files and report output
84
- - `AGENT` — instance name used in network-watch mode
85
- - `NETWATCH_URL_<N>_JOB/REPORT/AUTH`, `NETWATCH_URLS` — server polling configuration
84
+ - `NETWATCH_URL_JOB`/`NETWATCH_URL_REPORT`/`NETWATCH_AUTH_TYPE`/`NETWATCH_WORKER_ID`/`NETWATCH_WORKER_SECRET` — server polling configuration
86
85
  - `TIMEOUT_MULTIPLIER` — scales all per-tool time limits (default 1)
86
+ - `NAV_WAIT_UNTIL`/`NAV_TIMEOUT`/`NAV_FAIL_FAST_4XX`, `SCANNER_ID`, `PRESCAN_SCROLL`, `TESTARO_RULE_RETRIES`, `QUALWEB_STEALTH`/`QUALWEB_ADBLOCK` — deployment defaults that job properties (`navigation`, `scannerId`, `scroll`, `browserChannel`; `retries`, `stealth`, `adBlock` on test acts) override (`procs/config.js`)
87
87
 
88
88
  ## Code style
89
89
 
90
- ESLint (`eslintrc.json`): 2-space indent, single quotes, semicolons, Stroustrup brace style (`else`/`catch` on a new line after `}`), `no-use-before-define`. The `htmlcs/HTMLCS.js` file uses a separate, looser ESLint config and must not be reformatted.
90
+ The rule modules, the tool adapters, `procs/testaro.ts`, `procs/catalog.ts`, `procs/xPath.ts`, `procs/standard.ts`, and `types.ts` are TypeScript sources; their `.js` and `.d.ts` outputs are committed. Edit the `.ts` file, then run `npm run build:ts` (and `npm run build:registry` after adding or removing a rule module) and commit the regenerated outputs; CI fails if they drift. Files without a `.ts` counterpart are still plain JavaScript. See `CONTRIBUTING.md`.
91
+
92
+ ESLint (`eslint.config.mjs`): 2-space indent, single quotes, semicolons, Stroustrup brace style (`else`/`catch` on a new line after `}`), `no-use-before-define`. Emitted `.js` files are excluded from linting. The vendored `htmlcs/HTMLCS.js`, `ed11y`, `surea11y`, and `pour` bundles are excluded from linting; `htmlcs/HTMLCS.js` must not be reformatted.
91
93
 
92
94
  Long comments are not broken into multiple lines per paragraph.
93
95
 
94
96
  ## Adding a new Testaro rule
95
97
 
96
- 1. Add an entry to `allRules` in `tests/testaro.js`.
97
- 2. Create `testaro/<ruleID>.js` exporting a `reporter` function using `doTest` (preferred) or `getBasicResult`.
98
- 3. Write a validation job in `validation/tests/jobs/<ruleID>.json` with an `expect` array and corresponding HTML target(s) in `validation/tests/targets/<ruleID>/`.
98
+ 1. Add an entry to `allRules` in `tests/testaro.ts`.
99
+ 2. Create `testaro/<ruleID>.ts` exporting a `reporter` function using `doTest` (preferred) or `getBasicResult`, then run `npm run build:registry && npm run build:ts` and commit the regenerated registry and emitted files.
100
+ 3. Write a validation job in `validation/tests/jobProperties/<ruleID>.json` with an `expect` array and corresponding HTML target(s) in `validation/tests/targets/<ruleID>/`.
99
101
  4. Run `npm test <ruleID>` until validation passes.
100
102
 
101
103
  ## Key files
@@ -104,14 +106,18 @@ Long comments are not broken into multiple lines per paragraph.
104
106
  | ---- | ------- |
105
107
  | `run.js` | `doJob()` — the main entry point |
106
108
  | `call.js` | CLI wrapper for `run`, `dirWatch`, `netWatch` |
107
- | `procs/doActs.js` | Iterates acts; forks child for each tool |
109
+ | `procs/doActs.js` | Iterates acts; forks child for each tool; assigns test acts to checkpoints |
110
+ | `procs/actDo.js` | Performs the acts that operate on a live page; replays a checkpoint's acts |
111
+ | `procs/checkpoint.js` | Snapshots a live page as a checkpoint |
108
112
  | `procs/doTestAct.js` | Child-process entry point for tool invocations |
109
113
  | `procs/testaro.js` | `doTest` / `getBasicResult` helpers for Testaro rules |
110
114
  | `procs/launch.js` | Browser lifecycle (launch, goTo, nonce, wait) |
111
- | `procs/catalog.js` | Builds the element catalog from the DOM |
115
+ | `procs/catalog.ts` | Builds the element catalog from the DOM (checkpoint 0, and any live page for later checkpoints) |
112
116
  | `procs/job.js` | Job validation; `tools` constant |
113
117
  | `actSpecs.js` | Canonical specs for all 18 act types |
114
- | `tests/testaro.js` | `allRules` registry for the testaro tool |
118
+ | `tests/testaro.ts` | `allRules` registry for the testaro tool |
119
+ | `procs/standard.ts` | Builders for the standard result and its instances (`outcome`, `uncertainty`, `needed`) |
120
+ | `testaro/registry.ts` | Generated map of rule IDs to rule modules (`npm run build:registry`) |
115
121
  | `testaro/<ruleID>.js` | One file per Testaro rule |
116
122
  | `validation/validateTest.js` | Core validation harness |
117
123
 
package/CONTAINERS.md CHANGED
@@ -63,17 +63,20 @@ docker run --rm --init \
63
63
 
64
64
  ## Server polling
65
65
 
66
- To poll a server for jobs instead of watching a directory, override the command and provide the `netWatch` variables:
66
+ To poll a server for jobs instead of watching a directory, override the command and provide the `netWatch` variables, such as:
67
67
 
68
68
  ```bash
69
69
  docker run --rm --init \
70
- -e AGENT=agent1 \
71
- -e NETWATCH_URL_JOB=https://example.com/api/testaro-agent/job \
72
- -e NETWATCH_URL_REPORT=https://example.com/api/testaro-agent/report \
73
- -e NETWATCH_URL_AUTH=password \
74
- testaro node call netWatch true 300 true
70
+ -e NETWATCH_URL_JOB=https://myserver.com/worker/job \
71
+ -e NETWATCH_URL_REPORT=https://myserver.com/worker/report \
72
+ -e NETWATCH_AUTH_TYPE=header \
73
+ -e NETWATCH_WORKER_ID=worker1 \
74
+ -e NETWATCH_WORKER_SECRET=seekRut \
75
+ testaro node call netWatch true 300
75
76
  ```
76
77
 
78
+ The same variables can be supplied through the Compose stack instead: define them in `.env` and run `docker compose run testaro node call netWatch true 300`. A third `netWatch` argument of `true` would disable certificate verification; leave it off except against servers you control.
79
+
77
80
  ## Operational notes
78
81
 
79
82
  - **Init process**: Testaro forks a child process per test act, and some tools relaunch browsers repeatedly, so zombie reaping matters more than for typical browser-automation applications. Always run with an init process (`docker run --init`; in Compose, `init: true`).
@@ -84,6 +87,7 @@ docker run --rm --init \
84
87
  ## License
85
88
 
86
89
  © 2026 Jeff Witt.
90
+ © 2026 Jonathan Robert Pool.
87
91
 
88
92
  Licensed under the [MIT License](https://opensource.org/license/mit/). See [LICENSE](LICENSE) file at the project root for details.
89
93
 
package/CONTRIBUTING.md CHANGED
@@ -41,18 +41,18 @@ The second step is to write a validator for the new rule. A validator is softwar
41
41
 
42
42
  Every Testaro rule (which means each of the approximately 50 rules of the Testaro tool) has a correspoding validator. A validator has two parts:
43
43
 
44
- - A job file, in the `validation/tests/jobs` directory. It tells Testaro what tests to perform and what the results should be.
44
+ - A job-properties file, in the `validation/tests/jobProperties` directory. It tells Testaro what tests to perform and what the results should be.
45
45
  - A target directory, within the `validation/tests/targets` directory. The target directory contains one or more HTML files that will be tested by the job.
46
46
 
47
47
  Inspecting some of the jobs and targets in the `validation/tests` directory can help you understand how validators work.
48
48
 
49
49
  ### Step 3
50
50
 
51
- The third step is to add an entry to the `allRules` object in the `tests/testaro.js` file.
51
+ The third step is to add an entry to the `allRules` array in the `tests/testaro.ts` file, and then to run `npm run build:ts` so that the emitted `tests/testaro.js` matches. See [Editing TypeScript files](#editing-typescript-files) below.
52
52
 
53
53
  ### Step 4
54
54
 
55
- The fourth step is to implement the new rule by creating a JavaScript file and saving it in the `testaro` directory.
55
+ The fourth step is to implement the new rule by creating a TypeScript file and saving it in the `testaro` directory. Then run `npm run build:registry && npm run build:ts`, which adds the rule to the generated registry and compiles both files. See [Editing TypeScript files](#editing-typescript-files) below.
56
56
 
57
57
  To optimize quality, it may be wise for one person to perform steps 1, 2, and 3, and then for a second person independently to perform step 4 (“clean-room” development).
58
58
 
@@ -62,6 +62,32 @@ Whether a new rule should be implemented with support from the `doTest` function
62
62
 
63
63
  The existing `testaro` tests can serve as templates for new ones. At present, only the `hover` and `role` tests make use of the `getBasicResult` function.
64
64
 
65
+ ## Editing TypeScript files
66
+
67
+ Testaro is migrating from JavaScript to TypeScript, one file at a time ([issue #73](https://github.com/YRA-Tech/testaro/issues/73)). Files that have been converted exist in three forms in the same directory:
68
+
69
+ - `x.ts` — the source, the only one you edit.
70
+ - `x.js` — compiled from `x.ts` by the TypeScript compiler, and **committed**.
71
+ - `x.d.ts` — the type declarations, also compiled and committed.
72
+
73
+ The emitted files are committed rather than built at install time so that the package layout is identical to what it was before the migration: consumers that deep-import a module path, and the `patch-package` patches that some deployments apply, keep working unchanged. Every converted `.ts` file says so near the top:
74
+
75
+ ```text
76
+ Compiled to x.js by tsc (issue #73); edit this file, not the emitted one.
77
+ ```
78
+
79
+ **If a file has a `.ts` version, edit that one and never the emitted `.js`.** After editing, run:
80
+
81
+ ```bash
82
+ npm run build:ts
83
+ ```
84
+
85
+ and commit the regenerated `.js` and `.d.ts` alongside your `.ts` change. If you added or removed a rule module in the `testaro` directory, run `npm run build:registry` first, which regenerates `testaro/registry.ts` from the modules on disk.
86
+
87
+ Continuous integration enforces this: it regenerates the registry, compiles, and fails the pull request if any emitted file differs from what was committed. A hand-edited `.js` will therefore fail the check, and the edit would be overwritten by the next compile in any case.
88
+
89
+ Files that have not been converted yet are still plain JavaScript with no `.ts` counterpart; edit those directly, as before. Some of them have a hand-written `x.d.ts` neighbor that describes the module to converted TypeScript files. If you change such a module's exported interface, update its `.d.ts` to match.
90
+
65
91
  ## License agreement
66
92
 
67
93
  From 12 February 2024 through 30 September 2025, contributors of code to Testaro executed the [CVS Health OSS Project Contributor License Agreement](https://forms.office.com/pages/responsepage.aspx?id=uGG7-v46dU65NKR_eCuM1xbiih2MIwxBuRvO0D_wqVFUQ1k0OE5SVVJWWkY4MTVJMkY3Sk9GM1FHRC4u) for Testaro before any pull request was approved and merged.
package/Dockerfile CHANGED
@@ -10,7 +10,7 @@
10
10
  # The base-image tag must match the version of the playwright package in
11
11
  # package-lock.json, so that the browsers baked into the image are the ones
12
12
  # the installed Playwright expects.
13
- FROM mcr.microsoft.com/playwright:v1.62.0-noble
13
+ FROM mcr.microsoft.com/playwright:v1.62.1-noble
14
14
 
15
15
  # Install a headless Java runtime for the nuVnu test (vnu-jar); baking it in
16
16
  # prevents vnu-jar from downloading a Temurin runtime over the network on