browser-debugger-cli 0.2.0 → 0.5.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 +137 -126
- package/dist/__tests__/fixtures/schema-v0.2.1.golden.json +47 -0
- package/dist/__tests__/schema.contract.test.d.ts +19 -0
- package/dist/__tests__/schema.contract.test.d.ts.map +1 -0
- package/dist/__tests__/schema.contract.test.js +236 -0
- package/dist/__tests__/schema.contract.test.js.map +1 -0
- package/dist/__tests__/smoke/error-handling.smoke.test.d.ts +8 -0
- package/dist/__tests__/smoke/error-handling.smoke.test.d.ts.map +1 -0
- package/dist/__tests__/smoke/error-handling.smoke.test.js +106 -0
- package/dist/__tests__/smoke/error-handling.smoke.test.js.map +1 -0
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.d.ts +8 -0
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.d.ts.map +1 -0
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.js +109 -0
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.js.map +1 -0
- package/dist/__testutils__/commandRunner.d.ts +45 -0
- package/dist/__testutils__/commandRunner.d.ts.map +1 -0
- package/dist/__testutils__/commandRunner.js +108 -0
- package/dist/__testutils__/commandRunner.js.map +1 -0
- package/dist/__testutils__/daemonHelpers.d.ts +81 -0
- package/dist/__testutils__/daemonHelpers.d.ts.map +1 -0
- package/dist/__testutils__/daemonHelpers.js +206 -0
- package/dist/__testutils__/daemonHelpers.js.map +1 -0
- package/dist/__testutils__/index.d.ts +1 -0
- package/dist/__testutils__/index.d.ts.map +1 -1
- package/dist/__testutils__/index.js +1 -0
- package/dist/__testutils__/index.js.map +1 -1
- package/dist/__testutils__/testCleanup.d.ts +45 -0
- package/dist/__testutils__/testCleanup.d.ts.map +1 -0
- package/dist/__testutils__/testCleanup.js +87 -0
- package/dist/__testutils__/testCleanup.js.map +1 -0
- package/dist/__testutils__/testHome.d.ts +26 -0
- package/dist/__testutils__/testHome.d.ts.map +1 -0
- package/dist/__testutils__/testHome.js +57 -0
- package/dist/__testutils__/testHome.js.map +1 -0
- package/dist/__testutils__/testProcess.d.ts.map +1 -1
- package/dist/__testutils__/testProcess.js +11 -3
- package/dist/__testutils__/testProcess.js.map +1 -1
- package/dist/cli/commands/__tests__/start.unit.test.d.ts +2 -0
- package/dist/cli/commands/__tests__/start.unit.test.d.ts.map +1 -0
- package/dist/cli/commands/__tests__/start.unit.test.js +131 -0
- package/dist/cli/commands/__tests__/start.unit.test.js.map +1 -0
- package/dist/cli/commands/cleanup.d.ts +1 -0
- package/dist/cli/commands/cleanup.d.ts.map +1 -1
- package/dist/cli/commands/cleanup.js +80 -61
- package/dist/cli/commands/cleanup.js.map +1 -1
- package/dist/cli/commands/details.d.ts +2 -1
- package/dist/cli/commands/details.d.ts.map +1 -1
- package/dist/cli/commands/details.js +104 -52
- package/dist/cli/commands/details.js.map +1 -1
- package/dist/cli/commands/peek.d.ts +2 -1
- package/dist/cli/commands/peek.d.ts.map +1 -1
- package/dist/cli/commands/peek.js +22 -67
- package/dist/cli/commands/peek.js.map +1 -1
- package/dist/cli/commands/query.d.ts +9 -0
- package/dist/cli/commands/query.d.ts.map +1 -0
- package/dist/cli/commands/query.js +125 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/start.d.ts +74 -0
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +147 -38
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +37 -49
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/stop.d.ts +1 -0
- package/dist/cli/commands/stop.d.ts.map +1 -1
- package/dist/cli/commands/stop.js +106 -120
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/formatters/detailsFormatter.d.ts +1 -1
- package/dist/cli/formatters/previewFormatter.d.ts +7 -7
- package/dist/cli/formatters/previewFormatter.d.ts.map +1 -1
- package/dist/cli/formatters/previewFormatter.js +5 -10
- package/dist/cli/formatters/previewFormatter.js.map +1 -1
- package/dist/cli/formatters/statusFormatter.d.ts +13 -10
- package/dist/cli/formatters/statusFormatter.d.ts.map +1 -1
- package/dist/cli/formatters/statusFormatter.js +26 -53
- package/dist/cli/formatters/statusFormatter.js.map +1 -1
- package/dist/cli/handlers/ChromeBootstrap.d.ts +24 -0
- package/dist/cli/handlers/ChromeBootstrap.d.ts.map +1 -0
- package/dist/cli/handlers/ChromeBootstrap.js +50 -0
- package/dist/cli/handlers/ChromeBootstrap.js.map +1 -0
- package/dist/cli/handlers/OutputBuilder.d.ts +2 -3
- package/dist/cli/handlers/OutputBuilder.d.ts.map +1 -1
- package/dist/cli/handlers/OutputBuilder.js +2 -4
- package/dist/cli/handlers/OutputBuilder.js.map +1 -1
- package/dist/cli/handlers/OutputWriter.d.ts +15 -0
- package/dist/cli/handlers/OutputWriter.d.ts.map +1 -0
- package/dist/cli/handlers/OutputWriter.js +34 -0
- package/dist/cli/handlers/OutputWriter.js.map +1 -0
- package/dist/cli/handlers/PreviewWriter.d.ts +52 -0
- package/dist/cli/handlers/PreviewWriter.d.ts.map +1 -0
- package/dist/cli/handlers/PreviewWriter.js +118 -0
- package/dist/cli/handlers/PreviewWriter.js.map +1 -0
- package/dist/cli/handlers/SessionLock.d.ts +16 -0
- package/dist/cli/handlers/SessionLock.d.ts.map +1 -0
- package/dist/cli/handlers/SessionLock.js +35 -0
- package/dist/cli/handlers/SessionLock.js.map +1 -0
- package/dist/cli/handlers/SessionLoop.d.ts +19 -0
- package/dist/cli/handlers/SessionLoop.d.ts.map +1 -0
- package/dist/cli/handlers/SessionLoop.js +47 -0
- package/dist/cli/handlers/SessionLoop.js.map +1 -0
- package/dist/cli/handlers/ShutdownController.d.ts +41 -0
- package/dist/cli/handlers/ShutdownController.d.ts.map +1 -0
- package/dist/cli/handlers/ShutdownController.js +94 -0
- package/dist/cli/handlers/ShutdownController.js.map +1 -0
- package/dist/cli/handlers/SignalHandler.d.ts +35 -0
- package/dist/cli/handlers/SignalHandler.d.ts.map +1 -0
- package/dist/cli/handlers/SignalHandler.js +81 -0
- package/dist/cli/handlers/SignalHandler.js.map +1 -0
- package/dist/cli/handlers/TargetSetup.d.ts +42 -0
- package/dist/cli/handlers/TargetSetup.d.ts.map +1 -0
- package/dist/cli/handlers/TargetSetup.js +87 -0
- package/dist/cli/handlers/TargetSetup.js.map +1 -0
- package/dist/cli/handlers/sessionController.d.ts +41 -0
- package/dist/cli/handlers/sessionController.d.ts.map +1 -1
- package/dist/cli/handlers/sessionController.js +266 -5
- package/dist/cli/handlers/sessionController.js.map +1 -1
- package/dist/cli/registry.d.ts +2 -2
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/registry.js +12 -37
- package/dist/cli/registry.js.map +1 -1
- package/dist/collectors/console.d.ts +1 -1
- package/dist/collectors/console.js +2 -2
- package/dist/collectors/console.js.map +1 -1
- package/dist/collectors/dom.d.ts +1 -1
- package/dist/collectors/network.d.ts +1 -2
- package/dist/collectors/network.d.ts.map +1 -1
- package/dist/collectors/network.js +3 -3
- package/dist/collectors/network.js.map +1 -1
- package/dist/commands/__tests__/cdp.contract.test.d.ts.map +1 -1
- package/dist/commands/__tests__/cdp.contract.test.js +0 -1
- package/dist/commands/__tests__/cdp.contract.test.js.map +1 -1
- package/dist/commands/__tests__/domEval.contract.test.d.ts +17 -0
- package/dist/commands/__tests__/domEval.contract.test.d.ts.map +1 -0
- package/dist/commands/__tests__/domEval.contract.test.js +231 -0
- package/dist/commands/__tests__/domEval.contract.test.js.map +1 -0
- package/dist/commands/cdp.js +1 -1
- package/dist/commands/cdp.js.map +1 -1
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +51 -13
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/console.d.ts.map +1 -1
- package/dist/commands/console.js +8 -8
- package/dist/commands/console.js.map +1 -1
- package/dist/commands/details.js +2 -2
- package/dist/commands/details.js.map +1 -1
- package/dist/commands/dom.d.ts.map +1 -1
- package/dist/commands/dom.js +114 -128
- package/dist/commands/dom.js.map +1 -1
- package/dist/commands/domEvalHelpers.d.ts +7 -11
- package/dist/commands/domEvalHelpers.d.ts.map +1 -1
- package/dist/commands/domEvalHelpers.js +67 -22
- package/dist/commands/domEvalHelpers.js.map +1 -1
- package/dist/commands/domOptionsBuilder.d.ts +32 -0
- package/dist/commands/domOptionsBuilder.d.ts.map +1 -1
- package/dist/commands/domOptionsBuilder.js +35 -0
- package/dist/commands/domOptionsBuilder.js.map +1 -1
- package/dist/commands/machineReadableHelp.d.ts +98 -0
- package/dist/commands/machineReadableHelp.d.ts.map +1 -0
- package/dist/commands/machineReadableHelp.js +137 -0
- package/dist/commands/machineReadableHelp.js.map +1 -0
- package/dist/commands/network.d.ts.map +1 -1
- package/dist/commands/network.js +2 -4
- package/dist/commands/network.js.map +1 -1
- package/dist/commands/peek.d.ts.map +1 -1
- package/dist/commands/peek.js +3 -2
- package/dist/commands/peek.js.map +1 -1
- package/dist/commands/shared/CommandRunner.d.ts +4 -2
- package/dist/commands/shared/CommandRunner.d.ts.map +1 -1
- package/dist/commands/shared/CommandRunner.js +18 -3
- package/dist/commands/shared/CommandRunner.js.map +1 -1
- package/dist/commands/shared/OutputBuilder.js +1 -1
- package/dist/commands/shared/OutputBuilder.js.map +1 -1
- package/dist/commands/shared/commonOptions.d.ts.map +1 -1
- package/dist/commands/shared/commonOptions.js +10 -3
- package/dist/commands/shared/commonOptions.js.map +1 -1
- package/dist/commands/shared/daemonSessionController.d.ts +2 -0
- package/dist/commands/shared/daemonSessionController.d.ts.map +1 -1
- package/dist/commands/shared/daemonSessionController.js +13 -16
- package/dist/commands/shared/daemonSessionController.js.map +1 -1
- package/dist/commands/shared/sessionController.d.ts.map +1 -1
- package/dist/commands/shared/sessionController.js +8 -9
- package/dist/commands/shared/sessionController.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +16 -1
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +72 -54
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +16 -28
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/tail.d.ts +11 -0
- package/dist/commands/tail.d.ts.map +1 -0
- package/dist/commands/tail.js +114 -0
- package/dist/commands/tail.js.map +1 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +2 -0
- package/dist/commands.js.map +1 -1
- package/dist/connection/__tests__/cdp.contract.test.d.ts.map +1 -1
- package/dist/connection/__tests__/cdp.contract.test.js +0 -1
- package/dist/connection/__tests__/cdp.contract.test.js.map +1 -1
- package/dist/connection/cdp.d.ts +46 -2
- package/dist/connection/cdp.d.ts.map +1 -1
- package/dist/connection/cdp.js +71 -5
- package/dist/connection/cdp.js.map +1 -1
- package/dist/connection/diagnostics.d.ts +16 -0
- package/dist/connection/diagnostics.d.ts.map +1 -0
- package/dist/connection/diagnostics.js +37 -0
- package/dist/connection/diagnostics.js.map +1 -0
- package/dist/connection/errors.d.ts +74 -0
- package/dist/connection/errors.d.ts.map +1 -0
- package/dist/connection/errors.js +83 -0
- package/dist/connection/errors.js.map +1 -0
- package/dist/connection/handlers.d.ts +31 -0
- package/dist/connection/handlers.d.ts.map +1 -0
- package/dist/connection/handlers.js +38 -0
- package/dist/connection/handlers.js.map +1 -0
- package/dist/connection/launcher.d.ts +3 -20
- package/dist/connection/launcher.d.ts.map +1 -1
- package/dist/connection/launcher.js +140 -32
- package/dist/connection/launcher.js.map +1 -1
- package/dist/connection/pageReadiness.d.ts +46 -0
- package/dist/connection/pageReadiness.d.ts.map +1 -0
- package/dist/connection/pageReadiness.js +270 -0
- package/dist/connection/pageReadiness.js.map +1 -0
- package/dist/connection/tabs.d.ts +52 -0
- package/dist/connection/tabs.d.ts.map +1 -0
- package/dist/connection/tabs.js +227 -0
- package/dist/connection/tabs.js.map +1 -0
- package/dist/constants.d.ts +20 -40
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +26 -40
- package/dist/constants.js.map +1 -1
- package/dist/daemon/ipcServer.d.ts +5 -7
- package/dist/daemon/ipcServer.d.ts.map +1 -1
- package/dist/daemon/ipcServer.js +178 -143
- package/dist/daemon/ipcServer.js.map +1 -1
- package/dist/daemon/launcher.js +1 -1
- package/dist/daemon/launcher.js.map +1 -1
- package/dist/daemon/server/SocketServer.d.ts +22 -0
- package/dist/daemon/server/SocketServer.d.ts.map +1 -0
- package/dist/daemon/server/SocketServer.js +67 -0
- package/dist/daemon/server/SocketServer.js.map +1 -0
- package/dist/daemon/server/WorkerManager.d.ts +36 -0
- package/dist/daemon/server/WorkerManager.d.ts.map +1 -0
- package/dist/daemon/server/WorkerManager.js +98 -0
- package/dist/daemon/server/WorkerManager.js.map +1 -0
- package/dist/daemon/startSession.d.ts +2 -0
- package/dist/daemon/startSession.d.ts.map +1 -1
- package/dist/daemon/startSession.js +9 -5
- package/dist/daemon/startSession.js.map +1 -1
- package/dist/daemon/worker/TelemetryStore.d.ts +18 -0
- package/dist/daemon/worker/TelemetryStore.d.ts.map +1 -0
- package/dist/daemon/worker/TelemetryStore.js +49 -0
- package/dist/daemon/worker/TelemetryStore.js.map +1 -0
- package/dist/daemon/worker/collectors.d.ts +8 -0
- package/dist/daemon/worker/collectors.d.ts.map +1 -0
- package/dist/daemon/worker/collectors.js +19 -0
- package/dist/daemon/worker/collectors.js.map +1 -0
- package/dist/daemon/worker/commandRegistry.d.ts +10 -0
- package/dist/daemon/worker/commandRegistry.d.ts.map +1 -0
- package/dist/daemon/worker/commandRegistry.js +289 -0
- package/dist/daemon/worker/commandRegistry.js.map +1 -0
- package/dist/daemon/worker/plugins.d.ts +21 -0
- package/dist/daemon/worker/plugins.d.ts.map +1 -0
- package/dist/daemon/worker/plugins.js +71 -0
- package/dist/daemon/worker/plugins.js.map +1 -0
- package/dist/daemon/worker/types.d.ts +13 -0
- package/dist/daemon/worker/types.d.ts.map +1 -0
- package/dist/daemon/worker/types.js +2 -0
- package/dist/daemon/worker/types.js.map +1 -0
- package/dist/daemon/worker.js +232 -484
- package/dist/daemon/worker.js.map +1 -1
- package/dist/help/machineReadableHelp.d.ts +100 -0
- package/dist/help/machineReadableHelp.d.ts.map +1 -0
- package/dist/help/machineReadableHelp.js +139 -0
- package/dist/help/machineReadableHelp.js.map +1 -0
- package/dist/index.js +18 -9
- package/dist/index.js.map +1 -1
- package/dist/ipc/__tests__/client.contract.test.js +2 -2
- package/dist/ipc/__tests__/client.contract.test.js.map +1 -1
- package/dist/ipc/client.d.ts +16 -1
- package/dist/ipc/client.d.ts.map +1 -1
- package/dist/ipc/client.js +40 -11
- package/dist/ipc/client.js.map +1 -1
- package/dist/ipc/commands.d.ts +20 -0
- package/dist/ipc/commands.d.ts.map +1 -1
- package/dist/ipc/commands.js +4 -0
- package/dist/ipc/commands.js.map +1 -1
- package/dist/ipc/types.d.ts +2 -0
- package/dist/ipc/types.d.ts.map +1 -1
- package/dist/session/BdgSession.d.ts +91 -0
- package/dist/session/BdgSession.d.ts.map +1 -0
- package/dist/session/BdgSession.js +230 -0
- package/dist/session/BdgSession.js.map +1 -0
- package/dist/session/cleanup.d.ts.map +1 -1
- package/dist/session/cleanup.js +67 -65
- package/dist/session/cleanup.js.map +1 -1
- package/dist/session/fileOps.d.ts +25 -0
- package/dist/session/fileOps.d.ts.map +1 -0
- package/dist/session/fileOps.js +39 -0
- package/dist/session/fileOps.js.map +1 -0
- package/dist/session/metadata.js +2 -2
- package/dist/session/metadata.js.map +1 -1
- package/dist/session/paths.d.ts +2 -7
- package/dist/session/paths.d.ts.map +1 -1
- package/dist/session/paths.js +8 -8
- package/dist/session/paths.js.map +1 -1
- package/dist/session/queryCache.js +1 -1
- package/dist/session/queryCache.js.map +1 -1
- package/dist/telemetry/__tests__/filters.unit.test.d.ts +2 -0
- package/dist/telemetry/__tests__/filters.unit.test.d.ts.map +1 -0
- package/dist/telemetry/__tests__/filters.unit.test.js +239 -0
- package/dist/telemetry/__tests__/filters.unit.test.js.map +1 -0
- package/dist/telemetry/console.d.ts +1 -1
- package/dist/telemetry/console.d.ts.map +1 -1
- package/dist/telemetry/console.js +5 -3
- package/dist/telemetry/console.js.map +1 -1
- package/dist/telemetry/dialogs.d.ts +27 -0
- package/dist/telemetry/dialogs.d.ts.map +1 -0
- package/dist/telemetry/dialogs.js +51 -0
- package/dist/telemetry/dialogs.js.map +1 -0
- package/dist/telemetry/filters.d.ts +148 -0
- package/dist/telemetry/filters.d.ts.map +1 -0
- package/dist/telemetry/filters.js +358 -0
- package/dist/telemetry/filters.js.map +1 -0
- package/dist/telemetry/navigation.d.ts +49 -0
- package/dist/telemetry/navigation.d.ts.map +1 -0
- package/dist/telemetry/navigation.js +69 -0
- package/dist/telemetry/navigation.js.map +1 -0
- package/dist/telemetry/network.d.ts +1 -0
- package/dist/telemetry/network.d.ts.map +1 -1
- package/dist/telemetry/network.js +23 -34
- package/dist/telemetry/network.js.map +1 -1
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/errors/CommandError.d.ts +39 -0
- package/dist/ui/errors/CommandError.d.ts.map +1 -0
- package/dist/ui/errors/CommandError.js +48 -0
- package/dist/ui/errors/CommandError.js.map +1 -0
- package/dist/ui/errors/SystemErrors.d.ts +22 -0
- package/dist/ui/errors/SystemErrors.d.ts.map +1 -0
- package/dist/ui/errors/SystemErrors.js +23 -0
- package/dist/ui/errors/SystemErrors.js.map +1 -0
- package/dist/ui/errors/index.d.ts +9 -0
- package/dist/ui/errors/index.d.ts.map +1 -0
- package/dist/ui/errors/index.js +12 -0
- package/dist/ui/errors/index.js.map +1 -0
- package/dist/ui/errors/utils.d.ts +24 -0
- package/dist/ui/errors/utils.d.ts.map +1 -0
- package/dist/ui/errors/utils.js +28 -0
- package/dist/ui/errors/utils.js.map +1 -0
- package/dist/ui/errors.d.ts +39 -0
- package/dist/ui/errors.d.ts.map +1 -0
- package/dist/ui/errors.js +48 -0
- package/dist/ui/errors.js.map +1 -0
- package/dist/ui/formatters/cookies.d.ts.map +1 -1
- package/dist/ui/formatters/cookies.js +18 -21
- package/dist/ui/formatters/cookies.js.map +1 -1
- package/dist/ui/formatters/details.d.ts.map +1 -1
- package/dist/ui/formatters/details.js +34 -36
- package/dist/ui/formatters/details.js.map +1 -1
- package/dist/ui/formatters/dom.d.ts +135 -0
- package/dist/ui/formatters/dom.d.ts.map +1 -0
- package/dist/ui/formatters/dom.js +193 -0
- package/dist/ui/formatters/dom.js.map +1 -0
- package/dist/ui/formatters/index.d.ts +1 -0
- package/dist/ui/formatters/index.d.ts.map +1 -1
- package/dist/ui/formatters/index.js +1 -0
- package/dist/ui/formatters/index.js.map +1 -1
- package/dist/ui/formatters/preview.js +43 -38
- package/dist/ui/formatters/preview.js.map +1 -1
- package/dist/ui/formatters/status.d.ts.map +1 -1
- package/dist/ui/formatters/status.js +45 -45
- package/dist/ui/formatters/status.js.map +1 -1
- package/dist/ui/formatting.d.ts +104 -1
- package/dist/ui/formatting.d.ts.map +1 -1
- package/dist/ui/formatting.js +138 -2
- package/dist/ui/formatting.js.map +1 -1
- package/dist/ui/logging/index.d.ts +7 -0
- package/dist/ui/logging/index.d.ts.map +1 -0
- package/dist/ui/logging/index.js +7 -0
- package/dist/ui/logging/index.js.map +1 -0
- package/dist/ui/logging/logger.d.ts +98 -0
- package/dist/ui/logging/logger.d.ts.map +1 -0
- package/dist/ui/logging/logger.js +93 -0
- package/dist/ui/logging/logger.js.map +1 -0
- package/dist/ui/messages/chrome.d.ts +120 -1
- package/dist/ui/messages/chrome.d.ts.map +1 -1
- package/dist/ui/messages/chrome.js +168 -0
- package/dist/ui/messages/chrome.js.map +1 -1
- package/dist/ui/messages/debug.d.ts +4 -2
- package/dist/ui/messages/debug.d.ts.map +1 -1
- package/dist/ui/messages/debug.js +31 -29
- package/dist/ui/messages/debug.js.map +1 -1
- package/dist/ui/messages/deprecation.d.ts +30 -0
- package/dist/ui/messages/deprecation.d.ts.map +1 -0
- package/dist/ui/messages/deprecation.js +49 -0
- package/dist/ui/messages/deprecation.js.map +1 -0
- package/dist/ui/messages/errors.d.ts +11 -0
- package/dist/ui/messages/errors.d.ts.map +1 -1
- package/dist/ui/messages/errors.js +13 -0
- package/dist/ui/messages/errors.js.map +1 -1
- package/dist/ui/messages/preview.d.ts +24 -0
- package/dist/ui/messages/preview.d.ts.map +1 -1
- package/dist/ui/messages/preview.js +32 -1
- package/dist/ui/messages/preview.js.map +1 -1
- package/dist/ui/messages/session.d.ts.map +1 -1
- package/dist/ui/messages/session.js +21 -7
- package/dist/ui/messages/session.js.map +1 -1
- package/dist/ui/messages/validation.d.ts +14 -0
- package/dist/ui/messages/validation.d.ts.map +1 -1
- package/dist/ui/messages/validation.js +16 -0
- package/dist/ui/messages/validation.js.map +1 -1
- package/dist/utils/__tests__/session.contract.test.js +15 -1
- package/dist/utils/__tests__/session.contract.test.js.map +1 -1
- package/dist/utils/filters.d.ts +40 -0
- package/dist/utils/filters.d.ts.map +1 -1
- package/dist/utils/filters.js +55 -1
- package/dist/utils/filters.js.map +1 -1
- package/dist/utils/pageReadiness.d.ts +9 -14
- package/dist/utils/pageReadiness.d.ts.map +1 -1
- package/dist/utils/pageReadiness.js +40 -41
- package/dist/utils/pageReadiness.js.map +1 -1
- package/dist/utils/session.d.ts +200 -0
- package/dist/utils/session.d.ts.map +1 -0
- package/dist/utils/session.js +498 -0
- package/dist/utils/session.js.map +1 -0
- package/dist/utils/url.d.ts +58 -6
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +137 -20
- package/dist/utils/url.js.map +1 -1
- package/dist/utils/validation.d.ts +12 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +20 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +3 -5
- package/dist/cli/commands/__tests__/cdp.contract.test.d.ts +0 -24
- package/dist/cli/commands/__tests__/cdp.contract.test.d.ts.map +0 -1
- package/dist/cli/commands/__tests__/cdp.contract.test.js +0 -467
- package/dist/cli/commands/__tests__/cdp.contract.test.js.map +0 -1
- package/dist/cli/commands/cdp.d.ts +0 -8
- package/dist/cli/commands/cdp.d.ts.map +0 -1
- package/dist/cli/commands/cdp.js +0 -45
- package/dist/cli/commands/cdp.js.map +0 -1
- package/dist/cli/commands/console.d.ts +0 -8
- package/dist/cli/commands/console.d.ts.map +0 -1
- package/dist/cli/commands/console.js +0 -97
- package/dist/cli/commands/console.js.map +0 -1
- package/dist/cli/commands/dom/helpers/domCache.d.ts +0 -36
- package/dist/cli/commands/dom/helpers/domCache.d.ts.map +0 -1
- package/dist/cli/commands/dom/helpers/domCache.js +0 -65
- package/dist/cli/commands/dom/helpers/domCache.js.map +0 -1
- package/dist/cli/commands/dom/helpers/domQuery.d.ts +0 -48
- package/dist/cli/commands/dom/helpers/domQuery.d.ts.map +0 -1
- package/dist/cli/commands/dom/helpers/domQuery.js +0 -104
- package/dist/cli/commands/dom/helpers/domQuery.js.map +0 -1
- package/dist/cli/commands/dom/helpers/errorHandler.d.ts +0 -45
- package/dist/cli/commands/dom/helpers/errorHandler.d.ts.map +0 -1
- package/dist/cli/commands/dom/helpers/errorHandler.js +0 -71
- package/dist/cli/commands/dom/helpers/errorHandler.js.map +0 -1
- package/dist/cli/commands/dom/helpers/evalHelpers.d.ts +0 -52
- package/dist/cli/commands/dom/helpers/evalHelpers.d.ts.map +0 -1
- package/dist/cli/commands/dom/helpers/evalHelpers.js +0 -75
- package/dist/cli/commands/dom/helpers/evalHelpers.js.map +0 -1
- package/dist/cli/commands/dom/helpers/optionsBuilder.d.ts +0 -35
- package/dist/cli/commands/dom/helpers/optionsBuilder.d.ts.map +0 -1
- package/dist/cli/commands/dom/helpers/optionsBuilder.js +0 -51
- package/dist/cli/commands/dom/helpers/optionsBuilder.js.map +0 -1
- package/dist/cli/commands/dom/helpers/selectorParser.d.ts +0 -20
- package/dist/cli/commands/dom/helpers/selectorParser.d.ts.map +0 -1
- package/dist/cli/commands/dom/helpers/selectorParser.js +0 -20
- package/dist/cli/commands/dom/helpers/selectorParser.js.map +0 -1
- package/dist/cli/commands/dom/index.d.ts +0 -8
- package/dist/cli/commands/dom/index.d.ts.map +0 -1
- package/dist/cli/commands/dom/index.js +0 -257
- package/dist/cli/commands/dom/index.js.map +0 -1
- package/dist/cli/commands/dom.d.ts +0 -8
- package/dist/cli/commands/dom.d.ts.map +0 -1
- package/dist/cli/commands/dom.js +0 -257
- package/dist/cli/commands/dom.js.map +0 -1
- package/dist/cli/commands/domErrorHandler.d.ts +0 -45
- package/dist/cli/commands/domErrorHandler.d.ts.map +0 -1
- package/dist/cli/commands/domErrorHandler.js +0 -71
- package/dist/cli/commands/domErrorHandler.js.map +0 -1
- package/dist/cli/commands/domEvalHelpers.d.ts +0 -52
- package/dist/cli/commands/domEvalHelpers.d.ts.map +0 -1
- package/dist/cli/commands/domEvalHelpers.js +0 -76
- package/dist/cli/commands/domEvalHelpers.js.map +0 -1
- package/dist/cli/commands/domOptionsBuilder.d.ts +0 -35
- package/dist/cli/commands/domOptionsBuilder.d.ts.map +0 -1
- package/dist/cli/commands/domOptionsBuilder.js +0 -51
- package/dist/cli/commands/domOptionsBuilder.js.map +0 -1
- package/dist/cli/commands/domSelectorParser.d.ts +0 -20
- package/dist/cli/commands/domSelectorParser.d.ts.map +0 -1
- package/dist/cli/commands/domSelectorParser.js +0 -20
- package/dist/cli/commands/domSelectorParser.js.map +0 -1
- package/dist/cli/commands/network.d.ts +0 -8
- package/dist/cli/commands/network.d.ts.map +0 -1
- package/dist/cli/commands/network.js +0 -43
- package/dist/cli/commands/network.js.map +0 -1
- package/dist/cli/handlers/CommandRunner.d.ts +0 -60
- package/dist/cli/handlers/CommandRunner.d.ts.map +0 -1
- package/dist/cli/handlers/CommandRunner.js +0 -81
- package/dist/cli/handlers/CommandRunner.js.map +0 -1
- package/dist/cli/handlers/commonOptions.d.ts +0 -54
- package/dist/cli/handlers/commonOptions.d.ts.map +0 -1
- package/dist/cli/handlers/commonOptions.js +0 -64
- package/dist/cli/handlers/commonOptions.js.map +0 -1
- package/dist/cli/handlers/daemonSessionController.d.ts +0 -23
- package/dist/cli/handlers/daemonSessionController.d.ts.map +0 -1
- package/dist/cli/handlers/daemonSessionController.js +0 -79
- package/dist/cli/handlers/daemonSessionController.js.map +0 -1
- package/dist/cli/handlers/landingPage.d.ts +0 -8
- package/dist/cli/handlers/landingPage.d.ts.map +0 -1
- package/dist/cli/handlers/landingPage.js +0 -8
- package/dist/cli/handlers/landingPage.js.map +0 -1
- package/dist/collectors/__tests__/network.contract.test.d.ts +0 -28
- package/dist/collectors/__tests__/network.contract.test.d.ts.map +0 -1
- package/dist/collectors/__tests__/network.contract.test.js +0 -540
- package/dist/collectors/__tests__/network.contract.test.js.map +0 -1
- package/dist/commandRegistry.d.ts +0 -11
- package/dist/commandRegistry.d.ts.map +0 -1
- package/dist/commandRegistry.js +0 -45
- package/dist/commandRegistry.js.map +0 -1
- package/dist/commands/domErrorHandler.d.ts +0 -45
- package/dist/commands/domErrorHandler.d.ts.map +0 -1
- package/dist/commands/domErrorHandler.js +0 -71
- package/dist/commands/domErrorHandler.js.map +0 -1
- package/dist/dom/cache.d.ts +0 -36
- package/dist/dom/cache.d.ts.map +0 -1
- package/dist/dom/cache.js +0 -65
- package/dist/dom/cache.js.map +0 -1
- package/dist/dom/index.d.ts +0 -9
- package/dist/dom/index.d.ts.map +0 -1
- package/dist/dom/index.js +0 -9
- package/dist/dom/index.js.map +0 -1
- package/dist/dom/query.d.ts +0 -48
- package/dist/dom/query.d.ts.map +0 -1
- package/dist/dom/query.js +0 -104
- package/dist/dom/query.js.map +0 -1
- package/dist/utils/formatters/network.d.ts +0 -23
- package/dist/utils/formatters/network.d.ts.map +0 -1
- package/dist/utils/formatters/network.js +0 -35
- package/dist/utils/formatters/network.js.map +0 -1
- package/dist/utils/ui.d.ts +0 -36
- package/dist/utils/ui.d.ts.map +0 -1
- package/dist/utils/ui.js +0 -47
- package/dist/utils/ui.js.map +0 -1
- package/dist/utils/url/safeParseUrl.d.ts +0 -63
- package/dist/utils/url/safeParseUrl.d.ts.map +0 -1
- package/dist/utils/url/safeParseUrl.js +0 -84
- package/dist/utils/url/safeParseUrl.js.map +0 -1
package/README.md
CHANGED
|
@@ -5,7 +5,23 @@
|
|
|
5
5
|
[](https://github.com/szymdzum/browser-debugger-cli/actions/workflows/security.yml)
|
|
6
6
|
[](https://www.npmjs.com/package/browser-debugger-cli)
|
|
7
7
|
|
|
8
|
-
DevTools
|
|
8
|
+
Chrome DevTools Protocol in your terminal. Run any CDP command, pipe the output, build browser automation with tools you already know. Design to be agent friendly
|
|
9
|
+
|
|
10
|
+
## Why This Exists
|
|
11
|
+
Puppeteer is great but heavy. CDP is powerful but raw. This tool sits in between: direct protocol access with session management and a few helpful wrappers. No abstractions hiding what's actually happening.
|
|
12
|
+
Built for debugging web apps and scripting browser automation without spinning up a full testing framework.
|
|
13
|
+
|
|
14
|
+
## Current State
|
|
15
|
+
|
|
16
|
+
**Raw [CDP](https://chromedevtools.github.io/devtools-protocol/) access is complete.** All 300+ protocol methods work now. This makes it immediately useful for AI agents and developers comfortable with CDP.
|
|
17
|
+
|
|
18
|
+
**Human-friendly wrappers are in progress.** Commands like `bdg dom query` and `bdg peek` are being added for common operations. For now, most automation work happens through `bdg cdp` and Unix pipes.
|
|
19
|
+
|
|
20
|
+
## Demo
|
|
21
|
+
|
|
22
|
+
[](https://asciinema.org/a/RE6Iup9sB1iSWBK0wgUUn3bBl)
|
|
23
|
+
|
|
24
|
+
*Watch bdg scrape GitHub trending pages and extract repository data in real-time using DOM queries and CDP.*
|
|
9
25
|
|
|
10
26
|
## Installation
|
|
11
27
|
|
|
@@ -13,178 +29,173 @@ DevTools telemetry in your terminal. For humans and agents. Direct WebSocket to
|
|
|
13
29
|
npm install -g browser-debugger-cli@alpha
|
|
14
30
|
```
|
|
15
31
|
|
|
32
|
+
**Platform Support:**
|
|
33
|
+
- ✅ macOS and Linux (native support)
|
|
34
|
+
- ✅ Windows via WSL (Windows Subsystem for Linux)
|
|
35
|
+
- ❌ PowerShell and Git Bash on Windows (not yet supported)
|
|
36
|
+
|
|
37
|
+
The CLI uses Unix domain sockets for inter-process communication. Windows users should run bdg inside WSL for full compatibility.
|
|
38
|
+
|
|
16
39
|
## Quick Start
|
|
17
40
|
|
|
18
41
|
```bash
|
|
19
|
-
# Start session
|
|
42
|
+
# Start a session
|
|
20
43
|
bdg example.com
|
|
21
44
|
|
|
22
|
-
#
|
|
23
|
-
# Session is active - you can now run commands
|
|
24
|
-
|
|
25
|
-
# Check session status
|
|
26
|
-
bdg status
|
|
27
|
-
# Status: Active
|
|
28
|
-
# Worker PID: 12345
|
|
29
|
-
# Chrome PID: 67890
|
|
30
|
-
# Target: http://example.com
|
|
31
|
-
|
|
32
|
-
# Execute raw CDP commands
|
|
45
|
+
# Run any CDP command
|
|
33
46
|
bdg cdp Runtime.evaluate --params '{"expression":"document.title","returnByValue":true}'
|
|
34
|
-
# { "result": { "type": "string", "value": "Example Domain" } }
|
|
35
|
-
|
|
36
47
|
bdg cdp Network.getCookies
|
|
37
|
-
# { "cookies": [...] }
|
|
38
48
|
|
|
39
|
-
#
|
|
49
|
+
# Check what's running
|
|
50
|
+
bdg status
|
|
51
|
+
|
|
52
|
+
# Done
|
|
40
53
|
bdg stop
|
|
41
54
|
```
|
|
42
55
|
|
|
43
|
-
##
|
|
56
|
+
## What You Can Do
|
|
57
|
+
|
|
58
|
+
### Run Any CDP Command
|
|
59
|
+
|
|
60
|
+
All 300+ methods from [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/) work out of the box:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Get cookies and filter with jq
|
|
64
|
+
bdg cdp Network.getCookies | jq '.cookies[] | select(.httpOnly)'
|
|
65
|
+
|
|
66
|
+
# Execute JavaScript in the page
|
|
67
|
+
bdg cdp Runtime.evaluate --params '{"expression":"document.querySelectorAll(\"a\").length","returnByValue":true}'
|
|
68
|
+
|
|
69
|
+
# Monitor memory usage
|
|
70
|
+
bdg cdp Performance.getMetrics | jq '.metrics[] | select(.name == "JSHeapUsedSize")'
|
|
71
|
+
|
|
72
|
+
# Capture a screenshot
|
|
73
|
+
bdg cdp Page.captureScreenshot | jq -r '.data' | base64 -d > screenshot.png
|
|
74
|
+
```
|
|
44
75
|
|
|
45
|
-
|
|
76
|
+
The daemon keeps a WebSocket open to Chrome, so commands run immediately against the live session.
|
|
46
77
|
|
|
47
|
-
###
|
|
78
|
+
### Pipe Everything
|
|
48
79
|
|
|
49
|
-
|
|
80
|
+
Output is JSON by default. Use it with `jq`, `grep`, `awk` - whatever works:
|
|
50
81
|
|
|
51
82
|
```bash
|
|
52
|
-
#
|
|
53
|
-
bdg
|
|
54
|
-
bdg cdp Runtime.evaluate --params '{"expression":"document.title","returnByValue":true}'
|
|
55
|
-
bdg cdp Performance.getMetrics
|
|
83
|
+
# Find all failed network requests
|
|
84
|
+
bdg peek --network --json | jq '.data.network[] | select(.status >= 400)'
|
|
56
85
|
|
|
57
|
-
#
|
|
58
|
-
bdg cdp
|
|
86
|
+
# Extract every link on the page
|
|
87
|
+
bdg cdp Runtime.evaluate --params '{
|
|
88
|
+
"expression": "Array.from(document.querySelectorAll(\"a\")).map(a => ({text: a.textContent.trim(), href: a.href}))",
|
|
89
|
+
"returnByValue": true
|
|
90
|
+
}' | jq '.result.value'
|
|
91
|
+
|
|
92
|
+
# Count console errors
|
|
93
|
+
bdg peek --console --json | jq '[.data.console[] | select(.level == "error")] | length'
|
|
59
94
|
```
|
|
60
95
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
- ✅ Future-proof — new CDP features work without code changes
|
|
65
|
-
- ✅ Agent-friendly — structured input/output, composable with Unix tools
|
|
96
|
+
### For AI Agents
|
|
97
|
+
|
|
98
|
+
Claude skill included at `.claude/skills/bdg/` with working automation patterns:
|
|
66
99
|
|
|
67
|
-
|
|
100
|
+
- Common CDP workflows (scraping, polling, navigation)
|
|
101
|
+
- Exit codes and error handling
|
|
102
|
+
- Troubleshooting reference
|
|
68
103
|
|
|
69
|
-
|
|
104
|
+
The `--help --json` flag outputs the complete CLI schema for programmatic discovery:
|
|
70
105
|
|
|
71
106
|
```bash
|
|
72
|
-
|
|
73
|
-
bdg
|
|
74
|
-
bdg stop # Stop session gracefully
|
|
75
|
-
bdg cleanup # Clean up stale sessions
|
|
76
|
-
|
|
77
|
-
# Data inspection
|
|
78
|
-
bdg peek # Quick preview of collected data
|
|
79
|
-
bdg peek --follow # Live updates every second
|
|
80
|
-
bdg details # Full details for specific items
|
|
81
|
-
bdg dom query # Query DOM elements
|
|
82
|
-
bdg dom eval # Execute JavaScript in browser context
|
|
83
|
-
bdg dom highlight # Highlight elements visually
|
|
84
|
-
bdg dom get # Get full HTML for elements
|
|
107
|
+
bdg --help --json | jq '.command.subcommands[].name'
|
|
108
|
+
bdg --help --json | jq '.exitCodes'
|
|
85
109
|
```
|
|
86
110
|
|
|
87
|
-
|
|
111
|
+
Agents can figure out what commands exist and how to use them without hardcoded knowledge.
|
|
88
112
|
|
|
89
|
-
|
|
90
|
-
- **Token efficiency**: CDP is in the model's training data (~3k tokens for patterns vs. 5-10k for MCP server definitions)
|
|
91
|
-
- **Composability**: Unix pipes with `jq`, `grep`, `awk` — tools models already know
|
|
92
|
-
- **Transparent errors**: See exactly what failed, no protocol layers hiding issues
|
|
93
|
-
- **Real-time evolution**: Update patterns anytime, no server redeployment
|
|
113
|
+
### Debug Live Apps
|
|
94
114
|
|
|
95
|
-
|
|
115
|
+
Point at localhost, monitor what's happening:
|
|
96
116
|
|
|
97
|
-
|
|
117
|
+
```bash
|
|
118
|
+
bdg localhost:3000 --headless
|
|
119
|
+
bdg tail --console # Stream console output
|
|
120
|
+
bdg tail --network # Watch requests in real-time
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Helpful for catching issues during development without opening DevTools.
|
|
124
|
+
|
|
125
|
+
### Automate Browser Tasks
|
|
98
126
|
|
|
99
|
-
|
|
127
|
+
Poll for elements, click buttons, extract data:
|
|
100
128
|
|
|
101
129
|
```bash
|
|
102
|
-
#
|
|
103
|
-
bdg cdp
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
#
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
#
|
|
111
|
-
|
|
112
|
-
# "sameSite": "Strict"
|
|
113
|
-
# }
|
|
114
|
-
# ]
|
|
115
|
-
# }
|
|
116
|
-
|
|
117
|
-
# Evaluate JavaScript
|
|
118
|
-
bdg cdp Runtime.evaluate --params '{"expression":"document.title","returnByValue":true}'
|
|
119
|
-
# {
|
|
120
|
-
# "result": {
|
|
121
|
-
# "type": "string",
|
|
122
|
-
# "value": "Example Domain"
|
|
123
|
-
# }
|
|
124
|
-
# }
|
|
125
|
-
|
|
126
|
-
# Get browser version
|
|
127
|
-
bdg cdp Browser.getVersion
|
|
128
|
-
# {
|
|
129
|
-
# "protocolVersion": "1.3",
|
|
130
|
-
# "product": "Chrome/142.0.7444.60",
|
|
131
|
-
# "jsVersion": "14.2.231.14"
|
|
132
|
-
# }
|
|
133
|
-
|
|
134
|
-
# Pipe to jq for filtering
|
|
135
|
-
bdg cdp Network.getCookies | jq '.cookies[] | select(.name == "session_id") | .value'
|
|
136
|
-
# "1234567890abcdef"
|
|
130
|
+
# Wait for an element to appear
|
|
131
|
+
while ! bdg cdp Runtime.evaluate --params '{"expression":"document.querySelector(\"#target\") !== null","returnByValue":true}' | jq -e '.result.value'; do
|
|
132
|
+
sleep 0.5
|
|
133
|
+
done
|
|
134
|
+
|
|
135
|
+
# Click it
|
|
136
|
+
bdg cdp Runtime.evaluate --params '{"expression":"document.querySelector(\"#target\").click()"}'
|
|
137
|
+
|
|
138
|
+
# Get the result
|
|
139
|
+
bdg cdp Runtime.evaluate --params '{"expression":"document.querySelector(\".result\").textContent","returnByValue":true}'
|
|
137
140
|
```
|
|
138
141
|
|
|
139
|
-
|
|
142
|
+
Check `.claude/skills/bdg/WORKFLOWS.md` for more complete examples (GitHub scraper, form automation, etc).
|
|
143
|
+
|
|
144
|
+
## Session Management
|
|
140
145
|
|
|
141
|
-
|
|
146
|
+
Sessions persist until you stop them. Chrome stays open, data keeps collecting:
|
|
142
147
|
|
|
143
148
|
```bash
|
|
144
|
-
#
|
|
145
|
-
bdg
|
|
149
|
+
bdg example.com # Opens Chrome, starts daemon
|
|
150
|
+
bdg status # Check what's running
|
|
151
|
+
bdg status --verbose # Show Chrome process details
|
|
152
|
+
bdg stop # Kill everything
|
|
153
|
+
bdg cleanup # Remove stale files
|
|
154
|
+
```
|
|
146
155
|
|
|
147
|
-
|
|
148
|
-
bdg status # Show session info
|
|
149
|
-
bdg status --verbose # Include Chrome diagnostics
|
|
156
|
+
## Helper Commands
|
|
150
157
|
|
|
151
|
-
|
|
152
|
-
bdg stop # Gracefully stop daemon and close Chrome
|
|
158
|
+
A few convenience wrappers for common operations. Most work still happens through `bdg cdp`:
|
|
153
159
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
bdg
|
|
160
|
+
```bash
|
|
161
|
+
# Query DOM
|
|
162
|
+
bdg dom query "button.primary" # Find elements
|
|
163
|
+
bdg dom get "button.primary" # Get HTML
|
|
164
|
+
bdg dom eval "document.title" # Run JavaScript
|
|
165
|
+
bdg dom highlight ".navbar" # Visual debugging
|
|
166
|
+
|
|
167
|
+
# Inspect collected data
|
|
168
|
+
bdg peek # Quick snapshot
|
|
169
|
+
bdg peek --network # Just network data
|
|
170
|
+
bdg tail # Stream like tail -f
|
|
157
171
|
```
|
|
158
172
|
|
|
159
|
-
##
|
|
173
|
+
## Page Readiness
|
|
160
174
|
|
|
161
|
-
`bdg`
|
|
162
|
-
When you run commands like `bdg network` or `bdg console`, they communicate with the
|
|
163
|
-
daemon via IPC, which forwards [Chrome DevTools
|
|
164
|
-
Protocol](https://chromedevtools.github.io/devtools-protocol/) commands and streams
|
|
165
|
-
responses back.
|
|
175
|
+
By default, `bdg` waits for pages to fully load using three signals:
|
|
166
176
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
- **WebSocket** – Direct connection to Chrome's `--remote-debugging-port`
|
|
171
|
-
- **CDP** – Native Chrome DevTools Protocol for all browser inspection
|
|
177
|
+
1. Browser's `window.onload` fires
|
|
178
|
+
2. Network goes quiet (200ms without new requests)
|
|
179
|
+
3. DOM stops changing (300ms without mutations)
|
|
172
180
|
|
|
173
|
-
|
|
174
|
-
- Sessions persist across commands (Chrome stays open)
|
|
175
|
-
- Live queries without stopping collection
|
|
176
|
-
- No intermediate files data flows from Chrome to stdout
|
|
177
|
-
- Real CDP with full protocol access
|
|
181
|
+
Catches server-rendered HTML, client hydration, and lazy-loaded content. Works with Next.js, React, Vue, whatever. Times out after 5 seconds if something hangs.
|
|
178
182
|
|
|
179
|
-
|
|
183
|
+
Skip it with `--no-wait` if you want immediate connection.
|
|
180
184
|
|
|
181
|
-
|
|
185
|
+
## Architecture
|
|
186
|
+
|
|
187
|
+
Three processes:
|
|
188
|
+
|
|
189
|
+
- **CLI** talks to daemon via Unix socket
|
|
190
|
+
- **Daemon** manages Chrome and routes commands
|
|
191
|
+
- **Worker** holds the WebSocket to CDP
|
|
192
|
+
|
|
193
|
+
Chrome stays running between commands. No startup cost for each operation.
|
|
194
|
+
|
|
195
|
+
## Contributing
|
|
182
196
|
|
|
183
|
-
|
|
184
|
-
([discussions](https://github.com/szymdzum/browser-debugger-cli/discussions)), let me
|
|
185
|
-
know what's broken
|
|
186
|
-
([issues](https://github.com/szymdzum/browser-debugger-cli/issues/new)).
|
|
197
|
+
If you use this and something breaks, [open an issue](https://github.com/szymdzum/browser-debugger-cli/issues/new). If you have ideas, start a [discussion](https://github.com/szymdzum/browser-debugger-cli/discussions). PRs welcome.
|
|
187
198
|
|
|
188
199
|
## License
|
|
189
200
|
|
|
190
|
-
MIT
|
|
201
|
+
MIT
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.2.1",
|
|
3
|
+
"success": true,
|
|
4
|
+
"timestamp": "2025-11-06T20:00:00.000Z",
|
|
5
|
+
"duration": 4500,
|
|
6
|
+
"target": {
|
|
7
|
+
"url": "https://example.com/",
|
|
8
|
+
"title": "Example Domain"
|
|
9
|
+
},
|
|
10
|
+
"data": {
|
|
11
|
+
"network": [
|
|
12
|
+
{
|
|
13
|
+
"requestId": "1000.1",
|
|
14
|
+
"url": "https://example.com/",
|
|
15
|
+
"method": "GET",
|
|
16
|
+
"timestamp": 1730923200000,
|
|
17
|
+
"status": 200,
|
|
18
|
+
"mimeType": "text/html",
|
|
19
|
+
"requestHeaders": {
|
|
20
|
+
"User-Agent": "Chrome/120.0.0.0"
|
|
21
|
+
},
|
|
22
|
+
"responseHeaders": {
|
|
23
|
+
"Content-Type": "text/html; charset=UTF-8"
|
|
24
|
+
},
|
|
25
|
+
"responseBody": "<!DOCTYPE html><html>...</html>"
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"console": [
|
|
29
|
+
{
|
|
30
|
+
"type": "log",
|
|
31
|
+
"text": "Page loaded",
|
|
32
|
+
"timestamp": 1730923201000,
|
|
33
|
+
"args": [
|
|
34
|
+
{
|
|
35
|
+
"type": "string",
|
|
36
|
+
"value": "Page loaded"
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"dom": {
|
|
42
|
+
"url": "https://example.com/",
|
|
43
|
+
"title": "Example Domain",
|
|
44
|
+
"outerHTML": "<!DOCTYPE html><html><head><title>Example Domain</title></head><body><h1>Example Domain</h1></body></html>"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema contract tests
|
|
3
|
+
*
|
|
4
|
+
* These tests lock the JSON schema shape to prevent breaking changes.
|
|
5
|
+
* Golden files define the expected structure that consumers depend on.
|
|
6
|
+
*
|
|
7
|
+
* Test philosophy:
|
|
8
|
+
* - Ensure all required fields are present with correct types
|
|
9
|
+
* - Detect unexpected fields (potential breaking changes)
|
|
10
|
+
* - Validate nested structure matches interface definitions
|
|
11
|
+
* - Test both success and error output formats
|
|
12
|
+
*
|
|
13
|
+
* When tests fail:
|
|
14
|
+
* 1. If adding optional fields → Update golden file, bump minor version
|
|
15
|
+
* 2. If changing existing fields → This is a BREAKING CHANGE, requires major version bump
|
|
16
|
+
* 3. If removing fields → This is a BREAKING CHANGE, requires major version bump
|
|
17
|
+
*/
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=schema.contract.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.contract.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/schema.contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema contract tests
|
|
3
|
+
*
|
|
4
|
+
* These tests lock the JSON schema shape to prevent breaking changes.
|
|
5
|
+
* Golden files define the expected structure that consumers depend on.
|
|
6
|
+
*
|
|
7
|
+
* Test philosophy:
|
|
8
|
+
* - Ensure all required fields are present with correct types
|
|
9
|
+
* - Detect unexpected fields (potential breaking changes)
|
|
10
|
+
* - Validate nested structure matches interface definitions
|
|
11
|
+
* - Test both success and error output formats
|
|
12
|
+
*
|
|
13
|
+
* When tests fail:
|
|
14
|
+
* 1. If adding optional fields → Update golden file, bump minor version
|
|
15
|
+
* 2. If changing existing fields → This is a BREAKING CHANGE, requires major version bump
|
|
16
|
+
* 3. If removing fields → This is a BREAKING CHANGE, requires major version bump
|
|
17
|
+
*/
|
|
18
|
+
import assert from 'node:assert/strict';
|
|
19
|
+
import fs from 'node:fs';
|
|
20
|
+
import path from 'node:path';
|
|
21
|
+
import { describe, it } from 'node:test';
|
|
22
|
+
import { fileURLToPath } from 'node:url';
|
|
23
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
24
|
+
const __dirname = path.dirname(__filename);
|
|
25
|
+
/**
|
|
26
|
+
* Load golden file from fixtures directory
|
|
27
|
+
*/
|
|
28
|
+
function loadGoldenFile(filename) {
|
|
29
|
+
const goldenPath = path.join(__dirname, 'fixtures', filename);
|
|
30
|
+
const content = fs.readFileSync(goldenPath, 'utf-8');
|
|
31
|
+
return JSON.parse(content);
|
|
32
|
+
}
|
|
33
|
+
describe('BdgOutput schema contract', () => {
|
|
34
|
+
describe('v0.2.1 schema', () => {
|
|
35
|
+
let golden;
|
|
36
|
+
it('should load golden file successfully', () => {
|
|
37
|
+
golden = loadGoldenFile('schema-v0.2.1.golden.json');
|
|
38
|
+
assert.ok(golden, 'Golden file should load');
|
|
39
|
+
});
|
|
40
|
+
it('should have all required top-level fields', () => {
|
|
41
|
+
golden = loadGoldenFile('schema-v0.2.1.golden.json');
|
|
42
|
+
// Required fields
|
|
43
|
+
assert.equal(typeof golden.version, 'string', 'version must be string');
|
|
44
|
+
assert.equal(typeof golden.success, 'boolean', 'success must be boolean');
|
|
45
|
+
assert.equal(typeof golden.timestamp, 'string', 'timestamp must be string');
|
|
46
|
+
assert.equal(typeof golden.duration, 'number', 'duration must be number');
|
|
47
|
+
assert.ok(golden.target, 'target must be present');
|
|
48
|
+
assert.ok(golden.data, 'data must be present');
|
|
49
|
+
// Validate ISO8601 timestamp format
|
|
50
|
+
assert.ok(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(golden.timestamp), 'timestamp must be ISO8601 format');
|
|
51
|
+
});
|
|
52
|
+
it('should have target structure with url and title', () => {
|
|
53
|
+
golden = loadGoldenFile('schema-v0.2.1.golden.json');
|
|
54
|
+
assert.equal(typeof golden.target.url, 'string', 'target.url must be string');
|
|
55
|
+
assert.equal(typeof golden.target.title, 'string', 'target.title must be string');
|
|
56
|
+
// Should not have extra fields
|
|
57
|
+
const targetKeys = Object.keys(golden.target);
|
|
58
|
+
assert.deepEqual(targetKeys.sort(), ['title', 'url'].sort(), 'target should only have url and title');
|
|
59
|
+
});
|
|
60
|
+
it('should have data object with optional telemetry arrays', () => {
|
|
61
|
+
golden = loadGoldenFile('schema-v0.2.1.golden.json');
|
|
62
|
+
assert.equal(typeof golden.data, 'object', 'data must be object');
|
|
63
|
+
// Validate network array if present
|
|
64
|
+
if (golden.data.network !== undefined) {
|
|
65
|
+
assert.ok(Array.isArray(golden.data.network), 'data.network must be array');
|
|
66
|
+
}
|
|
67
|
+
// Validate console array if present
|
|
68
|
+
if (golden.data.console !== undefined) {
|
|
69
|
+
assert.ok(Array.isArray(golden.data.console), 'data.console must be array');
|
|
70
|
+
}
|
|
71
|
+
// Validate dom object if present
|
|
72
|
+
if (golden.data.dom !== undefined) {
|
|
73
|
+
assert.equal(typeof golden.data.dom, 'object', 'data.dom must be object');
|
|
74
|
+
}
|
|
75
|
+
// Should only have known telemetry types
|
|
76
|
+
const dataKeys = Object.keys(golden.data);
|
|
77
|
+
const allowedKeys = ['network', 'console', 'dom'];
|
|
78
|
+
for (const key of dataKeys) {
|
|
79
|
+
assert.ok(allowedKeys.includes(key), `data.${key} is not a known telemetry type. Allowed: ${allowedKeys.join(', ')}`);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
it('should validate NetworkRequest structure', () => {
|
|
83
|
+
golden = loadGoldenFile('schema-v0.2.1.golden.json');
|
|
84
|
+
if (!golden.data.network || golden.data.network.length === 0) {
|
|
85
|
+
assert.fail('Golden file must have at least one network request for validation');
|
|
86
|
+
}
|
|
87
|
+
const request = golden.data.network[0];
|
|
88
|
+
// Required fields
|
|
89
|
+
assert.equal(typeof request.requestId, 'string', 'requestId must be string');
|
|
90
|
+
assert.equal(typeof request.url, 'string', 'url must be string');
|
|
91
|
+
assert.equal(typeof request.method, 'string', 'method must be string');
|
|
92
|
+
assert.equal(typeof request.timestamp, 'number', 'timestamp must be number');
|
|
93
|
+
// Optional fields with type validation
|
|
94
|
+
if (request.status !== undefined) {
|
|
95
|
+
assert.equal(typeof request.status, 'number', 'status must be number if present');
|
|
96
|
+
}
|
|
97
|
+
if (request.mimeType !== undefined) {
|
|
98
|
+
assert.equal(typeof request.mimeType, 'string', 'mimeType must be string if present');
|
|
99
|
+
}
|
|
100
|
+
if (request.requestHeaders !== undefined) {
|
|
101
|
+
assert.equal(typeof request.requestHeaders, 'object', 'requestHeaders must be object if present');
|
|
102
|
+
}
|
|
103
|
+
if (request.responseHeaders !== undefined) {
|
|
104
|
+
assert.equal(typeof request.responseHeaders, 'object', 'responseHeaders must be object if present');
|
|
105
|
+
}
|
|
106
|
+
if (request.requestBody !== undefined) {
|
|
107
|
+
assert.equal(typeof request.requestBody, 'string', 'requestBody must be string if present');
|
|
108
|
+
}
|
|
109
|
+
if (request.responseBody !== undefined) {
|
|
110
|
+
assert.equal(typeof request.responseBody, 'string', 'responseBody must be string if present');
|
|
111
|
+
}
|
|
112
|
+
// Validate no unexpected fields
|
|
113
|
+
const allowedKeys = [
|
|
114
|
+
'requestId',
|
|
115
|
+
'url',
|
|
116
|
+
'method',
|
|
117
|
+
'timestamp',
|
|
118
|
+
'status',
|
|
119
|
+
'mimeType',
|
|
120
|
+
'requestHeaders',
|
|
121
|
+
'responseHeaders',
|
|
122
|
+
'requestBody',
|
|
123
|
+
'responseBody',
|
|
124
|
+
];
|
|
125
|
+
const requestKeys = Object.keys(request);
|
|
126
|
+
for (const key of requestKeys) {
|
|
127
|
+
assert.ok(allowedKeys.includes(key), `NetworkRequest.${key} is not in schema. Allowed: ${allowedKeys.join(', ')}`);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
it('should validate ConsoleMessage structure', () => {
|
|
131
|
+
golden = loadGoldenFile('schema-v0.2.1.golden.json');
|
|
132
|
+
if (!golden.data.console || golden.data.console.length === 0) {
|
|
133
|
+
assert.fail('Golden file must have at least one console message for validation');
|
|
134
|
+
}
|
|
135
|
+
const message = golden.data.console[0];
|
|
136
|
+
// Required fields
|
|
137
|
+
assert.equal(typeof message.type, 'string', 'type must be string');
|
|
138
|
+
assert.equal(typeof message.text, 'string', 'text must be string');
|
|
139
|
+
assert.equal(typeof message.timestamp, 'number', 'timestamp must be number');
|
|
140
|
+
// Optional fields
|
|
141
|
+
if (message.args !== undefined) {
|
|
142
|
+
assert.ok(Array.isArray(message.args), 'args must be array if present');
|
|
143
|
+
}
|
|
144
|
+
// Validate no unexpected fields
|
|
145
|
+
const allowedKeys = ['type', 'text', 'timestamp', 'args'];
|
|
146
|
+
const messageKeys = Object.keys(message);
|
|
147
|
+
for (const key of messageKeys) {
|
|
148
|
+
assert.ok(allowedKeys.includes(key), `ConsoleMessage.${key} is not in schema. Allowed: ${allowedKeys.join(', ')}`);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
it('should validate DOMData structure', () => {
|
|
152
|
+
golden = loadGoldenFile('schema-v0.2.1.golden.json');
|
|
153
|
+
if (!golden.data.dom) {
|
|
154
|
+
assert.fail('Golden file must have dom data for validation');
|
|
155
|
+
}
|
|
156
|
+
const dom = golden.data.dom;
|
|
157
|
+
// Required fields
|
|
158
|
+
assert.equal(typeof dom.url, 'string', 'url must be string');
|
|
159
|
+
assert.equal(typeof dom.title, 'string', 'title must be string');
|
|
160
|
+
assert.equal(typeof dom.outerHTML, 'string', 'outerHTML must be string');
|
|
161
|
+
// Validate no unexpected fields
|
|
162
|
+
const allowedKeys = ['url', 'title', 'outerHTML'];
|
|
163
|
+
const domKeys = Object.keys(dom);
|
|
164
|
+
for (const key of domKeys) {
|
|
165
|
+
assert.ok(allowedKeys.includes(key), `DOMData.${key} is not in schema. Allowed: ${allowedKeys.join(', ')}`);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
it('should validate optional error field', () => {
|
|
169
|
+
golden = loadGoldenFile('schema-v0.2.1.golden.json');
|
|
170
|
+
// Error field is optional
|
|
171
|
+
if (golden.error !== undefined) {
|
|
172
|
+
assert.equal(typeof golden.error, 'string', 'error must be string if present');
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
it('should validate optional partial field', () => {
|
|
176
|
+
golden = loadGoldenFile('schema-v0.2.1.golden.json');
|
|
177
|
+
// Partial field is optional
|
|
178
|
+
if (golden.partial !== undefined) {
|
|
179
|
+
assert.equal(typeof golden.partial, 'boolean', 'partial must be boolean if present');
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
it('should detect unexpected top-level fields', () => {
|
|
183
|
+
golden = loadGoldenFile('schema-v0.2.1.golden.json');
|
|
184
|
+
const allowedTopLevelKeys = [
|
|
185
|
+
'version',
|
|
186
|
+
'success',
|
|
187
|
+
'timestamp',
|
|
188
|
+
'duration',
|
|
189
|
+
'target',
|
|
190
|
+
'data',
|
|
191
|
+
'error',
|
|
192
|
+
'partial',
|
|
193
|
+
];
|
|
194
|
+
const actualKeys = Object.keys(golden);
|
|
195
|
+
for (const key of actualKeys) {
|
|
196
|
+
assert.ok(allowedTopLevelKeys.includes(key), `Unexpected top-level field: ${key}. This may be a breaking change.`);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
describe('Error output format', () => {
|
|
201
|
+
it('should have success=false and error field on failure', () => {
|
|
202
|
+
const errorOutput = {
|
|
203
|
+
version: '0.2.1',
|
|
204
|
+
success: false,
|
|
205
|
+
timestamp: new Date().toISOString(),
|
|
206
|
+
duration: 1000,
|
|
207
|
+
target: { url: '', title: '' },
|
|
208
|
+
data: {},
|
|
209
|
+
error: 'Connection failed',
|
|
210
|
+
};
|
|
211
|
+
assert.equal(errorOutput.success, false, 'success must be false on error');
|
|
212
|
+
assert.equal(typeof errorOutput.error, 'string', 'error must be string');
|
|
213
|
+
assert.ok(errorOutput.error !== undefined, 'error must be defined');
|
|
214
|
+
assert.ok(errorOutput.error.length > 0, 'error message must not be empty');
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
describe('Partial output format', () => {
|
|
218
|
+
it('should have partial=true for live previews', () => {
|
|
219
|
+
const previewOutput = {
|
|
220
|
+
version: '0.2.1',
|
|
221
|
+
success: true,
|
|
222
|
+
timestamp: new Date().toISOString(),
|
|
223
|
+
duration: 1000,
|
|
224
|
+
target: { url: 'https://example.com', title: 'Example' },
|
|
225
|
+
data: {
|
|
226
|
+
network: [],
|
|
227
|
+
console: [],
|
|
228
|
+
},
|
|
229
|
+
partial: true,
|
|
230
|
+
};
|
|
231
|
+
assert.equal(previewOutput.partial, true, 'partial must be true for live previews');
|
|
232
|
+
assert.equal(previewOutput.success, true, 'success can be true with partial=true');
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
//# sourceMappingURL=schema.contract.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.contract.test.js","sourceRoot":"","sources":["../../src/__tests__/schema.contract.test.ts"],"names":[],"mappings":"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"}
|