devharness 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +185 -0
- package/build/atomic-write.d.ts +28 -0
- package/build/atomic-write.d.ts.map +1 -0
- package/build/atomic-write.js +126 -0
- package/build/atomic-write.js.map +1 -0
- package/build/cdp-manager.d.ts +524 -0
- package/build/cdp-manager.d.ts.map +1 -0
- package/build/cdp-manager.js +1828 -0
- package/build/cdp-manager.js.map +1 -0
- package/build/cdp-manager.test.d.ts +6 -0
- package/build/cdp-manager.test.d.ts.map +1 -0
- package/build/cdp-manager.test.js +546 -0
- package/build/cdp-manager.test.js.map +1 -0
- package/build/chrome-launcher.d.ts +400 -0
- package/build/chrome-launcher.d.ts.map +1 -0
- package/build/chrome-launcher.js +1071 -0
- package/build/chrome-launcher.js.map +1 -0
- package/build/chrome-launcher.test.d.ts +11 -0
- package/build/chrome-launcher.test.d.ts.map +1 -0
- package/build/chrome-launcher.test.js +204 -0
- package/build/chrome-launcher.test.js.map +1 -0
- package/build/clickable-cache.d.ts +73 -0
- package/build/clickable-cache.d.ts.map +1 -0
- package/build/clickable-cache.js +90 -0
- package/build/clickable-cache.js.map +1 -0
- package/build/command-recorder.d.ts +401 -0
- package/build/command-recorder.d.ts.map +1 -0
- package/build/command-recorder.js +701 -0
- package/build/command-recorder.js.map +1 -0
- package/build/config.d.ts +390 -0
- package/build/config.d.ts.map +1 -0
- package/build/config.js +826 -0
- package/build/config.js.map +1 -0
- package/build/config.test.d.ts +2 -0
- package/build/config.test.d.ts.map +1 -0
- package/build/config.test.js +112 -0
- package/build/config.test.js.map +1 -0
- package/build/connection-manager.d.ts +159 -0
- package/build/connection-manager.d.ts.map +1 -0
- package/build/connection-manager.js +432 -0
- package/build/connection-manager.js.map +1 -0
- package/build/connection-manager.test.d.ts +11 -0
- package/build/connection-manager.test.d.ts.map +1 -0
- package/build/connection-manager.test.js +114 -0
- package/build/connection-manager.test.js.map +1 -0
- package/build/console-monitor.d.ts +150 -0
- package/build/console-monitor.d.ts.map +1 -0
- package/build/console-monitor.js +454 -0
- package/build/console-monitor.js.map +1 -0
- package/build/dashboard/bundle.js +1 -0
- package/build/dashboard/dashboard-client.d.ts +42 -0
- package/build/dashboard/dashboard-client.d.ts.map +1 -0
- package/build/dashboard/dashboard-client.js +184 -0
- package/build/dashboard/dashboard-client.js.map +1 -0
- package/build/dashboard/dashboard-hub.d.ts +50 -0
- package/build/dashboard/dashboard-hub.d.ts.map +1 -0
- package/build/dashboard/dashboard-hub.js +654 -0
- package/build/dashboard/dashboard-hub.js.map +1 -0
- package/build/dashboard/hub-lock.d.ts +16 -0
- package/build/dashboard/hub-lock.d.ts.map +1 -0
- package/build/dashboard/hub-lock.js +77 -0
- package/build/dashboard/hub-lock.js.map +1 -0
- package/build/dashboard/index.d.ts +25 -0
- package/build/dashboard/index.d.ts.map +1 -0
- package/build/dashboard/index.js +77 -0
- package/build/dashboard/index.js.map +1 -0
- package/build/dashboard/types.d.ts +83 -0
- package/build/dashboard/types.d.ts.map +1 -0
- package/build/dashboard/types.js +6 -0
- package/build/dashboard/types.js.map +1 -0
- package/build/debug-logger.d.ts +85 -0
- package/build/debug-logger.d.ts.map +1 -0
- package/build/debug-logger.js +195 -0
- package/build/debug-logger.js.map +1 -0
- package/build/debugger-aware-wrapper.d.ts +37 -0
- package/build/debugger-aware-wrapper.d.ts.map +1 -0
- package/build/debugger-aware-wrapper.js +128 -0
- package/build/debugger-aware-wrapper.js.map +1 -0
- package/build/dom-change-monitor.d.ts +92 -0
- package/build/dom-change-monitor.d.ts.map +1 -0
- package/build/dom-change-monitor.js +437 -0
- package/build/dom-change-monitor.js.map +1 -0
- package/build/element-collector.d.ts +16 -0
- package/build/element-collector.d.ts.map +1 -0
- package/build/element-collector.js +207 -0
- package/build/element-collector.js.map +1 -0
- package/build/error-helpers.d.ts +43 -0
- package/build/error-helpers.d.ts.map +1 -0
- package/build/error-helpers.js +143 -0
- package/build/error-helpers.js.map +1 -0
- package/build/formatters/console-formatter.d.ts +160 -0
- package/build/formatters/console-formatter.d.ts.map +1 -0
- package/build/formatters/console-formatter.js +338 -0
- package/build/formatters/console-formatter.js.map +1 -0
- package/build/helpers/parser-plugins.d.ts +44 -0
- package/build/helpers/parser-plugins.d.ts.map +1 -0
- package/build/helpers/parser-plugins.js +102 -0
- package/build/helpers/parser-plugins.js.map +1 -0
- package/build/helpers/paths.d.ts +79 -0
- package/build/helpers/paths.d.ts.map +1 -0
- package/build/helpers/paths.js +168 -0
- package/build/helpers/paths.js.map +1 -0
- package/build/helpers/process-liveness.d.ts +24 -0
- package/build/helpers/process-liveness.d.ts.map +1 -0
- package/build/helpers/process-liveness.js +36 -0
- package/build/helpers/process-liveness.js.map +1 -0
- package/build/helpers/process-liveness.test.d.ts +2 -0
- package/build/helpers/process-liveness.test.d.ts.map +1 -0
- package/build/helpers/process-liveness.test.js +40 -0
- package/build/helpers/process-liveness.test.js.map +1 -0
- package/build/helpers/sequence-tree.d.ts +27 -0
- package/build/helpers/sequence-tree.d.ts.map +1 -0
- package/build/helpers/sequence-tree.js +80 -0
- package/build/helpers/sequence-tree.js.map +1 -0
- package/build/helpers/sequence-tree.test.d.ts +2 -0
- package/build/helpers/sequence-tree.test.d.ts.map +1 -0
- package/build/helpers/sequence-tree.test.js +122 -0
- package/build/helpers/sequence-tree.test.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +2007 -0
- package/build/index.js.map +1 -0
- package/build/interaction-recorder.d.ts +214 -0
- package/build/interaction-recorder.d.ts.map +1 -0
- package/build/interaction-recorder.js +2007 -0
- package/build/interaction-recorder.js.map +1 -0
- package/build/issue-tracker.d.ts +107 -0
- package/build/issue-tracker.d.ts.map +1 -0
- package/build/issue-tracker.js +582 -0
- package/build/issue-tracker.js.map +1 -0
- package/build/issue-tracker.test.d.ts +2 -0
- package/build/issue-tracker.test.d.ts.map +1 -0
- package/build/issue-tracker.test.js +88 -0
- package/build/issue-tracker.test.js.map +1 -0
- package/build/launch-chrome-port.test.d.ts +14 -0
- package/build/launch-chrome-port.test.d.ts.map +1 -0
- package/build/launch-chrome-port.test.js +97 -0
- package/build/launch-chrome-port.test.js.map +1 -0
- package/build/log-processor/orchestrator.d.ts +32 -0
- package/build/log-processor/orchestrator.d.ts.map +1 -0
- package/build/log-processor/orchestrator.js +27 -0
- package/build/log-processor/orchestrator.js.map +1 -0
- package/build/logpoint-execution-tracker.d.ts +57 -0
- package/build/logpoint-execution-tracker.d.ts.map +1 -0
- package/build/logpoint-execution-tracker.js +112 -0
- package/build/logpoint-execution-tracker.js.map +1 -0
- package/build/mcp-supervisor.d.ts +3 -0
- package/build/mcp-supervisor.d.ts.map +1 -0
- package/build/mcp-supervisor.js +211 -0
- package/build/mcp-supervisor.js.map +1 -0
- package/build/messages.d.ts +165 -0
- package/build/messages.d.ts.map +1 -0
- package/build/messages.js +574 -0
- package/build/messages.js.map +1 -0
- package/build/network-monitor.d.ts +172 -0
- package/build/network-monitor.d.ts.map +1 -0
- package/build/network-monitor.js +350 -0
- package/build/network-monitor.js.map +1 -0
- package/build/overlays.d.ts +49 -0
- package/build/overlays.d.ts.map +1 -0
- package/build/overlays.js +409 -0
- package/build/overlays.js.map +1 -0
- package/build/persistent-profiles.test.d.ts +15 -0
- package/build/persistent-profiles.test.d.ts.map +1 -0
- package/build/persistent-profiles.test.js +470 -0
- package/build/persistent-profiles.test.js.map +1 -0
- package/build/port-reserver.d.ts +32 -0
- package/build/port-reserver.d.ts.map +1 -0
- package/build/port-reserver.js +118 -0
- package/build/port-reserver.js.map +1 -0
- package/build/puppeteer-manager.d.ts +47 -0
- package/build/puppeteer-manager.d.ts.map +1 -0
- package/build/puppeteer-manager.js +116 -0
- package/build/puppeteer-manager.js.map +1 -0
- package/build/recording-coverage.test.d.ts +12 -0
- package/build/recording-coverage.test.d.ts.map +1 -0
- package/build/recording-coverage.test.js +72 -0
- package/build/recording-coverage.test.js.map +1 -0
- package/build/reference-validator.d.ts +47 -0
- package/build/reference-validator.d.ts.map +1 -0
- package/build/reference-validator.js +86 -0
- package/build/reference-validator.js.map +1 -0
- package/build/reference-validator.test.d.ts +5 -0
- package/build/reference-validator.test.d.ts.map +1 -0
- package/build/reference-validator.test.js +243 -0
- package/build/reference-validator.test.js.map +1 -0
- package/build/replay-cursor.d.ts +27 -0
- package/build/replay-cursor.d.ts.map +1 -0
- package/build/replay-cursor.js +240 -0
- package/build/replay-cursor.js.map +1 -0
- package/build/runners/docker-compose-runner.d.ts +69 -0
- package/build/runners/docker-compose-runner.d.ts.map +1 -0
- package/build/runners/docker-compose-runner.js +438 -0
- package/build/runners/docker-compose-runner.js.map +1 -0
- package/build/runners/docker-runner.d.ts +65 -0
- package/build/runners/docker-runner.d.ts.map +1 -0
- package/build/runners/docker-runner.js +414 -0
- package/build/runners/docker-runner.js.map +1 -0
- package/build/runners/index.d.ts +19 -0
- package/build/runners/index.d.ts.map +1 -0
- package/build/runners/index.js +35 -0
- package/build/runners/index.js.map +1 -0
- package/build/runners/native-runner.d.ts +95 -0
- package/build/runners/native-runner.d.ts.map +1 -0
- package/build/runners/native-runner.js +370 -0
- package/build/runners/native-runner.js.map +1 -0
- package/build/runners/types.d.ts +147 -0
- package/build/runners/types.d.ts.map +1 -0
- package/build/runners/types.js +25 -0
- package/build/runners/types.js.map +1 -0
- package/build/self-restart.d.ts +12 -0
- package/build/self-restart.d.ts.map +1 -0
- package/build/self-restart.js +41 -0
- package/build/self-restart.js.map +1 -0
- package/build/self-restart.test.d.ts +2 -0
- package/build/self-restart.test.d.ts.map +1 -0
- package/build/self-restart.test.js +34 -0
- package/build/self-restart.test.js.map +1 -0
- package/build/server-claims.d.ts +161 -0
- package/build/server-claims.d.ts.map +1 -0
- package/build/server-claims.js +382 -0
- package/build/server-claims.js.map +1 -0
- package/build/server-claims.test.d.ts +2 -0
- package/build/server-claims.test.d.ts.map +1 -0
- package/build/server-claims.test.js +197 -0
- package/build/server-claims.test.js.map +1 -0
- package/build/server-manager.d.ts +438 -0
- package/build/server-manager.d.ts.map +1 -0
- package/build/server-manager.js +1674 -0
- package/build/server-manager.js.map +1 -0
- package/build/server-manager.test.d.ts +17 -0
- package/build/server-manager.test.d.ts.map +1 -0
- package/build/server-manager.test.js +122 -0
- package/build/server-manager.test.js.map +1 -0
- package/build/server-ownership.test.d.ts +2 -0
- package/build/server-ownership.test.d.ts.map +1 -0
- package/build/server-ownership.test.js +238 -0
- package/build/server-ownership.test.js.map +1 -0
- package/build/server-watcher.d.ts +21 -0
- package/build/server-watcher.d.ts.map +1 -0
- package/build/server-watcher.js +105 -0
- package/build/server-watcher.js.map +1 -0
- package/build/session-detector.d.ts +47 -0
- package/build/session-detector.d.ts.map +1 -0
- package/build/session-detector.js +229 -0
- package/build/session-detector.js.map +1 -0
- package/build/session-detector.test.d.ts +9 -0
- package/build/session-detector.test.d.ts.map +1 -0
- package/build/session-detector.test.js +45 -0
- package/build/session-detector.test.js.map +1 -0
- package/build/sourcemap-handler.d.ts +114 -0
- package/build/sourcemap-handler.d.ts.map +1 -0
- package/build/sourcemap-handler.js +479 -0
- package/build/sourcemap-handler.js.map +1 -0
- package/build/supervisor/child-manager.d.ts +43 -0
- package/build/supervisor/child-manager.d.ts.map +1 -0
- package/build/supervisor/child-manager.js +148 -0
- package/build/supervisor/child-manager.js.map +1 -0
- package/build/supervisor/child-manager.test.d.ts +2 -0
- package/build/supervisor/child-manager.test.d.ts.map +1 -0
- package/build/supervisor/child-manager.test.js +107 -0
- package/build/supervisor/child-manager.test.js.map +1 -0
- package/build/supervisor/client-watcher.d.ts +48 -0
- package/build/supervisor/client-watcher.d.ts.map +1 -0
- package/build/supervisor/client-watcher.js +186 -0
- package/build/supervisor/client-watcher.js.map +1 -0
- package/build/supervisor/client-watcher.test.d.ts +2 -0
- package/build/supervisor/client-watcher.test.d.ts.map +1 -0
- package/build/supervisor/client-watcher.test.js +121 -0
- package/build/supervisor/client-watcher.test.js.map +1 -0
- package/build/supervisor/idle-config.d.ts +30 -0
- package/build/supervisor/idle-config.d.ts.map +1 -0
- package/build/supervisor/idle-config.js +76 -0
- package/build/supervisor/idle-config.js.map +1 -0
- package/build/supervisor/idle-config.test.d.ts +2 -0
- package/build/supervisor/idle-config.test.d.ts.map +1 -0
- package/build/supervisor/idle-config.test.js +119 -0
- package/build/supervisor/idle-config.test.js.map +1 -0
- package/build/supervisor/ndjson-reader.d.ts +47 -0
- package/build/supervisor/ndjson-reader.d.ts.map +1 -0
- package/build/supervisor/ndjson-reader.js +75 -0
- package/build/supervisor/ndjson-reader.js.map +1 -0
- package/build/supervisor/ndjson-reader.test.d.ts +2 -0
- package/build/supervisor/ndjson-reader.test.d.ts.map +1 -0
- package/build/supervisor/ndjson-reader.test.js +92 -0
- package/build/supervisor/ndjson-reader.test.js.map +1 -0
- package/build/supervisor/pidfile.d.ts +11 -0
- package/build/supervisor/pidfile.d.ts.map +1 -0
- package/build/supervisor/pidfile.js +29 -0
- package/build/supervisor/pidfile.js.map +1 -0
- package/build/supervisor/pidfile.test.d.ts +8 -0
- package/build/supervisor/pidfile.test.d.ts.map +1 -0
- package/build/supervisor/pidfile.test.js +46 -0
- package/build/supervisor/pidfile.test.js.map +1 -0
- package/build/supervisor/restart-coordinator.d.ts +73 -0
- package/build/supervisor/restart-coordinator.d.ts.map +1 -0
- package/build/supervisor/restart-coordinator.js +300 -0
- package/build/supervisor/restart-coordinator.js.map +1 -0
- package/build/supervisor/restart-coordinator.test.d.ts +2 -0
- package/build/supervisor/restart-coordinator.test.d.ts.map +1 -0
- package/build/supervisor/restart-coordinator.test.js +434 -0
- package/build/supervisor/restart-coordinator.test.js.map +1 -0
- package/build/test-support/fake-execute-tool-call.d.ts +11 -0
- package/build/test-support/fake-execute-tool-call.d.ts.map +1 -0
- package/build/test-support/fake-execute-tool-call.js +19 -0
- package/build/test-support/fake-execute-tool-call.js.map +1 -0
- package/build/tool-error.d.ts +14 -0
- package/build/tool-error.d.ts.map +1 -0
- package/build/tool-error.js +18 -0
- package/build/tool-error.js.map +1 -0
- package/build/tool-response.d.ts +293 -0
- package/build/tool-response.d.ts.map +1 -0
- package/build/tool-response.js +365 -0
- package/build/tool-response.js.map +1 -0
- package/build/tools/assert-tools.d.ts +62 -0
- package/build/tools/assert-tools.d.ts.map +1 -0
- package/build/tools/assert-tools.js +330 -0
- package/build/tools/assert-tools.js.map +1 -0
- package/build/tools/breakpoint-await-abort.test.d.ts +2 -0
- package/build/tools/breakpoint-await-abort.test.d.ts.map +1 -0
- package/build/tools/breakpoint-await-abort.test.js +124 -0
- package/build/tools/breakpoint-await-abort.test.js.map +1 -0
- package/build/tools/breakpoint-tools.d.ts +99 -0
- package/build/tools/breakpoint-tools.d.ts.map +1 -0
- package/build/tools/breakpoint-tools.js +1197 -0
- package/build/tools/breakpoint-tools.js.map +1 -0
- package/build/tools/config-tools.d.ts +58 -0
- package/build/tools/config-tools.d.ts.map +1 -0
- package/build/tools/config-tools.js +180 -0
- package/build/tools/config-tools.js.map +1 -0
- package/build/tools/connection-routing.test.d.ts +12 -0
- package/build/tools/connection-routing.test.d.ts.map +1 -0
- package/build/tools/connection-routing.test.js +206 -0
- package/build/tools/connection-routing.test.js.map +1 -0
- package/build/tools/console-tools.d.ts +84 -0
- package/build/tools/console-tools.d.ts.map +1 -0
- package/build/tools/console-tools.js +241 -0
- package/build/tools/console-tools.js.map +1 -0
- package/build/tools/content-tools.d.ts +74 -0
- package/build/tools/content-tools.d.ts.map +1 -0
- package/build/tools/content-tools.js +582 -0
- package/build/tools/content-tools.js.map +1 -0
- package/build/tools/dashboard-tools.d.ts +38 -0
- package/build/tools/dashboard-tools.d.ts.map +1 -0
- package/build/tools/dashboard-tools.js +123 -0
- package/build/tools/dashboard-tools.js.map +1 -0
- package/build/tools/dom-tools.d.ts +41 -0
- package/build/tools/dom-tools.d.ts.map +1 -0
- package/build/tools/dom-tools.js +277 -0
- package/build/tools/dom-tools.js.map +1 -0
- package/build/tools/download-tools.d.ts +55 -0
- package/build/tools/download-tools.d.ts.map +1 -0
- package/build/tools/download-tools.js +280 -0
- package/build/tools/download-tools.js.map +1 -0
- package/build/tools/execution-tools.d.ts +40 -0
- package/build/tools/execution-tools.d.ts.map +1 -0
- package/build/tools/execution-tools.js +121 -0
- package/build/tools/execution-tools.js.map +1 -0
- package/build/tools/input-abort.test.d.ts +2 -0
- package/build/tools/input-abort.test.d.ts.map +1 -0
- package/build/tools/input-abort.test.js +227 -0
- package/build/tools/input-abort.test.js.map +1 -0
- package/build/tools/input-ambiguous-selector.test.d.ts +2 -0
- package/build/tools/input-ambiguous-selector.test.d.ts.map +1 -0
- package/build/tools/input-ambiguous-selector.test.js +34 -0
- package/build/tools/input-ambiguous-selector.test.js.map +1 -0
- package/build/tools/input-tools.d.ts +168 -0
- package/build/tools/input-tools.d.ts.map +1 -0
- package/build/tools/input-tools.js +1397 -0
- package/build/tools/input-tools.js.map +1 -0
- package/build/tools/inspection-tools.d.ts +112 -0
- package/build/tools/inspection-tools.d.ts.map +1 -0
- package/build/tools/inspection-tools.js +637 -0
- package/build/tools/inspection-tools.js.map +1 -0
- package/build/tools/interpolation.d.ts +30 -0
- package/build/tools/interpolation.d.ts.map +1 -0
- package/build/tools/interpolation.js +143 -0
- package/build/tools/interpolation.js.map +1 -0
- package/build/tools/issues-abort-hygiene.test.d.ts +2 -0
- package/build/tools/issues-abort-hygiene.test.d.ts.map +1 -0
- package/build/tools/issues-abort-hygiene.test.js +79 -0
- package/build/tools/issues-abort-hygiene.test.js.map +1 -0
- package/build/tools/issues-tools.d.ts +98 -0
- package/build/tools/issues-tools.d.ts.map +1 -0
- package/build/tools/issues-tools.js +821 -0
- package/build/tools/issues-tools.js.map +1 -0
- package/build/tools/issues-tools.test.d.ts +8 -0
- package/build/tools/issues-tools.test.d.ts.map +1 -0
- package/build/tools/issues-tools.test.js +184 -0
- package/build/tools/issues-tools.test.js.map +1 -0
- package/build/tools/modal-tools.d.ts +73 -0
- package/build/tools/modal-tools.d.ts.map +1 -0
- package/build/tools/modal-tools.js +161 -0
- package/build/tools/modal-tools.js.map +1 -0
- package/build/tools/network-tools.d.ts +72 -0
- package/build/tools/network-tools.d.ts.map +1 -0
- package/build/tools/network-tools.js +432 -0
- package/build/tools/network-tools.js.map +1 -0
- package/build/tools/page-tools.d.ts +78 -0
- package/build/tools/page-tools.d.ts.map +1 -0
- package/build/tools/page-tools.js +255 -0
- package/build/tools/page-tools.js.map +1 -0
- package/build/tools/plugin-tools.d.ts +16 -0
- package/build/tools/plugin-tools.d.ts.map +1 -0
- package/build/tools/plugin-tools.js +17 -0
- package/build/tools/plugin-tools.js.map +1 -0
- package/build/tools/replay-abort.test.d.ts +2 -0
- package/build/tools/replay-abort.test.d.ts.map +1 -0
- package/build/tools/replay-abort.test.js +259 -0
- package/build/tools/replay-abort.test.js.map +1 -0
- package/build/tools/replay-add-conditional.test.d.ts +2 -0
- package/build/tools/replay-add-conditional.test.d.ts.map +1 -0
- package/build/tools/replay-add-conditional.test.js +205 -0
- package/build/tools/replay-add-conditional.test.js.map +1 -0
- package/build/tools/replay-background-run.test.d.ts +2 -0
- package/build/tools/replay-background-run.test.d.ts.map +1 -0
- package/build/tools/replay-background-run.test.js +176 -0
- package/build/tools/replay-background-run.test.js.map +1 -0
- package/build/tools/replay-capture-variables.test.d.ts +2 -0
- package/build/tools/replay-capture-variables.test.d.ts.map +1 -0
- package/build/tools/replay-capture-variables.test.js +331 -0
- package/build/tools/replay-capture-variables.test.js.map +1 -0
- package/build/tools/replay-conditional-idb-and-launch.test.d.ts +11 -0
- package/build/tools/replay-conditional-idb-and-launch.test.d.ts.map +1 -0
- package/build/tools/replay-conditional-idb-and-launch.test.js +429 -0
- package/build/tools/replay-conditional-idb-and-launch.test.js.map +1 -0
- package/build/tools/replay-conditional-timeout.test.d.ts +14 -0
- package/build/tools/replay-conditional-timeout.test.d.ts.map +1 -0
- package/build/tools/replay-conditional-timeout.test.js +126 -0
- package/build/tools/replay-conditional-timeout.test.js.map +1 -0
- package/build/tools/replay-declare.test.d.ts +2 -0
- package/build/tools/replay-declare.test.d.ts.map +1 -0
- package/build/tools/replay-declare.test.js +106 -0
- package/build/tools/replay-declare.test.js.map +1 -0
- package/build/tools/replay-declared-browser-cleanup.test.d.ts +2 -0
- package/build/tools/replay-declared-browser-cleanup.test.d.ts.map +1 -0
- package/build/tools/replay-declared-browser-cleanup.test.js +103 -0
- package/build/tools/replay-declared-browser-cleanup.test.js.map +1 -0
- package/build/tools/replay-declared-profile.test.d.ts +2 -0
- package/build/tools/replay-declared-profile.test.d.ts.map +1 -0
- package/build/tools/replay-declared-profile.test.js +116 -0
- package/build/tools/replay-declared-profile.test.js.map +1 -0
- package/build/tools/replay-executor.d.ts +556 -0
- package/build/tools/replay-executor.d.ts.map +1 -0
- package/build/tools/replay-executor.js +2347 -0
- package/build/tools/replay-executor.js.map +1 -0
- package/build/tools/replay-folder-save.test.d.ts +2 -0
- package/build/tools/replay-folder-save.test.d.ts.map +1 -0
- package/build/tools/replay-folder-save.test.js +63 -0
- package/build/tools/replay-folder-save.test.js.map +1 -0
- package/build/tools/replay-formatters.d.ts +148 -0
- package/build/tools/replay-formatters.d.ts.map +1 -0
- package/build/tools/replay-formatters.js +856 -0
- package/build/tools/replay-formatters.js.map +1 -0
- package/build/tools/replay-kill-chrome-on-finish.test.d.ts +2 -0
- package/build/tools/replay-kill-chrome-on-finish.test.d.ts.map +1 -0
- package/build/tools/replay-kill-chrome-on-finish.test.js +175 -0
- package/build/tools/replay-kill-chrome-on-finish.test.js.map +1 -0
- package/build/tools/replay-multi-connection.test.d.ts +2 -0
- package/build/tools/replay-multi-connection.test.d.ts.map +1 -0
- package/build/tools/replay-multi-connection.test.js +547 -0
- package/build/tools/replay-multi-connection.test.js.map +1 -0
- package/build/tools/replay-output-and-record-options.test.d.ts +2 -0
- package/build/tools/replay-output-and-record-options.test.d.ts.map +1 -0
- package/build/tools/replay-output-and-record-options.test.js +240 -0
- package/build/tools/replay-output-and-record-options.test.js.map +1 -0
- package/build/tools/replay-production-error-shape.test.d.ts +7 -0
- package/build/tools/replay-production-error-shape.test.d.ts.map +1 -0
- package/build/tools/replay-production-error-shape.test.js +93 -0
- package/build/tools/replay-production-error-shape.test.js.map +1 -0
- package/build/tools/replay-rebase.test.d.ts +2 -0
- package/build/tools/replay-rebase.test.d.ts.map +1 -0
- package/build/tools/replay-rebase.test.js +58 -0
- package/build/tools/replay-rebase.test.js.map +1 -0
- package/build/tools/replay-retry-classification.test.d.ts +9 -0
- package/build/tools/replay-retry-classification.test.d.ts.map +1 -0
- package/build/tools/replay-retry-classification.test.js +57 -0
- package/build/tools/replay-retry-classification.test.js.map +1 -0
- package/build/tools/replay-run-registry.d.ts +55 -0
- package/build/tools/replay-run-registry.d.ts.map +1 -0
- package/build/tools/replay-run-registry.js +65 -0
- package/build/tools/replay-run-registry.js.map +1 -0
- package/build/tools/replay-sequence-reload.test.d.ts +2 -0
- package/build/tools/replay-sequence-reload.test.d.ts.map +1 -0
- package/build/tools/replay-sequence-reload.test.js +82 -0
- package/build/tools/replay-sequence-reload.test.js.map +1 -0
- package/build/tools/replay-socket-scope.test.d.ts +2 -0
- package/build/tools/replay-socket-scope.test.d.ts.map +1 -0
- package/build/tools/replay-socket-scope.test.js +75 -0
- package/build/tools/replay-socket-scope.test.js.map +1 -0
- package/build/tools/replay-step-connection.test.d.ts +2 -0
- package/build/tools/replay-step-connection.test.d.ts.map +1 -0
- package/build/tools/replay-step-connection.test.js +292 -0
- package/build/tools/replay-step-connection.test.js.map +1 -0
- package/build/tools/replay-step-timeout.test.d.ts +2 -0
- package/build/tools/replay-step-timeout.test.d.ts.map +1 -0
- package/build/tools/replay-step-timeout.test.js +204 -0
- package/build/tools/replay-step-timeout.test.js.map +1 -0
- package/build/tools/replay-tags.test.d.ts +2 -0
- package/build/tools/replay-tags.test.d.ts.map +1 -0
- package/build/tools/replay-tags.test.js +99 -0
- package/build/tools/replay-tags.test.js.map +1 -0
- package/build/tools/replay-teardown-and-foreach.test.d.ts +13 -0
- package/build/tools/replay-teardown-and-foreach.test.d.ts.map +1 -0
- package/build/tools/replay-teardown-and-foreach.test.js +318 -0
- package/build/tools/replay-teardown-and-foreach.test.js.map +1 -0
- package/build/tools/replay-tool-name-validation.test.d.ts +2 -0
- package/build/tools/replay-tool-name-validation.test.d.ts.map +1 -0
- package/build/tools/replay-tool-name-validation.test.js +280 -0
- package/build/tools/replay-tool-name-validation.test.js.map +1 -0
- package/build/tools/replay-tools.d.ts +288 -0
- package/build/tools/replay-tools.d.ts.map +1 -0
- package/build/tools/replay-tools.js +2994 -0
- package/build/tools/replay-tools.js.map +1 -0
- package/build/tools/request-abort.test.d.ts +2 -0
- package/build/tools/request-abort.test.d.ts.map +1 -0
- package/build/tools/request-abort.test.js +130 -0
- package/build/tools/request-abort.test.js.map +1 -0
- package/build/tools/request-tools.d.ts +56 -0
- package/build/tools/request-tools.d.ts.map +1 -0
- package/build/tools/request-tools.js +174 -0
- package/build/tools/request-tools.js.map +1 -0
- package/build/tools/screenshot-tools.d.ts +135 -0
- package/build/tools/screenshot-tools.d.ts.map +1 -0
- package/build/tools/screenshot-tools.js +636 -0
- package/build/tools/screenshot-tools.js.map +1 -0
- package/build/tools/server-tools.d.ts +88 -0
- package/build/tools/server-tools.d.ts.map +1 -0
- package/build/tools/server-tools.js +485 -0
- package/build/tools/server-tools.js.map +1 -0
- package/build/tools/source-tools.d.ts +46 -0
- package/build/tools/source-tools.d.ts.map +1 -0
- package/build/tools/source-tools.js +47 -0
- package/build/tools/source-tools.js.map +1 -0
- package/build/tools/storage-tools.d.ts +141 -0
- package/build/tools/storage-tools.d.ts.map +1 -0
- package/build/tools/storage-tools.js +894 -0
- package/build/tools/storage-tools.js.map +1 -0
- package/build/tools/storage-tools.test.d.ts +13 -0
- package/build/tools/storage-tools.test.d.ts.map +1 -0
- package/build/tools/storage-tools.test.js +707 -0
- package/build/tools/storage-tools.test.js.map +1 -0
- package/build/tools/tab-tools.d.ts +42 -0
- package/build/tools/tab-tools.d.ts.map +1 -0
- package/build/tools/tab-tools.js +296 -0
- package/build/tools/tab-tools.js.map +1 -0
- package/build/tools/wait-tools.d.ts +85 -0
- package/build/tools/wait-tools.d.ts.map +1 -0
- package/build/tools/wait-tools.js +236 -0
- package/build/tools/wait-tools.js.map +1 -0
- package/build/tools/wait-tools.test.d.ts +9 -0
- package/build/tools/wait-tools.test.d.ts.map +1 -0
- package/build/tools/wait-tools.test.js +193 -0
- package/build/tools/wait-tools.test.js.map +1 -0
- package/build/types.d.ts +133 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +5 -0
- package/build/types.js.map +1 -0
- package/build/ui-verifier.d.ts +88 -0
- package/build/ui-verifier.d.ts.map +1 -0
- package/build/ui-verifier.js +540 -0
- package/build/ui-verifier.js.map +1 -0
- package/build/utils/abort.d.ts +68 -0
- package/build/utils/abort.d.ts.map +1 -0
- package/build/utils/abort.js +159 -0
- package/build/utils/abort.js.map +1 -0
- package/build/utils/abort.test.d.ts +2 -0
- package/build/utils/abort.test.d.ts.map +1 -0
- package/build/utils/abort.test.js +174 -0
- package/build/utils/abort.test.js.map +1 -0
- package/build/utils/modal-detection-core.d.ts +150 -0
- package/build/utils/modal-detection-core.d.ts.map +1 -0
- package/build/utils/modal-detection-core.js +332 -0
- package/build/utils/modal-detection-core.js.map +1 -0
- package/build/utils/modal-detection-core.test.d.ts +5 -0
- package/build/utils/modal-detection-core.test.d.ts.map +1 -0
- package/build/utils/modal-detection-core.test.js +492 -0
- package/build/utils/modal-detection-core.test.js.map +1 -0
- package/build/utils/modal-detector.d.ts +29 -0
- package/build/utils/modal-detector.d.ts.map +1 -0
- package/build/utils/modal-detector.js +281 -0
- package/build/utils/modal-detector.js.map +1 -0
- package/build/utils/modal-dismissal.d.ts +32 -0
- package/build/utils/modal-dismissal.d.ts.map +1 -0
- package/build/utils/modal-dismissal.js +190 -0
- package/build/utils/modal-dismissal.js.map +1 -0
- package/build/utils/port-check.d.ts +31 -0
- package/build/utils/port-check.d.ts.map +1 -0
- package/build/utils/port-check.js +87 -0
- package/build/utils/port-check.js.map +1 -0
- package/build/utils/port-check.test.d.ts +2 -0
- package/build/utils/port-check.test.d.ts.map +1 -0
- package/build/utils/port-check.test.js +66 -0
- package/build/utils/port-check.test.js.map +1 -0
- package/build/utils/selector-resolver.d.ts +66 -0
- package/build/utils/selector-resolver.d.ts.map +1 -0
- package/build/utils/selector-resolver.js +200 -0
- package/build/utils/selector-resolver.js.map +1 -0
- package/build/validation-helpers.d.ts +41 -0
- package/build/validation-helpers.d.ts.map +1 -0
- package/build/validation-helpers.js +236 -0
- package/build/validation-helpers.js.map +1 -0
- package/build/window-sizing.d.ts +26 -0
- package/build/window-sizing.d.ts.map +1 -0
- package/build/window-sizing.js +87 -0
- package/build/window-sizing.js.map +1 -0
- package/build/window-sizing.test.d.ts +8 -0
- package/build/window-sizing.test.d.ts.map +1 -0
- package/build/window-sizing.test.js +113 -0
- package/build/window-sizing.test.js.map +1 -0
- package/docs/README.md +74 -0
- package/docs/automation.md +562 -0
- package/docs/debugging.md +229 -0
- package/docs/installation.md +133 -0
- package/docs/instructions.md +227 -0
- package/docs/mcp-instructions.md +15 -0
- package/docs/message-system.md +327 -0
- package/docs/messages.md +3480 -0
- package/docs/parser-plugins.md +132 -0
- package/docs/replay.md +1411 -0
- package/docs/troubleshooting.md +272 -0
- package/docs/working_with_llm_notes.md +5 -0
- package/package.json +87 -0
- package/skills/devharness/SKILL.md +195 -0
- package/skills/devharness/references/sequences.md +613 -0
- package/skills/devharness/references/tool-categories.md +99 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modal detection utilities for Puppeteer pages
|
|
3
|
+
*
|
|
4
|
+
* This module provides functions to detect and classify modals on web pages.
|
|
5
|
+
* It uses the core detection logic from modal-detection-core.ts and executes
|
|
6
|
+
* it in the browser context via page.evaluate().
|
|
7
|
+
*/
|
|
8
|
+
import { debugLog } from '../debug-logger.js';
|
|
9
|
+
import { MODAL_PATTERNS, COMMON_MODAL_SELECTORS, isElementBlockingViewport, isBasicVisible, isBlockingPosition, hasMinimumZIndex, coversMinimumViewport, isVisibleOnTop, classifyModal, getDismissStrategies, getUniqueSelector, } from './modal-detection-core.js';
|
|
10
|
+
/**
|
|
11
|
+
* Detects modals and blocking overlays on the page
|
|
12
|
+
*
|
|
13
|
+
* This is the fixed implementation that uses elementFromPoint for reliable detection
|
|
14
|
+
*/
|
|
15
|
+
export async function detectModals(page, options = {}) {
|
|
16
|
+
const { minZIndex = 100, minViewportCoverage = 0.25, includeBackdrops = true, } = options;
|
|
17
|
+
const pageUrl = page.url();
|
|
18
|
+
await debugLog('ModalDetector', `Detecting modals on page: ${pageUrl}`);
|
|
19
|
+
await debugLog('ModalDetector', `Options: minZIndex=${minZIndex}, minViewportCoverage=${minViewportCoverage}, includeBackdrops=${includeBackdrops}`);
|
|
20
|
+
// Serialize RegExp patterns in MODAL_PATTERNS to strings
|
|
21
|
+
const serializedPatterns = {
|
|
22
|
+
cookieConsent: {
|
|
23
|
+
...MODAL_PATTERNS.cookieConsent,
|
|
24
|
+
textPatterns: MODAL_PATTERNS.cookieConsent.textPatterns.source,
|
|
25
|
+
textPatternsFlags: MODAL_PATTERNS.cookieConsent.textPatterns.flags,
|
|
26
|
+
},
|
|
27
|
+
newsletter: {
|
|
28
|
+
...MODAL_PATTERNS.newsletter,
|
|
29
|
+
textPatterns: MODAL_PATTERNS.newsletter.textPatterns.source,
|
|
30
|
+
textPatternsFlags: MODAL_PATTERNS.newsletter.textPatterns.flags,
|
|
31
|
+
},
|
|
32
|
+
ageVerification: {
|
|
33
|
+
...MODAL_PATTERNS.ageVerification,
|
|
34
|
+
textPatterns: MODAL_PATTERNS.ageVerification.textPatterns.source,
|
|
35
|
+
textPatternsFlags: MODAL_PATTERNS.ageVerification.textPatterns.flags,
|
|
36
|
+
},
|
|
37
|
+
genericDialog: {
|
|
38
|
+
...MODAL_PATTERNS.genericDialog,
|
|
39
|
+
textPatterns: null,
|
|
40
|
+
textPatternsFlags: null,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
// Serialize functions and data to pass into browser context
|
|
44
|
+
const modals = await page.evaluate((opts) => {
|
|
45
|
+
const { minZIndex, minViewportCoverage, includeBackdrops, modalPatterns, commonSelectors, isBasicVisibleFn, isBlockingPositionFn, hasMinimumZIndexFn, coversMinimumViewportFn, isVisibleOnTopFn, isElementBlockingViewportFn, classifyModalFn, getDismissStrategiesFn, getUniqueSelectorFn, } = opts;
|
|
46
|
+
const global = globalThis;
|
|
47
|
+
// Reconstruct RegExp patterns from serialized strings
|
|
48
|
+
const reconstructedPatterns = {
|
|
49
|
+
cookieConsent: {
|
|
50
|
+
...modalPatterns.cookieConsent,
|
|
51
|
+
textPatterns: new RegExp(modalPatterns.cookieConsent.textPatterns, modalPatterns.cookieConsent.textPatternsFlags),
|
|
52
|
+
},
|
|
53
|
+
newsletter: {
|
|
54
|
+
...modalPatterns.newsletter,
|
|
55
|
+
textPatterns: new RegExp(modalPatterns.newsletter.textPatterns, modalPatterns.newsletter.textPatternsFlags),
|
|
56
|
+
},
|
|
57
|
+
ageVerification: {
|
|
58
|
+
...modalPatterns.ageVerification,
|
|
59
|
+
textPatterns: new RegExp(modalPatterns.ageVerification.textPatterns, modalPatterns.ageVerification.textPatternsFlags),
|
|
60
|
+
},
|
|
61
|
+
genericDialog: {
|
|
62
|
+
...modalPatterns.genericDialog,
|
|
63
|
+
textPatterns: null,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
// Reconstruct helper functions first (needed by isElementBlockingViewport)
|
|
67
|
+
// Use eval without parentheses to define functions in scope
|
|
68
|
+
// eslint-disable-next-line no-eval
|
|
69
|
+
eval(isBasicVisibleFn);
|
|
70
|
+
// eslint-disable-next-line no-eval
|
|
71
|
+
eval(isBlockingPositionFn);
|
|
72
|
+
// eslint-disable-next-line no-eval
|
|
73
|
+
eval(hasMinimumZIndexFn);
|
|
74
|
+
// eslint-disable-next-line no-eval
|
|
75
|
+
eval(coversMinimumViewportFn);
|
|
76
|
+
// eslint-disable-next-line no-eval
|
|
77
|
+
eval(isVisibleOnTopFn);
|
|
78
|
+
// Now reconstruct main functions (these depend on the helpers above)
|
|
79
|
+
// eslint-disable-next-line no-eval
|
|
80
|
+
eval(isElementBlockingViewportFn);
|
|
81
|
+
// eslint-disable-next-line no-eval
|
|
82
|
+
eval(classifyModalFn);
|
|
83
|
+
// eslint-disable-next-line no-eval
|
|
84
|
+
eval(getDismissStrategiesFn);
|
|
85
|
+
// eslint-disable-next-line no-eval
|
|
86
|
+
eval(getUniqueSelectorFn);
|
|
87
|
+
// Reference the now-defined functions
|
|
88
|
+
// @ts-ignore - Functions are defined by eval above
|
|
89
|
+
const isElementBlockingViewportFunc = isElementBlockingViewport;
|
|
90
|
+
// @ts-ignore
|
|
91
|
+
const classifyModalFunc = classifyModal;
|
|
92
|
+
// @ts-ignore
|
|
93
|
+
const getDismissStrategiesFunc = getDismissStrategies;
|
|
94
|
+
// @ts-ignore
|
|
95
|
+
const getUniqueSelectorFunc = getUniqueSelector;
|
|
96
|
+
const detectedModals = [];
|
|
97
|
+
const candidateElements = [];
|
|
98
|
+
// Scan using common selectors
|
|
99
|
+
commonSelectors.forEach((selector) => {
|
|
100
|
+
try {
|
|
101
|
+
const elements = global.document.querySelectorAll(selector);
|
|
102
|
+
elements.forEach((el) => {
|
|
103
|
+
if (!candidateElements.includes(el) &&
|
|
104
|
+
isElementBlockingViewportFunc(el, minZIndex, minViewportCoverage)) {
|
|
105
|
+
candidateElements.push(el);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
// Ignore selector errors
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
// Fallback: scan all fixed/absolute positioned elements if no candidates found
|
|
114
|
+
if (candidateElements.length === 0) {
|
|
115
|
+
const allElements = global.document.querySelectorAll('*');
|
|
116
|
+
allElements.forEach((el) => {
|
|
117
|
+
const style = global.window.getComputedStyle(el);
|
|
118
|
+
if ((style.position === 'fixed' || style.position === 'absolute') &&
|
|
119
|
+
isElementBlockingViewportFunc(el, minZIndex, minViewportCoverage)) {
|
|
120
|
+
candidateElements.push(el);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
// Process candidates
|
|
125
|
+
candidateElements.forEach((el, idx) => {
|
|
126
|
+
try {
|
|
127
|
+
const rect = el.getBoundingClientRect();
|
|
128
|
+
const style = global.window.getComputedStyle(el);
|
|
129
|
+
const zIndex = parseInt(style.zIndex, 10) || 0;
|
|
130
|
+
const classification = classifyModalFunc(el, reconstructedPatterns);
|
|
131
|
+
const strategies = getDismissStrategiesFunc(el, classification.type);
|
|
132
|
+
// Filter out backdrops if requested
|
|
133
|
+
if (!includeBackdrops && classification.type === 'blocking-overlay') {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const selector = getUniqueSelectorFunc(el);
|
|
137
|
+
detectedModals.push({
|
|
138
|
+
selector: selector,
|
|
139
|
+
type: classification.type,
|
|
140
|
+
zIndex,
|
|
141
|
+
boundingBox: {
|
|
142
|
+
x: rect.left,
|
|
143
|
+
y: rect.top,
|
|
144
|
+
width: rect.width,
|
|
145
|
+
height: rect.height,
|
|
146
|
+
},
|
|
147
|
+
dismissStrategies: strategies,
|
|
148
|
+
confidence: classification.confidence,
|
|
149
|
+
description: classification.description,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
catch (e) {
|
|
153
|
+
// Ignore errors processing individual candidates
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
// Sort by z-index (highest first) and confidence
|
|
157
|
+
detectedModals.sort((a, b) => {
|
|
158
|
+
if (b.zIndex !== a.zIndex) {
|
|
159
|
+
return b.zIndex - a.zIndex;
|
|
160
|
+
}
|
|
161
|
+
return b.confidence - a.confidence;
|
|
162
|
+
});
|
|
163
|
+
return detectedModals;
|
|
164
|
+
}, {
|
|
165
|
+
minZIndex,
|
|
166
|
+
minViewportCoverage,
|
|
167
|
+
includeBackdrops,
|
|
168
|
+
modalPatterns: serializedPatterns,
|
|
169
|
+
commonSelectors: COMMON_MODAL_SELECTORS,
|
|
170
|
+
// Serialize helper functions first
|
|
171
|
+
isBasicVisibleFn: isBasicVisible.toString(),
|
|
172
|
+
isBlockingPositionFn: isBlockingPosition.toString(),
|
|
173
|
+
hasMinimumZIndexFn: hasMinimumZIndex.toString(),
|
|
174
|
+
coversMinimumViewportFn: coversMinimumViewport.toString(),
|
|
175
|
+
isVisibleOnTopFn: isVisibleOnTop.toString(),
|
|
176
|
+
// Then serialize main functions
|
|
177
|
+
isElementBlockingViewportFn: isElementBlockingViewport.toString(),
|
|
178
|
+
classifyModalFn: classifyModal.toString(),
|
|
179
|
+
getDismissStrategiesFn: getDismissStrategies.toString(),
|
|
180
|
+
getUniqueSelectorFn: getUniqueSelector.toString(),
|
|
181
|
+
});
|
|
182
|
+
await debugLog('ModalDetector', `Detected ${modals.length} modal(s)`);
|
|
183
|
+
return modals;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Checks if a specific element is blocked by a modal/overlay
|
|
187
|
+
*
|
|
188
|
+
* This uses the reverse approach (elementFromPoint) which is more reliable
|
|
189
|
+
* than proactive scanning
|
|
190
|
+
*/
|
|
191
|
+
export async function isElementBlocked(page, selector) {
|
|
192
|
+
await debugLog('ModalDetector', `Checking if element ${selector} is blocked`);
|
|
193
|
+
const result = await page.evaluate((sel) => {
|
|
194
|
+
const global = globalThis;
|
|
195
|
+
const element = global.document.querySelector(sel);
|
|
196
|
+
if (!element) {
|
|
197
|
+
return { blocked: false, error: 'Element not found' };
|
|
198
|
+
}
|
|
199
|
+
const rect = element.getBoundingClientRect();
|
|
200
|
+
const centerX = rect.left + rect.width / 2;
|
|
201
|
+
const centerY = rect.top + rect.height / 2;
|
|
202
|
+
// Check what element is at the target's center point
|
|
203
|
+
const topElement = global.document.elementFromPoint(centerX, centerY);
|
|
204
|
+
if (!topElement) {
|
|
205
|
+
return { blocked: false };
|
|
206
|
+
}
|
|
207
|
+
// If the top element is the target or a child, it's not blocked
|
|
208
|
+
if (topElement === element || element.contains(topElement)) {
|
|
209
|
+
return { blocked: false };
|
|
210
|
+
}
|
|
211
|
+
// Find the blocking element's topmost ancestor that's fixed/absolute
|
|
212
|
+
let blockingElement = topElement;
|
|
213
|
+
while (blockingElement && blockingElement !== global.document.body) {
|
|
214
|
+
const style = global.window.getComputedStyle(blockingElement);
|
|
215
|
+
const position = style.position;
|
|
216
|
+
if (position === 'fixed' || position === 'absolute') {
|
|
217
|
+
const zIndex = parseInt(style.zIndex, 10) || 0;
|
|
218
|
+
const blockingRect = blockingElement.getBoundingClientRect();
|
|
219
|
+
// Generate selector for blocking element
|
|
220
|
+
let blockingSelector;
|
|
221
|
+
if (blockingElement.id) {
|
|
222
|
+
blockingSelector = `#${blockingElement.id}`;
|
|
223
|
+
}
|
|
224
|
+
else if (blockingElement.className && typeof blockingElement.className === 'string') {
|
|
225
|
+
const classes = blockingElement.className.split(/\s+/).filter(Boolean);
|
|
226
|
+
blockingSelector = classes.length > 0 ? `.${classes[0]}` : blockingElement.tagName.toLowerCase();
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
blockingSelector = blockingElement.tagName.toLowerCase();
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
blocked: true,
|
|
233
|
+
blockingElement: {
|
|
234
|
+
selector: blockingSelector,
|
|
235
|
+
zIndex,
|
|
236
|
+
boundingBox: {
|
|
237
|
+
x: blockingRect.left,
|
|
238
|
+
y: blockingRect.top,
|
|
239
|
+
width: blockingRect.width,
|
|
240
|
+
height: blockingRect.height,
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
blockingElement = blockingElement.parentElement;
|
|
246
|
+
}
|
|
247
|
+
return { blocked: true, blockingElement: null };
|
|
248
|
+
}, selector);
|
|
249
|
+
if (!result.blocked) {
|
|
250
|
+
await debugLog('ModalDetector', `Element ${selector} is not blocked`);
|
|
251
|
+
return { blocked: false };
|
|
252
|
+
}
|
|
253
|
+
// If we found a blocking element, try to classify it
|
|
254
|
+
if (result.blockingElement) {
|
|
255
|
+
const modals = await detectModals(page);
|
|
256
|
+
const matchingModal = modals.find(m => m.selector === result.blockingElement.selector);
|
|
257
|
+
if (matchingModal) {
|
|
258
|
+
await debugLog('ModalDetector', `Element ${selector} is blocked by modal: ${matchingModal.type}`);
|
|
259
|
+
return {
|
|
260
|
+
blocked: true,
|
|
261
|
+
blockingModal: matchingModal,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
await debugLog('ModalDetector', `Element ${selector} is blocked by unknown element`);
|
|
266
|
+
return {
|
|
267
|
+
blocked: true,
|
|
268
|
+
blockingModal: {
|
|
269
|
+
...result.blockingElement,
|
|
270
|
+
type: 'unknown',
|
|
271
|
+
dismissStrategies: ['remove'],
|
|
272
|
+
confidence: 50,
|
|
273
|
+
description: 'Unknown blocking element',
|
|
274
|
+
},
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
await debugLog('ModalDetector', `Element ${selector} is blocked (reason unknown)`);
|
|
279
|
+
return { blocked: true };
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=modal-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modal-detector.js","sourceRoot":"","sources":["../../src/utils/modal-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modal dismissal utilities
|
|
3
|
+
*
|
|
4
|
+
* This module handles the logic for dismissing modals using various strategies.
|
|
5
|
+
* It was extracted from duplicate code in modal-tools.ts and input-tools.ts
|
|
6
|
+
*/
|
|
7
|
+
import type { Page } from 'puppeteer-core';
|
|
8
|
+
import type { DetectedModalInfo as DetectedModal, DismissStrategy } from './modal-detection-core.js';
|
|
9
|
+
export interface DismissalResult {
|
|
10
|
+
success: boolean;
|
|
11
|
+
method?: string;
|
|
12
|
+
error?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Dismiss a modal using a specific strategy
|
|
16
|
+
*
|
|
17
|
+
* @param page - Puppeteer page instance
|
|
18
|
+
* @param modal - The detected modal to dismiss
|
|
19
|
+
* @param strategy - Dismissal strategy (accept, reject, close, remove)
|
|
20
|
+
* @param retryAttempts - Number of retry attempts when clicking buttons
|
|
21
|
+
* @returns Result indicating success or failure
|
|
22
|
+
*/
|
|
23
|
+
export declare function dismissModalByStrategy(page: Page, modal: DetectedModal, strategy: DismissStrategy, retryAttempts?: number): Promise<DismissalResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Select the best dismissal strategy based on modal type
|
|
26
|
+
*
|
|
27
|
+
* @param modal - The detected modal
|
|
28
|
+
* @param requestedStrategy - User-requested strategy or 'auto'
|
|
29
|
+
* @returns Effective strategy to use
|
|
30
|
+
*/
|
|
31
|
+
export declare function selectDismissalStrategy(modal: DetectedModal, requestedStrategy: DismissStrategy | 'auto'): DismissStrategy;
|
|
32
|
+
//# sourceMappingURL=modal-dismissal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modal-dismissal.d.ts","sourceRoot":"","sources":["../../src/utils/modal-dismissal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,IAAI,aAAa,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAErG,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,eAAe,EACzB,aAAa,GAAE,MAAU,GACxB,OAAO,CAAC,eAAe,CAAC,CA6I1B;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,aAAa,EACpB,iBAAiB,EAAE,eAAe,GAAG,MAAM,GAC1C,eAAe,CAqCjB"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modal dismissal utilities
|
|
3
|
+
*
|
|
4
|
+
* This module handles the logic for dismissing modals using various strategies.
|
|
5
|
+
* It was extracted from duplicate code in modal-tools.ts and input-tools.ts
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Dismiss a modal using a specific strategy
|
|
9
|
+
*
|
|
10
|
+
* @param page - Puppeteer page instance
|
|
11
|
+
* @param modal - The detected modal to dismiss
|
|
12
|
+
* @param strategy - Dismissal strategy (accept, reject, close, remove)
|
|
13
|
+
* @param retryAttempts - Number of retry attempts when clicking buttons
|
|
14
|
+
* @returns Result indicating success or failure
|
|
15
|
+
*/
|
|
16
|
+
export async function dismissModalByStrategy(page, modal, strategy, retryAttempts = 3) {
|
|
17
|
+
// Remove strategy - just remove from DOM
|
|
18
|
+
if (strategy === 'remove') {
|
|
19
|
+
try {
|
|
20
|
+
await page.evaluate((sel) => {
|
|
21
|
+
const element = globalThis.document.querySelector(sel);
|
|
22
|
+
if (element) {
|
|
23
|
+
element.remove();
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
}, modal.selector);
|
|
28
|
+
// Verify removal
|
|
29
|
+
const stillExists = await page.$(modal.selector);
|
|
30
|
+
if (stillExists) {
|
|
31
|
+
return { success: false, error: 'Element still exists after removal attempt' };
|
|
32
|
+
}
|
|
33
|
+
return { success: true, method: 'DOM removal' };
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return { success: false, error: error.message };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Button click strategies - need to find appropriate button
|
|
40
|
+
const buttonSelectors = await page.evaluate((sel, strat) => {
|
|
41
|
+
const modal = globalThis.document.querySelector(sel);
|
|
42
|
+
if (!modal)
|
|
43
|
+
return [];
|
|
44
|
+
const selectors = [];
|
|
45
|
+
// Define button search patterns based on strategy
|
|
46
|
+
// TODO: These button text patterns are English-only. Non-English sites will fail button detection.
|
|
47
|
+
// Workaround: Use strategy: 'remove' for non-English sites.
|
|
48
|
+
// See KNOWN_LIMITATIONS.md "Language Limitations" section for details.
|
|
49
|
+
let textPatterns;
|
|
50
|
+
let classPatterns;
|
|
51
|
+
switch (strat) {
|
|
52
|
+
case 'accept':
|
|
53
|
+
textPatterns = /accept|agree|allow|enable|ok|got it|i accept|continue|yes/i;
|
|
54
|
+
classPatterns = ['accept', 'agree', 'allow', 'enable', 'ok', 'continue', 'yes'];
|
|
55
|
+
break;
|
|
56
|
+
case 'reject':
|
|
57
|
+
textPatterns = /reject|decline|deny|disable|no thanks|refuse|dismiss/i;
|
|
58
|
+
classPatterns = ['reject', 'decline', 'deny', 'refuse', 'no'];
|
|
59
|
+
break;
|
|
60
|
+
case 'close':
|
|
61
|
+
textPatterns = /close|dismiss|×|✕|✖|skip|no thanks/i;
|
|
62
|
+
classPatterns = ['close', 'dismiss', 'skip'];
|
|
63
|
+
break;
|
|
64
|
+
default:
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
// Find buttons within modal
|
|
68
|
+
const buttons = modal.querySelectorAll('button, [role="button"], a[href="#"], .button, .btn, [class*="button" i], [class*="btn" i]');
|
|
69
|
+
buttons.forEach((btn, idx) => {
|
|
70
|
+
const text = (btn.textContent || '').trim().toLowerCase();
|
|
71
|
+
const ariaLabel = (btn.getAttribute('aria-label') || '').toLowerCase();
|
|
72
|
+
const className = btn.className.toLowerCase();
|
|
73
|
+
const id = btn.id.toLowerCase();
|
|
74
|
+
const combined = `${text} ${ariaLabel} ${className} ${id}`;
|
|
75
|
+
// Check text pattern
|
|
76
|
+
if (textPatterns.test(combined)) {
|
|
77
|
+
// Try to create a unique selector
|
|
78
|
+
if (btn.id) {
|
|
79
|
+
selectors.push(`#${btn.id}`);
|
|
80
|
+
}
|
|
81
|
+
else if (btn.className) {
|
|
82
|
+
const classes = btn.className.split(/\s+/).filter(Boolean);
|
|
83
|
+
if (classes.length > 0) {
|
|
84
|
+
selectors.push(`${sel} .${classes.join('.')}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
// Fallback to nth-of-type
|
|
89
|
+
selectors.push(`${sel} button:nth-of-type(${idx + 1})`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Check class patterns
|
|
93
|
+
classPatterns.forEach(pattern => {
|
|
94
|
+
if (className.includes(pattern.toLowerCase())) {
|
|
95
|
+
if (btn.id) {
|
|
96
|
+
selectors.push(`#${btn.id}`);
|
|
97
|
+
}
|
|
98
|
+
else if (btn.className) {
|
|
99
|
+
const classes = btn.className.split(/\s+/).filter(Boolean);
|
|
100
|
+
selectors.push(`${sel} .${classes.join('.')}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
return [...new Set(selectors)]; // Remove duplicates
|
|
106
|
+
}, modal.selector, strategy);
|
|
107
|
+
// Try each button selector
|
|
108
|
+
for (const btnSelector of buttonSelectors) {
|
|
109
|
+
for (let attempt = 0; attempt < retryAttempts; attempt++) {
|
|
110
|
+
try {
|
|
111
|
+
const button = await page.$(btnSelector);
|
|
112
|
+
if (!button)
|
|
113
|
+
continue;
|
|
114
|
+
// Click the button
|
|
115
|
+
await button.click();
|
|
116
|
+
// Wait for modal to disappear (with timeout)
|
|
117
|
+
try {
|
|
118
|
+
await page.waitForSelector(modal.selector, { hidden: true, timeout: 1000 });
|
|
119
|
+
return { success: true, method: `Clicked button: ${btnSelector}` };
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
// Modal didn't disappear, try next button
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
// Try next button or retry
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// If no buttons worked, fall back to DOM removal
|
|
133
|
+
if (buttonSelectors.length === 0) {
|
|
134
|
+
return {
|
|
135
|
+
success: false,
|
|
136
|
+
error: `No ${strategy} buttons found in modal. Use strategy "remove" to force removal.`,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
success: false,
|
|
141
|
+
error: `Found ${buttonSelectors.length} potential ${strategy} button(s) but none successfully dismissed the modal`,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Select the best dismissal strategy based on modal type
|
|
146
|
+
*
|
|
147
|
+
* @param modal - The detected modal
|
|
148
|
+
* @param requestedStrategy - User-requested strategy or 'auto'
|
|
149
|
+
* @returns Effective strategy to use
|
|
150
|
+
*/
|
|
151
|
+
export function selectDismissalStrategy(modal, requestedStrategy) {
|
|
152
|
+
if (requestedStrategy === 'auto') {
|
|
153
|
+
// Smart strategy selection based on modal type
|
|
154
|
+
switch (modal.type) {
|
|
155
|
+
case 'cookie-consent':
|
|
156
|
+
// Prefer accept for cookie consents (least friction)
|
|
157
|
+
return modal.dismissStrategies.includes('accept')
|
|
158
|
+
? 'accept'
|
|
159
|
+
: modal.dismissStrategies.includes('close')
|
|
160
|
+
? 'close'
|
|
161
|
+
: 'remove';
|
|
162
|
+
case 'newsletter-popup':
|
|
163
|
+
// Prefer close for newsletters (non-committal)
|
|
164
|
+
return modal.dismissStrategies.includes('close')
|
|
165
|
+
? 'close'
|
|
166
|
+
: modal.dismissStrategies.includes('reject')
|
|
167
|
+
? 'reject'
|
|
168
|
+
: 'remove';
|
|
169
|
+
case 'age-verification':
|
|
170
|
+
// Prefer accept for age gates (necessary)
|
|
171
|
+
return modal.dismissStrategies.includes('accept')
|
|
172
|
+
? 'accept'
|
|
173
|
+
: 'remove';
|
|
174
|
+
default:
|
|
175
|
+
// For unknown modals, prefer close, then remove
|
|
176
|
+
return modal.dismissStrategies.includes('close')
|
|
177
|
+
? 'close'
|
|
178
|
+
: 'remove';
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
// Use requested strategy if available
|
|
183
|
+
if (!modal.dismissStrategies.includes(requestedStrategy)) {
|
|
184
|
+
// Fall back to remove if requested strategy not available
|
|
185
|
+
return 'remove';
|
|
186
|
+
}
|
|
187
|
+
return requestedStrategy;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=modal-dismissal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modal-dismissal.js","sourceRoot":"","sources":["../../src/utils/modal-dismissal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port Check Utility
|
|
3
|
+
* Check if a port is open before attempting to connect
|
|
4
|
+
*/
|
|
5
|
+
export interface PortCheckResult {
|
|
6
|
+
open: boolean;
|
|
7
|
+
host: string;
|
|
8
|
+
port: number;
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Check if a port is open on a given host
|
|
13
|
+
* @param port The port number to check
|
|
14
|
+
* @param host The host to check (default: localhost)
|
|
15
|
+
* @param timeoutMs Timeout in milliseconds (default: 2000)
|
|
16
|
+
*/
|
|
17
|
+
export declare function checkPort(port: number, host?: string, timeoutMs?: number): Promise<PortCheckResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Parse a URL and extract host and port
|
|
20
|
+
* Returns null if URL is invalid or doesn't have a port
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseUrlForPortCheck(url: string): {
|
|
23
|
+
host: string;
|
|
24
|
+
port: number;
|
|
25
|
+
} | null;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a URL's server is reachable
|
|
28
|
+
* Only checks localhost/127.0.0.1 URLs (skips external URLs)
|
|
29
|
+
*/
|
|
30
|
+
export declare function checkUrlPort(url: string, timeoutMs?: number): Promise<PortCheckResult | null>;
|
|
31
|
+
//# sourceMappingURL=port-check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-check.d.ts","sourceRoot":"","sources":["../../src/utils/port-check.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAoB,EAC1B,SAAS,GAAE,MAAa,GACvB,OAAO,CAAC,eAAe,CAAC,CAkC1B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAqBvF;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,MAAa,GACvB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAgBjC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port Check Utility
|
|
3
|
+
* Check if a port is open before attempting to connect
|
|
4
|
+
*/
|
|
5
|
+
import * as net from 'net';
|
|
6
|
+
/**
|
|
7
|
+
* Check if a port is open on a given host
|
|
8
|
+
* @param port The port number to check
|
|
9
|
+
* @param host The host to check (default: localhost)
|
|
10
|
+
* @param timeoutMs Timeout in milliseconds (default: 2000)
|
|
11
|
+
*/
|
|
12
|
+
export async function checkPort(port, host = 'localhost', timeoutMs = 2000) {
|
|
13
|
+
return new Promise((resolve) => {
|
|
14
|
+
const socket = new net.Socket();
|
|
15
|
+
let resolved = false;
|
|
16
|
+
const cleanup = () => {
|
|
17
|
+
if (!resolved) {
|
|
18
|
+
resolved = true;
|
|
19
|
+
socket.destroy();
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
socket.setTimeout(timeoutMs);
|
|
23
|
+
socket.on('connect', () => {
|
|
24
|
+
cleanup();
|
|
25
|
+
resolve({ open: true, host, port });
|
|
26
|
+
});
|
|
27
|
+
socket.on('timeout', () => {
|
|
28
|
+
cleanup();
|
|
29
|
+
resolve({ open: false, host, port, error: 'Connection timed out' });
|
|
30
|
+
});
|
|
31
|
+
socket.on('error', (err) => {
|
|
32
|
+
cleanup();
|
|
33
|
+
const errorMessage = err.code === 'ECONNREFUSED'
|
|
34
|
+
? 'Connection refused'
|
|
35
|
+
: err.message;
|
|
36
|
+
resolve({ open: false, host, port, error: errorMessage });
|
|
37
|
+
});
|
|
38
|
+
socket.connect(port, host);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Parse a URL and extract host and port
|
|
43
|
+
* Returns null if URL is invalid or doesn't have a port
|
|
44
|
+
*/
|
|
45
|
+
export function parseUrlForPortCheck(url) {
|
|
46
|
+
try {
|
|
47
|
+
const parsed = new URL(url);
|
|
48
|
+
const host = parsed.hostname;
|
|
49
|
+
// Get port from URL or use default based on protocol
|
|
50
|
+
let port;
|
|
51
|
+
if (parsed.port) {
|
|
52
|
+
port = parseInt(parsed.port, 10);
|
|
53
|
+
}
|
|
54
|
+
else if (parsed.protocol === 'https:') {
|
|
55
|
+
port = 443;
|
|
56
|
+
}
|
|
57
|
+
else if (parsed.protocol === 'http:') {
|
|
58
|
+
port = 80;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
return { host, port };
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Check if a URL's server is reachable
|
|
71
|
+
* Only checks localhost/127.0.0.1 URLs (skips external URLs)
|
|
72
|
+
*/
|
|
73
|
+
export async function checkUrlPort(url, timeoutMs = 2000) {
|
|
74
|
+
const parsed = parseUrlForPortCheck(url);
|
|
75
|
+
if (!parsed) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
// Only check localhost URLs - external sites may have firewalls, CDNs, etc.
|
|
79
|
+
const isLocalhost = parsed.host === 'localhost' ||
|
|
80
|
+
parsed.host === '127.0.0.1' ||
|
|
81
|
+
parsed.host === '0.0.0.0';
|
|
82
|
+
if (!isLocalhost) {
|
|
83
|
+
return null; // Skip check for non-localhost
|
|
84
|
+
}
|
|
85
|
+
return checkPort(parsed.port, parsed.host, timeoutMs);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=port-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-check.js","sourceRoot":"","sources":["../../src/utils/port-check.ts"],"names":[],"mappings":"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"}
|