@browserbasehq/orca 3.2.1-preview.3 → 3.4.0-preview-1

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/dist/cjs/lib/inference.js +1 -8
  2. package/dist/cjs/lib/inference.js.map +1 -1
  3. package/dist/cjs/lib/prompt.js +3 -1
  4. package/dist/cjs/lib/prompt.js.map +1 -1
  5. package/dist/cjs/lib/v3/agent/AgentProvider.js +3 -0
  6. package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
  7. package/dist/cjs/lib/v3/agent/tools/fillFormVision.js +16 -12
  8. package/dist/cjs/lib/v3/agent/tools/fillFormVision.js.map +1 -1
  9. package/dist/cjs/lib/v3/agent/utils/validateExperimentalFeatures.js +0 -4
  10. package/dist/cjs/lib/v3/agent/utils/validateExperimentalFeatures.js.map +1 -1
  11. package/dist/cjs/lib/v3/api.d.ts +1 -0
  12. package/dist/cjs/lib/v3/api.js +15 -3
  13. package/dist/cjs/lib/v3/api.js.map +1 -1
  14. package/dist/cjs/lib/v3/dom/build/a11yScripts.generated.js +12 -12
  15. package/dist/cjs/lib/v3/dom/build/a11yScripts.generated.js.map +1 -1
  16. package/dist/cjs/lib/v3/dom/build/locatorScripts.generated.js +48 -48
  17. package/dist/cjs/lib/v3/dom/build/locatorScripts.generated.js.map +1 -1
  18. package/dist/cjs/lib/v3/dom/build/reRenderScriptContent.d.ts +1 -1
  19. package/dist/cjs/lib/v3/dom/build/reRenderScriptContent.js +1 -1
  20. package/dist/cjs/lib/v3/dom/build/reRenderScriptContent.js.map +1 -1
  21. package/dist/cjs/lib/v3/dom/build/screenshotScripts.generated.js +2 -2
  22. package/dist/cjs/lib/v3/dom/build/screenshotScripts.generated.js.map +1 -1
  23. package/dist/cjs/lib/v3/dom/build/scriptV3Content.d.ts +1 -1
  24. package/dist/cjs/lib/v3/dom/build/scriptV3Content.js +1 -1
  25. package/dist/cjs/lib/v3/dom/build/scriptV3Content.js.map +1 -1
  26. package/dist/cjs/lib/v3/dom/build/selectorRuntime.generated.d.ts +24 -0
  27. package/dist/cjs/lib/v3/dom/build/selectorRuntime.generated.js +31 -0
  28. package/dist/cjs/lib/v3/dom/build/selectorRuntime.generated.js.map +1 -0
  29. package/dist/cjs/lib/v3/handlers/extractHandler.js +3 -1
  30. package/dist/cjs/lib/v3/handlers/extractHandler.js.map +1 -1
  31. package/dist/cjs/lib/v3/handlers/observeHandler.js +2 -1
  32. package/dist/cjs/lib/v3/handlers/observeHandler.js.map +1 -1
  33. package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +3 -5
  34. package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
  35. package/dist/cjs/lib/v3/index.d.ts +1 -1
  36. package/dist/cjs/lib/v3/llm/CerebrasClient.js +1 -1
  37. package/dist/cjs/lib/v3/llm/CerebrasClient.js.map +1 -1
  38. package/dist/cjs/lib/v3/llm/GroqClient.js +1 -1
  39. package/dist/cjs/lib/v3/llm/GroqClient.js.map +1 -1
  40. package/dist/cjs/lib/v3/types/private/agent.d.ts +5 -0
  41. package/dist/cjs/lib/v3/types/private/agent.js +11 -0
  42. package/dist/cjs/lib/v3/types/private/agent.js.map +1 -1
  43. package/dist/cjs/lib/v3/types/private/handlers.d.ts +2 -0
  44. package/dist/cjs/lib/v3/types/private/handlers.js.map +1 -1
  45. package/dist/cjs/lib/v3/types/private/snapshot.d.ts +8 -0
  46. package/dist/cjs/lib/v3/types/private/snapshot.js.map +1 -1
  47. package/dist/cjs/lib/v3/types/public/agent.d.ts +2 -3
  48. package/dist/cjs/lib/v3/types/public/agent.js +3 -0
  49. package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
  50. package/dist/cjs/lib/v3/types/public/api.d.ts +7 -1
  51. package/dist/cjs/lib/v3/types/public/api.js +22 -2
  52. package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
  53. package/dist/cjs/lib/v3/types/public/methods.d.ts +2 -0
  54. package/dist/cjs/lib/v3/types/public/methods.js.map +1 -1
  55. package/dist/cjs/lib/v3/understudy/a11y/snapshot/a11yTree.js +21 -12
  56. package/dist/cjs/lib/v3/understudy/a11y/snapshot/a11yTree.js.map +1 -1
  57. package/dist/cjs/lib/v3/understudy/a11y/snapshot/capture.d.ts +11 -2
  58. package/dist/cjs/lib/v3/understudy/a11y/snapshot/capture.js +268 -21
  59. package/dist/cjs/lib/v3/understudy/a11y/snapshot/capture.js.map +1 -1
  60. package/dist/cjs/lib/v3/understudy/a11y/snapshot/domTree.js +60 -7
  61. package/dist/cjs/lib/v3/understudy/a11y/snapshot/domTree.js.map +1 -1
  62. package/dist/cjs/lib/v3/understudy/frameRegistry.js +16 -5
  63. package/dist/cjs/lib/v3/understudy/frameRegistry.js.map +1 -1
  64. package/dist/cjs/lib/v3/v3.d.ts +1 -0
  65. package/dist/cjs/lib/v3/v3.js +18 -14
  66. package/dist/cjs/lib/v3/v3.js.map +1 -1
  67. package/dist/cjs/lib/version.d.ts +1 -1
  68. package/dist/cjs/lib/version.js +1 -1
  69. package/dist/cjs/lib/version.js.map +1 -1
  70. package/dist/cjs/tests/integration/observe-element-id-format.spec.js +130 -0
  71. package/dist/cjs/tests/integration/observe-element-id-format.spec.js.map +1 -0
  72. package/dist/cjs/tests/unit/agent-mode-routing.test.js +88 -0
  73. package/dist/cjs/tests/unit/agent-mode-routing.test.js.map +1 -0
  74. package/dist/cjs/tests/unit/agent-temperature.test.d.ts +1 -0
  75. package/dist/cjs/tests/unit/agent-temperature.test.js +191 -0
  76. package/dist/cjs/tests/unit/agent-temperature.test.js.map +1 -0
  77. package/dist/cjs/tests/unit/agent-variables-validation.test.d.ts +1 -0
  78. package/dist/cjs/tests/unit/agent-variables-validation.test.js +43 -0
  79. package/dist/cjs/tests/unit/agent-variables-validation.test.js.map +1 -0
  80. package/dist/cjs/tests/unit/api-client-observe-variables.test.js +49 -0
  81. package/dist/cjs/tests/unit/api-client-observe-variables.test.js.map +1 -1
  82. package/dist/cjs/tests/unit/api-optional-model-api-key.test.js +60 -0
  83. package/dist/cjs/tests/unit/api-optional-model-api-key.test.js.map +1 -1
  84. package/dist/cjs/tests/unit/api-variables-schema.test.js +32 -0
  85. package/dist/cjs/tests/unit/api-variables-schema.test.js.map +1 -1
  86. package/dist/cjs/tests/unit/frame-registry-oopif-adoption.test.d.ts +1 -0
  87. package/dist/cjs/tests/unit/frame-registry-oopif-adoption.test.js +60 -0
  88. package/dist/cjs/tests/unit/frame-registry-oopif-adoption.test.js.map +1 -0
  89. package/dist/cjs/tests/unit/inference-temperature.test.d.ts +1 -0
  90. package/dist/cjs/tests/unit/inference-temperature.test.js +65 -0
  91. package/dist/cjs/tests/unit/inference-temperature.test.js.map +1 -0
  92. package/dist/cjs/tests/unit/openai-compatible-temperature.test.d.ts +1 -0
  93. package/dist/cjs/tests/unit/openai-compatible-temperature.test.js +84 -0
  94. package/dist/cjs/tests/unit/openai-compatible-temperature.test.js.map +1 -0
  95. package/dist/cjs/tests/unit/prompt-observe-variables.test.js +6 -0
  96. package/dist/cjs/tests/unit/prompt-observe-variables.test.js.map +1 -1
  97. package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js +3 -0
  98. package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
  99. package/dist/cjs/tests/unit/public-api/public-types.test.js.map +1 -1
  100. package/dist/cjs/tests/unit/snapshot-a11y-resolvers.test.js +106 -5
  101. package/dist/cjs/tests/unit/snapshot-a11y-resolvers.test.js.map +1 -1
  102. package/dist/cjs/tests/unit/snapshot-a11y-tree-utils.test.js +20 -0
  103. package/dist/cjs/tests/unit/snapshot-a11y-tree-utils.test.js.map +1 -1
  104. package/dist/cjs/tests/unit/snapshot-capture-orchestration.test.js +119 -9
  105. package/dist/cjs/tests/unit/snapshot-capture-orchestration.test.js.map +1 -1
  106. package/dist/cjs/tests/unit/timeout-handlers.test.js +36 -0
  107. package/dist/cjs/tests/unit/timeout-handlers.test.js.map +1 -1
  108. package/dist/esm/lib/inference.js +1 -8
  109. package/dist/esm/lib/inference.js.map +1 -1
  110. package/dist/esm/lib/prompt.js +3 -1
  111. package/dist/esm/lib/prompt.js.map +1 -1
  112. package/dist/esm/lib/v3/agent/AgentProvider.js +3 -0
  113. package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
  114. package/dist/esm/lib/v3/agent/tools/fillFormVision.js +16 -12
  115. package/dist/esm/lib/v3/agent/tools/fillFormVision.js.map +1 -1
  116. package/dist/esm/lib/v3/agent/utils/validateExperimentalFeatures.js +0 -4
  117. package/dist/esm/lib/v3/agent/utils/validateExperimentalFeatures.js.map +1 -1
  118. package/dist/esm/lib/v3/api.d.ts +1 -0
  119. package/dist/esm/lib/v3/api.js +15 -3
  120. package/dist/esm/lib/v3/api.js.map +1 -1
  121. package/dist/esm/lib/v3/dom/build/a11yScripts.generated.js +12 -12
  122. package/dist/esm/lib/v3/dom/build/a11yScripts.generated.js.map +1 -1
  123. package/dist/esm/lib/v3/dom/build/locatorScripts.generated.js +48 -48
  124. package/dist/esm/lib/v3/dom/build/locatorScripts.generated.js.map +1 -1
  125. package/dist/esm/lib/v3/dom/build/reRenderScriptContent.d.ts +1 -1
  126. package/dist/esm/lib/v3/dom/build/reRenderScriptContent.js +1 -1
  127. package/dist/esm/lib/v3/dom/build/reRenderScriptContent.js.map +1 -1
  128. package/dist/esm/lib/v3/dom/build/screenshotScripts.generated.js +2 -2
  129. package/dist/esm/lib/v3/dom/build/screenshotScripts.generated.js.map +1 -1
  130. package/dist/esm/lib/v3/dom/build/scriptV3Content.d.ts +1 -1
  131. package/dist/esm/lib/v3/dom/build/scriptV3Content.js +1 -1
  132. package/dist/esm/lib/v3/dom/build/scriptV3Content.js.map +1 -1
  133. package/dist/esm/lib/v3/dom/build/selectorRuntime.generated.d.ts +24 -0
  134. package/dist/esm/lib/v3/dom/build/selectorRuntime.generated.js +28 -0
  135. package/dist/esm/lib/v3/dom/build/selectorRuntime.generated.js.map +1 -0
  136. package/dist/esm/lib/v3/handlers/extractHandler.js +3 -1
  137. package/dist/esm/lib/v3/handlers/extractHandler.js.map +1 -1
  138. package/dist/esm/lib/v3/handlers/observeHandler.js +2 -1
  139. package/dist/esm/lib/v3/handlers/observeHandler.js.map +1 -1
  140. package/dist/esm/lib/v3/handlers/v3AgentHandler.js +3 -5
  141. package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
  142. package/dist/esm/lib/v3/index.d.ts +1 -1
  143. package/dist/esm/lib/v3/llm/CerebrasClient.js +1 -1
  144. package/dist/esm/lib/v3/llm/CerebrasClient.js.map +1 -1
  145. package/dist/esm/lib/v3/llm/GroqClient.js +1 -1
  146. package/dist/esm/lib/v3/llm/GroqClient.js.map +1 -1
  147. package/dist/esm/lib/v3/types/private/agent.d.ts +5 -0
  148. package/dist/esm/lib/v3/types/private/agent.js +10 -1
  149. package/dist/esm/lib/v3/types/private/agent.js.map +1 -1
  150. package/dist/esm/lib/v3/types/private/handlers.d.ts +2 -0
  151. package/dist/esm/lib/v3/types/private/handlers.js.map +1 -1
  152. package/dist/esm/lib/v3/types/private/snapshot.d.ts +8 -0
  153. package/dist/esm/lib/v3/types/private/snapshot.js.map +1 -1
  154. package/dist/esm/lib/v3/types/public/agent.d.ts +2 -3
  155. package/dist/esm/lib/v3/types/public/agent.js +3 -0
  156. package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
  157. package/dist/esm/lib/v3/types/public/api.d.ts +7 -1
  158. package/dist/esm/lib/v3/types/public/api.js +22 -2
  159. package/dist/esm/lib/v3/types/public/api.js.map +1 -1
  160. package/dist/esm/lib/v3/types/public/methods.d.ts +2 -0
  161. package/dist/esm/lib/v3/types/public/methods.js.map +1 -1
  162. package/dist/esm/lib/v3/understudy/a11y/snapshot/a11yTree.js +21 -12
  163. package/dist/esm/lib/v3/understudy/a11y/snapshot/a11yTree.js.map +1 -1
  164. package/dist/esm/lib/v3/understudy/a11y/snapshot/capture.d.ts +11 -2
  165. package/dist/esm/lib/v3/understudy/a11y/snapshot/capture.js +267 -22
  166. package/dist/esm/lib/v3/understudy/a11y/snapshot/capture.js.map +1 -1
  167. package/dist/esm/lib/v3/understudy/a11y/snapshot/domTree.js +60 -7
  168. package/dist/esm/lib/v3/understudy/a11y/snapshot/domTree.js.map +1 -1
  169. package/dist/esm/lib/v3/understudy/frameRegistry.js +16 -5
  170. package/dist/esm/lib/v3/understudy/frameRegistry.js.map +1 -1
  171. package/dist/esm/lib/v3/v3.d.ts +1 -0
  172. package/dist/esm/lib/v3/v3.js +18 -14
  173. package/dist/esm/lib/v3/v3.js.map +1 -1
  174. package/dist/esm/lib/version.d.ts +1 -1
  175. package/dist/esm/lib/version.js +1 -1
  176. package/dist/esm/lib/version.js.map +1 -1
  177. package/dist/esm/tests/integration/observe-element-id-format.spec.d.ts +1 -0
  178. package/dist/esm/tests/integration/observe-element-id-format.spec.js +128 -0
  179. package/dist/esm/tests/integration/observe-element-id-format.spec.js.map +1 -0
  180. package/dist/esm/tests/unit/agent-mode-routing.test.d.ts +1 -0
  181. package/dist/esm/tests/unit/agent-mode-routing.test.js +86 -0
  182. package/dist/esm/tests/unit/agent-mode-routing.test.js.map +1 -0
  183. package/dist/esm/tests/unit/agent-temperature.test.d.ts +1 -0
  184. package/dist/esm/tests/unit/agent-temperature.test.js +189 -0
  185. package/dist/esm/tests/unit/agent-temperature.test.js.map +1 -0
  186. package/dist/esm/tests/unit/agent-variables-validation.test.d.ts +1 -0
  187. package/dist/esm/tests/unit/agent-variables-validation.test.js +41 -0
  188. package/dist/esm/tests/unit/agent-variables-validation.test.js.map +1 -0
  189. package/dist/esm/tests/unit/api-client-observe-variables.test.js +49 -0
  190. package/dist/esm/tests/unit/api-client-observe-variables.test.js.map +1 -1
  191. package/dist/esm/tests/unit/api-optional-model-api-key.test.js +60 -0
  192. package/dist/esm/tests/unit/api-optional-model-api-key.test.js.map +1 -1
  193. package/dist/esm/tests/unit/api-variables-schema.test.js +32 -0
  194. package/dist/esm/tests/unit/api-variables-schema.test.js.map +1 -1
  195. package/dist/esm/tests/unit/frame-registry-oopif-adoption.test.d.ts +1 -0
  196. package/dist/esm/tests/unit/frame-registry-oopif-adoption.test.js +58 -0
  197. package/dist/esm/tests/unit/frame-registry-oopif-adoption.test.js.map +1 -0
  198. package/dist/esm/tests/unit/inference-temperature.test.d.ts +1 -0
  199. package/dist/esm/tests/unit/inference-temperature.test.js +63 -0
  200. package/dist/esm/tests/unit/inference-temperature.test.js.map +1 -0
  201. package/dist/esm/tests/unit/openai-compatible-temperature.test.d.ts +1 -0
  202. package/dist/esm/tests/unit/openai-compatible-temperature.test.js +82 -0
  203. package/dist/esm/tests/unit/openai-compatible-temperature.test.js.map +1 -0
  204. package/dist/esm/tests/unit/prompt-observe-variables.test.js +6 -0
  205. package/dist/esm/tests/unit/prompt-observe-variables.test.js.map +1 -1
  206. package/dist/esm/tests/unit/public-api/llm-and-agents.test.js +3 -0
  207. package/dist/esm/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
  208. package/dist/esm/tests/unit/public-api/public-types.test.js.map +1 -1
  209. package/dist/esm/tests/unit/snapshot-a11y-resolvers.test.js +106 -5
  210. package/dist/esm/tests/unit/snapshot-a11y-resolvers.test.js.map +1 -1
  211. package/dist/esm/tests/unit/snapshot-a11y-tree-utils.test.js +20 -0
  212. package/dist/esm/tests/unit/snapshot-a11y-tree-utils.test.js.map +1 -1
  213. package/dist/esm/tests/unit/snapshot-capture-orchestration.test.js +119 -9
  214. package/dist/esm/tests/unit/snapshot-capture-orchestration.test.js.map +1 -1
  215. package/dist/esm/tests/unit/timeout-handlers.test.js +36 -0
  216. package/dist/esm/tests/unit/timeout-handlers.test.js.map +1 -1
  217. package/package.json +3 -3
  218. package/dist/cjs/tests/integration/agent-captcha-autosolve.spec.js +0 -56
  219. package/dist/cjs/tests/integration/agent-captcha-autosolve.spec.js.map +0 -1
  220. package/dist/esm/tests/integration/agent-captcha-autosolve.spec.js +0 -54
  221. package/dist/esm/tests/integration/agent-captcha-autosolve.spec.js.map +0 -1
  222. /package/dist/cjs/tests/integration/{agent-captcha-autosolve.spec.d.ts → observe-element-id-format.spec.d.ts} +0 -0
  223. /package/dist/{esm/tests/integration/agent-captcha-autosolve.spec.d.ts → cjs/tests/unit/agent-mode-routing.test.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"public-types.test.js","sourceRoot":"","sources":["../../../../../tests/unit/public-api/public-types.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expectTypeOf, it } from \"vitest\";\nimport * as Stagehand from \"@browserbasehq/stagehand\";\n\n// Type-level manifest of all expected exported types\n// Since these types don't exist at runtime, we currently need to manually add new publicly exported types\n// to this list ourselves - it's not automatically going to catch changes like our export-surface.test.ts does.\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ntype ExpectedExportedTypes = {\n // Types from model.ts\n AvailableModel: Stagehand.AvailableModel;\n AvailableCuaModel: Stagehand.AvailableCuaModel;\n ModelProvider: Stagehand.ModelProvider;\n ClientOptions: Stagehand.ClientOptions;\n ModelConfiguration: Stagehand.ModelConfiguration;\n AnthropicJsonSchemaObject: Stagehand.AnthropicJsonSchemaObject;\n AISDKProvider: Stagehand.AISDKProvider;\n AISDKCustomProvider: Stagehand.AISDKCustomProvider;\n LLMTool: Stagehand.LLMTool;\n // Types from methods.ts\n ActOptions: Stagehand.ActOptions;\n ActResult: Stagehand.ActResult;\n ExtractResult: Stagehand.ExtractResult<Stagehand.StagehandZodSchema>;\n Action: Stagehand.Action;\n HistoryEntry: Stagehand.HistoryEntry;\n ExtractOptions: Stagehand.ExtractOptions;\n ObserveOptions: Stagehand.ObserveOptions;\n ObserveResult: Stagehand.ObserveResult;\n V3FunctionName: Stagehand.V3FunctionName;\n // Types from agent.ts\n Tool: Stagehand.Tool;\n AgentAction: Stagehand.AgentAction;\n AgentResult: Stagehand.AgentResult;\n AgentExecuteOptions: Stagehand.AgentExecuteOptions;\n AgentType: Stagehand.AgentType;\n AgentExecutionOptions: Stagehand.AgentExecutionOptions<Stagehand.AgentExecuteOptions>;\n AgentHandlerOptions: Stagehand.AgentHandlerOptions;\n ActionExecutionResult: Stagehand.ActionExecutionResult;\n ToolUseItem: Stagehand.ToolUseItem;\n AnthropicMessage: Stagehand.AnthropicMessage;\n AnthropicContentBlock: Stagehand.AnthropicContentBlock;\n AnthropicTextBlock: Stagehand.AnthropicTextBlock;\n AnthropicToolResult: Stagehand.AnthropicToolResult;\n ResponseItem: Stagehand.ResponseItem;\n ComputerCallItem: Stagehand.ComputerCallItem;\n FunctionCallItem: Stagehand.FunctionCallItem;\n ResponseInputItem: Stagehand.ResponseInputItem;\n AgentInstance: Stagehand.AgentInstance;\n AgentProviderType: Stagehand.AgentProviderType;\n AgentModelConfig: Stagehand.AgentModelConfig;\n AgentConfig: Stagehand.AgentConfig;\n AgentToolMode: Stagehand.AgentToolMode;\n VariableValue: Stagehand.VariableValue;\n Variables: Stagehand.Variables;\n AgentCallbacks: Stagehand.AgentCallbacks;\n AgentExecuteCallbacks: Stagehand.AgentExecuteCallbacks;\n AgentStreamCallbacks: Stagehand.AgentStreamCallbacks;\n AgentExecuteOptionsBase: Stagehand.AgentExecuteOptionsBase;\n AgentStreamExecuteOptions: Stagehand.AgentStreamExecuteOptions;\n ModelMessage: Stagehand.ModelMessage;\n // Types from agent/tools\n AgentTools: Stagehand.AgentTools;\n AgentToolTypesMap: Stagehand.AgentToolTypesMap;\n AgentUITools: Stagehand.AgentUITools;\n AgentToolCall: Stagehand.AgentToolCall;\n AgentToolResult: Stagehand.AgentToolResult;\n // Types from logs.ts\n LogLevel: Stagehand.LogLevel;\n LogLine: Stagehand.LogLine;\n Logger: Stagehand.Logger;\n // Types from metrics.ts\n StagehandMetrics: Stagehand.StagehandMetrics;\n // Types from options.ts\n V3Env: Stagehand.V3Env;\n LocalBrowserLaunchOptions: Stagehand.LocalBrowserLaunchOptions;\n V3Options: Stagehand.V3Options;\n // Types from page.ts\n AnyPage: Stagehand.AnyPage;\n Page: Stagehand.Page;\n PlaywrightPage: Stagehand.PlaywrightPage;\n PatchrightPage: Stagehand.PatchrightPage;\n PuppeteerPage: Stagehand.PuppeteerPage;\n ConsoleListener: Stagehand.ConsoleListener;\n LoadState: Stagehand.LoadState;\n // Types from LLMClient.ts\n ChatMessage: Stagehand.ChatMessage;\n ChatMessageContent: Stagehand.ChatMessageContent;\n ChatMessageImageContent: Stagehand.ChatMessageImageContent;\n ChatMessageTextContent: Stagehand.ChatMessageTextContent;\n ChatCompletionOptions: Stagehand.ChatCompletionOptions;\n LLMResponse: Stagehand.LLMResponse;\n CreateChatCompletionOptions: Stagehand.CreateChatCompletionOptions;\n LLMUsage: Stagehand.LLMUsage;\n LLMParsedResponse: Stagehand.LLMParsedResponse<Record<string, unknown>>;\n // Types from zodCompat.ts\n StagehandZodSchema: Stagehand.StagehandZodSchema;\n StagehandZodObject: Stagehand.StagehandZodObject;\n InferStagehandSchema: Stagehand.InferStagehandSchema<Stagehand.StagehandZodSchema>;\n JsonSchemaDocument: Stagehand.JsonSchemaDocument;\n // Types from utils.ts\n JsonSchema: Stagehand.JsonSchema;\n JsonSchemaProperty: Stagehand.JsonSchemaProperty;\n // Types from cookies.ts\n Cookie: Stagehand.Cookie;\n CookieParam: Stagehand.CookieParam;\n ClearCookieOptions: Stagehand.ClearCookieOptions;\n};\n\ndescribe(\"Stagehand public API types\", () => {\n describe(\"AnyPage\", () => {\n type ExpectedAnyPage =\n | Stagehand.PlaywrightPage\n | Stagehand.PuppeteerPage\n | Stagehand.PatchrightPage\n | Stagehand.Page;\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AnyPage>().toEqualTypeOf<ExpectedAnyPage>();\n });\n });\n\n describe(\"ActOptions\", () => {\n type ExpectedActOptions = {\n model?: Stagehand.ModelConfiguration;\n variables?: Stagehand.Variables;\n timeout?: number;\n page?: Stagehand.AnyPage;\n serverCache?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ActOptions>().toEqualTypeOf<ExpectedActOptions>();\n });\n });\n\n describe(\"ActResult\", () => {\n type ExpectedActResult = {\n success: boolean;\n message: string;\n actionDescription: string;\n actions: Stagehand.Action[];\n cacheStatus?: \"HIT\" | \"MISS\";\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ActResult>().toEqualTypeOf<ExpectedActResult>();\n });\n });\n\n describe(\"ExtractOptions\", () => {\n type ExpectedExtractOptions = {\n model?: Stagehand.ModelConfiguration;\n timeout?: number;\n selector?: string;\n page?: Stagehand.AnyPage;\n serverCache?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ExtractOptions>().toEqualTypeOf<ExpectedExtractOptions>();\n });\n });\n\n describe(\"ObserveOptions\", () => {\n type ExpectedObserveOptions = {\n model?: Stagehand.ModelConfiguration;\n variables?: Stagehand.Variables;\n timeout?: number;\n selector?: string;\n page?: Stagehand.AnyPage;\n serverCache?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ObserveOptions>().toEqualTypeOf<ExpectedObserveOptions>();\n });\n });\n\n describe(\"ObserveResult\", () => {\n it(\"is an Action array with optional cacheStatus\", () => {\n expectTypeOf<Stagehand.ObserveResult>().toExtend<Stagehand.Action[]>();\n expectTypeOf<Stagehand.ObserveResult[\"cacheStatus\"]>().toEqualTypeOf<\n \"HIT\" | \"MISS\" | undefined\n >();\n });\n });\n\n describe(\"Action\", () => {\n type ExpectedAction = {\n selector: string;\n description: string;\n method?: string;\n arguments?: string[];\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.Action>().toEqualTypeOf<ExpectedAction>();\n });\n });\n\n describe(\"AgentAction\", () => {\n // AgentAction is a separate type from Action, not an extension\n // It has additional fields like type, reasoning, taskCompleted, etc.\n it(\"has type field\", () => {\n type TestAction = { type: string } & Stagehand.AgentAction;\n expectTypeOf<TestAction[\"type\"]>().toEqualTypeOf<string>();\n });\n });\n\n describe(\"AgentExecuteOptions\", () => {\n type ExpectedAgentExecuteOptions = {\n instruction: string;\n maxSteps?: number;\n page?: Stagehand.AnyPage;\n highlightCursor?: boolean;\n messages?: Stagehand.ModelMessage[];\n signal?: AbortSignal;\n excludeTools?: string[];\n output?: Stagehand.StagehandZodObject;\n callbacks?: Stagehand.AgentExecuteCallbacks;\n variables?: Stagehand.Variables;\n toolTimeout?: number;\n useSearch?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentExecuteOptions>().toEqualTypeOf<ExpectedAgentExecuteOptions>();\n });\n });\n\n describe(\"AgentStreamExecuteOptions\", () => {\n type ExpectedAgentStreamExecuteOptions = {\n instruction: string;\n maxSteps?: number;\n page?: Stagehand.AnyPage;\n highlightCursor?: boolean;\n messages?: Stagehand.ModelMessage[];\n signal?: AbortSignal;\n excludeTools?: string[];\n output?: Stagehand.StagehandZodObject;\n callbacks?: Stagehand.AgentStreamCallbacks;\n variables?: Stagehand.Variables;\n toolTimeout?: number;\n useSearch?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentStreamExecuteOptions>().toEqualTypeOf<ExpectedAgentStreamExecuteOptions>();\n });\n });\n\n describe(\"AgentExecutionOptions\", () => {\n type ExpectedAgentExecutionOptions<T = Stagehand.AgentExecuteOptions> = {\n options: T;\n logger: (message: Stagehand.LogLine) => void;\n retries?: number;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<\n Stagehand.AgentExecutionOptions<Stagehand.AgentExecuteOptions>\n >().toEqualTypeOf<\n ExpectedAgentExecutionOptions<Stagehand.AgentExecuteOptions>\n >();\n });\n });\n\n describe(\"AgentResult\", () => {\n type ExpectedAgentResult = {\n success: boolean;\n message: string;\n actions: Stagehand.AgentAction[];\n completed: boolean;\n metadata?: Record<string, unknown>;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n inference_time_ms: number;\n };\n messages?: Stagehand.ModelMessage[];\n output?: Record<string, unknown>;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentResult>().toEqualTypeOf<ExpectedAgentResult>();\n });\n });\n\n describe(\"AgentConfig\", () => {\n type ExpectedAgentConfig = {\n systemPrompt?: string;\n integrations?: (unknown | string)[];\n tools?: unknown;\n cua?: boolean;\n model?: string | Stagehand.AgentModelConfig<string>;\n executionModel?: string | Stagehand.AgentModelConfig<string>;\n stream?: boolean;\n mode?: Stagehand.AgentToolMode;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentConfig>().toExtend<ExpectedAgentConfig>();\n });\n });\n\n describe(\"AgentToolMode\", () => {\n type ExpectedAgentToolMode = \"dom\" | \"hybrid\" | \"cua\";\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentToolMode>().toEqualTypeOf<ExpectedAgentToolMode>();\n });\n });\n\n describe(\"HistoryEntry\", () => {\n type ExpectedHistoryEntry = {\n method: \"act\" | \"extract\" | \"observe\" | \"navigate\" | \"agent\";\n parameters: unknown;\n result: unknown;\n timestamp: string;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.HistoryEntry>().toEqualTypeOf<ExpectedHistoryEntry>();\n });\n });\n\n describe(\"Cookie\", () => {\n type ExpectedCookie = {\n name: string;\n value: string;\n domain: string;\n path: string;\n expires: number;\n httpOnly: boolean;\n secure: boolean;\n sameSite: \"Strict\" | \"Lax\" | \"None\";\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.Cookie>().toEqualTypeOf<ExpectedCookie>();\n });\n });\n\n describe(\"CookieParam\", () => {\n type ExpectedCookieParam = {\n name: string;\n value: string;\n url?: string;\n domain?: string;\n path?: string;\n expires?: number;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.CookieParam>().toEqualTypeOf<ExpectedCookieParam>();\n });\n });\n\n describe(\"ClearCookieOptions\", () => {\n type ExpectedClearCookieOptions = {\n name?: string | RegExp;\n domain?: string | RegExp;\n path?: string | RegExp;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ClearCookieOptions>().toEqualTypeOf<ExpectedClearCookieOptions>();\n });\n });\n});\n"]}
