Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 5 additions & 56 deletions extensions/vscode/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -254,34 +254,6 @@
"default": "off",
"description": "Traces the communication between VS Code and the language server."
},
"vue.server.hybridMode": {
"type": [
"boolean",
"string"
],
"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.compatibleExtensions": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "Set compatible extensions to skip automatic detection of Hybrid Mode."
},
"vue.server.includeLanguages": {
"type": "array",
"items": {
Expand All @@ -291,14 +263,6 @@
"vue"
]
},
"vue.server.maxOldSpaceSize": {
"type": [
"number",
"null"
],
"default": null,
"description": "Set --max-old-space-size option on server process. If you have problem on frequently \"Request textDocument/** failed.\" error, try setting higher memory(MB) on it."
},
"vue.doctor.status": {
"type": "boolean",
"default": true,
Expand Down Expand Up @@ -330,11 +294,6 @@
"customBlocks"
]
},
"vue.updateImportsOnFileMove.enabled": {
"type": "boolean",
"default": true,
"description": "Enabled update imports on file move."
},
"vue.codeActions.enabled": {
"type": "boolean",
"default": true,
Expand Down Expand Up @@ -472,47 +431,37 @@
"title": "Split <script>, <template>, <style> Editors",
"category": "Vue",
"icon": "images/split-editors.png"
},
{
"command": "vue.findAllFileReferences",
"title": "Find File References via Vue Language Server",
"category": "Vue"
}
],
"menus": {
"editor/context": [
{
"command": "typescript.goToSourceDefinition",
"when": "vueHybridMode && tsSupportsSourceDefinition && resourceLangId == vue",
"when": "tsSupportsSourceDefinition && resourceLangId == vue",
"group": "navigation@9"
}
],
"explorer/context": [
{
"command": "typescript.findAllFileReferences",
"when": "vueHybridMode && tsSupportsFileReferences && resourceLangId == vue",
"group": "4_search"
},
{
"command": "vue.findAllFileReferences",
"when": "!vueHybridMode && resourceLangId == vue",
"when": "tsSupportsFileReferences && resourceLangId == vue",
"group": "4_search"
}
],
"editor/title/context": [
{
"command": "typescript.findAllFileReferences",
"when": "vueHybridMode && tsSupportsFileReferences && resourceLangId == vue"
"when": "tsSupportsFileReferences && resourceLangId == vue"
}
],
"commandPalette": [
{
"command": "typescript.reloadProjects",
"when": "vueHybridMode && editorLangId == vue && typescript.isManagedFile"
"when": "editorLangId == vue && typescript.isManagedFile"
},
{
"command": "typescript.goToProjectConfig",
"when": "vueHybridMode && editorLangId == vue"
"when": "editorLangId == vue"
},
{
"command": "vue.action.doctor",
Expand Down
55 changes: 0 additions & 55 deletions extensions/vscode/src/compatibility.ts

This file was deleted.

157 changes: 25 additions & 132 deletions extensions/vscode/src/hybridMode.ts
Original file line number Diff line number Diff line change
@@ -1,41 +1,8 @@
import * as fs from 'node:fs';
import * as path from 'node:path';
import { computed, executeCommand, useAllExtensions, useVscodeContext, watchEffect } from 'reactive-vscode';
import { computed, useAllExtensions } from 'reactive-vscode';
import * as semver from 'semver';
import * as vscode from 'vscode';
import { incompatibleExtensions, unknownExtensions } from './compatibility';
import { config } from './config';

const extensions = useAllExtensions();

export const enabledHybridMode = computed(() => {
if (config.server.hybridMode === 'typeScriptPluginOnly') {
return false;
}
else if (config.server.hybridMode === 'auto') {
if (
incompatibleExtensions.value.length ||
unknownExtensions.value.length
) {
return false;
}
else if (
(vscodeTsdkVersion.value && !semver.gte(vscodeTsdkVersion.value, '5.3.0')) ||
(workspaceTsdkVersion.value && !semver.gte(workspaceTsdkVersion.value, '5.3.0'))
) {
return false;
}
return true;
}
return config.server.hybridMode;
});

export const enabledTypeScriptPlugin = computed(() => {
return (
enabledHybridMode.value ||
config.server.hybridMode === 'typeScriptPluginOnly'
);
});

const vscodeTsdkVersion = computed(() => {
const nightly = extensions.value.find(
Expand Down Expand Up @@ -68,107 +35,33 @@ const workspaceTsdkVersion = computed(() => {
}
});

export function useHybridModeTips() {
useVscodeContext('vueHybridMode', enabledHybridMode);
const extensions = useAllExtensions();

watchEffect(() => {
if (config.server.hybridMode === 'auto') {
if (
incompatibleExtensions.value.length ||
unknownExtensions.value.length
) {
vscode.window
.showInformationMessage(
`Hybrid Mode is disabled automatically because there is a potentially incompatible ${[
...incompatibleExtensions.value,
...unknownExtensions.value,
].join(', ')} TypeScript plugin installed.`,
'Open Settings',
'Report a false positive'
)
.then(value => {
if (value === 'Open Settings') {
executeCommand(
'workbench.action.openSettings',
'vue.server.hybridMode'
);
}
else if (value == 'Report a false positive') {
vscode.env.openExternal(
vscode.Uri.parse(
'https://github.com/vuejs/language-tools/pull/4206'
)
);
}
});
}
else if (
(vscodeTsdkVersion.value && !semver.gte(vscodeTsdkVersion.value, '5.3.0')) ||
(workspaceTsdkVersion.value && !semver.gte(workspaceTsdkVersion.value, '5.3.0'))
) {
let msg = `Hybrid Mode is disabled automatically because TSDK >= 5.3.0 is required (VSCode TSDK: ${vscodeTsdkVersion.value}`;
if (workspaceTsdkVersion.value) {
msg += `, Workspace TSDK: ${workspaceTsdkVersion.value}`;
}
msg += `).`;
vscode.window
.showInformationMessage(msg, 'Open Settings')
.then(value => {
if (value === 'Open Settings') {
executeCommand(
'workbench.action.openSettings',
'vue.server.hybridMode'
);
}
});
}
export function checkCompatible() {
for (const extension of extensions.value) {
if (
extension.id === 'denoland.vscode-deno'
&& vscode.workspace.getConfiguration('deno').get<boolean>('enable')
) {
vscode.window.showWarningMessage(`The ${extension.packageJSON.displayName}(${extension.id}) extension is incompatible with the Vue extension. Please disable Deno in workspace to avoid issues.`);
}
else if (config.server.hybridMode && incompatibleExtensions.value.length) {
vscode.window
.showWarningMessage(
`You have explicitly enabled Hybrid Mode, but you have installed known incompatible extensions: ${incompatibleExtensions.value.join(
', '
)}. You may want to change vue.server.hybridMode to "auto" to avoid compatibility issues.`,
'Open Settings',
'Report a false positive'
)
.then(value => {
if (value === 'Open Settings') {
executeCommand(
'workbench.action.openSettings',
'vue.server.hybridMode'
);
}
else if (value == 'Report a false positive') {
vscode.env.openExternal(
vscode.Uri.parse(
'https://github.com/vuejs/language-tools/pull/4206'
)
);
}
});
if (
extension.id === 'svelte.svelte-vscode'
&& semver.lt(extension.packageJSON.version, '108.4.0')
) {
vscode.window.showWarningMessage(`The ${extension.packageJSON.displayName}(${extension.id}) extension is incompatible with the Vue extension. Please update ${extension.packageJSON.displayName} to the latest version to avoid issues.`);
}
});
}

export function useHybridModeStatusItem() {
const item = vscode.languages.createLanguageStatusItem(
'vue-hybrid-mode',
config.server.includeLanguages
);

item.text = 'Hybrid Mode';
item.detail =
(enabledHybridMode.value ? 'Enabled' : 'Disabled') +
(config.server.hybridMode === 'auto' ? ' (Auto)' : '');
item.command = {
title: 'Open Setting',
command: 'workbench.action.openSettings',
arguments: ['vue.server.hybridMode'],
};

if (!enabledHybridMode.value) {
item.severity = vscode.LanguageStatusSeverity.Warning;
}
if (
(vscodeTsdkVersion.value && !semver.gte(vscodeTsdkVersion.value, '5.3.0')) ||
(workspaceTsdkVersion.value && !semver.gte(workspaceTsdkVersion.value, '5.3.0'))
) {
let msg = `TSDK >= 5.3.0 is required (VSCode TSDK: ${vscodeTsdkVersion.value}`;
if (workspaceTsdkVersion.value) {
msg += `, Workspace TSDK: ${workspaceTsdkVersion.value}`;
}
msg += `).`;
vscode.window.showWarningMessage(msg);
}
}

Expand Down
Loading