diff --git a/extensions/vscode-vue-language-features/package.json b/extensions/vscode-vue-language-features/package.json index 5dd5c2a9c..10912410b 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.maxFileSize": { + "type": "number", + "default": 20971520, + "description": "Maximum file size for Vue Server to load. (default: 20MB)" + }, "volar.vueserver.petiteVue.processHtmlFile": { "type": "boolean", "default": false diff --git a/extensions/vscode-vue-language-features/src/common.ts b/extensions/vscode-vue-language-features/src/common.ts index f32cd454c..d159eb6bb 100644 --- a/extensions/vscode-vue-language-features/src/common.ts +++ b/extensions/vscode-vue-language-features/src/common.ts @@ -167,6 +167,7 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang || e.affectsConfiguration('volar.vueserver.petiteVue.processHtmlFile') || e.affectsConfiguration('volar.vueserver.vitePress.processMdFile') || e.affectsConfiguration('volar.vueserver.additionalExtensions') + || e.affectsConfiguration('volar.vueserver.maxFileSize') ) { requestReloadVscode(); } @@ -326,6 +327,7 @@ function getInitializationOptions( 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/types.ts b/packages/language-server/src/types.ts index 619324577..902c98d56 100644 --- a/packages/language-server/src/types.ts +++ b/packages/language-server/src/types.ts @@ -118,4 +118,5 @@ export interface LanguageServerInitializationOptions { * Enable this option to make language server setup server capabilities based on client capabilities to support multiple servers. */ respectClientCapabilities?: boolean; + maxFileSize?: number; } diff --git a/packages/language-server/src/utils/project.ts b/packages/language-server/src/utils/project.ts index 265396836..45ef7c4a3 100644 --- a/packages/language-server/src/utils/project.ts +++ b/packages/language-server/src/utils/project.ts @@ -219,6 +219,13 @@ export async function createProject( } if (sys.fileExists(fileName)) { + if (serverOptions.maxFileSize) { + const fileSize = sys.getFileSize?.(fileName); + if (fileSize !== undefined && fileSize > serverOptions.maxFileSize) { + console.warn(`IGNORING "${fileName}" because it is too large (${fileSize}bytes > ${serverOptions.maxFileSize}bytes)`); + return ts.ScriptSnapshot.fromString(''); + } + } const text = sys.readFile(fileName, 'utf8'); if (text !== undefined) { const snapshot = ts.ScriptSnapshot.fromString(text);