1
+ {"version":3,"file":"public-types.test.js","sourceRoot":"","sources":["../../../../../tests/unit/public-api/public-types.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expectTypeOf, it } from \"vitest\";\nimport * as Stagehand from \"@browserbasehq/stagehand\";\n\n// Type-level manifest of all expected exported types\n// Since these types don't exist at runtime, we currently need to manually add new publicly exported types\n// to this list ourselves - it's not automatically going to catch changes like our export-surface.test.ts does.\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\ntype ExpectedExportedTypes = {\n // Types from model.ts\n AvailableModel: Stagehand.AvailableModel;\n AvailableCuaModel: Stagehand.AvailableCuaModel;\n ModelProvider: Stagehand.ModelProvider;\n ClientOptions: Stagehand.ClientOptions;\n ModelConfiguration: Stagehand.ModelConfiguration;\n AnthropicJsonSchemaObject: Stagehand.AnthropicJsonSchemaObject;\n AISDKProvider: Stagehand.AISDKProvider;\n AISDKCustomProvider: Stagehand.AISDKCustomProvider;\n LLMTool: Stagehand.LLMTool;\n // Types from methods.ts\n ActOptions: Stagehand.ActOptions;\n ActResult: Stagehand.ActResult;\n ExtractResult: Stagehand.ExtractResult<Stagehand.StagehandZodSchema>;\n Action: Stagehand.Action;\n HistoryEntry: Stagehand.HistoryEntry;\n ExtractOptions: Stagehand.ExtractOptions;\n ObserveOptions: Stagehand.ObserveOptions;\n ObserveResult: Stagehand.ObserveResult;\n V3FunctionName: Stagehand.V3FunctionName;\n // Types from agent.ts\n Tool: Stagehand.Tool;\n AgentAction: Stagehand.AgentAction;\n AgentResult: Stagehand.AgentResult;\n AgentExecuteOptions: Stagehand.AgentExecuteOptions;\n AgentType: Stagehand.AgentType;\n AgentExecutionOptions: Stagehand.AgentExecutionOptions<Stagehand.AgentExecuteOptions>;\n AgentHandlerOptions: Stagehand.AgentHandlerOptions;\n ActionExecutionResult: Stagehand.ActionExecutionResult;\n ToolUseItem: Stagehand.ToolUseItem;\n AnthropicMessage: Stagehand.AnthropicMessage;\n AnthropicContentBlock: Stagehand.AnthropicContentBlock;\n AnthropicTextBlock: Stagehand.AnthropicTextBlock;\n AnthropicToolResult: Stagehand.AnthropicToolResult;\n ResponseItem: Stagehand.ResponseItem;\n ComputerCallItem: Stagehand.ComputerCallItem;\n FunctionCallItem: Stagehand.FunctionCallItem;\n ResponseInputItem: Stagehand.ResponseInputItem;\n AgentInstance: Stagehand.AgentInstance;\n AgentProviderType: Stagehand.AgentProviderType;\n AgentModelConfig: Stagehand.AgentModelConfig;\n AgentConfig: Stagehand.AgentConfig;\n AgentToolMode: Stagehand.AgentToolMode;\n VariableValue: Stagehand.VariableValue;\n Variables: Stagehand.Variables;\n AgentCallbacks: Stagehand.AgentCallbacks;\n AgentExecuteCallbacks: Stagehand.AgentExecuteCallbacks;\n AgentStreamCallbacks: Stagehand.AgentStreamCallbacks;\n AgentExecuteOptionsBase: Stagehand.AgentExecuteOptionsBase;\n AgentStreamExecuteOptions: Stagehand.AgentStreamExecuteOptions;\n ModelMessage: Stagehand.ModelMessage;\n // Types from agent/tools\n AgentTools: Stagehand.AgentTools;\n AgentToolTypesMap: Stagehand.AgentToolTypesMap;\n AgentUITools: Stagehand.AgentUITools;\n AgentToolCall: Stagehand.AgentToolCall;\n AgentToolResult: Stagehand.AgentToolResult;\n // Types from logs.ts\n LogLevel: Stagehand.LogLevel;\n LogLine: Stagehand.LogLine;\n Logger: Stagehand.Logger;\n // Types from metrics.ts\n StagehandMetrics: Stagehand.StagehandMetrics;\n // Types from options.ts\n V3Env: Stagehand.V3Env;\n LocalBrowserLaunchOptions: Stagehand.LocalBrowserLaunchOptions;\n V3Options: Stagehand.V3Options;\n // Types from page.ts\n AnyPage: Stagehand.AnyPage;\n Page: Stagehand.Page;\n PlaywrightPage: Stagehand.PlaywrightPage;\n PatchrightPage: Stagehand.PatchrightPage;\n PuppeteerPage: Stagehand.PuppeteerPage;\n ConsoleListener: Stagehand.ConsoleListener;\n LoadState: Stagehand.LoadState;\n // Types from LLMClient.ts\n ChatMessage: Stagehand.ChatMessage;\n ChatMessageContent: Stagehand.ChatMessageContent;\n ChatMessageImageContent: Stagehand.ChatMessageImageContent;\n ChatMessageTextContent: Stagehand.ChatMessageTextContent;\n ChatCompletionOptions: Stagehand.ChatCompletionOptions;\n LLMResponse: Stagehand.LLMResponse;\n CreateChatCompletionOptions: Stagehand.CreateChatCompletionOptions;\n LLMUsage: Stagehand.LLMUsage;\n LLMParsedResponse: Stagehand.LLMParsedResponse<Record<string, unknown>>;\n // Types from zodCompat.ts\n StagehandZodSchema: Stagehand.StagehandZodSchema;\n StagehandZodObject: Stagehand.StagehandZodObject;\n InferStagehandSchema: Stagehand.InferStagehandSchema<Stagehand.StagehandZodSchema>;\n JsonSchemaDocument: Stagehand.JsonSchemaDocument;\n // Types from utils.ts\n JsonSchema: Stagehand.JsonSchema;\n JsonSchemaProperty: Stagehand.JsonSchemaProperty;\n // Types from cookies.ts\n Cookie: Stagehand.Cookie;\n CookieParam: Stagehand.CookieParam;\n ClearCookieOptions: Stagehand.ClearCookieOptions;\n};\n\ndescribe(\"Stagehand public API types\", () => {\n describe(\"AnyPage\", () => {\n type ExpectedAnyPage =\n | Stagehand.PlaywrightPage\n | Stagehand.PuppeteerPage\n | Stagehand.PatchrightPage\n | Stagehand.Page;\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AnyPage>().toEqualTypeOf<ExpectedAnyPage>();\n });\n });\n\n describe(\"ActOptions\", () => {\n type ExpectedActOptions = {\n model?: Stagehand.ModelConfiguration;\n variables?: Stagehand.Variables;\n timeout?: number;\n page?: Stagehand.AnyPage;\n serverCache?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ActOptions>().toEqualTypeOf<ExpectedActOptions>();\n });\n });\n\n describe(\"ActResult\", () => {\n type ExpectedActResult = {\n success: boolean;\n message: string;\n actionDescription: string;\n actions: Stagehand.Action[];\n cacheStatus?: \"HIT\" | \"MISS\";\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ActResult>().toEqualTypeOf<ExpectedActResult>();\n });\n });\n\n describe(\"ExtractOptions\", () => {\n type ExpectedExtractOptions = {\n model?: Stagehand.ModelConfiguration;\n timeout?: number;\n selector?: string;\n ignoreSelectors?: string[];\n page?: Stagehand.AnyPage;\n serverCache?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ExtractOptions>().toEqualTypeOf<ExpectedExtractOptions>();\n });\n });\n\n describe(\"ObserveOptions\", () => {\n type ExpectedObserveOptions = {\n model?: Stagehand.ModelConfiguration;\n variables?: Stagehand.Variables;\n timeout?: number;\n selector?: string;\n ignoreSelectors?: string[];\n page?: Stagehand.AnyPage;\n serverCache?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ObserveOptions>().toEqualTypeOf<ExpectedObserveOptions>();\n });\n });\n\n describe(\"ObserveResult\", () => {\n it(\"is an Action array with optional cacheStatus\", () => {\n expectTypeOf<Stagehand.ObserveResult>().toExtend<Stagehand.Action[]>();\n expectTypeOf<Stagehand.ObserveResult[\"cacheStatus\"]>().toEqualTypeOf<\n \"HIT\" | \"MISS\" | undefined\n >();\n });\n });\n\n describe(\"Action\", () => {\n type ExpectedAction = {\n selector: string;\n description: string;\n method?: string;\n arguments?: string[];\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.Action>().toEqualTypeOf<ExpectedAction>();\n });\n });\n\n describe(\"AgentAction\", () => {\n // AgentAction is a separate type from Action, not an extension\n // It has additional fields like type, reasoning, taskCompleted, etc.\n it(\"has type field\", () => {\n type TestAction = { type: string } & Stagehand.AgentAction;\n expectTypeOf<TestAction[\"type\"]>().toEqualTypeOf<string>();\n });\n });\n\n describe(\"AgentExecuteOptions\", () => {\n type ExpectedAgentExecuteOptions = {\n instruction: string;\n maxSteps?: number;\n page?: Stagehand.AnyPage;\n highlightCursor?: boolean;\n messages?: Stagehand.ModelMessage[];\n signal?: AbortSignal;\n excludeTools?: string[];\n output?: Stagehand.StagehandZodObject;\n callbacks?: Stagehand.AgentExecuteCallbacks;\n variables?: Stagehand.Variables;\n toolTimeout?: number;\n useSearch?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentExecuteOptions>().toEqualTypeOf<ExpectedAgentExecuteOptions>();\n });\n });\n\n describe(\"AgentStreamExecuteOptions\", () => {\n type ExpectedAgentStreamExecuteOptions = {\n instruction: string;\n maxSteps?: number;\n page?: Stagehand.AnyPage;\n highlightCursor?: boolean;\n messages?: Stagehand.ModelMessage[];\n signal?: AbortSignal;\n excludeTools?: string[];\n output?: Stagehand.StagehandZodObject;\n callbacks?: Stagehand.AgentStreamCallbacks;\n variables?: Stagehand.Variables;\n toolTimeout?: number;\n useSearch?: boolean;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentStreamExecuteOptions>().toEqualTypeOf<ExpectedAgentStreamExecuteOptions>();\n });\n });\n\n describe(\"AgentExecutionOptions\", () => {\n type ExpectedAgentExecutionOptions<T = Stagehand.AgentExecuteOptions> = {\n options: T;\n logger: (message: Stagehand.LogLine) => void;\n retries?: number;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<\n Stagehand.AgentExecutionOptions<Stagehand.AgentExecuteOptions>\n >().toEqualTypeOf<\n ExpectedAgentExecutionOptions<Stagehand.AgentExecuteOptions>\n >();\n });\n });\n\n describe(\"AgentResult\", () => {\n type ExpectedAgentResult = {\n success: boolean;\n message: string;\n actions: Stagehand.AgentAction[];\n completed: boolean;\n metadata?: Record<string, unknown>;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n reasoning_tokens?: number;\n cached_input_tokens?: number;\n inference_time_ms: number;\n };\n messages?: Stagehand.ModelMessage[];\n output?: Record<string, unknown>;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentResult>().toEqualTypeOf<ExpectedAgentResult>();\n });\n });\n\n describe(\"AgentConfig\", () => {\n type ExpectedAgentConfig = {\n systemPrompt?: string;\n integrations?: (unknown | string)[];\n tools?: unknown;\n cua?: boolean;\n model?: string | Stagehand.AgentModelConfig<string>;\n executionModel?: string | Stagehand.AgentModelConfig<string>;\n stream?: boolean;\n mode?: Stagehand.AgentToolMode;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentConfig>().toExtend<ExpectedAgentConfig>();\n });\n });\n\n describe(\"AgentToolMode\", () => {\n type ExpectedAgentToolMode = \"dom\" | \"hybrid\" | \"cua\";\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.AgentToolMode>().toEqualTypeOf<ExpectedAgentToolMode>();\n });\n });\n\n describe(\"HistoryEntry\", () => {\n type ExpectedHistoryEntry = {\n method: \"act\" | \"extract\" | \"observe\" | \"navigate\" | \"agent\";\n parameters: unknown;\n result: unknown;\n timestamp: string;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.HistoryEntry>().toEqualTypeOf<ExpectedHistoryEntry>();\n });\n });\n\n describe(\"Cookie\", () => {\n type ExpectedCookie = {\n name: string;\n value: string;\n domain: string;\n path: string;\n expires: number;\n httpOnly: boolean;\n secure: boolean;\n sameSite: \"Strict\" | \"Lax\" | \"None\";\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.Cookie>().toEqualTypeOf<ExpectedCookie>();\n });\n });\n\n describe(\"CookieParam\", () => {\n type ExpectedCookieParam = {\n name: string;\n value: string;\n url?: string;\n domain?: string;\n path?: string;\n expires?: number;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.CookieParam>().toEqualTypeOf<ExpectedCookieParam>();\n });\n });\n\n describe(\"ClearCookieOptions\", () => {\n type ExpectedClearCookieOptions = {\n name?: string | RegExp;\n domain?: string | RegExp;\n path?: string | RegExp;\n };\n\n it(\"matches expected type shape\", () => {\n expectTypeOf<Stagehand.ClearCookieOptions>().toEqualTypeOf<ExpectedClearCookieOptions>();\n });\n });\n});\n"]}
@@ -119,6 +119,41 @@ describe("a11yForFrame", () => {
119
119
  const result = await a11yForFrame(session, "frame-1", opts);
120
120
  expect(result.scopeApplied).toBe(false);
121
121
  });
