{"version":3,"sources":["../src/index.ts","../src/remark.ts"],"sourcesContent":["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { Plugin } from 'vite'\nimport { type EnvType, remarkDemoBlock } from './remark'\nconst CODE_VUE_REGEXP = /.md.DemoBlockI\\d{1,4}\\.vue$/\nconst DemoBlockMap = new Map<string, string>()\n\nexport type MdPreviewOptions = {\n  component?: string\n}\n\nexport type MdPreviewConfig = {\n  root: string\n  component: string\n  type: 'vite' | 'vitepress'\n}\n\nexport function MdPreview(options?: MdPreviewOptions): Plugin {\n  let vuePlugin: any = null\n  let envType: EnvType\n  const config: MdPreviewConfig = Object.assign(\n    { component: 'CodePreview', type: 'vite' as const, root: '' },\n    options\n  )\n  return {\n    name: 'vite:md-preview',\n    enforce: 'pre' as const,\n    async configResolved(cfg) {\n      const isVitepress = cfg.plugins.find(p => p.name === 'vitepress')\n      vuePlugin = cfg.plugins.find(p => p.name === 'vite:vue')\n      envType = isVitepress ? 'vitepress' : 'vite'\n\n      config.root = cfg.root\n      config.type = envType\n    },\n    resolveId(id) {\n      if (CODE_VUE_REGEXP.test(id)) {\n        return id\n      }\n    },\n    async load(id) {\n      if (CODE_VUE_REGEXP.test(id)) {\n        const blockId = '/' + path.relative(config.root, id)\n        const demoCode = DemoBlockMap.get(id) || DemoBlockMap.get(blockId) \n        return demoCode\n      }\n      if (id.endsWith('.md')) {\n        const { code, blocks } = remarkDemoBlock(id, fs.readFileSync(id, 'utf8'), config)\n        for (const k of Object.keys(blocks)) {\n          const blockKey = `${id}.${k}.vue`\n          const blockId = '/' + path.relative(config.root, blockKey)\n          DemoBlockMap.set(blockId, blocks[k])\n        }\n        return code\n      }\n    },\n    async handleHotUpdate(ctx) {\n      const { file, server, timestamp } = ctx\n      const { moduleGraph } = server\n      server.moduleGraph\n      if (file.endsWith('.md')) {\n        const { blocks } = remarkDemoBlock(file, fs.readFileSync(file, 'utf8'), config)\n        const updates: any[] = []\n        for (const k of Object.keys(blocks)) {\n          const blockKey = `${file}.${k}.vue`\n          const blockId = '/' + path.relative(config.root, blockKey)\n          DemoBlockMap.set(blockId, blocks[k])\n\n          const mod = moduleGraph.getModuleById(blockId)\n          if (mod) {\n            // console.log(mod)\n            const ret = await vuePlugin.handleHotUpdate({\n              file: blockId,\n              timestamp: timestamp,\n              modules: [mod],\n              read: () => blocks[k],\n              server: server,\n            })\n\n            updates.push(...ret)\n          }\n        }\n        if (updates.length > 0) {\n          return updates.filter(Boolean)\n        }\n      }\n    },\n  }\n}\n\nexport default MdPreview\n","import { visit, type Node } from 'unist-util-visit'\nimport { fromMarkdown } from 'mdast-util-from-markdown'\nimport { toMarkdown } from 'mdast-util-to-markdown'\nimport { frontmatterFromMarkdown, frontmatterToMarkdown } from 'mdast-util-frontmatter'\nimport type { Code, Parent } from 'mdast'\nimport { MdPreviewConfig } from '.'\n\nexport type EnvType = 'vite' | 'vitepress'\n\nfunction praseMeta(meta?: string | null) {\n  const metaArr = (meta || '').split(' ')\n  const ret: Record<string, string | boolean> = {}\n  for (const m of metaArr) {\n    const [key, val] = m.split('=', 2)\n    ret[key] = val || true\n  }\n  return ret\n}\nexport function remarkDemoBlock(id: string, code: string, config: MdPreviewConfig) {\n  const tree = fromMarkdown(code, {\n    mdastExtensions: [frontmatterFromMarkdown(['yaml', 'toml'])],\n  })\n\n  const blocks: Record<string, string> = {}\n\n  visit(tree as Node, 'code', (node: Code, index: number, parent: Parent) => {\n    const i = Object.keys(blocks).length\n    const lang = (node.lang || '').split(':')[0]\n    const meta = praseMeta(node.meta)\n    const preview = meta['preview']\n    const isDemo = preview && lang === 'vue'\n    if (isDemo) {\n      const name = `DemoBlockI${i}`\n      blocks[name] = node.value\n\n      parent.children.splice(\n        index,\n        1,\n        {\n          type: 'html',\n          value: `<MdPreview \nlang=\"${decodeURIComponent(node.lang || '')}\" \nmeta=\"${decodeURIComponent(node.meta || '')}\" \ncode=\"${encodeURIComponent(node.value)}\"\ncomponent=\"${typeof preview === 'string' ? preview : config.component}\"\n>\n<${name}/>\n<template #code>`,\n        },\n        node,\n        {\n          type: 'html',\n          value: '\\n</template></MdPreview>',\n        }\n      )\n      return index + 3\n    }\n  })\n  if (Object.keys(blocks).length > 0) {\n    tree.children.push({\n      type: 'html',\n      value: `<script setup>\\n\n      import MdPreview from 'vite-plugin-md-preview/component'\n      ${Object.keys(blocks)\n        .map(k => `import ${k} from \"${id}.${k}.vue\";`)\n        .join('\\n')}\\n</script>`,\n    })\n    const code = toMarkdown(tree, {\n      extensions: [frontmatterToMarkdown(['yaml', 'toml'])],\n    })\n    return { code, blocks }\n  }\n  return { code, blocks }\n}\n"],"mappings":"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","names":["code","path","fs"]}