@browserbasehq/orca 3.1.0-patch.4 → 3.2.0-preview.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/lib/inference.js +1 -4
- package/dist/cjs/lib/inference.js.map +1 -1
- package/dist/cjs/lib/utils.d.ts +1 -0
- package/dist/cjs/lib/utils.js +4 -0
- package/dist/cjs/lib/utils.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AgentProvider.js +0 -1
- package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js +4 -6
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.js +4 -6
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +4 -6
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.d.ts +2 -0
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js +2 -2
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/act.d.ts +1 -1
- package/dist/cjs/lib/v3/agent/tools/act.js +20 -4
- package/dist/cjs/lib/v3/agent/tools/act.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/ariaTree.d.ts +8 -1
- package/dist/cjs/lib/v3/agent/tools/ariaTree.js +60 -22
- package/dist/cjs/lib/v3/agent/tools/ariaTree.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/{search.js → braveSearch.js} +1 -1
- package/dist/cjs/lib/v3/agent/tools/braveSearch.js.map +1 -0
- package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.d.ts +13 -0
- package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.js +70 -0
- package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.js.map +1 -0
- package/dist/cjs/lib/v3/agent/tools/click.js +23 -31
- package/dist/cjs/lib/v3/agent/tools/click.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js +22 -30
- package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/extract.d.ts +2 -2
- package/dist/cjs/lib/v3/agent/tools/extract.js +16 -3
- package/dist/cjs/lib/v3/agent/tools/extract.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/fillFormVision.js +30 -30
- package/dist/cjs/lib/v3/agent/tools/fillFormVision.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/fillform.d.ts +7 -1
- package/dist/cjs/lib/v3/agent/tools/fillform.js +60 -37
- package/dist/cjs/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/index.d.ts +19 -3
- package/dist/cjs/lib/v3/agent/tools/index.js +12 -8
- package/dist/cjs/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/screenshot.d.ts +8 -0
- package/dist/cjs/lib/v3/agent/tools/screenshot.js +32 -15
- package/dist/cjs/lib/v3/agent/tools/screenshot.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/scroll.js +12 -0
- package/dist/cjs/lib/v3/agent/tools/scroll.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/type.js +23 -31
- package/dist/cjs/lib/v3/agent/tools/type.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/wait.js +6 -0
- package/dist/cjs/lib/v3/agent/tools/wait.js.map +1 -1
- package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js +4 -0
- package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
- package/dist/cjs/lib/v3/api.d.ts +2 -2
- package/dist/cjs/lib/v3/api.js +1 -1
- package/dist/cjs/lib/v3/api.js.map +1 -1
- package/dist/cjs/lib/v3/cache/ActCache.d.ts +0 -1
- package/dist/cjs/lib/v3/cache/ActCache.js +2 -18
- package/dist/cjs/lib/v3/cache/ActCache.js.map +1 -1
- package/dist/cjs/lib/v3/eventStore.d.ts +41 -0
- package/dist/cjs/lib/v3/eventStore.js +375 -0
- package/dist/cjs/lib/v3/eventStore.js.map +1 -0
- package/dist/cjs/lib/v3/flowLogger.d.ts +62 -103
- package/dist/cjs/lib/v3/flowLogger.js +362 -773
- package/dist/cjs/lib/v3/flowLogger.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/actHandler.js +1 -2
- package/dist/cjs/lib/v3/handlers/actHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/extractHandler.js +2 -2
- package/dist/cjs/lib/v3/handlers/extractHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js +21 -33
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/observeHandler.js +1 -2
- package/dist/cjs/lib/v3/handlers/observeHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +0 -4
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +23 -48
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +10 -12
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/index.d.ts +2 -1
- package/dist/cjs/lib/v3/launch/browserbase.d.ts +1 -1
- package/dist/cjs/lib/v3/launch/browserbase.js +4 -9
- package/dist/cjs/lib/v3/launch/browserbase.js.map +1 -1
- package/dist/cjs/lib/v3/llm/LLMProvider.js +0 -5
- package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/cjs/lib/v3/llm/aisdk.js +10 -16
- package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/cjs/lib/v3/runtimePaths.js +2 -1
- package/dist/cjs/lib/v3/runtimePaths.js.map +1 -1
- package/dist/cjs/lib/v3/shutdown/supervisor.js +2 -2
- package/dist/cjs/lib/v3/shutdown/supervisor.js.map +1 -1
- package/dist/cjs/lib/v3/timeoutConfig.d.ts +1 -1
- package/dist/cjs/lib/v3/timeoutConfig.js +5 -0
- package/dist/cjs/lib/v3/timeoutConfig.js.map +1 -1
- package/dist/cjs/lib/v3/types/private/shutdown.d.ts +1 -1
- package/dist/cjs/lib/v3/types/private/shutdown.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/agent.d.ts +28 -3
- package/dist/cjs/lib/v3/types/public/agent.js +0 -1
- package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/api.d.ts +3 -0
- package/dist/cjs/lib/v3/types/public/api.js +1 -0
- package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/model.d.ts +4 -2
- package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/options.d.ts +6 -0
- package/dist/cjs/lib/v3/types/public/options.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/cdp.d.ts +8 -13
- package/dist/cjs/lib/v3/understudy/cdp.js +137 -17
- package/dist/cjs/lib/v3/understudy/cdp.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/context.d.ts +1 -0
- package/dist/cjs/lib/v3/understudy/context.js +142 -60
- package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/frame.js +23 -6
- package/dist/cjs/lib/v3/understudy/frame.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/page.d.ts +13 -0
- package/dist/cjs/lib/v3/understudy/page.js +88 -20
- package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/screenshotUtils.d.ts +0 -1
- package/dist/cjs/lib/v3/understudy/screenshotUtils.js +0 -18
- package/dist/cjs/lib/v3/understudy/screenshotUtils.js.map +1 -1
- package/dist/cjs/lib/v3/v3.d.ts +10 -0
- package/dist/cjs/lib/v3/v3.js +210 -172
- package/dist/cjs/lib/v3/v3.js.map +1 -1
- package/dist/cjs/tests/integration/cdp-session-detached.spec.js +1 -1
- package/dist/cjs/tests/integration/cdp-session-detached.spec.js.map +1 -1
- package/dist/cjs/tests/integration/context-addInitScript.spec.js +104 -11
- package/dist/cjs/tests/integration/context-addInitScript.spec.js.map +1 -1
- package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.js +219 -0
- package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.js.map +1 -0
- package/dist/cjs/tests/integration/page-extra-http-headers.spec.js +85 -0
- package/dist/cjs/tests/integration/page-extra-http-headers.spec.js.map +1 -0
- package/dist/cjs/tests/integration/page-screenshot.spec.js +1 -1
- package/dist/cjs/tests/integration/page-screenshot.spec.js.map +1 -1
- package/dist/cjs/tests/integration/timeouts.spec.js +168 -0
- package/dist/cjs/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/cjs/tests/unit/model-deprecation.test.js +5 -8
- package/dist/cjs/tests/unit/model-deprecation.test.js.map +1 -1
- package/dist/cjs/tests/unit/page-extra-http-headers.test.d.ts +1 -0
- package/dist/cjs/tests/unit/page-extra-http-headers.test.js +92 -0
- package/dist/cjs/tests/unit/page-extra-http-headers.test.js.map +1 -0
- package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js +13 -1
- package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
- package/dist/cjs/tests/unit/public-api/public-types.test.js.map +1 -1
- package/dist/esm/lib/inference.js +1 -4
- package/dist/esm/lib/inference.js.map +1 -1
- package/dist/esm/lib/utils.d.ts +1 -0
- package/dist/esm/lib/utils.js +3 -0
- package/dist/esm/lib/utils.js.map +1 -1
- package/dist/esm/lib/v3/agent/AgentProvider.js +0 -1
- package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +5 -7
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js +5 -7
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js +5 -7
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.d.ts +2 -0
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js +2 -2
- package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/act.d.ts +1 -1
- package/dist/esm/lib/v3/agent/tools/act.js +20 -4
- package/dist/esm/lib/v3/agent/tools/act.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/ariaTree.d.ts +8 -1
- package/dist/esm/lib/v3/agent/tools/ariaTree.js +60 -22
- package/dist/esm/lib/v3/agent/tools/ariaTree.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/{search.js → braveSearch.js} +1 -1
- package/dist/esm/lib/v3/agent/tools/braveSearch.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/browserbaseSearch.d.ts +13 -0
- package/dist/esm/lib/v3/agent/tools/browserbaseSearch.js +66 -0
- package/dist/esm/lib/v3/agent/tools/browserbaseSearch.js.map +1 -0
- package/dist/esm/lib/v3/agent/tools/click.js +23 -31
- package/dist/esm/lib/v3/agent/tools/click.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/dragAndDrop.js +22 -30
- package/dist/esm/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/extract.d.ts +2 -2
- package/dist/esm/lib/v3/agent/tools/extract.js +16 -3
- package/dist/esm/lib/v3/agent/tools/extract.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillFormVision.js +30 -30
- package/dist/esm/lib/v3/agent/tools/fillFormVision.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillform.d.ts +7 -1
- package/dist/esm/lib/v3/agent/tools/fillform.js +60 -37
- package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/index.d.ts +19 -3
- package/dist/esm/lib/v3/agent/tools/index.js +12 -8
- package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/screenshot.d.ts +8 -0
- package/dist/esm/lib/v3/agent/tools/screenshot.js +32 -15
- package/dist/esm/lib/v3/agent/tools/screenshot.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/scroll.js +12 -0
- package/dist/esm/lib/v3/agent/tools/scroll.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/type.js +23 -31
- package/dist/esm/lib/v3/agent/tools/type.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/wait.js +6 -0
- package/dist/esm/lib/v3/agent/tools/wait.js.map +1 -1
- package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js +4 -0
- package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
- package/dist/esm/lib/v3/api.d.ts +2 -2
- package/dist/esm/lib/v3/api.js +1 -1
- package/dist/esm/lib/v3/api.js.map +1 -1
- package/dist/esm/lib/v3/cache/ActCache.d.ts +0 -1
- package/dist/esm/lib/v3/cache/ActCache.js +2 -18
- package/dist/esm/lib/v3/cache/ActCache.js.map +1 -1
- package/dist/esm/lib/v3/eventStore.d.ts +41 -0
- package/dist/esm/lib/v3/eventStore.js +363 -0
- package/dist/esm/lib/v3/eventStore.js.map +1 -0
- package/dist/esm/lib/v3/flowLogger.d.ts +62 -103
- package/dist/esm/lib/v3/flowLogger.js +356 -762
- package/dist/esm/lib/v3/flowLogger.js.map +1 -1
- package/dist/esm/lib/v3/handlers/actHandler.js +1 -2
- package/dist/esm/lib/v3/handlers/actHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/extractHandler.js +2 -2
- package/dist/esm/lib/v3/handlers/extractHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js +22 -34
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/esm/lib/v3/handlers/observeHandler.js +1 -2
- package/dist/esm/lib/v3/handlers/observeHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +0 -4
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js +25 -50
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +11 -13
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/index.d.ts +2 -1
- package/dist/esm/lib/v3/launch/browserbase.d.ts +1 -1
- package/dist/esm/lib/v3/launch/browserbase.js +4 -9
- package/dist/esm/lib/v3/launch/browserbase.js.map +1 -1
- package/dist/esm/lib/v3/llm/LLMProvider.js +0 -5
- package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/esm/lib/v3/llm/aisdk.js +11 -17
- package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/esm/lib/v3/runtimePaths.js +2 -1
- package/dist/esm/lib/v3/runtimePaths.js.map +1 -1
- package/dist/esm/lib/v3/shutdown/supervisor.js +2 -2
- package/dist/esm/lib/v3/shutdown/supervisor.js.map +1 -1
- package/dist/esm/lib/v3/timeoutConfig.d.ts +1 -1
- package/dist/esm/lib/v3/timeoutConfig.js +5 -0
- package/dist/esm/lib/v3/timeoutConfig.js.map +1 -1
- package/dist/esm/lib/v3/types/private/shutdown.d.ts +1 -1
- package/dist/esm/lib/v3/types/private/shutdown.js.map +1 -1
- package/dist/esm/lib/v3/types/public/agent.d.ts +28 -3
- package/dist/esm/lib/v3/types/public/agent.js +0 -1
- package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
- package/dist/esm/lib/v3/types/public/api.d.ts +3 -0
- package/dist/esm/lib/v3/types/public/api.js +1 -0
- package/dist/esm/lib/v3/types/public/api.js.map +1 -1
- package/dist/esm/lib/v3/types/public/model.d.ts +4 -2
- package/dist/esm/lib/v3/types/public/model.js.map +1 -1
- package/dist/esm/lib/v3/types/public/options.d.ts +6 -0
- package/dist/esm/lib/v3/types/public/options.js.map +1 -1
- package/dist/esm/lib/v3/understudy/cdp.d.ts +8 -13
- package/dist/esm/lib/v3/understudy/cdp.js +138 -18
- package/dist/esm/lib/v3/understudy/cdp.js.map +1 -1
- package/dist/esm/lib/v3/understudy/context.d.ts +1 -0
- package/dist/esm/lib/v3/understudy/context.js +142 -60
- package/dist/esm/lib/v3/understudy/context.js.map +1 -1
- package/dist/esm/lib/v3/understudy/frame.js +23 -6
- package/dist/esm/lib/v3/understudy/frame.js.map +1 -1
- package/dist/esm/lib/v3/understudy/page.d.ts +13 -0
- package/dist/esm/lib/v3/understudy/page.js +91 -23
- package/dist/esm/lib/v3/understudy/page.js.map +1 -1
- package/dist/esm/lib/v3/understudy/screenshotUtils.d.ts +0 -1
- package/dist/esm/lib/v3/understudy/screenshotUtils.js +0 -17
- package/dist/esm/lib/v3/understudy/screenshotUtils.js.map +1 -1
- package/dist/esm/lib/v3/v3.d.ts +10 -0
- package/dist/esm/lib/v3/v3.js +211 -173
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/tests/integration/cdp-session-detached.spec.js +1 -1
- package/dist/esm/tests/integration/cdp-session-detached.spec.js.map +1 -1
- package/dist/esm/tests/integration/context-addInitScript.spec.js +104 -11
- package/dist/esm/tests/integration/context-addInitScript.spec.js.map +1 -1
- package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.d.ts +1 -0
- package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.js +217 -0
- package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.js.map +1 -0
- package/dist/esm/tests/integration/page-extra-http-headers.spec.d.ts +1 -0
- package/dist/esm/tests/integration/page-extra-http-headers.spec.js +83 -0
- package/dist/esm/tests/integration/page-extra-http-headers.spec.js.map +1 -0
- package/dist/esm/tests/integration/page-screenshot.spec.js +1 -1
- package/dist/esm/tests/integration/page-screenshot.spec.js.map +1 -1
- package/dist/esm/tests/integration/timeouts.spec.js +168 -0
- package/dist/esm/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/esm/tests/unit/model-deprecation.test.js +5 -8
- package/dist/esm/tests/unit/model-deprecation.test.js.map +1 -1
- package/dist/esm/tests/unit/page-extra-http-headers.test.d.ts +1 -0
- package/dist/esm/tests/unit/page-extra-http-headers.test.js +90 -0
- package/dist/esm/tests/unit/page-extra-http-headers.test.js.map +1 -0
- package/dist/esm/tests/unit/public-api/llm-and-agents.test.js +13 -1
- package/dist/esm/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
- package/dist/esm/tests/unit/public-api/public-types.test.js.map +1 -1
- package/package.json +2 -2
- package/dist/cjs/lib/v3/agent/tools/search.js.map +0 -1
- package/dist/cjs/tests/unit/rerender-missing-shadows.test.js +0 -209
- package/dist/cjs/tests/unit/rerender-missing-shadows.test.js.map +0 -1
- package/dist/esm/lib/v3/agent/tools/search.js.map +0 -1
- package/dist/esm/tests/unit/rerender-missing-shadows.test.js +0 -207
- package/dist/esm/tests/unit/rerender-missing-shadows.test.js.map +0 -1
- /package/dist/cjs/lib/v3/agent/tools/{search.d.ts → braveSearch.d.ts} +0 -0
- /package/dist/cjs/tests/{unit/rerender-missing-shadows.test.d.ts → integration/iframe-ctx-addInitScript-race.spec.d.ts} +0 -0
- /package/dist/{esm/tests/unit/rerender-missing-shadows.test.d.ts → cjs/tests/integration/page-extra-http-headers.spec.d.ts} +0 -0
- /package/dist/esm/lib/v3/agent/tools/{search.d.ts → braveSearch.d.ts} +0 -0
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import { JSDOM } from "jsdom";
|
|
2
|
-
import { afterAll, beforeAll, beforeEach, describe, expect, it } from "vitest";
|
|
3
|
-
import { rerenderMissingShadowHosts } from "../../lib/v3/dom/rerenderMissingShadows.runtime.js";
|
|
4
|
-
const globalRef = globalThis;
|
|
5
|
-
const originalGlobals = {
|
|
6
|
-
window: globalRef.window,
|
|
7
|
-
document: globalRef.document,
|
|
8
|
-
Node: globalRef.Node,
|
|
9
|
-
NodeFilter: globalRef.NodeFilter,
|
|
10
|
-
Element: globalRef.Element,
|
|
11
|
-
HTMLElement: globalRef.HTMLElement,
|
|
12
|
-
Document: globalRef.Document,
|
|
13
|
-
DocumentFragment: globalRef.DocumentFragment,
|
|
14
|
-
ShadowRoot: globalRef.ShadowRoot,
|
|
15
|
-
customElements: globalRef.customElements,
|
|
16
|
-
};
|
|
17
|
-
let dom;
|
|
18
|
-
const installDomGlobals = () => {
|
|
19
|
-
const win = dom.window;
|
|
20
|
-
globalRef.window = win;
|
|
21
|
-
globalRef.document = win.document;
|
|
22
|
-
globalRef.Node = win.Node;
|
|
23
|
-
globalRef.NodeFilter = win.NodeFilter;
|
|
24
|
-
globalRef.Element = win.Element;
|
|
25
|
-
globalRef.HTMLElement = win.HTMLElement;
|
|
26
|
-
globalRef.Document = win.Document;
|
|
27
|
-
globalRef.DocumentFragment =
|
|
28
|
-
win.DocumentFragment;
|
|
29
|
-
globalRef.ShadowRoot = win.ShadowRoot;
|
|
30
|
-
globalRef.customElements =
|
|
31
|
-
win.customElements;
|
|
32
|
-
};
|
|
33
|
-
const restoreDomGlobals = () => {
|
|
34
|
-
for (const [key, value] of Object.entries(originalGlobals)) {
|
|
35
|
-
if (value === undefined) {
|
|
36
|
-
delete globalRef[key];
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
globalRef[key] = value;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
/**
|
|
44
|
-
* Helper: set up a fake piercer on `window.__stagehandV3__` backed by a WeakMap.
|
|
45
|
-
* Returns the WeakMap so tests can inspect tracked roots.
|
|
46
|
-
*/
|
|
47
|
-
function installFakePiercer() {
|
|
48
|
-
const closedRoots = new WeakMap();
|
|
49
|
-
const win = globalRef.window;
|
|
50
|
-
win.__stagehandV3__ = {
|
|
51
|
-
getClosedRoot: (el) => closedRoots.get(el) ?? null,
|
|
52
|
-
stats: false,
|
|
53
|
-
};
|
|
54
|
-
return closedRoots;
|
|
55
|
-
}
|
|
56
|
-
describe("rerenderMissingShadowHosts", () => {
|
|
57
|
-
beforeAll(() => {
|
|
58
|
-
dom = new JSDOM("<!doctype html><html><body></body></html>");
|
|
59
|
-
installDomGlobals();
|
|
60
|
-
});
|
|
61
|
-
afterAll(() => {
|
|
62
|
-
dom.window.close();
|
|
63
|
-
restoreDomGlobals();
|
|
64
|
-
});
|
|
65
|
-
beforeEach(() => {
|
|
66
|
-
document.body.innerHTML = "";
|
|
67
|
-
// Clean up any stale custom element registrations by recreating the DOM
|
|
68
|
-
// (JSDOM doesn't support undefining custom elements, but we can use unique tag names per test)
|
|
69
|
-
});
|
|
70
|
-
it("re-renders a custom element with closed shadow so piercer can track it", () => {
|
|
71
|
-
const closedRoots = installFakePiercer();
|
|
72
|
-
const tag = "test-closed-a";
|
|
73
|
-
let constructorCalled = 0;
|
|
74
|
-
customElements.define(tag, class extends HTMLElement {
|
|
75
|
-
constructor() {
|
|
76
|
-
super();
|
|
77
|
-
constructorCalled++;
|
|
78
|
-
const root = this.attachShadow({ mode: "closed" });
|
|
79
|
-
root.innerHTML = "<span>shadow</span>";
|
|
80
|
-
// Simulate piercer intercepting attachShadow
|
|
81
|
-
closedRoots.set(this, root);
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
// Manually insert via innerHTML so the constructor fires once for the original
|
|
85
|
-
document.body.innerHTML = `<${tag}></${tag}>`;
|
|
86
|
-
const original = document.querySelector(tag);
|
|
87
|
-
// The original was created by innerHTML which does call the constructor in JSDOM
|
|
88
|
-
const callsBefore = constructorCalled;
|
|
89
|
-
// Remove the tracked root to simulate "created before piercer was installed"
|
|
90
|
-
closedRoots.delete(original);
|
|
91
|
-
rerenderMissingShadowHosts();
|
|
92
|
-
const fresh = document.querySelector(tag);
|
|
93
|
-
// Constructor was called again for the fresh element
|
|
94
|
-
expect(constructorCalled).toBe(callsBefore + 1);
|
|
95
|
-
// Piercer now tracks the new element's closed root
|
|
96
|
-
expect(closedRoots.has(fresh)).toBe(true);
|
|
97
|
-
});
|
|
98
|
-
it("skips elements that already have an open shadow root", () => {
|
|
99
|
-
installFakePiercer();
|
|
100
|
-
const tag = "test-open-b";
|
|
101
|
-
customElements.define(tag, class extends HTMLElement {
|
|
102
|
-
constructor() {
|
|
103
|
-
super();
|
|
104
|
-
this.attachShadow({ mode: "open" });
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
document.body.innerHTML = `<${tag}></${tag}>`;
|
|
108
|
-
const original = document.querySelector(tag);
|
|
109
|
-
rerenderMissingShadowHosts();
|
|
110
|
-
// Element should NOT have been replaced
|
|
111
|
-
expect(document.querySelector(tag)).toBe(original);
|
|
112
|
-
});
|
|
113
|
-
it("skips elements whose closed root is already tracked by piercer", () => {
|
|
114
|
-
const closedRoots = installFakePiercer();
|
|
115
|
-
const tag = "test-tracked-c";
|
|
116
|
-
customElements.define(tag, class extends HTMLElement {
|
|
117
|
-
constructor() {
|
|
118
|
-
super();
|
|
119
|
-
const root = this.attachShadow({ mode: "closed" });
|
|
120
|
-
closedRoots.set(this, root);
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
document.body.innerHTML = `<${tag}></${tag}>`;
|
|
124
|
-
const original = document.querySelector(tag);
|
|
125
|
-
rerenderMissingShadowHosts();
|
|
126
|
-
// Element should NOT have been replaced since piercer already knows about it
|
|
127
|
-
expect(document.querySelector(tag)).toBe(original);
|
|
128
|
-
});
|
|
129
|
-
it("transfers attributes to the fresh element", () => {
|
|
130
|
-
const closedRoots = installFakePiercer();
|
|
131
|
-
const tag = "test-attrs-d";
|
|
132
|
-
customElements.define(tag, class extends HTMLElement {
|
|
133
|
-
constructor() {
|
|
134
|
-
super();
|
|
135
|
-
const root = this.attachShadow({ mode: "closed" });
|
|
136
|
-
closedRoots.set(this, root);
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
document.body.innerHTML = `<${tag} id="myid" class="foo bar" data-x="123"></${tag}>`;
|
|
140
|
-
const original = document.querySelector(tag);
|
|
141
|
-
// Remove tracking to force re-render
|
|
142
|
-
closedRoots.delete(original);
|
|
143
|
-
rerenderMissingShadowHosts();
|
|
144
|
-
const fresh = document.querySelector(tag);
|
|
145
|
-
expect(fresh).not.toBe(original);
|
|
146
|
-
expect(fresh.getAttribute("id")).toBe("myid");
|
|
147
|
-
expect(fresh.getAttribute("class")).toBe("foo bar");
|
|
148
|
-
expect(fresh.getAttribute("data-x")).toBe("123");
|
|
149
|
-
});
|
|
150
|
-
it("moves light DOM children to the fresh element", () => {
|
|
151
|
-
const closedRoots = installFakePiercer();
|
|
152
|
-
const tag = "test-children-e";
|
|
153
|
-
customElements.define(tag, class extends HTMLElement {
|
|
154
|
-
constructor() {
|
|
155
|
-
super();
|
|
156
|
-
const root = this.attachShadow({ mode: "closed" });
|
|
157
|
-
root.innerHTML = "<slot></slot>";
|
|
158
|
-
closedRoots.set(this, root);
|
|
159
|
-
}
|
|
160
|
-
});
|
|
161
|
-
document.body.innerHTML = `<${tag}><span class="child1">A</span><span class="child2">B</span></${tag}>`;
|
|
162
|
-
const original = document.querySelector(tag);
|
|
163
|
-
const child1 = original.querySelector(".child1");
|
|
164
|
-
const child2 = original.querySelector(".child2");
|
|
165
|
-
// Remove tracking to force re-render
|
|
166
|
-
closedRoots.delete(original);
|
|
167
|
-
rerenderMissingShadowHosts();
|
|
168
|
-
const fresh = document.querySelector(tag);
|
|
169
|
-
expect(fresh).not.toBe(original);
|
|
170
|
-
// Children should have been moved (same DOM nodes, not cloned)
|
|
171
|
-
expect(fresh.querySelector(".child1")).toBe(child1);
|
|
172
|
-
expect(fresh.querySelector(".child2")).toBe(child2);
|
|
173
|
-
expect(fresh.children.length).toBe(2);
|
|
174
|
-
});
|
|
175
|
-
it("skips elements whose constructor throws without breaking the rest", () => {
|
|
176
|
-
const closedRoots = installFakePiercer();
|
|
177
|
-
const tagBad = "test-throws-f";
|
|
178
|
-
const tagGood = "test-good-f";
|
|
179
|
-
let badCreated = false;
|
|
180
|
-
customElements.define(tagBad, class extends HTMLElement {
|
|
181
|
-
constructor() {
|
|
182
|
-
super();
|
|
183
|
-
if (badCreated) {
|
|
184
|
-
throw new Error("constructor boom");
|
|
185
|
-
}
|
|
186
|
-
badCreated = true;
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
customElements.define(tagGood, class extends HTMLElement {
|
|
190
|
-
constructor() {
|
|
191
|
-
super();
|
|
192
|
-
const root = this.attachShadow({ mode: "closed" });
|
|
193
|
-
closedRoots.set(this, root);
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
document.body.innerHTML = `<${tagBad}></${tagBad}><${tagGood}></${tagGood}>`;
|
|
197
|
-
// Remove tracking from the good element so it needs re-render
|
|
198
|
-
const goodOriginal = document.querySelector(tagGood);
|
|
199
|
-
closedRoots.delete(goodOriginal);
|
|
200
|
-
// Should not throw even though tagBad's constructor will throw on re-create
|
|
201
|
-
expect(() => rerenderMissingShadowHosts()).not.toThrow();
|
|
202
|
-
// The good element should have been re-rendered successfully
|
|
203
|
-
const freshGood = document.querySelector(tagGood);
|
|
204
|
-
expect(closedRoots.has(freshGood)).toBe(true);
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
|
-
//# sourceMappingURL=rerender-missing-shadows.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rerender-missing-shadows.test.js","sourceRoot":"","sources":["../../../../tests/unit/rerender-missing-shadows.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { JSDOM } from \"jsdom\";\nimport { afterAll, beforeAll, beforeEach, describe, expect, it } from \"vitest\";\nimport { rerenderMissingShadowHosts } from \"../../lib/v3/dom/rerenderMissingShadows.runtime.js\";\n\ntype DomGlobals = {\n window: Window & typeof globalThis;\n document: Document;\n Node: typeof Node;\n NodeFilter: typeof NodeFilter;\n Element: typeof Element;\n HTMLElement: typeof HTMLElement;\n Document: typeof Document;\n DocumentFragment: typeof DocumentFragment;\n ShadowRoot: typeof ShadowRoot;\n customElements: CustomElementRegistry;\n};\n\nconst globalRef = globalThis as typeof globalThis & Partial<DomGlobals>;\nconst originalGlobals: Partial<DomGlobals> = {\n window: globalRef.window,\n document: globalRef.document,\n Node: globalRef.Node,\n NodeFilter: globalRef.NodeFilter,\n Element: globalRef.Element,\n HTMLElement: globalRef.HTMLElement,\n Document: globalRef.Document,\n DocumentFragment: globalRef.DocumentFragment,\n ShadowRoot: globalRef.ShadowRoot,\n customElements: globalRef.customElements,\n};\n\nlet dom: JSDOM;\n\nconst installDomGlobals = () => {\n const win = dom.window;\n globalRef.window = win as unknown as Window & typeof globalThis;\n globalRef.document = win.document;\n globalRef.Node = win.Node as unknown as typeof Node;\n globalRef.NodeFilter = win.NodeFilter as unknown as typeof NodeFilter;\n globalRef.Element = win.Element as unknown as typeof Element;\n globalRef.HTMLElement = win.HTMLElement as unknown as typeof HTMLElement;\n globalRef.Document = win.Document as unknown as typeof Document;\n globalRef.DocumentFragment =\n win.DocumentFragment as unknown as typeof DocumentFragment;\n globalRef.ShadowRoot = win.ShadowRoot as unknown as typeof ShadowRoot;\n globalRef.customElements =\n win.customElements as unknown as CustomElementRegistry;\n};\n\nconst restoreDomGlobals = () => {\n for (const [key, value] of Object.entries(originalGlobals)) {\n if (value === undefined) {\n delete (globalRef as Record<string, unknown>)[key];\n } else {\n (globalRef as Record<string, unknown>)[key] = value;\n }\n }\n};\n\n/**\n * Helper: set up a fake piercer on `window.__stagehandV3__` backed by a WeakMap.\n * Returns the WeakMap so tests can inspect tracked roots.\n */\nfunction installFakePiercer(): WeakMap<Element, ShadowRoot> {\n const closedRoots = new WeakMap<Element, ShadowRoot>();\n const win = globalRef.window as unknown as Record<string, unknown>;\n win.__stagehandV3__ = {\n getClosedRoot: (el: Element) => closedRoots.get(el) ?? null,\n stats: false,\n };\n return closedRoots;\n}\n\ndescribe(\"rerenderMissingShadowHosts\", () => {\n beforeAll(() => {\n dom = new JSDOM(\"<!doctype html><html><body></body></html>\");\n installDomGlobals();\n });\n\n afterAll(() => {\n dom.window.close();\n restoreDomGlobals();\n });\n\n beforeEach(() => {\n document.body.innerHTML = \"\";\n // Clean up any stale custom element registrations by recreating the DOM\n // (JSDOM doesn't support undefining custom elements, but we can use unique tag names per test)\n });\n\n it(\"re-renders a custom element with closed shadow so piercer can track it\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-closed-a\";\n let constructorCalled = 0;\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n constructorCalled++;\n const root = this.attachShadow({ mode: \"closed\" });\n root.innerHTML = \"<span>shadow</span>\";\n // Simulate piercer intercepting attachShadow\n closedRoots.set(this, root);\n }\n },\n );\n\n // Manually insert via innerHTML so the constructor fires once for the original\n document.body.innerHTML = `<${tag}></${tag}>`;\n const original = document.querySelector(tag)!;\n // The original was created by innerHTML which does call the constructor in JSDOM\n const callsBefore = constructorCalled;\n\n // Remove the tracked root to simulate \"created before piercer was installed\"\n closedRoots.delete(original);\n\n rerenderMissingShadowHosts();\n\n const fresh = document.querySelector(tag)!;\n // Constructor was called again for the fresh element\n expect(constructorCalled).toBe(callsBefore + 1);\n // Piercer now tracks the new element's closed root\n expect(closedRoots.has(fresh)).toBe(true);\n });\n\n it(\"skips elements that already have an open shadow root\", () => {\n installFakePiercer();\n const tag = \"test-open-b\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n }\n },\n );\n\n document.body.innerHTML = `<${tag}></${tag}>`;\n const original = document.querySelector(tag)!;\n\n rerenderMissingShadowHosts();\n\n // Element should NOT have been replaced\n expect(document.querySelector(tag)).toBe(original);\n });\n\n it(\"skips elements whose closed root is already tracked by piercer\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-tracked-c\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tag}></${tag}>`;\n const original = document.querySelector(tag)!;\n\n rerenderMissingShadowHosts();\n\n // Element should NOT have been replaced since piercer already knows about it\n expect(document.querySelector(tag)).toBe(original);\n });\n\n it(\"transfers attributes to the fresh element\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-attrs-d\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tag} id=\"myid\" class=\"foo bar\" data-x=\"123\"></${tag}>`;\n const original = document.querySelector(tag)!;\n // Remove tracking to force re-render\n closedRoots.delete(original);\n\n rerenderMissingShadowHosts();\n\n const fresh = document.querySelector(tag)!;\n expect(fresh).not.toBe(original);\n expect(fresh.getAttribute(\"id\")).toBe(\"myid\");\n expect(fresh.getAttribute(\"class\")).toBe(\"foo bar\");\n expect(fresh.getAttribute(\"data-x\")).toBe(\"123\");\n });\n\n it(\"moves light DOM children to the fresh element\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-children-e\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n root.innerHTML = \"<slot></slot>\";\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tag}><span class=\"child1\">A</span><span class=\"child2\">B</span></${tag}>`;\n const original = document.querySelector(tag)!;\n const child1 = original.querySelector(\".child1\")!;\n const child2 = original.querySelector(\".child2\")!;\n // Remove tracking to force re-render\n closedRoots.delete(original);\n\n rerenderMissingShadowHosts();\n\n const fresh = document.querySelector(tag)!;\n expect(fresh).not.toBe(original);\n // Children should have been moved (same DOM nodes, not cloned)\n expect(fresh.querySelector(\".child1\")).toBe(child1);\n expect(fresh.querySelector(\".child2\")).toBe(child2);\n expect(fresh.children.length).toBe(2);\n });\n\n it(\"skips elements whose constructor throws without breaking the rest\", () => {\n const closedRoots = installFakePiercer();\n const tagBad = \"test-throws-f\";\n const tagGood = \"test-good-f\";\n let badCreated = false;\n\n customElements.define(\n tagBad,\n class extends HTMLElement {\n constructor() {\n super();\n if (badCreated) {\n throw new Error(\"constructor boom\");\n }\n badCreated = true;\n }\n },\n );\n\n customElements.define(\n tagGood,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tagBad}></${tagBad}><${tagGood}></${tagGood}>`;\n // Remove tracking from the good element so it needs re-render\n const goodOriginal = document.querySelector(tagGood)!;\n closedRoots.delete(goodOriginal);\n\n // Should not throw even though tagBad's constructor will throw on re-create\n expect(() => rerenderMissingShadowHosts()).not.toThrow();\n\n // The good element should have been re-rendered successfully\n const freshGood = document.querySelector(tagGood)!;\n expect(closedRoots.has(freshGood)).toBe(true);\n });\n});\n"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|