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
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
* - Numeric indices (referencing cached query results)
|
|
6
6
|
* - CSS selectors (used directly)
|
|
7
7
|
*
|
|
8
|
-
* Handles cache validation, staleness detection, and
|
|
8
|
+
* Handles cache validation, staleness detection, and automatic refresh.
|
|
9
|
+
* When cache is stale due to navigation, automatically re-runs the original
|
|
10
|
+
* query to provide seamless "just works" experience.
|
|
9
11
|
*
|
|
10
12
|
* @example
|
|
11
13
|
* ```typescript
|
|
@@ -32,7 +34,7 @@ export interface ElementTargetSuccess {
|
|
|
32
34
|
success: true;
|
|
33
35
|
/** CSS selector to use */
|
|
34
36
|
selector: string;
|
|
35
|
-
/**
|
|
37
|
+
/** 0-based index for selector (if resolved from cached query) */
|
|
36
38
|
index?: number | undefined;
|
|
37
39
|
}
|
|
38
40
|
/**
|
|
@@ -56,7 +58,8 @@ export type ElementTargetResult = ElementTargetSuccess | ElementTargetFailure;
|
|
|
56
58
|
/**
|
|
57
59
|
* Singleton resolver for DOM element access patterns.
|
|
58
60
|
*
|
|
59
|
-
* Centralizes element resolution with cache validation
|
|
61
|
+
* Centralizes element resolution with cache validation, automatic refresh,
|
|
62
|
+
* and consistent error handling.
|
|
60
63
|
*/
|
|
61
64
|
export declare class DomElementResolver {
|
|
62
65
|
private static instance;
|
|
@@ -67,6 +70,16 @@ export declare class DomElementResolver {
|
|
|
67
70
|
* @param cacheManager - Query cache manager (defaults to singleton)
|
|
68
71
|
*/
|
|
69
72
|
constructor(cacheManager?: QueryCacheManager);
|
|
73
|
+
/**
|
|
74
|
+
* Refresh stale cache by re-running the original query.
|
|
75
|
+
*
|
|
76
|
+
* Called automatically when cache validation fails due to navigation.
|
|
77
|
+
* Re-queries using the stored selector and updates the cache with fresh results.
|
|
78
|
+
*
|
|
79
|
+
* @param selector - Original CSS selector from stale cache
|
|
80
|
+
* @returns Fresh query result
|
|
81
|
+
*/
|
|
82
|
+
private refreshCache;
|
|
70
83
|
/**
|
|
71
84
|
* Get the singleton instance.
|
|
72
85
|
*
|
|
@@ -84,10 +97,12 @@ export declare class DomElementResolver {
|
|
|
84
97
|
* - A CSS selector string (used directly)
|
|
85
98
|
* - A numeric index (resolved from cached query results)
|
|
86
99
|
*
|
|
87
|
-
*
|
|
100
|
+
* Automatically refreshes stale cache by re-running the original query.
|
|
101
|
+
* This provides a "just works" experience where navigation doesn't break
|
|
102
|
+
* index-based access.
|
|
88
103
|
*
|
|
89
104
|
* @param selectorOrIndex - CSS selector or numeric index from query results
|
|
90
|
-
* @param explicitIndex - Optional explicit --index flag value (
|
|
105
|
+
* @param explicitIndex - Optional explicit --index flag value (0-based)
|
|
91
106
|
* @returns Resolution result with selector and optional index
|
|
92
107
|
*
|
|
93
108
|
* @example
|
|
@@ -103,11 +118,12 @@ export declare class DomElementResolver {
|
|
|
103
118
|
/**
|
|
104
119
|
* Get nodeId for a cached index.
|
|
105
120
|
*
|
|
106
|
-
*
|
|
121
|
+
* Automatically refreshes stale cache by re-running the original query.
|
|
122
|
+
* Throws CommandError only if refresh fails or index is out of range after refresh.
|
|
107
123
|
*
|
|
108
124
|
* @param index - Zero-based index from query results
|
|
109
125
|
* @returns Node with nodeId from cache
|
|
110
|
-
* @throws CommandError if cache missing,
|
|
126
|
+
* @throws CommandError if cache missing, index out of range after refresh, or node not found
|
|
111
127
|
*
|
|
112
128
|
* @example
|
|
113
129
|
* ```typescript
|
|
@@ -121,10 +137,10 @@ export declare class DomElementResolver {
|
|
|
121
137
|
/**
|
|
122
138
|
* Get the count of cached elements.
|
|
123
139
|
*
|
|
124
|
-
*
|
|
140
|
+
* Automatically refreshes stale cache by re-running the original query.
|
|
125
141
|
*
|
|
126
142
|
* @returns Number of cached elements
|
|
127
|
-
* @throws CommandError if cache is missing or
|
|
143
|
+
* @throws CommandError if cache is missing or refresh fails
|
|
128
144
|
*/
|
|
129
145
|
getElementCount(): Promise<number>;
|
|
130
146
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DomElementResolver.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/DomElementResolver.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"DomElementResolver.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/DomElementResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAQnE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,2BAA2B;IAC3B,OAAO,EAAE,IAAI,CAAC;IACd,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,OAAO,EAAE,KAAK,CAAC;IACf,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,oBAAoB,GAAG,oBAAoB,CAAC;AAE9E;;;;;GAKG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmC;IAC1D,OAAO,CAAC,YAAY,CAAoB;IAExC;;;;OAIG;gBACS,YAAY,CAAC,EAAE,iBAAiB;IAI5C;;;;;;;;OAQG;YACW,YAAY;IAkB1B;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAKxC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACG,OAAO,CAAC,eAAe,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAiD5F;;;;;;;;;;;;;;;OAeG;IACG,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAqCnE;;;;;;;OAOG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAoBxC;;;;;OAKG;IACH,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO;CAGjD"}
|
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
* - Numeric indices (referencing cached query results)
|
|
6
6
|
* - CSS selectors (used directly)
|
|
7
7
|
*
|
|
8
|
-
* Handles cache validation, staleness detection, and
|
|
8
|
+
* Handles cache validation, staleness detection, and automatic refresh.
|
|
9
|
+
* When cache is stale due to navigation, automatically re-runs the original
|
|
10
|
+
* query to provide seamless "just works" experience.
|
|
9
11
|
*
|
|
10
12
|
* @example
|
|
11
13
|
* ```typescript
|
|
@@ -25,11 +27,15 @@
|
|
|
25
27
|
*/
|
|
26
28
|
import { QueryCacheManager } from '../../session/QueryCacheManager.js';
|
|
27
29
|
import { CommandError } from '../../ui/errors/index.js';
|
|
30
|
+
import { createLogger } from '../../ui/logging/index.js';
|
|
31
|
+
import { elementAtIndexNotFoundError, indexOutOfRangeError } from '../../ui/messages/errors.js';
|
|
28
32
|
import { EXIT_CODES } from '../../utils/exitCodes.js';
|
|
33
|
+
const log = createLogger('dom');
|
|
29
34
|
/**
|
|
30
35
|
* Singleton resolver for DOM element access patterns.
|
|
31
36
|
*
|
|
32
|
-
* Centralizes element resolution with cache validation
|
|
37
|
+
* Centralizes element resolution with cache validation, automatic refresh,
|
|
38
|
+
* and consistent error handling.
|
|
33
39
|
*/
|
|
34
40
|
export class DomElementResolver {
|
|
35
41
|
static instance = null;
|
|
@@ -42,6 +48,28 @@ export class DomElementResolver {
|
|
|
42
48
|
constructor(cacheManager) {
|
|
43
49
|
this.cacheManager = cacheManager ?? QueryCacheManager.getInstance();
|
|
44
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Refresh stale cache by re-running the original query.
|
|
53
|
+
*
|
|
54
|
+
* Called automatically when cache validation fails due to navigation.
|
|
55
|
+
* Re-queries using the stored selector and updates the cache with fresh results.
|
|
56
|
+
*
|
|
57
|
+
* @param selector - Original CSS selector from stale cache
|
|
58
|
+
* @returns Fresh query result
|
|
59
|
+
*/
|
|
60
|
+
async refreshCache(selector) {
|
|
61
|
+
log.debug(`Cache stale, auto-refreshing query "${selector}"`);
|
|
62
|
+
const { queryDOMElements } = await import('../../commands/dom/helpers.js');
|
|
63
|
+
const result = await queryDOMElements(selector);
|
|
64
|
+
const navigationId = await this.cacheManager.getCurrentNavigationId();
|
|
65
|
+
const resultWithNavId = {
|
|
66
|
+
...result,
|
|
67
|
+
...(navigationId !== null && { navigationId }),
|
|
68
|
+
};
|
|
69
|
+
await this.cacheManager.set(resultWithNavId);
|
|
70
|
+
this.cacheManager.invalidateNavigationCache();
|
|
71
|
+
log.debug(`Cache refreshed: found ${result.count} elements`);
|
|
72
|
+
}
|
|
45
73
|
/**
|
|
46
74
|
* Get the singleton instance.
|
|
47
75
|
*
|
|
@@ -64,10 +92,12 @@ export class DomElementResolver {
|
|
|
64
92
|
* - A CSS selector string (used directly)
|
|
65
93
|
* - A numeric index (resolved from cached query results)
|
|
66
94
|
*
|
|
67
|
-
*
|
|
95
|
+
* Automatically refreshes stale cache by re-running the original query.
|
|
96
|
+
* This provides a "just works" experience where navigation doesn't break
|
|
97
|
+
* index-based access.
|
|
68
98
|
*
|
|
69
99
|
* @param selectorOrIndex - CSS selector or numeric index from query results
|
|
70
|
-
* @param explicitIndex - Optional explicit --index flag value (
|
|
100
|
+
* @param explicitIndex - Optional explicit --index flag value (0-based)
|
|
71
101
|
* @returns Resolution result with selector and optional index
|
|
72
102
|
*
|
|
73
103
|
* @example
|
|
@@ -82,7 +112,12 @@ export class DomElementResolver {
|
|
|
82
112
|
async resolve(selectorOrIndex, explicitIndex) {
|
|
83
113
|
const isNumericIndex = /^\d+$/.test(selectorOrIndex);
|
|
84
114
|
if (isNumericIndex) {
|
|
85
|
-
|
|
115
|
+
let validation = await this.cacheManager.validate();
|
|
116
|
+
// Auto-refresh: if cache is stale but has selector, re-run query
|
|
117
|
+
if (!validation.valid && validation.cache?.selector) {
|
|
118
|
+
await this.refreshCache(validation.cache.selector);
|
|
119
|
+
validation = await this.cacheManager.validate();
|
|
120
|
+
}
|
|
86
121
|
if (!validation.valid || !validation.cache) {
|
|
87
122
|
return {
|
|
88
123
|
success: false,
|
|
@@ -97,8 +132,10 @@ export class DomElementResolver {
|
|
|
97
132
|
return {
|
|
98
133
|
success: false,
|
|
99
134
|
error: `Index ${index} out of range (found ${cachedQuery.nodes.length} nodes from query "${cachedQuery.selector}")`,
|
|
100
|
-
exitCode: EXIT_CODES.
|
|
101
|
-
suggestion:
|
|
135
|
+
exitCode: EXIT_CODES.STALE_CACHE,
|
|
136
|
+
suggestion: cachedQuery.nodes.length === 0
|
|
137
|
+
? `No elements found after refresh. The selector "${cachedQuery.selector}" may no longer match any elements.`
|
|
138
|
+
: `Use an index between 0 and ${cachedQuery.nodes.length - 1}`,
|
|
102
139
|
};
|
|
103
140
|
}
|
|
104
141
|
return {
|
|
@@ -116,11 +153,12 @@ export class DomElementResolver {
|
|
|
116
153
|
/**
|
|
117
154
|
* Get nodeId for a cached index.
|
|
118
155
|
*
|
|
119
|
-
*
|
|
156
|
+
* Automatically refreshes stale cache by re-running the original query.
|
|
157
|
+
* Throws CommandError only if refresh fails or index is out of range after refresh.
|
|
120
158
|
*
|
|
121
159
|
* @param index - Zero-based index from query results
|
|
122
160
|
* @returns Node with nodeId from cache
|
|
123
|
-
* @throws CommandError if cache missing,
|
|
161
|
+
* @throws CommandError if cache missing, index out of range after refresh, or node not found
|
|
124
162
|
*
|
|
125
163
|
* @example
|
|
126
164
|
* ```typescript
|
|
@@ -129,32 +167,42 @@ export class DomElementResolver {
|
|
|
129
167
|
* ```
|
|
130
168
|
*/
|
|
131
169
|
async getNodeIdForIndex(index) {
|
|
132
|
-
|
|
170
|
+
let validation = await this.cacheManager.validate();
|
|
171
|
+
// Auto-refresh: if cache is stale but has selector, re-run query
|
|
172
|
+
if (!validation.valid && validation.cache?.selector) {
|
|
173
|
+
await this.refreshCache(validation.cache.selector);
|
|
174
|
+
validation = await this.cacheManager.validate();
|
|
175
|
+
}
|
|
133
176
|
if (!validation.valid || !validation.cache) {
|
|
134
177
|
throw new CommandError(validation.error ?? 'No cached query results found', validation.suggestion ? { suggestion: validation.suggestion } : {}, EXIT_CODES.INVALID_ARGUMENTS);
|
|
135
178
|
}
|
|
136
179
|
const cachedQuery = validation.cache;
|
|
137
180
|
if (index < 0 || index >= cachedQuery.nodes.length) {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}, EXIT_CODES.INVALID_ARGUMENTS);
|
|
181
|
+
const err = indexOutOfRangeError(index, cachedQuery.nodes.length - 1);
|
|
182
|
+
throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.STALE_CACHE);
|
|
141
183
|
}
|
|
142
184
|
const targetNode = cachedQuery.nodes[index];
|
|
143
185
|
if (!targetNode) {
|
|
144
|
-
|
|
186
|
+
const err = elementAtIndexNotFoundError(index, cachedQuery.selector);
|
|
187
|
+
throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.RESOURCE_NOT_FOUND);
|
|
145
188
|
}
|
|
146
189
|
return targetNode;
|
|
147
190
|
}
|
|
148
191
|
/**
|
|
149
192
|
* Get the count of cached elements.
|
|
150
193
|
*
|
|
151
|
-
*
|
|
194
|
+
* Automatically refreshes stale cache by re-running the original query.
|
|
152
195
|
*
|
|
153
196
|
* @returns Number of cached elements
|
|
154
|
-
* @throws CommandError if cache is missing or
|
|
197
|
+
* @throws CommandError if cache is missing or refresh fails
|
|
155
198
|
*/
|
|
156
199
|
async getElementCount() {
|
|
157
|
-
|
|
200
|
+
let validation = await this.cacheManager.validate();
|
|
201
|
+
// Auto-refresh: if cache is stale but has selector, re-run query
|
|
202
|
+
if (!validation.valid && validation.cache?.selector) {
|
|
203
|
+
await this.refreshCache(validation.cache.selector);
|
|
204
|
+
validation = await this.cacheManager.validate();
|
|
205
|
+
}
|
|
158
206
|
if (!validation.valid || !validation.cache) {
|
|
159
207
|
throw new CommandError(validation.error ?? 'No cached query results found', validation.suggestion ? { suggestion: validation.suggestion } : {}, EXIT_CODES.INVALID_ARGUMENTS);
|
|
160
208
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DomElementResolver.js","sourceRoot":"","sources":["../../../src/commands/dom/DomElementResolver.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"DomElementResolver.js","sourceRoot":"","sources":["../../../src/commands/dom/DomElementResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshotResize.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/commands/dom/__tests__/screenshotResize.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { describe, it } from 'node:test';
|
|
3
|
+
import { calculateImageTokens, calculateResizeScale, isTallPage, shouldResize, calculateFinalDimensions, calculateActualDimensions, MAX_EDGE_PX, PIXELS_PER_TOKEN, TALL_PAGE_THRESHOLD, } from '../../../commands/dom/screenshotResize.js';
|
|
4
|
+
void describe('calculateImageTokens', () => {
|
|
5
|
+
void it('calculates tokens using width × height / 750 formula', () => {
|
|
6
|
+
assert.equal(calculateImageTokens(1092, 1092), Math.ceil((1092 * 1092) / 750));
|
|
7
|
+
});
|
|
8
|
+
void it('returns ~1590 tokens for Anthropic recommended 1092x1092', () => {
|
|
9
|
+
const tokens = calculateImageTokens(1092, 1092);
|
|
10
|
+
assert.ok(tokens >= 1589 && tokens <= 1591, `Expected ~1590, got ${tokens}`);
|
|
11
|
+
});
|
|
12
|
+
void it('returns ~2770 tokens for 1920x1080 viewport', () => {
|
|
13
|
+
const tokens = calculateImageTokens(1920, 1080);
|
|
14
|
+
assert.ok(tokens >= 2760 && tokens <= 2780, `Expected ~2770, got ${tokens}`);
|
|
15
|
+
});
|
|
16
|
+
void it('handles zero dimensions', () => {
|
|
17
|
+
assert.equal(calculateImageTokens(0, 0), 0);
|
|
18
|
+
assert.equal(calculateImageTokens(1000, 0), 0);
|
|
19
|
+
assert.equal(calculateImageTokens(0, 1000), 0);
|
|
20
|
+
});
|
|
21
|
+
void it('rounds up (ceil) for fractional results', () => {
|
|
22
|
+
const tokens = calculateImageTokens(100, 100);
|
|
23
|
+
assert.equal(tokens, Math.ceil(10000 / 750));
|
|
24
|
+
assert.equal(tokens, 14);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
void describe('calculateResizeScale', () => {
|
|
28
|
+
void it('returns 1 when both dimensions are within limit', () => {
|
|
29
|
+
assert.equal(calculateResizeScale(1000, 1000), 1);
|
|
30
|
+
assert.equal(calculateResizeScale(MAX_EDGE_PX, 500), 1);
|
|
31
|
+
assert.equal(calculateResizeScale(500, MAX_EDGE_PX), 1);
|
|
32
|
+
});
|
|
33
|
+
void it('returns 1 when exactly at max edge', () => {
|
|
34
|
+
assert.equal(calculateResizeScale(MAX_EDGE_PX, MAX_EDGE_PX), 1);
|
|
35
|
+
});
|
|
36
|
+
void it('scales down when width exceeds limit', () => {
|
|
37
|
+
const scale = calculateResizeScale(3136, 1000);
|
|
38
|
+
assert.ok(scale < 1, 'Scale should be less than 1');
|
|
39
|
+
assert.equal(scale, MAX_EDGE_PX / 3136);
|
|
40
|
+
});
|
|
41
|
+
void it('scales down when height exceeds limit', () => {
|
|
42
|
+
const scale = calculateResizeScale(1000, 3136);
|
|
43
|
+
assert.ok(scale < 1, 'Scale should be less than 1');
|
|
44
|
+
assert.equal(scale, MAX_EDGE_PX / 3136);
|
|
45
|
+
});
|
|
46
|
+
void it('uses longest edge for scale calculation', () => {
|
|
47
|
+
const scale1 = calculateResizeScale(3000, 2000);
|
|
48
|
+
const scale2 = calculateResizeScale(2000, 3000);
|
|
49
|
+
assert.equal(scale1, scale2, 'Scale should be same regardless of orientation');
|
|
50
|
+
assert.equal(scale1, MAX_EDGE_PX / 3000);
|
|
51
|
+
});
|
|
52
|
+
void it('produces correct scale for Wikipedia-style tall page', () => {
|
|
53
|
+
const scale = calculateResizeScale(1866, 37833);
|
|
54
|
+
const expectedScale = MAX_EDGE_PX / 37833;
|
|
55
|
+
assert.ok(Math.abs(scale - expectedScale) < 0.0001, `Expected ${expectedScale}, got ${scale}`);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
void describe('isTallPage', () => {
|
|
59
|
+
void it('returns false for square pages', () => {
|
|
60
|
+
assert.equal(isTallPage(1000, 1000), false);
|
|
61
|
+
});
|
|
62
|
+
void it('returns false for normal aspect ratios', () => {
|
|
63
|
+
assert.equal(isTallPage(1920, 1080), false);
|
|
64
|
+
assert.equal(isTallPage(1920, 3000), false);
|
|
65
|
+
assert.equal(isTallPage(1920, 5760), false);
|
|
66
|
+
});
|
|
67
|
+
void it('returns true when aspect ratio exceeds threshold', () => {
|
|
68
|
+
assert.equal(isTallPage(1000, 3001), true);
|
|
69
|
+
assert.equal(isTallPage(1920, 6000), true);
|
|
70
|
+
});
|
|
71
|
+
void it('uses threshold of 3:1', () => {
|
|
72
|
+
assert.equal(TALL_PAGE_THRESHOLD, 3);
|
|
73
|
+
assert.equal(isTallPage(1000, 3000), false);
|
|
74
|
+
assert.equal(isTallPage(1000, 3001), true);
|
|
75
|
+
});
|
|
76
|
+
void it('handles zero width gracefully', () => {
|
|
77
|
+
assert.equal(isTallPage(0, 1000), false);
|
|
78
|
+
});
|
|
79
|
+
void it('detects Wikipedia-style tall pages', () => {
|
|
80
|
+
assert.equal(isTallPage(1866, 37833), true);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
void describe('shouldResize', () => {
|
|
84
|
+
void it('returns false when dimensions are within limit', () => {
|
|
85
|
+
assert.equal(shouldResize(1000, 1000, false), false);
|
|
86
|
+
assert.equal(shouldResize(MAX_EDGE_PX, MAX_EDGE_PX, false), false);
|
|
87
|
+
});
|
|
88
|
+
void it('returns true when width exceeds limit', () => {
|
|
89
|
+
assert.equal(shouldResize(2000, 1000, false), true);
|
|
90
|
+
});
|
|
91
|
+
void it('returns true when height exceeds limit', () => {
|
|
92
|
+
assert.equal(shouldResize(1000, 2000, false), true);
|
|
93
|
+
});
|
|
94
|
+
void it('respects noResize flag', () => {
|
|
95
|
+
assert.equal(shouldResize(5000, 5000, true), false);
|
|
96
|
+
assert.equal(shouldResize(5000, 5000, false), true);
|
|
97
|
+
});
|
|
98
|
+
void it('checks longest edge, not total pixels', () => {
|
|
99
|
+
assert.equal(shouldResize(1568, 1568, false), false);
|
|
100
|
+
assert.equal(shouldResize(1569, 1, false), true);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
void describe('calculateFinalDimensions', () => {
|
|
104
|
+
void it('returns original dimensions when scale is 1', () => {
|
|
105
|
+
const result = calculateFinalDimensions(1920, 1080, 1);
|
|
106
|
+
assert.deepEqual(result, { width: 1920, height: 1080 });
|
|
107
|
+
});
|
|
108
|
+
void it('scales dimensions proportionally', () => {
|
|
109
|
+
const result = calculateFinalDimensions(2000, 1000, 0.5);
|
|
110
|
+
assert.deepEqual(result, { width: 1000, height: 500 });
|
|
111
|
+
});
|
|
112
|
+
void it('rounds to nearest integer', () => {
|
|
113
|
+
const result = calculateFinalDimensions(1000, 1000, 0.333);
|
|
114
|
+
assert.equal(result.width, 333);
|
|
115
|
+
assert.equal(result.height, 333);
|
|
116
|
+
});
|
|
117
|
+
void it('produces max edge of 1568 when scaling oversized image', () => {
|
|
118
|
+
const scale = calculateResizeScale(3136, 2000);
|
|
119
|
+
const result = calculateFinalDimensions(3136, 2000, scale);
|
|
120
|
+
assert.equal(result.width, MAX_EDGE_PX);
|
|
121
|
+
assert.ok(result.height <= MAX_EDGE_PX);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
void describe('calculateActualDimensions', () => {
|
|
125
|
+
void it('returns same dimensions for 1x display', () => {
|
|
126
|
+
const result = calculateActualDimensions(1920, 1080, 1);
|
|
127
|
+
assert.deepEqual(result, { width: 1920, height: 1080 });
|
|
128
|
+
});
|
|
129
|
+
void it('doubles dimensions for 2x Retina display', () => {
|
|
130
|
+
const result = calculateActualDimensions(1920, 1080, 2);
|
|
131
|
+
assert.deepEqual(result, { width: 3840, height: 2160 });
|
|
132
|
+
});
|
|
133
|
+
void it('handles fractional DPR', () => {
|
|
134
|
+
const result = calculateActualDimensions(1000, 1000, 1.5);
|
|
135
|
+
assert.deepEqual(result, { width: 1500, height: 1500 });
|
|
136
|
+
});
|
|
137
|
+
void it('rounds to nearest integer', () => {
|
|
138
|
+
const result = calculateActualDimensions(100, 100, 1.333);
|
|
139
|
+
assert.equal(result.width, 133);
|
|
140
|
+
assert.equal(result.height, 133);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
void describe('constants', () => {
|
|
144
|
+
void it('MAX_EDGE_PX matches Anthropic recommendation', () => {
|
|
145
|
+
assert.equal(MAX_EDGE_PX, 1568);
|
|
146
|
+
});
|
|
147
|
+
void it('PIXELS_PER_TOKEN matches Claude Vision formula', () => {
|
|
148
|
+
assert.equal(PIXELS_PER_TOKEN, 750);
|
|
149
|
+
});
|
|
150
|
+
void it('TALL_PAGE_THRESHOLD is 3:1 aspect ratio', () => {
|
|
151
|
+
assert.equal(TALL_PAGE_THRESHOLD, 3);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
void describe('integration: end-to-end resize calculation', () => {
|
|
155
|
+
void it('correctly handles normal page on 2x display', () => {
|
|
156
|
+
const cssWidth = 1920;
|
|
157
|
+
const cssHeight = 1080;
|
|
158
|
+
const dpr = 2;
|
|
159
|
+
const needsResize = shouldResize(cssWidth, cssHeight, false);
|
|
160
|
+
assert.equal(needsResize, true);
|
|
161
|
+
const scale = calculateResizeScale(cssWidth, cssHeight);
|
|
162
|
+
const finalCss = calculateFinalDimensions(cssWidth, cssHeight, scale);
|
|
163
|
+
const actual = calculateActualDimensions(finalCss.width, finalCss.height, dpr);
|
|
164
|
+
const tokens = calculateImageTokens(actual.width, actual.height);
|
|
165
|
+
assert.ok(finalCss.width <= MAX_EDGE_PX);
|
|
166
|
+
assert.ok(finalCss.height <= MAX_EDGE_PX);
|
|
167
|
+
assert.ok(tokens < 10000, `Tokens should be reasonable, got ${tokens}`);
|
|
168
|
+
});
|
|
169
|
+
void it('correctly handles tall page detection and fallback', () => {
|
|
170
|
+
const cssWidth = 1866;
|
|
171
|
+
const cssHeight = 37833;
|
|
172
|
+
const tall = isTallPage(cssWidth, cssHeight);
|
|
173
|
+
assert.equal(tall, true);
|
|
174
|
+
const viewportWidth = 1400;
|
|
175
|
+
const viewportHeight = 900;
|
|
176
|
+
const scale = calculateResizeScale(viewportWidth, viewportHeight);
|
|
177
|
+
assert.equal(scale, 1, 'Viewport within MAX_EDGE_PX should not need resize');
|
|
178
|
+
});
|
|
179
|
+
void it('token calculation matches expected for Anthropic sweet spot', () => {
|
|
180
|
+
const tokens = calculateImageTokens(1092, 1092);
|
|
181
|
+
assert.ok(tokens >= 1500 && tokens <= 1700, `Expected ~1590 tokens, got ${tokens}`);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
//# sourceMappingURL=screenshotResize.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshotResize.unit.test.js","sourceRoot":"","sources":["../../../../src/commands/dom/__tests__/screenshotResize.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/a11y.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/a11y.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+LzC;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA2D1D"}
|
|
@@ -15,7 +15,7 @@ import { jsonOption } from '../../commands/shared/commonOptions.js';
|
|
|
15
15
|
import { collectA11yTree, queryA11yTree, parseQueryPattern, resolveA11yNode, } from '../../telemetry/a11y.js';
|
|
16
16
|
import { CommandError } from '../../ui/errors/index.js';
|
|
17
17
|
import { formatA11yTree, formatA11yQueryResult, formatA11yNodeWithContext, } from '../../ui/formatters/a11y.js';
|
|
18
|
-
import { elementNotFoundError } from '../../ui/messages/errors.js';
|
|
18
|
+
import { elementNotFoundError, invalidQueryPatternError, noA11yNodesFoundError, elementNotAccessibleError, } from '../../ui/messages/errors.js';
|
|
19
19
|
import { EXIT_CODES } from '../../utils/exitCodes.js';
|
|
20
20
|
/**
|
|
21
21
|
* Handle bdg dom a11y tree command
|
|
@@ -59,18 +59,14 @@ async function handleA11yQuery(pattern, options) {
|
|
|
59
59
|
await runCommand(async () => {
|
|
60
60
|
const queryPattern = parseQueryPattern(pattern);
|
|
61
61
|
if (!queryPattern.role && !queryPattern.name && !queryPattern.description) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
note: `Received: "${pattern}"`,
|
|
65
|
-
}, EXIT_CODES.INVALID_ARGUMENTS);
|
|
62
|
+
const err = invalidQueryPatternError(pattern);
|
|
63
|
+
throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.INVALID_ARGUMENTS);
|
|
66
64
|
}
|
|
67
65
|
const tree = await collectA11yTree();
|
|
68
66
|
const result = queryA11yTree(tree, queryPattern);
|
|
69
67
|
if (result.count === 0) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
note: `Pattern: ${JSON.stringify(queryPattern)}`,
|
|
73
|
-
}, EXIT_CODES.RESOURCE_NOT_FOUND);
|
|
68
|
+
const err = noA11yNodesFoundError(pattern);
|
|
69
|
+
throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.RESOURCE_NOT_FOUND);
|
|
74
70
|
}
|
|
75
71
|
return { success: true, data: result };
|
|
76
72
|
}, options, formatA11yQueryResult);
|
|
@@ -113,6 +109,10 @@ async function handleA11yDescribe(selectorOrIndex, options) {
|
|
|
113
109
|
node = await resolveA11yNode(selectorOrIndex);
|
|
114
110
|
}
|
|
115
111
|
if (!node) {
|
|
112
|
+
if (isNumericIndex) {
|
|
113
|
+
const err = elementNotAccessibleError(parseInt(selectorOrIndex, 10));
|
|
114
|
+
throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.STALE_CACHE);
|
|
115
|
+
}
|
|
116
116
|
throw new CommandError(elementNotFoundError(selectorOrIndex), {}, EXIT_CODES.RESOURCE_NOT_FOUND);
|
|
117
117
|
}
|
|
118
118
|
let domContext = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a11y.js","sourceRoot":"","sources":["../../../src/commands/dom/a11y.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAMhE,OAAO,EACL,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"a11y.js","sourceRoot":"","sources":["../../../src/commands/dom/a11y.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evalHelpers.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/evalHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"evalHelpers.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/evalHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AA4DlF;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAU9C;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,IAAI,eAAe,CAa7D;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB/F;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CA0B5C"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readSessionMetadata } from '../../session/metadata.js';
|
|
2
2
|
import { readPid } from '../../session/pid.js';
|
|
3
3
|
import { CommandError } from '../../ui/errors/index.js';
|
|
4
|
-
import { sessionNotActiveError } from '../../ui/messages/errors.js';
|
|
4
|
+
import { sessionNotActiveError, sessionMetadataMissingError, sessionTargetNotFoundError, scriptExecutionError, } from '../../ui/messages/errors.js';
|
|
5
5
|
import { EXIT_CODES } from '../../utils/exitCodes.js';
|
|
6
6
|
import { fetchCDPTargetById } from '../../utils/http.js';
|
|
7
7
|
import { isProcessAlive } from '../../utils/process.js';
|
|
@@ -66,7 +66,8 @@ export function validateActiveSession() {
|
|
|
66
66
|
export function getValidatedSessionMetadata() {
|
|
67
67
|
const metadata = readSessionMetadata();
|
|
68
68
|
if (!metadata?.targetId || !metadata.webSocketDebuggerUrl) {
|
|
69
|
-
|
|
69
|
+
const err = sessionMetadataMissingError('targetId or webSocketDebuggerUrl');
|
|
70
|
+
throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.SESSION_FILE_ERROR);
|
|
70
71
|
}
|
|
71
72
|
return metadata;
|
|
72
73
|
}
|
|
@@ -82,11 +83,13 @@ export function getValidatedSessionMetadata() {
|
|
|
82
83
|
*/
|
|
83
84
|
export async function verifyTargetExists(metadata, port) {
|
|
84
85
|
if (!metadata.targetId) {
|
|
85
|
-
|
|
86
|
+
const err = sessionMetadataMissingError('targetId');
|
|
87
|
+
throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.RESOURCE_NOT_FOUND);
|
|
86
88
|
}
|
|
87
89
|
const target = await fetchCDPTargetById(metadata.targetId, port);
|
|
88
90
|
if (!target) {
|
|
89
|
-
|
|
91
|
+
const err = sessionTargetNotFoundError();
|
|
92
|
+
throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.RESOURCE_NOT_FOUND);
|
|
90
93
|
}
|
|
91
94
|
}
|
|
92
95
|
/**
|
|
@@ -105,13 +108,13 @@ export async function executeScript(cdp, script) {
|
|
|
105
108
|
});
|
|
106
109
|
if (!isRuntimeEvaluateResult(response)) {
|
|
107
110
|
throw new CommandError('Invalid CDP Runtime.evaluate response structure', {
|
|
108
|
-
|
|
109
|
-
suggestion: 'This may indicate a CDP protocol version mismatch',
|
|
111
|
+
suggestion: 'CDP response did not match expected format. This may indicate a CDP protocol version mismatch',
|
|
110
112
|
}, EXIT_CODES.CDP_CONNECTION_FAILURE);
|
|
111
113
|
}
|
|
112
114
|
if (response.exceptionDetails) {
|
|
113
115
|
const errorMsg = response.exceptionDetails.exception?.description ?? 'Unknown error executing script';
|
|
114
|
-
|
|
116
|
+
const err = scriptExecutionError(errorMsg);
|
|
117
|
+
throw new CommandError(err.message, { suggestion: err.suggestion }, EXIT_CODES.SOFTWARE_ERROR);
|
|
115
118
|
}
|
|
116
119
|
return response;
|
|
117
120
|
}
|