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.
- package/README.md +332 -22
- package/dist/a11y-filter.d.ts +15 -0
- package/dist/a11y-filter.d.ts.map +1 -0
- package/dist/a11y-filter.js +107 -0
- package/dist/a11y-filter.js.map +1 -0
- package/dist/ab-compare.d.ts +23 -0
- package/dist/ab-compare.d.ts.map +1 -0
- package/dist/ab-compare.js +340 -0
- package/dist/ab-compare.js.map +1 -0
- package/dist/ai-codegen.d.ts +30 -0
- package/dist/ai-codegen.d.ts.map +1 -0
- package/dist/ai-codegen.js +296 -0
- package/dist/ai-codegen.js.map +1 -0
- package/dist/ai-triage.d.ts +26 -0
- package/dist/ai-triage.d.ts.map +1 -0
- package/dist/ai-triage.js +207 -0
- package/dist/ai-triage.js.map +1 -0
- package/dist/amp.d.ts +32 -0
- package/dist/amp.d.ts.map +1 -0
- package/dist/amp.js +179 -0
- package/dist/amp.js.map +1 -0
- package/dist/animation-audit.d.ts +25 -0
- package/dist/animation-audit.d.ts.map +1 -0
- package/dist/animation-audit.js +296 -0
- package/dist/animation-audit.js.map +1 -0
- package/dist/api.d.ts +3 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +85 -0
- package/dist/api.js.map +1 -0
- package/dist/aria-audit.d.ts +20 -0
- package/dist/aria-audit.d.ts.map +1 -0
- package/dist/aria-audit.js +445 -0
- package/dist/aria-audit.js.map +1 -0
- package/dist/assertions.d.ts +30 -0
- package/dist/assertions.d.ts.map +1 -0
- package/dist/assertions.js +342 -0
- package/dist/assertions.js.map +1 -0
- package/dist/autofix.d.ts +40 -0
- package/dist/autofix.d.ts.map +1 -0
- package/dist/autofix.js +244 -0
- package/dist/autofix.js.map +1 -0
- package/dist/badge.d.ts +27 -0
- package/dist/badge.d.ts.map +1 -0
- package/dist/badge.js +183 -0
- package/dist/badge.js.map +1 -0
- package/dist/baseline-drift.d.ts +43 -0
- package/dist/baseline-drift.d.ts.map +1 -0
- package/dist/baseline-drift.js +208 -0
- package/dist/baseline-drift.js.map +1 -0
- package/dist/bdd.d.ts +31 -0
- package/dist/bdd.d.ts.map +1 -0
- package/dist/bdd.js +316 -0
- package/dist/bdd.js.map +1 -0
- package/dist/bisect.d.ts +32 -0
- package/dist/bisect.d.ts.map +1 -0
- package/dist/bisect.js +253 -0
- package/dist/bisect.js.map +1 -0
- package/dist/budget-diff.d.ts +37 -0
- package/dist/budget-diff.d.ts.map +1 -0
- package/dist/budget-diff.js +273 -0
- package/dist/budget-diff.js.map +1 -0
- package/dist/budget-file.d.ts +15 -0
- package/dist/budget-file.d.ts.map +1 -0
- package/dist/budget-file.js +185 -0
- package/dist/budget-file.js.map +1 -0
- package/dist/bundle-size.d.ts +36 -0
- package/dist/bundle-size.d.ts.map +1 -0
- package/dist/bundle-size.js +347 -0
- package/dist/bundle-size.js.map +1 -0
- package/dist/cache-headers.d.ts +33 -0
- package/dist/cache-headers.d.ts.map +1 -0
- package/dist/cache-headers.js +270 -0
- package/dist/cache-headers.js.map +1 -0
- package/dist/canonical-audit.d.ts +19 -0
- package/dist/canonical-audit.d.ts.map +1 -0
- package/dist/canonical-audit.js +196 -0
- package/dist/canonical-audit.js.map +1 -0
- package/dist/chaos.d.ts +38 -0
- package/dist/chaos.d.ts.map +1 -0
- package/dist/chaos.js +348 -0
- package/dist/chaos.js.map +1 -0
- package/dist/cli.js +201 -23
- package/dist/cli.js.map +1 -1
- package/dist/clickjacking-audit.d.ts +18 -0
- package/dist/clickjacking-audit.d.ts.map +1 -0
- package/dist/clickjacking-audit.js +231 -0
- package/dist/clickjacking-audit.js.map +1 -0
- package/dist/cls-culprit.d.ts +36 -0
- package/dist/cls-culprit.d.ts.map +1 -0
- package/dist/cls-culprit.js +203 -0
- package/dist/cls-culprit.js.map +1 -0
- package/dist/cls-timeline.d.ts +30 -0
- package/dist/cls-timeline.d.ts.map +1 -0
- package/dist/cls-timeline.js +61 -0
- package/dist/cls-timeline.js.map +1 -0
- package/dist/codegen-converter.d.ts +19 -0
- package/dist/codegen-converter.d.ts.map +1 -0
- package/dist/codegen-converter.js +464 -0
- package/dist/codegen-converter.js.map +1 -0
- package/dist/compression.d.ts +14 -0
- package/dist/compression.d.ts.map +1 -0
- package/dist/compression.js +150 -0
- package/dist/compression.js.map +1 -0
- package/dist/console-errors.d.ts +24 -0
- package/dist/console-errors.d.ts.map +1 -0
- package/dist/console-errors.js +96 -0
- package/dist/console-errors.js.map +1 -0
- package/dist/content-quality.d.ts +34 -0
- package/dist/content-quality.d.ts.map +1 -0
- package/dist/content-quality.js +124 -0
- package/dist/content-quality.js.map +1 -0
- package/dist/contract-openapi.d.ts +74 -0
- package/dist/contract-openapi.d.ts.map +1 -0
- package/dist/contract-openapi.js +305 -0
- package/dist/contract-openapi.js.map +1 -0
- package/dist/cookie-banner.d.ts +27 -0
- package/dist/cookie-banner.d.ts.map +1 -0
- package/dist/cookie-banner.js +285 -0
- package/dist/cookie-banner.js.map +1 -0
- package/dist/cookie-flags-audit.d.ts +35 -0
- package/dist/cookie-flags-audit.d.ts.map +1 -0
- package/dist/cookie-flags-audit.js +167 -0
- package/dist/cookie-flags-audit.js.map +1 -0
- package/dist/cpu-throttle.d.ts +34 -0
- package/dist/cpu-throttle.d.ts.map +1 -0
- package/dist/cpu-throttle.js +149 -0
- package/dist/cpu-throttle.js.map +1 -0
- package/dist/crawl.d.ts +29 -0
- package/dist/crawl.d.ts.map +1 -0
- package/dist/crawl.js +153 -0
- package/dist/crawl.js.map +1 -0
- package/dist/critical-css.d.ts +25 -0
- package/dist/critical-css.d.ts.map +1 -0
- package/dist/critical-css.js +353 -0
- package/dist/critical-css.js.map +1 -0
- package/dist/cross-browser.d.ts +44 -0
- package/dist/cross-browser.d.ts.map +1 -0
- package/dist/cross-browser.js +300 -0
- package/dist/cross-browser.js.map +1 -0
- package/dist/csrf-audit.d.ts +33 -0
- package/dist/csrf-audit.d.ts.map +1 -0
- package/dist/csrf-audit.js +276 -0
- package/dist/csrf-audit.js.map +1 -0
- package/dist/css-coverage.d.ts +20 -0
- package/dist/css-coverage.d.ts.map +1 -0
- package/dist/css-coverage.js +91 -0
- package/dist/css-coverage.js.map +1 -0
- package/dist/csv-exporter.d.ts +34 -0
- package/dist/csv-exporter.d.ts.map +1 -0
- package/dist/csv-exporter.js +241 -0
- package/dist/csv-exporter.js.map +1 -0
- package/dist/dark-mode-audit.d.ts +31 -0
- package/dist/dark-mode-audit.d.ts.map +1 -0
- package/dist/dark-mode-audit.js +236 -0
- package/dist/dark-mode-audit.js.map +1 -0
- package/dist/dead-images.d.ts +18 -0
- package/dist/dead-images.d.ts.map +1 -0
- package/dist/dead-images.js +236 -0
- package/dist/dead-images.js.map +1 -0
- package/dist/deadclicks.d.ts +19 -0
- package/dist/deadclicks.d.ts.map +1 -0
- package/dist/deadclicks.js +109 -0
- package/dist/deadclicks.js.map +1 -0
- package/dist/discord-formatter.d.ts +39 -0
- package/dist/discord-formatter.d.ts.map +1 -0
- package/dist/discord-formatter.js +191 -0
- package/dist/discord-formatter.js.map +1 -0
- package/dist/dom-audit.d.ts +23 -0
- package/dist/dom-audit.d.ts.map +1 -0
- package/dist/dom-audit.js +111 -0
- package/dist/dom-audit.js.map +1 -0
- package/dist/driver.d.ts.map +1 -1
- package/dist/driver.js +10 -0
- package/dist/driver.js.map +1 -1
- package/dist/error-page-audit.d.ts +26 -0
- package/dist/error-page-audit.d.ts.map +1 -0
- package/dist/error-page-audit.js +219 -0
- package/dist/error-page-audit.js.map +1 -0
- package/dist/event-listener-audit.d.ts +22 -0
- package/dist/event-listener-audit.d.ts.map +1 -0
- package/dist/event-listener-audit.js +156 -0
- package/dist/event-listener-audit.js.map +1 -0
- package/dist/exposed-paths.d.ts +21 -0
- package/dist/exposed-paths.d.ts.map +1 -0
- package/dist/exposed-paths.js +116 -0
- package/dist/exposed-paths.js.map +1 -0
- package/dist/favicon-audit.d.ts +28 -0
- package/dist/favicon-audit.d.ts.map +1 -0
- package/dist/favicon-audit.js +358 -0
- package/dist/favicon-audit.js.map +1 -0
- package/dist/flaky-detector.d.ts +32 -0
- package/dist/flaky-detector.d.ts.map +1 -0
- package/dist/flaky-detector.js +254 -0
- package/dist/flaky-detector.js.map +1 -0
- package/dist/flaky.d.ts +28 -0
- package/dist/flaky.d.ts.map +1 -0
- package/dist/flaky.js +106 -0
- package/dist/flaky.js.map +1 -0
- package/dist/focus-trap-audit.d.ts +29 -0
- package/dist/focus-trap-audit.d.ts.map +1 -0
- package/dist/focus-trap-audit.js +285 -0
- package/dist/focus-trap-audit.js.map +1 -0
- package/dist/font-loading.d.ts +29 -0
- package/dist/font-loading.d.ts.map +1 -0
- package/dist/font-loading.js +216 -0
- package/dist/font-loading.js.map +1 -0
- package/dist/forms-audit.d.ts +23 -0
- package/dist/forms-audit.d.ts.map +1 -0
- package/dist/forms-audit.js +147 -0
- package/dist/forms-audit.js.map +1 -0
- package/dist/github-annotations.d.ts +17 -0
- package/dist/github-annotations.d.ts.map +1 -0
- package/dist/github-annotations.js +264 -0
- package/dist/github-annotations.js.map +1 -0
- package/dist/graphql.d.ts +60 -0
- package/dist/graphql.d.ts.map +1 -0
- package/dist/graphql.js +188 -0
- package/dist/graphql.js.map +1 -0
- package/dist/har-waterfall.d.ts +37 -0
- package/dist/har-waterfall.d.ts.map +1 -0
- package/dist/har-waterfall.js +376 -0
- package/dist/har-waterfall.js.map +1 -0
- package/dist/heading-hierarchy.d.ts +20 -0
- package/dist/heading-hierarchy.d.ts.map +1 -0
- package/dist/heading-hierarchy.js +112 -0
- package/dist/heading-hierarchy.js.map +1 -0
- package/dist/headless-detect.d.ts +22 -0
- package/dist/headless-detect.d.ts.map +1 -0
- package/dist/headless-detect.js +167 -0
- package/dist/headless-detect.js.map +1 -0
- package/dist/history-timeline.d.ts +13 -0
- package/dist/history-timeline.d.ts.map +1 -0
- package/dist/history-timeline.js +327 -0
- package/dist/history-timeline.js.map +1 -0
- package/dist/hreflang-audit.d.ts +26 -0
- package/dist/hreflang-audit.d.ts.map +1 -0
- package/dist/hreflang-audit.js +273 -0
- package/dist/hreflang-audit.js.map +1 -0
- package/dist/hydration-audit.d.ts +21 -0
- package/dist/hydration-audit.d.ts.map +1 -0
- package/dist/hydration-audit.js +277 -0
- package/dist/hydration-audit.js.map +1 -0
- package/dist/image-audit.d.ts +41 -0
- package/dist/image-audit.d.ts.map +1 -0
- package/dist/image-audit.js +229 -0
- package/dist/image-audit.js.map +1 -0
- package/dist/index.d.ts +119 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +708 -2
- package/dist/index.js.map +1 -1
- package/dist/init-wizard.d.ts +33 -0
- package/dist/init-wizard.d.ts.map +1 -0
- package/dist/init-wizard.js +289 -0
- package/dist/init-wizard.js.map +1 -0
- package/dist/inp-audit.d.ts +26 -0
- package/dist/inp-audit.d.ts.map +1 -0
- package/dist/inp-audit.js +202 -0
- package/dist/inp-audit.js.map +1 -0
- package/dist/js-coverage.d.ts +20 -0
- package/dist/js-coverage.d.ts.map +1 -0
- package/dist/js-coverage.js +81 -0
- package/dist/js-coverage.js.map +1 -0
- package/dist/json-schema.d.ts +27 -0
- package/dist/json-schema.d.ts.map +1 -0
- package/dist/json-schema.js +284 -0
- package/dist/json-schema.js.map +1 -0
- package/dist/keyboard.d.ts +21 -0
- package/dist/keyboard.d.ts.map +1 -0
- package/dist/keyboard.js +119 -0
- package/dist/keyboard.js.map +1 -0
- package/dist/lang-audit.d.ts +24 -0
- package/dist/lang-audit.d.ts.map +1 -0
- package/dist/lang-audit.js +141 -0
- package/dist/lang-audit.js.map +1 -0
- package/dist/lcp-element.d.ts +22 -0
- package/dist/lcp-element.d.ts.map +1 -0
- package/dist/lcp-element.js +240 -0
- package/dist/lcp-element.js.map +1 -0
- package/dist/longtasks.d.ts +38 -0
- package/dist/longtasks.d.ts.map +1 -0
- package/dist/longtasks.js +97 -0
- package/dist/longtasks.js.map +1 -0
- package/dist/mailbox.d.ts +35 -0
- package/dist/mailbox.d.ts.map +1 -0
- package/dist/mailbox.js +207 -0
- package/dist/mailbox.js.map +1 -0
- package/dist/media-audit.d.ts +20 -0
- package/dist/media-audit.d.ts.map +1 -0
- package/dist/media-audit.js +182 -0
- package/dist/media-audit.js.map +1 -0
- package/dist/metrics-exporter.d.ts +23 -0
- package/dist/metrics-exporter.d.ts.map +1 -0
- package/dist/metrics-exporter.js +297 -0
- package/dist/metrics-exporter.js.map +1 -0
- package/dist/mixed-content.d.ts +19 -0
- package/dist/mixed-content.d.ts.map +1 -0
- package/dist/mixed-content.js +86 -0
- package/dist/mixed-content.js.map +1 -0
- package/dist/motion-prefs.d.ts +21 -0
- package/dist/motion-prefs.d.ts.map +1 -0
- package/dist/motion-prefs.js +170 -0
- package/dist/motion-prefs.js.map +1 -0
- package/dist/open-graph.d.ts +40 -0
- package/dist/open-graph.d.ts.map +1 -0
- package/dist/open-graph.js +200 -0
- package/dist/open-graph.js.map +1 -0
- package/dist/orphan-assets.d.ts +17 -0
- package/dist/orphan-assets.d.ts.map +1 -0
- package/dist/orphan-assets.js +174 -0
- package/dist/orphan-assets.js.map +1 -0
- package/dist/page-object.d.ts +18 -0
- package/dist/page-object.d.ts.map +1 -0
- package/dist/page-object.js +346 -0
- package/dist/page-object.js.map +1 -0
- package/dist/pagination-audit.d.ts +24 -0
- package/dist/pagination-audit.d.ts.map +1 -0
- package/dist/pagination-audit.js +285 -0
- package/dist/pagination-audit.js.map +1 -0
- package/dist/passive-security.d.ts +19 -0
- package/dist/passive-security.d.ts.map +1 -0
- package/dist/passive-security.js +149 -0
- package/dist/passive-security.js.map +1 -0
- package/dist/pr-comment.d.ts +13 -0
- package/dist/pr-comment.d.ts.map +1 -0
- package/dist/pr-comment.js +316 -0
- package/dist/pr-comment.js.map +1 -0
- package/dist/precommit.d.ts +24 -0
- package/dist/precommit.d.ts.map +1 -0
- package/dist/precommit.js +239 -0
- package/dist/precommit.js.map +1 -0
- package/dist/prerender-audit.d.ts +22 -0
- package/dist/prerender-audit.d.ts.map +1 -0
- package/dist/prerender-audit.js +158 -0
- package/dist/prerender-audit.js.map +1 -0
- package/dist/print-audit.d.ts +21 -0
- package/dist/print-audit.d.ts.map +1 -0
- package/dist/print-audit.js +281 -0
- package/dist/print-audit.js.map +1 -0
- package/dist/protocol-audit.d.ts +17 -0
- package/dist/protocol-audit.d.ts.map +1 -0
- package/dist/protocol-audit.js +128 -0
- package/dist/protocol-audit.js.map +1 -0
- package/dist/reading-level.d.ts +37 -0
- package/dist/reading-level.d.ts.map +1 -0
- package/dist/reading-level.js +220 -0
- package/dist/reading-level.js.map +1 -0
- package/dist/redirects.d.ts +24 -0
- package/dist/redirects.d.ts.map +1 -0
- package/dist/redirects.js +119 -0
- package/dist/redirects.js.map +1 -0
- package/dist/report.d.ts +1 -1
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +736 -1
- package/dist/report.js.map +1 -1
- package/dist/reporter-plugin.d.ts +32 -0
- package/dist/reporter-plugin.d.ts.map +1 -0
- package/dist/reporter-plugin.js +120 -0
- package/dist/reporter-plugin.js.map +1 -0
- package/dist/resource-hints.d.ts +23 -0
- package/dist/resource-hints.d.ts.map +1 -0
- package/dist/resource-hints.js +225 -0
- package/dist/resource-hints.js.map +1 -0
- package/dist/retire.d.ts +22 -0
- package/dist/retire.d.ts.map +1 -0
- package/dist/retire.js +140 -0
- package/dist/retire.js.map +1 -0
- package/dist/retry.d.ts +20 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +120 -0
- package/dist/retry.js.map +1 -0
- package/dist/robots-audit.d.ts +24 -0
- package/dist/robots-audit.d.ts.map +1 -0
- package/dist/robots-audit.js +206 -0
- package/dist/robots-audit.js.map +1 -0
- package/dist/rum.d.ts +35 -0
- package/dist/rum.d.ts.map +1 -0
- package/dist/rum.js +219 -0
- package/dist/rum.js.map +1 -0
- package/dist/schedule.d.ts +30 -0
- package/dist/schedule.d.ts.map +1 -0
- package/dist/schedule.js +238 -0
- package/dist/schedule.js.map +1 -0
- package/dist/secret-scan.d.ts +24 -0
- package/dist/secret-scan.d.ts.map +1 -0
- package/dist/secret-scan.js +202 -0
- package/dist/secret-scan.js.map +1 -0
- package/dist/service-worker.d.ts +26 -0
- package/dist/service-worker.d.ts.map +1 -0
- package/dist/service-worker.js +179 -0
- package/dist/service-worker.js.map +1 -0
- package/dist/shard.d.ts +14 -0
- package/dist/shard.d.ts.map +1 -0
- package/dist/shard.js +72 -0
- package/dist/shard.js.map +1 -0
- package/dist/sitemap-flows.d.ts +13 -0
- package/dist/sitemap-flows.d.ts.map +1 -0
- package/dist/sitemap-flows.js +157 -0
- package/dist/sitemap-flows.js.map +1 -0
- package/dist/sitemap.d.ts +27 -0
- package/dist/sitemap.d.ts.map +1 -0
- package/dist/sitemap.js +137 -0
- package/dist/sitemap.js.map +1 -0
- package/dist/slack-formatter.d.ts +35 -0
- package/dist/slack-formatter.d.ts.map +1 -0
- package/dist/slack-formatter.js +193 -0
- package/dist/slack-formatter.js.map +1 -0
- package/dist/sourcemap-scan.d.ts +24 -0
- package/dist/sourcemap-scan.d.ts.map +1 -0
- package/dist/sourcemap-scan.js +232 -0
- package/dist/sourcemap-scan.js.map +1 -0
- package/dist/sri-audit.d.ts +23 -0
- package/dist/sri-audit.d.ts.map +1 -0
- package/dist/sri-audit.js +180 -0
- package/dist/sri-audit.js.map +1 -0
- package/dist/storage-audit.d.ts +28 -0
- package/dist/storage-audit.d.ts.map +1 -0
- package/dist/storage-audit.js +263 -0
- package/dist/storage-audit.js.map +1 -0
- package/dist/storybook.d.ts +48 -0
- package/dist/storybook.d.ts.map +1 -0
- package/dist/storybook.js +191 -0
- package/dist/storybook.js.map +1 -0
- package/dist/structured-data.d.ts +25 -0
- package/dist/structured-data.d.ts.map +1 -0
- package/dist/structured-data.js +164 -0
- package/dist/structured-data.js.map +1 -0
- package/dist/svg-audit.d.ts +20 -0
- package/dist/svg-audit.d.ts.map +1 -0
- package/dist/svg-audit.js +213 -0
- package/dist/svg-audit.js.map +1 -0
- package/dist/table-audit.d.ts +18 -0
- package/dist/table-audit.d.ts.map +1 -0
- package/dist/table-audit.js +188 -0
- package/dist/table-audit.js.map +1 -0
- package/dist/teams-formatter.d.ts +66 -0
- package/dist/teams-formatter.d.ts.map +1 -0
- package/dist/teams-formatter.js +194 -0
- package/dist/teams-formatter.js.map +1 -0
- package/dist/third-party.d.ts +35 -0
- package/dist/third-party.d.ts.map +1 -0
- package/dist/third-party.js +175 -0
- package/dist/third-party.js.map +1 -0
- package/dist/tls.d.ts +33 -0
- package/dist/tls.d.ts.map +1 -0
- package/dist/tls.js +122 -0
- package/dist/tls.js.map +1 -0
- package/dist/touchtargets.d.ts +22 -0
- package/dist/touchtargets.d.ts.map +1 -0
- package/dist/touchtargets.js +80 -0
- package/dist/touchtargets.js.map +1 -0
- package/dist/tracker-sniff.d.ts +25 -0
- package/dist/tracker-sniff.d.ts.map +1 -0
- package/dist/tracker-sniff.js +355 -0
- package/dist/tracker-sniff.js.map +1 -0
- package/dist/types.d.ts +265 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/visual-mask.d.ts +33 -0
- package/dist/visual-mask.d.ts.map +1 -0
- package/dist/visual-mask.js +102 -0
- package/dist/visual-mask.js.map +1 -0
- package/dist/visual-ssim.d.ts +26 -0
- package/dist/visual-ssim.d.ts.map +1 -0
- package/dist/visual-ssim.js +153 -0
- package/dist/visual-ssim.js.map +1 -0
- package/dist/watch-mode.d.ts +10 -0
- package/dist/watch-mode.d.ts.map +1 -0
- package/dist/watch-mode.js +156 -0
- package/dist/watch-mode.js.map +1 -0
- package/dist/web-worker-audit.d.ts +27 -0
- package/dist/web-worker-audit.d.ts.map +1 -0
- package/dist/web-worker-audit.js +324 -0
- package/dist/web-worker-audit.js.map +1 -0
- package/dist/webfonts.d.ts +26 -0
- package/dist/webfonts.d.ts.map +1 -0
- package/dist/webfonts.js +244 -0
- package/dist/webfonts.js.map +1 -0
- package/dist/webhook-reporter.d.ts +20 -0
- package/dist/webhook-reporter.d.ts.map +1 -0
- package/dist/webhook-reporter.js +124 -0
- package/dist/webhook-reporter.js.map +1 -0
- package/dist/websocket.d.ts +39 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +233 -0
- package/dist/websocket.js.map +1 -0
- package/dist/worker-runtime.d.ts +129 -0
- package/dist/worker-runtime.d.ts.map +1 -0
- package/dist/worker-runtime.js +414 -0
- package/dist/worker-runtime.js.map +1 -0
- package/dist/zindex-audit.d.ts +28 -0
- package/dist/zindex-audit.d.ts.map +1 -0
- package/dist/zindex-audit.js +291 -0
- package/dist/zindex-audit.js.map +1 -0
- 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 {
|
|
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)
|