{"version":3,"file":"render-browser-yxQ41hgz.mjs","names":[],"sources":["../src/render-browser/sfc.ts","../src/render-browser/markdown.ts","../src/render-browser/index.ts"],"sourcesContent":["import type { ComponentProp } from '../render-shared'\nimport type { InputProps, RenderComponentInputComponent } from '../types'\n\nimport ErrorStackParser from 'error-stack-parser'\nimport path from 'path-browserify-esm'\n\nimport { evaluate } from '@unrteljs/eval/browser'\nimport { toMarkdown } from '@velin-dev/utils/to-md'\nimport { renderToString } from '@vue/server-renderer'\n\nimport { compileSFC, onlyRender, resolveProps } from '../render-shared'\nimport { normalizeSFCSource } from '../render-shared/sfc'\n\nexport async function evaluateSFC(\n  source: string,\n  basePath?: string,\n) {\n  const { script } = await compileSFC(source)\n\n  if (!basePath) {\n    // eslint-disable-next-line unicorn/error-message\n    const stack = ErrorStackParser.parse(new Error())\n    basePath = path.dirname(stack[1].fileName?.replace('async', '').trim() || '')\n  }\n\n  // TODO: evaluate setup when not <script setup>\n  return await evaluate<RenderComponentInputComponent<Record<string, unknown>>>(`${script.content}`, { base: basePath })\n}\n\nexport async function resolvePropsFromString(content: string) {\n  const component = await evaluateSFC(content)\n  if (!component) {\n    return []\n  }\n\n  const renderedComponent = onlyRender(component, {})\n  return resolveProps(renderedComponent as any)\n}\n\nexport async function renderSFC<RawProps = any>(\n  source: string,\n  data?: InputProps<RawProps>,\n  basePath?: string,\n): Promise<{\n  props: ComponentProp[]\n  rendered: string\n}> {\n  const evaluatedComponent = await evaluateSFC(source, basePath)\n  if (!evaluatedComponent) {\n    return {\n      props: [],\n      rendered: '',\n    }\n  }\n\n  const app = onlyRender(evaluatedComponent, data || {})\n  return {\n    props: resolveProps(app as any),\n    rendered: await renderToString(app),\n  }\n}\n\nexport async function renderSFCString<RawProps = any>(\n  source: string,\n  data?: InputProps<RawProps>,\n  basePath?: string,\n): Promise<{\n  props: ComponentProp[]\n  rendered: string\n}> {\n  source = normalizeSFCSource(source)\n\n  const { props, rendered } = await renderSFC(source, data, basePath)\n\n  return {\n    props,\n    rendered: await toMarkdown(rendered),\n  }\n}\n","import type { ComponentProp } from '../render-shared/props'\nimport type { InputProps } from '../types'\n\nimport { createSFC } from '@velin-dev/source-vue'\nimport { fromMarkdown, scriptFrom } from '@velin-dev/utils/from-md'\n\nimport { renderSFCString } from './sfc'\n\nexport async function renderMarkdownString<RawProps = any>(\n  source: string,\n  data?: InputProps<RawProps>,\n  _basePath?: string,\n): Promise<{\n  props: ComponentProp[]\n  rendered: string\n}> {\n  const html = fromMarkdown(source)\n\n  const { script, template, lang } = scriptFrom(html)\n  const sfcString = createSFC(template, script, lang)\n\n  return await renderSFCString(sfcString, data)\n}\n","import type { ComponentProp } from '../render-shared/props'\nimport type { InputProps } from '../types'\n\nimport { fromHtml } from 'hast-util-from-html'\n\nimport { renderMarkdownString } from './markdown'\nimport { renderSFCString } from './sfc'\n\nexport { renderComponent, resolveProps } from '../render-shared'\nexport { renderMarkdownString } from './markdown'\nexport { renderSFCString } from './sfc'\n\nexport async function render<RawProps = any>(\n  source: string,\n  data?: InputProps<RawProps>,\n  basePath?: string,\n): Promise<{\n  props: ComponentProp[]\n  rendered: string\n}> {\n  const hastRoot = fromHtml(source, { fragment: true })\n\n  const hasTemplate = hastRoot.children.some(node => node.type === 'element' && node.tagName === 'template')\n  const hasScript = hastRoot.children.some(node => node.type === 'element' && node.tagName === 'script')\n\n  if (!hasTemplate && !hasScript && source) {\n    return await renderMarkdownString(source, data, basePath)\n  }\n  if (hasScript && !hasTemplate && source) {\n    return await renderMarkdownString(source, data, basePath)\n  }\n  if (!hasTemplate && !source) {\n    source = `${source}\\n<template><div /></template>`\n  }\n  if (!hasScript) {\n    source = `${source}\\n<script setup>/* EMPTY */</script>`\n  }\n\n  return await renderSFCString(source, data, basePath)\n}\n"],"mappings":";;;;;;;;;;;AAaA,eAAsB,YACpB,QACA,UACA;CACA,MAAM,EAAE,WAAW,MAAM,WAAW,OAAO;AAE3C,KAAI,CAAC,UAAU;EAEb,MAAM,QAAQ,iBAAiB,sBAAM,IAAI,OAAO,CAAC;AACjD,aAAW,KAAK,QAAQ,MAAM,GAAG,UAAU,QAAQ,SAAS,GAAG,CAAC,MAAM,IAAI,GAAG;;AAI/E,QAAO,MAAM,SAAiE,GAAG,OAAO,WAAW,EAAE,MAAM,UAAU,CAAC;;AAaxH,eAAsB,UACpB,QACA,MACA,UAIC;CACD,MAAM,qBAAqB,MAAM,YAAY,QAAQ,SAAS;AAC9D,KAAI,CAAC,mBACH,QAAO;EACL,OAAO,EAAE;EACT,UAAU;EACX;CAGH,MAAM,MAAM,WAAW,oBAAoB,QAAQ,EAAE,CAAC;AACtD,QAAO;EACL,OAAO,aAAa,IAAW;EAC/B,UAAU,MAAM,eAAe,IAAI;EACpC;;AAGH,eAAsB,gBACpB,QACA,MACA,UAIC;AACD,UAAS,mBAAmB,OAAO;CAEnC,MAAM,EAAE,OAAO,aAAa,MAAM,UAAU,QAAQ,MAAM,SAAS;AAEnE,QAAO;EACL;EACA,UAAU,MAAM,WAAW,SAAS;EACrC;;;;ACrEH,eAAsB,qBACpB,QACA,MACA,WAIC;CAGD,MAAM,EAAE,QAAQ,UAAU,SAAS,WAFtB,aAAa,OAEwB,CAAC;AAGnD,QAAO,MAAM,gBAFK,UAAU,UAAU,QAAQ,KAER,EAAE,KAAK;;;;ACT/C,eAAsB,OACpB,QACA,MACA,UAIC;CACD,MAAM,WAAW,SAAS,QAAQ,EAAE,UAAU,MAAM,CAAC;CAErD,MAAM,cAAc,SAAS,SAAS,MAAK,SAAQ,KAAK,SAAS,aAAa,KAAK,YAAY,WAAW;CAC1G,MAAM,YAAY,SAAS,SAAS,MAAK,SAAQ,KAAK,SAAS,aAAa,KAAK,YAAY,SAAS;AAEtG,KAAI,CAAC,eAAe,CAAC,aAAa,OAChC,QAAO,MAAM,qBAAqB,QAAQ,MAAM,SAAS;AAE3D,KAAI,aAAa,CAAC,eAAe,OAC/B,QAAO,MAAM,qBAAqB,QAAQ,MAAM,SAAS;AAE3D,KAAI,CAAC,eAAe,CAAC,OACnB,UAAS,GAAG,OAAO;AAErB,KAAI,CAAC,UACH,UAAS,GAAG,OAAO;AAGrB,QAAO,MAAM,gBAAgB,QAAQ,MAAM,SAAS"}