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
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Page } from 'playwright';
|
|
2
|
+
export interface LongTaskSample {
|
|
3
|
+
startTime: number;
|
|
4
|
+
duration: number;
|
|
5
|
+
attribution: {
|
|
6
|
+
containerType?: string;
|
|
7
|
+
containerSrc?: string;
|
|
8
|
+
containerId?: string;
|
|
9
|
+
containerName?: string;
|
|
10
|
+
}[];
|
|
11
|
+
}
|
|
12
|
+
export interface LoAFSample {
|
|
13
|
+
startTime: number;
|
|
14
|
+
duration: number;
|
|
15
|
+
renderStart?: number;
|
|
16
|
+
styleAndLayoutStart?: number;
|
|
17
|
+
blockingDuration: number;
|
|
18
|
+
scripts: {
|
|
19
|
+
name?: string;
|
|
20
|
+
invoker?: string;
|
|
21
|
+
invokerType?: string;
|
|
22
|
+
duration: number;
|
|
23
|
+
sourceURL?: string;
|
|
24
|
+
sourceFunctionName?: string;
|
|
25
|
+
sourceCharPosition?: number;
|
|
26
|
+
}[];
|
|
27
|
+
}
|
|
28
|
+
export interface LongTasksResult {
|
|
29
|
+
page: string;
|
|
30
|
+
longTasks: LongTaskSample[];
|
|
31
|
+
longAnimationFrames: LoAFSample[];
|
|
32
|
+
totalBlockingMs: number;
|
|
33
|
+
inpMs?: number;
|
|
34
|
+
inpTarget?: string;
|
|
35
|
+
passed: boolean;
|
|
36
|
+
}
|
|
37
|
+
export declare function captureLongTasks(page: Page, durationMs?: number): Promise<LongTasksResult>;
|
|
38
|
+
//# sourceMappingURL=longtasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"longtasks.d.ts","sourceRoot":"","sources":["../src/longtasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAChH;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACtK;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,mBAAmB,EAAE,UAAU,EAAE,CAAC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB;AAOD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,SAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAkH9F"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
export async function captureLongTasks(page, durationMs = 5000) {
|
|
2
|
+
await page.evaluate(() => {
|
|
3
|
+
const w = window;
|
|
4
|
+
w.__uxi_longtasks = [];
|
|
5
|
+
w.__uxi_loaf = [];
|
|
6
|
+
w.__uxi_inp = [];
|
|
7
|
+
try {
|
|
8
|
+
new PerformanceObserver((list) => {
|
|
9
|
+
const store = w.__uxi_longtasks;
|
|
10
|
+
list.getEntries().forEach((e) => {
|
|
11
|
+
const entry = e;
|
|
12
|
+
store.push({
|
|
13
|
+
startTime: entry.startTime,
|
|
14
|
+
duration: entry.duration,
|
|
15
|
+
attribution: entry.attribution?.map((a) => ({
|
|
16
|
+
containerType: a.containerType,
|
|
17
|
+
containerSrc: a.containerSrc,
|
|
18
|
+
containerId: a.containerId,
|
|
19
|
+
containerName: a.containerName,
|
|
20
|
+
})) ?? [],
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}).observe({ type: 'longtask', buffered: true });
|
|
24
|
+
}
|
|
25
|
+
catch (_) { /* unsupported */ }
|
|
26
|
+
try {
|
|
27
|
+
new PerformanceObserver((list) => {
|
|
28
|
+
const store = w.__uxi_loaf;
|
|
29
|
+
list.getEntries().forEach((e) => {
|
|
30
|
+
const entry = e;
|
|
31
|
+
store.push({
|
|
32
|
+
startTime: entry.startTime,
|
|
33
|
+
duration: entry.duration,
|
|
34
|
+
renderStart: entry.renderStart,
|
|
35
|
+
styleAndLayoutStart: entry.styleAndLayoutStart,
|
|
36
|
+
blockingDuration: entry.blockingDuration ?? 0,
|
|
37
|
+
scripts: entry.scripts?.map((s) => ({
|
|
38
|
+
name: s.name,
|
|
39
|
+
invoker: s.invoker,
|
|
40
|
+
invokerType: s.invokerType,
|
|
41
|
+
duration: s.duration,
|
|
42
|
+
sourceURL: s.sourceURL,
|
|
43
|
+
sourceFunctionName: s.sourceFunctionName,
|
|
44
|
+
sourceCharPosition: s.sourceCharPosition,
|
|
45
|
+
})) ?? [],
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}).observe({ type: 'long-animation-frame', buffered: true });
|
|
49
|
+
}
|
|
50
|
+
catch (_) { /* unsupported */ }
|
|
51
|
+
try {
|
|
52
|
+
new PerformanceObserver((list) => {
|
|
53
|
+
const store = w.__uxi_inp;
|
|
54
|
+
list.getEntries().forEach((e) => {
|
|
55
|
+
const entry = e;
|
|
56
|
+
if (!entry.interactionId)
|
|
57
|
+
return;
|
|
58
|
+
let selector = '';
|
|
59
|
+
if (entry.target) {
|
|
60
|
+
const el = entry.target;
|
|
61
|
+
selector = el.tagName.toLowerCase();
|
|
62
|
+
if (el.id)
|
|
63
|
+
selector += `#${el.id}`;
|
|
64
|
+
const firstClass = el.classList?.[0];
|
|
65
|
+
if (firstClass)
|
|
66
|
+
selector += `.${firstClass}`;
|
|
67
|
+
}
|
|
68
|
+
store.push({ duration: entry.duration, target: selector });
|
|
69
|
+
});
|
|
70
|
+
}).observe({ type: 'event', durationThreshold: 40, buffered: true });
|
|
71
|
+
}
|
|
72
|
+
catch (_) { /* unsupported */ }
|
|
73
|
+
});
|
|
74
|
+
await page.waitForTimeout(durationMs);
|
|
75
|
+
const longTasks = await page.evaluate(() => window.__uxi_longtasks ?? []);
|
|
76
|
+
const longAnimationFrames = await page.evaluate(() => window.__uxi_loaf ?? []);
|
|
77
|
+
const inpEntries = await page.evaluate(() => window.__uxi_inp ?? []);
|
|
78
|
+
const totalBlockingMs = longTasks.reduce((sum, t) => sum + (t.duration > 50 ? t.duration - 50 : 0), 0);
|
|
79
|
+
let inpMs;
|
|
80
|
+
let inpTarget;
|
|
81
|
+
if (inpEntries.length > 0) {
|
|
82
|
+
const worst = inpEntries.reduce((max, e) => (e.duration > max.duration ? e : max), inpEntries[0]);
|
|
83
|
+
inpMs = worst.duration;
|
|
84
|
+
inpTarget = worst.target || undefined;
|
|
85
|
+
}
|
|
86
|
+
const passed = totalBlockingMs < 600 && (inpMs === undefined || inpMs < 200);
|
|
87
|
+
return {
|
|
88
|
+
page: page.url(),
|
|
89
|
+
longTasks,
|
|
90
|
+
longAnimationFrames,
|
|
91
|
+
totalBlockingMs,
|
|
92
|
+
inpMs,
|
|
93
|
+
inpTarget,
|
|
94
|
+
passed,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=longtasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"longtasks.js","sourceRoot":"","sources":["../src/longtasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface EmailMessage {
|
|
2
|
+
id: string;
|
|
3
|
+
from: string;
|
|
4
|
+
to: string[];
|
|
5
|
+
subject: string;
|
|
6
|
+
textBody?: string;
|
|
7
|
+
htmlBody?: string;
|
|
8
|
+
links: string[];
|
|
9
|
+
verificationCode?: string;
|
|
10
|
+
receivedAt: string;
|
|
11
|
+
}
|
|
12
|
+
export type MailboxConfig = {
|
|
13
|
+
provider: 'maildev';
|
|
14
|
+
baseUrl: string;
|
|
15
|
+
} | {
|
|
16
|
+
provider: 'mailpit';
|
|
17
|
+
baseUrl: string;
|
|
18
|
+
} | {
|
|
19
|
+
provider: 'generic-http';
|
|
20
|
+
baseUrl: string;
|
|
21
|
+
authToken?: string;
|
|
22
|
+
listPath: string;
|
|
23
|
+
itemPath: string;
|
|
24
|
+
};
|
|
25
|
+
export interface WaitForEmailOptions {
|
|
26
|
+
subjectContains?: string;
|
|
27
|
+
bodyContains?: string;
|
|
28
|
+
to?: string;
|
|
29
|
+
timeoutMs?: number;
|
|
30
|
+
pollMs?: number;
|
|
31
|
+
}
|
|
32
|
+
export declare function extractLinks(body: string): string[];
|
|
33
|
+
export declare function extractCode(body: string, digits?: number): string | undefined;
|
|
34
|
+
export declare function waitForEmail(config: MailboxConfig, opts: WaitForEmailOptions): Promise<EmailMessage | null>;
|
|
35
|
+
//# sourceMappingURL=mailbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mailbox.d.ts","sourceRoot":"","sources":["../src/mailbox.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,QAAQ,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1G,MAAM,WAAW,mBAAmB;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAanD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAI,GAAG,MAAM,GAAG,SAAS,CAKxE;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAsB9B"}
|
package/dist/mailbox.js
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
const DEFAULT_TIMEOUT_MS = 30000;
|
|
2
|
+
const DEFAULT_POLL_MS = 1000;
|
|
3
|
+
const LINK_RE = /https?:\/\/[^\s"'<>)]+/g;
|
|
4
|
+
export function extractLinks(body) {
|
|
5
|
+
if (!body)
|
|
6
|
+
return [];
|
|
7
|
+
const matches = body.match(LINK_RE);
|
|
8
|
+
if (!matches)
|
|
9
|
+
return [];
|
|
10
|
+
const seen = new Set();
|
|
11
|
+
const out = [];
|
|
12
|
+
for (const m of matches) {
|
|
13
|
+
if (!seen.has(m)) {
|
|
14
|
+
seen.add(m);
|
|
15
|
+
out.push(m);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
export function extractCode(body, digits = 6) {
|
|
21
|
+
if (!body)
|
|
22
|
+
return undefined;
|
|
23
|
+
const re = new RegExp(`\\b\\d{${digits}}\\b`);
|
|
24
|
+
const m = body.match(re);
|
|
25
|
+
return m ? m[0] : undefined;
|
|
26
|
+
}
|
|
27
|
+
export async function waitForEmail(config, opts) {
|
|
28
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
29
|
+
const pollMs = opts.pollMs ?? DEFAULT_POLL_MS;
|
|
30
|
+
const deadline = Date.now() + timeoutMs;
|
|
31
|
+
const signal = AbortSignal.timeout(timeoutMs);
|
|
32
|
+
while (Date.now() < deadline) {
|
|
33
|
+
try {
|
|
34
|
+
const messages = await listMessages(config, signal);
|
|
35
|
+
const match = findMatch(messages, opts);
|
|
36
|
+
if (match) {
|
|
37
|
+
return await hydrate(config, match, signal);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
if (signal.aborted)
|
|
42
|
+
return null;
|
|
43
|
+
if (e?.name === 'AbortError' || e?.name === 'TimeoutError')
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
const remaining = deadline - Date.now();
|
|
47
|
+
if (remaining <= 0)
|
|
48
|
+
break;
|
|
49
|
+
await sleep(Math.min(pollMs, remaining), signal);
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
function findMatch(messages, opts) {
|
|
54
|
+
return messages.find((m) => {
|
|
55
|
+
if (opts.to && !m.to.some((t) => t.toLowerCase().includes(opts.to.toLowerCase())))
|
|
56
|
+
return false;
|
|
57
|
+
if (opts.subjectContains && !m.subject.includes(opts.subjectContains))
|
|
58
|
+
return false;
|
|
59
|
+
if (opts.bodyContains) {
|
|
60
|
+
const text = (m.textBody ?? '') + '\n' + (m.htmlBody ?? '');
|
|
61
|
+
if (!text.includes(opts.bodyContains))
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
return true;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async function listMessages(config, signal) {
|
|
68
|
+
if (config.provider === 'maildev') {
|
|
69
|
+
const url = joinUrl(config.baseUrl, '/email');
|
|
70
|
+
const res = await fetch(url, { signal });
|
|
71
|
+
if (!res.ok)
|
|
72
|
+
throw new Error(`mailbox API list failed: ${res.status}`);
|
|
73
|
+
const arr = (await res.json());
|
|
74
|
+
return arr.map(parseMaildev);
|
|
75
|
+
}
|
|
76
|
+
if (config.provider === 'mailpit') {
|
|
77
|
+
const url = joinUrl(config.baseUrl, '/api/v1/messages');
|
|
78
|
+
const res = await fetch(url, { signal });
|
|
79
|
+
if (!res.ok)
|
|
80
|
+
throw new Error(`mailbox API list failed: ${res.status}`);
|
|
81
|
+
const body = (await res.json());
|
|
82
|
+
const list = Array.isArray(body?.messages) ? body.messages : [];
|
|
83
|
+
return list.map(parseMailpitSummary);
|
|
84
|
+
}
|
|
85
|
+
const url = joinUrl(config.baseUrl, config.listPath);
|
|
86
|
+
const res = await fetch(url, { signal, headers: authHeaders(config.authToken) });
|
|
87
|
+
if (!res.ok)
|
|
88
|
+
throw new Error(`mailbox API list failed: ${res.status}`);
|
|
89
|
+
const body = (await res.json());
|
|
90
|
+
const list = Array.isArray(body) ? body : Array.isArray(body?.messages) ? body.messages : [];
|
|
91
|
+
return list.map(parseGeneric);
|
|
92
|
+
}
|
|
93
|
+
async function hydrate(config, msg, signal) {
|
|
94
|
+
if (config.provider === 'mailpit') {
|
|
95
|
+
const url = joinUrl(config.baseUrl, `/api/v1/message/${encodeURIComponent(msg.id)}`);
|
|
96
|
+
const res = await fetch(url, { signal });
|
|
97
|
+
if (!res.ok)
|
|
98
|
+
return finalize(msg);
|
|
99
|
+
const full = (await res.json());
|
|
100
|
+
const hydrated = {
|
|
101
|
+
...msg,
|
|
102
|
+
textBody: typeof full?.Text === 'string' ? full.Text : msg.textBody,
|
|
103
|
+
htmlBody: typeof full?.HTML === 'string' ? full.HTML : msg.htmlBody,
|
|
104
|
+
};
|
|
105
|
+
return finalize(hydrated);
|
|
106
|
+
}
|
|
107
|
+
if (config.provider === 'generic-http') {
|
|
108
|
+
const path = config.itemPath.replace('{id}', encodeURIComponent(msg.id));
|
|
109
|
+
const url = joinUrl(config.baseUrl, path);
|
|
110
|
+
const res = await fetch(url, { signal, headers: authHeaders(config.authToken) });
|
|
111
|
+
if (res.ok) {
|
|
112
|
+
const full = (await res.json());
|
|
113
|
+
return finalize(parseGeneric({ ...full, id: full?.id ?? msg.id }));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return finalize(msg);
|
|
117
|
+
}
|
|
118
|
+
function finalize(msg) {
|
|
119
|
+
const combined = `${msg.textBody ?? ''}\n${msg.htmlBody ?? ''}`;
|
|
120
|
+
const links = extractLinks(combined);
|
|
121
|
+
const verificationCode = extractCode(msg.textBody ?? msg.htmlBody ?? '');
|
|
122
|
+
return { ...msg, links, verificationCode };
|
|
123
|
+
}
|
|
124
|
+
function parseMaildev(raw) {
|
|
125
|
+
const from = Array.isArray(raw?.from) && raw.from[0]
|
|
126
|
+
? addrString(raw.from[0])
|
|
127
|
+
: typeof raw?.from === 'string' ? raw.from : '';
|
|
128
|
+
const to = Array.isArray(raw?.to)
|
|
129
|
+
? raw.to.map(addrString).filter(Boolean)
|
|
130
|
+
: typeof raw?.to === 'string' ? [raw.to] : [];
|
|
131
|
+
return {
|
|
132
|
+
id: String(raw?.id ?? raw?._id ?? ''),
|
|
133
|
+
from,
|
|
134
|
+
to,
|
|
135
|
+
subject: String(raw?.subject ?? ''),
|
|
136
|
+
textBody: typeof raw?.text === 'string' ? raw.text : undefined,
|
|
137
|
+
htmlBody: typeof raw?.html === 'string' ? raw.html : undefined,
|
|
138
|
+
links: [],
|
|
139
|
+
receivedAt: String(raw?.date ?? raw?.time ?? new Date().toISOString()),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function parseMailpitSummary(raw) {
|
|
143
|
+
const from = raw?.From ? addrString(raw.From) : '';
|
|
144
|
+
const to = Array.isArray(raw?.To) ? raw.To.map(addrString).filter(Boolean) : [];
|
|
145
|
+
return {
|
|
146
|
+
id: String(raw?.ID ?? ''),
|
|
147
|
+
from,
|
|
148
|
+
to,
|
|
149
|
+
subject: String(raw?.Subject ?? ''),
|
|
150
|
+
textBody: typeof raw?.Snippet === 'string' ? raw.Snippet : undefined,
|
|
151
|
+
htmlBody: undefined,
|
|
152
|
+
links: [],
|
|
153
|
+
receivedAt: String(raw?.Created ?? new Date().toISOString()),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function parseGeneric(raw) {
|
|
157
|
+
const from = typeof raw?.from === 'string' ? raw.from : addrString(raw?.from);
|
|
158
|
+
const toRaw = raw?.to;
|
|
159
|
+
const to = Array.isArray(toRaw)
|
|
160
|
+
? toRaw.map((t) => (typeof t === 'string' ? t : addrString(t))).filter(Boolean)
|
|
161
|
+
: typeof toRaw === 'string' ? [toRaw] : toRaw ? [addrString(toRaw)].filter(Boolean) : [];
|
|
162
|
+
return {
|
|
163
|
+
id: String(raw?.id ?? raw?._id ?? raw?.ID ?? ''),
|
|
164
|
+
from: from ?? '',
|
|
165
|
+
to,
|
|
166
|
+
subject: String(raw?.subject ?? raw?.Subject ?? ''),
|
|
167
|
+
textBody: typeof raw?.text === 'string' ? raw.text : typeof raw?.Text === 'string' ? raw.Text : undefined,
|
|
168
|
+
htmlBody: typeof raw?.html === 'string' ? raw.html : typeof raw?.HTML === 'string' ? raw.HTML : undefined,
|
|
169
|
+
links: [],
|
|
170
|
+
receivedAt: String(raw?.receivedAt ?? raw?.date ?? raw?.Created ?? new Date().toISOString()),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
function addrString(a) {
|
|
174
|
+
if (!a)
|
|
175
|
+
return '';
|
|
176
|
+
if (typeof a === 'string')
|
|
177
|
+
return a;
|
|
178
|
+
const addr = a.address ?? a.Address ?? '';
|
|
179
|
+
const name = a.name ?? a.Name ?? '';
|
|
180
|
+
if (addr && name)
|
|
181
|
+
return `${name} <${addr}>`;
|
|
182
|
+
return addr || name || '';
|
|
183
|
+
}
|
|
184
|
+
function authHeaders(token) {
|
|
185
|
+
return token ? { Authorization: `Bearer ${token}` } : {};
|
|
186
|
+
}
|
|
187
|
+
function joinUrl(base, path) {
|
|
188
|
+
const b = base.endsWith('/') ? base.slice(0, -1) : base;
|
|
189
|
+
const p = path.startsWith('/') ? path : `/${path}`;
|
|
190
|
+
return `${b}${p}`;
|
|
191
|
+
}
|
|
192
|
+
function sleep(ms, signal) {
|
|
193
|
+
return new Promise((resolve) => {
|
|
194
|
+
if (signal.aborted)
|
|
195
|
+
return resolve();
|
|
196
|
+
const t = setTimeout(() => {
|
|
197
|
+
signal.removeEventListener('abort', onAbort);
|
|
198
|
+
resolve();
|
|
199
|
+
}, ms);
|
|
200
|
+
const onAbort = () => {
|
|
201
|
+
clearTimeout(t);
|
|
202
|
+
resolve();
|
|
203
|
+
};
|
|
204
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=mailbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mailbox.js","sourceRoot":"","sources":["../src/mailbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Page } from 'playwright';
|
|
2
|
+
export type MediaIssueType = 'video-no-track' | 'audio-no-transcript' | 'autoplay-without-muted' | 'no-controls' | 'missing-accessible-name' | 'track-missing-srclang' | 'track-missing-label' | 'default-track-missing' | 'no-poster' | 'flashing-risk' | 'playsinline-missing-on-mobile' | 'audio-description-missing';
|
|
3
|
+
export interface MediaIssue {
|
|
4
|
+
type: MediaIssueType;
|
|
5
|
+
severity: 'info' | 'warn' | 'error';
|
|
6
|
+
selector: string;
|
|
7
|
+
detail: string;
|
|
8
|
+
mediaType: 'video' | 'audio' | 'iframe';
|
|
9
|
+
}
|
|
10
|
+
export interface MediaAuditResult {
|
|
11
|
+
page: string;
|
|
12
|
+
videoCount: number;
|
|
13
|
+
audioCount: number;
|
|
14
|
+
iframeMediaCount: number;
|
|
15
|
+
accessibleCount: number;
|
|
16
|
+
issues: MediaIssue[];
|
|
17
|
+
passed: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function auditMedia(page: Page): Promise<MediaAuditResult>;
|
|
20
|
+
//# sourceMappingURL=media-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-audit.d.ts","sourceRoot":"","sources":["../src/media-audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,MAAM,MAAM,cAAc,GACtB,gBAAgB,GAChB,qBAAqB,GACrB,wBAAwB,GACxB,aAAa,GACb,yBAAyB,GACzB,uBAAuB,GACvB,qBAAqB,GACrB,uBAAuB,GACvB,WAAW,GACX,eAAe,GACf,+BAA+B,GAC/B,2BAA2B,CAAC;AAEhC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;CACzC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0PtE"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
export async function auditMedia(page) {
|
|
2
|
+
const url = page.url();
|
|
3
|
+
const result = await page.evaluate(() => {
|
|
4
|
+
const issues = [];
|
|
5
|
+
let errorCount = 0;
|
|
6
|
+
const push = (type, severity, selector, detail, mediaType) => {
|
|
7
|
+
issues.push({ type, severity, selector, detail, mediaType });
|
|
8
|
+
if (severity === 'error')
|
|
9
|
+
errorCount++;
|
|
10
|
+
};
|
|
11
|
+
const selectorPath = (el) => {
|
|
12
|
+
const parts = [];
|
|
13
|
+
let node = el;
|
|
14
|
+
let depth = 0;
|
|
15
|
+
while (node && node.nodeType === 1 && depth < 6) {
|
|
16
|
+
const cur = node;
|
|
17
|
+
const tag = cur.tagName.toLowerCase();
|
|
18
|
+
const parent = cur.parentElement;
|
|
19
|
+
if (!parent) {
|
|
20
|
+
parts.unshift(tag);
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
const sibs = Array.from(parent.children).filter((c) => c.tagName === cur.tagName);
|
|
24
|
+
const idx = sibs.indexOf(cur) + 1;
|
|
25
|
+
parts.unshift(sibs.length > 1 ? `${tag}:nth-of-type(${idx})` : tag);
|
|
26
|
+
node = parent;
|
|
27
|
+
depth++;
|
|
28
|
+
}
|
|
29
|
+
return parts.join(' > ');
|
|
30
|
+
};
|
|
31
|
+
const hasScripted = (el) => {
|
|
32
|
+
const p = el.parentElement;
|
|
33
|
+
if (!p)
|
|
34
|
+
return false;
|
|
35
|
+
const r = p.getAttribute('role');
|
|
36
|
+
if (r === 'region' || r === 'group' || r === 'application')
|
|
37
|
+
return true;
|
|
38
|
+
for (const sib of Array.from(p.children)) {
|
|
39
|
+
if (sib === el)
|
|
40
|
+
continue;
|
|
41
|
+
const tag = sib.tagName.toLowerCase();
|
|
42
|
+
if (tag === 'button' || tag === 'input')
|
|
43
|
+
return true;
|
|
44
|
+
const sr = sib.getAttribute('role');
|
|
45
|
+
if (sr === 'button' || sr === 'slider' || sr === 'toolbar')
|
|
46
|
+
return true;
|
|
47
|
+
if (sib.querySelector('button, [role="button"], [role="slider"], [role="toolbar"]'))
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
};
|
|
52
|
+
const transcriptRe = /transcript/i;
|
|
53
|
+
const hasTranscript = (el) => {
|
|
54
|
+
for (const attr of ['aria-describedby', 'aria-labelledby']) {
|
|
55
|
+
const v = el.getAttribute(attr);
|
|
56
|
+
if (!v)
|
|
57
|
+
continue;
|
|
58
|
+
for (const id of v.split(/\s+/).filter(Boolean)) {
|
|
59
|
+
const t = document.getElementById(id);
|
|
60
|
+
if (t && transcriptRe.test(t.textContent || ''))
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const p = el.parentElement;
|
|
65
|
+
if (p && transcriptRe.test(p.textContent || ''))
|
|
66
|
+
return true;
|
|
67
|
+
for (const dir of ['next', 'prev']) {
|
|
68
|
+
let s = dir === 'next' ? el.nextElementSibling : el.previousElementSibling;
|
|
69
|
+
let h = 0;
|
|
70
|
+
while (s && h < 4) {
|
|
71
|
+
if (transcriptRe.test(s.textContent || ''))
|
|
72
|
+
return true;
|
|
73
|
+
s = dir === 'next' ? s.nextElementSibling : s.previousElementSibling;
|
|
74
|
+
h++;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return false;
|
|
78
|
+
};
|
|
79
|
+
const isMobile = window.innerWidth <= 768;
|
|
80
|
+
const videoEls = Array.from(document.querySelectorAll('video'));
|
|
81
|
+
const audioEls = Array.from(document.querySelectorAll('audio'));
|
|
82
|
+
const iframeEls = Array.from(document.querySelectorAll('iframe'));
|
|
83
|
+
for (const v of videoEls) {
|
|
84
|
+
const sel = selectorPath(v);
|
|
85
|
+
const tracks = Array.from(v.querySelectorAll('track'));
|
|
86
|
+
const captions = tracks.filter((t) => {
|
|
87
|
+
const k = (t.getAttribute('kind') || '').toLowerCase();
|
|
88
|
+
return k === 'captions' || k === 'subtitles';
|
|
89
|
+
});
|
|
90
|
+
if (captions.length === 0) {
|
|
91
|
+
push('video-no-track', 'error', sel, 'video has no captions or subtitles track', 'video');
|
|
92
|
+
}
|
|
93
|
+
if (v.hasAttribute('autoplay') && !(v.hasAttribute('muted') || v.muted)) {
|
|
94
|
+
push('autoplay-without-muted', 'error', sel, 'autoplay video must be muted to comply with WCAG 1.4.2', 'video');
|
|
95
|
+
}
|
|
96
|
+
if (!v.hasAttribute('controls') && !hasScripted(v)) {
|
|
97
|
+
push('no-controls', 'warn', sel, 'video has no controls attribute and no scripted control siblings', 'video');
|
|
98
|
+
}
|
|
99
|
+
if (!v.hasAttribute('poster')) {
|
|
100
|
+
push('no-poster', 'info', sel, 'video has no poster image', 'video');
|
|
101
|
+
}
|
|
102
|
+
if (isMobile && !v.hasAttribute('playsinline')) {
|
|
103
|
+
push('playsinline-missing-on-mobile', 'info', sel, 'video missing playsinline on mobile viewport', 'video');
|
|
104
|
+
}
|
|
105
|
+
for (const tr of tracks) {
|
|
106
|
+
const ts = selectorPath(tr);
|
|
107
|
+
if (!tr.getAttribute('srclang')) {
|
|
108
|
+
push('track-missing-srclang', 'warn', ts, 'track element missing srclang attribute', 'video');
|
|
109
|
+
}
|
|
110
|
+
if (!tr.getAttribute('label')) {
|
|
111
|
+
push('track-missing-label', 'warn', ts, 'track element missing label attribute', 'video');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (tracks.length > 0 && !tracks.some((t) => t.hasAttribute('default'))) {
|
|
115
|
+
push('default-track-missing', 'info', sel, 'multiple tracks present but none marked default', 'video');
|
|
116
|
+
}
|
|
117
|
+
if (tracks.length > 0 &&
|
|
118
|
+
!tracks.some((t) => (t.getAttribute('kind') || '').toLowerCase() === 'descriptions')) {
|
|
119
|
+
push('audio-description-missing', 'info', sel, 'video has tracks but no audio descriptions track', 'video');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
for (const a of audioEls) {
|
|
123
|
+
const sel = selectorPath(a);
|
|
124
|
+
if (!hasTranscript(a)) {
|
|
125
|
+
push('audio-no-transcript', 'warn', sel, 'audio element has no adjacent transcript link or region', 'audio');
|
|
126
|
+
}
|
|
127
|
+
if (a.hasAttribute('autoplay') && !(a.hasAttribute('muted') || a.muted)) {
|
|
128
|
+
push('autoplay-without-muted', 'error', sel, 'autoplay audio must be muted to comply with WCAG 1.4.2', 'audio');
|
|
129
|
+
}
|
|
130
|
+
if (!a.hasAttribute('controls') && !hasScripted(a)) {
|
|
131
|
+
push('no-controls', 'warn', sel, 'audio has no controls attribute and no scripted control siblings', 'audio');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const platformRe = /youtube|vimeo|dailymotion|wistia|jwplatform|brightcove/;
|
|
135
|
+
let iframeMediaCount = 0;
|
|
136
|
+
for (const f of iframeEls) {
|
|
137
|
+
const src = (f.getAttribute('src') || '').toLowerCase();
|
|
138
|
+
if (!platformRe.test(src))
|
|
139
|
+
continue;
|
|
140
|
+
iframeMediaCount++;
|
|
141
|
+
const title = (f.getAttribute('title') || '').trim();
|
|
142
|
+
if (!title) {
|
|
143
|
+
push('missing-accessible-name', 'error', selectorPath(f), 'video platform embed iframe missing title attribute', 'iframe');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const flashRe = /\b(flashing|strobe|seizure)\b/i;
|
|
147
|
+
const seen = new Set();
|
|
148
|
+
for (const el of Array.from(document.querySelectorAll('body *'))) {
|
|
149
|
+
const text = (el.textContent || '').slice(0, 500);
|
|
150
|
+
if (!flashRe.test(text))
|
|
151
|
+
continue;
|
|
152
|
+
let childHit = false;
|
|
153
|
+
for (const c of Array.from(el.children)) {
|
|
154
|
+
if (seen.has(c)) {
|
|
155
|
+
childHit = true;
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (childHit)
|
|
160
|
+
continue;
|
|
161
|
+
seen.add(el);
|
|
162
|
+
const live = el.getAttribute('aria-live') === 'assertive';
|
|
163
|
+
push('flashing-risk', 'warn', selectorPath(el), live
|
|
164
|
+
? 'aria-live region contains flashing/strobe/seizure keyword'
|
|
165
|
+
: 'element text mentions flashing/strobe/seizure', 'video');
|
|
166
|
+
}
|
|
167
|
+
const videoCount = videoEls.length;
|
|
168
|
+
const audioCount = audioEls.length;
|
|
169
|
+
const accessibleCount = Math.max(0, videoCount + audioCount - errorCount);
|
|
170
|
+
return { videoCount, audioCount, iframeMediaCount, accessibleCount, issues };
|
|
171
|
+
});
|
|
172
|
+
return {
|
|
173
|
+
page: url,
|
|
174
|
+
videoCount: result.videoCount,
|
|
175
|
+
audioCount: result.audioCount,
|
|
176
|
+
iframeMediaCount: result.iframeMediaCount,
|
|
177
|
+
accessibleCount: result.accessibleCount,
|
|
178
|
+
issues: result.issues,
|
|
179
|
+
passed: result.issues.every((i) => i.severity !== 'error'),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=media-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-audit.js","sourceRoot":"","sources":["../src/media-audit.ts"],"names":[],"mappings":"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"}
|