uxinspect 0.1.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +205 -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 +2 -0
- package/dist/driver.d.ts.map +1 -1
- package/dist/driver.js +28 -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 +826 -3
- 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 +344 -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/README.md
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
> All-in-one UI/UX testing — tests like a real human, every click, every screen, every accessibility rule, in one CLI.
|
|
4
4
|
|
|
5
|
-
[](https://npmjs.com/package/uxinspect)
|
|
6
|
-
[](LICENSE)
|
|
5
|
+
[](https://npmjs.com/package/uxinspect)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
[](#checks)
|
|
7
8
|
|
|
8
9
|
## What it does
|
|
9
10
|
|
|
@@ -57,7 +58,7 @@ export default {
|
|
|
57
58
|
],
|
|
58
59
|
checks: { a11y: true, visual: true, perf: true, explore: true },
|
|
59
60
|
parallel: true,
|
|
60
|
-
reporters: ['html', 'json', 'junit', 'sarif'],
|
|
61
|
+
reporters: ['html', 'json', 'junit', 'sarif', 'allure', 'tap'],
|
|
61
62
|
ai: { enabled: true },
|
|
62
63
|
} satisfies InspectConfig;
|
|
63
64
|
```
|
|
@@ -79,25 +80,331 @@ const result = await inspect({
|
|
|
79
80
|
if (!result.passed) process.exit(1);
|
|
80
81
|
```
|
|
81
82
|
|
|
82
|
-
##
|
|
83
|
+
## Programmatic helpers
|
|
84
|
+
|
|
85
|
+
Composable helpers that sit alongside `inspect()` for specialized flows and integrations.
|
|
86
|
+
|
|
87
|
+
### `flaky` — retry with flake detection
|
|
88
|
+
|
|
89
|
+
Re-runs a block until it passes, classifies intermittent failures as flakes.
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
import { retryWithFlakeDetection, inspect } from 'uxinspect';
|
|
93
|
+
|
|
94
|
+
const result = await retryWithFlakeDetection(
|
|
95
|
+
() => inspect(config),
|
|
96
|
+
{ maxAttempts: 3 },
|
|
97
|
+
);
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### `websocket` — WebSocket flow support
|
|
101
|
+
|
|
102
|
+
Drive WebSocket endpoints with a step-based flow.
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
import { runWebSocketFlow } from 'uxinspect';
|
|
106
|
+
|
|
107
|
+
await runWebSocketFlow({
|
|
108
|
+
url: 'wss://example.com/socket',
|
|
109
|
+
steps: [
|
|
110
|
+
{ send: '{"type":"ping"}' },
|
|
111
|
+
{ expect: { contains: 'pong' } },
|
|
112
|
+
],
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### `graphql` — GraphQL flow support
|
|
117
|
+
|
|
118
|
+
Query/mutation steps with variable interpolation and assertions.
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
import { runGraphQLFlow } from 'uxinspect';
|
|
122
|
+
|
|
123
|
+
await runGraphQLFlow({
|
|
124
|
+
endpoint: 'https://example.com/graphql',
|
|
125
|
+
steps: [
|
|
126
|
+
{ query: '{ viewer { id } }', expect: { path: 'data.viewer.id' } },
|
|
127
|
+
],
|
|
128
|
+
});
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### `service-worker` — Service Worker audit
|
|
132
|
+
|
|
133
|
+
Checks registration, scope, cache strategy, and update flow.
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
import { auditServiceWorker } from 'uxinspect';
|
|
137
|
+
|
|
138
|
+
const report = await auditServiceWorker(page);
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### `rum` — Real User Monitoring
|
|
142
|
+
|
|
143
|
+
Collect field metrics from a page, or inject the RUM client script into production.
|
|
144
|
+
|
|
145
|
+
```ts
|
|
146
|
+
import { collectRUM, rumClientScript } from 'uxinspect';
|
|
147
|
+
|
|
148
|
+
const metrics = await collectRUM(page);
|
|
149
|
+
|
|
150
|
+
// In your production HTML:
|
|
151
|
+
// <script>${rumClientScript()}</script>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### `github-annotations` — GitHub Actions PR annotations
|
|
155
|
+
|
|
156
|
+
Emits `::error` / `::warning` workflow commands so findings surface as inline PR annotations.
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
import { emitGitHubAnnotations } from 'uxinspect';
|
|
160
|
+
|
|
161
|
+
emitGitHubAnnotations(result);
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### `amp` — AMP HTML validation
|
|
165
|
+
|
|
166
|
+
Validates AMP markup on the current page.
|
|
167
|
+
|
|
168
|
+
```ts
|
|
169
|
+
import { validateAmp } from 'uxinspect';
|
|
170
|
+
|
|
171
|
+
const ampReport = await validateAmp(page);
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### `bdd` — Gherkin feature file runner
|
|
175
|
+
|
|
176
|
+
Parse Gherkin syntax, map steps to flows, and hand them to `inspect()`.
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
import { readFileSync } from 'node:fs';
|
|
180
|
+
import { parseFeature, featureToFlows, builtinSteps, inspect } from 'uxinspect';
|
|
181
|
+
|
|
182
|
+
const feature = parseFeature(readFileSync('login.feature', 'utf8'));
|
|
183
|
+
const flows = featureToFlows(feature, builtinSteps);
|
|
184
|
+
await inspect({ url: 'https://example.com', flows });
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### `mailbox` — email intercept for signup flows
|
|
188
|
+
|
|
189
|
+
Wait for a verification email during a test run.
|
|
190
|
+
|
|
191
|
+
```ts
|
|
192
|
+
import { waitForEmail } from 'uxinspect';
|
|
193
|
+
|
|
194
|
+
const email = await waitForEmail(
|
|
195
|
+
{ provider: 'mailpit', baseUrl: 'https://mail.example.com' },
|
|
196
|
+
{ subjectContains: 'Verify' },
|
|
197
|
+
);
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Checks
|
|
201
|
+
|
|
202
|
+
100+ built-in audits. 65+ wired into `inspect()` single-run (enable via `checks` or `--all`); all available as library imports.
|
|
203
|
+
|
|
204
|
+
### Accessibility & UX
|
|
205
|
+
|
|
206
|
+
| Check | Key | One-liner |
|
|
207
|
+
|---|---|---|
|
|
208
|
+
| Accessibility | `a11y` | WCAG violations via axe-core on every viewport |
|
|
209
|
+
| Keyboard | `keyboard` | Focus trap, tab order, visible focus rings |
|
|
210
|
+
| Touch targets | `touchTargets` | WCAG 2.5.5 / 2.5.8 target-size (44/24 px) audit |
|
|
211
|
+
| Dead clicks | `deadClicks` | Flags elements that look clickable but do nothing |
|
|
212
|
+
| Motion prefs | `motionPrefs` | `prefers-reduced-motion`, dark-mode, print, forced-colors |
|
|
213
|
+
| Forms | `forms` | Label, autocomplete, required, validation audit |
|
|
214
|
+
|
|
215
|
+
```ts
|
|
216
|
+
checks: {
|
|
217
|
+
a11y: true,
|
|
218
|
+
keyboard: true,
|
|
219
|
+
touchTargets: true,
|
|
220
|
+
deadClicks: true,
|
|
221
|
+
motionPrefs: true,
|
|
222
|
+
forms: true,
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Performance
|
|
227
|
+
|
|
228
|
+
| Check | Key | One-liner |
|
|
229
|
+
|---|---|---|
|
|
230
|
+
| Lighthouse | `perf` | Core Web Vitals + Lighthouse scoring |
|
|
231
|
+
| Long tasks | `longTasks` | Long tasks, LoAF attribution, INP capture |
|
|
232
|
+
| CLS timeline | `clsTimeline` | Layout shift timeline with node attribution |
|
|
233
|
+
| Bundle size | `bundleSize` | JS/CSS byte budget + duplicate package detection |
|
|
234
|
+
| Webfonts | `webfonts` | `font-display`, FOIT/FOUT, oversize font files |
|
|
235
|
+
| Images | `imageAudit` | Alt text, lazy-load, modern format, intrinsic dims |
|
|
236
|
+
| Resource hints | `resourceHints` | `preload` / `prefetch` / `preconnect` audit |
|
|
237
|
+
| Cache headers | `cacheHeaders` | `Cache-Control`, `ETag`, `immutable` audit |
|
|
238
|
+
| Compression | `compression` | gzip / brotli + HTTP/2 / HTTP/3 negotiation |
|
|
239
|
+
|
|
240
|
+
```ts
|
|
241
|
+
checks: {
|
|
242
|
+
perf: true,
|
|
243
|
+
longTasks: true,
|
|
244
|
+
clsTimeline: true,
|
|
245
|
+
bundleSize: true,
|
|
246
|
+
webfonts: true,
|
|
247
|
+
imageAudit: true,
|
|
248
|
+
resourceHints: true,
|
|
249
|
+
cacheHeaders: true,
|
|
250
|
+
compression: true,
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Security
|
|
255
|
+
|
|
256
|
+
| Check | Key | One-liner |
|
|
257
|
+
|---|---|---|
|
|
258
|
+
| Headers | `security` | CSP, HSTS, X-Frame-Options, Referrer-Policy, etc. |
|
|
259
|
+
| Passive smells | `passiveSecurity` | Surface-level security red flags |
|
|
260
|
+
| Retire.js | `retire` | Vulnerable JS library scan (12 lib signatures) |
|
|
261
|
+
| TLS | `tls` | Socket audit: protocol, cipher, cert chain |
|
|
262
|
+
| Exposed paths | `exposedPaths` | Sensitive path scan (35 signatures) |
|
|
263
|
+
| Mixed content | `mixedContent` | Insecure resources on HTTPS pages |
|
|
264
|
+
|
|
265
|
+
```ts
|
|
266
|
+
checks: {
|
|
267
|
+
security: true,
|
|
268
|
+
passiveSecurity: true,
|
|
269
|
+
retire: true,
|
|
270
|
+
tls: true,
|
|
271
|
+
exposedPaths: true,
|
|
272
|
+
mixedContent: true,
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### SEO & Content
|
|
277
|
+
|
|
278
|
+
| Check | Key | One-liner |
|
|
279
|
+
|---|---|---|
|
|
280
|
+
| SEO | `seo` | Meta tags, heading structure, canonical |
|
|
281
|
+
| Sitemap | `sitemap` | `sitemap.xml` fetch + schema validation |
|
|
282
|
+
| Robots | `robotsAudit` | `robots.txt` + meta robots + `X-Robots-Tag` |
|
|
283
|
+
| Structured data | `structuredData` | JSON-LD, microdata, `hreflang` |
|
|
284
|
+
| Open Graph | `openGraph` | OpenGraph + Twitter Card validation |
|
|
285
|
+
| Content quality | `contentQuality` | Flesch-Kincaid readability + duplicate detection |
|
|
286
|
+
| Links | `links` | Broken link check across crawled pages |
|
|
287
|
+
|
|
288
|
+
```ts
|
|
289
|
+
checks: {
|
|
290
|
+
seo: true,
|
|
291
|
+
sitemap: true,
|
|
292
|
+
robotsAudit: true,
|
|
293
|
+
structuredData: true,
|
|
294
|
+
openGraph: true,
|
|
295
|
+
contentQuality: true,
|
|
296
|
+
links: true,
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Network & Infra
|
|
301
|
+
|
|
302
|
+
| Check | Key | One-liner |
|
|
303
|
+
|---|---|---|
|
|
304
|
+
| PWA | `pwa` | Manifest + service worker audit |
|
|
305
|
+
| Redirects | `redirects` | Redirect chain length + loop detection |
|
|
306
|
+
| Crawl | `crawl` | BFS site crawl with configurable depth |
|
|
307
|
+
| Third-party | `thirdParty` | Tracker / ad / analytics script analysis |
|
|
308
|
+
|
|
309
|
+
```ts
|
|
310
|
+
checks: {
|
|
311
|
+
pwa: true,
|
|
312
|
+
redirects: true,
|
|
313
|
+
crawl: true,
|
|
314
|
+
thirdParty: true,
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### Visual
|
|
319
|
+
|
|
320
|
+
| Check | Key | One-liner |
|
|
321
|
+
|---|---|---|
|
|
322
|
+
| Visual diff | `visual` | Pixelmatch diff against stored baselines |
|
|
323
|
+
|
|
324
|
+
```ts
|
|
325
|
+
checks: { visual: true }
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### Privacy & Compliance
|
|
329
|
+
|
|
330
|
+
| Check | Key | One-liner |
|
|
331
|
+
|---|---|---|
|
|
332
|
+
| Cookie banner | `cookieBanner` | GDPR consent popup detection |
|
|
333
|
+
| Console errors | `consoleErrors` | Browser console capture across the run |
|
|
334
|
+
|
|
335
|
+
```ts
|
|
336
|
+
checks: {
|
|
337
|
+
cookieBanner: true,
|
|
338
|
+
consoleErrors: true,
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### Exploration
|
|
343
|
+
|
|
344
|
+
| Check | Key | One-liner |
|
|
345
|
+
|---|---|---|
|
|
346
|
+
| Explore | `explore` | Heuristic automated crawling + interaction |
|
|
347
|
+
| AI | `ai` | Keyless AI instructions (Playwright role/text locators) |
|
|
348
|
+
|
|
349
|
+
```ts
|
|
350
|
+
checks: {
|
|
351
|
+
explore: true,
|
|
352
|
+
ai: true,
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
## CLI flags
|
|
357
|
+
|
|
358
|
+
Every check has a matching flag. Use `--all` to turn them all on, or pick individually. Flags are boolean; prefix with `--no-` to disable (e.g. `--no-a11y`).
|
|
359
|
+
|
|
360
|
+
### Core flags
|
|
83
361
|
|
|
84
362
|
| Flag | Default | Description |
|
|
85
363
|
|------|---------|-------------|
|
|
86
364
|
| `--url` | required | URL to inspect |
|
|
87
|
-
| `--config` | — | Config file (`.ts
|
|
88
|
-
| `--a11y` | `true` | Accessibility audit |
|
|
89
|
-
| `--perf` | `false` | Performance audit |
|
|
90
|
-
| `--visual` | `true` | Visual diff against baseline |
|
|
91
|
-
| `--explore` | `false` | Auto-click every interactive element |
|
|
365
|
+
| `--config` | — | Config file (`.ts` / `.js` / `.json`) |
|
|
92
366
|
| `--out` | `./uxinspect-report` | Report directory |
|
|
93
367
|
| `--baselines` | `./uxinspect-baselines` | Visual baseline directory |
|
|
94
|
-
| `--ai` | `false` | Enable keyless AI flow steps |
|
|
95
368
|
| `--headed` | `false` | Run with visible browser |
|
|
96
369
|
| `--parallel` | `false` | Run flows in parallel |
|
|
97
370
|
| `--storage-state` | — | Path to auth storageState JSON |
|
|
98
|
-
| `--reporters` | `html,json` | Comma list: `html`, `json`, `junit`, `sarif` |
|
|
99
|
-
| `--publish` | — | Dashboard URL to upload report
|
|
371
|
+
| `--reporters` | `html,json` | Comma list: `html`, `json`, `junit`, `sarif`, `allure`, `tap` |
|
|
372
|
+
| `--publish` | — | Dashboard URL to upload report |
|
|
100
373
|
| `--publish-token` | — | Bearer token for dashboard upload |
|
|
374
|
+
| `--all` | `false` | Enable every check below |
|
|
375
|
+
|
|
376
|
+
### Check flags
|
|
377
|
+
|
|
378
|
+
| Category | Flag |
|
|
379
|
+
|---|---|
|
|
380
|
+
| Accessibility & UX | `--a11y` `--keyboard` `--touch-targets` `--dead-clicks` `--motion-prefs` `--forms` |
|
|
381
|
+
| Performance | `--perf` `--long-tasks` `--cls-timeline` `--bundle-size` `--webfonts` `--image-audit` `--resource-hints` `--cache-headers` `--compression` |
|
|
382
|
+
| Security | `--security` `--passive-security` `--retire` `--tls` `--exposed-paths` `--mixed-content` |
|
|
383
|
+
| SEO & Content | `--seo` `--sitemap` `--robots-audit` `--structured-data` `--open-graph` `--content-quality` `--links` |
|
|
384
|
+
| Network & Infra | `--pwa` `--redirects` `--crawl` `--third-party` |
|
|
385
|
+
| Visual | `--visual` |
|
|
386
|
+
| Privacy & Compliance | `--cookie-banner` `--console-errors` |
|
|
387
|
+
| Exploration | `--explore` `--ai` |
|
|
388
|
+
|
|
389
|
+
Example:
|
|
390
|
+
|
|
391
|
+
```bash
|
|
392
|
+
uxinspect run --url https://example.com --all
|
|
393
|
+
uxinspect run --url https://example.com --a11y --perf --retire --seo --visual
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
## Reporters
|
|
397
|
+
|
|
398
|
+
Pick any combination via `reporters: [...]` or `--reporters html,json,...`.
|
|
399
|
+
|
|
400
|
+
| Reporter | Output | Use |
|
|
401
|
+
|---|---|---|
|
|
402
|
+
| `html` | `report.html` | Human-readable dashboard with screenshots |
|
|
403
|
+
| `json` | `report.json` | Machine-readable full result tree |
|
|
404
|
+
| `junit` | `junit.xml` | CI test result ingestion |
|
|
405
|
+
| `sarif` | `report.sarif` | Code scanning / security tab ingestion |
|
|
406
|
+
| `allure` | `allure-results/` | Directory for the Allure UI |
|
|
407
|
+
| `tap` | `report.tap` | TAP 14 stream for TAP-compatible tooling |
|
|
101
408
|
|
|
102
409
|
## AI without keys
|
|
103
410
|
|
|
@@ -136,17 +443,20 @@ uxinspect report ./uxinspect-report --port 4173
|
|
|
136
443
|
|
|
137
444
|
## How it compares
|
|
138
445
|
|
|
139
|
-
| Capability | uxinspect |
|
|
446
|
+
| Capability | uxinspect | E2E frameworks | Visual SaaS | A11y plugins |
|
|
140
447
|
|---|:-:|:-:|:-:|:-:|
|
|
141
|
-
| Real-user clicks |
|
|
142
|
-
| Multi-browser |
|
|
143
|
-
| Accessibility |
|
|
144
|
-
| Performance |
|
|
145
|
-
| Visual diff |
|
|
146
|
-
|
|
|
147
|
-
|
|
|
148
|
-
|
|
|
149
|
-
|
|
|
448
|
+
| Real-user clicks | yes | yes | — | — |
|
|
449
|
+
| Multi-browser | yes | partial | — | — |
|
|
450
|
+
| Accessibility | yes | plugin | — | yes |
|
|
451
|
+
| Performance | yes | — | — | — |
|
|
452
|
+
| Visual diff | yes | plugin | paid | — |
|
|
453
|
+
| Security headers | yes | — | — | — |
|
|
454
|
+
| Vuln JS scan | yes | — | — | — |
|
|
455
|
+
| SEO / structured data | yes | — | — | — |
|
|
456
|
+
| Auto-explore | yes | — | — | — |
|
|
457
|
+
| AI helpers | yes | — | — | — |
|
|
458
|
+
| One report | yes | — | — | — |
|
|
459
|
+
| Open source | MIT | mixed | no | yes |
|
|
150
460
|
|
|
151
461
|
## License
|
|
152
462
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Page } from 'playwright';
|
|
2
|
+
import type { A11yResult, A11yViolation } from './types.js';
|
|
3
|
+
export type WcagLevel = 'wcag2a' | 'wcag2aa' | 'wcag2aaa' | 'wcag21a' | 'wcag21aa' | 'wcag22aa' | 'best-practice';
|
|
4
|
+
export interface A11yFilterOptions {
|
|
5
|
+
include?: WcagLevel[];
|
|
6
|
+
excludeBestPractice?: boolean;
|
|
7
|
+
runOnlyRules?: string[];
|
|
8
|
+
disableRules?: string[];
|
|
9
|
+
elementExclude?: string[];
|
|
10
|
+
impactMinimum?: 'minor' | 'moderate' | 'serious' | 'critical';
|
|
11
|
+
}
|
|
12
|
+
export declare const WCAG_TAG_GROUPS: Record<string, WcagLevel[]>;
|
|
13
|
+
export declare function filterViolationsByImpact(violations: A11yViolation[], minimum: A11yFilterOptions['impactMinimum']): A11yViolation[];
|
|
14
|
+
export declare function runFilteredA11y(page: Page, opts: A11yFilterOptions): Promise<A11yResult>;
|
|
15
|
+
//# sourceMappingURL=a11y-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y-filter.d.ts","sourceRoot":"","sources":["../src/a11y-filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,SAAS,GACT,UAAU,GACV,SAAS,GACT,UAAU,GACV,UAAU,GACV,eAAe,CAAC;AAEpB,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;CAC/D;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAcvD,CAAC;AAwEF,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,aAAa,EAAE,EAC3B,OAAO,EAAE,iBAAiB,CAAC,eAAe,CAAC,GAC1C,aAAa,EAAE,CAIjB;AAmBD,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,UAAU,CAAC,CAsCrB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
export const WCAG_TAG_GROUPS = {
|
|
2
|
+
a: ['wcag2a', 'wcag21a'],
|
|
3
|
+
aa: ['wcag2aa', 'wcag21aa', 'wcag22aa'],
|
|
4
|
+
aaa: ['wcag2aaa'],
|
|
5
|
+
all: ['wcag2a', 'wcag2aa', 'wcag2aaa', 'wcag21a', 'wcag21aa', 'wcag22aa'],
|
|
6
|
+
allWithBestPractice: [
|
|
7
|
+
'wcag2a',
|
|
8
|
+
'wcag2aa',
|
|
9
|
+
'wcag2aaa',
|
|
10
|
+
'wcag21a',
|
|
11
|
+
'wcag21aa',
|
|
12
|
+
'wcag22aa',
|
|
13
|
+
'best-practice',
|
|
14
|
+
],
|
|
15
|
+
};
|
|
16
|
+
const DEFAULT_TAGS = ['wcag2a', 'wcag2aa', 'wcag21aa', 'wcag22aa'];
|
|
17
|
+
const IMPACT_ORDER = {
|
|
18
|
+
minor: 0,
|
|
19
|
+
moderate: 1,
|
|
20
|
+
serious: 2,
|
|
21
|
+
critical: 3,
|
|
22
|
+
};
|
|
23
|
+
async function loadAxeBuilder() {
|
|
24
|
+
try {
|
|
25
|
+
const mod = (await import('@axe-core/playwright'));
|
|
26
|
+
return mod.AxeBuilder ?? mod.default ?? null;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function normalizeImpact(impact) {
|
|
33
|
+
if (impact === 'critical' || impact === 'serious' || impact === 'moderate' || impact === 'minor') {
|
|
34
|
+
return impact;
|
|
35
|
+
}
|
|
36
|
+
return 'minor';
|
|
37
|
+
}
|
|
38
|
+
function toViolation(v) {
|
|
39
|
+
return {
|
|
40
|
+
id: v.id,
|
|
41
|
+
impact: normalizeImpact(v.impact),
|
|
42
|
+
description: v.description,
|
|
43
|
+
help: v.help,
|
|
44
|
+
helpUrl: v.helpUrl,
|
|
45
|
+
nodes: v.nodes.map((n) => ({
|
|
46
|
+
html: n.html,
|
|
47
|
+
target: Array.isArray(n.target) ? n.target.filter((t) => typeof t === 'string') : [],
|
|
48
|
+
})),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function filterViolationsByImpact(violations, minimum) {
|
|
52
|
+
if (!minimum)
|
|
53
|
+
return violations;
|
|
54
|
+
const threshold = IMPACT_ORDER[minimum];
|
|
55
|
+
return violations.filter((v) => IMPACT_ORDER[v.impact] >= threshold);
|
|
56
|
+
}
|
|
57
|
+
function resolveTags(opts) {
|
|
58
|
+
const base = opts.include && opts.include.length > 0 ? [...opts.include] : [...DEFAULT_TAGS];
|
|
59
|
+
const excludeBP = opts.excludeBestPractice ?? true;
|
|
60
|
+
const hasBP = base.includes('best-practice');
|
|
61
|
+
if (!excludeBP && !hasBP) {
|
|
62
|
+
base.push('best-practice');
|
|
63
|
+
}
|
|
64
|
+
if (excludeBP && hasBP) {
|
|
65
|
+
return base.filter((t) => t !== 'best-practice');
|
|
66
|
+
}
|
|
67
|
+
return base;
|
|
68
|
+
}
|
|
69
|
+
function emptyResult(page) {
|
|
70
|
+
return { page: page.url(), violations: [], passed: true };
|
|
71
|
+
}
|
|
72
|
+
export async function runFilteredA11y(page, opts) {
|
|
73
|
+
const AxeBuilder = await loadAxeBuilder();
|
|
74
|
+
if (!AxeBuilder) {
|
|
75
|
+
return emptyResult(page);
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
let builder = new AxeBuilder({ page });
|
|
79
|
+
if (opts.runOnlyRules && opts.runOnlyRules.length > 0) {
|
|
80
|
+
builder = builder.withRules(opts.runOnlyRules);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
const tags = resolveTags(opts);
|
|
84
|
+
builder = builder.withTags(tags);
|
|
85
|
+
}
|
|
86
|
+
if (opts.disableRules && opts.disableRules.length > 0) {
|
|
87
|
+
builder = builder.disableRules(opts.disableRules);
|
|
88
|
+
}
|
|
89
|
+
if (opts.elementExclude && opts.elementExclude.length > 0) {
|
|
90
|
+
for (const selector of opts.elementExclude) {
|
|
91
|
+
builder = builder.exclude(selector);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const result = await builder.analyze();
|
|
95
|
+
const mapped = result.violations.map(toViolation);
|
|
96
|
+
const filtered = filterViolationsByImpact(mapped, opts.impactMinimum);
|
|
97
|
+
return {
|
|
98
|
+
page: page.url(),
|
|
99
|
+
violations: filtered,
|
|
100
|
+
passed: filtered.length === 0,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return emptyResult(page);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=a11y-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y-filter.js","sourceRoot":"","sources":["../src/a11y-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { InspectResult } from './types.js';
|
|
2
|
+
export interface Diff {
|
|
3
|
+
check: string;
|
|
4
|
+
delta: string;
|
|
5
|
+
aValue: string | number;
|
|
6
|
+
bValue: string | number;
|
|
7
|
+
direction: 'regression' | 'improvement';
|
|
8
|
+
severity: 'minor' | 'major' | 'critical';
|
|
9
|
+
}
|
|
10
|
+
export interface CompareResult {
|
|
11
|
+
labelA: string;
|
|
12
|
+
labelB: string;
|
|
13
|
+
regressions: Diff[];
|
|
14
|
+
improvements: Diff[];
|
|
15
|
+
unchanged: number;
|
|
16
|
+
summary: {
|
|
17
|
+
regressedChecks: number;
|
|
18
|
+
improvedChecks: number;
|
|
19
|
+
};
|
|
20
|
+
passed: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function compareInspect(a: InspectResult, b: InspectResult): CompareResult;
|
|
23
|
+
//# sourceMappingURL=ab-compare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ab-compare.d.ts","sourceRoot":"","sources":["../src/ab-compare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,SAAS,EAAE,YAAY,GAAG,aAAa,CAAC;IACxC,QAAQ,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;CAC1C;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,IAAI,EAAE,CAAC;IACpB,YAAY,EAAE,IAAI,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,MAAM,EAAE,OAAO,CAAC;CACjB;AA0QD,wBAAgB,cAAc,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,aAAa,CA+EhF"}
|