@_davideast/stitch-mcp 0.5.3 → 0.5.5
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/chunk-18nfnnkg.js +947 -0
- package/dist/chunk-18nfnnkg.js.map +28 -0
- package/dist/chunk-1sgyj1qf.js +256 -0
- package/dist/chunk-1sgyj1qf.js.map +11 -0
- package/dist/chunk-1tzaa3zn.js +370 -0
- package/dist/chunk-1tzaa3zn.js.map +16 -0
- package/dist/chunk-2efzz3tw.js +10 -0
- package/dist/chunk-2efzz3tw.js.map +9 -0
- package/dist/chunk-2eq8thmz.js +31529 -0
- package/dist/chunk-2eq8thmz.js.map +245 -0
- package/dist/chunk-4xa2a5hb.js +19 -0
- package/dist/chunk-4xa2a5hb.js.map +9 -0
- package/dist/chunk-7vdj1qwb.js +2121 -0
- package/dist/chunk-7vdj1qwb.js.map +44 -0
- package/dist/chunk-7zyv8g2t.js +5216 -0
- package/dist/chunk-7zyv8g2t.js.map +67 -0
- package/dist/chunk-94xqpnv4.js +7 -0
- package/dist/chunk-94xqpnv4.js.map +9 -0
- package/dist/chunk-b43pzs3z.js +839 -0
- package/dist/chunk-b43pzs3z.js.map +11 -0
- package/dist/chunk-byzfppa1.js +759 -0
- package/dist/chunk-byzfppa1.js.map +19 -0
- package/dist/chunk-cjkw69md.js +94 -0
- package/dist/chunk-cjkw69md.js.map +10 -0
- package/dist/chunk-d92ngrr6.js +680 -0
- package/dist/chunk-d92ngrr6.js.map +17 -0
- package/dist/chunk-de74byjc.js +19 -0
- package/dist/chunk-de74byjc.js.map +9 -0
- package/dist/chunk-ewab4gg0.js +17 -0
- package/dist/chunk-ewab4gg0.js.map +9 -0
- package/dist/chunk-f0phn3y1.js +1495 -0
- package/dist/chunk-f0phn3y1.js.map +23 -0
- package/dist/chunk-f398cwqb.js +24 -0
- package/dist/chunk-f398cwqb.js.map +9 -0
- package/dist/chunk-fkzq5m59.js +111 -0
- package/dist/chunk-fkzq5m59.js.map +10 -0
- package/dist/chunk-gzk8pt16.js +44184 -0
- package/dist/chunk-gzk8pt16.js.map +237 -0
- package/dist/chunk-kme6y874.js +125 -0
- package/dist/chunk-kme6y874.js.map +12 -0
- package/dist/chunk-mw5wn97e.js +109 -0
- package/dist/chunk-mw5wn97e.js.map +10 -0
- package/dist/chunk-mxcybqhd.js +412 -0
- package/dist/chunk-mxcybqhd.js.map +20 -0
- package/dist/chunk-nep9nerg.js +137 -0
- package/dist/chunk-nep9nerg.js.map +10 -0
- package/dist/chunk-nrcb494d.js +50 -0
- package/dist/chunk-nrcb494d.js.map +9 -0
- package/dist/chunk-p9vvygz4.js +736 -0
- package/dist/chunk-p9vvygz4.js.map +16 -0
- package/dist/chunk-rd2ye9s7.js +17 -0
- package/dist/chunk-rd2ye9s7.js.map +9 -0
- package/dist/chunk-svk5y62j.js +164 -0
- package/dist/chunk-svk5y62j.js.map +10 -0
- package/dist/chunk-w3wh3zkf.js +269 -0
- package/dist/chunk-w3wh3zkf.js.map +10 -0
- package/dist/chunk-x1tt02n9.js +264 -0
- package/dist/chunk-x1tt02n9.js.map +12 -0
- package/dist/chunk-x7g5p1gv.js +66 -0
- package/dist/chunk-x7g5p1gv.js.map +10 -0
- package/dist/chunk-z7b1n864.js +246 -0
- package/dist/chunk-z7b1n864.js.map +14 -0
- package/dist/chunk-zcc6seqb.js +19132 -0
- package/dist/chunk-zcc6seqb.js.map +115 -0
- package/dist/commands/doctor/command.js +1 -1
- package/dist/commands/init/command.js +1 -1
- package/dist/commands/logout/command.js +1 -1
- package/dist/commands/proxy/command.js +1 -1
- package/dist/commands/screens/command.js +4 -4
- package/dist/commands/serve/command.js +5 -5
- package/dist/commands/site/command.js +1 -1
- package/dist/commands/snapshot/command.js +1 -1
- package/dist/commands/tool/command.js +1 -1
- package/dist/commands/view/command.js +1 -1
- package/dist/index.js +5 -7
- package/dist/index.js.map +1 -1
- package/dist/ui/copy-behaviors/clipboard.d.ts +0 -7
- package/package.json +1 -3
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/ui/InteractiveViewer.tsx", "../src/ui/JsonTree.tsx", "../src/ui/copy-behaviors/handlers.ts", "../src/ui/copy-behaviors/registry.ts", "../src/ui/navigation-behaviors/handler.ts", "../src/ui/serve-behaviors/server.ts", "../src/ui/serve-behaviors/handlers.ts", "../src/ui/serve-behaviors/registry.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Interactive viewer with navigation support.\n * Wraps JsonTree to handle drill-down navigation and back navigation.\n */\nimport React, { useState, useCallback } from 'react';\nimport { Box, Text } from 'ink';\nimport { JsonTree } from './JsonTree.js';\nimport type { NavigationResult } from './navigation-behaviors/handler.js';\n\nexport interface ViewerState {\n data: any;\n rootLabel?: string;\n resourcePath?: string;\n}\n\ninterface InteractiveViewerProps {\n initialData: any;\n initialRootLabel?: string;\n /** Pre-populated navigation history (for back navigation from deep links) */\n initialHistory?: ViewerState[];\n /** Fetch function to load new resource data */\n onFetch: (resourceName: string) => Promise<any>;\n /** Called when exiting the viewer */\n onExit?: () => void;\n}\n\nexport const InteractiveViewer = ({\n initialData,\n initialRootLabel,\n initialHistory,\n onFetch,\n onExit,\n}: InteractiveViewerProps) => {\n // Use initialHistory if provided, otherwise start with just the initial data\n const [history, setHistory] = useState<ViewerState[]>(() => {\n if (initialHistory && initialHistory.length > 0) {\n return [...initialHistory, { data: initialData, rootLabel: initialRootLabel }];\n }\n return [{ data: initialData, rootLabel: initialRootLabel }];\n });\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const currentState = history[history.length - 1];\n\n const handleNavigate = useCallback(async (result: NavigationResult) => {\n if (!result.target) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const data = await onFetch(result.target);\n\n // Determine rootLabel based on navigation type\n let rootLabel: string | undefined;\n if (result.type === 'screen') {\n rootLabel = 'screen';\n } else if (result.type === 'project') {\n rootLabel = 'project';\n } else {\n rootLabel = 'resource';\n }\n\n setHistory(prev => [...prev, { data, rootLabel, resourcePath: result.target }]);\n } catch (err) {\n setError(`Navigation failed: ${err}`);\n } finally {\n setIsLoading(false);\n }\n }, [onFetch]);\n\n const handleBack = useCallback(() => {\n if (history.length > 1) {\n setHistory(prev => prev.slice(0, -1));\n setError(null);\n }\n }, [history.length]);\n\n if (isLoading) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"blue\">Loading...</Text>\n </Box>\n );\n }\n\n // Should never happen since we initialize with one item, but satisfies TypeScript\n if (!currentState) {\n return <Text color=\"red\">No data to display</Text>;\n }\n\n return (\n <Box flexDirection=\"column\">\n {history.length > 1 && (\n <Text color=\"gray\" dimColor>\n ← Press Backspace to go back ({history.length - 1} level{history.length > 2 ? 's' : ''} deep)\n </Text>\n )}\n {error && <Text color=\"red\">{error}</Text>}\n <JsonTree\n key={history.length}\n data={currentState.data}\n rootLabel={currentState.rootLabel}\n onNavigate={handleNavigate}\n onBack={history.length > 1 ? handleBack : undefined}\n />\n </Box>\n );\n};\n",
|
|
6
|
+
"import React, { useState, useMemo, useEffect, useRef } from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport { openUrl } from '../platform/browser.js';\nimport { getHandler } from './copy-behaviors/registry.js';\nimport type { CopyResult } from './copy-behaviors/types.js';\nimport { getNavigationTarget, type NavigationResult } from './navigation-behaviors/handler.js';\nimport { getServeHandler } from './serve-behaviors/registry.js';\nimport type { ServeResult } from './serve-behaviors/types.js';\n\ntype TreeNode = {\n id: string; // Unique path identifier\n key: string;\n value: any;\n depth: number;\n isLeaf: boolean;\n isExpanded: boolean;\n hasChildren: boolean;\n};\n\nfunction getType(value: any): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n return typeof value;\n}\n\nfunction buildVisibleTree(\n data: any,\n expandedIds: Set<string>,\n prefix: string = '',\n depth: number = 0,\n rootLabel?: string\n): TreeNode[] {\n const nodes: TreeNode[] = [];\n const type = getType(data);\n\n // If rootLabel is provided and we're at the root level, add a root node\n if (rootLabel && prefix === '' && depth === 0) {\n const isExpanded = expandedIds.has(rootLabel);\n nodes.push({\n id: rootLabel,\n key: rootLabel,\n value: data,\n depth: 0,\n isLeaf: false,\n isExpanded,\n hasChildren: true,\n });\n\n if (isExpanded) {\n nodes.push(...buildVisibleTree(data, expandedIds, rootLabel, 1));\n }\n return nodes;\n }\n\n if (type === 'object' || type === 'array') {\n const keys = Object.keys(data);\n\n for (const key of keys) {\n const value = data[key];\n const id = prefix ? `${prefix}.${key}` : key;\n const valueType = getType(value);\n const isLeaf = valueType !== 'object' && valueType !== 'array';\n const hasChildren = !isLeaf && Object.keys(value).length > 0;\n const isExpanded = expandedIds.has(id);\n\n nodes.push({\n id,\n key,\n value,\n depth,\n isLeaf,\n isExpanded,\n hasChildren,\n });\n\n if (hasChildren && isExpanded) {\n nodes.push(...buildVisibleTree(value, expandedIds, id, depth + 1));\n }\n }\n }\n\n return nodes;\n}\n\ninterface JsonTreeProps {\n data: any;\n /** Optional label for root object - when set, root is selectable for copying */\n rootLabel?: string;\n /** Called when user navigates into a resource (Enter on screenInstances) */\n onNavigate?: (result: NavigationResult) => void;\n /** Called when user wants to go back (Backspace/Delete) */\n onBack?: () => void;\n}\n\nexport const JsonTree = ({ data, rootLabel, onNavigate, onBack }: JsonTreeProps) => {\n const [expandedIds, setExpandedIds] = useState<Set<string>>(() => {\n const ids = new Set<string>();\n if (rootLabel) {\n ids.add(rootLabel);\n } else if (data && typeof data === 'object') {\n Object.keys(data).forEach((key) => ids.add(key));\n }\n return ids;\n });\n\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [feedbackMessage, setFeedbackMessage] = useState<string | null>(null);\n const lastCPressTime = useRef<number>(0);\n const feedbackTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const visibleNodes = useMemo(() => {\n return buildVisibleTree(data, expandedIds, '', 0, rootLabel);\n }, [data, expandedIds, rootLabel]);\n\n const { exit } = useApp();\n\n useInput((input, key) => {\n if (input === 'q') {\n exit();\n }\n\n // Handle 'c' key for copy\n if (input === 'c') {\n const node = visibleNodes[selectedIndex];\n if (!node) return;\n\n const now = Date.now();\n const timeSinceLastC = now - lastCPressTime.current;\n lastCPressTime.current = now;\n\n // Double-tap detection (within 300ms = 'cc')\n const isDoubleTap = timeSinceLastC < 300;\n\n const handler = getHandler(node.id);\n\n // Progress callback for immediate feedback during async operations\n const onProgress = (message: string) => {\n if (feedbackTimeout.current) clearTimeout(feedbackTimeout.current);\n setFeedbackMessage(message);\n };\n\n const ctx = { key: node.key, value: node.value, path: node.id, onProgress };\n\n const showFeedback = (result: CopyResult) => {\n if (feedbackTimeout.current) clearTimeout(feedbackTimeout.current);\n setFeedbackMessage(result.message);\n feedbackTimeout.current = setTimeout(() => setFeedbackMessage(null), 3000);\n };\n\n if (isDoubleTap) {\n handler.copyExtended(ctx).then(showFeedback);\n } else {\n // Wait briefly to see if it's a double-tap\n setTimeout(() => {\n if (Date.now() - lastCPressTime.current >= 280) {\n handler.copy(ctx).then(showFeedback);\n }\n }, 300);\n }\n return;\n }\n\n // Handle 's' key to serve/preview HTML\n if (input === 's') {\n const node = visibleNodes[selectedIndex];\n if (!node) return;\n\n const handler = getServeHandler(node.id);\n if (!handler) {\n if (feedbackTimeout.current) clearTimeout(feedbackTimeout.current);\n setFeedbackMessage('⚠️ No preview available for this path');\n feedbackTimeout.current = setTimeout(() => setFeedbackMessage(null), 3000);\n return;\n }\n\n const onProgress = (message: string) => {\n if (feedbackTimeout.current) clearTimeout(feedbackTimeout.current);\n setFeedbackMessage(message);\n };\n\n const ctx = { key: node.key, value: node.value, path: node.id, onProgress };\n handler.serve(ctx).then((result: ServeResult) => {\n if (feedbackTimeout.current) clearTimeout(feedbackTimeout.current);\n setFeedbackMessage(result.message);\n feedbackTimeout.current = setTimeout(() => setFeedbackMessage(null), 10000);\n });\n return;\n }\n\n // Handle 'o' key to open project in Stitch web app\n if (input === 'o') {\n const node = visibleNodes[selectedIndex];\n if (!node) return;\n\n // Try to extract project ID from various sources\n let projectId: string | undefined;\n\n // Check if path contains 'projects' and extract the ID\n const projectsMatch = node.id.match(/projects\\.(\\d+)/);\n if (projectsMatch && projectsMatch[1]) {\n // We're somewhere inside a project in the list view\n // Need to find the actual project name from the data\n const projectIndex = parseInt(projectsMatch[1], 10);\n const project = data.projects?.[projectIndex];\n if (project?.name) {\n projectId = project.name.replace('projects/', '');\n }\n }\n\n // Check if we're in a single project/resource view\n if (!projectId && typeof node.value === 'object' && node.value?.name) {\n const nameMatch = node.value.name.match(/projects\\/(\\d+)/);\n if (nameMatch) {\n projectId = nameMatch[1];\n }\n }\n\n // Check if the node's name property contains a project ID\n if (!projectId && node.key === 'name' && typeof node.value === 'string') {\n const nameMatch = node.value.match(/projects\\/(\\d+)/);\n if (nameMatch) {\n projectId = nameMatch[1];\n }\n }\n\n // Check if rootLabel is 'screen' or 'resource' and data has a name\n if (!projectId && (rootLabel === 'screen' || rootLabel === 'resource')) {\n const nameMatch = data.name?.match(/projects\\/(\\d+)/);\n if (nameMatch) {\n projectId = nameMatch[1];\n }\n }\n\n if (projectId) {\n const url = `https://stitch.withgoogle.com/projects/${projectId}`;\n // Open in browser using platform command\n openUrl(url);\n\n if (feedbackTimeout.current) clearTimeout(feedbackTimeout.current);\n setFeedbackMessage(`🔗 Opened project in browser`);\n feedbackTimeout.current = setTimeout(() => setFeedbackMessage(null), 3000);\n } else {\n if (feedbackTimeout.current) clearTimeout(feedbackTimeout.current);\n setFeedbackMessage(`⚠️ No project found at this path`);\n feedbackTimeout.current = setTimeout(() => setFeedbackMessage(null), 3000);\n }\n return;\n }\n\n if (key.upArrow) {\n setSelectedIndex(Math.max(0, selectedIndex - 1));\n }\n\n if (key.downArrow) {\n setSelectedIndex(Math.min(visibleNodes.length - 1, selectedIndex + 1));\n }\n\n if (key.rightArrow || key.return) {\n const node = visibleNodes[selectedIndex];\n if (node && node.hasChildren) {\n if (!node.isExpanded) {\n const newExpanded = new Set(expandedIds);\n newExpanded.add(node.id);\n setExpandedIds(newExpanded);\n }\n }\n\n // Check for navigation on Enter (not rightArrow)\n if (key.return && node && onNavigate) {\n const navResult = getNavigationTarget({ path: node.id, value: node.value, key: node.key });\n if (navResult.shouldNavigate) {\n onNavigate(navResult);\n return;\n }\n }\n }\n\n // Backspace/Delete for back navigation\n if ((key.delete || key.backspace) && onBack) {\n onBack();\n return;\n }\n\n if (key.leftArrow) {\n const node = visibleNodes[selectedIndex];\n if (node) {\n if (node.isExpanded) {\n const newExpanded = new Set(expandedIds);\n newExpanded.delete(node.id);\n setExpandedIds(newExpanded);\n } else {\n // Move to parent\n // Find parent ID by removing last segment\n const lastDot = node.id.lastIndexOf('.');\n if (lastDot !== -1) {\n const parentId = node.id.substring(0, lastDot);\n const parentIndex = visibleNodes.findIndex(n => n.id === parentId);\n if (parentIndex !== -1) {\n setSelectedIndex(parentIndex);\n // Optional: Collapse parent when moving back to it?\n // Usually Left arrow on a collapsed node moves to parent.\n }\n } else {\n // Top level, do nothing?\n }\n }\n }\n }\n });\n\n // Adjust scroll/window logic if list is long?\n // For simplicity, we render a slice around the cursor if needed, or rely on terminal scrolling.\n // Ink handles output, but if it's longer than screen height, it might be weird.\n // Let's just render all for now, typical terminals scroll.\n // But a static UI at bottom is better.\n // \"Arrow through\" implies a viewport.\n\n // Let's implement a simple viewport\n const viewportHeight = 20; // Configurable?\n const startRow = Math.max(0, Math.min(selectedIndex - 2, visibleNodes.length - viewportHeight));\n const endRow = Math.min(startRow + viewportHeight, visibleNodes.length);\n const viewportNodes = visibleNodes.slice(startRow, endRow);\n\n if (!data || typeof data !== 'object') {\n return <Text>Invalid data: {String(data)}</Text>;\n }\n\n if (Object.keys(data).length === 0) {\n return <Text>Empty object</Text>;\n }\n\n return (\n <Box flexDirection=\"column\">\n <Text color=\"blue\" bold>JSON Viewer (Use Arrows to Navigate, 'q' to Quit)</Text>\n <Box flexDirection=\"column\" borderStyle=\"single\">\n {viewportNodes.map((node, index) => {\n const absoluteIndex = startRow + index;\n const isSelected = absoluteIndex === selectedIndex;\n const indentation = ' '.repeat(node.depth);\n\n let prefixChar = ' ';\n if (node.hasChildren) {\n prefixChar = node.isExpanded ? '▼' : '▶';\n }\n\n let valueDisplay = '';\n if (node.isLeaf) {\n const valType = getType(node.value);\n if (valType === 'string') valueDisplay = `\"${node.value}\"`;\n else valueDisplay = String(node.value);\n } else {\n const type = Array.isArray(node.value) ? '[]' : '{}';\n const itemCount = Object.keys(node.value).length;\n // Try to show a meaningful label for objects (title, name, id, etc.)\n const label = node.value.title || node.value.name || node.value.displayName || node.value.id || null;\n if (label && typeof label === 'string') {\n valueDisplay = `${type} \"${label}\" (${itemCount})`;\n } else {\n valueDisplay = `${type} ${itemCount} items`;\n }\n }\n\n return (\n <Box key={node.id}>\n <Text backgroundColor={isSelected ? 'blue' : undefined} color={isSelected ? 'white' : undefined} wrap=\"truncate\">\n {indentation}\n <Text color=\"green\">{prefixChar} {node.key}</Text>\n <Text>: </Text>\n <Text color=\"yellow\">{valueDisplay}</Text>\n </Text>\n </Box>\n );\n })}\n {visibleNodes.length > viewportHeight && (\n <Text color=\"gray\">... {visibleNodes.length - endRow} more items ...</Text>\n )}\n </Box>\n <Text color=\"gray\">\n Selected Path: {visibleNodes[selectedIndex]?.id || 'none'} | 'c' copy, 'cc' extended, 's' preview\n </Text>\n {feedbackMessage && (\n <Text color=\"cyan\" bold>{feedbackMessage}</Text>\n )}\n </Box>\n );\n};\n",
|
|
7
|
+
"/**\n * Copy handlers - isolated behavior implementations.\n */\nimport type { CopyHandler, CopyContext, CopyResult } from './types.js';\nimport { copyJson, copyText, downloadAndCopyImage, downloadAndCopyText } from './clipboard.js';\n\n/**\n * Default handler: copies value on \"c\", copies {key: value} on \"cc\"\n */\nexport const defaultCopyHandler: CopyHandler = {\n async copy(ctx: CopyContext): Promise<CopyResult> {\n try {\n await copyJson(ctx.value);\n const preview = typeof ctx.value === 'string'\n ? `\"${ctx.value.slice(0, 50)}${ctx.value.length > 50 ? '...' : ''}\"`\n : JSON.stringify(ctx.value).slice(0, 50);\n return { success: true, message: `Copied: ${preview}` };\n } catch (error) {\n return { success: false, message: `Copy failed: ${error}` };\n }\n },\n\n async copyExtended(ctx: CopyContext): Promise<CopyResult> {\n try {\n const obj = { [ctx.key]: ctx.value };\n await copyJson(obj);\n return { success: true, message: `Copied: { ${ctx.key}: ... }` };\n } catch (error) {\n return { success: false, message: `Copy failed: ${error}` };\n }\n },\n};\n\n/**\n * Image URL handler: copies URL on \"c\", downloads and copies image on \"cc\"\n */\nexport const imageUrlCopyHandler: CopyHandler = {\n async copy(ctx: CopyContext): Promise<CopyResult> {\n try {\n if (typeof ctx.value !== 'string') {\n return { success: false, message: 'Value is not a URL string' };\n }\n await copyText(ctx.value);\n return { success: true, message: `Copied URL: ${ctx.value.slice(0, 60)}...` };\n } catch (error) {\n return { success: false, message: `Copy failed: ${error}` };\n }\n },\n\n async copyExtended(ctx: CopyContext): Promise<CopyResult> {\n try {\n if (typeof ctx.value !== 'string') {\n return { success: false, message: 'Value is not a URL string' };\n }\n // Show immediate progress feedback\n ctx.onProgress?.('📷 Downloading image...');\n await downloadAndCopyImage(ctx.value);\n return { success: true, message: '📷 Image copied to clipboard!' };\n } catch (error) {\n return { success: false, message: `Image copy failed: ${error}` };\n }\n },\n};\n\n/**\n * HTML code URL handler: copies URL on \"c\", downloads and copies HTML code on \"cc\"\n */\nexport const htmlCodeCopyHandler: CopyHandler = {\n async copy(ctx: CopyContext): Promise<CopyResult> {\n try {\n if (typeof ctx.value !== 'string') {\n return { success: false, message: 'Value is not a URL string' };\n }\n await copyText(ctx.value);\n return { success: true, message: `Copied URL: ${ctx.value.slice(0, 60)}...` };\n } catch (error) {\n return { success: false, message: `Copy failed: ${error}` };\n }\n },\n\n async copyExtended(ctx: CopyContext): Promise<CopyResult> {\n try {\n if (typeof ctx.value !== 'string') {\n return { success: false, message: 'Value is not a URL string' };\n }\n ctx.onProgress?.('📝 Downloading HTML code...');\n await downloadAndCopyText(ctx.value);\n return { success: true, message: '📝 HTML code copied to clipboard!' };\n } catch (error) {\n return { success: false, message: `HTML copy failed: ${error}` };\n }\n },\n};\n",
|
|
8
|
+
"/**\n * Registry for path-based copy handler selection.\n */\nimport type { CopyHandler, PathMatcher } from './types.js';\nimport { defaultCopyHandler, imageUrlCopyHandler, htmlCodeCopyHandler } from './handlers.js';\n\ninterface HandlerRegistration {\n matcher: PathMatcher;\n handler: CopyHandler;\n}\n\nconst registrations: HandlerRegistration[] = [];\n\n/**\n * Register a handler for paths matching the given pattern.\n * Later registrations take precedence over earlier ones.\n */\nexport function registerHandler(matcher: PathMatcher, handler: CopyHandler): void {\n registrations.push({ matcher, handler });\n}\n\n/**\n * Get the appropriate handler for a given path.\n * Returns the most recently registered matching handler, or default.\n */\nexport function getHandler(path: string): CopyHandler {\n // Check in reverse order (most recent first)\n for (let i = registrations.length - 1; i >= 0; i--) {\n const registration = registrations[i];\n if (registration && registration.matcher(path)) {\n return registration.handler;\n }\n }\n return defaultCopyHandler;\n}\n\n/**\n * Create a matcher that checks if path ends with the given suffix.\n */\nexport function endsWith(suffix: string): PathMatcher {\n return (path: string) => path.endsWith(suffix);\n}\n\n/**\n * Create a matcher that checks if path contains the given segment.\n */\nexport function contains(segment: string): PathMatcher {\n return (path: string) => path.includes(segment);\n}\n\n// ============================================================================\n// Default registrations\n// ============================================================================\n\n// Register image URL handler for thumbnailScreenshot.downloadUrl\nregisterHandler(endsWith('.thumbnailScreenshot.downloadUrl'), imageUrlCopyHandler);\n\n// Register image URL handler for screenshot.downloadUrl (in screen view)\nregisterHandler(endsWith('.screenshot.downloadUrl'), imageUrlCopyHandler);\n\n// Register HTML code handler for htmlCode.downloadUrl\nregisterHandler(endsWith('.htmlCode.downloadUrl'), htmlCodeCopyHandler);\n\n// Export for convenience\nexport { defaultCopyHandler, imageUrlCopyHandler, htmlCodeCopyHandler };\n",
|
|
9
|
+
"/**\n * Navigation behaviors for the JSON viewer.\n * Handles drill-down navigation into screens and back navigation.\n */\n\nexport interface NavigationContext {\n /** Current selected path */\n path: string;\n /** Current node value */\n value: any;\n /** The key of the node */\n key: string;\n}\n\nexport interface NavigationResult {\n /** Whether navigation should occur */\n shouldNavigate: boolean;\n /** Target resource to navigate to */\n target?: string;\n /** Type of navigation (e.g., 'screen', 'project') */\n type?: string;\n}\n\nexport type NavigationHandler = (ctx: NavigationContext) => NavigationResult;\n\n/**\n * Detects if the current node is within screenInstances and can navigate to a screen.\n * When on screenInstances[x] or screenInstances[x].sourceScreen, extract the sourceScreen value.\n */\nexport function screenInstanceNavigationHandler(ctx: NavigationContext): NavigationResult {\n // Check if we're in a screenInstances path\n if (!ctx.path.includes('screenInstances')) {\n return { shouldNavigate: false };\n }\n\n // If value is an object with sourceScreen, use that\n if (ctx.value && typeof ctx.value === 'object' && ctx.value.sourceScreen) {\n return {\n shouldNavigate: true,\n target: ctx.value.sourceScreen,\n type: 'screen',\n };\n }\n\n // If we're on the sourceScreen property itself\n if (ctx.key === 'sourceScreen' && typeof ctx.value === 'string') {\n return {\n shouldNavigate: true,\n target: ctx.value,\n type: 'screen',\n };\n }\n\n return { shouldNavigate: false };\n}\n\n/**\n * Registry of navigation handlers.\n * Handlers are checked in order, first match wins.\n */\nconst navigationHandlers: NavigationHandler[] = [\n screenInstanceNavigationHandler,\n];\n\n/**\n * Get navigation result for a given context.\n */\nexport function getNavigationTarget(ctx: NavigationContext): NavigationResult {\n for (const handler of navigationHandlers) {\n const result = handler(ctx);\n if (result.shouldNavigate) {\n return result;\n }\n }\n return { shouldNavigate: false };\n}\n\n/**\n * Register a custom navigation handler.\n */\nexport function registerNavigationHandler(handler: NavigationHandler): void {\n navigationHandlers.unshift(handler); // Add at start for priority\n}\n",
|
|
10
|
+
"/**\n * In-memory HTTP server using node:http for cross-runtime compatibility.\n */\nimport { createServer, type Server } from 'node:http';\nimport { randomBytes } from 'node:crypto';\nimport { openUrl } from '../../platform/browser.js';\n\nexport interface ServeInstance {\n url: string;\n stop: () => void;\n}\n\nexport async function serveHtmlInMemory(\n html: string,\n options?: { timeout?: number; openBrowser?: boolean }\n): Promise<ServeInstance> {\n const timeout = options?.timeout ?? 5 * 60 * 1000;\n const openBrowser = options?.openBrowser ?? true;\n\n return new Promise((resolve, reject) => {\n const server: Server = createServer((req, res) => {\n const nonce = randomBytes(16).toString('base64');\n const csp = [\n \"default-src 'self' data: https:;\",\n `script-src 'self' 'nonce-${nonce}';`,\n \"style-src 'self' 'unsafe-inline';\",\n \"object-src 'none';\",\n \"base-uri 'self';\",\n ].join(' ');\n\n res.writeHead(200, {\n 'Content-Type': 'text/html; charset=utf-8',\n 'Content-Security-Policy': csp,\n 'X-Content-Type-Options': 'nosniff',\n 'Referrer-Policy': 'no-referrer',\n });\n\n // Inject nonce into all script tags in the HTML\n const htmlWithNonces = html.replace(/<script(\\b[^>]*)>/gi, `<script$1 nonce=\"${nonce}\">`);\n res.end(htmlWithNonces);\n });\n\n server.listen(0, '127.0.0.1', () => {\n const address = server.address();\n if (!address || typeof address === 'string') {\n reject(new Error('Failed to get server address'));\n return;\n }\n\n const url = `http://127.0.0.1:${address.port}`;\n const timer = setTimeout(() => server.close(), timeout);\n const stop = () => { clearTimeout(timer); server.close(); };\n\n if (openBrowser) {\n openUrl(url);\n }\n\n resolve({ url, stop });\n });\n\n server.on('error', reject);\n });\n}\n",
|
|
11
|
+
"/**\n * Serve handlers - isolated behavior implementations.\n */\nimport type { ServeHandler, ServeContext, ServeResult } from './types.js';\nimport { serveHtmlInMemory } from './server.js';\n\n// Export dependencies for testing\nexport const deps = {\n serveHtmlInMemory\n};\n\nexport const htmlCodeServeHandler: ServeHandler = {\n async serve(ctx: ServeContext): Promise<ServeResult> {\n try {\n // Extract URL - either from value directly or from value.downloadUrl\n let url: string;\n if (typeof ctx.value === 'string') {\n url = ctx.value;\n } else if (typeof ctx.value === 'object' && ctx.value?.downloadUrl) {\n url = ctx.value.downloadUrl;\n } else {\n return { success: false, message: 'No download URL found' };\n }\n\n ctx.onProgress?.('📥 Downloading HTML...');\n const response = await fetch(url);\n if (!response.ok) {\n return { success: false, message: `Download failed: ${response.status} ${response.statusText}` };\n }\n const html = await response.text();\n\n ctx.onProgress?.('🚀 Starting local server...');\n const { url: serveUrl } = await deps.serveHtmlInMemory(html);\n\n ctx.onProgress?.('🌐 Opening browser...');\n return { success: true, message: `🌐 Preview at ${serveUrl} (auto-closes in 5 min)`, url: serveUrl };\n } catch (error) {\n return { success: false, message: `Serve failed: ${error instanceof Error ? error.message : String(error)}` };\n }\n },\n};\n",
|
|
12
|
+
"/**\n * Registry for path-based serve handler selection.\n */\nimport type { ServeHandler, PathMatcher } from './types.js';\nimport { htmlCodeServeHandler } from './handlers.js';\n\ninterface HandlerRegistration { matcher: PathMatcher; handler: ServeHandler; }\nconst registrations: HandlerRegistration[] = [];\n\nexport function registerServeHandler(matcher: PathMatcher, handler: ServeHandler): void {\n registrations.push({ matcher, handler });\n}\n\nexport function getServeHandler(path: string): ServeHandler | null {\n for (let i = registrations.length - 1; i >= 0; i--) {\n const reg = registrations[i];\n if (reg && reg.matcher(path)) return reg.handler;\n }\n return null;\n}\n\nexport function endsWith(suffix: string): PathMatcher {\n return (path: string) => path.endsWith(suffix);\n}\n\nexport function contains(segment: string): PathMatcher {\n return (path: string) => path.includes(segment);\n}\n\n// Default registrations\nregisterServeHandler(endsWith('.htmlCode'), htmlCodeServeHandler);\nregisterServeHandler(endsWith('.htmlCode.downloadUrl'), htmlCodeServeHandler);\n\nexport { htmlCodeServeHandler };\n"
|
|
13
|
+
],
|
|
14
|
+
"mappings": "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",
|
|
15
|
+
"debugId": "5616FED4529C741864756E2164756E21",
|
|
16
|
+
"names": []
|
|
17
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
copyJson,
|
|
3
|
+
copyText,
|
|
4
|
+
downloadAndCopyImage,
|
|
5
|
+
downloadAndCopyText,
|
|
6
|
+
downloadImage,
|
|
7
|
+
downloadText
|
|
8
|
+
} from "./chunk-fkzq5m59.js";
|
|
9
|
+
import"./chunk-9wyra8hs.js";
|
|
10
|
+
export {
|
|
11
|
+
downloadText,
|
|
12
|
+
downloadImage,
|
|
13
|
+
downloadAndCopyText,
|
|
14
|
+
downloadAndCopyImage,
|
|
15
|
+
copyText,
|
|
16
|
+
copyJson
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
//# debugId=C883AEA0E6375B0464756E2164756E21
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DoctorHandler
|
|
3
|
+
} from "./chunk-byzfppa1.js";
|
|
4
|
+
import"./chunk-18nfnnkg.js";
|
|
5
|
+
import"./chunk-7zyv8g2t.js";
|
|
6
|
+
import"./chunk-nq68kghz.js";
|
|
7
|
+
import"./chunk-q6sv0243.js";
|
|
8
|
+
import"./chunk-f2hq6bfv.js";
|
|
9
|
+
import"./chunk-kbtqrkwh.js";
|
|
10
|
+
import"./chunk-3sfn889r.js";
|
|
11
|
+
import"./chunk-c6ge431q.js";
|
|
12
|
+
import"./chunk-9wyra8hs.js";
|
|
13
|
+
export {
|
|
14
|
+
DoctorHandler
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
//# debugId=7AA9461C2AC3B5F864756E2164756E21
|