From 09dbada00d3297bece9bffa4289deb73d319a50e Mon Sep 17 00:00:00 2001 From: johnsoncodehk Date: Sun, 18 Dec 2022 14:58:53 +0800 Subject: [PATCH] feat: support `volar.config.js` path setting close #2078 --- extensions/vscode-vue-language-features/package.json | 5 +++++ extensions/vscode-vue-language-features/src/common.ts | 6 ++++-- packages/language-server/src/server.ts | 1 + packages/language-server/src/types.ts | 1 + packages/language-server/src/utils/config.ts | 4 ++-- packages/language-server/src/utils/documentServiceHost.ts | 5 +++-- packages/language-server/src/utils/project.ts | 2 +- 7 files changed, 17 insertions(+), 7 deletions(-) diff --git a/extensions/vscode-vue-language-features/package.json b/extensions/vscode-vue-language-features/package.json index 092f35c49..47caa151b 100644 --- a/extensions/vscode-vue-language-features/package.json +++ b/extensions/vscode-vue-language-features/package.json @@ -291,6 +291,11 @@ "default": "off", "description": "Traces the communication between VS Code and the language server." }, + "volar.vueserver.configFilePath": { + "type": "string", + "default": "./volar.config.js", + "description": "Path to volar.config.js." + }, "volar.vueserver.maxFileSize": { "type": "number", "default": 20971520, diff --git a/extensions/vscode-vue-language-features/src/common.ts b/extensions/vscode-vue-language-features/src/common.ts index d159eb6bb..abccfa856 100644 --- a/extensions/vscode-vue-language-features/src/common.ts +++ b/extensions/vscode-vue-language-features/src/common.ts @@ -168,6 +168,7 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang || e.affectsConfiguration('volar.vueserver.vitePress.processMdFile') || e.affectsConfiguration('volar.vueserver.additionalExtensions') || e.affectsConfiguration('volar.vueserver.maxFileSize') + || e.affectsConfiguration('volar.vueserver.configFilePath') ) { requestReloadVscode(); } @@ -304,6 +305,7 @@ function getInitializationOptions( const textDocumentSync = vscode.workspace.getConfiguration('volar').get<'incremental' | 'full' | 'none'>('vueserver.textDocumentSync'); const initializationOptions: VueServerInitializationOptions = { // volar + configFilePath: vscode.workspace.getConfiguration('volar').get('vueserver.configFilePath'), respectClientCapabilities: true, serverMode, diagnosticModel: diagnosticModel() === 'pull' ? DiagnosticModel.Pull : DiagnosticModel.Push, @@ -316,6 +318,7 @@ function getInitializationOptions( noProjectReferences: noProjectReferences(), reverseConfigFilePriority: reverseConfigFilePriority(), disableFileWatcher: disableFileWatcher(), + maxFileSize: vscode.workspace.getConfiguration('volar').get('vueserver.maxFileSize'), // vue petiteVue: { processHtmlFile: processHtml(), @@ -324,10 +327,9 @@ function getInitializationOptions( processMdFile: processMd(), }, json: { - customBlockSchemaUrls: vscode.workspace.getConfiguration('volar').get>('vueserver.json.customBlockSchemaUrls') + customBlockSchemaUrls: vscode.workspace.getConfiguration('volar').get>('vueserver.json.customBlockSchemaUrls'), }, additionalExtensions: additionalExtensions(), - maxFileSize: vscode.workspace.getConfiguration('volar').get('vueserver.maxFileSize'), }; return initializationOptions; } diff --git a/packages/language-server/src/server.ts b/packages/language-server/src/server.ts index 30437ba5a..9550647d2 100644 --- a/packages/language-server/src/server.ts +++ b/packages/language-server/src/server.ts @@ -127,6 +127,7 @@ export function createCommonLanguageServer( plugins, ts, configHost, + options, ); for (const root of roots) { diff --git a/packages/language-server/src/types.ts b/packages/language-server/src/types.ts index 902c98d56..032402d6e 100644 --- a/packages/language-server/src/types.ts +++ b/packages/language-server/src/types.ts @@ -119,4 +119,5 @@ export interface LanguageServerInitializationOptions { */ respectClientCapabilities?: boolean; maxFileSize?: number; + configFilePath?: string; } diff --git a/packages/language-server/src/utils/config.ts b/packages/language-server/src/utils/config.ts index 39ae69408..45b35f1a0 100644 --- a/packages/language-server/src/utils/config.ts +++ b/packages/language-server/src/utils/config.ts @@ -1,9 +1,9 @@ import { LanguageServicePlugin } from '@volar/language-service'; -export function loadCustomPlugins(dir: string) { +export function loadCustomPlugins(dir: string, configFile: string | undefined) { let configPath: string | undefined; try { - configPath = require.resolve('./volar.config.js', { paths: [dir] }); + configPath = require.resolve(configFile ?? './volar.config.js', { paths: [dir] }); } catch { } try { diff --git a/packages/language-server/src/utils/documentServiceHost.ts b/packages/language-server/src/utils/documentServiceHost.ts index dcbf12f99..45d632b03 100644 --- a/packages/language-server/src/utils/documentServiceHost.ts +++ b/packages/language-server/src/utils/documentServiceHost.ts @@ -1,4 +1,4 @@ -import { LanguageServerPlugin, RuntimeEnvironment } from '../types'; +import { LanguageServerInitializationOptions, LanguageServerPlugin, RuntimeEnvironment } from '../types'; import * as embedded from '@volar/language-service'; import { URI } from 'vscode-uri'; import { loadCustomPlugins } from './config'; @@ -11,6 +11,7 @@ export function createDocumentServiceHost( plugins: ReturnType[], ts: typeof import('typescript/lib/tsserverlibrary'), configHost: embedded.ConfigurationHost | undefined, + initOptions: LanguageServerInitializationOptions, ) { const workspaceServices = new Map(); @@ -53,7 +54,7 @@ export function createDocumentServiceHost( }, getPlugins() { return [ - ...loadCustomPlugins(rootUri.fsPath), + ...loadCustomPlugins(rootUri.fsPath, initOptions.configFilePath), ...plugins.map(plugin => plugin.syntacticService?.getServicePlugins?.(serviceContext) ?? []).flat(), ]; }, diff --git a/packages/language-server/src/utils/project.ts b/packages/language-server/src/utils/project.ts index 45ef7c4a3..ddb594bcd 100644 --- a/packages/language-server/src/utils/project.ts +++ b/packages/language-server/src/utils/project.ts @@ -80,7 +80,7 @@ export async function createProject( context: languageContext, getPlugins() { return [ - ...loadCustomPlugins(languageServiceHost.getCurrentDirectory()), + ...loadCustomPlugins(languageServiceHost.getCurrentDirectory(), serverOptions.configFilePath), ...plugins.map(plugin => plugin.semanticService?.getServicePlugins?.(languageServiceHost, vueLs!) ?? []).flat(), ]; },