qa360 2.2.20 → 2.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +155 -262
- package/{cli/dist → dist}/commands/ai.js +1 -1
- package/{cli/dist → dist}/commands/coverage.js +1 -1
- package/{cli/dist → dist}/commands/crawl.d.ts +12 -1
- package/{cli/dist → dist}/commands/crawl.js +70 -9
- package/{cli/dist → dist}/commands/doctor.js +2 -2
- package/{cli/dist → dist}/commands/explain.js +2 -2
- package/{cli/dist → dist}/commands/flakiness.js +1 -1
- package/{cli/dist → dist}/commands/generate.js +1 -1
- package/{cli/dist → dist}/commands/history.js +1 -1
- package/{cli/dist → dist}/commands/monitor.js +3 -3
- package/{cli/dist → dist}/commands/ollama.js +1 -1
- package/{cli/dist → dist}/commands/pack.js +2 -2
- package/{cli/dist → dist}/commands/regression.js +1 -1
- package/{cli/dist → dist}/commands/repair.js +1 -1
- package/{cli/dist → dist}/commands/retry.js +1 -1
- package/{cli/dist → dist}/commands/run.d.ts +1 -1
- package/{cli/dist → dist}/commands/run.js +1 -1
- package/{cli/dist → dist}/commands/secrets.js +1 -1
- package/{cli/dist → dist}/commands/serve.js +1 -1
- package/{cli/dist → dist}/commands/slo.js +1 -1
- package/{cli/dist → dist}/commands/verify.js +1 -1
- package/{cli/dist → dist}/core/adapters/playwright-native-api.d.ts +2 -0
- package/{cli/dist → dist}/core/adapters/playwright-native-api.js +20 -1
- package/{cli/dist → dist}/core/adapters/playwright-ui.d.ts +21 -0
- package/dist/core/adapters/playwright-ui.js +2050 -0
- package/{cli/dist → dist}/core/ai/ollama-provider.js +15 -3
- package/{cli/dist → dist}/core/artifacts/ui-artifacts.js +24 -4
- package/dist/core/auth/backup-codes-provider.d.ts +91 -0
- package/dist/core/auth/backup-codes-provider.js +215 -0
- package/{cli/dist → dist}/core/auth/basic-auth-provider.d.ts +6 -0
- package/{cli/dist → dist}/core/auth/basic-auth-provider.js +24 -6
- package/dist/core/auth/digest-auth-provider.d.ts +116 -0
- package/dist/core/auth/digest-auth-provider.js +244 -0
- package/dist/core/auth/hcaptcha-handler.d.ts +103 -0
- package/dist/core/auth/hcaptcha-handler.js +288 -0
- package/{cli/dist → dist}/core/auth/index.d.ts +81 -4
- package/{cli/dist → dist}/core/auth/index.js +15 -1
- package/dist/core/auth/oauth-handler.d.ts +408 -0
- package/dist/core/auth/oauth-handler.js +636 -0
- package/{cli/dist → dist}/core/auth/oauth2-provider.d.ts +9 -0
- package/dist/core/auth/oauth2-provider.js +227 -0
- package/dist/core/auth/otp-provider.d.ts +93 -0
- package/dist/core/auth/otp-provider.js +288 -0
- package/dist/core/auth/recaptcha-handler.d.ts +119 -0
- package/dist/core/auth/recaptcha-handler.js +301 -0
- package/dist/core/auth/remember-me-handler.d.ts +142 -0
- package/dist/core/auth/remember-me-handler.js +255 -0
- package/dist/core/auth/saml-handler.d.ts +173 -0
- package/dist/core/auth/saml-handler.js +364 -0
- package/dist/core/auth/webauthn-handler.d.ts +182 -0
- package/dist/core/auth/webauthn-handler.js +310 -0
- package/dist/core/crawler/advanced-interactions.d.ts +342 -0
- package/dist/core/crawler/advanced-interactions.js +1069 -0
- package/dist/core/crawler/blob-url-download-handler.d.ts +145 -0
- package/dist/core/crawler/blob-url-download-handler.js +392 -0
- package/dist/core/crawler/consent-handler.d.ts +49 -0
- package/dist/core/crawler/consent-handler.js +258 -0
- package/dist/core/crawler/cookie-manager.d.ts +166 -0
- package/dist/core/crawler/cookie-manager.js +353 -0
- package/dist/core/crawler/coop-coep-handler.d.ts +136 -0
- package/dist/core/crawler/coop-coep-handler.js +338 -0
- package/dist/core/crawler/csp-handler.d.ts +151 -0
- package/dist/core/crawler/csp-handler.js +415 -0
- package/dist/core/crawler/download-handler.d.ts +155 -0
- package/dist/core/crawler/download-handler.js +370 -0
- package/dist/core/crawler/email-testing-handler.d.ts +214 -0
- package/dist/core/crawler/email-testing-handler.js +398 -0
- package/dist/core/crawler/error-tracking-handler.d.ts +177 -0
- package/dist/core/crawler/error-tracking-handler.js +378 -0
- package/dist/core/crawler/form-handler.d.ts +100 -0
- package/dist/core/crawler/form-handler.js +465 -0
- package/dist/core/crawler/framework-wait-handler.d.ts +96 -0
- package/dist/core/crawler/framework-wait-handler.js +464 -0
- package/dist/core/crawler/geolocation-handler.d.ts +112 -0
- package/dist/core/crawler/geolocation-handler.js +276 -0
- package/dist/core/crawler/index.d.ts +78 -0
- package/{cli/dist → dist}/core/crawler/index.js +74 -1
- package/dist/core/crawler/intelligent-selector-generator.d.ts +164 -0
- package/dist/core/crawler/intelligent-selector-generator.js +612 -0
- package/{cli/dist → dist}/core/crawler/journey-generator.js +44 -1
- package/{cli/dist → dist}/core/crawler/page-analyzer.d.ts +16 -1
- package/{cli/dist → dist}/core/crawler/page-analyzer.js +469 -17
- package/dist/core/crawler/permissions-handler.d.ts +112 -0
- package/dist/core/crawler/permissions-handler.js +236 -0
- package/dist/core/crawler/permissions-policy-handler.d.ts +113 -0
- package/dist/core/crawler/permissions-policy-handler.js +402 -0
- package/dist/core/crawler/presets.d.ts +100 -0
- package/dist/core/crawler/presets.js +887 -0
- package/dist/core/crawler/repl-debug-handler.d.ts +105 -0
- package/dist/core/crawler/repl-debug-handler.js +552 -0
- package/dist/core/crawler/reporting-api-handler.d.ts +212 -0
- package/dist/core/crawler/reporting-api-handler.js +344 -0
- package/{cli/dist → dist}/core/crawler/selector-generator.d.ts +9 -0
- package/{cli/dist → dist}/core/crawler/selector-generator.js +99 -23
- package/dist/core/crawler/site-profiler.d.ts +89 -0
- package/dist/core/crawler/site-profiler.js +290 -0
- package/dist/core/crawler/sourcemaps-handler.d.ts +144 -0
- package/dist/core/crawler/sourcemaps-handler.js +420 -0
- package/dist/core/crawler/stacked-modals-handler.d.ts +118 -0
- package/dist/core/crawler/stacked-modals-handler.js +429 -0
- package/dist/core/crawler/trusted-types-handler.d.ts +149 -0
- package/dist/core/crawler/trusted-types-handler.js +413 -0
- package/{cli/dist → dist}/core/crawler/types.d.ts +68 -2
- package/dist/core/crawler/wait-strategies.d.ts +108 -0
- package/dist/core/crawler/wait-strategies.js +399 -0
- package/dist/core/fixtures/factories.d.ts +180 -0
- package/dist/core/fixtures/factories.js +279 -0
- package/dist/core/fixtures/index.d.ts +6 -0
- package/dist/core/fixtures/index.js +6 -0
- package/{cli/dist → dist}/core/generation/crawler-pack-generator.d.ts +13 -3
- package/dist/core/generation/crawler-pack-generator.js +232 -0
- package/{cli/dist → dist}/core/generation/index.d.ts +2 -0
- package/{cli/dist → dist}/core/generation/index.js +2 -0
- package/{cli/dist → dist}/core/index.d.ts +2 -0
- package/{cli/dist → dist}/core/index.js +4 -0
- package/dist/core/network/index.d.ts +7 -0
- package/dist/core/network/index.js +7 -0
- package/dist/core/network/network-manager.d.ts +237 -0
- package/dist/core/network/network-manager.js +343 -0
- package/dist/core/network/network-simulator.d.ts +158 -0
- package/dist/core/network/network-simulator.js +261 -0
- package/{cli/dist → dist}/core/pack/validator.js +2 -2
- package/{cli/dist → dist}/core/pack-v2/migrator.d.ts +5 -0
- package/{cli/dist → dist}/core/pack-v2/migrator.js +81 -6
- package/{cli/dist → dist}/core/pack-v2/validator.js +4 -3
- package/{cli/dist → dist}/core/pom/base-page.js +1 -1
- package/{cli/dist → dist}/core/pom/loader.js +1 -1
- package/dist/core/reporting/index.d.ts +9 -0
- package/dist/core/reporting/index.js +10 -0
- package/dist/core/reporting/junit-reporter.d.ts +114 -0
- package/dist/core/reporting/junit-reporter.js +306 -0
- package/{cli/dist → dist}/core/runner/e2e-helpers.d.ts +1 -1
- package/{cli/dist → dist}/core/runner/e2e-helpers.js +2 -2
- package/{cli/dist → dist}/core/runner/phase3-runner.d.ts +3 -0
- package/{cli/dist → dist}/core/runner/phase3-runner.js +45 -14
- package/dist/core/sharding/test-sharding.d.ts +137 -0
- package/dist/core/sharding/test-sharding.js +233 -0
- package/dist/core/storage/cookie-manager.d.ts +160 -0
- package/dist/core/storage/cookie-manager.js +268 -0
- package/dist/core/storage/index.d.ts +7 -0
- package/dist/core/storage/index.js +7 -0
- package/dist/core/storage/storage-helpers.d.ts +138 -0
- package/dist/core/storage/storage-helpers.js +315 -0
- package/dist/core/test-helpers/index.d.ts +6 -0
- package/dist/core/test-helpers/index.js +6 -0
- package/dist/core/test-helpers/state-reset.d.ts +119 -0
- package/dist/core/test-helpers/state-reset.js +234 -0
- package/{cli/dist → dist}/core/types/pack-v1.d.ts +15 -2
- package/{cli/dist → dist}/core/types/pack-v2.d.ts +1 -1
- package/dist/core/upload/chunked-uploader.d.ts +150 -0
- package/dist/core/upload/chunked-uploader.js +289 -0
- package/dist/core/upload/index.d.ts +11 -0
- package/dist/core/upload/index.js +8 -0
- package/dist/core/upload/mime-validator.d.ts +119 -0
- package/dist/core/upload/mime-validator.js +373 -0
- package/dist/core/upload/presigned-uploader.d.ts +118 -0
- package/dist/core/upload/presigned-uploader.js +274 -0
- package/dist/core/utils/device-emulation.d.ts +194 -0
- package/dist/core/utils/device-emulation.js +380 -0
- package/dist/core/utils/index.d.ts +8 -0
- package/dist/core/utils/index.js +8 -0
- package/dist/core/utils/retry.d.ts +145 -0
- package/dist/core/utils/retry.js +242 -0
- package/dist/core/utils/smart-wait.d.ts +133 -0
- package/dist/core/utils/smart-wait.js +417 -0
- package/dist/core/visual/index.d.ts +7 -0
- package/dist/core/visual/index.js +7 -0
- package/dist/core/visual/pixel-diff.d.ts +87 -0
- package/dist/core/visual/pixel-diff.js +213 -0
- package/dist/core/visual/screenshot-helper.d.ts +130 -0
- package/dist/core/visual/screenshot-helper.js +223 -0
- package/{cli/dist → dist}/utils/config.d.ts +1 -1
- package/examples/README.md +160 -0
- package/examples/accessibility.yml +48 -0
- package/examples/api-basic.yml +27 -0
- package/examples/complete.yml +146 -0
- package/examples/crawler.yml +38 -0
- package/examples/fullstack.yml +78 -0
- package/examples/security.yml +58 -0
- package/examples/ui-advanced.yml +49 -0
- package/examples/ui-basic.yml +24 -0
- package/package.json +33 -67
- package/CHANGELOG.md +0 -262
- package/CONTRIBUTING.md +0 -273
- package/QUICK_START.md +0 -191
- package/cli/CHANGELOG.md +0 -84
- package/cli/LICENSE +0 -24
- package/cli/README.md +0 -222
- package/cli/dist/core/adapters/playwright-ui.js +0 -864
- package/cli/dist/core/auth/oauth2-provider.js +0 -114
- package/cli/dist/core/coverage/analyzer.d.ts +0 -101
- package/cli/dist/core/coverage/analyzer.js +0 -415
- package/cli/dist/core/coverage/collector.d.ts +0 -74
- package/cli/dist/core/coverage/collector.js +0 -459
- package/cli/dist/core/coverage/config.d.ts +0 -37
- package/cli/dist/core/coverage/config.js +0 -156
- package/cli/dist/core/coverage/index.d.ts +0 -11
- package/cli/dist/core/coverage/index.js +0 -15
- package/cli/dist/core/coverage/types.d.ts +0 -267
- package/cli/dist/core/coverage/types.js +0 -6
- package/cli/dist/core/coverage/vault.d.ts +0 -95
- package/cli/dist/core/coverage/vault.js +0 -405
- package/cli/dist/core/crawler/index.d.ts +0 -57
- package/cli/dist/core/fixtures/index.d.ts +0 -8
- package/cli/dist/core/fixtures/index.js +0 -8
- package/cli/dist/core/generation/crawler-pack-generator.js +0 -231
- package/cli/dist/core/reporting/index.d.ts +0 -6
- package/cli/dist/core/reporting/index.js +0 -6
- package/cli/dist/core/visual/index.d.ts +0 -6
- package/cli/dist/core/visual/index.js +0 -6
- package/cli/package.json +0 -76
- package/core/LICENSE +0 -24
- package/core/README.md +0 -64
- package/core/package.json +0 -81
- package/core/schemas/pack.schema.json +0 -236
- /package/{cli/bin → bin}/qa360.js +0 -0
- /package/{cli/dist → dist}/cli-minimal.d.ts +0 -0
- /package/{cli/dist → dist}/cli-minimal.js +0 -0
- /package/{cli/dist → dist}/commands/ai.d.ts +0 -0
- /package/{cli/dist → dist}/commands/ask.d.ts +0 -0
- /package/{cli/dist → dist}/commands/ask.js +0 -0
- /package/{cli/dist → dist}/commands/coverage.d.ts +0 -0
- /package/{cli/dist → dist}/commands/doctor.d.ts +0 -0
- /package/{cli/dist → dist}/commands/examples.d.ts +0 -0
- /package/{cli/dist → dist}/commands/examples.js +0 -0
- /package/{cli/dist → dist}/commands/explain.d.ts +0 -0
- /package/{cli/dist → dist}/commands/flakiness.d.ts +0 -0
- /package/{cli/dist → dist}/commands/generate.d.ts +0 -0
- /package/{cli/dist → dist}/commands/history.d.ts +0 -0
- /package/{cli/dist → dist}/commands/init.d.ts +0 -0
- /package/{cli/dist → dist}/commands/init.js +0 -0
- /package/{cli/dist → dist}/commands/monitor.d.ts +0 -0
- /package/{cli/dist → dist}/commands/ollama.d.ts +0 -0
- /package/{cli/dist → dist}/commands/pack.d.ts +0 -0
- /package/{cli/dist → dist}/commands/regression.d.ts +0 -0
- /package/{cli/dist → dist}/commands/repair.d.ts +0 -0
- /package/{cli/dist → dist}/commands/report.d.ts +0 -0
- /package/{cli/dist → dist}/commands/report.js +0 -0
- /package/{cli/dist → dist}/commands/retry.d.ts +0 -0
- /package/{cli/dist → dist}/commands/scan.d.ts +0 -0
- /package/{cli/dist → dist}/commands/scan.js +0 -0
- /package/{cli/dist → dist}/commands/secrets.d.ts +0 -0
- /package/{cli/dist → dist}/commands/serve.d.ts +0 -0
- /package/{cli/dist → dist}/commands/slo.d.ts +0 -0
- /package/{cli/dist → dist}/commands/verify.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/gitleaks-secrets.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/gitleaks-secrets.js +0 -0
- /package/{cli/dist → dist}/core/adapters/jest-adapter.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/jest-adapter.js +0 -0
- /package/{cli/dist → dist}/core/adapters/k6-perf.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/k6-perf.js +0 -0
- /package/{cli/dist → dist}/core/adapters/osv-deps.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/osv-deps.js +0 -0
- /package/{cli/dist → dist}/core/adapters/playwright-native-adapter.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/playwright-native-adapter.js +0 -0
- /package/{cli/dist → dist}/core/adapters/pytest-adapter.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/pytest-adapter.js +0 -0
- /package/{cli/dist → dist}/core/adapters/semgrep-sast.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/semgrep-sast.js +0 -0
- /package/{cli/dist → dist}/core/adapters/unit-test-types.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/unit-test-types.js +0 -0
- /package/{cli/dist → dist}/core/adapters/vitest-adapter.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/vitest-adapter.js +0 -0
- /package/{cli/dist → dist}/core/adapters/zap-dast.d.ts +0 -0
- /package/{cli/dist → dist}/core/adapters/zap-dast.js +0 -0
- /package/{cli/dist → dist}/core/ai/anthropic-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/anthropic-provider.js +0 -0
- /package/{cli/dist → dist}/core/ai/deepseek-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/deepseek-provider.js +0 -0
- /package/{cli/dist → dist}/core/ai/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/index.js +0 -0
- /package/{cli/dist → dist}/core/ai/llm-client.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/llm-client.js +0 -0
- /package/{cli/dist → dist}/core/ai/mock-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/mock-provider.js +0 -0
- /package/{cli/dist → dist}/core/ai/ollama-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/openai-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/openai-provider.js +0 -0
- /package/{cli/dist → dist}/core/ai/provider-factory.d.ts +0 -0
- /package/{cli/dist → dist}/core/ai/provider-factory.js +0 -0
- /package/{cli/dist → dist}/core/artifacts/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/artifacts/index.js +0 -0
- /package/{cli/dist → dist}/core/artifacts/ui-artifacts.d.ts +0 -0
- /package/{cli/dist → dist}/core/assertions/engine.d.ts +0 -0
- /package/{cli/dist → dist}/core/assertions/engine.js +0 -0
- /package/{cli/dist → dist}/core/assertions/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/assertions/index.js +0 -0
- /package/{cli/dist → dist}/core/assertions/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/assertions/types.js +0 -0
- /package/{cli/dist → dist}/core/auth/api-key-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/api-key-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/aws-iam-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/aws-iam-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/azure-ad-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/azure-ad-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/gcp-adc-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/gcp-adc-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/jwt-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/jwt-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/manager.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/manager.js +0 -0
- /package/{cli/dist → dist}/core/auth/totp-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/totp-provider.js +0 -0
- /package/{cli/dist → dist}/core/auth/ui-login-provider.d.ts +0 -0
- /package/{cli/dist → dist}/core/auth/ui-login-provider.js +0 -0
- /package/{cli/dist → dist}/core/cache/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/cache/index.js +0 -0
- /package/{cli/dist → dist}/core/cache/lru-cache.d.ts +0 -0
- /package/{cli/dist → dist}/core/cache/lru-cache.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/analyzer.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/analyzer.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/collector.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/collector.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/config.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/config.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/index.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/index.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/types.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/types.js +0 -0
- /package/{cli/dist/core → dist}/core/coverage/vault.d.ts +0 -0
- /package/{cli/dist/core → dist}/core/coverage/vault.js +0 -0
- /package/{cli/dist → dist}/core/crawler/journey-generator.d.ts +0 -0
- /package/{cli/dist → dist}/core/crawler/types.js +0 -0
- /package/{cli/dist → dist}/core/dashboard/assets.d.ts +0 -0
- /package/{cli/dist → dist}/core/dashboard/assets.js +0 -0
- /package/{cli/dist → dist}/core/dashboard/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/dashboard/index.js +0 -0
- /package/{cli/dist → dist}/core/dashboard/server.d.ts +0 -0
- /package/{cli/dist → dist}/core/dashboard/server.js +0 -0
- /package/{cli/dist → dist}/core/dashboard/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/dashboard/types.js +0 -0
- /package/{cli/dist → dist}/core/discoverer/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/discoverer/index.js +0 -0
- /package/{cli/dist → dist}/core/fixtures/loader.d.ts +0 -0
- /package/{cli/dist → dist}/core/fixtures/loader.js +0 -0
- /package/{cli/dist → dist}/core/fixtures/resolver.d.ts +0 -0
- /package/{cli/dist → dist}/core/fixtures/resolver.js +0 -0
- /package/{cli/dist → dist}/core/fixtures/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/fixtures/types.js +0 -0
- /package/{cli/dist → dist}/core/flakiness/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/flakiness/index.js +0 -0
- /package/{cli/dist → dist}/core/generation/code-formatter.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/code-formatter.js +0 -0
- /package/{cli/dist → dist}/core/generation/code-generator.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/code-generator.js +0 -0
- /package/{cli/dist → dist}/core/generation/generator.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/generator.js +0 -0
- /package/{cli/dist → dist}/core/generation/pack-generator.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/pack-generator.js +0 -0
- /package/{cli/dist → dist}/core/generation/prompt-builder.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/prompt-builder.js +0 -0
- /package/{cli/dist → dist}/core/generation/source-analyzer.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/source-analyzer.js +0 -0
- /package/{cli/dist → dist}/core/generation/test-optimizer.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/test-optimizer.js +0 -0
- /package/{cli/dist → dist}/core/generation/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/generation/types.js +0 -0
- /package/{cli/dist → dist}/core/hooks/compose.d.ts +0 -0
- /package/{cli/dist → dist}/core/hooks/compose.js +0 -0
- /package/{cli/dist → dist}/core/hooks/runner.d.ts +0 -0
- /package/{cli/dist → dist}/core/hooks/runner.js +0 -0
- /package/{cli/dist → dist}/core/pack/migrator.d.ts +0 -0
- /package/{cli/dist → dist}/core/pack/migrator.js +0 -0
- /package/{cli/dist → dist}/core/pack/validator.d.ts +0 -0
- /package/{cli/dist → dist}/core/pack-v2/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/pack-v2/index.js +0 -0
- /package/{cli/dist → dist}/core/pack-v2/loader.d.ts +0 -0
- /package/{cli/dist → dist}/core/pack-v2/loader.js +0 -0
- /package/{cli/dist → dist}/core/pack-v2/validator.d.ts +0 -0
- /package/{cli/dist → dist}/core/parallel/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/parallel/index.js +0 -0
- /package/{cli/dist → dist}/core/parallel/parallel-runner.d.ts +0 -0
- /package/{cli/dist → dist}/core/parallel/parallel-runner.js +0 -0
- /package/{cli/dist → dist}/core/pom/base-page.d.ts +0 -0
- /package/{cli/dist → dist}/core/pom/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/pom/index.js +0 -0
- /package/{cli/dist → dist}/core/pom/loader.d.ts +0 -0
- /package/{cli/dist → dist}/core/pom/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/pom/types.js +0 -0
- /package/{cli/dist → dist}/core/proof/bundle.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/bundle.js +0 -0
- /package/{cli/dist → dist}/core/proof/canonicalize.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/canonicalize.js +0 -0
- /package/{cli/dist → dist}/core/proof/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/index.js +0 -0
- /package/{cli/dist → dist}/core/proof/schema.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/schema.js +0 -0
- /package/{cli/dist → dist}/core/proof/signer.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/signer.js +0 -0
- /package/{cli/dist → dist}/core/proof/verifier.d.ts +0 -0
- /package/{cli/dist → dist}/core/proof/verifier.js +0 -0
- /package/{cli/dist → dist}/core/regression/detector.d.ts +0 -0
- /package/{cli/dist → dist}/core/regression/detector.js +0 -0
- /package/{cli/dist → dist}/core/regression/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/regression/index.js +0 -0
- /package/{cli/dist → dist}/core/regression/trend-analyzer.d.ts +0 -0
- /package/{cli/dist → dist}/core/regression/trend-analyzer.js +0 -0
- /package/{cli/dist → dist}/core/regression/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/regression/types.js +0 -0
- /package/{cli/dist → dist}/core/regression/vault.d.ts +0 -0
- /package/{cli/dist → dist}/core/regression/vault.js +0 -0
- /package/{cli/dist → dist}/core/repair/engine/fixer.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/engine/fixer.js +0 -0
- /package/{cli/dist → dist}/core/repair/engine/suggestion-engine.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/engine/suggestion-engine.js +0 -0
- /package/{cli/dist → dist}/core/repair/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/index.js +0 -0
- /package/{cli/dist → dist}/core/repair/repairer.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/repairer.js +0 -0
- /package/{cli/dist → dist}/core/repair/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/types.js +0 -0
- /package/{cli/dist → dist}/core/repair/utils/error-analyzer.d.ts +0 -0
- /package/{cli/dist → dist}/core/repair/utils/error-analyzer.js +0 -0
- /package/{cli/dist → dist}/core/reporting/html-reporter.d.ts +0 -0
- /package/{cli/dist → dist}/core/reporting/html-reporter.js +0 -0
- /package/{cli/dist → dist}/core/retry/flakiness-integration.d.ts +0 -0
- /package/{cli/dist → dist}/core/retry/flakiness-integration.js +0 -0
- /package/{cli/dist → dist}/core/retry/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/retry/index.js +0 -0
- /package/{cli/dist → dist}/core/retry/retry-engine.d.ts +0 -0
- /package/{cli/dist → dist}/core/retry/retry-engine.js +0 -0
- /package/{cli/dist → dist}/core/retry/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/retry/types.js +0 -0
- /package/{cli/dist → dist}/core/retry/vault.d.ts +0 -0
- /package/{cli/dist → dist}/core/retry/vault.js +0 -0
- /package/{cli/dist → dist}/core/schemas/pack.schema.json +0 -0
- /package/{cli/dist → dist}/core/secrets/crypto.d.ts +0 -0
- /package/{cli/dist → dist}/core/secrets/crypto.js +0 -0
- /package/{cli/dist → dist}/core/secrets/manager.d.ts +0 -0
- /package/{cli/dist → dist}/core/secrets/manager.js +0 -0
- /package/{cli/dist → dist}/core/security/redaction-patterns-extended.d.ts +0 -0
- /package/{cli/dist → dist}/core/security/redaction-patterns-extended.js +0 -0
- /package/{cli/dist → dist}/core/security/redactor.d.ts +0 -0
- /package/{cli/dist → dist}/core/security/redactor.js +0 -0
- /package/{cli/dist → dist}/core/self-healing/assertion-healer.d.ts +0 -0
- /package/{cli/dist → dist}/core/self-healing/assertion-healer.js +0 -0
- /package/{cli/dist → dist}/core/self-healing/engine.d.ts +0 -0
- /package/{cli/dist → dist}/core/self-healing/engine.js +0 -0
- /package/{cli/dist → dist}/core/self-healing/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/self-healing/index.js +0 -0
- /package/{cli/dist → dist}/core/self-healing/selector-healer.d.ts +0 -0
- /package/{cli/dist → dist}/core/self-healing/selector-healer.js +0 -0
- /package/{cli/dist → dist}/core/self-healing/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/self-healing/types.js +0 -0
- /package/{cli/dist → dist}/core/serve/diagnostics-collector.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/diagnostics-collector.js +0 -0
- /package/{cli/dist → dist}/core/serve/health-checker.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/health-checker.js +0 -0
- /package/{cli/dist → dist}/core/serve/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/index.js +0 -0
- /package/{cli/dist → dist}/core/serve/metrics-collector.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/metrics-collector.js +0 -0
- /package/{cli/dist → dist}/core/serve/process-manager.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/process-manager.js +0 -0
- /package/{cli/dist → dist}/core/serve/server.d.ts +0 -0
- /package/{cli/dist → dist}/core/serve/server.js +0 -0
- /package/{cli/dist → dist}/core/slo/config.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/config.js +0 -0
- /package/{cli/dist → dist}/core/slo/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/index.js +0 -0
- /package/{cli/dist → dist}/core/slo/sli-calculator.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/sli-calculator.js +0 -0
- /package/{cli/dist → dist}/core/slo/slo-tracker.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/slo-tracker.js +0 -0
- /package/{cli/dist → dist}/core/slo/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/types.js +0 -0
- /package/{cli/dist → dist}/core/slo/vault.d.ts +0 -0
- /package/{cli/dist → dist}/core/slo/vault.js +0 -0
- /package/{cli/dist → dist}/core/tui/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/tui/index.js +0 -0
- /package/{cli/dist → dist}/core/tui/monitor.d.ts +0 -0
- /package/{cli/dist → dist}/core/tui/monitor.js +0 -0
- /package/{cli/dist → dist}/core/tui/renderer.d.ts +0 -0
- /package/{cli/dist → dist}/core/tui/renderer.js +0 -0
- /package/{cli/dist → dist}/core/tui/types.d.ts +0 -0
- /package/{cli/dist → dist}/core/tui/types.js +0 -0
- /package/{cli/dist → dist}/core/types/pack-v1.js +0 -0
- /package/{cli/dist → dist}/core/types/pack-v2.js +0 -0
- /package/{cli/dist → dist}/core/types/trust-score.d.ts +0 -0
- /package/{cli/dist → dist}/core/types/trust-score.js +0 -0
- /package/{cli/dist → dist}/core/vault/cas.d.ts +0 -0
- /package/{cli/dist → dist}/core/vault/cas.js +0 -0
- /package/{cli/dist → dist}/core/vault/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/vault/index.js +0 -0
- /package/{cli/dist → dist}/core/visual/visual-regression.d.ts +0 -0
- /package/{cli/dist → dist}/core/visual/visual-regression.js +0 -0
- /package/{cli/dist → dist}/core/watch/index.d.ts +0 -0
- /package/{cli/dist → dist}/core/watch/index.js +0 -0
- /package/{cli/dist → dist}/core/watch/watch-mode.d.ts +0 -0
- /package/{cli/dist → dist}/core/watch/watch-mode.js +0 -0
- /package/{cli/dist → dist}/generators/index.d.ts +0 -0
- /package/{cli/dist → dist}/generators/index.js +0 -0
- /package/{cli/dist → dist}/generators/json-reporter.d.ts +0 -0
- /package/{cli/dist → dist}/generators/json-reporter.js +0 -0
- /package/{cli/dist → dist}/generators/test-generator.d.ts +0 -0
- /package/{cli/dist → dist}/generators/test-generator.js +0 -0
- /package/{cli/dist → dist}/index.d.ts +0 -0
- /package/{cli/dist → dist}/index.js +0 -0
- /package/{cli/dist → dist}/scanners/dom-scanner.d.ts +0 -0
- /package/{cli/dist → dist}/scanners/dom-scanner.js +0 -0
- /package/{cli/dist → dist}/scanners/index.d.ts +0 -0
- /package/{cli/dist → dist}/scanners/index.js +0 -0
- /package/{cli/dist → dist}/schemas/pack.schema.json +0 -0
- /package/{cli/dist → dist}/types/scan.d.ts +0 -0
- /package/{cli/dist → dist}/types/scan.js +0 -0
- /package/{cli/dist → dist}/utils/config.js +0 -0
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* COOP/COEP Handler
|
|
3
|
+
*
|
|
4
|
+
* P1 - Cross-Origin-Opener-Policy and Cross-Origin-Embedder-Policy management
|
|
5
|
+
*
|
|
6
|
+
* Supports:
|
|
7
|
+
* - COOP header parsing and validation
|
|
8
|
+
* - COEP header parsing and validation
|
|
9
|
+
* - Cross-origin isolation detection
|
|
10
|
+
* - SharedArrayBuffer availability check
|
|
11
|
+
* - High-resolution timers availability check
|
|
12
|
+
*
|
|
13
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Cross-Origin-Opener-Policy
|
|
14
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Cross-Origin-Embedder-Policy
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* COOP/COEP Handler class
|
|
18
|
+
*/
|
|
19
|
+
export class COOPCOEPHandler {
|
|
20
|
+
page;
|
|
21
|
+
constructor(page) {
|
|
22
|
+
this.page = page;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get COOP header from response
|
|
26
|
+
*/
|
|
27
|
+
async getCOOPHeader() {
|
|
28
|
+
const coopHeader = await this.page.evaluate(async () => {
|
|
29
|
+
// Check via fetch
|
|
30
|
+
try {
|
|
31
|
+
const response = await fetch(window.location.href, {
|
|
32
|
+
method: 'HEAD',
|
|
33
|
+
});
|
|
34
|
+
return response.headers.get('Cross-Origin-Opener-Policy');
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
if (coopHeader && this.isValidCOOP(coopHeader)) {
|
|
41
|
+
return coopHeader;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get COEP header from response
|
|
47
|
+
*/
|
|
48
|
+
async getCOEPHeader() {
|
|
49
|
+
const coepHeader = await this.page.evaluate(async () => {
|
|
50
|
+
// Check via fetch
|
|
51
|
+
try {
|
|
52
|
+
const response = await fetch(window.location.href, {
|
|
53
|
+
method: 'HEAD',
|
|
54
|
+
});
|
|
55
|
+
return response.headers.get('Cross-Origin-Embedder-Policy');
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
if (coepHeader && this.isValidCOEP(coepHeader)) {
|
|
62
|
+
return coepHeader;
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check if value is valid COOP
|
|
68
|
+
*/
|
|
69
|
+
isValidCOOP(value) {
|
|
70
|
+
return ['unsafe-none', 'same-origin', 'same-origin-allow-popups'].includes(value);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Check if value is valid COEP
|
|
74
|
+
*/
|
|
75
|
+
isValidCOEP(value) {
|
|
76
|
+
return ['unsafe-none', 'require-corp', 'credentialless'].includes(value);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Check cross-origin isolation status
|
|
80
|
+
*/
|
|
81
|
+
async getCrossOriginIsolationStatus() {
|
|
82
|
+
const [coopValue, coepValue, isIsolated] = await this.page.evaluate(async () => {
|
|
83
|
+
// Get headers via fetch
|
|
84
|
+
let coop = null;
|
|
85
|
+
let coep = null;
|
|
86
|
+
try {
|
|
87
|
+
const response = await fetch(window.location.href, { method: 'HEAD' });
|
|
88
|
+
coop = response.headers.get('Cross-Origin-Opener-Policy');
|
|
89
|
+
coep = response.headers.get('Cross-Origin-Embedder-Policy');
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Ignore
|
|
93
|
+
}
|
|
94
|
+
// Check cross-origin isolation
|
|
95
|
+
const isolated = crossOriginIsolated;
|
|
96
|
+
return { coop, coep, isolated };
|
|
97
|
+
});
|
|
98
|
+
// Check SharedArrayBuffer availability
|
|
99
|
+
const sharedArrayBufferAvailable = await this.page.evaluate(() => {
|
|
100
|
+
try {
|
|
101
|
+
return typeof SharedArrayBuffer !== 'undefined';
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
// Check high-resolution timers
|
|
108
|
+
const highResTimersAvailable = await this.page.evaluate(() => {
|
|
109
|
+
// Check if performance.now() has microsecond precision
|
|
110
|
+
const start = performance.now();
|
|
111
|
+
const end = performance.now();
|
|
112
|
+
return (end - start) < 0.01; // Should be very small
|
|
113
|
+
});
|
|
114
|
+
// Check memory measurement availability
|
|
115
|
+
const memoryMeasurementAvailable = await this.page.evaluate(() => {
|
|
116
|
+
try {
|
|
117
|
+
return typeof performance.measureUserAgentSpecificMemory === 'function';
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
// Calculate security score and recommendations
|
|
124
|
+
let score = 0;
|
|
125
|
+
const recommendations = [];
|
|
126
|
+
if (isIsolated) {
|
|
127
|
+
score += 50;
|
|
128
|
+
}
|
|
129
|
+
if (coopValue === 'same-origin' || coopValue === 'same-origin-allow-popups') {
|
|
130
|
+
score += 25;
|
|
131
|
+
}
|
|
132
|
+
else if (coopValue === 'unsafe-none') {
|
|
133
|
+
recommendations.push('Consider using Cross-Origin-Opener-Policy: same-origin for better isolation');
|
|
134
|
+
}
|
|
135
|
+
if (coepValue === 'require-corp' || coepValue === 'credentialless') {
|
|
136
|
+
score += 25;
|
|
137
|
+
}
|
|
138
|
+
else if (coepValue === 'unsafe-none') {
|
|
139
|
+
recommendations.push('Consider using Cross-Origin-Embedder-Policy: require-corp for cross-origin isolation');
|
|
140
|
+
}
|
|
141
|
+
if (!isIsolated && (coopValue === 'same-origin' || coepValue === 'require-corp' || coepValue === 'credentialless')) {
|
|
142
|
+
recommendations.push('Both COOP and COEP must be set to achieve cross-origin isolation');
|
|
143
|
+
}
|
|
144
|
+
if (!sharedArrayBufferAvailable && isIsolated) {
|
|
145
|
+
recommendations.push('SharedArrayBuffer should be available in cross-origin isolation');
|
|
146
|
+
}
|
|
147
|
+
if (!recommendations.length && score === 100) {
|
|
148
|
+
recommendations.push('COOP/COEP properly configured for cross-origin isolation');
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
isIsolated,
|
|
152
|
+
hasCOOP: coopValue !== null,
|
|
153
|
+
coopValue,
|
|
154
|
+
hasCOEP: coepValue !== null,
|
|
155
|
+
coepValue,
|
|
156
|
+
sharedArrayBufferAvailable,
|
|
157
|
+
highResTimersAvailable,
|
|
158
|
+
memoryMeasurementAvailable,
|
|
159
|
+
securityScore: score,
|
|
160
|
+
recommendations,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Check if SharedArrayBuffer is usable
|
|
165
|
+
*/
|
|
166
|
+
async canUseSharedArrayBuffer() {
|
|
167
|
+
return await this.page.evaluate(() => {
|
|
168
|
+
try {
|
|
169
|
+
// Check if cross-origin isolated
|
|
170
|
+
if (!crossOriginIsolated) {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
// Check if SharedArrayBuffer is available
|
|
174
|
+
const sab = new SharedArrayBuffer(1024);
|
|
175
|
+
return sab.byteLength === 1024;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Check if high-resolution timers are available
|
|
184
|
+
*/
|
|
185
|
+
async hasHighResolutionTimers() {
|
|
186
|
+
return await this.page.evaluate(() => {
|
|
187
|
+
// In cross-origin isolation, performance.now() should have better precision
|
|
188
|
+
const start = performance.now();
|
|
189
|
+
const end = performance.now();
|
|
190
|
+
return (end - start) < 0.01;
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Check if memory measurement is available
|
|
195
|
+
*/
|
|
196
|
+
async canMeasureMemory() {
|
|
197
|
+
return await this.page.evaluate(() => {
|
|
198
|
+
try {
|
|
199
|
+
return typeof performance.measureUserAgentSpecificMemory === 'function';
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Measure memory usage (if available)
|
|
208
|
+
*/
|
|
209
|
+
async measureMemory() {
|
|
210
|
+
if (!(await this.canMeasureMemory())) {
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
return await this.page.evaluate(async () => {
|
|
215
|
+
const perf = performance;
|
|
216
|
+
if (typeof perf.measureUserAgentSpecificMemory === 'function') {
|
|
217
|
+
return await perf.measureUserAgentSpecificMemory();
|
|
218
|
+
}
|
|
219
|
+
return null;
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Test COOP behavior with window.open()
|
|
228
|
+
*/
|
|
229
|
+
async testCOOPBehavior() {
|
|
230
|
+
return await this.page.evaluate(async () => {
|
|
231
|
+
// Open a new window
|
|
232
|
+
const opened = window.open('about:blank');
|
|
233
|
+
if (!opened) {
|
|
234
|
+
return { canAccessOpener: false, openerAccessible: false };
|
|
235
|
+
}
|
|
236
|
+
// Check if we can access the opened window
|
|
237
|
+
const canAccess = (() => {
|
|
238
|
+
try {
|
|
239
|
+
return !!opened.closed;
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
})();
|
|
245
|
+
// Check if opener can access us (would need to check from opened window)
|
|
246
|
+
const openerAccessible = (() => {
|
|
247
|
+
try {
|
|
248
|
+
return window.opener !== null;
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
})();
|
|
254
|
+
// Close the opened window
|
|
255
|
+
if (canAccess) {
|
|
256
|
+
opened.close();
|
|
257
|
+
}
|
|
258
|
+
return { canAccessOpener: canAccess, openerAccessible };
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Get COOP/COEP recommendations based on use case
|
|
263
|
+
*/
|
|
264
|
+
getRecommendations(useCase) {
|
|
265
|
+
switch (useCase) {
|
|
266
|
+
case 'sharedarraybuffer':
|
|
267
|
+
return {
|
|
268
|
+
coop: 'same-origin',
|
|
269
|
+
coep: 'require-corp',
|
|
270
|
+
reason: 'Required for SharedArrayBuffer and high-resolution timers',
|
|
271
|
+
};
|
|
272
|
+
case 'high-performance':
|
|
273
|
+
return {
|
|
274
|
+
coop: 'same-origin',
|
|
275
|
+
coep: 'credentialless',
|
|
276
|
+
reason: 'Enables cross-origin isolation with less restrictive COEP for better performance',
|
|
277
|
+
};
|
|
278
|
+
case 'security':
|
|
279
|
+
return {
|
|
280
|
+
coop: 'same-origin',
|
|
281
|
+
coep: 'require-corp',
|
|
282
|
+
reason: 'Maximum security isolation, prevents cross-origin access',
|
|
283
|
+
};
|
|
284
|
+
default:
|
|
285
|
+
return {
|
|
286
|
+
coop: 'unsafe-none',
|
|
287
|
+
coep: 'unsafe-none',
|
|
288
|
+
reason: 'Default browser behavior, no special isolation',
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Validate COOP/COEP configuration
|
|
294
|
+
*/
|
|
295
|
+
async validateConfiguration() {
|
|
296
|
+
const status = await this.getCrossOriginIsolationStatus();
|
|
297
|
+
const errors = [];
|
|
298
|
+
const warnings = [];
|
|
299
|
+
// Check for mismatched COOP/COEP
|
|
300
|
+
if (status.hasCOOP && !status.hasCOEP) {
|
|
301
|
+
warnings.push('COOP header present without COEP - partial isolation');
|
|
302
|
+
}
|
|
303
|
+
if (status.hasCOEP && !status.hasCOOP) {
|
|
304
|
+
warnings.push('COEP header present without COOP - partial isolation');
|
|
305
|
+
}
|
|
306
|
+
// Check if isolation was intended but not achieved
|
|
307
|
+
if (status.coopValue === 'same-origin' && !status.isIsolated) {
|
|
308
|
+
errors.push('COOP set to same-origin but cross-origin isolation not achieved');
|
|
309
|
+
}
|
|
310
|
+
if (status.coepValue === 'require-corp' && !status.isIsolated) {
|
|
311
|
+
errors.push('COEP set to require-corp but cross-origin isolation not achieved');
|
|
312
|
+
}
|
|
313
|
+
// Check SharedArrayBuffer availability
|
|
314
|
+
if (status.coopValue === 'same-origin' &&
|
|
315
|
+
(status.coepValue === 'require-corp' || status.coepValue === 'credentialless') &&
|
|
316
|
+
!status.sharedArrayBufferAvailable) {
|
|
317
|
+
errors.push('SharedArrayBuffer not available despite COOP/COEP configuration');
|
|
318
|
+
}
|
|
319
|
+
return {
|
|
320
|
+
valid: errors.length === 0,
|
|
321
|
+
errors,
|
|
322
|
+
warnings,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Get COOP/COEP documentation link
|
|
327
|
+
*/
|
|
328
|
+
getDocumentation() {
|
|
329
|
+
return 'https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Opener-Policy';
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Factory function to create COOP/COEP Handler
|
|
334
|
+
*/
|
|
335
|
+
export function createCOOPCOEPHandler(page) {
|
|
336
|
+
return new COOPCOEPHandler(page);
|
|
337
|
+
}
|
|
338
|
+
export default COOPCOEPHandler;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSP Handler
|
|
3
|
+
*
|
|
4
|
+
* P1 - Content Security Policy management
|
|
5
|
+
*
|
|
6
|
+
* Supports:
|
|
7
|
+
* - CSP header parsing and validation
|
|
8
|
+
* - CSP directive analysis
|
|
9
|
+
* - CSP violation detection
|
|
10
|
+
* - CSP report-only mode
|
|
11
|
+
* - CSP nonce and hash validation
|
|
12
|
+
*
|
|
13
|
+
* @see https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
|
|
14
|
+
*/
|
|
15
|
+
export interface CSPDirective {
|
|
16
|
+
/** Directive name (e.g., 'script-src', 'img-src') */
|
|
17
|
+
name: string;
|
|
18
|
+
/** Directive values (sources) */
|
|
19
|
+
values: string[];
|
|
20
|
+
/** Whether 'unsafe-inline' is allowed */
|
|
21
|
+
allowsUnsafeInline: boolean;
|
|
22
|
+
/** Whether 'unsafe-eval' is allowed */
|
|
23
|
+
allowsUnsafeEval: boolean;
|
|
24
|
+
/** Whether 'self' is in sources */
|
|
25
|
+
allowsSelf: boolean;
|
|
26
|
+
/** Whether '*' is in sources (wildcard) */
|
|
27
|
+
allowsWildcard: boolean;
|
|
28
|
+
/** Nonce value if present */
|
|
29
|
+
nonce?: string;
|
|
30
|
+
/** Hash values if present */
|
|
31
|
+
hashes: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface CPSPolicy {
|
|
34
|
+
/** Full CSP header value */
|
|
35
|
+
raw: string;
|
|
36
|
+
/** Parsed directives */
|
|
37
|
+
directives: Map<string, CSPDirective>;
|
|
38
|
+
/** Whether report-only mode */
|
|
39
|
+
reportOnly: boolean;
|
|
40
|
+
/** Report-to endpoint */
|
|
41
|
+
reportEndpoint?: string;
|
|
42
|
+
/** Report URI endpoint */
|
|
43
|
+
reportUri?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface CSPValidationResult {
|
|
46
|
+
/** CSP policy is present */
|
|
47
|
+
hasCSP: boolean;
|
|
48
|
+
/** Policy object */
|
|
49
|
+
policy?: CPSPolicy;
|
|
50
|
+
/** Security score (0-100) */
|
|
51
|
+
securityScore: number;
|
|
52
|
+
/** Security issues found */
|
|
53
|
+
issues: string[];
|
|
54
|
+
/** Warnings (not critical but suboptimal) */
|
|
55
|
+
warnings: string[];
|
|
56
|
+
/** Recommendations */
|
|
57
|
+
recommendations: string[];
|
|
58
|
+
}
|
|
59
|
+
export interface CSPViolation {
|
|
60
|
+
/** Violated directive */
|
|
61
|
+
directive: string;
|
|
62
|
+
/** Blocked resource */
|
|
63
|
+
blockedURI?: string;
|
|
64
|
+
/** Original policy */
|
|
65
|
+
policy?: string;
|
|
66
|
+
/** Source of violation */
|
|
67
|
+
sourceFile?: string;
|
|
68
|
+
/** Line number */
|
|
69
|
+
lineNumber?: number;
|
|
70
|
+
/** Column number */
|
|
71
|
+
columnNumber?: number;
|
|
72
|
+
/** Violation timestamp */
|
|
73
|
+
timestamp: number;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* CSP Handler class
|
|
77
|
+
*/
|
|
78
|
+
export declare class CSPHandler {
|
|
79
|
+
private page;
|
|
80
|
+
private violations;
|
|
81
|
+
constructor(page: any);
|
|
82
|
+
/**
|
|
83
|
+
* Get CSP header from response
|
|
84
|
+
*/
|
|
85
|
+
getCSPHeader(): Promise<string | null>;
|
|
86
|
+
/**
|
|
87
|
+
* Parse CSP header value
|
|
88
|
+
*/
|
|
89
|
+
parseCSP(cspValue: string, reportOnly?: boolean): CPSPolicy;
|
|
90
|
+
/**
|
|
91
|
+
* Get CSP policy from page
|
|
92
|
+
*/
|
|
93
|
+
getCSPPolicy(): Promise<CPSPolicy | null>;
|
|
94
|
+
/**
|
|
95
|
+
* Validate CSP policy
|
|
96
|
+
*/
|
|
97
|
+
validateCSP(): Promise<CSPValidationResult>;
|
|
98
|
+
/**
|
|
99
|
+
* Get directive by name
|
|
100
|
+
*/
|
|
101
|
+
getDirective(directiveName: string): Promise<CSPDirective | null>;
|
|
102
|
+
/**
|
|
103
|
+
* Check if a resource would be allowed by CSP
|
|
104
|
+
*/
|
|
105
|
+
checkResourceAllowed(resourceType: string, url: string): Promise<boolean>;
|
|
106
|
+
/**
|
|
107
|
+
* Setup CSP violation monitoring
|
|
108
|
+
*/
|
|
109
|
+
setupViolationMonitoring(): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Get collected violations
|
|
112
|
+
*/
|
|
113
|
+
getViolations(): CSPViolation[];
|
|
114
|
+
/**
|
|
115
|
+
* Clear violations
|
|
116
|
+
*/
|
|
117
|
+
clearViolations(): void;
|
|
118
|
+
/**
|
|
119
|
+
* Generate a nonce value for inline scripts
|
|
120
|
+
*/
|
|
121
|
+
generateNonce(): string;
|
|
122
|
+
/**
|
|
123
|
+
* Inject nonce into inline scripts
|
|
124
|
+
*/
|
|
125
|
+
injectNonces(): Promise<Map<string, string>>;
|
|
126
|
+
/**
|
|
127
|
+
* Get all CSP-related meta tags
|
|
128
|
+
*/
|
|
129
|
+
getMetaTags(): Promise<Array<{
|
|
130
|
+
httpEquiv: string;
|
|
131
|
+
content: string;
|
|
132
|
+
}>>;
|
|
133
|
+
/**
|
|
134
|
+
* Check for common CSP bypass patterns
|
|
135
|
+
*/
|
|
136
|
+
checkBypassPatterns(): Promise<string[]>;
|
|
137
|
+
/**
|
|
138
|
+
* Compare two CSP policies
|
|
139
|
+
*/
|
|
140
|
+
comparePolicies(policy1: CPSPolicy, policy2: CPSPolicy): {
|
|
141
|
+
stricter: string[];
|
|
142
|
+
looser: string[];
|
|
143
|
+
onlyIn1: string[];
|
|
144
|
+
onlyIn2: string[];
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Factory function to create CSP Handler
|
|
149
|
+
*/
|
|
150
|
+
export declare function createCSPHandler(page: any): CSPHandler;
|
|
151
|
+
export default CSPHandler;
|