122
+ it("filters ignored backend nodes from outline and url map", async () => {
123
+ const nodes = [
124
+ ...baseAxNodes(),
125
+ {
126
+ nodeId: "3",
127
+ role: { type: stringType, value: "link" },
128
+ name: { type: stringType, value: "Ignore me" },
129
+ backendDOMNodeId: 102,
130
+ parentId: "1",
131
+ childIds: [],
132
+ properties: [
133
+ {
134
+ name: "url",
135
+ value: { type: stringType, value: "https://ignored.example.com" },
136
+ },
137
+ ],
138
+ ignored: false,
139
+ },
140
+ ];
141
+ const session = new MockCDPSession({
142
+ ...baseHandlers,
143
+ "Accessibility.getFullAXTree": async () => ({ nodes }),
144
+ });
145
+ const result = await a11yForFrame(session, "frame-1", {
146
+ focusSelector: undefined,
147
+ isIgnoredBackendNode: (backendNodeId) => backendNodeId === 102,
148
+ experimental: false,
149
+ tagNameMap: { "enc-100": "#document", "enc-101": "a", "enc-102": "a" },
150
+ scrollableMap: {},
151
+ encode: (backend) => `enc-${backend}`,
152
+ });
153
+ expect(result.outline).toContain("Docs");
154
+ expect(result.outline).not.toContain("Ignore me");
155
+ expect(result.urlMap["enc-102"]).toBeUndefined();
156
+ });
122
157
  });
