{"version":3,"sources":["../src/image/adapters/browser.ts","../src/image/adapters/edge.ts","../src/image/adapters/node.ts","../src/entry/browser.ts","../src/index.ts"],"sourcesContent":["import type { ImageOps } from \"../types\";\n\nexport const browserImageOps: ImageOps = {\n  async svgToPng(_svg: string): Promise<string> {\n    throw new Error(\n      \"PNG generation is not supported in browser environments. Use SVG format or implement client-side image conversion.\"\n    );\n  },\n\n  isAvailable(): boolean {\n    return false;\n  },\n};\n\n// Runtime guard\nif (typeof window === \"undefined\") {\n  throw new Error(\n    \"DataShows SDK: Browser adapter loaded in non-browser environment. Use `datashows-sdk/node` or `datashows-sdk/edge` for server environments.\"\n  );\n}\n","import type { ImageOps } from \"../types\";\n\n// Dynamic import for WASM sharp to handle optional dependency\nlet sharpWasm: any = null;\ntry {\n  sharpWasm = require(\"@img/sharp-wasm\");\n} catch (error) {\n  // Sharp WASM not available\n}\n\nexport const edgeImageOps: ImageOps = {\n  async svgToPng(svg: string): Promise<string> {\n    if (!sharpWasm) {\n      // Fall back to SVG data URL when Sharp WASM is not available\n      console.warn(\"Sharp WASM not available, falling back to SVG format\");\n      return `data:image/svg+xml;base64,${Buffer.from(svg).toString(\"base64\")}`;\n    }\n    const png = await sharpWasm(Buffer.from(svg)).png().toBuffer();\n    return `data:image/png;base64,${png.toString(\"base64\")}`;\n  },\n\n  isAvailable(): boolean {\n    return sharpWasm !== null;\n  },\n};\n\n// Runtime guard\nif (\n  typeof (globalThis as any).EdgeRuntime === \"undefined\" &&\n  typeof process !== \"undefined\" &&\n  process.versions?.node\n) {\n  throw new Error(\n    \"DataShows SDK: Edge adapter loaded in Node runtime. Use `datashows-sdk/node` or ensure your bundler picks the correct entry point.\"\n  );\n}\n","import type { ImageOps } from \"../types\";\n\n// Dynamic import for sharp to handle optional dependency\nlet sharp: any = null;\ntry {\n  sharp = require(\"sharp\");\n} catch (error) {\n  // Sharp not available\n}\n\nexport const nodeImageOps: ImageOps = {\n  async svgToPng(svg: string): Promise<string> {\n    if (!sharp) {\n      console.warn(\"Sharp not available, falling back to SVG format\");\n      // Return SVG as data URL instead of PNG\n      return `data:image/svg+xml;base64,${Buffer.from(svg).toString(\"base64\")}`;\n    }\n    const png = await sharp(Buffer.from(svg)).png().toBuffer();\n    return `data:image/png;base64,${png.toString(\"base64\")}`;\n  },\n\n  isAvailable(): boolean {\n    return sharp !== null;\n  },\n};\n\n// Runtime guard\nif (typeof (globalThis as any).EdgeRuntime !== \"undefined\") {\n  throw new Error(\n    \"DataShows SDK: Node adapter loaded in Edge runtime. Use `datashows-sdk/edge` or ensure your bundler picks the correct entry point.\"\n  );\n}\n","// Browser entry point - no image processing\nimport { browserImageOps } from \"../image/adapters/browser\";\n\n// Re-export all types and functions from the main index\nexport * from \"../index\";\n\n// Override the image operations with Browser-specific implementation\nimport { imageOps } from \"../index\";\nimageOps.svgToPng = browserImageOps.svgToPng;\nimageOps.isAvailable = browserImageOps.isAvailable;\n","import * as vegaLite from \"vega-lite\";\nimport * as vega from \"vega\";\nimport type { ImageOps } from \"./image/types\";\n\n// Default image operations (will be overridden by environment-specific adapters)\nconst defaultImageOps: ImageOps = {\n  async svgToPng(_svg: string): Promise<string> {\n    throw new Error(\n      \"Image operations not configured. Use environment-specific imports: datashows-sdk/node, datashows-sdk/edge, or datashows-sdk/browser\"\n    );\n  },\n  isAvailable(): boolean {\n    return false;\n  },\n};\n\n// Auto-detect environment and use appropriate adapter\nfunction detectEnvironment(): ImageOps {\n  // Check for Edge runtime\n  if (typeof (globalThis as any).EdgeRuntime !== \"undefined\") {\n    try {\n      const { edgeImageOps } = require(\"./image/adapters/edge\");\n      return edgeImageOps;\n    } catch (error) {\n      console.warn(\"Edge adapter not available, falling back to default\");\n    }\n  }\n\n  // Check for Node.js environment\n  if (typeof process !== \"undefined\" && process.versions?.node) {\n    try {\n      const { nodeImageOps } = require(\"./image/adapters/node\");\n      return nodeImageOps;\n    } catch (error) {\n      console.warn(\"Node adapter not available, falling back to default\");\n    }\n  }\n\n  // Check for browser environment\n  if (typeof window !== \"undefined\") {\n    try {\n      const { browserImageOps } = require(\"./image/adapters/browser\");\n      return browserImageOps;\n    } catch (error) {\n      console.warn(\"Browser adapter not available, falling back to default\");\n    }\n  }\n\n  return defaultImageOps;\n}\n\n// Auto-detect and set the appropriate image operations\nexport let imageOps: ImageOps = detectEnvironment();\n\n// -------- Server-side chart generation via OpenAI → Vega-Lite → SVG/PNG --------\n\nexport type ConversationMessage = {\n  role: \"user\" | \"assistant\";\n  content: string;\n  chartData?: unknown;\n  vegaSpec?: any;\n};\n\nexport type GenerateChartOptions = {\n  data: unknown;\n  prompt: string;\n  fileType?: \"svg\" | \"png\";\n  outputFormat?: \"image\" | \"chartData\"; // NEW: Support external chart libraries\n  model?: string;\n  apiKey?: string;\n  isSubscribed?: boolean;\n\n  // NEW: Conversational context support\n  conversationHistory?: ConversationMessage[];\n  previousChartContext?: {\n    lastChartData?: unknown;\n    lastChartSpec?: any;\n  };\n};\n\nexport type ChartDataResult = {\n  kind: \"chartData\";\n  library: string; // e.g., \"apexcharts\", \"chartjs\", \"recharts\", \"shadcn\"\n  data: any; // Processed data ready for the library\n  config: any; // Chart configuration for the library\n  explanation?: string; // AI explanation of what was done\n};\n\nexport type GeneratedChartResult =\n  | {\n      kind: \"image\";\n      fileType: \"svg\" | \"png\";\n      dataUrl: string;\n      vegaSpec?: any; // NEW: Return the spec so it can be used in conversation history\n      explanation?: string; // NEW: AI explanation of what was done\n    }\n  | ChartDataResult;\n\nfunction extractJsonFromText(text: string, isSubscribed: boolean = false): any {\n  const fenceMatch = text.match(/```json[\\s\\S]*?```/i);\n  const raw = fenceMatch\n    ? fenceMatch[0].replace(/```json|```/gi, \"\").trim()\n    : text;\n\n  const start = raw.indexOf(\"{\");\n  const end = raw.lastIndexOf(\"}\");\n\n  if (start >= 0 && end > start) {\n    let jsonStr = raw.slice(start, end + 1);\n\n    // Size guard\n    const maxJsonSize = isSubscribed ? 200000 : 50000;\n    if (jsonStr.length > maxJsonSize) {\n      throw new Error(\n        `Generated JSON is too large and likely truncated. Please try with a smaller dataset or different prompt. ${\n          isSubscribed\n            ? \"\"\n            : \"Consider upgrading your plan for larger datasets.\"\n        }`\n      );\n    }\n\n    // First attempt\n    try {\n      return JSON.parse(jsonStr);\n    } catch {}\n\n    // Pre-clean common issues: comments, stray backticks, single quotes, trailing commas\n    try {\n      const cleaned = jsonStr\n        .replace(/\\/\\/[^]*?\\n/g, \"\\n\") // line comments\n        .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\") // block comments\n        .replace(/`/g, '\"') // backticks → quotes\n        // keys in single quotes\n        .replace(/([\\{\\[,\\s])'([^'\\n]*)'(?=\\s*:)/g, '$1\"$2\"')\n        // string values in single quotes\n        .replace(/:\\s*'([^'\\n]*)'/g, ': \"$1\"')\n        // trailing commas before } or ]\n        .replace(/,(\\s*[}\\]])/g, \"$1\");\n      return JSON.parse(cleaned);\n    } catch {}\n\n    // Fallback: try to recover a complete JSON object by brace counting\n    const lines = jsonStr.split(\"\\n\");\n    let completeJson = \"\";\n    let braceCount = 0;\n    let inJson = false;\n\n    for (const line of lines) {\n      if (line.trim().startsWith(\"{\")) inJson = true;\n      if (inJson) {\n        completeJson += line + \"\\n\";\n        braceCount += (line.match(/\\{/g) || []).length;\n        braceCount -= (line.match(/\\}/g) || []).length;\n        if (braceCount === 0 && line.trim().endsWith(\"}\")) break;\n      }\n    }\n\n    if (completeJson.trim()) {\n      try {\n        return JSON.parse(completeJson.trim());\n      } catch (parseError) {\n        // Final fix-up: remove trailing commas and close missing braces\n        let fixedJson = completeJson.trim().replace(/,(\\s*[}\\]])/g, \"$1\");\n        if (braceCount > 0) fixedJson += \"}\".repeat(braceCount);\n        try {\n          return JSON.parse(fixedJson);\n        } catch (finalError) {\n          throw new Error(\n            `Invalid JSON generated: ${\n              parseError instanceof Error ? parseError.message : \"Unknown error\"\n            }`\n          );\n        }\n      }\n    }\n\n    throw new Error(\"Could not extract valid JSON from the response\");\n  }\n\n  throw new Error(\"No valid JSON found in the response\");\n}\n\nfunction ensureProperDimensions(spec: any): any {\n  // Ensure the spec has proper dimensions for readability\n  if (!spec.width || spec.width < 400) {\n    spec.width = 600;\n  }\n  if (!spec.height || spec.height < 300) {\n    spec.height = 400;\n  }\n\n  // For charts with many data points, use larger dimensions\n  if (\n    spec.data?.values &&\n    Array.isArray(spec.data.values) &&\n    spec.data.values.length > 20\n  ) {\n    spec.width = Math.max(spec.width, 800);\n    spec.height = Math.max(spec.height, 500);\n  }\n\n  return spec;\n}\n\nasync function requestSpecFromAPI(options: GenerateChartOptions): Promise<{\n  spec: string;\n  explanation?: string;\n  library?: string;\n  data?: any;\n  config?: any;\n}> {\n  const url =\n    process.env.ENV === \"local\"\n      ? `${process.env.BASE_URL}/api/spec/generate`\n      : `https://app.datashows.ai/api/spec/generate`;\n  const res = await fetch(url, {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\",\n      // Internal auth header so server-to-server calls bypass session/key checks\n      \"x-internal-authorized\": \"1\",\n    },\n    body: JSON.stringify({\n      data: options.data,\n      prompt: options.prompt,\n      isSubscribed: options.isSubscribed,\n      outputFormat: options.outputFormat,\n      // NEW: Pass conversation context\n      conversationHistory: options.conversationHistory,\n      previousChartContext: options.previousChartContext,\n    }),\n  });\n  if (!res.ok) {\n    const t = await res.text().catch(() => \"\");\n    throw new Error(`Spec API failed: ${res.status} ${t}`);\n  }\n  const json = (await res.json().catch(() => null)) as any;\n  if (!json?.content) throw new Error(\"Spec API returned empty content\");\n  return {\n    spec: json.content as string,\n    explanation: json.explanation,\n    library: json.library,\n    data: json.data,\n    config: json.config,\n  };\n}\n\nasync function renderVegaLiteToSvg(vlSpec: any): Promise<string> {\n  // Check if we're in Edge runtime where Vega's eval() is restricted\n  if (typeof (globalThis as any).EdgeRuntime !== \"undefined\") {\n    // In Edge runtime, return a simple SVG placeholder\n    // This is a fallback when Vega can't run due to eval() restrictions\n    const width = vlSpec.width || 400;\n    const height = vlSpec.height || 300;\n    return `<svg width=\"${width}\" height=\"${height}\" xmlns=\"http://www.w3.org/2000/svg\">\n      <rect width=\"100%\" height=\"100%\" fill=\"#f0f0f0\"/>\n      <text x=\"50%\" y=\"50%\" text-anchor=\"middle\" dy=\".3em\" font-family=\"Arial, sans-serif\" font-size=\"14\" fill=\"#666\">\n        Chart rendering not available in Edge runtime\n      </text>\n    </svg>`;\n  }\n\n  const compiled = vegaLite.compile(vlSpec, { config: {} }).spec;\n  const runtime = vega.parse(compiled);\n  const view = new vega.View(runtime, { renderer: \"none\" });\n  const svg = await view.toSVG();\n  return svg;\n}\n\nasync function svgToPngDataUrl(svg: string): Promise<string> {\n  return await imageOps.svgToPng(svg);\n}\n\nexport async function generateChart(\n  options: GenerateChartOptions\n): Promise<GeneratedChartResult> {\n  const outputFormat = options.outputFormat || \"image\";\n\n  // NEW: Support for external chart libraries\n  if (outputFormat === \"chartData\") {\n    const { explanation, library, data, config } = await requestSpecFromAPI(\n      options\n    );\n\n    if (!library || !data || !config) {\n      throw new Error(\n        \"Chart data format requires library, data, and config from API\"\n      );\n    }\n\n    return {\n      kind: \"chartData\",\n      library,\n      data,\n      config,\n      explanation,\n    };\n  }\n\n  // Original image generation flow\n  const fileType = options.fileType;\n  const { spec: vlSpec, explanation } = await generateVegaLiteSpecWithOpenAI(\n    options\n  );\n\n  const svg = await renderVegaLiteToSvg(vlSpec);\n  if (fileType === \"svg\") {\n    const dataUrl = `data:image/svg+xml;base64,${Buffer.from(svg).toString(\n      \"base64\"\n    )}`;\n    return {\n      kind: \"image\",\n      fileType: \"svg\",\n      dataUrl,\n      vegaSpec: vlSpec,\n      explanation,\n    };\n  }\n\n  const dataUrl = await svgToPngDataUrl(svg);\n  return {\n    kind: \"image\",\n    fileType: \"png\",\n    dataUrl,\n    vegaSpec: vlSpec,\n    explanation,\n  };\n}\n\n// Replace direct OpenAI call with server-spec API call\nasync function generateVegaLiteSpecWithOpenAI(\n  options: GenerateChartOptions\n): Promise<{ spec: any; explanation?: string }> {\n  const { spec: content, explanation } = await requestSpecFromAPI(options);\n  const spec = extractJsonFromText(content, options.isSubscribed);\n  return {\n    spec: ensureProperDimensions(spec),\n    explanation,\n  };\n}\n"],"mappings":"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","names":["browser_exports","__export","browserImageOps","init_browser","__esmMin","_svg","edge_exports","__export","edgeImageOps","sharpWasm","init_edge","__esmMin","svg","node_exports","__export","nodeImageOps","sharp","init_node","__esmMin","svg","browser_exports","__export","generateChart","imageOps","__toCommonJS","init_browser","vegaLite","vega","defaultImageOps","_svg","detectEnvironment","edgeImageOps","nodeImageOps","browserImageOps","imageOps","extractJsonFromText","text","isSubscribed","fenceMatch","raw","start","end","jsonStr","maxJsonSize","cleaned","lines","completeJson","braceCount","inJson","line","parseError","fixedJson","ensureProperDimensions","spec","requestSpecFromAPI","options","url","res","t","json","renderVegaLiteToSvg","vlSpec","width","height","compiled","runtime","svgToPngDataUrl","svg","generateChart","explanation","library","data","config","fileType","generateVegaLiteSpecWithOpenAI","content","imageOps","browserImageOps"]}