{"version":3,"file":"Context7-LH_9zrVB.cjs","sources":["../app/components/context7/Context7.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\n\ntype SearchResult = {\n  id: string;\n  title: string;\n  url: string;\n  snippet?: string;\n  trustScore?: number;\n  isOfficial?: boolean;\n};\n\ntype DocumentChunk = {\n  id: string;\n  type: \"text\" | \"image\" | \"code\" | \"heading\" | \"list\";\n  content: unknown;\n  language?: string;\n};\n\nexport default function Context7() {\n  const [query, setQuery] = useState(\"\");\n  const [isSearching, setIsSearching] = useState(false);\n  const [results, setResults] = useState<SearchResult[]>([]);\n  const [searchError, setSearchError] = useState<string | null>(null);\n  const [activeUrl, setActiveUrl] = useState<string | null>(null);\n  const [chunks, setChunks] = useState<DocumentChunk[] | null>(null);\n  const abortRef = useRef<AbortController | null>(null);\n\n  useEffect(() => {\n    return () => {\n      abortRef.current?.abort();\n    };\n  }, []);\n\n  const canSearch = query.trim().length > 0 && !isSearching;\n\n  const runSearch = async () => {\n    if (!canSearch) return;\n    setIsSearching(true);\n    setResults([]);\n    setSearchError(null);\n    setActiveUrl(null);\n    setChunks(null);\n    abortRef.current?.abort();\n    const ac = new AbortController();\n    abortRef.current = ac;\n    try {\n      const res = await fetch(\n        `/api/context7/search?q=${encodeURIComponent(query)}`,\n        {\n          method: \"GET\",\n          signal: ac.signal,\n        }\n      );\n      if (!res.ok) {\n        const data = (await res.json().catch(() => null)) as {\n          error?: string;\n        } | null;\n        setSearchError((data && data.error) || `Search failed: ${res.status}`);\n        setResults([]);\n        return;\n      }\n      const data = (await res.json()) as {\n        results?: SearchResult[];\n        error?: string;\n        details?: string;\n      };\n      if (data?.results && data.results.length > 0) {\n        setResults(data.results);\n        // Auto-load top result (use current query as topic hint)\n        const top = data.results[0];\n        if (top?.id?.startsWith(\"/\")) {\n          loadLibraryDocs(top.id);\n        } else if (top?.url) {\n          loadUrl(top.url);\n        }\n      } else {\n        setResults([]);\n        if (data?.error)\n          setSearchError(\n            `${data.error}${data.details ? `: ${data.details}` : \"\"}`\n          );\n      }\n    } catch (err) {\n      console.error(err);\n    } finally {\n      setIsSearching(false);\n    }\n  };\n\n  const loadUrl = async (url: string) => {\n    setActiveUrl(url);\n    setChunks(null);\n    try {\n      const res = await fetch(\n        `/api/context7/fetch?url=${encodeURIComponent(url)}`\n      );\n      if (!res.ok) {\n        const data = (await res.json().catch(() => null)) as {\n          error?: string;\n          details?: string;\n        } | null;\n        const errorMsg = data?.error\n          ? `${data.error}${data.details ? `: ${data.details}` : \"\"}`\n          : `Fetch failed: ${res.status}`;\n        setSearchError(errorMsg);\n        setChunks([]);\n        return;\n      }\n      const data = (await res.json()) as { chunks: DocumentChunk[] };\n      setChunks(data.chunks || []);\n    } catch (err) {\n      console.error(err);\n      setSearchError(err instanceof Error ? err.message : \"Failed to load URL\");\n      setChunks([]);\n    }\n  };\n\n  const loadLibraryDocs = async (libraryId: string) => {\n    const canonicalUrl = `https://context7.com${libraryId}`;\n    setActiveUrl(canonicalUrl);\n    setChunks(null);\n    try {\n      const res = await fetch(\n        `/api/context7/docs?id=${encodeURIComponent(libraryId)}&tokens=4000`\n      );\n      if (!res.ok) {\n        const data = (await res.json().catch(() => null)) as {\n          error?: string;\n          details?: string;\n        } | null;\n        const errorMsg = data?.error\n          ? `${data.error}${data.details ? `: ${data.details}` : \"\"}`\n          : `Docs failed: ${res.status}`;\n        setSearchError(errorMsg);\n        setChunks([]);\n        return;\n      }\n      const data = (await res.json()) as { chunks: DocumentChunk[] };\n      setChunks(data.chunks || []);\n    } catch (err) {\n      console.error(err);\n      setSearchError(\n        err instanceof Error ? err.message : \"Failed to load library docs\"\n      );\n      setChunks([]);\n    }\n  };\n\n  function toPlainText(value: unknown): string {\n    if (value == null) return \"\";\n    if (typeof value === \"string\") return value;\n    if (Array.isArray(value)) return value.map(toPlainText).join(\"\\n\");\n    if (typeof value === \"object\") {\n      const v = value as Record<string, unknown>;\n      if (typeof v.text === \"string\") return v.text as string;\n      if (typeof v.content === \"string\") return v.content as string;\n      // Best-effort stringify small objects\n      try {\n        return JSON.stringify(value);\n      } catch {\n        return String(value);\n      }\n    }\n    return String(value);\n  }\n\n  // Structured CODE SNIPPETS support\n  type SnippetCode = { language?: string; code: string };\n  type Snippet = {\n    id: string;\n    title: string;\n    description: string;\n    source: string;\n    codes: SnippetCode[];\n  };\n\n  function parseCodeSnippets(text: string): Snippet[] {\n    const headerIdx = text.indexOf(\"CODE SNIPPETS\");\n    if (headerIdx === -1) return [];\n    const after = text.slice(headerIdx);\n    // Split by separator lines of dashes used in Context7 docs blocks\n    const parts = after.split(/\\n-{10,}\\n/g).slice(1);\n    const snippets: Snippet[] = [];\n    for (let i = 0; i < parts.length; i++) {\n      const block = parts[i];\n      const titleMatch = /TITLE:\\s*(.+)\\n/.exec(block);\n      const descMatch =\n        /DESCRIPTION:\\s*([\\s\\S]*?)\\n\\n/.exec(block) ||\n        /DESCRIPTION:\\s*(.+)\\n/.exec(block);\n      const sourceMatch = /SOURCE:\\s*(\\S+)/.exec(block);\n      const codes: SnippetCode[] = [];\n      let m: RegExpExecArray | null;\n      // LANGUAGE + CODE fenced\n      const langCodeRe =\n        /LANGUAGE:\\s*([^\\n]+)[\\s\\S]*?CODE:\\s*```(?:([a-zA-Z0-9_-]+)\\n)?([\\s\\S]*?)```/g;\n      while ((m = langCodeRe.exec(block))) {\n        const langLabel = (m[1] || m[2] || \"\").trim();\n        const code = (m[3] || \"\").replace(/\\n$/, \"\");\n        codes.push({ language: langLabel || undefined, code });\n      }\n      // Fallback: CODE fenced blocks without a preceding LANGUAGE line\n      if (codes.length === 0) {\n        const codeOnlyRe = /CODE:\\s*```(?:([a-zA-Z0-9_-]+)\\n)?([\\s\\S]*?)```/g;\n        while ((m = codeOnlyRe.exec(block))) {\n          const lang = (m[1] || \"\").trim() || undefined;\n          const code = (m[2] || \"\").replace(/\\n$/, \"\");\n          codes.push({ language: lang, code });\n        }\n      }\n      const title = titleMatch?.[1]?.trim() || \"Untitled\";\n      const description = descMatch?.[1]?.trim() || \"\";\n      const source = sourceMatch?.[1]?.trim() || \"\";\n      if (title || description || codes.length > 0) {\n        snippets.push({ id: `${i}`, title, description, source, codes });\n      }\n    }\n    return snippets;\n  }\n\n  function SnippetCard({ snippet }: { snippet: Snippet }) {\n    const [active, setActive] = useState(0);\n    const activeCode = snippet.codes[active] || snippet.codes[0];\n    return (\n      <div className=\"border border-border rounded-md\">\n        <div className=\"p-2 border-b border-border\">\n          <div className=\"flex items-start justify-between gap-3\">\n            <h3 className=\"text-base font-semibold leading-6\">\n              {snippet.title}\n            </h3>\n            {snippet.source && (\n              <a\n                href={snippet.source}\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n                className=\"text-xs shrink-0 underline decoration-dotted text-accent-foreground\"\n              >\n                Source\n              </a>\n            )}\n          </div>\n          {snippet.description && (\n            <p className=\"mt-1 text-sm text-muted-foreground whitespace-pre-wrap\">\n              {snippet.description}\n            </p>\n          )}\n        </div>\n        {snippet.codes.length > 0 && (\n          <div className=\"p-2\">\n            {snippet.codes.length > 1 && (\n              <div className=\"flex flex-wrap gap-1 mb-1\">\n                {snippet.codes.map((c, i) => (\n                  <button\n                    key={i}\n                    onClick={() => setActive(i)}\n                    className={`h-7 px-2 rounded text-xs ${\n                      active === i\n                        ? \"border border-accent text-foreground\"\n                        : \"border border-transparent text-muted-foreground hover:text-foreground\"\n                    }`}\n                  >\n                    {c.language || `Code ${i + 1}`}\n                  </button>\n                ))}\n              </div>\n            )}\n            <div className=\"relative\">\n              {activeCode?.language && (\n                <span className=\"absolute top-2 right-2 text-[10px] uppercase tracking-wider text-muted-foreground\">\n                  {activeCode.language}\n                </span>\n              )}\n              <pre className=\"rounded p-2 overflow-auto text-sm border border-border\">\n                <code\n                  className={\n                    activeCode?.language\n                      ? `language-${activeCode.language}`\n                      : undefined\n                  }\n                >\n                  {activeCode?.code}\n                </code>\n              </pre>\n            </div>\n          </div>\n        )}\n      </div>\n    );\n  }\n\n  const content = useMemo(() => {\n    if (!chunks) return null;\n    return chunks.map((chunk) => {\n      const text = toPlainText(chunk.content);\n      switch (chunk.type) {\n        case \"heading\":\n          return (\n            <h3 key={chunk.id} className=\"text-lg font-semibold mt-4\">\n              {text}\n            </h3>\n          );\n        case \"code\":\n          return (\n            <pre\n              key={chunk.id}\n              className=\"rounded p-2 overflow-auto text-sm border border-border\"\n            >\n              <code>{text}</code>\n            </pre>\n          );\n        case \"image\": {\n          const sourceObj =\n            chunk.content && typeof chunk.content === \"object\"\n              ? (chunk.content as { src?: unknown; url?: unknown })\n              : null;\n          const candidate = sourceObj?.src ?? sourceObj?.url;\n          const srcString: string | undefined =\n            typeof candidate === \"string\"\n              ? candidate\n              : typeof chunk.content === \"string\"\n              ? chunk.content\n              : undefined;\n          if (!srcString) return null;\n          return (\n            <img\n              key={chunk.id}\n              src={srcString}\n              alt=\"Context7 image\"\n              className=\"max-w-full rounded border border-border\"\n            />\n          );\n        }\n        case \"list\":\n          return (\n            <ul key={chunk.id} className=\"list-disc pl-6 space-y-1\">\n              {text.split(\"\\n\").map((li, i) => (\n                <li key={i}>{li}</li>\n              ))}\n            </ul>\n          );\n        default: {\n          // Try to parse structured code snippets. If present, render cards.\n          const snippets = parseCodeSnippets(text);\n          if (snippets.length > 0) {\n            return (\n              <div key={chunk.id} className=\"space-y-3\">\n                {snippets.map((s) => (\n                  <SnippetCard key={s.id} snippet={s} />\n                ))}\n              </div>\n            );\n          }\n          return (\n            <div key={chunk.id} className=\"space-y-3\">\n              <p className=\"leading-7 whitespace-pre-wrap\">{text}</p>\n            </div>\n          );\n        }\n      }\n    });\n  }, [chunks]);\n\n  return (\n    <div className=\"w-full h-full flex flex-col bg-background text-foreground\">\n      <div className=\"p-3 border-b border-border flex items-center gap-2\">\n        <input\n          value={query}\n          onChange={(e) => setQuery(e.target.value)}\n          onKeyDown={(e) => {\n            if (e.key === \"Enter\") runSearch();\n          }}\n          placeholder=\"Search the web with Context7...\"\n          className=\"flex-1 h-9 px-3 rounded border border-border bg-surface focus:outline-none focus:ring-2 focus:ring-accent\"\n        />\n        <button\n          onClick={runSearch}\n          disabled={!canSearch}\n          className=\"h-9 px-4 rounded bg-accent text-accent-foreground disabled:opacity-50\"\n        >\n          {isSearching ? \"Searching...\" : \"Search\"}\n        </button>\n      </div>\n      <div className=\"flex-1 grid grid-cols-12 gap-0 min-h-0\">\n        <aside className=\"col-span-4 border-r border-border overflow-auto\">\n          {results.length === 0 ? (\n            <div className=\"p-4 text-muted-foreground text-sm\">\n              {searchError ? (\n                <div className=\"text-red-500\">{searchError}</div>\n              ) : (\n                \"No results yet.\"\n              )}\n            </div>\n          ) : (\n            <ul className=\"divide-y divide-border\">\n              {results.map((r) => (\n                <li\n                  key={r.id}\n                  className={`p-3 cursor-pointer hover:bg-surface ${\n                    activeUrl === r.url ? \"bg-surface\" : \"\"\n                  }`}\n                  onClick={() => {\n                    if (r.id?.startsWith(\"/\")) {\n                      loadLibraryDocs(r.id);\n                    } else {\n                      loadUrl(r.url);\n                    }\n                  }}\n                >\n                  <div className=\"font-medium truncate\" title={r.title}>\n                    {r.title || r.url}\n                  </div>\n                  <div className=\"flex items-center gap-2 text-[11px] text-muted-foreground\">\n                    {typeof r.trustScore === \"number\" && (\n                      <span>Trust: {r.trustScore.toFixed(1)}</span>\n                    )}\n                    {r.isOfficial && (\n                      <span className=\"px-1 rounded bg-accent/20 text-accent-foreground border border-accent/40\">\n                        Official\n                      </span>\n                    )}\n                  </div>\n                  {r.snippet && (\n                    <div className=\"text-xs text-muted-foreground line-clamp-2\">\n                      {r.snippet}\n                    </div>\n                  )}\n                  <div className=\"text-[11px] text-muted-foreground truncate\">\n                    {r.url}\n                  </div>\n                </li>\n              ))}\n            </ul>\n          )}\n        </aside>\n        <main className=\"col-span-8 overflow-auto p-4 space-y-3\">\n          {!activeUrl ? (\n            <div className=\"text-sm text-muted-foreground\">\n              Select a result to load content.\n            </div>\n          ) : chunks == null ? (\n            <div className=\"text-sm text-muted-foreground\">\n              Loading content...\n            </div>\n          ) : chunks.length === 0 ? (\n            <div className=\"text-sm text-muted-foreground\">\n              No content extracted.\n            </div>\n          ) : (\n            content\n          )}\n        </main>\n      </div>\n    </div>\n  );\n}\n"],"names":["Context7","query","setQuery","useState","isSearching","setIsSearching","results","setResults","searchError","setSearchError","activeUrl","setActiveUrl","chunks","setChunks","abortRef","useRef","useEffect","canSearch","runSearch","ac","res","data","top","loadLibraryDocs","loadUrl","err","url","errorMsg","libraryId","canonicalUrl","toPlainText","value","v","parseCodeSnippets","text","headerIdx","parts","snippets","i","block","titleMatch","descMatch","sourceMatch","codes","m","langCodeRe","langLabel","code","codeOnlyRe","lang","title","description","source","SnippetCard","snippet","active","setActive","activeCode","jsxs","jsx","c","content","useMemo","chunk","sourceObj","candidate","srcString","li","r"],"mappings":"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"}