Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(vscode): support for disabling typescript plugin #4226

Merged
merged 1 commit into from
Apr 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 7 additions & 0 deletions extensions/vscode/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -224,9 +224,16 @@
"default": "auto",
"enum": [
"auto",
"typeScriptPluginOnly",
true,
false
],
"enumDescriptions": [
"Automatically detect and enable TypeScript Plugin/Hybrid Mode in a safe environment.",
"Only enable Vue TypeScript Plugin but disable Hybrid Mode.",
"Enable TypeScript Plugin/Hybrid Mode.",
"Disable TypeScript Plugin/Hybrid Mode."
],
"description": "Vue language server only handles CSS and HTML language support, and tsserver takes over TS language support via TS plugin."
},
"vue.server.maxFileSize": {
Expand Down
39 changes: 28 additions & 11 deletions extensions/vscode/src/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,21 @@ export async function activate(context: vscode.ExtensionContext, createLc: Creat
}
}

export const currentHybridModeStatus = getCurrentHybridModeStatus();
export const enabledHybridMode = getCurrentHybridModeStatus();

vscode.commands.executeCommand('setContext', 'vueHybridMode', currentHybridModeStatus);
export const enabledTypeScriptPlugin = getCurrentTypeScriptPluginStatus(enabledHybridMode);

vscode.commands.executeCommand('setContext', 'vueHybridMode', enabledHybridMode);

function getCurrentTypeScriptPluginStatus(enabledHybridMode: boolean) {
return enabledHybridMode || config.server.hybridMode === 'typeScriptPluginOnly';
}

function getCurrentHybridModeStatus(report = false) {
if (config.server.hybridMode === 'auto') {
if (config.server.hybridMode === 'typeScriptPluginOnly') {
return false;
}
else if (config.server.hybridMode === 'auto') {
const unknownExtensions: string[] = [];
for (const extension of vscode.extensions.all) {
const hasTsPlugin = !!extension.packageJSON?.contributes?.typescriptServerPlugins;
Expand Down Expand Up @@ -170,7 +179,7 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang
'vue',
'Vue',
getDocumentSelector(),
await getInitializationOptions(context, currentHybridModeStatus),
await getInitializationOptions(context, enabledHybridMode),
6009,
outputChannel
);
Expand All @@ -196,21 +205,21 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang
lsp.activateWriteVirtualFiles('vue.action.writeVirtualFiles', client);
lsp.activateServerSys(client);

if (!currentHybridModeStatus) {
if (!enabledHybridMode) {
lsp.activateTsConfigStatusItem(selectors, 'vue.tsconfig', client);
lsp.activateTsVersionStatusItem(selectors, 'vue.tsversion', context, client, text => 'TS ' + text);
lsp.activateFindFileReferences('vue.findAllFileReferences', client);
}

const hybridModeStatus = vscode.languages.createLanguageStatusItem('vue-hybrid-mode', selectors);
hybridModeStatus.text = 'Hybrid Mode';
hybridModeStatus.detail = (currentHybridModeStatus ? 'Enabled' : 'Disabled') + (config.server.hybridMode === 'auto' ? ' (Auto)' : '');
hybridModeStatus.detail = (enabledHybridMode ? 'Enabled' : 'Disabled') + (config.server.hybridMode === 'auto' ? ' (Auto)' : '');
hybridModeStatus.command = {
title: 'Open Setting',
command: 'workbench.action.openSettings',
arguments: ['vue.server.hybridMode'],
};
if (!currentHybridModeStatus) {
if (!enabledHybridMode) {
hybridModeStatus.severity = vscode.LanguageStatusSeverity.Warning;
}

Expand Down Expand Up @@ -248,14 +257,22 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang
function activateConfigWatcher() {
context.subscriptions.push(vscode.workspace.onDidChangeConfiguration(e => {
if (e.affectsConfiguration('vue.server.hybridMode')) {
const newStatus = getCurrentHybridModeStatus();
if (newStatus !== currentHybridModeStatus) {
const newHybridModeStatus = getCurrentHybridModeStatus();
const newTypeScriptPluginStatus = getCurrentTypeScriptPluginStatus(newHybridModeStatus);
if (newHybridModeStatus !== enabledHybridMode) {
requestReloadVscode(
newStatus
newHybridModeStatus
? 'Please reload VSCode to enable Hybrid Mode.'
: 'Please reload VSCode to disable Hybrid Mode.'
);
}
else if (newTypeScriptPluginStatus !== enabledTypeScriptPlugin) {
requestReloadVscode(
newTypeScriptPluginStatus
? 'Please reload VSCode to enable Vue TypeScript Plugin.'
: 'Please reload VSCode to disable Vue TypeScript Plugin.'
);
}
}
else if (e.affectsConfiguration('vue')) {
vscode.commands.executeCommand('vue.action.restartServer', false);
Expand All @@ -267,7 +284,7 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang
context.subscriptions.push(vscode.commands.registerCommand('vue.action.restartServer', async (restartTsServer: boolean = true) => {
await client.stop();
outputChannel.clear();
client.clientOptions.initializationOptions = await getInitializationOptions(context, currentHybridModeStatus);
client.clientOptions.initializationOptions = await getInitializationOptions(context, enabledHybridMode);
await client.start();
nameCasing.activate(context, client, selectors);
if (restartTsServer) {
Expand Down
2 changes: 1 addition & 1 deletion extensions/vscode/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export const config = {
return _config().get('doctor')!;
},
get server(): Readonly<{
hybridMode: 'auto' | boolean;
hybridMode: 'auto' | 'typeScriptPluginOnly' | boolean;
maxOldSpaceSize: number;
maxFileSize: number;
diagnosticModel: 'push' | 'pull';
Expand Down
10 changes: 8 additions & 2 deletions extensions/vscode/src/nodeClientMain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as serverLib from '@vue/language-server';
import * as fs from 'fs';
import * as vscode from 'vscode';
import * as lsp from '@volar/vscode/node';
import { activate as commonActivate, deactivate as commonDeactivate, currentHybridModeStatus } from './common';
import { activate as commonActivate, deactivate as commonDeactivate, enabledHybridMode, enabledTypeScriptPlugin } from './common';
import { config } from './config';
import { middleware } from './middleware';

Expand Down Expand Up @@ -140,7 +140,13 @@ try {
// @ts-expect-error
let text = readFileSync(...args) as string;

if (!currentHybridModeStatus) {
if (!enabledTypeScriptPlugin) {
text = text.replace(
'for(const e of n.contributes.typescriptServerPlugins',
s => s + `.filter(p=>p.name!=='typescript-vue-plugin-bundle')`
);
}
else if (!enabledHybridMode) {
// patch readPlugins
text = text.replace(
'languages:Array.isArray(e.languages)',
Expand Down