From 47fda4e44627e1878a233f1423e7babc8d11928e Mon Sep 17 00:00:00 2001 From: KazariEX Date: Tue, 30 Sep 2025 08:24:03 +0800 Subject: [PATCH 1/3] feat(language-core): support configuration for language plugins --- packages/language-core/lib/compilerOptions.ts | 32 ++++++++++--------- packages/language-core/lib/plugins.ts | 8 ++--- packages/language-core/lib/types.ts | 26 +++++++++------ 3 files changed, 38 insertions(+), 28 deletions(-) diff --git a/packages/language-core/lib/compilerOptions.ts b/packages/language-core/lib/compilerOptions.ts index 2fe54b821b..6674e305a1 100644 --- a/packages/language-core/lib/compilerOptions.ts +++ b/packages/language-core/lib/compilerOptions.ts @@ -133,24 +133,26 @@ export class CompilerOptionsResolver { } break; case 'plugins': - this.plugins = (options.plugins ?? []) - .flatMap((pluginPath: string) => { - try { - const resolvedPath = resolvePath(pluginPath, rootDir); - if (resolvedPath) { - const plugin = require(resolvedPath); - plugin.__moduleName = pluginPath; - return plugin; - } - else { - console.warn('[Vue] Load plugin failed:', pluginPath); + for (let raw of options.plugins ?? []) { + raw = typeof raw === 'string' ? { name: raw } : raw; + try { + const resolvedPath = resolvePath(raw.name, rootDir); + if (resolvedPath) { + const plugin = require(resolvedPath); + const plugins = Array.isArray(plugin) ? plugin : [plugin]; + for (const plugin of plugins) { + plugin.__moduleConfig = raw; + this.plugins.push(plugin); } } - catch (error) { - console.warn('[Vue] Resolve plugin path failed:', pluginPath, error); + else { + console.warn('[Vue] Load plugin failed:', raw.name); } - return []; - }); + } + catch (error) { + console.warn('[Vue] Resolve plugin path failed:', raw.name, error); + } + } break; default: // @ts-expect-error diff --git a/packages/language-core/lib/plugins.ts b/packages/language-core/lib/plugins.ts index 4c7d4ea3c0..ff2f758812 100644 --- a/packages/language-core/lib/plugins.ts +++ b/packages/language-core/lib/plugins.ts @@ -38,15 +38,15 @@ export function createPlugins(pluginContext: Parameters[0]) { const pluginInstances = plugins .flatMap(plugin => { try { - const instance = plugin(pluginContext); - const moduleName = (plugin as any).__moduleName; + const moduleConfig = (plugin as any).__moduleConfig; + const instance = plugin({ ...pluginContext, ...moduleConfig }); if (Array.isArray(instance)) { for (let i = 0; i < instance.length; i++) { - instance[i]!.name ??= `${moduleName} (${i})`; + instance[i]!.name ??= `${moduleConfig.name} (${i})`; } } else { - instance.name ??= moduleName; + instance.name ??= moduleConfig.name; } return instance; } diff --git a/packages/language-core/lib/types.ts b/packages/language-core/lib/types.ts index 14c205bceb..1c900ec494 100644 --- a/packages/language-core/lib/types.ts +++ b/packages/language-core/lib/types.ts @@ -13,9 +13,15 @@ export type RawVueCompilerOptions = Partial & { + name: string; + }; + export interface VueCodeInformation extends CodeInformation { __combineOffset?: number; __linkedToken?: symbol; @@ -108,14 +114,16 @@ export type VueLanguagePluginReturn = { resolveEmbeddedCode?(fileName: string, sfc: Sfc, embeddedFile: VueEmbeddedCode): void; }; -export type VueLanguagePlugin = (ctx: { - modules: { - typescript: typeof ts; - '@vue/compiler-dom': typeof CompilerDOM; - }; - compilerOptions: ts.CompilerOptions; - vueCompilerOptions: VueCompilerOptions; -}) => VueLanguagePluginReturn | VueLanguagePluginReturn[]; +export type VueLanguagePlugin = ( + ctx: RawPlugin & { + modules: { + typescript: typeof ts; + '@vue/compiler-dom': typeof CompilerDOM; + }; + compilerOptions: ts.CompilerOptions; + vueCompilerOptions: VueCompilerOptions; + }, +) => VueLanguagePluginReturn | VueLanguagePluginReturn[]; export interface SfcBlock { name: string; From a52fb11caf1fbbfc615b0d27c5bc687de8b6d8a9 Mon Sep 17 00:00:00 2001 From: KazariEX Date: Tue, 30 Sep 2025 08:24:47 +0800 Subject: [PATCH 2/3] fix: ctx type --- packages/language-core/lib/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/language-core/lib/types.ts b/packages/language-core/lib/types.ts index 1c900ec494..395f0a6ce1 100644 --- a/packages/language-core/lib/types.ts +++ b/packages/language-core/lib/types.ts @@ -115,7 +115,7 @@ export type VueLanguagePluginReturn = { }; export type VueLanguagePlugin = ( - ctx: RawPlugin & { + ctx: Record & { modules: { typescript: typeof ts; '@vue/compiler-dom': typeof CompilerDOM; From 89bd13b21bc78a89184085d918f7f38b0d2d96a7 Mon Sep 17 00:00:00 2001 From: KazariEX Date: Tue, 30 Sep 2025 08:33:13 +0800 Subject: [PATCH 3/3] fix: optional module config --- packages/language-core/lib/plugins.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/language-core/lib/plugins.ts b/packages/language-core/lib/plugins.ts index ff2f758812..4977a774aa 100644 --- a/packages/language-core/lib/plugins.ts +++ b/packages/language-core/lib/plugins.ts @@ -38,7 +38,7 @@ export function createPlugins(pluginContext: Parameters[0]) { const pluginInstances = plugins .flatMap(plugin => { try { - const moduleConfig = (plugin as any).__moduleConfig; + const moduleConfig = (plugin as any).__moduleConfig ?? {}; const instance = plugin({ ...pluginContext, ...moduleConfig }); if (Array.isArray(instance)) { for (let i = 0; i < instance.length; i++) {