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
package/procs/job.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/*
|
|
2
2
|
© 2024 CVS Health and/or one of its affiliates. All rights reserved.
|
|
3
|
+
© 2026 Jeff Witt.
|
|
3
4
|
© 2026 Jonathan Robert Pool.
|
|
4
5
|
|
|
5
6
|
Licensed under the MIT License. See LICENSE file at the project root or https://opensource.org/license/mit/ for details.
|
|
@@ -16,6 +17,8 @@
|
|
|
16
17
|
|
|
17
18
|
// Requirements for acts.
|
|
18
19
|
const {actSpecs} = require('../actSpecs');
|
|
20
|
+
// Load states a navigation can wait for.
|
|
21
|
+
const {waitStates} = require('./config');
|
|
19
22
|
// Data on devices.
|
|
20
23
|
const {devices} = require('playwright');
|
|
21
24
|
// Module to get dates from time stamps.
|
|
@@ -33,13 +36,68 @@ const tools = exports.tools = {
|
|
|
33
36
|
ibm: 'Accessibility Checker',
|
|
34
37
|
nuVal: 'Html Checker API',
|
|
35
38
|
nuVnu: 'Html Checker',
|
|
39
|
+
pour: 'Pour Engine',
|
|
36
40
|
qualWeb: 'QualWeb',
|
|
41
|
+
surea11y: 'SureA11y',
|
|
37
42
|
testaro: 'Testaro',
|
|
38
43
|
wave: 'WAVE',
|
|
39
44
|
};
|
|
45
|
+
/*
|
|
46
|
+
What each tool tests: a live page (page), the live page's HTML (html), or only a URL (url).
|
|
47
|
+
Tools that test a page or its HTML observe a checkpoint reached by interaction acts, because
|
|
48
|
+
the test act's browser replays those acts; a tool that tests a URL can observe only a
|
|
49
|
+
checkpoint reached by navigation.
|
|
50
|
+
*/
|
|
51
|
+
exports.toolInputs = {
|
|
52
|
+
alfa: 'page',
|
|
53
|
+
aslint: 'page',
|
|
54
|
+
axe: 'page',
|
|
55
|
+
ed11y: 'page',
|
|
56
|
+
htmlcs: 'page',
|
|
57
|
+
ibm: 'page',
|
|
58
|
+
nuVal: 'html',
|
|
59
|
+
nuVnu: 'html',
|
|
60
|
+
pour: 'page',
|
|
61
|
+
qualWeb: 'html',
|
|
62
|
+
surea11y: 'page',
|
|
63
|
+
testaro: 'page',
|
|
64
|
+
wave: 'url'
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/*
|
|
68
|
+
Scopes of a test act: page (the default) tests the whole page of its checkpoint; changed tests
|
|
69
|
+
only the subtrees that changed since the previous checkpoint, for rules and tools that can be
|
|
70
|
+
so restricted (toolScopes), and the whole page for the rest.
|
|
71
|
+
*/
|
|
72
|
+
const testScopes = exports.testScopes = ['page', 'changed'];
|
|
73
|
+
/*
|
|
74
|
+
Tools that can restrict their tests to subtree roots (scope: 'changed'): axe by its include
|
|
75
|
+
context, surea11y by its context selector, and testaro by filtering the candidates of its
|
|
76
|
+
element-local rules. Other tools test the whole page whatever the scope.
|
|
77
|
+
*/
|
|
78
|
+
exports.toolScopes = {
|
|
79
|
+
axe: true,
|
|
80
|
+
surea11y: true,
|
|
81
|
+
testaro: true
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
/*
|
|
85
|
+
Isolation levels for test acts:
|
|
86
|
+
process: each test act runs in a child process with its own browser (the default).
|
|
87
|
+
browser: test acts run in the job's process, each in a fresh context of one shared browser.
|
|
88
|
+
page: test acts run in the job's process on the live page of the current checkpoint.
|
|
89
|
+
*/
|
|
90
|
+
const isolationLevels = exports.isolationLevels = ['process', 'browser', 'page'];
|
|
40
91
|
|
|
41
92
|
// FUNCTIONS
|
|
42
93
|
|
|
94
|
+
// Returns the isolation level of a job: its own, else the ISOLATION environment variable, else process.
|
|
95
|
+
exports.getIsolation = job => {
|
|
96
|
+
if (job && isolationLevels.includes(job.isolation)) {
|
|
97
|
+
return job.isolation;
|
|
98
|
+
}
|
|
99
|
+
return isolationLevels.includes(process.env.ISOLATION) ? process.env.ISOLATION : 'process';
|
|
100
|
+
};
|
|
43
101
|
// Validates a browser type.
|
|
44
102
|
const isBrowserID = exports.isBrowserID = type => ['chromium', 'firefox', 'webkit'].includes(type);
|
|
45
103
|
// Returns whether a variable has a specified type.
|
|
@@ -96,6 +154,9 @@ const hasSubtype = (variable, subtype) => {
|
|
|
96
154
|
else if (subtype === 'isState') {
|
|
97
155
|
return isState(variable);
|
|
98
156
|
}
|
|
157
|
+
else if (subtype === 'isScope') {
|
|
158
|
+
return testScopes.includes(variable);
|
|
159
|
+
}
|
|
99
160
|
else {
|
|
100
161
|
console.log(`ERROR: ${subtype} not a known subtype`);
|
|
101
162
|
return false;
|
|
@@ -145,6 +206,10 @@ const isValidAct = exports.isValidAct = act => {
|
|
|
145
206
|
return false;
|
|
146
207
|
}
|
|
147
208
|
}
|
|
209
|
+
// A checkbox or radio act needs a text substring or a selector to identify its element.
|
|
210
|
+
if (['checkbox', 'radio'].includes(type) && ! act.which && ! act.selector) {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
148
213
|
// Return whether the act is valid.
|
|
149
214
|
return Object.keys(validator).every(property => {
|
|
150
215
|
if (property === 'name') {
|
|
@@ -219,6 +284,12 @@ exports.isValidJob = job => {
|
|
|
219
284
|
// `stealth` is optional. When omitted, Testaro defaults to enabling the
|
|
220
285
|
// puppeteer-extra-plugin-stealth evasions on Chromium (historical
|
|
221
286
|
// behavior). When present, it must be a boolean.
|
|
287
|
+
if (job.isolation !== undefined && ! isolationLevels.includes(job.isolation)) {
|
|
288
|
+
return {
|
|
289
|
+
isValid: false,
|
|
290
|
+
error: 'Bad job isolation (must be process, browser, or page if present)'
|
|
291
|
+
};
|
|
292
|
+
}
|
|
222
293
|
if (stealth !== undefined && typeof stealth !== 'boolean') {
|
|
223
294
|
return {
|
|
224
295
|
isValid: false,
|
|
@@ -234,7 +305,7 @@ exports.isValidJob = job => {
|
|
|
234
305
|
};
|
|
235
306
|
}
|
|
236
307
|
if (
|
|
237
|
-
! (executionTimeStamp && typeof executionTimeStamp === 'string'
|
|
308
|
+
! (executionTimeStamp && typeof executionTimeStamp === 'string' && dateOf(executionTimeStamp))
|
|
238
309
|
) {
|
|
239
310
|
return {
|
|
240
311
|
isValid: false,
|
|
@@ -271,12 +342,56 @@ exports.isValidJob = job => {
|
|
|
271
342
|
error: `Invalid act:\n${JSON.stringify(invalidAct, null, 2)}`
|
|
272
343
|
};
|
|
273
344
|
}
|
|
345
|
+
// Checkpoint acts must be uniquely named and must follow a launch act.
|
|
346
|
+
const checkpointNames = acts.filter(act => act.type === 'checkpoint').map(act => act.which);
|
|
347
|
+
if (new Set(checkpointNames).size !== checkpointNames.length || checkpointNames.includes('start')) {
|
|
348
|
+
return {
|
|
349
|
+
isValid: false,
|
|
350
|
+
error: 'Bad job checkpoint names (must be unique and not "start")'
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
const firstCheckpointIndex = acts.findIndex(act => act.type === 'checkpoint');
|
|
354
|
+
const firstLaunchIndex = acts.findIndex(act => act.type === 'launch');
|
|
355
|
+
if (firstCheckpointIndex > -1 && (firstLaunchIndex === -1 || firstLaunchIndex > firstCheckpointIndex)) {
|
|
356
|
+
return {
|
|
357
|
+
isValid: false,
|
|
358
|
+
error: 'Bad job acts (a checkpoint act precedes any launch act)'
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
// A changed-scope test act needs checkpoints to compare.
|
|
362
|
+
if (firstCheckpointIndex === -1 && acts.some(act => act.type === 'test' && act.scope === 'changed')) {
|
|
363
|
+
return {
|
|
364
|
+
isValid: false,
|
|
365
|
+
error: 'Bad job acts (a test act has scope changed but the job has no checkpoint act)'
|
|
366
|
+
};
|
|
367
|
+
}
|
|
274
368
|
if (jobData && typeof jobData !== 'object') {
|
|
275
369
|
return {
|
|
276
370
|
isValid: false,
|
|
277
371
|
error: 'Bad job jobData'
|
|
278
372
|
};
|
|
279
373
|
}
|
|
374
|
+
// Deployment options, if present, must be well formed.
|
|
375
|
+
const {navigation, browserChannel} = job;
|
|
376
|
+
if (
|
|
377
|
+
navigation !== undefined && (
|
|
378
|
+
! navigation || typeof navigation !== 'object'
|
|
379
|
+
|| (navigation.waitUntil !== undefined && ! waitStates.includes(navigation.waitUntil))
|
|
380
|
+
|| (navigation.timeout !== undefined && ! (Number.isInteger(navigation.timeout) && navigation.timeout > 0))
|
|
381
|
+
|| (navigation.failFast4xx !== undefined && typeof navigation.failFast4xx !== 'boolean')
|
|
382
|
+
)
|
|
383
|
+
) {
|
|
384
|
+
return {
|
|
385
|
+
isValid: false,
|
|
386
|
+
error: 'Bad job navigation (waitUntil networkidle, load, or domcontentloaded; timeout a positive integer; failFast4xx a boolean)'
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
if (browserChannel !== undefined && ! ['bundled', 'chrome', 'msedge'].includes(browserChannel)) {
|
|
390
|
+
return {
|
|
391
|
+
isValid: false,
|
|
392
|
+
error: 'Bad job browserChannel (must be bundled, chrome, or msedge if present)'
|
|
393
|
+
};
|
|
394
|
+
}
|
|
280
395
|
return {
|
|
281
396
|
isValid: true
|
|
282
397
|
};
|
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
launch (hand-written declarations)
|
|
12
|
+
Minimal typings for the surface of procs/launch.js that converted TypeScript
|
|
13
|
+
files use. Delete this file when launch.js itself is converted (issue #73).
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import type {Page, Response} from 'playwright';
|
|
17
|
+
import type {BrowserID, Report} from '../types';
|
|
18
|
+
|
|
19
|
+
export interface LaunchOptions {
|
|
20
|
+
report?: Report;
|
|
21
|
+
actIndex?: number | null;
|
|
22
|
+
tempBrowserID?: BrowserID | '';
|
|
23
|
+
tempURL?: string;
|
|
24
|
+
headEmulation?: string;
|
|
25
|
+
xPathNeed?: string;
|
|
26
|
+
needsAccessibleName?: boolean;
|
|
27
|
+
retries?: number;
|
|
28
|
+
contextOverrides?: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Launches a browser, navigates to a target, and returns the page, or undefined on failure.
|
|
32
|
+
export function launch(opts?: LaunchOptions): Promise<Page | undefined>;
|
|
33
|
+
// Closes the browser of a page, with its context.
|
|
34
|
+
export function browserClose(page: Page | null | undefined): Promise<void>;
|
|
35
|
+
// Navigates a page to a URL.
|
|
36
|
+
export function goTo(
|
|
37
|
+
report: Report, page: Page, url: string, timeout: number, waitUntil: string
|
|
38
|
+
): Promise<unknown>;
|
|
39
|
+
// Gets the nonce, if any, of a response.
|
|
40
|
+
export function getNonce(response: Response): Promise<string>;
|