uxinspect 0.1.0 → 0.11.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 (494) hide show
  1. package/README.md +332 -22
  2. package/dist/a11y-filter.d.ts +15 -0
  3. package/dist/a11y-filter.d.ts.map +1 -0
  4. package/dist/a11y-filter.js +107 -0
  5. package/dist/a11y-filter.js.map +1 -0
  6. package/dist/ab-compare.d.ts +23 -0
  7. package/dist/ab-compare.d.ts.map +1 -0
  8. package/dist/ab-compare.js +340 -0
  9. package/dist/ab-compare.js.map +1 -0
  10. package/dist/ai-codegen.d.ts +30 -0
  11. package/dist/ai-codegen.d.ts.map +1 -0
  12. package/dist/ai-codegen.js +296 -0
  13. package/dist/ai-codegen.js.map +1 -0
  14. package/dist/ai-triage.d.ts +26 -0
  15. package/dist/ai-triage.d.ts.map +1 -0
  16. package/dist/ai-triage.js +207 -0
  17. package/dist/ai-triage.js.map +1 -0
  18. package/dist/amp.d.ts +32 -0
  19. package/dist/amp.d.ts.map +1 -0
  20. package/dist/amp.js +179 -0
  21. package/dist/amp.js.map +1 -0
  22. package/dist/animation-audit.d.ts +25 -0
  23. package/dist/animation-audit.d.ts.map +1 -0
  24. package/dist/animation-audit.js +296 -0
  25. package/dist/animation-audit.js.map +1 -0
  26. package/dist/api.d.ts +3 -0
  27. package/dist/api.d.ts.map +1 -0
  28. package/dist/api.js +85 -0
  29. package/dist/api.js.map +1 -0
  30. package/dist/aria-audit.d.ts +20 -0
  31. package/dist/aria-audit.d.ts.map +1 -0
  32. package/dist/aria-audit.js +445 -0
  33. package/dist/aria-audit.js.map +1 -0
  34. package/dist/assertions.d.ts +30 -0
  35. package/dist/assertions.d.ts.map +1 -0
  36. package/dist/assertions.js +342 -0
  37. package/dist/assertions.js.map +1 -0
  38. package/dist/autofix.d.ts +40 -0
  39. package/dist/autofix.d.ts.map +1 -0
  40. package/dist/autofix.js +244 -0
  41. package/dist/autofix.js.map +1 -0
  42. package/dist/badge.d.ts +27 -0
  43. package/dist/badge.d.ts.map +1 -0
  44. package/dist/badge.js +183 -0
  45. package/dist/badge.js.map +1 -0
  46. package/dist/baseline-drift.d.ts +43 -0
  47. package/dist/baseline-drift.d.ts.map +1 -0
  48. package/dist/baseline-drift.js +208 -0
  49. package/dist/baseline-drift.js.map +1 -0
  50. package/dist/bdd.d.ts +31 -0
  51. package/dist/bdd.d.ts.map +1 -0
  52. package/dist/bdd.js +316 -0
  53. package/dist/bdd.js.map +1 -0
  54. package/dist/bisect.d.ts +32 -0
  55. package/dist/bisect.d.ts.map +1 -0
  56. package/dist/bisect.js +253 -0
  57. package/dist/bisect.js.map +1 -0
  58. package/dist/budget-diff.d.ts +37 -0
  59. package/dist/budget-diff.d.ts.map +1 -0
  60. package/dist/budget-diff.js +273 -0
  61. package/dist/budget-diff.js.map +1 -0
  62. package/dist/budget-file.d.ts +15 -0
  63. package/dist/budget-file.d.ts.map +1 -0
  64. package/dist/budget-file.js +185 -0
  65. package/dist/budget-file.js.map +1 -0
  66. package/dist/bundle-size.d.ts +36 -0
  67. package/dist/bundle-size.d.ts.map +1 -0
  68. package/dist/bundle-size.js +347 -0
  69. package/dist/bundle-size.js.map +1 -0
  70. package/dist/cache-headers.d.ts +33 -0
  71. package/dist/cache-headers.d.ts.map +1 -0
  72. package/dist/cache-headers.js +270 -0
  73. package/dist/cache-headers.js.map +1 -0
  74. package/dist/canonical-audit.d.ts +19 -0
  75. package/dist/canonical-audit.d.ts.map +1 -0
  76. package/dist/canonical-audit.js +196 -0
  77. package/dist/canonical-audit.js.map +1 -0
  78. package/dist/chaos.d.ts +38 -0
  79. package/dist/chaos.d.ts.map +1 -0
  80. package/dist/chaos.js +348 -0
  81. package/dist/chaos.js.map +1 -0
  82. package/dist/cli.js +205 -23
  83. package/dist/cli.js.map +1 -1
  84. package/dist/clickjacking-audit.d.ts +18 -0
  85. package/dist/clickjacking-audit.d.ts.map +1 -0
  86. package/dist/clickjacking-audit.js +231 -0
  87. package/dist/clickjacking-audit.js.map +1 -0
  88. package/dist/cls-culprit.d.ts +36 -0
  89. package/dist/cls-culprit.d.ts.map +1 -0
  90. package/dist/cls-culprit.js +203 -0
  91. package/dist/cls-culprit.js.map +1 -0
  92. package/dist/cls-timeline.d.ts +30 -0
  93. package/dist/cls-timeline.d.ts.map +1 -0
  94. package/dist/cls-timeline.js +61 -0
  95. package/dist/cls-timeline.js.map +1 -0
  96. package/dist/codegen-converter.d.ts +19 -0
  97. package/dist/codegen-converter.d.ts.map +1 -0
  98. package/dist/codegen-converter.js +464 -0
  99. package/dist/codegen-converter.js.map +1 -0
  100. package/dist/compression.d.ts +14 -0
  101. package/dist/compression.d.ts.map +1 -0
  102. package/dist/compression.js +150 -0
  103. package/dist/compression.js.map +1 -0
  104. package/dist/console-errors.d.ts +24 -0
  105. package/dist/console-errors.d.ts.map +1 -0
  106. package/dist/console-errors.js +96 -0
  107. package/dist/console-errors.js.map +1 -0
  108. package/dist/content-quality.d.ts +34 -0
  109. package/dist/content-quality.d.ts.map +1 -0
  110. package/dist/content-quality.js +124 -0
  111. package/dist/content-quality.js.map +1 -0
  112. package/dist/contract-openapi.d.ts +74 -0
  113. package/dist/contract-openapi.d.ts.map +1 -0
  114. package/dist/contract-openapi.js +305 -0
  115. package/dist/contract-openapi.js.map +1 -0
  116. package/dist/cookie-banner.d.ts +27 -0
  117. package/dist/cookie-banner.d.ts.map +1 -0
  118. package/dist/cookie-banner.js +285 -0
  119. package/dist/cookie-banner.js.map +1 -0
  120. package/dist/cookie-flags-audit.d.ts +35 -0
  121. package/dist/cookie-flags-audit.d.ts.map +1 -0
  122. package/dist/cookie-flags-audit.js +167 -0
  123. package/dist/cookie-flags-audit.js.map +1 -0
  124. package/dist/cpu-throttle.d.ts +34 -0
  125. package/dist/cpu-throttle.d.ts.map +1 -0
  126. package/dist/cpu-throttle.js +149 -0
  127. package/dist/cpu-throttle.js.map +1 -0
  128. package/dist/crawl.d.ts +29 -0
  129. package/dist/crawl.d.ts.map +1 -0
  130. package/dist/crawl.js +153 -0
  131. package/dist/crawl.js.map +1 -0
  132. package/dist/critical-css.d.ts +25 -0
  133. package/dist/critical-css.d.ts.map +1 -0
  134. package/dist/critical-css.js +353 -0
  135. package/dist/critical-css.js.map +1 -0
  136. package/dist/cross-browser.d.ts +44 -0
  137. package/dist/cross-browser.d.ts.map +1 -0
  138. package/dist/cross-browser.js +300 -0
  139. package/dist/cross-browser.js.map +1 -0
  140. package/dist/csrf-audit.d.ts +33 -0
  141. package/dist/csrf-audit.d.ts.map +1 -0
  142. package/dist/csrf-audit.js +276 -0
  143. package/dist/csrf-audit.js.map +1 -0
  144. package/dist/css-coverage.d.ts +20 -0
  145. package/dist/css-coverage.d.ts.map +1 -0
  146. package/dist/css-coverage.js +91 -0
  147. package/dist/css-coverage.js.map +1 -0
  148. package/dist/csv-exporter.d.ts +34 -0
  149. package/dist/csv-exporter.d.ts.map +1 -0
  150. package/dist/csv-exporter.js +241 -0
  151. package/dist/csv-exporter.js.map +1 -0
  152. package/dist/dark-mode-audit.d.ts +31 -0
  153. package/dist/dark-mode-audit.d.ts.map +1 -0
  154. package/dist/dark-mode-audit.js +236 -0
  155. package/dist/dark-mode-audit.js.map +1 -0
  156. package/dist/dead-images.d.ts +18 -0
  157. package/dist/dead-images.d.ts.map +1 -0
  158. package/dist/dead-images.js +236 -0
  159. package/dist/dead-images.js.map +1 -0
  160. package/dist/deadclicks.d.ts +19 -0
  161. package/dist/deadclicks.d.ts.map +1 -0
  162. package/dist/deadclicks.js +109 -0
  163. package/dist/deadclicks.js.map +1 -0
  164. package/dist/discord-formatter.d.ts +39 -0
  165. package/dist/discord-formatter.d.ts.map +1 -0
  166. package/dist/discord-formatter.js +191 -0
  167. package/dist/discord-formatter.js.map +1 -0
  168. package/dist/dom-audit.d.ts +23 -0
  169. package/dist/dom-audit.d.ts.map +1 -0
  170. package/dist/dom-audit.js +111 -0
  171. package/dist/dom-audit.js.map +1 -0
  172. package/dist/driver.d.ts +2 -0
  173. package/dist/driver.d.ts.map +1 -1
  174. package/dist/driver.js +28 -0
  175. package/dist/driver.js.map +1 -1
  176. package/dist/error-page-audit.d.ts +26 -0
  177. package/dist/error-page-audit.d.ts.map +1 -0
  178. package/dist/error-page-audit.js +219 -0
  179. package/dist/error-page-audit.js.map +1 -0
  180. package/dist/event-listener-audit.d.ts +22 -0
  181. package/dist/event-listener-audit.d.ts.map +1 -0
  182. package/dist/event-listener-audit.js +156 -0
  183. package/dist/event-listener-audit.js.map +1 -0
  184. package/dist/exposed-paths.d.ts +21 -0
  185. package/dist/exposed-paths.d.ts.map +1 -0
  186. package/dist/exposed-paths.js +116 -0
  187. package/dist/exposed-paths.js.map +1 -0
  188. package/dist/favicon-audit.d.ts +28 -0
  189. package/dist/favicon-audit.d.ts.map +1 -0
  190. package/dist/favicon-audit.js +358 -0
  191. package/dist/favicon-audit.js.map +1 -0
  192. package/dist/flaky-detector.d.ts +32 -0
  193. package/dist/flaky-detector.d.ts.map +1 -0
  194. package/dist/flaky-detector.js +254 -0
  195. package/dist/flaky-detector.js.map +1 -0
  196. package/dist/flaky.d.ts +28 -0
  197. package/dist/flaky.d.ts.map +1 -0
  198. package/dist/flaky.js +106 -0
  199. package/dist/flaky.js.map +1 -0
  200. package/dist/focus-trap-audit.d.ts +29 -0
  201. package/dist/focus-trap-audit.d.ts.map +1 -0
  202. package/dist/focus-trap-audit.js +285 -0
  203. package/dist/focus-trap-audit.js.map +1 -0
  204. package/dist/font-loading.d.ts +29 -0
  205. package/dist/font-loading.d.ts.map +1 -0
  206. package/dist/font-loading.js +216 -0
  207. package/dist/font-loading.js.map +1 -0
  208. package/dist/forms-audit.d.ts +23 -0
  209. package/dist/forms-audit.d.ts.map +1 -0
  210. package/dist/forms-audit.js +147 -0
  211. package/dist/forms-audit.js.map +1 -0
  212. package/dist/github-annotations.d.ts +17 -0
  213. package/dist/github-annotations.d.ts.map +1 -0
  214. package/dist/github-annotations.js +264 -0
  215. package/dist/github-annotations.js.map +1 -0
  216. package/dist/graphql.d.ts +60 -0
  217. package/dist/graphql.d.ts.map +1 -0
  218. package/dist/graphql.js +188 -0
  219. package/dist/graphql.js.map +1 -0
  220. package/dist/har-waterfall.d.ts +37 -0
  221. package/dist/har-waterfall.d.ts.map +1 -0
  222. package/dist/har-waterfall.js +376 -0
  223. package/dist/har-waterfall.js.map +1 -0
  224. package/dist/heading-hierarchy.d.ts +20 -0
  225. package/dist/heading-hierarchy.d.ts.map +1 -0
  226. package/dist/heading-hierarchy.js +112 -0
  227. package/dist/heading-hierarchy.js.map +1 -0
  228. package/dist/headless-detect.d.ts +22 -0
  229. package/dist/headless-detect.d.ts.map +1 -0
  230. package/dist/headless-detect.js +167 -0
  231. package/dist/headless-detect.js.map +1 -0
  232. package/dist/history-timeline.d.ts +13 -0
  233. package/dist/history-timeline.d.ts.map +1 -0
  234. package/dist/history-timeline.js +327 -0
  235. package/dist/history-timeline.js.map +1 -0
  236. package/dist/hreflang-audit.d.ts +26 -0
  237. package/dist/hreflang-audit.d.ts.map +1 -0
  238. package/dist/hreflang-audit.js +273 -0
  239. package/dist/hreflang-audit.js.map +1 -0
  240. package/dist/hydration-audit.d.ts +21 -0
  241. package/dist/hydration-audit.d.ts.map +1 -0
  242. package/dist/hydration-audit.js +277 -0
  243. package/dist/hydration-audit.js.map +1 -0
  244. package/dist/image-audit.d.ts +41 -0
  245. package/dist/image-audit.d.ts.map +1 -0
  246. package/dist/image-audit.js +229 -0
  247. package/dist/image-audit.js.map +1 -0
  248. package/dist/index.d.ts +119 -0
  249. package/dist/index.d.ts.map +1 -1
  250. package/dist/index.js +826 -3
  251. package/dist/index.js.map +1 -1
  252. package/dist/init-wizard.d.ts +33 -0
  253. package/dist/init-wizard.d.ts.map +1 -0
  254. package/dist/init-wizard.js +289 -0
  255. package/dist/init-wizard.js.map +1 -0
  256. package/dist/inp-audit.d.ts +26 -0
  257. package/dist/inp-audit.d.ts.map +1 -0
  258. package/dist/inp-audit.js +202 -0
  259. package/dist/inp-audit.js.map +1 -0
  260. package/dist/js-coverage.d.ts +20 -0
  261. package/dist/js-coverage.d.ts.map +1 -0
  262. package/dist/js-coverage.js +81 -0
  263. package/dist/js-coverage.js.map +1 -0
  264. package/dist/json-schema.d.ts +27 -0
  265. package/dist/json-schema.d.ts.map +1 -0
  266. package/dist/json-schema.js +284 -0
  267. package/dist/json-schema.js.map +1 -0
  268. package/dist/keyboard.d.ts +21 -0
  269. package/dist/keyboard.d.ts.map +1 -0
  270. package/dist/keyboard.js +119 -0
  271. package/dist/keyboard.js.map +1 -0
  272. package/dist/lang-audit.d.ts +24 -0
  273. package/dist/lang-audit.d.ts.map +1 -0
  274. package/dist/lang-audit.js +141 -0
  275. package/dist/lang-audit.js.map +1 -0
  276. package/dist/lcp-element.d.ts +22 -0
  277. package/dist/lcp-element.d.ts.map +1 -0
  278. package/dist/lcp-element.js +240 -0
  279. package/dist/lcp-element.js.map +1 -0
  280. package/dist/longtasks.d.ts +38 -0
  281. package/dist/longtasks.d.ts.map +1 -0
  282. package/dist/longtasks.js +97 -0
  283. package/dist/longtasks.js.map +1 -0
  284. package/dist/mailbox.d.ts +35 -0
  285. package/dist/mailbox.d.ts.map +1 -0
  286. package/dist/mailbox.js +207 -0
  287. package/dist/mailbox.js.map +1 -0
  288. package/dist/media-audit.d.ts +20 -0
  289. package/dist/media-audit.d.ts.map +1 -0
  290. package/dist/media-audit.js +182 -0
  291. package/dist/media-audit.js.map +1 -0
  292. package/dist/metrics-exporter.d.ts +23 -0
  293. package/dist/metrics-exporter.d.ts.map +1 -0
  294. package/dist/metrics-exporter.js +297 -0
  295. package/dist/metrics-exporter.js.map +1 -0
  296. package/dist/mixed-content.d.ts +19 -0
  297. package/dist/mixed-content.d.ts.map +1 -0
  298. package/dist/mixed-content.js +86 -0
  299. package/dist/mixed-content.js.map +1 -0
  300. package/dist/motion-prefs.d.ts +21 -0
  301. package/dist/motion-prefs.d.ts.map +1 -0
  302. package/dist/motion-prefs.js +170 -0
  303. package/dist/motion-prefs.js.map +1 -0
  304. package/dist/open-graph.d.ts +40 -0
  305. package/dist/open-graph.d.ts.map +1 -0
  306. package/dist/open-graph.js +200 -0
  307. package/dist/open-graph.js.map +1 -0
  308. package/dist/orphan-assets.d.ts +17 -0
  309. package/dist/orphan-assets.d.ts.map +1 -0
  310. package/dist/orphan-assets.js +174 -0
  311. package/dist/orphan-assets.js.map +1 -0
  312. package/dist/page-object.d.ts +18 -0
  313. package/dist/page-object.d.ts.map +1 -0
  314. package/dist/page-object.js +346 -0
  315. package/dist/page-object.js.map +1 -0
  316. package/dist/pagination-audit.d.ts +24 -0
  317. package/dist/pagination-audit.d.ts.map +1 -0
  318. package/dist/pagination-audit.js +285 -0
  319. package/dist/pagination-audit.js.map +1 -0
  320. package/dist/passive-security.d.ts +19 -0
  321. package/dist/passive-security.d.ts.map +1 -0
  322. package/dist/passive-security.js +149 -0
  323. package/dist/passive-security.js.map +1 -0
  324. package/dist/pr-comment.d.ts +13 -0
  325. package/dist/pr-comment.d.ts.map +1 -0
  326. package/dist/pr-comment.js +316 -0
  327. package/dist/pr-comment.js.map +1 -0
  328. package/dist/precommit.d.ts +24 -0
  329. package/dist/precommit.d.ts.map +1 -0
  330. package/dist/precommit.js +239 -0
  331. package/dist/precommit.js.map +1 -0
  332. package/dist/prerender-audit.d.ts +22 -0
  333. package/dist/prerender-audit.d.ts.map +1 -0
  334. package/dist/prerender-audit.js +158 -0
  335. package/dist/prerender-audit.js.map +1 -0
  336. package/dist/print-audit.d.ts +21 -0
  337. package/dist/print-audit.d.ts.map +1 -0
  338. package/dist/print-audit.js +281 -0
  339. package/dist/print-audit.js.map +1 -0
  340. package/dist/protocol-audit.d.ts +17 -0
  341. package/dist/protocol-audit.d.ts.map +1 -0
  342. package/dist/protocol-audit.js +128 -0
  343. package/dist/protocol-audit.js.map +1 -0
  344. package/dist/reading-level.d.ts +37 -0
  345. package/dist/reading-level.d.ts.map +1 -0
  346. package/dist/reading-level.js +220 -0
  347. package/dist/reading-level.js.map +1 -0
  348. package/dist/redirects.d.ts +24 -0
  349. package/dist/redirects.d.ts.map +1 -0
  350. package/dist/redirects.js +119 -0
  351. package/dist/redirects.js.map +1 -0
  352. package/dist/report.d.ts +1 -1
  353. package/dist/report.d.ts.map +1 -1
  354. package/dist/report.js +736 -1
  355. package/dist/report.js.map +1 -1
  356. package/dist/reporter-plugin.d.ts +32 -0
  357. package/dist/reporter-plugin.d.ts.map +1 -0
  358. package/dist/reporter-plugin.js +120 -0
  359. package/dist/reporter-plugin.js.map +1 -0
  360. package/dist/resource-hints.d.ts +23 -0
  361. package/dist/resource-hints.d.ts.map +1 -0
  362. package/dist/resource-hints.js +225 -0
  363. package/dist/resource-hints.js.map +1 -0
  364. package/dist/retire.d.ts +22 -0
  365. package/dist/retire.d.ts.map +1 -0
  366. package/dist/retire.js +140 -0
  367. package/dist/retire.js.map +1 -0
  368. package/dist/retry.d.ts +20 -0
  369. package/dist/retry.d.ts.map +1 -0
  370. package/dist/retry.js +120 -0
  371. package/dist/retry.js.map +1 -0
  372. package/dist/robots-audit.d.ts +24 -0
  373. package/dist/robots-audit.d.ts.map +1 -0
  374. package/dist/robots-audit.js +206 -0
  375. package/dist/robots-audit.js.map +1 -0
  376. package/dist/rum.d.ts +35 -0
  377. package/dist/rum.d.ts.map +1 -0
  378. package/dist/rum.js +219 -0
  379. package/dist/rum.js.map +1 -0
  380. package/dist/schedule.d.ts +30 -0
  381. package/dist/schedule.d.ts.map +1 -0
  382. package/dist/schedule.js +238 -0
  383. package/dist/schedule.js.map +1 -0
  384. package/dist/secret-scan.d.ts +24 -0
  385. package/dist/secret-scan.d.ts.map +1 -0
  386. package/dist/secret-scan.js +202 -0
  387. package/dist/secret-scan.js.map +1 -0
  388. package/dist/service-worker.d.ts +26 -0
  389. package/dist/service-worker.d.ts.map +1 -0
  390. package/dist/service-worker.js +179 -0
  391. package/dist/service-worker.js.map +1 -0
  392. package/dist/shard.d.ts +14 -0
  393. package/dist/shard.d.ts.map +1 -0
  394. package/dist/shard.js +72 -0
  395. package/dist/shard.js.map +1 -0
  396. package/dist/sitemap-flows.d.ts +13 -0
  397. package/dist/sitemap-flows.d.ts.map +1 -0
  398. package/dist/sitemap-flows.js +157 -0
  399. package/dist/sitemap-flows.js.map +1 -0
  400. package/dist/sitemap.d.ts +27 -0
  401. package/dist/sitemap.d.ts.map +1 -0
  402. package/dist/sitemap.js +137 -0
  403. package/dist/sitemap.js.map +1 -0
  404. package/dist/slack-formatter.d.ts +35 -0
  405. package/dist/slack-formatter.d.ts.map +1 -0
  406. package/dist/slack-formatter.js +193 -0
  407. package/dist/slack-formatter.js.map +1 -0
  408. package/dist/sourcemap-scan.d.ts +24 -0
  409. package/dist/sourcemap-scan.d.ts.map +1 -0
  410. package/dist/sourcemap-scan.js +232 -0
  411. package/dist/sourcemap-scan.js.map +1 -0
  412. package/dist/sri-audit.d.ts +23 -0
  413. package/dist/sri-audit.d.ts.map +1 -0
  414. package/dist/sri-audit.js +180 -0
  415. package/dist/sri-audit.js.map +1 -0
  416. package/dist/storage-audit.d.ts +28 -0
  417. package/dist/storage-audit.d.ts.map +1 -0
  418. package/dist/storage-audit.js +263 -0
  419. package/dist/storage-audit.js.map +1 -0
  420. package/dist/storybook.d.ts +48 -0
  421. package/dist/storybook.d.ts.map +1 -0
  422. package/dist/storybook.js +191 -0
  423. package/dist/storybook.js.map +1 -0
  424. package/dist/structured-data.d.ts +25 -0
  425. package/dist/structured-data.d.ts.map +1 -0
  426. package/dist/structured-data.js +164 -0
  427. package/dist/structured-data.js.map +1 -0
  428. package/dist/svg-audit.d.ts +20 -0
  429. package/dist/svg-audit.d.ts.map +1 -0
  430. package/dist/svg-audit.js +213 -0
  431. package/dist/svg-audit.js.map +1 -0
  432. package/dist/table-audit.d.ts +18 -0
  433. package/dist/table-audit.d.ts.map +1 -0
  434. package/dist/table-audit.js +188 -0
  435. package/dist/table-audit.js.map +1 -0
  436. package/dist/teams-formatter.d.ts +66 -0
  437. package/dist/teams-formatter.d.ts.map +1 -0
  438. package/dist/teams-formatter.js +194 -0
  439. package/dist/teams-formatter.js.map +1 -0
  440. package/dist/third-party.d.ts +35 -0
  441. package/dist/third-party.d.ts.map +1 -0
  442. package/dist/third-party.js +175 -0
  443. package/dist/third-party.js.map +1 -0
  444. package/dist/tls.d.ts +33 -0
  445. package/dist/tls.d.ts.map +1 -0
  446. package/dist/tls.js +122 -0
  447. package/dist/tls.js.map +1 -0
  448. package/dist/touchtargets.d.ts +22 -0
  449. package/dist/touchtargets.d.ts.map +1 -0
  450. package/dist/touchtargets.js +80 -0
  451. package/dist/touchtargets.js.map +1 -0
  452. package/dist/tracker-sniff.d.ts +25 -0
  453. package/dist/tracker-sniff.d.ts.map +1 -0
  454. package/dist/tracker-sniff.js +355 -0
  455. package/dist/tracker-sniff.js.map +1 -0
  456. package/dist/types.d.ts +344 -1
  457. package/dist/types.d.ts.map +1 -1
  458. package/dist/visual-mask.d.ts +33 -0
  459. package/dist/visual-mask.d.ts.map +1 -0
  460. package/dist/visual-mask.js +102 -0
  461. package/dist/visual-mask.js.map +1 -0
  462. package/dist/visual-ssim.d.ts +26 -0
  463. package/dist/visual-ssim.d.ts.map +1 -0
  464. package/dist/visual-ssim.js +153 -0
  465. package/dist/visual-ssim.js.map +1 -0
  466. package/dist/watch-mode.d.ts +10 -0
  467. package/dist/watch-mode.d.ts.map +1 -0
  468. package/dist/watch-mode.js +156 -0
  469. package/dist/watch-mode.js.map +1 -0
  470. package/dist/web-worker-audit.d.ts +27 -0
  471. package/dist/web-worker-audit.d.ts.map +1 -0
  472. package/dist/web-worker-audit.js +324 -0
  473. package/dist/web-worker-audit.js.map +1 -0
  474. package/dist/webfonts.d.ts +26 -0
  475. package/dist/webfonts.d.ts.map +1 -0
  476. package/dist/webfonts.js +244 -0
  477. package/dist/webfonts.js.map +1 -0
  478. package/dist/webhook-reporter.d.ts +20 -0
  479. package/dist/webhook-reporter.d.ts.map +1 -0
  480. package/dist/webhook-reporter.js +124 -0
  481. package/dist/webhook-reporter.js.map +1 -0
  482. package/dist/websocket.d.ts +39 -0
  483. package/dist/websocket.d.ts.map +1 -0
  484. package/dist/websocket.js +233 -0
  485. package/dist/websocket.js.map +1 -0
  486. package/dist/worker-runtime.d.ts +129 -0
  487. package/dist/worker-runtime.d.ts.map +1 -0
  488. package/dist/worker-runtime.js +414 -0
  489. package/dist/worker-runtime.js.map +1 -0
  490. package/dist/zindex-audit.d.ts +28 -0
  491. package/dist/zindex-audit.d.ts.map +1 -0
  492. package/dist/zindex-audit.js +291 -0
  493. package/dist/zindex-audit.js.map +1 -0
  494. package/package.json +10 -2
