From ef1733b7fedbeea41e7f2efa1550392f172a3b3f Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Sat, 7 Jun 2025 20:57:46 +0800 Subject: [PATCH 1/2] refactor(language-server): drop `typescript.tsdk` initialization option --- extensions/vscode/rolldown.config.ts | 11 +++++++++++ extensions/vscode/src/languageClient.ts | 24 +++++++++++++----------- packages/language-server/lib/types.ts | 1 - packages/language-server/node.ts | 9 ++------- packages/language-server/package.json | 3 +++ packages/language-server/tests/server.ts | 1 - pnpm-lock.yaml | 3 +++ 7 files changed, 32 insertions(+), 20 deletions(-) diff --git a/extensions/vscode/rolldown.config.ts b/extensions/vscode/rolldown.config.ts index 66d4f1914c..7c8f99872f 100644 --- a/extensions/vscode/rolldown.config.ts +++ b/extensions/vscode/rolldown.config.ts @@ -60,6 +60,17 @@ const config: RolldownOptions = { }, }, }, + { + name: 'typescript', + resolveId: { + filter: { + id: /^typescript$/, + }, + handler() { + return { id: './typescript.js', external: true }; + }, + }, + }, ], }; diff --git a/extensions/vscode/src/languageClient.ts b/extensions/vscode/src/languageClient.ts index c61d1dcd7a..7d491087cb 100644 --- a/extensions/vscode/src/languageClient.ts +++ b/extensions/vscode/src/languageClient.ts @@ -1,5 +1,7 @@ import * as lsp from '@volar/vscode'; import type { VueInitializationOptions } from '@vue/language-server'; +import * as fs from 'node:fs'; +import * as path from 'node:path'; import { executeCommand, nextTick, @@ -61,11 +63,21 @@ async function activateLc( const outputChannel = useOutputChannel('Vue Language Server'); const selectors = config.server.includeLanguages; + // Setup typescript.js in production mode + if (fs.existsSync(path.join(__dirname, 'server.js'))) { + const { tsdk } = (await lsp.getTsdk(context))!; + fs.writeFileSync(path.join(__dirname, 'typescript.js'), `module.exports = require("${tsdk}/typescript.js");`); + } + client = createLc( 'vue', 'Vue', selectors, - await getInitializationOptions(context), + { + typescript: { + tsserverRequestCommand: 'typescript.tsserverRequest', + }, + } satisfies VueInitializationOptions, 6009, outputChannel ); @@ -82,7 +94,6 @@ async function activateLc( } await client.stop(); outputChannel.clear(); - client.clientOptions.initializationOptions = await getInitializationOptions(context); await client.start(); }); @@ -101,12 +112,3 @@ async function activateLc( } } } - -async function getInitializationOptions(context: vscode.ExtensionContext): Promise { - return { - typescript: { - tsdk: (await lsp.getTsdk(context))!.tsdk, - tsserverRequestCommand: 'typescript.tsserverRequest', - }, - }; -} diff --git a/packages/language-server/lib/types.ts b/packages/language-server/lib/types.ts index 8f14470de4..77b60442b5 100644 --- a/packages/language-server/lib/types.ts +++ b/packages/language-server/lib/types.ts @@ -1,6 +1,5 @@ export type VueInitializationOptions = { typescript: { - tsdk: string; tsserverRequestCommand?: string | [request: string, response: string]; }; }; diff --git a/packages/language-server/node.ts b/packages/language-server/node.ts index 7b099b741a..026b1eef22 100644 --- a/packages/language-server/node.ts +++ b/packages/language-server/node.ts @@ -1,9 +1,9 @@ import type { LanguageServer } from '@volar/language-server'; import { createLanguageServiceEnvironment } from '@volar/language-server/lib/project/simpleProject'; -import { createConnection, createServer, loadTsdkByPath } from '@volar/language-server/node'; +import { createConnection, createServer } from '@volar/language-server/node'; import { createLanguage, createParsedCommandLine, createVueLanguagePlugin, getDefaultCompilerOptions } from '@vue/language-core'; import { createLanguageService, createUriMap, getHybridModeLanguageServicePlugins, type LanguageService } from '@vue/language-service'; -import type * as ts from 'typescript'; +import * as ts from 'typescript'; import { URI } from 'vscode-uri'; import type { VueInitializationOptions } from './lib/types'; @@ -15,14 +15,10 @@ connection.listen(); connection.onInitialize(params => { const options: VueInitializationOptions = params.initializationOptions; - if (!options.typescript?.tsdk) { - throw new Error('typescript.tsdk is required'); - } if (!options.typescript?.tsserverRequestCommand) { connection.console.warn('typescript.tsserverRequestCommand is required since >= 3.0 for complete TS features'); } - const { typescript: ts } = loadTsdkByPath(options.typescript.tsdk, params.locale); const tsconfigProjects = createUriMap(); const file2ProjectInfo = new Map>(); @@ -204,4 +200,3 @@ connection.onInitialize(params => { connection.onInitialized(server.initialized); connection.onShutdown(server.shutdown); - diff --git a/packages/language-server/package.json b/packages/language-server/package.json index 184ff14cfb..3aab4d8af6 100644 --- a/packages/language-server/package.json +++ b/packages/language-server/package.json @@ -25,6 +25,9 @@ "vscode-languageserver-protocol": "^3.17.5", "vscode-uri": "^3.0.8" }, + "peerDependencies": { + "typescript": "*" + }, "devDependencies": { "@typescript/server-harness": "latest" } diff --git a/packages/language-server/tests/server.ts b/packages/language-server/tests/server.ts index da9af306a2..b60d83f9c9 100644 --- a/packages/language-server/tests/server.ts +++ b/packages/language-server/tests/server.ts @@ -57,7 +57,6 @@ export async function getLanguageServer(): Promise<{ URI.file(testWorkspacePath).toString(), { typescript: { - tsdk: path.dirname(require.resolve('typescript/lib/typescript.js')), tsserverRequestCommand: 'tsserverRequest', }, } satisfies VueInitializationOptions, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dadbc67cc3..7dc513fd65 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -181,6 +181,9 @@ importers: '@vue/typescript-plugin': specifier: 3.0.0-alpha.8 version: link:../typescript-plugin + typescript: + specifier: '*' + version: 5.8.3 vscode-languageserver-protocol: specifier: ^3.17.5 version: 3.17.5 From cb9603e9d5990fc2c3cbaca3325b628b99acbda4 Mon Sep 17 00:00:00 2001 From: Johnson Chu Date: Sat, 7 Jun 2025 21:03:44 +0800 Subject: [PATCH 2/2] always use vscode built-in tsdk --- extensions/vscode/src/languageClient.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/extensions/vscode/src/languageClient.ts b/extensions/vscode/src/languageClient.ts index 7d491087cb..09fe4e4a0d 100644 --- a/extensions/vscode/src/languageClient.ts +++ b/extensions/vscode/src/languageClient.ts @@ -65,8 +65,7 @@ async function activateLc( // Setup typescript.js in production mode if (fs.existsSync(path.join(__dirname, 'server.js'))) { - const { tsdk } = (await lsp.getTsdk(context))!; - fs.writeFileSync(path.join(__dirname, 'typescript.js'), `module.exports = require("${tsdk}/typescript.js");`); + fs.writeFileSync(path.join(__dirname, 'typescript.js'), `module.exports = require("${vscode.env.appRoot.replace(/\\/g, '/')}/extensions/node_modules/typescript/lib/typescript.js");`); } client = createLc(