qa360 2.3.0 → 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.js +2 -2
- 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 -330
- 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 -105
- package/core/package.json +0 -90
- 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/crawl.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,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QA360 Network Manager
|
|
3
|
+
*
|
|
4
|
+
* P0 Features: Advanced network control for testing
|
|
5
|
+
* - Block routes: Prevent specific requests from completing
|
|
6
|
+
* - Mock routes: Return custom responses for specific requests
|
|
7
|
+
* - Wait for request: Wait until a specific request is made
|
|
8
|
+
* - Wait for response: Wait until a specific response is received
|
|
9
|
+
*
|
|
10
|
+
* Uses Playwright's page.route(), page.waitForRequest(), page.waitForResponse()
|
|
11
|
+
*/
|
|
12
|
+
import type { Page, Request, Response } from '@playwright/test';
|
|
13
|
+
/**
|
|
14
|
+
* Route blocking configuration
|
|
15
|
+
*/
|
|
16
|
+
export interface BlockRouteConfig {
|
|
17
|
+
/**
|
|
18
|
+
* URL pattern to block (regex, string, or function)
|
|
19
|
+
*/
|
|
20
|
+
urlPattern: string | RegExp | ((url: string) => boolean);
|
|
21
|
+
/**
|
|
22
|
+
* Optional HTTP methods to block
|
|
23
|
+
* If not specified, blocks all methods
|
|
24
|
+
*/
|
|
25
|
+
methods?: string[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Route mocking configuration
|
|
29
|
+
*/
|
|
30
|
+
export interface MockRouteConfig {
|
|
31
|
+
/**
|
|
32
|
+
* URL pattern to mock (regex, string, or function)
|
|
33
|
+
*/
|
|
34
|
+
urlPattern: string | RegExp | ((url: string) => boolean);
|
|
35
|
+
/**
|
|
36
|
+
* HTTP status to return
|
|
37
|
+
*/
|
|
38
|
+
status: number;
|
|
39
|
+
/**
|
|
40
|
+
* Response headers
|
|
41
|
+
*/
|
|
42
|
+
headers?: Record<string, string>;
|
|
43
|
+
/**
|
|
44
|
+
* Response body (string or JSON)
|
|
45
|
+
*/
|
|
46
|
+
body?: string | Record<string, unknown>;
|
|
47
|
+
/**
|
|
48
|
+
* Content type
|
|
49
|
+
*/
|
|
50
|
+
contentType?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Optional HTTP methods to mock
|
|
53
|
+
*/
|
|
54
|
+
methods?: string[];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Wait for request configuration
|
|
58
|
+
*/
|
|
59
|
+
export interface WaitForRequestOptions {
|
|
60
|
+
/**
|
|
61
|
+
* URL pattern to wait for
|
|
62
|
+
*/
|
|
63
|
+
urlPattern?: string | RegExp | ((url: string) => boolean);
|
|
64
|
+
/**
|
|
65
|
+
* HTTP method to wait for
|
|
66
|
+
*/
|
|
67
|
+
method?: string;
|
|
68
|
+
/**
|
|
69
|
+
* Timeout in milliseconds
|
|
70
|
+
*/
|
|
71
|
+
timeout?: number;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Wait for response configuration
|
|
75
|
+
*/
|
|
76
|
+
export interface WaitForResponseOptions {
|
|
77
|
+
/**
|
|
78
|
+
* URL pattern to wait for
|
|
79
|
+
*/
|
|
80
|
+
urlPattern?: string | RegExp | ((url: string) => boolean);
|
|
81
|
+
/**
|
|
82
|
+
* HTTP status to wait for
|
|
83
|
+
*/
|
|
84
|
+
status?: number;
|
|
85
|
+
/**
|
|
86
|
+
* Timeout in milliseconds
|
|
87
|
+
*/
|
|
88
|
+
timeout?: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Network Manager class
|
|
92
|
+
* Provides advanced network control capabilities
|
|
93
|
+
*/
|
|
94
|
+
export declare class NetworkManager {
|
|
95
|
+
private page;
|
|
96
|
+
private blockedRoutes;
|
|
97
|
+
private mockedRoutes;
|
|
98
|
+
constructor(page: Page);
|
|
99
|
+
/**
|
|
100
|
+
* Block routes matching the given pattern
|
|
101
|
+
* P0: Block specific requests (analytics, trackers, etc.)
|
|
102
|
+
*/
|
|
103
|
+
blockRoute(config: BlockRouteConfig): Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Mock routes with custom responses
|
|
106
|
+
* P0: Return fake responses for testing
|
|
107
|
+
*/
|
|
108
|
+
mockRoute(config: MockRouteConfig): Promise<void>;
|
|
109
|
+
/**
|
|
110
|
+
* Wait for a request matching the given pattern
|
|
111
|
+
* P0: Wait for specific API calls
|
|
112
|
+
*/
|
|
113
|
+
waitForRequest(options?: WaitForRequestOptions): Promise<Request>;
|
|
114
|
+
/**
|
|
115
|
+
* Wait for a response matching the given pattern
|
|
116
|
+
* P0: Wait for specific API responses
|
|
117
|
+
*/
|
|
118
|
+
waitForResponse(options?: WaitForResponseOptions): Promise<Response>;
|
|
119
|
+
/**
|
|
120
|
+
* Unblock all blocked routes
|
|
121
|
+
*/
|
|
122
|
+
unblockRoutes(): Promise<void>;
|
|
123
|
+
/**
|
|
124
|
+
* Unmock all mocked routes
|
|
125
|
+
*/
|
|
126
|
+
unmockRoutes(): Promise<void>;
|
|
127
|
+
/**
|
|
128
|
+
* Get all blocked routes
|
|
129
|
+
*/
|
|
130
|
+
getBlockedRoutes(): BlockRouteConfig[];
|
|
131
|
+
/**
|
|
132
|
+
* Get all mocked routes
|
|
133
|
+
*/
|
|
134
|
+
getMockedRoutes(): MockRouteConfig[];
|
|
135
|
+
/**
|
|
136
|
+
* Check if a URL matches a pattern
|
|
137
|
+
*/
|
|
138
|
+
private matchPattern;
|
|
139
|
+
/**
|
|
140
|
+
* Get content type based on body
|
|
141
|
+
*/
|
|
142
|
+
private getContentType;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Convenience function to create a network manager
|
|
146
|
+
*/
|
|
147
|
+
export declare function createNetworkManager(page: Page): NetworkManager;
|
|
148
|
+
/**
|
|
149
|
+
* Predefined common blocking patterns
|
|
150
|
+
*/
|
|
151
|
+
export declare const BlockPatterns: {
|
|
152
|
+
/**
|
|
153
|
+
* Block Google Analytics
|
|
154
|
+
*/
|
|
155
|
+
googleAnalytics: string;
|
|
156
|
+
/**
|
|
157
|
+
* Block Google Tag Manager
|
|
158
|
+
*/
|
|
159
|
+
googleTagManager: string;
|
|
160
|
+
/**
|
|
161
|
+
* Block Facebook Pixel
|
|
162
|
+
*/
|
|
163
|
+
facebookPixel: string;
|
|
164
|
+
/**
|
|
165
|
+
* Block DoubleClick
|
|
166
|
+
*/
|
|
167
|
+
doubleClick: string;
|
|
168
|
+
/**
|
|
169
|
+
* Block all analytics
|
|
170
|
+
*/
|
|
171
|
+
allAnalytics: string[];
|
|
172
|
+
/**
|
|
173
|
+
* Block images
|
|
174
|
+
*/
|
|
175
|
+
images: string;
|
|
176
|
+
/**
|
|
177
|
+
* Block fonts
|
|
178
|
+
*/
|
|
179
|
+
fonts: string;
|
|
180
|
+
/**
|
|
181
|
+
* Block CSS
|
|
182
|
+
*/
|
|
183
|
+
css: string;
|
|
184
|
+
/**
|
|
185
|
+
* Block JavaScript
|
|
186
|
+
*/
|
|
187
|
+
javascript: string;
|
|
188
|
+
};
|
|
189
|
+
/**
|
|
190
|
+
* Predefined common mock responses
|
|
191
|
+
*/
|
|
192
|
+
export declare const MockResponses: {
|
|
193
|
+
/**
|
|
194
|
+
* Mock successful API response
|
|
195
|
+
*/
|
|
196
|
+
successResponse: (data?: Record<string, unknown>) => MockRouteConfig;
|
|
197
|
+
/**
|
|
198
|
+
* Mock error API response
|
|
199
|
+
*/
|
|
200
|
+
errorResponse: (message?: string) => MockRouteConfig;
|
|
201
|
+
/**
|
|
202
|
+
* Mock empty list response
|
|
203
|
+
*/
|
|
204
|
+
emptyList: () => MockRouteConfig;
|
|
205
|
+
/**
|
|
206
|
+
* Mock 404 Not Found
|
|
207
|
+
*/
|
|
208
|
+
notFound: () => MockRouteConfig;
|
|
209
|
+
/**
|
|
210
|
+
* Mock 401 Unauthorized
|
|
211
|
+
*/
|
|
212
|
+
unauthorized: () => MockRouteConfig;
|
|
213
|
+
/**
|
|
214
|
+
* Mock slow response (with latency)
|
|
215
|
+
* Note: This doesn't add actual delay, use NetworkSimulator for that
|
|
216
|
+
*/
|
|
217
|
+
slowResponse: (data?: Record<string, unknown>) => MockRouteConfig;
|
|
218
|
+
};
|
|
219
|
+
/**
|
|
220
|
+
* Convenience functions for common operations
|
|
221
|
+
*/
|
|
222
|
+
/**
|
|
223
|
+
* Block all analytics and tracking scripts
|
|
224
|
+
*/
|
|
225
|
+
export declare function blockAnalytics(page: Page): Promise<void>;
|
|
226
|
+
/**
|
|
227
|
+
* Mock all API responses
|
|
228
|
+
*/
|
|
229
|
+
export declare function mockAllAPI(page: Page, response: MockRouteConfig): Promise<void>;
|
|
230
|
+
/**
|
|
231
|
+
* Wait for API request
|
|
232
|
+
*/
|
|
233
|
+
export declare function waitForAPIRequest(page: Page, urlPattern: string | RegExp, timeout?: number): Promise<Request>;
|
|
234
|
+
/**
|
|
235
|
+
* Wait for API response
|
|
236
|
+
*/
|
|
237
|
+
export declare function waitForAPIResponse(page: Page, urlPattern: string | RegExp, timeout?: number): Promise<Response>;
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QA360 Network Manager
|
|
3
|
+
*
|
|
4
|
+
* P0 Features: Advanced network control for testing
|
|
5
|
+
* - Block routes: Prevent specific requests from completing
|
|
6
|
+
* - Mock routes: Return custom responses for specific requests
|
|
7
|
+
* - Wait for request: Wait until a specific request is made
|
|
8
|
+
* - Wait for response: Wait until a specific response is received
|
|
9
|
+
*
|
|
10
|
+
* Uses Playwright's page.route(), page.waitForRequest(), page.waitForResponse()
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Network Manager class
|
|
14
|
+
* Provides advanced network control capabilities
|
|
15
|
+
*/
|
|
16
|
+
export class NetworkManager {
|
|
17
|
+
page;
|
|
18
|
+
blockedRoutes = [];
|
|
19
|
+
mockedRoutes = [];
|
|
20
|
+
constructor(page) {
|
|
21
|
+
this.page = page;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Block routes matching the given pattern
|
|
25
|
+
* P0: Block specific requests (analytics, trackers, etc.)
|
|
26
|
+
*/
|
|
27
|
+
async blockRoute(config) {
|
|
28
|
+
const { urlPattern, methods } = config;
|
|
29
|
+
const handler = async (route) => {
|
|
30
|
+
const request = route.request();
|
|
31
|
+
const url = request.url();
|
|
32
|
+
const method = request.method();
|
|
33
|
+
// Check if URL matches pattern
|
|
34
|
+
const matches = this.matchPattern(url, urlPattern);
|
|
35
|
+
if (!matches) {
|
|
36
|
+
await route.continue();
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Check if method matches
|
|
40
|
+
if (methods && !methods.includes(method)) {
|
|
41
|
+
await route.continue();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Abort the request
|
|
45
|
+
await route.abort('failed');
|
|
46
|
+
};
|
|
47
|
+
// Create URL pattern wrapper for Playwright
|
|
48
|
+
const playwrightUrlPattern = typeof urlPattern === 'function'
|
|
49
|
+
? (url) => this.matchPattern(url.href, urlPattern)
|
|
50
|
+
: urlPattern;
|
|
51
|
+
await this.page.route(playwrightUrlPattern, handler);
|
|
52
|
+
this.blockedRoutes.push(config);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Mock routes with custom responses
|
|
56
|
+
* P0: Return fake responses for testing
|
|
57
|
+
*/
|
|
58
|
+
async mockRoute(config) {
|
|
59
|
+
const { urlPattern, status, headers, body, contentType, methods } = config;
|
|
60
|
+
const handler = async (route) => {
|
|
61
|
+
const request = route.request();
|
|
62
|
+
const url = request.url();
|
|
63
|
+
const method = request.method();
|
|
64
|
+
// Check if URL matches pattern
|
|
65
|
+
const matches = this.matchPattern(url, urlPattern);
|
|
66
|
+
if (!matches) {
|
|
67
|
+
await route.continue();
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// Check if method matches
|
|
71
|
+
if (methods && !methods.includes(method)) {
|
|
72
|
+
await route.continue();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Prepare response
|
|
76
|
+
const responseHeaders = {
|
|
77
|
+
'content-type': contentType || this.getContentType(body),
|
|
78
|
+
...headers,
|
|
79
|
+
};
|
|
80
|
+
let responseBody;
|
|
81
|
+
if (typeof body === 'string') {
|
|
82
|
+
responseBody = body;
|
|
83
|
+
}
|
|
84
|
+
else if (body !== undefined) {
|
|
85
|
+
responseBody = JSON.stringify(body);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
responseBody = '';
|
|
89
|
+
}
|
|
90
|
+
await route.fulfill({
|
|
91
|
+
status,
|
|
92
|
+
headers: responseHeaders,
|
|
93
|
+
body: responseBody,
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
// Create URL pattern wrapper for Playwright
|
|
97
|
+
const playwrightUrlPattern = typeof urlPattern === 'function'
|
|
98
|
+
? (url) => this.matchPattern(url.href, urlPattern)
|
|
99
|
+
: urlPattern;
|
|
100
|
+
await this.page.route(playwrightUrlPattern, handler);
|
|
101
|
+
this.mockedRoutes.push(config);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Wait for a request matching the given pattern
|
|
105
|
+
* P0: Wait for specific API calls
|
|
106
|
+
*/
|
|
107
|
+
async waitForRequest(options = {}) {
|
|
108
|
+
const { urlPattern = /.*/, method, timeout = 30000 } = options;
|
|
109
|
+
if (method) {
|
|
110
|
+
// Wait for request with specific method
|
|
111
|
+
return await this.page.waitForRequest((request) => {
|
|
112
|
+
const urlMatches = this.matchPattern(request.url(), urlPattern);
|
|
113
|
+
const methodMatches = request.method() === method;
|
|
114
|
+
return urlMatches && methodMatches;
|
|
115
|
+
}, { timeout });
|
|
116
|
+
}
|
|
117
|
+
return await this.page.waitForRequest((request) => this.matchPattern(request.url(), urlPattern), { timeout });
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Wait for a response matching the given pattern
|
|
121
|
+
* P0: Wait for specific API responses
|
|
122
|
+
*/
|
|
123
|
+
async waitForResponse(options = {}) {
|
|
124
|
+
const { urlPattern = /.*/, status, timeout = 30000 } = options;
|
|
125
|
+
if (status) {
|
|
126
|
+
// Wait for response with specific status using predicate
|
|
127
|
+
return await this.page.waitForResponse((response) => {
|
|
128
|
+
const urlMatches = this.matchPattern(response.url(), urlPattern);
|
|
129
|
+
const statusMatches = response.status() === status;
|
|
130
|
+
return urlMatches && statusMatches;
|
|
131
|
+
}, { timeout });
|
|
132
|
+
}
|
|
133
|
+
return await this.page.waitForResponse((response) => this.matchPattern(response.url(), urlPattern), { timeout });
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Unblock all blocked routes
|
|
137
|
+
*/
|
|
138
|
+
async unblockRoutes() {
|
|
139
|
+
// Clear all blocked routes
|
|
140
|
+
this.blockedRoutes = [];
|
|
141
|
+
// Note: Playwright doesn't provide a way to remove specific routes,
|
|
142
|
+
// so we need to recreate the page or use a workaround
|
|
143
|
+
// For now, we track them manually and users can call this for bookkeeping
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Unmock all mocked routes
|
|
147
|
+
*/
|
|
148
|
+
async unmockRoutes() {
|
|
149
|
+
// Clear all mocked routes
|
|
150
|
+
this.mockedRoutes = [];
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get all blocked routes
|
|
154
|
+
*/
|
|
155
|
+
getBlockedRoutes() {
|
|
156
|
+
return [...this.blockedRoutes];
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get all mocked routes
|
|
160
|
+
*/
|
|
161
|
+
getMockedRoutes() {
|
|
162
|
+
return [...this.mockedRoutes];
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Check if a URL matches a pattern
|
|
166
|
+
*/
|
|
167
|
+
matchPattern(url, pattern) {
|
|
168
|
+
if (typeof pattern === 'string') {
|
|
169
|
+
// Convert glob pattern to regex
|
|
170
|
+
const regexPattern = pattern
|
|
171
|
+
.replace(/\*/g, '.*')
|
|
172
|
+
.replace(/\?/g, '.');
|
|
173
|
+
return new RegExp(regexPattern).test(url);
|
|
174
|
+
}
|
|
175
|
+
if (pattern instanceof RegExp) {
|
|
176
|
+
return pattern.test(url);
|
|
177
|
+
}
|
|
178
|
+
if (typeof pattern === 'function') {
|
|
179
|
+
return pattern(url);
|
|
180
|
+
}
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Get content type based on body
|
|
185
|
+
*/
|
|
186
|
+
getContentType(body) {
|
|
187
|
+
if (body === undefined) {
|
|
188
|
+
return 'text/plain';
|
|
189
|
+
}
|
|
190
|
+
if (typeof body === 'string') {
|
|
191
|
+
// Try to detect if it's JSON
|
|
192
|
+
try {
|
|
193
|
+
JSON.parse(body);
|
|
194
|
+
return 'application/json';
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return 'text/plain';
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return 'application/json';
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Convenience function to create a network manager
|
|
205
|
+
*/
|
|
206
|
+
export function createNetworkManager(page) {
|
|
207
|
+
return new NetworkManager(page);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Predefined common blocking patterns
|
|
211
|
+
*/
|
|
212
|
+
export const BlockPatterns = {
|
|
213
|
+
/**
|
|
214
|
+
* Block Google Analytics
|
|
215
|
+
*/
|
|
216
|
+
googleAnalytics: '**/google-analytics.com/**',
|
|
217
|
+
/**
|
|
218
|
+
* Block Google Tag Manager
|
|
219
|
+
*/
|
|
220
|
+
googleTagManager: '**/googletagmanager.com/**',
|
|
221
|
+
/**
|
|
222
|
+
* Block Facebook Pixel
|
|
223
|
+
*/
|
|
224
|
+
facebookPixel: '**/facebook.com/tr/**',
|
|
225
|
+
/**
|
|
226
|
+
* Block DoubleClick
|
|
227
|
+
*/
|
|
228
|
+
doubleClick: '**/doubleclick.net/**',
|
|
229
|
+
/**
|
|
230
|
+
* Block all analytics
|
|
231
|
+
*/
|
|
232
|
+
allAnalytics: ['**/analytics/**', '**/tracking/**', '**/telemetry/**'],
|
|
233
|
+
/**
|
|
234
|
+
* Block images
|
|
235
|
+
*/
|
|
236
|
+
images: '**/*.{png,jpg,jpeg,gif,webp,svg}',
|
|
237
|
+
/**
|
|
238
|
+
* Block fonts
|
|
239
|
+
*/
|
|
240
|
+
fonts: '**/*.{woff,woff2,ttf,otf,eot}',
|
|
241
|
+
/**
|
|
242
|
+
* Block CSS
|
|
243
|
+
*/
|
|
244
|
+
css: '**/*.css',
|
|
245
|
+
/**
|
|
246
|
+
* Block JavaScript
|
|
247
|
+
*/
|
|
248
|
+
javascript: '**/*.js',
|
|
249
|
+
};
|
|
250
|
+
/**
|
|
251
|
+
* Predefined common mock responses
|
|
252
|
+
*/
|
|
253
|
+
export const MockResponses = {
|
|
254
|
+
/**
|
|
255
|
+
* Mock successful API response
|
|
256
|
+
*/
|
|
257
|
+
successResponse: (data = {}) => ({
|
|
258
|
+
urlPattern: '**/api/**',
|
|
259
|
+
status: 200,
|
|
260
|
+
body: { success: true, data },
|
|
261
|
+
contentType: 'application/json',
|
|
262
|
+
}),
|
|
263
|
+
/**
|
|
264
|
+
* Mock error API response
|
|
265
|
+
*/
|
|
266
|
+
errorResponse: (message = 'Error') => ({
|
|
267
|
+
urlPattern: '**/api/**',
|
|
268
|
+
status: 500,
|
|
269
|
+
body: { success: false, error: message },
|
|
270
|
+
contentType: 'application/json',
|
|
271
|
+
}),
|
|
272
|
+
/**
|
|
273
|
+
* Mock empty list response
|
|
274
|
+
*/
|
|
275
|
+
emptyList: () => ({
|
|
276
|
+
urlPattern: '**/api/**',
|
|
277
|
+
status: 200,
|
|
278
|
+
body: '[]',
|
|
279
|
+
contentType: 'application/json',
|
|
280
|
+
}),
|
|
281
|
+
/**
|
|
282
|
+
* Mock 404 Not Found
|
|
283
|
+
*/
|
|
284
|
+
notFound: () => ({
|
|
285
|
+
urlPattern: '**/api/**',
|
|
286
|
+
status: 404,
|
|
287
|
+
body: { error: 'Not Found' },
|
|
288
|
+
contentType: 'application/json',
|
|
289
|
+
}),
|
|
290
|
+
/**
|
|
291
|
+
* Mock 401 Unauthorized
|
|
292
|
+
*/
|
|
293
|
+
unauthorized: () => ({
|
|
294
|
+
urlPattern: '**/api/**',
|
|
295
|
+
status: 401,
|
|
296
|
+
body: { error: 'Unauthorized' },
|
|
297
|
+
contentType: 'application/json',
|
|
298
|
+
}),
|
|
299
|
+
/**
|
|
300
|
+
* Mock slow response (with latency)
|
|
301
|
+
* Note: This doesn't add actual delay, use NetworkSimulator for that
|
|
302
|
+
*/
|
|
303
|
+
slowResponse: (data = {}) => ({
|
|
304
|
+
urlPattern: '**/api/**',
|
|
305
|
+
status: 200,
|
|
306
|
+
body: { success: true, data },
|
|
307
|
+
contentType: 'application/json',
|
|
308
|
+
}),
|
|
309
|
+
};
|
|
310
|
+
/**
|
|
311
|
+
* Convenience functions for common operations
|
|
312
|
+
*/
|
|
313
|
+
/**
|
|
314
|
+
* Block all analytics and tracking scripts
|
|
315
|
+
*/
|
|
316
|
+
export async function blockAnalytics(page) {
|
|
317
|
+
const manager = new NetworkManager(page);
|
|
318
|
+
await manager.blockRoute({ urlPattern: BlockPatterns.googleAnalytics });
|
|
319
|
+
await manager.blockRoute({ urlPattern: BlockPatterns.googleTagManager });
|
|
320
|
+
await manager.blockRoute({ urlPattern: BlockPatterns.facebookPixel });
|
|
321
|
+
await manager.blockRoute({ urlPattern: BlockPatterns.doubleClick });
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Mock all API responses
|
|
325
|
+
*/
|
|
326
|
+
export async function mockAllAPI(page, response) {
|
|
327
|
+
const manager = new NetworkManager(page);
|
|
328
|
+
await manager.mockRoute(response);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Wait for API request
|
|
332
|
+
*/
|
|
333
|
+
export async function waitForAPIRequest(page, urlPattern, timeout = 30000) {
|
|
334
|
+
const manager = new NetworkManager(page);
|
|
335
|
+
return await manager.waitForRequest({ urlPattern, timeout });
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Wait for API response
|
|
339
|
+
*/
|
|
340
|
+
export async function waitForAPIResponse(page, urlPattern, timeout = 30000) {
|
|
341
|
+
const manager = new NetworkManager(page);
|
|
342
|
+
return await manager.waitForResponse({ urlPattern, timeout });
|
|
343
|
+
}
|