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.
Files changed (223) hide show
  1. package/README.md +48 -269
  2. package/dist/commands/__tests__/helpJson.contract.test.d.ts +12 -0
  3. package/dist/commands/__tests__/helpJson.contract.test.d.ts.map +1 -0
  4. package/dist/commands/__tests__/helpJson.contract.test.js +121 -0
  5. package/dist/commands/__tests__/helpJson.contract.test.js.map +1 -0
  6. package/dist/commands/__tests__/machineReadableHelp.contract.test.js +26 -7
  7. package/dist/commands/__tests__/machineReadableHelp.contract.test.js.map +1 -1
  8. package/dist/commands/cdp.d.ts.map +1 -1
  9. package/dist/commands/cdp.js.map +1 -1
  10. package/dist/commands/cleanup.d.ts.map +1 -1
  11. package/dist/commands/cleanup.js +17 -91
  12. package/dist/commands/cleanup.js.map +1 -1
  13. package/dist/commands/console.d.ts.map +1 -1
  14. package/dist/commands/console.js.map +1 -1
  15. package/dist/commands/details.d.ts.map +1 -1
  16. package/dist/commands/details.js +3 -1
  17. package/dist/commands/details.js.map +1 -1
  18. package/dist/commands/dom/DomElementResolver.d.ts +138 -0
  19. package/dist/commands/dom/DomElementResolver.d.ts.map +1 -0
  20. package/dist/commands/dom/DomElementResolver.js +173 -0
  21. package/dist/commands/dom/DomElementResolver.js.map +1 -0
  22. package/dist/commands/dom/a11y.d.ts.map +1 -1
  23. package/dist/commands/dom/a11y.js +37 -33
  24. package/dist/commands/dom/a11y.js.map +1 -1
  25. package/dist/commands/dom/evalHelpers.d.ts.map +1 -1
  26. package/dist/commands/dom/evalHelpers.js +1 -1
  27. package/dist/commands/dom/evalHelpers.js.map +1 -1
  28. package/dist/commands/dom/formFillHelpers.d.ts +68 -2
  29. package/dist/commands/dom/formFillHelpers.d.ts.map +1 -1
  30. package/dist/commands/dom/formFillHelpers.js +216 -70
  31. package/dist/commands/dom/formFillHelpers.js.map +1 -1
  32. package/dist/commands/dom/formInteraction.d.ts.map +1 -1
  33. package/dist/commands/dom/formInteraction.js +128 -15
  34. package/dist/commands/dom/formInteraction.js.map +1 -1
  35. package/dist/commands/dom/helpers.d.ts +11 -2
  36. package/dist/commands/dom/helpers.d.ts.map +1 -1
  37. package/dist/commands/dom/helpers.js +50 -1
  38. package/dist/commands/dom/helpers.js.map +1 -1
  39. package/dist/commands/dom/index.d.ts.map +1 -1
  40. package/dist/commands/dom/index.js +105 -52
  41. package/dist/commands/dom/index.js.map +1 -1
  42. package/dist/commands/dom/keyMapping.d.ts +56 -0
  43. package/dist/commands/dom/keyMapping.d.ts.map +1 -0
  44. package/dist/commands/dom/keyMapping.js +110 -0
  45. package/dist/commands/dom/keyMapping.js.map +1 -0
  46. package/dist/commands/dom/reactEventHelpers.d.ts +19 -20
  47. package/dist/commands/dom/reactEventHelpers.d.ts.map +1 -1
  48. package/dist/commands/dom/reactEventHelpers.js +73 -80
  49. package/dist/commands/dom/reactEventHelpers.js.map +1 -1
  50. package/dist/commands/helpJson.d.ts +165 -0
  51. package/dist/commands/helpJson.d.ts.map +1 -0
  52. package/dist/commands/helpJson.js +252 -0
  53. package/dist/commands/helpJson.js.map +1 -0
  54. package/dist/commands/machineReadableHelp.d.ts +21 -2
  55. package/dist/commands/machineReadableHelp.d.ts.map +1 -1
  56. package/dist/commands/machineReadableHelp.js +95 -60
  57. package/dist/commands/machineReadableHelp.js.map +1 -1
  58. package/dist/commands/network.d.ts.map +1 -1
  59. package/dist/commands/network.js.map +1 -1
  60. package/dist/commands/peek.d.ts.map +1 -1
  61. package/dist/commands/peek.js +20 -13
  62. package/dist/commands/peek.js.map +1 -1
  63. package/dist/commands/shared/CommandRunner.d.ts +4 -10
  64. package/dist/commands/shared/CommandRunner.d.ts.map +1 -1
  65. package/dist/commands/shared/CommandRunner.js +2 -2
  66. package/dist/commands/shared/CommandRunner.js.map +1 -1
  67. package/dist/commands/shared/commonOptions.d.ts +0 -15
  68. package/dist/commands/shared/commonOptions.d.ts.map +1 -1
  69. package/dist/commands/shared/commonOptions.js +0 -32
  70. package/dist/commands/shared/commonOptions.js.map +1 -1
  71. package/dist/commands/shared/optionTypes.d.ts +237 -0
  72. package/dist/commands/shared/optionTypes.d.ts.map +1 -0
  73. package/dist/commands/shared/optionTypes.js +20 -0
  74. package/dist/commands/shared/optionTypes.js.map +1 -0
  75. package/dist/commands/shared/startHelpers.d.ts.map +1 -1
  76. package/dist/commands/shared/startHelpers.js +3 -3
  77. package/dist/commands/shared/startHelpers.js.map +1 -1
  78. package/dist/commands/start.d.ts.map +1 -1
  79. package/dist/commands/start.js +8 -6
  80. package/dist/commands/start.js.map +1 -1
  81. package/dist/commands/status.d.ts.map +1 -1
  82. package/dist/commands/status.js.map +1 -1
  83. package/dist/commands/stop.d.ts.map +1 -1
  84. package/dist/commands/stop.js +17 -43
  85. package/dist/commands/stop.js.map +1 -1
  86. package/dist/commands/tail.d.ts.map +1 -1
  87. package/dist/commands/tail.js +49 -59
  88. package/dist/commands/tail.js.map +1 -1
  89. package/dist/connection/types.d.ts +2 -1
  90. package/dist/connection/types.d.ts.map +1 -1
  91. package/dist/constants.d.ts +19 -1
  92. package/dist/constants.d.ts.map +1 -1
  93. package/dist/constants.js +45 -2
  94. package/dist/constants.js.map +1 -1
  95. package/dist/daemon/handlers/responseHandler.d.ts.map +1 -1
  96. package/dist/daemon/handlers/responseHandler.js +1 -0
  97. package/dist/daemon/handlers/responseHandler.js.map +1 -1
  98. package/dist/daemon/ipcServer.js +8 -8
  99. package/dist/daemon/ipcServer.js.map +1 -1
  100. package/dist/daemon/lifecycle/signalHandlers.d.ts.map +1 -1
  101. package/dist/daemon/lifecycle/signalHandlers.js +19 -3
  102. package/dist/daemon/lifecycle/signalHandlers.js.map +1 -1
  103. package/dist/daemon/lifecycle/workerCleanup.d.ts.map +1 -1
  104. package/dist/daemon/lifecycle/workerCleanup.js +5 -2
  105. package/dist/daemon/lifecycle/workerCleanup.js.map +1 -1
  106. package/dist/daemon/patternDefinitions.d.ts +0 -13
  107. package/dist/daemon/patternDefinitions.d.ts.map +1 -1
  108. package/dist/daemon/patternDefinitions.js +0 -17
  109. package/dist/daemon/patternDefinitions.js.map +1 -1
  110. package/dist/daemon/worker/commandRegistry.d.ts.map +1 -1
  111. package/dist/daemon/worker/commandRegistry.js +1 -0
  112. package/dist/daemon/worker/commandRegistry.js.map +1 -1
  113. package/dist/index.js +34 -2
  114. package/dist/index.js.map +1 -1
  115. package/dist/ipc/__tests__/jsonl.unit.test.js +5 -5
  116. package/dist/ipc/__tests__/jsonl.unit.test.js.map +1 -1
  117. package/dist/ipc/protocol/commands.d.ts +2 -0
  118. package/dist/ipc/protocol/commands.d.ts.map +1 -1
  119. package/dist/ipc/protocol/commands.js.map +1 -1
  120. package/dist/ipc/session/queries.d.ts +2 -0
  121. package/dist/ipc/session/queries.d.ts.map +1 -1
  122. package/dist/ipc/utils/responseValidator.d.ts +7 -1
  123. package/dist/ipc/utils/responseValidator.d.ts.map +1 -1
  124. package/dist/ipc/utils/responseValidator.js +6 -1
  125. package/dist/ipc/utils/responseValidator.js.map +1 -1
  126. package/dist/session/QueryCacheManager.d.ts +140 -0
  127. package/dist/session/QueryCacheManager.d.ts.map +1 -0
  128. package/dist/session/QueryCacheManager.js +233 -0
  129. package/dist/session/QueryCacheManager.js.map +1 -0
  130. package/dist/session/cleanup.d.ts +63 -1
  131. package/dist/session/cleanup.d.ts.map +1 -1
  132. package/dist/session/cleanup.js +191 -65
  133. package/dist/session/cleanup.js.map +1 -1
  134. package/dist/session/queryCache.d.ts +25 -14
  135. package/dist/session/queryCache.d.ts.map +1 -1
  136. package/dist/session/queryCache.js +31 -60
  137. package/dist/session/queryCache.js.map +1 -1
  138. package/dist/telemetry/__tests__/roleInference.unit.test.d.ts +9 -0
  139. package/dist/telemetry/__tests__/roleInference.unit.test.d.ts.map +1 -0
  140. package/dist/telemetry/__tests__/roleInference.unit.test.js +138 -0
  141. package/dist/telemetry/__tests__/roleInference.unit.test.js.map +1 -0
  142. package/dist/telemetry/dom.d.ts +1 -0
  143. package/dist/telemetry/dom.d.ts.map +1 -1
  144. package/dist/telemetry/dom.js +9 -4
  145. package/dist/telemetry/dom.js.map +1 -1
  146. package/dist/telemetry/filters.d.ts +3 -0
  147. package/dist/telemetry/filters.d.ts.map +1 -1
  148. package/dist/telemetry/filters.js +25 -3
  149. package/dist/telemetry/filters.js.map +1 -1
  150. package/dist/telemetry/network.d.ts.map +1 -1
  151. package/dist/telemetry/network.js +35 -6
  152. package/dist/telemetry/network.js.map +1 -1
  153. package/dist/telemetry/roleInference.d.ts +50 -0
  154. package/dist/telemetry/roleInference.d.ts.map +1 -0
  155. package/dist/telemetry/roleInference.js +163 -0
  156. package/dist/telemetry/roleInference.js.map +1 -0
  157. package/dist/telemetry/utils.d.ts +0 -57
  158. package/dist/telemetry/utils.d.ts.map +1 -1
  159. package/dist/telemetry/utils.js +0 -71
  160. package/dist/telemetry/utils.js.map +1 -1
  161. package/dist/types/dom.d.ts +11 -0
  162. package/dist/types/dom.d.ts.map +1 -1
  163. package/dist/types.d.ts +2 -0
  164. package/dist/types.d.ts.map +1 -1
  165. package/dist/ui/formatters/a11y.d.ts +13 -3
  166. package/dist/ui/formatters/a11y.d.ts.map +1 -1
  167. package/dist/ui/formatters/a11y.js +18 -3
  168. package/dist/ui/formatters/a11y.js.map +1 -1
  169. package/dist/ui/formatters/preview.d.ts +4 -0
  170. package/dist/ui/formatters/preview.d.ts.map +1 -1
  171. package/dist/ui/formatters/preview.js +26 -43
  172. package/dist/ui/formatters/preview.js.map +1 -1
  173. package/dist/ui/formatters/sessionFormatters.d.ts.map +1 -1
  174. package/dist/ui/formatters/sessionFormatters.js +2 -0
  175. package/dist/ui/formatters/sessionFormatters.js.map +1 -1
  176. package/dist/ui/logging/index.d.ts +1 -1
  177. package/dist/ui/logging/index.d.ts.map +1 -1
  178. package/dist/ui/logging/index.js +1 -1
  179. package/dist/ui/logging/index.js.map +1 -1
  180. package/dist/ui/logging/logger.d.ts +21 -0
  181. package/dist/ui/logging/logger.d.ts.map +1 -1
  182. package/dist/ui/logging/logger.js +24 -6
  183. package/dist/ui/logging/logger.js.map +1 -1
  184. package/dist/ui/messages/commands.d.ts +0 -14
  185. package/dist/ui/messages/commands.d.ts.map +1 -1
  186. package/dist/ui/messages/commands.js +0 -18
  187. package/dist/ui/messages/commands.js.map +1 -1
  188. package/dist/ui/messages/errors.d.ts +0 -16
  189. package/dist/ui/messages/errors.d.ts.map +1 -1
  190. package/dist/ui/messages/errors.js +0 -18
  191. package/dist/ui/messages/errors.js.map +1 -1
  192. package/dist/ui/messages/hints.d.ts +0 -10
  193. package/dist/ui/messages/hints.d.ts.map +1 -1
  194. package/dist/ui/messages/hints.js +0 -12
  195. package/dist/ui/messages/hints.js.map +1 -1
  196. package/dist/utils/decisionTrees.d.ts +0 -17
  197. package/dist/utils/decisionTrees.d.ts.map +1 -1
  198. package/dist/utils/decisionTrees.js +5 -21
  199. package/dist/utils/decisionTrees.js.map +1 -1
  200. package/dist/utils/errorMapping.d.ts +60 -0
  201. package/dist/utils/errorMapping.d.ts.map +1 -0
  202. package/dist/utils/errorMapping.js +97 -0
  203. package/dist/utils/errorMapping.js.map +1 -0
  204. package/dist/utils/file.d.ts +27 -0
  205. package/dist/utils/file.d.ts.map +1 -0
  206. package/dist/utils/file.js +37 -0
  207. package/dist/utils/file.js.map +1 -0
  208. package/dist/utils/levenshtein.d.ts +0 -17
  209. package/dist/utils/levenshtein.d.ts.map +1 -1
  210. package/dist/utils/levenshtein.js +0 -31
  211. package/dist/utils/levenshtein.js.map +1 -1
  212. package/dist/utils/taskMappings.d.ts +0 -17
  213. package/dist/utils/taskMappings.d.ts.map +1 -1
  214. package/dist/utils/taskMappings.js +5 -21
  215. package/dist/utils/taskMappings.js.map +1 -1
  216. package/dist/utils/typeGuards.d.ts +62 -0
  217. package/dist/utils/typeGuards.d.ts.map +1 -0
  218. package/dist/utils/typeGuards.js +94 -0
  219. package/dist/utils/typeGuards.js.map +1 -0
  220. package/dist/utils/url.d.ts.map +1 -1
  221. package/dist/utils/url.js +15 -2
  222. package/dist/utils/url.js.map +1 -1
  223. 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 { setSessionQueryCache } = await import('../../session/queryCache.js');
26
- setSessionQueryCache(result);
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 getCachedNodeByIndex(index);
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 getCachedNodeByIndex(index);
92
- const node = await resolveA11yNode('', targetNode.nodeId);
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, formatSemanticNode);
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 node = await resolveA11yNode(selector);
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, formatSemanticNode);
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 formatSemanticNode(node) {
130
- const fakeTree = {
131
- root: node,
132
- nodes: new Map([[node.nodeId, node]]),
133
- count: 1,
134
- };
135
- return semantic(fakeTree);
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 port = parsePositiveIntOption('port', options.port, {
175
- defaultValue: 9222,
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":"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"}
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 el = document.querySelector(selector);\n \n if (!el) {\n return { \n success: false, \n error: 'Element not found',\n selector: selector\n };\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";
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
- * Simple click implementation that works with buttons, links, and custom components.
25
- * When selector matches multiple elements, prioritizes visible ones.
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 let el = document.querySelector(selector);\n \n if (!el) {\n return {\n success: false,\n error: 'Element not found',\n selector: selector\n };\n }\n \n const allMatches = document.querySelectorAll(selector);\n if (allMatches.length > 1) {\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 };\n})\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,+4EAwF7B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,u/CAyDhC,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,+pDAkEvC,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;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
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"}