@djangocfg/ui-tools 2.1.318 → 2.1.319
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-ESVQZO3V.mjs → DocsLayout-CTJINVBM.mjs} +235 -267
- package/dist/DocsLayout-CTJINVBM.mjs.map +1 -0
- package/dist/{DocsLayout-KUPDWJ3G.cjs → DocsLayout-XLDB6CJ2.cjs} +273 -305
- package/dist/DocsLayout-XLDB6CJ2.cjs.map +1 -0
- package/dist/{chunk-GBLQTHWT.mjs → chunk-62Y65TGK.mjs} +5 -4
- package/dist/chunk-62Y65TGK.mjs.map +1 -0
- package/dist/{chunk-S44PW6NK.cjs → chunk-TKSFZHCG.cjs} +5 -4
- package/dist/chunk-TKSFZHCG.cjs.map +1 -0
- package/dist/index.cjs +10 -10
- package/dist/index.mjs +4 -4
- package/package.json +6 -6
- package/src/tools/OpenapiViewer/OpenapiViewer.story.tsx +30 -0
- package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Header/MetaActions.tsx +35 -50
- package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Header/index.tsx +49 -22
- package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Section/index.tsx +1 -1
- package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/store/index.ts +10 -11
- package/src/tools/OpenapiViewer/components/DocsLayout/SchemaCopyMenu.tsx +25 -5
- package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/BrandHeader.tsx +18 -33
- package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/Toolbar.tsx +40 -24
- package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/index.tsx +8 -14
- package/src/tools/OpenapiViewer/components/DocsLayout/sidebarLabel.ts +1 -4
- package/src/tools/OpenapiViewer/utils/operationToHar.ts +2 -1
- package/src/tools/OpenapiViewer/utils/url.ts +9 -2
- package/dist/DocsLayout-ESVQZO3V.mjs.map +0 -1
- package/dist/DocsLayout-KUPDWJ3G.cjs.map +0 -1
- package/dist/chunk-GBLQTHWT.mjs.map +0 -1
- package/dist/chunk-S44PW6NK.cjs.map +0 -1
- package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/MethodChips.tsx +0 -43
|
@@ -884,7 +884,8 @@ function buildUrl(endpoint, parameters, baseUrl) {
|
|
|
884
884
|
);
|
|
885
885
|
let path = endpoint.path;
|
|
886
886
|
for (const name of pathParamNames) {
|
|
887
|
-
const value = parameters[name]
|
|
887
|
+
const value = parameters[name];
|
|
888
|
+
if (value === void 0 || value === "") continue;
|
|
888
889
|
path = path.replaceAll(`{${name}}`, encodeURIComponent(value));
|
|
889
890
|
}
|
|
890
891
|
const queryString = [];
|
|
@@ -1079,7 +1080,7 @@ function resolveAbsolute(url) {
|
|
|
1079
1080
|
__name(resolveAbsolute, "resolveAbsolute");
|
|
1080
1081
|
function relativePath(url) {
|
|
1081
1082
|
try {
|
|
1082
|
-
return new URL(url).pathname;
|
|
1083
|
+
return new URL(url).pathname.replace(/%7B/gi, "{").replace(/%7D/gi, "}");
|
|
1083
1084
|
} catch {
|
|
1084
1085
|
return url;
|
|
1085
1086
|
}
|
|
@@ -1552,5 +1553,5 @@ var PlaygroundProvider = /* @__PURE__ */ __name(({ children, config }) => {
|
|
|
1552
1553
|
}, "PlaygroundProvider");
|
|
1553
1554
|
|
|
1554
1555
|
export { CODE_SAMPLE_TARGETS, MarkdownMessage, Mermaid_default, PlaygroundProvider, PrettyCode_default, UrlBuilder, buildHarRequest, deduplicateEndpoints, dereferenceSchema, endpointToMarkdown, extractTextFromChildren, findApiKeyById, formatBytes, isValidJson, joinUrl, parseRequestHeaders, relativePath, renderSnippet, resolveAbsolute, resolveBaseUrl, sampleSchemaJson, toCompactJson, toMarkdown, toRawJson, useCollapsibleContent, usePlaygroundContext };
|
|
1555
|
-
//# sourceMappingURL=chunk-
|
|
1556
|
-
//# sourceMappingURL=chunk-
|
|
1556
|
+
//# sourceMappingURL=chunk-62Y65TGK.mjs.map
|
|
1557
|
+
//# sourceMappingURL=chunk-62Y65TGK.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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":["React","lazy","LoadingFallback","jsx","Suspense","jsxs","Fragment","openapiSample","consola","useRef","useEffect","useCallback"],"mappings":"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","file":"chunk-62Y65TGK.mjs","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/**\n * Auto-detect whether `text` should bypass ReactMarkdown and render as\n * a flat `<div whitespace-pre-wrap>`. Used as the *fallback* when the\n * caller doesn't pass `plainText` explicitly to `MarkdownMessage`.\n *\n * The signal we trust: short, single-paragraph, no markdown markers.\n * Anything longer / multi-paragraph / structurally suggestive falls\n * through to the markdown pipeline — false negatives there are cheap\n * (markdown renders prose correctly), false positives in the prose\n * branch surface as escaped `*` / `#` / etc. so we err markdown-ward.\n *\n * Thresholds were picked from chat-bubble UX research (see ChatGPT,\n * Claude.ai, WhatsApp): roughly \"would a person have written this in\n * one keystroke without thinking about formatting?\". If you find them\n * too tight or too loose, tune here — every consumer goes through\n * `MarkdownMessage` so the change is universal.\n */\nexport function looksLikePlainProse(text: string): boolean {\n const trimmed = text.trim();\n // Empty / whitespace-only — render as plain (cheap path, nothing to parse).\n if (trimmed.length === 0) return true;\n // Long enough that it's likely a structured assistant reply.\n if (trimmed.length > 500) return false;\n // Paragraph break → almost certainly markdown territory.\n if (/\\n\\s*\\n/.test(trimmed)) return false;\n // Many single-line breaks → probably a list or stanza.\n const newlineCount = (trimmed.match(/\\n/g) || []).length;\n if (newlineCount > 4) return false;\n // Any markdown marker → defer to ReactMarkdown.\n if (hasMarkdownSyntax(trimmed)) return false;\n return true;\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 * Enable the FloatingToolbar's \"click to scroll\" lock overlay.\n * Defaults to `false` — Mermaid diagrams don't scroll internally,\n * so the lock overlay just steals page wheel events. See the\n * Mermaid.client implementation for the full rationale.\n */\n scrollIsolation?: 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/**\n * Markdown code block. Renders <PrettyCode> directly — its own\n * FloatingToolbar already carries the language tag and Copy action.\n *\n * Earlier versions stacked an extra <CopyButton> here too, which\n * surfaced as two copy buttons on every code fence. The fallback\n * branch below still ships its own button because the plain <pre>\n * has no toolbar of its own.\n */\nexport const CodeBlock: React.FC<CodeBlockProps> = ({ code, language }) => {\n const theme = useResolvedTheme();\n\n // Chat fences are always rendered in PrettyCode's compact mode:\n // 12px font, tighter padding, line-height 1.4. A fenced block in\n // a chat bubble shouldn't outweigh two paragraphs of body text —\n // the standalone PrettyCode story keeps the larger default for\n // docs/diff viewers.\n return (\n <div className=\"my-2\">\n <PrettyCode\n data={code}\n language={language}\n className=\"text-xs\"\n customBg=\"bg-code\"\n mode={theme}\n isCompact\n // Disable click-to-scroll-isolation in chat markdown: code\n // fences here are part of an assistant reply, not a docs\n // viewer. Forcing the user to click into a small block to\n // scroll past it interrupts the reading flow. The standalone\n // PrettyCode use cases (docs, diff viewers, long code panes)\n // keep the default `true`.\n scrollIsolation={false}\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 // See CodeBlock above for the spirit of this layout — palette\n // pre-computed before render.\n const copyHoverClass = isUser\n ? 'hover:bg-white/20 text-white'\n : 'hover:bg-muted-foreground/20 text-muted-foreground hover:text-foreground';\n const copyButtonClass =\n `absolute top-2 right-2 z-10 opacity-0 group-hover:opacity-100 transition-opacity ` +\n `h-8 w-8 ${copyHoverClass}`;\n\n return (\n <div className=\"relative group my-3\">\n <CopyButton\n value={code}\n variant=\"ghost\"\n className={copyButtonClass}\n title=\"Copy code\"\n />\n <pre className=\"p-3 rounded text-xs font-mono overflow-x-auto bg-code text-code-foreground border border-code-border\">\n <code>{code}</code>\n </pre>\n </div>\n );\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-semibold mb-2 mt-3 first:mt-0`}>{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className={`${headingSm} font-semibold 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-relaxed break-words`}>{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 // `target` / `rel` for external links are NOT set here — the\n // rehype-external-links plugin tags them on the rehype side, so\n // every `<a>` that sanitize let through gets the same security\n // treatment regardless of which renderer (default vs linkRules\n // override) emitted it. Doing it twice here would just duplicate\n // attributes; doing it only here would miss the linkRules path.\n a: ({ href, children, ...rest }) => (\n <a\n {...rest}\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 >\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 // Inline render fits the bubble width; the Mermaid component\n // owns its own click-to-fullscreen modal which sizes against\n // the viewport, so we don't cap it here. A previous version\n // hardcoded `max-w-[600px]` and that constraint leaked into\n // the fullscreen modal too — diagram rendered at 600px in the\n // middle of an empty viewport.\n return (\n <div className=\"my-3 w-full\">\n <Mermaid chart={codeContent} 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 // Inline `<code>` uses the design system's `--code-inline`\n // token. One semantic chip surface across both themes; on a\n // user bubble we still palette-switch with `text-primary-\n // foreground` because the inline chip blends INTO the bubble\n // — there's no panel boundary like a fence has. We trade a\n // perfect \"code surface\" tone here for legible body inheritance,\n // matching ChatGPT's behaviour in coloured user bubbles.\n const inlineCodeClass = isUser\n ? 'bg-primary-foreground/15 text-primary-foreground'\n : 'bg-code-inline text-code-inline-foreground';\n return (\n <code className={`px-1 py-0.5 rounded font-mono text-[0.875em] ${inlineCodeClass} break-all`}>\n {extractTextFromChildren(children)}\n </code>\n );\n },\n\n // Modern chat convention drops italic on blockquotes — italic +\n // tight bubble = hard to read. Border-left at 2px (4px reads\n // heavy in a 320–480px bubble). On the saturated user bubble we\n // use a primary-foreground tint; on the assistant bubble we use\n // the muted-foreground role for de-emphasis.\n blockquote: ({ children }) => {\n const cls = isUser\n ? 'border-primary-foreground/40 text-primary-foreground/80'\n : 'border-border text-muted-foreground';\n return (\n <blockquote className={`${textSize} border-l-2 pl-3 my-3 break-words ${cls}`}>\n {children}\n </blockquote>\n );\n },\n\n // Tables: outer wrapper handles overflow, inner `<table>`\n // inherits the chat-density text size. Borders / header use\n // semantic tokens — `border-code-border` for the assistant\n // (matches the code-fence panel for visual cohesion when both\n // appear in the same reply); primary-foreground/N for the user\n // bubble so lines read against the saturated `bg-primary`.\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 }) => (\n <thead className={isUser ? 'bg-primary-foreground/10' : 'bg-muted/40'}>\n {children}\n </thead>\n ),\n tbody: ({ children }) => <tbody>{children}</tbody>,\n tr: ({ children }) => (\n <tr className={isUser ? 'border-b border-primary-foreground/15' : 'border-b border-border'}>\n {children}\n </tr>\n ),\n th: ({ children }) => {\n const borderCls = isUser ? 'border-primary-foreground/25' : 'border-border';\n return (\n <th className={`px-2 py-1.5 text-left font-semibold border-b ${borderCls} break-words`}>\n {children}\n </th>\n );\n },\n td: ({ children }) => <td className=\"px-2 py-1.5 break-words\">{children}</td>,\n\n // Soft separator. ChatGPT / Slack / Linear strip the visible\n // line, Claude.ai keeps a hairline. We follow Claude — present\n // but quiet. Palette switches by role so the hairline reads on\n // both surfaces.\n hr: () => (\n <hr\n className={`my-4 border-0 h-px ${\n isUser ? 'bg-primary-foreground/20' : 'bg-border'\n }`}\n />\n ),\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 rehypeExternalLinks from 'rehype-external-links';\nimport rehypeRaw from 'rehype-raw';\nimport rehypeSanitize from 'rehype-sanitize';\nimport remarkBreaks from 'remark-breaks';\nimport remarkEmoji from 'remark-emoji';\nimport remarkGfm from 'remark-gfm';\nimport remarkSmartypants from 'remark-smartypants';\nimport type { Components } from 'react-markdown';\n\nimport { useCollapsibleContent } from '../useCollapsibleContent';\nimport type { MarkdownMessageProps } from './types';\nimport { buildSchema, buildUrlTransform } from './sanitize';\nimport { looksLikePlainProse } 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 plainText,\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 // Resolve plain-vs-markdown branch:\n // 1. Caller-passed `plainText` wins outright (explicit beats clever).\n // 2. Caller-supplied non-`a` customComponents force the markdown\n // pipeline — those overrides only matter on real markdown nodes.\n // 3. Otherwise auto-detect via `looksLikePlainProse` (short,\n // single-paragraph, no markdown markers). This is the chat-bubble\n // WhatsApp/Telegram heuristic — \"would the human have written\n // this in one keystroke?\".\n const customComponentsBeyondLinks = React.useMemo(() => {\n if (!customComponents) return false;\n return Object.keys(customComponents).some((k) => k !== 'a');\n }, [customComponents]);\n const isPlainText = plainText !== undefined\n ? plainText\n : !customComponentsBeyondLinks && looksLikePlainProse(displayContent);\n\n if (isPlainText) {\n // <div> + whitespace-pre-wrap: respects newlines AND collapses\n // double spaces, which is what users mean when they hit Enter\n // twice. <span> would break flow inside a flex bubble.\n //\n // leading-snug (1.375), not leading-relaxed (1.625) — `pre-wrap`\n // makes every `\\n` a hard line break, so the relaxed leading\n // turns multi-line user messages into airy ladders. snug matches\n // WhatsApp/Telegram bubble density.\n return (\n <div\n className={`${textSizeClass} font-normal antialiased leading-snug break-words whitespace-pre-wrap ${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 </div>\n );\n }\n\n return (\n <div className={className}>\n <div\n className={`\n prose ${proseClass} max-w-none break-words overflow-hidden ${textSizeClass} font-normal antialiased\n ${isUser ? 'prose-invert' : 'dark:prose-invert'}\n [&>*]:leading-relaxed\n [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\n [&_p]:my-2\n [&_ul]:my-2 [&_ol]:my-2 [&_ul]:pl-5 [&_ol]:pl-5\n [&_li]:my-1 [&_li>p]:my-0\n [&_h1]:mt-4 [&_h1]:mb-2 [&_h1]:text-base [&_h1]:font-semibold\n [&_h2]:mt-3.5 [&_h2]:mb-1.5 [&_h2]:text-[15px] [&_h2]:font-semibold\n [&_h3]:mt-3 [&_h3]:mb-1 [&_h3]:text-sm [&_h3]:font-medium\n [&_h4]:mt-3 [&_h4]:mb-1 [&_h4]:text-sm [&_h4]:font-medium\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 // Remark plugin order is load-bearing:\n // 1. `remark-gfm` — tables, strikethrough, autolinks, task lists.\n // 2. `remark-breaks` — chat convention: single `\\n` → `<br>`\n // (ChatGPT / Slack / Discord / Linear). CommonMark's\n // default would collapse those into one paragraph and\n // LLM punchlines / poems / dialogue would render as a\n // run-on line. Goes BEFORE smartypants so quotes that\n // land at line breaks still get the curly treatment.\n // 3. `remark-smartypants` — typographic substitutions:\n // \"...\" → …, -- → —, \"x\" → \"x\". Cheap \"humanized\"\n // polish à la Medium / Substack.\n // 4. `remark-emoji` — `:smile:` → 😄 (GitHub / Linear\n // shortcode style). Leaves Unicode emoji untouched.\n remarkPlugins={[remarkGfm, remarkBreaks, remarkSmartypants, remarkEmoji]}\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 // rehype-external-links runs LAST so it tags every <a> that\n // sanitize let through — externals get target=_blank +\n // rel=noopener noreferrer in one pass, instead of every\n // custom `a` renderer reimplementing the rule.\n rehypePlugins={[\n rehypeRaw,\n [rehypeSanitize, schema],\n [rehypeExternalLinks, { target: '_blank', rel: ['noopener', 'noreferrer'] }],\n ]}\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];\n if (value === undefined || value === '') continue;\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). The\n * ``URL`` parser percent-encodes path segments, which turns OpenAPI\n * template braces (``{id}``) into ``%7Bid%7D``. We restore those so\n * unfilled templates render as the readable form authors wrote. */\nexport function relativePath(url: string): string {\n try {\n return new URL(url).pathname.replace(/%7B/gi, '{').replace(/%7D/gi, '}');\n } catch {\n return url;\n }\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"]}
|
|
@@ -899,7 +899,8 @@ function buildUrl(endpoint, parameters, baseUrl) {
|
|
|
899
899
|
);
|
|
900
900
|
let path = endpoint.path;
|
|
901
901
|
for (const name of pathParamNames) {
|
|
902
|
-
const value = parameters[name]
|
|
902
|
+
const value = parameters[name];
|
|
903
|
+
if (value === void 0 || value === "") continue;
|
|
903
904
|
path = path.replaceAll(`{${name}}`, encodeURIComponent(value));
|
|
904
905
|
}
|
|
905
906
|
const queryString = [];
|
|
@@ -1094,7 +1095,7 @@ function resolveAbsolute(url) {
|
|
|
1094
1095
|
chunkWGEGR3DF_cjs.__name(resolveAbsolute, "resolveAbsolute");
|
|
1095
1096
|
function relativePath(url) {
|
|
1096
1097
|
try {
|
|
1097
|
-
return new URL(url).pathname;
|
|
1098
|
+
return new URL(url).pathname.replace(/%7B/gi, "{").replace(/%7D/gi, "}");
|
|
1098
1099
|
} catch {
|
|
1099
1100
|
return url;
|
|
1100
1101
|
}
|
|
@@ -1592,5 +1593,5 @@ exports.toMarkdown = toMarkdown;
|
|
|
1592
1593
|
exports.toRawJson = toRawJson;
|
|
1593
1594
|
exports.useCollapsibleContent = useCollapsibleContent;
|
|
1594
1595
|
exports.usePlaygroundContext = usePlaygroundContext;
|
|
1595
|
-
//# sourceMappingURL=chunk-
|
|
1596
|
-
//# sourceMappingURL=chunk-
|
|
1596
|
+
//# sourceMappingURL=chunk-TKSFZHCG.cjs.map
|
|
1597
|
+
//# sourceMappingURL=chunk-TKSFZHCG.cjs.map
|