package/dist/index.js CHANGED
@@ -13,6 +13,79 @@ import { notify } from './notify.js';
13
13
  import { AIHelper } from './ai.js';
14
14
  import { writeReport } from './report.js';
15
15
  import { r2StoreFromEnv } from './store.js';
16
+ import { runApiFlows } from './api.js';
17
+ import { checkRetireJs } from './retire.js';
18
+ import { checkDeadClicks } from './deadclicks.js';
19
+ import { auditTouchTargets } from './touchtargets.js';
20
+ import { auditKeyboard } from './keyboard.js';
21
+ import { captureLongTasks } from './longtasks.js';
22
+ import { captureClsTimeline } from './cls-timeline.js';
23
+ import { auditForms } from './forms-audit.js';
24
+ import { checkStructuredData } from './structured-data.js';
25
+ import { auditPassiveSecurity } from './passive-security.js';
26
+ import { attachConsoleCapture } from './console-errors.js';
27
+ import { auditSitemap } from './sitemap.js';
28
+ import { auditRedirects } from './redirects.js';
29
+ import { scanExposedPaths } from './exposed-paths.js';
30
+ import { auditTls } from './tls.js';
31
+ import { crawlSite } from './crawl.js';
32
+ import { analyzePage as analyzeContent, analyzeBatch as analyzeContentBatch } from './content-quality.js';
33
+ import { auditResourceHints } from './resource-hints.js';
34
+ import { checkMixedContent } from './mixed-content.js';
35
+ import { auditCompression } from './compression.js';
36
+ import { auditCacheHeaders } from './cache-headers.js';
37
+ import { auditCookieBanner } from './cookie-banner.js';
38
+ import { auditThirdParty } from './third-party.js';
39
+ import { analyzeBundles } from './bundle-size.js';
40
+ import { checkOpenGraph } from './open-graph.js';
41
+ import { auditRobots } from './robots-audit.js';
42
+ import { auditImages } from './image-audit.js';
43
+ import { auditWebfonts } from './webfonts.js';
44
+ import { auditMotionPrefs } from './motion-prefs.js';
45
+ import { auditServiceWorker } from './service-worker.js';
46
+ import { collectRUM } from './rum.js';
47
+ import { validateAmp } from './amp.js';
48
+ import { auditJsCoverage } from './js-coverage.js';
49
+ import { auditCssCoverage } from './css-coverage.js';
50
+ import { auditDomSize } from './dom-audit.js';
51
+ import { auditAria } from './aria-audit.js';
52
+ import { auditHeadings } from './heading-hierarchy.js';
53
+ import { auditLang } from './lang-audit.js';
54
+ import { auditProtocols } from './protocol-audit.js';
55
+ import { auditFontLoading } from './font-loading.js';
56
+ import { auditPrerender } from './prerender-audit.js';
57
+ import { auditHeadlessDetect } from './headless-detect.js';
58
+ import { auditAnimations } from './animation-audit.js';
59
+ import { auditEventListeners } from './event-listener-audit.js';
60
+ import { auditDarkMode } from './dark-mode-audit.js';
61
+ import { auditTables } from './table-audit.js';
62
+ import { auditSvgs } from './svg-audit.js';
63
+ import { auditMedia } from './media-audit.js';
64
+ import { auditReadingLevel } from './reading-level.js';
65
+ import { detectDeadImages } from './dead-images.js';
66
+ import { auditPagination } from './pagination-audit.js';
67
+ import { auditPrint } from './print-audit.js';
68
+ import { auditCanonical } from './canonical-audit.js';
69
+ import { auditSri } from './sri-audit.js';
70
+ import { auditWebWorkers } from './web-worker-audit.js';
71
+ import { detectOrphanAssets } from './orphan-assets.js';
72
+ import { auditInp } from './inp-audit.js';
73
+ import { auditLcpElement } from './lcp-element.js';
74
+ import { auditClsCulprit } from './cls-culprit.js';
75
+ import { auditHreflang } from './hreflang-audit.js';
76
+ import { auditCookieFlags } from './cookie-flags-audit.js';
77
+ import { auditFocusTrap } from './focus-trap-audit.js';
78
+ import { auditFavicons } from './favicon-audit.js';
79
+ import { auditClickjacking } from './clickjacking-audit.js';
80
+ import { extractCriticalCss } from './critical-css.js';
81
+ import { scanSourceMaps } from './sourcemap-scan.js';
82
+ import { scanSecrets } from './secret-scan.js';
83
+ import { sniffTrackers } from './tracker-sniff.js';
84
+ import { auditZIndex } from './zindex-audit.js';
85
+ import { auditHydration } from './hydration-audit.js';
86
+ import { auditStorage } from './storage-audit.js';
87
+ import { auditCsrf } from './csrf-audit.js';
88
+ import { auditErrorPages } from './error-page-audit.js';
16
89
  export * from './types.js';
