@djangocfg/ui-tools 2.1.301 → 2.1.303
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/{DocsLayout-MWRKNFXR.mjs → DocsLayout-6ECALRLD.mjs} +3 -3
- package/dist/{DocsLayout-MWRKNFXR.mjs.map → DocsLayout-6ECALRLD.mjs.map} +1 -1
- package/dist/{DocsLayout-NWJUF42A.cjs → DocsLayout-ASPSECYR.cjs} +48 -48
- package/dist/{DocsLayout-NWJUF42A.cjs.map → DocsLayout-ASPSECYR.cjs.map} +1 -1
- package/dist/{Mermaid.client-XFQ74OYN.mjs → Mermaid.client-SXRRI2YW.mjs} +43 -6
- package/dist/Mermaid.client-SXRRI2YW.mjs.map +1 -0
- package/dist/{Mermaid.client-RSWUUHIL.cjs → Mermaid.client-W76R5AKJ.cjs} +43 -6
- package/dist/Mermaid.client-W76R5AKJ.cjs.map +1 -0
- package/dist/{chunk-CKD7GNE5.mjs → chunk-K35OF7OB.mjs} +88 -52
- package/dist/chunk-K35OF7OB.mjs.map +1 -0
- package/dist/{chunk-SEXWBCLX.cjs → chunk-PFKR6ZPZ.cjs} +88 -52
- package/dist/chunk-PFKR6ZPZ.cjs.map +1 -0
- package/dist/index.cjs +11 -11
- package/dist/index.d.cts +20 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.mjs +5 -5
- package/package.json +6 -6
- package/src/components/markdown/MarkdownMessage/CodeBlock.tsx +53 -42
- package/src/components/markdown/MarkdownMessage/MarkdownMessage.story.tsx +422 -0
- package/src/components/markdown/MarkdownMessage/MarkdownMessage.tsx +38 -11
- package/src/components/markdown/MarkdownMessage/components.tsx +69 -14
- package/src/components/markdown/MarkdownMessage/plainText.ts +33 -0
- package/src/components/markdown/MarkdownMessage/types.ts +13 -0
- package/src/tools/Mermaid/Mermaid.client.tsx +10 -1
- package/src/tools/Mermaid/components/MermaidFullscreenModal.tsx +76 -3
- package/src/tools/Mermaid/index.tsx +7 -0
- package/dist/Mermaid.client-RSWUUHIL.cjs.map +0 -1
- package/dist/Mermaid.client-XFQ74OYN.mjs.map +0 -1
- package/dist/chunk-CKD7GNE5.mjs.map +0 -1
- package/dist/chunk-SEXWBCLX.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/markdown/useCollapsibleContent.ts","../src/components/markdown/MarkdownMessage/plainText.ts","../src/tools/Mermaid/index.tsx","../src/tools/PrettyCode/index.tsx","../src/components/markdown/MarkdownMessage/sanitize.ts","../src/components/markdown/MarkdownMessage/CodeBlock.tsx","../src/components/markdown/MarkdownMessage/components.tsx","../src/components/markdown/MarkdownMessage/CollapseToggle.tsx","../src/components/markdown/MarkdownMessage/linkRules.ts","../src/components/markdown/MarkdownMessage/MarkdownMessage.tsx","../src/tools/OpenapiViewer/utils/apiKeyManager.ts","../src/tools/OpenapiViewer/utils/codeSamples.ts","../src/tools/OpenapiViewer/utils/operationToHar.ts","../src/tools/OpenapiViewer/utils/versionManager.ts","../src/tools/OpenapiViewer/utils/formatters.ts","../src/tools/OpenapiViewer/utils/sampler.ts","../src/tools/OpenapiViewer/utils/url.ts","../src/tools/OpenapiViewer/utils/schemaExport.ts","../src/tools/OpenapiViewer/context/PlaygroundContext.tsx"],"names":["__name","useState","useMemo","useCallback","React","lazy","jsx","Suspense","LoadingFallback","jsxs","defaultSchema","useResolvedTheme","CopyButton","Fragment","ReactMarkdown","remarkGfm","rehypeRaw","rehypeSanitize","openapiSample","consola","createContext","useContext","useReducer","useRef","useSessionStorage","useEffect"],"mappings":"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","file":"chunk-SEXWBCLX.cjs","sourcesContent":["'use client';\n\nimport { useCallback, useMemo, useState } from 'react';\n\nexport interface UseCollapsibleContentOptions {\n /**\n * Maximum character length before collapsing\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLength?: number;\n /**\n * Maximum number of lines before collapsing\n * If both maxLength and maxLines are set, the stricter limit applies\n */\n maxLines?: number;\n /**\n * Start in expanded state (default: false - starts collapsed)\n */\n defaultExpanded?: boolean;\n}\n\nexport interface UseCollapsibleContentResult {\n /** Whether content is currently collapsed */\n isCollapsed: boolean;\n /** Toggle between collapsed/expanded state */\n toggleCollapsed: () => void;\n /** Set collapsed state directly */\n setCollapsed: (collapsed: boolean) => void;\n /** Content to display (truncated if collapsed, full if expanded) */\n displayContent: string;\n /** Whether the content exceeds limits and should be collapsible */\n shouldCollapse: boolean;\n /** Original content length */\n originalLength: number;\n /** Original line count */\n originalLineCount: number;\n}\n\n/**\n * Smart truncation that doesn't break words or markdown syntax\n */\nfunction smartTruncate(content: string, maxLength: number): string {\n if (content.length <= maxLength) {\n return content;\n }\n\n // Find a good break point (space, newline) near maxLength\n let breakPoint = maxLength;\n\n // Look backwards for a space or newline\n while (breakPoint > maxLength - 50 && breakPoint > 0) {\n const char = content[breakPoint];\n if (char === ' ' || char === '\\n' || char === '\\t') {\n break;\n }\n breakPoint--;\n }\n\n // If we couldn't find a good break point, just use maxLength\n if (breakPoint <= maxLength - 50) {\n breakPoint = maxLength;\n }\n\n let truncated = content.slice(0, breakPoint).trimEnd();\n\n // Fix unclosed markdown syntax\n truncated = fixUnclosedMarkdown(truncated);\n\n return truncated;\n}\n\n/**\n * Truncate by line count\n */\nfunction truncateByLines(content: string, maxLines: number): string {\n const lines = content.split('\\n');\n\n if (lines.length <= maxLines) {\n return content;\n }\n\n let truncated = lines.slice(0, maxLines).join('\\n').trimEnd();\n\n // Fix unclosed markdown syntax\n truncated = fixUnclosedMarkdown(truncated);\n\n return truncated;\n}\n\n/**\n * Fix unclosed markdown syntax to prevent rendering issues\n */\nfunction fixUnclosedMarkdown(content: string): string {\n let result = content;\n\n // Count occurrences of markdown markers\n const countOccurrences = (str: string, marker: string): number => {\n const escaped = marker.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const matches = str.match(new RegExp(escaped, 'g'));\n return matches ? matches.length : 0;\n };\n\n // Fix unclosed bold (**) - must have even count\n const boldCount = countOccurrences(result, '**');\n if (boldCount % 2 !== 0) {\n result += '**';\n }\n\n // Fix unclosed italic (*) - but not **\n // Remove ** first for counting, then count single *\n const withoutBold = result.replace(/\\*\\*/g, '');\n const italicCount = countOccurrences(withoutBold, '*');\n if (italicCount % 2 !== 0) {\n result += '*';\n }\n\n // Fix unclosed inline code (`)\n const codeCount = countOccurrences(result, '`');\n // Ignore triple backticks for code blocks\n const tripleCount = countOccurrences(result, '```');\n const singleCodeCount = codeCount - (tripleCount * 3);\n if (singleCodeCount % 2 !== 0) {\n result += '`';\n }\n\n // Fix unclosed code blocks (```)\n if (tripleCount % 2 !== 0) {\n result += '\\n```';\n }\n\n // Fix unclosed strikethrough (~~)\n const strikeCount = countOccurrences(result, '~~');\n if (strikeCount % 2 !== 0) {\n result += '~~';\n }\n\n // Fix unclosed underline bold (__)\n const underlineBoldCount = countOccurrences(result, '__');\n if (underlineBoldCount % 2 !== 0) {\n result += '__';\n }\n\n // Fix unclosed underline italic (_) - but not __\n const withoutUnderlineBold = result.replace(/__/g, '');\n const underlineItalicCount = countOccurrences(withoutUnderlineBold, '_');\n if (underlineItalicCount % 2 !== 0) {\n result += '_';\n }\n\n return result;\n}\n\n/**\n * Hook for managing collapsible content with \"Read more...\" functionality\n *\n * @example\n * ```tsx\n * const { isCollapsed, toggleCollapsed, displayContent, shouldCollapse } = useCollapsibleContent(\n * longText,\n * { maxLength: 300, maxLines: 5 }\n * );\n *\n * return (\n * <div>\n * <Markdown content={displayContent} />\n * {shouldCollapse && (\n * <button onClick={toggleCollapsed}>\n * {isCollapsed ? 'Read more...' : 'Show less'}\n * </button>\n * )}\n * </div>\n * );\n * ```\n */\nexport function useCollapsibleContent(\n content: string,\n options: UseCollapsibleContentOptions = {}\n): UseCollapsibleContentResult {\n const { maxLength, maxLines, defaultExpanded = false } = options;\n\n const [isCollapsed, setIsCollapsed] = useState(!defaultExpanded);\n\n const originalLength = content.length;\n const originalLineCount = content.split('\\n').length;\n\n const { shouldCollapse, truncatedContent } = useMemo(() => {\n // If no limits set, don't collapse\n if (maxLength === undefined && maxLines === undefined) {\n return { shouldCollapse: false, truncatedContent: content };\n }\n\n let needsCollapse = false;\n let result = content;\n\n // Check line limit first (usually more restrictive for chat)\n if (maxLines !== undefined && originalLineCount > maxLines) {\n needsCollapse = true;\n result = truncateByLines(result, maxLines);\n }\n\n // Then check character limit\n if (maxLength !== undefined && result.length > maxLength) {\n needsCollapse = true;\n result = smartTruncate(result, maxLength);\n }\n\n return { shouldCollapse: needsCollapse, truncatedContent: result };\n }, [content, maxLength, maxLines, originalLineCount]);\n\n const displayContent = useMemo(() => {\n if (!shouldCollapse || !isCollapsed) {\n return content;\n }\n return truncatedContent;\n }, [content, truncatedContent, shouldCollapse, isCollapsed]);\n\n const toggleCollapsed = useCallback(() => {\n setIsCollapsed((prev) => !prev);\n }, []);\n\n const setCollapsed = useCallback((collapsed: boolean) => {\n setIsCollapsed(collapsed);\n }, []);\n\n return {\n isCollapsed,\n toggleCollapsed,\n setCollapsed,\n displayContent,\n shouldCollapse,\n originalLength,\n originalLineCount,\n };\n}\n\nexport default useCollapsibleContent;\n","import React from 'react';\n\n/** Recursively concatenate the text content of a React.ReactNode tree.\n * Used by the markdown renderers (e.g. `<pre>` extracting code) and\n * by consumers that need a plain-string label out of link children. */\nexport function extractTextFromChildren(children: React.ReactNode): string {\n if (typeof children === 'string') return children;\n if (typeof children === 'number') return String(children);\n if (React.isValidElement(children)) {\n const props = children.props as { children?: React.ReactNode };\n return extractTextFromChildren(props.children);\n }\n if (Array.isArray(children)) {\n return children.map(extractTextFromChildren).join('');\n }\n return '';\n}\n\n/** Affordance test: does this string look like markdown? Used to skip\n * the (heavier) ReactMarkdown pipeline when the content is pure\n * prose. NOT a validator — false negatives are fine; false positives\n * cost a render but render correctly. */\nexport function hasMarkdownSyntax(text: string): boolean {\n // Newlines after trim → render as markdown so paragraphs work.\n if (text.trim().includes('\\n')) return true;\n\n // Inline HTML tags (`<br>`, `<b>`, `<code>`, …) — common in OpenAPI\n // descriptions. Without this branch the fast path would escape them\n // and the user sees literal angle brackets.\n if (/<\\/?[a-zA-Z][a-zA-Z0-9-]*(\\s[^>]*)?\\/?>/.test(text)) return true;\n\n const patterns = [\n /^#{1,6}\\s/m, // Headers\n /\\*\\*[^*]+\\*\\*/, // Bold\n /\\*[^*]+\\*/, // Italic\n /__[^_]+__/, // Bold (underscore)\n /_[^_]+_/, // Italic (underscore)\n /\\[.+\\]\\(.+\\)/, // Links\n /!\\[.*\\]\\(.+\\)/, // Images\n /```[\\s\\S]*```/, // Code blocks\n /`[^`]+`/, // Inline code\n /^\\s*[-*+]\\s/m, // Unordered lists\n /^\\s*\\d+\\.\\s/m, // Ordered lists\n /^\\s*>/m, // Blockquotes\n /\\|.+\\|/, // Tables\n /^---+$/m, // Horizontal rules\n /~~[^~]+~~/, // Strikethrough\n ];\n return patterns.some((p) => p.test(text));\n}\n","/**\n * Mermaid Component - Dynamic Import Wrapper\n *\n * Lazy loads the heavy Mermaid library (~800KB) only when needed.\n * This significantly reduces the initial bundle size.\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\n\n// Lazy load the client component\nconst MermaidClient = lazy(() => import('./Mermaid.client'));\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"flex justify-center items-center min-h-[100px]\">\n <div className=\"animate-spin rounded-full h-6 w-6 border-b-2 border-primary\" />\n </div>\n);\n\nexport interface MermaidProps {\n chart: string;\n className?: string;\n isCompact?: boolean;\n /** Enable click-to-fullscreen functionality (default: true) */\n fullscreen?: boolean;\n}\n\nconst Mermaid: React.FC<MermaidProps> = (props) => {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <MermaidClient {...props} />\n </Suspense>\n );\n};\n\nexport default Mermaid;\n\n// Re-export builders for declarative diagram construction\nexport {\n // Core\n DiagramStore,\n sanitizeLabel,\n toNodeId,\n // Theme hooks\n useThemePalette,\n useStylePresets,\n useBoxColors,\n // FlowDiagram\n FlowDiagram,\n STYLE_PRESETS,\n // SequenceDiagram\n SequenceDiagram,\n // JourneyDiagram\n JourneyDiagram,\n} from './builders';\n\nexport type {\n // Core types\n DiagramStoreOptions,\n FlowDirection,\n NodeShape,\n ParticipantType,\n TaskScore,\n // Theme types\n ThemePalette,\n StyleColors,\n StylePresets,\n BoxColors,\n // FlowDiagram types\n FlowDiagramOptions,\n FlowDiagramBuilder,\n NodeBuilder,\n EdgeBuilder,\n StyleBuilder,\n // SequenceDiagram types\n ParticipantsObject,\n SequenceDiagramOptions,\n SequenceDiagramBuilder,\n // JourneyDiagram types\n JourneyDiagramOptions,\n JourneyDiagramBuilder,\n SectionBuilder,\n} from './builders';\n","/**\n * PrettyCode Component - Dynamic Import Wrapper\n *\n * Lazy loads the heavy Prism library (~500KB) only when needed.\n * This significantly reduces the initial bundle size.\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport type { Language } from 'prism-react-renderer';\n\n// Lazy load the client component\nconst PrettyCodeClient = lazy(() => import('./PrettyCode.client'));\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900\">\n <div className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20\"></div>\n <span className=\"text-xs text-muted-foreground\">Loading code...</span>\n </div>\n </div>\n </div>\n);\n\nexport interface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string;\n isCompact?: boolean;\n /** Block scroll capture until user clicks (default: true) */\n scrollIsolation?: boolean;\n /**\n * Line count above which the block starts scrolling instead of growing.\n * ``undefined`` (default) = no cap, block grows to fit. Set e.g. ``50``\n * to inline short snippets and cap long ones.\n */\n maxLines?: number;\n /**\n * Visual variant:\n * - ``\"card\"`` (default) — full chrome: border, background, hover\n * toolbar (Copy + language tag), optional internal scroll. Suits\n * a standalone code block in documentation prose where the block\n * is its own surface.\n * - ``\"plain\"`` — chrome-less: no border, no background, no toolbar,\n * no internal scroll. Grows to fit its content. Use when\n * embedding inside another scroll container (e.g. the Response\n * panel) — avoids double-scroll surfaces and lets the parent\n * manage copy/language affordances.\n */\n variant?: 'card' | 'plain';\n}\n\nconst PrettyCode: React.FC<PrettyCodeProps> = (props) => {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <PrettyCodeClient {...props} />\n </Suspense>\n );\n};\n\nexport default PrettyCode;\nexport type { Language };\n","import { defaultSchema } from 'rehype-sanitize';\n\n/** Sanitize schema. Typed loosely (`Record<string, unknown>`) so this\n * package's published types don't try to re-export\n * `hast-util-sanitize`'s internal Schema type — that breaks consumers\n * whose TS doesn't have the transitive dependency in scope. */\nexport type SanitizeSchema = Record<string, unknown>;\n\n// Allow-list HTML that OpenAPI descriptions commonly use — we want\n// `<b>`/`<code>`/`<br>` to render, not to appear as literal text.\n// Built on top of rehype-sanitize's default schema so we keep the\n// XSS protection (no `<script>`, no `on*` handlers, no `javascript:`\n// URLs); we just extend the tag allow-list with safe presentational\n// elements that are in wide use in API docs.\nexport const HTML_SCHEMA_BASE: SanitizeSchema = {\n ...defaultSchema,\n tagNames: [\n ...(defaultSchema.tagNames ?? []),\n 'br',\n 'b',\n 'i',\n 'u',\n 's',\n 'sub',\n 'sup',\n 'small',\n 'mark',\n 'kbd',\n 'code',\n 'pre',\n 'details',\n 'summary',\n ],\n};\n\n/** Build a sanitize schema with extra href-URL protocols allowed on\n * `<a>`. Default whitelists `http(s)/mailto/xmpp/irc(s)` — pass extras\n * here (e.g. `'cmdop'`, `'obsidian'`) to opt them in. */\nexport function buildSchema(extraProtocols: readonly string[] | undefined): SanitizeSchema {\n if (!extraProtocols || extraProtocols.length === 0) return HTML_SCHEMA_BASE;\n const baseProtocols =\n (HTML_SCHEMA_BASE as { protocols?: Record<string, string[]> }).protocols\n ?? (defaultSchema as { protocols?: Record<string, string[]> }).protocols\n ?? {};\n const baseHref = baseProtocols.href ?? ['http', 'https', 'mailto', 'xmpp', 'irc', 'ircs'];\n return {\n ...HTML_SCHEMA_BASE,\n protocols: {\n ...baseProtocols,\n href: [...baseHref, ...extraProtocols],\n },\n };\n}\n\n/** Build a `urlTransform` for ReactMarkdown that lets opted-in schemes\n * pass through verbatim. react-markdown's default strips `href` for\n * unrecognised schemes BEFORE sanitize runs — even with our extended\n * sanitize schema, custom schemes would arrive with `href=\"\"`. */\nexport function buildUrlTransform(extraProtocols: readonly string[] | undefined) {\n if (!extraProtocols || extraProtocols.length === 0) return undefined;\n const lower = extraProtocols.map((p) => p.toLowerCase() + ':');\n return (url: string): string => {\n const u = url.trim().toLowerCase();\n for (const p of lower) {\n if (u.startsWith(p)) return url;\n }\n // Fallback: replicate react-markdown's defaults for safe schemes\n // and relative paths. Anything else → empty string so the\n // anchor's href is dropped (XSS guard).\n if (\n /^(https?:|mailto:|tel:|xmpp:|irc:|ircs:|#|\\/|\\.\\/|\\.\\.\\/|\\?)/i.test(u)\n || /^[a-z0-9._~!$&'()*+,;=:@%-]+$/i.test(u)\n ) {\n return url;\n }\n return '';\n };\n}\n","import React from 'react';\nimport { CopyButton } from '@djangocfg/ui-core/components';\nimport { useResolvedTheme } from '@djangocfg/ui-core/hooks';\nimport PrettyCode from '../../../tools/PrettyCode';\n\ninterface CodeBlockProps {\n code: string;\n language: string;\n isUser: boolean;\n isCompact?: boolean;\n}\n\n/** Code block with a hover-revealed Copy button on top of PrettyCode. */\nexport const CodeBlock: React.FC<CodeBlockProps> = ({ code, language, isUser, isCompact = false }) => {\n const theme = useResolvedTheme();\n\n return (\n <div className=\"relative group my-3\">\n <CopyButton\n value={code}\n variant=\"ghost\"\n className={`\n absolute top-2 right-2 z-10 opacity-0 group-hover:opacity-100 transition-opacity\n h-8 w-8\n ${isUser\n ? 'hover:bg-white/20 text-white'\n : 'hover:bg-muted-foreground/20 text-muted-foreground hover:text-foreground'\n }\n `}\n title=\"Copy code\"\n />\n\n <PrettyCode\n data={code}\n language={language}\n className={isCompact ? 'text-xs' : 'text-sm'}\n customBg={isUser ? 'bg-white/10' : 'bg-muted dark:bg-muted'}\n mode={theme}\n isCompact={isCompact}\n />\n </div>\n );\n};\n\n/** Simple `<pre>` fallback used when CodeBlock throws (lazy module\n * failure, missing PrettyCode peer, etc). */\nexport const CodeBlockFallback: React.FC<CodeBlockProps> = ({ code, isUser }) => (\n <div className=\"relative group my-3\">\n <CopyButton\n value={code}\n variant=\"ghost\"\n className={`\n absolute top-2 right-2 z-10 opacity-0 group-hover:opacity-100 transition-opacity\n h-8 w-8\n ${isUser\n ? 'hover:bg-white/20 text-white'\n : 'hover:bg-muted-foreground/20 text-muted-foreground hover:text-foreground'\n }\n `}\n title=\"Copy code\"\n />\n <pre className={`\n p-3 rounded text-xs font-mono overflow-x-auto\n ${isUser ? 'bg-white/10 text-white' : 'bg-muted text-foreground'}\n `}>\n <code>{code}</code>\n </pre>\n </div>\n);\n","import React from 'react';\nimport type { Components } from 'react-markdown';\nimport Mermaid from '../../../tools/Mermaid';\nimport { CodeBlock, CodeBlockFallback } from './CodeBlock';\nimport { extractTextFromChildren } from './plainText';\n\n/**\n * Build the chat-tuned markdown component map.\n *\n * Base text size: text-sm (14px) for normal, text-xs (12px) for compact.\n * Heading sizes are scaled down a notch from the prose defaults so\n * inline-in-chat headings don't dominate.\n */\nexport function createMarkdownComponents(\n isUser: boolean = false,\n isCompact: boolean = false,\n): Components {\n const textSize = isCompact ? 'text-xs' : 'text-sm';\n const headingBase = isCompact ? 'text-sm' : 'text-base';\n const headingSm = isCompact ? 'text-xs' : 'text-sm';\n\n return {\n h1: ({ children }) => (\n <h1 className={`${headingBase} font-bold mb-2 mt-3 first:mt-0`}>{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className={`${headingSm} font-bold mb-2 mt-3 first:mt-0`}>{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className={`${headingSm} font-semibold mb-1 mt-2 first:mt-0`}>{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className={`${headingSm} font-semibold mb-1 mt-2 first:mt-0`}>{children}</h4>\n ),\n h5: ({ children }) => (\n <h5 className={`${headingSm} font-medium mb-1 mt-2 first:mt-0`}>{children}</h5>\n ),\n h6: ({ children }) => (\n <h6 className={`${headingSm} font-medium mb-1 mt-2 first:mt-0`}>{children}</h6>\n ),\n\n p: ({ children }) => (\n <p className={`${textSize} mb-4 last:mb-0 leading-7 break-words font-light`}>{children}</p>\n ),\n\n ul: ({ children }) => (\n <ul className={`list-disc list-inside mb-2 space-y-1 ${textSize}`}>{children}</ul>\n ),\n ol: ({ children }) => (\n <ol className={`list-decimal list-inside mb-2 space-y-1 ${textSize}`}>{children}</ol>\n ),\n li: ({ children }) => <li className=\"break-words\">{children}</li>,\n\n a: ({ href, children }) => (\n <a\n href={href}\n className={`${textSize} ${\n isUser\n ? 'text-white/90 underline hover:text-white'\n : 'text-primary underline hover:text-primary/80'\n } transition-colors break-all`}\n target={href?.startsWith('http') ? '_blank' : undefined}\n rel={href?.startsWith('http') ? 'noopener noreferrer' : undefined}\n >\n {children}\n </a>\n ),\n\n pre: ({ children }) => {\n let codeContent = '';\n let language = 'plaintext';\n\n if (React.isValidElement(children)) {\n const child = children;\n if (\n child.type === 'code'\n || (typeof child.type === 'function' && child.type.name === 'code')\n ) {\n const codeProps = child.props as {\n className?: string;\n children?: React.ReactNode;\n };\n const rawClassName = codeProps.className;\n language = rawClassName?.replace(/language-/, '').trim() || 'plaintext';\n codeContent = extractTextFromChildren(codeProps.children).trim();\n } else {\n codeContent = extractTextFromChildren(children).trim();\n }\n } else {\n codeContent = extractTextFromChildren(children).trim();\n }\n\n if (!codeContent) {\n return (\n <div className=\"my-3 p-3 bg-muted rounded text-sm text-muted-foreground\">\n No content available\n </div>\n );\n }\n\n if (language === 'mermaid') {\n return (\n <div className=\"my-3 max-w-full overflow-x-auto\">\n <Mermaid chart={codeContent} className=\"max-w-[600px] mx-auto\" isCompact={isCompact} />\n </div>\n );\n }\n\n try {\n return <CodeBlock code={codeContent} language={language} isUser={isUser} isCompact={isCompact} />;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn('CodeBlock failed, using fallback:', error);\n return <CodeBlockFallback code={codeContent} language={language} isUser={isUser} isCompact={isCompact} />;\n }\n },\n\n code: ({ children, className }) => {\n // Inside <pre>: let pre handle styling.\n if (className?.includes('language-')) {\n return <code className={className}>{children}</code>;\n }\n return (\n <code className=\"px-1.5 py-0.5 rounded text-xs font-mono bg-muted text-foreground break-all\">\n {extractTextFromChildren(children)}\n </code>\n );\n },\n\n blockquote: ({ children }) => (\n <blockquote className={`${textSize} border-l-2 border-border pl-3 my-2 italic text-muted-foreground break-words`}>\n {children}\n </blockquote>\n ),\n\n table: ({ children }) => (\n <div className=\"overflow-x-auto my-3\">\n <table className={`min-w-full ${textSize} border-collapse`}>{children}</table>\n </div>\n ),\n thead: ({ children }) => <thead className=\"bg-muted/50\">{children}</thead>,\n tbody: ({ children }) => <tbody>{children}</tbody>,\n tr: ({ children }) => <tr className=\"border-b border-border/50\">{children}</tr>,\n th: ({ children }) => (\n <th className=\"px-2 py-1 text-left font-medium break-words\">{children}</th>\n ),\n td: ({ children }) => <td className=\"px-2 py-1 break-words\">{children}</td>,\n\n hr: () => <hr className=\"my-3 border-0 h-px bg-border\" />,\n\n strong: ({ children }) => <strong className=\"font-semibold\">{children}</strong>,\n em: ({ children }) => <em className=\"italic\">{children}</em>,\n };\n}\n","import React from 'react';\n\ninterface CollapseToggleProps {\n isCollapsed: boolean;\n onClick: () => void;\n readMoreLabel: string;\n showLessLabel: string;\n isUser: boolean;\n isCompact: boolean;\n}\n\n/** \"Read more...\" / \"Show less\" button. */\nexport const CollapseToggle: React.FC<CollapseToggleProps> = ({\n isCollapsed,\n onClick,\n readMoreLabel,\n showLessLabel,\n isUser,\n isCompact,\n}) => {\n const textSize = isCompact ? 'text-xs' : 'text-sm';\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={`\n ${textSize} font-medium cursor-pointer\n transition-colors duration-200\n ${isUser ? 'text-white/80 hover:text-white' : 'text-primary hover:text-primary/80'}\n inline-flex items-center gap-1\n mt-1\n `}\n >\n {isCollapsed ? (\n <>\n {readMoreLabel}\n <Chevron direction=\"down\" />\n </>\n ) : (\n <>\n {showLessLabel}\n <Chevron direction=\"up\" />\n </>\n )}\n </button>\n );\n};\n\nfunction Chevron({ direction }: { direction: 'up' | 'down' }) {\n return (\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d={direction === 'down' ? 'M19 9l-7 7-7-7' : 'M5 15l7-7 7 7'}\n />\n </svg>\n );\n}\n","import React from 'react';\nimport type { ComponentProps, ComponentType } from 'react';\nimport type { Components } from 'react-markdown';\nimport type { LinkRule } from './types';\n\n// react-markdown's `Components['a']` is `keyof IntrinsicElements | ComponentType<…>`,\n// so it isn't necessarily a function we can directly call. This is the\n// component-shaped variant — what callers practically pass when they\n// override `a`.\ntype AComponent = ComponentType<ComponentProps<'a'>>;\n\n/** Run every rule's `preprocess` hook in order. Errors in a single\n * rule are logged and skipped — the other rules still run. */\nexport function applyPreprocess(\n source: string,\n rules: readonly LinkRule[] | undefined,\n): string {\n if (!rules || rules.length === 0) return source;\n let s = source;\n for (const rule of rules) {\n if (!rule.preprocess) continue;\n try {\n s = rule.preprocess(s);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\n `[MarkdownMessage] linkRule \"${rule.name ?? '(anonymous)'}\" preprocess threw; skipping`,\n err,\n );\n }\n }\n return s;\n}\n\n/** Union of `extraHrefProtocols` and any `protocols` declared by rules. */\nexport function collectProtocols(\n extraHrefProtocols: readonly string[] | undefined,\n rules: readonly LinkRule[] | undefined,\n): readonly string[] | undefined {\n const set = new Set<string>();\n if (extraHrefProtocols) for (const p of extraHrefProtocols) set.add(p);\n if (rules) {\n for (const r of rules) {\n if (r.protocols) for (const p of r.protocols) set.add(p);\n }\n }\n return set.size === 0 ? undefined : Array.from(set);\n}\n\n/** Build a custom `a` renderer that dispatches to the first matching\n * rule, falling through to `callerA` (or the built-in chat anchor)\n * for anything no rule claims. */\nexport function buildLinkRulesComponent(\n rules: readonly LinkRule[],\n isUser: boolean,\n callerA: NonNullable<Components['a']> | undefined,\n): NonNullable<Components['a']> {\n const Renderer: AComponent = (props) => {\n const { href, children } = props;\n if (typeof href === 'string') {\n for (const rule of rules) {\n if (rule.match(href)) {\n return React.createElement(\n React.Fragment,\n null,\n rule.render({ href, children, isUser }),\n );\n }\n }\n }\n // Defer to the caller's `a` override if any. We only call it when\n // it's a function/component — string-form intrinsic overrides\n // (`'a' | 'span' | …`) aren't a thing react-markdown supports for\n // tag overrides, but the type still admits the union, so guard.\n if (callerA && typeof callerA === 'function') {\n const Caller = callerA as AComponent;\n return React.createElement(Caller, props);\n }\n // Fall through to the built-in anchor by rendering a plain `<a>`.\n return React.createElement('a', props, children);\n };\n return Renderer as NonNullable<Components['a']>;\n}\n","'use client';\n\nimport React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport rehypeRaw from 'rehype-raw';\nimport rehypeSanitize from 'rehype-sanitize';\nimport remarkGfm from 'remark-gfm';\nimport type { Components } from 'react-markdown';\n\nimport { useCollapsibleContent } from '../useCollapsibleContent';\nimport type { MarkdownMessageProps } from './types';\nimport { buildSchema, buildUrlTransform } from './sanitize';\nimport { hasMarkdownSyntax } from './plainText';\nimport { createMarkdownComponents } from './components';\nimport { CollapseToggle } from './CollapseToggle';\nimport { applyPreprocess, buildLinkRulesComponent, collectProtocols } from './linkRules';\n\n/**\n * MarkdownMessage — chat-tuned markdown renderer.\n *\n * Features:\n * - GitHub Flavored Markdown (GFM) via remark-gfm\n * - Syntax-highlighted code blocks with Copy button\n * - Mermaid diagram rendering (` ```mermaid ` fence)\n * - Tables, lists, blockquotes scaled for chat density\n * - User vs assistant styling modes (`isUser`)\n * - Plain-text fast path: skips ReactMarkdown when content has no\n * markdown syntax (cheaper render, preserves newlines via CSS)\n * - Optional collapsible \"Read more...\" for long messages\n *\n * Custom URL schemes (chat mentions, deep-links, custom file viewers)\n * are best handled with the declarative `linkRules` prop — see the\n * type definition in `./types.ts` and the storybook for examples.\n *\n * @example\n * ```tsx\n * <MarkdownMessage content=\"# Hello\\n\\nThis is **bold** text.\" />\n *\n * // User message styling\n * <MarkdownMessage content=\"Some content\" isUser />\n *\n * // Custom URL scheme via linkRules\n * <MarkdownMessage\n * content=\"Talk to [Vps-audi](cmdop://machine/abc-123)\"\n * linkRules={[machineMentionRule]}\n * />\n * ```\n */\nexport const MarkdownMessage: React.FC<MarkdownMessageProps> = ({\n content,\n className = '',\n isUser = false,\n isCompact = false,\n customComponents,\n extraHrefProtocols,\n linkRules,\n collapsible = false,\n maxLength,\n maxLines,\n readMoreLabel = 'Read more...',\n showLessLabel = 'Show less',\n defaultExpanded = false,\n onCollapseChange,\n}) => {\n // Pre-process content through any rules that requested it. Done\n // before trim so a rule can rewrite multi-line shapes too.\n const preprocessed = React.useMemo(\n () => applyPreprocess(content, linkRules),\n [content, linkRules],\n );\n\n // Union of `extraHrefProtocols` and any `protocols` declared by rules.\n const effectiveProtocols = React.useMemo(\n () => collectProtocols(extraHrefProtocols, linkRules),\n [extraHrefProtocols, linkRules],\n );\n\n // Effective custom components: merge linkRules' synthesized `a`\n // renderer with any caller-provided `customComponents`. linkRules\n // wins when both target the same href (rule is the more specific\n // declarative claim by design).\n const effectiveCustomComponents = React.useMemo<Partial<Components> | undefined>(() => {\n if (!linkRules || linkRules.length === 0) return customComponents;\n const callerA = customComponents?.a;\n const aRenderer = buildLinkRulesComponent(linkRules, isUser, callerA);\n return { ...(customComponents ?? {}), a: aRenderer };\n }, [customComponents, linkRules, isUser]);\n\n const trimmedContent = preprocessed.trim();\n\n // Collapsible content logic — defaults kick in only when enabled.\n const collapsibleOptions = React.useMemo(() => {\n if (!collapsible) return {};\n return {\n maxLength: maxLength ?? 1000,\n maxLines: maxLines ?? 10,\n defaultExpanded,\n };\n }, [collapsible, maxLength, maxLines, defaultExpanded]);\n\n const { isCollapsed, toggleCollapsed, displayContent, shouldCollapse } =\n useCollapsibleContent(trimmedContent, collapsible ? collapsibleOptions : {});\n\n React.useEffect(() => {\n if (collapsible && shouldCollapse && onCollapseChange) {\n onCollapseChange(isCollapsed);\n }\n }, [isCollapsed, collapsible, shouldCollapse, onCollapseChange]);\n\n const components = React.useMemo(() => {\n const base = createMarkdownComponents(isUser, isCompact);\n return effectiveCustomComponents ? { ...base, ...effectiveCustomComponents } : base;\n }, [isUser, isCompact, effectiveCustomComponents]);\n\n const schema = React.useMemo(() => buildSchema(effectiveProtocols), [effectiveProtocols]);\n const urlTransform = React.useMemo(\n () => buildUrlTransform(effectiveProtocols),\n [effectiveProtocols],\n );\n\n const textSizeClass = isCompact ? 'text-xs' : 'text-sm';\n const proseClass = isCompact ? 'prose-xs' : 'prose-sm';\n\n // Plain-text fast path: skip ReactMarkdown when content is pure\n // prose. Bypassed when the caller wired up custom components or\n // link rules — those need to fire on plain `[label](custom://…)`\n // links the fast path would otherwise print verbatim.\n const isPlainText =\n !effectiveCustomComponents && !hasMarkdownSyntax(displayContent);\n\n if (isPlainText) {\n return (\n <span\n className={`${textSizeClass} leading-7 break-words whitespace-pre-line font-light ${className}`}\n >\n {displayContent}\n {collapsible && shouldCollapse && (\n <>\n {isCollapsed && '... '}\n <CollapseToggle\n isCollapsed={isCollapsed}\n onClick={toggleCollapsed}\n readMoreLabel={readMoreLabel}\n showLessLabel={showLessLabel}\n isUser={isUser}\n isCompact={isCompact}\n />\n </>\n )}\n </span>\n );\n }\n\n return (\n <div className={className}>\n <div\n className={`\n prose ${proseClass} max-w-none break-words overflow-hidden ${textSizeClass}\n ${isUser ? 'prose-invert' : 'dark:prose-invert'}\n [&>*]:leading-7\n `}\n style={{\n // Inherit colors from parent — fixes issues with external\n // CSS variables overriding prose tokens.\n '--tw-prose-body': 'inherit',\n '--tw-prose-headings': 'inherit',\n '--tw-prose-bold': 'inherit',\n '--tw-prose-links': 'inherit',\n color: 'inherit',\n } as React.CSSProperties}\n >\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n // rehype-raw parses inline HTML in the source; rehype-sanitize\n // (with our extended schema) runs after to keep XSS guards\n // (no scripts, no on* handlers, no javascript: urls).\n rehypePlugins={[rehypeRaw, [rehypeSanitize, schema]]}\n components={components}\n // urlTransform runs in remark-rehype before sanitize. Without\n // overriding it, react-markdown's default strips `href` for\n // unknown schemes — making our extended sanitize whitelist\n // moot. Only set when the caller opted into extra protocols.\n urlTransform={urlTransform}\n >\n {displayContent}\n </ReactMarkdown>\n </div>\n {collapsible && shouldCollapse && (\n <CollapseToggle\n isCollapsed={isCollapsed}\n onClick={toggleCollapsed}\n readMoreLabel={readMoreLabel}\n showLessLabel={showLessLabel}\n isUser={isUser}\n isCompact={isCompact}\n />\n )}\n </div>\n );\n};\n\nexport default MarkdownMessage;\n","/**\n * API Key Management Utility\n *\n * Provides centralized functions for managing API keys in headers and requests.\n * This utility can be used across different components that need to handle API keys.\n */\n\nimport type { ApiKey } from '../types';\n\nexport type { ApiKey };\n\nexport interface HeadersWithApiKey {\n [key: string]: string;\n}\n\n/**\n * Add API key to request headers\n * @param headers - Existing headers object\n * @param apiKey - API key object or string\n * @returns Headers with API key added\n */\nexport function addApiKeyToHeaders(headers: HeadersWithApiKey, apiKey: ApiKey | string | null): HeadersWithApiKey {\n if (!apiKey) {\n return headers;\n }\n\n // ``secret`` is the raw key that goes in the X-API-Key header.\n // Falls back to ``id`` for backwards compatibility — older callers\n // only had ``id`` and used it as both selector and secret.\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.secret || apiKey.id || '');\n\n return {\n ...headers,\n 'X-API-Key': keyValue,\n };\n}\n\n/**\n * Remove API key from headers object\n * @param headers - Headers object\n * @returns Headers without API key\n */\nexport function removeApiKeyFromHeaders(headers: HeadersWithApiKey): HeadersWithApiKey {\n const { 'X-API-Key': removed, ...remainingHeaders } = headers;\n return remainingHeaders;\n}\n\n/**\n * Remove API key from headers JSON string\n * @param headersJson - JSON string of headers\n * @returns JSON string without API key\n */\nexport function removeApiKeyFromHeadersJson(headersJson: string): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = removeApiKeyFromHeaders(headers);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Update headers JSON string with API key\n * @param headersJson - JSON string of headers\n * @param apiKey - API key object or string\n * @returns Updated JSON string\n */\nexport function updateHeadersJsonWithApiKey(headersJson: string, apiKey: ApiKey | string | null): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = addApiKeyToHeaders(headers, apiKey);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Find API key by ID in a list of API keys\n * @param apiKeys - Array of API keys\n * @param keyId - ID of the API key to find\n * @returns API key object or null\n */\nexport function findApiKeyById(apiKeys: ApiKey[], keyId: string): ApiKey | null {\n return apiKeys.find((key) => key.id === keyId) || null;\n}\n\n/**\n * Validate API key format\n * @param apiKey - API key string to validate\n * @returns Whether the API key format is valid\n */\nexport function validateApiKeyFormat(apiKey: string): boolean {\n // Basic validation - adjust based on your API key format requirements\n return typeof apiKey === 'string' && apiKey.length > 0 && apiKey.trim() !== '';\n}\n\n/**\n * Create default headers with API key\n * @param apiKey - API key object or string\n * @returns Default headers with API key\n */\nexport function createDefaultHeaders(apiKey?: ApiKey | string): HeadersWithApiKey {\n const defaultHeaders: HeadersWithApiKey = {\n 'Content-Type': 'application/json',\n };\n\n if (apiKey) {\n return addApiKeyToHeaders(defaultHeaders, apiKey);\n }\n\n return defaultHeaders;\n}\n\n/**\n * Merge headers with API key\n * @param baseHeaders - Base headers object\n * @param additionalHeaders - Additional headers to merge\n * @param apiKey - API key to add\n * @returns Merged headers with API key\n */\nexport function mergeHeadersWithApiKey(baseHeaders: HeadersWithApiKey, additionalHeaders: HeadersWithApiKey, apiKey?: ApiKey | string): HeadersWithApiKey {\n const mergedHeaders = { ...baseHeaders, ...additionalHeaders };\n\n if (apiKey) {\n return addApiKeyToHeaders(mergedHeaders, apiKey);\n }\n\n return mergedHeaders;\n}\n\n/**\n * Log API key usage (for debugging/analytics)\n * @param apiKey - API key that was used\n * @param endpoint - Endpoint that was called\n * @param success - Whether the request was successful\n */\nexport function logApiKeyUsage(apiKey: ApiKey | string, endpoint: string, success: boolean): void {\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.secret || apiKey.id || '');\n const keyName = typeof apiKey === 'string' ? 'Unknown' : apiKey.name;\n\n console.log(`API Key Usage:`, {\n keyName,\n keyValue: keyValue.substring(0, 8) + '...',\n endpoint,\n success,\n timestamp: new Date().toISOString(),\n });\n}\n","/**\n * Code sample generation.\n *\n * In-house, browser-safe generator for a small catalogue of languages\n * (curl / fetch / Node axios / Python requests / Go / PHP / Ruby /\n * Java OkHttp). We used to wrap Kong's ``httpsnippet`` here but it is\n * Node-only — the bundle referenced ``global`` / ``stream`` /\n * ``string_decoder`` and crashed in Vite dev. Writing our own keeps the\n * chunk small (a few kB vs ~1.5 MB) and avoids runtime polyfills.\n *\n * Adding more targets later is one function plus a row in the catalogue.\n */\n\nimport type { HarRequest } from './operationToHar';\n\n// Prism language ids used by ``prism-react-renderer``. ``bash``,\n// ``ruby``, ``java`` and ``php`` aren't in the library's default\n// bundle, but our ``registerPrismLanguages`` module pulls their\n// grammars from ``prismjs`` at load time so they work as first-class\n// languages here.\nexport const CODE_SAMPLE_TARGETS = [\n { id: 'curl', label: 'cURL', prism: 'bash' },\n { id: 'fetch', label: 'JavaScript', prism: 'javascript' },\n { id: 'axios', label: 'Node (axios)', prism: 'javascript' },\n { id: 'python', label: 'Python', prism: 'python' },\n { id: 'go', label: 'Go', prism: 'go' },\n { id: 'php', label: 'PHP', prism: 'php' },\n { id: 'ruby', label: 'Ruby', prism: 'ruby' },\n { id: 'java', label: 'Java', prism: 'java' },\n] as const;\n\nexport type CodeSampleTargetId = typeof CODE_SAMPLE_TARGETS[number]['id'];\n\n// ─── Body literal helpers ─────────────────────────────────────────────────────\n//\n// Pre-formatted JSON bodies (``JSON.stringify(value, null, 2)``) carry\n// real newlines that we want the snippet to preserve — a one-line\n// escaped string like ``\"{\\n \\\"id\\\": 10,\\n …}\"`` reads as a wall of\n// escape sequences. Each helper below returns a multi-line string\n// literal in the target language's native syntax so the snippet reads\n// like hand-written code.\n\n/** Go raw string literal — uses backticks. Falls back to a double-\n * quoted escaped literal when the body itself contains a backtick. */\nfunction goRawString(s: string): string {\n return s.includes('`') ? JSON.stringify(s) : `\\`${s}\\``;\n}\n\n/** Python triple-quoted string — uses ``\"\"\"``. Falls back to escaped\n * form when the body already contains that sequence. */\nfunction pythonTripleQuote(s: string): string {\n return s.includes('\"\"\"') ? JSON.stringify(s) : `\"\"\"${s}\"\"\"`;\n}\n\n/** Ruby squiggly heredoc — ``<<~JSON`` style strips common leading\n * whitespace. Safe unless the body literally contains ``JSON`` on a\n * line by itself, which is vanishingly rare. */\nfunction rubyHeredoc(s: string): string {\n return `<<~JSON\\n${s}\\nJSON`;\n}\n\n/** PHP heredoc — ``<<<JSON`` style. Same caveat as Ruby's. Trailing\n * ``JSON;`` must sit at column 0 (enforced by this template). */\nfunction phpHeredoc(s: string): string {\n return `<<<JSON\\n${s}\\nJSON`;\n}\n\n/** Java 15+ text block — ``\"\"\"``. Falls back to an escaped literal\n * when the body contains that sequence. */\nfunction javaTextBlock(s: string): string {\n if (s.includes('\"\"\"')) return JSON.stringify(s);\n // Text blocks need the opening ``\"\"\"`` on its own line — the\n // parser strips the newline that immediately follows the delimiter.\n return `\"\"\"\\n${s}\\n\"\"\"`;\n}\n\nfunction fullUrl(har: HarRequest): string {\n if (!har.queryString.length) return har.url;\n const qs = har.queryString\n .map((p) => `${encodeURIComponent(p.name)}=${encodeURIComponent(p.value)}`)\n .join('&');\n const sep = har.url.includes('?') ? '&' : '?';\n return `${har.url}${sep}${qs}`;\n}\n\nfunction shellEscape(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction renderCurl(har: HarRequest): string {\n const lines: string[] = [`curl -X ${har.method} ${shellEscape(fullUrl(har))}`];\n for (const h of har.headers) {\n lines.push(` -H ${shellEscape(`${h.name}: ${h.value}`)}`);\n }\n if (har.postData?.text) {\n lines.push(` -d ${shellEscape(har.postData.text)}`);\n }\n return lines.join(' \\\\\\n');\n}\n\nfunction jsHeadersLiteral(har: HarRequest, indent: string): string {\n if (!har.headers.length) return '{}';\n const entries = har.headers\n .map((h) => `${indent} ${JSON.stringify(h.name)}: ${JSON.stringify(h.value)}`)\n .join(',\\n');\n return `{\\n${entries},\\n${indent}}`;\n}\n\n/** JS template literal — backtick string that preserves newlines and\n * escapes backticks / ``${`` sequences. Makes multi-line JSON body\n * readable inside the fetch() options. */\nfunction jsTemplateLiteral(s: string): string {\n if (/[`$]/.test(s)) return JSON.stringify(s);\n return `\\`${s}\\``;\n}\n\nfunction renderFetch(har: HarRequest): string {\n const url = fullUrl(har);\n const options: string[] = [` method: ${JSON.stringify(har.method)}`];\n if (har.headers.length) {\n options.push(` headers: ${jsHeadersLiteral(har, ' ')}`);\n }\n if (har.postData?.text) {\n options.push(` body: ${jsTemplateLiteral(har.postData.text)}`);\n }\n return `const response = await fetch(${JSON.stringify(url)}, {\\n${options.join(',\\n')},\\n});\\nconst data = await response.json();`;\n}\n\nfunction renderAxios(har: HarRequest): string {\n const url = fullUrl(har);\n const config: string[] = [\n ` method: ${JSON.stringify(har.method.toLowerCase())}`,\n ` url: ${JSON.stringify(url)}`,\n ];\n if (har.headers.length) {\n config.push(` headers: ${jsHeadersLiteral(har, ' ')}`);\n }\n if (har.postData?.text) {\n // Axios auto-serializes objects; we pass the raw JSON string as data.\n config.push(` data: ${har.postData.text}`);\n }\n return `import axios from 'axios';\\n\\nconst { data } = await axios({\\n${config.join(',\\n')},\\n});`;\n}\n\nfunction renderPython(har: HarRequest): string {\n const lines: string[] = [`import requests`, ``];\n lines.push(`url = ${JSON.stringify(fullUrl(har))}`);\n if (har.headers.length) {\n const headerEntries = har.headers\n .map((h) => ` ${JSON.stringify(h.name)}: ${JSON.stringify(h.value)}`)\n .join(',\\n');\n lines.push(`headers = {\\n${headerEntries},\\n}`);\n }\n if (har.postData?.text) {\n // ``json=payload`` on ``requests`` expects a Python object, not\n // a JSON string — so we leave the body as a raw dict literal\n // (which Python parses identically to the JSON source for the\n // shapes we generate). No wrapping helper needed here.\n lines.push(`payload = ${har.postData.text}`);\n }\n const args = [`url`];\n if (har.headers.length) args.push(`headers=headers`);\n if (har.postData?.text) args.push(`json=payload`);\n lines.push(``, `response = requests.${har.method.toLowerCase()}(${args.join(', ')})`);\n lines.push(`data = response.json()`);\n return lines.join('\\n');\n}\n\nfunction renderGo(har: HarRequest): string {\n const url = fullUrl(har);\n const lines: string[] = [\n `package main`,\n ``,\n `import (`,\n ` \"fmt\"`,\n ` \"io\"`,\n ];\n if (har.postData?.text) lines.push(` \"strings\"`);\n lines.push(` \"net/http\"`);\n lines.push(`)`, ``, `func main() {`);\n if (har.postData?.text) {\n lines.push(` payload := strings.NewReader(${goRawString(har.postData.text)})`);\n lines.push(` req, _ := http.NewRequest(${JSON.stringify(har.method)}, ${JSON.stringify(url)}, payload)`);\n } else {\n lines.push(` req, _ := http.NewRequest(${JSON.stringify(har.method)}, ${JSON.stringify(url)}, nil)`);\n }\n for (const h of har.headers) {\n lines.push(` req.Header.Add(${JSON.stringify(h.name)}, ${JSON.stringify(h.value)})`);\n }\n lines.push(\n ``,\n ` res, _ := http.DefaultClient.Do(req)`,\n ` defer res.Body.Close()`,\n ` body, _ := io.ReadAll(res.Body)`,\n ` fmt.Println(string(body))`,\n `}`,\n );\n return lines.join('\\n');\n}\n\nfunction renderPhp(har: HarRequest): string {\n const lines: string[] = [`<?php`, ``, `$curl = curl_init();`, ``, `curl_setopt_array($curl, [`];\n lines.push(` CURLOPT_URL => ${JSON.stringify(fullUrl(har))},`);\n lines.push(` CURLOPT_RETURNTRANSFER => true,`);\n lines.push(` CURLOPT_CUSTOMREQUEST => ${JSON.stringify(har.method)},`);\n if (har.postData?.text) {\n lines.push(` CURLOPT_POSTFIELDS => ${phpHeredoc(har.postData.text)},`);\n }\n if (har.headers.length) {\n const headerList = har.headers\n .map((h) => ` ${JSON.stringify(`${h.name}: ${h.value}`)}`)\n .join(',\\n');\n lines.push(` CURLOPT_HTTPHEADER => [\\n${headerList},\\n ],`);\n }\n lines.push(`]);`, ``, `$response = curl_exec($curl);`, `curl_close($curl);`, `echo $response;`);\n return lines.join('\\n');\n}\n\nfunction renderRuby(har: HarRequest): string {\n const lines: string[] = [\n `require 'net/http'`,\n `require 'uri'`,\n `require 'json'`,\n ``,\n `uri = URI(${JSON.stringify(fullUrl(har))})`,\n `http = Net::HTTP.new(uri.host, uri.port)`,\n `http.use_ssl = uri.scheme == 'https'`,\n ``,\n ];\n const methodClass = har.method.charAt(0) + har.method.slice(1).toLowerCase();\n lines.push(`request = Net::HTTP::${methodClass}.new(uri)`);\n for (const h of har.headers) {\n lines.push(`request[${JSON.stringify(h.name)}] = ${JSON.stringify(h.value)}`);\n }\n if (har.postData?.text) {\n lines.push(`request.body = ${rubyHeredoc(har.postData.text)}`);\n }\n lines.push(``, `response = http.request(request)`, `puts response.body`);\n return lines.join('\\n');\n}\n\nfunction renderJava(har: HarRequest): string {\n const lines: string[] = [\n `OkHttpClient client = new OkHttpClient();`,\n ``,\n ];\n if (har.postData?.text) {\n lines.push(\n `MediaType mediaType = MediaType.parse(\"application/json\");`,\n `RequestBody body = RequestBody.create(mediaType, ${javaTextBlock(har.postData.text)});`,\n ``,\n );\n }\n lines.push(`Request request = new Request.Builder()`);\n lines.push(` .url(${JSON.stringify(fullUrl(har))})`);\n if (har.postData?.text) {\n lines.push(` .method(${JSON.stringify(har.method)}, body)`);\n } else {\n lines.push(` .method(${JSON.stringify(har.method)}, null)`);\n }\n for (const h of har.headers) {\n lines.push(` .addHeader(${JSON.stringify(h.name)}, ${JSON.stringify(h.value)})`);\n }\n lines.push(` .build();`, ``, `Response response = client.newCall(request).execute();`);\n return lines.join('\\n');\n}\n\nconst RENDERERS: Record<CodeSampleTargetId, (har: HarRequest) => string> = {\n curl: renderCurl,\n fetch: renderFetch,\n axios: renderAxios,\n python: renderPython,\n go: renderGo,\n php: renderPhp,\n ruby: renderRuby,\n java: renderJava,\n};\n\nexport function renderSnippet(har: HarRequest, targetId: CodeSampleTargetId): string | null {\n const renderer = RENDERERS[targetId];\n if (!renderer) return null;\n try {\n return renderer(har);\n } catch {\n return null;\n }\n}\n","/**\n * OpenAPI endpoint → HAR request.\n *\n * Our in-house code-sample renderers consume a HAR 1.2-shaped request.\n * This module shapes an ``ApiEndpoint`` + user-provided parameter\n * values into that form — path substitution, query-string assembly,\n * header inference, body formatting.\n *\n * We keep the HAR intermediate (rather than a bespoke type) so the\n * renderers match well-known HAR semantics and stay easy to extend.\n */\n\nimport type { ApiEndpoint } from '../types';\n\n/** HAR 1.2 request subset that our renderers consume. We don't ship\n * the full HAR type surface — just the fields that snippet generators\n * actually read. */\nexport interface HarRequest {\n method: string;\n url: string;\n httpVersion: string;\n headers: Array<{ name: string; value: string }>;\n queryString: Array<{ name: string; value: string }>;\n cookies: Array<{ name: string; value: string }>;\n headersSize: number;\n bodySize: number;\n postData?: {\n mimeType: string;\n text: string;\n };\n}\n\nexport interface BuildHarInput {\n endpoint: ApiEndpoint;\n /** Raw body string — whatever the user typed in the playground or\n * the pre-sampled example. Passed through verbatim; the caller\n * decides the content shape. */\n body?: string;\n /** Path-param + query-param values, keyed by name. We look up each\n * parameter on ``endpoint`` to decide whether it slots into the\n * path or the query string. */\n parameters?: Record<string, string>;\n /** Extra headers to merge in (e.g. ``X-API-Key``, ``Authorization``).\n * Later entries with the same name override earlier ones. */\n headers?: Record<string, string>;\n /** Override the request URL's base. When absent we use\n * ``endpoint.path`` as-is (extractor already prepended base URL). */\n baseUrl?: string;\n}\n\n/** Split a template path into path vs query. Substitutes ``{id}``-style\n * placeholders using the provided parameter map; unused entries flow\n * into the query string. */\nfunction buildUrl(\n endpoint: ApiEndpoint,\n parameters: Record<string, string>,\n baseUrl?: string,\n): { url: string; queryString: HarRequest['queryString'] } {\n const pathParamNames = new Set(\n (endpoint.parameters ?? [])\n .filter((p) => endpoint.path.includes(`{${p.name}}`))\n .map((p) => p.name),\n );\n\n let path = endpoint.path;\n for (const name of pathParamNames) {\n const value = parameters[name] ?? `{${name}}`;\n path = path.replaceAll(`{${name}}`, encodeURIComponent(value));\n }\n\n const queryString: HarRequest['queryString'] = [];\n for (const param of endpoint.parameters ?? []) {\n if (pathParamNames.has(param.name)) continue;\n const value = parameters[param.name];\n if (value === undefined || value === '') continue;\n queryString.push({ name: param.name, value });\n }\n\n const url = baseUrl ? `${baseUrl.replace(/\\/+$/, '')}${path.startsWith('/') ? path : `/${path}`}` : path;\n return { url, queryString };\n}\n\n/** Build a HAR 1.2 request from an API endpoint + current form values. */\nexport function buildHarRequest(input: BuildHarInput): HarRequest {\n const { endpoint, body, parameters = {}, headers = {}, baseUrl } = input;\n const { url, queryString } = buildUrl(endpoint, parameters, baseUrl);\n\n const hasBody = Boolean(body && body.trim().length > 0);\n const bodyMime = hasBody\n ? 'application/json'\n : undefined;\n\n // Merge headers. Caller wins, but we default Content-Type for bodies\n // and Accept for JSON endpoints — snippet consumers expect these.\n const mergedHeaders: Record<string, string> = {};\n if (hasBody && bodyMime) mergedHeaders['Content-Type'] = bodyMime;\n mergedHeaders['Accept'] = 'application/json';\n for (const [k, v] of Object.entries(headers)) {\n if (v === undefined || v === '') continue;\n mergedHeaders[k] = v;\n }\n\n const har: HarRequest = {\n method: endpoint.method.toUpperCase(),\n url,\n httpVersion: 'HTTP/1.1',\n headers: Object.entries(mergedHeaders).map(([name, value]) => ({ name, value })),\n queryString,\n cookies: [],\n headersSize: -1,\n bodySize: hasBody ? new TextEncoder().encode(body!).length : 0,\n };\n\n if (hasBody && bodyMime) {\n har.postData = { mimeType: bodyMime, text: body! };\n }\n\n return har;\n}\n","/**\n * API Version Management Utilities\n * Handles version detection, filtering, and URL transformation\n */\n\nimport type { ApiEndpoint } from '../types';\n\nexport interface ApiVersion {\n id: string;\n name: string;\n description: string;\n isDefault: boolean;\n}\n\n// Available API versions\nexport const API_VERSIONS: ApiVersion[] = [\n {\n id: 'v1',\n name: 'v1',\n description: 'Current stable version',\n isDefault: true,\n },\n];\n\n/**\n * Detect version from endpoint path\n */\nexport const detectEndpointVersion = (path: string): string => {\n // Check for versioned paths like /api/vehicles_api/v1/...\n const versionMatch = path.match(/\\/api\\/[^/]+\\/(v\\d+)\\//);\n if (versionMatch && versionMatch[1]) {\n return versionMatch[1];\n }\n \n // If no version found, default to v1\n return 'v1';\n};\n\n/**\n * Check if endpoint belongs to specific version\n */\nexport const isEndpointInVersion = (endpoint: ApiEndpoint, version: string): boolean => {\n const endpointVersion = detectEndpointVersion(endpoint.path);\n return endpointVersion === version;\n};\n\n/**\n * Filter endpoints by version\n */\nexport const filterEndpointsByVersion = (endpoints: ApiEndpoint[], version: string): ApiEndpoint[] => {\n return endpoints.filter(endpoint => isEndpointInVersion(endpoint, version));\n};\n\n/**\n * Remove duplicate endpoints across versions\n * Keeps only the specified version, removes duplicates from other versions\n */\nexport const deduplicateEndpoints = (endpoints: ApiEndpoint[], preferredVersion: string): ApiEndpoint[] => {\n const endpointMap = new Map<string, ApiEndpoint>();\n \n // Group endpoints by normalized path (without version)\n const groupedEndpoints = new Map<string, ApiEndpoint[]>();\n \n endpoints.forEach(endpoint => {\n const normalizedPath = normalizeEndpointPath(endpoint.path);\n if (!groupedEndpoints.has(normalizedPath)) {\n groupedEndpoints.set(normalizedPath, []);\n }\n groupedEndpoints.get(normalizedPath)!.push(endpoint);\n });\n \n // For each group, pick the endpoint from preferred version\n groupedEndpoints.forEach((endpointGroup, normalizedPath) => {\n let selectedEndpoint: ApiEndpoint | null = null;\n \n // Try to find endpoint in preferred version\n const versionEndpoint = endpointGroup.find(ep => isEndpointInVersion(ep, preferredVersion));\n if (versionEndpoint) {\n selectedEndpoint = versionEndpoint;\n } else if (endpointGroup.length > 0) {\n // Fallback to first available endpoint\n selectedEndpoint = endpointGroup[0] || null;\n }\n \n if (selectedEndpoint) {\n endpointMap.set(normalizedPath, selectedEndpoint);\n }\n });\n \n return Array.from(endpointMap.values());\n};\n\n/**\n * Normalize endpoint path by removing version prefix\n * /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/vehicles/\n * /api/vehicles_api/vehicles/ -> /api/vehicles_api/vehicles/\n */\nexport const normalizeEndpointPath = (path: string): string => {\n // Remove version prefix like /v1/, /v2/, etc.\n return path.replace(/\\/v\\d+\\//, '/');\n};\n\n/**\n * Convert endpoint path to specific version\n */\nexport const convertEndpointToVersion = (endpoint: ApiEndpoint, targetVersion: string): ApiEndpoint => {\n const currentVersion = detectEndpointVersion(endpoint.path);\n \n // If already in target version, return as is\n if (currentVersion === targetVersion) {\n return endpoint;\n }\n \n let newPath = endpoint.path;\n \n // Replace version: /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/v2/vehicles/\n newPath = newPath.replace(/\\/v\\d+\\//, `/${targetVersion}/`);\n \n return {\n ...endpoint,\n path: newPath,\n };\n};\n\n/**\n * Get version info by ID\n */\nexport const getVersionById = (versionId: string): ApiVersion | undefined => {\n return API_VERSIONS.find(v => v.id === versionId);\n};\n\n/**\n * Get default version\n */\nexport const getDefaultVersion = (): ApiVersion => {\n const defaultVersion = API_VERSIONS.find(v => v.isDefault);\n if (defaultVersion) {\n return defaultVersion;\n }\n \n // Fallback to first version if no default is set\n if (API_VERSIONS.length > 0 && API_VERSIONS[0]) {\n return API_VERSIONS[0];\n }\n \n // This should never happen, but TypeScript requires it\n throw new Error('No API versions defined');\n};\n\n/**\n * Get version statistics from endpoints\n */\nexport const getVersionStats = (endpoints: ApiEndpoint[]): Record<string, number> => {\n const stats: Record<string, number> = {};\n \n API_VERSIONS.forEach(version => {\n stats[version.id] = filterEndpointsByVersion(endpoints, version.id).length;\n });\n \n return stats;\n};\n","import type { ApiKey } from '../types';\nimport { HTTP_METHOD_COLORS, HTTP_STATUS_COLORS } from '../constants';\n\nexport const getMethodColor = (\n method: string\n): 'success' | 'primary' | 'warning' | 'error' | 'default' => {\n return HTTP_METHOD_COLORS[method.toUpperCase() as keyof typeof HTTP_METHOD_COLORS] || 'default';\n};\n\nexport const getStatusColor = (\n status: number\n): 'success' | 'warning' | 'error' | 'default' => {\n const firstDigit = Math.floor(status / 100).toString();\n return HTTP_STATUS_COLORS[firstDigit as keyof typeof HTTP_STATUS_COLORS] || 'default';\n};\n\nexport const formatApiKeyDisplay = (apiKey: ApiKey): string => {\n const preview = apiKey.id.substring(0, 8);\n return `${apiKey.name} (${preview}...)`;\n};\n\nexport const isValidJson = (str: string): boolean => {\n if (!str || typeof str !== 'string') return false;\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const formatRequestHeaders = (headers: Record<string, string>): string => {\n return JSON.stringify(headers, null, 2);\n};\n\nexport const parseRequestHeaders = (headersString: string): Record<string, string> => {\n if (!headersString || typeof headersString !== 'string') {\n return { 'Content-Type': 'application/json' };\n }\n\n try {\n const parsed = JSON.parse(headersString);\n return typeof parsed === 'object' && parsed !== null ? parsed : { 'Content-Type': 'application/json' };\n } catch {\n return { 'Content-Type': 'application/json' };\n }\n};\n\n// URL helpers moved to ./url.ts — keep this file focused on non-URL\n// formatters (method/status colour maps, JSON validation, header parsing).\n","/**\n * JSON Schema → example JSON.\n *\n * Thin wrapper over ``openapi-sampler`` (by Redocly — same library Redoc\n * uses internally). Picks deterministic, realistic values from a\n * dereferenced schema: honours ``const`` / ``examples`` / ``enum`` /\n * ``default``, unpacks ``allOf`` / ``oneOf`` / ``anyOf``, respects\n * string ``format`` (email/uuid/date-time/…).\n *\n * Replaces the previous hand-rolled ``exampleFromSchema`` — stricter on\n * spec semantics and cheaper to maintain.\n */\n\nimport consola from 'consola';\nimport { sample as openapiSample } from 'openapi-sampler';\n\ntype JsonSchemaLike = Record<string, unknown>;\n\nexport interface SampleOptions {\n /** Skip properties marked ``readOnly`` — useful when the body will\n * be sent in a request (request body editor). Default ``false``. */\n skipReadOnly?: boolean;\n /** Skip properties marked ``writeOnly`` — useful when rendering a\n * response body (passwords etc. must not leak). Default ``false``. */\n skipWriteOnly?: boolean;\n /** Skip non-required properties. Rarely useful for a viewer — we\n * want to show the full shape. Default ``false``. */\n skipNonRequired?: boolean;\n}\n\n/** Sample a JSON schema into a plain value. Returns ``null`` on failure\n * (malformed schema, circular refs the sampler can't unwind) so the\n * caller can show \"no example\" instead of crashing the page.\n *\n * ``spec`` must be the root OpenAPI document whenever ``schema`` may\n * contain ``$ref`` nodes — ``openapi-sampler`` walks the tree and\n * resolves refs against it. Our own ``dereferenceSchema`` only inlines\n * refs up to a depth limit; anything deeper comes through here as a\n * live ``$ref`` and the sampler throws if ``spec`` is missing. */\nexport function sampleSchema(\n schema: JsonSchemaLike | undefined,\n options: SampleOptions = {},\n spec?: unknown,\n): unknown {\n if (!schema) return null;\n try {\n return openapiSample(schema as never, options, spec as never);\n } catch (err) {\n // Sampler failures used to be silent, which meant \"no example\"\n // in the UI looked like a missing spec entry. Log so we can see\n // the real cause in dev (circular refs, missing type, etc.).\n consola.warn('[OpenapiViewer] sampleSchema failed:', err, { schema });\n return null;\n }\n}\n\n/** Same as ``sampleSchema`` but returns a pre-stringified JSON payload\n * ready to drop into a textarea / code block. Returns ``undefined``\n * when sampling fails so the UI can conditionally hide the example. */\nexport function sampleSchemaJson(\n schema: JsonSchemaLike | undefined,\n options: SampleOptions = {},\n spec?: unknown,\n): string | undefined {\n const value = sampleSchema(schema, options, spec);\n if (value === null || value === undefined) return undefined;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return undefined;\n }\n}\n","/**\n * URL utilities for the OpenAPI playground.\n *\n * Consolidated here to avoid the pre-existing split where\n * ``substituteUrlParameters`` lived in formatters.ts, base URL priority\n * lived inside ``useOpenApiSchema``, query params were never assembled\n * at all (that was a bug), and ``resolveAbsoluteUrl`` was tacked on\n * later.\n *\n * Conceptual model: a request URL is built from four layers, highest\n * priority first:\n *\n * 1. An absolute override URL the user pasted (rare — not plumbed\n * through the UI today, but the shape supports it).\n * 2. ``baseUrl`` — from ``SchemaSource.baseUrl`` → ``PlaygroundConfig.baseUrl``\n * → ``schema.servers[0].url``.\n * 3. Endpoint path template (``/pet/{petId}``) + substituted path params.\n * 4. Query string built from parameters that don't match any path\n * placeholder.\n *\n * Every helper below lives on one of those layers. ``UrlBuilder`` wires\n * them together when the caller has all four; individual functions are\n * exported for cases that only need one step (e.g. ``relativePath``\n * for display in the sidebar).\n */\n\nimport type { ApiEndpoint } from '../types';\n\n// ─── Path substitution ────────────────────────────────────────────────────────\n\nconst PATH_PARAM_RE = /\\{([^{}]+)\\}/g;\n\n/**\n * Return the list of ``{name}`` placeholders in a path template.\n * Preserves order, deduplicates.\n */\nexport function extractPathPlaceholders(template: string): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const match of template.matchAll(PATH_PARAM_RE)) {\n const name = match[1]!;\n if (!seen.has(name)) {\n seen.add(name);\n out.push(name);\n }\n }\n return out;\n}\n\n/**\n * Replace ``{name}`` placeholders with values from ``values``. Values\n * are URL-path-encoded with ``encodeURIComponent`` — safe for single\n * segments but escapes ``/`` too. That's intentional: a user typing\n * ``a/b`` into a path param should get ``a%2Fb`` so the server receives\n * the intended single segment, not two.\n *\n * Values are only substituted when non-empty after trimming.\n */\nexport function substitutePath(template: string, values: Record<string, string>): string {\n return template.replace(PATH_PARAM_RE, (whole, name) => {\n const v = values[name];\n return v && v.trim() !== '' ? encodeURIComponent(v) : whole;\n });\n}\n\n/** Placeholders that have no non-empty value in ``values``. */\nexport function unfilledPlaceholders(\n template: string,\n values: Record<string, string>,\n): string[] {\n return extractPathPlaceholders(template).filter(\n (name) => !(values[name] ?? '').trim(),\n );\n}\n\n// ─── Query assembly ───────────────────────────────────────────────────────────\n\n/**\n * Append a query string to ``url`` from the keys of ``values`` that\n * are not path placeholders in ``pathTemplate``. Existing query strings\n * are preserved: new keys are merged, existing keys are overwritten.\n *\n * Empty values are skipped (a form field that was left blank does not\n * become ``?foo=`` on the wire).\n */\nexport function appendQuery(\n url: string,\n values: Record<string, string>,\n pathTemplate: string,\n): string {\n const pathNames = new Set(extractPathPlaceholders(pathTemplate));\n const queryEntries = Object.entries(values).filter(\n ([name, value]) => !pathNames.has(name) && value && value.trim() !== '',\n );\n if (queryEntries.length === 0) return url;\n\n // Split any existing query so we can merge cleanly.\n const [base, existingQuery = ''] = url.split('?', 2);\n const params = new URLSearchParams(existingQuery);\n for (const [k, v] of queryEntries) params.set(k, v);\n const qs = params.toString();\n return qs ? `${base}?${qs}` : (base ?? url);\n}\n\n// ─── Absolute / relative ──────────────────────────────────────────────────────\n\n/**\n * Prepend ``window.location.origin`` when the URL is relative so the\n * result is runnable from a terminal via curl. No-op on SSR or when\n * already absolute.\n */\nexport function resolveAbsolute(url: string): string {\n if (!url) return url;\n if (/^https?:\\/\\//i.test(url)) return url;\n if (typeof window === 'undefined') return url;\n if (url.startsWith('//')) return `${window.location.protocol}${url}`;\n if (url.startsWith('/')) return `${window.location.origin}${url}`;\n return url;\n}\n\n/** Pull just the path out of any URL (absolute or relative). */\nexport function relativePath(url: string): string {\n try { return new URL(url).pathname; } catch { return url; }\n}\n\n/**\n * Concatenate URL segments with exactly one slash between each. Works\n * whether inputs have trailing/leading slashes or not.\n *\n * joinUrl('https://api.example.com/', '/v3', 'pet') → 'https://api.example.com/v3/pet'\n */\nexport function joinUrl(...parts: string[]): string {\n return parts\n .filter((p) => p !== undefined && p !== null && p !== '')\n .map((p, i) => {\n if (i === 0) return String(p).replace(/\\/+$/, '');\n return String(p).replace(/^\\/+|\\/+$/g, '');\n })\n .filter((p) => p !== '')\n .join('/');\n}\n\n// ─── Base URL resolution ──────────────────────────────────────────────────────\n\nexport interface BaseUrlSources {\n /** Highest priority — per-schema override. */\n schemaSource?: string;\n /** Global config-level override. */\n config?: string;\n /** Fallback from the OpenAPI document itself. */\n fromServers?: string;\n}\n\n/**\n * Apply the documented priority chain:\n * ``schemaSource → config → fromServers → ''``.\n */\nexport function resolveBaseUrl(sources: BaseUrlSources): string {\n return sources.schemaSource || sources.config || sources.fromServers || '';\n}\n\n// ─── UrlBuilder ───────────────────────────────────────────────────────────────\n\n/**\n * End-to-end builder that takes an endpoint + user-entered parameters\n * and produces both the fetch URL and a copy-paste-friendly preview.\n */\nexport class UrlBuilder {\n constructor(\n private readonly endpoint: ApiEndpoint,\n private readonly parameters: Record<string, string>,\n ) {}\n\n /** What ``fetch()`` receives: substituted path + query string. Origin\n * is whatever the endpoint template already had (relative paths\n * stay relative so the browser resolves them against the page). */\n build(): string {\n const substituted = substitutePath(this.endpoint.path, this.parameters);\n return appendQuery(substituted, this.parameters, this.endpoint.path);\n }\n\n /** Same as ``build()`` but guaranteed absolute — for curl snippets\n * and anywhere the URL leaves the browser context. */\n buildAbsolute(): string {\n return resolveAbsolute(this.build());\n }\n\n /** Names of required path/query params still empty. */\n missingRequired(): string[] {\n if (!this.endpoint.parameters) return [];\n return this.endpoint.parameters\n .filter((p) => p.required && !(this.parameters[p.name] ?? '').trim())\n .map((p) => p.name);\n }\n\n /** Placeholders in the template with no matching value. Usually a\n * superset of ``missingRequired`` — catches schemas that forgot\n * to flag a path param as required. */\n unfilledPlaceholders(): string[] {\n return unfilledPlaceholders(this.endpoint.path, this.parameters);\n }\n}\n","/**\n * Export the current OpenAPI schema in formats friendly for LLM agents.\n *\n * Three flavours:\n * - raw: JSON.stringify(schema) — full fidelity, largest.\n * - compact: dereferenced + pruned (no xml/examples, short descriptions,\n * no whitespace). Usually 30–50% of raw.\n * - markdown: prose summary of endpoints + params + responses. Smallest,\n * best for small prompts. Drops response body schemas.\n *\n * Per-endpoint markdown is also exported so a Copy-for-AI button on a\n * single endpoint stays cheap and does not leak unrelated paths.\n *\n * ``baseUrl`` resolution is done by the caller; we just substitute the\n * resolved value into ``servers[0]`` so the copied schema points at the\n * live API, not at whatever ``schema.servers`` originally held.\n */\n\nimport type { ApiEndpoint, OpenApiSchema } from '../types';\nimport { relativePath, resolveBaseUrl } from './url';\n\n// ─── Dereference ──────────────────────────────────────────────────────────────\n\n/**\n * Walk a JSON object and replace every ``$ref`` with the resolved value.\n * Shallow circular-ref protection: stops at ``maxDepth`` to avoid infinite\n * recursion on self-referential schemas (common in recursive OpenAPI types).\n */\nexport function dereferenceSchema(schema: OpenApiSchema, maxDepth = 10): OpenApiSchema {\n const root = schema as unknown as Record<string, unknown>;\n\n function resolveRef(ref: string): unknown {\n // Only handle local refs (#/components/schemas/Foo). External refs are\n // out of scope — the schema we have in memory is already a single file.\n if (!ref.startsWith('#/')) return null;\n const parts = ref.slice(2).split('/');\n let node: unknown = root;\n for (const part of parts) {\n if (node && typeof node === 'object' && part in (node as Record<string, unknown>)) {\n node = (node as Record<string, unknown>)[part];\n } else {\n return null;\n }\n }\n return node;\n }\n\n function walk(value: unknown, depth: number): unknown {\n if (depth > maxDepth) return value;\n if (Array.isArray(value)) return value.map((v) => walk(v, depth + 1));\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n if (typeof obj.$ref === 'string') {\n const resolved = resolveRef(obj.$ref);\n if (resolved === null) return obj;\n return walk(resolved, depth + 1);\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(obj)) out[k] = walk(v, depth + 1);\n return out;\n }\n return value;\n }\n\n return walk(schema, 0) as OpenApiSchema;\n}\n\n// ─── Pruning helpers ──────────────────────────────────────────────────────────\n\nconst NOISY_KEYS = new Set(['xml', 'example', 'examples', 'externalDocs']);\nconst MAX_DESCRIPTION_LEN = 500;\n\n/**\n * In-place-friendly pruner (returns a new tree). Drops keys that only\n * add bytes without giving the LLM new semantic info, and truncates\n * very long prose descriptions.\n */\nfunction pruneForCompact(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(pruneForCompact);\n if (value && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (NOISY_KEYS.has(k)) continue;\n if (k === 'description' && typeof v === 'string' && v.length > MAX_DESCRIPTION_LEN) {\n out[k] = v.slice(0, MAX_DESCRIPTION_LEN).trimEnd() + '…';\n continue;\n }\n out[k] = pruneForCompact(v);\n }\n return out;\n }\n return value;\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/** Overwrite ``servers[0]`` with the resolved base URL if provided. */\nfunction withResolvedBaseUrl(schema: OpenApiSchema, baseUrl: string | undefined): OpenApiSchema {\n if (!baseUrl) return schema;\n return { ...schema, servers: [{ url: baseUrl }] };\n}\n\nexport function toRawJson(schema: OpenApiSchema, baseUrl?: string): string {\n return JSON.stringify(withResolvedBaseUrl(schema, baseUrl), null, 2);\n}\n\nexport function toCompactJson(schema: OpenApiSchema, baseUrl?: string): string {\n const resolved = dereferenceSchema(withResolvedBaseUrl(schema, baseUrl));\n const pruned = pruneForCompact(resolved);\n return JSON.stringify(pruned);\n}\n\n// ─── Markdown ────────────────────────────────────────────────────────────────\n\n\nexport function endpointToMarkdown(ep: ApiEndpoint): string {\n const lines: string[] = [];\n lines.push(`### ${ep.method} ${ep.path}`);\n if (ep.description) lines.push(ep.description);\n\n const pathParams = ep.parameters?.filter((p) => ep.path.includes(`{${p.name}}`)) ?? [];\n const queryParams = ep.parameters?.filter((p) => !ep.path.includes(`{${p.name}}`)) ?? [];\n\n if (pathParams.length > 0) {\n lines.push('', '**Path parameters**');\n for (const p of pathParams) {\n const req = p.required ? ' (required)' : '';\n const desc = p.description ? ` — ${p.description}` : '';\n lines.push(`- \\`${p.name}\\`: ${p.type}${req}${desc}`);\n }\n }\n if (queryParams.length > 0) {\n lines.push('', '**Query parameters**');\n for (const p of queryParams) {\n const req = p.required ? ' (required)' : '';\n const desc = p.description ? ` — ${p.description}` : '';\n lines.push(`- \\`${p.name}\\`: ${p.type}${req}${desc}`);\n }\n }\n if (ep.requestBody) {\n const desc = ep.requestBody.description ? ` — ${ep.requestBody.description}` : '';\n lines.push('', `**Request body:** ${ep.requestBody.type}${desc}`);\n }\n if (ep.responses && ep.responses.length > 0) {\n lines.push('', '**Responses**');\n for (const r of ep.responses) {\n lines.push(`- \\`${r.code}\\` — ${r.description}`);\n }\n }\n return lines.join('\\n');\n}\n\nexport function toMarkdown(\n schema: OpenApiSchema,\n endpoints: ApiEndpoint[],\n baseUrl?: string,\n): string {\n const lines: string[] = [];\n const info = schema.info;\n const resolvedBase = resolveBaseUrl({\n config: baseUrl,\n fromServers: schema.servers?.[0]?.url,\n });\n\n lines.push(`# ${info?.title ?? 'API'}${info?.version ? ` (v${info.version})` : ''}`);\n if (resolvedBase) lines.push('', `**Base URL:** \\`${resolvedBase}\\``);\n if (info?.description) lines.push('', info.description.trim());\n\n // Group by tag/category for readable output.\n const grouped = new Map<string, ApiEndpoint[]>();\n for (const ep of endpoints) {\n const arr = grouped.get(ep.category) ?? [];\n arr.push(ep);\n grouped.set(ep.category, arr);\n }\n\n const categories = Array.from(grouped.keys()).sort((a, b) => {\n if (a === 'Other') return 1;\n if (b === 'Other') return -1;\n return a.localeCompare(b);\n });\n\n for (const category of categories) {\n lines.push('', `## ${category}`);\n const list = grouped.get(category)!;\n for (const ep of list) {\n // Use relativePath for section headers to keep markdown compact —\n // the full URL is already available as \"Base URL\" above.\n const displayPath = relativePath(ep.path);\n const sub = endpointToMarkdown({ ...ep, path: displayPath });\n lines.push('', sub);\n }\n }\n\n return lines.join('\\n');\n}\n\n// ─── Size helper ──────────────────────────────────────────────────────────────\n\n/** Human-readable byte count: ``12.3 KB``, ``480 B``. */\nexport function formatBytes(s: string): string {\n const bytes = new Blob([s]).size;\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n","'use client';\n\nimport consola from 'consola';\nimport React, {\n createContext, ReactNode, useCallback, useContext, useEffect, useReducer, useRef\n} from 'react';\n\nimport { useSessionStorage } from '@djangocfg/ui-core/hooks';\n\nimport type {\n ApiEndpoint, ApiResponse, PlaygroundConfig, PlaygroundContextType, PlaygroundState,\n PlaygroundStep\n} from '../types';\nimport { parseRequestHeaders } from '../utils';\nimport { UrlBuilder } from '../utils/url';\nimport { getDefaultVersion } from '../utils/versionManager';\n\n// Session-scoped auth persistence. sessionStorage (not localStorage) so\n// the token dies when the browser tab closes — safer default for secrets.\nconst AUTH_KEY_STORAGE = 'openapi-playground:auth:apiKeyId';\nconst AUTH_BEARER_STORAGE = 'openapi-playground:auth:bearer';\n\n// ─── Initial state ────────────────────────────────────────────────────────────\n\nconst createInitialState = (): PlaygroundState => ({\n currentStep: 'endpoints',\n steps: ['endpoints', 'request', 'response'],\n selectedEndpoint: null,\n selectedCategory: 'All',\n searchTerm: '',\n selectedVersion: getDefaultVersion().id,\n requestUrl: '',\n requestMethod: 'GET',\n requestHeaders: '{\\n \"Content-Type\": \"application/json\"\\n}',\n requestBody: '',\n selectedApiKey: null,\n manualApiToken: '',\n parameters: {},\n response: null,\n loading: false,\n sidebarOpen: false,\n activeSchemaId: null,\n});\n\n// ─── Actions ──────────────────────────────────────────────────────────────────\n\ntype Action =\n | { type: 'SET_STEP'; step: PlaygroundStep }\n | { type: 'NEXT_STEP' }\n | { type: 'PREV_STEP' }\n | { type: 'SELECT_ENDPOINT'; endpoint: ApiEndpoint | null }\n | { type: 'SET_CATEGORY'; category: string }\n | { type: 'SET_SEARCH'; term: string }\n | { type: 'SET_VERSION'; version: string }\n | { type: 'SET_REQUEST_URL'; url: string }\n | { type: 'SET_REQUEST_METHOD'; method: string }\n | { type: 'SET_REQUEST_HEADERS'; headers: string }\n | { type: 'SET_REQUEST_BODY'; body: string }\n | { type: 'SET_API_KEY'; apiKeyId: string | null }\n | { type: 'SET_MANUAL_TOKEN'; token: string }\n | { type: 'SET_PARAMETERS'; parameters: Record<string, string> }\n | { type: 'SET_RESPONSE'; response: ApiResponse | null }\n | { type: 'SET_LOADING'; loading: boolean }\n // Batched: set loading + clear response atomically (avoids two renders on send)\n | { type: 'REQUEST_START' }\n // Batched: set response + loading=false + advance step atomically (avoids three renders)\n | { type: 'REQUEST_SUCCESS'; response: ApiResponse }\n // Batched: set error response + loading=false atomically\n | { type: 'REQUEST_ERROR'; response: ApiResponse }\n | { type: 'SET_SIDEBAR'; open: boolean }\n | { type: 'SET_ACTIVE_SCHEMA_ID'; id: string | null }\n | { type: 'SYNC_API_KEY_HEADER'; headers: string }\n | { type: 'CLEAR_API_KEY_SELECTION' }\n | { type: 'SYNC_URL'; url: string }\n | { type: 'RESET' };\n\n// ─── Reducer ──────────────────────────────────────────────────────────────────\n\nfunction reducer(state: PlaygroundState, action: Action): PlaygroundState {\n switch (action.type) {\n case 'SET_STEP':\n return { ...state, currentStep: action.step };\n\n case 'NEXT_STEP': {\n const i = state.steps.indexOf(state.currentStep);\n return i < state.steps.length - 1\n ? { ...state, currentStep: state.steps[i + 1]! }\n : state;\n }\n\n case 'PREV_STEP': {\n const i = state.steps.indexOf(state.currentStep);\n return i > 0 ? { ...state, currentStep: state.steps[i - 1]! } : state;\n }\n\n case 'SELECT_ENDPOINT': {\n if (!action.endpoint) return { ...state, selectedEndpoint: null };\n // Guard: selecting the same endpoint is a no-op for response state.\n // Without this, clicking \"Try it\" on the already-loaded endpoint\n // would wipe its response for no reason.\n const same =\n state.selectedEndpoint?.method === action.endpoint.method &&\n state.selectedEndpoint?.path === action.endpoint.path;\n // Pre-fill request body from the OpenAPI example when available.\n // For a brand-new endpoint selection, a realistic example is more\n // useful than the {\"key\":\"value\"} placeholder. If the user already\n // has a saved draft, EndpointDraftSync will overwrite this with the\n // persisted value once it hydrates.\n const exampleBody = action.endpoint.requestBody?.example ?? '';\n return {\n ...state,\n selectedEndpoint: action.endpoint,\n requestMethod: action.endpoint.method,\n requestUrl: action.endpoint.path,\n parameters: same ? state.parameters : {},\n requestBody: same ? state.requestBody : exampleBody,\n // Switching to a different endpoint: the previous response no\n // longer belongs here. Clear it so the playground panel collapses\n // back to single-column until the user sends a new request.\n response: same ? state.response : null,\n currentStep: 'request',\n };\n }\n\n case 'SET_CATEGORY': return { ...state, selectedCategory: action.category };\n case 'SET_SEARCH': return { ...state, searchTerm: action.term };\n case 'SET_VERSION': return { ...state, selectedVersion: action.version };\n case 'SET_REQUEST_URL': return { ...state, requestUrl: action.url };\n case 'SET_REQUEST_METHOD': return { ...state, requestMethod: action.method };\n case 'SET_REQUEST_HEADERS': return { ...state, requestHeaders: action.headers };\n case 'SET_REQUEST_BODY': return { ...state, requestBody: action.body };\n case 'SET_API_KEY': return { ...state, selectedApiKey: action.apiKeyId };\n case 'SET_MANUAL_TOKEN': return { ...state, manualApiToken: action.token };\n case 'SET_PARAMETERS': return { ...state, parameters: action.parameters };\n case 'SET_RESPONSE': return { ...state, response: action.response };\n case 'SET_LOADING': return { ...state, loading: action.loading };\n\n case 'REQUEST_START':\n return { ...state, loading: true, response: null };\n\n case 'REQUEST_SUCCESS':\n return { ...state, loading: false, response: action.response, currentStep: 'response' };\n\n case 'REQUEST_ERROR':\n return { ...state, loading: false, response: action.response };\n\n case 'SET_SIDEBAR': return { ...state, sidebarOpen: action.open };\n case 'SET_ACTIVE_SCHEMA_ID': return { ...state, activeSchemaId: action.id };\n case 'SYNC_API_KEY_HEADER': return { ...state, requestHeaders: action.headers };\n case 'CLEAR_API_KEY_SELECTION': return { ...state, selectedApiKey: null };\n case 'SYNC_URL': return { ...state, requestUrl: action.url };\n case 'RESET': return createInitialState();\n\n default: return state;\n }\n}\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\nconst PlaygroundContext = createContext<PlaygroundContextType | undefined>(undefined);\n\nexport const usePlaygroundContext = () => {\n const context = useContext(PlaygroundContext);\n if (!context) throw new Error('usePlaygroundContext must be used within a PlaygroundProvider');\n return context;\n};\n\n// ─── Provider ─────────────────────────────────────────────────────────────────\n\ninterface PlaygroundProviderProps {\n children: ReactNode;\n config: PlaygroundConfig;\n}\n\nexport const PlaygroundProvider: React.FC<PlaygroundProviderProps> = ({ children, config }) => {\n const [state, dispatch] = useReducer(reducer, undefined, createInitialState);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // API keys come from the caller via ``config.apiKeys``. Empty\n // fallback keeps the playground working when the caller hasn't\n // wired any keys yet (public docs / unauthenticated demo).\n const apiKeys = React.useMemo(\n () => config.apiKeys ?? [],\n [config.apiKeys],\n );\n const isLoadingApiKeys = config.apiKeysLoading ?? false;\n\n // ── Auth persistence (session-scoped) ─────────────────────────────────────\n // Use sessionStorage so the chosen API key / bearer token survive reload\n // within the same tab but die when the tab closes. That matches how\n // users expect auth sessions to work and keeps secrets out of localStorage.\n const [storedApiKeyId, setStoredApiKeyId] = useSessionStorage<string | null>(\n AUTH_KEY_STORAGE,\n null,\n );\n const [storedBearer, setStoredBearer] = useSessionStorage<string>(\n AUTH_BEARER_STORAGE,\n '',\n );\n const hasHydratedAuthRef = useRef(false);\n\n // Hydrate auth state from sessionStorage exactly once.\n useEffect(() => {\n if (hasHydratedAuthRef.current) return;\n hasHydratedAuthRef.current = true;\n if (storedApiKeyId) dispatch({ type: 'SET_API_KEY', apiKeyId: storedApiKeyId });\n if (storedBearer) dispatch({ type: 'SET_MANUAL_TOKEN', token: storedBearer });\n // We intentionally don't depend on the stored values — this effect\n // runs once on mount; later changes are written out by the effects\n // below, not re-hydrated.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Persist selection → sessionStorage as it changes.\n useEffect(() => {\n if (!hasHydratedAuthRef.current) return;\n setStoredApiKeyId(state.selectedApiKey);\n }, [state.selectedApiKey, setStoredApiKeyId]);\n\n useEffect(() => {\n if (!hasHydratedAuthRef.current) return;\n setStoredBearer(state.manualApiToken);\n }, [state.manualApiToken, setStoredBearer]);\n\n // Auto-select first API key — only when there's no persisted selection\n // to restore. Otherwise the first-render auto-pick would clobber a\n // session that had a non-first key chosen.\n useEffect(() => {\n if (!hasHydratedAuthRef.current) return;\n if (!isLoadingApiKeys && apiKeys.length > 0 && !state.selectedApiKey && !storedApiKeyId) {\n dispatch({ type: 'SET_API_KEY', apiKeyId: apiKeys[0]?.id || null });\n }\n }, [apiKeys, isLoadingApiKeys, state.selectedApiKey, storedApiKeyId]);\n\n // Sync X-API-Key header when selected key changes\n useEffect(() => {\n try {\n const headers = parseRequestHeaders(state.requestHeaders);\n\n if (state.selectedApiKey) {\n const apiKey = apiKeys.find((k) => k.id === state.selectedApiKey);\n if (!apiKey) {\n dispatch({ type: 'CLEAR_API_KEY_SELECTION' });\n return;\n }\n // Header carries the raw ``secret`` (not the row id) — that's\n // what the server validates. Falls back to ``id`` for legacy\n // callers still on the old ApiKey shape.\n const keyValue = apiKey.secret || apiKey.id;\n if (headers['X-API-Key'] !== keyValue) {\n headers['X-API-Key'] = keyValue;\n dispatch({ type: 'SYNC_API_KEY_HEADER', headers: JSON.stringify(headers, null, 2) });\n }\n } else if (headers['X-API-Key']) {\n delete headers['X-API-Key'];\n dispatch({ type: 'SYNC_API_KEY_HEADER', headers: JSON.stringify(headers, null, 2) });\n }\n } catch (error) {\n consola.error('Error updating headers:', error);\n }\n }, [state.selectedApiKey, apiKeys]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Sync URL when path parameters or query parameters change. UrlBuilder\n // handles BOTH path substitution and query string assembly — the old\n // implementation only did the former, which silently dropped every\n // non-path parameter the user entered.\n useEffect(() => {\n if (!state.selectedEndpoint) return;\n const updated = new UrlBuilder(state.selectedEndpoint, state.parameters).build();\n if (updated !== state.requestUrl) {\n dispatch({ type: 'SYNC_URL', url: updated });\n }\n }, [state.parameters, state.selectedEndpoint]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ── Stable action dispatchers ─────────────────────────────────────────────\n\n const setCurrentStep = useCallback((step: PlaygroundStep) => dispatch({ type: 'SET_STEP', step }), []);\n const goToNextStep = useCallback(() => dispatch({ type: 'NEXT_STEP' }), []);\n const goToPreviousStep = useCallback(() => dispatch({ type: 'PREV_STEP' }), []);\n\n const setSelectedEndpoint = useCallback((endpoint: ApiEndpoint | null) =>\n dispatch({ type: 'SELECT_ENDPOINT', endpoint }), []);\n\n const setSelectedCategory = useCallback((category: string) =>\n dispatch({ type: 'SET_CATEGORY', category }), []);\n\n const setSearchTerm = useCallback((term: string) => dispatch({ type: 'SET_SEARCH', term }), []);\n const setSelectedVersion = useCallback((version: string) => dispatch({ type: 'SET_VERSION', version }), []);\n const setRequestUrl = useCallback((url: string) => dispatch({ type: 'SET_REQUEST_URL', url }), []);\n const setRequestMethod = useCallback((method: string) => dispatch({ type: 'SET_REQUEST_METHOD', method }), []);\n const setRequestHeaders = useCallback((headers: string) => dispatch({ type: 'SET_REQUEST_HEADERS', headers }), []);\n const setRequestBody = useCallback((body: string) => dispatch({ type: 'SET_REQUEST_BODY', body }), []);\n const setSelectedApiKey = useCallback((apiKeyId: string | null) => dispatch({ type: 'SET_API_KEY', apiKeyId }), []);\n const setManualApiToken = useCallback((token: string) => dispatch({ type: 'SET_MANUAL_TOKEN', token }), []);\n const setParameters = useCallback((parameters: Record<string, string>) =>\n dispatch({ type: 'SET_PARAMETERS', parameters }), []);\n const setResponse = useCallback((response: ApiResponse | null) =>\n dispatch({ type: 'SET_RESPONSE', response }), []);\n const setLoading = useCallback((loading: boolean) => dispatch({ type: 'SET_LOADING', loading }), []);\n const setSidebarOpen = useCallback((open: boolean) => dispatch({ type: 'SET_SIDEBAR', open }), []);\n const setActiveSchemaId = useCallback((id: string | null) => dispatch({ type: 'SET_ACTIVE_SCHEMA_ID', id }), []);\n const clearAll = useCallback(() => dispatch({ type: 'RESET' }), []);\n\n // ── Send request ──────────────────────────────────────────────────────────\n\n const sendRequest = useCallback(async () => {\n if (!state.requestUrl) {\n consola.error('No URL provided');\n return;\n }\n\n abortControllerRef.current?.abort();\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n // Single dispatch: loading=true + clear response\n dispatch({ type: 'REQUEST_START' });\n\n const startTime = Date.now();\n\n try {\n const headers = parseRequestHeaders(state.requestHeaders);\n\n let bearerToken: string | null = null;\n if (state.manualApiToken) {\n bearerToken = state.manualApiToken;\n } else if (typeof window !== 'undefined') {\n bearerToken = window.localStorage.getItem('auth_token');\n }\n\n if (bearerToken) headers['Authorization'] = `Bearer ${bearerToken}`;\n\n const requestOptions: RequestInit = {\n method: state.requestMethod,\n headers,\n signal: controller.signal,\n };\n\n if (state.requestBody && state.requestMethod !== 'GET') {\n requestOptions.body = state.requestBody;\n }\n\n const response = await fetch(state.requestUrl, requestOptions);\n const duration = Date.now() - startTime;\n const responseText = await response.text();\n\n let responseData: unknown;\n try { responseData = JSON.parse(responseText); }\n catch { responseData = responseText; }\n\n // Single dispatch: response + loading=false + step='response'\n dispatch({\n type: 'REQUEST_SUCCESS',\n response: {\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n data: responseData,\n duration,\n },\n });\n\n consola.success(`${state.requestMethod} ${state.requestUrl} → ${response.status} (${duration}ms)`);\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') return;\n consola.error('Request failed:', error);\n\n // Single dispatch: error response + loading=false\n dispatch({\n type: 'REQUEST_ERROR',\n response: {\n error: error instanceof Error ? error.message : 'Request failed',\n duration: Date.now() - startTime,\n },\n });\n }\n }, [state.requestUrl, state.requestHeaders, state.manualApiToken, state.requestMethod, state.requestBody]);\n\n // ── Context value ─────────────────────────────────────────────────────────\n\n const contextValue: PlaygroundContextType = {\n state,\n config,\n apiKeys,\n apiKeysLoading: isLoadingApiKeys,\n setCurrentStep,\n goToNextStep,\n goToPreviousStep,\n setSelectedEndpoint,\n setSelectedCategory,\n setSearchTerm,\n setSelectedVersion,\n setRequestUrl,\n setRequestMethod,\n setRequestHeaders,\n setRequestBody,\n setSelectedApiKey,\n setManualApiToken,\n setParameters,\n setResponse,\n setLoading,\n setSidebarOpen,\n setActiveSchemaId,\n clearAll,\n sendRequest,\n };\n\n return <PlaygroundContext.Provider value={contextValue}>{children}</PlaygroundContext.Provider>;\n};\n"]}
|