From 079e9ba9d37010bb3b36f6219ca85d76cb308ab7 Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Tue, 11 Oct 2022 21:37:34 +0800 Subject: [PATCH] feat: add `resolveTemplateCompilerOptions` api for VueLanguagePlugin --- .../src/plugins/vue-template-html.ts | 12 ++++++---- .../vue-language-core/src/sourceFile.ts | 22 +++++++++++++------ .../vue-language-core/src/types.ts | 3 ++- .../vue-language-plugin-pug/src/index.ts | 3 +-- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/vue-language-tools/vue-language-core/src/plugins/vue-template-html.ts b/vue-language-tools/vue-language-core/src/plugins/vue-template-html.ts index b99ca92f2..a74a3d06f 100644 --- a/vue-language-tools/vue-language-core/src/plugins/vue-template-html.ts +++ b/vue-language-tools/vue-language-core/src/plugins/vue-template-html.ts @@ -14,16 +14,20 @@ const plugin: VueLanguagePlugin = ({ modules, vueCompilerOptions }) => { version: 1, + resolveTemplateCompilerOptions(options) { + return { + ...options, + ...vueCompilerOptions.experimentalTemplateCompilerOptions, + }; + }, + compileSFCTemplate(lang, template, options) { if (lang === 'html') { const compiler = modules['@vue/compiler-dom']; - return compiler.compile(template, { - ...options, - ...vueCompilerOptions.experimentalTemplateCompilerOptions, - }); + return compiler.compile(template, options); } }, diff --git a/vue-language-tools/vue-language-core/src/sourceFile.ts b/vue-language-tools/vue-language-core/src/sourceFile.ts index 5b7ff7280..44a135661 100644 --- a/vue-language-tools/vue-language-core/src/sourceFile.ts +++ b/vue-language-tools/vue-language-core/src/sourceFile.ts @@ -123,18 +123,26 @@ export class VueSourceFile implements SourceFile { } } + const errors: CompilerDom.CompilerError[] = []; + const warnings: CompilerDom.CompilerError[] = []; + let options: CompilerDom.CompilerOptions = { + onError: (err: CompilerDom.CompilerError) => errors.push(err), + onWarn: (err: CompilerDom.CompilerError) => warnings.push(err), + expressionPlugins: ['typescript'], + }; + + for (const plugin of plugins) { + if (plugin.resolveTemplateCompilerOptions) { + options = plugin.resolveTemplateCompilerOptions(options); + } + } + for (const plugin of plugins) { - const errors: CompilerDom.CompilerError[] = []; - const warnings: CompilerDom.CompilerError[] = []; let result: CompilerDom.CodegenResult | undefined; try { - result = plugin.compileSFCTemplate?.(sourceFile.sfc.template.lang, sourceFile.sfc.template.content, { - onError: (err: CompilerDom.CompilerError) => errors.push(err), - onWarn: (err: CompilerDom.CompilerError) => warnings.push(err), - expressionPlugins: ['typescript'], - }); + result = plugin.compileSFCTemplate?.(sourceFile.sfc.template.lang, sourceFile.sfc.template.content, options); } catch (e) { const err = e as CompilerDom.CompilerError; diff --git a/vue-language-tools/vue-language-core/src/types.ts b/vue-language-tools/vue-language-core/src/types.ts index bd6b6aec1..34aaa198d 100644 --- a/vue-language-tools/vue-language-core/src/types.ts +++ b/vue-language-tools/vue-language-core/src/types.ts @@ -46,7 +46,8 @@ export type VueLanguagePlugin = (ctx: { order?: number; parseSFC?(fileName: string, content: string): SFCParseResult | undefined; updateSFC?(oldResult: SFCParseResult, textChange: { start: number, end: number, newText: string; }): SFCParseResult | undefined; - compileSFCTemplate?(lang: string, template: string, options?: CompilerDom.CompilerOptions): CompilerDom.CodegenResult | undefined; + resolveTemplateCompilerOptions?(options: CompilerDom.CompilerOptions): CompilerDom.CompilerOptions; + compileSFCTemplate?(lang: string, template: string, options: CompilerDom.CompilerOptions): CompilerDom.CodegenResult | undefined; updateSFCTemplate?(oldResult: CompilerDom.CodegenResult, textChange: { start: number, end: number, newText: string; }): CompilerDom.CodegenResult | undefined; getEmbeddedFileNames?(fileName: string, sfc: Sfc): string[]; resolveEmbeddedFile?(fileName: string, sfc: Sfc, embeddedFile: VueEmbeddedFile): void; diff --git a/vue-language-tools/vue-language-plugin-pug/src/index.ts b/vue-language-tools/vue-language-plugin-pug/src/index.ts index 316a1c10a..cd3508189 100644 --- a/vue-language-tools/vue-language-plugin-pug/src/index.ts +++ b/vue-language-tools/vue-language-plugin-pug/src/index.ts @@ -2,7 +2,7 @@ import type { VueLanguagePlugin } from '@volar/vue-language-core'; import * as pug from '@volar/pug-language-service'; import { SourceMapBase } from '@volar/source-map'; -const plugin: VueLanguagePlugin = ({ modules, vueCompilerOptions }) => { +const plugin: VueLanguagePlugin = ({ modules }) => { return { @@ -22,7 +22,6 @@ const plugin: VueLanguagePlugin = ({ modules, vueCompilerOptions }) => { const compiler = modules['@vue/compiler-dom']; const completed = compiler.compile(pugFile.htmlCode, { ...options, - ...vueCompilerOptions.experimentalTemplateCompilerOptions, onWarn(warning) { options?.onWarn?.(createProxyObject(warning)); },