17
90
  export { Driver, networkPresets } from './driver.js';
18
91
  export { AIHelper } from './ai.js';
@@ -22,6 +95,125 @@ export { checkPwa } from './pwa.js';
22
95
  export { checkSecurityHeaders } from './security.js';
23
96
  export { checkBudget } from './budget.js';
24
97
  export { notify } from './notify.js';
98
+ export { runApiFlows } from './api.js';
99
+ export { checkRetireJs } from './retire.js';
100
+ export { checkDeadClicks } from './deadclicks.js';
101
+ export { auditTouchTargets } from './touchtargets.js';
102
+ export { auditKeyboard } from './keyboard.js';
103
+ export { captureLongTasks } from './longtasks.js';
104
+ export { captureClsTimeline } from './cls-timeline.js';
105
+ export { auditForms } from './forms-audit.js';
106
+ export { checkStructuredData } from './structured-data.js';
107
+ export { auditPassiveSecurity } from './passive-security.js';
108
+ export { attachConsoleCapture } from './console-errors.js';
109
+ export { auditSitemap } from './sitemap.js';
110
+ export { auditRedirects } from './redirects.js';
111
+ export { scanExposedPaths } from './exposed-paths.js';
112
+ export { auditTls } from './tls.js';
113
+ export { crawlSite } from './crawl.js';
114
+ export { analyzePage as analyzeContent, analyzeBatch as analyzeContentBatch } from './content-quality.js';
115
+ export { auditResourceHints } from './resource-hints.js';
116
+ export { checkMixedContent } from './mixed-content.js';
117
+ export { auditCompression } from './compression.js';
118
+ export { auditCacheHeaders } from './cache-headers.js';
119
+ export { auditCookieBanner } from './cookie-banner.js';
120
+ export { auditThirdParty } from './third-party.js';
121
+ export { analyzeBundles } from './bundle-size.js';
122
+ export { checkOpenGraph } from './open-graph.js';
123
+ export { auditRobots } from './robots-audit.js';
124
+ export { auditImages } from './image-audit.js';
125
+ export { auditWebfonts } from './webfonts.js';
126
+ export { auditMotionPrefs } from './motion-prefs.js';
127
+ export { auditServiceWorker } from './service-worker.js';
128
+ export { collectRUM, rumClientScript } from './rum.js';
129
+ export { validateAmp } from './amp.js';
130
+ export { retryWithFlakeDetection, classifyFlakeRate, defaultIsTransient } from './flaky.js';
131
+ export { runGraphQLFlow } from './graphql.js';
132
+ export { runWebSocketFlow } from './websocket.js';
133
+ export { waitForEmail, extractLinks as extractEmailLinks, extractCode as extractEmailCode } from './mailbox.js';
134
+ export { parseFeature, featureToFlows, builtinSteps } from './bdd.js';
135
+ export { emitGitHubAnnotations, writeSummary as writeGitHubSummary } from './github-annotations.js';
136
+ export { auditJsCoverage } from './js-coverage.js';
137
+ export { auditCssCoverage } from './css-coverage.js';
138
+ export { auditDomSize } from './dom-audit.js';
139
+ export { auditAria } from './aria-audit.js';
140
+ export { auditHeadings } from './heading-hierarchy.js';
141
+ export { auditLang } from './lang-audit.js';
142
+ export { auditProtocols } from './protocol-audit.js';
143
+ export { auditFontLoading } from './font-loading.js';
144
+ export { auditPrerender } from './prerender-audit.js';
145
+ export { auditHeadlessDetect } from './headless-detect.js';
146
+ export { auditAnimations } from './animation-audit.js';
147
+ export { auditEventListeners } from './event-listener-audit.js';
148
+ export { runOpenApiContract } from './contract-openapi.js';
149
+ export { compareInspect } from './ab-compare.js';
150
+ export { runWatchMode } from './watch-mode.js';
151
+ export { postWebhookReport } from './webhook-reporter.js';
152
+ export { auditDarkMode } from './dark-mode-audit.js';
153
+ export { auditTables } from './table-audit.js';
154
+ export { auditSvgs } from './svg-audit.js';
155
+ export { auditMedia } from './media-audit.js';
156
+ export { auditReadingLevel } from './reading-level.js';
157
+ export { detectDeadImages } from './dead-images.js';
158
+ export { auditPagination } from './pagination-audit.js';
159
+ export { auditPrint } from './print-audit.js';
160
+ export { auditCanonical } from './canonical-audit.js';
161
+ export { compareSsim, ssimFromBuffers } from './visual-ssim.js';
162
+ export { resolveMaskRegions, takeMaskedScreenshot, applyMaskToPng, screenshotWithPlaywrightMask } from './visual-mask.js';
163
+ export { setCpuThrottling, clearCpuThrottling, applyCpuPreset, measureUnderThrottle } from './cpu-throttle.js';
164
+ export { listStories, captureStorybook } from './storybook.js';
165
+ export { triageFailure, triageBatch, TRIAGE_RULES } from './ai-triage.js';
166
+ export { generateFlow, scanInteractions, flowToSnippet } from './ai-codegen.js';
167
+ export { loadDriftDb, saveDriftDb, recordRun, shouldAutoApprove, detectRegression } from './baseline-drift.js';
168
+ export { generateAutoFixes, autoFixesToMarkdown } from './autofix.js';
169
+ export { toSlackBlocks, postSlackBlocks } from './slack-formatter.js';
170
+ export { toDiscordEmbed, postDiscordEmbed } from './discord-formatter.js';
171
+ export { toTeamsCard, postTeamsCard } from './teams-formatter.js';
172
+ export { runChaos } from './chaos.js';
173
+ export { runCrossBrowser } from './cross-browser.js';
174
+ export { convertCodegen, convertCodegenFile, flowToPlaywrightSnippet } from './codegen-converter.js';
175
+ export { installPrecommit, uninstallPrecommit, generateHookScript } from './precommit.js';
176
+ export { runInitWizard, generateConfigFile, generateWorkflowFile } from './init-wizard.js';
177
+ export { runWorkerRuntime, extractMeta, extractAssets } from './worker-runtime.js';
178
+ export { extractMetrics, toPrometheusText, toOtlpJson, pushOtlp } from './metrics-exporter.js';
179
+ export { generateConfigSchema, writeSchemaFile } from './json-schema.js';
180
+ export { parseShardArg, shardFlows, shardConfig, shardSummary } from './shard.js';
181
+ export { diffReports, formatDiff, loadReport, diffReportFiles } from './budget-diff.js';
182
+ export { loadHistory, renderHistoryHtml, writeHistoryHtml } from './history-timeline.js';
183
+ export { toPrComment, renderGithubComment, renderGitlabComment, renderBitbucketComment } from './pr-comment.js';
184
+ export { flowsToCsv, a11yToCsv, perfToCsv, visualToCsv, linksToCsv, consoleErrorsToCsv, summaryToCsv, writeAllCsvs } from './csv-exporter.js';
185
+ export { parseAssertion, resolveMetric, evaluateAssertions, formatAssertionFailures } from './assertions.js';
186
+ export { detectFlakiness, formatFlakyReport } from './flaky-detector.js';
187
+ export { renderBadge, statusBadge, a11yBadge, perfBadge, lcpBadge, visualBadge, writeBadges } from './badge.js';
188
+ export { fetchSitemapUrls, urlsToFlows, sitemapToFlows } from './sitemap-flows.js';
189
+ export { bisect, defaultRegressionOracle } from './bisect.js';
190
+ export { runFilteredA11y, filterViolationsByImpact, WCAG_TAG_GROUPS } from './a11y-filter.js';
191
+ export { ReporterRegistry, defaultReporterRegistry, runReporters, loadReporterFromPath, jsonFileReporter } from './reporter-plugin.js';
192
+ export { scanPageObject, renderPageObjectClass, generatePageObject } from './page-object.js';
193
+ export { retry, retryWithStats, computeBackoff } from './retry.js';
194
+ export { parseCron, nextFireTime, runSchedule } from './schedule.js';
195
+ export { loadBudgetFile, validateBudgetFile, applyBudget, mergeBudgets, discoverBudgetFile } from './budget-file.js';
196
+ export { auditInp } from './inp-audit.js';
197
+ export { auditLcpElement } from './lcp-element.js';
198
+ export { auditClsCulprit } from './cls-culprit.js';
199
+ export { auditHreflang } from './hreflang-audit.js';
200
+ export { auditCookieFlags } from './cookie-flags-audit.js';
201
+ export { auditFocusTrap } from './focus-trap-audit.js';
202
+ export { auditFavicons } from './favicon-audit.js';
203
+ export { auditClickjacking } from './clickjacking-audit.js';
204
+ export { extractCriticalCss } from './critical-css.js';
205
+ export { scanSourceMaps } from './sourcemap-scan.js';
206
+ export { scanSecrets } from './secret-scan.js';
207
+ export { sniffTrackers } from './tracker-sniff.js';
208
+ export { auditZIndex } from './zindex-audit.js';
209
+ export { auditHydration } from './hydration-audit.js';
210
+ export { auditStorage } from './storage-audit.js';
211
+ export { auditCsrf } from './csrf-audit.js';
212
+ export { auditErrorPages } from './error-page-audit.js';
213
+ export { parseHar, renderWaterfallHtml, writeWaterfallHtml } from './har-waterfall.js';
214
+ export { detectOrphanAssets } from './orphan-assets.js';
215
+ export { auditSri } from './sri-audit.js';
216
+ export { auditWebWorkers } from './web-worker-audit.js';
25
217
  export async function inspect(config) {
26
218
  const startedAt = new Date();
27
219
  const viewports = config.viewports ?? [{ name: 'desktop', width: 1280, height: 800 }];
@@ -38,13 +230,78 @@ export async function inspect(config) {
38
230
  const seoResults = [];
39
231
  const linkResults = [];
40
232
  const pwaResults = [];
233
+ const retireResults = [];
234
+ const deadClickResults = [];
235
+ const touchTargetResults = [];
236
+ const keyboardResults = [];
237
+ const longTasksResults = [];
238
+ const clsTimelineResults = [];
239
+ const formsResults = [];
240
+ const structuredDataResults = [];
241
+ const passiveSecurityResults = [];
242
+ const consoleErrorResults = [];
243
+ const pageContentInfos = [];
244
+ const resourceHintsResults = [];
245
+ const mixedContentResults = [];
246
+ const cacheHeadersResults = [];
247
+ const cookieBannerResults = [];
248
+ const thirdPartyResults = [];
249
+ const bundleSizeResults = [];
250
+ const openGraphResults = [];
251
+ const imageAuditResults = [];
252
+ const webfontsResults = [];
253
+ const motionPrefsResults = [];
254
+ const serviceWorkerResults = [];
255
+ const rumResults = [];
256
+ const ampResults = [];
257
+ const jsCoverageResults = [];
258
+ const cssCoverageResults = [];
259
+ const domSizeResults = [];
260
+ const ariaAuditResults = [];
261
+ const headingsResults = [];
262
+ const langAuditResults = [];
263
+ const protocolsResults = [];
264
+ const fontLoadingResults = [];
265
+ const prerenderAuditResults = [];
266
+ const headlessDetectResults = [];
267
+ const animationsResults = [];
268
+ const eventListenersResults = [];
269
+ const darkModeResults = [];
270
+ const tablesResults = [];
271
+ const svgsResults = [];
272
+ const mediaResults = [];
273
+ const readingLevelResults = [];
274
+ const deadImagesResults = [];
275
+ const paginationResults = [];
276
+ const printResults = [];
277
+ const canonicalResults = [];
278
+ const sriResults = [];
279
+ const webWorkersResults = [];
280
+ const orphanAssetsResults = [];
281
+ const inpResults = [];
282
+ const lcpElementResults = [];
283
+ const clsCulpritResults = [];
284
+ const hreflangResults = [];
285
+ const cookieFlagsResults = [];
286
+ const focusTrapResults = [];
287
+ const faviconResults = [];
288
+ const clickjackingResults = [];
289
+ const criticalCssResults = [];
290
+ const sourcemapScanResults = [];
291
+ const secretScanResults = [];
292
+ const trackerSniffResults = [];
293
+ const zIndexResults = [];
294
+ const hydrationResults = [];
295
+ const storageResults = [];
296
+ const csrfResults = [];
297
+ const errorPagesResults = [];
41
298
  let securityResult;
42
299
  let exploreResult;
43
300
  try {
44
301
  for (const vp of viewports) {
45
302
  await driver.launch({
46
303
  viewport: { width: vp.width, height: vp.height },
47
- headless: !config.headed,
304
+ headless: !config.headed && !config.debug,
48
305
  storageState: config.storageState,
49
306
  browser: config.browser,
50
307
  device: config.device,
@@ -55,6 +312,8 @@ export async function inspect(config) {
55
312
  recordVideo: config.video ? path.join(outputDir, 'video') : undefined,
56
313
  recordHar: config.har ? path.join(outputDir, 'trace.har') : undefined,
57
314
  trace: config.trace ? path.join(outputDir, 'trace.zip') : undefined,
315
+ slowMo: config.slowMo ?? (config.debug ? 500 : undefined),
316
+ mocks: config.mocks,
58
317
  });
59
318
  const ai = new AIHelper({
60
319
  model: config.ai?.model,
@@ -62,6 +321,7 @@ export async function inspect(config) {
62
321
  });
63
322
  const runOne = async (flow) => {
64
323
  const page = await driver.newPage();
324
+ const console = checks.consoleErrors ? attachConsoleCapture(page) : null;
65
325
  if (config.ai?.enabled)
66
326
  await ai.init(page);
67
327
  const flowResult = await runFlow(page, flow.name, flow.steps, ai);
@@ -77,9 +337,138 @@ export async function inspect(config) {
77
337
  ? await checkLinks(page, typeof checks.links === 'object' ? checks.links : {}).catch(() => undefined)
78
338
  : undefined;
79
339
  const pwaR = checks.pwa ? await checkPwa(page).catch(() => undefined) : undefined;
340
+ const retireR = checks.retire ? await checkRetireJs(page).catch(() => undefined) : undefined;
341
+ const touchR = checks.touchTargets
342
+ ? await auditTouchTargets(page, typeof checks.touchTargets === 'object' ? checks.touchTargets : {}).catch(() => undefined)
343
+ : undefined;
344
+ const keyboardR = checks.keyboard
345
+ ? await auditKeyboard(page, typeof checks.keyboard === 'object' ? checks.keyboard : {}).catch(() => undefined)
346
+ : undefined;
347
+ const longTasksR = checks.longTasks
348
+ ? await captureLongTasks(page, typeof checks.longTasks === 'object' ? checks.longTasks.durationMs : undefined).catch(() => undefined)
349
+ : undefined;
350
+ const clsR = checks.clsTimeline
351
+ ? await captureClsTimeline(page, typeof checks.clsTimeline === 'object' ? checks.clsTimeline.durationMs : undefined).catch(() => undefined)
352
+ : undefined;
353
+ const formsR = checks.forms ? await auditForms(page).catch(() => undefined) : undefined;
354
+ const structuredR = checks.structuredData ? await checkStructuredData(page).catch(() => undefined) : undefined;
355
+ const passiveSecR = checks.passiveSecurity ? await auditPassiveSecurity(page).catch(() => undefined) : undefined;
356
+ const contentR = checks.contentQuality
357
+ ? await analyzeContent(page, typeof checks.contentQuality === 'object' ? checks.contentQuality : {}).catch(() => undefined)
358
+ : undefined;
359
+ const deadR = checks.deadClicks
360
+ ? await checkDeadClicks(page, typeof checks.deadClicks === 'object' ? checks.deadClicks : {}).catch(() => undefined)
361
+ : undefined;
362
+ const resourceHintsR = checks.resourceHints ? await auditResourceHints(page).catch(() => undefined) : undefined;
363
+ const mixedContentR = checks.mixedContent ? await checkMixedContent(page).catch(() => undefined) : undefined;
364
+ const cacheHeadersR = checks.cacheHeaders ? await auditCacheHeaders(page).catch(() => undefined) : undefined;
365
+ const cookieBannerR = checks.cookieBanner ? await auditCookieBanner(page).catch(() => undefined) : undefined;
366
+ const thirdPartyR = checks.thirdParty ? await auditThirdParty(page).catch(() => undefined) : undefined;
367
+ const bundleSizeR = checks.bundleSize ? await analyzeBundles(page).catch(() => undefined) : undefined;
368
+ const openGraphR = checks.openGraph ? await checkOpenGraph(page).catch(() => undefined) : undefined;
369
+ const imageAuditR = checks.imageAudit ? await auditImages(page).catch(() => undefined) : undefined;
370
+ const webfontsR = checks.webfonts ? await auditWebfonts(page).catch(() => undefined) : undefined;
371
+ const motionPrefsR = checks.motionPrefs ? await auditMotionPrefs(page).catch(() => undefined) : undefined;
372
+ const swR = checks.serviceWorker ? await auditServiceWorker(page).catch(() => undefined) : undefined;
373
+ const rumR = checks.rum
374
+ ? await collectRUM(page, typeof checks.rum === 'object' ? checks.rum : {}).catch(() => undefined)
375
+ : undefined;
376
+ const ampR = checks.amp ? await validateAmp(page).catch(() => undefined) : undefined;
377
+ const jsCovR = checks.jsCoverage
378
+ ? await auditJsCoverage(page, typeof checks.jsCoverage === 'object' ? checks.jsCoverage : {}).catch(() => undefined)
379
+ : undefined;
380
+ const cssCovR = checks.cssCoverage
381
+ ? await auditCssCoverage(page, typeof checks.cssCoverage === 'object' ? checks.cssCoverage : {}).catch(() => undefined)
382
+ : undefined;
383
+ const domSizeR = checks.domSize
384
+ ? await auditDomSize(page, typeof checks.domSize === 'object' ? checks.domSize : {}).catch(() => undefined)
385
+ : undefined;
386
+ const ariaR = checks.ariaAudit ? await auditAria(page).catch(() => undefined) : undefined;
387
+ const headingsR = checks.headings ? await auditHeadings(page).catch(() => undefined) : undefined;
388
+ const langR = checks.langAudit ? await auditLang(page).catch(() => undefined) : undefined;
389
+ const protocolsR = checks.protocols ? await auditProtocols(page).catch(() => undefined) : undefined;
390
+ const fontLoadR = checks.fontLoading ? await auditFontLoading(page).catch(() => undefined) : undefined;
391
+ const prerenderR = checks.prerenderAudit ? await auditPrerender(page).catch(() => undefined) : undefined;
392
+ const headlessR = checks.headlessDetect ? await auditHeadlessDetect(page).catch(() => undefined) : undefined;
393
+ const animationsR = checks.animations ? await auditAnimations(page).catch(() => undefined) : undefined;
394
+ const eventListenersR = checks.eventListeners ? await auditEventListeners(page).catch(() => undefined) : undefined;
395
+ const darkModeR = checks.darkMode
396
+ ? await auditDarkMode(page, typeof checks.darkMode === 'object' ? checks.darkMode : {}).catch(() => undefined)
397
+ : undefined;
398
+ const tablesR = checks.tables ? await auditTables(page).catch(() => undefined) : undefined;
399
+ const svgsR = checks.svgs ? await auditSvgs(page).catch(() => undefined) : undefined;
400
+ const mediaR = checks.media ? await auditMedia(page).catch(() => undefined) : undefined;
401
+ const readingLevelR = checks.readingLevel
402
+ ? await auditReadingLevel(page, typeof checks.readingLevel === 'object' ? checks.readingLevel : {}).catch(() => undefined)
403
+ : undefined;
404
+ const deadImagesR = checks.deadImages ? await detectDeadImages(page).catch(() => undefined) : undefined;
405
+ const paginationR = checks.pagination
406
+ ? await auditPagination(page, typeof checks.pagination === 'object' ? checks.pagination : {}).catch(() => undefined)
407
+ : undefined;
408
+ const printR = checks.print
409
+ ? await auditPrint(page, typeof checks.print === 'object' ? checks.print : {}).catch(() => undefined)
410
+ : undefined;
411
+ const canonicalR = checks.canonical
412
+ ? await auditCanonical(page, typeof checks.canonical === 'object' ? checks.canonical : {}).catch(() => undefined)
413
+ : undefined;
414
+ const sriR = checks.sri ? await auditSri(page).catch(() => undefined) : undefined;
415
+ const webWorkersR = checks.webWorkers ? await auditWebWorkers(page).catch(() => undefined) : undefined;
416
+ const orphanAssetsR = checks.orphanAssets ? await detectOrphanAssets(page).catch(() => undefined) : undefined;
417
+ const inpR = checks.inp
418
+ ? await auditInp(page, typeof checks.inp === 'object' ? checks.inp : {}).catch(() => undefined)
419
+ : undefined;
420
+ const lcpElementR = checks.lcpElement ? await auditLcpElement(page).catch(() => undefined) : undefined;
421
+ const clsCulpritR = checks.clsCulprit
422
+ ? await auditClsCulprit(page, typeof checks.clsCulprit === 'object' ? checks.clsCulprit : {}).catch(() => undefined)
423
+ : undefined;
424
+ const hreflangR = checks.hreflang ? await auditHreflang(page).catch(() => undefined) : undefined;
425
+ const cookieFlagsR = checks.cookieFlags ? await auditCookieFlags(page, page.context()).catch(() => undefined) : undefined;
426
+ const focusTrapR = checks.focusTrap ? await auditFocusTrap(page).catch(() => undefined) : undefined;
427
+ const faviconR = checks.favicon ? await auditFavicons(page).catch(() => undefined) : undefined;
428
+ const clickjackingR = checks.clickjacking ? await auditClickjacking(page, page.context()).catch(() => undefined) : undefined;
429
+ const criticalCssR = checks.criticalCss ? await extractCriticalCss(page).catch(() => undefined) : undefined;
430
+ const sourcemapScanR = checks.sourcemapScan ? await scanSourceMaps(page).catch(() => undefined) : undefined;
431
+ const secretScanR = checks.secretScan ? await scanSecrets(page).catch(() => undefined) : undefined;
432
+ const trackerSniffR = checks.trackerSniff ? await sniffTrackers(page).catch(() => undefined) : undefined;
433
+ const zIndexR = checks.zIndex ? await auditZIndex(page).catch(() => undefined) : undefined;
434
+ const hydrationR = checks.hydration ? await auditHydration(page).catch(() => undefined) : undefined;
435
+ const storageR = checks.storage ? await auditStorage(page).catch(() => undefined) : undefined;
436
+ const csrfR = checks.csrf ? await auditCsrf(page, page.context()).catch(() => undefined) : undefined;
437
+ const errorPagesR = checks.errorPages ? await auditErrorPages(page.context(), config.url).catch(() => undefined) : undefined;
438
+ const consoleR = console ? console.result() : undefined;
439
+ if (console)
440
+ console.detach();
80
441
  if (!config.parallel)
81
442
  await page.close();
82
- return { flow: flowResult, a11y, visual, seo: seoR, links: linksR, pwa: pwaR };
443
+ return {
444
+ flow: flowResult, a11y, visual,
445
+ seo: seoR, links: linksR, pwa: pwaR,
446
+ retire: retireR, deadClicks: deadR, touchTargets: touchR, keyboard: keyboardR,
447
+ longTasks: longTasksR, clsTimeline: clsR, forms: formsR,
448
+ structuredData: structuredR, passiveSecurity: passiveSecR, consoleErrors: consoleR,
449
+ contentInfo: contentR,
450
+ resourceHints: resourceHintsR, mixedContent: mixedContentR,
451
+ cacheHeaders: cacheHeadersR, cookieBanner: cookieBannerR,
452
+ thirdParty: thirdPartyR, bundleSize: bundleSizeR,
453
+ openGraph: openGraphR, imageAudit: imageAuditR,
454
+ webfonts: webfontsR, motionPrefs: motionPrefsR,
455
+ serviceWorker: swR, rum: rumR, amp: ampR,
456
+ jsCoverage: jsCovR, cssCoverage: cssCovR, domSize: domSizeR,
457
+ ariaAudit: ariaR, headings: headingsR, langAudit: langR,
458
+ protocols: protocolsR, fontLoading: fontLoadR,
459
+ prerenderAudit: prerenderR, headlessDetect: headlessR,
460
+ animations: animationsR, eventListeners: eventListenersR,
461
+ darkMode: darkModeR, tables: tablesR, svgs: svgsR, media: mediaR,
462
+ readingLevel: readingLevelR, deadImages: deadImagesR,
463
+ pagination: paginationR, print: printR, canonical: canonicalR,
464
+ sri: sriR, webWorkers: webWorkersR, orphanAssets: orphanAssetsR,
465
+ inp: inpR, lcpElement: lcpElementR, clsCulprit: clsCulpritR,
466
+ hreflang: hreflangR, cookieFlags: cookieFlagsR, focusTrap: focusTrapR,
467
+ favicon: faviconR, clickjacking: clickjackingR, criticalCss: criticalCssR,
468
+ sourcemapScan: sourcemapScanR, secretScan: secretScanR, trackerSniff: trackerSniffR,
469
+ zIndex: zIndexR, hydration: hydrationR, storage: storageR,
470
+ csrf: csrfR, errorPages: errorPagesR,
471
+ };
83
472
  };
84
473
  const results = config.parallel ? await Promise.all(flows.map(runOne)) : [];
85
474
  if (!config.parallel)
@@ -97,6 +486,136 @@ export async function inspect(config) {
97
486
  linkResults.push(r.links);
98
487
  if (r.pwa)
99
488
  pwaResults.push(r.pwa);
489
+ if (r.retire)
490
+ retireResults.push(r.retire);
491
+ if (r.deadClicks)
492
+ deadClickResults.push(r.deadClicks);
493
+ if (r.touchTargets)
494
+ touchTargetResults.push(r.touchTargets);
495
+ if (r.keyboard)
496
+ keyboardResults.push(r.keyboard);
497
+ if (r.longTasks)
498
+ longTasksResults.push(r.longTasks);
499
+ if (r.clsTimeline)
500
+ clsTimelineResults.push(r.clsTimeline);
501
+ if (r.forms)
502
+ formsResults.push(r.forms);
503
+ if (r.structuredData)
504
+ structuredDataResults.push(r.structuredData);
505
+ if (r.passiveSecurity)
506
+ passiveSecurityResults.push(r.passiveSecurity);
507
+ if (r.consoleErrors)
508
+ consoleErrorResults.push(r.consoleErrors);
509
+ if (r.contentInfo)
510
+ pageContentInfos.push(r.contentInfo);
511
+ if (r.resourceHints)
512
+ resourceHintsResults.push(r.resourceHints);
513
+ if (r.mixedContent)
514
+ mixedContentResults.push(r.mixedContent);
515
+ if (r.cacheHeaders)
516
+ cacheHeadersResults.push(r.cacheHeaders);
517
+ if (r.cookieBanner)
518
+ cookieBannerResults.push(r.cookieBanner);
519
+ if (r.thirdParty)
520
+ thirdPartyResults.push(r.thirdParty);
521
+ if (r.bundleSize)
522
+ bundleSizeResults.push(r.bundleSize);
523
+ if (r.openGraph)
524
+ openGraphResults.push(r.openGraph);
525
+ if (r.imageAudit)
526
+ imageAuditResults.push(r.imageAudit);
527
+ if (r.webfonts)
528
+ webfontsResults.push(r.webfonts);
529
+ if (r.motionPrefs)
530
+ motionPrefsResults.push(r.motionPrefs);
531
+ if (r.serviceWorker)
532
+ serviceWorkerResults.push(r.serviceWorker);
533
+ if (r.rum)
534
+ rumResults.push(r.rum);
535
+ if (r.amp)
536
+ ampResults.push(r.amp);
537
+ if (r.jsCoverage)
538
+ jsCoverageResults.push(r.jsCoverage);
539
+ if (r.cssCoverage)
540
+ cssCoverageResults.push(r.cssCoverage);
541
+ if (r.domSize)
542
+ domSizeResults.push(r.domSize);
543
+ if (r.ariaAudit)
544
+ ariaAuditResults.push(r.ariaAudit);
545
+ if (r.headings)
546
+ headingsResults.push(r.headings);
547
+ if (r.langAudit)
548
+ langAuditResults.push(r.langAudit);
549
+ if (r.protocols)
550
+ protocolsResults.push(r.protocols);
551
+ if (r.fontLoading)
552
+ fontLoadingResults.push(r.fontLoading);
553
+ if (r.prerenderAudit)
554
+ prerenderAuditResults.push(r.prerenderAudit);
555
+ if (r.headlessDetect)
556
+ headlessDetectResults.push(r.headlessDetect);
557
+ if (r.animations)
558
+ animationsResults.push(r.animations);
559
+ if (r.eventListeners)
560
+ eventListenersResults.push(r.eventListeners);
561
+ if (r.darkMode)
562
+ darkModeResults.push(r.darkMode);
563
+ if (r.tables)
564
+ tablesResults.push(r.tables);
565
+ if (r.svgs)
566
+ svgsResults.push(r.svgs);
567
+ if (r.media)
568
+ mediaResults.push(r.media);
569
+ if (r.readingLevel)
570
+ readingLevelResults.push(r.readingLevel);
571
+ if (r.deadImages)
572
+ deadImagesResults.push(r.deadImages);
573
+ if (r.pagination)
574
+ paginationResults.push(r.pagination);
575
+ if (r.print)
576
+ printResults.push(r.print);
577
+ if (r.canonical)
578
+ canonicalResults.push(r.canonical);
579
+ if (r.sri)
580
+ sriResults.push(r.sri);
581
+ if (r.webWorkers)
582
+ webWorkersResults.push(r.webWorkers);
583
+ if (r.orphanAssets)
584
+ orphanAssetsResults.push(r.orphanAssets);
585
+ if (r.inp)
586
+ inpResults.push(r.inp);
587
+ if (r.lcpElement)
588
+ lcpElementResults.push(r.lcpElement);
589
+ if (r.clsCulprit)
590
+ clsCulpritResults.push(r.clsCulprit);
591
+ if (r.hreflang)
592
+ hreflangResults.push(r.hreflang);
593
+ if (r.cookieFlags)
594
+ cookieFlagsResults.push(r.cookieFlags);
595
+ if (r.focusTrap)
596
+ focusTrapResults.push(r.focusTrap);
597
+ if (r.favicon)
598
+ faviconResults.push(r.favicon);
599
+ if (r.clickjacking)
600
+ clickjackingResults.push(r.clickjacking);
601
+ if (r.criticalCss)
602
+ criticalCssResults.push(r.criticalCss);
603
+ if (r.sourcemapScan)
604
+ sourcemapScanResults.push(r.sourcemapScan);
605
+ if (r.secretScan)
606
+ secretScanResults.push(r.secretScan);
607
+ if (r.trackerSniff)
608
+ trackerSniffResults.push(r.trackerSniff);
609
+ if (r.zIndex)
610
+ zIndexResults.push(r.zIndex);
611
+ if (r.hydration)
612
+ hydrationResults.push(r.hydration);
613
+ if (r.storage)
614
+ storageResults.push(r.storage);
615
+ if (r.csrf)
616
+ csrfResults.push(r.csrf);
617
+ if (r.errorPages)
618
+ errorPagesResults.push(r.errorPages);
100
619
  }
101
620
  if (checks.perf) {
102
621
  const port = driver.cdpPort;
@@ -124,12 +643,96 @@ export async function inspect(config) {
124
643
  finally {
125
644
  await driver.close();
126
645
  }
646
+ let sitemapResult;
647
+ let redirectsResult;
648
+ let tlsResult;
649
+ let exposedPathsResult;
650
+ let crawlResult;
651
+ let contentQualityResult;
652
+ if (checks.sitemap) {
653
+ sitemapResult = await auditSitemap(config.url, typeof checks.sitemap === 'object' ? checks.sitemap : {}).catch(() => undefined);
654
+ }
655
+ if (checks.redirects) {
656
+ redirectsResult = await auditRedirects(config.url, typeof checks.redirects === 'object' ? checks.redirects : {}).catch(() => undefined);
657
+ }
658
+ if (checks.tls) {
659
+ tlsResult = await auditTls(config.url).catch(() => undefined);
660
+ }
661
+ if (checks.exposedPaths) {
662
+ exposedPathsResult = await scanExposedPaths(config.url, typeof checks.exposedPaths === 'object' ? checks.exposedPaths : {}).catch(() => undefined);
663
+ }
664
+ if (checks.crawl) {
665
+ crawlResult = await crawlSite(config.url, typeof checks.crawl === 'object' ? checks.crawl : {}).catch(() => undefined);
666
+ }
667
+ if (checks.contentQuality && pageContentInfos.length) {
668
+ contentQualityResult = analyzeContentBatch(pageContentInfos, typeof checks.contentQuality === 'object' ? checks.contentQuality : {});
669
+ }
670
+ let compressionResult;
671
+ let robotsAuditResult;
672
+ if (checks.compression) {
673
+ compressionResult = await auditCompression(config.url).catch(() => undefined);
674
+ }
675
+ if (checks.robotsAudit) {
676
+ robotsAuditResult = await auditRobots(config.url).catch(() => undefined);
677
+ }
127
678
  const finishedAt = new Date();
128
679
  const baselinePassed = flowResults.every((f) => f.passed) &&
129
680
  a11yResults.every((a) => a.violations.filter((v) => v.impact === 'critical' || v.impact === 'serious').length === 0) &&
130
681
  visualResults.every((v) => v.passed) &&
131
682
  (!checks.links || (linkResults ?? []).every((l) => l.passed)) &&
132
- (!checks.security || securityResult?.passed !== false);
683
+ (!checks.security || securityResult?.passed !== false) &&
684
+ retireResults.every((r) => r.passed !== false) &&
685
+ deadClickResults.every((r) => r.passed !== false) &&
686
+ touchTargetResults.every((r) => r.passed !== false) &&
687
+ keyboardResults.every((r) => r.passed !== false) &&
688
+ longTasksResults.every((r) => r.passed !== false) &&
689
+ clsTimelineResults.every((r) => r.passed !== false) &&
690
+ formsResults.every((r) => r.passed !== false) &&
691
+ structuredDataResults.every((r) => r.passed !== false) &&
692
+ passiveSecurityResults.every((r) => r.passed !== false) &&
693
+ consoleErrorResults.every((r) => r.passed !== false) &&
694
+ (sitemapResult === undefined || sitemapResult.passed !== false) &&
695
+ (redirectsResult === undefined || redirectsResult.passed !== false) &&
696
+ (tlsResult === undefined || tlsResult.passed !== false) &&
697
+ (exposedPathsResult === undefined || exposedPathsResult.passed !== false) &&
698
+ (crawlResult === undefined || crawlResult.passed !== false) &&
699
+ (contentQualityResult === undefined || contentQualityResult.passed !== false) &&
700
+ resourceHintsResults.every((r) => r.passed !== false) &&
701
+ mixedContentResults.every((r) => r.passed !== false) &&
702
+ cacheHeadersResults.every((r) => r.passed !== false) &&
703
+ cookieBannerResults.every((r) => r.passed !== false) &&
704
+ thirdPartyResults.every((r) => r.passed !== false) &&
705
+ bundleSizeResults.every((r) => r.passed !== false) &&
706
+ openGraphResults.every((r) => r.passed !== false) &&
707
+ imageAuditResults.every((r) => r.passed !== false) &&
708
+ webfontsResults.every((r) => r.passed !== false) &&
709
+ motionPrefsResults.every((r) => r.passed !== false) &&
710
+ serviceWorkerResults.every((r) => r.passed !== false) &&
711
+ rumResults.every((r) => r.passed !== false) &&
712
+ ampResults.every((r) => r.passed !== false) &&
713
+ jsCoverageResults.every((r) => r.passed !== false) &&
714
+ cssCoverageResults.every((r) => r.passed !== false) &&
715
+ domSizeResults.every((r) => r.passed !== false) &&
716
+ ariaAuditResults.every((r) => r.passed !== false) &&
717
+ headingsResults.every((r) => r.passed !== false) &&
718
+ langAuditResults.every((r) => r.passed !== false) &&
719
+ protocolsResults.every((r) => r.passed !== false) &&
720
+ fontLoadingResults.every((r) => r.passed !== false) &&
721
+ prerenderAuditResults.every((r) => r.passed !== false) &&
722
+ headlessDetectResults.every((r) => r.passed !== false) &&
723
+ animationsResults.every((r) => r.passed !== false) &&
724
+ eventListenersResults.every((r) => r.passed !== false) &&
725
+ darkModeResults.every((r) => r.passed !== false) &&
726
+ tablesResults.every((r) => r.passed !== false) &&
727
+ svgsResults.every((r) => r.passed !== false) &&
728
+ mediaResults.every((r) => r.passed !== false) &&
729
+ readingLevelResults.every((r) => r.passed !== false) &&
730
+ deadImagesResults.every((r) => r.passed !== false) &&
731
+ paginationResults.every((r) => r.passed !== false) &&
732
+ printResults.every((r) => r.passed !== false) &&
733
+ canonicalResults.every((r) => r.passed !== false) &&
734
+ (compressionResult === undefined || compressionResult.passed !== false) &&
735
+ (robotsAuditResult === undefined || robotsAuditResult.passed !== false);
133
736
  const result = {
134
737
  url: config.url,
135
738
  startedAt: startedAt.toISOString(),
@@ -144,8 +747,86 @@ export async function inspect(config) {
144
747
  links: checks.links ? linkResults : undefined,
145
748
  pwa: checks.pwa ? pwaResults : undefined,
146
749
  security: securityResult,
750
+ retire: checks.retire ? retireResults : undefined,
751
+ deadClicks: checks.deadClicks ? deadClickResults : undefined,
752
+ touchTargets: checks.touchTargets ? touchTargetResults : undefined,
753
+ keyboard: checks.keyboard ? keyboardResults : undefined,
754
+ longTasks: checks.longTasks ? longTasksResults : undefined,
755
+ clsTimeline: checks.clsTimeline ? clsTimelineResults : undefined,
756
+ forms: checks.forms ? formsResults : undefined,
757
+ structuredData: checks.structuredData ? structuredDataResults : undefined,
758
+ passiveSecurity: checks.passiveSecurity ? passiveSecurityResults : undefined,
759
+ consoleErrors: checks.consoleErrors ? consoleErrorResults : undefined,
760
+ sitemap: sitemapResult,
761
+ redirects: redirectsResult,
762
+ exposedPaths: exposedPathsResult,
763
+ tls: tlsResult,
764
+ crawl: crawlResult,
765
+ contentQuality: contentQualityResult,
766
+ resourceHints: checks.resourceHints ? resourceHintsResults : undefined,
767
+ mixedContent: checks.mixedContent ? mixedContentResults : undefined,
768
+ compression: compressionResult,
769
+ cacheHeaders: checks.cacheHeaders ? cacheHeadersResults : undefined,
770
+ cookieBanner: checks.cookieBanner ? cookieBannerResults : undefined,
771
+ thirdParty: checks.thirdParty ? thirdPartyResults : undefined,
772
+ bundleSize: checks.bundleSize ? bundleSizeResults : undefined,
773
+ openGraph: checks.openGraph ? openGraphResults : undefined,
774
+ robotsAudit: robotsAuditResult,
775
+ imageAudit: checks.imageAudit ? imageAuditResults : undefined,
776
+ webfonts: checks.webfonts ? webfontsResults : undefined,
777
+ motionPrefs: checks.motionPrefs ? motionPrefsResults : undefined,
778
+ serviceWorker: checks.serviceWorker ? serviceWorkerResults : undefined,
779
+ rum: checks.rum ? rumResults : undefined,
780
+ amp: checks.amp ? ampResults : undefined,
781
+ jsCoverage: checks.jsCoverage ? jsCoverageResults : undefined,
782
+ cssCoverage: checks.cssCoverage ? cssCoverageResults : undefined,
783
+ domSize: checks.domSize ? domSizeResults : undefined,
784
+ ariaAudit: checks.ariaAudit ? ariaAuditResults : undefined,
785
+ headings: checks.headings ? headingsResults : undefined,
786
+ langAudit: checks.langAudit ? langAuditResults : undefined,
787
+ protocols: checks.protocols ? protocolsResults : undefined,
788
+ fontLoading: checks.fontLoading ? fontLoadingResults : undefined,
789
+ prerenderAudit: checks.prerenderAudit ? prerenderAuditResults : undefined,
790
+ headlessDetect: checks.headlessDetect ? headlessDetectResults : undefined,
791
+ animations: checks.animations ? animationsResults : undefined,
792
+ eventListeners: checks.eventListeners ? eventListenersResults : undefined,
793
+ darkMode: checks.darkMode ? darkModeResults : undefined,
794
+ tables: checks.tables ? tablesResults : undefined,
795
+ svgs: checks.svgs ? svgsResults : undefined,
796
+ media: checks.media ? mediaResults : undefined,
797
+ readingLevel: checks.readingLevel ? readingLevelResults : undefined,
798
+ deadImages: checks.deadImages ? deadImagesResults : undefined,
799
+ pagination: checks.pagination ? paginationResults : undefined,
800
+ print: checks.print ? printResults : undefined,
801
+ canonical: checks.canonical ? canonicalResults : undefined,
802
+ sri: checks.sri ? sriResults : undefined,
803
+ webWorkers: checks.webWorkers ? webWorkersResults : undefined,
804
+ orphanAssets: checks.orphanAssets ? orphanAssetsResults : undefined,
805
+ inp: checks.inp ? inpResults : undefined,
806
+ lcpElement: checks.lcpElement ? lcpElementResults : undefined,
807
+ clsCulprit: checks.clsCulprit ? clsCulpritResults : undefined,
808
+ hreflang: checks.hreflang ? hreflangResults : undefined,
809
+ cookieFlags: checks.cookieFlags ? cookieFlagsResults : undefined,
810
+ focusTrap: checks.focusTrap ? focusTrapResults : undefined,
811
+ favicon: checks.favicon ? faviconResults : undefined,
812
+ clickjacking: checks.clickjacking ? clickjackingResults : undefined,
813
+ criticalCss: checks.criticalCss ? criticalCssResults : undefined,
814
+ sourcemapScan: checks.sourcemapScan ? sourcemapScanResults : undefined,
815
+ secretScan: checks.secretScan ? secretScanResults : undefined,
816
+ trackerSniff: checks.trackerSniff ? trackerSniffResults : undefined,
817
+ zIndex: checks.zIndex ? zIndexResults : undefined,
818
+ hydration: checks.hydration ? hydrationResults : undefined,
819
+ storage: checks.storage ? storageResults : undefined,
820
+ csrf: checks.csrf ? csrfResults : undefined,
821
+ errorPages: checks.errorPages ? errorPagesResults : undefined,
147
822
  passed: baselinePassed,
148
823
  };
824
+ if (config.apiFlows?.length) {
825
+ const apiResults = await runApiFlows(config.apiFlows).catch(() => []);
826
+ result.apiFlows = apiResults;
827
+ if (apiResults.some((r) => !r.passed))
828
+ result.passed = false;
829
+ }
149
830
  if (config.budget) {
150
831
  const violations = checkBudget(result, config.budget);
151
832
  result.budget = violations;
@@ -207,6 +888,148 @@ async function runStep(page, step, ai) {
207
888
  if (!ok)
208
889
  throw new Error(`AI step failed: ${step.ai}`);
209
890
  }
891
+ else if ('drag' in step) {
892
+ await page.dragAndDrop(step.drag.from, step.drag.to);
893
+ }
894
+ else if ('upload' in step) {
895
+ await page.setInputFiles(step.upload.selector, step.upload.files);
896
+ }
897
+ else if ('dialog' in step) {
898
+ const d = step.dialog;
899
+ page.once('dialog', (dlg) => {
900
+ const accept = typeof d === 'string' ? d === 'accept' : (d.accept ?? true);
901
+ const text = typeof d === 'object' ? d.text : undefined;
902
+ if (accept)
903
+ dlg.accept(text);
904
+ else
905
+ dlg.dismiss();
906
+ });
907
+ }
908
+ else if ('scroll' in step) {
909
+ const s = step.scroll;
910
+ if (s.selector)
911
+ await page.locator(s.selector).scrollIntoViewIfNeeded();
912
+ else
913
+ await page.evaluate(({ x, y }) => window.scrollTo(x ?? 0, y ?? 0), { x: s.x, y: s.y });
914
+ }
915
+ else if ('select' in step) {
916
+ await page.selectOption(step.select.selector, step.select.value);
917
+ }
918
+ else if ('key' in step) {
919
+ await page.keyboard.press(step.key);
920
+ }
921
+ else if ('eval' in step) {
922
+ await page.evaluate(step.eval);
923
+ }
924
+ else if ('waitForResponse' in step) {
925
+ const s = step.waitForResponse;
926
+ const urlPat = typeof s === 'string' ? s : s.url;
927
+ await page.waitForResponse((res) => {
928
+ const matches = res.url().includes(urlPat) || new RegExp(urlPat).test(res.url());
929
+ if (typeof s === 'object' && s.status)
930
+ return matches && res.status() === s.status;
931
+ return matches;
932
+ });
933
+ }
934
+ else if ('waitForRequest' in step) {
935
+ await page.waitForRequest((req) => req.url().includes(step.waitForRequest) || new RegExp(step.waitForRequest).test(req.url()));
936
+ }
937
+ else if ('hover' in step) {
938
+ await page.hover(step.hover);
939
+ }
940
+ else if ('check' in step) {
941
+ await page.check(step.check);
942
+ }
943
+ else if ('uncheck' in step) {
944
+ await page.uncheck(step.uncheck);
945
+ }
946
+ else if ('focus' in step) {
947
+ await page.focus(step.focus);
948
+ }
949
+ else if ('blur' in step) {
950
+ await page.locator(step.blur).evaluate((el) => el.blur());
951
+ }
952
+ else if ('reload' in step) {
953
+ await page.reload({ waitUntil: 'domcontentloaded' });
954
+ }
955
+ else if ('back' in step) {
956
+ await page.goBack({ waitUntil: 'domcontentloaded' });
957
+ }
958
+ else if ('forward' in step) {
959
+ await page.goForward({ waitUntil: 'domcontentloaded' });
960
+ }
961
+ else if ('newTab' in step) {
962
+ const ctx = page.context();
963
+ const p = await ctx.newPage();
964
+ await p.goto(step.newTab, { waitUntil: 'domcontentloaded' });
965
+ }
966
+ else if ('switchTab' in step) {
967
+ const pages = page.context().pages();
968
+ const target = typeof step.switchTab === 'number'
969
+ ? pages[step.switchTab]
970
+ : pages.find((p) => p.url().includes(String(step.switchTab)));
971
+ if (target)
972
+ await target.bringToFront();
973
+ }
974
+ else if ('closeTab' in step) {
975
+ await page.close();
976
+ }
977
+ else if ('iframe' in step) {
978
+ const frame = page.frameLocator(step.iframe.selector);
979
+ for (const s of step.iframe.steps) {
980
+ await runIframeStep(frame, s);
981
+ }
982
+ }
983
+ else if ('sleep' in step) {
984
+ await page.waitForTimeout(step.sleep);
985
+ }
986
+ else if ('waitForDownload' in step) {
987
+ const [dl] = await Promise.all([page.waitForEvent('download'), page.click(step.waitForDownload.trigger)]);
988
+ await dl.saveAs(step.waitForDownload.saveAs);
989
+ }
990
+ else if ('waitForPopup' in step) {
991
+ const [popup] = await Promise.all([page.waitForEvent('popup'), page.click(step.waitForPopup.trigger)]);
992
+ await popup.waitForLoadState('domcontentloaded');
993
+ if (step.waitForPopup.switchTo)
994
+ await popup.bringToFront();
995
+ }
996
+ else if ('cookie' in step) {
997
+ const c = step.cookie;
998
+ const url = new URL(page.url());
999
+ await page.context().addCookies([{
1000
+ name: c.name,
1001
+ value: c.value,
1002
+ domain: c.domain ?? url.hostname,
1003
+ path: c.path ?? '/',
1004
+ expires: c.expires,
1005
+ httpOnly: c.httpOnly,
1006
+ secure: c.secure,
1007
+ sameSite: c.sameSite,
1008
+ }]);
1009
+ }
1010
+ else if ('clearCookies' in step) {
1011
+ await page.context().clearCookies();
1012
+ }
1013
+ }
1014
+ async function runIframeStep(frame, step) {
1015
+ if ('click' in step)
1016
+ await frame.locator(step.click).click();
1017
+ else if ('fill' in step)
1018
+ await frame.locator(step.fill.selector).fill(step.fill.text);
1019
+ else if ('type' in step)
1020
+ await frame.locator(step.type.selector).type(step.type.text);
1021
+ else if ('waitFor' in step)
1022
+ await frame.locator(step.waitFor).waitFor();
1023
+ else if ('hover' in step)
1024
+ await frame.locator(step.hover).hover();
1025
+ else if ('check' in step)
1026
+ await frame.locator(step.check).check();
1027
+ else if ('uncheck' in step)
1028
+ await frame.locator(step.uncheck).uncheck();
1029
+ else if ('select' in step)
1030
+ await frame.locator(step.select.selector).selectOption(step.select.value);
1031
+ else if ('key' in step)
1032
+ await frame.locator('body').press(step.key);
210
1033
  }
211
1034
  function emptyA11y(url, e) {
212
1035
  return { page: url, violations: [], passed: false, ...{ error: String(e) } };