123
158
  describe("resolveObjectIdForXPath", () => {
124
159
  beforeEach(() => {
@@ -202,6 +237,40 @@ describe("tryScopedSnapshot", () => {
202
237
  ["frame-2", "frame-1"],
203
238
  ]),
204
239
  };
240
+ const sessionIndex = {
241
+ rootBackend: 100,
242
+ absByBe: new Map([
243
+ [100, "/"],
244
+ [101, "/html[1]"],
245
+ [102, "/html[1]/body[1]"],
246
+ [200, "/html[1]/body[1]/iframe[1]"],
247
+ [201, "/html[1]/body[1]/iframe[1]/div[1]"],
248
+ ]),
249
+ tagByBe: new Map(),
250
+ scrollByBe: new Map(),
251
+ docRootOf: new Map([
252
+ [100, 100],
253
+ [101, 100],
254
+ [102, 100],
255
+ [200, 200],
256
+ [201, 200],
257
+ ]),
258
+ contentDocRootByIframe: new Map(),
259
+ enterByBe: new Map([
260
+ [100, 0],
261
+ [101, 1],
262
+ [102, 2],
263
+ [200, 3],
264
+ [201, 4],
265
+ ]),
266
+ exitByBe: new Map([
267
+ [101, 5],
268
+ [102, 6],
269
+ [201, 7],
270
+ [200, 8],
271
+ [100, 9],
272
+ ]),
273
+ };
205
274
  const makePage = (session, overrides) => ({
206
275
  mainFrameId: () => "frame-1",
207
276
  asProtocolFrameTree: () => ({
@@ -235,7 +304,7 @@ describe("tryScopedSnapshot", () => {
235
304
  tailSelector: ".btn-inner",
236
305
  absPrefix: "/html/body/iframe[1]",
237
306
  });
238
- const result = await tryScopedSnapshot(makePage(session), { focusSelector: ".btn" }, context, true);
307
+ const result = await tryScopedSnapshot(makePage(session), { focusSelector: ".btn" }, context, true, new Map([[session.id, sessionIndex]]), new Map());
239
308
  expect(result).not.toBeNull();
240
309
  expect(result?.combinedXpathMap["1-10"]).toBe("/html/body/iframe[1]/div[1]");
241
310
  expect(domMapsSpy).toHaveBeenCalled();
@@ -254,12 +323,12 @@ describe("tryScopedSnapshot", () => {
254
323
  scopeApplied: false,
255
324
  });
256
325
  const loggerSpy = vi.spyOn(logger, "v3Logger").mockImplementation(() => { });
257
- const result = await tryScopedSnapshot(makePage(session), { focusSelector: ".btn" }, context, false);
326
+ const result = await tryScopedSnapshot(makePage(session), { focusSelector: ".btn" }, context, false, new Map([[session.id, sessionIndex]]), new Map());
258
327
  expect(result).toBeNull();
259
328
  expect(loggerSpy).toHaveBeenCalled();
260
329
  });
261
330
  it("returns null immediately when no focus selector is provided", async () => {
262
- const result = await tryScopedSnapshot(makePage(new MockCDPSession({})), {}, context, true);
331
+ const result = await tryScopedSnapshot(makePage(new MockCDPSession({})), {}, context, true, new Map(), new Map());
263
332
  expect(result).toBeNull();
264
333
  });
265
334
  it("supports XPath focus resolution branch", async () => {
@@ -279,7 +348,7 @@ describe("tryScopedSnapshot", () => {
279
348
  tailXPath: "//div[1]",
280
349
  absPrefix: "",
281
350
  });
282
- const result = await tryScopedSnapshot(makePage(session), { focusSelector: "xpath=//div" }, context, true);
351
+ const result = await tryScopedSnapshot(makePage(session), { focusSelector: "xpath=//div" }, context, true, new Map([[session.id, sessionIndex]]), new Map());
283
352
  expect(result).not.toBeNull();
284
353
  expect(result?.combinedXpathMap["1-10"]).toBe("/div[1]");
285
354
  });
@@ -287,9 +356,41 @@ describe("tryScopedSnapshot", () => {
287
356
  const session = new MockCDPSession({});
288
357
  vi.spyOn(focusSelectors, "resolveCssFocusFrameAndTail").mockRejectedValue(new Error("bad selector"));
289
358
  const loggerSpy = vi.spyOn(logger, "v3Logger").mockImplementation(() => { });
290
- const result = await tryScopedSnapshot(makePage(session), { focusSelector: ".bad" }, context, true);
359
+ const result = await tryScopedSnapshot(makePage(session), { focusSelector: ".bad" }, context, true, new Map([[session.id, sessionIndex]]), new Map());
291
360
  expect(result).toBeNull();
292
361
  expect(loggerSpy).toHaveBeenCalled();
293
362
  });
363
+ it("filters ignored xpath entries in the scoped snapshot", async () => {
364
+ const session = new MockCDPSession({});
365
+ vi.spyOn(domTree, "domMapsForSession").mockResolvedValue({
366
+ tagNameMap: { "1-10": "div", "1-11": "div" },
367
+ xpathMap: { "1-10": "/div[1]", "1-11": "/div[2]" },
368
+ scrollableMap: {},
369
+ });
370
+ vi.spyOn(a11yTree, "a11yForFrame").mockResolvedValue({
371
+ outline: "[1-11] div",
372
+ urlMap: {},
373
+ scopeApplied: true,
374
+ });
375
+ vi.spyOn(focusSelectors, "resolveCssFocusFrameAndTail").mockResolvedValue({
376
+ targetFrameId: "frame-2",
377
+ tailSelector: ".btn-inner",
378
+ absPrefix: "/html/body/iframe[1]",
379
+ });
380
+ const scopedIndex = {
381
+ ...sessionIndex,
382
+ enterByBe: new Map([
383
+ [10, 0],
384
+ [11, 3],
385
+ ]),
386
+ exitByBe: new Map([
387
+ [10, 2],
388
+ [11, 4],
389
+ ]),
390
+ };
391
+ const result = await tryScopedSnapshot(makePage(session), { focusSelector: ".btn" }, context, true, new Map([[session.id, scopedIndex]]), new Map([["frame-2", [{ start: 0, end: 2 }]]]));
392
+ expect(result?.combinedXpathMap["1-10"]).toBeUndefined();
393
+ expect(result?.combinedXpathMap["1-11"]).toBe("/html/body/iframe[1]/div[2]");
394
+ });
294
395
  });
295
396
  //# sourceMappingURL=snapshot-a11y-resolvers.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot-a11y-resolvers.test.js","sourceRoot":"","sources":["../../../../tests/unit/snapshot-a11y-resolvers.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Protocol } from \"devtools-protocol\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { a11yForFrame } from \"../../lib/v3/understudy/a11y/snapshot/a11yTree.js\";\nimport type { AccessibilityTreeResult } from \"../../lib/v3/types/private/index.js\";\nimport * as focusSelectors from \"../../lib/v3/understudy/a11y/snapshot/focusSelectors.js\";\nimport { MockCDPSession } from \"./helpers/mockCDPSession.js\";\nimport { executionContexts } from \"../../lib/v3/understudy/executionContextRegistry.js\";\nimport { tryScopedSnapshot } from \"../../lib/v3/understudy/a11y/snapshot/capture.js\";\nimport type {\n FrameContext,\n A11yOptions,\n} from \"../../lib/v3/types/private/index.js\";\nimport type { Page } from \"../../lib/v3/understudy/page.js\";\nimport * as domTree from \"../../lib/v3/understudy/a11y/snapshot/domTree.js\";\nimport * as a11yTree from \"../../lib/v3/understudy/a11y/snapshot/a11yTree.js\";\nimport * as logger from \"../../lib/v3/logger.js\";\n\nconst stringType = \"string\" as Protocol.Accessibility.AXValueType;\n\nconst baseAxNodes = (): Protocol.Accessibility.AXNode[] => [\n {\n nodeId: \"1\",\n role: { type: stringType, value: \"RootWebArea\" },\n backendDOMNodeId: 100,\n childIds: [\"2\"],\n ignored: false,\n },\n {\n nodeId: \"2\",\n role: { type: stringType, value: \"link\" },\n name: { type: stringType, value: \"Docs\" },\n backendDOMNodeId: 101,\n parentId: \"1\",\n childIds: [],\n properties: [\n {\n name: \"url\",\n value: { type: stringType, value: \"https://example.com\" },\n },\n ],\n ignored: false,\n },\n];\n\nconst baseHandlers = {\n \"Accessibility.enable\": async () => ({}),\n \"Runtime.enable\": async () => ({}),\n \"DOM.enable\": async () => ({}),\n};\n\ndescribe(\"a11yForFrame\", () => {\n beforeEach(() => {\n vi.restoreAllMocks();\n });\n\n it(\"returns full outline and url map when no focus selector is provided\", async () => {\n const session = new MockCDPSession({\n ...baseHandlers,\n \"Accessibility.getFullAXTree\": async () => ({ nodes: baseAxNodes() }),\n });\n\n const opts: A11yOptions = {\n focusSelector: undefined,\n experimental: false,\n tagNameMap: { \"enc-100\": \"#document\", \"enc-101\": \"a\" },\n scrollableMap: {},\n encode: (backend) => `enc-${backend}`,\n };\n\n const result = await a11yForFrame(session, undefined, opts);\n\n expect(result.scopeApplied).toBe(false);\n expect(result.urlMap[\"enc-101\"]).toBe(\"https://example.com\");\n expect(result.outline).toContain(\"Docs\");\n });\n\n it(\"scopes the tree to the resolved focus selector target\", async () => {\n const nodes = baseAxNodes().map((n) =>\n n.nodeId === \"2\"\n ? {\n ...n,\n childIds: [\"3\"],\n }\n : n,\n );\n nodes.push({\n nodeId: \"3\",\n parentId: \"2\",\n childIds: [],\n role: { type: stringType, value: \"StaticText\" },\n backendDOMNodeId: 102,\n ignored: false,\n });\n\n let scopedOnce = false;\n const session = new MockCDPSession({\n ...baseHandlers,\n \"Accessibility.getFullAXTree\": async (params) => {\n if (params?.frameId && !scopedOnce) {\n scopedOnce = true;\n throw new Error(\"does not belong to the target\");\n }\n return { nodes };\n },\n \"DOM.describeNode\": async () => ({\n node: { backendNodeId: 101 },\n }),\n });\n\n const resolveSpy = vi\n .spyOn(focusSelectors, \"resolveObjectIdForXPath\")\n .mockResolvedValue(\"object-1\");\n\n const opts: A11yOptions = {\n focusSelector: \"xpath=//a\",\n experimental: false,\n tagNameMap: { \"enc-101\": \"a\" },\n scrollableMap: {},\n encode: (backend) => `enc-${backend}`,\n };\n\n const result = await a11yForFrame(session, \"frame-1\", opts);\n\n expect(result.scopeApplied).toBe(true);\n expect(result.outline).not.toContain(\"RootWebArea\");\n expect(resolveSpy).toHaveBeenCalled();\n resolveSpy.mockRestore();\n });\n\n it(\"falls back to full tree when resolveObjectId throws\", async () => {\n const session = new MockCDPSession({\n ...baseHandlers,\n \"Accessibility.getFullAXTree\": async () => ({ nodes: baseAxNodes() }),\n });\n vi.spyOn(focusSelectors, \"resolveObjectIdForCss\").mockRejectedValue(\n new Error(\"fail\"),\n );\n const opts: A11yOptions = {\n focusSelector: \".btn\",\n experimental: false,\n tagNameMap: {},\n scrollableMap: {},\n encode: (backend) => `enc-${backend}`,\n };\n\n const result = await a11yForFrame(session, \"frame-1\", opts);\n expect(result.scopeApplied).toBe(false);\n });\n});\n\ndescribe(\"resolveObjectIdForXPath\", () => {\n beforeEach(() => {\n vi.restoreAllMocks();\n });\n\n it(\"evaluates in the target frame's main world when available\", async () => {\n vi.spyOn(executionContexts, \"waitForMainWorld\").mockResolvedValue(42);\n vi.spyOn(executionContexts, \"getMainWorld\").mockReturnValue(undefined);\n const session = new MockCDPSession({\n \"Runtime.evaluate\": async (params) => {\n expect(params?.contextId).toBe(42);\n return { result: { objectId: \"node-obj\" } };\n },\n });\n\n const objectId = await focusSelectors.resolveObjectIdForXPath(\n session,\n \"//div\",\n \"frame-1\",\n );\n expect(objectId).toBe(\"node-obj\");\n });\n\n it(\"returns null when evaluation throws or reports exception details\", async () => {\n vi.spyOn(executionContexts, \"waitForMainWorld\").mockRejectedValue(\n new Error(\"missing\"),\n );\n vi.spyOn(executionContexts, \"getMainWorld\").mockReturnValue(undefined);\n const session = new MockCDPSession({\n \"Runtime.evaluate\": async () => ({\n result: {},\n exceptionDetails: { exception: { description: \"bad\" } },\n }),\n });\n\n const objectId = await focusSelectors.resolveObjectIdForXPath(\n session,\n \"//div\",\n \"frame-2\",\n );\n expect(objectId).toBeNull();\n });\n});\n\ndescribe(\"resolveObjectIdForCss\", () => {\n beforeEach(() => {\n vi.restoreAllMocks();\n });\n\n it(\"returns primary evaluation result when available\", async () => {\n vi.spyOn(executionContexts, \"waitForMainWorld\").mockResolvedValue(7);\n const session = new MockCDPSession({\n \"Runtime.evaluate\": async () => ({\n result: { objectId: \"primary-obj\" },\n }),\n });\n const objectId = await focusSelectors.resolveObjectIdForCss(\n session,\n \".btn\",\n \"frame-1\",\n );\n expect(objectId).toBe(\"primary-obj\");\n });\n\n it(\"falls back to the pierce selector when the primary lookup fails\", async () => {\n let call = 0;\n const session = new MockCDPSession({\n \"Runtime.evaluate\": async (params) => {\n call++;\n if (call === 1) {\n expect(String(params?.expression)).toContain(\"resolveCssSelector\");\n return { result: {} };\n }\n expect(String(params?.expression)).toContain(\n \"resolveCssSelectorPierce\",\n );\n return { result: { objectId: \"css-obj\" } };\n },\n });\n\n const objectId = await focusSelectors.resolveObjectIdForCss(\n session,\n \".btn\",\n undefined,\n );\n expect(objectId).toBe(\"css-obj\");\n });\n\n it(\"returns null when both primary and fallback evaluations throw\", async () => {\n vi.spyOn(executionContexts, \"waitForMainWorld\").mockResolvedValue(11);\n vi.spyOn(executionContexts, \"getMainWorld\").mockReturnValue(undefined);\n const session = new MockCDPSession({\n \"Runtime.evaluate\": async () => ({\n result: {},\n exceptionDetails: { exception: { description: \"fail\" } },\n }),\n });\n\n const objectId = await focusSelectors.resolveObjectIdForCss(\n session,\n \".missing\",\n \"frame-1\",\n );\n expect(objectId).toBeNull();\n });\n});\n\ndescribe(\"tryScopedSnapshot\", () => {\n const ordinal = (frameId: string) => (frameId === \"frame-1\" ? 0 : 1);\n const context: FrameContext = {\n rootId: \"frame-1\",\n frames: [\"frame-1\", \"frame-2\"],\n parentByFrame: new Map([\n [\"frame-1\", null],\n [\"frame-2\", \"frame-1\"],\n ]),\n };\n\n const makePage = (session: MockCDPSession, overrides?: Partial<Page>): Page =>\n ({\n mainFrameId: () => \"frame-1\",\n asProtocolFrameTree: () => ({\n frame: { id: \"frame-1\" as Protocol.Page.FrameId },\n childFrames: [{ frame: { id: \"frame-2\" as Protocol.Page.FrameId } }],\n }),\n listAllFrameIds: () => [\"frame-1\", \"frame-2\"],\n getSessionForFrame: () => session,\n getOrdinal: (fid: string) => ordinal(fid),\n ...overrides,\n }) as unknown as Page;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n });\n\n it(\"returns scoped snapshot when focus selector resolves via CSS hops\", async () => {\n const session = new MockCDPSession({});\n const domMapsSpy = vi\n .spyOn(domTree, \"domMapsForSession\")\n .mockResolvedValue({\n tagNameMap: { \"1-10\": \"div\" },\n xpathMap: { \"1-10\": \"/div[1]\" },\n scrollableMap: {},\n });\n const a11ySpy = vi.spyOn(a11yTree, \"a11yForFrame\").mockResolvedValue({\n outline: \"[1-10] div\",\n urlMap: { \"1-10\": \"https://example.com\" },\n scopeApplied: true,\n } as AccessibilityTreeResult);\n vi.spyOn(focusSelectors, \"resolveCssFocusFrameAndTail\").mockResolvedValue({\n targetFrameId: \"frame-2\",\n tailSelector: \".btn-inner\",\n absPrefix: \"/html/body/iframe[1]\",\n });\n\n const result = await tryScopedSnapshot(\n makePage(session),\n { focusSelector: \".btn\" },\n context,\n true,\n );\n\n expect(result).not.toBeNull();\n expect(result?.combinedXpathMap[\"1-10\"]).toBe(\n \"/html/body/iframe[1]/div[1]\",\n );\n expect(domMapsSpy).toHaveBeenCalled();\n expect(a11ySpy).toHaveBeenCalled();\n });\n\n it(\"returns null and logs fallback when scope is not applied\", async () => {\n const session = new MockCDPSession({});\n vi.spyOn(domTree, \"domMapsForSession\").mockResolvedValue({\n tagNameMap: { \"1-10\": \"div\" },\n xpathMap: { \"1-10\": \"/div[1]\" },\n scrollableMap: {},\n });\n vi.spyOn(a11yTree, \"a11yForFrame\").mockResolvedValue({\n outline: \"ignored\",\n urlMap: {},\n scopeApplied: false,\n } as AccessibilityTreeResult);\n const loggerSpy = vi.spyOn(logger, \"v3Logger\").mockImplementation(() => {});\n\n const result = await tryScopedSnapshot(\n makePage(session),\n { focusSelector: \".btn\" },\n context,\n false,\n );\n\n expect(result).toBeNull();\n expect(loggerSpy).toHaveBeenCalled();\n });\n\n it(\"returns null immediately when no focus selector is provided\", async () => {\n const result = await tryScopedSnapshot(\n makePage(new MockCDPSession({})),\n {},\n context,\n true,\n );\n expect(result).toBeNull();\n });\n\n it(\"supports XPath focus resolution branch\", async () => {\n const session = new MockCDPSession({});\n vi.spyOn(domTree, \"domMapsForSession\").mockResolvedValue({\n tagNameMap: { \"1-10\": \"div\" },\n xpathMap: { \"1-10\": \"/div[1]\" },\n scrollableMap: {},\n });\n vi.spyOn(a11yTree, \"a11yForFrame\").mockResolvedValue({\n outline: \"[1-10] div\",\n urlMap: {},\n scopeApplied: true,\n } as AccessibilityTreeResult);\n vi.spyOn(focusSelectors, \"resolveFocusFrameAndTail\").mockResolvedValue({\n targetFrameId: \"frame-1\",\n tailXPath: \"//div[1]\",\n absPrefix: \"\",\n });\n\n const result = await tryScopedSnapshot(\n makePage(session),\n { focusSelector: \"xpath=//div\" },\n context,\n true,\n );\n\n expect(result).not.toBeNull();\n expect(result?.combinedXpathMap[\"1-10\"]).toBe(\"/div[1]\");\n });\n\n it(\"logs and returns null when resolver throws\", async () => {\n const session = new MockCDPSession({});\n vi.spyOn(focusSelectors, \"resolveCssFocusFrameAndTail\").mockRejectedValue(\n new Error(\"bad selector\"),\n );\n const loggerSpy = vi.spyOn(logger, \"v3Logger\").mockImplementation(() => {});\n\n const result = await tryScopedSnapshot(\n makePage(session),\n { focusSelector: \".bad\" },\n context,\n true,\n );\n\n expect(result).toBeNull();\n expect(loggerSpy).toHaveBeenCalled();\n });\n});\n"]}
1
+ {"version":3,"file":"snapshot-a11y-resolvers.test.js","sourceRoot":"","sources":["../../../../tests/unit/snapshot-a11y-resolvers.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Protocol } from \"devtools-protocol\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { a11yForFrame } from \"../../lib/v3/understudy/a11y/snapshot/a11yTree.js\";\nimport type { AccessibilityTreeResult } from \"../../lib/v3/types/private/index.js\";\nimport * as focusSelectors from \"../../lib/v3/understudy/a11y/snapshot/focusSelectors.js\";\nimport { MockCDPSession } from \"./helpers/mockCDPSession.js\";\nimport { executionContexts } from \"../../lib/v3/understudy/executionContextRegistry.js\";\nimport { tryScopedSnapshot } from \"../../lib/v3/understudy/a11y/snapshot/capture.js\";\nimport type {\n FrameContext,\n A11yOptions,\n SessionDomIndex,\n} from \"../../lib/v3/types/private/index.js\";\nimport type { Page } from \"../../lib/v3/understudy/page.js\";\nimport * as domTree from \"../../lib/v3/understudy/a11y/snapshot/domTree.js\";\nimport * as a11yTree from \"../../lib/v3/understudy/a11y/snapshot/a11yTree.js\";\nimport * as logger from \"../../lib/v3/logger.js\";\n\nconst stringType = \"string\" as Protocol.Accessibility.AXValueType;\n\nconst baseAxNodes = (): Protocol.Accessibility.AXNode[] => [\n {\n nodeId: \"1\",\n role: { type: stringType, value: \"RootWebArea\" },\n backendDOMNodeId: 100,\n childIds: [\"2\"],\n ignored: false,\n },\n {\n nodeId: \"2\",\n role: { type: stringType, value: \"link\" },\n name: { type: stringType, value: \"Docs\" },\n backendDOMNodeId: 101,\n parentId: \"1\",\n childIds: [],\n properties: [\n {\n name: \"url\",\n value: { type: stringType, value: \"https://example.com\" },\n },\n ],\n ignored: false,\n },\n];\n\nconst baseHandlers = {\n \"Accessibility.enable\": async () => ({}),\n \"Runtime.enable\": async () => ({}),\n \"DOM.enable\": async () => ({}),\n};\n\ndescribe(\"a11yForFrame\", () => {\n beforeEach(() => {\n vi.restoreAllMocks();\n });\n\n it(\"returns full outline and url map when no focus selector is provided\", async () => {\n const session = new MockCDPSession({\n ...baseHandlers,\n \"Accessibility.getFullAXTree\": async () => ({ nodes: baseAxNodes() }),\n });\n\n const opts: A11yOptions = {\n focusSelector: undefined,\n experimental: false,\n tagNameMap: { \"enc-100\": \"#document\", \"enc-101\": \"a\" },\n scrollableMap: {},\n encode: (backend) => `enc-${backend}`,\n };\n\n const result = await a11yForFrame(session, undefined, opts);\n\n expect(result.scopeApplied).toBe(false);\n expect(result.urlMap[\"enc-101\"]).toBe(\"https://example.com\");\n expect(result.outline).toContain(\"Docs\");\n });\n\n it(\"scopes the tree to the resolved focus selector target\", async () => {\n const nodes = baseAxNodes().map((n) =>\n n.nodeId === \"2\"\n ? {\n ...n,\n childIds: [\"3\"],\n }\n : n,\n );\n nodes.push({\n nodeId: \"3\",\n parentId: \"2\",\n childIds: [],\n role: { type: stringType, value: \"StaticText\" },\n backendDOMNodeId: 102,\n ignored: false,\n });\n\n let scopedOnce = false;\n const session = new MockCDPSession({\n ...baseHandlers,\n \"Accessibility.getFullAXTree\": async (params) => {\n if (params?.frameId && !scopedOnce) {\n scopedOnce = true;\n throw new Error(\"does not belong to the target\");\n }\n return { nodes };\n },\n \"DOM.describeNode\": async () => ({\n node: { backendNodeId: 101 },\n }),\n });\n\n const resolveSpy = vi\n .spyOn(focusSelectors, \"resolveObjectIdForXPath\")\n .mockResolvedValue(\"object-1\");\n\n const opts: A11yOptions = {\n focusSelector: \"xpath=//a\",\n experimental: false,\n tagNameMap: { \"enc-101\": \"a\" },\n scrollableMap: {},\n encode: (backend) => `enc-${backend}`,\n };\n\n const result = await a11yForFrame(session, \"frame-1\", opts);\n\n expect(result.scopeApplied).toBe(true);\n expect(result.outline).not.toContain(\"RootWebArea\");\n expect(resolveSpy).toHaveBeenCalled();\n resolveSpy.mockRestore();\n });\n\n it(\"falls back to full tree when resolveObjectId throws\", async () => {\n const session = new MockCDPSession({\n ...baseHandlers,\n \"Accessibility.getFullAXTree\": async () => ({ nodes: baseAxNodes() }),\n });\n vi.spyOn(focusSelectors, \"resolveObjectIdForCss\").mockRejectedValue(\n new Error(\"fail\"),\n );\n const opts: A11yOptions = {\n focusSelector: \".btn\",\n experimental: false,\n tagNameMap: {},\n scrollableMap: {},\n encode: (backend) => `enc-${backend}`,\n };\n\n const result = await a11yForFrame(session, \"frame-1\", opts);\n expect(result.scopeApplied).toBe(false);\n });\n\n it(\"filters ignored backend nodes from outline and url map\", async () => {\n const nodes = [\n ...baseAxNodes(),\n {\n nodeId: \"3\",\n role: { type: stringType, value: \"link\" },\n name: { type: stringType, value: \"Ignore me\" },\n backendDOMNodeId: 102,\n parentId: \"1\",\n childIds: [] as string[],\n properties: [\n {\n name: \"url\",\n value: { type: stringType, value: \"https://ignored.example.com\" },\n },\n ],\n ignored: false,\n },\n ];\n\n const session = new MockCDPSession({\n ...baseHandlers,\n \"Accessibility.getFullAXTree\": async () => ({ nodes }),\n });\n\n const result = await a11yForFrame(session, \"frame-1\", {\n focusSelector: undefined,\n isIgnoredBackendNode: (backendNodeId) => backendNodeId === 102,\n experimental: false,\n tagNameMap: { \"enc-100\": \"#document\", \"enc-101\": \"a\", \"enc-102\": \"a\" },\n scrollableMap: {},\n encode: (backend) => `enc-${backend}`,\n });\n\n expect(result.outline).toContain(\"Docs\");\n expect(result.outline).not.toContain(\"Ignore me\");\n expect(result.urlMap[\"enc-102\"]).toBeUndefined();\n });\n});\n\ndescribe(\"resolveObjectIdForXPath\", () => {\n beforeEach(() => {\n vi.restoreAllMocks();\n });\n\n it(\"evaluates in the target frame's main world when available\", async () => {\n vi.spyOn(executionContexts, \"waitForMainWorld\").mockResolvedValue(42);\n vi.spyOn(executionContexts, \"getMainWorld\").mockReturnValue(undefined);\n const session = new MockCDPSession({\n \"Runtime.evaluate\": async (params) => {\n expect(params?.contextId).toBe(42);\n return { result: { objectId: \"node-obj\" } };\n },\n });\n\n const objectId = await focusSelectors.resolveObjectIdForXPath(\n session,\n \"//div\",\n \"frame-1\",\n );\n expect(objectId).toBe(\"node-obj\");\n });\n\n it(\"returns null when evaluation throws or reports exception details\", async () => {\n vi.spyOn(executionContexts, \"waitForMainWorld\").mockRejectedValue(\n new Error(\"missing\"),\n );\n vi.spyOn(executionContexts, \"getMainWorld\").mockReturnValue(undefined);\n const session = new MockCDPSession({\n \"Runtime.evaluate\": async () => ({\n result: {},\n exceptionDetails: { exception: { description: \"bad\" } },\n }),\n });\n\n const objectId = await focusSelectors.resolveObjectIdForXPath(\n session,\n \"//div\",\n \"frame-2\",\n );\n expect(objectId).toBeNull();\n });\n});\n\ndescribe(\"resolveObjectIdForCss\", () => {\n beforeEach(() => {\n vi.restoreAllMocks();\n });\n\n it(\"returns primary evaluation result when available\", async () => {\n vi.spyOn(executionContexts, \"waitForMainWorld\").mockResolvedValue(7);\n const session = new MockCDPSession({\n \"Runtime.evaluate\": async () => ({\n result: { objectId: \"primary-obj\" },\n }),\n });\n const objectId = await focusSelectors.resolveObjectIdForCss(\n session,\n \".btn\",\n \"frame-1\",\n );\n expect(objectId).toBe(\"primary-obj\");\n });\n\n it(\"falls back to the pierce selector when the primary lookup fails\", async () => {\n let call = 0;\n const session = new MockCDPSession({\n \"Runtime.evaluate\": async (params) => {\n call++;\n if (call === 1) {\n expect(String(params?.expression)).toContain(\"resolveCssSelector\");\n return { result: {} };\n }\n expect(String(params?.expression)).toContain(\n \"resolveCssSelectorPierce\",\n );\n return { result: { objectId: \"css-obj\" } };\n },\n });\n\n const objectId = await focusSelectors.resolveObjectIdForCss(\n session,\n \".btn\",\n undefined,\n );\n expect(objectId).toBe(\"css-obj\");\n });\n\n it(\"returns null when both primary and fallback evaluations throw\", async () => {\n vi.spyOn(executionContexts, \"waitForMainWorld\").mockResolvedValue(11);\n vi.spyOn(executionContexts, \"getMainWorld\").mockReturnValue(undefined);\n const session = new MockCDPSession({\n \"Runtime.evaluate\": async () => ({\n result: {},\n exceptionDetails: { exception: { description: \"fail\" } },\n }),\n });\n\n const objectId = await focusSelectors.resolveObjectIdForCss(\n session,\n \".missing\",\n \"frame-1\",\n );\n expect(objectId).toBeNull();\n });\n});\n\ndescribe(\"tryScopedSnapshot\", () => {\n const ordinal = (frameId: string) => (frameId === \"frame-1\" ? 0 : 1);\n const context: FrameContext = {\n rootId: \"frame-1\",\n frames: [\"frame-1\", \"frame-2\"],\n parentByFrame: new Map([\n [\"frame-1\", null],\n [\"frame-2\", \"frame-1\"],\n ]),\n };\n const sessionIndex: SessionDomIndex = {\n rootBackend: 100,\n absByBe: new Map([\n [100, \"/\"],\n [101, \"/html[1]\"],\n [102, \"/html[1]/body[1]\"],\n [200, \"/html[1]/body[1]/iframe[1]\"],\n [201, \"/html[1]/body[1]/iframe[1]/div[1]\"],\n ]),\n tagByBe: new Map(),\n scrollByBe: new Map(),\n docRootOf: new Map([\n [100, 100],\n [101, 100],\n [102, 100],\n [200, 200],\n [201, 200],\n ]),\n contentDocRootByIframe: new Map(),\n enterByBe: new Map([\n [100, 0],\n [101, 1],\n [102, 2],\n [200, 3],\n [201, 4],\n ]),\n exitByBe: new Map([\n [101, 5],\n [102, 6],\n [201, 7],\n [200, 8],\n [100, 9],\n ]),\n };\n\n const makePage = (session: MockCDPSession, overrides?: Partial<Page>): Page =>\n ({\n mainFrameId: () => \"frame-1\",\n asProtocolFrameTree: () => ({\n frame: { id: \"frame-1\" as Protocol.Page.FrameId },\n childFrames: [{ frame: { id: \"frame-2\" as Protocol.Page.FrameId } }],\n }),\n listAllFrameIds: () => [\"frame-1\", \"frame-2\"],\n getSessionForFrame: () => session,\n getOrdinal: (fid: string) => ordinal(fid),\n ...overrides,\n }) as unknown as Page;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n });\n\n it(\"returns scoped snapshot when focus selector resolves via CSS hops\", async () => {\n const session = new MockCDPSession({});\n const domMapsSpy = vi\n .spyOn(domTree, \"domMapsForSession\")\n .mockResolvedValue({\n tagNameMap: { \"1-10\": \"div\" },\n xpathMap: { \"1-10\": \"/div[1]\" },\n scrollableMap: {},\n });\n const a11ySpy = vi.spyOn(a11yTree, \"a11yForFrame\").mockResolvedValue({\n outline: \"[1-10] div\",\n urlMap: { \"1-10\": \"https://example.com\" },\n scopeApplied: true,\n } as AccessibilityTreeResult);\n vi.spyOn(focusSelectors, \"resolveCssFocusFrameAndTail\").mockResolvedValue({\n targetFrameId: \"frame-2\",\n tailSelector: \".btn-inner\",\n absPrefix: \"/html/body/iframe[1]\",\n });\n\n const result = await tryScopedSnapshot(\n makePage(session),\n { focusSelector: \".btn\" },\n context,\n true,\n new Map([[session.id, sessionIndex]]),\n new Map(),\n );\n\n expect(result).not.toBeNull();\n expect(result?.combinedXpathMap[\"1-10\"]).toBe(\n \"/html/body/iframe[1]/div[1]\",\n );\n expect(domMapsSpy).toHaveBeenCalled();\n expect(a11ySpy).toHaveBeenCalled();\n });\n\n it(\"returns null and logs fallback when scope is not applied\", async () => {\n const session = new MockCDPSession({});\n vi.spyOn(domTree, \"domMapsForSession\").mockResolvedValue({\n tagNameMap: { \"1-10\": \"div\" },\n xpathMap: { \"1-10\": \"/div[1]\" },\n scrollableMap: {},\n });\n vi.spyOn(a11yTree, \"a11yForFrame\").mockResolvedValue({\n outline: \"ignored\",\n urlMap: {},\n scopeApplied: false,\n } as AccessibilityTreeResult);\n const loggerSpy = vi.spyOn(logger, \"v3Logger\").mockImplementation(() => {});\n\n const result = await tryScopedSnapshot(\n makePage(session),\n { focusSelector: \".btn\" },\n context,\n false,\n new Map([[session.id, sessionIndex]]),\n new Map(),\n );\n\n expect(result).toBeNull();\n expect(loggerSpy).toHaveBeenCalled();\n });\n\n it(\"returns null immediately when no focus selector is provided\", async () => {\n const result = await tryScopedSnapshot(\n makePage(new MockCDPSession({})),\n {},\n context,\n true,\n new Map(),\n new Map(),\n );\n expect(result).toBeNull();\n });\n\n it(\"supports XPath focus resolution branch\", async () => {\n const session = new MockCDPSession({});\n vi.spyOn(domTree, \"domMapsForSession\").mockResolvedValue({\n tagNameMap: { \"1-10\": \"div\" },\n xpathMap: { \"1-10\": \"/div[1]\" },\n scrollableMap: {},\n });\n vi.spyOn(a11yTree, \"a11yForFrame\").mockResolvedValue({\n outline: \"[1-10] div\",\n urlMap: {},\n scopeApplied: true,\n } as AccessibilityTreeResult);\n vi.spyOn(focusSelectors, \"resolveFocusFrameAndTail\").mockResolvedValue({\n targetFrameId: \"frame-1\",\n tailXPath: \"//div[1]\",\n absPrefix: \"\",\n });\n\n const result = await tryScopedSnapshot(\n makePage(session),\n { focusSelector: \"xpath=//div\" },\n context,\n true,\n new Map([[session.id, sessionIndex]]),\n new Map(),\n );\n\n expect(result).not.toBeNull();\n expect(result?.combinedXpathMap[\"1-10\"]).toBe(\"/div[1]\");\n });\n\n it(\"logs and returns null when resolver throws\", async () => {\n const session = new MockCDPSession({});\n vi.spyOn(focusSelectors, \"resolveCssFocusFrameAndTail\").mockRejectedValue(\n new Error(\"bad selector\"),\n );\n const loggerSpy = vi.spyOn(logger, \"v3Logger\").mockImplementation(() => {});\n\n const result = await tryScopedSnapshot(\n makePage(session),\n { focusSelector: \".bad\" },\n context,\n true,\n new Map([[session.id, sessionIndex]]),\n new Map(),\n );\n\n expect(result).toBeNull();\n expect(loggerSpy).toHaveBeenCalled();\n });\n\n it(\"filters ignored xpath entries in the scoped snapshot\", async () => {\n const session = new MockCDPSession({});\n vi.spyOn(domTree, \"domMapsForSession\").mockResolvedValue({\n tagNameMap: { \"1-10\": \"div\", \"1-11\": \"div\" },\n xpathMap: { \"1-10\": \"/div[1]\", \"1-11\": \"/div[2]\" },\n scrollableMap: {},\n });\n vi.spyOn(a11yTree, \"a11yForFrame\").mockResolvedValue({\n outline: \"[1-11] div\",\n urlMap: {},\n scopeApplied: true,\n } as AccessibilityTreeResult);\n vi.spyOn(focusSelectors, \"resolveCssFocusFrameAndTail\").mockResolvedValue({\n targetFrameId: \"frame-2\",\n tailSelector: \".btn-inner\",\n absPrefix: \"/html/body/iframe[1]\",\n });\n\n const scopedIndex: SessionDomIndex = {\n ...sessionIndex,\n enterByBe: new Map([\n [10, 0],\n [11, 3],\n ]),\n exitByBe: new Map([\n [10, 2],\n [11, 4],\n ]),\n };\n\n const result = await tryScopedSnapshot(\n makePage(session),\n { focusSelector: \".btn\" },\n context,\n true,\n new Map([[session.id, scopedIndex]]),\n new Map([[\"frame-2\", [{ start: 0, end: 2 }]]]),\n );\n\n expect(result?.combinedXpathMap[\"1-10\"]).toBeUndefined();\n expect(result?.combinedXpathMap[\"1-11\"]).toBe(\n \"/html/body/iframe[1]/div[2]\",\n );\n });\n});\n"]}
@@ -61,6 +61,26 @@ describe("decorateRoles", () => {
61
61
  { encodedId: "enc-4", role: "scrollable, svg" },
62
62
  ]);
63
63
  });
64
+ it("overrides role to 'input, file' for file inputs", () => {
65
+ const opts = {
66
+ ...defaultOpts,
67
+ tagNameMap: { "enc-10": "input, file" },
68
+ scrollableMap: {},
69
+ };
70
+ const nodes = [
71
+ makeAxNode({
72
+ backendDOMNodeId: 10,
73
+ role: axString("button"),
74
+ name: axString("Choose File"),
75
+ }),
76
+ ];
77
+ const decorated = decorateRoles(nodes, opts);
78
+ expect(decorated[0]).toMatchObject({
79
+ encodedId: "enc-10",
80
+ role: "input, file",
81
+ name: "Choose File",
82
+ });
83
+ });
64
84
  it("falls back when encoding fails", () => {
65
85
  const opts = {
66
86
  ...defaultOpts,
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot-a11y-tree-utils.test.js","sourceRoot":"","sources":["../../../../tests/unit/snapshot-a11y-tree-utils.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Protocol } from \"devtools-protocol\";\nimport { describe, expect, it } from \"vitest\";\nimport type {\n A11yNode,\n A11yOptions,\n} from \"../../lib/v3/types/private/snapshot.js\";\nimport {\n buildHierarchicalTree,\n decorateRoles,\n extractUrlFromAXNode,\n isStructural,\n removeRedundantStaticTextChildren,\n} from \"../../lib/v3/understudy/a11y/snapshot/a11yTree.js\";\n\nconst axString = (value: string): Protocol.Accessibility.AXValue => ({\n type: \"string\",\n value,\n});\n\nconst defaultOpts: A11yOptions = {\n focusSelector: undefined,\n experimental: false,\n tagNameMap: {},\n scrollableMap: {},\n encode: (backendNodeId: number) => `enc-${backendNodeId}`,\n};\n\nconst makeAxNode = (\n overrides: Partial<Protocol.Accessibility.AXNode> = {},\n): Protocol.Accessibility.AXNode => ({\n nodeId: overrides.nodeId ?? String(Math.random()),\n backendDOMNodeId:\n overrides.backendDOMNodeId ?? Math.floor(Math.random() * 1e6),\n role: overrides.role ?? axString(\"generic\"),\n childIds: overrides.childIds ?? [],\n parentId: overrides.parentId,\n properties: overrides.properties ?? [],\n name: overrides.name,\n description: overrides.description,\n value: overrides.value,\n ignored: overrides.ignored ?? false,\n});\n\ndescribe(\"decorateRoles\", () => {\n it(\"marks scrollable DOM nodes with tag labels and encoded ids\", () => {\n const opts: A11yOptions = {\n ...defaultOpts,\n tagNameMap: {\n \"enc-1\": \"div\",\n \"enc-2\": \"html\",\n \"enc-3\": \"#document\",\n \"enc-4\": \"#svg\",\n },\n scrollableMap: { \"enc-1\": true, \"enc-4\": true },\n };\n const nodes = [\n makeAxNode({\n backendDOMNodeId: 1,\n role: { type: \"string\", value: \"region\" },\n }),\n makeAxNode({\n backendDOMNodeId: 2,\n role: { type: \"string\", value: \"generic\" },\n }),\n makeAxNode({\n backendDOMNodeId: 3,\n role: { type: \"string\", value: \"generic\" },\n }),\n makeAxNode({\n backendDOMNodeId: 4,\n role: { type: \"string\", value: \"generic\" },\n }),\n ];\n\n const decorated = decorateRoles(nodes, opts);\n expect(decorated).toMatchObject([\n { encodedId: \"enc-1\", role: \"scrollable, div\" },\n { encodedId: \"enc-2\", role: \"scrollable, html\" },\n { encodedId: \"enc-3\", role: \"generic\" },\n { encodedId: \"enc-4\", role: \"scrollable, svg\" },\n ]);\n });\n\n it(\"falls back when encoding fails\", () => {\n const opts: A11yOptions = {\n ...defaultOpts,\n encode: () => {\n throw new Error(\"boom\");\n },\n };\n const nodes = [makeAxNode({ backendDOMNodeId: 4 })];\n const decorated = decorateRoles(nodes, opts);\n expect(decorated[0]?.encodedId).toBeUndefined();\n });\n});\n\ndescribe(\"buildHierarchicalTree\", () => {\n const opts: A11yOptions = {\n ...defaultOpts,\n tagNameMap: { root: \"div\", child: \"span\" },\n };\n\n it(\"drops structural nodes without children or names\", async () => {\n const nodes: A11yNode[] = [\n {\n role: \"generic\",\n name: \"\",\n nodeId: \"root\",\n encodedId: \"root\",\n parentId: undefined,\n childIds: [\"child\"],\n },\n {\n role: \"generic\",\n name: \"\",\n nodeId: \"child\",\n encodedId: \"child\",\n parentId: \"root\",\n childIds: [],\n },\n ];\n\n const { tree } = await buildHierarchicalTree(nodes, opts);\n expect(tree).toEqual([]);\n });\n\n it(\"promotes select/combobox tag names for structural nodes\", async () => {\n const nodes: A11yNode[] = [\n {\n role: \"combobox\",\n name: \"Select\",\n nodeId: \"root\",\n encodedId: \"root\",\n parentId: undefined,\n childIds: [\"child\"],\n },\n {\n role: \"StaticText\",\n name: \"Option\",\n nodeId: \"child\",\n encodedId: \"child\",\n parentId: \"root\",\n childIds: [],\n },\n ];\n\n const { tree } = await buildHierarchicalTree(nodes, {\n ...opts,\n tagNameMap: { root: \"select\" },\n });\n expect(tree[0]?.role).toBe(\"select\");\n });\n\n it(\"drops structural parents with a single cleaned child while keeping it in place\", async () => {\n const nodes: A11yNode[] = [\n {\n role: \"generic\",\n name: \"\",\n nodeId: \"root\",\n encodedId: \"root\",\n parentId: undefined,\n childIds: [\"child\"],\n },\n {\n role: \"StaticText\",\n name: \"Ok\",\n nodeId: \"child\",\n encodedId: \"child\",\n parentId: \"root\",\n childIds: [],\n },\n ];\n\n const { tree } = await buildHierarchicalTree(nodes, opts);\n expect(tree[0]?.role).toBe(\"StaticText\");\n });\n\n it(\"drops structural parents entirely when all descendants are pruned\", async () => {\n const nodes: A11yNode[] = [\n {\n role: \"generic\",\n name: \"\",\n nodeId: \"root\",\n encodedId: \"root\",\n parentId: undefined,\n childIds: [\"child\"],\n },\n {\n role: \"generic\",\n name: \"\",\n nodeId: \"child\",\n encodedId: \"child\",\n parentId: \"root\",\n childIds: [],\n },\n ];\n\n const { tree } = await buildHierarchicalTree(nodes, opts);\n expect(tree).toEqual([]);\n });\n\n it(\"renames structural nodes to their tag names when not combobox\", async () => {\n const nodes: A11yNode[] = [\n {\n role: \"generic\",\n name: \"Container\",\n nodeId: \"root\",\n encodedId: \"root\",\n parentId: undefined,\n childIds: [\"child-a\", \"child-b\"],\n },\n {\n role: \"StaticText\",\n name: \"A\",\n nodeId: \"child-a\",\n encodedId: \"child-a\",\n parentId: \"root\",\n childIds: [],\n },\n {\n role: \"StaticText\",\n name: \"B\",\n nodeId: \"child-b\",\n encodedId: \"child-b\",\n parentId: \"root\",\n childIds: [],\n },\n ];\n\n const { tree } = await buildHierarchicalTree(nodes, {\n ...opts,\n tagNameMap: { root: \"section\" },\n });\n expect(tree[0]?.role).toBe(\"section\");\n });\n\n it(\"skips nodes with negative node ids early\", async () => {\n const nodes: A11yNode[] = [\n {\n role: \"button\",\n name: \"Hidden\",\n nodeId: \"-1\",\n encodedId: \"hidden\",\n parentId: undefined,\n childIds: [],\n },\n ];\n\n const { tree } = await buildHierarchicalTree(nodes, opts);\n expect(tree).toEqual([]);\n });\n});\n\ndescribe(\"isStructural\", () => {\n it(\"marks generic/none/InlineTextBox roles as structural\", () => {\n expect(isStructural(\"generic\")).toBe(true);\n expect(isStructural(\"none\")).toBe(true);\n expect(isStructural(\"InlineTextBox\")).toBe(true);\n expect(isStructural(\"button\")).toBe(false);\n });\n});\n\ndescribe(\"removeRedundantStaticTextChildren\", () => {\n it(\"removes static text children whose concatenated text equals the parent name\", () => {\n const parent: A11yNode = {\n role: \"button\",\n name: \"HelloWorld\",\n nodeId: \"root\",\n };\n const children: A11yNode[] = [\n { role: \"StaticText\", name: \"Hello\", nodeId: \"c1\" },\n { role: \"StaticText\", name: \"World\", nodeId: \"c2\" },\n { role: \"button\", name: \"Child\", nodeId: \"c3\" },\n ];\n const pruned = removeRedundantStaticTextChildren(parent, children);\n expect(pruned).toEqual([{ role: \"button\", name: \"Child\", nodeId: \"c3\" }]);\n });\n\n it(\"keeps static text when combined text differs\", () => {\n const parent: A11yNode = {\n role: \"button\",\n name: \"Hello World\",\n nodeId: \"root\",\n };\n const children: A11yNode[] = [\n { role: \"StaticText\", name: \"Hello\", nodeId: \"c1\" },\n { role: \"StaticText\", name: \"Mars\", nodeId: \"c2\" },\n ];\n expect(removeRedundantStaticTextChildren(parent, children)).toEqual(\n children,\n );\n });\n it(\"returns original children when parent name is empty\", () => {\n const parent: A11yNode = {\n role: \"button\",\n nodeId: \"root\",\n };\n const children: A11yNode[] = [\n { role: \"StaticText\", name: \"Hello\", nodeId: \"c1\" },\n { role: \"StaticText\", name: \"World\", nodeId: \"c2\" },\n ];\n expect(removeRedundantStaticTextChildren(parent, children)).toEqual(\n children,\n );\n });\n});\n\ndescribe(\"extractUrlFromAXNode\", () => {\n it(\"returns trimmed URL string from node properties\", () => {\n const node = makeAxNode({\n properties: [\n { name: \"busy\", value: axString(\"bar\") },\n { name: \"url\", value: axString(\" https://example.com \") },\n ],\n });\n expect(extractUrlFromAXNode(node)).toBe(\"https://example.com\");\n });\n\n it(\"returns undefined when url property missing or invalid\", () => {\n expect(\n extractUrlFromAXNode(makeAxNode({ properties: [] })),\n ).toBeUndefined();\n expect(\n extractUrlFromAXNode(\n makeAxNode({\n properties: [{ name: \"url\", value: { type: \"number\", value: 123 } }],\n }),\n ),\n ).toBeUndefined();\n });\n});\n"]}
1
+ {"version":3,"file":"snapshot-a11y-tree-utils.test.js","sourceRoot":"","sources":["../../../../tests/unit/snapshot-a11y-tree-utils.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Protocol } from \"devtools-protocol\";\nimport { describe, expect, it } from \"vitest\";\nimport type {\n A11yNode,\n A11yOptions,\n} from \"../../lib/v3/types/private/snapshot.js\";\nimport {\n buildHierarchicalTree,\n decorateRoles,\n extractUrlFromAXNode,\n isStructural,\n removeRedundantStaticTextChildren,\n} from \"../../lib/v3/understudy/a11y/snapshot/a11yTree.js\";\n\nconst axString = (value: string): Protocol.Accessibility.AXValue => ({\n type: \"string\",\n value,\n});\n\nconst defaultOpts: A11yOptions = {\n focusSelector: undefined,\n experimental: false,\n tagNameMap: {},\n scrollableMap: {},\n encode: (backendNodeId: number) => `enc-${backendNodeId}`,\n};\n\nconst makeAxNode = (\n overrides: Partial<Protocol.Accessibility.AXNode> = {},\n): Protocol.Accessibility.AXNode => ({\n nodeId: overrides.nodeId ?? String(Math.random()),\n backendDOMNodeId:\n overrides.backendDOMNodeId ?? Math.floor(Math.random() * 1e6),\n role: overrides.role ?? axString(\"generic\"),\n childIds: overrides.childIds ?? [],\n parentId: overrides.parentId,\n properties: overrides.properties ?? [],\n name: overrides.name,\n description: overrides.description,\n value: overrides.value,\n ignored: overrides.ignored ?? false,\n});\n\ndescribe(\"decorateRoles\", () => {\n it(\"marks scrollable DOM nodes with tag labels and encoded ids\", () => {\n const opts: A11yOptions = {\n ...defaultOpts,\n tagNameMap: {\n \"enc-1\": \"div\",\n \"enc-2\": \"html\",\n \"enc-3\": \"#document\",\n \"enc-4\": \"#svg\",\n },\n scrollableMap: { \"enc-1\": true, \"enc-4\": true },\n };\n const nodes = [\n makeAxNode({\n backendDOMNodeId: 1,\n role: { type: \"string\", value: \"region\" },\n }),\n makeAxNode({\n backendDOMNodeId: 2,\n role: { type: \"string\", value: \"generic\" },\n }),\n makeAxNode({\n backendDOMNodeId: 3,\n role: { type: \"string\", value: \"generic\" },\n }),\n makeAxNode({\n backendDOMNodeId: 4,\n role: { type: \"string\", value: \"generic\" },\n }),\n ];\n\n const decorated = decorateRoles(nodes, opts);\n expect(decorated).toMatchObject([\n { encodedId: \"enc-1\", role: \"scrollable, div\" },\n { encodedId: \"enc-2\", role: \"scrollable, html\" },\n { encodedId: \"enc-3\", role: \"generic\" },\n { encodedId: \"enc-4\", role: \"scrollable, svg\" },\n ]);\n });\n\n it(\"overrides role to 'input, file' for file inputs\", () => {\n const opts: A11yOptions = {\n ...defaultOpts,\n tagNameMap: { \"enc-10\": \"input, file\" },\n scrollableMap: {},\n };\n const nodes = [\n makeAxNode({\n backendDOMNodeId: 10,\n role: axString(\"button\"),\n name: axString(\"Choose File\"),\n }),\n ];\n\n const decorated = decorateRoles(nodes, opts);\n expect(decorated[0]).toMatchObject({\n encodedId: \"enc-10\",\n role: \"input, file\",\n name: \"Choose File\",\n });\n });\n\n it(\"falls back when encoding fails\", () => {\n const opts: A11yOptions = {\n ...defaultOpts,\n encode: () => {\n throw new Error(\"boom\");\n },\n };\n const nodes = [makeAxNode({ backendDOMNodeId: 4 })];\n const decorated = decorateRoles(nodes, opts);\n expect(decorated[0]?.encodedId).toBeUndefined();\n });\n});\n\ndescribe(\"buildHierarchicalTree\", () => {\n const opts: A11yOptions = {\n ...defaultOpts,\n tagNameMap: { root: \"div\", child: \"span\" },\n };\n\n it(\"drops structural nodes without children or names\", async () => {\n const nodes: A11yNode[] = [\n {\n role: \"generic\",\n name: \"\",\n nodeId: \"root\",\n encodedId: \"root\",\n parentId: undefined,\n childIds: [\"child\"],\n },\n {\n role: \"generic\",\n name: \"\",\n nodeId: \"child\",\n encodedId: \"child\",\n parentId: \"root\",\n childIds: [],\n },\n ];\n\n const { tree } = await buildHierarchicalTree(nodes, opts);\n expect(tree).toEqual([]);\n });\n\n it(\"promotes select/combobox tag names for structural nodes\", async () => {\n const nodes: A11yNode[] = [\n {\n role: \"combobox\",\n name: \"Select\",\n nodeId: \"root\",\n encodedId: \"root\",\n parentId: undefined,\n childIds: [\"child\"],\n },\n {\n role: \"StaticText\",\n name: \"Option\",\n nodeId: \"child\",\n encodedId: \"child\",\n parentId: \"root\",\n childIds: [],\n },\n ];\n\n const { tree } = await buildHierarchicalTree(nodes, {\n ...opts,\n tagNameMap: { root: \"select\" },\n });\n expect(tree[0]?.role).toBe(\"select\");\n });\n\n it(\"drops structural parents with a single cleaned child while keeping it in place\", async () => {\n const nodes: A11yNode[] = [\n {\n role: \"generic\",\n name: \"\",\n nodeId: \"root\",\n encodedId: \"root\",\n parentId: undefined,\n childIds: [\"child\"],\n },\n {\n role: \"StaticText\",\n name: \"Ok\",\n nodeId: \"child\",\n encodedId: \"child\",\n parentId: \"root\",\n childIds: [],\n },\n ];\n\n const { tree } = await buildHierarchicalTree(nodes, opts);\n expect(tree[0]?.role).toBe(\"StaticText\");\n });\n\n it(\"drops structural parents entirely when all descendants are pruned\", async () => {\n const nodes: A11yNode[] = [\n {\n role: \"generic\",\n name: \"\",\n nodeId: \"root\",\n encodedId: \"root\",\n parentId: undefined,\n childIds: [\"child\"],\n },\n {\n role: \"generic\",\n name: \"\",\n nodeId: \"child\",\n encodedId: \"child\",\n parentId: \"root\",\n childIds: [],\n },\n ];\n\n const { tree } = await buildHierarchicalTree(nodes, opts);\n expect(tree).toEqual([]);\n });\n\n it(\"renames structural nodes to their tag names when not combobox\", async () => {\n const nodes: A11yNode[] = [\n {\n role: \"generic\",\n name: \"Container\",\n nodeId: \"root\",\n encodedId: \"root\",\n parentId: undefined,\n childIds: [\"child-a\", \"child-b\"],\n },\n {\n role: \"StaticText\",\n name: \"A\",\n nodeId: \"child-a\",\n encodedId: \"child-a\",\n parentId: \"root\",\n childIds: [],\n },\n {\n role: \"StaticText\",\n name: \"B\",\n nodeId: \"child-b\",\n encodedId: \"child-b\",\n parentId: \"root\",\n childIds: [],\n },\n ];\n\n const { tree } = await buildHierarchicalTree(nodes, {\n ...opts,\n tagNameMap: { root: \"section\" },\n });\n expect(tree[0]?.role).toBe(\"section\");\n });\n\n it(\"skips nodes with negative node ids early\", async () => {\n const nodes: A11yNode[] = [\n {\n role: \"button\",\n name: \"Hidden\",\n nodeId: \"-1\",\n encodedId: \"hidden\",\n parentId: undefined,\n childIds: [],\n },\n ];\n\n const { tree } = await buildHierarchicalTree(nodes, opts);\n expect(tree).toEqual([]);\n });\n});\n\ndescribe(\"isStructural\", () => {\n it(\"marks generic/none/InlineTextBox roles as structural\", () => {\n expect(isStructural(\"generic\")).toBe(true);\n expect(isStructural(\"none\")).toBe(true);\n expect(isStructural(\"InlineTextBox\")).toBe(true);\n expect(isStructural(\"button\")).toBe(false);\n });\n});\n\ndescribe(\"removeRedundantStaticTextChildren\", () => {\n it(\"removes static text children whose concatenated text equals the parent name\", () => {\n const parent: A11yNode = {\n role: \"button\",\n name: \"HelloWorld\",\n nodeId: \"root\",\n };\n const children: A11yNode[] = [\n { role: \"StaticText\", name: \"Hello\", nodeId: \"c1\" },\n { role: \"StaticText\", name: \"World\", nodeId: \"c2\" },\n { role: \"button\", name: \"Child\", nodeId: \"c3\" },\n ];\n const pruned = removeRedundantStaticTextChildren(parent, children);\n expect(pruned).toEqual([{ role: \"button\", name: \"Child\", nodeId: \"c3\" }]);\n });\n\n it(\"keeps static text when combined text differs\", () => {\n const parent: A11yNode = {\n role: \"button\",\n name: \"Hello World\",\n nodeId: \"root\",\n };\n const children: A11yNode[] = [\n { role: \"StaticText\", name: \"Hello\", nodeId: \"c1\" },\n { role: \"StaticText\", name: \"Mars\", nodeId: \"c2\" },\n ];\n expect(removeRedundantStaticTextChildren(parent, children)).toEqual(\n children,\n );\n });\n it(\"returns original children when parent name is empty\", () => {\n const parent: A11yNode = {\n role: \"button\",\n nodeId: \"root\",\n };\n const children: A11yNode[] = [\n { role: \"StaticText\", name: \"Hello\", nodeId: \"c1\" },\n { role: \"StaticText\", name: \"World\", nodeId: \"c2\" },\n ];\n expect(removeRedundantStaticTextChildren(parent, children)).toEqual(\n children,\n );\n });\n});\n\ndescribe(\"extractUrlFromAXNode\", () => {\n it(\"returns trimmed URL string from node properties\", () => {\n const node = makeAxNode({\n properties: [\n { name: \"busy\", value: axString(\"bar\") },\n { name: \"url\", value: axString(\" https://example.com \") },\n ],\n });\n expect(extractUrlFromAXNode(node)).toBe(\"https://example.com\");\n });\n\n it(\"returns undefined when url property missing or invalid\", () => {\n expect(\n extractUrlFromAXNode(makeAxNode({ properties: [] })),\n ).toBeUndefined();\n expect(\n extractUrlFromAXNode(\n makeAxNode({\n properties: [{ name: \"url\", value: { type: \"number\", value: 123 } }],\n }),\n ),\n ).toBeUndefined();\n });\n});\n"]}