{"version":3,"file":"index.mjs","names":[],"sources":["../../src/render-node/sfc.ts","../../src/render-node/markdown.ts","../../src/render-node/index.ts"],"sourcesContent":["import type { ComponentProp } from '../render-shared'\nimport type { InputProps, RenderComponentInputComponent, RenderSFCOptions } from '../types'\n\nimport ErrorStackParser from 'error-stack-parser'\nimport path from 'path-browserify-esm'\n\nimport { evaluate } from '@unrteljs/eval/node'\nimport { componentFromSource } from '@velin-dev/source-vue'\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<Props = Record<string, unknown>>(\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<Props>>(`${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  options?: string | RenderSFCOptions,\n): Promise<{\n  props: ComponentProp[]\n  rendered: string\n}> {\n  const resolvedOptions = typeof options === 'string' ? { basePath: options } : options ?? {}\n  const evaluatedComponent = resolvedOptions.vfs\n    ? await componentFromSource<RawProps>(source, {\n        filename: resolvedOptions.filename,\n        vfs: resolvedOptions.vfs,\n      })\n    : await evaluateSFC<RawProps>(source, resolvedOptions.basePath)\n  if (!evaluatedComponent) {\n    return {\n      props: [],\n      rendered: '',\n    }\n  }\n\n  const renderFunc = onlyRender<RawProps, RawProps, RawProps>(evaluatedComponent, data ?? {})\n  return {\n    props: resolveProps(renderFunc),\n    rendered: await renderToString(renderFunc),\n  }\n}\n\nexport async function renderSFCString<RawProps = any>(\n  source: string,\n  data?: InputProps<RawProps>,\n  options?: string | RenderSFCOptions,\n): Promise<{\n  props: ComponentProp[]\n  rendered: string\n}> {\n  source = normalizeSFCSource(source)\n\n  const { props, rendered } = await renderSFC(source, data, options)\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'\nimport { toMarkdown } from '@velin-dev/utils/to-md'\n\nimport { renderSFC } 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  const { props, rendered } = await renderSFC(sfcString, data, basePath)\n  const markdownResult = await toMarkdown(rendered)\n\n  return {\n    props,\n    rendered: markdownResult,\n  }\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\n  return await renderSFCString(source, data, basePath)\n}\n"],"mappings":";;;;;;;;;;;AAcA,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,SAA+C,GAAG,OAAO,WAAW,EAAE,MAAM,UAAU,CAAC;;AAatG,eAAsB,UACpB,QACA,MACA,SAIC;CACD,MAAM,kBAAkB,OAAO,YAAY,WAAW,EAAE,UAAU,SAAS,GAAG,WAAW,EAAE;CAC3F,MAAM,qBAAqB,gBAAgB,MACvC,MAAM,oBAA8B,QAAQ;EAC1C,UAAU,gBAAgB;EAC1B,KAAK,gBAAgB;EACtB,CAAC,GACF,MAAM,YAAsB,QAAQ,gBAAgB,SAAS;AACjE,KAAI,CAAC,mBACH,QAAO;EACL,OAAO,EAAE;EACT,UAAU;EACX;CAGH,MAAM,aAAa,WAAyC,oBAAoB,QAAQ,EAAE,CAAC;AAC3F,QAAO;EACL,OAAO,aAAa,WAAW;EAC/B,UAAU,MAAM,eAAe,WAAW;EAC3C;;AAGH,eAAsB,gBACpB,QACA,MACA,SAIC;AACD,UAAS,mBAAmB,OAAO;CAEnC,MAAM,EAAE,OAAO,aAAa,MAAM,UAAU,QAAQ,MAAM,QAAQ;AAClE,QAAO;EACL;EACA,UAAU,MAAM,WAAW,SAAS;EACrC;;;;AC1EH,eAAsB,qBACpB,QACA,MACA,UAIC;CAGD,MAAM,EAAE,QAAQ,UAAU,SAAS,WAFtB,aAAa,OAEwB,CAAC;CAGnD,MAAM,EAAE,OAAO,aAAa,MAAM,UAFhB,UAAU,UAAU,QAAQ,KAEO,EAAE,MAAM,SAAS;AAGtE,QAAO;EACL;EACA,UAAU,MAJiB,WAAW,SAAS;EAKhD;;;;AChBH,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;AAG3D,QAAO,MAAM,gBAAgB,QAAQ,MAAM,SAAS"}