browser-debugger-cli 0.6.5 → 0.6.7
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 +48 -269
- package/dist/commands/__tests__/helpJson.contract.test.d.ts +12 -0
- package/dist/commands/__tests__/helpJson.contract.test.d.ts.map +1 -0
- package/dist/commands/__tests__/helpJson.contract.test.js +121 -0
- package/dist/commands/__tests__/helpJson.contract.test.js.map +1 -0
- package/dist/commands/__tests__/machineReadableHelp.contract.test.js +26 -7
- package/dist/commands/__tests__/machineReadableHelp.contract.test.js.map +1 -1
- package/dist/commands/cdp.d.ts.map +1 -1
- package/dist/commands/cdp.js.map +1 -1
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +17 -91
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/console.d.ts.map +1 -1
- package/dist/commands/console.js.map +1 -1
- package/dist/commands/details.d.ts.map +1 -1
- package/dist/commands/details.js +3 -1
- package/dist/commands/details.js.map +1 -1
- package/dist/commands/dom/DomElementResolver.d.ts +138 -0
- package/dist/commands/dom/DomElementResolver.d.ts.map +1 -0
- package/dist/commands/dom/DomElementResolver.js +173 -0
- package/dist/commands/dom/DomElementResolver.js.map +1 -0
- package/dist/commands/dom/a11y.d.ts.map +1 -1
- package/dist/commands/dom/a11y.js +37 -33
- 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 +1 -1
- package/dist/commands/dom/evalHelpers.js.map +1 -1
- package/dist/commands/dom/formFillHelpers.d.ts +68 -2
- package/dist/commands/dom/formFillHelpers.d.ts.map +1 -1
- package/dist/commands/dom/formFillHelpers.js +216 -70
- 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 +128 -15
- package/dist/commands/dom/formInteraction.js.map +1 -1
- package/dist/commands/dom/helpers.d.ts +11 -2
- package/dist/commands/dom/helpers.d.ts.map +1 -1
- package/dist/commands/dom/helpers.js +50 -1
- package/dist/commands/dom/helpers.js.map +1 -1
- package/dist/commands/dom/index.d.ts.map +1 -1
- package/dist/commands/dom/index.js +105 -52
- package/dist/commands/dom/index.js.map +1 -1
- package/dist/commands/dom/keyMapping.d.ts +56 -0
- package/dist/commands/dom/keyMapping.d.ts.map +1 -0
- package/dist/commands/dom/keyMapping.js +110 -0
- package/dist/commands/dom/keyMapping.js.map +1 -0
- package/dist/commands/dom/reactEventHelpers.d.ts +19 -20
- package/dist/commands/dom/reactEventHelpers.d.ts.map +1 -1
- package/dist/commands/dom/reactEventHelpers.js +73 -80
- package/dist/commands/dom/reactEventHelpers.js.map +1 -1
- package/dist/commands/helpJson.d.ts +165 -0
- package/dist/commands/helpJson.d.ts.map +1 -0
- package/dist/commands/helpJson.js +252 -0
- package/dist/commands/helpJson.js.map +1 -0
- package/dist/commands/machineReadableHelp.d.ts +21 -2
- package/dist/commands/machineReadableHelp.d.ts.map +1 -1
- package/dist/commands/machineReadableHelp.js +95 -60
- package/dist/commands/machineReadableHelp.js.map +1 -1
- package/dist/commands/network.d.ts.map +1 -1
- package/dist/commands/network.js.map +1 -1
- package/dist/commands/peek.d.ts.map +1 -1
- package/dist/commands/peek.js +20 -13
- package/dist/commands/peek.js.map +1 -1
- package/dist/commands/shared/CommandRunner.d.ts +4 -10
- package/dist/commands/shared/CommandRunner.d.ts.map +1 -1
- package/dist/commands/shared/CommandRunner.js +2 -2
- package/dist/commands/shared/CommandRunner.js.map +1 -1
- package/dist/commands/shared/commonOptions.d.ts +0 -15
- package/dist/commands/shared/commonOptions.d.ts.map +1 -1
- package/dist/commands/shared/commonOptions.js +0 -32
- package/dist/commands/shared/commonOptions.js.map +1 -1
- package/dist/commands/shared/optionTypes.d.ts +237 -0
- package/dist/commands/shared/optionTypes.d.ts.map +1 -0
- package/dist/commands/shared/optionTypes.js +20 -0
- package/dist/commands/shared/optionTypes.js.map +1 -0
- package/dist/commands/shared/startHelpers.d.ts.map +1 -1
- package/dist/commands/shared/startHelpers.js +3 -3
- package/dist/commands/shared/startHelpers.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +8 -6
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +17 -43
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/tail.d.ts.map +1 -1
- package/dist/commands/tail.js +49 -59
- package/dist/commands/tail.js.map +1 -1
- package/dist/connection/types.d.ts +2 -1
- package/dist/connection/types.d.ts.map +1 -1
- package/dist/constants.d.ts +19 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +45 -2
- package/dist/constants.js.map +1 -1
- package/dist/daemon/handlers/responseHandler.d.ts.map +1 -1
- package/dist/daemon/handlers/responseHandler.js +1 -0
- package/dist/daemon/handlers/responseHandler.js.map +1 -1
- package/dist/daemon/ipcServer.js +8 -8
- package/dist/daemon/ipcServer.js.map +1 -1
- package/dist/daemon/lifecycle/signalHandlers.d.ts.map +1 -1
- package/dist/daemon/lifecycle/signalHandlers.js +19 -3
- 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 +5 -2
- package/dist/daemon/lifecycle/workerCleanup.js.map +1 -1
- package/dist/daemon/patternDefinitions.d.ts +0 -13
- package/dist/daemon/patternDefinitions.d.ts.map +1 -1
- package/dist/daemon/patternDefinitions.js +0 -17
- package/dist/daemon/patternDefinitions.js.map +1 -1
- package/dist/daemon/worker/commandRegistry.d.ts.map +1 -1
- package/dist/daemon/worker/commandRegistry.js +1 -0
- package/dist/daemon/worker/commandRegistry.js.map +1 -1
- package/dist/index.js +34 -2
- package/dist/index.js.map +1 -1
- package/dist/ipc/__tests__/jsonl.unit.test.js +5 -5
- package/dist/ipc/__tests__/jsonl.unit.test.js.map +1 -1
- package/dist/ipc/protocol/commands.d.ts +2 -0
- package/dist/ipc/protocol/commands.d.ts.map +1 -1
- package/dist/ipc/protocol/commands.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/ipc/utils/responseValidator.d.ts +7 -1
- package/dist/ipc/utils/responseValidator.d.ts.map +1 -1
- package/dist/ipc/utils/responseValidator.js +6 -1
- package/dist/ipc/utils/responseValidator.js.map +1 -1
- package/dist/session/QueryCacheManager.d.ts +140 -0
- package/dist/session/QueryCacheManager.d.ts.map +1 -0
- package/dist/session/QueryCacheManager.js +233 -0
- package/dist/session/QueryCacheManager.js.map +1 -0
- package/dist/session/cleanup.d.ts +63 -1
- package/dist/session/cleanup.d.ts.map +1 -1
- package/dist/session/cleanup.js +191 -65
- package/dist/session/cleanup.js.map +1 -1
- package/dist/session/queryCache.d.ts +25 -14
- package/dist/session/queryCache.d.ts.map +1 -1
- package/dist/session/queryCache.js +31 -60
- package/dist/session/queryCache.js.map +1 -1
- package/dist/telemetry/__tests__/roleInference.unit.test.d.ts +9 -0
- package/dist/telemetry/__tests__/roleInference.unit.test.d.ts.map +1 -0
- package/dist/telemetry/__tests__/roleInference.unit.test.js +138 -0
- package/dist/telemetry/__tests__/roleInference.unit.test.js.map +1 -0
- package/dist/telemetry/dom.d.ts +1 -0
- package/dist/telemetry/dom.d.ts.map +1 -1
- package/dist/telemetry/dom.js +9 -4
- package/dist/telemetry/dom.js.map +1 -1
- package/dist/telemetry/filters.d.ts +3 -0
- package/dist/telemetry/filters.d.ts.map +1 -1
- package/dist/telemetry/filters.js +25 -3
- package/dist/telemetry/filters.js.map +1 -1
- package/dist/telemetry/network.d.ts.map +1 -1
- package/dist/telemetry/network.js +35 -6
- package/dist/telemetry/network.js.map +1 -1
- package/dist/telemetry/roleInference.d.ts +50 -0
- package/dist/telemetry/roleInference.d.ts.map +1 -0
- package/dist/telemetry/roleInference.js +163 -0
- package/dist/telemetry/roleInference.js.map +1 -0
- package/dist/telemetry/utils.d.ts +0 -57
- package/dist/telemetry/utils.d.ts.map +1 -1
- package/dist/telemetry/utils.js +0 -71
- package/dist/telemetry/utils.js.map +1 -1
- package/dist/types/dom.d.ts +11 -0
- package/dist/types/dom.d.ts.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/formatters/a11y.d.ts +13 -3
- package/dist/ui/formatters/a11y.d.ts.map +1 -1
- package/dist/ui/formatters/a11y.js +18 -3
- package/dist/ui/formatters/a11y.js.map +1 -1
- package/dist/ui/formatters/preview.d.ts +4 -0
- package/dist/ui/formatters/preview.d.ts.map +1 -1
- package/dist/ui/formatters/preview.js +26 -43
- package/dist/ui/formatters/preview.js.map +1 -1
- package/dist/ui/formatters/sessionFormatters.d.ts.map +1 -1
- package/dist/ui/formatters/sessionFormatters.js +2 -0
- package/dist/ui/formatters/sessionFormatters.js.map +1 -1
- package/dist/ui/logging/index.d.ts +1 -1
- package/dist/ui/logging/index.d.ts.map +1 -1
- package/dist/ui/logging/index.js +1 -1
- package/dist/ui/logging/index.js.map +1 -1
- package/dist/ui/logging/logger.d.ts +21 -0
- package/dist/ui/logging/logger.d.ts.map +1 -1
- package/dist/ui/logging/logger.js +24 -6
- package/dist/ui/logging/logger.js.map +1 -1
- package/dist/ui/messages/commands.d.ts +0 -14
- package/dist/ui/messages/commands.d.ts.map +1 -1
- package/dist/ui/messages/commands.js +0 -18
- package/dist/ui/messages/commands.js.map +1 -1
- package/dist/ui/messages/errors.d.ts +0 -16
- package/dist/ui/messages/errors.d.ts.map +1 -1
- package/dist/ui/messages/errors.js +0 -18
- package/dist/ui/messages/errors.js.map +1 -1
- package/dist/ui/messages/hints.d.ts +0 -10
- package/dist/ui/messages/hints.d.ts.map +1 -1
- package/dist/ui/messages/hints.js +0 -12
- package/dist/ui/messages/hints.js.map +1 -1
- package/dist/utils/decisionTrees.d.ts +0 -17
- package/dist/utils/decisionTrees.d.ts.map +1 -1
- package/dist/utils/decisionTrees.js +5 -21
- package/dist/utils/decisionTrees.js.map +1 -1
- package/dist/utils/errorMapping.d.ts +60 -0
- package/dist/utils/errorMapping.d.ts.map +1 -0
- package/dist/utils/errorMapping.js +97 -0
- package/dist/utils/errorMapping.js.map +1 -0
- package/dist/utils/file.d.ts +27 -0
- package/dist/utils/file.d.ts.map +1 -0
- package/dist/utils/file.js +37 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/levenshtein.d.ts +0 -17
- package/dist/utils/levenshtein.d.ts.map +1 -1
- package/dist/utils/levenshtein.js +0 -31
- package/dist/utils/levenshtein.js.map +1 -1
- package/dist/utils/taskMappings.d.ts +0 -17
- package/dist/utils/taskMappings.d.ts.map +1 -1
- package/dist/utils/taskMappings.js +5 -21
- package/dist/utils/taskMappings.js.map +1 -1
- package/dist/utils/typeGuards.d.ts +62 -0
- package/dist/utils/typeGuards.d.ts.map +1 -0
- package/dist/utils/typeGuards.js +94 -0
- package/dist/utils/typeGuards.js.map +1 -0
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +15 -2
- package/dist/utils/url.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,14 +1,16 @@
|
|
|
1
|
+
import { DomElementResolver } from '../../commands/dom/DomElementResolver.js';
|
|
1
2
|
import { registerA11yCommands } from '../../commands/dom/a11y.js';
|
|
2
|
-
import { queryDOMElements, getDOMElements, capturePageScreenshot } from '../../commands/dom/helpers.js';
|
|
3
|
+
import { queryDOMElements, getDOMElements, capturePageScreenshot, getDomContext, } from '../../commands/dom/helpers.js';
|
|
3
4
|
import { runCommand } from '../../commands/shared/CommandRunner.js';
|
|
5
|
+
import { positiveIntRule } from '../../commands/shared/validation.js';
|
|
6
|
+
import { QueryCacheManager } from '../../session/QueryCacheManager.js';
|
|
4
7
|
import { resolveA11yNode } from '../../telemetry/a11y.js';
|
|
8
|
+
import { synthesizeA11yNode } from '../../telemetry/roleInference.js';
|
|
5
9
|
import { CommandError } from '../../ui/errors/index.js';
|
|
6
10
|
import { formatDomQuery, formatDomGet, formatDomEval, formatDomScreenshot, } from '../../ui/formatters/dom.js';
|
|
7
|
-
import { semantic } from '../../ui/formatters/semantic.js';
|
|
8
11
|
import { elementNotFoundError } from '../../ui/messages/errors.js';
|
|
9
12
|
import { EXIT_CODES } from '../../utils/exitCodes.js';
|
|
10
13
|
import { filterDefined } from '../../utils/objects.js';
|
|
11
|
-
import { parsePositiveIntOption } from '../../utils/validation.js';
|
|
12
14
|
/**
|
|
13
15
|
* Handle bdg dom query <selector> command
|
|
14
16
|
*
|
|
@@ -22,37 +24,16 @@ import { parsePositiveIntOption } from '../../utils/validation.js';
|
|
|
22
24
|
async function handleDomQuery(selector, options) {
|
|
23
25
|
await runCommand(async () => {
|
|
24
26
|
const result = await queryDOMElements(selector);
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
+
const cacheManager = QueryCacheManager.getInstance();
|
|
28
|
+
const navigationId = await cacheManager.getCurrentNavigationId();
|
|
29
|
+
const resultWithNavId = {
|
|
30
|
+
...result,
|
|
31
|
+
...(navigationId !== null && { navigationId }),
|
|
32
|
+
};
|
|
33
|
+
await cacheManager.set(resultWithNavId);
|
|
27
34
|
return { success: true, data: result };
|
|
28
35
|
}, options, formatDomQuery);
|
|
29
36
|
}
|
|
30
|
-
/**
|
|
31
|
-
* Retrieve cached node by index with validation.
|
|
32
|
-
*
|
|
33
|
-
* @param index - Zero-based index from query results
|
|
34
|
-
* @returns Node from cache
|
|
35
|
-
* @throws CommandError if cache missing, index out of range, or node not found
|
|
36
|
-
*/
|
|
37
|
-
async function getCachedNodeByIndex(index) {
|
|
38
|
-
const { getSessionQueryCache } = await import('../../session/queryCache.js');
|
|
39
|
-
const cachedQuery = getSessionQueryCache();
|
|
40
|
-
if (!cachedQuery) {
|
|
41
|
-
throw new CommandError('No cached query results found', {
|
|
42
|
-
suggestion: 'Run "bdg dom query <selector>" first to generate indexed results',
|
|
43
|
-
}, EXIT_CODES.INVALID_ARGUMENTS);
|
|
44
|
-
}
|
|
45
|
-
if (index < 0 || index >= cachedQuery.nodes.length) {
|
|
46
|
-
throw new CommandError(`Index ${index} out of range (found ${cachedQuery.nodes.length} elements)`, {
|
|
47
|
-
suggestion: `Use an index between 0 and ${cachedQuery.nodes.length - 1}`,
|
|
48
|
-
}, EXIT_CODES.INVALID_ARGUMENTS);
|
|
49
|
-
}
|
|
50
|
-
const targetNode = cachedQuery.nodes[index];
|
|
51
|
-
if (!targetNode) {
|
|
52
|
-
throw new CommandError(`Element at index ${index} not found`, {}, EXIT_CODES.RESOURCE_NOT_FOUND);
|
|
53
|
-
}
|
|
54
|
-
return targetNode;
|
|
55
|
-
}
|
|
56
37
|
/**
|
|
57
38
|
* Handle bdg dom get command
|
|
58
39
|
*
|
|
@@ -76,9 +57,10 @@ async function handleDomGet(selectorOrIndex, options) {
|
|
|
76
57
|
* Handle get command with numeric index
|
|
77
58
|
*/
|
|
78
59
|
async function handleIndexGet(index, options) {
|
|
60
|
+
const resolver = DomElementResolver.getInstance();
|
|
79
61
|
if (options.raw) {
|
|
80
62
|
await runCommand(async () => {
|
|
81
|
-
const targetNode = await
|
|
63
|
+
const targetNode = await resolver.getNodeIdForIndex(index);
|
|
82
64
|
const getOptions = filterDefined({
|
|
83
65
|
nodeId: targetNode.nodeId,
|
|
84
66
|
});
|
|
@@ -88,13 +70,18 @@ async function handleIndexGet(index, options) {
|
|
|
88
70
|
}
|
|
89
71
|
else {
|
|
90
72
|
await runCommand(async () => {
|
|
91
|
-
const targetNode = await
|
|
92
|
-
const
|
|
73
|
+
const targetNode = await resolver.getNodeIdForIndex(index);
|
|
74
|
+
const [a11yNode, domContext] = await Promise.all([
|
|
75
|
+
resolveA11yNode('', targetNode.nodeId),
|
|
76
|
+
getDomContext(targetNode.nodeId),
|
|
77
|
+
]);
|
|
78
|
+
// Graceful degradation: synthesize node from DOM context when a11y unavailable
|
|
79
|
+
const node = a11yNode ?? (domContext ? synthesizeA11yNode(domContext, targetNode.nodeId) : null);
|
|
93
80
|
if (!node) {
|
|
94
81
|
throw new CommandError(elementNotFoundError(`index ${index}`), {}, EXIT_CODES.RESOURCE_NOT_FOUND);
|
|
95
82
|
}
|
|
96
|
-
return { success: true, data: node };
|
|
97
|
-
}, options,
|
|
83
|
+
return { success: true, data: { node, domContext } };
|
|
84
|
+
}, options, formatSemanticNodeWithContext);
|
|
98
85
|
}
|
|
99
86
|
}
|
|
100
87
|
/**
|
|
@@ -115,24 +102,93 @@ async function handleSelectorGet(selector, options) {
|
|
|
115
102
|
}
|
|
116
103
|
else {
|
|
117
104
|
await runCommand(async () => {
|
|
118
|
-
const
|
|
105
|
+
const a11yNode = await resolveA11yNode(selector);
|
|
106
|
+
// Fetch DOM context for enrichment or fallback
|
|
107
|
+
let domContext = null;
|
|
108
|
+
let nodeId;
|
|
109
|
+
if (a11yNode?.backendDOMNodeId) {
|
|
110
|
+
nodeId = a11yNode.backendDOMNodeId;
|
|
111
|
+
domContext = await getDomContext(nodeId);
|
|
112
|
+
}
|
|
113
|
+
else if (!a11yNode) {
|
|
114
|
+
// Try to get DOM context by querying the selector directly
|
|
115
|
+
const { callCDP } = await import('../../ipc/client.js');
|
|
116
|
+
const docResponse = await callCDP('DOM.getDocument', {});
|
|
117
|
+
const doc = docResponse.data?.result;
|
|
118
|
+
if (doc?.root?.nodeId) {
|
|
119
|
+
const queryResponse = await callCDP('DOM.querySelector', {
|
|
120
|
+
nodeId: doc.root.nodeId,
|
|
121
|
+
selector,
|
|
122
|
+
});
|
|
123
|
+
const queryResult = queryResponse.data?.result;
|
|
124
|
+
if (queryResult?.nodeId) {
|
|
125
|
+
nodeId = queryResult.nodeId;
|
|
126
|
+
domContext = await getDomContext(nodeId);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Graceful degradation: synthesize node from DOM context when a11y unavailable
|
|
131
|
+
const node = a11yNode ?? (domContext && nodeId ? synthesizeA11yNode(domContext, nodeId) : null);
|
|
119
132
|
if (!node) {
|
|
120
133
|
throw new CommandError(elementNotFoundError(selector), {}, EXIT_CODES.RESOURCE_NOT_FOUND);
|
|
121
134
|
}
|
|
122
|
-
return { success: true, data: node };
|
|
123
|
-
}, options,
|
|
135
|
+
return { success: true, data: { node, domContext } };
|
|
136
|
+
}, options, formatSemanticNodeWithContext);
|
|
124
137
|
}
|
|
125
138
|
}
|
|
126
139
|
/**
|
|
127
|
-
* Formatter for single semantic node
|
|
140
|
+
* Formatter for single semantic node with DOM context fallback.
|
|
141
|
+
*
|
|
142
|
+
* When a11y name is missing, shows DOM context (tag, classes, text preview)
|
|
143
|
+
* to provide useful information instead of just "[Role]".
|
|
144
|
+
* Shows "(inferred from DOM)" indicator when node is synthesized.
|
|
128
145
|
*/
|
|
129
|
-
function
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
146
|
+
function formatSemanticNodeWithContext(data) {
|
|
147
|
+
const { node, domContext } = data;
|
|
148
|
+
// Build the role text
|
|
149
|
+
let roleText = `[${capitalize(node.role)}]`;
|
|
150
|
+
if (node.role.toLowerCase() === 'heading' && node.properties?.['level'] !== undefined) {
|
|
151
|
+
const level = node.properties['level'];
|
|
152
|
+
const levelNum = typeof level === 'number' ? level : Number(level);
|
|
153
|
+
if (!isNaN(levelNum)) {
|
|
154
|
+
roleText = `[Heading L${levelNum}]`;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Build the name/context text
|
|
158
|
+
let contextText = '';
|
|
159
|
+
if (node.name) {
|
|
160
|
+
// Use a11y name when available
|
|
161
|
+
contextText = ` "${node.name}"`;
|
|
162
|
+
}
|
|
163
|
+
else if (domContext) {
|
|
164
|
+
// Fallback to DOM context when a11y name is missing
|
|
165
|
+
const tagPart = `<${domContext.tag}`;
|
|
166
|
+
const classPart = domContext.classes && domContext.classes.length > 0
|
|
167
|
+
? `.${domContext.classes.slice(0, 3).join('.')}`
|
|
168
|
+
: '';
|
|
169
|
+
const previewPart = domContext.preview ? ` "${domContext.preview}"` : '';
|
|
170
|
+
contextText = ` ${tagPart}${classPart}>${previewPart}`;
|
|
171
|
+
}
|
|
172
|
+
// Build properties text
|
|
173
|
+
const props = [];
|
|
174
|
+
if (node.focusable)
|
|
175
|
+
props.push('focusable');
|
|
176
|
+
if (node.focused)
|
|
177
|
+
props.push('focused');
|
|
178
|
+
if (node.disabled)
|
|
179
|
+
props.push('disabled');
|
|
180
|
+
if (node.required)
|
|
181
|
+
props.push('required');
|
|
182
|
+
const propsText = props.length > 0 ? ` (${props.join(', ')})` : '';
|
|
183
|
+
// Add inferred indicator when node is synthesized from DOM
|
|
184
|
+
const inferredText = node.inferred ? ' (inferred from DOM)' : '';
|
|
185
|
+
return `${roleText}${contextText}${propsText}${inferredText}`;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Capitalize first letter of string.
|
|
189
|
+
*/
|
|
190
|
+
function capitalize(str) {
|
|
191
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
136
192
|
}
|
|
137
193
|
/**
|
|
138
194
|
* Handle bdg dom screenshot <path> command
|
|
@@ -171,11 +227,8 @@ async function handleDomEval(script, options) {
|
|
|
171
227
|
const { validateActiveSession, getValidatedSessionMetadata, verifyTargetExists, executeScript, } = await import('../../commands/dom/evalHelpers.js');
|
|
172
228
|
validateActiveSession();
|
|
173
229
|
const metadata = getValidatedSessionMetadata();
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
min: 1,
|
|
177
|
-
max: 65535,
|
|
178
|
-
});
|
|
230
|
+
const portRule = positiveIntRule({ min: 1, max: 65535, default: 9222 });
|
|
231
|
+
const port = portRule.validate(options.port);
|
|
179
232
|
await verifyTargetExists(metadata, port);
|
|
180
233
|
const cdp = new CDPConnection();
|
|
181
234
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/dom/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/dom/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key name to CDP key event parameters mapping.
|
|
3
|
+
*
|
|
4
|
+
* Maps human-readable key names to Chrome DevTools Protocol Input.dispatchKeyEvent parameters.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* CDP key event parameters for a specific key.
|
|
8
|
+
*/
|
|
9
|
+
export interface KeyDefinition {
|
|
10
|
+
/** Physical key code (e.g., "Enter", "KeyA") */
|
|
11
|
+
code: string;
|
|
12
|
+
/** Logical key value (e.g., "Enter", "a") */
|
|
13
|
+
key: string;
|
|
14
|
+
/** Windows virtual key code */
|
|
15
|
+
keyCode: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Modifier key bit flags for CDP Input.dispatchKeyEvent.
|
|
19
|
+
*/
|
|
20
|
+
export declare const MODIFIER_FLAGS: {
|
|
21
|
+
readonly shift: 1;
|
|
22
|
+
readonly ctrl: 2;
|
|
23
|
+
readonly alt: 4;
|
|
24
|
+
readonly meta: 8;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Get key definition by name (case-insensitive).
|
|
28
|
+
*
|
|
29
|
+
* @param keyName - Human-readable key name (e.g., "Enter", "Tab", "a")
|
|
30
|
+
* @returns Key definition or undefined if not found
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const def = getKeyDefinition('Enter');
|
|
35
|
+
* // { code: 'Enter', key: 'Enter', keyCode: 13 }
|
|
36
|
+
*
|
|
37
|
+
* const letterDef = getKeyDefinition('a');
|
|
38
|
+
* // { code: 'KeyA', key: 'a', keyCode: 65 }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare function getKeyDefinition(keyName: string): KeyDefinition | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Parse modifier string into CDP modifier flags.
|
|
44
|
+
*
|
|
45
|
+
* @param modifiers - Comma-separated modifier names (e.g., "ctrl,shift")
|
|
46
|
+
* @returns Combined modifier bit flags
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* parseModifiers('ctrl,shift'); // Returns 3 (1 + 2)
|
|
51
|
+
* parseModifiers('alt'); // Returns 4
|
|
52
|
+
* parseModifiers(''); // Returns 0
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function parseModifiers(modifiers: string | undefined): number;
|
|
56
|
+
//# sourceMappingURL=keyMapping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyMapping.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/keyMapping.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;CAKjB,CAAC;AA0DX;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAE3E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAgBpE"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Key name to CDP key event parameters mapping.
|
|
3
|
+
*
|
|
4
|
+
* Maps human-readable key names to Chrome DevTools Protocol Input.dispatchKeyEvent parameters.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Modifier key bit flags for CDP Input.dispatchKeyEvent.
|
|
8
|
+
*/
|
|
9
|
+
export const MODIFIER_FLAGS = {
|
|
10
|
+
shift: 1,
|
|
11
|
+
ctrl: 2,
|
|
12
|
+
alt: 4,
|
|
13
|
+
meta: 8,
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Map of supported key names to their CDP parameters.
|
|
17
|
+
*
|
|
18
|
+
* Keys are case-insensitive for user convenience.
|
|
19
|
+
*/
|
|
20
|
+
const KEY_DEFINITIONS = {
|
|
21
|
+
enter: { code: 'Enter', key: 'Enter', keyCode: 13 },
|
|
22
|
+
tab: { code: 'Tab', key: 'Tab', keyCode: 9 },
|
|
23
|
+
escape: { code: 'Escape', key: 'Escape', keyCode: 27 },
|
|
24
|
+
space: { code: 'Space', key: ' ', keyCode: 32 },
|
|
25
|
+
backspace: { code: 'Backspace', key: 'Backspace', keyCode: 8 },
|
|
26
|
+
delete: { code: 'Delete', key: 'Delete', keyCode: 46 },
|
|
27
|
+
arrowup: { code: 'ArrowUp', key: 'ArrowUp', keyCode: 38 },
|
|
28
|
+
arrowdown: { code: 'ArrowDown', key: 'ArrowDown', keyCode: 40 },
|
|
29
|
+
arrowleft: { code: 'ArrowLeft', key: 'ArrowLeft', keyCode: 37 },
|
|
30
|
+
arrowright: { code: 'ArrowRight', key: 'ArrowRight', keyCode: 39 },
|
|
31
|
+
home: { code: 'Home', key: 'Home', keyCode: 36 },
|
|
32
|
+
end: { code: 'End', key: 'End', keyCode: 35 },
|
|
33
|
+
pageup: { code: 'PageUp', key: 'PageUp', keyCode: 33 },
|
|
34
|
+
pagedown: { code: 'PageDown', key: 'PageDown', keyCode: 34 },
|
|
35
|
+
f1: { code: 'F1', key: 'F1', keyCode: 112 },
|
|
36
|
+
f2: { code: 'F2', key: 'F2', keyCode: 113 },
|
|
37
|
+
f3: { code: 'F3', key: 'F3', keyCode: 114 },
|
|
38
|
+
f4: { code: 'F4', key: 'F4', keyCode: 115 },
|
|
39
|
+
f5: { code: 'F5', key: 'F5', keyCode: 116 },
|
|
40
|
+
f6: { code: 'F6', key: 'F6', keyCode: 117 },
|
|
41
|
+
f7: { code: 'F7', key: 'F7', keyCode: 118 },
|
|
42
|
+
f8: { code: 'F8', key: 'F8', keyCode: 119 },
|
|
43
|
+
f9: { code: 'F9', key: 'F9', keyCode: 120 },
|
|
44
|
+
f10: { code: 'F10', key: 'F10', keyCode: 121 },
|
|
45
|
+
f11: { code: 'F11', key: 'F11', keyCode: 122 },
|
|
46
|
+
f12: { code: 'F12', key: 'F12', keyCode: 123 },
|
|
47
|
+
};
|
|
48
|
+
for (let i = 0; i < 26; i++) {
|
|
49
|
+
const letter = String.fromCharCode(97 + i); // 'a' = 97
|
|
50
|
+
const upperLetter = letter.toUpperCase();
|
|
51
|
+
KEY_DEFINITIONS[letter] = {
|
|
52
|
+
code: `Key${upperLetter}`,
|
|
53
|
+
key: letter,
|
|
54
|
+
keyCode: 65 + i, // 'A' = 65
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
for (let i = 0; i < 10; i++) {
|
|
58
|
+
const digit = String(i);
|
|
59
|
+
KEY_DEFINITIONS[digit] = {
|
|
60
|
+
code: `Digit${digit}`,
|
|
61
|
+
key: digit,
|
|
62
|
+
keyCode: 48 + i, // '0' = 48
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get key definition by name (case-insensitive).
|
|
67
|
+
*
|
|
68
|
+
* @param keyName - Human-readable key name (e.g., "Enter", "Tab", "a")
|
|
69
|
+
* @returns Key definition or undefined if not found
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* const def = getKeyDefinition('Enter');
|
|
74
|
+
* // { code: 'Enter', key: 'Enter', keyCode: 13 }
|
|
75
|
+
*
|
|
76
|
+
* const letterDef = getKeyDefinition('a');
|
|
77
|
+
* // { code: 'KeyA', key: 'a', keyCode: 65 }
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export function getKeyDefinition(keyName) {
|
|
81
|
+
return KEY_DEFINITIONS[keyName.toLowerCase()];
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Parse modifier string into CDP modifier flags.
|
|
85
|
+
*
|
|
86
|
+
* @param modifiers - Comma-separated modifier names (e.g., "ctrl,shift")
|
|
87
|
+
* @returns Combined modifier bit flags
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* parseModifiers('ctrl,shift'); // Returns 3 (1 + 2)
|
|
92
|
+
* parseModifiers('alt'); // Returns 4
|
|
93
|
+
* parseModifiers(''); // Returns 0
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export function parseModifiers(modifiers) {
|
|
97
|
+
if (!modifiers) {
|
|
98
|
+
return 0;
|
|
99
|
+
}
|
|
100
|
+
let flags = 0;
|
|
101
|
+
const parts = modifiers.toLowerCase().split(',');
|
|
102
|
+
for (const part of parts) {
|
|
103
|
+
const trimmed = part.trim();
|
|
104
|
+
if (trimmed in MODIFIER_FLAGS) {
|
|
105
|
+
flags |= MODIFIER_FLAGS[trimmed];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return flags;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=keyMapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyMapping.js","sourceRoot":"","sources":["../../../src/commands/dom/keyMapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,22 +16,16 @@
|
|
|
16
16
|
* @remarks
|
|
17
17
|
* Works with React, Vue, Angular, and vanilla JS applications.
|
|
18
18
|
*/
|
|
19
|
-
export declare const REACT_FILL_SCRIPT = "\n(function(selector, value, options) {\n const
|
|
19
|
+
export declare const REACT_FILL_SCRIPT = "\n(function(selector, value, options) {\n const allMatches = document.querySelectorAll(selector);\n \n if (allMatches.length === 0) {\n return { \n success: false, \n error: 'Element not found',\n selector: selector\n };\n }\n \n let el;\n const index = options.index;\n \n // If index is provided, use it directly (1-based)\n if (typeof index === 'number' && index > 0) {\n if (index > allMatches.length) {\n return {\n success: false,\n error: 'Index out of range',\n selector: selector,\n matchCount: allMatches.length,\n requestedIndex: index,\n suggestion: 'Use --index between 1 and ' + allMatches.length\n };\n }\n el = allMatches[index - 1];\n } else {\n el = allMatches[0];\n }\n \n const tagName = el.tagName.toLowerCase();\n const inputType = el.type?.toLowerCase();\n \n const isFillable = (\n tagName === 'input' || \n tagName === 'textarea' || \n tagName === 'select' ||\n el.isContentEditable\n );\n \n if (!isFillable) {\n return {\n success: false,\n error: 'Element is not fillable',\n elementType: tagName,\n suggestion: 'Only input, textarea, select, and contenteditable elements can be filled'\n };\n }\n \n el.focus();\n \n if (tagName === 'select') {\n el.value = value;\n el.dispatchEvent(new Event('change', { bubbles: true }));\n } else if (inputType === 'checkbox' || inputType === 'radio') {\n const shouldCheck = value === 'true' || value === true;\n el.checked = shouldCheck;\n el.dispatchEvent(new Event('change', { bubbles: true }));\n } else if (inputType === 'file') {\n return {\n success: false,\n error: 'File inputs require CDP DOM.setFileInputFiles method',\n suggestion: 'Use: bdg cdp DOM.setFileInputFiles --params {\\\"files\\\":[\\\"path\\\"]}'\n };\n } else if (el.isContentEditable) {\n el.textContent = value;\n el.dispatchEvent(new Event('input', { bubbles: true }));\n } else {\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n window.HTMLInputElement.prototype,\n 'value'\n )?.set;\n \n const nativeTextAreaValueSetter = Object.getOwnPropertyDescriptor(\n window.HTMLTextAreaElement.prototype,\n 'value'\n )?.set;\n \n const setter = tagName === 'textarea' \n ? nativeTextAreaValueSetter \n : nativeInputValueSetter;\n \n if (setter) {\n setter.call(el, value);\n } else {\n el.value = value;\n }\n \n el.dispatchEvent(new Event('input', { bubbles: true }));\n el.dispatchEvent(new Event('change', { bubbles: true }));\n }\n \n if (options.blur !== false) {\n el.blur();\n el.dispatchEvent(new FocusEvent('focusout', { bubbles: true }));\n }\n \n return {\n success: true,\n selector: selector,\n value: el.value || el.textContent,\n elementType: tagName,\n inputType: inputType || null,\n checked: el.checked || undefined\n };\n})\n";
|
|
20
20
|
/**
|
|
21
21
|
* JavaScript function to click an element.
|
|
22
22
|
*
|
|
23
23
|
* @remarks
|
|
24
|
-
*
|
|
25
|
-
* When
|
|
24
|
+
* Handles both direct selector matching and indexed selection.
|
|
25
|
+
* When index is provided, selects the nth matching element (1-based).
|
|
26
|
+
* When selector matches multiple elements without index, prioritizes visible ones.
|
|
26
27
|
*/
|
|
27
|
-
export declare const CLICK_ELEMENT_SCRIPT = "\n(function(selector) {\n
|
|
28
|
-
/**
|
|
29
|
-
* JavaScript function to get multiple elements by selector.
|
|
30
|
-
*
|
|
31
|
-
* @remarks
|
|
32
|
-
* Used when --index is specified to select from multiple matches.
|
|
33
|
-
*/
|
|
34
|
-
export declare const GET_ELEMENT_BY_INDEX_SCRIPT = "\n(function(selector, index) {\n const elements = document.querySelectorAll(selector);\n \n if (elements.length === 0) {\n return {\n success: false,\n error: 'No elements found',\n selector: selector,\n matchCount: 0\n };\n }\n \n if (index < 1 || index > elements.length) {\n return {\n success: false,\n error: 'Index out of range',\n selector: selector,\n matchCount: elements.length,\n requestedIndex: index,\n suggestion: `Use --index between 1 and ${elements.length}`\n };\n }\n \n const el = elements[index - 1]; // Convert to 0-based\n \n function buildUniquePath(element) {\n if (element.id) {\n return `#${CSS.escape(element.id)}`;\n }\n \n const path = [];\n let current = element;\n \n while (current && current !== document.documentElement) {\n let selector = current.tagName.toLowerCase();\n \n if (current.parentElement) {\n const siblings = Array.from(current.parentElement.children);\n const sameTagSiblings = siblings.filter(\n (sibling) => sibling.tagName === current!.tagName\n );\n \n if (sameTagSiblings.length > 1) {\n const index = sameTagSiblings.indexOf(current) + 1;\n selector += `:nth-of-type(${index})`;\n }\n }\n \n path.unshift(selector);\n current = current.parentElement;\n }\n \n return 'html > ' + path.join(' > ');\n }\n \n const uniqueSelector = buildUniquePath(el);\n \n return {\n success: true,\n selector: selector,\n matchCount: elements.length,\n selectedIndex: index,\n uniqueSelector: uniqueSelector\n };\n})\n";
|
|
28
|
+
export declare const CLICK_ELEMENT_SCRIPT = "\n(function(selector, index) {\n const allMatches = document.querySelectorAll(selector);\n \n if (allMatches.length === 0) {\n return {\n success: false,\n error: 'Element not found',\n selector: selector\n };\n }\n \n let el;\n \n // If index is provided, use it directly (1-based)\n if (typeof index === 'number' && index > 0) {\n if (index > allMatches.length) {\n return {\n success: false,\n error: 'Index out of range',\n selector: selector,\n matchCount: allMatches.length,\n requestedIndex: index,\n suggestion: 'Use --index between 1 and ' + allMatches.length\n };\n }\n el = allMatches[index - 1];\n } else if (allMatches.length === 1) {\n // Single match - use it directly\n el = allMatches[0];\n } else {\n // Multiple matches without index - find first visible one\n el = allMatches[0];\n for (const candidate of allMatches) {\n const style = window.getComputedStyle(candidate);\n const rect = candidate.getBoundingClientRect();\n \n const hasSize = rect.width > 0 && rect.height > 0;\n const isDisplayed = style.display !== 'none' && style.visibility !== 'hidden';\n const isOpaque = parseFloat(style.opacity) > 0;\n const isPositioned = candidate.offsetParent !== null || style.position === 'fixed';\n \n const isVisible = hasSize && isDisplayed && isOpaque && isPositioned;\n \n if (isVisible) {\n el = candidate;\n break;\n }\n }\n }\n \n const tagName = el.tagName.toLowerCase();\n const isClickable = (\n tagName === 'button' ||\n tagName === 'a' ||\n tagName === 'input' ||\n el.onclick !== null ||\n el.getAttribute('role') === 'button' ||\n window.getComputedStyle(el).cursor === 'pointer'\n );\n \n if (!isClickable) {\n console.warn('Warning: Element may not be clickable:', el);\n }\n \n el.scrollIntoView({ behavior: 'auto', block: 'center' });\n \n el.click();\n \n return {\n success: true,\n selector: selector,\n elementType: tagName,\n clickable: isClickable,\n matchCount: allMatches.length,\n selectedIndex: typeof index === 'number' ? index : undefined\n };\n})\n";
|
|
35
29
|
/**
|
|
36
30
|
* Options for filling an element.
|
|
37
31
|
*/
|
|
@@ -63,18 +57,23 @@ export interface ClickResult {
|
|
|
63
57
|
selector?: string;
|
|
64
58
|
elementType?: string;
|
|
65
59
|
clickable?: boolean;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Result of getting element by index.
|
|
69
|
-
*/
|
|
70
|
-
export interface ElementByIndexResult {
|
|
71
|
-
success: boolean;
|
|
72
|
-
error?: string;
|
|
73
|
-
selector?: string;
|
|
74
60
|
matchCount?: number;
|
|
75
61
|
selectedIndex?: number;
|
|
76
62
|
requestedIndex?: number;
|
|
77
|
-
uniqueSelector?: string;
|
|
78
63
|
suggestion?: string;
|
|
79
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Type guard for FillResult.
|
|
67
|
+
*
|
|
68
|
+
* @param value - Value to check
|
|
69
|
+
* @returns True if value is a valid FillResult
|
|
70
|
+
*/
|
|
71
|
+
export declare function isFillResult(value: unknown): value is FillResult;
|
|
72
|
+
/**
|
|
73
|
+
* Type guard for ClickResult.
|
|
74
|
+
*
|
|
75
|
+
* @param value - Value to check
|
|
76
|
+
* @returns True if value is a valid ClickResult
|
|
77
|
+
*/
|
|
78
|
+
export declare function isClickResult(value: unknown): value is ClickResult;
|
|
80
79
|
//# sourceMappingURL=reactEventHelpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactEventHelpers.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/reactEventHelpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB
|
|
1
|
+
{"version":3,"file":"reactEventHelpers.d.ts","sourceRoot":"","sources":["../../../src/commands/dom/reactEventHelpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,o8FA4G7B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,isEA8EhC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAIhE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAIlE"}
|