uxinspect 0.2.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 (493) 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 +201 -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.map +1 -1
  173. package/dist/driver.js +10 -0
  174. package/dist/driver.js.map +1 -1
  175. package/dist/error-page-audit.d.ts +26 -0
  176. package/dist/error-page-audit.d.ts.map +1 -0
  177. package/dist/error-page-audit.js +219 -0
  178. package/dist/error-page-audit.js.map +1 -0
  179. package/dist/event-listener-audit.d.ts +22 -0
  180. package/dist/event-listener-audit.d.ts.map +1 -0
  181. package/dist/event-listener-audit.js +156 -0
  182. package/dist/event-listener-audit.js.map +1 -0
  183. package/dist/exposed-paths.d.ts +21 -0
  184. package/dist/exposed-paths.d.ts.map +1 -0
  185. package/dist/exposed-paths.js +116 -0
  186. package/dist/exposed-paths.js.map +1 -0
  187. package/dist/favicon-audit.d.ts +28 -0
  188. package/dist/favicon-audit.d.ts.map +1 -0
  189. package/dist/favicon-audit.js +358 -0
  190. package/dist/favicon-audit.js.map +1 -0
  191. package/dist/flaky-detector.d.ts +32 -0
  192. package/dist/flaky-detector.d.ts.map +1 -0
  193. package/dist/flaky-detector.js +254 -0
  194. package/dist/flaky-detector.js.map +1 -0
  195. package/dist/flaky.d.ts +28 -0
  196. package/dist/flaky.d.ts.map +1 -0
  197. package/dist/flaky.js +106 -0
  198. package/dist/flaky.js.map +1 -0
  199. package/dist/focus-trap-audit.d.ts +29 -0
  200. package/dist/focus-trap-audit.d.ts.map +1 -0
  201. package/dist/focus-trap-audit.js +285 -0
  202. package/dist/focus-trap-audit.js.map +1 -0
  203. package/dist/font-loading.d.ts +29 -0
  204. package/dist/font-loading.d.ts.map +1 -0
  205. package/dist/font-loading.js +216 -0
  206. package/dist/font-loading.js.map +1 -0
  207. package/dist/forms-audit.d.ts +23 -0
  208. package/dist/forms-audit.d.ts.map +1 -0
  209. package/dist/forms-audit.js +147 -0
  210. package/dist/forms-audit.js.map +1 -0
  211. package/dist/github-annotations.d.ts +17 -0
  212. package/dist/github-annotations.d.ts.map +1 -0
  213. package/dist/github-annotations.js +264 -0
  214. package/dist/github-annotations.js.map +1 -0
  215. package/dist/graphql.d.ts +60 -0
  216. package/dist/graphql.d.ts.map +1 -0
  217. package/dist/graphql.js +188 -0
  218. package/dist/graphql.js.map +1 -0
  219. package/dist/har-waterfall.d.ts +37 -0
  220. package/dist/har-waterfall.d.ts.map +1 -0
  221. package/dist/har-waterfall.js +376 -0
  222. package/dist/har-waterfall.js.map +1 -0
  223. package/dist/heading-hierarchy.d.ts +20 -0
  224. package/dist/heading-hierarchy.d.ts.map +1 -0
  225. package/dist/heading-hierarchy.js +112 -0
  226. package/dist/heading-hierarchy.js.map +1 -0
  227. package/dist/headless-detect.d.ts +22 -0
  228. package/dist/headless-detect.d.ts.map +1 -0
  229. package/dist/headless-detect.js +167 -0
  230. package/dist/headless-detect.js.map +1 -0
  231. package/dist/history-timeline.d.ts +13 -0
  232. package/dist/history-timeline.d.ts.map +1 -0
  233. package/dist/history-timeline.js +327 -0
  234. package/dist/history-timeline.js.map +1 -0
  235. package/dist/hreflang-audit.d.ts +26 -0
  236. package/dist/hreflang-audit.d.ts.map +1 -0
  237. package/dist/hreflang-audit.js +273 -0
  238. package/dist/hreflang-audit.js.map +1 -0
  239. package/dist/hydration-audit.d.ts +21 -0
  240. package/dist/hydration-audit.d.ts.map +1 -0
  241. package/dist/hydration-audit.js +277 -0
  242. package/dist/hydration-audit.js.map +1 -0
  243. package/dist/image-audit.d.ts +41 -0
  244. package/dist/image-audit.d.ts.map +1 -0
  245. package/dist/image-audit.js +229 -0
  246. package/dist/image-audit.js.map +1 -0
  247. package/dist/index.d.ts +119 -0
  248. package/dist/index.d.ts.map +1 -1
  249. package/dist/index.js +708 -2
  250. package/dist/index.js.map +1 -1
  251. package/dist/init-wizard.d.ts +33 -0
  252. package/dist/init-wizard.d.ts.map +1 -0
  253. package/dist/init-wizard.js +289 -0
  254. package/dist/init-wizard.js.map +1 -0
  255. package/dist/inp-audit.d.ts +26 -0
  256. package/dist/inp-audit.d.ts.map +1 -0
  257. package/dist/inp-audit.js +202 -0
  258. package/dist/inp-audit.js.map +1 -0
  259. package/dist/js-coverage.d.ts +20 -0
  260. package/dist/js-coverage.d.ts.map +1 -0
  261. package/dist/js-coverage.js +81 -0
  262. package/dist/js-coverage.js.map +1 -0
  263. package/dist/json-schema.d.ts +27 -0
  264. package/dist/json-schema.d.ts.map +1 -0
  265. package/dist/json-schema.js +284 -0
  266. package/dist/json-schema.js.map +1 -0
  267. package/dist/keyboard.d.ts +21 -0
  268. package/dist/keyboard.d.ts.map +1 -0
  269. package/dist/keyboard.js +119 -0
  270. package/dist/keyboard.js.map +1 -0
  271. package/dist/lang-audit.d.ts +24 -0
  272. package/dist/lang-audit.d.ts.map +1 -0
  273. package/dist/lang-audit.js +141 -0
  274. package/dist/lang-audit.js.map +1 -0
  275. package/dist/lcp-element.d.ts +22 -0
  276. package/dist/lcp-element.d.ts.map +1 -0
  277. package/dist/lcp-element.js +240 -0
  278. package/dist/lcp-element.js.map +1 -0
  279. package/dist/longtasks.d.ts +38 -0
  280. package/dist/longtasks.d.ts.map +1 -0
  281. package/dist/longtasks.js +97 -0
  282. package/dist/longtasks.js.map +1 -0
  283. package/dist/mailbox.d.ts +35 -0
  284. package/dist/mailbox.d.ts.map +1 -0
  285. package/dist/mailbox.js +207 -0
  286. package/dist/mailbox.js.map +1 -0
  287. package/dist/media-audit.d.ts +20 -0
  288. package/dist/media-audit.d.ts.map +1 -0
  289. package/dist/media-audit.js +182 -0
  290. package/dist/media-audit.js.map +1 -0
  291. package/dist/metrics-exporter.d.ts +23 -0
  292. package/dist/metrics-exporter.d.ts.map +1 -0
  293. package/dist/metrics-exporter.js +297 -0
  294. package/dist/metrics-exporter.js.map +1 -0
  295. package/dist/mixed-content.d.ts +19 -0
  296. package/dist/mixed-content.d.ts.map +1 -0
  297. package/dist/mixed-content.js +86 -0
  298. package/dist/mixed-content.js.map +1 -0
  299. package/dist/motion-prefs.d.ts +21 -0
  300. package/dist/motion-prefs.d.ts.map +1 -0
  301. package/dist/motion-prefs.js +170 -0
  302. package/dist/motion-prefs.js.map +1 -0
  303. package/dist/open-graph.d.ts +40 -0
  304. package/dist/open-graph.d.ts.map +1 -0
  305. package/dist/open-graph.js +200 -0
  306. package/dist/open-graph.js.map +1 -0
  307. package/dist/orphan-assets.d.ts +17 -0
  308. package/dist/orphan-assets.d.ts.map +1 -0
  309. package/dist/orphan-assets.js +174 -0
  310. package/dist/orphan-assets.js.map +1 -0
  311. package/dist/page-object.d.ts +18 -0
  312. package/dist/page-object.d.ts.map +1 -0
  313. package/dist/page-object.js +346 -0
  314. package/dist/page-object.js.map +1 -0
  315. package/dist/pagination-audit.d.ts +24 -0
  316. package/dist/pagination-audit.d.ts.map +1 -0
  317. package/dist/pagination-audit.js +285 -0
  318. package/dist/pagination-audit.js.map +1 -0
  319. package/dist/passive-security.d.ts +19 -0
  320. package/dist/passive-security.d.ts.map +1 -0
  321. package/dist/passive-security.js +149 -0
  322. package/dist/passive-security.js.map +1 -0
  323. package/dist/pr-comment.d.ts +13 -0
  324. package/dist/pr-comment.d.ts.map +1 -0
  325. package/dist/pr-comment.js +316 -0
  326. package/dist/pr-comment.js.map +1 -0
  327. package/dist/precommit.d.ts +24 -0
  328. package/dist/precommit.d.ts.map +1 -0
  329. package/dist/precommit.js +239 -0
  330. package/dist/precommit.js.map +1 -0
  331. package/dist/prerender-audit.d.ts +22 -0
  332. package/dist/prerender-audit.d.ts.map +1 -0
  333. package/dist/prerender-audit.js +158 -0
  334. package/dist/prerender-audit.js.map +1 -0
  335. package/dist/print-audit.d.ts +21 -0
  336. package/dist/print-audit.d.ts.map +1 -0
  337. package/dist/print-audit.js +281 -0
  338. package/dist/print-audit.js.map +1 -0
  339. package/dist/protocol-audit.d.ts +17 -0
  340. package/dist/protocol-audit.d.ts.map +1 -0
  341. package/dist/protocol-audit.js +128 -0
  342. package/dist/protocol-audit.js.map +1 -0
  343. package/dist/reading-level.d.ts +37 -0
  344. package/dist/reading-level.d.ts.map +1 -0
  345. package/dist/reading-level.js +220 -0
  346. package/dist/reading-level.js.map +1 -0
  347. package/dist/redirects.d.ts +24 -0
  348. package/dist/redirects.d.ts.map +1 -0
  349. package/dist/redirects.js +119 -0
  350. package/dist/redirects.js.map +1 -0
  351. package/dist/report.d.ts +1 -1
  352. package/dist/report.d.ts.map +1 -1
  353. package/dist/report.js +736 -1
  354. package/dist/report.js.map +1 -1
  355. package/dist/reporter-plugin.d.ts +32 -0
  356. package/dist/reporter-plugin.d.ts.map +1 -0
  357. package/dist/reporter-plugin.js +120 -0
  358. package/dist/reporter-plugin.js.map +1 -0
  359. package/dist/resource-hints.d.ts +23 -0
  360. package/dist/resource-hints.d.ts.map +1 -0
  361. package/dist/resource-hints.js +225 -0
  362. package/dist/resource-hints.js.map +1 -0
  363. package/dist/retire.d.ts +22 -0
  364. package/dist/retire.d.ts.map +1 -0
  365. package/dist/retire.js +140 -0
  366. package/dist/retire.js.map +1 -0
  367. package/dist/retry.d.ts +20 -0
  368. package/dist/retry.d.ts.map +1 -0
  369. package/dist/retry.js +120 -0
  370. package/dist/retry.js.map +1 -0
  371. package/dist/robots-audit.d.ts +24 -0
  372. package/dist/robots-audit.d.ts.map +1 -0
  373. package/dist/robots-audit.js +206 -0
  374. package/dist/robots-audit.js.map +1 -0
  375. package/dist/rum.d.ts +35 -0
  376. package/dist/rum.d.ts.map +1 -0
  377. package/dist/rum.js +219 -0
  378. package/dist/rum.js.map +1 -0
  379. package/dist/schedule.d.ts +30 -0
  380. package/dist/schedule.d.ts.map +1 -0
  381. package/dist/schedule.js +238 -0
  382. package/dist/schedule.js.map +1 -0
  383. package/dist/secret-scan.d.ts +24 -0
  384. package/dist/secret-scan.d.ts.map +1 -0
  385. package/dist/secret-scan.js +202 -0
  386. package/dist/secret-scan.js.map +1 -0
  387. package/dist/service-worker.d.ts +26 -0
  388. package/dist/service-worker.d.ts.map +1 -0
  389. package/dist/service-worker.js +179 -0
  390. package/dist/service-worker.js.map +1 -0
  391. package/dist/shard.d.ts +14 -0
  392. package/dist/shard.d.ts.map +1 -0
  393. package/dist/shard.js +72 -0
  394. package/dist/shard.js.map +1 -0
  395. package/dist/sitemap-flows.d.ts +13 -0
  396. package/dist/sitemap-flows.d.ts.map +1 -0
  397. package/dist/sitemap-flows.js +157 -0
  398. package/dist/sitemap-flows.js.map +1 -0
  399. package/dist/sitemap.d.ts +27 -0
  400. package/dist/sitemap.d.ts.map +1 -0
  401. package/dist/sitemap.js +137 -0
  402. package/dist/sitemap.js.map +1 -0
  403. package/dist/slack-formatter.d.ts +35 -0
  404. package/dist/slack-formatter.d.ts.map +1 -0
  405. package/dist/slack-formatter.js +193 -0
  406. package/dist/slack-formatter.js.map +1 -0
  407. package/dist/sourcemap-scan.d.ts +24 -0
  408. package/dist/sourcemap-scan.d.ts.map +1 -0
  409. package/dist/sourcemap-scan.js +232 -0
  410. package/dist/sourcemap-scan.js.map +1 -0
  411. package/dist/sri-audit.d.ts +23 -0
  412. package/dist/sri-audit.d.ts.map +1 -0
  413. package/dist/sri-audit.js +180 -0
  414. package/dist/sri-audit.js.map +1 -0
  415. package/dist/storage-audit.d.ts +28 -0
  416. package/dist/storage-audit.d.ts.map +1 -0
  417. package/dist/storage-audit.js +263 -0
  418. package/dist/storage-audit.js.map +1 -0
  419. package/dist/storybook.d.ts +48 -0
  420. package/dist/storybook.d.ts.map +1 -0
  421. package/dist/storybook.js +191 -0
  422. package/dist/storybook.js.map +1 -0
  423. package/dist/structured-data.d.ts +25 -0
  424. package/dist/structured-data.d.ts.map +1 -0
  425. package/dist/structured-data.js +164 -0
  426. package/dist/structured-data.js.map +1 -0
  427. package/dist/svg-audit.d.ts +20 -0
  428. package/dist/svg-audit.d.ts.map +1 -0
  429. package/dist/svg-audit.js +213 -0
  430. package/dist/svg-audit.js.map +1 -0
  431. package/dist/table-audit.d.ts +18 -0
  432. package/dist/table-audit.d.ts.map +1 -0
  433. package/dist/table-audit.js +188 -0
  434. package/dist/table-audit.js.map +1 -0
  435. package/dist/teams-formatter.d.ts +66 -0
  436. package/dist/teams-formatter.d.ts.map +1 -0
  437. package/dist/teams-formatter.js +194 -0
  438. package/dist/teams-formatter.js.map +1 -0
  439. package/dist/third-party.d.ts +35 -0
  440. package/dist/third-party.d.ts.map +1 -0
  441. package/dist/third-party.js +175 -0
  442. package/dist/third-party.js.map +1 -0
  443. package/dist/tls.d.ts +33 -0
  444. package/dist/tls.d.ts.map +1 -0
  445. package/dist/tls.js +122 -0
  446. package/dist/tls.js.map +1 -0
  447. package/dist/touchtargets.d.ts +22 -0
  448. package/dist/touchtargets.d.ts.map +1 -0
  449. package/dist/touchtargets.js +80 -0
  450. package/dist/touchtargets.js.map +1 -0
  451. package/dist/tracker-sniff.d.ts +25 -0
  452. package/dist/tracker-sniff.d.ts.map +1 -0
  453. package/dist/tracker-sniff.js +355 -0
  454. package/dist/tracker-sniff.js.map +1 -0
  455. package/dist/types.d.ts +265 -1
  456. package/dist/types.d.ts.map +1 -1
  457. package/dist/visual-mask.d.ts +33 -0
  458. package/dist/visual-mask.d.ts.map +1 -0
  459. package/dist/visual-mask.js +102 -0
  460. package/dist/visual-mask.js.map +1 -0
  461. package/dist/visual-ssim.d.ts +26 -0
  462. package/dist/visual-ssim.d.ts.map +1 -0
  463. package/dist/visual-ssim.js +153 -0
  464. package/dist/visual-ssim.js.map +1 -0
  465. package/dist/watch-mode.d.ts +10 -0
  466. package/dist/watch-mode.d.ts.map +1 -0
  467. package/dist/watch-mode.js +156 -0
  468. package/dist/watch-mode.js.map +1 -0
  469. package/dist/web-worker-audit.d.ts +27 -0
  470. package/dist/web-worker-audit.d.ts.map +1 -0
  471. package/dist/web-worker-audit.js +324 -0
  472. package/dist/web-worker-audit.js.map +1 -0
  473. package/dist/webfonts.d.ts +26 -0
  474. package/dist/webfonts.d.ts.map +1 -0
  475. package/dist/webfonts.js +244 -0
  476. package/dist/webfonts.js.map +1 -0
  477. package/dist/webhook-reporter.d.ts +20 -0
  478. package/dist/webhook-reporter.d.ts.map +1 -0
  479. package/dist/webhook-reporter.js +124 -0
  480. package/dist/webhook-reporter.js.map +1 -0
  481. package/dist/websocket.d.ts +39 -0
  482. package/dist/websocket.d.ts.map +1 -0
  483. package/dist/websocket.js +233 -0
  484. package/dist/websocket.js.map +1 -0
  485. package/dist/worker-runtime.d.ts +129 -0
  486. package/dist/worker-runtime.d.ts.map +1 -0
  487. package/dist/worker-runtime.js +414 -0
  488. package/dist/worker-runtime.js.map +1 -0
  489. package/dist/zindex-audit.d.ts +28 -0
  490. package/dist/zindex-audit.d.ts.map +1 -0
  491. package/dist/zindex-audit.js +291 -0
  492. package/dist/zindex-audit.js.map +1 -0
  493. 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,6 +230,71 @@ 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 {
@@ -64,6 +321,7 @@ export async function inspect(config) {
64
321
  });
