@playwright-repl/browser-extension 0.24.0 → 0.24.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.
- package/dist/background.js +0 -1
- package/dist/content/recorder.js +0 -1
- package/dist/content/trace-loader.js +0 -1
- package/dist/devtools/console.js +0 -1
- package/dist/devtools/devtools.js +0 -1
- package/dist/index.js +0 -1
- package/dist/index2.js +0 -1
- package/dist/manifest.json +1 -1
- package/dist/modulepreload-polyfill.js +0 -1
- package/dist/offscreen/offscreen.js +0 -1
- package/dist/panel/panel.js +0 -1
- package/dist/preferences/preferences.js +0 -1
- package/dist/settings.js +0 -1
- package/dist/sw-debugger-core.js +0 -1
- package/package.json +2 -2
- package/dist/background.js.map +0 -1
- package/dist/devtools/console.js.map +0 -1
- package/dist/devtools/devtools.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index2.js.map +0 -1
- package/dist/modulepreload-polyfill.js.map +0 -1
- package/dist/offscreen/offscreen.js.map +0 -1
- package/dist/panel/panel.js.map +0 -1
- package/dist/preferences/preferences.js.map +0 -1
- package/dist/settings.js.map +0 -1
- package/dist/sw-debugger-core.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"modulepreload-polyfill.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"offscreen.js","sources":["../../src/offscreen/offscreen.ts"],"sourcesContent":["// ─── CLI Bridge (offscreen document) ──────────────────────────────────────────\r\n// Maintains WebSocket connection to the bridge server + handles video capture.\r\n// This runs independently of the side panel — MCP works without the panel open.\r\n\r\n// ─── Video Capture (tabCapture + MediaRecorder) ─────────────────────────────\r\n\r\nlet recorder: MediaRecorder | undefined;\r\nlet recordedChunks: Blob[] = [];\r\nlet lastBlobUrl: string | null = null;\r\n\r\nfunction revokeLastBlob() {\r\n if (lastBlobUrl) {\r\n URL.revokeObjectURL(lastBlobUrl);\r\n lastBlobUrl = null;\r\n }\r\n}\r\n\r\nasync function startVideoCapture(streamId: string) {\r\n if (recorder?.state === 'recording') {\r\n throw new Error('Already recording');\r\n }\r\n revokeLastBlob();\r\n\r\n const media = await navigator.mediaDevices.getUserMedia({\r\n audio: {\r\n mandatory: {\r\n chromeMediaSource: 'tab',\r\n chromeMediaSourceId: streamId,\r\n },\r\n } as any,\r\n video: {\r\n mandatory: {\r\n chromeMediaSource: 'tab',\r\n chromeMediaSourceId: streamId,\r\n },\r\n } as any,\r\n });\r\n\r\n // Continue playing captured audio to the user\r\n const output = new AudioContext();\r\n const source = output.createMediaStreamSource(media);\r\n source.connect(output.destination);\r\n\r\n recorder = new MediaRecorder(media, { mimeType: 'video/webm' });\r\n recorder.ondataavailable = (event) => recordedChunks.push(event.data);\r\n recorder.start();\r\n\r\n // Track recording state in URL hash (survives SW restarts)\r\n window.location.hash = 'recording';\r\n}\r\n\r\nasync function stopVideoCapture(): Promise<{ blobUrl: string; size: number }> {\r\n if (!recorder || recorder.state !== 'recording') {\r\n throw new Error('Not recording');\r\n }\r\n\r\n return new Promise<{ blobUrl: string; size: number }>((resolve) => {\r\n recorder!.onstop = () => {\r\n const blob = new Blob(recordedChunks, { type: 'video/webm' });\r\n const blobUrl = URL.createObjectURL(blob);\r\n lastBlobUrl = blobUrl;\r\n const size = blob.size;\r\n\r\n // Clean up\r\n recorder = undefined;\r\n recordedChunks = [];\r\n window.location.hash = '';\r\n\r\n resolve({ blobUrl, size });\r\n };\r\n\r\n // Stop recording and release tab capture\r\n recorder!.stop();\r\n recorder!.stream.getTracks().forEach((t) => t.stop());\r\n });\r\n}\r\n\r\n// ─── Bridge WebSocket (command relay) ────────────────────────────────────────\r\n\r\nlet ws: WebSocket | null = null;\r\nlet reconnectTimer: ReturnType<typeof setTimeout> | null = null;\r\nlet reconnecting = false;\r\n\r\nasync function reconnect() {\r\n if (reconnecting) return;\r\n if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) return;\r\n reconnecting = true;\r\n try {\r\n const port: number = await chrome.runtime.sendMessage({ type: 'get-bridge-port' });\r\n connect(port || 9876);\r\n } catch {\r\n scheduleReconnect();\r\n } finally {\r\n reconnecting = false;\r\n }\r\n}\r\n\r\nfunction scheduleReconnect() {\r\n if (reconnectTimer) clearTimeout(reconnectTimer);\r\n reconnectTimer = setTimeout(() => reconnect(), 3000);\r\n}\r\n\r\n// Periodic health check — reconnect if WebSocket is dead.\r\n// Catches cases where setTimeout gets throttled or the offscreen doc restarts.\r\nsetInterval(() => {\r\n if (!ws || ws.readyState === WebSocket.CLOSED) {\r\n reconnect();\r\n }\r\n}, 10000);\r\n\r\nfunction connect(port: number) {\r\n try {\r\n ws = new WebSocket(`ws://127.0.0.1:${port}`);\r\n\r\n ws.onopen = () => {\r\n // Trigger auto-attach so the CLI knows which tab is connected\r\n chrome.runtime.sendMessage({ type: 'bridge-attach' }).then((result: any) => {\r\n if (ws?.readyState === WebSocket.OPEN && result?.url)\r\n ws.send(JSON.stringify({ _event: true, type: 'tab-attached', url: result.url }));\r\n }).catch(() => {});\r\n };\r\n\r\n ws.onmessage = async (e) => {\r\n const msg = JSON.parse(e.data as string) as {\r\n id: string;\r\n command: string;\r\n type?: 'command' | 'script';\r\n language?: 'pw' | 'javascript';\r\n includeSnapshot?: boolean;\r\n };\r\n\r\n try {\r\n const runtimeMsg: Record<string, unknown> = {\r\n type: 'bridge-command',\r\n command: msg.command,\r\n scriptType: msg.type,\r\n language: msg.language,\r\n };\r\n if (msg.includeSnapshot) runtimeMsg.includeSnapshot = true;\r\n const result = await chrome.runtime.sendMessage(runtimeMsg);\r\n\r\n if (ws?.readyState === WebSocket.OPEN) {\r\n ws.send(JSON.stringify({ id: msg.id, ...result }));\r\n }\r\n } catch (err) {\r\n if (ws?.readyState === WebSocket.OPEN) {\r\n ws.send(JSON.stringify({ id: msg.id, text: String(err), isError: true }));\r\n }\r\n }\r\n };\r\n\r\n ws.onclose = () => {\r\n ws = null;\r\n scheduleReconnect();\r\n };\r\n\r\n ws.onerror = () => {};\r\n } catch {\r\n scheduleReconnect();\r\n }\r\n}\r\n\r\nchrome.runtime.sendMessage({ type: 'get-bridge-port' }).then((port: number) => {\r\n connect(port || 9876);\r\n});\r\n\r\n// ─── Message routing from background SW ─────────────────────────────────────\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nchrome.runtime.onMessage.addListener((msg: any, _sender: any, sendResponse: any) => {\r\n if (msg.type === 'bridge-port-changed') {\r\n if (reconnectTimer) clearTimeout(reconnectTimer);\r\n if (ws) { ws.onclose = null; ws.close(); }\r\n connect(msg.port as number);\r\n }\r\n\r\n // Video capture messages\r\n if (msg.type === 'video-capture-start') {\r\n startVideoCapture(msg.streamId as string)\r\n .then(() => sendResponse({ ok: true }))\r\n .catch((e: Error) => sendResponse({ ok: false, error: e.message }));\r\n return true;\r\n }\r\n if (msg.type === 'video-capture-stop') {\r\n stopVideoCapture()\r\n .then(({ blobUrl, size }) => sendResponse({ ok: true, blobUrl, size }))\r\n .catch((e: Error) => sendResponse({ ok: false, error: e.message }));\r\n return true;\r\n }\r\n if (msg.type === 'video-revoke') {\r\n revokeLastBlob();\r\n }\r\n\r\n // Forward events to the bridge client (CLI/MCP/VS Code)\r\n if (msg.type === 'tab-attached' || msg.type === 'recorded-action' || msg.type === 'recorded-fill-update') {\r\n if (ws?.readyState === WebSocket.OPEN) {\r\n ws.send(JSON.stringify({ _event: true, ...msg }));\r\n }\r\n }\r\n});\r\n\r\nexport {};\r\n"],"names":[],"mappings":"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"}
|
package/dist/panel/panel.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"panel.js","sources":["../../src/panel/components/Icons.tsx","../../src/panel/components/Toolbar.tsx","../../../../node_modules/.pnpm/@codemirror+search@6.6.0/node_modules/@codemirror/search/dist/index.js","../../src/panel/lib/pw-language.ts","../../src/panel/lib/codemirror-setup.ts","../../src/panel/components/CodeMirrorEditorPane.tsx","../../src/panel/components/Splitter.tsx","../../src/panel/components/VariablePane.tsx","../../src/panel/components/BottomPane.tsx","../../src/panel/components/DebugBar.tsx","../../src/panel/lib/inline-values.ts","../../src/panel/App.tsx","../../src/panel/panel.tsx"],"sourcesContent":["export function SunIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 24 24\" width={size} height={size} stroke=\"currentColor\" fill=\"none\" strokeWidth=\"2\">\r\n <circle cx=\"12\" cy=\"12\" r=\"5\" />\r\n <line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\" />\r\n <line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\" />\r\n <line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\" />\r\n <line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\" />\r\n <line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\" />\r\n <line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\" />\r\n <line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\" />\r\n <line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function MoonIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 24 24\" width={size} height={size} stroke=\"currentColor\" fill=\"none\" strokeWidth=\"2\">\r\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function FolderOpenIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 24 24\" width={size} height={size} stroke=\"currentColor\" fill=\"none\" strokeWidth=\"2\">\r\n <path d=\"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function SaveIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 24 24\" width={size} height={size} stroke=\"currentColor\" fill=\"none\" strokeWidth=\"2\">\r\n <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\" />\r\n <polyline points=\"17 21 17 13 7 13 7 21\" />\r\n <polyline points=\"7 3 7 8 15 8\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function RecordIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 24 24\" width={size} height={size} stroke=\"currentColor\" fill=\"currentColor\" strokeWidth=\"2\">\r\n <circle cx=\"12\" cy=\"12\" r=\"7\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function StopIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 24 24\" width={size} height={size} stroke=\"currentColor\" fill=\"currentColor\" strokeWidth=\"2\">\r\n <rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"1\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function StepForwardIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 24 24\" width={size} height={size} stroke=\"currentColor\" fill=\"none\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <line x1=\"3\" y1=\"12\" x2=\"15\" y2=\"12\" />\r\n <polyline points=\"11 8 15 12 11 16\" />\r\n <line x1=\"19\" y1=\"7\" x2=\"19\" y2=\"17\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function AbortIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 24 24\" width={size} height={size} stroke=\"currentColor\" fill=\"none\" strokeWidth=\"2\" strokeLinecap=\"round\">\r\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\r\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\r\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function PlugIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 24 24\" width={size} height={size} stroke=\"currentColor\" fill=\"none\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\" />\r\n <path d=\"M3 8a2 2 0 0 1 2-2h2v12H5a2 2 0 0 1-2-2z\" />\r\n <rect x=\"7\" y=\"8\" width=\"3\" height=\"8\" rx=\"1\" />\r\n <path d=\"M16 6h2a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2z\" />\r\n <line x1=\"20\" y1=\"12\" x2=\"23\" y2=\"12\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function UnplugIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 24 24\" width={size} height={size} stroke=\"currentColor\" fill=\"none\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <line x1=\"1\" y1=\"12\" x2=\"5\" y2=\"12\" />\r\n <path d=\"M5 8a2 2 0 0 1 2-2h2v12H7a2 2 0 0 1-2-2z\" />\r\n <rect x=\"9\" y=\"8\" width=\"6\" height=\"8\" rx=\"1\" />\r\n <path d=\"M15 6h2a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2z\" />\r\n <line x1=\"19\" y1=\"12\" x2=\"23\" y2=\"12\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function BugIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 24 24\" width={size} height={size} stroke=\"currentColor\" fill=\"none\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <path d=\"M8 2l1.88 1.88\" /><path d=\"M14.12 3.88L16 2\" />\r\n <path d=\"M9 7.13v-1a3.003 3.003 0 1 1 6 0v1\" />\r\n <path d=\"M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6\" />\r\n <path d=\"M12 20v-9\" />\r\n <path d=\"M6.53 9C4.6 8.8 3 7.1 3 5\" />\r\n <path d=\"M6 13H2\" /><path d=\"M3 21c0-2.1 1.7-3.9 3.8-4\" />\r\n <path d=\"M20.97 5c0 2.1-1.6 3.8-3.5 4\" />\r\n <path d=\"M22 13h-4\" /><path d=\"M17.2 17c2.1.1 3.8 1.9 3.8 4\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ContinueIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 16 16\" width={size} height={size} fill=\"currentColor\">\r\n <path d=\"M3.5 2v12l9-6-9-6z\" />\r\n <rect x=\"12\" y=\"2\" width=\"2\" height=\"12\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function StepOverIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 16 16\" width={size} height={size} fill=\"currentColor\">\r\n <path d=\"M9.99993 13C9.99993 14.103 9.10293 15 7.99993 15C6.89693 15 5.99993 14.103 5.99993 13C5.99993 11.897 6.89693 11 7.99993 11C9.10293 11 9.99993 11.897 9.99993 13ZM13.2499 2C12.8359 2 12.4999 2.336 12.4999 2.75V4.027C11.3829 2.759 9.75993 2 7.99993 2C5.03293 2 2.47993 4.211 2.06093 7.144C2.00193 7.554 2.28793 7.934 2.69793 7.993C2.73393 7.999 2.76993 8.001 2.80493 8.001C3.17193 8.001 3.49293 7.731 3.54693 7.357C3.86093 5.159 5.77593 3.501 8.00093 3.501C9.52993 3.501 10.9199 4.264 11.7439 5.501H9.75093C9.33693 5.501 9.00093 5.837 9.00093 6.251C9.00093 6.665 9.33693 7.001 9.75093 7.001H13.2509C13.6649 7.001 14.0009 6.665 14.0009 6.251V2.751C14.0009 2.337 13.6649 2.001 13.2509 2.001L13.2499 2Z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function StepIntoIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 16 16\" width={size} height={size} fill=\"currentColor\">\r\n <path d=\"M10 13C10 14.103 9.10304 15 8.00004 15C6.89704 15 6.00004 14.103 6.00004 13C6.00004 11.897 6.89704 11 8.00004 11C9.10304 11 10 11.897 10 13ZM12.03 5.22C11.737 4.927 11.262 4.927 10.969 5.22L8.74904 7.44V1.75C8.74904 1.336 8.41304 1 7.99904 1C7.58504 1 7.24904 1.336 7.24904 1.75V7.439L5.02904 5.219C4.73604 4.926 4.26104 4.926 3.96804 5.219C3.67504 5.512 3.67504 5.987 3.96804 6.28L7.46804 9.78C7.61404 9.926 7.80604 10 7.99804 10C8.19004 10 8.38204 9.927 8.52804 9.78L12.028 6.28C12.321 5.987 12.321 5.512 12.028 5.219L12.03 5.22Z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function StepOutIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 16 16\" width={size} height={size} fill=\"currentColor\">\r\n <path d=\"M9.99802 13C9.99802 14.103 9.10102 15 7.99802 15C6.89502 15 5.99802 14.103 5.99802 13C5.99802 11.897 6.89502 11 7.99802 11C9.10102 11 9.99802 11.897 9.99802 13ZM12.03 4.71999L8.53002 1.21999C8.23702 0.926994 7.76202 0.926994 7.46902 1.21999L3.96902 4.71999C3.67602 5.01299 3.67602 5.48799 3.96902 5.78099C4.26202 6.07399 4.73702 6.07399 5.03002 5.78099L7.25002 3.56099V9.24999C7.25002 9.66399 7.58602 9.99999 8.00002 9.99999C8.41402 9.99999 8.75002 9.66399 8.75002 9.24999V3.56099L10.97 5.78099C11.116 5.92699 11.308 6.00099 11.5 6.00099C11.692 6.00099 11.884 5.92799 12.03 5.78099C12.323 5.48799 12.323 5.01299 12.03 4.71999Z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function RestartIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 16 16\" width={size} height={size} fill=\"currentColor\">\r\n <path d=\"M12.75 8a4.5 4.5 0 0 1-4.5 4.5c-2.485 0-4.5-2.015-4.5-4.5S5.765 3.5 8.25 3.5V2L11 4.5 8.25 7V5.5a2.5 2.5 0 1 0 2.5 2.5h2z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function DebugStopIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 16 16\" width={size} height={size} fill=\"currentColor\">\r\n <path d=\"M12.5 3.5V12.5H3.5V3.5H12.5ZM12.5 2H3.5C2.672 2 2 2.672 2 3.5V12.5C2 13.328 2.672 14 3.5 14H12.5C13.328 14 14 13.328 14 12.5V3.5C14 2.672 13.328 2 12.5 2Z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nexport function ScreencastIcon({ size = 16 }: { size?: number }) {\r\n return <span style={{ fontSize: size, lineHeight: 1, filter: 'grayscale(1)' }}>🎬</span>;\r\n}\r\n\r\nexport function CrosshairIcon({ size = 16 }: { size?: number }) {\r\n return (\r\n <svg viewBox=\"0 0 16 16\" width={size} height={size} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"8\" cy=\"8\" r=\"5\" />\r\n <circle cx=\"8\" cy=\"8\" r=\"2\" />\r\n <line x1=\"8\" y1=\"1\" x2=\"8\" y2=\"3\" />\r\n <line x1=\"8\" y1=\"13\" x2=\"8\" y2=\"15\" />\r\n <line x1=\"1\" y1=\"8\" x2=\"3\" y2=\"8\" />\r\n <line x1=\"13\" y1=\"8\" x2=\"15\" y2=\"8\" />\r\n </svg>\r\n );\r\n}\r\n\r\n","import { useRef, useMemo, useState, useEffect } from 'react';\r\nimport type { PanelState, Action } from \"@/reducer\";\r\nimport { attachToTab } from '@/lib/bridge';\r\nimport { runAndDispatch, runJsScript, runJsScriptStep } from '@/lib/run';\r\nimport { swTerminateExecution, swDebugResume } from '@/lib/sw-debugger';\r\nimport { SunIcon, MoonIcon, FolderOpenIcon, SaveIcon, RecordIcon, StopIcon, StepForwardIcon, BugIcon, CrosshairIcon, PlugIcon, UnplugIcon, ScreencastIcon } from './Icons';\r\nimport type { EditorHandle } from './CodeMirrorEditorPane';\r\nimport { buildPickResult } from '@/lib/pick-info';\r\nimport type { ElementPickInfo } from '@/types';\r\nimport { loadSettings, storeSettings } from '@/lib/settings'\r\n\r\ninterface ToolbarProps extends Pick<PanelState, 'editorContent' | 'editorMode' | 'stepLine' | 'attachedUrl' | 'attachedTabId' | 'isAttaching' | 'isRunning' | 'isStepDebugging' | 'breakPoints'> {\r\n dispatch: React.Dispatch<Action>,\r\n editorRef: React.RefObject<EditorHandle | null>,\r\n};\r\n\r\nfunction Toolbar({ editorContent, editorMode, stepLine, attachedUrl, attachedTabId, isAttaching, isRunning, isStepDebugging, breakPoints, dispatch, editorRef }: ToolbarProps) {\r\n const fileInputRef = useRef<HTMLInputElement>(null);\r\n const cancelRunRef = useRef(false);\r\n const [isRecording, setIsRecording] = useState(false);\r\n const [isPicking, setIsPicking] = useState(false);\r\n const [isDarkMode, setIsDarkMode] = useState(() => localStorage.getItem(\"theme\") === 'dark');\r\n const [availableTabs, setAvailableTabs] = useState<chrome.tabs.Tab[]>([]);\r\n const [canAttach, setCanAttach] = useState(true);\r\n const [selectedTabId, setSelectedTabId] = useState<number | null>(null);\r\n const [isVideoRecording, setIsVideoRecording] = useState(false);\r\n const [videoElapsed, setVideoElapsed] = useState(0);\r\n const videoStartTimeRef = useRef(0);\r\n\r\n const lines = useMemo(() => editorContent.split('\\n'), [editorContent]);\r\n\r\n // ─── Tab switcher ───\r\n\r\n function isInternalUrl(url: string | undefined) {\r\n if (!url) return true;\r\n return url.startsWith('chrome://') || url.startsWith('chrome-extension://');\r\n }\r\n\r\n function getTabLabel(tab: chrome.tabs.Tab): string {\r\n try {\r\n if (tab.url?.startsWith('about:')) return tab.url;\r\n const url = new URL(tab.url!);\r\n if (url.protocol === 'chrome:') return `chrome://${url.hostname}`;\r\n return url.hostname;\r\n } catch {\r\n return tab.url ?? '(unknown)';\r\n }\r\n }\r\n\r\n async function loadTabs() {\r\n if (!chrome.tabs?.query) return;\r\n const tabs = await chrome.tabs.query({});\r\n // Keep chrome:// tabs (to preserve tab order) but exclude other extensions' pages.\r\n // Allow our own extension pages but exclude the panel/popup itself.\r\n const ownOrigin = `chrome-extension://${chrome.runtime.id}/`;\r\n const panelUrl = `${ownOrigin}panel/panel.html`;\r\n setAvailableTabs(tabs.filter(t => t?.url && !t.url.startsWith(panelUrl) && (!t.url.startsWith('chrome-extension://') || t.url.startsWith(ownOrigin))));\r\n }\r\n\r\n async function checkActiveTab() {\r\n if (!chrome.tabs?.query) return;\r\n const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });\r\n setCanAttach(!isInternalUrl(tab?.url));\r\n }\r\n\r\n useEffect(() => {\r\n loadTabs();\r\n checkActiveTab();\r\n if (!chrome.tabs?.onActivated) return;\r\n const onActivated = (info: chrome.tabs.TabActiveInfo) => { setSelectedTabId(info.tabId); checkActiveTab(); };\r\n const onUpdated = (_tabId: number, changeInfo: chrome.tabs.TabChangeInfo) => { if (changeInfo.url) loadTabs(); };\r\n chrome.tabs.onActivated.addListener(onActivated);\r\n chrome.tabs.onUpdated.addListener(onUpdated);\r\n return () => { chrome.tabs.onActivated.removeListener(onActivated); chrome.tabs.onUpdated.removeListener(onUpdated); };\r\n }, []);\r\n\r\n async function doAttach(tabId: number) {\r\n dispatch({ type: 'ATTACH_START' });\r\n const res = await attachToTab(tabId);\r\n if (res.ok && res.url) {\r\n dispatch({ type: 'ATTACH_SUCCESS', url: res.url, tabId });\r\n setSelectedTabId(null); // attachedTabId takes over in dropdown\r\n } else {\r\n dispatch({ type: 'ATTACH_FAIL' });\r\n dispatch({ type: 'ADD_LINE', line: { text: `Attach failed: ${res.error ?? 'unknown error'}`, type: 'error' } });\r\n // keep selectedTabId so dropdown stays on the failed tab\r\n }\r\n }\r\n\r\n async function handleTabChange(tabId: number) {\r\n const tab = availableTabs.find(t => t.id === tabId);\r\n setSelectedTabId(tabId); // show in dropdown immediately\r\n chrome.tabs.update(tabId, { active: true }).catch(e => console.debug('[pw-repl] tab activate:', e));\r\n if (tab && isInternalUrl(tab.url)) {\r\n dispatch({ type: 'DETACH' });\r\n return;\r\n }\r\n await doAttach(tabId);\r\n }\r\n\r\n // ─── Attach ───\r\n\r\n async function handleAttach() {\r\n // Reconnect to the tab shown in the dropdown; only use browser's active tab when nothing is selected/attached\r\n const targetTabId = selectedTabId ?? attachedTabId;\r\n if (targetTabId !== null) {\r\n const tab = availableTabs.find(t => t.id === targetTabId);\r\n if (tab && isInternalUrl(tab.url)) return;\r\n await doAttach(targetTabId);\r\n return;\r\n }\r\n const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });\r\n if (!tab?.id || isInternalUrl(tab.url)) return;\r\n await doAttach(tab.id);\r\n }\r\n\r\n // ─── File operations ───\r\n\r\n function handleFileChange(event: React.ChangeEvent<HTMLInputElement>) {\r\n const file = event.target.files?.[0];\r\n if (!file) return;\r\n const fileReader = new FileReader();\r\n fileReader.onload = () => {\r\n dispatch({ type: 'EDIT_EDITOR_CONTENT', content: fileReader.result as string })\r\n if (file.name.endsWith('.js')) dispatch({ type: 'SET_EDITOR_MODE', mode: 'js' });\r\n else if (file.name.endsWith('.pw') || file.name.endsWith('.txt')) dispatch({ type: 'SET_EDITOR_MODE', mode: 'pw' });\r\n fileInputRef.current!.value = '';\r\n }\r\n fileReader.onerror = () => {\r\n dispatch({ type: 'ADD_LINE', line: { text: 'Failed to read file', type: 'error' } })\r\n }\r\n fileReader.readAsText(file);\r\n }\r\n\r\n function handleFileOpen() {\r\n fileInputRef.current!.click();\r\n }\r\n\r\n async function handleSave() {\r\n const isJs = editorMode === 'js';\r\n const ext = isJs ? '.js' : '.pw';\r\n const defaultName = `commands-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}${ext}`;\r\n const opts = {\r\n suggestedName: defaultName,\r\n types: isJs\r\n ? [{ description: \"JavaScript files\", accept: { \"text/javascript\": [\".js\"] } }]\r\n : [{ description: \"PW command files\", accept: { \"text/plain\": [\".pw\"] } }],\r\n };\r\n try {\r\n const fileHandle: FileSystemFileHandle = await window.showSaveFilePicker(opts);\r\n const writable = await fileHandle.createWritable();\r\n await writable.write(editorContent);\r\n await writable.close();\r\n } catch (e: unknown) {\r\n if (e instanceof Error && e.name !== 'AbortError') {\r\n dispatch({ type: 'ADD_LINE', line: { text: 'Save failed: ' + e.message, type: 'error' } })\r\n }\r\n }\r\n }\r\n\r\n // ─── Run / Step / Stop ───\r\n\r\n async function runCommand(index: number, command: string) {\r\n dispatch({ type: 'SET_RUN_LINE', currentRunLine: index });\r\n const result = await runAndDispatch(command, dispatch);\r\n dispatch({ type: 'SET_LINE_RESULT', index: index, result: result.isError ? 'fail' : 'pass' });\r\n }\r\n\r\n async function handleRun() {\r\n cancelRunRef.current = false;\r\n dispatch({ type: 'RUN_START' });\r\n if (editorMode === 'js') {\r\n await runJsScript(editorContent, dispatch);\r\n } else {\r\n for (let i = 0; i < lines.length; i++) {\r\n if (cancelRunRef.current) break;\r\n const trimmedValue = lines[i].trim();\r\n if (!lines[i].startsWith('#') && trimmedValue) {\r\n await runCommand(i, trimmedValue);\r\n }\r\n }\r\n if (!cancelRunRef.current) {\r\n dispatch({ type: 'ADD_LINE', line: { text: 'Run complete.', type: 'info' } });\r\n }\r\n }\r\n dispatch({ type: 'RUN_STOP' });\r\n }\r\n\r\n function handleStop() {\r\n cancelRunRef.current = true;\r\n if (isStepDebugging) {\r\n swTerminateExecution().catch(e => console.warn('[debug] terminate failed:', e));\r\n swDebugResume().catch(e => console.warn('[debug] resume failed:', e)); // unpause so termination takes effect\r\n }\r\n dispatch({ type: 'RUN_STOP' });\r\n }\r\n\r\n function findExecutableIndex(fromIndex: number) {\r\n let executableIndex = -1;\r\n for (let i = fromIndex; i < lines.length; i++) {\r\n if (!lines[i].startsWith('#') && lines[i].trim()) {\r\n executableIndex = i;\r\n break;\r\n }\r\n }\r\n return executableIndex;\r\n }\r\n\r\n async function handleDebug() {\r\n dispatch({ type: 'RUN_START', stepDebug: true });\r\n await runJsScriptStep(editorContent, dispatch, breakPoints);\r\n dispatch({ type: 'RUN_STOP' });\r\n }\r\n\r\n async function handleStep() {\r\n // pw step mode: run next line via runAndDispatch\r\n if (stepLine === -1) {\r\n const nextStepLine = findExecutableIndex(0);\r\n if (nextStepLine !== -1) dispatch({ type: 'STEP_INIT', stepLine: nextStepLine });\r\n return;\r\n }\r\n await runCommand(stepLine, lines[stepLine].trim());\r\n const nextStepLine = findExecutableIndex(stepLine + 1);\r\n dispatch({ type: 'STEP_ADVANCE', stepLine: nextStepLine });\r\n }\r\n\r\n // ─── Recording (content script-based) ───\r\n\r\n function isEditorEmpty(): boolean {\r\n return editorContent.split('\\n').every(line => {\r\n const trimmed = line.trim();\r\n if (!trimmed) return true;\r\n if (editorMode === 'pw') return trimmed.startsWith('#');\r\n return trimmed.startsWith('//') || trimmed.startsWith('/*');\r\n });\r\n }\r\n\r\n useEffect(() => {\r\n if (!chrome.runtime?.onMessage) return;\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const listener = (msg: any) => {\r\n if (msg.type === 'recorded-action') {\r\n editorRef.current?.insertAtCursor(editorMode === 'pw' ? msg.action.pw : msg.action.js);\r\n }\r\n if (msg.type === 'recorded-fill-update') {\r\n editorRef.current?.replaceLastInsert(editorMode === 'pw' ? msg.action.pw : msg.action.js);\r\n }\r\n };\r\n chrome.runtime.onMessage.addListener(listener);\r\n return () => chrome.runtime.onMessage.removeListener(listener);\r\n }, [editorMode]);\r\n\r\n // Auto-stop recording when run/debug starts\r\n useEffect(() => {\r\n if (isRunning && isRecording) {\r\n setIsRecording(false);\r\n chrome.runtime.sendMessage({ type: 'record-stop' }).catch(e => console.debug('[pw-repl] record-stop:', e));\r\n }\r\n }, [isRunning]);\r\n\r\n async function handleRecord() {\r\n if (!chrome.tabs?.query) return;\r\n\r\n if (isRecording) {\r\n setIsRecording(false);\r\n chrome.runtime.sendMessage({ type: 'record-stop' }).catch(e => console.debug('[pw-repl] record-stop:', e));\r\n return;\r\n }\r\n\r\n let result: { ok: boolean; url?: string; error?: string } | undefined;\r\n try {\r\n result = await chrome.runtime.sendMessage({ type: 'record-start' });\r\n } catch (e) {\r\n dispatch({ type: 'ADD_LINE', line: { text: `Recording failed: ${String(e)}`, type: 'error' } });\r\n return;\r\n }\r\n if (!result?.ok) {\r\n dispatch({ type: 'ADD_LINE', line: { text: `Recording failed: ${result?.error ?? 'unknown error'}`, type: 'error' } });\r\n return;\r\n }\r\n\r\n setIsRecording(true);\r\n\r\n if (result.url && result.url !== 'about:blank' && !result.url.startsWith('chrome://') && isEditorEmpty()) {\r\n const gotoCmd = editorMode === 'js'\r\n ? `await page.goto(${JSON.stringify(result.url)});`\r\n : `goto \"${result.url}\"`;\r\n editorRef.current?.insertAtCursor(gotoCmd);\r\n }\r\n }\r\n\r\n // ─── Pick element ───\r\n\r\n async function handlePick() {\r\n if (!chrome.tabs?.query) return;\r\n\r\n if (isPicking) {\r\n setIsPicking(false);\r\n await chrome.runtime.sendMessage({ type: 'pick-cancel' }).catch(e => console.debug('[pw-repl] pick-cancel:', e));\r\n return;\r\n }\r\n\r\n setIsPicking(true);\r\n try {\r\n const result = await chrome.runtime.sendMessage({ type: 'pick' }) as { ok: boolean; info?: ElementPickInfo & { ariaSnapshot?: string }; error?: string };\r\n if (!result?.ok || !result.info) {\r\n if (result?.error !== 'cancelled')\r\n dispatch({ type: 'ADD_LINE', line: { text: `Pick failed: ${result?.error ?? 'unknown error'}`, type: 'error' } });\r\n return;\r\n }\r\n const info = result.info;\r\n const pickResult = buildPickResult(info, info.locator, info.ariaSnapshot);\r\n if (info.ariaSnapshot)\r\n pickResult.ariaSnapshot = info.ariaSnapshot;\r\n dispatch({ type: 'ADD_LINE', line: { text: '', type: 'info', pickResult } });\r\n } catch (e) {\r\n dispatch({ type: 'ADD_LINE', line: { text: `Pick failed: ${String(e)}`, type: 'error' } });\r\n } finally {\r\n setIsPicking(false);\r\n }\r\n }\r\n\r\n function handleDetach() {\r\n dispatch({ type: 'DETACH' });\r\n // Let background know we're detaching (for cleanup)\r\n chrome.runtime.sendMessage({ type: 'detach' }).catch(e => console.debug('[pw-repl] detach:', e));\r\n }\r\n\r\n // ─── Video capture (toolbar button) ───\r\n\r\n function formatElapsed(seconds: number): string {\r\n const m = Math.floor(seconds / 60);\r\n const s = seconds % 60;\r\n return `${m}:${s.toString().padStart(2, '0')}`;\r\n }\r\n\r\n // Sync video state on panel load (in case panel reopens mid-recording)\r\n useEffect(() => {\r\n chrome.runtime.sendMessage({ type: 'video-state' }).then((r: { recording?: boolean; startTime?: number }) => {\r\n if (r?.recording && r.startTime) {\r\n setIsVideoRecording(true);\r\n videoStartTimeRef.current = r.startTime;\r\n setVideoElapsed(Math.round((Date.now() - r.startTime) / 1000));\r\n }\r\n }).catch(() => {});\r\n }, []);\r\n\r\n // Timer tick while video recording\r\n useEffect(() => {\r\n if (!isVideoRecording) { setVideoElapsed(0); return; }\r\n const id = setInterval(() => {\r\n setVideoElapsed(Math.round((Date.now() - videoStartTimeRef.current) / 1000));\r\n }, 1000);\r\n return () => clearInterval(id);\r\n }, [isVideoRecording]);\r\n\r\n async function handleVideoRecord() {\r\n if (isVideoRecording) {\r\n const r = await chrome.runtime.sendMessage({ type: 'video-stop' });\r\n setIsVideoRecording(false);\r\n if (r?.ok && r.blobUrl) {\r\n dispatch({ type: 'ADD_LINE', line: { text: 'Video recorded', type: 'info', video: r.blobUrl, videoDuration: r.duration, videoSize: r.size } });\r\n } else if (r?.error !== 'Not recording') {\r\n dispatch({ type: 'ADD_LINE', line: { text: `Video stop failed: ${r?.error ?? 'unknown'}`, type: 'error' } });\r\n }\r\n return;\r\n }\r\n const r = await chrome.runtime.sendMessage({ type: 'video-start' });\r\n if (r?.ok) {\r\n setIsVideoRecording(true);\r\n videoStartTimeRef.current = Date.now();\r\n } else if (r?.error === 'Already recording') {\r\n // Out of sync — background is recording but toolbar didn't know\r\n setIsVideoRecording(true);\r\n videoStartTimeRef.current = Date.now();\r\n } else {\r\n dispatch({ type: 'ADD_LINE', line: { text: `Video failed: ${r?.error ?? 'unknown'}`, type: 'error' } });\r\n }\r\n }\r\n\r\n // ─── Theme toggle ───\r\n\r\n useEffect(() => {\r\n document.documentElement.classList.toggle('theme-dark', isDarkMode);\r\n localStorage.setItem('theme', isDarkMode ? 'dark' : 'light');\r\n }, [isDarkMode]);\r\n\r\n return (\r\n <div id=\"toolbar\" className=\"flex flex-wrap gap-1 justify-between items-center py-1 px-2 bg-(--bg-toolbar) border-b border-solid border-(--border-primary) shrink-0\">\r\n <div id=\"toolbar-left\" className=\"flex flex-wrap gap-1 items-center\">\r\n <input\r\n type=\"file\"\r\n accept='.pw,.js,.txt'\r\n ref={fileInputRef}\r\n style={{ display: 'none' }}\r\n onChange={handleFileChange}\r\n />\r\n <button\r\n data-testid=\"pick-btn\"\r\n className={isPicking ? 'picking' : ''}\r\n title={isPicking ? \"Stop picking\" : \"Pick element\"}\r\n disabled={isRecording}\r\n onClick={handlePick}\r\n >\r\n <CrosshairIcon />\r\n </button>\r\n <button\r\n id=\"record-btn\"\r\n data-testid=\"record-btn\"\r\n className={isRecording ? 'recording' : ''}\r\n title={isRecording ? \"Stop recording\" : \"Start Recording\"}\r\n disabled={isPicking || isRunning}\r\n onClick={handleRecord}\r\n >\r\n {isRecording ? <StopIcon /> : <RecordIcon />}\r\n </button>\r\n {(isRunning || stepLine !== -1) && !isStepDebugging\r\n ? <button id=\"stop-run-btn\" data-testid=\"stop-run-btn\" title=\"Stop\" onClick={handleStop}><StopIcon /></button>\r\n : <button id=\"run-btn\" data-testid=\"run-btn\" title=\"Run script (Ctrl+Enter)\" disabled={!editorContent.trim() || isStepDebugging} onClick={handleRun}>▶</button>\r\n }\r\n {editorMode === 'js' && !isRunning && stepLine === -1 && (\r\n <button id=\"debug-btn\" data-testid=\"debug-btn\" title=\"Debug script\" disabled={!editorContent.trim()} onClick={handleDebug}><BugIcon /></button>\r\n )}\r\n {editorMode === 'pw' && (\r\n <button id=\"step-btn\" data-testid=\"step-btn\" title=\"Step: run next line\" disabled={!editorContent.trim() || isRunning} onClick={handleStep}><StepForwardIcon /></button>\r\n )}\r\n <span className=\"w-px h-4.5 bg-(--color-toolbar-sep) mx-1\"></span>\r\n <div data-testid=\"mode-toggle\" className=\"inline-flex rounded border border-(--border-button) overflow-hidden\">\r\n <button\r\n data-active={editorMode === 'pw' ? '' : undefined}\r\n onClick={() => {\r\n loadSettings()\r\n .then(s => storeSettings({ ...s, languageMode: 'pw' }))\r\n .then(() => dispatch({ type: 'SET_EDITOR_MODE', mode: 'pw' }));\r\n }}\r\n className=\"px-1.5 py-0.5 text-[11px] border-0 rounded-none\"\r\n >.pw</button>\r\n <button\r\n data-active={editorMode === 'js' ? '' : undefined}\r\n onClick={() => {\r\n loadSettings()\r\n .then(s => storeSettings({ ...s, languageMode: 'js' }))\r\n .then(() => dispatch({ type: 'SET_EDITOR_MODE', mode: 'js' }));\r\n }}\r\n className=\"px-1.5 py-0.5 text-[11px] border-0 rounded-none\"\r\n >JS</button>\r\n </div>\r\n <button\r\n id=\"video-btn\"\r\n data-testid=\"video-btn\"\r\n className={isVideoRecording ? 'video-recording' : ''}\r\n title={isVideoRecording ? `Stop video (${formatElapsed(videoElapsed)})` : 'Record video'}\r\n onClick={handleVideoRecord}\r\n >\r\n <ScreencastIcon />\r\n {isVideoRecording && <span className=\"ml-1 text-[10px] font-mono\">{formatElapsed(videoElapsed)}</span>}\r\n </button>\r\n <button id=\"open-btn\" title=\"Open .pw file\" onClick={handleFileOpen}><FolderOpenIcon /></button>\r\n <button id=\"save-btn\" title=\"Save as .pw file\" disabled={!editorContent.trim()} onClick={handleSave}><SaveIcon /></button>\r\n <button onClick={() => setIsDarkMode(prev => !prev)} title={isDarkMode ? 'Switch to light mode' : 'Switch to dark mode'}>\r\n {isDarkMode ? <SunIcon /> : <MoonIcon />}\r\n </button>\r\n </div>\r\n <div id=\"toolbar-right\" className=\"flex items-center gap-2\">\r\n <select\r\n value={selectedTabId ?? attachedTabId ?? ''}\r\n title=\"Switch tab\"\r\n onFocus={loadTabs}\r\n onChange={e => {\r\n const tabId = Number(e.target.value);\r\n if (tabId) handleTabChange(tabId);\r\n }}\r\n >\r\n {!selectedTabId && !attachedTabId && <option value=\"\">— select tab —</option>}\r\n {availableTabs.map(tab => (\r\n <option key={tab.id} value={tab.id}>{getTabLabel(tab)}</option>\r\n ))}\r\n </select>\r\n <button\r\n data-testid=\"attach-btn\"\r\n title={isAttaching ? 'Connecting...' : attachedUrl ? `Detach from ${attachedUrl}` : 'Attach to tab'}\r\n disabled={!attachedUrl && (isAttaching || !canAttach || availableTabs.some(t => t.id === selectedTabId && isInternalUrl(t.url)))}\r\n onClick={attachedUrl ? handleDetach : handleAttach}\r\n style={{ color: isAttaching ? 'var(--color-warning, #facc15)' : attachedUrl ? 'var(--color-success)' : 'var(--color-error)' }}\r\n >\r\n {attachedUrl ? <UnplugIcon /> : <PlugIcon />}\r\n </button>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default Toolbar;\r\n","import { showDialog, EditorView, Decoration, ViewPlugin, showPanel, runScopeHandlers, getPanel } from '@codemirror/view';\nimport { codePointAt, fromCodePoint, codePointSize, EditorSelection, Facet, combineConfig, CharCategory, StateEffect, StateField, RangeSetBuilder, Prec, EditorState, findClusterBreak } from '@codemirror/state';\nimport elt from 'crelt';\n\nconst basicNormalize = typeof String.prototype.normalize == \"function\"\n ? x => x.normalize(\"NFKD\") : x => x;\n/**\nA search cursor provides an iterator over text matches in a\ndocument.\n*/\nclass SearchCursor {\n /**\n Create a text cursor. The query is the search string, `from` to\n `to` provides the region to search.\n \n When `normalize` is given, it will be called, on both the query\n string and the content it is matched against, before comparing.\n You can, for example, create a case-insensitive search by\n passing `s => s.toLowerCase()`.\n \n Text is always normalized with\n [`.normalize(\"NFKD\")`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize)\n (when supported).\n */\n constructor(text, query, from = 0, to = text.length, normalize, test) {\n this.test = test;\n /**\n The current match (only holds a meaningful value after\n [`next`](https://codemirror.net/6/docs/ref/#search.SearchCursor.next) has been called and when\n `done` is false).\n */\n this.value = { from: 0, to: 0 };\n /**\n Whether the end of the iterated region has been reached.\n */\n this.done = false;\n this.matches = [];\n this.buffer = \"\";\n this.bufferPos = 0;\n this.iter = text.iterRange(from, to);\n this.bufferStart = from;\n this.normalize = normalize ? x => normalize(basicNormalize(x)) : basicNormalize;\n this.query = this.normalize(query);\n }\n peek() {\n if (this.bufferPos == this.buffer.length) {\n this.bufferStart += this.buffer.length;\n this.iter.next();\n if (this.iter.done)\n return -1;\n this.bufferPos = 0;\n this.buffer = this.iter.value;\n }\n return codePointAt(this.buffer, this.bufferPos);\n }\n /**\n Look for the next match. Updates the iterator's\n [`value`](https://codemirror.net/6/docs/ref/#search.SearchCursor.value) and\n [`done`](https://codemirror.net/6/docs/ref/#search.SearchCursor.done) properties. Should be called\n at least once before using the cursor.\n */\n next() {\n while (this.matches.length)\n this.matches.pop();\n return this.nextOverlapping();\n }\n /**\n The `next` method will ignore matches that partially overlap a\n previous match. This method behaves like `next`, but includes\n such matches.\n */\n nextOverlapping() {\n for (;;) {\n let next = this.peek();\n if (next < 0) {\n this.done = true;\n return this;\n }\n let str = fromCodePoint(next), start = this.bufferStart + this.bufferPos;\n this.bufferPos += codePointSize(next);\n let norm = this.normalize(str);\n if (norm.length)\n for (let i = 0, pos = start;; i++) {\n let code = norm.charCodeAt(i);\n let match = this.match(code, pos, this.bufferPos + this.bufferStart);\n if (i == norm.length - 1) {\n if (match) {\n this.value = match;\n return this;\n }\n break;\n }\n if (pos == start && i < str.length && str.charCodeAt(i) == code)\n pos++;\n }\n }\n }\n match(code, pos, end) {\n let match = null;\n for (let i = 0; i < this.matches.length; i += 2) {\n let index = this.matches[i], keep = false;\n if (this.query.charCodeAt(index) == code) {\n if (index == this.query.length - 1) {\n match = { from: this.matches[i + 1], to: end };\n }\n else {\n this.matches[i]++;\n keep = true;\n }\n }\n if (!keep) {\n this.matches.splice(i, 2);\n i -= 2;\n }\n }\n if (this.query.charCodeAt(0) == code) {\n if (this.query.length == 1)\n match = { from: pos, to: end };\n else\n this.matches.push(1, pos);\n }\n if (match && this.test && !this.test(match.from, match.to, this.buffer, this.bufferStart))\n match = null;\n return match;\n }\n}\nif (typeof Symbol != \"undefined\")\n SearchCursor.prototype[Symbol.iterator] = function () { return this; };\n\nconst empty = { from: -1, to: -1, match: /*@__PURE__*//.*/.exec(\"\") };\nconst baseFlags = \"gm\" + (/x/.unicode == null ? \"\" : \"u\");\n/**\nThis class is similar to [`SearchCursor`](https://codemirror.net/6/docs/ref/#search.SearchCursor)\nbut searches for a regular expression pattern instead of a plain\nstring.\n*/\nclass RegExpCursor {\n /**\n Create a cursor that will search the given range in the given\n document. `query` should be the raw pattern (as you'd pass it to\n `new RegExp`).\n */\n constructor(text, query, options, from = 0, to = text.length) {\n this.text = text;\n this.to = to;\n this.curLine = \"\";\n /**\n Set to `true` when the cursor has reached the end of the search\n range.\n */\n this.done = false;\n /**\n Will contain an object with the extent of the match and the\n match object when [`next`](https://codemirror.net/6/docs/ref/#search.RegExpCursor.next)\n sucessfully finds a match.\n */\n this.value = empty;\n if (/\\\\[sWDnr]|\\n|\\r|\\[\\^/.test(query))\n return new MultilineRegExpCursor(text, query, options, from, to);\n this.re = new RegExp(query, baseFlags + ((options === null || options === void 0 ? void 0 : options.ignoreCase) ? \"i\" : \"\"));\n this.test = options === null || options === void 0 ? void 0 : options.test;\n this.iter = text.iter();\n let startLine = text.lineAt(from);\n this.curLineStart = startLine.from;\n this.matchPos = toCharEnd(text, from);\n this.getLine(this.curLineStart);\n }\n getLine(skip) {\n this.iter.next(skip);\n if (this.iter.lineBreak) {\n this.curLine = \"\";\n }\n else {\n this.curLine = this.iter.value;\n if (this.curLineStart + this.curLine.length > this.to)\n this.curLine = this.curLine.slice(0, this.to - this.curLineStart);\n this.iter.next();\n }\n }\n nextLine() {\n this.curLineStart = this.curLineStart + this.curLine.length + 1;\n if (this.curLineStart > this.to)\n this.curLine = \"\";\n else\n this.getLine(0);\n }\n /**\n Move to the next match, if there is one.\n */\n next() {\n for (let off = this.matchPos - this.curLineStart;;) {\n this.re.lastIndex = off;\n let match = this.matchPos <= this.to && this.re.exec(this.curLine);\n if (match) {\n let from = this.curLineStart + match.index, to = from + match[0].length;\n this.matchPos = toCharEnd(this.text, to + (from == to ? 1 : 0));\n if (from == this.curLineStart + this.curLine.length)\n this.nextLine();\n if ((from < to || from > this.value.to) && (!this.test || this.test(from, to, match))) {\n this.value = { from, to, match };\n return this;\n }\n off = this.matchPos - this.curLineStart;\n }\n else if (this.curLineStart + this.curLine.length < this.to) {\n this.nextLine();\n off = 0;\n }\n else {\n this.done = true;\n return this;\n }\n }\n }\n}\nconst flattened = /*@__PURE__*/new WeakMap();\n// Reusable (partially) flattened document strings\nclass FlattenedDoc {\n constructor(from, text) {\n this.from = from;\n this.text = text;\n }\n get to() { return this.from + this.text.length; }\n static get(doc, from, to) {\n let cached = flattened.get(doc);\n if (!cached || cached.from >= to || cached.to <= from) {\n let flat = new FlattenedDoc(from, doc.sliceString(from, to));\n flattened.set(doc, flat);\n return flat;\n }\n if (cached.from == from && cached.to == to)\n return cached;\n let { text, from: cachedFrom } = cached;\n if (cachedFrom > from) {\n text = doc.sliceString(from, cachedFrom) + text;\n cachedFrom = from;\n }\n if (cached.to < to)\n text += doc.sliceString(cached.to, to);\n flattened.set(doc, new FlattenedDoc(cachedFrom, text));\n return new FlattenedDoc(from, text.slice(from - cachedFrom, to - cachedFrom));\n }\n}\nclass MultilineRegExpCursor {\n constructor(text, query, options, from, to) {\n this.text = text;\n this.to = to;\n this.done = false;\n this.value = empty;\n this.matchPos = toCharEnd(text, from);\n this.re = new RegExp(query, baseFlags + ((options === null || options === void 0 ? void 0 : options.ignoreCase) ? \"i\" : \"\"));\n this.test = options === null || options === void 0 ? void 0 : options.test;\n this.flat = FlattenedDoc.get(text, from, this.chunkEnd(from + 5000 /* Chunk.Base */));\n }\n chunkEnd(pos) {\n return pos >= this.to ? this.to : this.text.lineAt(pos).to;\n }\n next() {\n for (;;) {\n let off = this.re.lastIndex = this.matchPos - this.flat.from;\n let match = this.re.exec(this.flat.text);\n // Skip empty matches directly after the last match\n if (match && !match[0] && match.index == off) {\n this.re.lastIndex = off + 1;\n match = this.re.exec(this.flat.text);\n }\n if (match) {\n let from = this.flat.from + match.index, to = from + match[0].length;\n // If a match goes almost to the end of a noncomplete chunk, try\n // again, since it'll likely be able to match more\n if ((this.flat.to >= this.to || match.index + match[0].length <= this.flat.text.length - 10) &&\n (!this.test || this.test(from, to, match))) {\n this.value = { from, to, match };\n this.matchPos = toCharEnd(this.text, to + (from == to ? 1 : 0));\n return this;\n }\n }\n if (this.flat.to == this.to) {\n this.done = true;\n return this;\n }\n // Grow the flattened doc\n this.flat = FlattenedDoc.get(this.text, this.flat.from, this.chunkEnd(this.flat.from + this.flat.text.length * 2));\n }\n }\n}\nif (typeof Symbol != \"undefined\") {\n RegExpCursor.prototype[Symbol.iterator] = MultilineRegExpCursor.prototype[Symbol.iterator] =\n function () { return this; };\n}\nfunction validRegExp(source) {\n try {\n new RegExp(source, baseFlags);\n return true;\n }\n catch (_a) {\n return false;\n }\n}\nfunction toCharEnd(text, pos) {\n if (pos >= text.length)\n return pos;\n let line = text.lineAt(pos), next;\n while (pos < line.to && (next = line.text.charCodeAt(pos - line.from)) >= 0xDC00 && next < 0xE000)\n pos++;\n return pos;\n}\n\n/**\nCommand that shows a dialog asking the user for a line number, and\nwhen a valid position is provided, moves the cursor to that line.\n\nSupports line numbers, relative line offsets prefixed with `+` or\n`-`, document percentages suffixed with `%`, and an optional\ncolumn position by adding `:` and a second number after the line\nnumber.\n*/\nconst gotoLine = view => {\n let { state } = view;\n let line = String(state.doc.lineAt(view.state.selection.main.head).number);\n let { close, result } = showDialog(view, {\n label: state.phrase(\"Go to line\"),\n input: { type: \"text\", name: \"line\", value: line },\n focus: true,\n submitLabel: state.phrase(\"go\"),\n });\n result.then(form => {\n let match = form && /^([+-])?(\\d+)?(:\\d+)?(%)?$/.exec(form.elements[\"line\"].value);\n if (!match) {\n view.dispatch({ effects: close });\n return;\n }\n let startLine = state.doc.lineAt(state.selection.main.head);\n let [, sign, ln, cl, percent] = match;\n let col = cl ? +cl.slice(1) : 0;\n let line = ln ? +ln : startLine.number;\n if (ln && percent) {\n let pc = line / 100;\n if (sign)\n pc = pc * (sign == \"-\" ? -1 : 1) + (startLine.number / state.doc.lines);\n line = Math.round(state.doc.lines * pc);\n }\n else if (ln && sign) {\n line = line * (sign == \"-\" ? -1 : 1) + startLine.number;\n }\n let docLine = state.doc.line(Math.max(1, Math.min(state.doc.lines, line)));\n let selection = EditorSelection.cursor(docLine.from + Math.max(0, Math.min(col, docLine.length)));\n view.dispatch({\n effects: [close, EditorView.scrollIntoView(selection.from, { y: 'center' })],\n selection,\n });\n });\n return true;\n};\n\nconst defaultHighlightOptions = {\n highlightWordAroundCursor: false,\n minSelectionLength: 1,\n maxMatches: 100,\n wholeWords: false\n};\nconst highlightConfig = /*@__PURE__*/Facet.define({\n combine(options) {\n return combineConfig(options, defaultHighlightOptions, {\n highlightWordAroundCursor: (a, b) => a || b,\n minSelectionLength: Math.min,\n maxMatches: Math.min\n });\n }\n});\n/**\nThis extension highlights text that matches the selection. It uses\nthe `\"cm-selectionMatch\"` class for the highlighting. When\n`highlightWordAroundCursor` is enabled, the word at the cursor\nitself will be highlighted with `\"cm-selectionMatch-main\"`.\n*/\nfunction highlightSelectionMatches(options) {\n let ext = [defaultTheme, matchHighlighter];\n if (options)\n ext.push(highlightConfig.of(options));\n return ext;\n}\nconst matchDeco = /*@__PURE__*/Decoration.mark({ class: \"cm-selectionMatch\" });\nconst mainMatchDeco = /*@__PURE__*/Decoration.mark({ class: \"cm-selectionMatch cm-selectionMatch-main\" });\n// Whether the characters directly outside the given positions are non-word characters\nfunction insideWordBoundaries(check, state, from, to) {\n return (from == 0 || check(state.sliceDoc(from - 1, from)) != CharCategory.Word) &&\n (to == state.doc.length || check(state.sliceDoc(to, to + 1)) != CharCategory.Word);\n}\n// Whether the characters directly at the given positions are word characters\nfunction insideWord(check, state, from, to) {\n return check(state.sliceDoc(from, from + 1)) == CharCategory.Word\n && check(state.sliceDoc(to - 1, to)) == CharCategory.Word;\n}\nconst matchHighlighter = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor(view) {\n this.decorations = this.getDeco(view);\n }\n update(update) {\n if (update.selectionSet || update.docChanged || update.viewportChanged)\n this.decorations = this.getDeco(update.view);\n }\n getDeco(view) {\n let conf = view.state.facet(highlightConfig);\n let { state } = view, sel = state.selection;\n if (sel.ranges.length > 1)\n return Decoration.none;\n let range = sel.main, query, check = null;\n if (range.empty) {\n if (!conf.highlightWordAroundCursor)\n return Decoration.none;\n let word = state.wordAt(range.head);\n if (!word)\n return Decoration.none;\n check = state.charCategorizer(range.head);\n query = state.sliceDoc(word.from, word.to);\n }\n else {\n let len = range.to - range.from;\n if (len < conf.minSelectionLength || len > 200)\n return Decoration.none;\n if (conf.wholeWords) {\n query = state.sliceDoc(range.from, range.to); // TODO: allow and include leading/trailing space?\n check = state.charCategorizer(range.head);\n if (!(insideWordBoundaries(check, state, range.from, range.to) &&\n insideWord(check, state, range.from, range.to)))\n return Decoration.none;\n }\n else {\n query = state.sliceDoc(range.from, range.to);\n if (!query)\n return Decoration.none;\n }\n }\n let deco = [];\n for (let part of view.visibleRanges) {\n let cursor = new SearchCursor(state.doc, query, part.from, part.to);\n while (!cursor.next().done) {\n let { from, to } = cursor.value;\n if (!check || insideWordBoundaries(check, state, from, to)) {\n if (range.empty && from <= range.from && to >= range.to)\n deco.push(mainMatchDeco.range(from, to));\n else if (from >= range.to || to <= range.from)\n deco.push(matchDeco.range(from, to));\n if (deco.length > conf.maxMatches)\n return Decoration.none;\n }\n }\n }\n return Decoration.set(deco);\n }\n}, {\n decorations: v => v.decorations\n});\nconst defaultTheme = /*@__PURE__*/EditorView.baseTheme({\n \".cm-selectionMatch\": { backgroundColor: \"#99ff7780\" },\n \".cm-searchMatch .cm-selectionMatch\": { backgroundColor: \"transparent\" }\n});\n// Select the words around the cursors.\nconst selectWord = ({ state, dispatch }) => {\n let { selection } = state;\n let newSel = EditorSelection.create(selection.ranges.map(range => state.wordAt(range.head) || EditorSelection.cursor(range.head)), selection.mainIndex);\n if (newSel.eq(selection))\n return false;\n dispatch(state.update({ selection: newSel }));\n return true;\n};\n// Find next occurrence of query relative to last cursor. Wrap around\n// the document if there are no more matches.\nfunction findNextOccurrence(state, query) {\n let { main, ranges } = state.selection;\n let word = state.wordAt(main.head), fullWord = word && word.from == main.from && word.to == main.to;\n for (let cycled = false, cursor = new SearchCursor(state.doc, query, ranges[ranges.length - 1].to);;) {\n cursor.next();\n if (cursor.done) {\n if (cycled)\n return null;\n cursor = new SearchCursor(state.doc, query, 0, Math.max(0, ranges[ranges.length - 1].from - 1));\n cycled = true;\n }\n else {\n if (cycled && ranges.some(r => r.from == cursor.value.from))\n continue;\n if (fullWord) {\n let word = state.wordAt(cursor.value.from);\n if (!word || word.from != cursor.value.from || word.to != cursor.value.to)\n continue;\n }\n return cursor.value;\n }\n }\n}\n/**\nSelect next occurrence of the current selection. Expand selection\nto the surrounding word when the selection is empty.\n*/\nconst selectNextOccurrence = ({ state, dispatch }) => {\n let { ranges } = state.selection;\n if (ranges.some(sel => sel.from === sel.to))\n return selectWord({ state, dispatch });\n let searchedText = state.sliceDoc(ranges[0].from, ranges[0].to);\n if (state.selection.ranges.some(r => state.sliceDoc(r.from, r.to) != searchedText))\n return false;\n let range = findNextOccurrence(state, searchedText);\n if (!range)\n return false;\n dispatch(state.update({\n selection: state.selection.addRange(EditorSelection.range(range.from, range.to), false),\n effects: EditorView.scrollIntoView(range.to)\n }));\n return true;\n};\n\nconst searchConfigFacet = /*@__PURE__*/Facet.define({\n combine(configs) {\n return combineConfig(configs, {\n top: false,\n caseSensitive: false,\n literal: false,\n regexp: false,\n wholeWord: false,\n createPanel: view => new SearchPanel(view),\n scrollToMatch: range => EditorView.scrollIntoView(range)\n });\n }\n});\n/**\nAdd search state to the editor configuration, and optionally\nconfigure the search extension.\n([`openSearchPanel`](https://codemirror.net/6/docs/ref/#search.openSearchPanel) will automatically\nenable this if it isn't already on).\n*/\nfunction search(config) {\n return config ? [searchConfigFacet.of(config), searchExtensions] : searchExtensions;\n}\n/**\nA search query. Part of the editor's search state.\n*/\nclass SearchQuery {\n /**\n Create a query object.\n */\n constructor(config) {\n this.search = config.search;\n this.caseSensitive = !!config.caseSensitive;\n this.literal = !!config.literal;\n this.regexp = !!config.regexp;\n this.replace = config.replace || \"\";\n this.valid = !!this.search && (!this.regexp || validRegExp(this.search));\n this.unquoted = this.unquote(this.search);\n this.wholeWord = !!config.wholeWord;\n this.test = config.test;\n }\n /**\n @internal\n */\n unquote(text) {\n return this.literal ? text :\n text.replace(/\\\\([nrt\\\\])/g, (_, ch) => ch == \"n\" ? \"\\n\" : ch == \"r\" ? \"\\r\" : ch == \"t\" ? \"\\t\" : \"\\\\\");\n }\n /**\n Compare this query to another query.\n */\n eq(other) {\n return this.search == other.search && this.replace == other.replace &&\n this.caseSensitive == other.caseSensitive && this.regexp == other.regexp &&\n this.wholeWord == other.wholeWord && this.test == other.test;\n }\n /**\n @internal\n */\n create() {\n return this.regexp ? new RegExpQuery(this) : new StringQuery(this);\n }\n /**\n Get a search cursor for this query, searching through the given\n range in the given state.\n */\n getCursor(state, from = 0, to) {\n let st = state.doc ? state : EditorState.create({ doc: state });\n if (to == null)\n to = st.doc.length;\n return this.regexp ? regexpCursor(this, st, from, to) : stringCursor(this, st, from, to);\n }\n}\nclass QueryType {\n constructor(spec) {\n this.spec = spec;\n }\n}\nfunction wrapStringTest(test, state, inner) {\n return (from, to, buffer, bufferPos) => {\n if (inner && !inner(from, to, buffer, bufferPos))\n return false;\n let match = from >= bufferPos && to <= bufferPos + buffer.length\n ? buffer.slice(from - bufferPos, to - bufferPos)\n : state.doc.sliceString(from, to);\n return test(match, state, from, to);\n };\n}\nfunction stringCursor(spec, state, from, to) {\n let test;\n if (spec.wholeWord)\n test = stringWordTest(state.doc, state.charCategorizer(state.selection.main.head));\n if (spec.test)\n test = wrapStringTest(spec.test, state, test);\n return new SearchCursor(state.doc, spec.unquoted, from, to, spec.caseSensitive ? undefined : x => x.toLowerCase(), test);\n}\nfunction stringWordTest(doc, categorizer) {\n return (from, to, buf, bufPos) => {\n if (bufPos > from || bufPos + buf.length < to) {\n bufPos = Math.max(0, from - 2);\n buf = doc.sliceString(bufPos, Math.min(doc.length, to + 2));\n }\n return (categorizer(charBefore(buf, from - bufPos)) != CharCategory.Word ||\n categorizer(charAfter(buf, from - bufPos)) != CharCategory.Word) &&\n (categorizer(charAfter(buf, to - bufPos)) != CharCategory.Word ||\n categorizer(charBefore(buf, to - bufPos)) != CharCategory.Word);\n };\n}\nclass StringQuery extends QueryType {\n constructor(spec) {\n super(spec);\n }\n nextMatch(state, curFrom, curTo) {\n let cursor = stringCursor(this.spec, state, curTo, state.doc.length).nextOverlapping();\n if (cursor.done) {\n let end = Math.min(state.doc.length, curFrom + this.spec.unquoted.length);\n cursor = stringCursor(this.spec, state, 0, end).nextOverlapping();\n }\n return cursor.done || cursor.value.from == curFrom && cursor.value.to == curTo ? null : cursor.value;\n }\n // Searching in reverse is, rather than implementing an inverted search\n // cursor, done by scanning chunk after chunk forward.\n prevMatchInRange(state, from, to) {\n for (let pos = to;;) {\n let start = Math.max(from, pos - 10000 /* FindPrev.ChunkSize */ - this.spec.unquoted.length);\n let cursor = stringCursor(this.spec, state, start, pos), range = null;\n while (!cursor.nextOverlapping().done)\n range = cursor.value;\n if (range)\n return range;\n if (start == from)\n return null;\n pos -= 10000 /* FindPrev.ChunkSize */;\n }\n }\n prevMatch(state, curFrom, curTo) {\n let found = this.prevMatchInRange(state, 0, curFrom);\n if (!found)\n found = this.prevMatchInRange(state, Math.max(0, curTo - this.spec.unquoted.length), state.doc.length);\n return found && (found.from != curFrom || found.to != curTo) ? found : null;\n }\n getReplacement(_result) { return this.spec.unquote(this.spec.replace); }\n matchAll(state, limit) {\n let cursor = stringCursor(this.spec, state, 0, state.doc.length), ranges = [];\n while (!cursor.next().done) {\n if (ranges.length >= limit)\n return null;\n ranges.push(cursor.value);\n }\n return ranges;\n }\n highlight(state, from, to, add) {\n let cursor = stringCursor(this.spec, state, Math.max(0, from - this.spec.unquoted.length), Math.min(to + this.spec.unquoted.length, state.doc.length));\n while (!cursor.next().done)\n add(cursor.value.from, cursor.value.to);\n }\n}\nfunction wrapRegexpTest(test, state, inner) {\n return (from, to, match) => {\n return (!inner || inner(from, to, match)) && test(match[0], state, from, to);\n };\n}\nfunction regexpCursor(spec, state, from, to) {\n let test;\n if (spec.wholeWord)\n test = regexpWordTest(state.charCategorizer(state.selection.main.head));\n if (spec.test)\n test = wrapRegexpTest(spec.test, state, test);\n return new RegExpCursor(state.doc, spec.search, { ignoreCase: !spec.caseSensitive, test }, from, to);\n}\nfunction charBefore(str, index) {\n return str.slice(findClusterBreak(str, index, false), index);\n}\nfunction charAfter(str, index) {\n return str.slice(index, findClusterBreak(str, index));\n}\nfunction regexpWordTest(categorizer) {\n return (_from, _to, match) => !match[0].length ||\n (categorizer(charBefore(match.input, match.index)) != CharCategory.Word ||\n categorizer(charAfter(match.input, match.index)) != CharCategory.Word) &&\n (categorizer(charAfter(match.input, match.index + match[0].length)) != CharCategory.Word ||\n categorizer(charBefore(match.input, match.index + match[0].length)) != CharCategory.Word);\n}\nclass RegExpQuery extends QueryType {\n nextMatch(state, curFrom, curTo) {\n let cursor = regexpCursor(this.spec, state, curTo, state.doc.length).next();\n if (cursor.done)\n cursor = regexpCursor(this.spec, state, 0, curFrom).next();\n return cursor.done ? null : cursor.value;\n }\n prevMatchInRange(state, from, to) {\n for (let size = 1;; size++) {\n let start = Math.max(from, to - size * 10000 /* FindPrev.ChunkSize */);\n let cursor = regexpCursor(this.spec, state, start, to), range = null;\n while (!cursor.next().done)\n range = cursor.value;\n if (range && (start == from || range.from > start + 10))\n return range;\n if (start == from)\n return null;\n }\n }\n prevMatch(state, curFrom, curTo) {\n return this.prevMatchInRange(state, 0, curFrom) ||\n this.prevMatchInRange(state, curTo, state.doc.length);\n }\n getReplacement(result) {\n return this.spec.unquote(this.spec.replace).replace(/\\$([$&]|\\d+)/g, (m, i) => {\n if (i == \"&\")\n return result.match[0];\n if (i == \"$\")\n return \"$\";\n for (let l = i.length; l > 0; l--) {\n let n = +i.slice(0, l);\n if (n > 0 && n < result.match.length)\n return result.match[n] + i.slice(l);\n }\n return m;\n });\n }\n matchAll(state, limit) {\n let cursor = regexpCursor(this.spec, state, 0, state.doc.length), ranges = [];\n while (!cursor.next().done) {\n if (ranges.length >= limit)\n return null;\n ranges.push(cursor.value);\n }\n return ranges;\n }\n highlight(state, from, to, add) {\n let cursor = regexpCursor(this.spec, state, Math.max(0, from - 250 /* RegExp.HighlightMargin */), Math.min(to + 250 /* RegExp.HighlightMargin */, state.doc.length));\n while (!cursor.next().done)\n add(cursor.value.from, cursor.value.to);\n }\n}\n/**\nA state effect that updates the current search query. Note that\nthis only has an effect if the search state has been initialized\n(by including [`search`](https://codemirror.net/6/docs/ref/#search.search) in your configuration or\nby running [`openSearchPanel`](https://codemirror.net/6/docs/ref/#search.openSearchPanel) at least\nonce).\n*/\nconst setSearchQuery = /*@__PURE__*/StateEffect.define();\nconst togglePanel = /*@__PURE__*/StateEffect.define();\nconst searchState = /*@__PURE__*/StateField.define({\n create(state) {\n return new SearchState(defaultQuery(state).create(), null);\n },\n update(value, tr) {\n for (let effect of tr.effects) {\n if (effect.is(setSearchQuery))\n value = new SearchState(effect.value.create(), value.panel);\n else if (effect.is(togglePanel))\n value = new SearchState(value.query, effect.value ? createSearchPanel : null);\n }\n return value;\n },\n provide: f => showPanel.from(f, val => val.panel)\n});\n/**\nGet the current search query from an editor state.\n*/\nfunction getSearchQuery(state) {\n let curState = state.field(searchState, false);\n return curState ? curState.query.spec : defaultQuery(state);\n}\n/**\nQuery whether the search panel is open in the given editor state.\n*/\nfunction searchPanelOpen(state) {\n var _a;\n return ((_a = state.field(searchState, false)) === null || _a === void 0 ? void 0 : _a.panel) != null;\n}\nclass SearchState {\n constructor(query, panel) {\n this.query = query;\n this.panel = panel;\n }\n}\nconst matchMark = /*@__PURE__*/Decoration.mark({ class: \"cm-searchMatch\" }), selectedMatchMark = /*@__PURE__*/Decoration.mark({ class: \"cm-searchMatch cm-searchMatch-selected\" });\nconst searchHighlighter = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor(view) {\n this.view = view;\n this.decorations = this.highlight(view.state.field(searchState));\n }\n update(update) {\n let state = update.state.field(searchState);\n if (state != update.startState.field(searchState) || update.docChanged || update.selectionSet || update.viewportChanged)\n this.decorations = this.highlight(state);\n }\n highlight({ query, panel }) {\n if (!panel || !query.spec.valid)\n return Decoration.none;\n let { view } = this;\n let builder = new RangeSetBuilder();\n for (let i = 0, ranges = view.visibleRanges, l = ranges.length; i < l; i++) {\n let { from, to } = ranges[i];\n while (i < l - 1 && to > ranges[i + 1].from - 2 * 250 /* RegExp.HighlightMargin */)\n to = ranges[++i].to;\n query.highlight(view.state, from, to, (from, to) => {\n let selected = view.state.selection.ranges.some(r => r.from == from && r.to == to);\n builder.add(from, to, selected ? selectedMatchMark : matchMark);\n });\n }\n return builder.finish();\n }\n}, {\n decorations: v => v.decorations\n});\nfunction searchCommand(f) {\n return view => {\n let state = view.state.field(searchState, false);\n return state && state.query.spec.valid ? f(view, state) : openSearchPanel(view);\n };\n}\n/**\nOpen the search panel if it isn't already open, and move the\nselection to the first match after the current main selection.\nWill wrap around to the start of the document when it reaches the\nend.\n*/\nconst findNext = /*@__PURE__*/searchCommand((view, { query }) => {\n let { to } = view.state.selection.main;\n let next = query.nextMatch(view.state, to, to);\n if (!next)\n return false;\n let selection = EditorSelection.single(next.from, next.to);\n let config = view.state.facet(searchConfigFacet);\n view.dispatch({\n selection,\n effects: [announceMatch(view, next), config.scrollToMatch(selection.main, view)],\n userEvent: \"select.search\"\n });\n selectSearchInput(view);\n return true;\n});\n/**\nMove the selection to the previous instance of the search query,\nbefore the current main selection. Will wrap past the start\nof the document to start searching at the end again.\n*/\nconst findPrevious = /*@__PURE__*/searchCommand((view, { query }) => {\n let { state } = view, { from } = state.selection.main;\n let prev = query.prevMatch(state, from, from);\n if (!prev)\n return false;\n let selection = EditorSelection.single(prev.from, prev.to);\n let config = view.state.facet(searchConfigFacet);\n view.dispatch({\n selection,\n effects: [announceMatch(view, prev), config.scrollToMatch(selection.main, view)],\n userEvent: \"select.search\"\n });\n selectSearchInput(view);\n return true;\n});\n/**\nSelect all instances of the search query.\n*/\nconst selectMatches = /*@__PURE__*/searchCommand((view, { query }) => {\n let ranges = query.matchAll(view.state, 1000);\n if (!ranges || !ranges.length)\n return false;\n view.dispatch({\n selection: EditorSelection.create(ranges.map(r => EditorSelection.range(r.from, r.to))),\n userEvent: \"select.search.matches\"\n });\n return true;\n});\n/**\nSelect all instances of the currently selected text.\n*/\nconst selectSelectionMatches = ({ state, dispatch }) => {\n let sel = state.selection;\n if (sel.ranges.length > 1 || sel.main.empty)\n return false;\n let { from, to } = sel.main;\n let ranges = [], main = 0;\n for (let cur = new SearchCursor(state.doc, state.sliceDoc(from, to)); !cur.next().done;) {\n if (ranges.length > 1000)\n return false;\n if (cur.value.from == from)\n main = ranges.length;\n ranges.push(EditorSelection.range(cur.value.from, cur.value.to));\n }\n dispatch(state.update({\n selection: EditorSelection.create(ranges, main),\n userEvent: \"select.search.matches\"\n }));\n return true;\n};\n/**\nReplace the current match of the search query.\n*/\nconst replaceNext = /*@__PURE__*/searchCommand((view, { query }) => {\n let { state } = view, { from, to } = state.selection.main;\n if (state.readOnly)\n return false;\n let match = query.nextMatch(state, from, from);\n if (!match)\n return false;\n let next = match;\n let changes = [], selection, replacement;\n let effects = [];\n if (next.from == from && next.to == to) {\n replacement = state.toText(query.getReplacement(next));\n changes.push({ from: next.from, to: next.to, insert: replacement });\n next = query.nextMatch(state, next.from, next.to);\n effects.push(EditorView.announce.of(state.phrase(\"replaced match on line $\", state.doc.lineAt(from).number) + \".\"));\n }\n let changeSet = view.state.changes(changes);\n if (next) {\n selection = EditorSelection.single(next.from, next.to).map(changeSet);\n effects.push(announceMatch(view, next));\n effects.push(state.facet(searchConfigFacet).scrollToMatch(selection.main, view));\n }\n view.dispatch({\n changes: changeSet,\n selection,\n effects,\n userEvent: \"input.replace\"\n });\n return true;\n});\n/**\nReplace all instances of the search query with the given\nreplacement.\n*/\nconst replaceAll = /*@__PURE__*/searchCommand((view, { query }) => {\n if (view.state.readOnly)\n return false;\n let changes = query.matchAll(view.state, 1e9).map(match => {\n let { from, to } = match;\n return { from, to, insert: query.getReplacement(match) };\n });\n if (!changes.length)\n return false;\n let announceText = view.state.phrase(\"replaced $ matches\", changes.length) + \".\";\n view.dispatch({\n changes,\n effects: EditorView.announce.of(announceText),\n userEvent: \"input.replace.all\"\n });\n return true;\n});\nfunction createSearchPanel(view) {\n return view.state.facet(searchConfigFacet).createPanel(view);\n}\nfunction defaultQuery(state, fallback) {\n var _a, _b, _c, _d, _e;\n let sel = state.selection.main;\n let selText = sel.empty || sel.to > sel.from + 100 ? \"\" : state.sliceDoc(sel.from, sel.to);\n if (fallback && !selText)\n return fallback;\n let config = state.facet(searchConfigFacet);\n return new SearchQuery({\n search: ((_a = fallback === null || fallback === void 0 ? void 0 : fallback.literal) !== null && _a !== void 0 ? _a : config.literal) ? selText : selText.replace(/\\n/g, \"\\\\n\"),\n caseSensitive: (_b = fallback === null || fallback === void 0 ? void 0 : fallback.caseSensitive) !== null && _b !== void 0 ? _b : config.caseSensitive,\n literal: (_c = fallback === null || fallback === void 0 ? void 0 : fallback.literal) !== null && _c !== void 0 ? _c : config.literal,\n regexp: (_d = fallback === null || fallback === void 0 ? void 0 : fallback.regexp) !== null && _d !== void 0 ? _d : config.regexp,\n wholeWord: (_e = fallback === null || fallback === void 0 ? void 0 : fallback.wholeWord) !== null && _e !== void 0 ? _e : config.wholeWord\n });\n}\nfunction getSearchInput(view) {\n let panel = getPanel(view, createSearchPanel);\n return panel && panel.dom.querySelector(\"[main-field]\");\n}\nfunction selectSearchInput(view) {\n let input = getSearchInput(view);\n if (input && input == view.root.activeElement)\n input.select();\n}\n/**\nMake sure the search panel is open and focused.\n*/\nconst openSearchPanel = view => {\n let state = view.state.field(searchState, false);\n if (state && state.panel) {\n let searchInput = getSearchInput(view);\n if (searchInput && searchInput != view.root.activeElement) {\n let query = defaultQuery(view.state, state.query.spec);\n if (query.valid)\n view.dispatch({ effects: setSearchQuery.of(query) });\n searchInput.focus();\n searchInput.select();\n }\n }\n else {\n view.dispatch({ effects: [\n togglePanel.of(true),\n state ? setSearchQuery.of(defaultQuery(view.state, state.query.spec)) : StateEffect.appendConfig.of(searchExtensions)\n ] });\n }\n return true;\n};\n/**\nClose the search panel.\n*/\nconst closeSearchPanel = view => {\n let state = view.state.field(searchState, false);\n if (!state || !state.panel)\n return false;\n let panel = getPanel(view, createSearchPanel);\n if (panel && panel.dom.contains(view.root.activeElement))\n view.focus();\n view.dispatch({ effects: togglePanel.of(false) });\n return true;\n};\n/**\nDefault search-related key bindings.\n\n - Mod-f: [`openSearchPanel`](https://codemirror.net/6/docs/ref/#search.openSearchPanel)\n - F3, Mod-g: [`findNext`](https://codemirror.net/6/docs/ref/#search.findNext)\n - Shift-F3, Shift-Mod-g: [`findPrevious`](https://codemirror.net/6/docs/ref/#search.findPrevious)\n - Mod-Alt-g: [`gotoLine`](https://codemirror.net/6/docs/ref/#search.gotoLine)\n - Mod-d: [`selectNextOccurrence`](https://codemirror.net/6/docs/ref/#search.selectNextOccurrence)\n*/\nconst searchKeymap = [\n { key: \"Mod-f\", run: openSearchPanel, scope: \"editor search-panel\" },\n { key: \"F3\", run: findNext, shift: findPrevious, scope: \"editor search-panel\", preventDefault: true },\n { key: \"Mod-g\", run: findNext, shift: findPrevious, scope: \"editor search-panel\", preventDefault: true },\n { key: \"Escape\", run: closeSearchPanel, scope: \"editor search-panel\" },\n { key: \"Mod-Shift-l\", run: selectSelectionMatches },\n { key: \"Mod-Alt-g\", run: gotoLine },\n { key: \"Mod-d\", run: selectNextOccurrence, preventDefault: true },\n];\nclass SearchPanel {\n constructor(view) {\n this.view = view;\n let query = this.query = view.state.field(searchState).query.spec;\n this.commit = this.commit.bind(this);\n this.searchField = elt(\"input\", {\n value: query.search,\n placeholder: phrase(view, \"Find\"),\n \"aria-label\": phrase(view, \"Find\"),\n class: \"cm-textfield\",\n name: \"search\",\n form: \"\",\n \"main-field\": \"true\",\n onchange: this.commit,\n onkeyup: this.commit\n });\n this.replaceField = elt(\"input\", {\n value: query.replace,\n placeholder: phrase(view, \"Replace\"),\n \"aria-label\": phrase(view, \"Replace\"),\n class: \"cm-textfield\",\n name: \"replace\",\n form: \"\",\n onchange: this.commit,\n onkeyup: this.commit\n });\n this.caseField = elt(\"input\", {\n type: \"checkbox\",\n name: \"case\",\n form: \"\",\n checked: query.caseSensitive,\n onchange: this.commit\n });\n this.reField = elt(\"input\", {\n type: \"checkbox\",\n name: \"re\",\n form: \"\",\n checked: query.regexp,\n onchange: this.commit\n });\n this.wordField = elt(\"input\", {\n type: \"checkbox\",\n name: \"word\",\n form: \"\",\n checked: query.wholeWord,\n onchange: this.commit\n });\n function button(name, onclick, content) {\n return elt(\"button\", { class: \"cm-button\", name, onclick, type: \"button\" }, content);\n }\n this.dom = elt(\"div\", { onkeydown: (e) => this.keydown(e), class: \"cm-search\" }, [\n this.searchField,\n button(\"next\", () => findNext(view), [phrase(view, \"next\")]),\n button(\"prev\", () => findPrevious(view), [phrase(view, \"previous\")]),\n button(\"select\", () => selectMatches(view), [phrase(view, \"all\")]),\n elt(\"label\", null, [this.caseField, phrase(view, \"match case\")]),\n elt(\"label\", null, [this.reField, phrase(view, \"regexp\")]),\n elt(\"label\", null, [this.wordField, phrase(view, \"by word\")]),\n ...view.state.readOnly ? [] : [\n elt(\"br\"),\n this.replaceField,\n button(\"replace\", () => replaceNext(view), [phrase(view, \"replace\")]),\n button(\"replaceAll\", () => replaceAll(view), [phrase(view, \"replace all\")])\n ],\n elt(\"button\", {\n name: \"close\",\n onclick: () => closeSearchPanel(view),\n \"aria-label\": phrase(view, \"close\"),\n type: \"button\"\n }, [\"×\"])\n ]);\n }\n commit() {\n let query = new SearchQuery({\n search: this.searchField.value,\n caseSensitive: this.caseField.checked,\n regexp: this.reField.checked,\n wholeWord: this.wordField.checked,\n replace: this.replaceField.value,\n });\n if (!query.eq(this.query)) {\n this.query = query;\n this.view.dispatch({ effects: setSearchQuery.of(query) });\n }\n }\n keydown(e) {\n if (runScopeHandlers(this.view, e, \"search-panel\")) {\n e.preventDefault();\n }\n else if (e.keyCode == 13 && e.target == this.searchField) {\n e.preventDefault();\n (e.shiftKey ? findPrevious : findNext)(this.view);\n }\n else if (e.keyCode == 13 && e.target == this.replaceField) {\n e.preventDefault();\n replaceNext(this.view);\n }\n }\n update(update) {\n for (let tr of update.transactions)\n for (let effect of tr.effects) {\n if (effect.is(setSearchQuery) && !effect.value.eq(this.query))\n this.setQuery(effect.value);\n }\n }\n setQuery(query) {\n this.query = query;\n this.searchField.value = query.search;\n this.replaceField.value = query.replace;\n this.caseField.checked = query.caseSensitive;\n this.reField.checked = query.regexp;\n this.wordField.checked = query.wholeWord;\n }\n mount() {\n this.searchField.select();\n }\n get pos() { return 80; }\n get top() { return this.view.state.facet(searchConfigFacet).top; }\n}\nfunction phrase(view, phrase) { return view.state.phrase(phrase); }\nconst AnnounceMargin = 30;\nconst Break = /[\\s\\.,:;?!]/;\nfunction announceMatch(view, { from, to }) {\n let line = view.state.doc.lineAt(from), lineEnd = view.state.doc.lineAt(to).to;\n let start = Math.max(line.from, from - AnnounceMargin), end = Math.min(lineEnd, to + AnnounceMargin);\n let text = view.state.sliceDoc(start, end);\n if (start != line.from) {\n for (let i = 0; i < AnnounceMargin; i++)\n if (!Break.test(text[i + 1]) && Break.test(text[i])) {\n text = text.slice(i);\n break;\n }\n }\n if (end != lineEnd) {\n for (let i = text.length - 1; i > text.length - AnnounceMargin; i--)\n if (!Break.test(text[i - 1]) && Break.test(text[i])) {\n text = text.slice(0, i);\n break;\n }\n }\n return EditorView.announce.of(`${view.state.phrase(\"current match\")}. ${text} ${view.state.phrase(\"on line\")} ${line.number}.`);\n}\nconst baseTheme = /*@__PURE__*/EditorView.baseTheme({\n \".cm-panel.cm-search\": {\n padding: \"2px 6px 4px\",\n position: \"relative\",\n \"& [name=close]\": {\n position: \"absolute\",\n top: \"0\",\n right: \"4px\",\n backgroundColor: \"inherit\",\n border: \"none\",\n font: \"inherit\",\n padding: 0,\n margin: 0\n },\n \"& input, & button, & label\": {\n margin: \".2em .6em .2em 0\"\n },\n \"& input[type=checkbox]\": {\n marginRight: \".2em\"\n },\n \"& label\": {\n fontSize: \"80%\",\n whiteSpace: \"pre\"\n }\n },\n \"&light .cm-searchMatch\": { backgroundColor: \"#ffff0054\" },\n \"&dark .cm-searchMatch\": { backgroundColor: \"#00ffff8a\" },\n \"&light .cm-searchMatch-selected\": { backgroundColor: \"#ff6a0054\" },\n \"&dark .cm-searchMatch-selected\": { backgroundColor: \"#ff00ff8a\" }\n});\nconst searchExtensions = [\n searchState,\n /*@__PURE__*/Prec.low(searchHighlighter),\n baseTheme\n];\n\nexport { RegExpCursor, SearchCursor, SearchQuery, closeSearchPanel, findNext, findPrevious, getSearchQuery, gotoLine, highlightSelectionMatches, openSearchPanel, replaceAll, replaceNext, search, searchKeymap, searchPanelOpen, selectMatches, selectNextOccurrence, selectSelectionMatches, setSearchQuery };\n","import { StreamLanguage, HighlightStyle, syntaxHighlighting } from '@codemirror/language';\r\nimport { tags } from '@lezer/highlight';\r\nimport type { StringStream } from '@codemirror/language';\r\nimport { COMMAND_NAMES } from './commands';\r\n\r\nconst COMMANDS = new Set(COMMAND_NAMES);\r\n\r\ninterface PwState {\r\n commandSeen: boolean;\r\n}\r\n\r\nfunction token(stream: StringStream, state: PwState): string | null {\r\n if (stream.sol()) state.commandSeen = false;\r\n\r\n if (stream.eatSpace()) return null;\r\n\r\n // Comments: # to end of line (only before command)\r\n if (!state.commandSeen && stream.peek() === '#') {\r\n stream.skipToEnd();\r\n return 'comment';\r\n }\r\n\r\n // Command: first word on the line\r\n if (!state.commandSeen) {\r\n const word = stream.match(/^[\\w-]+/) as RegExpMatchArray | null;\r\n if (word) {\r\n state.commandSeen = true;\r\n if (COMMANDS.has(word[0])) return 'keyword';\r\n }\r\n return null;\r\n }\r\n\r\n // Quoted strings: \"...\" or '...'\r\n const ch = stream.peek();\r\n if (ch === '\"' || ch === \"'\") {\r\n const quote = stream.next();\r\n while (!stream.eol()) {\r\n const c = stream.next();\r\n if (c === '\\\\') stream.next();\r\n else if (c === quote) break;\r\n }\r\n return 'string';\r\n }\r\n\r\n // Flags: --word\r\n if (stream.match(/^--[\\w-]+/)) return 'attributeName';\r\n\r\n // URLs: http:// or https://\r\n if (stream.match(/^https?:\\/\\/\\S+/)) return 'url';\r\n\r\n // Everything else\r\n stream.next();\r\n return null;\r\n}\r\n\r\nexport const pwLanguage = StreamLanguage.define<PwState>({\r\n startState: () => ({ commandSeen: false }),\r\n token,\r\n});\r\n\r\nconst pwHighlightStyle = HighlightStyle.define([\r\n { tag: tags.keyword, color: 'var(--color-command)' },\r\n { tag: tags.comment, color: 'var(--color-comment)', fontStyle: 'italic' },\r\n { tag: tags.string, color: 'var(--color-string)' },\r\n { tag: tags.attributeName, color: 'var(--color-flag)' },\r\n { tag: tags.url, color: 'var(--color-url)', textDecoration: 'underline' },\r\n]);\r\n\r\nexport const pwSyntax = [\r\n pwLanguage,\r\n syntaxHighlighting(pwHighlightStyle),\r\n];\r\n","\r\nimport { EditorView } from \"codemirror\";\r\nimport { lineNumbers, highlightActiveLineGutter, highlightActiveLine, keymap, placeholder, WidgetType } from '@codemirror/view';\r\nimport { history, historyKeymap, defaultKeymap } from '@codemirror/commands';\r\nimport { bracketMatching, syntaxHighlighting, HighlightStyle } from '@codemirror/language';\r\nimport { tags } from '@lezer/highlight';\r\nimport { javascript, javascriptLanguage } from '@codemirror/lang-javascript';\r\nimport { pwSyntax } from './pw-language';\r\nimport { search, searchKeymap } from '@codemirror/search';\r\nimport { StateEffect, StateField, EditorState, RangeSet, Compartment, Range } from '@codemirror/state';\r\nimport { Decoration, GutterMarker, gutter } from '@codemirror/view';\r\nimport { autocompletion, acceptCompletion, closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete';\r\nimport { pwCompletion } from './pw-completion'\r\nimport { playwrightCompletions } from './pw-completion-source'\r\n\r\nexport type InlineValues = Map<number, string>;\r\n\r\nconst pwTheme = EditorView.theme({\r\n '&': {\r\n backgroundColor: 'var(--bg-editor)',\r\n color: 'var(--text-default)',\r\n height: '100%',\r\n fontSize: '13px',\r\n fontFamily: '\"Cascadia Code\", \"Fira Code\", \"Consolas\", \"Courier New\", monospace'\r\n },\r\n '.cm-content': { // the editable area\r\n caretColor: 'var(--color-caret)',\r\n lineHeight: '18px',\r\n padding: '8px 0',\r\n },\r\n '.cm-cursor': { // blinking cursor\r\n borderLeftColor: 'var(--color-caret)',\r\n },\r\n '&:not(.cm-focused) .cm-cursorLayer': { // keep cursor visible when unfocused (e.g. during recording)\r\n visibility: 'visible',\r\n animation: 'none',\r\n },\r\n '.cm-gutters': { // line number column\r\n backgroundColor: 'var(--bg-editor)',\r\n color: 'var(--text-line-numbers)',\r\n borderRight: '1px solid var(--border-primary)',\r\n },\r\n '.cm-activeLineGutter': { // gutter on active line\r\n backgroundColor: 'var(--bg-line-highlight)',\r\n },\r\n '.cm-activeLine': { // active line background\r\n backgroundColor: 'var(--bg-line-highlight)',\r\n },\r\n '&.cm-focused': { // remove default focus outline\r\n outline: 'none',\r\n },\r\n '.cm-scroller': { // scrollable container\r\n overflow: 'auto',\r\n },\r\n '.cm-run-line': {\r\n background: 'var(--bg-run-line)'\r\n },\r\n '.cm-tooltip-autocomplete': {\r\n backgroundColor: 'var(--bg-toolbar)',\r\n border: '1px solid var(--border-primary)',\r\n boxShadow: '0 2px 8px rgba(0,0,0,0.2)',\r\n },\r\n '.cm-tooltip-autocomplete ul li[aria-selected]': {\r\n backgroundColor: 'var(--bg-button)',\r\n },\r\n '.cm-breakpoint-gutter': { width: '16px' },\r\n '.cm-breakpoint-gutter .cm-gutterElement': { cursor: 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center' },\r\n '.cm-inline-values': {\r\n color: 'var(--color-inline-value)',\r\n fontStyle: 'italic',\r\n opacity: '0.7',\r\n pointerEvents: 'none',\r\n },\r\n\r\n});\r\n\r\nexport const setRunLineEffect = StateEffect.define<number>(); // -1 = none\r\nexport const setLineResultsEffect = StateEffect.define<(string | null)[]>(); // per-line\r\nexport const toggleBreakpointEffect = StateEffect.define<number>();\r\nexport const setInlineValuesEffect = StateEffect.define<InlineValues>();\r\n\r\nconst runLineField = StateField.define<number>({\r\n create: () => -1,\r\n update(value, tr) {\r\n for (const e of tr.effects) {\r\n if (e.is(setRunLineEffect)) return e.value;\r\n }\r\n return value;\r\n },\r\n});\r\n\r\nconst lineResultsField = StateField.define<(string | null)[]>({\r\n create: () => [],\r\n update(value, tr) {\r\n for (const e of tr.effects) {\r\n if (e.is(setLineResultsEffect)) return e.value;\r\n }\r\n return value;\r\n },\r\n});\r\n\r\nexport const breakpointField = StateField.define<Set<number>>({\r\n create: () => new Set(),\r\n update(value, tr) {\r\n let set = value;\r\n if (tr.docChanged) {\r\n const newSet = new Set<number>();\r\n for (const bp of set) {\r\n if (bp >= tr.startState.doc.lines) continue;\r\n const line = tr.startState.doc.line(bp + 1);\r\n const mapped = tr.changes.mapPos(line.from, 1);\r\n if (mapped <= tr.newDoc.length) {\r\n newSet.add(tr.newDoc.lineAt(mapped).number - 1);\r\n }\r\n }\r\n set = newSet;\r\n }\r\n for (const e of tr.effects) {\r\n if (e.is(toggleBreakpointEffect)) {\r\n const next = new Set(set);\r\n if (next.has(e.value)) next.delete(e.value);\r\n else next.add(e.value);\r\n set = next;\r\n }\r\n }\r\n return set;\r\n },\r\n});\r\n\r\nconst inlineValuesField = StateField.define<InlineValues>({\r\n create: () => new Map(),\r\n update(value, tr) {\r\n for (const e of tr.effects) {\r\n if (e.is(setInlineValuesEffect)) return e.value;\r\n }\r\n return value;\r\n }\r\n});\r\n\r\nconst runLineHighlight = EditorView.decorations.compute(\r\n [runLineField],\r\n (state) => {\r\n const lineNum = state.field(runLineField);\r\n if (lineNum < 0 || lineNum >= state.doc.lines) return Decoration.none;\r\n const line = state.doc.line(lineNum + 1); // CM6 lines are 1-indexed\r\n return Decoration.set([\r\n Decoration.line({ class: 'cm-run-line' }).range(line.from),\r\n ]);\r\n }\r\n);\r\n\r\nconst inlineValuesDecoration = EditorView.decorations.compute(\r\n [inlineValuesField],\r\n (state) => {\r\n const values = state.field(inlineValuesField);\r\n if (values.size === 0) return Decoration.none;\r\n const decorations: Range<Decoration>[] = [];\r\n for (const [lineNum, text] of values) {\r\n if (lineNum < 0 || lineNum >= state.doc.lines ) continue;\r\n const line = state.doc.line(lineNum + 1);\r\n decorations.push(\r\n Decoration.widget({\r\n widget: new InlineValueWidget(text),\r\n side: 1,\r\n }).range(line.to)\r\n );\r\n }\r\n return Decoration.set(decorations, true);\r\n }\r\n)\r\nclass ResultMarker extends GutterMarker {\r\n constructor(readonly result: string) { super(); }\r\n toDOM() {\r\n const span = document.createElement('span');\r\n span.textContent = this.result === 'pass' ? '✓' : '✗';\r\n span.style.color = this.result === 'pass'\r\n ? 'var(--color-line-pass)'\r\n : 'var(--color-line-fail)';\r\n return span;\r\n }\r\n}\r\n\r\nclass BreakpointMarker extends GutterMarker {\r\n toDOM() {\r\n const dot = document.createElement('span');\r\n dot.dataset.testid = 'breakpoint-marker';\r\n dot.style.cssText = 'width:10px;height:10px;border-radius:50%;background:var(--color-breakpoint);display:inline-block;';\r\n return dot;\r\n }\r\n}\r\n\r\nclass InlineValueWidget extends WidgetType {\r\n constructor(readonly text: string) { super();}\r\n toDOM() {\r\n const span = document.createElement('span');\r\n span.className = 'cm-inline-values';\r\n span.textContent = ' ' + this.text;\r\n return span;\r\n }\r\n eq(other: InlineValueWidget) { return this.text === other.text; }\r\n}\r\n\r\nconst resultGutter = gutter({\r\n class: 'cm-result-gutter',\r\n markers(view) {\r\n const results = view.state.field(lineResultsField);\r\n const markers: any[] = [];\r\n for (let i = 0; i < results.length && i < view.state.doc.lines; i++) {\r\n if (results[i]) {\r\n const line = view.state.doc.line(i + 1);\r\n markers.push(new ResultMarker(results[i]!).range(line.from));\r\n }\r\n }\r\n return RangeSet.of(markers);\r\n },\r\n});\r\n\r\nconst breakpointGutter = gutter({\r\n class: 'cm-breakpoint-gutter',\r\n markers(view) {\r\n const bps = view.state.field(breakpointField);\r\n const markers: any[] = [];\r\n for (const lineNum of bps) {\r\n if (lineNum < view.state.doc.lines) {\r\n const line = view.state.doc.line(lineNum + 1);\r\n markers.push(new BreakpointMarker().range(line.from));\r\n }\r\n }\r\n return RangeSet.of(markers, true);\r\n },\r\n domEventHandlers: {\r\n mousedown(view, line) {\r\n const lineNum = view.state.doc.lineAt(line.from).number - 1;\r\n view.dispatch({ effects: toggleBreakpointEffect.of(lineNum) });\r\n return true;\r\n },\r\n },\r\n});\r\n\r\nexport function dispatchRunState(\r\n view: EditorView,\r\n runLine: number,\r\n lineResults: (string | null)[],\r\n inlineValues: InlineValues = new Map(),\r\n) {\r\n view.dispatch({\r\n effects: [\r\n setRunLineEffect.of(runLine),\r\n setLineResultsEffect.of(lineResults),\r\n setInlineValuesEffect.of(inlineValues),\r\n ],\r\n });\r\n}\r\n\r\nexport const languageCompartment = new Compartment();\r\n\r\nconst jsHighlightStyle = HighlightStyle.define([\r\n { tag: tags.keyword, color: 'var(--color-command)' },\r\n { tag: tags.string, color: 'var(--color-string)' },\r\n { tag: tags.number, color: 'var(--color-url)' },\r\n { tag: tags.bool, color: 'var(--color-url)' },\r\n { tag: tags.null, color: 'var(--text-dim)', fontStyle: 'italic' },\r\n { tag: tags.comment, color: 'var(--color-comment)', fontStyle: 'italic' },\r\n { tag: tags.propertyName, color: 'var(--color-flag)' },\r\n { tag: tags.definition(tags.variableName),color: 'var(--color-active-line)' },\r\n]);\r\n\r\nexport const pwModeExtension = [\r\n ...pwSyntax,\r\n autocompletion({ override: [pwCompletion], icons: false }),\r\n placeholder('# Type or open a .pw script...'),\r\n];\r\n\r\nexport const jsModeExtension = [\r\n javascript(),\r\n javascriptLanguage.data.of({ autocomplete: playwrightCompletions }),\r\n syntaxHighlighting(jsHighlightStyle),\r\n autocompletion({ icons: false }),\r\n placeholder('// Type JavaScript...'),\r\n];\r\n\r\nexport const baseExtensions = [\r\n languageCompartment.of(pwModeExtension), // dynamic language compartment\r\n breakpointField, // ← breakpoint state (must register before gutter)\r\n breakpointGutter, // ← clickable breakpoint dots (leftmost gutter)\r\n lineNumbers(), // built-in line numbers\r\n highlightActiveLineGutter(), // highlights gutter on cursor line\r\n highlightActiveLine(), // highlights content on cursor line\r\n history(), // undo/redo stack\r\n bracketMatching(), // highlight matching brackets\r\n closeBrackets(), // auto-insert closing ), ], }, \", '\r\n search(), // Ctrl+F search panel\r\n keymap.of([\r\n { key: 'Tab', run: acceptCompletion }, // accept completion with Tab\r\n ...closeBracketsKeymap, // Backspace deletes both brackets\r\n ...defaultKeymap, // basic editing keys\r\n ...historyKeymap, // Ctrl+Z, Ctrl+Y\r\n ...searchKeymap, // Ctrl+F, Ctrl+H\r\n ]),\r\n EditorState.tabSize.of(2), // tab = 2 spaces\r\n pwTheme,\r\n runLineField, // ← register the StateField so CM6 tracks it\r\n lineResultsField, // ← register the StateField so CM6 tracks it\r\n runLineHighlight, // ← decoration that reads runLineField\r\n resultGutter, // ← gutter that reads lineResultsField\r\n inlineValuesField,\r\n inlineValuesDecoration\r\n];\r\n\r\n","import { useRef, useEffect, useImperativeHandle } from 'react';\r\nimport { EditorView } from 'codemirror';\r\nimport { baseExtensions, dispatchRunState, languageCompartment, pwModeExtension, jsModeExtension } from '@/lib/codemirror-setup';\r\nimport type { PanelState, Action } from \"@/reducer\";\r\nimport { breakpointField } from '@/lib/codemirror-setup';\r\nimport { InlineValues } from '@/lib/codemirror-setup';\r\n\r\nexport interface EditorHandle {\r\n insertAtCursor: (text: string) => void;\r\n replaceLastInsert: (text: string) => void;\r\n}\r\n\r\ninterface EditorPaneProps extends Pick<PanelState, 'editorContent' | 'currentRunLine' | 'lineResults' | 'editorMode'> {\r\n dispatch: React.Dispatch<Action>\r\n ref?: React.Ref<EditorHandle | null>\r\n containerRef?: React.Ref<HTMLDivElement>\r\n inlineValues: InlineValues\r\n}\r\n\r\n\r\nfunction CodeMirrorEditorPane({ editorContent, editorMode, currentRunLine, lineResults, dispatch, ref, containerRef, inlineValues }: EditorPaneProps) {\r\n const cmContainerRef = useRef<HTMLDivElement>(null);\r\n const viewRef = useRef<EditorView>(null);\r\n const externalUpdateRef = useRef(false);\r\n const lastInsertRangeRef = useRef<{ from: number; to: number } | null>(null);\r\n\r\n useImperativeHandle(ref, () => ({\r\n insertAtCursor(text: string) {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n const { from } = view.state.selection.main;\r\n const before = view.state.doc.sliceString(Math.max(0, from - 1), from);\r\n const insert = (before && before !== '\\n' ? '\\n' : '') + text;\r\n const insertFrom = from;\r\n view.dispatch({\r\n changes: { from, to: from, insert },\r\n selection: { anchor: from + insert.length },\r\n scrollIntoView: true,\r\n });\r\n lastInsertRangeRef.current = { from: insertFrom, to: insertFrom + insert.length };\r\n view.focus();\r\n },\r\n replaceLastInsert(text: string) {\r\n const view = viewRef.current;\r\n const range = lastInsertRangeRef.current;\r\n if (!view || !range) return;\r\n const before = view.state.doc.sliceString(Math.max(0, range.from - 1), range.from);\r\n const insert = (before && before !== '\\n' ? '\\n' : '') + text;\r\n view.dispatch({\r\n changes: { from: range.from, to: range.to, insert },\r\n selection: { anchor: range.from + insert.length },\r\n scrollIntoView: true,\r\n });\r\n lastInsertRangeRef.current = { from: range.from, to: range.from + insert.length };\r\n view.focus();\r\n },\r\n }));\r\n\r\n useEffect(() => {\r\n const view = new EditorView({\r\n doc: editorContent,\r\n extensions: [\r\n ...baseExtensions,\r\n EditorView.updateListener.of((update) => {\r\n if (update.docChanged && !externalUpdateRef.current) {\r\n dispatch({ type: 'EDIT_EDITOR_CONTENT', content: update.state.doc.toString() });\r\n }\r\n const oldBps = update.startState.field(breakpointField);\r\n const newBps = update.state.field(breakpointField);\r\n if (oldBps !== newBps) {\r\n dispatch({ type: 'SET_BREAKPOINTS', breakPoints: newBps });\r\n }\r\n }),\r\n ],\r\n parent: cmContainerRef.current!,\r\n });\r\n viewRef.current = view;\r\n return () => view.destroy();\r\n }, []);\r\n\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if(!view) return;\r\n if(view.state.doc.toString() === editorContent) return;\r\n externalUpdateRef.current = true;\r\n view.dispatch({ changes: { from: 0, to: view.state.doc.length, insert: editorContent } });\r\n view.dispatch({ selection: { anchor: view.state.doc.length }, scrollIntoView: true });\r\n externalUpdateRef.current = false;\r\n view.focus();\r\n }, [editorContent]);\r\n\r\n useEffect(()=> {\r\n const view = viewRef.current;\r\n if(!view) return;\r\n dispatchRunState(view, currentRunLine, lineResults, inlineValues ?? new Map());\r\n }, [currentRunLine, lineResults, inlineValues]);\r\n\r\n useEffect(() => {\r\n const view = viewRef.current;\r\n if (!view) return;\r\n view.dispatch({ effects: languageCompartment.reconfigure(editorMode === 'js' ? jsModeExtension : pwModeExtension) });\r\n }, [editorMode]);\r\n\r\n\r\n return (\r\n <div id=\"editor-pane\" ref={containerRef} data-testid=\"editor\" className=\"flex flex-1 min-h-[80px] overflow-hidden bg-(--bg-editor)\">\r\n <div ref={cmContainerRef} className='flex-1' />\r\n </div>\r\n )\r\n}\r\n\r\nexport default CodeMirrorEditorPane;\r\n","import { useEffect, useState, useRef } from 'react';\r\n\r\ninterface SplitterProps {\r\n editorPaneRef: React.RefObject<HTMLDivElement | null>\r\n}\r\nfunction Splitter({editorPaneRef}: SplitterProps) {\r\n const [isDragging, setIsDragging] = useState(false);\r\n const dragStartY = useRef(0);\r\n const dragStartHeight = useRef(0);\r\n\r\n function handleMouseMove(event: MouseEvent) {\r\n const delta = event.clientY - dragStartY.current;\r\n const newHeight = dragStartHeight.current + delta;\r\n const minHeight = 80;\r\n const clamped = Math.max(minHeight, Math.min(newHeight, window.innerHeight - minHeight));\r\n editorPaneRef.current!.style.flex = `0 0 ${clamped}px`;\r\n };\r\n\r\n function handleMouseUp() {\r\n setIsDragging(false);\r\n dragStartHeight.current = 0;\r\n dragStartY.current = 0;\r\n document.body.style.cursor = '';\r\n document.body.style.userSelect = '';\r\n }\r\n\r\n function handleMouseDown(event: React.MouseEvent<HTMLDivElement>) {\r\n document.body.style.cursor = 'row-resize';\r\n document.body.style.userSelect = 'none';\r\n dragStartY.current = event.clientY;\r\n const editorPane = editorPaneRef.current;\r\n dragStartHeight.current = editorPane!.offsetHeight;\r\n setIsDragging(true);\r\n }\r\n\r\n useEffect(() => {\r\n if(isDragging) {\r\n document.addEventListener('mousemove', handleMouseMove);\r\n document.addEventListener('mouseup', handleMouseUp)\r\n } else {\r\n document.removeEventListener('mousemove', handleMouseMove);\r\n document.removeEventListener('mouseup', handleMouseUp)\r\n }\r\n return () => {\r\n document.removeEventListener('mousemove', handleMouseMove);\r\n document.removeEventListener('mouseup', handleMouseUp)\r\n }\r\n }, [isDragging])\r\n return (\r\n <div\r\n id=\"splitter\"\r\n className=\"h-[6px] bg-(--bg-splitter) cursor-row-resize shrink-0 flex items-center justify-center border-y border-(--border-primary)\"\r\n onMouseDown={handleMouseDown}>\r\n <div\r\n id=\"splitter-handle\"\r\n className=\"w-10 h-[2px] bg-(--color-splitter-handle) rounded-[1px]\"\r\n >\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nexport default Splitter;","\r\n\r\nimport { useState, useEffect, useRef } from 'react';\r\nimport { ScopeInfo } from '@/lib/sw-debugger';\r\nimport { swGetProperties } from '@/lib/sw-debugger';\r\nimport { fromCdpGetProperties } from '@/components/Console/cdpToSerialized';\r\nimport { ObjectTree } from '@/components/Console/ObjectTree';\r\nimport type { SerializedValue } from '@/components/Console/types';\r\n\r\n\r\n\r\ninterface VariablePaneProps {\r\n scopeData: ScopeInfo[];\r\n onLocalProps?: (props: Record<string, SerializedValue> | null) => void;\r\n}\r\n\r\ninterface ScopeSectionProps {\r\n scope: ScopeInfo;\r\n defaultOpen: boolean,\r\n onLocalProps?: (props: Record<string, SerializedValue> | null) => void;\r\n}\r\nfunction ScopeSection({ scope, defaultOpen, onLocalProps }: ScopeSectionProps) {\r\n const [open, setOpen] = useState(defaultOpen);\r\n const [props, setProps] = useState<Record<string, SerializedValue> | null>(null);\r\n const [loading, setLoading] = useState(false);\r\n const prevObjectId = useRef(scope.objectId);\r\n\r\n useEffect(() => {\r\n if (open && !props) fetchProps();\r\n }, [open]);\r\n\r\n useEffect(() => {\r\n if (scope.objectId != prevObjectId.current) {\r\n prevObjectId.current = scope.objectId;\r\n setProps(null);\r\n if (open) fetchProps();\r\n }\r\n }, [scope.objectId]);\r\n\r\n function fetchProps() {\r\n setLoading(true);\r\n swGetProperties(scope.objectId).then(raw => {\r\n const parsed = fromCdpGetProperties(raw);\r\n setProps(parsed);\r\n setLoading(false);\r\n onLocalProps?.(parsed);\r\n });\r\n }\r\n\r\n const title = scope.type === 'local' ? 'Local'\r\n : scope.type === 'closure' ? (scope.name ? `Closure (${scope.name})` : 'Closure')\r\n : scope.type === 'script' ? 'Script'\r\n : scope.type === 'block' ? 'Block'\r\n : scope.type;\r\n\r\n return (\r\n <div>\r\n <div className=\"ot-toggle\" onClick={()=> setOpen( o => !o)}>\r\n {open ? '▼' : '▶'} {title}\r\n </div> \r\n {open && (\r\n <div className='ot-children'>\r\n {loading ? <span className='ot-empty'>Loading ...</span>\r\n : props && Object.entries(props).map(([k, v]) => (\r\n <div key={k} className='ot-row'>\r\n <ObjectTree data={v} label={k} getProperties={swGetProperties} />\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n )\r\n\r\n}\r\n\r\n\r\nexport function VariablePane({ scopeData, onLocalProps }: VariablePaneProps) {\r\n return (\r\n <div className=\"overflow-auto flex-1 p-2\">\r\n { scopeData.length === 0 \r\n ? <div className='ot-empty'>No local variables</div>\r\n : scopeData.map((scope) => (\r\n <ScopeSection \r\n key={scope.objectId} \r\n scope={scope} \r\n defaultOpen={scope.type === 'local'} \r\n onLocalProps={(scope.type === 'local' || scope.type === 'block') ? onLocalProps : undefined }/>\r\n ))\r\n }\r\n </div>\r\n );\r\n}","import { Console } from './Console';\r\nimport { VariablePane } from './VariablePane';\r\nimport type { PanelState, Action } from \"@/reducer\";\r\nimport type { SerializedValue } from '@/components/Console/types';\r\n\r\ninterface BottomPaneProps extends Pick<PanelState, 'isStepDebugging' | 'bottomTab' | 'outputLines'| 'scopeData'> {\r\n dispatch: React.Dispatch<Action>,\r\n onLocalProps?: (props: Record<string, SerializedValue> | null) => void;\r\n};\r\n\r\nexport function BottomPane({isStepDebugging, bottomTab, outputLines, dispatch, scopeData, onLocalProps }: BottomPaneProps) {\r\n return (\r\n <div className=\"flex flex-col flex-1 min-h-20 overflow-hidden\" data-testid=\"bottom-pane\">\r\n {/* Tab bar */}\r\n <div className=\"flex items-center gap-3 px-2 py-0.5 border-b border-(--border-primary) bg-(--bg-toolbar) shrink-0\">\r\n <button\r\n data-active={bottomTab === 'console' ? '' : undefined}\r\n onClick={() => dispatch({ type: 'SET_BOTTOM_TAB', tab: 'console'})}\r\n data-testid=\"tab-console\"\r\n >Console</button>\r\n {isStepDebugging && (\r\n <button\r\n data-active={bottomTab === 'variables' ? '' : undefined}\r\n onClick={() => dispatch({ type: 'SET_BOTTOM_TAB', tab: 'variables'})}\r\n data-testid=\"tab-variables\"\r\n >Variables</button>\r\n )}\r\n </div>\r\n {/* Tab content */}\r\n { bottomTab === 'console' && <Console outputLines={outputLines} dispatch={dispatch} />}\r\n { bottomTab === 'variables' && isStepDebugging && <VariablePane scopeData={scopeData} onLocalProps={onLocalProps} />}\r\n </div>\r\n \r\n )\r\n}","import type { Action } from '@/reducer';\r\nimport { swDebugResume, swDebugStepOver, swDebugStepInto, swDebugStepOut, swTerminateExecution } from '@/lib/sw-debugger';\r\nimport { ContinueIcon, StepOverIcon, StepIntoIcon, StepOutIcon, RestartIcon, DebugStopIcon } from './Icons';\r\n\r\ninterface DebugBarProps {\r\n dispatch: React.Dispatch<Action>;\r\n}\r\n\r\nfunction DebugBar({ dispatch }: DebugBarProps) {\r\n function handleContinue() {\r\n swDebugResume().catch(e => console.warn('[debug] resume failed:', e));\r\n }\r\n\r\n function handleStepOver() {\r\n swDebugStepOver().catch(e => console.warn('[debug] step-over failed:', e));\r\n }\r\n\r\n function handleStepInto() {\r\n swDebugStepInto().catch(e => console.warn('[debug] step-into failed:', e));\r\n }\r\n\r\n function handleStepOut() {\r\n swDebugStepOut().catch(e => console.warn('[debug] step-out failed:', e));\r\n }\r\n\r\n function handleRestart() {\r\n // Stop current execution, then re-run in debug mode\r\n swTerminateExecution().catch(e => console.warn('[debug] terminate failed:', e));\r\n swDebugResume().catch(e => console.warn('[debug] resume failed:', e));\r\n dispatch({ type: 'RUN_STOP' });\r\n // Re-start is handled by the user clicking Debug again\r\n }\r\n\r\n function handleStop() {\r\n swTerminateExecution().catch(e => console.warn('[debug] terminate failed:', e));\r\n swDebugResume().catch(e => console.warn('[debug] resume failed:', e));\r\n dispatch({ type: 'RUN_STOP' });\r\n }\r\n\r\n return (\r\n <div id=\"debug-bar\" data-testid=\"debug-bar\">\r\n <button data-testid=\"debug-continue\" title=\"Continue (F5)\" onClick={handleContinue}><ContinueIcon size={14} /></button>\r\n <button data-testid=\"debug-step-over\" title=\"Step Over (F10)\" onClick={handleStepOver}><StepOverIcon size={14} /></button>\r\n <button data-testid=\"debug-step-into\" title=\"Step Into (F11)\" onClick={handleStepInto}><StepIntoIcon size={14} /></button>\r\n <button data-testid=\"debug-step-out\" title=\"Step Out (Shift+F11)\" onClick={handleStepOut}><StepOutIcon size={14} /></button>\r\n <span className=\"debug-bar-sep\"></span>\r\n <button data-testid=\"debug-restart\" title=\"Restart (Ctrl+Shift+F5)\" onClick={handleRestart}><RestartIcon size={14} /></button>\r\n <button data-testid=\"debug-stop\" title=\"Stop (Shift+F5)\" onClick={handleStop}><DebugStopIcon size={14} /></button>\r\n </div>\r\n );\r\n}\r\n\r\nexport default DebugBar;\r\n","import { inlineSummary } from '@/components/Console/ObjectTree';\r\nimport type { SerializedValue } from '@/components/Console/types';\r\nimport type { InlineValues } from './codemirror-setup';\r\n\r\nconst MAX_INLINE_LENGTH = 80;\r\n\r\nexport function formatInlineValues(\r\n pausedLine: number,\r\n props: Record<string, SerializedValue> | null,\r\n): InlineValues {\r\n const values = new Map<number, string>();\r\n if (pausedLine < 0 || !props) return values;\r\n\r\n const parts: string[] = [];\r\n for (const [name, val] of Object.entries(props)) {\r\n if (name.startsWith('[[')) continue;\r\n const summary = inlineSummary(val);\r\n if (!summary) continue;\r\n parts.push(`${name} = ${summary}`);\r\n }\r\n if (parts.length > 0) {\r\n let text = parts.join(', ');\r\n if (text.length > MAX_INLINE_LENGTH) text = text.slice(0, MAX_INLINE_LENGTH) + '…';\r\n values.set(pausedLine, text);\r\n }\r\n\r\n return values;\r\n}","import { useReducer, useRef, useEffect, useState, useMemo } from 'react'\r\nimport Toolbar from './components/Toolbar'\r\nimport CodeMirrorEditorPane, { type EditorHandle } from \"./components/CodeMirrorEditorPane\"\r\nimport Splitter from './components/Splitter'\r\nimport { panelReducer, initialState } from './reducer'\r\nimport { attachToTab } from './lib/bridge'\r\nimport { BottomPane } from './components/BottomPane'\r\nimport DebugBar from './components/DebugBar';\r\nimport { onConsoleEvent } from '@/lib/sw-debugger';\r\nimport { loadSettings } from './lib/settings';\r\nimport { SerializedValue } from './components/Console/types'\r\nimport { formatInlineValues } from './lib/inline-values'\r\n\r\nfunction App() {\r\n const [state, dispatch] = useReducer(panelReducer, initialState)\r\n const editorPaneRef = useRef<HTMLDivElement>(null)\r\n const editorRef = useRef<EditorHandle | null>(null);\r\n const attachedTabRef = useRef<number | null>(null);\r\n const [localProps, setLocalProps] = useState<Record<string, SerializedValue> | null>(null);\r\n\r\n const inlineValues = useMemo(\r\n () => formatInlineValues(state.currentRunLine, localProps),\r\n [state.currentRunLine, localProps],\r\n );\r\n\r\n useEffect(() => {\r\n onConsoleEvent((level, args) => {\r\n for (const arg of args) {\r\n const type = level === 'error' ? 'error' : level === 'warn' ? 'info' : 'success';\r\n dispatch({ type: 'ADD_LINE', line: { text: '', type, value: arg } });\r\n }\r\n });\r\n return () => onConsoleEvent(null);\r\n }, [dispatch]);\r\n\r\n useEffect(() => {\r\n loadSettings().then(s => {\r\n dispatch({ type: 'SET_EDITOR_MODE', mode: s.languageMode });\r\n });\r\n }, []);\r\n\r\n async function doAttach(tabId: number) {\r\n dispatch({ type: 'ATTACH_START' });\r\n const res = await attachToTab(tabId);\r\n if (res.ok && res.url) {\r\n attachedTabRef.current = tabId;\r\n dispatch({ type: 'ATTACH_SUCCESS', url: res.url, tabId });\r\n } else {\r\n attachedTabRef.current = null;\r\n dispatch({ type: 'ATTACH_FAIL' });\r\n }\r\n }\r\n\r\n useEffect(() => {\r\n if (!chrome.tabs?.query) return;\r\n\r\n const params = new URLSearchParams(window.location.search);\r\n const tabIdParam = params.get('tabId');\r\n\r\n if (tabIdParam) {\r\n // Popup mode — attach to the specific tab passed in URL\r\n doAttach(Number(tabIdParam));\r\n return;\r\n }\r\n\r\n // Side panel mode — attach to current active tab, then follow tab switches\r\n chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {\r\n const tab = tabs[0];\r\n const url = tab?.url ?? '';\r\n const ownOrigin = `chrome-extension://${chrome.runtime.id}/`;\r\n if (tab?.id && !url.startsWith('chrome://') &&\r\n (!url.startsWith('chrome-extension://') || url.startsWith(ownOrigin))) {\r\n doAttach(tab.id);\r\n }\r\n });\r\n\r\n const onActivated = async (info: chrome.tabs.TabActiveInfo) => {\r\n const tab = await chrome.tabs.get(info.tabId).catch(() => null);\r\n const url = tab?.url ?? '';\r\n if (url.startsWith('chrome-extension://') && !url.startsWith(`chrome-extension://${chrome.runtime.id}/`)) return;\r\n if (url.startsWith('chrome://')) {\r\n attachedTabRef.current = null;\r\n dispatch({ type: 'DETACH' });\r\n return;\r\n }\r\n doAttach(info.tabId);\r\n };\r\n chrome.tabs.onActivated.addListener(onActivated);\r\n\r\n // Auto-attach when the active tab navigates from an internal URL to a regular one\r\n // (e.g. user opens a new tab from chrome://extensions and types a URL).\r\n // Skip if already attached to this tab — re-attaching interrupts in-progress commands.\r\n const onUpdated = (tabId: number, changeInfo: chrome.tabs.TabChangeInfo) => {\r\n if (attachedTabRef.current === tabId) {\r\n if (changeInfo.url) dispatch({ type: 'UPDATE_URL', url: changeInfo.url });\r\n return;\r\n }\r\n if (changeInfo.url && !changeInfo.url.startsWith('chrome://') &&\r\n (!changeInfo.url.startsWith('chrome-extension://') || changeInfo.url.startsWith(`chrome-extension://${chrome.runtime.id}/`))) {\r\n chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {\r\n if (tabs[0]?.id === tabId) doAttach(tabId);\r\n });\r\n }\r\n };\r\n chrome.tabs.onUpdated.addListener(onUpdated);\r\n\r\n return () => {\r\n chrome.tabs.onActivated.removeListener(onActivated);\r\n chrome.tabs.onUpdated.removeListener(onUpdated);\r\n };\r\n }, []);\r\n\r\n return (\r\n <>\r\n {/* Toolbar + floating debug bar */}\r\n <Toolbar\r\n editorContent={state.editorContent}\r\n editorMode={state.editorMode}\r\n stepLine={state.stepLine}\r\n isRunning={state.isRunning}\r\n isStepDebugging={state.isStepDebugging}\r\n attachedUrl={state.attachedUrl}\r\n attachedTabId={state.attachedTabId}\r\n isAttaching={state.isAttaching}\r\n dispatch={dispatch}\r\n editorRef={editorRef}\r\n breakPoints={state.breakPoints}\r\n />\r\n {state.isStepDebugging && <DebugBar dispatch={dispatch} />}\r\n\r\n {/* Editor pane */}\r\n <div ref={editorPaneRef} style={{ display: 'flex', flexDirection: 'column', flex: 1, minHeight: 80, overflow: 'hidden' }}>\r\n <CodeMirrorEditorPane\r\n ref={editorRef}\r\n editorContent={state.editorContent}\r\n editorMode={state.editorMode}\r\n currentRunLine={state.currentRunLine}\r\n lineResults={state.lineResults}\r\n inlineValues={inlineValues}\r\n dispatch={dispatch}\r\n />\r\n </div>\r\n\r\n {/* Splitter */}\r\n <Splitter editorPaneRef={editorPaneRef} />\r\n\r\n <BottomPane \r\n outputLines={state.outputLines} \r\n dispatch={dispatch}\r\n bottomTab={state.bottomTab}\r\n isStepDebugging={state.isStepDebugging}\r\n scopeData={state.scopeData} \r\n onLocalProps={setLocalProps}\r\n />\r\n </>\r\n )\r\n}\r\n\r\nexport default App\r\n","import './panel.css'\r\nimport { createRoot } from 'react-dom/client'\r\nimport App from './App'\r\n\r\ncreateRoot(document.getElementById('root')!).render(\r\n <App />\r\n)\r\n"],"names":["jsxs","jsx","useRef","useState","useMemo","useEffect","tab","nextStepLine","r","line","word","from","to","elt","phrase","useImperativeHandle","useReducer","Fragment","createRoot"],"mappings":"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","x_google_ignoreList":[2]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preferences.js","sources":["../../src/preferences/PreferencesForm.tsx","../../src/preferences/preferences.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\r\nimport { loadSettings, storeSettings } from '../panel/lib/settings';\r\nimport type { PwReplSettings } from '../panel/lib/settings';\r\n\r\nexport default function PreferencesForm() {\r\n const [settings, setSettings] = useState<PwReplSettings>({ openAs: 'sidepanel', bridgePort: 9876, languageMode: 'pw' });\r\n\r\n useEffect(() => {\r\n loadSettings().then(setSettings);\r\n }, []);\r\n\r\n function handleChange(openAs: PwReplSettings['openAs']) {\r\n const next = { ...settings, openAs };\r\n setSettings(next);\r\n storeSettings(next);\r\n }\r\n\r\n function handleChangeLanguageMode(languageMode: PwReplSettings['languageMode']) {\r\n const next = { ...settings, languageMode };\r\n setSettings(next);\r\n storeSettings(next);\r\n }\r\n return (\r\n <form style={{ fontFamily: 'system-ui, sans-serif', padding: '24px', maxWidth: '400px' }}>\r\n <h2 style={{ marginTop: 0 }}>Playwright REPL Preferences</h2>\r\n <fieldset style={{ border: 'none', padding: 0, margin: 0 }}>\r\n <legend style={{ fontWeight: 600, marginBottom: '12px' }}>Open REPL as:</legend>\r\n <label style={{ display: 'flex', alignItems: 'center', gap: '8px', marginBottom: '8px', cursor: 'pointer' }}>\r\n <input\r\n type=\"radio\"\r\n name=\"openAs\"\r\n value=\"sidepanel\"\r\n checked={settings.openAs === 'sidepanel'}\r\n onChange={() => handleChange('sidepanel')}\r\n />\r\n Side Panel (default)\r\n </label>\r\n <label style={{ display: 'flex', alignItems: 'center', gap: '8px', cursor: 'pointer' }}>\r\n <input\r\n type=\"radio\"\r\n name=\"openAs\"\r\n value=\"popup\"\r\n checked={settings.openAs === 'popup'}\r\n onChange={() => handleChange('popup')}\r\n />\r\n Popup Window\r\n </label>\r\n </fieldset>\r\n <fieldset style={{ border: 'none', padding: 0, margin: '20px 0 0' }}>\r\n <legend style={{ fontWeight: 600, marginBottom: '12px' }}>Bridge Port:</legend>\r\n <input\r\n type=\"number\"\r\n value={settings.bridgePort}\r\n onChange={(e) => {\r\n const next = { ...settings, bridgePort: Number(e.target.value) };\r\n setSettings(next);\r\n storeSettings(next);\r\n }}\r\n style={{ width: '100px', padding: '4px 8px', fontSize: '14px' }}\r\n />\r\n <p style={{ margin: '6px 0 0', fontSize: '12px', color: '#888' }}>\r\n Port the MCP server listens on (default: 9876). Reopen the panel after changing.\r\n </p>\r\n </fieldset>\r\n <fieldset style={{ border: 'none', padding: 0, margin: '20px 0 0' }}>\r\n <legend style={{ fontWeight: 600, marginBottom: '12px' }}>Language Mode:</legend>\r\n <label style={{ display: 'flex', alignItems: 'center', gap: '8px', marginBottom: '8px', cursor: 'pointer' }}>\r\n <input\r\n type=\"radio\"\r\n name=\"languageMode\"\r\n value=\"pw\"\r\n checked={settings.languageMode === 'pw'}\r\n onChange={() => handleChangeLanguageMode('pw')}\r\n />\r\n pw (default)\r\n </label>\r\n <label style={{ display: 'flex', alignItems: 'center', gap: '8px', cursor: 'pointer' }}>\r\n <input\r\n type=\"radio\"\r\n name=\"languageMode\"\r\n value=\"js\"\r\n checked={settings.languageMode === 'js'}\r\n onChange={() => handleChangeLanguageMode('js')}\r\n />\r\n js\r\n </label>\r\n </fieldset>\r\n <p style={{ marginTop: '16px', fontSize: '12px', color: '#888' }}>Saved automatically.</p>\r\n </form>\r\n );\r\n}\r\n","import ReactDOM from 'react-dom/client';\r\nimport PreferencesForm from './PreferencesForm';\r\n\r\nReactDOM.createRoot(document.querySelector('#root')!).render(\r\n <PreferencesForm />\r\n);\r\n"],"names":["useState","useEffect","jsxs","jsx"],"mappings":"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"}
|
package/dist/settings.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sources":["../src/panel/lib/settings.ts"],"sourcesContent":["export type PwReplSettings = {\r\n openAs: 'sidepanel' | 'popup',\r\n bridgePort: number,\r\n languageMode: 'pw' | 'js',\r\n};\r\n\r\nconst DEFAULT: PwReplSettings = { openAs: 'sidepanel', bridgePort: 9876, languageMode: 'pw' };\r\n\r\nexport async function loadSettings(): Promise<PwReplSettings> {\r\n const stored = await chrome.storage.local.get(['openAs', 'bridgePort', 'languageMode']) as Partial<PwReplSettings>;\r\n return { ...DEFAULT, ...stored };\r\n}\r\n\r\nexport async function storeSettings(s: PwReplSettings): Promise<void> {\r\n await chrome.storage.local.set(s);\r\n}"],"names":[],"mappings":"AAMA,MAAM,UAA0B,EAAE,QAAQ,aAAa,YAAY,MAAM,cAAc,KAAA;AAEvF,eAAsB,eAAwC;AAC1D,QAAM,SAAS,MAAM,OAAO,QAAQ,MAAM,IAAI,CAAC,UAAU,cAAc,cAAc,CAAC;AACtF,SAAO,EAAE,GAAG,SAAS,GAAG,OAAA;AAC5B;AAEA,eAAsB,cAAc,GAAkC;AAClE,QAAM,OAAO,QAAQ,MAAM,IAAI,CAAC;AACpC;"}
|