Skip to content

Commit cd3532d

Browse files
feat: upgrade to Volar 2.1 (#3906)
1 parent 549d036 commit cd3532d

File tree

24 files changed

+319
-320
lines changed

24 files changed

+319
-320
lines changed

extensions/vscode/package.json

+13-72
Original file line numberDiff line numberDiff line change
@@ -283,67 +283,6 @@
283283
"type": "object",
284284
"title": "Volar",
285285
"properties": {
286-
"volar.format.initialIndent": {
287-
"type": "object",
288-
"description": "Whether to have initial indent.",
289-
"default": {
290-
"html": true
291-
},
292-
"properties": {
293-
"html": {
294-
"type": "boolean",
295-
"default": true
296-
},
297-
"typescript": {
298-
"type": "boolean",
299-
"default": false
300-
},
301-
"javascript": {
302-
"type": "boolean",
303-
"default": false
304-
},
305-
"typescriptreact": {
306-
"type": "boolean",
307-
"default": false
308-
},
309-
"javascriptreact": {
310-
"type": "boolean",
311-
"default": false
312-
},
313-
"css": {
314-
"type": "boolean",
315-
"default": false
316-
},
317-
"scss": {
318-
"type": "boolean",
319-
"default": false
320-
},
321-
"less": {
322-
"type": "boolean",
323-
"default": false
324-
},
325-
"sass": {
326-
"type": "boolean",
327-
"default": false
328-
},
329-
"jade": {
330-
"type": "boolean",
331-
"default": false
332-
},
333-
"json": {
334-
"type": "boolean",
335-
"default": false
336-
},
337-
"jsonc": {
338-
"type": "boolean",
339-
"default": false
340-
},
341-
"json5": {
342-
"type": "boolean",
343-
"default": false
344-
}
345-
}
346-
},
347286
"vue.trace.server": {
348287
"scope": "window",
349288
"type": "string",
@@ -406,11 +345,6 @@
406345
"default": null,
407346
"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."
408347
},
409-
"vue.server.reverseConfigFilePriority": {
410-
"type": "boolean",
411-
"default": false,
412-
"description": "Reverse priority for tsconfig pickup."
413-
},
414348
"vue.server.additionalExtensions": {
415349
"type": "array",
416350
"items": {
@@ -419,11 +353,6 @@
419353
"default": [ ],
420354
"description": "List any additional file extensions that should be processed as Vue files (requires restart)."
421355
},
422-
"vue.server.fullCompletionList": {
423-
"type": "boolean",
424-
"default": false,
425-
"description": "Enable this option if you want to get complete CompletionList in language client. (Disable for better performance)"
426-
},
427356
"vue.doctor.status": {
428357
"type": "boolean",
429358
"default": true,
@@ -537,6 +466,18 @@
537466
"type": "boolean",
538467
"default": false,
539468
"description": "Show inlay hints for component options wrapper for type support."
469+
},
470+
"vue.format.template.initialIndent": {
471+
"type": "boolean",
472+
"default": true
473+
},
474+
"vue.format.style.initialIndent": {
475+
"type": "boolean",
476+
"default": false
477+
},
478+
"vue.format.script.initialIndent": {
479+
"type": "boolean",
480+
"default": false
540481
}
541482
}
542483
},
@@ -643,7 +584,7 @@
643584
"devDependencies": {
644585
"@types/semver": "^7.5.3",
645586
"@types/vscode": "^1.82.0",
646-
"@volar/vscode": "~2.0.2",
587+
"@volar/vscode": "~2.1.0",
647588
"@vue/language-core": "1.8.27",
648589
"@vue/language-server": "1.8.27",
649590
"esbuild": "latest",

extensions/vscode/src/common.ts

+18-20
Original file line numberDiff line numberDiff line change
@@ -143,25 +143,23 @@ export function getDocumentSelector(): lsp.DocumentFilter[] {
143143

144144
async function getInitializationOptions(
145145
context: vscode.ExtensionContext,
146-
options: VueInitializationOptions = {},
147-
) {
148-
// volar
149-
options.diagnosticModel = config.server.diagnosticModel === 'pull' ? DiagnosticModel.Pull : DiagnosticModel.Push;
150-
options.typescript = { tsdk: (await getTsdk(context)).tsdk };
151-
options.reverseConfigFilePriority = config.server.reverseConfigFilePriority;
152-
options.maxFileSize = config.server.maxFileSize;
153-
options.semanticTokensLegend = {
154-
tokenTypes: ['component'],
155-
tokenModifiers: [],
146+
): Promise<VueInitializationOptions> {
147+
return {
148+
// volar
149+
diagnosticModel: config.server.diagnosticModel === 'pull' ? DiagnosticModel.Pull : DiagnosticModel.Push,
150+
typescript: { tsdk: (await getTsdk(context)).tsdk },
151+
maxFileSize: config.server.maxFileSize,
152+
semanticTokensLegend: {
153+
tokenTypes: ['component'],
154+
tokenModifiers: [],
155+
},
156+
vue: {
157+
hybridMode: true,
158+
additionalExtensions: [
159+
...config.server.additionalExtensions,
160+
...!config.server.petiteVue.supportHtmlFile ? [] : ['html'],
161+
...!config.server.vitePress.supportMdFile ? [] : ['md'],
162+
],
163+
},
156164
};
157-
options.fullCompletionList = config.server.fullCompletionList;
158-
options.vue = {
159-
hybridMode: true,
160-
additionalExtensions: [
161-
...config.server.additionalExtensions,
162-
...!config.server.petiteVue.supportHtmlFile ? [] : ['html'],
163-
...!config.server.vitePress.supportMdFile ? [] : ['md'],
164-
],
165-
};
166-
return options;
167165
}

extensions/vscode/src/config.ts

-2
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,8 @@ export const config = {
2020
runtime: 'node' | 'bun';
2121
maxOldSpaceSize: number;
2222
maxFileSize: number;
23-
reverseConfigFilePriority: boolean;
2423
diagnosticModel: 'push' | 'pull';
2524
additionalExtensions: string[];
26-
fullCompletionList: boolean;
2725
vitePress: {
2826
supportMdFile: boolean;
2927
};

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"devDependencies": {
2020
"@lerna-lite/cli": "latest",
2121
"@lerna-lite/publish": "latest",
22-
"@volar/language-service": "~2.0.2",
22+
"@volar/language-service": "~2.1.0",
2323
"typescript": "latest",
2424
"vite": "latest",
2525
"vitest": "latest"

packages/component-meta/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"directory": "packages/component-meta"
1414
},
1515
"dependencies": {
16-
"@volar/typescript": "~2.0.2",
16+
"@volar/typescript": "~2.1.0",
1717
"@vue/language-core": "1.8.27",
1818
"path-browserify": "^1.0.1",
1919
"vue-component-type-helpers": "1.8.27"

packages/language-core/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"directory": "packages/language-core"
1414
},
1515
"dependencies": {
16-
"@volar/language-core": "~2.0.2",
16+
"@volar/language-core": "~2.1.0",
1717
"@vue/compiler-dom": "^3.4.0",
1818
"@vue/shared": "^3.4.0",
1919
"computeds": "^0.0.1",

packages/language-core/src/generators/template.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -480,8 +480,8 @@ export function* generate(
480480
content,
481481
start,
482482
lines.length <= 1 ? formatBrackets.curly : [
483-
formatBrackets.curly[0],
484-
lines[lines.length - 1].trim() === '' ? '' : formatBrackets.curly[1],
483+
lines[0].trim() === '' ? '(' : formatBrackets.curly[0],
484+
lines[lines.length - 1].trim() === '' ? ')' : formatBrackets.curly[1],
485485
],
486486
);
487487
}

packages/language-core/src/virtualFile/computedFiles.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ export function computedFiles(
7979
else {
8080
const parent = findParentStructure(file.parentFileId, embeddedCodes);
8181
if (parent) {
82+
parent.embeddedCodes ??= [];
8283
parent.embeddedCodes.push({
8384
id: file.id,
8485
languageId: resolveCommonLanguageId(`/dummy.${file.lang}`),
@@ -98,7 +99,7 @@ export function computedFiles(
9899
if (child.id === id) {
99100
return child;
100101
}
101-
let parent = findParentStructure(id, child.embeddedCodes);
102+
let parent = findParentStructure(id, child.embeddedCodes ?? []);
102103
if (parent) {
103104
return parent;
104105
}

packages/language-plugin-pug/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"@vue/language-core": "1.8.27"
1818
},
1919
"dependencies": {
20-
"@volar/source-map": "~2.0.2",
21-
"volar-service-pug": "0.0.28"
20+
"@volar/source-map": "~2.1.0",
21+
"volar-service-pug": "0.0.31"
2222
}
2323
}

packages/language-server/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
"directory": "packages/language-server"
1717
},
1818
"dependencies": {
19-
"@volar/language-core": "~2.0.2",
20-
"@volar/language-server": "~2.0.2",
19+
"@volar/language-core": "~2.1.0",
20+
"@volar/language-server": "~2.1.0",
2121
"@vue/language-core": "1.8.27",
2222
"@vue/language-service": "1.8.27",
2323
"vscode-languageserver-protocol": "^3.17.5",

packages/language-server/src/nodeServer.ts

+16-19
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { createConnection, createServer, createSimpleProjectProvider, createTypeScriptProjectProvider } from '@volar/language-server/node';
1+
import { createConnection, createServer, createSimpleProjectProviderFactory, createTypeScriptProjectProviderFactory, loadTsdkByPath } from '@volar/language-server/node';
22
import { ServerProject } from '@volar/language-server';
33
import * as vue2 from '@vue/language-core';
44
import { VueCompilerOptions } from '@vue/language-core';
@@ -13,11 +13,16 @@ const server = createServer(connection);
1313
const checkers = new WeakMap<ServerProject, componentMeta.ComponentMetaChecker>();
1414
const envToVueOptions = new WeakMap<vue.ServiceEnvironment, VueCompilerOptions>();
1515

16+
let tsdk: ReturnType<typeof loadTsdkByPath>;
17+
1618
connection.listen();
1719

1820
connection.onInitialize(params => {
1921

2022
const options: VueInitializationOptions = params.initializationOptions;
23+
24+
tsdk = loadTsdkByPath(options.typescript.tsdk!, params.locale);
25+
2126
const vueFileExtensions: string[] = ['vue'];
2227

2328
if (options.vue?.additionalExtensions) {
@@ -28,20 +33,20 @@ connection.onInitialize(params => {
2833

2934
return server.initialize(
3035
params,
31-
options.vue?.hybridMode ? createSimpleProjectProvider : createTypeScriptProjectProvider,
36+
options.vue?.hybridMode
37+
? createSimpleProjectProviderFactory()
38+
: createTypeScriptProjectProviderFactory(tsdk.typescript, tsdk.diagnosticMessages),
3239
{
3340
watchFileExtensions: ['js', 'cjs', 'mjs', 'ts', 'cts', 'mts', 'jsx', 'tsx', 'json', ...vueFileExtensions],
3441
getServicePlugins() {
35-
const ts = getTsLib();
36-
const services = vue.resolveServices({}, ts, env => envToVueOptions.get(env)!);
42+
const services = vue.resolveServices({}, tsdk.typescript, env => envToVueOptions.get(env)!);
3743

3844
return Object.values(services);
3945
},
4046
async getLanguagePlugins(serviceEnv, projectContext) {
41-
const ts = getTsLib();
4247
const [commandLine, vueOptions] = await parseCommandLine();
4348
const resolvedVueOptions = vue.resolveVueCompilerOptions(vueOptions);
44-
const languages = vue.resolveLanguages({}, ts, serviceEnv.typescript!.uriToFileName, commandLine?.options ?? {}, resolvedVueOptions, options.codegenStack);
49+
const languages = vue.resolveLanguages({}, tsdk.typescript, serviceEnv.typescript!.uriToFileName, commandLine?.options ?? {}, resolvedVueOptions, options.codegenStack);
4550

4651
envToVueOptions.set(serviceEnv, resolvedVueOptions);
4752

@@ -62,7 +67,7 @@ connection.onInitialize(params => {
6267
while (sysVersion !== newSysVersion) {
6368
sysVersion = newSysVersion;
6469
if (projectContext.typescript.configFileName) {
65-
commandLine = vue2.createParsedCommandLine(ts, sys, projectContext.typescript.configFileName);
70+
commandLine = vue2.createParsedCommandLine(tsdk.typescript, sys, projectContext.typescript.configFileName);
6671
}
6772
newSysVersion = await sys.sync();
6873
}
@@ -99,14 +104,14 @@ connection.onRequest(ParseSFCRequest.type, params => {
99104
connection.onRequest(DetectNameCasingRequest.type, async params => {
100105
const languageService = await getService(params.textDocument.uri);
101106
if (languageService) {
102-
return nameCasing.detect(getTsLib(), languageService.context, params.textDocument.uri, envToVueOptions.get(languageService.context.env)!);
107+
return nameCasing.detect(tsdk.typescript, languageService.context, params.textDocument.uri, envToVueOptions.get(languageService.context.env)!);
103108
}
104109
});
105110

106111
connection.onRequest(GetConvertTagCasingEditsRequest.type, async params => {
107112
const languageService = await getService(params.textDocument.uri);
108113
if (languageService) {
109-
return nameCasing.convertTagName(getTsLib(), languageService.context, params.textDocument.uri, params.casing, envToVueOptions.get(languageService.context.env)!);
114+
return nameCasing.convertTagName(tsdk.typescript, languageService.context, params.textDocument.uri, params.casing, envToVueOptions.get(languageService.context.env)!);
110115
}
111116
});
112117

@@ -115,7 +120,7 @@ connection.onRequest(GetConvertAttrCasingEditsRequest.type, async params => {
115120
if (languageService) {
116121
const vueOptions = envToVueOptions.get(languageService.context.env);
117122
if (vueOptions) {
118-
return nameCasing.convertAttrName(getTsLib(), languageService.context, params.textDocument.uri, params.casing, envToVueOptions.get(languageService.context.env)!);
123+
return nameCasing.convertAttrName(tsdk.typescript, languageService.context, params.textDocument.uri, params.casing, envToVueOptions.get(languageService.context.env)!);
119124
}
120125
}
121126
});
@@ -128,7 +133,7 @@ connection.onRequest(GetComponentMeta.type, async params => {
128133
let checker = checkers.get(project);
129134
if (!checker) {
130135
checker = componentMeta.baseCreate(
131-
getTsLib(),
136+
tsdk.typescript,
132137
langaugeService.context.language.typescript!.configFileName,
133138
langaugeService.context.language.typescript!.projectHost,
134139
envToVueOptions.get(langaugeService.context.env)!,
@@ -140,14 +145,6 @@ connection.onRequest(GetComponentMeta.type, async params => {
140145
return checker?.getComponentMeta(langaugeService.context.env.typescript!.uriToFileName(params.uri));
141146
});
142147

143-
function getTsLib() {
144-
const ts = server.modules.typescript;
145-
if (!ts) {
146-
throw 'typescript not found';
147-
}
148-
return ts;
149-
}
150-
151148
async function getService(uri: string) {
152149
return (await server.projects.getProject(uri)).getLanguageService();
153150
}

packages/language-server/src/types.ts

+4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import { InitializationOptions } from "@volar/language-server";
22

33
export type VueInitializationOptions = InitializationOptions & {
4+
typescript: {
5+
tsdk?: string;
6+
tsdkUrl?: string;
7+
}
48
vue?: {
59
/**
610
* @example ['vue1', 'vue2']

0 commit comments

Comments
 (0)