@setsquare/review-sdk 0.0.1 → 0.1.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 (105) hide show
  1. package/NOTICE +3 -2
  2. package/README.md +220 -0
  3. package/dist/autoscan.d.ts +15 -1
  4. package/dist/autoscan.d.ts.map +1 -1
  5. package/dist/autoscan.js +168 -13
  6. package/dist/autoscan.js.map +1 -1
  7. package/dist/brand.d.ts +51 -2
  8. package/dist/brand.d.ts.map +1 -1
  9. package/dist/brand.js +560 -5
  10. package/dist/brand.js.map +1 -1
  11. package/dist/checks/context-change.d.ts +96 -0
  12. package/dist/checks/context-change.d.ts.map +1 -0
  13. package/dist/checks/context-change.js +655 -0
  14. package/dist/checks/context-change.js.map +1 -0
  15. package/dist/checks/focus.d.ts +154 -0
  16. package/dist/checks/focus.d.ts.map +1 -0
  17. package/dist/checks/focus.js +1123 -0
  18. package/dist/checks/focus.js.map +1 -0
  19. package/dist/checks/heuristics.d.ts +116 -0
  20. package/dist/checks/heuristics.d.ts.map +1 -0
  21. package/dist/checks/heuristics.js +931 -0
  22. package/dist/checks/heuristics.js.map +1 -0
  23. package/dist/checks/keyboard.d.ts +106 -0
  24. package/dist/checks/keyboard.d.ts.map +1 -0
  25. package/dist/checks/keyboard.js +452 -0
  26. package/dist/checks/keyboard.js.map +1 -0
  27. package/dist/checks/reflow.d.ts +75 -0
  28. package/dist/checks/reflow.d.ts.map +1 -0
  29. package/dist/checks/reflow.js +285 -0
  30. package/dist/checks/reflow.js.map +1 -0
  31. package/dist/checks/rule-pack.d.ts +1 -1
  32. package/dist/checks/rule-pack.d.ts.map +1 -1
  33. package/dist/checks/rule-pack.js +350 -45
  34. package/dist/checks/rule-pack.js.map +1 -1
  35. package/dist/checks/shortcuts.d.ts +71 -0
  36. package/dist/checks/shortcuts.d.ts.map +1 -0
  37. package/dist/checks/shortcuts.js +196 -0
  38. package/dist/checks/shortcuts.js.map +1 -0
  39. package/dist/checks/versions.d.ts.map +1 -1
  40. package/dist/checks/versions.js +33 -1
  41. package/dist/checks/versions.js.map +1 -1
  42. package/dist/contract.d.ts +18 -0
  43. package/dist/contract.d.ts.map +1 -1
  44. package/dist/covers.d.ts +56 -0
  45. package/dist/covers.d.ts.map +1 -0
  46. package/dist/covers.js +135 -0
  47. package/dist/covers.js.map +1 -0
  48. package/dist/dedupe.d.ts +23 -0
  49. package/dist/dedupe.d.ts.map +1 -1
  50. package/dist/dedupe.js +96 -2
  51. package/dist/dedupe.js.map +1 -1
  52. package/dist/document.d.ts.map +1 -1
  53. package/dist/document.js +144 -0
  54. package/dist/document.js.map +1 -1
  55. package/dist/envelope.d.ts +8 -0
  56. package/dist/envelope.d.ts.map +1 -1
  57. package/dist/envelope.js +28 -0
  58. package/dist/envelope.js.map +1 -1
  59. package/dist/fixture.d.ts.map +1 -1
  60. package/dist/fixture.js +12 -0
  61. package/dist/fixture.js.map +1 -1
  62. package/dist/html-report.d.ts +24 -7
  63. package/dist/html-report.d.ts.map +1 -1
  64. package/dist/html-report.js +608 -136
  65. package/dist/html-report.js.map +1 -1
  66. package/dist/index.d.ts +13 -0
  67. package/dist/index.d.ts.map +1 -1
  68. package/dist/index.js +13 -0
  69. package/dist/index.js.map +1 -1
  70. package/dist/links.d.ts +43 -0
  71. package/dist/links.d.ts.map +1 -1
  72. package/dist/links.js +43 -0
  73. package/dist/links.js.map +1 -1
  74. package/dist/observe.d.ts +8 -0
  75. package/dist/observe.d.ts.map +1 -1
  76. package/dist/observe.js +45 -1
  77. package/dist/observe.js.map +1 -1
  78. package/dist/options.d.ts +53 -0
  79. package/dist/options.d.ts.map +1 -1
  80. package/dist/options.js +3 -0
  81. package/dist/options.js.map +1 -1
  82. package/dist/reading-level.d.ts +22 -1
  83. package/dist/reading-level.d.ts.map +1 -1
  84. package/dist/reading-level.js +122 -19
  85. package/dist/reading-level.js.map +1 -1
  86. package/dist/reporter.d.ts.map +1 -1
  87. package/dist/reporter.js +31 -15
  88. package/dist/reporter.js.map +1 -1
  89. package/dist/scan.d.ts +36 -1
  90. package/dist/scan.d.ts.map +1 -1
  91. package/dist/scan.js +16 -2
  92. package/dist/scan.js.map +1 -1
  93. package/dist/screens.d.ts +55 -4
  94. package/dist/screens.d.ts.map +1 -1
  95. package/dist/screens.js +243 -43
  96. package/dist/screens.js.map +1 -1
  97. package/dist/summary.d.ts +22 -0
  98. package/dist/summary.d.ts.map +1 -1
  99. package/dist/summary.js +197 -22
  100. package/dist/summary.js.map +1 -1
  101. package/dist/viewports.d.ts +105 -0
  102. package/dist/viewports.d.ts.map +1 -0
  103. package/dist/viewports.js +134 -0
  104. package/dist/viewports.js.map +1 -0
  105. package/package.json +5 -4
