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
|
@@ -2,9 +2,25 @@
|
|
|
2
2
|
* QA360 Selector Generator
|
|
3
3
|
*
|
|
4
4
|
* Generates stable, resilient CSS selectors for web elements
|
|
5
|
+
*
|
|
6
|
+
* NOW WITH INTELLIGENT PROFILE-AWARE GENERATION!
|
|
7
|
+
* The selector generation adapts to the detected site profile:
|
|
8
|
+
* - PROFIL_MODERN: data-testid first (React apps, SaaS)
|
|
9
|
+
* - PROFIL_ACCESSIBLE: ARIA role first (banks, government)
|
|
10
|
+
* - PROFIL_LEGACY: Semantic ID first (ASP.NET, PHP legacy)
|
|
11
|
+
* - PROFIL_MINIMAL: Text content first (landing pages)
|
|
5
12
|
*/
|
|
13
|
+
import { isGeneratedId as checkGeneratedId, isUtilityClass as checkUtilityClass } from './intelligent-selector-generator.js';
|
|
14
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
15
|
+
// RE-EXPORT INTELLIGENT SELECTOR GENERATOR
|
|
16
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
17
|
+
export { SiteProfiler, analyzeSite, determineSiteProfile, } from './site-profiler.js';
|
|
18
|
+
export { IntelligentSelectorGenerator, generateSelector as generateIntelligentSelector, generateSelectorWithMetadata, initializeSelectorGenerator, getSiteProfile, getSelectorStrategy, SELECTOR_STRATEGIES, isGeneratedId, isSemanticId, isUtilityClass, } from './intelligent-selector-generator.js';
|
|
19
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
20
|
+
// LEGACY API (for backward compatibility)
|
|
21
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
6
22
|
/**
|
|
7
|
-
* Selector priority (most stable first)
|
|
23
|
+
* Selector priority (most stable first) - LEGACY
|
|
8
24
|
*/
|
|
9
25
|
const SELECTOR_PRIORITY = [
|
|
10
26
|
'data-testid', // Best: explicit test attribute
|
|
@@ -50,9 +66,12 @@ export function generateSelector(element) {
|
|
|
50
66
|
if (className && !isGenericClass(className)) {
|
|
51
67
|
const classes = className.split(' ').filter(c => !isGenericClass(c));
|
|
52
68
|
if (classes.length > 0) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
69
|
+
// Smart class selection: prioritize meaningful classes
|
|
70
|
+
const meaningfulClasses = selectMeaningfulClasses(classes);
|
|
71
|
+
const classSelector = meaningfulClasses.map(c => `.${escapeCss(c)}`).join('');
|
|
72
|
+
// Limit total selector length
|
|
73
|
+
const qualifiedSelector = tagName ? `${tagName}${classSelector}` : classSelector;
|
|
74
|
+
return truncateSelector(qualifiedSelector, 200);
|
|
56
75
|
}
|
|
57
76
|
}
|
|
58
77
|
// 7. Tag + text content (for buttons, links)
|
|
@@ -116,32 +135,23 @@ export async function generateSelectorFromElement(element, page) {
|
|
|
116
135
|
}
|
|
117
136
|
/**
|
|
118
137
|
* Check if ID is auto-generated (not stable)
|
|
138
|
+
* Uses enhanced patterns from intelligent-selector-generator
|
|
119
139
|
*/
|
|
120
140
|
function isGeneratedId(id) {
|
|
121
|
-
|
|
122
|
-
const generatedPatterns = [
|
|
123
|
-
/^\w+_\d+$/, // react_123, vue_456
|
|
124
|
-
/^(ember|ember)\d+$/, // ember1234
|
|
125
|
-
/^yui_[^_]+_\d+$/, // yui_gen_123
|
|
126
|
-
/^\w+-\w+-\w+$/, // random-hash patterns
|
|
127
|
-
/^[a-f0-9]{8,}$/, // hex hashes
|
|
128
|
-
];
|
|
129
|
-
return generatedPatterns.some(pattern => pattern.test(id));
|
|
141
|
+
return checkGeneratedId(id);
|
|
130
142
|
}
|
|
131
143
|
/**
|
|
132
|
-
* Check if class is too generic
|
|
144
|
+
* Check if class is too generic or utility class
|
|
145
|
+
* Uses enhanced patterns from intelligent-selector-generator
|
|
133
146
|
*/
|
|
134
147
|
function isGenericClass(className) {
|
|
135
|
-
|
|
136
|
-
'active', 'inactive', 'selected', 'disabled', 'enabled',
|
|
137
|
-
'hidden', 'visible', 'show', 'hide', 'open', 'closed',
|
|
138
|
-
'first', 'last', 'odd', 'even',
|
|
139
|
-
'container', 'wrapper', 'content', 'section',
|
|
140
|
-
'btn', 'button', 'input', 'form', 'field',
|
|
141
|
-
'row', 'col', 'column', 'grid',
|
|
142
|
-
];
|
|
148
|
+
// For single class check
|
|
143
149
|
const classes = className.split(' ');
|
|
144
|
-
|
|
150
|
+
if (classes.length === 1) {
|
|
151
|
+
return checkUtilityClass(className);
|
|
152
|
+
}
|
|
153
|
+
// For multiple classes, check if ALL are utility
|
|
154
|
+
return classes.every(c => checkUtilityClass(c));
|
|
145
155
|
}
|
|
146
156
|
/**
|
|
147
157
|
* Check if selector is considered stable
|
|
@@ -169,6 +179,72 @@ function isSelectorStable(selector) {
|
|
|
169
179
|
function escapeCss(str) {
|
|
170
180
|
return str.replace(/(["\\])/g, '\\$1').replace(/"/g, '\\"');
|
|
171
181
|
}
|
|
182
|
+
/**
|
|
183
|
+
* Select the most meaningful classes from a class list
|
|
184
|
+
* Prioritizes: unique identifiers, component names, action-oriented classes
|
|
185
|
+
* Deprioritizes: utility classes (spacing, colors, sizing)
|
|
186
|
+
*/
|
|
187
|
+
function selectMeaningfulClasses(classes) {
|
|
188
|
+
// Tailwind and other utility class patterns to deprioritize
|
|
189
|
+
const utilityPatterns = [
|
|
190
|
+
/^(p|m|px|py|pt|pb|pl|pr)-/, // spacing
|
|
191
|
+
/^(mt|mb|ml|mr)-/, // margin spacing
|
|
192
|
+
/^(text|bg|border)-/, // colors
|
|
193
|
+
/^(w|h)-/, // sizing
|
|
194
|
+
/^(flex|grid|block|inline)/, // display
|
|
195
|
+
/^(justify|items|self)/, // flexbox/grid
|
|
196
|
+
/^(rounded|shadow|opacity)/, // styling
|
|
197
|
+
/^gap-/, // flex gap
|
|
198
|
+
/^(line-)?height-/, // height
|
|
199
|
+
/^(font|weight|size)/, // typography
|
|
200
|
+
];
|
|
201
|
+
// Score each class by "meaningfulness"
|
|
202
|
+
const scored = classes.map(cls => {
|
|
203
|
+
let score = 50; // base score
|
|
204
|
+
// Bonus: component-like names (contain meaningful words)
|
|
205
|
+
if (/[A-Z][a-z]+/.test(cls))
|
|
206
|
+
score += 30; // CamelCase components
|
|
207
|
+
if (/button|btn|input|form|card|modal|nav|header|footer|sidebar|menu|dropdown/i.test(cls))
|
|
208
|
+
score += 25;
|
|
209
|
+
// Bonus: contains numbers (likely unique)
|
|
210
|
+
if (/\d+/.test(cls))
|
|
211
|
+
score += 15;
|
|
212
|
+
// Penalty: utility classes
|
|
213
|
+
for (const pattern of utilityPatterns) {
|
|
214
|
+
if (pattern.test(cls)) {
|
|
215
|
+
score -= 40;
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return { class: cls, score };
|
|
220
|
+
});
|
|
221
|
+
// Sort by score (descending) and take top 5
|
|
222
|
+
scored.sort((a, b) => b.score - a.score);
|
|
223
|
+
return scored.slice(0, 5).map(s => s.class);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Truncate selector to max length while keeping it valid
|
|
227
|
+
* Preserves the most specific parts
|
|
228
|
+
*/
|
|
229
|
+
function truncateSelector(selector, maxLength) {
|
|
230
|
+
if (selector.length <= maxLength)
|
|
231
|
+
return selector;
|
|
232
|
+
// For class-based selectors, remove classes from the middle
|
|
233
|
+
const classMatch = selector.match(/^(\w+)((\.[\w-]+)+)$/);
|
|
234
|
+
if (classMatch) {
|
|
235
|
+
const tag = classMatch[1];
|
|
236
|
+
const classes = classMatch[2].split('.').filter(c => c); // Remove empty strings
|
|
237
|
+
// Keep first 2 and last 2 classes (most specific)
|
|
238
|
+
if (classes.length > 4) {
|
|
239
|
+
const kept = [...classes.slice(0, 2), ...classes.slice(-2)];
|
|
240
|
+
const truncated = `${tag}.${kept.join('.')}`;
|
|
241
|
+
if (truncated.length <= maxLength)
|
|
242
|
+
return truncated;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Final fallback: just truncate (may not be valid CSS but prevents overflow)
|
|
246
|
+
return selector.substring(0, maxLength - 3) + '...';
|
|
247
|
+
}
|
|
172
248
|
/**
|
|
173
249
|
* Optimize selector for resiliency
|
|
174
250
|
*/
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QA360 Site Profiler
|
|
3
|
+
*
|
|
4
|
+
* Analyzes a website to detect its characteristics and determine
|
|
5
|
+
* the optimal selector strategy. This enables adaptive testing
|
|
6
|
+
* based on the site's framework, accessibility, and testing maturity.
|
|
7
|
+
*
|
|
8
|
+
* Philosophy: "Know the site to test it better"
|
|
9
|
+
*/
|
|
10
|
+
import type { Page } from '@playwright/test';
|
|
11
|
+
/**
|
|
12
|
+
* Site analysis results
|
|
13
|
+
*/
|
|
14
|
+
export interface SiteAnalysis {
|
|
15
|
+
hasTestIds: number;
|
|
16
|
+
hasAriaLabels: number;
|
|
17
|
+
hasRoles: number;
|
|
18
|
+
hasSemanticIds: number;
|
|
19
|
+
hasLabels: number;
|
|
20
|
+
hasPlaceholders: number;
|
|
21
|
+
hasAltTexts: number;
|
|
22
|
+
totalElements: number;
|
|
23
|
+
framework: Framework | null;
|
|
24
|
+
cssFramework: CssFramework | null;
|
|
25
|
+
testabilityScore: number;
|
|
26
|
+
accessibilityScore: number;
|
|
27
|
+
patterns: {
|
|
28
|
+
hasReact: boolean;
|
|
29
|
+
hasVue: boolean;
|
|
30
|
+
hasAngular: boolean;
|
|
31
|
+
hasSvelte: boolean;
|
|
32
|
+
hasNext: boolean;
|
|
33
|
+
hasNuxt: boolean;
|
|
34
|
+
hasRemix: boolean;
|
|
35
|
+
hasAstro: boolean;
|
|
36
|
+
hasTailwind: boolean;
|
|
37
|
+
hasBootstrap: boolean;
|
|
38
|
+
hasMUI: boolean;
|
|
39
|
+
hasChakra: boolean;
|
|
40
|
+
hasAntDesign: boolean;
|
|
41
|
+
hasBulma: boolean;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Detected JavaScript frameworks
|
|
46
|
+
*/
|
|
47
|
+
export type Framework = 'react' | 'vue' | 'angular' | 'svelte' | 'next' | 'nuxt' | 'remix' | 'astro' | 'solid' | 'preact' | 'lit' | 'stencil' | null;
|
|
48
|
+
/**
|
|
49
|
+
* Detected CSS frameworks
|
|
50
|
+
*/
|
|
51
|
+
export type CssFramework = 'tailwind' | 'bootstrap' | 'mui' | 'chakra' | 'ant' | 'bulma' | 'foundation' | 'spectacle' | 'tachyons' | null;
|
|
52
|
+
/**
|
|
53
|
+
* Site profile type
|
|
54
|
+
*/
|
|
55
|
+
export type SiteProfile = 'PROFIL_MODERN' | 'PROFIL_ACCESSIBLE' | 'PROFIL_LEGACY' | 'PROFIL_MINIMAL';
|
|
56
|
+
/**
|
|
57
|
+
* Site Profiler - Analyzes websites for adaptive testing
|
|
58
|
+
*/
|
|
59
|
+
export declare class SiteProfiler {
|
|
60
|
+
/**
|
|
61
|
+
* Analyze the current page to determine site characteristics
|
|
62
|
+
* Called ONCE at the beginning of the crawl
|
|
63
|
+
*/
|
|
64
|
+
analyzeSite(page: Page): Promise<SiteAnalysis>;
|
|
65
|
+
/**
|
|
66
|
+
* Determine the site profile based on analysis
|
|
67
|
+
*/
|
|
68
|
+
determineProfile(analysis: SiteAnalysis): SiteProfile;
|
|
69
|
+
/**
|
|
70
|
+
* Get a human-readable description of the profile
|
|
71
|
+
*/
|
|
72
|
+
getProfileDescription(profile: SiteProfile): string;
|
|
73
|
+
/**
|
|
74
|
+
* Get the recommended strategy for the profile
|
|
75
|
+
*/
|
|
76
|
+
getRecommendedStrategy(profile: SiteProfile): string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Default profiler instance
|
|
80
|
+
*/
|
|
81
|
+
export declare const defaultProfiler: SiteProfiler;
|
|
82
|
+
/**
|
|
83
|
+
* Quick analyze function (convenience wrapper)
|
|
84
|
+
*/
|
|
85
|
+
export declare function analyzeSite(page: Page): Promise<SiteAnalysis>;
|
|
86
|
+
/**
|
|
87
|
+
* Quick profile determination (convenience wrapper)
|
|
88
|
+
*/
|
|
89
|
+
export declare function determineSiteProfile(analysis: SiteAnalysis): SiteProfile;
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QA360 Site Profiler
|
|
3
|
+
*
|
|
4
|
+
* Analyzes a website to detect its characteristics and determine
|
|
5
|
+
* the optimal selector strategy. This enables adaptive testing
|
|
6
|
+
* based on the site's framework, accessibility, and testing maturity.
|
|
7
|
+
*
|
|
8
|
+
* Philosophy: "Know the site to test it better"
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Site Profiler - Analyzes websites for adaptive testing
|
|
12
|
+
*/
|
|
13
|
+
export class SiteProfiler {
|
|
14
|
+
/**
|
|
15
|
+
* Analyze the current page to determine site characteristics
|
|
16
|
+
* Called ONCE at the beginning of the crawl
|
|
17
|
+
*/
|
|
18
|
+
async analyzeSite(page) {
|
|
19
|
+
const analysis = await page.evaluate(() => {
|
|
20
|
+
// Count test ID attributes
|
|
21
|
+
const testIds = document.querySelectorAll('[data-testid], [data-cy], [data-test], [data-test-id], [data-qa], [data-automation], [data-e2e], [data-selenium]').length;
|
|
22
|
+
// Count ARIA attributes
|
|
23
|
+
const ariaLabels = document.querySelectorAll('[aria-label]').length;
|
|
24
|
+
const ariaLabelledby = document.querySelectorAll('[aria-labelledby]').length;
|
|
25
|
+
const ariaDescriptions = document.querySelectorAll('[aria-describedby]').length;
|
|
26
|
+
const roles = document.querySelectorAll('[role]').length;
|
|
27
|
+
// Count form accessibility
|
|
28
|
+
const labels = document.querySelectorAll('label[for]').length;
|
|
29
|
+
const placeholders = document.querySelectorAll('[placeholder]').length;
|
|
30
|
+
// Count images with alt text
|
|
31
|
+
const altTexts = document.querySelectorAll('img[alt]:not([alt=""])').length;
|
|
32
|
+
// Count semantic HTML
|
|
33
|
+
const semanticTags = document.querySelectorAll('main, nav, header, footer, article, section, aside, dialog, modal').length;
|
|
34
|
+
// Count interactive elements
|
|
35
|
+
const buttons = document.querySelectorAll('button, [role="button"]').length;
|
|
36
|
+
const inputs = document.querySelectorAll('input, select, textarea').length;
|
|
37
|
+
const links = document.querySelectorAll('a[href]').length;
|
|
38
|
+
const totalInteractive = buttons + inputs + links;
|
|
39
|
+
// === FRAMEWORK DETECTION ===
|
|
40
|
+
// React
|
|
41
|
+
const hasReact = !!(document.querySelector('[data-reactroot], [data-reactid]') ||
|
|
42
|
+
window.__REACT_DEVTOOLS_GLOBAL_HOOK__ ||
|
|
43
|
+
window.React ||
|
|
44
|
+
document.querySelector('[data-react-checksum]'));
|
|
45
|
+
// Next.js
|
|
46
|
+
const hasNext = !!(document.querySelector('[data-next-page]') ||
|
|
47
|
+
document.querySelector('style[id^="__jsx-"]') ||
|
|
48
|
+
document.querySelector('script[id^="__NEXT_DATA__"]'));
|
|
49
|
+
// Vue
|
|
50
|
+
const hasVue = !!(document.querySelector('[data-v-]') ||
|
|
51
|
+
window.__VUE__ ||
|
|
52
|
+
window.Vue);
|
|
53
|
+
// Nuxt
|
|
54
|
+
const hasNuxt = !!(document.querySelector('[data-n-]') ||
|
|
55
|
+
document.querySelector('[data-nuxt-]') ||
|
|
56
|
+
window.__NUXT__);
|
|
57
|
+
// Angular
|
|
58
|
+
const hasAngular = !!(document.querySelector('[ng-version], [_nghost-], [_ngcontent-]') ||
|
|
59
|
+
window.ng ||
|
|
60
|
+
window.getAllAngularRootElements);
|
|
61
|
+
// Svelte
|
|
62
|
+
const hasSvelte = !!(document.querySelector('[class*="svelte-"]') ||
|
|
63
|
+
window.__SVELTE__);
|
|
64
|
+
// Remix
|
|
65
|
+
const hasRemix = !!(document.querySelector('script[remix]') ||
|
|
66
|
+
document.querySelector('[data-remix-]') ||
|
|
67
|
+
document.querySelector('link[href*="remix"]'));
|
|
68
|
+
// Astro
|
|
69
|
+
const hasAstro = !!(document.querySelector('[data-astro-]') ||
|
|
70
|
+
document.querySelector('astro-island, astro-fragment'));
|
|
71
|
+
// Stencil
|
|
72
|
+
const hasStencil = !!(document.querySelector('[class*="hydrated"]') ||
|
|
73
|
+
window.stencil);
|
|
74
|
+
// SolidJS
|
|
75
|
+
const hasSolid = !!window.SolidJS;
|
|
76
|
+
// Preact
|
|
77
|
+
const hasPreact = !!window.preact;
|
|
78
|
+
// Lit
|
|
79
|
+
const hasLit = !!document.querySelector('shadow-root') || !!window.LitElement;
|
|
80
|
+
// === CSS FRAMEWORK DETECTION ===
|
|
81
|
+
// Tailwind CSS
|
|
82
|
+
const hasTailwind = !!(document.querySelector('[class*="flex"][class*="items-"]') ||
|
|
83
|
+
document.querySelector('[class*="bg-"][class*="-500"]') ||
|
|
84
|
+
document.querySelector('[class*="hover:"][class*="bg-"]') ||
|
|
85
|
+
document.querySelector('script[src*="tailwind"]'));
|
|
86
|
+
// Bootstrap
|
|
87
|
+
const hasBootstrap = !!(document.querySelector('[class*="col-"][class*="row"]') ||
|
|
88
|
+
document.querySelector('[class*="btn-"][class*="primary"]') ||
|
|
89
|
+
document.querySelector('[class*="navbar"]') ||
|
|
90
|
+
document.querySelector('link[href*="bootstrap"]'));
|
|
91
|
+
// Material UI
|
|
92
|
+
const hasMUI = !!(document.querySelector('[class*="Mui"]') ||
|
|
93
|
+
document.querySelector('[class^="css-"][class*="-"]') ||
|
|
94
|
+
document.querySelector('svg[class*="MuiSvg"]'));
|
|
95
|
+
// Chakra UI
|
|
96
|
+
const hasChakra = !!(document.querySelector('[class*="chakra-"]') ||
|
|
97
|
+
document.querySelector('[data-chakra]'));
|
|
98
|
+
// Ant Design
|
|
99
|
+
const hasAnt = !!(document.querySelector('[class*="ant-"]') ||
|
|
100
|
+
document.querySelector('[class^="ant-"]'));
|
|
101
|
+
// Bulma
|
|
102
|
+
const hasBulma = !!(document.querySelector('[class*="is-"][class*="primary"]') ||
|
|
103
|
+
document.querySelector('[class*="navbar"]') ||
|
|
104
|
+
document.querySelector('link[href*="bulma"]'));
|
|
105
|
+
// Foundation
|
|
106
|
+
const hasFoundation = !!(document.querySelector('[class*="grid-"]') ||
|
|
107
|
+
document.querySelector('link[href*="foundation"]'));
|
|
108
|
+
// Tachyons
|
|
109
|
+
const hasTachyons = !!(document.querySelector('[class*="flex"][class*="items-center"]') ||
|
|
110
|
+
document.querySelector('link[href*="tachyons"]'));
|
|
111
|
+
return {
|
|
112
|
+
testIds,
|
|
113
|
+
ariaLabels,
|
|
114
|
+
ariaLabelledby,
|
|
115
|
+
ariaDescriptions,
|
|
116
|
+
roles,
|
|
117
|
+
labels,
|
|
118
|
+
placeholders,
|
|
119
|
+
altTexts,
|
|
120
|
+
semanticTags,
|
|
121
|
+
buttons,
|
|
122
|
+
inputs,
|
|
123
|
+
links,
|
|
124
|
+
totalInteractive,
|
|
125
|
+
hasReact,
|
|
126
|
+
hasNext,
|
|
127
|
+
hasVue,
|
|
128
|
+
hasNuxt,
|
|
129
|
+
hasAngular,
|
|
130
|
+
hasSvelte,
|
|
131
|
+
hasRemix,
|
|
132
|
+
hasAstro,
|
|
133
|
+
hasStencil,
|
|
134
|
+
hasSolid,
|
|
135
|
+
hasPreact,
|
|
136
|
+
hasLit,
|
|
137
|
+
hasTailwind,
|
|
138
|
+
hasBootstrap,
|
|
139
|
+
hasMUI,
|
|
140
|
+
hasChakra,
|
|
141
|
+
hasAnt,
|
|
142
|
+
hasBulma,
|
|
143
|
+
hasFoundation,
|
|
144
|
+
hasTachyons,
|
|
145
|
+
};
|
|
146
|
+
});
|
|
147
|
+
// Calculate totals
|
|
148
|
+
const totalElements = analysis.totalInteractive || 1;
|
|
149
|
+
const totalAria = analysis.ariaLabels + analysis.ariaLabelledby + analysis.ariaDescriptions;
|
|
150
|
+
// Determine framework
|
|
151
|
+
let framework = null;
|
|
152
|
+
if (analysis.hasNext)
|
|
153
|
+
framework = 'next';
|
|
154
|
+
else if (analysis.hasReact)
|
|
155
|
+
framework = 'react';
|
|
156
|
+
else if (analysis.hasNuxt)
|
|
157
|
+
framework = 'nuxt';
|
|
158
|
+
else if (analysis.hasVue)
|
|
159
|
+
framework = 'vue';
|
|
160
|
+
else if (analysis.hasRemix)
|
|
161
|
+
framework = 'remix';
|
|
162
|
+
else if (analysis.hasAngular)
|
|
163
|
+
framework = 'angular';
|
|
164
|
+
else if (analysis.hasAstro)
|
|
165
|
+
framework = 'astro';
|
|
166
|
+
else if (analysis.hasSvelte)
|
|
167
|
+
framework = 'svelte';
|
|
168
|
+
else if (analysis.hasSolid)
|
|
169
|
+
framework = 'solid';
|
|
170
|
+
else if (analysis.hasPreact)
|
|
171
|
+
framework = 'preact';
|
|
172
|
+
else if (analysis.hasLit)
|
|
173
|
+
framework = 'lit';
|
|
174
|
+
else if (analysis.hasStencil)
|
|
175
|
+
framework = 'stencil';
|
|
176
|
+
// Determine CSS framework
|
|
177
|
+
let cssFramework = null;
|
|
178
|
+
if (analysis.hasTailwind)
|
|
179
|
+
cssFramework = 'tailwind';
|
|
180
|
+
else if (analysis.hasMUI)
|
|
181
|
+
cssFramework = 'mui';
|
|
182
|
+
else if (analysis.hasChakra)
|
|
183
|
+
cssFramework = 'chakra';
|
|
184
|
+
else if (analysis.hasAnt)
|
|
185
|
+
cssFramework = 'ant';
|
|
186
|
+
else if (analysis.hasBootstrap)
|
|
187
|
+
cssFramework = 'bootstrap';
|
|
188
|
+
else if (analysis.hasBulma)
|
|
189
|
+
cssFramework = 'bulma';
|
|
190
|
+
else if (analysis.hasFoundation)
|
|
191
|
+
cssFramework = 'foundation';
|
|
192
|
+
else if (analysis.hasTachyons)
|
|
193
|
+
cssFramework = 'tachyons';
|
|
194
|
+
// Calculate scores
|
|
195
|
+
const testabilityScore = Math.round((analysis.testIds / totalElements) * 100);
|
|
196
|
+
const accessibilityScore = Math.round(((totalAria + analysis.roles + analysis.labels + analysis.altTexts) / (totalElements * 2)) * 100);
|
|
197
|
+
return {
|
|
198
|
+
hasTestIds: analysis.testIds,
|
|
199
|
+
hasAriaLabels: totalAria,
|
|
200
|
+
hasRoles: analysis.roles,
|
|
201
|
+
hasSemanticIds: analysis.semanticTags,
|
|
202
|
+
hasLabels: analysis.labels,
|
|
203
|
+
hasPlaceholders: analysis.placeholders,
|
|
204
|
+
hasAltTexts: analysis.altTexts,
|
|
205
|
+
totalElements,
|
|
206
|
+
framework,
|
|
207
|
+
cssFramework,
|
|
208
|
+
testabilityScore,
|
|
209
|
+
accessibilityScore,
|
|
210
|
+
patterns: {
|
|
211
|
+
hasReact: analysis.hasReact,
|
|
212
|
+
hasVue: analysis.hasVue,
|
|
213
|
+
hasAngular: analysis.hasAngular,
|
|
214
|
+
hasSvelte: analysis.hasSvelte,
|
|
215
|
+
hasNext: analysis.hasNext,
|
|
216
|
+
hasNuxt: analysis.hasNuxt,
|
|
217
|
+
hasRemix: analysis.hasRemix,
|
|
218
|
+
hasAstro: analysis.hasAstro,
|
|
219
|
+
hasTailwind: analysis.hasTailwind,
|
|
220
|
+
hasBootstrap: analysis.hasBootstrap,
|
|
221
|
+
hasMUI: analysis.hasMUI,
|
|
222
|
+
hasChakra: analysis.hasChakra,
|
|
223
|
+
hasAntDesign: analysis.hasAnt,
|
|
224
|
+
hasBulma: analysis.hasBulma,
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Determine the site profile based on analysis
|
|
230
|
+
*/
|
|
231
|
+
determineProfile(analysis) {
|
|
232
|
+
const { hasTestIds, hasAriaLabels, totalElements } = analysis;
|
|
233
|
+
const testIdRatio = totalElements > 0 ? hasTestIds / totalElements : 0;
|
|
234
|
+
const a11yRatio = totalElements > 0 ? hasAriaLabels / totalElements : 0;
|
|
235
|
+
// PROFIL_MODERN: Site moderne avec data-testid (>30% des éléments)
|
|
236
|
+
if (testIdRatio > 0.3) {
|
|
237
|
+
return 'PROFIL_MODERN';
|
|
238
|
+
}
|
|
239
|
+
// PROFIL_ACCESSIBLE: Bonne accessibilité mais peu de testids
|
|
240
|
+
if (a11yRatio > 0.6 && testIdRatio < 0.1) {
|
|
241
|
+
return 'PROFIL_ACCESSIBLE';
|
|
242
|
+
}
|
|
243
|
+
// PROFIL_LEGACY: Site legacy avec peu d'attributs
|
|
244
|
+
if (analysis.accessibilityScore < 30 && testIdRatio < 0.05) {
|
|
245
|
+
return 'PROFIL_LEGACY';
|
|
246
|
+
}
|
|
247
|
+
// PROFIL_MINIMAL: Site minimaliste
|
|
248
|
+
return 'PROFIL_MINIMAL';
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Get a human-readable description of the profile
|
|
252
|
+
*/
|
|
253
|
+
getProfileDescription(profile) {
|
|
254
|
+
const descriptions = {
|
|
255
|
+
PROFIL_MODERN: 'Site moderne avec data-testid (React Testing Library, Cypress)',
|
|
256
|
+
PROFIL_ACCESSIBLE: 'Site accessible (ARIA, labels) mais sans testids',
|
|
257
|
+
PROFIL_LEGACY: 'Site legacy (ASP.NET, PHP ancien, WordPress)',
|
|
258
|
+
PROFIL_MINIMAL: 'Site minimaliste (landing pages, blogs)',
|
|
259
|
+
};
|
|
260
|
+
return descriptions[profile];
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Get the recommended strategy for the profile
|
|
264
|
+
*/
|
|
265
|
+
getRecommendedStrategy(profile) {
|
|
266
|
+
const strategies = {
|
|
267
|
+
PROFIL_MODERN: 'TIER 1 = data-testid (contrat explicite dev/QA)',
|
|
268
|
+
PROFIL_ACCESSIBLE: 'TIER 1 = role + aria-label (Testing Library)',
|
|
269
|
+
PROFIL_LEGACY: 'TIER 1 = ID sémantique, TIER 2 = name',
|
|
270
|
+
PROFIL_MINIMAL: 'TIER 1 = texte visible, TIER 2 = role',
|
|
271
|
+
};
|
|
272
|
+
return strategies[profile];
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Default profiler instance
|
|
277
|
+
*/
|
|
278
|
+
export const defaultProfiler = new SiteProfiler();
|
|
279
|
+
/**
|
|
280
|
+
* Quick analyze function (convenience wrapper)
|
|
281
|
+
*/
|
|
282
|
+
export async function analyzeSite(page) {
|
|
283
|
+
return defaultProfiler.analyzeSite(page);
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Quick profile determination (convenience wrapper)
|
|
287
|
+
*/
|
|
288
|
+
export function determineSiteProfile(analysis) {
|
|
289
|
+
return defaultProfiler.determineProfile(analysis);
|
|
290
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
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
|
+
export interface SourceMapLocation {
|
|
16
|
+
/** Generated file line number (1-based) */
|
|
17
|
+
generatedLine: number;
|
|
18
|
+
/** Generated file column number (1-based) */
|
|
19
|
+
generatedColumn: number;
|
|
20
|
+
/** Original source file */
|
|
21
|
+
originalSource: string | null;
|
|
22
|
+
/** Original file line number */
|
|
23
|
+
originalLine: number | null;
|
|
24
|
+
/** Original file column number */
|
|
25
|
+
originalColumn: number | null;
|
|
26
|
+
/** Function name */
|
|
27
|
+
name: string | null;
|
|
28
|
+
}
|
|
29
|
+
export interface SourceMapInfo {
|
|
30
|
+
/** Source map URL */
|
|
31
|
+
url: string;
|
|
32
|
+
/** Source map content (base64 or external) */
|
|
33
|
+
content: string | null;
|
|
34
|
+
/** Number of sources in the map */
|
|
35
|
+
sourceCount: number;
|
|
36
|
+
/** Source file names */
|
|
37
|
+
sources: string[];
|
|
38
|
+
/** Source root */
|
|
39
|
+
sourceRoot: string;
|
|
40
|
+
/** Has mappings */
|
|
41
|
+
hasMappings: boolean;
|
|
42
|
+
/** Source map format version */
|
|
43
|
+
version: number;
|
|
44
|
+
/** Whether source map is valid */
|
|
45
|
+
valid: boolean;
|
|
46
|
+
}
|
|
47
|
+
export interface MappedError {
|
|
48
|
+
/** Original error */
|
|
49
|
+
original: Error;
|
|
50
|
+
/** Mapped stack trace */
|
|
51
|
+
mappedStack: Array<{
|
|
52
|
+
filename: string;
|
|
53
|
+
line: number;
|
|
54
|
+
column: number;
|
|
55
|
+
function: string | null;
|
|
56
|
+
originalFilename: string | null;
|
|
57
|
+
originalLine: number | null;
|
|
58
|
+
originalColumn: number | null;
|
|
59
|
+
}>;
|
|
60
|
+
/** Source map was used */
|
|
61
|
+
sourceMapUsed: boolean;
|
|
62
|
+
}
|
|
63
|
+
export interface SourceMapResult {
|
|
64
|
+
/** Source maps found */
|
|
65
|
+
sourceMaps: Map<string, SourceMapInfo>;
|
|
66
|
+
/** Files with source maps */
|
|
67
|
+
filesWithSourceMaps: string[];
|
|
68
|
+
/** Files without source maps */
|
|
69
|
+
filesWithoutSourceMaps: string[];
|
|
70
|
+
/** Coverage percentage */
|
|
71
|
+
sourceMapCoverage: number;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Source Maps Handler class
|
|
75
|
+
*/
|
|
76
|
+
export declare class SourceMapsHandler {
|
|
77
|
+
private page;
|
|
78
|
+
private sourceMapsCache;
|
|
79
|
+
constructor(page: any);
|
|
80
|
+
/**
|
|
81
|
+
* Get all source map URLs from the page
|
|
82
|
+
*/
|
|
83
|
+
getSourceMapURLs(): Promise<Map<string, string>>;
|
|
84
|
+
/**
|
|
85
|
+
* Fetch and parse a source map
|
|
86
|
+
*/
|
|
87
|
+
fetchSourceMap(sourceMapUrl: string): Promise<SourceMapInfo>;
|
|
88
|
+
/**
|
|
89
|
+
* Get all source maps from the page
|
|
90
|
+
*/
|
|
91
|
+
getAllSourceMaps(): Promise<SourceMapResult>;
|
|
92
|
+
/**
|
|
93
|
+
* Map an error stack trace using source maps
|
|
94
|
+
*/
|
|
95
|
+
mapError(error: Error): Promise<MappedError>;
|
|
96
|
+
/**
|
|
97
|
+
* Map a generated location to original location
|
|
98
|
+
*/
|
|
99
|
+
mapLocation(filename: string, line: number, column: number): Promise<SourceMapLocation>;
|
|
100
|
+
/**
|
|
101
|
+
* Get original source content from source map
|
|
102
|
+
*/
|
|
103
|
+
getOriginalSource(sourceMapUrl: string, sourceIndex: number): Promise<string | null>;
|
|
104
|
+
/**
|
|
105
|
+
* Check if source maps are enabled for a file
|
|
106
|
+
*/
|
|
107
|
+
hasSourceMap(filename: string): Promise<boolean>;
|
|
108
|
+
/**
|
|
109
|
+
* Inject source map helper into the page
|
|
110
|
+
*/
|
|
111
|
+
injectSourceMapHelper(): Promise<void>;
|
|
112
|
+
/**
|
|
113
|
+
* Validate source map quality
|
|
114
|
+
*/
|
|
115
|
+
validateSourceMaps(): Promise<{
|
|
116
|
+
total: number;
|
|
117
|
+
valid: number;
|
|
118
|
+
invalid: number;
|
|
119
|
+
missing: number;
|
|
120
|
+
hasNames: number;
|
|
121
|
+
hasSourceContent: number;
|
|
122
|
+
avgSourceCount: number;
|
|
123
|
+
}>;
|
|
124
|
+
/**
|
|
125
|
+
* Get source map statistics
|
|
126
|
+
*/
|
|
127
|
+
getStatistics(): Promise<{
|
|
128
|
+
sourceMapCoverage: number;
|
|
129
|
+
totalFiles: number;
|
|
130
|
+
filesWithSourceMaps: number;
|
|
131
|
+
avgMappingsPerFile: number;
|
|
132
|
+
avgSourcesPerFile: number;
|
|
133
|
+
recommendation: string;
|
|
134
|
+
}>;
|
|
135
|
+
/**
|
|
136
|
+
* Clear source map cache
|
|
137
|
+
*/
|
|
138
|
+
clearCache(): void;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Factory function to create Source Maps Handler
|
|
142
|
+
*/
|
|
143
|
+
export declare function createSourceMapsHandler(page: any): SourceMapsHandler;
|
|
144
|
+
export default SourceMapsHandler;
|