qa360 2.2.20 → 2.3.1
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 +155 -262
- package/{cli/dist → dist}/commands/ai.js +1 -1
- package/{cli/dist → dist}/commands/coverage.js +1 -1
- package/{cli/dist → dist}/commands/crawl.d.ts +12 -1
- package/{cli/dist → dist}/commands/crawl.js +70 -9
- package/{cli/dist → dist}/commands/doctor.js +2 -2
- package/{cli/dist → dist}/commands/explain.js +2 -2
- package/{cli/dist → dist}/commands/flakiness.js +1 -1
- package/{cli/dist → dist}/commands/generate.js +1 -1
- package/{cli/dist → dist}/commands/history.js +1 -1
- package/{cli/dist → dist}/commands/monitor.js +3 -3
- package/{cli/dist → dist}/commands/ollama.js +1 -1
- package/{cli/dist → dist}/commands/pack.js +2 -2
- package/{cli/dist → dist}/commands/regression.js +1 -1
- package/{cli/dist → dist}/commands/repair.js +1 -1
- package/{cli/dist → dist}/commands/retry.js +1 -1
- package/{cli/dist → dist}/commands/run.d.ts +1 -1
- package/{cli/dist → dist}/commands/run.js +1 -1
- package/{cli/dist → dist}/commands/secrets.js +1 -1
- package/{cli/dist → dist}/commands/serve.js +1 -1
- package/{cli/dist → dist}/commands/slo.js +1 -1
- package/{cli/dist → dist}/commands/verify.js +1 -1
- package/{cli/dist → dist}/core/adapters/playwright-native-api.d.ts +2 -0
- package/{cli/dist → dist}/core/adapters/playwright-native-api.js +20 -1
- package/{cli/dist → dist}/core/adapters/playwright-ui.d.ts +21 -0
- package/dist/core/adapters/playwright-ui.js +2050 -0
- package/{cli/dist → dist}/core/ai/ollama-provider.js +15 -3
- package/{cli/dist → dist}/core/artifacts/ui-artifacts.js +24 -4
- package/dist/core/auth/backup-codes-provider.d.ts +91 -0
- package/dist/core/auth/backup-codes-provider.js +215 -0
- package/{cli/dist → dist}/core/auth/basic-auth-provider.d.ts +6 -0
- package/{cli/dist → dist}/core/auth/basic-auth-provider.js +24 -6
- package/dist/core/auth/digest-auth-provider.d.ts +116 -0
- package/dist/core/auth/digest-auth-provider.js +244 -0
- package/dist/core/auth/hcaptcha-handler.d.ts +103 -0
- package/dist/core/auth/hcaptcha-handler.js +288 -0
- package/{cli/dist → dist}/core/auth/index.d.ts +81 -4
- package/{cli/dist → dist}/core/auth/index.js +15 -1
- package/dist/core/auth/oauth-handler.d.ts +408 -0
- package/dist/core/auth/oauth-handler.js +636 -0
- package/{cli/dist → dist}/core/auth/oauth2-provider.d.ts +9 -0
- package/dist/core/auth/oauth2-provider.js +227 -0
- package/dist/core/auth/otp-provider.d.ts +93 -0
- package/dist/core/auth/otp-provider.js +288 -0
- package/dist/core/auth/recaptcha-handler.d.ts +119 -0
- package/dist/core/auth/recaptcha-handler.js +301 -0
- package/dist/core/auth/remember-me-handler.d.ts +142 -0
- package/dist/core/auth/remember-me-handler.js +255 -0
- package/dist/core/auth/saml-handler.d.ts +173 -0
- package/dist/core/auth/saml-handler.js +364 -0
- package/dist/core/auth/webauthn-handler.d.ts +182 -0
- package/dist/core/auth/webauthn-handler.js +310 -0
- package/dist/core/crawler/advanced-interactions.d.ts +342 -0
- package/dist/core/crawler/advanced-interactions.js +1069 -0
- package/dist/core/crawler/blob-url-download-handler.d.ts +145 -0
- package/dist/core/crawler/blob-url-download-handler.js +392 -0
- package/dist/core/crawler/consent-handler.d.ts +49 -0
- package/dist/core/crawler/consent-handler.js +258 -0
- package/dist/core/crawler/cookie-manager.d.ts +166 -0
- package/dist/core/crawler/cookie-manager.js +353 -0
- package/dist/core/crawler/coop-coep-handler.d.ts +136 -0
- package/dist/core/crawler/coop-coep-handler.js +338 -0
- package/dist/core/crawler/csp-handler.d.ts +151 -0
- package/dist/core/crawler/csp-handler.js +415 -0
- package/dist/core/crawler/download-handler.d.ts +155 -0
- package/dist/core/crawler/download-handler.js +370 -0
- package/dist/core/crawler/email-testing-handler.d.ts +214 -0
- package/dist/core/crawler/email-testing-handler.js +398 -0
- package/dist/core/crawler/error-tracking-handler.d.ts +177 -0
- package/dist/core/crawler/error-tracking-handler.js +378 -0
- package/dist/core/crawler/form-handler.d.ts +100 -0
- package/dist/core/crawler/form-handler.js +465 -0
- package/dist/core/crawler/framework-wait-handler.d.ts +96 -0
- package/dist/core/crawler/framework-wait-handler.js +464 -0
- package/dist/core/crawler/geolocation-handler.d.ts +112 -0
- package/dist/core/crawler/geolocation-handler.js +276 -0
- package/dist/core/crawler/index.d.ts +78 -0
- package/{cli/dist → dist}/core/crawler/index.js +74 -1
- package/dist/core/crawler/intelligent-selector-generator.d.ts +164 -0
- package/dist/core/crawler/intelligent-selector-generator.js +612 -0
- package/{cli/dist → dist}/core/crawler/journey-generator.js +44 -1
- package/{cli/dist → dist}/core/crawler/page-analyzer.d.ts +16 -1
- package/{cli/dist → dist}/core/crawler/page-analyzer.js +469 -17
- package/dist/core/crawler/permissions-handler.d.ts +112 -0
- package/dist/core/crawler/permissions-handler.js +236 -0
- package/dist/core/crawler/permissions-policy-handler.d.ts +113 -0
- package/dist/core/crawler/permissions-policy-handler.js +402 -0
- package/dist/core/crawler/presets.d.ts +100 -0
- package/dist/core/crawler/presets.js +887 -0
- package/dist/core/crawler/repl-debug-handler.d.ts +105 -0
- package/dist/core/crawler/repl-debug-handler.js +552 -0
- package/dist/core/crawler/reporting-api-handler.d.ts +212 -0
- package/dist/core/crawler/reporting-api-handler.js +344 -0
- package/{cli/dist → dist}/core/crawler/selector-generator.d.ts +9 -0
- package/{cli/dist → dist}/core/crawler/selector-generator.js +99 -23
- package/dist/core/crawler/site-profiler.d.ts +89 -0
- package/dist/core/crawler/site-profiler.js +290 -0
- package/dist/core/crawler/sourcemaps-handler.d.ts +144 -0
- package/dist/core/crawler/sourcemaps-handler.js +420 -0
- package/dist/core/crawler/stacked-modals-handler.d.ts +118 -0
- package/dist/core/crawler/stacked-modals-handler.js +429 -0
- package/dist/core/crawler/trusted-types-handler.d.ts +149 -0
- package/dist/core/crawler/trusted-types-handler.js +413 -0
- package/{cli/dist → dist}/core/crawler/types.d.ts +68 -2
- package/dist/core/crawler/wait-strategies.d.ts +108 -0
- package/dist/core/crawler/wait-strategies.js +399 -0
- package/dist/core/fixtures/factories.d.ts +180 -0
- package/dist/core/fixtures/factories.js +279 -0
- package/dist/core/fixtures/index.d.ts +6 -0
- package/dist/core/fixtures/index.js +6 -0
- package/{cli/dist → dist}/core/generation/crawler-pack-generator.d.ts +13 -3
- package/dist/core/generation/crawler-pack-generator.js +232 -0
- package/{cli/dist → dist}/core/generation/index.d.ts +2 -0
- package/{cli/dist → dist}/core/generation/index.js +2 -0
- package/{cli/dist → dist}/core/index.d.ts +2 -0
- package/{cli/dist → dist}/core/index.js +4 -0
- package/dist/core/network/index.d.ts +7 -0
- package/dist/core/network/index.js +7 -0
- package/dist/core/network/network-manager.d.ts +237 -0
- package/dist/core/network/network-manager.js +343 -0
- package/dist/core/network/network-simulator.d.ts +158 -0
- package/dist/core/network/network-simulator.js +261 -0
- package/{cli/dist → dist}/core/pack/validator.js +2 -2
- package/{cli/dist → dist}/core/pack-v2/migrator.d.ts +5 -0
- package/{cli/dist → dist}/core/pack-v2/migrator.js +81 -6
- package/{cli/dist → dist}/core/pack-v2/validator.js +4 -3
- package/{cli/dist → dist}/core/pom/base-page.js +1 -1
- package/{cli/dist → dist}/core/pom/loader.js +1 -1
- package/dist/core/reporting/index.d.ts +9 -0
- package/dist/core/reporting/index.js +10 -0
- package/dist/core/reporting/junit-reporter.d.ts +114 -0
- package/dist/core/reporting/junit-reporter.js +306 -0
- package/{cli/dist → dist}/core/runner/e2e-helpers.d.ts +1 -1
- package/{cli/dist → dist}/core/runner/e2e-helpers.js +2 -2
- package/{cli/dist → dist}/core/runner/phase3-runner.d.ts +3 -0
- package/{cli/dist → dist}/core/runner/phase3-runner.js +45 -14
- package/dist/core/sharding/test-sharding.d.ts +137 -0
- package/dist/core/sharding/test-sharding.js +233 -0
- package/dist/core/storage/cookie-manager.d.ts +160 -0
- package/dist/core/storage/cookie-manager.js +268 -0
- package/dist/core/storage/index.d.ts +7 -0
- package/dist/core/storage/index.js +7 -0
- package/dist/core/storage/storage-helpers.d.ts +138 -0
- package/dist/core/storage/storage-helpers.js +315 -0
- package/dist/core/test-helpers/index.d.ts +6 -0
- package/dist/core/test-helpers/index.js +6 -0
- package/dist/core/test-helpers/state-reset.d.ts +119 -0
- package/dist/core/test-helpers/state-reset.js +234 -0
- package/{cli/dist → dist}/core/types/pack-v1.d.ts +15 -2
- package/{cli/dist → dist}/core/types/pack-v2.d.ts +1 -1
- package/dist/core/upload/chunked-uploader.d.ts +150 -0
- package/dist/core/upload/chunked-uploader.js +289 -0
- package/dist/core/upload/index.d.ts +11 -0
- package/dist/core/upload/index.js +8 -0
- package/dist/core/upload/mime-validator.d.ts +119 -0
- package/dist/core/upload/mime-validator.js +373 -0
- package/dist/core/upload/presigned-uploader.d.ts +118 -0
- package/dist/core/upload/presigned-uploader.js +274 -0
- package/dist/core/utils/device-emulation.d.ts +194 -0
- package/dist/core/utils/device-emulation.js +380 -0
- package/dist/core/utils/index.d.ts +8 -0
- package/dist/core/utils/index.js +8 -0
- package/dist/core/utils/retry.d.ts +145 -0
- package/dist/core/utils/retry.js +242 -0
- package/dist/core/utils/smart-wait.d.ts +133 -0
- package/dist/core/utils/smart-wait.js +417 -0
- package/dist/core/visual/index.d.ts +7 -0
- package/dist/core/visual/index.js +7 -0
- package/dist/core/visual/pixel-diff.d.ts +87 -0
- package/dist/core/visual/pixel-diff.js +213 -0
- package/dist/core/visual/screenshot-helper.d.ts +130 -0
- package/dist/core/visual/screenshot-helper.js +223 -0
- package/{cli/dist → dist}/utils/config.d.ts +1 -1
- package/examples/README.md +160 -0
- package/examples/accessibility.yml +48 -0
- package/examples/api-basic.yml +27 -0
- package/examples/complete.yml +146 -0
- package/examples/crawler.yml +38 -0
- package/examples/fullstack.yml +78 -0
- package/examples/security.yml +58 -0
- package/examples/ui-advanced.yml +49 -0
- package/examples/ui-basic.yml +24 -0
- package/package.json +33 -67
- package/CHANGELOG.md +0 -262
- package/CONTRIBUTING.md +0 -273
- package/QUICK_START.md +0 -191
- package/cli/CHANGELOG.md +0 -84
- package/cli/LICENSE +0 -24
- package/cli/README.md +0 -222
- package/cli/dist/core/adapters/playwright-ui.js +0 -864
- package/cli/dist/core/auth/oauth2-provider.js +0 -114
- package/cli/dist/core/coverage/analyzer.d.ts +0 -101
- package/cli/dist/core/coverage/analyzer.js +0 -415
- package/cli/dist/core/coverage/collector.d.ts +0 -74
- package/cli/dist/core/coverage/collector.js +0 -459
- package/cli/dist/core/coverage/config.d.ts +0 -37
- package/cli/dist/core/coverage/config.js +0 -156
- package/cli/dist/core/coverage/index.d.ts +0 -11
- package/cli/dist/core/coverage/index.js +0 -15
- package/cli/dist/core/coverage/types.d.ts +0 -267
- package/cli/dist/core/coverage/types.js +0 -6
- package/cli/dist/core/coverage/vault.d.ts +0 -95
- package/cli/dist/core/coverage/vault.js +0 -405
- package/cli/dist/core/crawler/index.d.ts +0 -57
- package/cli/dist/core/fixtures/index.d.ts +0 -8
- package/cli/dist/core/fixtures/index.js +0 -8
- package/cli/dist/core/generation/crawler-pack-generator.js +0 -231
- package/cli/dist/core/reporting/index.d.ts +0 -6
- package/cli/dist/core/reporting/index.js +0 -6
- package/cli/dist/core/visual/index.d.ts +0 -6
- package/cli/dist/core/visual/index.js +0 -6
- package/cli/package.json +0 -76
- package/core/LICENSE +0 -24
- package/core/README.md +0 -64
- package/core/package.json +0 -81
- package/core/schemas/pack.schema.json +0 -236
- /package/{cli/bin → bin}/qa360.js +0 -0
- /package/{cli/dist → dist}/cli-minimal.d.ts +0 -0
- /package/{cli/dist → dist}/cli-minimal.js +0 -0
- /package/{cli/dist → dist}/commands/ai.d.ts +0 -0
- /package/{cli/dist → dist}/commands/ask.d.ts +0 -0
- /package/{cli/dist → dist}/commands/ask.js +0 -0
- /package/{cli/dist → dist}/commands/coverage.d.ts +0 -0
- /package/{cli/dist → dist}/commands/doctor.d.ts +0 -0
- /package/{cli/dist → dist}/commands/examples.d.ts +0 -0
- /package/{cli/dist → dist}/commands/examples.js +0 -0
- /package/{cli/dist → dist}/commands/explain.d.ts +0 -0
- /package/{cli/dist → dist}/commands/flakiness.d.ts +0 -0
- /package/{cli/dist → dist}/commands/generate.d.ts +0 -0
- /package/{cli/dist → dist}/commands/history.d.ts +0 -0
- /package/{cli/dist → dist}/commands/init.d.ts +0 -0
- /package/{cli/dist → dist}/commands/init.js +0 -0
- /package/{cli/dist → dist}/commands/monitor.d.ts +0 -0
- /package/{cli/dist → dist}/commands/ollama.d.ts +0 -0
- /package/{cli/dist → dist}/commands/pack.d.ts +0 -0
- /package/{cli/dist → dist}/commands/regression.d.ts +0 -0
- /package/{cli/dist → dist}/commands/repair.d.ts +0 -0
- /package/{cli/dist → dist}/commands/report.d.ts +0 -0
- /package/{cli/dist → dist}/commands/report.js +0 -0
- /package/{cli/dist → dist}/commands/retry.d.ts +0 -0
- /package/{cli/dist → dist}/commands/scan.d.ts +0 -0
- /package/{cli/dist → dist}/commands/scan.js +0 -0
- /package/{cli/dist → dist}/commands/secrets.d.ts +0 -0
- /package/{cli/dist → dist}/commands/serve.d.ts +0 -0
- /package/{cli/dist → dist}/commands/slo.d.ts +0 -0
- /package/{cli/dist → dist}/commands/verify.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/gitleaks-secrets.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/gitleaks-secrets.js +0 -0
- /package/{cli/dist → dist}/core/adapters/jest-adapter.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/jest-adapter.js +0 -0
- /package/{cli/dist → dist}/core/adapters/k6-perf.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/k6-perf.js +0 -0
- /package/{cli/dist → dist}/core/adapters/osv-deps.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/osv-deps.js +0 -0
- /package/{cli/dist → dist}/core/adapters/playwright-native-adapter.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/playwright-native-adapter.js +0 -0
- /package/{cli/dist → dist}/core/adapters/pytest-adapter.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/pytest-adapter.js +0 -0
- /package/{cli/dist → dist}/core/adapters/semgrep-sast.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/semgrep-sast.js +0 -0
- /package/{cli/dist → dist}/core/adapters/unit-test-types.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/unit-test-types.js +0 -0
- /package/{cli/dist → dist}/core/adapters/vitest-adapter.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/vitest-adapter.js +0 -0
- /package/{cli/dist → dist}/core/adapters/zap-dast.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/zap-dast.js +0 -0
- /package/{cli/dist → dist}/core/ai/anthropic-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/anthropic-provider.js +0 -0
- /package/{cli/dist → dist}/core/ai/deepseek-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/deepseek-provider.js +0 -0
- /package/{cli/dist → dist}/core/ai/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/index.js +0 -0
- /package/{cli/dist → dist}/core/ai/llm-client.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/llm-client.js +0 -0
- /package/{cli/dist → dist}/core/ai/mock-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/mock-provider.js +0 -0
- /package/{cli/dist → dist}/core/ai/ollama-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/openai-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/openai-provider.js +0 -0
- /package/{cli/dist → dist}/core/ai/provider-factory.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/provider-factory.js +0 -0
- /package/{cli/dist → dist}/core/artifacts/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/artifacts/index.js +0 -0
- /package/{cli/dist → dist}/core/artifacts/ui-artifacts.d.ts +0 -0
- /package/{cli/dist → dist}/core/assertions/engine.d.ts +0 -0
- /package/{cli/dist → dist}/core/assertions/engine.js +0 -0
- /package/{cli/dist → dist}/core/assertions/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/assertions/index.js +0 -0
- /package/{cli/dist → dist}/core/assertions/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/assertions/types.js +0 -0
- /package/{cli/dist → dist}/core/auth/api-key-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/api-key-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/aws-iam-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/aws-iam-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/azure-ad-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/azure-ad-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/gcp-adc-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/gcp-adc-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/jwt-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/jwt-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/manager.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/manager.js +0 -0
- /package/{cli/dist → dist}/core/auth/totp-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/totp-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/ui-login-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/ui-login-provider.js +0 -0
- /package/{cli/dist → dist}/core/cache/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/cache/index.js +0 -0
- /package/{cli/dist → dist}/core/cache/lru-cache.d.ts +0 -0
- /package/{cli/dist → dist}/core/cache/lru-cache.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/analyzer.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/analyzer.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/collector.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/collector.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/config.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/config.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/index.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/index.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/types.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/types.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/vault.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/vault.js +0 -0
- /package/{cli/dist → dist}/core/crawler/journey-generator.d.ts +0 -0
- /package/{cli/dist → dist}/core/crawler/types.js +0 -0
- /package/{cli/dist → dist}/core/dashboard/assets.d.ts +0 -0
- /package/{cli/dist → dist}/core/dashboard/assets.js +0 -0
- /package/{cli/dist → dist}/core/dashboard/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/dashboard/index.js +0 -0
- /package/{cli/dist → dist}/core/dashboard/server.d.ts +0 -0
- /package/{cli/dist → dist}/core/dashboard/server.js +0 -0
- /package/{cli/dist → dist}/core/dashboard/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/dashboard/types.js +0 -0
- /package/{cli/dist → dist}/core/discoverer/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/discoverer/index.js +0 -0
- /package/{cli/dist → dist}/core/fixtures/loader.d.ts +0 -0
- /package/{cli/dist → dist}/core/fixtures/loader.js +0 -0
- /package/{cli/dist → dist}/core/fixtures/resolver.d.ts +0 -0
- /package/{cli/dist → dist}/core/fixtures/resolver.js +0 -0
- /package/{cli/dist → dist}/core/fixtures/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/fixtures/types.js +0 -0
- /package/{cli/dist → dist}/core/flakiness/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/flakiness/index.js +0 -0
- /package/{cli/dist → dist}/core/generation/code-formatter.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/code-formatter.js +0 -0
- /package/{cli/dist → dist}/core/generation/code-generator.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/code-generator.js +0 -0
- /package/{cli/dist → dist}/core/generation/generator.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/generator.js +0 -0
- /package/{cli/dist → dist}/core/generation/pack-generator.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/pack-generator.js +0 -0
- /package/{cli/dist → dist}/core/generation/prompt-builder.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/prompt-builder.js +0 -0
- /package/{cli/dist → dist}/core/generation/source-analyzer.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/source-analyzer.js +0 -0
- /package/{cli/dist → dist}/core/generation/test-optimizer.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/test-optimizer.js +0 -0
- /package/{cli/dist → dist}/core/generation/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/types.js +0 -0
- /package/{cli/dist → dist}/core/hooks/compose.d.ts +0 -0
- /package/{cli/dist → dist}/core/hooks/compose.js +0 -0
- /package/{cli/dist → dist}/core/hooks/runner.d.ts +0 -0
- /package/{cli/dist → dist}/core/hooks/runner.js +0 -0
- /package/{cli/dist → dist}/core/pack/migrator.d.ts +0 -0
- /package/{cli/dist → dist}/core/pack/migrator.js +0 -0
- /package/{cli/dist → dist}/core/pack/validator.d.ts +0 -0
- /package/{cli/dist → dist}/core/pack-v2/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/pack-v2/index.js +0 -0
- /package/{cli/dist → dist}/core/pack-v2/loader.d.ts +0 -0
- /package/{cli/dist → dist}/core/pack-v2/loader.js +0 -0
- /package/{cli/dist → dist}/core/pack-v2/validator.d.ts +0 -0
- /package/{cli/dist → dist}/core/parallel/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/parallel/index.js +0 -0
- /package/{cli/dist → dist}/core/parallel/parallel-runner.d.ts +0 -0
- /package/{cli/dist → dist}/core/parallel/parallel-runner.js +0 -0
- /package/{cli/dist → dist}/core/pom/base-page.d.ts +0 -0
- /package/{cli/dist → dist}/core/pom/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/pom/index.js +0 -0
- /package/{cli/dist → dist}/core/pom/loader.d.ts +0 -0
- /package/{cli/dist → dist}/core/pom/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/pom/types.js +0 -0
- /package/{cli/dist → dist}/core/proof/bundle.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/bundle.js +0 -0
- /package/{cli/dist → dist}/core/proof/canonicalize.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/canonicalize.js +0 -0
- /package/{cli/dist → dist}/core/proof/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/index.js +0 -0
- /package/{cli/dist → dist}/core/proof/schema.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/schema.js +0 -0
- /package/{cli/dist → dist}/core/proof/signer.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/signer.js +0 -0
- /package/{cli/dist → dist}/core/proof/verifier.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/verifier.js +0 -0
- /package/{cli/dist → dist}/core/regression/detector.d.ts +0 -0
- /package/{cli/dist → dist}/core/regression/detector.js +0 -0
- /package/{cli/dist → dist}/core/regression/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/regression/index.js +0 -0
- /package/{cli/dist → dist}/core/regression/trend-analyzer.d.ts +0 -0
- /package/{cli/dist → dist}/core/regression/trend-analyzer.js +0 -0
- /package/{cli/dist → dist}/core/regression/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/regression/types.js +0 -0
- /package/{cli/dist → dist}/core/regression/vault.d.ts +0 -0
- /package/{cli/dist → dist}/core/regression/vault.js +0 -0
- /package/{cli/dist → dist}/core/repair/engine/fixer.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/engine/fixer.js +0 -0
- /package/{cli/dist → dist}/core/repair/engine/suggestion-engine.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/engine/suggestion-engine.js +0 -0
- /package/{cli/dist → dist}/core/repair/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/index.js +0 -0
- /package/{cli/dist → dist}/core/repair/repairer.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/repairer.js +0 -0
- /package/{cli/dist → dist}/core/repair/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/types.js +0 -0
- /package/{cli/dist → dist}/core/repair/utils/error-analyzer.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/utils/error-analyzer.js +0 -0
- /package/{cli/dist → dist}/core/reporting/html-reporter.d.ts +0 -0
- /package/{cli/dist → dist}/core/reporting/html-reporter.js +0 -0
- /package/{cli/dist → dist}/core/retry/flakiness-integration.d.ts +0 -0
- /package/{cli/dist → dist}/core/retry/flakiness-integration.js +0 -0
- /package/{cli/dist → dist}/core/retry/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/retry/index.js +0 -0
- /package/{cli/dist → dist}/core/retry/retry-engine.d.ts +0 -0
- /package/{cli/dist → dist}/core/retry/retry-engine.js +0 -0
- /package/{cli/dist → dist}/core/retry/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/retry/types.js +0 -0
- /package/{cli/dist → dist}/core/retry/vault.d.ts +0 -0
- /package/{cli/dist → dist}/core/retry/vault.js +0 -0
- /package/{cli/dist → dist}/core/schemas/pack.schema.json +0 -0
- /package/{cli/dist → dist}/core/secrets/crypto.d.ts +0 -0
- /package/{cli/dist → dist}/core/secrets/crypto.js +0 -0
- /package/{cli/dist → dist}/core/secrets/manager.d.ts +0 -0
- /package/{cli/dist → dist}/core/secrets/manager.js +0 -0
- /package/{cli/dist → dist}/core/security/redaction-patterns-extended.d.ts +0 -0
- /package/{cli/dist → dist}/core/security/redaction-patterns-extended.js +0 -0
- /package/{cli/dist → dist}/core/security/redactor.d.ts +0 -0
- /package/{cli/dist → dist}/core/security/redactor.js +0 -0
- /package/{cli/dist → dist}/core/self-healing/assertion-healer.d.ts +0 -0
- /package/{cli/dist → dist}/core/self-healing/assertion-healer.js +0 -0
- /package/{cli/dist → dist}/core/self-healing/engine.d.ts +0 -0
- /package/{cli/dist → dist}/core/self-healing/engine.js +0 -0
- /package/{cli/dist → dist}/core/self-healing/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/self-healing/index.js +0 -0
- /package/{cli/dist → dist}/core/self-healing/selector-healer.d.ts +0 -0
- /package/{cli/dist → dist}/core/self-healing/selector-healer.js +0 -0
- /package/{cli/dist → dist}/core/self-healing/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/self-healing/types.js +0 -0
- /package/{cli/dist → dist}/core/serve/diagnostics-collector.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/diagnostics-collector.js +0 -0
- /package/{cli/dist → dist}/core/serve/health-checker.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/health-checker.js +0 -0
- /package/{cli/dist → dist}/core/serve/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/index.js +0 -0
- /package/{cli/dist → dist}/core/serve/metrics-collector.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/metrics-collector.js +0 -0
- /package/{cli/dist → dist}/core/serve/process-manager.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/process-manager.js +0 -0
- /package/{cli/dist → dist}/core/serve/server.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/server.js +0 -0
- /package/{cli/dist → dist}/core/slo/config.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/config.js +0 -0
- /package/{cli/dist → dist}/core/slo/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/index.js +0 -0
- /package/{cli/dist → dist}/core/slo/sli-calculator.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/sli-calculator.js +0 -0
- /package/{cli/dist → dist}/core/slo/slo-tracker.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/slo-tracker.js +0 -0
- /package/{cli/dist → dist}/core/slo/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/types.js +0 -0
- /package/{cli/dist → dist}/core/slo/vault.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/vault.js +0 -0
- /package/{cli/dist → dist}/core/tui/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/tui/index.js +0 -0
- /package/{cli/dist → dist}/core/tui/monitor.d.ts +0 -0
- /package/{cli/dist → dist}/core/tui/monitor.js +0 -0
- /package/{cli/dist → dist}/core/tui/renderer.d.ts +0 -0
- /package/{cli/dist → dist}/core/tui/renderer.js +0 -0
- /package/{cli/dist → dist}/core/tui/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/tui/types.js +0 -0
- /package/{cli/dist → dist}/core/types/pack-v1.js +0 -0
- /package/{cli/dist → dist}/core/types/pack-v2.js +0 -0
- /package/{cli/dist → dist}/core/types/trust-score.d.ts +0 -0
- /package/{cli/dist → dist}/core/types/trust-score.js +0 -0
- /package/{cli/dist → dist}/core/vault/cas.d.ts +0 -0
- /package/{cli/dist → dist}/core/vault/cas.js +0 -0
- /package/{cli/dist → dist}/core/vault/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/vault/index.js +0 -0
- /package/{cli/dist → dist}/core/visual/visual-regression.d.ts +0 -0
- /package/{cli/dist → dist}/core/visual/visual-regression.js +0 -0
- /package/{cli/dist → dist}/core/watch/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/watch/index.js +0 -0
- /package/{cli/dist → dist}/core/watch/watch-mode.d.ts +0 -0
- /package/{cli/dist → dist}/core/watch/watch-mode.js +0 -0
- /package/{cli/dist → dist}/generators/index.d.ts +0 -0
- /package/{cli/dist → dist}/generators/index.js +0 -0
- /package/{cli/dist → dist}/generators/json-reporter.d.ts +0 -0
- /package/{cli/dist → dist}/generators/json-reporter.js +0 -0
- /package/{cli/dist → dist}/generators/test-generator.d.ts +0 -0
- /package/{cli/dist → dist}/generators/test-generator.js +0 -0
- /package/{cli/dist → dist}/index.d.ts +0 -0
- /package/{cli/dist → dist}/index.js +0 -0
- /package/{cli/dist → dist}/scanners/dom-scanner.d.ts +0 -0
- /package/{cli/dist → dist}/scanners/dom-scanner.js +0 -0
- /package/{cli/dist → dist}/scanners/index.d.ts +0 -0
- /package/{cli/dist → dist}/scanners/index.js +0 -0
- /package/{cli/dist → dist}/schemas/pack.schema.json +0 -0
- /package/{cli/dist → dist}/types/scan.d.ts +0 -0
- /package/{cli/dist → dist}/types/scan.js +0 -0
- /package/{cli/dist → dist}/utils/config.js +0 -0
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source Maps Handler
|
|
3
|
+
*
|
|
4
|
+
* P1 - Source map parsing and error mapping
|
|
5
|
+
*
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Source map detection
|
|
8
|
+
* - Source map parsing
|
|
9
|
+
* - Error stack trace mapping
|
|
10
|
+
* - Original source location resolution
|
|
11
|
+
* - Source content retrieval
|
|
12
|
+
*
|
|
13
|
+
* @see https://developer.mozilla.org/en-US/docs/Tools/Debugger/How_to/Use_a_source_map
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* Source Maps Handler class
|
|
17
|
+
*/
|
|
18
|
+
export class SourceMapsHandler {
|
|
19
|
+
page;
|
|
20
|
+
sourceMapsCache = new Map();
|
|
21
|
+
constructor(page) {
|
|
22
|
+
this.page = page;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get all source map URLs from the page
|
|
26
|
+
*/
|
|
27
|
+
async getSourceMapURLs() {
|
|
28
|
+
return await this.page.evaluate(() => {
|
|
29
|
+
const sourceMaps = new Map();
|
|
30
|
+
// Check for source maps in <script> tags
|
|
31
|
+
const scripts = document.querySelectorAll('script[src]');
|
|
32
|
+
scripts.forEach(script => {
|
|
33
|
+
const src = script.src;
|
|
34
|
+
// Source map is usually at same path with .map extension
|
|
35
|
+
const sourceMapUrl = src + '.map';
|
|
36
|
+
sourceMaps.set(src, sourceMapUrl);
|
|
37
|
+
});
|
|
38
|
+
// Check for inline source map comments
|
|
39
|
+
const inlineScripts = document.querySelectorAll('script:not([src])');
|
|
40
|
+
inlineScripts.forEach(script => {
|
|
41
|
+
const content = script.textContent || '';
|
|
42
|
+
// Look for sourceMappingURL comment
|
|
43
|
+
const match = content.match(/\/\/[@#]\s*sourceMappingURL=([^\s]+)/);
|
|
44
|
+
if (match) {
|
|
45
|
+
sourceMaps.set('(inline)', match[1]);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
// Check for source maps in stylesheets
|
|
49
|
+
const links = document.querySelectorAll('link[rel="stylesheet"]');
|
|
50
|
+
links.forEach(link => {
|
|
51
|
+
const href = link.href;
|
|
52
|
+
const sourceMapUrl = href + '.map';
|
|
53
|
+
sourceMaps.set(href, sourceMapUrl);
|
|
54
|
+
});
|
|
55
|
+
// Check for inline source maps in style tags
|
|
56
|
+
const styles = document.querySelectorAll('style');
|
|
57
|
+
styles.forEach(style => {
|
|
58
|
+
const content = style.textContent || '';
|
|
59
|
+
const match = content.match(/\/\*[@#]\s*sourceMappingURL=([^\s]+)\s*\*\//);
|
|
60
|
+
if (match) {
|
|
61
|
+
sourceMaps.set('(inline style)', match[1]);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
// Check window for source map data
|
|
65
|
+
if (window.__sourceMapUrl) {
|
|
66
|
+
sourceMaps.set('(global)', window.__sourceMapUrl);
|
|
67
|
+
}
|
|
68
|
+
return Object.fromEntries(sourceMaps);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Fetch and parse a source map
|
|
73
|
+
*/
|
|
74
|
+
async fetchSourceMap(sourceMapUrl) {
|
|
75
|
+
// Check cache first
|
|
76
|
+
if (this.sourceMapsCache.has(sourceMapUrl)) {
|
|
77
|
+
return this.sourceMapsCache.get(sourceMapUrl);
|
|
78
|
+
}
|
|
79
|
+
// Resolve URL relative to page
|
|
80
|
+
const baseUrl = this.page.url();
|
|
81
|
+
const absoluteUrl = new URL(sourceMapUrl, baseUrl).toString();
|
|
82
|
+
try {
|
|
83
|
+
// Fetch the source map
|
|
84
|
+
const content = await this.page.evaluate(async (url) => {
|
|
85
|
+
try {
|
|
86
|
+
const response = await fetch(url);
|
|
87
|
+
if (!response.ok)
|
|
88
|
+
return null;
|
|
89
|
+
return await response.text();
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}, absoluteUrl);
|
|
95
|
+
if (!content) {
|
|
96
|
+
return {
|
|
97
|
+
url: sourceMapUrl,
|
|
98
|
+
content: null,
|
|
99
|
+
sourceCount: 0,
|
|
100
|
+
sources: [],
|
|
101
|
+
sourceRoot: '',
|
|
102
|
+
hasMappings: false,
|
|
103
|
+
version: 0,
|
|
104
|
+
valid: false,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Parse the source map (simplified JSON parsing)
|
|
108
|
+
const sourceMap = JSON.parse(content);
|
|
109
|
+
return {
|
|
110
|
+
url: sourceMapUrl,
|
|
111
|
+
content,
|
|
112
|
+
sourceCount: sourceMap.sources?.length || 0,
|
|
113
|
+
sources: sourceMap.sources || [],
|
|
114
|
+
sourceRoot: sourceMap.sourceRoot || '',
|
|
115
|
+
hasMappings: !!sourceMap.mappings && sourceMap.mappings.length > 0,
|
|
116
|
+
version: sourceMap.version || 3,
|
|
117
|
+
valid: !!sourceMap.version && !!sourceMap.mappings,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return {
|
|
122
|
+
url: sourceMapUrl,
|
|
123
|
+
content: null,
|
|
124
|
+
sourceCount: 0,
|
|
125
|
+
sources: [],
|
|
126
|
+
sourceRoot: '',
|
|
127
|
+
hasMappings: false,
|
|
128
|
+
version: 0,
|
|
129
|
+
valid: false,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get all source maps from the page
|
|
135
|
+
*/
|
|
136
|
+
async getAllSourceMaps() {
|
|
137
|
+
const sourceMapUrls = await this.getSourceMapURLs();
|
|
138
|
+
const sourceMaps = new Map();
|
|
139
|
+
const filesWithSourceMaps = [];
|
|
140
|
+
const filesWithoutSourceMaps = [];
|
|
141
|
+
for (const [file, url] of Object.entries(sourceMapUrls)) {
|
|
142
|
+
const sourceMapInfo = await this.fetchSourceMap(url);
|
|
143
|
+
sourceMaps.set(file, sourceMapInfo);
|
|
144
|
+
if (sourceMapInfo.valid) {
|
|
145
|
+
filesWithSourceMaps.push(file);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
filesWithoutSourceMaps.push(file);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Calculate coverage
|
|
152
|
+
const totalFiles = filesWithSourceMaps.length + filesWithoutSourceMaps.length;
|
|
153
|
+
const sourceMapCoverage = totalFiles > 0
|
|
154
|
+
? (filesWithSourceMaps.length / totalFiles) * 100
|
|
155
|
+
: 0;
|
|
156
|
+
return {
|
|
157
|
+
sourceMaps,
|
|
158
|
+
filesWithSourceMaps,
|
|
159
|
+
filesWithoutSourceMaps,
|
|
160
|
+
sourceMapCoverage,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Map an error stack trace using source maps
|
|
165
|
+
*/
|
|
166
|
+
async mapError(error) {
|
|
167
|
+
const stack = error.stack || '';
|
|
168
|
+
const stackLines = stack.split('\n').slice(1);
|
|
169
|
+
const mappedStack = await Promise.all(stackLines.map(async (stackLine) => {
|
|
170
|
+
// Parse stack line (format varies by browser)
|
|
171
|
+
const match = stackLine.match(/at\s+([^\s]+)\s+\((.+?):(\d+):(\d+)\)|at\s+(.+?):(\d+):(\d+)/);
|
|
172
|
+
if (!match) {
|
|
173
|
+
return {
|
|
174
|
+
filename: '(unknown)',
|
|
175
|
+
line: 0,
|
|
176
|
+
column: 0,
|
|
177
|
+
function: null,
|
|
178
|
+
originalFilename: null,
|
|
179
|
+
originalLine: null,
|
|
180
|
+
originalColumn: null,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
const funcName = match[1] || null;
|
|
184
|
+
const filename = match[2] || match[5];
|
|
185
|
+
const lineNum = parseInt(match[3] || match[6], 10);
|
|
186
|
+
const column = parseInt(match[4] || match[7], 10);
|
|
187
|
+
// Try to map using source maps
|
|
188
|
+
const mapped = await this.mapLocation(filename, lineNum, column);
|
|
189
|
+
return {
|
|
190
|
+
filename,
|
|
191
|
+
line: lineNum,
|
|
192
|
+
column,
|
|
193
|
+
function: funcName,
|
|
194
|
+
originalFilename: mapped.originalSource,
|
|
195
|
+
originalLine: mapped.originalLine,
|
|
196
|
+
originalColumn: mapped.originalColumn,
|
|
197
|
+
};
|
|
198
|
+
}));
|
|
199
|
+
return {
|
|
200
|
+
original: error,
|
|
201
|
+
mappedStack,
|
|
202
|
+
sourceMapUsed: mappedStack.some(s => s.originalFilename !== null),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Map a generated location to original location
|
|
207
|
+
*/
|
|
208
|
+
async mapLocation(filename, line, column) {
|
|
209
|
+
// Find source map for this file
|
|
210
|
+
const sourceMapUrl = filename + '.map';
|
|
211
|
+
const sourceMapInfo = await this.fetchSourceMap(sourceMapUrl);
|
|
212
|
+
if (!sourceMapInfo.valid || !sourceMapInfo.content) {
|
|
213
|
+
return {
|
|
214
|
+
generatedLine: line,
|
|
215
|
+
generatedColumn: column,
|
|
216
|
+
originalSource: null,
|
|
217
|
+
originalLine: null,
|
|
218
|
+
originalColumn: null,
|
|
219
|
+
name: null,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
// Parse source map
|
|
224
|
+
const sourceMap = JSON.parse(sourceMapInfo.content);
|
|
225
|
+
// Simplified mapping (real implementation would use VLQ decoding)
|
|
226
|
+
// For now, return the first source if available
|
|
227
|
+
if (sourceMap.sources && sourceMap.sources.length > 0) {
|
|
228
|
+
return {
|
|
229
|
+
generatedLine: line,
|
|
230
|
+
generatedColumn: column,
|
|
231
|
+
originalSource: sourceMap.sources[0],
|
|
232
|
+
originalLine: line, // Would be calculated from mappings
|
|
233
|
+
originalColumn: column,
|
|
234
|
+
name: null,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
generatedLine: line,
|
|
239
|
+
generatedColumn: column,
|
|
240
|
+
originalSource: null,
|
|
241
|
+
originalLine: null,
|
|
242
|
+
originalColumn: null,
|
|
243
|
+
name: null,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return {
|
|
248
|
+
generatedLine: line,
|
|
249
|
+
generatedColumn: column,
|
|
250
|
+
originalSource: null,
|
|
251
|
+
originalLine: null,
|
|
252
|
+
originalColumn: null,
|
|
253
|
+
name: null,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get original source content from source map
|
|
259
|
+
*/
|
|
260
|
+
async getOriginalSource(sourceMapUrl, sourceIndex) {
|
|
261
|
+
const sourceMapInfo = await this.fetchSourceMap(sourceMapUrl);
|
|
262
|
+
if (!sourceMapInfo.valid || !sourceMapInfo.content) {
|
|
263
|
+
return null;
|
|
264
|
+
}
|
|
265
|
+
try {
|
|
266
|
+
const sourceMap = JSON.parse(sourceMapInfo.content);
|
|
267
|
+
if (sourceMap.sourcesContent && sourceMap.sourcesContent[sourceIndex]) {
|
|
268
|
+
return sourceMap.sourcesContent[sourceIndex];
|
|
269
|
+
}
|
|
270
|
+
// If sourcesContent not embedded, try to fetch the source file
|
|
271
|
+
if (sourceMap.sources && sourceMap.sources[sourceIndex]) {
|
|
272
|
+
const sourceFile = sourceMap.sources[sourceIndex];
|
|
273
|
+
const baseUrl = new URL(sourceMapUrl);
|
|
274
|
+
const sourceUrl = new URL(sourceFile, baseUrl).toString();
|
|
275
|
+
return await this.page.evaluate(async (url) => {
|
|
276
|
+
try {
|
|
277
|
+
const response = await fetch(url);
|
|
278
|
+
return response.ok ? await response.text() : null;
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return null;
|
|
282
|
+
}
|
|
283
|
+
}, sourceUrl);
|
|
284
|
+
}
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Check if source maps are enabled for a file
|
|
293
|
+
*/
|
|
294
|
+
async hasSourceMap(filename) {
|
|
295
|
+
const sourceMapUrl = filename + '.map';
|
|
296
|
+
const sourceMapInfo = await this.fetchSourceMap(sourceMapUrl);
|
|
297
|
+
return sourceMapInfo.valid;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Inject source map helper into the page
|
|
301
|
+
*/
|
|
302
|
+
async injectSourceMapHelper() {
|
|
303
|
+
await this.page.evaluate(() => {
|
|
304
|
+
// Add a helper to expose source map data
|
|
305
|
+
window.__getSourceMapInfo = async () => {
|
|
306
|
+
const results = [];
|
|
307
|
+
// Check all scripts
|
|
308
|
+
document.querySelectorAll('script[src]').forEach(script => {
|
|
309
|
+
const src = script.src;
|
|
310
|
+
results.push({
|
|
311
|
+
file: src,
|
|
312
|
+
sourceMap: src + '.map',
|
|
313
|
+
valid: false, // Would need fetch to validate
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
return results;
|
|
317
|
+
};
|
|
318
|
+
// Override Error.prepareStackTrace to capture source maps
|
|
319
|
+
const originalPrepareStackTrace = Error.prepareStackTrace;
|
|
320
|
+
if (originalPrepareStackTrace) {
|
|
321
|
+
Error.prepareStackTrace = (error, stack) => {
|
|
322
|
+
// Enhanced stack trace with source map info would go here
|
|
323
|
+
return originalPrepareStackTrace(error, stack);
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Validate source map quality
|
|
330
|
+
*/
|
|
331
|
+
async validateSourceMaps() {
|
|
332
|
+
const result = await this.getAllSourceMaps();
|
|
333
|
+
let valid = 0;
|
|
334
|
+
let invalid = 0;
|
|
335
|
+
let hasNames = 0;
|
|
336
|
+
let hasSourceContent = 0;
|
|
337
|
+
let totalSourceCount = 0;
|
|
338
|
+
for (const [file, info] of result.sourceMaps) {
|
|
339
|
+
if (info.valid) {
|
|
340
|
+
valid++;
|
|
341
|
+
totalSourceCount += info.sourceCount;
|
|
342
|
+
if (info.content) {
|
|
343
|
+
try {
|
|
344
|
+
const sourceMap = JSON.parse(info.content);
|
|
345
|
+
if (sourceMap.names && sourceMap.names.length > 0) {
|
|
346
|
+
hasNames++;
|
|
347
|
+
}
|
|
348
|
+
if (sourceMap.sourcesContent && sourceMap.sourcesContent.length > 0) {
|
|
349
|
+
hasSourceContent++;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
// Ignore parse errors
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
invalid++;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
const total = result.filesWithSourceMaps.length + result.filesWithoutSourceMaps.length;
|
|
362
|
+
const avgSourceCount = valid > 0 ? totalSourceCount / valid : 0;
|
|
363
|
+
return {
|
|
364
|
+
total,
|
|
365
|
+
valid,
|
|
366
|
+
invalid,
|
|
367
|
+
missing: result.filesWithoutSourceMaps.length,
|
|
368
|
+
hasNames,
|
|
369
|
+
hasSourceContent,
|
|
370
|
+
avgSourceCount,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Get source map statistics
|
|
375
|
+
*/
|
|
376
|
+
async getStatistics() {
|
|
377
|
+
const result = await this.getAllSourceMaps();
|
|
378
|
+
const stats = await this.validateSourceMaps();
|
|
379
|
+
let totalMappings = 0;
|
|
380
|
+
for (const info of result.sourceMaps.values()) {
|
|
381
|
+
if (info.valid && info.content) {
|
|
382
|
+
// Rough estimate of mappings (would need proper parsing)
|
|
383
|
+
totalMappings += info.content.split(',').length;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
const avgMappingsPerFile = stats.valid > 0 ? totalMappings / stats.valid : 0;
|
|
387
|
+
const avgSourcesPerFile = stats.avgSourceCount;
|
|
388
|
+
let recommendation = 'Source maps are well configured';
|
|
389
|
+
if (result.sourceMapCoverage < 50) {
|
|
390
|
+
recommendation = 'Consider adding source maps for better debugging';
|
|
391
|
+
}
|
|
392
|
+
else if (stats.avgSourceCount < 2) {
|
|
393
|
+
recommendation = 'Source maps may not include all original sources';
|
|
394
|
+
}
|
|
395
|
+
else if (stats.hasNames < stats.valid * 0.5) {
|
|
396
|
+
recommendation = 'Consider adding function names to source maps';
|
|
397
|
+
}
|
|
398
|
+
return {
|
|
399
|
+
sourceMapCoverage: result.sourceMapCoverage,
|
|
400
|
+
totalFiles: stats.total,
|
|
401
|
+
filesWithSourceMaps: stats.valid,
|
|
402
|
+
avgMappingsPerFile,
|
|
403
|
+
avgSourcesPerFile,
|
|
404
|
+
recommendation,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Clear source map cache
|
|
409
|
+
*/
|
|
410
|
+
clearCache() {
|
|
411
|
+
this.sourceMapsCache.clear();
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Factory function to create Source Maps Handler
|
|
416
|
+
*/
|
|
417
|
+
export function createSourceMapsHandler(page) {
|
|
418
|
+
return new SourceMapsHandler(page);
|
|
419
|
+
}
|
|
420
|
+
export default SourceMapsHandler;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stacked Modals Handler
|
|
3
|
+
*
|
|
4
|
+
* P1 - Detection and management of stacked/nested modals
|
|
5
|
+
*
|
|
6
|
+
* Supports:
|
|
7
|
+
* - Detection of stacked modals (multiple overlays)
|
|
8
|
+
* - Z-index analysis
|
|
9
|
+
* - Modal type detection (dialog, popover, dropdown)
|
|
10
|
+
* - Modal hierarchy traversal
|
|
11
|
+
* - Modal dismissal strategies
|
|
12
|
+
*
|
|
13
|
+
* @see https://www.w3.org/WAI/ARIA/apg/patterns/dialogmodal/
|
|
14
|
+
*/
|
|
15
|
+
export interface ModalInfo {
|
|
16
|
+
/** Modal element selector */
|
|
17
|
+
selector: string;
|
|
18
|
+
/** Modal type */
|
|
19
|
+
type: 'dialog' | 'popover' | 'dropdown' | 'tooltip' | 'alert' | 'custom';
|
|
20
|
+
/** Z-index */
|
|
21
|
+
zIndex: number;
|
|
22
|
+
/** Position in stack (0 = bottom) */
|
|
23
|
+
stackPosition: number;
|
|
24
|
+
/** Whether it's visible */
|
|
25
|
+
visible: boolean;
|
|
26
|
+
/** Whether it blocks interaction with elements below */
|
|
27
|
+
blocksInteraction: boolean;
|
|
28
|
+
/** ARIA attributes */
|
|
29
|
+
aria: {
|
|
30
|
+
modal: boolean;
|
|
31
|
+
labelledby?: string;
|
|
32
|
+
describedby?: string;
|
|
33
|
+
label?: string;
|
|
34
|
+
};
|
|
35
|
+
/** Parent selector (if nested) */
|
|
36
|
+
parent?: string;
|
|
37
|
+
/** Children selectors */
|
|
38
|
+
children: string[];
|
|
39
|
+
/** Close buttons/selectors */
|
|
40
|
+
closeSelectors: string[];
|
|
41
|
+
}
|
|
42
|
+
export interface ModalHierarchy {
|
|
43
|
+
/** Total number of modals detected */
|
|
44
|
+
totalModals: number;
|
|
45
|
+
/** Number of visible modals */
|
|
46
|
+
visibleModals: number;
|
|
47
|
+
/** Modal stack (bottom to top) */
|
|
48
|
+
stack: ModalInfo[];
|
|
49
|
+
/** Top-most modal */
|
|
50
|
+
topModal?: ModalInfo;
|
|
51
|
+
/** Issues detected */
|
|
52
|
+
issues: string[];
|
|
53
|
+
}
|
|
54
|
+
export interface ModalActionOptions {
|
|
55
|
+
/** Wait for modal before action */
|
|
56
|
+
waitFor?: boolean;
|
|
57
|
+
/** Timeout for waiting */
|
|
58
|
+
timeout?: number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Stacked Modals Handler class
|
|
62
|
+
*/
|
|
63
|
+
export declare class StackedModalsHandler {
|
|
64
|
+
/**
|
|
65
|
+
* Detect all modals on the page
|
|
66
|
+
*/
|
|
67
|
+
detectModals(page: any): Promise<ModalHierarchy>;
|
|
68
|
+
/**
|
|
69
|
+
* Get the top-most (active) modal
|
|
70
|
+
*/
|
|
71
|
+
getTopModal(page: any): Promise<ModalInfo | null>;
|
|
72
|
+
/**
|
|
73
|
+
* Wait for a modal to appear
|
|
74
|
+
*/
|
|
75
|
+
waitForModal(page: any, options?: {
|
|
76
|
+
/** Type of modal to wait for */
|
|
77
|
+
type?: ModalInfo['type'];
|
|
78
|
+
/** Selector to match */
|
|
79
|
+
selector?: string;
|
|
80
|
+
/** Minimum z-index */
|
|
81
|
+
minZIndex?: number;
|
|
82
|
+
/** Timeout in ms */
|
|
83
|
+
timeout?: number;
|
|
84
|
+
}): Promise<ModalInfo | null>;
|
|
85
|
+
/**
|
|
86
|
+
* Close a modal
|
|
87
|
+
*/
|
|
88
|
+
closeModal(page: any, modal: ModalInfo | string, options?: ModalActionOptions): Promise<boolean>;
|
|
89
|
+
/**
|
|
90
|
+
* Close all modals from top to bottom
|
|
91
|
+
*/
|
|
92
|
+
closeAllModals(page: any, options?: ModalActionOptions): Promise<number>;
|
|
93
|
+
/**
|
|
94
|
+
* Get modal hierarchy for debugging
|
|
95
|
+
*/
|
|
96
|
+
getModalTree(page: any): Promise<string>;
|
|
97
|
+
/**
|
|
98
|
+
* Verify modal accessibility
|
|
99
|
+
*/
|
|
100
|
+
verifyAccessibility(page: any, modal: ModalInfo | string): Promise<{
|
|
101
|
+
valid: boolean;
|
|
102
|
+
issues: string[];
|
|
103
|
+
}>;
|
|
104
|
+
/**
|
|
105
|
+
* Get modal statistics
|
|
106
|
+
*/
|
|
107
|
+
getStatistics(page: any): Promise<{
|
|
108
|
+
byType: Record<string, number>;
|
|
109
|
+
averageZIndex: number;
|
|
110
|
+
maxStackDepth: number;
|
|
111
|
+
accessibilityScore: number;
|
|
112
|
+
}>;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Factory function to create Stacked Modals Handler
|
|
116
|
+
*/
|
|
117
|
+
export declare function createStackedModalsHandler(): StackedModalsHandler;
|
|
118
|
+
export default StackedModalsHandler;
|