testaro 78.0.8 → 78.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitattributes +94 -0
- package/.github/workflows/ci.yml +58 -0
- package/.github/workflows/publish.yml +49 -0
- package/.github/workflows/typescript.yml +35 -0
- package/AGENTS.md +2 -2
- package/CLAUDE.md +24 -18
- package/CONTAINERS.md +9 -6
- package/CONTRIBUTING.md +29 -3
- package/Dockerfile +1 -1
- package/README.md +73 -19
- package/UPGRADES.md +4 -0
- package/actSpecs-doc.md +13 -1
- package/actSpecs.js +29 -5
- package/call.js +6 -5
- package/docker-compose.yml +8 -2
- package/docs/checkpoint-scanning.md +199 -0
- package/docs/standard-result-outcome.md +165 -0
- package/env.example +44 -10
- package/eslint.config.mjs +101 -0
- package/netWatch.js +372 -222
- package/package.json +46 -31
- package/pour/README.md +47 -0
- package/pour/pour.min.js +8 -0
- package/procs/actDo.js +808 -0
- package/procs/catalog.d.ts +17 -0
- package/procs/catalog.js +312 -221
- package/procs/catalog.ts +398 -0
- package/procs/checkpoint.js +110 -0
- package/procs/config.d.ts +35 -0
- package/procs/config.js +62 -0
- package/procs/dateTime.js +2 -1
- package/procs/doActs.js +442 -849
- package/procs/doTestAct.js +27 -121
- package/procs/flow.js +221 -0
- package/procs/generateRuleRegistry.js +94 -0
- package/procs/getSource.d.ts +26 -0
- package/procs/job.js +115 -1
- package/procs/launch.d.ts +40 -0
- package/procs/launch.js +239 -108
- package/procs/nu.d.ts +48 -0
- package/procs/scope.js +196 -0
- package/procs/shoot.d.ts +33 -0
- package/procs/standard.d.ts +18 -0
- package/procs/standard.js +83 -0
- package/procs/standard.ts +126 -0
- package/procs/testAct.js +145 -0
- package/procs/testaro.d.ts +20 -0
- package/procs/testaro.js +236 -189
- package/procs/testaro.ts +321 -0
- package/procs/userPath.js +126 -0
- package/procs/xPath.d.ts +4 -0
- package/procs/xPath.js +81 -69
- package/procs/xPath.ts +106 -0
- package/procs/xPathScript.d.ts +6 -0
- package/procs/xPathScript.js +70 -0
- package/run.js +3 -2
- package/surea11y/README.md +44 -0
- package/surea11y/surea11y.browser.js +14 -0
- package/testaro/adbID.d.ts +3 -0
- package/testaro/adbID.js +38 -41
- package/testaro/adbID.ts +66 -0
- package/testaro/allCapStyle.d.ts +3 -0
- package/testaro/allCapStyle.js +31 -34
- package/testaro/allCapStyle.ts +55 -0
- package/testaro/allCaps.d.ts +16 -0
- package/testaro/allCaps.js +179 -151
- package/testaro/allCaps.ts +228 -0
- package/testaro/allHidden.d.ts +13 -0
- package/testaro/allHidden.js +29 -30
- package/testaro/allHidden.ts +50 -0
- package/testaro/allSlanted.d.ts +3 -0
- package/testaro/allSlanted.js +30 -33
- package/testaro/allSlanted.ts +54 -0
- package/testaro/altScheme.d.ts +3 -0
- package/testaro/altScheme.js +27 -30
- package/testaro/altScheme.ts +50 -0
- package/testaro/attVal.d.ts +3 -0
- package/testaro/attVal.js +20 -21
- package/testaro/attVal.ts +52 -0
- package/testaro/autocomplete.d.ts +3 -0
- package/testaro/autocomplete.js +59 -75
- package/testaro/autocomplete.ts +101 -0
- package/testaro/bulk.d.ts +13 -0
- package/testaro/bulk.js +32 -33
- package/testaro/bulk.ts +55 -0
- package/testaro/buttonMenu.d.ts +9 -0
- package/testaro/buttonMenu.js +317 -319
- package/testaro/buttonMenu.ts +391 -0
- package/testaro/captionLoc.d.ts +3 -0
- package/testaro/captionLoc.js +17 -20
- package/testaro/captionLoc.ts +40 -0
- package/testaro/datalistRef.d.ts +3 -0
- package/testaro/datalistRef.js +33 -36
- package/testaro/datalistRef.ts +55 -0
- package/testaro/distortion.d.ts +3 -0
- package/testaro/distortion.js +57 -26
- package/testaro/distortion.ts +81 -0
- package/testaro/docType.d.ts +15 -0
- package/testaro/docType.js +25 -25
- package/testaro/docType.ts +45 -0
- package/testaro/dupAtt.d.ts +16 -0
- package/testaro/dupAtt.js +113 -104
- package/testaro/dupAtt.ts +144 -0
- package/testaro/elements.d.ts +6 -0
- package/testaro/elements.js +153 -153
- package/testaro/elements.ts +215 -0
- package/testaro/embAc.d.ts +3 -0
- package/testaro/embAc.js +19 -20
- package/testaro/embAc.ts +40 -0
- package/testaro/focAll.d.ts +13 -0
- package/testaro/focAll.js +185 -191
- package/testaro/focAll.ts +217 -0
- package/testaro/focAndOp.d.ts +3 -0
- package/testaro/focAndOp.js +100 -104
- package/testaro/focAndOp.ts +128 -0
- package/testaro/focInd.d.ts +3 -0
- package/testaro/focInd.js +64 -66
- package/testaro/focInd.ts +96 -0
- package/testaro/focVis.d.ts +3 -0
- package/testaro/focVis.js +28 -30
- package/testaro/focVis.ts +52 -0
- package/testaro/headEl.d.ts +10 -0
- package/testaro/headEl.js +61 -62
- package/testaro/headEl.ts +82 -0
- package/testaro/headingAmb.d.ts +3 -0
- package/testaro/headingAmb.js +54 -63
- package/testaro/headingAmb.ts +72 -0
- package/testaro/hovInd.d.ts +12 -0
- package/testaro/hovInd.js +163 -130
- package/testaro/hovInd.ts +199 -0
- package/testaro/hover.d.ts +3 -0
- package/testaro/hover.js +155 -126
- package/testaro/hover.ts +154 -0
- package/testaro/hr.d.ts +3 -0
- package/testaro/hr.js +14 -17
- package/testaro/hr.ts +36 -0
- package/testaro/imageLink.d.ts +3 -0
- package/testaro/imageLink.js +17 -20
- package/testaro/imageLink.ts +42 -0
- package/testaro/labClash.d.ts +3 -0
- package/testaro/labClash.js +31 -33
- package/testaro/labClash.ts +54 -0
- package/testaro/legendLoc.d.ts +3 -0
- package/testaro/legendLoc.js +17 -20
- package/testaro/legendLoc.ts +42 -0
- package/testaro/lineHeight.d.ts +3 -0
- package/testaro/lineHeight.js +43 -48
- package/testaro/lineHeight.ts +70 -0
- package/testaro/linkAmb.d.ts +7 -0
- package/testaro/linkAmb.js +79 -80
- package/testaro/linkAmb.ts +105 -0
- package/testaro/linkExt.d.ts +3 -0
- package/testaro/linkExt.js +13 -16
- package/testaro/linkExt.ts +35 -0
- package/testaro/linkOldAtt.d.ts +3 -0
- package/testaro/linkOldAtt.js +25 -28
- package/testaro/linkOldAtt.ts +48 -0
- package/testaro/linkTo.d.ts +3 -0
- package/testaro/linkTo.js +22 -22
- package/testaro/linkTo.ts +43 -0
- package/testaro/linkUl.d.ts +3 -0
- package/testaro/linkUl.js +30 -34
- package/testaro/linkUl.ts +54 -0
- package/testaro/miniText.d.ts +3 -0
- package/testaro/miniText.js +41 -44
- package/testaro/miniText.ts +68 -0
- package/testaro/motion.d.ts +10 -0
- package/testaro/motion.js +92 -96
- package/testaro/motion.ts +125 -0
- package/testaro/nonTable.d.ts +3 -0
- package/testaro/nonTable.js +39 -45
- package/testaro/nonTable.ts +66 -0
- package/testaro/optRoleSel.d.ts +3 -0
- package/testaro/optRoleSel.js +16 -19
- package/testaro/optRoleSel.ts +41 -0
- package/testaro/phOnly.d.ts +3 -0
- package/testaro/phOnly.js +18 -21
- package/testaro/phOnly.ts +43 -0
- package/testaro/pseudoP.d.ts +3 -0
- package/testaro/pseudoP.js +36 -38
- package/testaro/pseudoP.ts +59 -0
- package/testaro/radioSet.d.ts +3 -0
- package/testaro/radioSet.js +57 -59
- package/testaro/radioSet.ts +79 -0
- package/testaro/registry.d.ts +63 -0
- package/testaro/registry.js +67 -0
- package/testaro/registry.ts +141 -0
- package/testaro/role.d.ts +3 -0
- package/testaro/role.js +27 -29
- package/testaro/role.ts +53 -0
- package/testaro/secHeading.d.ts +3 -0
- package/testaro/secHeading.js +30 -33
- package/testaro/secHeading.ts +53 -0
- package/testaro/styleDiff.d.ts +25 -0
- package/testaro/styleDiff.js +248 -252
- package/testaro/styleDiff.ts +303 -0
- package/testaro/tabNav.d.ts +33 -0
- package/testaro/tabNav.js +272 -342
- package/testaro/tabNav.ts +454 -0
- package/testaro/targetsNear.d.ts +9 -0
- package/testaro/targetsNear.js +130 -132
- package/testaro/targetsNear.ts +160 -0
- package/testaro/textNodes.d.ts +6 -0
- package/testaro/textNodes.js +139 -135
- package/testaro/textNodes.ts +185 -0
- package/testaro/textSem.d.ts +3 -0
- package/testaro/textSem.js +25 -28
- package/testaro/textSem.ts +47 -0
- package/testaro/title.d.ts +9 -0
- package/testaro/title.js +16 -13
- package/testaro/title.ts +31 -0
- package/testaro/titledEl.d.ts +3 -0
- package/testaro/titledEl.js +15 -18
- package/testaro/titledEl.ts +38 -0
- package/testaro/zIndex.d.ts +3 -0
- package/testaro/zIndex.js +19 -22
- package/testaro/zIndex.ts +42 -0
- package/tests/alfa.d.ts +45 -0
- package/tests/alfa.js +138 -141
- package/tests/alfa.ts +214 -0
- package/tests/aslint.d.ts +33 -0
- package/tests/aslint.js +272 -249
- package/tests/aslint.ts +301 -0
- package/tests/axe.d.ts +27 -0
- package/tests/axe.js +199 -200
- package/tests/axe.ts +277 -0
- package/tests/ed11y.d.ts +28 -0
- package/tests/ed11y.js +141 -99
- package/tests/ed11y.ts +178 -0
- package/tests/htmlcs.d.ts +21 -0
- package/tests/htmlcs.js +174 -140
- package/tests/htmlcs.ts +181 -0
- package/tests/ibm.d.ts +52 -0
- package/tests/ibm.js +164 -166
- package/tests/ibm.ts +251 -0
- package/tests/nuVal.d.ts +13 -0
- package/tests/nuVal.js +107 -112
- package/tests/nuVal.ts +145 -0
- package/tests/nuVnu.d.ts +15 -0
- package/tests/nuVnu.js +141 -111
- package/tests/nuVnu.ts +144 -0
- package/tests/pour.d.ts +31 -0
- package/tests/pour.js +242 -0
- package/tests/pour.ts +273 -0
- package/tests/qualWeb.d.ts +39 -0
- package/tests/qualWeb.js +302 -272
- package/tests/qualWeb.ts +415 -0
- package/tests/surea11y.d.ts +33 -0
- package/tests/surea11y.js +288 -0
- package/tests/surea11y.ts +334 -0
- package/tests/testaro.d.ts +25 -0
- package/tests/testaro.js +745 -652
- package/tests/testaro.ts +862 -0
- package/tests/wave.d.ts +46 -0
- package/tests/wave.js +166 -177
- package/tests/wave.ts +252 -0
- package/tsconfig.json +17 -0
- package/types.d.ts +243 -0
- package/types.js +10 -0
- package/types.ts +376 -0
- package/validation/act/README.md +46 -0
- package/validation/act/capture.js +424 -0
- package/validation/act/chromium-issue-draft.md +66 -0
- package/validation/act/fp-triage-2026-08-22.md +86 -0
- package/validation/act/isolation-notes.md +159 -0
- package/validation/act/playwright-issue-draft.md +73 -0
- package/validation/act/propose-mappings.js +0 -0
- package/validation/act/repro-cdp-raw.js +105 -0
- package/validation/act/repro-metarefresh.js +65 -0
- package/validation/act/score.js +184 -0
- package/validation/act/stage3a-stress-report.md +69 -0
- package/validation/act/stage3b-mapping-proposals.md +94 -0
- package/validation/act/stage3b-triage-draft.md +138 -0
- package/validation/act/surea11y-track-a-2026-09-01.md +50 -0
- package/validation/executors/netWatch.js +180 -90
- package/validation/executors/test.js +17 -2
- package/validation/executors/tests.js +118 -10
- package/validation/jobs/reports/raw/260901T1000-surea11y-validation.json +964 -0
- package/validation/jobs/todo/240101T1200-simple-example.json +14 -6
- package/validation/jobs/todo/240101T1300-shoot-example.json +2 -1
- package/validation/jobs/todo/260821T1900-pour-validation.json +45 -0
- package/validation/jobs/todo/260901T1000-surea11y-validation.json +45 -0
- package/validation/knownFailures.json +1 -0
- package/validation/tests/jobProperties/adbID.json +27 -2
- package/validation/tests/jobProperties/{focOp.json → allCapStyle.json} +56 -53
- package/validation/tests/jobProperties/allCaps.json +25 -0
- package/validation/tests/jobProperties/allHidden.json +133 -13
- package/validation/tests/jobProperties/allSlanted.json +3 -3
- package/validation/tests/jobProperties/altScheme.json +23 -8
- package/validation/tests/jobProperties/attVal.json +57 -57
- package/validation/tests/jobProperties/autocomplete.json +11 -1
- package/validation/tests/jobProperties/bulk.json +6 -1
- package/validation/tests/jobProperties/buttonMenu.json +63 -42
- package/validation/tests/jobProperties/captionLoc.json +1 -6
- package/validation/tests/jobProperties/checkpoint-browser.json +401 -0
- package/validation/tests/jobProperties/checkpoint-page.json +397 -0
- package/validation/tests/jobProperties/checkpoint.json +395 -0
- package/validation/tests/jobProperties/datalistRef.json +20 -5
- package/validation/tests/jobProperties/distortion.json +28 -3
- package/validation/tests/jobProperties/docType.json +2 -2
- package/validation/tests/jobProperties/dupAtt.json +48 -33
- package/validation/tests/jobProperties/elements.json +28 -28
- package/validation/tests/jobProperties/embAc.json +36 -31
- package/validation/tests/jobProperties/focAndOp.json +284 -0
- package/validation/tests/jobProperties/focInd.json +34 -34
- package/validation/tests/jobProperties/focVis.json +1 -1
- package/validation/tests/jobProperties/hover.json +39 -37
- package/validation/tests/jobProperties/hr.json +13 -3
- package/validation/tests/jobProperties/imageLink.json +0 -5
- package/validation/tests/jobProperties/labClash.json +68 -33
- package/validation/tests/jobProperties/legendLoc.json +1 -6
- package/validation/tests/jobProperties/lineHeight.json +2 -2
- package/validation/tests/jobProperties/linkAmb.json +13 -18
- package/validation/tests/jobProperties/linkExt.json +1 -1
- package/validation/tests/jobProperties/linkOldAtt.json +12 -2
- package/validation/tests/jobProperties/linkTo.json +1 -1
- package/validation/tests/jobProperties/linkUl.json +65 -65
- package/validation/tests/jobProperties/miniText.json +7 -2
- package/validation/tests/jobProperties/motion.json +4 -50
- package/validation/tests/jobProperties/nonTable.json +48 -3
- package/validation/tests/jobProperties/optRoleSel.json +12 -2
- package/validation/tests/jobProperties/phOnly.json +6 -16
- package/validation/tests/jobProperties/pseudoP.json +17 -2
- package/validation/tests/jobProperties/radioSet.json +30 -30
- package/validation/tests/jobProperties/role.json +25 -5
- package/validation/tests/jobProperties/secHeading.json +26 -21
- package/validation/tests/jobProperties/styleDiff.json +35 -5
- package/validation/tests/jobProperties/tabNav.json +3 -1
- package/validation/tests/jobProperties/targetsNear.json +237 -0
- package/validation/tests/jobProperties/textNodes.json +29 -29
- package/validation/tests/jobProperties/textSem.json +26 -1
- package/validation/tests/jobProperties/title.json +12 -2
- package/validation/tests/jobProperties/titledEl.json +39 -9
- package/validation/tests/jobProperties/userPath.json +317 -0
- package/validation/tests/jobProperties/zIndex.json +40 -35
- package/validation/tests/targets/allCapStyle/index.html +26 -0
- package/validation/tests/targets/checkpoint/index.html +38 -0
- package/validation/tests/targets/datalistRef/index.html +1 -1
- package/validation/tests/targets/focAndOp/bad.html +29 -0
- package/validation/tests/targets/{focOp → focAndOp}/good.html +3 -1
- package/validation/tests/targets/focInd/bad.html +2 -1
- package/validation/tests/targets/headEl/index.html +10 -1
- package/validation/tests/targets/{targetSmall → targetsNear}/index.html +15 -1
- package/validation/tests/targets/userPath/index.html +42 -0
- package/validation/validateTest.js +61 -9
- package/.claude/settings.local.json +0 -11
- package/.eslintrc.json +0 -41
- package/htmlcs/.eslintrc.json +0 -67
- package/validation/tests/jobProperties/linkTitle.json +0 -127
- package/validation/tests/jobProperties/opFoc.json +0 -164
- package/validation/tests/jobProperties/targetSmall.json +0 -152
- package/validation/tests/jobProperties/targetTiny.json +0 -142
- package/validation/tests/targets/focOp/bad.html +0 -25
- package/validation/tests/targets/linkTitle/index.html +0 -24
- package/validation/tests/targets/opFoc/bad.html +0 -26
- package/validation/tests/targets/opFoc/good.html +0 -23
package/procs/job.js
CHANGED
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
// Requirements for acts.
|
|
19
19
|
const {actSpecs} = require('../actSpecs');
|
|
20
|
+
// Load states a navigation can wait for.
|
|
21
|
+
const {waitStates} = require('./config');
|
|
20
22
|
// Data on devices.
|
|
21
23
|
const {devices} = require('playwright');
|
|
22
24
|
// Module to get dates from time stamps.
|
|
@@ -34,13 +36,68 @@ const tools = exports.tools = {
|
|
|
34
36
|
ibm: 'Accessibility Checker',
|
|
35
37
|
nuVal: 'Html Checker API',
|
|
36
38
|
nuVnu: 'Html Checker',
|
|
39
|
+
pour: 'Pour Engine',
|
|
37
40
|
qualWeb: 'QualWeb',
|
|
41
|
+
surea11y: 'SureA11y',
|
|
38
42
|
testaro: 'Testaro',
|
|
39
43
|
wave: 'WAVE',
|
|
40
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'];
|
|
41
91
|
|
|
42
92
|
// FUNCTIONS
|
|
43
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
|
+
};
|
|
44
101
|
// Validates a browser type.
|
|
45
102
|
const isBrowserID = exports.isBrowserID = type => ['chromium', 'firefox', 'webkit'].includes(type);
|
|
46
103
|
// Returns whether a variable has a specified type.
|
|
@@ -97,6 +154,9 @@ const hasSubtype = (variable, subtype) => {
|
|
|
97
154
|
else if (subtype === 'isState') {
|
|
98
155
|
return isState(variable);
|
|
99
156
|
}
|
|
157
|
+
else if (subtype === 'isScope') {
|
|
158
|
+
return testScopes.includes(variable);
|
|
159
|
+
}
|
|
100
160
|
else {
|
|
101
161
|
console.log(`ERROR: ${subtype} not a known subtype`);
|
|
102
162
|
return false;
|
|
@@ -146,6 +206,10 @@ const isValidAct = exports.isValidAct = act => {
|
|
|
146
206
|
return false;
|
|
147
207
|
}
|
|
148
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
|
+
}
|
|
149
213
|
// Return whether the act is valid.
|
|
150
214
|
return Object.keys(validator).every(property => {
|
|
151
215
|
if (property === 'name') {
|
|
@@ -220,6 +284,12 @@ exports.isValidJob = job => {
|
|
|
220
284
|
// `stealth` is optional. When omitted, Testaro defaults to enabling the
|
|
221
285
|
// puppeteer-extra-plugin-stealth evasions on Chromium (historical
|
|
222
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
|
+
}
|
|
223
293
|
if (stealth !== undefined && typeof stealth !== 'boolean') {
|
|
224
294
|
return {
|
|
225
295
|
isValid: false,
|
|
@@ -235,7 +305,7 @@ exports.isValidJob = job => {
|
|
|
235
305
|
};
|
|
236
306
|
}
|
|
237
307
|
if (
|
|
238
|
-
! (executionTimeStamp && typeof executionTimeStamp === 'string'
|
|
308
|
+
! (executionTimeStamp && typeof executionTimeStamp === 'string' && dateOf(executionTimeStamp))
|
|
239
309
|
) {
|
|
240
310
|
return {
|
|
241
311
|
isValid: false,
|
|
@@ -272,12 +342,56 @@ exports.isValidJob = job => {
|
|
|
272
342
|
error: `Invalid act:\n${JSON.stringify(invalidAct, null, 2)}`
|
|
273
343
|
};
|
|
274
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
|
+
}
|
|
275
368
|
if (jobData && typeof jobData !== 'object') {
|
|
276
369
|
return {
|
|
277
370
|
isValid: false,
|
|
278
371
|
error: 'Bad job jobData'
|
|
279
372
|
};
|
|
280
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
|
+
}
|
|
281
395
|
return {
|
|
282
396
|
isValid: true
|
|
283
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>;
|