package/NOTICE CHANGED
@@ -1,5 +1,5 @@
1
1
  Setsquare
2
- Copyright (c) 2026 Setsquare
2
+ Copyright (c) 2026 WORKTREE AMIGOS LTD (company no. 17430189)
3
3
 
4
4
  This product includes software developed by the Setsquare project
5
5
  (https://setsquare.dev).
@@ -39,7 +39,8 @@ the same thing. The accurate phrase is "Apache-2.0 licensed".
39
39
  Trademarks
40
40
  --------------------------------------------------------------------------------
41
41
 
42
- "Setsquare" and the Setsquare logo are trademarks of the Setsquare project. No
42
+ "Setsquare" and the Setsquare logo are unregistered trademarks of WORKTREE
43
+ AMIGOS LTD. No trademark registration is sought or held (decision D1). No
43
44
  trademark licence is granted by the Apache License — section 6 reserves this
44
45
  expressly — and none is granted by this notice. You may state accurately that
45
46
  your software uses or is compatible with Setsquare; you may not use the name or
package/README.md CHANGED
@@ -85,6 +85,126 @@ and an evidence file at `.setsquare/runs/<timestamp>/run.json` — the full find
85
85
  their WCAG criteria, measured contrast ratios, the exact ruleset used, and
86
86
  performance timings.
87
87
 
88
+ ### Checks that need the page driven, not read
89
+
90
+ Some of what runs is not axe. A DOM-snapshot analyser can only answer questions
91
+ about the document as it stands; several WCAG criteria are about what the page
92
+ *does*. These run because we are already inside your test, with your page:
93
+
94
+ | Criterion | What it does |
95
+ |---|---|
96
+ | **1.4.8** Visual Presentation, AAA | Measures line spacing, the measure in characters, and justification, on blocks of text. |
97
+ | **1.4.12** Text Spacing | Applies the SC's four spacing metrics and measures what clips. |
98
+ | **2.1.2** No Keyboard Trap | Tabs both ways and looks for a cycle focus never leaves. |
99
+ | **2.1.4** Character Key Shortcuts, opt-in | Watches which key handlers a page registers, and on which characters. |
100
+ | **2.4.7** Focus Visible | Diffs the computed style before and after focus — including `::before`/`::after`. |
101
+ | **2.4.11** Focus Not Obscured (Minimum) | Focuses each element and checks nothing covers it entirely. |
102
+ | **2.4.12** Focus Not Obscured (Enhanced), AAA | The same walk, stricter: no part of it covered. |
103
+ | **2.4.13** Focus Appearance, AAA | Measures the indicator's thickness and its contrast, and states both. |
104
+ | **3.1.5** Reading Level, AAA | A Flesch–Kincaid grade per page. |
105
+ | **3.2.1** On Focus | Focuses each control and watches for a change of context nobody asked for. |
106
+ | **3.2.2** On Input, opt-in | Changes each `<select>`, checkbox and radio and watches the same. |
107
+ | **3.2.3** Consistent Navigation | Compares navigation order **across surfaces**, after the run. |
108
+ | **3.2.4** Consistent Identification | Compares the names given to the same target across surfaces. |
109
+ | **3.2.6** Consistent Help | Compares where help mechanisms appear across surfaces. |
110
+ | **2.4.5** Multiple Ways | Looks across surfaces for navigation, a search control and a sitemap. |
111
+ | **3.3.1 / 4.1.3** Error Identification, Status Messages | Reads a page your test put into an error state. |
112
+
113
+ **If you use Tailwind and 1.4.8 fires across most of your prose, it is one line
114
+ of theme configuration rather than anything you wrote.** Tailwind's type scale
115
+ ships line heights below the 1.5 the SC asks for — `text-sm` is 1.43 — and line
116
+ height **inherits**, so one utility on one container hands it to every
117
+ paragraph inside. Raising `--text-*--line-height` in `@theme` fixes the lot and
118
+ leaves `leading-*` working; [recipe 14](../../docs/setsquare-recipes.md) has the
119
+ block. Worth checking before editing anything, because a run of these usually
120
+ has one cause rather than one per block.
121
+
122
+ The three walks that drive the page — focus, keyboard and reflow — run at
123
+ **teardown only**, and that is a real limitation rather than an implementation
124
+ detail. Focusing an element fires your page's own focus, focusin and blur
125
+ handlers; the keyboard walk presses Tab and Escape, which fires your key
126
+ handlers too; the reflow check resizes the viewport, which re-runs your media
127
+ queries. A handler that opened a menu or started a request has already run by
128
+ the time anything is restored.
129
+
130
+ Scroll position, the previously focused element and the viewport are all put
131
+ back; side effects cannot be. So a scan of a named state
132
+ (`{ state: 'menu-open' }`) carries no evidence from these checks, while
133
+ whatever your test left on screen does.
134
+
135
+ And twenty criteria are reported as **no automated rule can decide this** —
136
+ separately from the criteria nobody has built a rule for yet, because those are
137
+ different facts and an auditor's first question about an untested criterion is
138
+ which of the two it is. Each one carries the reason and what would have to
139
+ change for it to move, so the list is a position rather than a wall. Where
140
+ **presence** is checkable and **adequacy** is not — a caption track exists, but
141
+ whether it matches the audio is a judgement — the entry says so at that
142
+ granularity rather than writing the criterion off whole.
143
+
144
+ That list is the concrete floor under "automated evidence is not conformance".
145
+ A run that tells you twenty criteria no tool will ever check for you has told
146
+ you something more useful than a green tick.
147
+
148
+ Alongside those, eight **heuristics** point at criteria no rule can decide —
149
+ meaningful sequence (1.3.2), sensory instructions (1.3.3), weak headings
150
+ (2.4.6), unheaded runs (2.4.10), abbreviations (3.1.4), location cues (2.4.8),
151
+ missing caption tracks (1.2.1/1.2.2), and more than one route to a page
152
+ (2.4.5). They follow one discipline: **never a violation, always needs a
153
+ person, fire only above a margin, and say what would resolve it.** A heuristic
154
+ that reports a failure is worse than no heuristic, because someone who
155
+ disproves one stops trusting all of them.
156
+
157
+ They are on by default, being read-only and unable to fail a build, and each is
158
+ switchable on its own — `heuristics: { sensoryCharacteristics: false }` — so
159
+ disagreeing with one costs you one rather than all eight. The three that read
160
+ English words stay silent on a page in another language rather than guessing.
161
+
162
+ The last three below are the ones no per-page tool can have. They are statements
163
+ about a **set** of pages, computed after the whole run from what each scan
164
+ already carried — so they cost no extra page work, and they exist because the
165
+ run holds every surface at once.
166
+
167
+ They are also the ones with the most dangerous failure mode, so: **a run with
168
+ fewer than two surfaces reports them as untested, never as passing.** A
169
+ one-page run cannot evidence consistency, and a clean pass on a run that had
170
+ nothing to compare would be the most flattering possible lie. The summary says
171
+ "these criteria compare pages against each other — this run had one surface"
172
+ rather than folding them in with the criteria nothing can check.
173
+
174
+ Only links in navigation, header and footer landmarks are compared, because
175
+ 3.2.4 is about repeated components: naming an inline prose link differently in
176
+ two sentences is ordinary writing, not an inconsistency.
177
+
178
+ **2.1.4 is off unless you turn it on** (`keyShortcuts: true`), and for a
179
+ different reason again. There is no way to enumerate a page's event listeners
180
+ after the fact, so the only route is to wrap `addEventListener` before your own
181
+ scripts run, for the whole life of the page. Everything else here happens after
182
+ a page has loaded and can be undone. Even proven inert — the wrapper records
183
+ and delegates with your original arguments, so `removeEventListener` still
184
+ matches, and the fixture suite asserts exactly that — it is a larger presence in
185
+ your application than a scanner has any business having by default.
186
+
187
+ It only ever reports **needs a person**: 2.1.4 is satisfied if the shortcut can
188
+ be turned off, remapped, or is only active when a component has focus, and all
189
+ three are affordances no check can see.
190
+
191
+ **3.2.2 is off unless you turn it on** (`onInput: true`), and the default is the
192
+ decision rather than caution: a change event is where an application saves, and
193
+ writing to your data is a worse failure than any finding the rule could produce
194
+ — worse than being a flake, because a flake is visible and a silent write is
195
+ not. Turn it on where the suite runs against disposable data, which is most
196
+ suites. Even then, only `<select>`, checkboxes and radios are touched and their
197
+ values are put back; nothing is ever typed into a text field, no form is ever
198
+ submitted, and no navigation is ever allowed to commit.
199
+
200
+ Where geometry or stacking makes the answer a judgement — a translucent overlay
201
+ over the focused element, an indicator drawn with a box-shadow, a focus ring
202
+ against a gradient — these report **needs a person**, never a pass and never a
203
+ fail. So does an element whose focus indicator we could not observe: many sites
204
+ style `:focus-visible` only, and a programmatic focus does not always match it,
205
+ so "nothing changed" is reported as something to check rather than as a
206
+ failure.
207
+
88
208
  ## Every screenshot on one page
89
209
 
90
210
  Playwright takes the screenshots; reading them means opening its report and
@@ -151,6 +271,106 @@ test('the editor reports validation errors accessibly', async ({ page }) => {
151
271
 
152
272
  An explicit scan always outranks an inferred one for the same context.
153
273
 
274
+ ## Scanning at more than one viewport
275
+
276
+ A rule only ever sees the viewport it ran in. A navigation that collapses into a
277
+ menu below a breakpoint is a *different document*, not a narrower one, so a scan
278
+ at 1280 has no opinion about the same page at 390.
279
+
280
+ Setsquare cannot widen that for you — it scans the pages your suite drives, at
281
+ the sizes your suite drives them, and it takes no screenshots at all. A project
282
+ per width does, and it needs no changes to your tests:
283
+
284
+ ```ts
285
+ export default withSetsquare(
286
+ defineConfig({
287
+ projects: [
288
+ { name: 'chromium', use: { ...devices['Desktop Chrome'] } },
289
+ {
290
+ name: 'tablet',
291
+ testMatch: /a11y\.spec\.ts/,
292
+ use: { ...devices['Desktop Chrome'], viewport: { width: 768, height: 1024 } },
293
+ },
294
+ {
295
+ name: 'mobile',
296
+ testMatch: /a11y\.spec\.ts/,
297
+ use: { ...devices['Desktop Chrome'], viewport: { width: 390, height: 844 } },
298
+ },
299
+ ],
300
+ }),
301
+ );
302
+ ```
303
+
304
+ Spreading `Desktop Chrome` and overriding only `viewport` holds the engine
305
+ constant, so the width is the only variable — `devices['iPhone 15']` is WebKit
306
+ and changes both at once. `testMatch` keeps the extra projects to the specs whose
307
+ layout is the subject; a spec that sets its own viewport, or that checks request
308
+ origins or resolves links, returns the same answer at every width. And 320 needs
309
+ no project of its own: `setsquare-reflow` measures WCAG 1.4.10 there on every
310
+ surface already, by resizing at teardown and putting the viewport back.
311
+
312
+ The viewport is part of a scan's identity, so evidence from several widths
313
+ survives instead of collapsing into one row, and the report, the contact sheet
314
+ and the per-surface tables group by band — laptop 1024px and wider, tablet 768px
315
+ to 1023px, mobile narrower than 768px — with the exact size beside every name.
316
+ Those names describe a width and never a device: a 640px viewport is in the
317
+ mobile band whether it is a phone or a desktop browser with text at 200%, and
318
+ every artifact that prints a band name prints that caveat with it.
319
+
320
+ With one viewport in the run, Setsquare says nothing about narrow widths. Not
321
+ "no narrow-viewport failures found" — that would be a claim about your phone
322
+ layout from a run that never looked at it.
323
+
324
+ ## Telling the report what your own tests already cover
325
+
326
+ Some success criteria no automated engine evaluates. Reflow at 320px, focus not
327
+ being obscured by a sticky header, a keyboard trap, whether the navigation is
328
+ consistent between pages — these are checked by driving the page, and a suite
329
+ that has grown up around a real product is usually checking several of them
330
+ already. Until you say so, the conformance report has no way to know: your spec
331
+ arrives as a pass or a fail with no criterion attached to it.
332
+
333
+ So say so:
334
+
335
+ ```ts
336
+ import { setsquare } from '@setsquare/review-sdk';
337
+
338
+ test('no horizontal scrolling at 320px', async ({ page }) => {
339
+ setsquare.covers('1.4.10');
340
+
341
+ await page.setViewportSize({ width: 320, height: 800 });
342
+ await page.goto('/pricing');
343
+ expect(await hasHorizontalOverflow(page)).toBe(false);
344
+ });
345
+ ```
346
+
347
+ That criterion now appears in the report as **covered by your own test**, with
348
+ your test named next to it.
349
+
350
+ **It is recorded as your claim, not as our finding, and the report says so
351
+ everywhere it appears.** We do not check that a test declaring `1.4.10` tests
352
+ reflow — there is no way to — so a declaration is never merged into the state
353
+ that means every automated rule passed. It is its own state, worded
354
+ differently, with its own glyph in the grid. That is the point: the declaration
355
+ is exactly as strong as the test behind it, and the report never pretends
356
+ otherwise.
357
+
358
+ Three details worth knowing:
359
+
360
+ - **A declaring test that fails** is reported as *your own test for this
361
+ criterion did not pass*, and it stops the level reading as clean. It does not
362
+ become a detected failure: we did not observe it, and a red test can be red
363
+ for a reason that has nothing to do with the criterion.
364
+ - **A declaring test that is skipped** is reported as such, rather than folded
365
+ into "no automated check exists" — a check that exists and did not run is a
366
+ different problem.
367
+ - **An id that is not a WCAG 2.2 success criterion throws**, immediately, in
368
+ your test. This is the one thing in this package that does: everywhere else a
369
+ problem warns and carries on, because our evidence-gathering has no standing
370
+ to fail your build. A typo here is different — the alternative is dropping
371
+ your declaration silently, which would leave you believing you have coverage
372
+ you do not have.
373
+
154
374
  ## Configuration
155
375
 
156
376
  Everything is optional. An empty options object produces a useful run.
@@ -1,6 +1,20 @@
1
- import type { BrowserContext, TestInfo } from '@playwright/test';
1
+ import type { BrowserContext, Page, TestInfo } from '@playwright/test';
2
+ import type { AxeFinding, RuleInapplicable, RulePass } from '@setsquare/schema';
2
3
  import { type ResolvedSetsquareOptions } from './options.js';
3
4
  export declare function installAutoScan(context: BrowserContext, options: ResolvedSetsquareOptions, testInfo: TestInfo, warn: (message: string) => void): Promise<void>;
5
+ /**
6
+ * Setsquare's own driven checks: the ones that need the page acted on rather
7
+ * than read.
8
+ *
9
+ * Extracted so the teardown scan and the checks-only teardown record run
10
+ * exactly the same set. Two call sites with two hand-maintained lists is how a
11
+ * check ends up silently missing from half the runs.
12
+ */
13
+ export declare function runDrivenChecks(page: Page, options: ResolvedSetsquareOptions): Promise<{
14
+ findings: AxeFinding[];
15
+ passes: RulePass[];
16
+ inapplicable: RuleInapplicable[];
17
+ }>;
4
18
  /**
5
19
  * Scan whatever the test left on screen, at teardown.
6
20
  *
@@ -1 +1 @@
1
- {"version":3,"file":"autoscan.d.ts","sourceRoot":"","sources":["../src/autoscan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAavE,OAAO,EAAqB,KAAK,wBAAwB,EAAE,MAAM,cAAc,CAAC;AA+DhF,wBAAgB,eAAe,CAC7B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,wBAAwB,EACjC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC,CAqEf;AA6LD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,wBAAwB,EACjC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC,CA0Df"}
1
+ {"version":3,"file":"autoscan.d.ts","sourceRoot":"","sources":["../src/autoscan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAoBhF,OAAO,EAAqB,KAAK,wBAAwB,EAAE,MAAM,cAAc,CAAC;AA6FhF,wBAAgB,eAAe,CAC7B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,wBAAwB,EACjC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC,CAqFf;AA+LD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC;IAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,YAAY,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAC,CAuC3F;AAmFD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,wBAAwB,EACjC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC,CA6Ef"}
package/dist/autoscan.js CHANGED
@@ -2,6 +2,12 @@ import { engineVersion, rulesetDigest, runAxe } from './axe.js';
2
2
  import { SCAN_RECORD_ATTACHMENT, SCAN_RECORD_VERSION } from './contract.js';
3
3
  import { toFindings, toInapplicable, toPasses } from './findings.js';
4
4
  import { runStatusMessages, runTextSpacing } from './checks/dynamic.js';
5
+ import { runFocusNotObscured } from './checks/focus.js';
6
+ import { runKeyboardTrap } from './checks/keyboard.js';
7
+ import { runOnFocus, runOnInput } from './checks/context-change.js';
8
+ import { runReflow } from './checks/reflow.js';
9
+ import { heuristicEvidence, readHeuristicSignals } from './checks/heuristics.js';
10
+ import { runKeyShortcuts } from './checks/shortcuts.js';
5
11
  import { setsquareCheckVersions } from './checks/versions.js';
6
12
  import { runReadingLevel } from './reading-level.js';
7
13
  import { readingLevelEnabled } from './runtime.js';
@@ -26,6 +32,9 @@ function stateFor(page, url) {
26
32
  perfCaptured: false,
27
33
  scans: existing?.scans ?? 0,
28
34
  scanned: existing?.scanned ?? new Map(),
35
+ teardownScanned: existing?.teardownScanned ?? new Set(),
36
+ ...(existing?.axeVersion ? { axeVersion: existing.axeVersion } : {}),
37
+ ...(existing?.rulesetDigest ? { rulesetDigest: existing.rulesetDigest } : {}),
29
38
  };
30
39
  state.set(page, next);
31
40
  return next;
@@ -73,6 +82,22 @@ export function installAutoScan(context, options, testInfo, warn) {
73
82
  pageState.queue = pageState.queue.then(async () => {
74
83
  if (page.isClosed())
75
84
  return;
85
+ /*
86
+ * Checked HERE, inside the queued work, not at the callback's entry.
87
+ *
88
+ * A settle callback can fire while teardown is already running: it passes
89
+ * any entry check, queues behind the teardown scan, and lands second.
90
+ * Dedupe breaks a tie in favour of the later scan, so it replaced the
91
+ * teardown scan with a row carrying no driven checks at all — those only
92
+ * ever run at teardown. A page that had three real violations reported
93
+ * none.
94
+ *
95
+ * By the time this runs, the teardown scan has finished and said so. The
96
+ * test is over; this scan is looking at a page nobody is using any more,
97
+ * and it is never the better evidence.
98
+ */
99
+ if (pageState.teardownScanned.has(signal.url))
100
+ return;
76
101
  try {
77
102
  await scanSettledPage(page, signal, options, testInfo, warn);
78
103
  }
@@ -167,20 +192,16 @@ async function scanSettledPage(page, signal, options, testInfo, warn) {
167
192
  const passes = toPasses(results);
168
193
  const inapplicable = toInapplicable(results);
169
194
  /*
170
- * Dynamic checks only at TEARDOWN, never mid-test: the text-spacing probe
171
- * mutates the live page, and an auto-scan firing between a customer's
172
- * actions would make us the flake in their screenshot assertion. At
173
- * teardown the test is over and the page is about to be discarded.
195
+ * Driven checks only at TEARDOWN, never mid-test: they mutate the live page,
196
+ * and an auto-scan firing between a customer's actions would make us the
197
+ * flake in their screenshot assertion. At teardown the test is over and the
198
+ * page is about to be discarded.
174
199
  */
175
200
  if (signal.reason === 'teardown') {
176
- for (const check of [await runTextSpacing(page), await runStatusMessages(page)]) {
177
- if (check.finding)
178
- findings.push(check.finding);
179
- if (check.pass)
180
- passes.push(check.pass);
181
- if (check.inapplicable)
182
- inapplicable.push(check.inapplicable);
183
- }
201
+ const checks = await runDrivenChecks(page, options);
202
+ findings.push(...checks.findings);
203
+ passes.push(...checks.passes);
204
+ inapplicable.push(...checks.inapplicable);
184
205
  }
185
206
  const record = {
186
207
  recordVersion: SCAN_RECORD_VERSION,
@@ -244,6 +265,10 @@ async function scanSettledPage(page, signal, options, testInfo, warn) {
244
265
  ...(probesMs > 0 ? { probesMs } : {}),
245
266
  };
246
267
  pageState.scanned.set(url, await mutationTotal(page));
268
+ if (signal.reason === 'teardown')
269
+ pageState.teardownScanned.add(url);
270
+ pageState.axeVersion = record.axeVersion;
271
+ pageState.rulesetDigest = record.rulesetDigest;
247
272
  await testInfo.attach(SCAN_RECORD_ATTACHMENT, {
248
273
  body: Buffer.from(JSON.stringify(record), 'utf8'),
249
274
  contentType: 'application/json',
@@ -262,6 +287,118 @@ function engineOf(page) {
262
287
  const name = page.context().browser()?.browserType().name();
263
288
  return name === 'firefox' || name === 'webkit' ? name : 'chromium';
264
289
  }
290
+ /**
291
+ * Setsquare's own driven checks: the ones that need the page acted on rather
292
+ * than read.
293
+ *
294
+ * Extracted so the teardown scan and the checks-only teardown record run
295
+ * exactly the same set. Two call sites with two hand-maintained lists is how a
296
+ * check ends up silently missing from half the runs.
297
+ */
298
+ export async function runDrivenChecks(page, options) {
299
+ const findings = [];
300
+ const passes = [];
301
+ const inapplicable = [];
302
+ for (const check of [
303
+ await runTextSpacing(page),
304
+ await runStatusMessages(page),
305
+ // The focus walk is teardown-ONLY, unlike the two above — it is the one
306
+ // check that cannot also run inside an awaited explicit scan. Focusing
307
+ // fires the page's own focus, focusin and blur handlers, and a handler
308
+ // that opened a menu or started a request has already run by the time we
309
+ // restore scroll and the previous activeElement. See checks/focus.ts.
310
+ ...(await runFocusNotObscured(page, options.rules.target)),
311
+ // Same teardown-only reasoning, one step further: this one presses keys.
312
+ await runKeyboardTrap(page),
313
+ // And one step further again: this one RESIZES the page. It restores the
314
+ // viewport, but a resize mid-test is not a race we could win.
315
+ await runReflow(page),
316
+ // 3.2.1 rides the same focusing the walk above already does, so it adds no
317
+ // new class of side effect. 3.2.2 CHANGES a control's value, which is where
318
+ // an application saves — opt-in, and off by default.
319
+ await runOnFocus(page),
320
+ ...(options.onInput ? [await runOnInput(page)] : []),
321
+ // Reads what the init script recorded, if one was installed. Returns
322
+ // nothing when it was not, which is the honest answer for a check that is
323
+ // off rather than a pass it did not earn.
324
+ await runKeyShortcuts(page),
325
+ // Seven read-only heuristics sharing one page evaluate. They can never
326
+ // fail a build — everything they emit is needs-review — so they are on by
327
+ // default and individually switchable.
328
+ ...(await heuristics(page, options)),
329
+ ]) {
330
+ if (check.finding)
331
+ findings.push(check.finding);
332
+ if (check.pass)
333
+ passes.push(check.pass);
334
+ if (check.inapplicable)
335
+ inapplicable.push(check.inapplicable);
336
+ }
337
+ return { findings, passes, inapplicable };
338
+ }
339
+ /** The seven DOM heuristics, or nothing if the page could not be read. */
340
+ async function heuristics(page, options) {
341
+ const signals = await readHeuristicSignals(page);
342
+ if (!signals)
343
+ return [];
344
+ return heuristicEvidence(signals, options.rules.target, options.heuristics);
345
+ }
346
+ /**
347
+ * Run the driven checks on a page that was already scanned and has not changed,
348
+ * and attach them as a checks-only record.
349
+ *
350
+ * No axe run: there is genuinely nothing new for it to find, and paying for a
351
+ * second one on every page of every test would be a real cost for no evidence.
352
+ * `toScans` merges this into the scan that shares its `visitRef`, so the
353
+ * envelope ends up with one row carrying both kinds of result rather than two
354
+ * rows fighting over one context in dedupe.
355
+ */
356
+ async function flushChecksOnly(page, options, testInfo, pageState, url, warn) {
357
+ /*
358
+ * No earlier scan on this page means nothing for the merge to attach to, and
359
+ * no ruleset identity to state. Reaching here without one would mean the skip
360
+ * above fired without a scan having happened, which cannot occur — but
361
+ * fabricating a digest to satisfy the type would be a fake that looks real,
362
+ * and this file's rule is that a digest is always a hash of a stated input.
363
+ */
364
+ if (!pageState.axeVersion || !pageState.rulesetDigest)
365
+ return;
366
+ try {
367
+ const checks = await runDrivenChecks(page, options);
368
+ if (checks.findings.length === 0 &&
369
+ checks.passes.length === 0 &&
370
+ checks.inapplicable.length === 0) {
371
+ return;
372
+ }
373
+ const record = {
374
+ recordVersion: SCAN_RECORD_VERSION,
375
+ kind: 'scan',
376
+ checksOnly: true,
377
+ page: { project: testInfo.project.name, engine: engineOf(page), url },
378
+ declared: { surface: '' },
379
+ visitRef: pageState.visitRef,
380
+ // Stated from the run's configuration, as everywhere else: these fields
381
+ // describe what the evidence is relative to, and a checks-only record is
382
+ // relative to exactly the same configuration as the scan it merges into.
383
+ axeVersion: pageState.axeVersion,
384
+ rulesetDigest: pageState.rulesetDigest,
385
+ wcagTarget: options.rules.target,
386
+ findings: checks.findings,
387
+ passes: checks.passes,
388
+ ...(checks.inapplicable.length > 0 ? { inapplicable: checks.inapplicable } : {}),
389
+ };
390
+ const viewport = page.viewportSize();
391
+ if (viewport)
392
+ record.page.viewport = viewport;
393
+ await testInfo.attach(SCAN_RECORD_ATTACHMENT, {
394
+ body: Buffer.from(JSON.stringify(record), 'utf8'),
395
+ contentType: 'application/json',
396
+ });
397
+ }
398
+ catch (error) {
399
+ warn(`Setsquare could not run its driven checks on ${url}: ${error instanceof Error ? error.message : String(error)}. That page has no focus, keyboard or reflow evidence in this run.`);
400
+ }
401
+ }
265
402
  /**
266
403
  * Scan whatever the test left on screen, at teardown.
267
404
  *
@@ -306,8 +443,26 @@ export async function flushAutoScan(context, options, testInfo, warn) {
306
443
  * everything changed".
307
444
  */
308
445
  const lastScannedAt = pageState.scanned.get(url);
309
- if (lastScannedAt !== undefined && (await mutationTotal(page)) === lastScannedAt)
446
+ if (lastScannedAt !== undefined && (await mutationTotal(page)) === lastScannedAt) {
447
+ /*
448
+ * Right for axe, wrong for the driven checks — and that asymmetry was a
449
+ * silent hole for months.
450
+ *
451
+ * Nothing has changed, so re-running axe would find the same rows twice.
452
+ * But the driven checks never ran at all: they are teardown-only by
453
+ * construction, and this page's only scan happened mid-test when it went
454
+ * quiet. So a page that settles during its own test — a static page, a
455
+ * fast test, most of the web — got no text-spacing, focus, keyboard,
456
+ * reflow or context evidence, and the criteria those checks exist for
457
+ * stayed at "no automated result" on exactly the pages they would have
458
+ * had most to say about.
459
+ *
460
+ * Found by adding 3.2.1 and 3.2.2 and watching the fixture site report
461
+ * them as passing everywhere on a page built to fail both.
462
+ */
463
+ await flushChecksOnly(page, options, testInfo, pageState, url, warn);
310
464
  continue;
465
+ }
311
466
  try {
312
467
  // Chained onto the same queue as settle-triggered scans, so a scan that was
313
468
  // already in flight when the test ended is not raced.
@@ -1 +1 @@
1
- {"version":3,"file":"autoscan.js","sourceRoot":"","sources":["../src/autoscan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"autoscan.js","sourceRoot":"","sources":["../src/autoscan.ts"],"names":[],"mappings":"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"}