diff --git a/build/loaders/convert-vue-to-demo.ts b/build/loaders/convert-vue-to-demo.ts index a5dd2fdfba1..bd0ccc51051 100644 --- a/build/loaders/convert-vue-to-demo.ts +++ b/build/loaders/convert-vue-to-demo.ts @@ -1,32 +1,21 @@ +import type { SFCScriptBlock } from '@vue/compiler-sfc' import type { Token } from 'marked' +import type { + DemoParts, + DemoPartsWithBuildOptions, + MergedParts, + ScriptLanguage, + VueApiStyle +} from '../types/vue-to-demo' import fs from 'node:fs' import path from 'node:path' import process from 'node:process' import { fileURLToPath } from 'node:url' +import { parse } from '@vue/compiler-sfc' import { marked } from 'marked' import { handleMergeCode } from '../utils/handle-merge-code' import { createRenderer } from './md-renderer' -interface Parts { - template?: string - script?: string - style?: string - title: string - content: string - language: 'ts' | 'js' - api: 'composition' | 'options' -} - -interface MergedParts extends Parts { - tsCode: string - jsCode: string -} - -interface MergePartsOptions { - parts: Parts - isVue: boolean -} - interface ConvertVue2DemoOptions { content: string resourcePath: string @@ -45,18 +34,18 @@ const demoBlock = fs .readFileSync(path.resolve(__dirname, 'ComponentDemoTemplate.vue')) .toString() -function mergeParts({ parts, isVue }: MergePartsOptions): MergedParts { - const mergedParts: Partial = { +function mergeParts({ parts, isVue }: DemoPartsWithBuildOptions): MergedParts { + const mergedParts = { ...parts, title: parts.title, content: parts.content, tsCode: '', jsCode: '' } - handleMergeCode({ parts, mergedParts: mergedParts as MergedParts, isVue }) - mergedParts.tsCode = encodeURIComponent(mergedParts.tsCode!) - mergedParts.jsCode = encodeURIComponent(mergedParts.jsCode!) - return mergedParts as MergedParts + handleMergeCode({ parts, mergedParts, isVue }) + mergedParts.tsCode = encodeURIComponent(mergedParts.tsCode) + mergedParts.jsCode = encodeURIComponent(mergedParts.jsCode) + return mergedParts } const cssRuleRegex = /([^{}]*)(\{[^}]*\})/g @@ -151,49 +140,88 @@ function getFileName(resourcePath: string): [string, string] { return [fileNameWithExtension.split('.')[0], fileNameWithExtension] } -function getPartsOfDemo(text: string): Parts { - // slot template - const firstIndex = text.indexOf('') - template = template.slice(0, lastIndex) - const script = text.match(/([\s\S]*?)<\/script>/)?.[1]?.trim() - const style = text.match(/