browser-debugger-cli 0.6.8 → 0.6.10
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/dist/__tests__/telemetry/filterDsl.unit.test.d.ts +12 -0
- package/dist/__tests__/telemetry/filterDsl.unit.test.d.ts.map +1 -0
- package/dist/__tests__/telemetry/filterDsl.unit.test.js +374 -0
- package/dist/__tests__/telemetry/filterDsl.unit.test.js.map +1 -0
- package/dist/__tests__/telemetry/filterPresets.unit.test.d.ts +10 -0
- package/dist/__tests__/telemetry/filterPresets.unit.test.d.ts.map +1 -0
- package/dist/__tests__/telemetry/filterPresets.unit.test.js +89 -0
- package/dist/__tests__/telemetry/filterPresets.unit.test.js.map +1 -0
- package/dist/commands/cleanup.js +1 -1
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/console.d.ts +9 -0
- package/dist/commands/console.d.ts.map +1 -1
- package/dist/commands/console.js +60 -28
- package/dist/commands/console.js.map +1 -1
- package/dist/commands/details.d.ts.map +1 -1
- package/dist/commands/details.js +20 -9
- package/dist/commands/details.js.map +1 -1
- package/dist/commands/dom/DomElementResolver.d.ts +23 -7
- package/dist/commands/dom/DomElementResolver.d.ts.map +1 -1
- package/dist/commands/dom/DomElementResolver.js +64 -16
- package/dist/commands/dom/DomElementResolver.js.map +1 -1
- package/dist/commands/dom/a11y.d.ts.map +1 -1
- package/dist/commands/dom/a11y.js +30 -18
- package/dist/commands/dom/a11y.js.map +1 -1
- package/dist/commands/dom/formFillHelpers.d.ts.map +1 -1
- package/dist/commands/dom/formFillHelpers.js +64 -2
- package/dist/commands/dom/formFillHelpers.js.map +1 -1
- package/dist/commands/dom/formInteraction.js +4 -4
- package/dist/commands/dom/formInteraction.js.map +1 -1
- package/dist/commands/dom/helpers.d.ts +38 -2
- package/dist/commands/dom/helpers.d.ts.map +1 -1
- package/dist/commands/dom/helpers.js +104 -3
- 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 +407 -151
- package/dist/commands/dom/index.js.map +1 -1
- package/dist/commands/helpJson.d.ts.map +1 -1
- package/dist/commands/helpJson.js +27 -10
- package/dist/commands/helpJson.js.map +1 -1
- package/dist/commands/network/har.d.ts +14 -0
- package/dist/commands/network/har.d.ts.map +1 -0
- package/dist/commands/network/har.js +97 -0
- package/dist/commands/network/har.js.map +1 -0
- package/dist/commands/network/index.d.ts +18 -0
- package/dist/commands/network/index.d.ts.map +1 -0
- package/dist/commands/network/index.js +27 -0
- package/dist/commands/network/index.js.map +1 -0
- package/dist/commands/network/list.d.ts +14 -0
- package/dist/commands/network/list.d.ts.map +1 -0
- package/dist/commands/network/list.js +269 -0
- package/dist/commands/network/list.js.map +1 -0
- package/dist/commands/network/shared.d.ts +56 -0
- package/dist/commands/network/shared.d.ts.map +1 -0
- package/dist/commands/network/shared.js +174 -0
- package/dist/commands/network/shared.js.map +1 -0
- package/dist/commands/network.js +4 -4
- package/dist/commands/network.js.map +1 -1
- package/dist/commands/peek.d.ts.map +1 -1
- package/dist/commands/peek.js +12 -11
- package/dist/commands/peek.js.map +1 -1
- package/dist/commands/shared/CommandRunner.d.ts +19 -0
- package/dist/commands/shared/CommandRunner.d.ts.map +1 -1
- package/dist/commands/shared/CommandRunner.js +30 -0
- package/dist/commands/shared/CommandRunner.js.map +1 -1
- package/dist/commands/shared/commonOptions.d.ts +8 -24
- package/dist/commands/shared/commonOptions.d.ts.map +1 -1
- package/dist/commands/shared/commonOptions.js +9 -25
- package/dist/commands/shared/commonOptions.js.map +1 -1
- 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 +38 -0
- package/dist/commands/shared/optionTypes.d.ts.map +1 -1
- package/dist/commands/shared/startHelpers.d.ts +2 -10
- package/dist/commands/shared/startHelpers.d.ts.map +1 -1
- package/dist/commands/shared/startHelpers.js +9 -4
- package/dist/commands/shared/startHelpers.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +3 -1
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.js +5 -5
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/stop.js +1 -1
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/tail.d.ts.map +1 -1
- package/dist/commands/tail.js +7 -16
- 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/commands.js +1 -1
- package/dist/commands.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 +13 -0
- package/dist/connection/diagnostics.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 +1 -14
- package/dist/connection/launcher/binaryResolver.js.map +1 -1
- package/dist/connection/launcher.d.ts.map +1 -1
- package/dist/connection/launcher.js +3 -15
- package/dist/connection/launcher.js.map +1 -1
- package/dist/connection/pageReadiness.d.ts.map +1 -1
- package/dist/connection/pageReadiness.js +12 -8
- 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/constants.d.ts +15 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +18 -0
- package/dist/constants.js.map +1 -1
- package/dist/daemon/__tests__/commandRegistry.contract.test.js +6 -2
- package/dist/daemon/__tests__/commandRegistry.contract.test.js.map +1 -1
- package/dist/daemon/handlers/CommandHandlers.d.ts +5 -0
- package/dist/daemon/handlers/CommandHandlers.d.ts.map +1 -1
- package/dist/daemon/handlers/CommandHandlers.js +6 -1
- package/dist/daemon/handlers/CommandHandlers.js.map +1 -1
- package/dist/daemon/handlers/QueryHandlers.d.ts.map +1 -1
- package/dist/daemon/handlers/QueryHandlers.js +3 -1
- package/dist/daemon/handlers/QueryHandlers.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/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/commandRegistry.d.ts.map +1 -1
- package/dist/daemon/worker/commandRegistry.js +150 -55
- package/dist/daemon/worker/commandRegistry.js.map +1 -1
- package/dist/daemon/worker/plugins.d.ts.map +1 -1
- package/dist/daemon/worker/plugins.js +8 -1
- package/dist/daemon/worker/plugins.js.map +1 -1
- package/dist/ipc/client.d.ts +10 -1
- package/dist/ipc/client.d.ts.map +1 -1
- package/dist/ipc/client.js +12 -2
- package/dist/ipc/client.js.map +1 -1
- package/dist/ipc/session/queries.d.ts +2 -0
- package/dist/ipc/session/queries.d.ts.map +1 -1
- package/dist/session/QueryCacheManager.d.ts +1 -1
- package/dist/session/QueryCacheManager.d.ts.map +1 -1
- package/dist/telemetry/__tests__/remoteObject.unit.test.d.ts +2 -0
- package/dist/telemetry/__tests__/remoteObject.unit.test.d.ts.map +1 -0
- package/dist/telemetry/__tests__/remoteObject.unit.test.js +261 -0
- package/dist/telemetry/__tests__/remoteObject.unit.test.js.map +1 -0
- package/dist/telemetry/console.d.ts +8 -8
- package/dist/telemetry/console.d.ts.map +1 -1
- package/dist/telemetry/console.js +129 -52
- package/dist/telemetry/console.js.map +1 -1
- package/dist/telemetry/filterDsl.d.ts +45 -0
- package/dist/telemetry/filterDsl.d.ts.map +1 -0
- package/dist/telemetry/filterDsl.js +299 -0
- package/dist/telemetry/filterDsl.js.map +1 -0
- package/dist/telemetry/filterPresets.d.ts +35 -0
- package/dist/telemetry/filterPresets.d.ts.map +1 -0
- package/dist/telemetry/filterPresets.js +76 -0
- package/dist/telemetry/filterPresets.js.map +1 -0
- 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 +132 -8
- package/dist/telemetry/network.js.map +1 -1
- package/dist/telemetry/objectExpander.d.ts +35 -0
- package/dist/telemetry/objectExpander.d.ts.map +1 -0
- package/dist/telemetry/objectExpander.js +165 -0
- package/dist/telemetry/objectExpander.js.map +1 -0
- package/dist/telemetry/remoteObject.d.ts +7 -24
- package/dist/telemetry/remoteObject.d.ts.map +1 -1
- package/dist/telemetry/remoteObject.js +124 -65
- package/dist/telemetry/remoteObject.js.map +1 -1
- package/dist/telemetry/remoteObjectUtils.d.ts +40 -0
- package/dist/telemetry/remoteObjectUtils.d.ts.map +1 -0
- package/dist/telemetry/remoteObjectUtils.js +75 -0
- package/dist/telemetry/remoteObjectUtils.js.map +1 -0
- package/dist/telemetry/roleInference.d.ts +1 -1
- package/dist/telemetry/roleInference.d.ts.map +1 -1
- package/dist/types.d.ts +143 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/formatters/a11y.d.ts +1 -1
- package/dist/ui/formatters/a11y.d.ts.map +1 -1
- package/dist/ui/formatters/console.d.ts +14 -2
- package/dist/ui/formatters/console.d.ts.map +1 -1
- package/dist/ui/formatters/console.js +38 -7
- package/dist/ui/formatters/console.js.map +1 -1
- package/dist/ui/formatters/dom.d.ts +9 -18
- package/dist/ui/formatters/dom.d.ts.map +1 -1
- package/dist/ui/formatters/dom.js +55 -22
- package/dist/ui/formatters/dom.js.map +1 -1
- package/dist/ui/formatters/networkList.d.ts +19 -0
- package/dist/ui/formatters/networkList.d.ts.map +1 -0
- package/dist/ui/formatters/networkList.js +86 -0
- package/dist/ui/formatters/networkList.js.map +1 -0
- package/dist/ui/formatters/preview.d.ts +18 -0
- package/dist/ui/formatters/preview.d.ts.map +1 -1
- package/dist/ui/formatters/preview.js +13 -5
- package/dist/ui/formatters/preview.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.map +1 -1
- package/dist/ui/messages/networkMessages.d.ts +24 -0
- package/dist/ui/messages/networkMessages.d.ts.map +1 -0
- package/dist/ui/messages/networkMessages.js +30 -0
- package/dist/ui/messages/networkMessages.js.map +1 -0
- package/dist/utils/exitCodes.d.ts +2 -0
- package/dist/utils/exitCodes.d.ts.map +1 -1
- package/dist/utils/exitCodes.js +2 -0
- package/dist/utils/exitCodes.js.map +1 -1
- package/dist/utils/taskMappings.d.ts.map +1 -1
- package/dist/utils/taskMappings.js +2 -2
- 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
package/dist/commands/console.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { Option } from 'commander';
|
|
2
2
|
import { jsonOption } from '../commands/shared/commonOptions.js';
|
|
3
3
|
import { handleDaemonConnectionError } from '../commands/shared/daemonErrorHandler.js';
|
|
4
|
+
import { setupFollowMode } from '../commands/shared/followMode.js';
|
|
4
5
|
import { getErrorMessage } from '../connection/errors.js';
|
|
5
6
|
import { getPeek } from '../ipc/client.js';
|
|
6
7
|
import { validateIPCResponse } from '../ipc/index.js';
|
|
7
8
|
import { CommandError } from '../ui/errors/index.js';
|
|
8
|
-
import { formatConsole, formatConsoleFollow, } from '../ui/formatters/console.js';
|
|
9
|
+
import { formatConsole, formatConsoleFollow, LEVEL_MAP, } from '../ui/formatters/console.js';
|
|
9
10
|
import { followingConsoleMessage, stoppedFollowingConsoleMessage, noConsoleDataMessage, } from '../ui/messages/consoleMessages.js';
|
|
10
11
|
import { invalidLastRangeError } from '../ui/messages/validation.js';
|
|
11
12
|
import { getExitCodeForConnectionError } from '../utils/errorMapping.js';
|
|
@@ -43,6 +44,14 @@ const followOption = new Option('-f, --follow', 'Stream console messages in real
|
|
|
43
44
|
* By default, only current navigation messages are shown.
|
|
44
45
|
*/
|
|
45
46
|
const historyOption = new Option('-H, --history', 'Show messages from all page loads (default: current only)').default(false);
|
|
47
|
+
/**
|
|
48
|
+
* Valid console levels for filtering.
|
|
49
|
+
*/
|
|
50
|
+
const VALID_LEVELS = ['error', 'warning', 'info', 'debug'];
|
|
51
|
+
/**
|
|
52
|
+
* --level option for filtering by message level.
|
|
53
|
+
*/
|
|
54
|
+
const levelOption = new Option('--level <level>', 'Filter by message level (error, warning, info, debug)').choices(VALID_LEVELS);
|
|
46
55
|
/**
|
|
47
56
|
* Fetch console messages from the daemon.
|
|
48
57
|
*
|
|
@@ -51,7 +60,9 @@ const historyOption = new Option('-H, --history', 'Show messages from all page l
|
|
|
51
60
|
*/
|
|
52
61
|
async function fetchConsoleMessages(options) {
|
|
53
62
|
try {
|
|
54
|
-
|
|
63
|
+
// Pass lastN=0 to get all messages (worker applies filtering)
|
|
64
|
+
// We request all and filter client-side for flexibility
|
|
65
|
+
const response = await getPeek({ lastN: 0 });
|
|
55
66
|
try {
|
|
56
67
|
validateIPCResponse(response);
|
|
57
68
|
}
|
|
@@ -115,41 +126,66 @@ export function filterByCurrentNavigation(messages) {
|
|
|
115
126
|
return messages.filter((m) => m.navigationId === maxNavigationId);
|
|
116
127
|
}
|
|
117
128
|
/**
|
|
118
|
-
*
|
|
129
|
+
* Filter messages by level.
|
|
119
130
|
*
|
|
120
|
-
* @param messages - Console messages to
|
|
121
|
-
* @param
|
|
131
|
+
* @param messages - Console messages to filter
|
|
132
|
+
* @param level - Level to filter by (error, warning, info, debug)
|
|
133
|
+
* @returns Filtered messages matching the specified level
|
|
122
134
|
*/
|
|
123
|
-
function
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
135
|
+
export function filterByLevel(messages, level) {
|
|
136
|
+
return messages.filter((m) => LEVEL_MAP[m.type] === level);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Apply navigation and level filters to console messages.
|
|
140
|
+
*
|
|
141
|
+
* @param messages - Raw console messages
|
|
142
|
+
* @param options - Filter options (history and level)
|
|
143
|
+
* @returns Filtered messages
|
|
144
|
+
*/
|
|
145
|
+
function applyMessageFilters(messages, options) {
|
|
146
|
+
let filtered = options.history ? messages : filterByCurrentNavigation(messages);
|
|
147
|
+
if (options.level) {
|
|
148
|
+
filtered = filterByLevel(filtered, options.level);
|
|
128
149
|
}
|
|
129
|
-
|
|
150
|
+
return filtered;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Build format options from command options.
|
|
154
|
+
*
|
|
155
|
+
* @param options - Command options
|
|
156
|
+
* @returns Format options for console formatters
|
|
157
|
+
*/
|
|
158
|
+
function buildFormatOptions(options) {
|
|
159
|
+
return {
|
|
130
160
|
json: options.json,
|
|
131
161
|
list: options.list,
|
|
132
162
|
follow: options.follow,
|
|
133
163
|
last: options.last,
|
|
134
164
|
history: options.history,
|
|
165
|
+
level: options.level,
|
|
135
166
|
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Display console output based on options.
|
|
170
|
+
*
|
|
171
|
+
* @param messages - Console messages to display
|
|
172
|
+
* @param options - Command options
|
|
173
|
+
*/
|
|
174
|
+
function displayConsole(messages, options) {
|
|
175
|
+
const filteredMessages = applyMessageFilters(messages, options);
|
|
136
176
|
if (options.follow) {
|
|
137
177
|
console.clear();
|
|
138
178
|
}
|
|
139
|
-
console.log(formatConsole(filteredMessages,
|
|
179
|
+
console.log(formatConsole(filteredMessages, buildFormatOptions(options)));
|
|
140
180
|
}
|
|
141
181
|
/**
|
|
142
182
|
* Display console in follow mode with streaming updates.
|
|
143
183
|
*
|
|
144
184
|
* @param messages - Console messages to display
|
|
145
|
-
* @param options - Command options (for --history
|
|
185
|
+
* @param options - Command options (for --history and --level flags)
|
|
146
186
|
*/
|
|
147
187
|
function displayConsoleStreaming(messages, options) {
|
|
148
|
-
|
|
149
|
-
// Default: show only current navigation. Use --history for all.
|
|
150
|
-
if (!options.history) {
|
|
151
|
-
filteredMessages = filterByCurrentNavigation(messages);
|
|
152
|
-
}
|
|
188
|
+
const filteredMessages = applyMessageFilters(messages, options);
|
|
153
189
|
const lastMessages = filteredMessages.slice(-FOLLOW_MODE_MESSAGE_LIMIT);
|
|
154
190
|
console.clear();
|
|
155
191
|
console.log(formatConsoleFollow(lastMessages));
|
|
@@ -172,25 +208,21 @@ export function registerConsoleCommand(program) {
|
|
|
172
208
|
.addOption(listOption)
|
|
173
209
|
.addOption(followOption)
|
|
174
210
|
.addOption(historyOption)
|
|
211
|
+
.addOption(levelOption)
|
|
175
212
|
.addOption(consoleLastOption)
|
|
176
|
-
.addOption(jsonOption)
|
|
213
|
+
.addOption(jsonOption())
|
|
177
214
|
.action(async (options) => {
|
|
178
215
|
if (options.follow) {
|
|
179
|
-
console.error(followingConsoleMessage());
|
|
180
216
|
const showConsole = async () => {
|
|
181
217
|
const messages = await fetchConsoleMessages(options);
|
|
182
218
|
if (messages) {
|
|
183
219
|
displayConsoleStreaming(messages, options);
|
|
184
220
|
}
|
|
185
221
|
};
|
|
186
|
-
await showConsole
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
process.on('SIGINT', () => {
|
|
191
|
-
clearInterval(followInterval);
|
|
192
|
-
console.error(stoppedFollowingConsoleMessage());
|
|
193
|
-
process.exit(EXIT_CODES.SUCCESS);
|
|
222
|
+
await setupFollowMode(showConsole, {
|
|
223
|
+
startMessage: followingConsoleMessage,
|
|
224
|
+
stopMessage: stoppedFollowingConsoleMessage,
|
|
225
|
+
intervalMs: 1000,
|
|
194
226
|
});
|
|
195
227
|
}
|
|
196
228
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/commands/console.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAInC,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,2BAA2B,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../src/commands/console.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"details.d.ts","sourceRoot":"","sources":["../../src/commands/details.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BzC;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"details.d.ts","sourceRoot":"","sources":["../../src/commands/details.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BzC;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuD7D"}
|
package/dist/commands/details.js
CHANGED
|
@@ -8,6 +8,7 @@ import { validateDetailsItem } from '../utils/typeGuards.js';
|
|
|
8
8
|
/**
|
|
9
9
|
* Format details for human-readable output.
|
|
10
10
|
* Dispatches to the appropriate formatter based on type.
|
|
11
|
+
* TypeScript narrows the item type automatically via discriminated union.
|
|
11
12
|
*
|
|
12
13
|
* @param data - Details result containing item and type
|
|
13
14
|
*/
|
|
@@ -30,7 +31,7 @@ export function registerDetailsCommand(program) {
|
|
|
30
31
|
.description('Get detailed information for a specific request or console message')
|
|
31
32
|
.argument('<type>', 'Type of item: "network" or "console"')
|
|
32
33
|
.argument('<id>', 'Request ID (for network) or index (for console)')
|
|
33
|
-
.addOption(jsonOption)
|
|
34
|
+
.addOption(jsonOption())
|
|
34
35
|
.action(async (type, id, options) => {
|
|
35
36
|
options.type = type;
|
|
36
37
|
options.id = id;
|
|
@@ -51,14 +52,24 @@ export function registerDetailsCommand(program) {
|
|
|
51
52
|
exitCode: EXIT_CODES.RESOURCE_NOT_FOUND,
|
|
52
53
|
};
|
|
53
54
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
if (opts.type === 'network') {
|
|
56
|
+
return {
|
|
57
|
+
success: true,
|
|
58
|
+
data: {
|
|
59
|
+
type: 'network',
|
|
60
|
+
item: validateDetailsItem(response.data.item, 'network'),
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
return {
|
|
66
|
+
success: true,
|
|
67
|
+
data: {
|
|
68
|
+
type: 'console',
|
|
69
|
+
item: validateDetailsItem(response.data.item, 'console'),
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
62
73
|
}, options, formatDetails);
|
|
63
74
|
});
|
|
64
75
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"details.js","sourceRoot":"","sources":["../../src/commands/details.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"details.js","sourceRoot":"","sources":["../../src/commands/details.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAGhE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACxF,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,IAAmB;IACxC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,oEAAoE,CAAC;SACjF,QAAQ,CAAC,QAAQ,EAAE,sCAAsC,CAAC;SAC1D,QAAQ,CAAC,MAAM,EAAE,iDAAiD,CAAC;SACnE,SAAS,CAAC,UAAU,EAAE,CAAC;SACvB,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAU,EAAE,OAA8B,EAAE,EAAE;QACzE,OAAO,CAAC,IAAI,GAAG,IAA6B,CAAC;QAC7C,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;QAEhB,MAAM,UAAU,CACd,KAAK,EAAE,IAAI,EAAE,EAAE;YACb,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,iBAAiB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,iCAAiC;oBAC1E,QAAQ,EAAE,UAAU,CAAC,iBAAiB;iBACvC,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YAEtD,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAE9B,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;gBACzB,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,qBAAqB;oBAC5B,QAAQ,EAAE,UAAU,CAAC,kBAAkB;iBACxC,CAAC;YACJ,CAAC;YAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC5B,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE;wBACJ,IAAI,EAAE,SAAkB;wBACxB,IAAI,EAAE,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;qBACzD;iBACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE;wBACJ,IAAI,EAAE,SAAkB;wBACxB,IAAI,EAAE,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;qBACzD;iBACF,CAAC;YACJ,CAAC;QACH,CAAC,EACD,OAAO,EACP,aAAa,CACd,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -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
|
|
@@ -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,7 +97,9 @@ 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
105
|
* @param explicitIndex - Optional explicit --index flag value (1-based)
|
|
@@ -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;AAOnE;;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;IA4CnE;;;;;;;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,14 @@
|
|
|
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';
|
|
28
31
|
import { EXIT_CODES } from '../../utils/exitCodes.js';
|
|
32
|
+
const log = createLogger('dom');
|
|
29
33
|
/**
|
|
30
34
|
* Singleton resolver for DOM element access patterns.
|
|
31
35
|
*
|
|
32
|
-
* Centralizes element resolution with cache validation
|
|
36
|
+
* Centralizes element resolution with cache validation, automatic refresh,
|
|
37
|
+
* and consistent error handling.
|
|
33
38
|
*/
|
|
34
39
|
export class DomElementResolver {
|
|
35
40
|
static instance = null;
|
|
@@ -42,6 +47,28 @@ export class DomElementResolver {
|
|
|
42
47
|
constructor(cacheManager) {
|
|
43
48
|
this.cacheManager = cacheManager ?? QueryCacheManager.getInstance();
|
|
44
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Refresh stale cache by re-running the original query.
|
|
52
|
+
*
|
|
53
|
+
* Called automatically when cache validation fails due to navigation.
|
|
54
|
+
* Re-queries using the stored selector and updates the cache with fresh results.
|
|
55
|
+
*
|
|
56
|
+
* @param selector - Original CSS selector from stale cache
|
|
57
|
+
* @returns Fresh query result
|
|
58
|
+
*/
|
|
59
|
+
async refreshCache(selector) {
|
|
60
|
+
log.debug(`Cache stale, auto-refreshing query "${selector}"`);
|
|
61
|
+
const { queryDOMElements } = await import('../../commands/dom/helpers.js');
|
|
62
|
+
const result = await queryDOMElements(selector);
|
|
63
|
+
const navigationId = await this.cacheManager.getCurrentNavigationId();
|
|
64
|
+
const resultWithNavId = {
|
|
65
|
+
...result,
|
|
66
|
+
...(navigationId !== null && { navigationId }),
|
|
67
|
+
};
|
|
68
|
+
await this.cacheManager.set(resultWithNavId);
|
|
69
|
+
this.cacheManager.invalidateNavigationCache();
|
|
70
|
+
log.debug(`Cache refreshed: found ${result.count} elements`);
|
|
71
|
+
}
|
|
45
72
|
/**
|
|
46
73
|
* Get the singleton instance.
|
|
47
74
|
*
|
|
@@ -64,7 +91,9 @@ export class DomElementResolver {
|
|
|
64
91
|
* - A CSS selector string (used directly)
|
|
65
92
|
* - A numeric index (resolved from cached query results)
|
|
66
93
|
*
|
|
67
|
-
*
|
|
94
|
+
* Automatically refreshes stale cache by re-running the original query.
|
|
95
|
+
* This provides a "just works" experience where navigation doesn't break
|
|
96
|
+
* index-based access.
|
|
68
97
|
*
|
|
69
98
|
* @param selectorOrIndex - CSS selector or numeric index from query results
|
|
70
99
|
* @param explicitIndex - Optional explicit --index flag value (1-based)
|
|
@@ -82,7 +111,12 @@ export class DomElementResolver {
|
|
|
82
111
|
async resolve(selectorOrIndex, explicitIndex) {
|
|
83
112
|
const isNumericIndex = /^\d+$/.test(selectorOrIndex);
|
|
84
113
|
if (isNumericIndex) {
|
|
85
|
-
|
|
114
|
+
let validation = await this.cacheManager.validate();
|
|
115
|
+
// Auto-refresh: if cache is stale but has selector, re-run query
|
|
116
|
+
if (!validation.valid && validation.cache?.selector) {
|
|
117
|
+
await this.refreshCache(validation.cache.selector);
|
|
118
|
+
validation = await this.cacheManager.validate();
|
|
119
|
+
}
|
|
86
120
|
if (!validation.valid || !validation.cache) {
|
|
87
121
|
return {
|
|
88
122
|
success: false,
|
|
@@ -96,9 +130,11 @@ export class DomElementResolver {
|
|
|
96
130
|
if (index < 0 || index >= cachedQuery.nodes.length) {
|
|
97
131
|
return {
|
|
98
132
|
success: false,
|
|
99
|
-
error: `Index ${index} out of range (found ${cachedQuery.nodes.length}
|
|
100
|
-
exitCode: EXIT_CODES.
|
|
101
|
-
suggestion:
|
|
133
|
+
error: `Index ${index} out of range (found ${cachedQuery.nodes.length} nodes from query "${cachedQuery.selector}")`,
|
|
134
|
+
exitCode: EXIT_CODES.STALE_CACHE,
|
|
135
|
+
suggestion: cachedQuery.nodes.length === 0
|
|
136
|
+
? `No elements found after refresh. The selector "${cachedQuery.selector}" may no longer match any elements.`
|
|
137
|
+
: `Use an index between 0 and ${cachedQuery.nodes.length - 1}`,
|
|
102
138
|
};
|
|
103
139
|
}
|
|
104
140
|
return {
|
|
@@ -116,11 +152,12 @@ export class DomElementResolver {
|
|
|
116
152
|
/**
|
|
117
153
|
* Get nodeId for a cached index.
|
|
118
154
|
*
|
|
119
|
-
*
|
|
155
|
+
* Automatically refreshes stale cache by re-running the original query.
|
|
156
|
+
* Throws CommandError only if refresh fails or index is out of range after refresh.
|
|
120
157
|
*
|
|
121
158
|
* @param index - Zero-based index from query results
|
|
122
159
|
* @returns Node with nodeId from cache
|
|
123
|
-
* @throws CommandError if cache missing,
|
|
160
|
+
* @throws CommandError if cache missing, index out of range after refresh, or node not found
|
|
124
161
|
*
|
|
125
162
|
* @example
|
|
126
163
|
* ```typescript
|
|
@@ -129,15 +166,21 @@ export class DomElementResolver {
|
|
|
129
166
|
* ```
|
|
130
167
|
*/
|
|
131
168
|
async getNodeIdForIndex(index) {
|
|
132
|
-
|
|
169
|
+
let validation = await this.cacheManager.validate();
|
|
170
|
+
// Auto-refresh: if cache is stale but has selector, re-run query
|
|
171
|
+
if (!validation.valid && validation.cache?.selector) {
|
|
172
|
+
await this.refreshCache(validation.cache.selector);
|
|
173
|
+
validation = await this.cacheManager.validate();
|
|
174
|
+
}
|
|
133
175
|
if (!validation.valid || !validation.cache) {
|
|
134
176
|
throw new CommandError(validation.error ?? 'No cached query results found', validation.suggestion ? { suggestion: validation.suggestion } : {}, EXIT_CODES.INVALID_ARGUMENTS);
|
|
135
177
|
}
|
|
136
178
|
const cachedQuery = validation.cache;
|
|
137
179
|
if (index < 0 || index >= cachedQuery.nodes.length) {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
180
|
+
const suggestion = cachedQuery.nodes.length === 0
|
|
181
|
+
? `No elements found after refresh. The selector "${cachedQuery.selector}" may no longer match any elements.`
|
|
182
|
+
: `Use an index between 0 and ${cachedQuery.nodes.length - 1}`;
|
|
183
|
+
throw new CommandError(`Index ${index} out of range (found ${cachedQuery.nodes.length} nodes from query "${cachedQuery.selector}")`, { suggestion }, EXIT_CODES.STALE_CACHE);
|
|
141
184
|
}
|
|
142
185
|
const targetNode = cachedQuery.nodes[index];
|
|
143
186
|
if (!targetNode) {
|
|
@@ -148,13 +191,18 @@ export class DomElementResolver {
|
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;AAkChC;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IACrB,MAAM,CAAC,QAAQ,GAA8B,IAAI,CAAC;IAClD,YAAY,CAAoB;IAExC;;;;OAIG;IACH,YAAY,YAAgC;QAC1C,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,iBAAiB,CAAC,WAAW,EAAE,CAAC;IACtE,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,YAAY,CAAC,QAAgB;QACzC,GAAG,CAAC,KAAK,CAAC,uCAAuC,QAAQ,GAAG,CAAC,CAAC;QAE9D,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAEhD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAC;QACtE,MAAM,eAAe,GAAG;YACtB,GAAG,MAAM;YACT,GAAG,CAAC,YAAY,KAAK,IAAI,IAAI,EAAE,YAAY,EAAE,CAAC;SAC/C,CAAC;QAEF,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7C,IAAI,CAAC,YAAY,CAAC,yBAAyB,EAAE,CAAC;QAE9C,GAAG,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,KAAK,WAAW,CAAC,CAAC;IAC/D,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,WAAW;QAChB,kBAAkB,CAAC,QAAQ,KAAK,IAAI,kBAAkB,EAAE,CAAC;QACzD,OAAO,kBAAkB,CAAC,QAAQ,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa;QAClB,kBAAkB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACrC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,KAAK,CAAC,OAAO,CAAC,eAAuB,EAAE,aAAsB;QAC3D,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAErD,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAEpD,iEAAiE;YACjE,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;gBACpD,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACnD,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YAClD,CAAC;YAED,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBAC3C,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,+BAA+B;oBAC1D,QAAQ,EAAE,UAAU,CAAC,iBAAiB;oBACtC,UAAU,EAAE,UAAU,CAAC,UAAU;iBAClC,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC;YACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;YAC5C,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACnD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,SAAS,KAAK,wBAAwB,WAAW,CAAC,KAAK,CAAC,MAAM,sBAAsB,WAAW,CAAC,QAAQ,IAAI;oBACnH,QAAQ,EAAE,UAAU,CAAC,WAAW;oBAChC,UAAU,EACR,WAAW,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;wBAC5B,CAAC,CAAC,kDAAkD,WAAW,CAAC,QAAQ,qCAAqC;wBAC7G,CAAC,CAAC,8BAA8B,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;iBACnE,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,KAAK,EAAE,KAAK,GAAG,CAAC;aACjB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,eAAe;YACzB,KAAK,EAAE,aAAa;SACrB,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,iBAAiB,CAAC,KAAa;QACnC,IAAI,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAEpD,iEAAiE;QACjE,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;YACpD,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACnD,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC3C,MAAM,IAAI,YAAY,CACpB,UAAU,CAAC,KAAK,IAAI,+BAA+B,EACnD,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAClE,UAAU,CAAC,iBAAiB,CAC7B,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC;QAErC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACnD,MAAM,UAAU,GACd,WAAW,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;gBAC5B,CAAC,CAAC,kDAAkD,WAAW,CAAC,QAAQ,qCAAqC;gBAC7G,CAAC,CAAC,8BAA8B,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAEnE,MAAM,IAAI,YAAY,CACpB,SAAS,KAAK,wBAAwB,WAAW,CAAC,KAAK,CAAC,MAAM,sBAAsB,WAAW,CAAC,QAAQ,IAAI,EAC5G,EAAE,UAAU,EAAE,EACd,UAAU,CAAC,WAAW,CACvB,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,YAAY,CACpB,oBAAoB,KAAK,YAAY,EACrC,EAAE,EACF,UAAU,CAAC,kBAAkB,CAC9B,CAAC;QACJ,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,eAAe;QACnB,IAAI,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAEpD,iEAAiE;QACjE,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;YACpD,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACnD,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YAC3C,MAAM,IAAI,YAAY,CACpB,UAAU,CAAC,KAAK,IAAI,+BAA+B,EACnD,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,EAClE,UAAU,CAAC,iBAAiB,CAC7B,CAAC;QACJ,CAAC;QAED,OAAO,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACH,cAAc,CAAC,eAAuB;QACpC,OAAO,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC"}
|
|
@@ -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;AA0LzC;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA2D1D"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { DomElementResolver } from '../../commands/dom/DomElementResolver.js';
|
|
12
12
|
import { getDomContext } from '../../commands/dom/helpers.js';
|
|
13
|
-
import { runCommand } from '../../commands/shared/CommandRunner.js';
|
|
13
|
+
import { runCommand, runJsonCommand } from '../../commands/shared/CommandRunner.js';
|
|
14
14
|
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';
|
|
@@ -26,16 +26,17 @@ import { EXIT_CODES } from '../../utils/exitCodes.js';
|
|
|
26
26
|
* @param options - Command options
|
|
27
27
|
*/
|
|
28
28
|
async function handleA11yTree(options) {
|
|
29
|
-
const tree = await collectA11yTree();
|
|
30
29
|
if (options.json) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
30
|
+
await runJsonCommand(async () => {
|
|
31
|
+
const tree = await collectA11yTree();
|
|
32
|
+
return {
|
|
33
|
+
root: tree.root,
|
|
34
|
+
nodes: Object.fromEntries(tree.nodes),
|
|
35
|
+
count: tree.count,
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
38
|
}
|
|
39
|
+
const tree = await collectA11yTree();
|
|
39
40
|
await runCommand(() => Promise.resolve({ success: true, data: tree }), options, formatA11yTree);
|
|
40
41
|
}
|
|
41
42
|
/**
|
|
@@ -66,7 +67,7 @@ async function handleA11yQuery(pattern, options) {
|
|
|
66
67
|
const tree = await collectA11yTree();
|
|
67
68
|
const result = queryA11yTree(tree, queryPattern);
|
|
68
69
|
if (result.count === 0) {
|
|
69
|
-
throw new CommandError('No
|
|
70
|
+
throw new CommandError('No nodes found matching pattern', {
|
|
70
71
|
suggestion: 'Try a broader query or use "bdg dom a11y tree" to see all elements',
|
|
71
72
|
note: `Pattern: ${JSON.stringify(queryPattern)}`,
|
|
72
73
|
}, EXIT_CODES.RESOURCE_NOT_FOUND);
|
|
@@ -96,7 +97,10 @@ async function handleA11yQuery(pattern, options) {
|
|
|
96
97
|
async function handleA11yDescribe(selectorOrIndex, options) {
|
|
97
98
|
const resolver = DomElementResolver.getInstance();
|
|
98
99
|
const isNumericIndex = resolver.isNumericIndex(selectorOrIndex);
|
|
99
|
-
|
|
100
|
+
/**
|
|
101
|
+
* Fetch a11y node data for a given selector or index.
|
|
102
|
+
*/
|
|
103
|
+
async function fetchA11yNodeData() {
|
|
100
104
|
let node;
|
|
101
105
|
let nodeId;
|
|
102
106
|
if (isNumericIndex) {
|
|
@@ -116,7 +120,14 @@ async function handleA11yDescribe(selectorOrIndex, options) {
|
|
|
116
120
|
if (domNodeId) {
|
|
117
121
|
domContext = await getDomContext(domNodeId);
|
|
118
122
|
}
|
|
119
|
-
return {
|
|
123
|
+
return { node, domContext };
|
|
124
|
+
}
|
|
125
|
+
if (options.json) {
|
|
126
|
+
await runJsonCommand(fetchA11yNodeData);
|
|
127
|
+
}
|
|
128
|
+
await runCommand(async () => {
|
|
129
|
+
const data = await fetchA11yNodeData();
|
|
130
|
+
return { success: true, data };
|
|
120
131
|
}, options, formatA11yNodeWithContext);
|
|
121
132
|
}
|
|
122
133
|
/**
|
|
@@ -128,16 +139,17 @@ export function registerA11yCommands(domCmd) {
|
|
|
128
139
|
const a11y = domCmd
|
|
129
140
|
.command('a11y')
|
|
130
141
|
.description('Accessibility tree inspection and semantic queries')
|
|
131
|
-
.argument('[search]', 'Quick search: index (describe), pattern with ":" (query), or name search')
|
|
132
|
-
.
|
|
142
|
+
.argument('[search]', 'Quick search: index (describe), CSS selector (#id, .class), pattern with ":" (query), or name search')
|
|
143
|
+
.enablePositionalOptions()
|
|
133
144
|
.action(async (search, options) => {
|
|
134
145
|
if (!search) {
|
|
135
146
|
a11y.help();
|
|
136
147
|
return;
|
|
137
148
|
}
|
|
138
149
|
const isNumericIndex = /^\d+$/.test(search);
|
|
150
|
+
const isCssSelector = /^[#.[]/u.test(search) || search.includes(' ');
|
|
139
151
|
const isPatternQuery = search.includes(':') || search.includes('=');
|
|
140
|
-
if (isNumericIndex) {
|
|
152
|
+
if (isNumericIndex || isCssSelector) {
|
|
141
153
|
await handleA11yDescribe(search, options);
|
|
142
154
|
}
|
|
143
155
|
else if (isPatternQuery) {
|
|
@@ -150,7 +162,7 @@ export function registerA11yCommands(domCmd) {
|
|
|
150
162
|
a11y
|
|
151
163
|
.command('tree')
|
|
152
164
|
.description('Dump full accessibility tree (filters ignored nodes)')
|
|
153
|
-
.addOption(jsonOption)
|
|
165
|
+
.addOption(jsonOption())
|
|
154
166
|
.action(async (options) => {
|
|
155
167
|
await handleA11yTree(options);
|
|
156
168
|
});
|
|
@@ -158,7 +170,7 @@ export function registerA11yCommands(domCmd) {
|
|
|
158
170
|
.command('query')
|
|
159
171
|
.description('Query elements by accessibility properties (e.g., "role:button", "name:Submit")')
|
|
160
172
|
.argument('<pattern>', 'Pattern with field prefix - role:button, name:Submit, name:*search* (supports wildcards)')
|
|
161
|
-
.addOption(jsonOption)
|
|
173
|
+
.addOption(jsonOption())
|
|
162
174
|
.action(async (pattern, options) => {
|
|
163
175
|
await handleA11yQuery(pattern, options);
|
|
164
176
|
});
|
|
@@ -166,7 +178,7 @@ export function registerA11yCommands(domCmd) {
|
|
|
166
178
|
.command('describe')
|
|
167
179
|
.description('Get accessibility properties for CSS selector or index')
|
|
168
180
|
.argument('<selectorOrIndex>', 'CSS selector (e.g., "button.submit") or numeric index from query results')
|
|
169
|
-
.addOption(jsonOption)
|
|
181
|
+
.addOption(jsonOption())
|
|
170
182
|
.action(async (selectorOrIndex, options) => {
|
|
171
183
|
await handleA11yDescribe(selectorOrIndex, options);
|
|
172
184
|
});
|