@vue/language-server 3.1.0 → 3.1.1
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/bin/vue-language-server.js +0 -6
- package/index.js +15 -153
- package/lib/server.d.ts +1 -0
- package/lib/server.js +160 -0
- package/package.json +5 -5
package/index.js
CHANGED
|
@@ -1,158 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
tsserverRequestHandlers.get(id)?.(res);
|
|
16
|
-
tsserverRequestHandlers.delete(id);
|
|
17
|
-
});
|
|
18
|
-
connection.onInitialize(params => {
|
|
19
|
-
const tsconfigProjects = (0, language_service_1.createUriMap)();
|
|
20
|
-
const file2ProjectInfo = new Map();
|
|
21
|
-
server.fileWatcher.onDidChangeWatchedFiles(({ changes }) => {
|
|
22
|
-
for (const change of changes) {
|
|
23
|
-
const changeUri = vscode_uri_1.URI.parse(change.uri);
|
|
24
|
-
if (tsconfigProjects.has(changeUri)) {
|
|
25
|
-
tsconfigProjects.get(changeUri).dispose();
|
|
26
|
-
tsconfigProjects.delete(changeUri);
|
|
27
|
-
file2ProjectInfo.clear();
|
|
28
|
-
}
|
|
3
|
+
const server_1 = require("./lib/server");
|
|
4
|
+
if (process.argv.includes('--version')) {
|
|
5
|
+
console.log(require('./package.json').version);
|
|
6
|
+
}
|
|
7
|
+
else {
|
|
8
|
+
let ts;
|
|
9
|
+
for (const arg of process.argv) {
|
|
10
|
+
if (arg.startsWith('--tsdk=')) {
|
|
11
|
+
const tsdk = arg.substring('--tsdk='.length);
|
|
12
|
+
const tsPath = require.resolve('./typescript.js', { paths: [tsdk] });
|
|
13
|
+
ts = require(tsPath);
|
|
14
|
+
break;
|
|
29
15
|
}
|
|
30
|
-
});
|
|
31
|
-
let simpleLanguageService;
|
|
32
|
-
return server.initialize(params, {
|
|
33
|
-
setup() { },
|
|
34
|
-
async getLanguageService(uri) {
|
|
35
|
-
if (uri.scheme === 'file') {
|
|
36
|
-
const fileName = uri.fsPath.replace(/\\/g, '/');
|
|
37
|
-
let projectInfoPromise = file2ProjectInfo.get(fileName);
|
|
38
|
-
if (!projectInfoPromise) {
|
|
39
|
-
projectInfoPromise = sendTsServerRequest('_vue:' + ts.server.protocol.CommandTypes.ProjectInfo, {
|
|
40
|
-
file: fileName,
|
|
41
|
-
needFileNameList: false,
|
|
42
|
-
});
|
|
43
|
-
file2ProjectInfo.set(fileName, projectInfoPromise);
|
|
44
|
-
}
|
|
45
|
-
const projectInfo = await projectInfoPromise;
|
|
46
|
-
if (projectInfo) {
|
|
47
|
-
const { configFileName } = projectInfo;
|
|
48
|
-
let languageService = tsconfigProjects.get(vscode_uri_1.URI.file(configFileName));
|
|
49
|
-
if (!languageService) {
|
|
50
|
-
languageService = createProjectLanguageService(server, configFileName);
|
|
51
|
-
tsconfigProjects.set(vscode_uri_1.URI.file(configFileName), languageService);
|
|
52
|
-
}
|
|
53
|
-
return languageService;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
return simpleLanguageService ??= createProjectLanguageService(server, undefined);
|
|
57
|
-
},
|
|
58
|
-
getExistingLanguageServices() {
|
|
59
|
-
return Promise.all([
|
|
60
|
-
...tsconfigProjects.values(),
|
|
61
|
-
simpleLanguageService,
|
|
62
|
-
].filter(promise => !!promise));
|
|
63
|
-
},
|
|
64
|
-
reload() {
|
|
65
|
-
for (const languageService of tsconfigProjects.values()) {
|
|
66
|
-
languageService.dispose();
|
|
67
|
-
}
|
|
68
|
-
tsconfigProjects.clear();
|
|
69
|
-
if (simpleLanguageService) {
|
|
70
|
-
simpleLanguageService.dispose();
|
|
71
|
-
simpleLanguageService = undefined;
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
}, (0, language_service_1.createVueLanguageServicePlugins)(ts, {
|
|
75
|
-
collectExtractProps(...args) {
|
|
76
|
-
return sendTsServerRequest('_vue:collectExtractProps', args);
|
|
77
|
-
},
|
|
78
|
-
getComponentDirectives(...args) {
|
|
79
|
-
return sendTsServerRequest('_vue:getComponentDirectives', args);
|
|
80
|
-
},
|
|
81
|
-
getComponentEvents(...args) {
|
|
82
|
-
return sendTsServerRequest('_vue:getComponentEvents', args);
|
|
83
|
-
},
|
|
84
|
-
getComponentNames(...args) {
|
|
85
|
-
return sendTsServerRequest('_vue:getComponentNames', args);
|
|
86
|
-
},
|
|
87
|
-
getComponentProps(...args) {
|
|
88
|
-
return sendTsServerRequest('_vue:getComponentProps', args);
|
|
89
|
-
},
|
|
90
|
-
getComponentSlots(...args) {
|
|
91
|
-
return sendTsServerRequest('_vue:getComponentSlots', args);
|
|
92
|
-
},
|
|
93
|
-
getElementAttrs(...args) {
|
|
94
|
-
return sendTsServerRequest('_vue:getElementAttrs', args);
|
|
95
|
-
},
|
|
96
|
-
getElementNames(...args) {
|
|
97
|
-
return sendTsServerRequest('_vue:getElementNames', args);
|
|
98
|
-
},
|
|
99
|
-
getImportPathForFile(...args) {
|
|
100
|
-
return sendTsServerRequest('_vue:getImportPathForFile', args);
|
|
101
|
-
},
|
|
102
|
-
isRefAtPosition(...args) {
|
|
103
|
-
return sendTsServerRequest('_vue:isRefAtPosition', args);
|
|
104
|
-
},
|
|
105
|
-
getDocumentHighlights(fileName, position) {
|
|
106
|
-
return sendTsServerRequest('_vue:documentHighlights-full', {
|
|
107
|
-
file: fileName,
|
|
108
|
-
...{ position },
|
|
109
|
-
filesToSearch: [fileName],
|
|
110
|
-
});
|
|
111
|
-
},
|
|
112
|
-
getEncodedSemanticClassifications(fileName, span) {
|
|
113
|
-
return sendTsServerRequest('_vue:encodedSemanticClassifications-full', {
|
|
114
|
-
file: fileName,
|
|
115
|
-
...span,
|
|
116
|
-
format: ts.SemanticClassificationFormat.TwentyTwenty,
|
|
117
|
-
});
|
|
118
|
-
},
|
|
119
|
-
async getQuickInfoAtPosition(fileName, { line, character }) {
|
|
120
|
-
const result = await sendTsServerRequest('_vue:' + ts.server.protocol.CommandTypes.Quickinfo, {
|
|
121
|
-
file: fileName,
|
|
122
|
-
line: line + 1,
|
|
123
|
-
offset: character + 1,
|
|
124
|
-
});
|
|
125
|
-
return result?.displayString;
|
|
126
|
-
},
|
|
127
|
-
}));
|
|
128
|
-
async function sendTsServerRequest(command, args) {
|
|
129
|
-
return await new Promise(resolve => {
|
|
130
|
-
const requestId = ++tsserverRequestId;
|
|
131
|
-
tsserverRequestHandlers.set(requestId, resolve);
|
|
132
|
-
connection.sendNotification('tsserver/request', [requestId, command, args]);
|
|
133
|
-
});
|
|
134
16
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
: (0, language_core_1.createParsedCommandLineByJson)(ts, ts.sys, ts.sys.getCurrentDirectory(), {});
|
|
139
|
-
const language = (0, language_core_1.createLanguage)([
|
|
140
|
-
{
|
|
141
|
-
getLanguageId: uri => server.documents.get(uri)?.languageId,
|
|
142
|
-
},
|
|
143
|
-
(0, language_core_1.createVueLanguagePlugin)(ts, commonLine.options, commonLine.vueOptions, uri => uri.fsPath.replace(/\\/g, '/')),
|
|
144
|
-
], (0, language_service_1.createUriMap)(), uri => {
|
|
145
|
-
const document = server.documents.get(uri);
|
|
146
|
-
if (document) {
|
|
147
|
-
language.scripts.set(uri, document.getSnapshot(), document.languageId);
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
language.scripts.delete(uri);
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
return (0, language_service_1.createLanguageService)(language, server.languageServicePlugins, (0, simpleProject_1.createLanguageServiceEnvironment)(server, [...server.workspaceFolders.all]), {});
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
connection.onInitialized(server.initialized);
|
|
157
|
-
connection.onShutdown(server.shutdown);
|
|
17
|
+
ts ??= require('typescript');
|
|
18
|
+
(0, server_1.startServer)(ts);
|
|
19
|
+
}
|
|
158
20
|
//# sourceMappingURL=index.js.map
|
package/lib/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function startServer(ts: typeof import('typescript')): void;
|
package/lib/server.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startServer = startServer;
|
|
4
|
+
const simpleProject_1 = require("@volar/language-server/lib/project/simpleProject");
|
|
5
|
+
const node_1 = require("@volar/language-server/node");
|
|
6
|
+
const language_core_1 = require("@vue/language-core");
|
|
7
|
+
const language_service_1 = require("@vue/language-service");
|
|
8
|
+
const vscode_uri_1 = require("vscode-uri");
|
|
9
|
+
function startServer(ts) {
|
|
10
|
+
const connection = (0, node_1.createConnection)();
|
|
11
|
+
const server = (0, node_1.createServer)(connection);
|
|
12
|
+
const tsserverRequestHandlers = new Map();
|
|
13
|
+
let tsserverRequestId = 0;
|
|
14
|
+
connection.listen();
|
|
15
|
+
connection.onNotification('tsserver/response', ([id, res]) => {
|
|
16
|
+
tsserverRequestHandlers.get(id)?.(res);
|
|
17
|
+
tsserverRequestHandlers.delete(id);
|
|
18
|
+
});
|
|
19
|
+
connection.onInitialize(params => {
|
|
20
|
+
const tsconfigProjects = (0, language_service_1.createUriMap)();
|
|
21
|
+
const file2ProjectInfo = new Map();
|
|
22
|
+
server.fileWatcher.onDidChangeWatchedFiles(({ changes }) => {
|
|
23
|
+
for (const change of changes) {
|
|
24
|
+
const changeUri = vscode_uri_1.URI.parse(change.uri);
|
|
25
|
+
if (tsconfigProjects.has(changeUri)) {
|
|
26
|
+
tsconfigProjects.get(changeUri).dispose();
|
|
27
|
+
tsconfigProjects.delete(changeUri);
|
|
28
|
+
file2ProjectInfo.clear();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
let simpleLanguageService;
|
|
33
|
+
return server.initialize(params, {
|
|
34
|
+
setup() { },
|
|
35
|
+
async getLanguageService(uri) {
|
|
36
|
+
if (uri.scheme === 'file') {
|
|
37
|
+
const fileName = uri.fsPath.replace(/\\/g, '/');
|
|
38
|
+
let projectInfoPromise = file2ProjectInfo.get(fileName);
|
|
39
|
+
if (!projectInfoPromise) {
|
|
40
|
+
projectInfoPromise = sendTsServerRequest('_vue:' + ts.server.protocol.CommandTypes.ProjectInfo, {
|
|
41
|
+
file: fileName,
|
|
42
|
+
needFileNameList: false,
|
|
43
|
+
});
|
|
44
|
+
file2ProjectInfo.set(fileName, projectInfoPromise);
|
|
45
|
+
}
|
|
46
|
+
const projectInfo = await projectInfoPromise;
|
|
47
|
+
if (projectInfo) {
|
|
48
|
+
const { configFileName } = projectInfo;
|
|
49
|
+
let languageService = tsconfigProjects.get(vscode_uri_1.URI.file(configFileName));
|
|
50
|
+
if (!languageService) {
|
|
51
|
+
languageService = createProjectLanguageService(server, configFileName);
|
|
52
|
+
tsconfigProjects.set(vscode_uri_1.URI.file(configFileName), languageService);
|
|
53
|
+
}
|
|
54
|
+
return languageService;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return simpleLanguageService ??= createProjectLanguageService(server, undefined);
|
|
58
|
+
},
|
|
59
|
+
getExistingLanguageServices() {
|
|
60
|
+
return Promise.all([
|
|
61
|
+
...tsconfigProjects.values(),
|
|
62
|
+
simpleLanguageService,
|
|
63
|
+
].filter(promise => !!promise));
|
|
64
|
+
},
|
|
65
|
+
reload() {
|
|
66
|
+
for (const languageService of tsconfigProjects.values()) {
|
|
67
|
+
languageService.dispose();
|
|
68
|
+
}
|
|
69
|
+
tsconfigProjects.clear();
|
|
70
|
+
if (simpleLanguageService) {
|
|
71
|
+
simpleLanguageService.dispose();
|
|
72
|
+
simpleLanguageService = undefined;
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
}, (0, language_service_1.createVueLanguageServicePlugins)(ts, {
|
|
76
|
+
collectExtractProps(...args) {
|
|
77
|
+
return sendTsServerRequest('_vue:collectExtractProps', args);
|
|
78
|
+
},
|
|
79
|
+
getComponentDirectives(...args) {
|
|
80
|
+
return sendTsServerRequest('_vue:getComponentDirectives', args);
|
|
81
|
+
},
|
|
82
|
+
getComponentEvents(...args) {
|
|
83
|
+
return sendTsServerRequest('_vue:getComponentEvents', args);
|
|
84
|
+
},
|
|
85
|
+
getComponentNames(...args) {
|
|
86
|
+
return sendTsServerRequest('_vue:getComponentNames', args);
|
|
87
|
+
},
|
|
88
|
+
getComponentProps(...args) {
|
|
89
|
+
return sendTsServerRequest('_vue:getComponentProps', args);
|
|
90
|
+
},
|
|
91
|
+
getComponentSlots(...args) {
|
|
92
|
+
return sendTsServerRequest('_vue:getComponentSlots', args);
|
|
93
|
+
},
|
|
94
|
+
getElementAttrs(...args) {
|
|
95
|
+
return sendTsServerRequest('_vue:getElementAttrs', args);
|
|
96
|
+
},
|
|
97
|
+
getElementNames(...args) {
|
|
98
|
+
return sendTsServerRequest('_vue:getElementNames', args);
|
|
99
|
+
},
|
|
100
|
+
getImportPathForFile(...args) {
|
|
101
|
+
return sendTsServerRequest('_vue:getImportPathForFile', args);
|
|
102
|
+
},
|
|
103
|
+
isRefAtPosition(...args) {
|
|
104
|
+
return sendTsServerRequest('_vue:isRefAtPosition', args);
|
|
105
|
+
},
|
|
106
|
+
getDocumentHighlights(fileName, position) {
|
|
107
|
+
return sendTsServerRequest('_vue:documentHighlights-full', {
|
|
108
|
+
file: fileName,
|
|
109
|
+
...{ position },
|
|
110
|
+
filesToSearch: [fileName],
|
|
111
|
+
});
|
|
112
|
+
},
|
|
113
|
+
getEncodedSemanticClassifications(fileName, span) {
|
|
114
|
+
return sendTsServerRequest('_vue:encodedSemanticClassifications-full', {
|
|
115
|
+
file: fileName,
|
|
116
|
+
...span,
|
|
117
|
+
format: ts.SemanticClassificationFormat.TwentyTwenty,
|
|
118
|
+
});
|
|
119
|
+
},
|
|
120
|
+
async getQuickInfoAtPosition(fileName, { line, character }) {
|
|
121
|
+
const result = await sendTsServerRequest('_vue:' + ts.server.protocol.CommandTypes.Quickinfo, {
|
|
122
|
+
file: fileName,
|
|
123
|
+
line: line + 1,
|
|
124
|
+
offset: character + 1,
|
|
125
|
+
});
|
|
126
|
+
return result?.displayString;
|
|
127
|
+
},
|
|
128
|
+
}));
|
|
129
|
+
async function sendTsServerRequest(command, args) {
|
|
130
|
+
return await new Promise(resolve => {
|
|
131
|
+
const requestId = ++tsserverRequestId;
|
|
132
|
+
tsserverRequestHandlers.set(requestId, resolve);
|
|
133
|
+
connection.sendNotification('tsserver/request', [requestId, command, args]);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
function createProjectLanguageService(server, tsconfig) {
|
|
137
|
+
const commonLine = tsconfig && !ts.server.isInferredProjectName(tsconfig)
|
|
138
|
+
? (0, language_core_1.createParsedCommandLine)(ts, ts.sys, tsconfig)
|
|
139
|
+
: (0, language_core_1.createParsedCommandLineByJson)(ts, ts.sys, ts.sys.getCurrentDirectory(), {});
|
|
140
|
+
const language = (0, language_core_1.createLanguage)([
|
|
141
|
+
{
|
|
142
|
+
getLanguageId: uri => server.documents.get(uri)?.languageId,
|
|
143
|
+
},
|
|
144
|
+
(0, language_core_1.createVueLanguagePlugin)(ts, commonLine.options, commonLine.vueOptions, uri => uri.fsPath.replace(/\\/g, '/')),
|
|
145
|
+
], (0, language_service_1.createUriMap)(), uri => {
|
|
146
|
+
const document = server.documents.get(uri);
|
|
147
|
+
if (document) {
|
|
148
|
+
language.scripts.set(uri, document.getSnapshot(), document.languageId);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
language.scripts.delete(uri);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
return (0, language_service_1.createLanguageService)(language, server.languageServicePlugins, (0, simpleProject_1.createLanguageServiceEnvironment)(server, [...server.workspaceFolders.all]), {});
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
connection.onInitialized(server.initialized);
|
|
158
|
+
connection.onShutdown(server.shutdown);
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=server.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vue/language-server",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"files": [
|
|
6
6
|
"**/*.js",
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"@volar/language-server": "2.4.23",
|
|
20
|
-
"@vue/language-core": "3.1.
|
|
21
|
-
"@vue/language-service": "3.1.
|
|
22
|
-
"@vue/typescript-plugin": "3.1.
|
|
20
|
+
"@vue/language-core": "3.1.1",
|
|
21
|
+
"@vue/language-service": "3.1.1",
|
|
22
|
+
"@vue/typescript-plugin": "3.1.1",
|
|
23
23
|
"vscode-uri": "^3.0.8"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
@@ -29,5 +29,5 @@
|
|
|
29
29
|
"@typescript/server-harness": "latest",
|
|
30
30
|
"@volar/test-utils": "2.4.23"
|
|
31
31
|
},
|
|
32
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "3ea27dacce47613f49ae83e96e3aa271ee54746e"
|
|
33
33
|
}
|