@vue/language-server 2.0.19 → 2.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/hybridModeProject.d.ts +16 -7
- package/lib/hybridModeProject.js +61 -63
- package/lib/types.d.ts +1 -2
- package/node.d.ts +12 -23
- package/node.js +29 -13
- package/package.json +7 -7
|
@@ -1,8 +1,17 @@
|
|
|
1
|
-
import type { LanguagePlugin,
|
|
2
|
-
import { Disposable,
|
|
1
|
+
import type { LanguagePlugin, LanguageServerProject, ProviderResult } from '@volar/language-server';
|
|
2
|
+
import { Disposable, LanguageServiceEnvironment } from '@vue/language-service';
|
|
3
|
+
import { TypeScriptProjectHost } from '@vue/typescript-plugin/lib/utils';
|
|
3
4
|
import type * as ts from 'typescript';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
import { URI } from 'vscode-uri';
|
|
6
|
+
export type GetLanguagePlugin<T> = (params: {
|
|
7
|
+
serviceEnv: LanguageServiceEnvironment;
|
|
8
|
+
asFileName: (scriptId: T) => string;
|
|
9
|
+
configFileName?: string;
|
|
10
|
+
projectHost?: TypeScriptProjectHost;
|
|
11
|
+
sys?: ts.System & {
|
|
12
|
+
version: number;
|
|
13
|
+
sync(): Promise<number>;
|
|
14
|
+
} & Disposable;
|
|
15
|
+
}) => ProviderResult<LanguagePlugin<URI>[]>;
|
|
16
|
+
export declare function createHybridModeProject(sys: ts.System, getLanguagePlugins: GetLanguagePlugin<URI>): LanguageServerProject;
|
|
17
|
+
export declare function notEmpty<T>(value: T | null | undefined): value is T;
|
package/lib/hybridModeProject.js
CHANGED
|
@@ -1,78 +1,81 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.notEmpty = exports.createHybridModeProject = void 0;
|
|
4
4
|
const simpleProject_1 = require("@volar/language-server/lib/project/simpleProject");
|
|
5
|
-
const simpleProjectProvider_1 = require("@volar/language-server/lib/project/simpleProjectProvider");
|
|
6
|
-
const uriMap_1 = require("@volar/language-server/lib/utils/uriMap");
|
|
7
5
|
const language_core_1 = require("@vue/language-core");
|
|
8
6
|
const language_service_1 = require("@vue/language-service");
|
|
9
7
|
const utils_1 = require("@vue/typescript-plugin/lib/utils");
|
|
10
8
|
const vscode_uri_1 = require("vscode-uri");
|
|
11
|
-
function
|
|
9
|
+
function createHybridModeProject(sys, getLanguagePlugins) {
|
|
12
10
|
let initialized = false;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
let simpleLs;
|
|
12
|
+
let serviceEnv;
|
|
13
|
+
let server;
|
|
14
|
+
const tsconfigProjects = (0, language_service_1.createUriMap)(sys.useCaseSensitiveFileNames);
|
|
16
15
|
return {
|
|
17
|
-
|
|
16
|
+
setup(_server) {
|
|
17
|
+
server = _server;
|
|
18
|
+
},
|
|
19
|
+
async getLanguageService(uri) {
|
|
18
20
|
if (!initialized) {
|
|
19
21
|
initialized = true;
|
|
20
|
-
initialize(
|
|
21
|
-
}
|
|
22
|
-
const parsedUri = vscode_uri_1.URI.parse(uri);
|
|
23
|
-
const workspaceFolder = (0, simpleProjectProvider_1.getWorkspaceFolder)(parsedUri, this.workspaceFolders);
|
|
24
|
-
let serviceEnv = serviceEnvs.get(workspaceFolder);
|
|
25
|
-
if (!serviceEnv) {
|
|
26
|
-
serviceEnv = (0, simpleProjectProvider_1.createServiceEnvironment)(this, workspaceFolder);
|
|
27
|
-
serviceEnvs.set(workspaceFolder, serviceEnv);
|
|
22
|
+
initialize(server);
|
|
28
23
|
}
|
|
29
|
-
const fileName =
|
|
24
|
+
const fileName = asFileName(uri);
|
|
30
25
|
const projectInfo = (await (0, utils_1.searchNamedPipeServerForFile)(fileName))?.projectInfo;
|
|
31
26
|
if (projectInfo?.kind === 1) {
|
|
32
27
|
const tsconfig = projectInfo.name;
|
|
33
|
-
const tsconfigUri = vscode_uri_1.URI.
|
|
28
|
+
const tsconfigUri = vscode_uri_1.URI.file(tsconfig);
|
|
34
29
|
if (!tsconfigProjects.has(tsconfigUri)) {
|
|
35
30
|
tsconfigProjects.set(tsconfigUri, (async () => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
31
|
+
serviceEnv ??= (0, simpleProject_1.createLanguageServiceEnvironment)(server, [...server.workspaceFolders.keys()]);
|
|
32
|
+
const languagePlugins = await getLanguagePlugins({
|
|
33
|
+
serviceEnv,
|
|
34
|
+
configFileName: tsconfig,
|
|
35
|
+
sys: {
|
|
36
|
+
...sys,
|
|
37
|
+
version: 0,
|
|
38
|
+
async sync() {
|
|
39
|
+
return 0;
|
|
40
|
+
},
|
|
41
|
+
dispose() { },
|
|
41
42
|
},
|
|
42
|
-
|
|
43
|
+
asFileName,
|
|
43
44
|
});
|
|
44
|
-
return
|
|
45
|
+
return createLs(server, serviceEnv, languagePlugins);
|
|
45
46
|
})());
|
|
46
47
|
}
|
|
47
48
|
return await tsconfigProjects.get(tsconfigUri);
|
|
48
49
|
}
|
|
49
50
|
else {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
return await simpleProjects.get(workspaceFolder);
|
|
51
|
+
simpleLs ??= (async () => {
|
|
52
|
+
serviceEnv ??= (0, simpleProject_1.createLanguageServiceEnvironment)(server, [...server.workspaceFolders.keys()]);
|
|
53
|
+
const languagePlugins = await getLanguagePlugins({ serviceEnv, asFileName });
|
|
54
|
+
return createLs(server, serviceEnv, languagePlugins);
|
|
55
|
+
})();
|
|
56
|
+
return await simpleLs;
|
|
57
57
|
}
|
|
58
58
|
},
|
|
59
|
-
async
|
|
59
|
+
async getExistingLanguageServices() {
|
|
60
60
|
return Promise.all([
|
|
61
61
|
...tsconfigProjects.values(),
|
|
62
|
-
|
|
63
|
-
]);
|
|
62
|
+
simpleLs,
|
|
63
|
+
].filter(notEmpty));
|
|
64
64
|
},
|
|
65
65
|
reload() {
|
|
66
|
-
for (const
|
|
66
|
+
for (const ls of [
|
|
67
67
|
...tsconfigProjects.values(),
|
|
68
|
-
|
|
68
|
+
simpleLs,
|
|
69
69
|
]) {
|
|
70
|
-
|
|
70
|
+
ls?.then(ls => ls.dispose());
|
|
71
71
|
}
|
|
72
72
|
tsconfigProjects.clear();
|
|
73
|
-
|
|
73
|
+
simpleLs = undefined;
|
|
74
74
|
},
|
|
75
75
|
};
|
|
76
|
+
function asFileName(uri) {
|
|
77
|
+
return uri.fsPath.replace(/\\/g, '/');
|
|
78
|
+
}
|
|
76
79
|
function initialize(server) {
|
|
77
80
|
server.onDidChangeWatchedFiles(({ changes }) => {
|
|
78
81
|
for (const change of changes) {
|
|
@@ -85,31 +88,26 @@ function createHybridModeProjectProviderFactory(sys, getLanguagePlugins) {
|
|
|
85
88
|
}
|
|
86
89
|
});
|
|
87
90
|
}
|
|
88
|
-
function
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
function getLanguageService() {
|
|
98
|
-
if (!languageService) {
|
|
99
|
-
const language = (0, language_core_1.createLanguage)(languagePlugins, false, uri => {
|
|
100
|
-
const document = server.documents.get(uri);
|
|
101
|
-
if (document) {
|
|
102
|
-
language.scripts.set(uri, document.getSnapshot(), document.languageId);
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
language.scripts.delete(uri);
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
languageService = (0, language_service_1.createLanguageService)(language, server.languageServicePlugins, serviceEnv);
|
|
91
|
+
function createLs(server, serviceEnv, languagePlugins) {
|
|
92
|
+
const language = (0, language_core_1.createLanguage)([
|
|
93
|
+
{ getLanguageId: uri => server.documents.get(server.getSyncedDocumentKey(uri) ?? uri.toString())?.languageId },
|
|
94
|
+
...languagePlugins,
|
|
95
|
+
], (0, language_service_1.createUriMap)(), uri => {
|
|
96
|
+
const documentKey = server.getSyncedDocumentKey(uri);
|
|
97
|
+
const document = documentKey ? server.documents.get(documentKey) : undefined;
|
|
98
|
+
if (document) {
|
|
99
|
+
language.scripts.set(uri, document.getSnapshot(), document.languageId);
|
|
109
100
|
}
|
|
110
|
-
|
|
111
|
-
|
|
101
|
+
else {
|
|
102
|
+
language.scripts.delete(uri);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
return (0, language_service_1.createLanguageService)(language, server.languageServicePlugins, serviceEnv);
|
|
112
106
|
}
|
|
113
107
|
}
|
|
114
|
-
exports.
|
|
108
|
+
exports.createHybridModeProject = createHybridModeProject;
|
|
109
|
+
function notEmpty(value) {
|
|
110
|
+
return value !== null && value !== undefined;
|
|
111
|
+
}
|
|
112
|
+
exports.notEmpty = notEmpty;
|
|
115
113
|
//# sourceMappingURL=hybridModeProject.js.map
|
package/lib/types.d.ts
CHANGED
package/node.d.ts
CHANGED
|
@@ -1,34 +1,23 @@
|
|
|
1
1
|
import type { Connection } from '@volar/language-server';
|
|
2
|
+
import { URI } from 'vscode-uri';
|
|
2
3
|
import { GetLanguagePlugin } from './lib/hybridModeProject';
|
|
3
4
|
export declare const connection: Connection;
|
|
4
5
|
export declare const server: {
|
|
5
6
|
connection: Connection;
|
|
6
|
-
initializeParams: import("@volar/language-server").VolarInitializeParams;
|
|
7
|
-
languageServicePlugins: import("@volar/language-server").LanguageServicePlugin<any>[];
|
|
8
|
-
projects: import("@volar/language-server").ServerProjectProvider;
|
|
9
7
|
fs: import("@volar/language-server").FileSystem;
|
|
10
|
-
|
|
8
|
+
initializeParams: import("@volar/language-server").InitializeParams;
|
|
9
|
+
initializeResult: import("@volar/language-server").VolarInitializeResult;
|
|
10
|
+
languageServicePlugins: import("@volar/language-server").LanguageServicePlugin<any>[];
|
|
11
|
+
project: import("@volar/language-server").LanguageServerProject;
|
|
11
12
|
pullModelDiagnostics: boolean;
|
|
12
13
|
documents: import("@volar/language-server").TextDocuments<import("@volar/language-server/node").SnapshotDocument>;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
};
|
|
17
|
-
workspaceFolders: {
|
|
18
|
-
clear: () => void;
|
|
19
|
-
values: () => IterableIterator<boolean>;
|
|
20
|
-
keys: () => Generator<import("vscode-uri").URI, void, unknown>;
|
|
21
|
-
delete: (uri: import("vscode-uri").URI) => boolean;
|
|
22
|
-
get: (uri: import("vscode-uri").URI) => boolean | undefined;
|
|
23
|
-
has: (uri: import("vscode-uri").URI) => boolean;
|
|
24
|
-
set: (uri: import("vscode-uri").URI, item: boolean) => Map<string, boolean>;
|
|
25
|
-
};
|
|
26
|
-
initialize: (initializeParams: import("@volar/language-server").VolarInitializeParams, languageServicePlugins: import("@volar/language-server").LanguageServicePlugin<any>[], projects: import("@volar/language-server").ServerProjectProvider, options?: {
|
|
27
|
-
semanticTokensLegend?: import("@volar/language-server").SemanticTokensLegend | undefined;
|
|
14
|
+
workspaceFolders: Map<URI, boolean>;
|
|
15
|
+
getSyncedDocumentKey: (uri: URI) => string | undefined;
|
|
16
|
+
initialize: (initializeParams: import("@volar/language-server").InitializeParams, project: import("@volar/language-server").LanguageServerProject, languageServicePlugins: import("@volar/language-server").LanguageServicePlugin<any>[], options?: {
|
|
28
17
|
pullModelDiagnostics?: boolean | undefined;
|
|
29
|
-
} | undefined) => import("@volar/language-server").
|
|
18
|
+
} | undefined) => import("@volar/language-server").VolarInitializeResult;
|
|
30
19
|
initialized: () => void;
|
|
31
|
-
shutdown: () =>
|
|
20
|
+
shutdown: () => void;
|
|
32
21
|
watchFiles: (patterns: string[]) => void;
|
|
33
22
|
getConfiguration: <T>(section: string, scopeUri?: string | undefined) => Promise<T | undefined>;
|
|
34
23
|
onDidChangeConfiguration: (cb: import("@volar/language-server").NotificationHandler<import("@volar/language-server").DidChangeConfigurationParams>) => {
|
|
@@ -38,6 +27,6 @@ export declare const server: {
|
|
|
38
27
|
dispose: () => void;
|
|
39
28
|
};
|
|
40
29
|
clearPushDiagnostics: () => void;
|
|
41
|
-
refresh: (projects: import("@volar/language-server").
|
|
30
|
+
refresh: (projects: import("@volar/language-server").LanguageServerProject) => Promise<void>;
|
|
42
31
|
};
|
|
43
|
-
export declare const getLanguagePlugins: GetLanguagePlugin
|
|
32
|
+
export declare const getLanguagePlugins: GetLanguagePlugin<URI>;
|
package/node.js
CHANGED
|
@@ -6,6 +6,7 @@ const language_core_1 = require("@vue/language-core");
|
|
|
6
6
|
const language_service_1 = require("@vue/language-service");
|
|
7
7
|
const tsPluginClient = require("@vue/typescript-plugin/lib/client");
|
|
8
8
|
const utils_1 = require("@vue/typescript-plugin/lib/utils");
|
|
9
|
+
const vscode_uri_1 = require("vscode-uri");
|
|
9
10
|
const hybridModeProject_1 = require("./lib/hybridModeProject");
|
|
10
11
|
const protocol_1 = require("./lib/protocol");
|
|
11
12
|
let tsdk;
|
|
@@ -15,10 +16,16 @@ const envToVueOptions = new WeakMap();
|
|
|
15
16
|
const watchedExtensions = new Set();
|
|
16
17
|
exports.connection = (0, node_1.createConnection)();
|
|
17
18
|
exports.server = (0, node_1.createServer)(exports.connection);
|
|
18
|
-
const getLanguagePlugins = async (serviceEnv, configFileName,
|
|
19
|
+
const getLanguagePlugins = async ({ serviceEnv, configFileName, projectHost, sys, asFileName }) => {
|
|
19
20
|
const commandLine = await parseCommandLine();
|
|
20
21
|
const vueOptions = commandLine?.vueOptions ?? (0, language_core_1.resolveVueCompilerOptions)({});
|
|
21
|
-
const vueLanguagePlugin = (0, language_core_1.createVueLanguagePlugin)(tsdk.typescript,
|
|
22
|
+
const vueLanguagePlugin = (0, language_core_1.createVueLanguagePlugin)(tsdk.typescript, asFileName, () => projectHost?.getProjectVersion?.() ?? '', fileName => {
|
|
23
|
+
const fileMap = new language_core_1.FileMap(sys?.useCaseSensitiveFileNames ?? false);
|
|
24
|
+
for (const vueFileName of projectHost?.getScriptFileNames() ?? []) {
|
|
25
|
+
fileMap.set(vueFileName, undefined);
|
|
26
|
+
}
|
|
27
|
+
return fileMap.has(fileName);
|
|
28
|
+
}, commandLine?.options ?? {}, vueOptions);
|
|
22
29
|
if (!hybridMode) {
|
|
23
30
|
const extensions = [
|
|
24
31
|
'js', 'cjs', 'mjs', 'ts', 'cts', 'mts', 'jsx', 'tsx', 'json',
|
|
@@ -62,11 +69,17 @@ exports.connection.onInitialize(params => {
|
|
|
62
69
|
getTsPluginClient = () => tsPluginClient;
|
|
63
70
|
}
|
|
64
71
|
else {
|
|
65
|
-
getTsPluginClient = (0, language_service_1.createDefaultGetTsPluginClient)(tsdk.typescript
|
|
72
|
+
getTsPluginClient = (0, language_service_1.createDefaultGetTsPluginClient)(tsdk.typescript);
|
|
66
73
|
}
|
|
67
|
-
const result = exports.server.initialize(params,
|
|
68
|
-
? (0, hybridModeProject_1.
|
|
69
|
-
: (0, node_1.
|
|
74
|
+
const result = exports.server.initialize(params, hybridMode
|
|
75
|
+
? (0, hybridModeProject_1.createHybridModeProject)(tsdk.typescript.sys, exports.getLanguagePlugins)
|
|
76
|
+
: (0, node_1.createTypeScriptProject)(tsdk.typescript, tsdk.diagnosticMessages, (env, ctx) => (0, exports.getLanguagePlugins)({
|
|
77
|
+
serviceEnv: env,
|
|
78
|
+
configFileName: ctx.configFileName,
|
|
79
|
+
projectHost: ctx.projectHost,
|
|
80
|
+
sys: ctx.sys,
|
|
81
|
+
asFileName: ctx.asFileName,
|
|
82
|
+
})), (0, language_service_1.getVueLanguageServicePlugins)(tsdk.typescript, env => envToVueOptions.get(env), getTsPluginClient, hybridMode), {
|
|
70
83
|
pullModelDiagnostics: hybridMode,
|
|
71
84
|
});
|
|
72
85
|
if (hybridMode) {
|
|
@@ -85,21 +98,24 @@ exports.connection.onRequest(protocol_1.ParseSFCRequest.type, params => {
|
|
|
85
98
|
return (0, language_core_1.parse)(params);
|
|
86
99
|
});
|
|
87
100
|
exports.connection.onRequest(protocol_1.DetectNameCasingRequest.type, async (params) => {
|
|
88
|
-
const
|
|
101
|
+
const uri = vscode_uri_1.URI.parse(params.textDocument.uri);
|
|
102
|
+
const languageService = await getService(uri);
|
|
89
103
|
if (languageService) {
|
|
90
|
-
return await (0, language_service_1.detect)(languageService.context,
|
|
104
|
+
return await (0, language_service_1.detect)(languageService.context, uri);
|
|
91
105
|
}
|
|
92
106
|
});
|
|
93
107
|
exports.connection.onRequest(protocol_1.GetConvertTagCasingEditsRequest.type, async (params) => {
|
|
94
|
-
const
|
|
108
|
+
const uri = vscode_uri_1.URI.parse(params.textDocument.uri);
|
|
109
|
+
const languageService = await getService(uri);
|
|
95
110
|
if (languageService) {
|
|
96
|
-
return await (0, language_service_1.convertTagName)(languageService.context,
|
|
111
|
+
return await (0, language_service_1.convertTagName)(languageService.context, uri, params.casing, getTsPluginClient(languageService.context));
|
|
97
112
|
}
|
|
98
113
|
});
|
|
99
114
|
exports.connection.onRequest(protocol_1.GetConvertAttrCasingEditsRequest.type, async (params) => {
|
|
100
|
-
const
|
|
115
|
+
const uri = vscode_uri_1.URI.parse(params.textDocument.uri);
|
|
116
|
+
const languageService = await getService(uri);
|
|
101
117
|
if (languageService) {
|
|
102
|
-
return await (0, language_service_1.convertAttrName)(languageService.context,
|
|
118
|
+
return await (0, language_service_1.convertAttrName)(languageService.context, uri, params.casing, getTsPluginClient(languageService.context));
|
|
103
119
|
}
|
|
104
120
|
});
|
|
105
121
|
exports.connection.onRequest(protocol_1.GetConnectedNamedPipeServerRequest.type, async (fileName) => {
|
|
@@ -109,6 +125,6 @@ exports.connection.onRequest(protocol_1.GetConnectedNamedPipeServerRequest.type,
|
|
|
109
125
|
}
|
|
110
126
|
});
|
|
111
127
|
async function getService(uri) {
|
|
112
|
-
return (await exports.server.
|
|
128
|
+
return (await exports.server.project.getLanguageService(uri));
|
|
113
129
|
}
|
|
114
130
|
//# sourceMappingURL=node.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vue/language-server",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.20",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"files": [
|
|
6
6
|
"**/*.js",
|
|
@@ -15,13 +15,13 @@
|
|
|
15
15
|
"directory": "packages/language-server"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@volar/language-core": "~2.
|
|
19
|
-
"@volar/language-server": "~2.
|
|
20
|
-
"@vue/language-core": "2.0.
|
|
21
|
-
"@vue/language-service": "2.0.
|
|
22
|
-
"@vue/typescript-plugin": "2.0.
|
|
18
|
+
"@volar/language-core": "~2.3.0-alpha.14",
|
|
19
|
+
"@volar/language-server": "~2.3.0-alpha.14",
|
|
20
|
+
"@vue/language-core": "2.0.20",
|
|
21
|
+
"@vue/language-service": "2.0.20",
|
|
22
|
+
"@vue/typescript-plugin": "2.0.20",
|
|
23
23
|
"vscode-languageserver-protocol": "^3.17.5",
|
|
24
24
|
"vscode-uri": "^3.0.8"
|
|
25
25
|
},
|
|
26
|
-
"gitHead": "
|
|
26
|
+
"gitHead": "e1a5d2f136bf60a772c9655f9f5474c7f71a2ff9"
|
|
27
27
|
}
|