65
322
  const runOne = async (flow) => {
66
323
  const page = await driver.newPage();
324
+ const console = checks.consoleErrors ? attachConsoleCapture(page) : null;
67
325
  if (config.ai?.enabled)
68
326
  await ai.init(page);
69
327
  const flowResult = await runFlow(page, flow.name, flow.steps, ai);
@@ -79,9 +337,138 @@ export async function inspect(config) {
79
337
  ? await checkLinks(page, typeof checks.links === 'object' ? checks.links : {}).catch(() => undefined)
80
338
  : undefined;
81
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();
82
441
  if (!config.parallel)
83
442
  await page.close();
84
- 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
+ };
85
472
  };
86
473
  const results = config.parallel ? await Promise.all(flows.map(runOne)) : [];
87
474
  if (!config.parallel)
@@ -99,6 +486,136 @@ export async function inspect(config) {
99
486
  linkResults.push(r.links);
100
487
  if (r.pwa)
101
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);
102
619
  }
103
620
  if (checks.perf) {
104
621
  const port = driver.cdpPort;
@@ -126,12 +643,96 @@ export async function inspect(config) {
126
643
  finally {
127
644
  await driver.close();
128
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
+ }
129
678
  const finishedAt = new Date();
130
679
  const baselinePassed = flowResults.every((f) => f.passed) &&
131
680
  a11yResults.every((a) => a.violations.filter((v) => v.impact === 'critical' || v.impact === 'serious').length === 0) &&
132
681
  visualResults.every((v) => v.passed) &&
133
682
  (!checks.links || (linkResults ?? []).every((l) => l.passed)) &&
134
- (!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);
135
736
  const result = {
136
737
  url: config.url,
137
738
  startedAt: startedAt.toISOString(),
@@ -146,8 +747,86 @@ export async function inspect(config) {
146
747
  links: checks.links ? linkResults : undefined,
147
748
  pwa: checks.pwa ? pwaResults : undefined,
148
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,
149
822
  passed: baselinePassed,
150
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
+ }
151
830
  if (config.budget) {
152
831
  const violations = checkBudget(result, config.budget);
153
832
  result.budget = violations;
@@ -304,6 +983,33 @@ async function runStep(page, step, ai) {
304
983
  else if ('sleep' in step) {
305
984
  await page.waitForTimeout(step.sleep);
306
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
+ }
307
1013
  }
308
1014
  async function runIframeStep(frame, step) {
309
1015
  if ('click' in step)