browser-debugger-cli 0.6.9 → 0.6.11
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 +10 -0
- package/dist/commands/cdp.js +1 -1
- package/dist/commands/cdp.js.map +1 -1
- package/dist/commands/cleanup.js +1 -1
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/console.d.ts +4 -28
- package/dist/commands/console.d.ts.map +1 -1
- package/dist/commands/console.js +82 -192
- package/dist/commands/console.js.map +1 -1
- package/dist/commands/details.d.ts.map +1 -1
- package/dist/commands/details.js +27 -8
- package/dist/commands/details.js.map +1 -1
- package/dist/commands/dom/DomElementResolver.d.ts +25 -9
- package/dist/commands/dom/DomElementResolver.d.ts.map +1 -1
- package/dist/commands/dom/DomElementResolver.js +65 -17
- package/dist/commands/dom/DomElementResolver.js.map +1 -1
- package/dist/commands/dom/__tests__/screenshotResize.unit.test.d.ts +2 -0
- package/dist/commands/dom/__tests__/screenshotResize.unit.test.d.ts.map +1 -0
- package/dist/commands/dom/__tests__/screenshotResize.unit.test.js +184 -0
- package/dist/commands/dom/__tests__/screenshotResize.unit.test.js.map +1 -0
- package/dist/commands/dom/a11y.d.ts.map +1 -1
- package/dist/commands/dom/a11y.js +9 -9
- package/dist/commands/dom/a11y.js.map +1 -1
- package/dist/commands/dom/evalHelpers.d.ts.map +1 -1
- package/dist/commands/dom/evalHelpers.js +10 -7
- package/dist/commands/dom/evalHelpers.js.map +1 -1
- package/dist/commands/dom/formFillHelpers.d.ts +2 -1
- package/dist/commands/dom/formFillHelpers.d.ts.map +1 -1
- package/dist/commands/dom/formFillHelpers.js +22 -20
- package/dist/commands/dom/formFillHelpers.js.map +1 -1
- package/dist/commands/dom/formInteraction.d.ts.map +1 -1
- package/dist/commands/dom/formInteraction.js +26 -10
- package/dist/commands/dom/formInteraction.js.map +1 -1
- package/dist/commands/dom/formSubmitHelpers.d.ts +2 -1
- package/dist/commands/dom/formSubmitHelpers.d.ts.map +1 -1
- package/dist/commands/dom/formSubmitHelpers.js.map +1 -1
- package/dist/commands/dom/helpers.d.ts +47 -4
- package/dist/commands/dom/helpers.d.ts.map +1 -1
- package/dist/commands/dom/helpers.js +406 -21
- package/dist/commands/dom/helpers.js.map +1 -1
- package/dist/commands/dom/index.d.ts +1 -1
- package/dist/commands/dom/index.d.ts.map +1 -1
- package/dist/commands/dom/index.js +414 -151
- package/dist/commands/dom/index.js.map +1 -1
- package/dist/commands/dom/reactEventHelpers.d.ts +4 -4
- package/dist/commands/dom/reactEventHelpers.d.ts.map +1 -1
- package/dist/commands/dom/reactEventHelpers.js +11 -11
- package/dist/commands/dom/screenshotResize.d.ts +81 -0
- package/dist/commands/dom/screenshotResize.d.ts.map +1 -0
- package/dist/commands/dom/screenshotResize.js +103 -0
- package/dist/commands/dom/screenshotResize.js.map +1 -0
- package/dist/commands/helpJson.d.ts +20 -0
- package/dist/commands/helpJson.d.ts.map +1 -1
- package/dist/commands/helpJson.js +48 -39
- package/dist/commands/helpJson.js.map +1 -1
- package/dist/commands/network/har.d.ts.map +1 -1
- package/dist/commands/network/har.js +3 -2
- package/dist/commands/network/har.js.map +1 -1
- package/dist/commands/network/list.d.ts +0 -8
- package/dist/commands/network/list.d.ts.map +1 -1
- package/dist/commands/network/list.js +134 -208
- package/dist/commands/network/list.js.map +1 -1
- package/dist/commands/network/shared.d.ts.map +1 -1
- package/dist/commands/network/shared.js +6 -0
- package/dist/commands/network/shared.js.map +1 -1
- package/dist/commands/optionBehaviors.d.ts +26 -0
- package/dist/commands/optionBehaviors.d.ts.map +1 -0
- package/dist/commands/optionBehaviors.js +184 -0
- package/dist/commands/optionBehaviors.js.map +1 -0
- package/dist/commands/peek.d.ts +2 -4
- package/dist/commands/peek.d.ts.map +1 -1
- package/dist/commands/peek.js +109 -97
- package/dist/commands/peek.js.map +1 -1
- package/dist/commands/shared/CommandRunner.js +1 -1
- package/dist/commands/shared/CommandRunner.js.map +1 -1
- package/dist/commands/shared/dataFetcher.d.ts +58 -0
- package/dist/commands/shared/dataFetcher.d.ts.map +1 -0
- package/dist/commands/shared/dataFetcher.js +98 -0
- package/dist/commands/shared/dataFetcher.js.map +1 -0
- package/dist/commands/shared/followMode.d.ts +50 -0
- package/dist/commands/shared/followMode.d.ts.map +1 -0
- package/dist/commands/shared/followMode.js +58 -0
- package/dist/commands/shared/followMode.js.map +1 -0
- package/dist/commands/shared/optionTypes.d.ts +18 -4
- package/dist/commands/shared/optionTypes.d.ts.map +1 -1
- package/dist/commands/shared/startHelpers.d.ts.map +1 -1
- package/dist/commands/shared/startHelpers.js +6 -5
- package/dist/commands/shared/startHelpers.js.map +1 -1
- package/dist/commands/shared/validation.d.ts +0 -45
- package/dist/commands/shared/validation.d.ts.map +1 -1
- package/dist/commands/shared/validation.js +65 -107
- package/dist/commands/shared/validation.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +18 -9
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +15 -4
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/tail.d.ts +2 -7
- package/dist/commands/tail.d.ts.map +1 -1
- package/dist/commands/tail.js +67 -79
- package/dist/commands/tail.js.map +1 -1
- package/dist/commands/types.d.ts +11 -5
- package/dist/commands/types.d.ts.map +1 -1
- package/dist/connection/cdp.d.ts.map +1 -1
- package/dist/connection/cdp.js +5 -3
- package/dist/connection/cdp.js.map +1 -1
- package/dist/connection/diagnostics.d.ts +9 -0
- package/dist/connection/diagnostics.d.ts.map +1 -1
- package/dist/connection/diagnostics.js +14 -1
- package/dist/connection/diagnostics.js.map +1 -1
- package/dist/connection/errors.d.ts +0 -7
- package/dist/connection/errors.d.ts.map +1 -1
- package/dist/connection/errors.js +0 -7
- package/dist/connection/errors.js.map +1 -1
- package/dist/connection/handlers.d.ts +1 -8
- package/dist/connection/handlers.d.ts.map +1 -1
- package/dist/connection/handlers.js.map +1 -1
- package/dist/connection/launcher/binaryResolver.d.ts.map +1 -1
- package/dist/connection/launcher/binaryResolver.js +3 -15
- package/dist/connection/launcher/binaryResolver.js.map +1 -1
- package/dist/connection/launcher/preferencesLoader.d.ts.map +1 -1
- package/dist/connection/launcher/preferencesLoader.js +2 -1
- package/dist/connection/launcher/preferencesLoader.js.map +1 -1
- package/dist/connection/launcher.d.ts.map +1 -1
- package/dist/connection/launcher.js +5 -16
- package/dist/connection/launcher.js.map +1 -1
- package/dist/connection/pageReadiness.d.ts.map +1 -1
- package/dist/connection/pageReadiness.js +13 -16
- package/dist/connection/pageReadiness.js.map +1 -1
- package/dist/connection/typed-cdp.d.ts +3 -5
- package/dist/connection/typed-cdp.d.ts.map +1 -1
- package/dist/connection/typed-cdp.js +1 -1
- package/dist/connection/typed-cdp.js.map +1 -1
- package/dist/daemon/handlers/BaseHandler.d.ts.map +1 -1
- package/dist/daemon/handlers/BaseHandler.js +1 -1
- package/dist/daemon/handlers/BaseHandler.js.map +1 -1
- package/dist/daemon/handlers/QueryHandlers.d.ts.map +1 -1
- package/dist/daemon/handlers/QueryHandlers.js +1 -1
- package/dist/daemon/handlers/QueryHandlers.js.map +1 -1
- package/dist/daemon/handlers/SessionHandlers.d.ts.map +1 -1
- package/dist/daemon/handlers/SessionHandlers.js +1 -1
- package/dist/daemon/handlers/SessionHandlers.js.map +1 -1
- package/dist/daemon/handlers/responseHandler.d.ts.map +1 -1
- package/dist/daemon/handlers/responseHandler.js +10 -0
- package/dist/daemon/handlers/responseHandler.js.map +1 -1
- package/dist/daemon/ipcServer.js +1 -1
- package/dist/daemon/ipcServer.js.map +1 -1
- package/dist/daemon/launcher.d.ts.map +1 -1
- package/dist/daemon/launcher.js +3 -2
- package/dist/daemon/launcher.js.map +1 -1
- package/dist/daemon/lifecycle/signalHandlers.d.ts.map +1 -1
- package/dist/daemon/lifecycle/signalHandlers.js +1 -1
- package/dist/daemon/lifecycle/signalHandlers.js.map +1 -1
- package/dist/daemon/lifecycle/workerCleanup.d.ts.map +1 -1
- package/dist/daemon/lifecycle/workerCleanup.js +4 -3
- package/dist/daemon/lifecycle/workerCleanup.js.map +1 -1
- package/dist/daemon/lifecycle/workerConfig.d.ts.map +1 -1
- package/dist/daemon/lifecycle/workerConfig.js +1 -1
- package/dist/daemon/lifecycle/workerConfig.js.map +1 -1
- package/dist/daemon/lifecycle/workerIpc.d.ts.map +1 -1
- package/dist/daemon/lifecycle/workerIpc.js +1 -1
- package/dist/daemon/lifecycle/workerIpc.js.map +1 -1
- package/dist/daemon/server/JsonlParser.d.ts.map +1 -1
- package/dist/daemon/server/JsonlParser.js +1 -1
- package/dist/daemon/server/JsonlParser.js.map +1 -1
- package/dist/daemon/startSession.d.ts.map +1 -1
- package/dist/daemon/startSession.js +1 -1
- package/dist/daemon/startSession.js.map +1 -1
- package/dist/daemon/worker/TelemetryStore.d.ts +2 -1
- package/dist/daemon/worker/TelemetryStore.d.ts.map +1 -1
- package/dist/daemon/worker/TelemetryStore.js +4 -0
- package/dist/daemon/worker/TelemetryStore.js.map +1 -1
- package/dist/daemon/worker/plugins.d.ts.map +1 -1
- package/dist/daemon/worker/plugins.js +9 -2
- package/dist/daemon/worker/plugins.js.map +1 -1
- package/dist/index.js +23 -7
- package/dist/index.js.map +1 -1
- package/dist/ipc/utils/errors.js +1 -1
- package/dist/ipc/utils/errors.js.map +1 -1
- package/dist/session/QueryCacheManager.d.ts.map +1 -1
- package/dist/session/QueryCacheManager.js +1 -1
- package/dist/session/QueryCacheManager.js.map +1 -1
- package/dist/session/chrome.js +1 -1
- package/dist/session/chrome.js.map +1 -1
- package/dist/session/cleanup.js +5 -5
- package/dist/session/cleanup.js.map +1 -1
- package/dist/session/lock.js +1 -1
- package/dist/session/lock.js.map +1 -1
- package/dist/session/metadata.d.ts.map +1 -1
- package/dist/session/metadata.js +1 -1
- package/dist/session/metadata.js.map +1 -1
- package/dist/session/pid.js +1 -1
- package/dist/session/pid.js.map +1 -1
- package/dist/telemetry/dom.d.ts.map +1 -1
- package/dist/telemetry/dom.js +1 -1
- package/dist/telemetry/dom.js.map +1 -1
- package/dist/telemetry/filterPresets.d.ts.map +1 -1
- package/dist/telemetry/filterPresets.js +5 -2
- package/dist/telemetry/filterPresets.js.map +1 -1
- package/dist/telemetry/navigation.d.ts.map +1 -1
- package/dist/telemetry/navigation.js +7 -0
- package/dist/telemetry/navigation.js.map +1 -1
- package/dist/telemetry/network.d.ts +12 -1
- package/dist/telemetry/network.d.ts.map +1 -1
- package/dist/telemetry/network.js +117 -1
- package/dist/telemetry/network.js.map +1 -1
- package/dist/types.d.ts +148 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +33 -1
- package/dist/types.js.map +1 -1
- package/dist/ui/OutputBuilder.d.ts +2 -44
- package/dist/ui/OutputBuilder.d.ts.map +1 -1
- package/dist/ui/OutputBuilder.js +71 -103
- package/dist/ui/OutputBuilder.js.map +1 -1
- package/dist/ui/errors/CommandError.d.ts +0 -2
- package/dist/ui/errors/CommandError.d.ts.map +1 -1
- package/dist/ui/errors/CommandError.js.map +1 -1
- package/dist/ui/formatters/dom.d.ts +10 -30
- package/dist/ui/formatters/dom.d.ts.map +1 -1
- package/dist/ui/formatters/dom.js +13 -36
- package/dist/ui/formatters/dom.js.map +1 -1
- package/dist/ui/logging/logger.d.ts +1 -1
- package/dist/ui/logging/logger.d.ts.map +1 -1
- package/dist/ui/logging/logger.js +1 -1
- package/dist/ui/logging/logger.js.map +1 -1
- package/dist/ui/messages/dom.d.ts +14 -0
- package/dist/ui/messages/dom.d.ts.map +1 -0
- package/dist/ui/messages/dom.js +28 -0
- package/dist/ui/messages/dom.js.map +1 -0
- package/dist/ui/messages/errors.d.ts +83 -0
- package/dist/ui/messages/errors.d.ts.map +1 -1
- package/dist/ui/messages/errors.js +171 -0
- package/dist/ui/messages/errors.js.map +1 -1
- package/dist/utils/async.d.ts +10 -0
- package/dist/utils/async.d.ts.map +1 -0
- package/dist/utils/async.js +12 -0
- package/dist/utils/async.js.map +1 -0
- package/dist/utils/atomicFile.js +1 -1
- package/dist/utils/atomicFile.js.map +1 -1
- package/dist/utils/errorMapping.d.ts.map +1 -1
- package/dist/utils/errorMapping.js +4 -1
- package/dist/utils/errorMapping.js.map +1 -1
- package/dist/utils/exitCodes.d.ts +17 -16
- package/dist/utils/exitCodes.d.ts.map +1 -1
- package/dist/utils/exitCodes.js +86 -16
- package/dist/utils/exitCodes.js.map +1 -1
- package/dist/utils/suggestions.d.ts +19 -0
- package/dist/utils/suggestions.d.ts.map +1 -0
- package/dist/utils/suggestions.js +34 -0
- package/dist/utils/suggestions.js.map +1 -0
- package/dist/utils/taskMappings.d.ts.map +1 -1
- package/dist/utils/taskMappings.js +35 -0
- package/dist/utils/taskMappings.js.map +1 -1
- package/dist/utils/typeGuards.d.ts +11 -4
- package/dist/utils/typeGuards.d.ts.map +1 -1
- package/dist/utils/typeGuards.js +1 -17
- package/dist/utils/typeGuards.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared data fetching utilities for commands that query daemon state.
|
|
3
|
+
*/
|
|
4
|
+
import { getPeek } from '../../ipc/client.js';
|
|
5
|
+
import { validateIPCResponse } from '../../ipc/index.js';
|
|
6
|
+
import { createLogger } from '../../ui/logging/index.js';
|
|
7
|
+
import { getExitCodeForConnectionError } from '../../utils/errorMapping.js';
|
|
8
|
+
import { getErrorMessage } from '../../utils/errors.js';
|
|
9
|
+
import { EXIT_CODES } from '../../utils/exitCodes.js';
|
|
10
|
+
const log = createLogger('fetcher');
|
|
11
|
+
/**
|
|
12
|
+
* Fetch raw preview output from daemon.
|
|
13
|
+
*/
|
|
14
|
+
export async function fetchPreviewOutput(lastN) {
|
|
15
|
+
log.debug(`Fetching preview output${lastN !== undefined ? ` (lastN: ${lastN})` : ''}`);
|
|
16
|
+
const response = await getPeek(lastN !== undefined ? { lastN } : undefined);
|
|
17
|
+
try {
|
|
18
|
+
validateIPCResponse(response);
|
|
19
|
+
}
|
|
20
|
+
catch (validationError) {
|
|
21
|
+
const errorMsg = getErrorMessage(validationError);
|
|
22
|
+
const exitCode = getExitCodeForConnectionError(errorMsg);
|
|
23
|
+
log.debug(`IPC validation failed: ${errorMsg}`);
|
|
24
|
+
return { success: false, error: errorMsg, exitCode };
|
|
25
|
+
}
|
|
26
|
+
const output = response.data?.preview;
|
|
27
|
+
if (!output) {
|
|
28
|
+
log.debug('No preview data in response');
|
|
29
|
+
return {
|
|
30
|
+
success: false,
|
|
31
|
+
error: 'No preview data in response',
|
|
32
|
+
exitCode: EXIT_CODES.SESSION_FILE_ERROR,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
log.debug('Preview output fetched successfully');
|
|
36
|
+
return { success: true, data: output };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Fetch preview data with parsed network and console arrays.
|
|
40
|
+
*/
|
|
41
|
+
export async function fetchPreviewData(lastN) {
|
|
42
|
+
const result = await fetchPreviewOutput(lastN);
|
|
43
|
+
if (!result.success)
|
|
44
|
+
return result;
|
|
45
|
+
return {
|
|
46
|
+
success: true,
|
|
47
|
+
data: {
|
|
48
|
+
output: result.data,
|
|
49
|
+
network: result.data.data.network ?? [],
|
|
50
|
+
console: result.data.data.console ?? [],
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Fetch network requests from daemon.
|
|
56
|
+
*/
|
|
57
|
+
export async function fetchNetworkRequests() {
|
|
58
|
+
const result = await fetchPreviewData();
|
|
59
|
+
if (!result.success)
|
|
60
|
+
return result;
|
|
61
|
+
return { success: true, data: result.data.network };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Fetch console messages from daemon.
|
|
65
|
+
*/
|
|
66
|
+
export async function fetchConsoleMessages() {
|
|
67
|
+
const result = await fetchPreviewData(0);
|
|
68
|
+
if (!result.success)
|
|
69
|
+
return result;
|
|
70
|
+
return { success: true, data: result.data.console };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create error result for daemon not running.
|
|
74
|
+
*/
|
|
75
|
+
export function createDaemonNotRunningError() {
|
|
76
|
+
return {
|
|
77
|
+
success: false,
|
|
78
|
+
error: 'Daemon not running',
|
|
79
|
+
exitCode: EXIT_CODES.RESOURCE_NOT_FOUND,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Create command result with suggestion.
|
|
84
|
+
*
|
|
85
|
+
* @param error - Error message
|
|
86
|
+
* @param exitCode - Exit code for the error
|
|
87
|
+
* @param suggestion - Suggestion text for the user
|
|
88
|
+
* @returns Error result object
|
|
89
|
+
*/
|
|
90
|
+
export function createErrorResult(error, exitCode, suggestion = 'Start a session with: bdg <url>') {
|
|
91
|
+
return {
|
|
92
|
+
success: false,
|
|
93
|
+
error,
|
|
94
|
+
exitCode,
|
|
95
|
+
errorContext: { suggestion },
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=dataFetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataFetcher.js","sourceRoot":"","sources":["../../../src/commands/shared/dataFetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for follow/watch mode in commands.
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified pattern for commands that continuously poll
|
|
5
|
+
* and display updates (like tail -f behavior).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Options for configuring follow mode behavior.
|
|
9
|
+
*/
|
|
10
|
+
export interface FollowModeOptions {
|
|
11
|
+
/** Function that returns the "started following" message */
|
|
12
|
+
startMessage: () => string;
|
|
13
|
+
/** Function that returns the "stopped following" message */
|
|
14
|
+
stopMessage: () => string;
|
|
15
|
+
/** Polling interval in milliseconds (default: 1000) */
|
|
16
|
+
intervalMs?: number;
|
|
17
|
+
/** Handle EPIPE errors gracefully (for piped output) */
|
|
18
|
+
handleEpipe?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Sets up follow mode with periodic refresh and graceful shutdown.
|
|
22
|
+
*
|
|
23
|
+
* This helper eliminates duplicated follow-mode setup code across commands.
|
|
24
|
+
* It handles:
|
|
25
|
+
* - Initial display of start message
|
|
26
|
+
* - First refresh call (awaited)
|
|
27
|
+
* - Periodic interval-based refresh
|
|
28
|
+
* - SIGINT handler for graceful shutdown
|
|
29
|
+
* - Optional EPIPE handling for piped output
|
|
30
|
+
*
|
|
31
|
+
* @param refreshFn - Async function to call on each refresh cycle
|
|
32
|
+
* @param options - Configuration options for follow mode
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* setupFollowMode(
|
|
37
|
+
* async () => {
|
|
38
|
+
* const data = await fetchData();
|
|
39
|
+
* displayData(data);
|
|
40
|
+
* },
|
|
41
|
+
* {
|
|
42
|
+
* startMessage: () => followingPreviewMessage(),
|
|
43
|
+
* stopMessage: () => stoppedFollowingPreviewMessage(),
|
|
44
|
+
* intervalMs: 1000,
|
|
45
|
+
* }
|
|
46
|
+
* );
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function setupFollowMode(refreshFn: () => Promise<void>, options: FollowModeOptions): Promise<void>;
|
|
50
|
+
//# sourceMappingURL=followMode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"followMode.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/followMode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAC9B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAwBf"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for follow/watch mode in commands.
|
|
3
|
+
*
|
|
4
|
+
* Provides a unified pattern for commands that continuously poll
|
|
5
|
+
* and display updates (like tail -f behavior).
|
|
6
|
+
*/
|
|
7
|
+
import { EXIT_CODES } from '../../utils/exitCodes.js';
|
|
8
|
+
/**
|
|
9
|
+
* Sets up follow mode with periodic refresh and graceful shutdown.
|
|
10
|
+
*
|
|
11
|
+
* This helper eliminates duplicated follow-mode setup code across commands.
|
|
12
|
+
* It handles:
|
|
13
|
+
* - Initial display of start message
|
|
14
|
+
* - First refresh call (awaited)
|
|
15
|
+
* - Periodic interval-based refresh
|
|
16
|
+
* - SIGINT handler for graceful shutdown
|
|
17
|
+
* - Optional EPIPE handling for piped output
|
|
18
|
+
*
|
|
19
|
+
* @param refreshFn - Async function to call on each refresh cycle
|
|
20
|
+
* @param options - Configuration options for follow mode
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* setupFollowMode(
|
|
25
|
+
* async () => {
|
|
26
|
+
* const data = await fetchData();
|
|
27
|
+
* displayData(data);
|
|
28
|
+
* },
|
|
29
|
+
* {
|
|
30
|
+
* startMessage: () => followingPreviewMessage(),
|
|
31
|
+
* stopMessage: () => stoppedFollowingPreviewMessage(),
|
|
32
|
+
* intervalMs: 1000,
|
|
33
|
+
* }
|
|
34
|
+
* );
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export async function setupFollowMode(refreshFn, options) {
|
|
38
|
+
const { startMessage, stopMessage, intervalMs = 1000, handleEpipe = false } = options;
|
|
39
|
+
console.error(startMessage());
|
|
40
|
+
await refreshFn();
|
|
41
|
+
const intervalId = setInterval(() => {
|
|
42
|
+
void refreshFn();
|
|
43
|
+
}, intervalMs);
|
|
44
|
+
process.on('SIGINT', () => {
|
|
45
|
+
clearInterval(intervalId);
|
|
46
|
+
console.error(stopMessage());
|
|
47
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
48
|
+
});
|
|
49
|
+
if (handleEpipe) {
|
|
50
|
+
process.stdout.on('error', (err) => {
|
|
51
|
+
if (err.code === 'EPIPE') {
|
|
52
|
+
clearInterval(intervalId);
|
|
53
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=followMode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"followMode.js","sourceRoot":"","sources":["../../../src/commands/shared/followMode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAgBlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAA8B,EAC9B,OAA0B;IAE1B,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,GAAG,IAAI,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAEtF,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IAC9B,MAAM,SAAS,EAAE,CAAC;IAElB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,KAAK,SAAS,EAAE,CAAC;IACnB,CAAC,EAAE,UAAU,CAAC,CAAC;IAEf,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YACxD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACzB,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -36,7 +36,7 @@ export interface VerboseOptions {
|
|
|
36
36
|
* Used by DOM interaction commands (fill, click, submit, pressKey).
|
|
37
37
|
*/
|
|
38
38
|
export interface IndexOptions {
|
|
39
|
-
/**
|
|
39
|
+
/** 0-based index for selecting nth element matching selector */
|
|
40
40
|
index?: number;
|
|
41
41
|
}
|
|
42
42
|
/**
|
|
@@ -70,7 +70,7 @@ export interface RawOptions {
|
|
|
70
70
|
export interface SelectionOptions {
|
|
71
71
|
/** Select all matching elements */
|
|
72
72
|
all?: boolean;
|
|
73
|
-
/** Select nth element (
|
|
73
|
+
/** Select nth element (0-based) */
|
|
74
74
|
nth?: number;
|
|
75
75
|
/** Use specific nodeId directly */
|
|
76
76
|
nodeId?: number;
|
|
@@ -85,6 +85,20 @@ export interface ScreenshotOptions {
|
|
|
85
85
|
quality?: number;
|
|
86
86
|
/** Capture full page vs viewport only */
|
|
87
87
|
fullPage?: boolean;
|
|
88
|
+
/** CSS selector for element capture */
|
|
89
|
+
selector?: string;
|
|
90
|
+
/** Cached element index (0-based) from previous query */
|
|
91
|
+
index?: number;
|
|
92
|
+
/** Continuous capture mode to directory */
|
|
93
|
+
follow?: boolean;
|
|
94
|
+
/** Capture interval in ms for follow mode (string from CLI) */
|
|
95
|
+
interval?: string;
|
|
96
|
+
/** Max frames for follow mode (string from CLI) */
|
|
97
|
+
limit?: string;
|
|
98
|
+
/** Auto-resize enabled (--no-resize sets to false via Commander.js convention) */
|
|
99
|
+
resize?: boolean;
|
|
100
|
+
/** Scroll element into view before capture */
|
|
101
|
+
scroll?: string;
|
|
88
102
|
}
|
|
89
103
|
/**
|
|
90
104
|
* Options for key press commands.
|
|
@@ -225,8 +239,8 @@ import type { ConsoleLevel } from '../../types.js';
|
|
|
225
239
|
* By default shows only current navigation; use --history for all.
|
|
226
240
|
*/
|
|
227
241
|
export interface ConsoleCommandOptions extends BaseOptions {
|
|
228
|
-
/** Show last N messages (0 = all, default: 100) */
|
|
229
|
-
last
|
|
242
|
+
/** Show last N messages (string from CLI, 0 = all, default: 100) */
|
|
243
|
+
last?: string;
|
|
230
244
|
/** List all messages chronologically (default: smart summary) */
|
|
231
245
|
list?: boolean;
|
|
232
246
|
/** Stream console messages in real-time */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optionTypes.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/optionTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0BAA0B;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,qDAAqD;IACrD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,yCAAyC;IACzC,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mCAAmC;IACnC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,mCAAmC;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"optionTypes.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/optionTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startHelpers.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/startHelpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"startHelpers.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/startHelpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAI5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAehD;;;;;;;;;;;;GAYG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,aAAa,EAAE,GACzB,OAAO,CAAC,IAAI,CAAC,CAsDf"}
|
|
@@ -5,12 +5,13 @@
|
|
|
5
5
|
* Handles IPC communication with daemon to start browser sessions.
|
|
6
6
|
*/
|
|
7
7
|
import { landingPage } from '../../commands/shared/landingPage.js';
|
|
8
|
-
import { getErrorMessage } from '../../connection/errors.js';
|
|
9
8
|
import { startSession as sendStartSessionRequest } from '../../ipc/client.js';
|
|
10
9
|
import { IPCErrorCode } from '../../ipc/index.js';
|
|
11
10
|
import { isConnectionError } from '../../ipc/utils/errors.js';
|
|
12
11
|
import { createLogger } from '../../ui/logging/index.js';
|
|
13
12
|
import { sessionAlreadyRunningError, daemonNotRunningError, invalidResponseError, genericError, } from '../../ui/messages/errors.js';
|
|
13
|
+
import { getExitCodeForIPCError } from '../../utils/errorMapping.js';
|
|
14
|
+
import { getErrorMessage } from '../../utils/errors.js';
|
|
14
15
|
import { EXIT_CODES } from '../../utils/exitCodes.js';
|
|
15
16
|
import { filterDefined } from '../../utils/objects.js';
|
|
16
17
|
const log = createLogger('bdg');
|
|
@@ -49,12 +50,12 @@ export async function startSessionViaDaemon(url, options, telemetry) {
|
|
|
49
50
|
else {
|
|
50
51
|
console.error(genericError(`Daemon error: ${response.message ?? 'Unknown error'}`));
|
|
51
52
|
}
|
|
52
|
-
process.exit(
|
|
53
|
+
process.exit(getExitCodeForIPCError(response.errorCode));
|
|
53
54
|
}
|
|
54
55
|
const { data } = response;
|
|
55
56
|
if (!data) {
|
|
56
57
|
console.error(invalidResponseError('missing data'));
|
|
57
|
-
process.exit(EXIT_CODES.
|
|
58
|
+
process.exit(EXIT_CODES.SOFTWARE_ERROR);
|
|
58
59
|
}
|
|
59
60
|
if (options.quiet) {
|
|
60
61
|
console.error(`Session started: ${data.targetUrl}`);
|
|
@@ -70,10 +71,10 @@ export async function startSessionViaDaemon(url, options, telemetry) {
|
|
|
70
71
|
catch (error) {
|
|
71
72
|
if (isConnectionError(error)) {
|
|
72
73
|
console.error(daemonNotRunningError({ suggestStatus: true, suggestRetry: true }));
|
|
73
|
-
process.exit(EXIT_CODES.
|
|
74
|
+
process.exit(EXIT_CODES.RESOURCE_NOT_FOUND);
|
|
74
75
|
}
|
|
75
76
|
console.error(genericError(getErrorMessage(error)));
|
|
76
|
-
process.exit(EXIT_CODES.
|
|
77
|
+
process.exit(EXIT_CODES.SOFTWARE_ERROR);
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
//# sourceMappingURL=startHelpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startHelpers.js","sourceRoot":"","sources":["../../../src/commands/shared/startHelpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE/D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"startHelpers.js","sourceRoot":"","sources":["../../../src/commands/shared/startHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,63 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Validation layer for command options.
|
|
3
|
-
*
|
|
4
|
-
* Provides centralized validation with type safety and consistent error messages.
|
|
5
|
-
* Eliminates scattered validation logic across commands.
|
|
6
3
|
*/
|
|
7
4
|
import type { Protocol } from '../../connection/typed-cdp.js';
|
|
8
|
-
/**
|
|
9
|
-
* Base validation rule interface
|
|
10
|
-
*/
|
|
11
5
|
export interface ValidationRule<T> {
|
|
12
|
-
/** Validate and transform the value */
|
|
13
6
|
validate: (value: unknown) => T;
|
|
14
|
-
/** Optional custom error message */
|
|
15
7
|
errorMessage?: (value: unknown) => string;
|
|
16
8
|
}
|
|
17
|
-
/**
|
|
18
|
-
* Validation options for integer rules
|
|
19
|
-
*/
|
|
20
9
|
export interface IntegerRuleOptions {
|
|
21
|
-
/** Minimum allowed value */
|
|
22
10
|
min?: number;
|
|
23
|
-
/** Maximum allowed value */
|
|
24
11
|
max?: number;
|
|
25
|
-
/** Default value if not provided */
|
|
26
12
|
default?: number;
|
|
27
|
-
/** Whether the field is required */
|
|
28
13
|
required?: boolean;
|
|
29
|
-
/** Allow 0 to represent "all items" or unlimited */
|
|
30
14
|
allowZeroForAll?: boolean;
|
|
31
15
|
}
|
|
32
|
-
/**
|
|
33
|
-
* Create a positive integer validation rule
|
|
34
|
-
*
|
|
35
|
-
* @param options - Validation constraints
|
|
36
|
-
* @returns Validation rule that parses and validates integers
|
|
37
|
-
*
|
|
38
|
-
* @example
|
|
39
|
-
* ```typescript
|
|
40
|
-
* const rules = {
|
|
41
|
-
* last: positiveIntRule({ min: 1, max: 1000, default: 10 }),
|
|
42
|
-
* timeout: positiveIntRule({ min: 1, max: 3600, required: false }),
|
|
43
|
-
* };
|
|
44
|
-
* ```
|
|
45
|
-
*/
|
|
46
16
|
export declare function positiveIntRule(options?: IntegerRuleOptions): ValidationRule<number>;
|
|
47
|
-
/**
|
|
48
|
-
* Create a resource type validation rule for comma-separated type filters.
|
|
49
|
-
* Performs case-insensitive matching and normalization.
|
|
50
|
-
*
|
|
51
|
-
* @returns Validation rule that parses and validates resource types
|
|
52
|
-
*
|
|
53
|
-
* @example
|
|
54
|
-
* ```typescript
|
|
55
|
-
* const rules = {
|
|
56
|
-
* type: resourceTypeRule(),
|
|
57
|
-
* };
|
|
58
|
-
* const validated = validateOptions(options, rules);
|
|
59
|
-
* // Input: "document,xhr" → Output: ["Document", "XHR"]
|
|
60
|
-
* ```
|
|
61
|
-
*/
|
|
62
17
|
export declare function resourceTypeRule(): ValidationRule<Protocol.Network.ResourceType[]>;
|
|
63
18
|
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/validation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAM1D,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,CAAC;IAChC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAqFD,wBAAgB,eAAe,CAAC,OAAO,GAAE,kBAAuB,GAAG,cAAc,CAAC,MAAM,CAAC,CAIxF;AAwCD,wBAAgB,gBAAgB,IAAI,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAyBlF"}
|
|
@@ -1,72 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Validation layer for command options.
|
|
3
|
-
*
|
|
4
|
-
* Provides centralized validation with type safety and consistent error messages.
|
|
5
|
-
* Eliminates scattered validation logic across commands.
|
|
6
3
|
*/
|
|
7
4
|
import { CommandError } from '../../ui/errors/index.js';
|
|
8
5
|
import { invalidIntegerError } from '../../ui/messages/validation.js';
|
|
9
6
|
import { EXIT_CODES } from '../../utils/exitCodes.js';
|
|
10
|
-
|
|
11
|
-
* Create a positive integer validation rule
|
|
12
|
-
*
|
|
13
|
-
* @param options - Validation constraints
|
|
14
|
-
* @returns Validation rule that parses and validates integers
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* const rules = {
|
|
19
|
-
* last: positiveIntRule({ min: 1, max: 1000, default: 10 }),
|
|
20
|
-
* timeout: positiveIntRule({ min: 1, max: 3600, required: false }),
|
|
21
|
-
* };
|
|
22
|
-
* ```
|
|
23
|
-
*/
|
|
24
|
-
export function positiveIntRule(options = {}) {
|
|
25
|
-
const { min, max, default: defaultValue, required = true, allowZeroForAll = false } = options;
|
|
26
|
-
return {
|
|
27
|
-
validate: (value) => {
|
|
28
|
-
if (value === undefined || value === null) {
|
|
29
|
-
if (defaultValue !== undefined) {
|
|
30
|
-
return defaultValue;
|
|
31
|
-
}
|
|
32
|
-
if (!required) {
|
|
33
|
-
return 0;
|
|
34
|
-
}
|
|
35
|
-
throw new CommandError('Value is required', {}, EXIT_CODES.INVALID_ARGUMENTS);
|
|
36
|
-
}
|
|
37
|
-
if (typeof value !== 'string' && typeof value !== 'number') {
|
|
38
|
-
throw new CommandError(`Value must be a number, got ${typeof value}`, {}, EXIT_CODES.INVALID_ARGUMENTS);
|
|
39
|
-
}
|
|
40
|
-
const strValue = String(value).trim();
|
|
41
|
-
const parsed = parseInt(strValue, 10);
|
|
42
|
-
const errorOptions = {};
|
|
43
|
-
if (min !== undefined)
|
|
44
|
-
errorOptions.min = min;
|
|
45
|
-
if (max !== undefined)
|
|
46
|
-
errorOptions.max = max;
|
|
47
|
-
if (isNaN(parsed)) {
|
|
48
|
-
const message = invalidIntegerError('value', strValue, errorOptions);
|
|
49
|
-
throw new CommandError(message, {}, EXIT_CODES.INVALID_ARGUMENTS);
|
|
50
|
-
}
|
|
51
|
-
if (parsed === 0 && allowZeroForAll) {
|
|
52
|
-
return 0;
|
|
53
|
-
}
|
|
54
|
-
if (min !== undefined && parsed < min) {
|
|
55
|
-
const message = invalidIntegerError('value', strValue, errorOptions);
|
|
56
|
-
throw new CommandError(message, {}, EXIT_CODES.INVALID_ARGUMENTS);
|
|
57
|
-
}
|
|
58
|
-
if (max !== undefined && parsed > max) {
|
|
59
|
-
const message = invalidIntegerError('value', strValue, errorOptions);
|
|
60
|
-
throw new CommandError(message, {}, EXIT_CODES.INVALID_ARGUMENTS);
|
|
61
|
-
}
|
|
62
|
-
return parsed;
|
|
63
|
-
},
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Valid CDP ResourceType values for filtering.
|
|
68
|
-
* Matches Protocol.Network.ResourceType enum.
|
|
69
|
-
*/
|
|
7
|
+
import { findSimilar } from '../../utils/suggestions.js';
|
|
70
8
|
const VALID_RESOURCE_TYPES = [
|
|
71
9
|
'Document',
|
|
72
10
|
'Stylesheet',
|
|
@@ -88,34 +26,68 @@ const VALID_RESOURCE_TYPES = [
|
|
|
88
26
|
'FedCM',
|
|
89
27
|
'Other',
|
|
90
28
|
];
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
29
|
+
function buildRangeSuggestion(min, max) {
|
|
30
|
+
if (min !== undefined && max !== undefined)
|
|
31
|
+
return `Use a value between ${min} and ${max}`;
|
|
32
|
+
if (min !== undefined)
|
|
33
|
+
return `Use a value >= ${min}`;
|
|
34
|
+
if (max !== undefined)
|
|
35
|
+
return `Use a value <= ${max}`;
|
|
36
|
+
return 'Provide a valid integer';
|
|
37
|
+
}
|
|
38
|
+
function throwValidationError(message, suggestion) {
|
|
39
|
+
throw new CommandError(message, { suggestion }, EXIT_CODES.INVALID_ARGUMENTS);
|
|
40
|
+
}
|
|
41
|
+
function buildErrorOptions(min, max) {
|
|
42
|
+
const opts = {};
|
|
43
|
+
if (min !== undefined)
|
|
44
|
+
opts.min = min;
|
|
45
|
+
if (max !== undefined)
|
|
46
|
+
opts.max = max;
|
|
47
|
+
return opts;
|
|
48
|
+
}
|
|
49
|
+
function parseInteger(value, options) {
|
|
50
|
+
const { min, max, default: defaultValue, required = true, allowZeroForAll = false } = options;
|
|
51
|
+
if (value === undefined || value === null) {
|
|
52
|
+
if (defaultValue !== undefined)
|
|
53
|
+
return defaultValue;
|
|
54
|
+
if (!required)
|
|
55
|
+
return 0;
|
|
56
|
+
throwValidationError('Value is required', 'Provide a numeric value for this option');
|
|
57
|
+
}
|
|
58
|
+
if (typeof value !== 'string' && typeof value !== 'number') {
|
|
59
|
+
throwValidationError(`Value must be a number, got ${typeof value}`, 'Provide a numeric value');
|
|
60
|
+
}
|
|
61
|
+
const parsed = parseInt(String(value).trim(), 10);
|
|
62
|
+
const rangeSuggestion = buildRangeSuggestion(min, max);
|
|
63
|
+
const errorOptions = buildErrorOptions(min, max);
|
|
64
|
+
if (isNaN(parsed)) {
|
|
65
|
+
throwValidationError(invalidIntegerError('value', String(value), errorOptions), rangeSuggestion);
|
|
66
|
+
}
|
|
67
|
+
if (parsed === 0 && allowZeroForAll)
|
|
68
|
+
return 0;
|
|
69
|
+
if (min !== undefined && parsed < min) {
|
|
70
|
+
throwValidationError(invalidIntegerError('value', String(value), errorOptions), rangeSuggestion);
|
|
71
|
+
}
|
|
72
|
+
if (max !== undefined && parsed > max) {
|
|
73
|
+
throwValidationError(invalidIntegerError('value', String(value), errorOptions), rangeSuggestion);
|
|
74
|
+
}
|
|
75
|
+
return parsed;
|
|
76
|
+
}
|
|
77
|
+
export function positiveIntRule(options = {}) {
|
|
78
|
+
return {
|
|
79
|
+
validate: (value) => parseInteger(value, options),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
97
82
|
function parseCommaSeparated(value) {
|
|
98
83
|
return value
|
|
99
84
|
.split(',')
|
|
100
85
|
.map((t) => t.trim())
|
|
101
86
|
.filter((t) => t.length > 0);
|
|
102
87
|
}
|
|
103
|
-
/**
|
|
104
|
-
* Normalize resource type string to CDP format (case-insensitive lookup).
|
|
105
|
-
*
|
|
106
|
-
* @param type - User input (e.g., "document", "xhr")
|
|
107
|
-
* @returns Normalized CDP type or undefined if invalid
|
|
108
|
-
*/
|
|
109
88
|
function normalizeResourceType(type) {
|
|
110
|
-
|
|
111
|
-
return found;
|
|
89
|
+
return VALID_RESOURCE_TYPES.find((valid) => valid.toLowerCase() === type.toLowerCase());
|
|
112
90
|
}
|
|
113
|
-
/**
|
|
114
|
-
* Validate and normalize array of resource type strings.
|
|
115
|
-
*
|
|
116
|
-
* @param types - Array of type strings to validate
|
|
117
|
-
* @returns Object with normalized types and invalid entries
|
|
118
|
-
*/
|
|
119
91
|
function validateResourceTypes(types) {
|
|
120
92
|
const normalized = [];
|
|
121
93
|
const invalid = [];
|
|
@@ -130,39 +102,25 @@ function validateResourceTypes(types) {
|
|
|
130
102
|
}
|
|
131
103
|
return { normalized, invalid };
|
|
132
104
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
* ```typescript
|
|
141
|
-
* const rules = {
|
|
142
|
-
* type: resourceTypeRule(),
|
|
143
|
-
* };
|
|
144
|
-
* const validated = validateOptions(options, rules);
|
|
145
|
-
* // Input: "document,xhr" → Output: ["Document", "XHR"]
|
|
146
|
-
* ```
|
|
147
|
-
*/
|
|
105
|
+
function buildTypoSuggestion(invalid) {
|
|
106
|
+
const similar = invalid.flatMap((inv) => findSimilar(inv, VALID_RESOURCE_TYPES));
|
|
107
|
+
const uniqueSimilar = [...new Set(similar)];
|
|
108
|
+
return uniqueSimilar.length > 0
|
|
109
|
+
? `Did you mean: ${uniqueSimilar.join(', ')}?`
|
|
110
|
+
: `Valid types: ${VALID_RESOURCE_TYPES.join(', ')}`;
|
|
111
|
+
}
|
|
148
112
|
export function resourceTypeRule() {
|
|
149
113
|
return {
|
|
150
114
|
validate: (value) => {
|
|
151
|
-
|
|
152
|
-
if (value === undefined || value === null || value === '') {
|
|
115
|
+
if (value === undefined || value === null || value === '')
|
|
153
116
|
return [];
|
|
154
|
-
}
|
|
155
|
-
// Type guard
|
|
156
117
|
if (typeof value !== 'string') {
|
|
157
|
-
|
|
118
|
+
throwValidationError('Resource type must be a string', `Valid types: ${VALID_RESOURCE_TYPES.join(', ')}`);
|
|
158
119
|
}
|
|
159
|
-
// Parse and validate
|
|
160
120
|
const types = parseCommaSeparated(value);
|
|
161
121
|
const { normalized, invalid } = validateResourceTypes(types);
|
|
162
|
-
// Report errors if any invalid types
|
|
163
122
|
if (invalid.length > 0) {
|
|
164
|
-
|
|
165
|
-
throw new CommandError(`Invalid resource type(s): ${invalid.join(', ')}`, { suggestion: `Valid types: ${validList}` }, EXIT_CODES.INVALID_ARGUMENTS);
|
|
123
|
+
throwValidationError(`Invalid resource type(s): ${invalid.join(', ')}`, buildTypoSuggestion(invalid));
|
|
166
124
|
}
|
|
167
125
|
return normalized;
|
|
168
126
|
},
|